CP/M RMAC ASSEM 1.1 #001 CP/M VER 2.2 BIOS FOR SCSI HOST ADAPTOR TITLE 'CP/M VER 2.2 BIOS FOR SCSI HOST ADAPTOR' ; NAME ('BIOS22') ; DATE 20-JUN-83 ; BY DAVID WAGSTAFF ; COPYRIGHT 1983 BY GRIFFIN TECH. ALL RIGHTS RESERVED ; ; MACLIB Z80 ; Z-80 CODING IS USED ASEG ; ABSOLUTE ADDRESSING IS NEEDED ; ; ; ; THIS MODULE CONTAINS THE BASIC INPUT/OUTPUT SYSTEM FOR ; VERSION 2.2 OF THE CP/M OPERATING SYSTEM. ; PORTIONS OF THE SERIAL PORT I/O HAVE NOT BEENED CODED FOR OVIOUS REASONS ; THEREFORE, THIS TASK IS LEFT TO THE CUSTOMER OF THIS PRODUCT. ; THE EQUATE 'SCSI$BASE' HAS BE EQUATED TO THE BASE ADDRESS FOR THE SCSI ; INTERFACE BOARD, THE CURRENT VALUE IS 050H. ; THE EQUATE 'MSIZE' SHOULD BE SET TO THE SIZE OF THE OPERATING SYSTEM ; TO BE GEN'ED, TYPICALY THIS SHOULD BE ABOUT 60K. ; ; ; ; ** >> EDITING HISTORY << ** ; ; VER. DATE MODIFICATION ; ---- -------- ---------------------------------------- ; 00 06/20/83 1) CREATED. ; ; ; MDBE MACRO VALUE,SP ; MACRO TO PRINT VERSION OR DATE DB (VALUE SHR 12)+'0' DB ((VALUE SHR 8) AND 0FH)+'0' DB SP DB ((VALUE SHR 4) AND 0FH)+'0' DB (VALUE AND 0FH) +'0' ENDM ;*** DEBUG MACRO MESG,VALUES ; MACRO TO DEBUGGING BIOS LOCAL DM,DR,SPACE,SKIP ; 'MESG' IS A ASCII STRING LOCAL HLX,DEX,BCX,AFX,ARD ; TO BE PRINTD, 'VALUES' IS LOCAL CRLF ; A LIST OF MEMORY LOCATION JMP ARD ; TO DUMP TO THE TERMINAL. HLX: DW 00 ; A REGISTER DUMP WILL ALSO BCX: DW 00 ; BE PRINTED ON THE CONSOLE. DEX: DW 00 AFX: DW 00 ARD: STA AFX SHLD HLX SDED DEX SBCD BCX PUSH PSW PUSH H PUSH B CP/M RMAC ASSEM 1.1 #002 CP/M VER 2.2 BIOS FOR SCSI HOST ADAPTOR PUSH D IFNB IRP VAL, LHLD VAL CALL ?PDEC LXI H,SPACE CALL ?PRTMSG ENDM ENDIF LXI H,DM CALL ?PRTMSG LXI H,SKIP CALL ?PRTMSG IRP VAL, LHLD VAL CALL ?PDEC LXI H,SPACE CALL ?PRTMSG ENDM LXI H,CRLF CALL ?PRTMSG POP D POP B POP H POP PSW JMP DR DM: DB MESG DB CR,LF,EOM SPACE: DB " ",EOM SKIP: DB "REGISTER DUMP AF, HL, DE, BC" CRLF: DB CR,LF,EOM DR: ENDM ; ; ; ; PAGE CP/M RMAC ASSEM 1.1 #003 CP/M VER 2.2 BIOS FOR SCSI HOST ADAPTOR ; ; *** ASCII CONSTANTS AND USER OPTIONS *** ; ASEG 0007 = BELL EQU 0007H ; SOUND CONSOLE BELL 000D = CR EQU 000DH ; CARIAGE RETURN 000A = LF EQU 000AH ; LINEFEED 000C = FFD EQU 000CH ; FORMFEED 0011 = XON EQU 0011H ; ^Q 0013 = XOFF EQU 0013H ; ^S 0000 = EOM EQU 0000H ; END OF MESSAGE MARKER 0000 = FALSE EQU 0000H ; FFFF = TRUE EQU NOT FALSE ; 000A = RETRY EQU 0010 ; RETRYS BEFORE HARD-ERROR 003C = MSIZE EQU 0060 ; 60K SYSTEM. ; ; ; *** PORT ASSIGNMENTS *** ; 0050 = SCSI$BASE EQU 0050H ; SCSI INTERFACE BOARD BASE 0010 = QUAD$EIA EQU 0010H ; BASE PORT FOR QUAD. EIA BOARD 0014 = CRTSTATUS EQU QUAD$EIA+4 ; STATUS PORT FOR CONSOLE 0015 = CRTDATA EQU QUAD$EIA+5 ; DATA PORT FOR CONSOLE ; 0001 = TXRDY EQU 0001H ; TX. READY BIT IN 8251 USART 0002 = RXRDY EQU 0002H ; RX. READY BIT IN 8251 USART ; ; *** SCSI PORT ASSIGNMENTS *** ; ; * BIT,BYTE AND PORT ASSIGMENTS FOR * ; * SCSI HOST INTERFACE ADAPTOR * ; 0050 = DATAI EQU SCSI$BASE ; DATA IN REGISTER 0052 = DATAO EQU SCSI$BASE+2 ; DATA OUT REGISTER 0051 = BSTAT EQU SCSI$BASE+1 ; BUS STATUS 0050 = SELPORT EQU SCSI$BASE ; SELECT PORT ADR. 0051 = CLRINT EQU SCSI$BASE+1 ; CLR. INTRRUPT PORT 0053 = DMAPORT EQU SCSI$BASE+3 ; DMA ADDRESS PORT 0054 = CPARITY EQU SCSI$BASE+4 ; CLEAR PARITY PORT 0080 = BUSY EQU 80H ; CONTROLER BUSY BIT 0040 = CD EQU 40H ; COMMAND/DATA BIT 0020 = DIREC EQU 20H ; DIRECTON BIT 0010 = REQ EQU 10H ; REQUEST BIT 0008 = MSG EQU 08H ; END MESSAGE BIT 0004 = PERR EQU 04H ; PERR ERROR BIT 0002 = BDACK EQU 02H ; BOARD ACK. SIGNAL 0001 = LINT EQU 01H ; INTERUPTE BIT ; ; *** CARTRIAGE STORAGE INFORMATION FOR IOMEGA SYSTEM *** ; 0001 = OFFSET EQU 0001 ; TRACK OFFSET FOR SYSTEM TRACK 0132 = NCYN EQU 306 ; # TRACK/DRIVE 0040 = NSCYN EQU 64 ; # SECTORS/TRACK 0002 = ?NBSCT EQU 2 ; # BLOCKS/SECTOR 0100 = NBBLK EQU 256 ; # BYTES/BLOCK CP/M RMAC ASSEM 1.1 #004 CP/M VER 2.2 BIOS FOR SCSI HOST ADAPTOR 0080 = NBREC EQU 128 ; CP/M RECORD SIZE 0800 = BLS EQU 2048 ; CP/M BLOCK SIZE 01FF = DRM EQU 512-1 ; # DIR. ENTRYS -1 0200 = BYSCT EQU NBBLK*?NBSCT ; # BYTES/SECTOR 8000 = NBCYN EQU NSCYN*BYSCT ; # BYTES/TRACK 0004 = NRSCT EQU BYSCT/NBREC ; # RECS/SECTOR 0100 = NRCYN EQU NSCYN*NRSCT ; # RECS/TRACK 0010 = NRECBLS EQU BLS/NBREC ; # RECS/BLS 0010 = NBLSCYN EQU NRCYN/NRECBLS ; # BLS/TRACK 0990 = DSMA EQU NBLSCYN*(NCYN/2); SIZE OF AN LOGCAL DRIVE A: 0980 = DSMB EQU NBLSCYN*((NCYN/2)-OFFSET) ; SIZE OF B: ; ; * IOMEGA COMMAND SET * ; 0010 = FMTZTRK EQU 10000B ; FORMAT Z-TRACK 0012 = FLGSCT EQU 10010B ; FLAG SECTOR 0014 = FLGTRK EQU 10100B ; FLAG TRACK 0006 = C?SEEK EQU 00110B ; SEEK TRACK 0008 = C?HOME EQU 01000B ; ?HOME DRIVE 000A = REQST EQU 01010B ; REQEST STATUS 000C = REQES EQU 01100B ; REQEST EXTENDED STATUS 000E = CTEST EQU 01110B ; TEST CONTRL. STATUS 0001 = RDDATA EQU 00001B ; READ DATA 0015 = RDID EQU 10101B ; READ ID 0019 = RDDTOF EQU 11001B ; READ DATA WITH OFFSET 0011 = RDDIAG EQU 10001B ; READ DIAGNOSTIC 0003 = WRTDATA EQU 00011B ; WRITE DATA 0007 = WRTID EQU 00111B ; WRITE ID 0013 = WRTDIAG EQU 10011B ; WRITE DIAGNOSITC ; ; ; ; *** CP/M ENVIROMENT CONSTANTS *** ; 0100 = TPA EQU 0100H ; ADDRESS OF START OF TPA A000 = BIAS EQU (MSIZE-20)*1024 ; D400 = CCP EQU 3400H+BIAS ; BASE OF CCP DC06 = BDOS EQU CCP+0806H ; BASE OF BDOS EA00 = BIOS EQU CCP+1600H ; BASE OF THIS BIOS 0003 = IOBYTE EQU 0003H ; ADDRESS OF IOBYTE 0004 = CDRIVE EQU 0004H ; CURRENT DISK INDICATOR 002C = NSECTS EQU (BIOS-CCP)/128 ; # OF SECTORS/ CCP ; ; ; *** IOMEGA BLOCKING SIZE EQUATES *** ; 0800 = BUFSZ EQU 2048 ; DATA BLOCKING SIZE 0008 = MGABLKS EQU BUFSZ/256 ; # OF IOMEGA BLOCKS 0010 = CPMBLKS EQU BUFSZ/NBREC ; # OF CP/M RECORDS 0007 = MASK EQU 07H ; SEE FOLLOWING TABLE ; ; ******************************************** ; * THE VALUE OF "MASK" DETERMINES THE BLOCK * ; * BUFFER SIZE OF THE DEBLOCKING ROUTINES. * ; * THE VALUE OF "MASK" ARE: * ; * BUFSZ MASK * CP/M RMAC ASSEM 1.1 #005 CP/M VER 2.2 BIOS FOR SCSI HOST ADAPTOR ; * ----- ---- * ; * 2048 07H * ; * 4096 0FH * ; * 8192 1FH * ; * 16384 3FH * ; ******************************************** ; ; ; ; ORG BIOS ; START AT BIOS CSEG ; ; PAGE CP/M RMAC ASSEM 1.1 #006 CP/M VER 2.2 BIOS FOR SCSI HOST ADAPTOR ; 0000 C37100 JMP ?BOOT ; COLD START 0003 C3CB00 JMP ?WBOOT ; WARM BOOT 0006 C32301 JMP ?CONST ; CONSOLE STATUS 0009 C32C01 JMP ?CONIN ; CONSOLE INPUT 000C C33601 JMP ?CONOUT ; CONSOLE OUTPUT 000F C34001 JMP ?LIST ; PRINTER OUTPUT 0012 C34001 JMP ?PUNCH ; AUX: OUTPUT ROUTINE 0015 C34401 JMP ?READER ; AUX: INPUT ROUTINE 0018 C34701 JMP ?HOME ; RECALIBRATE DRIVE 001B C34801 JMP ?SELDSK ; SELECT DRIVE 001E C35C01 JMP ?SETTRK ; SET TRACK NUMBER 0021 C36101 JMP ?SETSEC ; SET SECTOR NUMBER 0024 C36601 JMP ?SETDMA ; SET DMA ADDRESS 0027 C36B01 JMP ?READ ; READ A SECTOR 002A C3B601 JMP ?WRITE ; WRITE A SECTOR 002D C34101 JMP ?LISTST ; RETURN PRINTER STATUS 0030 C32803 JMP ?SECTRAN ; SECTOR TRANSLATOR ROUTINE ; PAGE CP/M RMAC ASSEM 1.1 #007 CP/M VER 2.2 BIOS FOR SCSI HOST ADAPTOR ; ; *** >>> COMMON DATA STORAGE DEFINITION AREA <<< *** ; ; *** DISK PARAMETER BLOCK DEFINITIONS *** ; DPABLK: 0033 0001 DW NRCYN ; DRIVE A: TYPE 0035 040F DB 4,15 0037 00 DB 0 0038 9009 DW DSMA 003A FF01 DW DRM 003C 00FF DW 0FF00H 003E 8000 DW (DRM/4)+1 0040 0100 DW 1 ;**** DPBBLK: 0042 0001 DW NRCYN ; DRIVE B: TYPE 0044 040F DB 4,15 0046 00 DB 0 0047 8009 DW DSMB 0049 FF01 DW DRM 004B 00FF DW 0FF00H ; DEBUG = 0FFFFH 004D 8000 DW (DRM/4)+1 004F 9A00 DW 9AH ;**** ; ; ; *** >>> DISK PARAMETER HEADER TABLES <<< *** ; DPBASE: ; 0051 00000000 DW 0000,0000 ; DRIVE A: 0055 00000000 DW 0000,0000 ; 0059 79033300 DW DIRBF,DPABLK ; 005D F903F904 DW CHKA,ALLA ; ; 0061 00000000 DW 0000,0000 ; DRIVE B: 0065 00000000 DW 0000,0000 ; 0069 79034200 DW DIRBF,DPBBLK ; 006D 7904FB04 DW CHKB,ALLB ; ; PAGE CP/M RMAC ASSEM 1.1 #008 CP/M VER 2.2 BIOS FOR SCSI HOST ADAPTOR ; ; ; *** >>> START OF BOOT AND WARM BOOT ROUTINES <<< *** ; ?BOOT: ;-OP: HANDLE MISC. INITILIZATION AND SIGNON MESSAGE PRINTING ;-PP: NONE ;-RC: NONE ;- 0071 AF XRA A ; CLEAR IOBYTE 0072 320300 STA IOBYTE ; 0075 320400 STA CDRIVE ; AND CURRENT DISK 0078 219900 LXI H,SIGNON ; GO PRINT SIGN-ON MESSAGE 007B CD2B03 CALL ?PRTMSG ; ?GOCPM: 007E 3EC3 MVI A,0C3H ; A = OP. CODE FOR 'JP' 0080 320000 STA 0000H ; VECTOR @ 0000H 0083 320500 STA 0005H ;& VECTOR @ 0005H 0086 2103EA LXI H,BIOS+3 ; LOCATION OF WBOOT ROUTINE 0089 220100 SHLD 0001H ; SAVE IT 008C 2106DC LXI H,BDOS ; LOCATION OF BDOS 008F 220600 SHLD 0006H ; SAVE TO SYSTEM VECTOR 0092 3A0400 LDA CDRIVE ; GET THE CURRENT DISK 0095 4F MOV C,A ; TO REGISTER C 0096 C300D4 JMP CCP ; AND PASS CONTROL TO THE CCP ;* ;** ;* SIGNON: 0099 0D0A0A0A DB CR,LF,LF,LF 009D 42494F5332 DB 'BIOS220 --- CP/M VER. 2.2 BIOS 20-JUN-83',CR,LF 00C8 0D0A00 CRLF: DB CR,LF,EOM ;* ;** ;* PAGE CP/M RMAC ASSEM 1.1 #009 CP/M VER 2.2 BIOS FOR SCSI HOST ADAPTOR ;+ ?WBOOT: ;-OP: WARM BOOT CP/M SYSTEM. ;-PP: SYSTEM TRACKS OF DRIVE A: HAS A VALID SYSTEM ON IT. ;-RC: CCP IS RELOADED INTO CORE FROM SYSTEM TRACKS ;- 00CB 318000 LXI SP,0080H ; SET-UP THE STACK TO FREE AREA 00CE CD2B02 CALL ?FLUSH ; FLUSH DISK CACHE 00D1 21FFFF LXI H,-1 ; FORCE NEW READS 00D4 225C03 SHLD @RBLK ; 00D7 3E57 MVI A,'W' ; MARK AS WARM BOOT 00D9 326003 STA @WRTACT ; 00DC 0E00 MVI C,0 ; SELECT DRIVE A: 00DE CD4801 CALL ?SELDSK ; 00E1 CD4701 CALL ?HOME ; RECALIBRATE DRIVE ; ;* AT THIS POINT WE MUST RELOAD IN EVERYTHING BUT THE BIOS * ; 00E4 3A0400 LDA CDRIVE ; A= CURRENT DISK NUMBER WBT1: 00E7 F5 PUSH PSW ; SAVE CURRENT DISK 00E8 210100 LXI H,0001 ; SET TO READY BLOCK 1 00EB 225E03 SHLD @ACTSCT ; 00EE 2100D4 LXI H,CCP ; HL @ BASE OF CCP WBT2: 00F1 225803 SHLD @RPNTR ; SAVE LOAD ADR. TO DMA POINTER 00F4 3E08 MVI A,8 ; GO READ IN 8 BLOCKS (8*256) BYTES 00F6 CD5B02 CALL ?RDBLK ; GO DO IT JRNZ WBTERR ; BRIF ERROR 00F9+201F DB 20H,WBTERR-$-1 00FB 2A5803 LHLD @RPNTR ; UP-DATE DMA POINTER 00FE 110008 LXI D,NBBLK*8 ; DE = TRANSFER SIZE 0101 19 DAD D ; 0102 3A5E03 LDA @ACTSCT ; POINT NEXT DATA BLOCK 0105 C608 ADI 08 ; 0107 325E03 STA @ACTSCT ; 010A FE11 CPI 11H ; SEE IF THE END HAS BEEN REACHED JRNZ WBT2 ; BRIF NOT DONE 010C+20E3 DB 20H,WBT2-$-1 010E 3E00 MVI A,FALSE ; MARK AS NOT WRITE ACTIVE 0110 326003 STA @WRTACT ; 0113 F1 POP PSW ; RECOVER CURRENT DISK NUMBER 0114 320400 STA CDRIVE ; 0117 C37E00 JMP ?GOCPM ; AN PASS CONTROL TO CCP ;* WBTERR: 011A 3E57 MVI A,'W' ; A = CODE FOR WARM BOOT ERROR 011C CD3703 CALL ?DSKERR ; GO PRINT THE MESSAGE 011F F1 POP PSW ; RECOVER ALL OLD NUMBER 0120 C3E700 JMP WBT1 ; AND TRY AGAIN ;* ;** ;* PAGE CP/M RMAC ASSEM 1.1 #010 CP/M VER 2.2 BIOS FOR SCSI HOST ADAPTOR ; ; *** >>> START OF CHARACTER I/O ROUTINES *** ; ?CONST: ;-OP: SEE IF CONSOLE HAS CHARACTER READY ;-PP: NONE ;-RC: A = 00 : NO CHARACTER READY ;- FF : CHARACTER READY ;- ; >>> SUPPLY CODE HERE FOR YOUR HARDWARE CONFIGURATION <<< ; SAMPLE CODE IS PROVIDED FOR A 8251 TYPE USART ; 0123 DB14 IN CRTSTATUS ; GET STATUS 0125 2F CMA ; OUR HARDWARE COMPLEMENTS STATUS REGISTER 0126 E602 ANI RXRDY ; 0128 C8 RZ ; EXIT IF NOT READY 0129 F6FF ORI 0FFH ; ELSE WITH WITH TRUE 012B C9 RET ;* ;** ;* ;+ ?CONIN: ;-OP: GET CHARACTER FROM THE CONSOLE ;-PP: NONE ;-RC: A = CHARACTER (PARITY BIT STRIPED, I.E. ONLY 7-BITS PRESENT) ;- 012C CD2301 CALL ?CONST ; WAIT FOR CHARACTER READY 012F B7 ORA A ; JRZ ?CONIN ; 0130+28FA DB 28H,?CONIN-$-1 ; ; >>> SUPPLY CODE HERE FOR YOUR HARDWARE CONFIGURATION <<< ; >>> REGISTER A WILL RECEIVE CHARACTER, PORT HAS CHARACTER READY <<< ; SAMPLE CODE IS PROVIDED FOR A 8251 TYPE USART. ; 0132 DB15 IN CRTDATA ; GRAB THE DATA BYTE 0134 2F CMA ; OUR HARDWARE COMPLEMENTS THE DATA REGISTER 0135 C9 RET ; AND THEN EXIT ;* ;** ;* ;+ ?CONOUT: ;-OP: SEND CHARACTER TO CONSOLE ;-PP: C = CHARACTER ;-RC: NONE ;- ; >>> SUPPLY CODE HERE FOR YOUR HARDWARE CONFIGURATION <<< ; SAMPLE CODE IS PROVIDED FOR A 8251 TYPE USART 0136 DB14 IN CRTSTATUS ; WAIT FOR TX. READY 0138 E601 ANI TXRDY ; JRNZ ?CONOUT ; REMEMBER OUR HARDWARE 013A+20FA DB 20H,?CONOUT-$-1 013C 79 MOV A,C ; A = CHARACTER TO SEND CP/M RMAC ASSEM 1.1 #011 CP/M VER 2.2 BIOS FOR SCSI HOST ADAPTOR 013D D315 OUT CRTDATA ; EJECT THE CHARACTER 013F C9 RET ; AND THEN EXIT ;* ;** ;* ;+ ?LIST: ?PUNCH: ;-OP: HANDLE OUTPUT TO LIST AND PUNCH DEVICES ;-PP: C = CHARACTER TO SEND ;-RC: NONE ;- ; >>> SUPPLY CODE HERE FOR YOUR HARDWARE CONFIGURATION <<< 0140 C9 RET ; THIS JUST ACTS AS A BIT-BUCKET ;* ;** ;* ;+ ?LISTST: ;-OP: RETURN STATUS OF PRINTER READY ;-PP: NONE ;-RC: A = 00 : PRINTER NOT READY ;- FF : PRINTER IS READY ;- ; >>> SUPPLY CODE HERE FOR YOUR HARDWARE CONFIGURATION <<< ; 0141 3EFF MVI A,TRUE ; THIS IS JUST A DEFAULT 0143 C9 RET ; AND THEN EXIT ;* ;** ;* ;+ ?READER: ;-OP: HANDLE INPUT FROM A SECONDARY INPUT DEVICE ;-PP: NONE ;-RC: A = INPUTED CHARACTER. ;- ; >>> SUPPLY CODE HERE FOR YOUR HARDWARE CONFIGURATION <<< 0144 3E1A MVI A,'Z' AND 3FH ; THIS JUST RETURNS EOF 0146 C9 RET ; ;* ;** ;* ; ; PAGE CP/M RMAC ASSEM 1.1 #012 CP/M VER 2.2 BIOS FOR SCSI HOST ADAPTOR ; *** >>> DISK SUPPORT ROUTINES <<< *** ; ;+ ?HOME: ;-OP: THIS FUNCTION PERFORMS NO-OPERATION IN ;- THIS SYSTEM. ;- 0147 C9 RET ; JUST EXIT ;* ;** ;* ;+ ?SELDSK: ;-OP: SELECT A DRIVE FOR FURTHER OPERATIONS ;-PP: C = DRIVE TO SELECT ;-RC: HL @ DPH FOR DRIVE ELSE 0000 IF BAD DRIVE ;- 0148 210000 LXI H,0000 ; READY FOR ERROR EXIT 014B 79 MOV A,C ; A = DRIVE CODE 014C FE02 CPI 2 ; 014E D0 RNC ; EXIT IF BAD SELECT CODE 014F 320400 STA CDRIVE ; SAVE NEW CURRENT DISK 0152 6F MOV L,A ; HL = DRIVE CODE REPT 4 DAD H ; HL = HL * 16 ENDM 0153+29 DAD H ; HL = HL * 16 0154+29 DAD H ; HL = HL * 16 0155+29 DAD H ; HL = HL * 16 0156+29 DAD H ; HL = HL * 16 0157 115100 LXI D,DPBASE ; DE = BASE OF TABLE 015A 19 DAD D ; PERFORM THE INDEX OPERATION 015B C9 RET ; AND THEN EXIT ;* ;** ;* ;+ ?SETTRK: ;-OP: SET-UP TRACK POINTER ;-PP: BC = TRACK FOR NEXT OPERATION ;-RC: NONE ;- SBCD @TRK ; SAVE CURRENT TRACK 015C+ED43 DB 0EDH,43H 015E+6703 DW @TRK 0160 C9 RET ; AND EXIT ;* ;** ;* ;+ ?SETSEC: ;-OP: SET-UP SECTOR POINTER ;-PP: BC = SECTOR FOR NEXT OPERATION ;-RC: NONE CP/M RMAC ASSEM 1.1 #013 CP/M VER 2.2 BIOS FOR SCSI HOST ADAPTOR ;- SBCD @SECT ; SAVE CURRENT SECTOR 0161+ED43 DB 0EDH,43H 0163+6903 DW @SECT 0165 C9 RET ; AND THEN EXIT ;* ;** ;* ;+ ?SETDMA: ;-OP: SET-UP DMA ADDRESS POINTER ;-PP: BC = ADDRESS OF DMA AREA ;-RC: NONE ;- SBCD @DMA ; SAVE CURRENT DMA ADDRESS 0166+ED43 DB 0EDH,43H 0168+6503 DW @DMA 016A C9 RET ; AND THEN EXIT ;* ;** ;* ;+ ?READ: ;-OP: READ A SECTOR ;-PP: DISK READ PARMATERS SET (I.E. TRACK, SECTOR AND DRIVE) ;-RC: A = 0 : NO ERRORS OCCURED ;- = 0FFH : ERRORS DETECTED ;- 016B 21FD04 LXI H,RDBUF ; POINT TO READ BUFFER 016E 225803 SHLD @RPNTR 0171 CD0002 CALL COMPUTE ; GET LOG. BLOCK # (HL =) 0174 EB XCHG ; IS BLOCK LOADED?? 0175 2A5A03 LHLD @WBLK ; IS SECTOR WRT. ACTIVE?? 0178 B7 ORA A ; DSBC DE ; 0179+ED52 DB 0EDH,DE*8+42H JRZ RD4 ; BRIF SO 017B+280A DB 28H,RD4-$-1 017D 2A5C03 LHLD @RBLK ; IS BLOCK ALREADY LOADED?? 0180 B7 ORA A ; (IN READ BUFFER THAT IS) DSBC DE ; 0181+ED52 DB 0EDH,DE*8+42H JRZ RD1 ; BRIF IF LOADED 0183+2808 DB 28H,RD1-$-1 JR RD2 ; BRIF NOT 0185+1815 DB 18H,RD2-$-1 ;* RD4: 0187 21FF04 LXI H,WRTBUF ; INDEX INTO WRT. BUFF. 018A C39001 JMP RD3 ; GO DO IT RD1: 018D 21FD04 LXI H,RDBUF ; INDEX INTO RD. BUFF. RD3: 0190 09 DAD B ; BC = INDEX, HL @ SECTOR DAT LDED @DMA ; DE = ADDRESS DMA CP/M RMAC ASSEM 1.1 #014 CP/M VER 2.2 BIOS FOR SCSI HOST ADAPTOR 0191+ED5B DB 0EDH,5BH 0193+6503 DW @DMA 0195 018000 LXI B,NBREC ; BC = SIZE OF CP/M RECORD LDIR ; PERFORM THE TRANSFER 0198+EDB0 DB 0EDH,0B0H 019A AF XRA A ; EXIT WITH NO ERRORS 019B C9 RET ; AND EXIT ;* RD2: SDED @ACTSCT ; SET-UP FOR READ 019C+ED53 DB 0EDH,53H 019E+5E03 DW @ACTSCT SDED @RBLK ; SET POINTER 01A0+ED53 DB 0EDH,53H 01A2+5C03 DW @RBLK 01A4 3A6003 LDA @WRTACT ; SEE IF WARM BOOT ACTIVE 01A7 FE57 CPI 'W' ; JRZ RD20 ; BRIF SO 01A9+2802 DB 28H,RD20-$-1 RES 0,L ; CLEAR UNIT FLAG 01AB+CB85 DB 0CBH,0*8+L+80H RD20: 01AD 3E08 MVI A,MGABLKS ; XXX BLOCKS ONLY 01AF CD5B02 CALL ?RDBLK ; GO DO IT 01B2 C0 RNZ ; RETURN ON ERROR 01B3 C38D01 JMP RD1 ; GO INDEX INTO TABLE ;* ;** ;* PAGE CP/M RMAC ASSEM 1.1 #015 CP/M VER 2.2 BIOS FOR SCSI HOST ADAPTOR ;+ ?WRITE: ;-OP: WRITE A SECTOR ;-PP: DISK PERAMETERS ARE SET (I.E. TRACK, SECTOR AND DRIVE) ;- REG C HAS WRITE TYPE 0,1,2 ;-RC: A = 0 : NO ERRORS DETECTED ;- = 0FFH : ERRORS DETECTED ;- 01B6 79 MOV A,C ; A= WRITE TYPE 01B7 327603 STA @WRTYPE ; SAVE FOR LATER 01BA CD0002 CALL COMPUTE ; GO COMPUTE MGA BLOCK WT03: 01BD EB XCHG ; DE = BLOCK 01BE 2A5A03 LHLD @WBLK ; SEE IF THE SAME AS LOADED 01C1 F607 ORI A ; CLEAR CARRY DSBC DE ; TEST 01C3+ED52 DB 0EDH,DE*8+42H JRZ WT02 ; BRIF SO 01C5+281C DB 28H,WT02-$-1 01C7 D5 PUSH D ; SAVE GOAL BLK# 01C8 CD2B02 CALL ?FLUSH ; FLUSH OUT OLD BLOCK NUMBER 01CB E1 POP H ; HL= NEW BLOCK # 01CC 225E03 SHLD @ACTSCT ; UP-DATE POINTERS 01CF 225A03 SHLD @WBLK ; 01D2 21FF04 LXI H,WRTBUF ; DMA TO WRITE BUFFER 01D5 225803 SHLD @RPNTR ; ; IF BUFSZ-2048 MVI A,MGABLKS ; READ IN A BLOCK CALL ?RDBLK ; GO READ IT IN ELSE ; BLOCK SIZE = 2048 01D8 3A7603 LDA @WRTYPE ; SEE IF WRITE TYPE IS TYPE 2 01DB FE02 CPI 2 ; 01DD 3E08 MVI A,MGABLKS ; READY FOR PRE-READ IF NECESSARY 01DF C45B02 CNZ ?RDBLK ; BRIF SO ENDIF ; 01E2 C0 RNZ ; RETURN ON ERROR WT02: 01E3 21FF04 LXI H,WRTBUF ; HL @ SECTOR BUFFER 01E6 09 DAD B ; ADD IN THE OFFSET 01E7 EB XCHG ; DE @ SECTOR 01E8 2A6503 LHLD @DMA ; HL @ DATA 01EB 018000 LXI B,NBREC ; BC = # BYTES/CP/M RECORD LDIR ; DO THE TRNSFR 01EE+EDB0 DB 0EDH,0B0H ; 01F0 3EFF MVI A,TRUE ; SET WRITE ACTIVE TO TRUE 01F2 326003 STA @WRTACT ; 01F5 3A7603 LDA @WRTYPE ; GET BACK WRITE TYPE 01F8 3D DCR A ; CHECK FOR DIRECTORY 01F9 3E00 MVI A,0 ; FOR SAFTY 01FB CC2B02 CZ ?FLUSH ; GO FLUSH DATA IF SO 01FE B7 ORA A ; SET FLAGS 01FF C9 RET ; AND EXIT CP/M RMAC ASSEM 1.1 #016 CP/M VER 2.2 BIOS FOR SCSI HOST ADAPTOR ;* ;** ;* PAGE CP/M RMAC ASSEM 1.1 #017 CP/M VER 2.2 BIOS FOR SCSI HOST ADAPTOR ;+ COMPUTE: ;-OP: COMPUTE PHYS. BLOCK NUMBER ;-PP: TRACK AND SECTOR ARE SET ;-RC: HL = PHYS. BLOCK NUMBER ;- BC = INDEX INTO BLOCK (0..BUFSZ) ;- ; 0200 216703 LXI H,@TRK ; HL @ TRACK # 0203 1E00 MVI E,0 ; CLEAR LOW DE 0205 56 MOV D,M ; LOAD LOW TRACK 0206 23 INX H ; POINT HI TRACK 0207 7E MOV A,M ; A= HI TRACK RRA ; DIVIDE BY TWO RARR D ; 0208+CB1A DB 0CBH, 18H + D RARR E ; 020A+CB1B DB 0CBH, 18H + E 020C EB XCHG ; HL= TRACK*128 020D 3A6903 LDA @SECT ; A = SECTOR NUMBER SRLR A ; DIVIDE BY 2 0210+CB3F DB 0CBH, 38H + A 0212 0E00 MVI C,0 ; C= 0 OR 80H RARR C ; 0214+CB19 DB 0CBH, 18H + C 0216 85 ADD L ; 0217 47 MOV B,A ; 0218 E6F8 ANI NOT MASK ; 021A 6F MOV L,A ; 021B 78 MOV A,B ; 021C E607 ANI MASK ; 021E 47 MOV B,A ; SBCD @OFS ; SAVE OFFSET 021F+ED43 DB 0EDH,43H 0221+7703 DW @OFS 0223 3A0400 LDA CDRIVE ; FOR SELECTION 0226 B7 ORA A ; CHECK FOR UNIT 0 0227 C8 RZ ; RETURN IF SO SETB 0,L ; ELSE SET UNIT 1 FLAG 0228+CBC5 DB 0CBH,0*8+L+0C0H 022A C9 RET ; AND EXIT ;* ;** ;* ;+ ?FLUSH: ;-OP: FLUSH WRITE BUFFER IF NEEDED ;-PP: @WBLK IS SET AND VALID ;- IF @WRTACT FLAG IS SET TO TRUE ;- ; 022B 21FF04 LXI H,WRTBUF ; SET DMA TO WRITE BUFFER 022E 225803 SHLD @RPNTR ; 0231 3A6003 LDA @WRTACT ; 0234 FE00 CPI FALSE ; BUFFER WRITE ACTIVE?? CP/M RMAC ASSEM 1.1 #018 CP/M VER 2.2 BIOS FOR SCSI HOST ADAPTOR 0236 C8 RZ ; RETURN IF NOT 0237 2A5A03 LHLD @WBLK ; 023A 225E03 SHLD @ACTSCT ; ACTSEC = WBLKN 023D 3E08 MVI A,MGABLKS ; WRITE ONLY XX BLOCK 023F CD5F02 CALL WRTBLK ; GO WRITE IT 0242 3E00 MVI A,FALSE ; BUFFER NOT WRITE ACTIVE 0244 326003 STA @WRTACT ; 0247 2A5C03 LHLD @RBLK ; IS READ/WRITE TO SAME LDED @WBLK ; 024A+ED5B DB 0EDH,5BH 024C+5A03 DW @WBLK 024E B7 ORA A ; DSBC DE ; 024F+ED52 DB 0EDH,DE*8+42H JRNZ FLSH1 ; BRIF NOT 0251+2006 DB 20H,FLSH1-$-1 0253 21FFFF LXI H,-1 ; FORCE READ 0256 225C03 SHLD @RBLK ; FLSH1: 0259 AF XRA A ; RECORD NO ERROR 025A C9 RET ; AND EXIT ;* ;** ;* ; ; PAGE CP/M RMAC ASSEM 1.1 #019 CP/M VER 2.2 BIOS FOR SCSI HOST ADAPTOR ; ; *** >>> SACI HOST INTERFACE ADAPTOR SUPPORT ROUTINES <<< *** ; ;+ ?RDBLK: ;-OP: READ IN X SECTORS ;-PP: A = NUMBER OF BLOCKS TO READ ;- @ACTSCT IS VALID ;- 025B 1E01 MVI E,RDDATA ; E = READ DATA COMMAND JR PRECMD ; GO PREPARE FOR IT 025D+1802 DB 18H,PRECMD-$-1 ;* ;** ;* ;+ WRTBLK: ;-OP: WRITE OUT X BLOCKS ;-PP: A = NUMBER OF BLOCKS TO WRITE ;- @ACTSCT IS VALID ;- 025F 1E03 MVI E,WRTDATA ; E = WRITE DATA CMD. ;+ PRECMD: ;-OP: CREATE COMMAND BLOCK ;-PP: A = NUMBER OF BLOCK INVOLVED ;- E = FIRST COMMAND BYTE ;- 0261 D5 PUSH D ; SAVE COMMAND 0262 216B03 LXI H,CMDTBL ; HL @ COMMAND BLOCK 0265 73 MOV M,E ; STORE COMMAND BYTE 0266 23 INX H ; POINT NEXT LDED @ACTSCT ; DE = LOG. BLOCK NUMBER 0267+ED5B DB 0EDH,5BH 0269+5E03 DW @ACTSCT 026B F5 PUSH PSW ; SAVE BLOCK COUNT 026C 3A6003 LDA @WRTACT ; SEE IF IN WARM BOOT 026F FE57 CPI 'W' ; JRZ PC10 ; BRIF SO 0271+2804 DB 28H,PC10-$-1 0273 7B MOV A,E ; MASK OUT GARBAGE 0274 E6F8 ANI NOT MASK ; 0276 5F MOV E,A ; PC10: 0277 F1 POP PSW ; RECOVER BLOCK COUNT 0278 72 MOV M,D ; SAVE IT 0279 23 INX H ; 027A 73 MOV M,E ; 027B 23 INX H ; 027C 3600 MVI M,0 ; ALWAYS < 256 LOG. BLOCKS 027E 23 INX H 027F 77 MOV M,A ; SAVE # BLOCKS TO TRNSFR 0280 23 INX H 0281 3600 MVI M,0 ; CLEAR EXTRA BYTE 0283 216B03 LXI H,CMDTBL ; HL @ CMD. BLOCK CP/M RMAC ASSEM 1.1 #020 CP/M VER 2.2 BIOS FOR SCSI HOST ADAPTOR 0286 CD9802 CALL ?DOCMD ; GO DO IT 0289 D1 POP D ; RECOVER COMMAND 028A C8 RZ ; RETURN IF OK 028B CD9202 CALL SCSI$ERROR ;GO PRINT DISK ERROR 028E 3EFF MVI A,0FFH ;MARK THE ERROR 0290 B7 ORA A ; 0291 C9 RET ;AND EXIT ;* ;** ;* ;+ SCSI$ERROR: ;-OP: HANDLE SCSI DISK ERRORS ;- 0292 3E44 MVI A,'D' ; CODE FOR DATA ERROR 0294 CD3703 CALL ?DSKERR ; DO THE DISK ERROR 0297 C9 RET ; AND THEN EXIT ;* ;** ;* ; PAGE CP/M RMAC ASSEM 1.1 #021 CP/M VER 2.2 BIOS FOR SCSI HOST ADAPTOR ; ;* START OF PROTOCAL HANDLING ROUTNES * ; ;+ ?DOCMD: ;-OP: ISSUE COMMAND TO SCSI HOST ADAPTOR ;-PP: HL @ COMMAND BYTES TO SEND ;- @ACTSEC & @RPNTR ARE VALID ;-RC: NO - ZERO : ERROR IN COMMAND (A = ERROR BITS) ;- ZERO : COMMAND WAS EXECUTED SUCCESSFULLY ;- 0298 226103 SHLD LCMD@ ; SAVE COMMAND @ 029B 3E0A MVI A,RETRY ; GET RETRY COUNT 029D 326303 STA TRYCNTR ; RESET COUNTER 02A0 D354 OUT CPARITY ; RESET PARITY ERROR DCMD1: 02A2 C5 PUSH B ; SAVE COUNTER 02A3 CDE802 CALL ?PUTDMA ; SET DMA ADDRESS 02A6 CDF802 CALL ?SELECT ; GO SELECT CONTROLER 02A9 C1 POP B ; RECOVER BC ; WAIT: ; ;* HERE WE MUST WAIT FOR EXECUTION * ; 02AA DB51 IN BSTAT ; A <--- BUSS STATUS 02AC E650 ANI CD+REQ ; CHECK FOR DATA JRNZ WAIT ; BRIF STILL DATA 02AE+20FA DB 20H,WAIT-$-1 02B0 DB50 IN DATAI ; A <-- COMPLETION STATUS 02B2 F5 PUSH PSW ; SAVE ENDING STATUS WAIT1: 02B3 DB51 IN BSTAT ; WAIT FOR REQ. AND MSG. 02B5 E618 ANI REQ+MSG ; JRNZ WAIT1 ; 02B7+20FA DB 20H,WAIT1-$-1 02B9 DB50 IN DATAI ; GET BYTE OF ZERO 02BB F1 POP PSW ; RECOVER STATUS 02BC E61F ANI 00011111B ; MASK OUT ERRORS JRNZ WAIT4 ; BRIF NOT OK 02BE+200D DB 20H,WAIT4-$-1 02C0 DB51 IN BSTAT ; CHECK FOR PARITY 02C2 E604 ANI PERR ; 02C4 D351 OUT CLRINT ; CLEAR INTERRUPT 02C6 3EFF MVI A,0FFH ; JRNZ WAIT4 ; BRIF ERROR 02C8+2003 DB 20H,WAIT4-$-1 02CA AF XRA A ; EXIT WITH ZERO 02CB C9 RET ; AND EXIT ;* ;* WAIT7: 02CC F1 POP PSW ; CLEAR OUT STACK WAIT4: BIT 2,A ; HARDWARE BUSY?? CP/M RMAC ASSEM 1.1 #022 CP/M VER 2.2 BIOS FOR SCSI HOST ADAPTOR 02CD+CB57 DB 0CBH,2*8+A+40H JRZ WAIT6 ; BRIF NOT 02CF+2807 DB 28H,WAIT6-$-1 02D1 3E52 MVI A,'R' ; CODE FOR READY ERROR 02D3 CD3703 CALL ?DSKERR ; JR WAIT5 ; AND CONTINUE 02D6+1806 DB 18H,WAIT5-$-1 ;* WAIT6: 02D8 216303 LXI H,TRYCNTR ; SEE IF RETRY UP 02DB 35 DCR M ; JRZ WAIT2 ; BRIF RETRY IS UP 02DC+2806 DB 28H,WAIT2-$-1 WAIT5: 02DE 2A6103 LHLD LCMD@ ; RECOVER LAST COMMAND 02E1 C3A202 JMP DCMD1 ; AND TRY AGAIN ;* WAIT2: 02E4 D351 OUT CLRINT ; CLEAR INTERRUPT 02E6 B7 ORA A ; EXIT WITH NON-ZERO 02E7 C9 RET ; AND EXIT ;* ;** ;* ;+ ?PUTDMA: ;-OP: SEND DMA ADDRESS TO HOST ADAPTER ;-PP: RPNTR HAS DMA ADDRESS ;- 02E8 3A6403 LDA HIDMA ; SET HI-BYTE 02EB D353 OUT DMAPORT ; HIGH BYTE ALWAYS ZERO LDED @RPNTR ; DE @ DMA ADDRESS 02ED+ED5B DB 0EDH,5BH 02EF+5803 DW @RPNTR 02F1 7A MOV A,D 02F2 D353 OUT DMAPORT ; SEND BYTE 1 02F4 7B MOV A,E 02F5 D353 OUT DMAPORT ; SEND BYTE 2 02F7 C9 RET ; AND EXIT ;* ;** ;* ;+ ?SELECT: ;-OP: SELECT CONTROLER ;- 02F8 DB51 IN BSTAT ; IS CONTROLER BUSY?? 02FA E680 ANI BUSY ; WAIT FOR NOT BUSY JRZ ?SELECT ; WAIT IF SO 02FC+28FA DB 28H,?SELECT-$-1 SEL2: 02FE 3E01 MVI A,01H ; SELECT CONTROLER #1 0300 D352 OUT DATAO ; 0302 D350 OUT SELPORT ; AND SELECT CONTROLER SEL1: 0304 DB51 IN BSTAT ; WAIT FOR REQ CP/M RMAC ASSEM 1.1 #023 CP/M VER 2.2 BIOS FOR SCSI HOST ADAPTOR 0306 E610 ANI REQ ; JRNZ SEL1 ; 0308+20FA DB 20H,SEL1-$-1 030A 57 MOV D,A ; D=0, MARK FIRST COMMAND ; ;* NOW FALL ON THRU TO OUTPUT COMMAND BYTES * ; ;+ ?OUTCMD: ;-OP: ISSUE COMMAND BYTES TO HOST ADAPTOR ;-PP: HL @ COMMAND BYTES ;- 030B DB51 IN BSTAT ; GRAB BUSS STATUS 030D 4F MOV C,A ; SAVE STATUS 030E E640 ANI CD ; SEE IF DATA 0310 C0 RNZ ; EXIT IF DATA 0311 79 MOV A,C ; CHECK FOR DIREC 0312 E620 ANI DIREC ; 0314 C8 RZ ; EXIT IF INPUT 0315 3E12 MVI A,REQ+BDACK ; BIT 0,D ; SEE IF FIRST CMD. 0317+CB42 DB 0CBH,0*8+D+40H JRNZ ?OC5 ; BRIF NOT 0319+2002 DB 20H,?OC5-$-1 031B 3E10 MVI A,REQ ; ELSE JUST CHECK FOR REQ. ?OC5: 031D A1 ANA C ; CHECK FOR READY JRNZ ?OUTCMD ; BRIF NOT (1.75/1.17) 031E+20EB DB 20H,?OUTCMD-$-1 ?OC1: 0320 7E MOV A,M ; GET COMMAND BYTE (1.75/1.17) 0321 D352 OUT DATAO ; SEND TO CONTROLER (2.75/1.83) 0323 23 INX H ; POINT NEXT (1.5/1.0) 0324 1601 MVI D,1 ; MARK NOT FIRST COMMAND JR ?OUTCMD ; AND DO IT AGAIN! 0326+18E3 DB 18H,?OUTCMD-$-1 ;* ;** ;* ; PAGE CP/M RMAC ASSEM 1.1 #024 CP/M VER 2.2 BIOS FOR SCSI HOST ADAPTOR ; ; *** MISC. ROUTINES AND FUNCTIONS *** ; ; ;+ ?SECTRAN: ;-OP: PERFORM SECTOR TRANSLATION ;-PP: DE @ TRAN. TABLE ;- BC = SECTOR NUMBER ;- HL = TRAN. SECTOR NUMBER ;- 0328 60 MOV H,B ; SIMPLE 1 TO 1 TRANSLATION 0329 69 MOV L,C ; 032A C9 RET ; ADD EXIT ;* ;** ;* ; ;+ ?PRTMSG: ;-OP: PRINT MESSAGE STRING AT HL ;-PP: HL @ MESSAGE STRING TERMINATED WITH A ZERO BYTE. ;-RC: NONE ;- 032B 7E MOV A,M ; CHECK FOR EOS 032C B7 ORA A ; 032D C8 RZ ; EXIT IF SO 032E 4F MOV C,A ; C = CHARACTER 032F 23 INX H ; POINT NEXT CHARACTER 0330 E5 PUSH H ; AND SAVE 0331 CD3601 CALL ?CONOUT ; AND ISSUE TO TERMINAL HANDLER 0334 E1 POP H ; RECOVER POINTER JR ?PRTMSG ; AND CONTINUE 0335+18F4 DB 18H,?PRTMSG-$-1 ;* ;** ;* ;+ ?DSKERR: ;-OP: DISK ERROR HANDLER ;-PP: A = ERROR CODE LETTER ;-RC: NONE ;- 0337 F5 PUSH PSW ; SAVE ERROR LETTER ON STACK 0338 214403 LXI H,DEM ; HL @ DISK ERROR MESSAGE 033B CD2B03 CALL ?PRTMSG ; GO PRINT MESSAGE HEADER 033E F1 POP PSW ; C = ERROR CODE LETTRE 033F 4F MOV C,A ; 0340 CD3601 CALL ?CONOUT ; AND PRINT IT 0343 C9 RET ; AND EXIT ;* DEM: 0344 0D0A0A DB CR,LF,LF 0347 4449534B20 DB 'DISK I/O ERROR :',0 ;* CP/M RMAC ASSEM 1.1 #025 CP/M VER 2.2 BIOS FOR SCSI HOST ADAPTOR ;** ;* ; PAGE CP/M RMAC ASSEM 1.1 #026 CP/M VER 2.2 BIOS FOR SCSI HOST ADAPTOR ; ; *** >>> BIOS DATA STORAGE AREA <<< *** ; ; 0358 0000 @RPNTR: DW 00 ; ADDRESS OF INTERNAL DEBLOCKING BUFFER 035A 0000 @WBLK: DW 00 ; CURRENT WRITE BLOCK NUMBER 035C 0000 @RBLK: DW 00 ; CURRENT READ BLOCK NUMBER 035E 0000 @ACTSCT: DW 00 ; BLOCK NUMBER TO READ/WRITE 0360 00 @WRTACT: DB FALSE ; TRUE IF BLOCK IS WRITE ACTIVE 0361 0000 LCMD@: DW 00 ; ADDRESS OF LAST IOMEGA COMMAND 0363 00 TRYCNTR: DB 00 ; RETRY COUNTER FOR IOMEGA I/O OP.S 0364 00 HIDMA: DB 00H ; PAGE ADDRESS OF IOMEGA BUFFER AREA 0365 0000 @DMA: DW 00 ; CURRENT DMA ADDESS 0367 0000 @TRK: DW 00 ; CURRENT TRACK NUMBER 0369 0000 @SECT: DW 00 ; CURRENT SECTOR NUMBER 036B CMDTBL: DS 11 ; IOMEGA COMMAND TABLE STORAGE 0376 00 @WRTYPE: DB 00H ; CURRENT WRITE TYPE 0377 0000 @OFS: DW 00 ; CURRENT DISK CACHE INDEX 0379 DIRBF: DS 128 ; DIRECTORY BUFFER 03F9 CHKA: DS (DRM/4)+1 ; DIRECTORY CHECKSUM FOR DRIVE A: 0479 CHKB: DS (DRM/4)+1 ; DIRECTORY CHECKSUM FOR DRIVE B: 04F9 3301 ALLA: DW (DSMA/8)+1 ; ALLOCATION MAP FOR DRIVE A: 04FB 3101 ALLB: DW (DSMB/8)+1 ; ALLOCATION MAP FOR DRIVE B: 04FD 0008 RDBUF: DW BUFSZ ; ADDRESS OF READ DATA BUFFER 04FF WRTBUF: DS BUFSZ ; ADDRESS OF WRITE DATA BUFFER 0CFF 00 @EXTRA: DB 00 ; EXTRA BYTE ; 0D00 END