unit Disk; INTERFACE uses Exec; type pDiscResourceUnit = ^tDiscResourceUnit; pDiscResource = ^tDiscResource; tDiscResource = record dr_Library: tLibrary; dr_Current: pDiscResourceUnit; dr_Flags: byte; dr_pad: byte; dr_SysLib: pLibrary; dr_CiaResource: pLibrary; dr_UnitID: array [0..3] of long; dr_Waiting: tList; dr_DiscBlock: tInterrupt; dr_DiscSync: tInterrupt; dr_Index: tInterrupt; end; tDiscResourceUnit = record dru_Message: tMessage; dru_DiscBlock: tInterrupt; dru_DiscSync: tInterrupt; dru_Index: tInterrupt; end; var DiskBase: pDiscResource; const DRB_ALLOC0 = 0; DRB_ALLOC1 = 1; DRB_ALLOC2 = 2; DRB_ALLOC3 = 3; DRF_ALLOC0 = 1; DR_ALLOCUNIT = $FFFFFFFA; DRF_ALLOC1 = 2; DRF_ALLOC2 = 4; DR_GETUNITID = $FFFFFFE2; DRT_EMPTY = $FFFFFFFF; DRF_ALLOC3 = 8; DR_LASTCOMM = $FFFFFFE8; DR_FREEUNIT = $FFFFFFF4; DRB_ACTIVE = 7; DSKDMAOFF = $4000; DRF_ACTIVE = $80; DR_GIVEUNIT = $FFFFFFE8; DRT_AMIGA = 0; DRT_37422D2S = $55555555; DR_GETUNIT = $FFFFFFEE; DISKNAME = 'disk.resource'; function AllocUnit (unitNum: longint): boolean; procedure FreeUnit (unitNum: longint); function GetUnit (unitPointer: pDiscResourceUnit): pDiscResourceUnit; procedure GiveUnit; function GetUnitID (unitNum: longint): longint; IMPLEMENTATION function AllocUnit; xassembler; asm move.l a6,-(sp) move.l 8(sp),d0 move.l DiskBase,a6 jsr -6(a6) tst.l d0 sne d0 neg.b d0 move.b d0,$C(sp) move.l (sp)+,a6 end; procedure FreeUnit; xassembler; asm move.l a6,-(sp) move.l 8(sp),d0 move.l DiskBase,a6 jsr -$C(a6) move.l (sp)+,a6 end; function GetUnit; xassembler; asm move.l a6,-(sp) move.l 8(sp),a1 move.l DiskBase,a6 jsr -$12(a6) move.l d0,$C(sp) move.l (sp)+,a6 end; procedure GiveUnit; xassembler; asm move.l a6,-(sp) move.l DiskBase,a6 jsr -$18(a6) move.l (sp)+,a6 end; function GetUnitID; xassembler; asm move.l a6,-(sp) move.l 8(sp),d0 move.l DiskBase,a6 jsr -$1E(a6) move.l d0,$C(sp) move.l (sp)+,a6 end; end.