home *** CD-ROM | disk | FTP | other *** search
/ Amiga ISO Collection / AmigaUtilCD2.iso / Programming / Pascal / HISOFTPASCAL2,0-2.DMS / in.adf / Units / Expansion.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1992-05-20  |  8.0 KB  |  457 lines

  1. unit Expansion;
  2.  
  3. INTERFACE
  4. uses Exec, AmigaDOS;
  5.  
  6.  
  7. type
  8.     pConfigDev = ^tConfigDev;
  9.     pCurrentBinding = ^tCurrentBinding;
  10.     tCurrentBinding = record
  11.         cb_ConfigDev: pConfigDev;
  12.         cb_FileName: pbyte;
  13.         cb_ProductString: pbyte;
  14.         cb_ToolTypes: ppbyte;
  15.         end;
  16.  
  17.     pExpansionBase = ^tExpansionBase;
  18.     tExpansionBase = record
  19.         LibNode: tLibrary;
  20.         Flags: byte;
  21.         pad: byte;
  22.         ExecBase: pointer;
  23.         SegList: pointer;
  24.         CurrentBinding: tCurrentBinding;
  25.         BoardList: tList;
  26.         MountList: tList;
  27.         AllocTable: array [0..255] of byte;
  28.         BindSemaphore: tSignalSemaphore;
  29.         Int2List: tInterrupt;
  30.         Int6List: tInterrupt;
  31.         Int7List: tInterrupt;
  32.         end;
  33.  
  34.     pExpansionInt = ^tExpansionInt;
  35.     tExpansionInt = record
  36.         IntMask: word;
  37.         ArrayMax: word;
  38.         ArraySize: word;
  39.         end;
  40.  
  41.     pExpansionRom = ^tExpansionRom;
  42.     tExpansionRom = record
  43.         er_Type: byte;
  44.         er_Product: byte;
  45.         er_Flags: byte;
  46.         er_Reserved03: byte;
  47.         er_Manufacturer: word;
  48.         er_SerialNumber: long;
  49.         er_InitDiagVec: word;
  50.         er_Reserved0c: byte;
  51.         er_Reserved0d: byte;
  52.         er_Reserved0e: byte;
  53.         er_Reserved0f: byte;
  54.         end;
  55.  
  56.     pDiagArea = ^tDiagArea;
  57.     tDiagArea = record
  58.         da_Config: byte;
  59.         da_Flags: byte;
  60.         da_Size: word;
  61.         da_DiagPoint: word;
  62.         da_BootPoint: word;
  63.         da_Name: word;
  64.         da_Reserved01: word;
  65.         da_Reserved02: word;
  66.         end;
  67.  
  68.     pExpansionControl = ^tExpansionControl;
  69.     tExpansionControl = record
  70.         ec_Interrupt: byte;
  71.         ec_Reserved11: byte;
  72.         ec_BaseAddress: byte;
  73.         ec_Shutup: byte;
  74.         ec_Reserved14: byte;
  75.         ec_Reserved15: byte;
  76.         ec_Reserved16: byte;
  77.         ec_Reserved17: byte;
  78.         ec_Reserved18: byte;
  79.         ec_Reserved19: byte;
  80.         ec_Reserved1a: byte;
  81.         ec_Reserved1b: byte;
  82.         ec_Reserved1c: byte;
  83.         ec_Reserved1d: byte;
  84.         ec_Reserved1e: byte;
  85.         ec_Reserved1f: byte;
  86.         end;
  87.  
  88.     tConfigDev = record
  89.         cd_Node: tNode;
  90.         cd_Flags: byte;
  91.         cd_Pad: byte;
  92.         cd_Rom: tExpansionRom;
  93.         cd_BoardAddr: pointer;
  94.         cd_BoardSize: pointer;
  95.         cd_SlotAddr: word;
  96.         cd_SlotSize: word;
  97.         cd_Driver: pointer;
  98.         cd_NextCD: pConfigDev;
  99.         cd_Unused: array [0..3] of long;
  100.         end;
  101.  
  102.  
  103.  
  104. var
  105.     ExpansionBase: pExpansionBase;
  106.  
  107.  
  108. const
  109.     ECIF_INTERRUPTING = $80;
  110.     DAC_BUSWIDTH = $C0;
  111.     ECIB_INTENA = 1;
  112.     DAC_NIBBLEWIDE = 0;
  113.     E_MEMORYBASE = $200000;
  114.     ERTB_CHAINEDCONFIG = 3;
  115.     ECIF_INTENA = 2;
  116.     ERT_NEWBOARD = $C0;
  117.     ERTF_CHAINEDCONFIG = 8;
  118.     ERFB_NOSHUTUP = 6;
  119.     ERFF_NOSHUTUP = $40;
  120.     ERTB_MEMLIST = 5;
  121.     DAC_CONFIGTIME = $10;
  122.     E_EXPANSIONBASE = $E80000;
  123.     ERTF_MEMLIST = $20;
  124.     ERTB_DIAGVALID = 4;
  125.     E_MEMORYSLOTS = $80;
  126.     ERTF_DIAGVALID = $10;
  127.     ECIB_INT2PEND = 4;
  128.     E_MEMORYSIZE = $800000;
  129.     ERT_TYPEMASK = $C0;
  130.     ERT_MEMMASK = 7;
  131.     ECIB_INT6PEND = 5;
  132.     ECIF_INT2PEND = $10;
  133.     ECIB_INT7PEND = 6;
  134.     ECIF_INT6PEND = $20;
  135.     E_EXPANSIONSLOTS = 8;
  136.     ECIB_RESET = 3;
  137.     ECIF_INT7PEND = $40;
  138.     ECIF_RESET = 8;
  139.     ERT_TYPESIZE = 2;
  140.     E_SLOTSHIFT = $10;
  141.     ERT_MEMSIZE = 3;
  142.     ERFB_MEMSPACE = 7;
  143.     E_EXPANSIONSIZE = $80000;
  144.     ERFF_MEMSPACE = $80;
  145.     ERT_TYPEBIT = 6;
  146.     ADNB_STARTPROC = 0;
  147.     ERT_MEMBIT = 0;
  148.     ADNF_STARTPROC = 1;
  149.     CDB_CONFIGME = 1;
  150.     EXPANSIONNAME = 'expansion.library';
  151.     DAC_NEVER = 0;
  152.     DAC_BINDTIME = $20;
  153.     CDF_CONFIGME = 2;
  154.     CDB_SHUTUP = 0;
  155.     E_SLOTMASK = $FFFF;
  156.     CDF_SHUTUP = 1;
  157.     TOTALSLOTS = $100;
  158.     DAC_BYTEWIDE = $40;
  159.     E_SLOTSIZE = $10000;
  160.     ECIB_INTERRUPTING = 7;
  161.     DAC_BOOTTIME = $30;
  162.     DAC_WORDWIDE = $80;
  163.  
  164.  
  165. procedure AddConfigDev (configDev: pConfigDev);
  166. procedure AllocBoardMem (slotSpec: long);
  167. function AllocConfigDev: pConfigDev;
  168. function AllocExpansionMem
  169.         (numSlots: long;
  170.         SlotAlign: long): pointer;
  171.  
  172. procedure ConfigBoard
  173.         (board: pointer;
  174.         configDev: pConfigDev);
  175.  
  176. procedure ConfigChain (baseAddr: pointer);
  177. function FindConfigDev
  178.         (oldConfigDev: pConfigDev;
  179.         manufacturer: longint;
  180.         product: longint): pConfigDev;
  181.  
  182. procedure FreeBoardMem
  183.         (startSlot: long;
  184.         slotSpec: long);
  185.  
  186. procedure FreeConfigDev (configDev: pConfigDev);
  187. procedure FreeExpansionMem
  188.         (startSlot: long;
  189.         numSlots: long);
  190.  
  191. function ReadExpansionByte
  192.         (board: pointer;
  193.         offset: long): byte;
  194.  
  195. procedure ReadExpansionRom
  196.         (board: pointer;
  197.         configDev: pConfigDev);
  198.  
  199. procedure RemConfigDev (configDev: pConfigDev);
  200. procedure WriteExpansionByte
  201.         (board: pointer;
  202.         offset: long;
  203.         byte: long);
  204.  
  205. procedure ObtainConfigBinding;
  206. procedure ReleaseConfigBinding;
  207. procedure SetCurrentBinding
  208.         (currentBinding: pCurrentBinding;
  209.         bindingSize: long);
  210.  
  211. function GetCurrentBinding
  212.         (currentBinding: pCurrentBinding;
  213.         bindingSize: long): long;
  214.  
  215. function MakeDosNode (parmPacket: pointer): pDeviceNode;
  216. function AddDosNode
  217.         (bootPri: shortint;
  218.         flags: long;
  219.         dosNode: pDeviceNode): boolean;
  220.  
  221.  
  222.  
  223. function ERT_MEMNEEDED (t: Byte): longint;
  224. function ERT_SLOTSNEEDED (t: Byte): integer;
  225. function EC_MEMADDR (slot: Integer): pointer;
  226.  
  227.  
  228. IMPLEMENTATION
  229. function ERT_MEMNEEDED;
  230. begin
  231.     if (t and ERT_MEMMASK) <> 0 then
  232.         ERT_MEMNEEDED := $10000 shl ((t and ERT_MEMMASK) - 1)
  233.     else
  234.         ERT_MEMNEEDED := $800000
  235. end;
  236.  
  237. function ERT_SLOTSNEEDED;
  238. begin
  239.     if (t and ERT_MEMMASK) <> 0 then
  240.         ERT_SLOTSNEEDED := $1 shl ((t and ERT_MEMMASK) - 1)
  241.     else
  242.         ERT_SLOTSNEEDED := 128
  243. end;
  244.  
  245. function EC_MEMADDR;
  246. begin
  247.     EC_MEMADDR := pointer(longint(slot) shl E_SLOTSHIFT)
  248. end;
  249.  
  250. procedure AddConfigDev; xassembler;
  251. asm
  252.     move.l    a6,-(sp)
  253.     move.l    8(sp),a0
  254.     move.l    ExpansionBase,a6
  255.     jsr        -$1E(a6)
  256.     move.l    (sp)+,a6
  257. end;
  258.  
  259. procedure AllocBoardMem; xassembler;
  260. asm
  261.     move.l    a6,-(sp)
  262.     move.l    8(sp),d0
  263.     move.l    ExpansionBase,a6
  264.     jsr        -$2A(a6)
  265.     move.l    (sp)+,a6
  266. end;
  267.  
  268. function AllocConfigDev; xassembler;
  269. asm
  270.     move.l    a6,-(sp)
  271.     move.l    ExpansionBase,a6
  272.     jsr        -$30(a6)
  273.     move.l    d0,8(sp)
  274.     move.l    (sp)+,a6
  275. end;
  276.  
  277. function AllocExpansionMem; xassembler;
  278. asm
  279.     move.l    a6,-(sp)
  280.     lea        8(sp),a6
  281.     move.l    (a6)+,d1
  282.     move.l    (a6)+,d0
  283.     move.l    ExpansionBase,a6
  284.     jsr        -$36(a6)
  285.     move.l    d0,$10(sp)
  286.     move.l    (sp)+,a6
  287. end;
  288.  
  289. procedure ConfigBoard; xassembler;
  290. asm
  291.     move.l    a6,-(sp)
  292.     lea        8(sp),a6
  293.     move.l    (a6)+,a1
  294.     move.l    (a6)+,a0
  295.     move.l    ExpansionBase,a6
  296.     jsr        -$3C(a6)
  297.     move.l    (sp)+,a6
  298. end;
  299.  
  300. procedure ConfigChain; xassembler;
  301. asm
  302.     move.l    a6,-(sp)
  303.     move.l    8(sp),a0
  304.     move.l    ExpansionBase,a6
  305.     jsr        -$42(a6)
  306.     move.l    (sp)+,a6
  307. end;
  308.  
  309. function FindConfigDev; xassembler;
  310. asm
  311.     move.l    a6,-(sp)
  312.     lea        8(sp),a6
  313.     move.l    (a6)+,d1
  314.     move.l    (a6)+,d0
  315.     move.l    (a6)+,a0
  316.     move.l    ExpansionBase,a6
  317.     jsr        -$48(a6)
  318.     move.l    d0,$14(sp)
  319.     move.l    (sp)+,a6
  320. end;
  321.  
  322. procedure FreeBoardMem; xassembler;
  323. asm
  324.     move.l    a6,-(sp)
  325.     lea        8(sp),a6
  326.     move.l    (a6)+,d1
  327.     move.l    (a6)+,d0
  328.     move.l    ExpansionBase,a6
  329.     jsr        -$4E(a6)
  330.     move.l    (sp)+,a6
  331. end;
  332.  
  333. procedure FreeConfigDev; xassembler;
  334. asm
  335.     move.l    a6,-(sp)
  336.     move.l    8(sp),a0
  337.     move.l    ExpansionBase,a6
  338.     jsr        -$54(a6)
  339.     move.l    (sp)+,a6
  340. end;
  341.  
  342. procedure FreeExpansionMem; xassembler;
  343. asm
  344.     move.l    a6,-(sp)
  345.     lea        8(sp),a6
  346.     move.l    (a6)+,d1
  347.     move.l    (a6)+,d0
  348.     move.l    ExpansionBase,a6
  349.     jsr        -$5A(a6)
  350.     move.l    (sp)+,a6
  351. end;
  352.  
  353. function ReadExpansionByte; xassembler;
  354. asm
  355.     move.l    a6,-(sp)
  356.     movem.l    8(sp),d0/a0
  357.     move.l    ExpansionBase,a6
  358.     jsr        -$60(a6)
  359.     move.b    d0,$10(sp)
  360.     move.l    (sp)+,a6
  361. end;
  362.  
  363. procedure ReadExpansionRom; xassembler;
  364. asm
  365.     move.l    a6,-(sp)
  366.     lea        8(sp),a6
  367.     move.l    (a6)+,a1
  368.     move.l    (a6)+,a0
  369.     move.l    ExpansionBase,a6
  370.     jsr        -$66(a6)
  371.     move.l    (sp)+,a6
  372. end;
  373.  
  374. procedure RemConfigDev; xassembler;
  375. asm
  376.     move.l    a6,-(sp)
  377.     move.l    8(sp),a0
  378.     move.l    ExpansionBase,a6
  379.     jsr        -$6C(a6)
  380.     move.l    (sp)+,a6
  381. end;
  382.  
  383. procedure WriteExpansionByte; xassembler;
  384. asm
  385.     move.l    a6,-(sp)
  386.     lea        8(sp),a6
  387.     move.l    (a6)+,d1
  388.     move.l    (a6)+,d0
  389.     move.l    (a6)+,a0
  390.     move.l    ExpansionBase,a6
  391.     jsr        -$72(a6)
  392.     move.l    (sp)+,a6
  393. end;
  394.  
  395. procedure ObtainConfigBinding; xassembler;
  396. asm
  397.     move.l    a6,-(sp)
  398.     move.l    ExpansionBase,a6
  399.     jsr        -$78(a6)
  400.     move.l    (sp)+,a6
  401. end;
  402.  
  403. procedure ReleaseConfigBinding; xassembler;
  404. asm
  405.     move.l    a6,-(sp)
  406.     move.l    ExpansionBase,a6
  407.     jsr        -$7E(a6)
  408.     move.l    (sp)+,a6
  409. end;
  410.  
  411. procedure SetCurrentBinding; xassembler;
  412. asm
  413.     move.l    a6,-(sp)
  414.     movem.l    8(sp),d0/a0
  415.     move.l    ExpansionBase,a6
  416.     jsr        -$84(a6)
  417.     move.l    (sp)+,a6
  418. end;
  419.  
  420. function GetCurrentBinding; xassembler;
  421. asm
  422.     move.l    a6,-(sp)
  423.     movem.l    8(sp),d0/a0
  424.     move.l    ExpansionBase,a6
  425.     jsr        -$8A(a6)
  426.     move.l    d0,$10(sp)
  427.     move.l    (sp)+,a6
  428. end;
  429.  
  430. function MakeDosNode; xassembler;
  431. asm
  432.     move.l    a6,-(sp)
  433.     move.l    8(sp),a0
  434.     move.l    ExpansionBase,a6
  435.     jsr        -$90(a6)
  436.     move.l    d0,$C(sp)
  437.     move.l    (sp)+,a6
  438. end;
  439.  
  440. function AddDosNode; xassembler;
  441. asm
  442.     move.l    a6,-(sp)
  443.     lea        8(sp),a6
  444.     move.l    (a6)+,a0
  445.     move.l    (a6)+,d1
  446.     move.b    (a6)+,d0
  447.     move.l    ExpansionBase,a6
  448.     jsr        -$96(a6)
  449.     tst.l    d0
  450.     sne        d0
  451.     neg.b    d0
  452.     move.b    d0,$12(sp)
  453.     move.l    (sp)+,a6
  454. end;
  455.  
  456. end.
  457.