home *** CD-ROM | disk | FTP | other *** search
/ Amiga ISO Collection / AmigaUtilCD2.iso / Programming / Pascal / HISOFTPASCAL2,0-3.DMS / in.adf / Units / Expansion.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1992-05-20  |  9.0 KB  |  513 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.         eb_Private01: byte;
  22.         eb_Private02: long;
  23.         eb_Private03: long;
  24.         eb_Private04: tCurrentBinding;
  25.         eb_Private05: tList;
  26.         MountList: tList;
  27.         end;
  28.  
  29.     pExpansionRom = ^tExpansionRom;
  30.     tExpansionRom = record
  31.         er_Type: byte;
  32.         er_Product: byte;
  33.         er_Flags: byte;
  34.         er_Reserved03: byte;
  35.         er_Manufacturer: word;
  36.         er_SerialNumber: long;
  37.         er_InitDiagVec: word;
  38.         er_Reserved0c: byte;
  39.         er_Reserved0d: byte;
  40.         er_Reserved0e: byte;
  41.         er_Reserved0f: byte;
  42.         end;
  43.  
  44.     pDiagArea = ^tDiagArea;
  45.     tDiagArea = record
  46.         da_Config: byte;
  47.         da_Flags: byte;
  48.         da_Size: word;
  49.         da_DiagPoint: word;
  50.         da_BootPoint: word;
  51.         da_Name: word;
  52.         da_Reserved01: word;
  53.         da_Reserved02: word;
  54.         end;
  55.  
  56.     pExpansionControl = ^tExpansionControl;
  57.     tExpansionControl = record
  58.         ec_Interrupt: byte;
  59.         ec_Z3_HighBase: byte;
  60.         ec_BaseAddress: byte;
  61.         ec_Shutup: byte;
  62.         ec_Reserved14: byte;
  63.         ec_Reserved15: byte;
  64.         ec_Reserved16: byte;
  65.         ec_Reserved17: byte;
  66.         ec_Reserved18: byte;
  67.         ec_Reserved19: byte;
  68.         ec_Reserved1a: byte;
  69.         ec_Reserved1b: byte;
  70.         ec_Reserved1c: byte;
  71.         ec_Reserved1d: byte;
  72.         ec_Reserved1e: byte;
  73.         ec_Reserved1f: byte;
  74.         end;
  75.  
  76.     tConfigDev = record
  77.         cd_Node: tNode;
  78.         cd_Flags: byte;
  79.         cd_Pad: byte;
  80.         cd_Rom: tExpansionRom;
  81.         cd_BoardAddr: pointer;
  82.         cd_BoardSize: long;
  83.         cd_SlotAddr: word;
  84.         cd_SlotSize: word;
  85.         cd_Driver: pointer;
  86.         cd_NextCD: pConfigDev;
  87.         cd_Unused: array [0..3] of long;
  88.         end;
  89.  
  90.     pBootNode = ^tBootNode;
  91.     tBootNode = record
  92.         bn_Node: tNode;
  93.         bn_Flags: word;
  94.         bn_DeviceNode: pointer;
  95.         end;
  96.  
  97.  
  98.  
  99. var
  100.     ExpansionBase: pExpansionBase;
  101.  
  102.  
  103. const
  104.     ECIF_INTERRUPTING = $80;
  105.     EBB_DOSFLAG = 3;
  106.     ERFF_ZORRO_III = $10;
  107.     DAC_BUSWIDTH = $C0;
  108.     EBF_DOSFLAG = 8;
  109.     ECIB_INTENA = 1;
  110.     DAC_NIBBLEWIDE = 0;
  111.     EBB_SHORTMEM = 1;
  112.     E_MEMORYBASE = $200000;
  113.     EBB_BADMEM = 2;
  114.     ERTB_CHAINEDCONFIG = 3;
  115.     ECIF_INTENA = 2;
  116.     EZ3_CONFIGAREA = $40000000;
  117.     EBF_SHORTMEM = 2;
  118.     ERT_NEWBOARD = $C0;
  119.     EBF_BADMEM = 4;
  120.     ERTF_CHAINEDCONFIG = 8;
  121.     ERFB_NOSHUTUP = 6;
  122.     ERFF_NOSHUTUP = $40;
  123.     ERT_Z3_SSMASK = $F;
  124.     ERTB_MEMLIST = 5;
  125.     DAC_CONFIGTIME = $10;
  126.     EZ3_CONFIGAREAEND = $7FFFFFFF;
  127.     E_EXPANSIONBASE = $E80000;
  128.     ERTF_MEMLIST = $20;
  129.     ERTB_DIAGVALID = 4;
  130.     E_MEMORYSLOTS = $80;
  131.     ERTF_DIAGVALID = $10;
  132.     ERT_Z3_SSSIZE = 4;
  133.     ECIB_INT2PEND = 4;
  134.     E_MEMORYSIZE = $800000;
  135.     ERT_TYPEMASK = $C0;
  136.     EE_NOBOARD = $2B;
  137.     ERT_MEMMASK = 7;
  138.     ECIB_INT6PEND = 5;
  139.     ECIF_INT2PEND = $10;
  140.     ERT_Z3_SSBIT = 0;
  141.     ECIB_INT7PEND = 6;
  142.     EBB_SILENTSTART = 6;
  143.     ECIF_INT6PEND = $20;
  144.     EE_BADMEM = $2C;
  145.     E_EXPANSIONSLOTS = 8;
  146.     ECIB_RESET = 3;
  147.     ECIF_INT7PEND = $40;
  148.     EBF_SILENTSTART = $40;
  149.     ERT_ZORROIII = $80;
  150.     EBB_KICKBACK33 = 4;
  151.     ECIF_RESET = 8;
  152.     EE_NOMEMORY = $2A;
  153.     EBB_KICKBACK36 = 5;
  154.     EZ3_SIZEGRANULARITY = $80000;
  155.     EBF_KICKBACK33 = $10;
  156.     ERT_TYPESIZE = 2;
  157.     CDB_BADMEMORY = 2;
  158.     EBF_KICKBACK36 = $20;
  159.     E_SLOTSHIFT = $10;
  160.     ERT_MEMSIZE = 3;
  161.     ERFB_MEMSPACE = 7;
  162.     E_EXPANSIONSIZE = $80000;
  163.     EBB_START_CC0 = 7;
  164.     CDF_BADMEMORY = 4;
  165.     ERFF_MEMSPACE = $80;
  166.     ERFB_EXTENDED = 5;
  167.     EBF_START_CC0 = $80;
  168.     ERT_TYPEBIT = 6;
  169.     CDB_PROCESSED = 3;
  170.     ADNB_STARTPROC = 0;
  171.     EZ3_EXPANSIONBASE = $FF000000;
  172.     ERT_MEMBIT = 0;
  173.     ERFF_EXTENDED = $20;
  174.     CDF_PROCESSED = 8;
  175.     ADNF_STARTPROC = 1;
  176.     CDB_CONFIGME = 1;
  177.     EXPANSIONNAME = 'expansion.library';
  178.     DAC_NEVER = 0;
  179.     EE_NOEXPANSION = $29;
  180.     DAC_BINDTIME = $20;
  181.     CDF_CONFIGME = 2;
  182.     CDB_SHUTUP = 0;
  183.     E_SLOTMASK = $FFFF;
  184.     ERT_ZORROII = $C0;
  185.     CDF_SHUTUP = 1;
  186.     EE_OK = 0;
  187.     EBB_CLOGGED = 0;
  188.     DAC_BYTEWIDE = $40;
  189.     EE_LASTBOARD = $28;
  190.     E_SLOTSIZE = $10000;
  191.     EBF_CLOGGED = 1;
  192.     ECIB_INTERRUPTING = 7;
  193.     ERFB_ZORRO_III = 4;
  194.     DAC_BOOTTIME = $30;
  195.     DAC_WORDWIDE = $80;
  196.  
  197.  
  198. procedure AddConfigDev (configDev: pConfigDev);
  199. function AddBootNode
  200.         (bootPri: shortint;
  201.         flags: long;
  202.         deviceNode: pDeviceNode;
  203.         configDev: pConfigDev): boolean;
  204.  
  205. procedure AllocBoardMem (slotSpec: long);
  206. function AllocConfigDev: pConfigDev;
  207. function AllocExpansionMem
  208.         (numSlots: long;
  209.         slotAlign: long): pointer;
  210.  
  211. procedure ConfigBoard
  212.         (board: pointer;
  213.         configDev: pConfigDev);
  214.  
  215. procedure ConfigChain (baseAddr: pointer);
  216. function FindConfigDev
  217.         (oldConfigDev: pConfigDev;
  218.         manufacturer: longint;
  219.         product: longint): pConfigDev;
  220.  
  221. procedure FreeBoardMem
  222.         (startSlot: long;
  223.         slotSpec: long);
  224.  
  225. procedure FreeConfigDev (configDev: pConfigDev);
  226. procedure FreeExpansionMem
  227.         (startSlot: long;
  228.         numSlots: long);
  229.  
  230. function ReadExpansionByte
  231.         (board: pointer;
  232.         offset: long): byte;
  233.  
  234. procedure ReadExpansionRom
  235.         (board: pointer;
  236.         configDev: pConfigDev);
  237.  
  238. procedure RemConfigDev (configDev: pConfigDev);
  239. procedure WriteExpansionByte
  240.         (board: pointer;
  241.         offset: long;
  242.         byte: long);
  243.  
  244. procedure ObtainConfigBinding;
  245. procedure ReleaseConfigBinding;
  246. procedure SetCurrentBinding
  247.         (currentBinding: pCurrentBinding;
  248.         bindingSize: long);
  249.  
  250. function GetCurrentBinding
  251.         (currentBinding: pCurrentBinding;
  252.         bindingSize: long): long;
  253.  
  254. function MakeDosNode (parmPacket: pointer): pDeviceNode;
  255. function AddDosNode
  256.         (bootPri: shortint;
  257.         flags: long;
  258.         deviceNode: pDeviceNode): boolean;
  259.  
  260.  
  261.  
  262. function ERT_MEMNEEDED (t: Byte): longint;
  263. function ERT_SLOTSNEEDED (t: Byte): integer;
  264. function EC_MEMADDR (slot: Integer): pointer;
  265.  
  266.  
  267. IMPLEMENTATION
  268. function ERT_MEMNEEDED;
  269. begin
  270.     if (t and ERT_MEMMASK) <> 0 then
  271.         ERT_MEMNEEDED := $10000 shl ((t and ERT_MEMMASK) - 1)
  272.     else
  273.         ERT_MEMNEEDED := $800000
  274. end;
  275.  
  276. function ERT_SLOTSNEEDED;
  277. begin
  278.     if (t and ERT_MEMMASK) <> 0 then
  279.         ERT_SLOTSNEEDED := $1 shl ((t and ERT_MEMMASK) - 1)
  280.     else
  281.         ERT_SLOTSNEEDED := 128
  282. end;
  283.  
  284. function EC_MEMADDR;
  285. begin
  286.     EC_MEMADDR := pointer(longint(slot) shl E_SLOTSHIFT)
  287. end;
  288.  
  289. procedure AddConfigDev; xassembler;
  290. asm
  291.     move.l    a6,-(sp)
  292.     move.l    8(sp),a0
  293.     move.l    ExpansionBase,a6
  294.     jsr        -$1E(a6)
  295.     move.l    (sp)+,a6
  296. end;
  297.  
  298. function AddBootNode; xassembler;
  299. asm
  300.     move.l    a6,-(sp)
  301.     lea        8(sp),a6
  302.     move.l    (a6)+,a1
  303.     move.l    (a6)+,a0
  304.     move.l    (a6)+,d1
  305.     move.b    (a6)+,d0
  306.     move.l    ExpansionBase,a6
  307.     jsr        -$24(a6)
  308.     tst.l    d0
  309.     sne        d0
  310.     neg.b    d0
  311.     move.b    d0,$16(sp)
  312.     move.l    (sp)+,a6
  313. end;
  314.  
  315. procedure AllocBoardMem; xassembler;
  316. asm
  317.     move.l    a6,-(sp)
  318.     move.l    8(sp),d0
  319.     move.l    ExpansionBase,a6
  320.     jsr        -$2A(a6)
  321.     move.l    (sp)+,a6
  322. end;
  323.  
  324. function AllocConfigDev; xassembler;
  325. asm
  326.     move.l    a6,-(sp)
  327.     move.l    ExpansionBase,a6
  328.     jsr        -$30(a6)
  329.     move.l    d0,8(sp)
  330.     move.l    (sp)+,a6
  331. end;
  332.  
  333. function AllocExpansionMem; xassembler;
  334. asm
  335.     move.l    a6,-(sp)
  336.     lea        8(sp),a6
  337.     move.l    (a6)+,d1
  338.     move.l    (a6)+,d0
  339.     move.l    ExpansionBase,a6
  340.     jsr        -$36(a6)
  341.     move.l    d0,$10(sp)
  342.     move.l    (sp)+,a6
  343. end;
  344.  
  345. procedure ConfigBoard; xassembler;
  346. asm
  347.     move.l    a6,-(sp)
  348.     lea        8(sp),a6
  349.     move.l    (a6)+,a1
  350.     move.l    (a6)+,a0
  351.     move.l    ExpansionBase,a6
  352.     jsr        -$3C(a6)
  353.     move.l    (sp)+,a6
  354. end;
  355.  
  356. procedure ConfigChain; xassembler;
  357. asm
  358.     move.l    a6,-(sp)
  359.     move.l    8(sp),a0
  360.     move.l    ExpansionBase,a6
  361.     jsr        -$42(a6)
  362.     move.l    (sp)+,a6
  363. end;
  364.  
  365. function FindConfigDev; xassembler;
  366. asm
  367.     move.l    a6,-(sp)
  368.     lea        8(sp),a6
  369.     move.l    (a6)+,d1
  370.     move.l    (a6)+,d0
  371.     move.l    (a6)+,a0
  372.     move.l    ExpansionBase,a6
  373.     jsr        -$48(a6)
  374.     move.l    d0,$14(sp)
  375.     move.l    (sp)+,a6
  376. end;
  377.  
  378. procedure FreeBoardMem; xassembler;
  379. asm
  380.     move.l    a6,-(sp)
  381.     lea        8(sp),a6
  382.     move.l    (a6)+,d1
  383.     move.l    (a6)+,d0
  384.     move.l    ExpansionBase,a6
  385.     jsr        -$4E(a6)
  386.     move.l    (sp)+,a6
  387. end;
  388.  
  389. procedure FreeConfigDev; xassembler;
  390. asm
  391.     move.l    a6,-(sp)
  392.     move.l    8(sp),a0
  393.     move.l    ExpansionBase,a6
  394.     jsr        -$54(a6)
  395.     move.l    (sp)+,a6
  396. end;
  397.  
  398. procedure FreeExpansionMem; xassembler;
  399. asm
  400.     move.l    a6,-(sp)
  401.     lea        8(sp),a6
  402.     move.l    (a6)+,d1
  403.     move.l    (a6)+,d0
  404.     move.l    ExpansionBase,a6
  405.     jsr        -$5A(a6)
  406.     move.l    (sp)+,a6
  407. end;
  408.  
  409. function ReadExpansionByte; xassembler;
  410. asm
  411.     move.l    a6,-(sp)
  412.     movem.l    8(sp),d0/a0
  413.     move.l    ExpansionBase,a6
  414.     jsr        -$60(a6)
  415.     move.b    d0,$10(sp)
  416.     move.l    (sp)+,a6
  417. end;
  418.  
  419. procedure ReadExpansionRom; xassembler;
  420. asm
  421.     move.l    a6,-(sp)
  422.     lea        8(sp),a6
  423.     move.l    (a6)+,a1
  424.     move.l    (a6)+,a0
  425.     move.l    ExpansionBase,a6
  426.     jsr        -$66(a6)
  427.     move.l    (sp)+,a6
  428. end;
  429.  
  430. procedure RemConfigDev; xassembler;
  431. asm
  432.     move.l    a6,-(sp)
  433.     move.l    8(sp),a0
  434.     move.l    ExpansionBase,a6
  435.     jsr        -$6C(a6)
  436.     move.l    (sp)+,a6
  437. end;
  438.  
  439. procedure WriteExpansionByte; xassembler;
  440. asm
  441.     move.l    a6,-(sp)
  442.     lea        8(sp),a6
  443.     move.l    (a6)+,d1
  444.     move.l    (a6)+,d0
  445.     move.l    (a6)+,a0
  446.     move.l    ExpansionBase,a6
  447.     jsr        -$72(a6)
  448.     move.l    (sp)+,a6
  449. end;
  450.  
  451. procedure ObtainConfigBinding; xassembler;
  452. asm
  453.     move.l    a6,-(sp)
  454.     move.l    ExpansionBase,a6
  455.     jsr        -$78(a6)
  456.     move.l    (sp)+,a6
  457. end;
  458.  
  459. procedure ReleaseConfigBinding; xassembler;
  460. asm
  461.     move.l    a6,-(sp)
  462.     move.l    ExpansionBase,a6
  463.     jsr        -$7E(a6)
  464.     move.l    (sp)+,a6
  465. end;
  466.  
  467. procedure SetCurrentBinding; xassembler;
  468. asm
  469.     move.l    a6,-(sp)
  470.     movem.l    8(sp),d0/a0
  471.     move.l    ExpansionBase,a6
  472.     jsr        -$84(a6)
  473.     move.l    (sp)+,a6
  474. end;
  475.  
  476. function GetCurrentBinding; xassembler;
  477. asm
  478.     move.l    a6,-(sp)
  479.     movem.l    8(sp),d0/a0
  480.     move.l    ExpansionBase,a6
  481.     jsr        -$8A(a6)
  482.     move.l    d0,$10(sp)
  483.     move.l    (sp)+,a6
  484. end;
  485.  
  486. function MakeDosNode; xassembler;
  487. asm
  488.     move.l    a6,-(sp)
  489.     move.l    8(sp),a0
  490.     move.l    ExpansionBase,a6
  491.     jsr        -$90(a6)
  492.     move.l    d0,$C(sp)
  493.     move.l    (sp)+,a6
  494. end;
  495.  
  496. function AddDosNode; xassembler;
  497. asm
  498.     move.l    a6,-(sp)
  499.     lea        8(sp),a6
  500.     move.l    (a6)+,a0
  501.     move.l    (a6)+,d1
  502.     move.b    (a6)+,d0
  503.     move.l    ExpansionBase,a6
  504.     jsr        -$96(a6)
  505.     tst.l    d0
  506.     sne        d0
  507.     neg.b    d0
  508.     move.b    d0,$12(sp)
  509.     move.l    (sp)+,a6
  510. end;
  511.  
  512. end.
  513.