Disasm V1.005 CODE ; If the driver is accidentally run as a command, just return -1. 000000 70FF MOVEQ.L #-1,D0 000002 4E75 RTS ; --> Start of $268 byte area. ; ROMTag structure. 000004 4AFC RT_MATCHWORD 000006 0000 0004 RT_MATCHTAG - pointer back to above 00000A 0000 026C RT_ENDSKIP 00000E 01 RT_FLAGS - RTF_COLDSTART is set 00000F 01 RT_VERSION 000010 03 RT_TYPE - NT_DEVICE 000011 14 RT_PRI - Priority 20 000012 0000 0142 RT_NAME 000016 0000 0152 RT_IDSTRING 00001A 0000 026C RT_INIT ; The MemList to be enqueued on the KickMemPtr 00001E 0000 0000 LN_SUCC 000022 0000 0000 LN_PRED 000026 00 LN_TYPE 000027 00 LN_PRI 000028 0000 0142 LN_NAME -> "ramdrive.device" 00002C 0001 ML_NUMENTRIES - 1 entry 00002E FFFF FFFC Address of first entry: -4 000032 0000 0270 Length of first entry ($270 bytes) ; Entry to be enqueued on the KickTagPtr 000036 0000 0004 Pointer to our RomTag 00003A 0000 0000 Link to next list ; Device node 00003E 4EF9 0000 0718 JMP L00005D Unknown 000044 4E75 RTS AbortIO 000046 0000 0000 ORI.B #0,D0 00004A 4EF9 0000 05F0 JMP L00004C BeginIO 000050 4E75 RTS Null 000052 0000 0000 DC.L 0 000056 7000 MOVEQ.L #0,D0 Expunge 000058 4E75 RTS 00005A 0000 DC.W $0000 00005C 7000 MOVEQ.L #0,D0 Close 00005E 4E75 RTS 000060 0000 DC.W $0000 000062 4EF9 0000 05E8 JMP L00004B Open L000003: 000068 0000 0000 LN_SUCC 00006C 0000 0000 LN_PRED 000070 03 LN_TYPE - NT_DEVICE 000071 00 LN_PRI 000072 0000 0142 LN_NAME -> "ramdrive.device" 000076 06 LIB_FLAGS - LIBF_CHANGED | LIBF_SUMUSED 000077 00 LIB_PAD 000078 002A LIB_NEGSIZE (7 jump vectors) 00007A 0022 LIB_POSSIZE 00007C 0001 LIB_VERSION 00007E 0000 LIB_REVISION 000080 0000 0152 LIB_IDSTRING -> "Commodore..." 000084 0000 0000 LIB_SUM 000088 0001 LIB_OPENCNT ; Device specific data follows. 00008A 0000 +34 ; Pointer to first block of memory to allocate ($01D8 bytes) L000004: 00008C 0000 0000 ORI.B #0,D0 +36 ; Pointer to and size of virtual disk area. L000005: 000090 0000 0000 ORI.B #0,D0 +40 L000006: 000094 0000 0000 ORI.B #0,D0 +44 L000007: 000098 0000 0000 Base address of "disk" area. +48 ; Some sort of expansion ROM structure? 00009C 10 ERTB_DIAGVALID 00009D 00 er_Product 00009E 00 er_Flags 00009F 00 Reserved. 0000A0 0000 er_Manufacturer 0000A2 0000 0000 er_SerialNumber 0000A6 0000 0000A8 0000 00AC pointer to below ; Some sort of diagnostic ROM structure? 0000AC 10 DAC_CONFIGTIME 0000AD 00 da_Flags 0000AE 0000 da_Size 0000B0 0000 da_DiagPoint 0000B2 01AA da_BootPoint -> boot code at 256 0000B4 0096 da_Name -> "ramdrive.device" 0000B6 0000 Reserved 1 0000B8 0000 Reserved 2 ; BootNode to be enqueued on the Mountlist in expansionbase L000008: 0000BA 0000 0000 LN_SUCC 0000BE 0000 0000 LN_PRED 0000C2 10 LN_TYPE - NT_BOOTNODE 0000C3 00 LN_PRI 0000C4 0000 008C LN_NAME 0000C8 0000 BN_FLAGS 0000CA 0000 0000 BN_DEVICENODE ; Parameter table for MakeDOSNode() 0000CE 0000 0122 Handler name 0000D2 0000 0142 Device name -> "ramdrive.device" 0000D6 0000 0000 Unit number for OpenDevice 0000DA 0000 0000 Flags for OpenDevice L00000B: 0000DE 0000 000C Length of rest of packet (12 longwords) 0000E2 0000 0080 Block size (128 longwords = 512 bytes) 0000E6 0000 0000 DE_SECORG - not used 0000EA 0000 0000 Number of surfaces 0000EE 0000 0001 Sectors per block (must be 1) 0000F2 0000 0000 Blocks per track L00000E: 0000F6 0000 0000 DE_RESERVED - reserved blocks at start 0000FA 0000 0000 DE_PREALLOC - reserved blocks at end 0000FE 0000 0000 DE_INTERLEAVE L00000F: 000102 0000 0000 DE_LOWCYL L000010: 000106 0000 0000 DE_HIGHCYL 00010A 0000 0005 DE_NUMBUFFERS 00010E 0000 0000 DE_BUFMEMTYPE ; The following is not included in the length field above but ; still part of the structure. 000112 0000 0000 DE_MAXTRANSFER 000116 0000 0000 DE_MASK 00011A 0000 0000 DE_BOOTPRI 00011E 444F 5300 DE_DOSTYPE - 'DOS\0' = old file system L000011: 000122 0000 0000 The name the device is mounted as 000126 0000 0000 (e.g. "RAD") goes here. 00012A 0000 0000 00012E 0000 0000 000132 0000 0000 000136 0000 0000 00013A 0000 0000 00013E 0000 0000 L000012: 000142 "ramdrive.device",0 000152 "Commodore-Amiga Ram Drive 1.0 (6 Apr 88)",13,10,0 00017D "dos.library",0 000189 "expansion.library",0,0 ; This code is executed when the device is initialized after reboot. 00019C 48E7 2022 MOVEM.L D2/A2/A6,-(A7) 0001A0 2C78 0004 MOVEA.L $0004,A6 0001A4 227A FEE6 MOVEA.L L000004(PC),A1 0001A8 203C 0000 01D8 MOVE.L #$000001D8,D0 0001AE 4EAE FF34 JSR -204(A6) AllocAbs() 0001B2 4A80 TST.L D0 0001B4 6700 008A BEQ L000024 0001B8 227A FED6 MOVEA.L L000005(PC),A1 L00001A: 0001BC 203A FED6 MOVE.L L000006(PC),D0 0001C0 4EAE FF34 JSR -204(A6) AllocAbs() L00001C: 0001C4 4A80 TST.L D0 0001C6 6700 007E BEQ L000025 0001CA 43FA FE9C LEA.L L000003(PC),A1 0001CE 4EAE FE50 JSR -432(A6) AddDevice() 0001D2 083A 0001 FF07 BTST #1,$DD(PC) 0001D8 6666 BNE.S L000024 0001DA 7400 MOVEQ.L #0,D2 0001DC 41FA FF00 LEA.L L00000B(PC),A0 L00001E: 0001E0 0C90 0000 000F CMPI.L #$0000000F,(A0) 0001E6 6D16 BLT.S L000021 0001E8 2428 003C MOVE.L 60(A0),D2 0001EC 0C82 FFFF FF80 CMPI.L #$FFFFFF80,D2 0001F2 6D4C BLT.S L000024 0001F4 0C82 0000 007F CMPI.L #$0000007F,D2 0001FA 6F02 BLE.S L000021 L000020: 0001FC 747F MOVEQ.L #127,D2 L000021: 0001FE 43FA FF89 LEA.L $189(PC),A1 -> "expansion..." 000202 7022 MOVEQ.L #34,D0 000204 4EAE FDD8 JSR -552(A6) OpenLibrary() 000208 4A80 TST.L D0 00020A 6734 BEQ.S L000024 00020C 2C40 MOVEA.L D0,A6 00020E 41FA FEBE LEA.L L00000A(PC),A0 000212 4EAE FF70 JSR -144(A6) MakeDOSNode() 000216 41EE 004A LEA.L 74(A6),A0 -> eb_Mountlist 00021A 48E7 0082 MOVEM.L A0/A6,-(A7) 00021E 2C78 0004 MOVEA.L $0004,A6 ; Store device node pointer in boot node. 000222 43FA FEA6 LEA.L L000009(PC),A1 000226 2280 MOVE.L D0,(A1) 000228 670E BEQ.S L000023 00022A 2057 MOVEA.L (A7),A0 -> eb_Mountlist 00022C 43FA FE8C LEA.L L000008(PC),A1 -> bootnode 000230 1342 0009 MOVE.B D2,9(A1) set priority 000234 4EAE FEF2 JSR -270(A6) Enqueue() L000023: 000238 4CDF 0300 MOVEM.L (A7)+,A0-A1 00023C 4EAE FE62 JSR -414(A6) CloseLibrary() L000024: 000240 4CDF 4404 MOVEM.L (A7)+,D2/A2/A6 000244 4E75 RTS L000025: 000246 227A FE44 MOVEA.L L000004(PC),A1 00024A 203C 0000 01D8 MOVE.L #$000001D8,D0 000250 4EAE FF2E JSR -210(A6) FreeMem() 000254 60EA BRA.S L000024 ; Looks like DOS boot code. Finds resident module "dos.library" ; and calls its RT_INIT routine. 000256 43FA FF25 LEA.L L000013(PC),A1 -> "dos.library" 00025A 4EAE FFA0 JSR -96(A6) FindResident() 00025E 4A80 TST.L D0 000260 6708 BEQ.S L000026 000262 2040 MOVEA.L D0,A0 000264 2068 0016 MOVEA.L 22(A0),A0 000268 4E90 JSR (A0) L000026: 00026A 4E75 RTS ; --> end of $268 byte area. ; AHA! Initial init code. 00026C 48E7 303E MOVEM.L D2-D3/A2-A6,-(A7) ; Open "dos.library", version 33 or better. 000270 2C78 0004 MOVEA.L $0004,A6 000274 43FA FF07 LEA.L L000013(PC),A1 -> "dos.library" 000278 7021 MOVEQ.L #33,D0 00027A 4EAE FDD8 JSR -552(A6) OpenLibrary() ; Store DosBase. Return zero and exit if DOS did not open. 00027E 41FA 02F0 LEA.L L000040(PC),A0 000282 2080 MOVE.L D0,(A0) 000284 6700 02A6 BEQ L00003B ; Fetch pointer to DOS "root node" and close library again. 000288 2240 MOVEA.L D0,A1 00028A 2469 0022 MOVEA.L 34(A1),A2 00028E 4EAE FE62 JSR -414(A6) CloseLibrary() ; Fetch BPTR to Info structure, and convert to regular pointer. 000292 206A 0018 MOVEA.L 24(A2),A0 000296 D1C8 ADDA.L A0,A0 000298 D1C8 ADDA.L A0,A0 ; Fetch BPTR to device list. 00029A 2028 0004 MOVE.L 4(A0),D0 ; Traverse the device list. Loop is entered at top with BPTR to ; current node in D0. Exit and return zero if end of list reached. L000027: 00029E 6700 028C BEQ L00003B 0002A2 E588 LSL.L #2,D0 0002A4 2440 MOVEA.L D0,A2 ; Skip node if it is not a device. 0002A6 4AAA 0004 TST.L 4(A2) 0002AA 662A BNE.S L000029 ; Got a device node. Get pointer to startup message for this ; device, skip node if no startup message. 0002AC 202A 001C MOVE.L 28(A2),D0 0002B0 6724 BEQ.S L000029 0002B2 E588 LSL.L #2,D0 0002B4 2640 MOVEA.L D0,A3 ; Examine device name in startup message. 0002B6 202B 0004 MOVE.L 4(A3),D0 0002BA E588 LSL.L #2,D0 0002BC 2040 MOVEA.L D0,A0 -> device name 0002BE 43FA FE82 LEA.L L000012(PC),A1 -> "ramdrive.device" ; Get length of BSTR 0002C2 4240 CLR.W D0 0002C4 1018 MOVE.B (A0)+,D0 ; Skip node if length is zero. 0002C6 670E BEQ.S L000029 ; Compare names, skip node if different. 0002C8 5340 SUBQ.W #1,D0 L000028: 0002CA B308 CMPM.B (A0)+,(A1)+ 0002CC 56C8 FFFC DBNE D0,L000028(PC) 0002D0 6604 BNE.S L000029 0002D2 4A11 TST.B (A1) 0002D4 6704 BEQ.S L00002A L000029: 0002D6 2012 MOVE.L (A2),D0 0002D8 60C4 BRA.S L000027 ; Continue here when the right node is found. Pointer to node is ; in A2, pointer to startup message is in A3. ; First, the name. L00002A: 0002DA 202A 0028 MOVE.L 40(A2),D0 0002DE E588 LSL.L #2,D0 0002E0 2040 MOVEA.L D0,A0 0002E2 43FA FE3E LEA.L L000011(PC),A1 0002E6 7000 MOVEQ.L #0,D0 0002E8 1018 MOVE.B (A0)+,D0 0002EA 5340 SUBQ.W #1,D0 L00002B: 0002EC 12D8 MOVE.B (A0)+,(A1)+ 0002EE 51C8 FFFC DBF D0,L00002B(PC) ; Copy unit number and flags with which device is to be opened. 0002F2 43FA FDEA LEA.L L00000B(PC),A1 0002F6 236B 0000 FFF8 MOVE.L 0(A3),-8(A1) Unit # 0002FC 236B 000C FFFC MOVE.L 12(A3),-4(A1) Flags ; Get BPTR to environment table and convert to pointer. 000302 202B 0008 MOVE.L 8(A3),D0 000306 E588 LSL.L #2,D0 000308 2040 MOVEA.L D0,A0 ; Get length of environment table and copy it, up to a maximum ; length of 16 entries. 00030A 2018 MOVE.L (A0)+,D0 00030C 3200 MOVE.W D0,D1 00030E 0C80 0000 0010 CMPI.L #$00000010,D0 000314 6F08 BLE.S L00002D 000316 7010 MOVEQ.L #16,D0 000318 3200 MOVE.W D0,D1 00031A 6002 BRA.S L00002D L00002C: 00031C 2018 MOVE.L (A0)+,D0 L00002D: 00031E 22C0 MOVE.L D0,(A1)+ 000320 51C9 FFFA DBF D1,L00002C(PC) ; Compute number of cylinders in the virtual drive. 000324 203A FDE0 MOVE.L L000010(PC),D0 HighCyl 000328 90BA FDD8 SUB.L L00000F(PC),D0 LowCyl 00032C 5240 ADDQ.W #1,D0 ; Compute number of blocks, exit if zero. 00032E C0FA FDBC MULU.W L00000C(PC),D0 # surfaces 000332 C0FA FDC0 MULU.W L00000D(PC),D0 blocks per track 000336 6700 01F4 BEQ L00003B ; Compute address of root block and store it. 00033A 2400 MOVE.L D0,D2 00033C 5382 SUBQ.L #1,D2 00033E D4BA FDB6 ADD.L L00000E(PC),D2 reserved 000342 E28A LSR.L #1,D2 000344 41FA 0222 LEA.L L00003F(PC),A0 000348 2082 MOVE.L D2,(A0) ; Compute number of bytes needed: 8 + 512 * number of blocks. 00034A C0FC 0200 MULU.W #512,D0 00034E 5080 ADDQ.L #8,D0 ; Store size of virtual disk. 000350 41FA FD42 LEA.L L000006(PC),A0 000354 2080 MOVE.L D0,(A0) ; Allocate the memory for the virtual disk. 000356 7200 MOVEQ.L #0,D1 000358 6100 0220 BSR L000042 ; Store base address of virtual disk area, exit if memory ; not obtained. 00035C 41FA FD32 LEA.L L000005(PC),A0 000360 2080 MOVE.L D0,(A0) 000362 6700 01C8 BEQ L00003B ; Store base address used for read/write operations. 000366 5080 ADDQ.L #8,D0 000368 41FA FD2E LEA.L L000007(PC),A0 00036C 2080 MOVE.L D0,(A0) 00036E 2640 MOVEA.L D0,A3 ; Allocate $270 bytes and remember base address. 000370 203C 0000 0270 MOVE.L #$00000270,D0 000376 7202 MOVEQ.L #2,D1 000378 6100 0200 BSR L000042 00037C 4A80 TST.L D0 00037E 6700 01C0 BEQ L00003D 000382 2840 MOVEA.L D0,A4 ; Allocate $1D8 bytes and store base address. 000384 203C 0000 01D8 MOVE.L #$000001D8,D0 00038A 7200 MOVEQ.L #0,D1 00038C 6100 01EC BSR L000042 000390 41FA FCFA LEA.L L000004(PC),A0 000394 2080 MOVE.L D0,(A0) 000396 6700 019C BEQ L00003C ; Copy a whole bunch of code in there... why? 00039A 2A40 MOVEA.L D0,A5 00039C 41FA 0242 LEA.L L000049(PC),A0 0003A0 224D MOVEA.L A5,A1 0003A2 303C 0075 MOVE.W #117,D0 L00002E: 0003A6 22D8 MOVE.L (A0)+,(A1)+ 0003A8 51C8 FFFC DBF D0,L00002E(PC) ; Copy more code into the $270 byte area... all but the first ; 8 bytes. I'm confused. 0003AC 41FA FC56 LEA.L L000002(PC),A0 0003B0 43EC 0008 LEA.L 8(A4),A1 0003B4 303C 0099 MOVE.W #153,D0 L00002F: 0003B8 22D8 MOVE.L (A0)+,(A1)+ 0003BA 51C8 FFFC DBF D0,L00002F(PC) ; Relocate misc. entries. 0003BE 220C MOVE.L A4,D1 0003C0 41FA FC3A LEA.L L000001(PC),A0 0003C4 9288 SUB.L A0,D1 0003C6 41FA 0184 LEA.L L00003E(PC),A0 L000030: 0003CA 3018 MOVE.W (A0)+,D0 0003CC 6B06 BMI.S L000031 0003CE D3B4 0000 ADD.L D1,0(A4,D0.W) 0003D2 60F6 BRA.S L000030 ; Fix jump vectors. ; A4 --> $270 byte segment - corresponds to -4 ; A5 --> $1D8 byte segment - corresponds to 5E0 L000031: 0003D4 41ED 0138 LEA.L 312(A5),A0 unknown 0003D8 2948 0044 MOVE.L A0,68(A4) 0003DC 41ED 0010 LEA.L 16(A5),A0 beginio 0003E0 2948 0050 MOVE.L A0,80(A4) 0003E4 41ED 0008 LEA.L 8(A5),A0 open 0003E8 2948 0068 MOVE.L A0,104(A4) ; Fix init vector in RomTag ; AHA! Now point to other init routine. 0003EC 41EC 01A0 LEA.L 416(A4),A0 0003F0 2948 001E MOVE.L A0,30(A4) ; Disable() 0003F4 33FC 4000 00DF F09A MOVE.W #16384,$00DFF09A 0003FC 522E 0126 ADDQ.B #1,294(A6) ; Enqueue the MemList on the KickMemPtr. 000400 41EC 0022 LEA.L 34(A4),A0 000404 20AE 0222 MOVE.L 546(A6),(A0) 000408 2D48 0222 MOVE.L A0,546(A6) ; Enqueue the RomTag on the KickTagPtr list. 00040C 41EC 003A LEA.L 58(A4),A0 000410 216E 0226 0004 MOVE.L 550(A6),4(A0) 000416 6706 BEQ.S L000032 000418 08E8 0007 0004 BSET.B #7,4(A0) L000032: 00041E 2D48 0226 MOVE.L A0,550(A6) ; Fix up the KickCheckSum. 000422 4EAE FD9C JSR -612(A6) SumKickData() 000426 2D40 022A MOVE.L D0,554(A6) ; Enable() 00042A 532E 0126 SUBQ.B #1,294(A6) 00042E 6C08 BGE.S L000033 000430 33FC C000 00DF F09A MOVE.W #49152,$00DFF09A ; Add the (copied) device structure to the system. L000033: 000438 43EC 006C LEA.L 108(A4),A1 00043C 4EAE FE50 JSR -432(A6) AddDevice() ; Get the DOS type field, assume 'DOS\0' if zero. 000440 222C 0122 MOVE.L 290(A4),D1 000444 6606 BNE.S L000034 000446 223C 444F 5300 MOVE.L #$444F5300,D1 ; A3 still contains the base address (+8) of the RAM disk area. ; Fill the first block with 'DOS\0DOS\1DOS\2'... L000034: 00044C 224B MOVEA.L A3,A1 00044E 707F MOVEQ.L #127,D0 L000035: 000450 22C1 MOVE.L D1,(A1)+ 000452 5281 ADDQ.L #1,D1 000454 51C8 FFFA DBF D0,L000035(PC) ; Compute address of root block in A2 000458 203A 010E MOVE.L L00003F(PC),D0 00045C C0FC 0200 MULU.W #512,D0 000460 45F3 0800 LEA.L 0(A3,D0.L),A2 ; Clear the root block to all zeros. 000464 224A MOVEA.L A2,A1 000466 707F MOVEQ.L #127,D0 000468 7200 MOVEQ.L #0,D1 L000036: 00046A 22C1 MOVE.L D1,(A1)+ 00046C 51C8 FFFC DBF D0,L000036(PC) ; Fill in the "type" and "secondary type" fields. 000470 24BC 0000 0002 MOVE.L #$00000002,(A2) 000476 257C 0000 0001 01FC MOVE.L #$00000001,508(A2) ; Fill in the hash table size: $80 - $38 = $48 (all longwords) 00047E 257C 0000 0048 000C MOVE.L #$00000048,12(A2) ; Set the volume created and last altered dates. 000486 2C7A 00E8 MOVEA.L L000040(PC),A6 00048A 41EA 01E4 LEA.L 484(A2),A0 00048E 2208 MOVE.L A0,D1 000490 4EAE FF40 JSR -192(A6) 000494 41EA 01A4 LEA.L 420(A2),A0 000498 2208 MOVE.L A0,D1 00049A 4EAE FF40 JSR -192(A6) ; Copy the volume name into the root block. 00049E 41FA 00D4 LEA.L L000041(PC),A0 0004A2 43EA 01B0 LEA.L 432(A2),A1 0004A6 7000 MOVEQ.L #0,D0 0004A8 1010 MOVE.B (A0),D0 L000037: 0004AA 12D8 MOVE.B (A0)+,(A1)+ 0004AC 51C8 FFFC DBF D0,L000037(PC) ; Get size of virtual disk area, and see if it is greater than ; 2,080,768 bytes. If so, more than one bitmap block is needed. 0004B0 203A FBE2 MOVE.L L000006(PC),D0 0004B4 0C80 001F C008 CMPI.L #$001FC008,D0 0004BA 6E5E BGT.S L000039 ; Only one bitmap block needed... put it right after the root block. 0004BC 203A 00AA MOVE.L L00003F(PC),D0 0004C0 5280 ADDQ.L #1,D0 ; Store bitmap pointer. 0004C2 2540 013C MOVE.L D0,316(A2) ; Set the bitmap valid flag. 0004C6 70FF MOVEQ.L #-1,D0 0004C8 2540 0138 MOVE.L D0,312(A2) ; Initialize the bitmap to all 1's. 0004CC 43EA 0204 LEA.L 516(A2),A1 0004D0 2049 MOVEA.L A1,A0 0004D2 70FF MOVEQ.L #-1,D0 0004D4 727E MOVEQ.L #126,D1 L000038: 0004D6 20C0 MOVE.L D0,(A0)+ 0004D8 51C9 FFFC DBF D1,L000038(PC) ; Clear the bits corresponding to the root block and the bitmap ; in the bitmap. 0004DC 223A 008A MOVE.L L00003F(PC),D1 - root blk # 0004E0 92BA FC14 SUB.L L00000E(PC),D1 - reserved 0004E4 2401 MOVE.L D1,D2 0004E6 2601 MOVE.L D1,D3 0004E8 0241 001F ANDI.W #31,D1 0004EC 0380 BCLR.L D1,D0 0004EE EA8A LSR.L #5,D2 0004F0 E58A LSL.L #2,D2 ; Clear root block bit 0004F2 C1B1 2800 AND.L D0,0(A1,D2.L) 0004F6 4680 NOT.L D0 0004F8 0680 0000 007F ADDI.L #$0000007F,D0 0004FE 5283 ADDQ.L #1,D3 000500 2403 MOVE.L D3,D2 000502 0243 001F ANDI.W #31,D3 000506 72FF MOVEQ.L #-1,D1 000508 0781 BCLR.L D3,D1 00050A EA8A LSR.L #5,D2 00050C E58A LSL.L #2,D2 ; Clear bitmap bit 00050E C3B1 2800 AND.L D1,0(A1,D2.L) 000512 4681 NOT.L D1 000514 D081 ADD.L D1,D0 ; Fix the checksum, I presume. 000516 2540 0200 MOVE.L D0,512(A2) ; Fix the root block checksum. L000039: 00051A 204A MOVEA.L A2,A0 00051C 707F MOVEQ.L #127,D0 00051E 7200 MOVEQ.L #0,D1 L00003A: 000520 D298 ADD.L (A0)+,D1 000522 51C8 FFFC DBF D0,L00003A(PC) 000526 4481 NEG.L D1 000528 2541 0014 MOVE.L D1,20(A2) ; End of initialization... bye bye. L00003B: 00052C 7000 MOVEQ.L #0,D0 00052E 4CDF 7C0C MOVEM.L (A7)+,D2-D3/A2-A6 000532 4E75 RTS ; Error exits - free memory already allocated. L00003C: 000534 224C MOVEA.L A4,A1 000536 203C 0000 0270 MOVE.L #$00000270,D0 00053C 4EAE FF2E JSR -210(A6) FreeMem() L00003D: 000540 224B MOVEA.L A3,A1 000542 203A FB50 MOVE.L L000006(PC),D0 000546 4EAE FF2E JSR -210(A6) FreeMem() 00054A 60E0 BRA.S L00003B ; Table of things to be relocated. L00003E: 00054C 000A 000E 0016 001A 10, 14, 22, 26, 000554 002C 0032 003A 0076 44, 50, 58, 118, 00055C 0084 00AC 00C8 00D2 132, 172, 200, 210 000564 00D6 FFFF 214, -1 L00003F: 000568 0000 0000 Root block number stored here. 00056C 0000 0000 (not known yet) L000040: 000570 0000 0000 DosBase is stored here. L000041: 000574 0552 414D 4230 "RAMB0" as a BCPL string 00057A 48E7 3030 MOVEM.L D2/D3/A2/A3,-(SP) 00057E 33FC 4000 00DF F09A MOVE.W #16384,$00DFF09A 000586 522E 0126 ADDQ.B #1,294(A6) 00058A 206E 0142 MOVEA.L 322(A6),A0 00058E 7600 MOVEQ.L #0,D3 L000043: 000590 2248 MOVEA.L A0,A1 000592 2411 MOVE.L (A1),D2 000594 674C BEQ.S L00004A 000596 2042 MOVEA.L D2,A0 000598 3401 MOVE.W D1,D2 00059A C469 000E AND.W 14(A1),D2 00059E B441 CMP.W D1,D2 0005A0 66EE BNE.S L000043 0005A2 2469 0010 MOVEA.L 16(A1),A2 L000044: 0005A6 B0AA 0004 CMP.L 4(A2),D0 0005AA 6206 BHI.S L000045 0005AC 264A MOVEA.L A2,A3 0005AE 262A 0004 MOVE.L 4(A2),D3 L000045: 0005B2 242A 0000 MOVE.L 0(A2),D2 0005B6 6704 BEQ.S L000046 0005B8 2442 MOVEA.L D2,A2 0005BA 60EA BRA.S L000044 L000046: 0005BC 4A83 TST.L D3 0005BE 67D0 BEQ.S L000043 0005C0 9680 SUB.L D0,D3 0005C2 0243 FFF8 ANDI.W #65528,D3 0005C6 D7C3 ADDA.L D3,A3 0005C8 224B MOVEA.L A3,A1 0005CA 4EAE FF34 JSR -204(A6) AllocAbs() L000047: 0005CE 532E 0126 SUBQ.B #1,294(A6) 0005D2 6C08 BGE.S L000048 0005D4 33FC C000 00DF F09A MOVE.W #49152,$00DFF09A L000048: 0005DC 4CDF 0C0C MOVEM.L (A7)+,D2-D3/A2-A3 ; ----> Start of $1D8 bytes. L000049: 0005E0 4E75 RTS L00004A: 0005E2 7000 MOVEQ.L #0,D0 0005E4 60E8 BRA.S L000047 0005E6 0000 DC.W $0000 ; Entry point for Open() L00004B: 0005E8 2341 0018 MOVE.L D1,24(A1) 0005EC 7000 MOVEQ.L #0,D0 0005EE 4E75 RTS ; Entry point for BeginIO() L00004C: 0005F0 48E7 0022 MOVEM.L A2/A6,-(A7) 0005F4 2C78 0004 MOVEA.L $0004,A6 0005F8 4EAE FF7C JSR -132(A6) Forbid() ; Get command from the I/O request and decode it. 0005FC 3029 001C MOVE.W 28(A1),D0 000600 0C40 0010 CMPI.W #16,D0 000604 6D02 BLT.S L00004D 000606 4240 CLR.W D0 ; Jump to the appropriate function. L00004D: 000608 D040 ADD.W D0,D0 00060A 4EBB 0020 JSR L00004F(PC,D0.W) ; Store the error code in the I/O request. 00060E 1340 001F MOVE.B D0,31(A1) ; Return I/O request as a reply message if the "quick I/O" bit is ; not set. 000612 2C78 0004 MOVEA.L $0004,A6 000616 0829 0000 001E BTST.B #0,30(A1) 00061C 6604 BNE.S L00004E 00061E 4EAE FE86 JSR -378(A6) ReplyMsg() L00004E: 000622 4EAE FF76 JSR -138(A6) Permit() 000626 4CDF 4400 MOVEM.L (A7)+,A2/A6 00062A 4E75 RTS ; Dispatch table for device commands. L00004F: 00062C 601E BRA.S L000050 ; 0 - invalid 00062E 601C BRA.S L000050 ; 1 - reset 000630 6036 BRA.S L000055 ; 2 - read 000632 6056 BRA.S L000057 ; 3 - write 000634 6020 BRA.S L000052 ; 4 - update 000636 601E BRA.S L000052 ; 5 - clear 000638 6012 BRA.S L000050 ; 6 - stop 00063A 6010 BRA.S L000050 ; 7 - start 00063C 600E BRA.S L000050 ; 8 - flush 00063E 6010 BRA.S L000051 ; 9 - motor 000640 600A BRA.S L000050 ; 10 - seek 000642 6046 BRA.S L000057 ; 11 - format 000644 6010 BRA.S L000052 ; 12 - remove 000646 6008 BRA.S L000051 ; 13 - changenum 000648 6016 BRA.S L000054 ; 14 - changestate 00064A 600E BRA.S L000053 ; 15 - protstatus ; Return IOERR_NOCMD. Used for "invalid", "reset", "stop", ; "start", "flush", "seek", and all commands greater than 15. L000050: 00064C 70FD MOVEQ.L #-3,D0 00064E 4E75 RTS ; Return 1 in IO_ACTUAL and no error. Used for "motor" and ; "changenum". L000051: 000650 7001 MOVEQ.L #1,D0 000652 2340 0020 MOVE.L D0,32(A1) ; Just return no error. Used for "update", "clear", and "remove". L000052: 000656 7000 MOVEQ.L #0,D0 000658 4E75 RTS ; Entry point for "protstatus". Return 1 in IO_ACTUAL if IO_UNIT ; is set, otherwise return zero. L000053: 00065A 2029 0018 MOVE.L 24(A1),D0 00065E 66F0 BNE.S L000051 ; Return no error, and IO_ACTUAL clear. Entry point for "changestate" L000054: 000660 7000 MOVEQ.L #0,D0 000662 2340 0020 MOVE.L D0,32(A1) 000666 4E75 RTS ; Entry point for "read". L000055: 000668 2C69 0014 MOVEA.L 20(A1),A6 -> device node 00066C 526E 0022 ADDQ.W #1,34(A6) ; Return TDERR_DiskChanged if no memory. 000670 202E 0030 MOVE.L 48(A6),D0 000674 670C BEQ.S L000056 ; Set up A0 and A2, and go move memory. 000676 D0A9 002C ADD.L 44(A1),D0 00067A 2040 MOVEA.L D0,A0 00067C 2469 0028 MOVEA.L 40(A1),A2 000680 602A BRA.S L000058 L000056: 000682 536E 0022 SUBQ.W #1,34(A6) 000686 701D MOVEQ.L #29,D0 000688 4E75 RTS ; Entry point for "write" and "format". Apparently, bit 0 in ; IO_UNIT is used as a write-protect flag, because we just return ; TDERR_WriteProt if it is set. L000057: 00068A 0829 0000 001B BTST.B #0,27(A1) 000690 6600 0078 BNE L00005B ; Not write protected. 000694 2069 0028 MOVEA.L 40(A1),A0 000698 2C69 0014 MOVEA.L 20(A1),A6 00069C 526E 0022 ADDQ.W #1,34(A6) 0006A0 202E 0030 MOVE.L 48(A6),D0 0006A4 67DC BEQ.S L000056 0006A6 D0A9 002C ADD.L 44(A1),D0 0006AA 2440 MOVEA.L D0,A2 ; Common to "read" and "write" commands. Do a block copy from (A0) ; to (A2), and set IO_ACTUAL to the number of bytes moved. L000058: 0006AC 2029 0024 MOVE.L 36(A1),D0 0006B0 6748 BEQ.S L00005A 0006B2 EE88 LSR.L #7,D0 0006B4 5380 SUBQ.L #1,D0 L000059: 0006B6 24D8 MOVE.L (A0)+,(A2)+ 0006B8 24D8 MOVE.L (A0)+,(A2)+ 0006BA 24D8 MOVE.L (A0)+,(A2)+ 0006BC 24D8 MOVE.L (A0)+,(A2)+ 0006BE 24D8 MOVE.L (A0)+,(A2)+ 0006C0 24D8 MOVE.L (A0)+,(A2)+ 0006C2 24D8 MOVE.L (A0)+,(A2)+ 0006C4 24D8 MOVE.L (A0)+,(A2)+ 0006C6 24D8 MOVE.L (A0)+,(A2)+ 0006C8 24D8 MOVE.L (A0)+,(A2)+ 0006CA 24D8 MOVE.L (A0)+,(A2)+ 0006CC 24D8 MOVE.L (A0)+,(A2)+ 0006CE 24D8 MOVE.L (A0)+,(A2)+ 0006D0 24D8 MOVE.L (A0)+,(A2)+ 0006D2 24D8 MOVE.L (A0)+,(A2)+ 0006D4 24D8 MOVE.L (A0)+,(A2)+ 0006D6 24D8 MOVE.L (A0)+,(A2)+ 0006D8 24D8 MOVE.L (A0)+,(A2)+ 0006DA 24D8 MOVE.L (A0)+,(A2)+ 0006DC 24D8 MOVE.L (A0)+,(A2)+ 0006DE 24D8 MOVE.L (A0)+,(A2)+ 0006E0 24D8 MOVE.L (A0)+,(A2)+ 0006E2 24D8 MOVE.L (A0)+,(A2)+ 0006E4 24D8 MOVE.L (A0)+,(A2)+ 0006E6 24D8 MOVE.L (A0)+,(A2)+ 0006E8 24D8 MOVE.L (A0)+,(A2)+ 0006EA 24D8 MOVE.L (A0)+,(A2)+ 0006EC 24D8 MOVE.L (A0)+,(A2)+ 0006EE 24D8 MOVE.L (A0)+,(A2)+ 0006F0 24D8 MOVE.L (A0)+,(A2)+ 0006F2 24D8 MOVE.L (A0)+,(A2)+ 0006F4 24D8 MOVE.L (A0)+,(A2)+ 0006F6 51C8 FFBE DBF D0,L000059(PC) L00005A: 0006FA 2369 0024 0020 MOVE.L 36(A1),32(A1) ; Now what? 000700 536E 0022 SUBQ.W #1,34(A6) 000704 6B08 BMI.S L00005C 000706 7000 MOVEQ.L #0,D0 000708 4E75 RTS L00005B: 00070A 701C MOVEQ.L #28,D0 00070C 4E75 RTS L00005C: 00070E 2078 0004 MOVEA.L $0004,A0 000712 5228 0127 ADDQ.B #1,295(A0) 000716 6012 BRA.S L00005E ; Unknown extra entry point. L00005D: 000718 2078 0004 MOVEA.L $0004,A0 00071C 5228 0127 ADDQ.B #1,295(A0) 000720 7000 MOVEQ.L #0,D0 000722 536E 0022 SUBQ.W #1,34(A6) 000726 6A00 0082 BPL L000067 L00005E: 00072A 7000 MOVEQ.L #0,D0 00072C 4AAE 0030 TST.L 48(A6) 000730 6778 BEQ.S L000067 000732 48E7 0038 MOVEM.L A2-A4,-(A7) 000736 45EE FFCE LEA.L -50(A6),A2 00073A 47EE FFB6 LEA.L -74(A6),A3 00073E 49EE 00BA LEA.L 186(A6),A4 000742 224E MOVEA.L A6,A1 000744 2051 MOVEA.L (A1),A0 000746 2269 0004 MOVEA.L 4(A1),A1 00074A 2288 MOVE.L A0,(A1) 00074C 2149 0004 MOVE.L A1,4(A0) 000750 42AE 0030 CLR.L 48(A6) 000754 226E 0028 MOVEA.L 40(A6),A1 000758 202E 002C MOVE.L 44(A6),D0 00075C 2C78 0004 MOVEA.L $0004,A6 000760 4EAE FF2E JSR -210(A6) FreeMem() 000764 43EE 0226 LEA.L 550(A6),A1 L00005F: 000768 B5D1 CMPA.L (A1),A2 00076A 6710 BEQ.S L000061 00076C 2251 MOVEA.L (A1),A1 L000060: 00076E 2019 MOVE.L (A1)+,D0 000770 6EFC BGT.S L000060 000772 670C BEQ.S L000062 000774 0880 001F BCLR.L #31,D0 000778 2240 MOVEA.L D0,A1 00077A 60EC BRA.S L00005F L000061: 00077C 22AA 0004 MOVE.L 4(A2),(A1) L000062: 000780 43EE 0222 LEA.L 546(A6),A1 L000063: 000784 B7D1 CMPA.L (A1),A3 000786 6708 BEQ.S L000064 000788 2011 MOVE.L (A1),D0 00078A 6706 BEQ.S L000065 00078C 2240 MOVEA.L D0,A1 00078E 60F4 BRA.S L000063 L000064: 000790 2293 MOVE.L (A3),(A1) L000065: 000792 4EAE FD9C JSR -612(A6) SumKickData() 000796 2D40 022A MOVE.L D0,554(A6) 00079A 204C MOVEA.L A4,A0 L000066: 00079C 4A18 TST.B (A0)+ 00079E 66FC BNE.S L000066 0007A0 113C 003A MOVE.B #58,-(A0) 0007A4 200C MOVE.L A4,D0 0007A6 4CDF 1C00 MOVEM.L (A7)+,A2-A4 L000067: 0007AA 2F0E MOVE.L A6,-(A7) 0007AC 2C78 0004 MOVEA.L $0004,A6 0007B0 4EAE FF76 JSR -138(A6) Permit() 0007B4 2C5F MOVEA.L (A7)+,A6 0007B6 4E75 RTS ; ---> End of $1D8 byte area. CODE DATA