CROWE Z80 ASSEMBLER V1.1 PAGE 1 ;******************************************************** 0000 ;* * 0000 ;* -- CUSTOM BIOS FOR CP/M VERSION 2.2 -- * 0000 ;* * 0000 ;* Russell Smith 7-October-1980 * 0000 ;* Modified 6/16/82 by Robert Edison for TM-848 * 0000 ;******************************************************** 0000 ; 0000 ; 0000 MSIZE EQU 60 ;MEMORY CAPACITY IN KBYTES 003C MONITR EQU 0F000H ;BASE OF SYSTEM MONITOR F000 ; 0000 ; MONITOR ENTRY POINTS FOR MODIFIED CBIOS 0000 ; 0000 HOMER EQU 0F6E9H F6E9 READR EQU 0F72AH F72A WRITR EQU 0F71FH F71F SEEKR EQU 0F6FBH F6FB PAUSE EQU 0F7A8H F7A8 FORCE EQU 0F7AEH F7AE TURN1 EQU 0F7C9H F7C9 SEL2R EQU 0F6CBH F6CB SEL1R EQU 0F6C5H F6C5 ; 0000 ; OTHER STUFF FROM MONITOR 0000 ; 0000 BITDAT EQU 1CH 001C MOTOR EQU 0FF6CH FF6C ; 0000 ; CPM REFERENCE CONSTANTS 0000 ; 0000 BIAS EQU .RES.((MSIZE-20)*1024)-200H 9E00 CCP EQU .RES.3400H+BIAS D200 BDOS EQU .RES.CCP+806H DA06 CBIOS EQU .RES.CCP+1600H E800 0000 0000 ; 0000 ; 0000 ; 0000 ORG CBIOS E800 ; E800 JP BOOT ;STANDARD JUMP TABLE TO E800 C333E8 BVECTR: JP WBOOT ;THE SUBROUTINES OF CBIOS E803 C33FE8 SVECTR: JP CONST E806 C3D0E8 IVECTR: JP CONIN E809 C3D3E8 OVECTR: JP CONOUT E80C C3D6E8 JP OPNPRT ;LIST DEVICE VECTOR E80F C3DAE8 JP CONOUT ;PUNCH DEVICE VECTOR E812 C3D6E8 JP CONIN ;READER DEVICE VECTOR E815 C3D3E8 JP HOME E818 C3ECE9 JP SELECT E81B C38AE9 JP SEEK E81E C3FCE9 JP SETSEC E821 C37AE9 JP SETPTR E824 C385E9 JP READ E827 C318EA JP WRITE E82A C32FEA CROWE Z80 ASSEMBLER V1.1 PAGE 2 JP CONST ;LIST DEVICE STATUS VECTOR E82D C3D0E8 JP TRANS E830 C37FE9 ; E833 ; E833 ; E833 BOOT: XOR A E833 AF LD (0003H),A ;RESET IOBYTE TO ZEROS E834 320300 LD HL,SIGNON E837 2162EB CALL PMSG ;PRINT SIGNON MESSAGE E83A CDB3EA JR GOCPM E83D 1836 ; E83F ; E83F WBOOT: LD SP,STACK E83F 319EEB LD C,0 E842 0E00 CALL SELECT ;SELECT UNIT 0 E844 CD8AE9 CALL HOME ;SEEK TRACK ZERO E847 CDECE9 LD HL,.RES.3400H+BIAS E84A 2100D2 LD BC,0D02H E84D 01020D CALL RDLOOP ;READ EVEN SECTORS ON TRK 0 E850 CD9DE8 LD HL,.RES.3480H+BIAS E853 2180D2 LD BC,0C03H E856 01030C CALL RDLOOP ;READ ODD SECTORS ON TRK 0 E859 CD9DE8 LD C,1 E85C 0E01 CALL SEEK ;SEEK TO TRACK 1 E85E CDFCE9 JR NZ,BOMB E861 2050 LD HL,.RES.4080H+BIAS E863 2180DE LD BC,0A01H E866 01010A CALL RDLOOP ;READ ODD SECTORS ON TRK 1 E869 CD9DE8 LD HL,.RES.4100H+BIAS E86C 2100DF LD BC,0902H E86F 010209 CALL RDLOOP ;READ EVEN SECTORS ON TRK 1 E872 CD9DE8 GOCPM: LD A,0C3H ;STORE JUMP VECTORS IN RAM E875 3EC3 LD (00H),A E877 320000 LD HL,CBIOS+3 ;JUMP TO CBIOS WARM BOOT AT 00H E87A 2103E8 LD (01H),HL E87D 220100 LD (05H),A E880 320500 LD HL,BDOS ;JUMP TO BDOS GOES AT 05H E883 2106DA LD (06H),HL E886 220600 LD (38H),A E889 323800 LD HL,MONITR ;JUMP TO MONTR GOES AT 38H E88C 2100F0 LD (39H),HL E88F 223900 LD BC,0080H E892 018000 CALL SETPTR ;MAKE DISK BUFFER=0080H E895 CD85E9 LD C,0 E898 0E00 JP CCP E89A C300D2 ; E89D ; E89D RDLOOP: LD (POINTR),HL ;STORE ADDR. PASSED IN HL E89D 227BEB LD A,C E8A0 79 LD (SECTOR),A ;STORE SECT# PASSED IN C E8A1 327AEB PUSH HL E8A4 E5 PUSH BC E8A5 C5 CALL READ ;READ THE SPECIFIED SECTOR E8A6 CD18EA POP BC E8A9 C1 POP HL E8AA E1 JR NZ,BOMB E8AB 2006 INC H ;BUMP LOAD ADDRESS BY 256 E8AD 24 CROWE Z80 ASSEMBLER V1.1 PAGE 3 INC C E8AE 0C INC C ;BUMP SECTOR# BY 2 E8AF 0C DJNZ RDLOOP E8B0 10EB RET E8B2 C9 ; E8B3 ; E8B3 BOMB: LD HL,DEAD E8B3 21BCE8 CALL PMSG E8B6 CDB3EA LOOP: JP LOOP E8B9 C3B9E8 E8BC DEAD: DEFB CR E8BC 0D DEFB LF E8BD 0A DEFM 'cannot boot CP/M $' E8BE 63616E6E E8C2 6F742062 E8C6 6F6F7420 E8CA 43502F4D E8CE 2024 ; E8D0 ; E8D0 ; E8D0 CONST: JP MONITR+6 ;MONITOR CONSOLE STATUS RTN. E8D0 C306F0 ; E8D3 ; E8D3 CONIN: JP MONITR+9 ;MONITOR CONSOLE INPUT RTN. E8D3 C309F0 ; E8D6 ; E8D6 CONOUT: LD A,C E8D6 79 JP MONITR+12 ;MONITOR CONSOLE OUTPUT RTN. E8D7 C30CF0 ; E8DA ; E8DA OPNPRT: LD A,0FH ;PORT B=OUTPUT E8DA 3E0F OUT (0BH),A ;PIO/B CONTROL PORT E8DC D30B LD A,1CH ;INTERRUPT VECTOR B E8DE 3E1C OUT (0BH),A ;LOAD VECTOR REGISTER E8E0 D30B LD A,87H ;ENABLE INTERRUPTS E8E2 3E87 ; E8E4 PUSH HL E8E4 E5 LD HL,PIOINT ;GET INTERRUPT DEST ADDRESS E8E5 2107E9 LD (0FF1CH),HL ;STORE IT AT VECTOR E8E8 221CFF LD HL,PRTCHR ;OVERWRITE JP TO OPNPRT E8EB 21F7E8 LD (OVECTR+4),HL ;SINCE CP/M NOW GOES TO PRTCHR E8EE 2210E8 POP HL E8F1 E1 LD A,0FFH ;NON-ZERO TO A-REG E8F2 3EFF LD (INTPND),A ;INTERRUPT NOT PENDING E8F4 3206E9 ; E8F7 ; E8F7 PRTCHR: LD A,(INTPND) ;INTERRUPT PENDING? E8F7 3A06E9 OR A E8FA B7 JR Z,PRTCHR ;IF YES, WAIT TILL IT'S SERVICED E8FB 28FA XOR A ;ELSE ZERO FLAG E8FD AF LD (INTPND),A ;SET INTERRUPT PENDING AGAIN E8FE 3206E9 LD A,C ;GET CHARACTER TO PRINT E901 79 CPL ;INVERT DATA E902 2F OUT (0AH),A ;PRINT IT E903 D30A RET E905 C9 ; E906 INTPND DEFS 1 ;INTERRUPT PENDING FLAG E906 CROWE Z80 ASSEMBLER V1.1 PAGE 4 ; E907 PIOINT: PUSH AF ;INTERRUPT SERVICE ROUTINE E907 F5 LD A,0FFH ;SET FLAG TO NON-ZERO VALUE E908 3EFF LD (INTPND),A E90A 3206E9 POP AF E90D F1 EI E90E FB RETI E90F ED4D ; E911 ;******************************************************** E911 ;* * E911 ;* DISK I/O SUBROUTINES FOR CP/M CBIOS * E911 ;* * E911 ;******************************************************** E911 ; E911 ; E911 ; SECTOR TRANSLATE TABLE FOR STANDARD E911 ; 1 IN 6 INTERLEAVE FACTOR E911 ; E911 SECTAB: DEFB 1 E911 01 DEFB 7 E912 07 DEFB 13 E913 0D DEFB 19 E914 13 DEFB 25 E915 19 DEFB 5 E916 05 DEFB 11 E917 0B DEFB 17 E918 11 DEFB 23 E919 17 DEFB 3 E91A 03 DEFB 9 E91B 09 DEFB 15 E91C 0F DEFB 21 E91D 15 DEFB 2 E91E 02 DEFB 8 E91F 08 DEFB 14 E920 0E DEFB 20 E921 14 DEFB 26 E922 1A DEFB 6 E923 06 DEFB 12 E924 0C DEFB 18 E925 12 DEFB 24 E926 18 DEFB 4 E927 04 DEFB 10 E928 0A DEFB 16 E929 10 DEFB 22 E92A 16 ; E92B ; E92B ; DISK PARAMETER BLOCK FOR STANDARD 8" FLOPPY E92B ; E92B DPBLK: DEFW 26 ;SECTORS PER TRACK E92B 1A00 DEFB 3 ;BLOCK SHIFT CONST. E92D 03 DEFB 7 ;BLOCK MASK CONST. E92E 07 DEFB 0 ;EXTENT MASK CONST. E92F 00 DEFW 242 ;MAX BLOCK# E930 F200 DEFW 63 ;MAX DIRECTORY ENTRY# E932 3F00 DEFB 11000000B ;ALLOCATION MASK MSB E934 C0 DEFB 00000000B ;' ' LSB E935 00 DEFW 16 ;CHECK SIZE E936 1000 CROWE Z80 ASSEMBLER V1.1 PAGE 5 DEFW 2 ;RESERVED TRACKS E938 0200 ; E93A ; E93A ; DISK PARAMETER HEADERS FOR A 4 DISK SYSTEM E93A ; E93A DPHTAB: DEFW SECTAB E93A 11E9 DEFW 0000H ;DPH FOR UNIT 0 E93C 0000 DEFW 0000H E93E 0000 DEFW 0000H E940 0000 DEFW DIRBUF E942 9FEB DEFW DPBLK E944 2BE9 DEFW CHK0 E946 3FEC DEFW ALL0 E948 1FEC E94A DEFW SECTAB E94A 11E9 DEFW 0000H ;DPH FOR UNIT 1 E94C 0000 DEFW 0000H E94E 0000 DEFW 0000H E950 0000 DEFW DIRBUF E952 9FEB DEFW DPBLK E954 2BE9 DEFW CHK1 E956 6FEC DEFW ALL1 E958 4FEC E95A DEFW SECTAB E95A 11E9 DEFW 0000H ;DPH FOR UNIT 2 E95C 0000 DEFW 0000H E95E 0000 DEFW 0000H E960 0000 DEFW DIRBUF E962 9FEB DEFW DPBLK E964 2BE9 DEFW CHK2 E966 9FEC DEFW ALL2 E968 7FEC E96A DEFW SECTAB E96A 11E9 DEFW 0000H ;DPH FOR UNIT 3 E96C 0000 DEFW 0000H E96E 0000 DEFW 0000H E970 0000 DEFW DIRBUF E972 9FEB DEFW DPBLK E974 2BE9 DEFW CHK3 E976 CFEC DEFW ALL3 E978 AFEC ; E97A ; E97A ; E97A ; E97A SETSEC: LD A,C E97A 79 LD (SECTOR),A ;STORE SECTOR NUMBER PASSED E97B 327AEB RET ; VIA BC E97E C9 ; E97F ; E97F TRANS: EX DE,HL ;ADD TRANSLATION TABLE ADDRESS E97F EB ADD HL,BC ; PASSED IN DE TO SECTOR# IN BC E980 09 LD L,(HL) E981 6E LD H,0 ;LOOKUP PHYSICAL SECTOR NUMBER E982 2600 RET ; AND RETURN IT IN HL E984 C9 ; E985 ; E985 SETPTR: LD (POINTR),BC ;STORE DATA POINTER PASSED E985 ED437BEB CROWE Z80 ASSEMBLER V1.1 PAGE 6 RET ; VIA BC E989 C9 ; E98A ; E98A ; E98A SELECT: LD HL,0 ;PREP TO CHECK FOR MAX UNIT# E98A 210000 LD A,C E98D 79 CP 4 E98E FE04 RET NC ;RETURN WITH HL=0 IF C > 3 E990 D0 LD (UNIT),A ;STORE C AS NEW DRIVE UNIT# E991 3278EB LD L,A E994 6F ADD HL,HL E995 29 ADD HL,HL E996 29 ADD HL,HL E997 29 ADD HL,HL ;MULTIPLY UNIT# BY 16 E998 29 LD DE,DPHTAB E999 113AE9 ADD HL,DE ;ADD START ADDRESS OF DHP BLOCK E99C 19 PUSH HL E99D E5 LD C,A ;LOAD C WITH DISK DRIVE NUMBER E99E 4F LD B,0 ;LOAD B WITH SEEK SPEED FOR THIS DRIVE E99F 0600 IN A,(BITDAT) ;GET CURRENT DRIVE SELECTED E9A1 DB1C LD B,A E9A3 47 AND 0F8H ;MASK OFF THE DRIVE NUMBER E9A4 E6F8 OR C ;INSERT THE NEW DRIVE TO BE SELECTED E9A6 B1 OUT (BITDAT),A ;SELECT THE DRIVE E9A7 D31C CALL MOTRON ;TURN ON THE DISK SPINDLE MOTOR E9A9 CDCAE9 JP Z,SELDRV ;IF DRIVE BECOMES READY CONTINUE E9AC CAC3E9 POP HL E9AF E1 LD A,80H ;ELSE REPORT SELECT ERROR E9B0 3E80 SEL1: LD C,1 E9B2 0E01 CALL REPORT E9B4 CD46EA JR NZ,SEL2 ;JUMP IF COMMAND ABORT INDICATED E9B7 2006 LD A,(UNIT) ;ELSE TRY TO SELECT THE DRIVE AGAIN E9B9 3A78EB LD C,A E9BC 4F JR SELECT E9BD 18CB E9BF SEL2: LD HL,0 ;DISABLE FURTHER BIOS CALLS BY E9BF 210000 RET ; INDICATING SELECT ERROR TO BDOS E9C2 C9 ; E9C3 ; E9C3 SELDRV: CALL SEL2R ;CONTINUE SELECT ROUTINE IN MONITOR E9C3 CDCBF6 POP HL E9C6 E1 RET Z ;EXIT IF EVERYTHING IS OK E9C7 C8 JR SEL1 ;ELSE ATTEMPT TO RE-SELECT E9C8 18E8 ; E9CA ; E9CA MOTRON: LD A,5 ;SET UP TIMER FOR 5 SECONDS E9CA 3E05 LD (MOTOR),A E9CC 326CFF CALL PAUSE ;WAIT A WHILE BEFORE ISSUING DISK COMMAND E9CF CDA8F7 CALL FORCE ;GET DRIVE STATUS E9D2 CDAEF7 RET Z ;RETURN IF READY E9D5 C8 CALL TURN1 ;ELSE WAIT UNTIL IT DOES OR ABOUT 3 SEC. E9D6 CDC9F7 CALL FORCE ;GET STATUS AGAIN: Z=1 IF READY E9D9 CDAEF7 RET E9DC C9 E9DD ; E9DD READY: LD A,(UNIT) ;GET CURRENT DRIVE NUMBER E9DD 3A78EB LD C,A E9E0 4F CROWE Z80 ASSEMBLER V1.1 PAGE 7 IN A,(BITDAT) ;READ DRIVE SELECT MUX E9E1 DB1C AND 0F8H ;MASK OFF DRIVE NUMBER E9E3 E6F8 OR C ;INSERT CURRENT DRIVE NUMBER E9E5 B1 OUT (BITDAT),A ;RESELECT DRIVE-ALSO STARTS SPINDLE MOTOR E9E6 D31C CALL MOTRON ;SET UP TIMER AND WAIT TILL DRIVE IS READY E9E8 CDCAE9 RET E9EB C9 ; E9EC ; E9EC HOME: CALL READY ;MAKE SURE DRIVE IS SPINNING E9EC CDDDE9 RET NZ ;IF NOT THEN DON'T CONTINUE E9EF C0 CALL HOMER+4 ;CALL HOME ROUTINE IN MONITOR E9F0 CDEDF6 RET Z ;RETURN IF ALL WENT WELL E9F3 C8 LD C,2 E9F4 0E02 CALL REPORT E9F6 CD46EA JR Z,HOME ;RE-TRY HOME IF ERROR INDICATED E9F9 28F1 RET E9FB C9 ; E9FC ; E9FC SEEK: LD A,C ;GET TRACK # FROM C E9FC 79 LD (TRACK),A ;SAVE TRACK NUMBER E9FD 3279EB CALL READY ;RESELECT DRIVE AND WAIT TILL READY EA00 CDDDE9 RET NZ ;EXIT IF IT DOESN'T BECOME READY EA03 C0 LD A,(TRACK) ;GET TRACK TO SEEK EA04 3A79EB LD C,A EA07 4F CALL SEEKR+4 ;CALL SEEK ROUTINE IN MONITOR EA08 CDFFF6 RET Z ;EXIT IF NO ERRORS INDICATED EA0B C8 LD C,2 EA0C 0E02 CALL REPORT ;REPORT SEEK ERROR TO CONSOLE EA0E CD46EA RET NZ ;RETURN PERMANENT ERROR UNLESS EA11 C0 LD A,(TRACK) ; RE-TRY REQUEST IS INDICATED EA12 3A79EB LD C,A EA15 4F JR SEEK EA16 18E4 ; EA18 ; EA18 ; EA18 READ: CALL READY ;ATTEMPT TO GET DRIVE READY EA18 CDDDE9 RET NZ ;RETURN IF IT WON'T EA1B C0 LD HL,(POINTR) ;GET DISK BUFFER POINTER EA1C 2A7BEB LD A,(SECTOR) ;GET SECTOR TO READ EA1F 3A7AEB LD C,A EA22 4F CALL READR+4 ;CALL READ ROUTINE IN MONITOR EA23 CD2EF7 RET Z ;RETURN IF NO ERRORS EA26 C8 LD C,3 ;INDICATE READ ERROR TO HANDLER EA27 0E03 CALL REPORT ;REPORT DISK ERROR TO CONSOLE EA29 CD46EA JR Z,READ ;RE-TRY READ IF INDICATED EA2C 28EA RET EA2E C9 ; EA2F ; EA2F ; EA2F WRITE: CALL READY ;RE-SELECT DRIVE AND WAIT TILL READY EA2F CDDDE9 RET NZ ;DON'T CONTINUE IF IT'S NOT READY EA32 C0 LD HL,(POINTR) ;GET BUFFER POINTER EA33 2A7BEB LD A,(SECTOR) ; AND SECTOR TO WRITE EA36 3A7AEB LD C,A EA39 4F CALL WRITR+4 ;CALL WRITE ROUTINE IN MONITOR EA3A CD23F7 RET Z ;RETURN IF NO ERRORS EA3D C8 LD C,4 ;INDICATE WRITE ERROR TO HANDLER EA3E 0E04 CROWE Z80 ASSEMBLER V1.1 PAGE 8 CALL REPORT ;REPORT DISK ERROR TO CONSOLE EA40 CD46EA JR Z,WRITE ;RE-TRY WRITE IF INDICATED EA43 28EA RET ;ELSE RETURN PERMANENT ERROR EA45 C9 ; EA46 ; EA46 REPORT: LD (FLAGS),A ;STORE 1771 I/O STATUS FLAGS EA46 327CEB LD A,C EA49 79 LD (CLASS),A ;STORE COMMAND CLASS OF ERROR EA4A 327DEB LD HL,DSKMSG EA4D 21BEEA CALL PMSG ;PRINT OUT START OF MESSAGE EA50 CDB3EA DEC HL EA53 2B LD A,(CLASS) EA54 3A7DEB LD B,A EA57 47 REP1: CALL SKIP ;SKIP TO NEXT '$' IN STRING @ HL EA58 CDAAEA DJNZ REP1 EA5B 10FB CALL PMSG ;PRINT STRING NOW POINTED TO BY HL EA5D CDB3EA LD HL,ERRMSG EA60 21E1EA CALL PMSG ;PRINT 'error ' AFTER TYPE EA63 CDB3EA LD A,(FLAGS) EA66 3A7CEB RLA ;TEST FIRST FOR DRIVE-NOT-READY ERROR EA69 17 JR C,REP8 ; AND JUMP IF THAT IS THE PROBLEM EA6A 382F LD E,A ;GET REMAINING 1771 ERROR BITS INTO E EA6C 5F LD HL,RWERRS EA6D 2120EB LD A,(CLASS) EA70 3A7DEB CP 3 ;DETERMINE IF SELECT/SEEK OF R/W ERROR EA73 FE03 JR NC,REP2 EA75 3003 LD HL,SKERRS ;POINT HL TO PROPER SET OF MESSAGES EA77 21E9EA REP2: LD B,5 EA7A 0605 RES 0,D EA7C CB82 REP4: SLA E ;SHIFT OUT A 1771 STATUS REG BIT EA7E CB23 JR NC,REP5 EA80 300E LD C,',' EA82 0E2C BIT 0,D EA84 CB42 CALL NZ,OVECTR ;PRINT COMMA BETWEEN STRINGS IF D=1 EA86 C40CE8 CALL PMSG ;THEN PRINT ERROR MESSAGE @ HL EA89 CDB3EA SET 0,D ;FLAG THAT A STRING WAS PRINTED EA8C CBC2 JR REP6 EA8E 1805 EA90 REP5: CALL SKIP ;SKIP TO NEXT STRING @ HL EA90 CDAAEA RES 0,D ;FLAG THAT A STRING WAS SKIPPED EA93 CB82 REP6: DJNZ REP4 ;REPEAT FOR ALL 5 POSSIBLE ERRORS EA95 10E7 ; EA97 REP7: LD A,1 EA97 3E01 OR A ;RETURN PERM ERROR INDICATION IN A EA99 B7 RET EA9A C9 ; EA9B REP8: LD HL,RDYMSG EA9B 210EEB CALL PMSG ;PRINT DISK-NOT-READY MESSAGE EA9E CDB3EA CALL IVECTR ; AND WAIT FOR CONSOLE INPUT EAA1 CD09E8 CP 'C'-64 EAA4 FE03 JR Z,REP7 EAA6 28EF XOR A ;RETURN A=0 IF SOMETHING OTHER THAN EAA8 AF RET ; CONTROL-C WAS TYPED AT THE CONSOLE EAA9 C9 ; EAAA SKIP: PUSH BC ;SAVE BC EAAA C5 LD B,255 EAAB 06FF LD A,'$' EAAD 3E24 CROWE Z80 ASSEMBLER V1.1 PAGE 9 CPIR ;SCAN MEMORY LOOKING FOR '$' EAAF EDB1 POP BC EAB1 C1 RET EAB2 C9 ; EAB3 ; EAB3 ; EAB3 ; CHARACTER STRING OUTPUT ROUTINE. PRINTS ASCII DATA EAB3 ; POINTED TO BY HL UNTIL A DOLLAR SIGN IS ENCOUNTERED EAB3 EAB3 PMSG: LD A,(HL) ;HL POINTS TO ASCII STRING EAB3 7E CP '$' EAB4 FE24 INC HL EAB6 23 RET Z EAB7 C8 LD C,A ;PRINT CHARACTER IF NOT DOLLAR SIGN EAB8 4F CALL OVECTR EAB9 CD0CE8 JR PMSG EABC 18F5 ; EABE ; EABE LF EQU 0AH ;LINE FEED 000A CR EQU 0DH ;CARRIAGE RETURN 000D EABE DSKMSG: DEFB CR EABE 0D DEFB LF EABF 0A DEFM 'bios $' EAC0 62696F73 EAC4 2024 DEFM 'select $' EAC6 73656C65 EACA 63742024 DEFM 'seek $' EACE 7365656B EAD2 2024 DEFM 'read $' EAD4 72656164 EAD8 2024 DEFM 'write $' EADA 77726974 EADE 652024 EAE1 ERRMSG: DEFM 'error $' EAE1 6572726F EAE5 72202024 EAE9 SKERRS: DEFM '$' EAE9 24 DEFM '$' EAEA 24 DEFM 'cannot seek$' EAEB 63616E6E EAEF 6F742073 EAF3 65656B24 DEFM 'bad crc$' EAF7 62616420 EAFB 63726324 DEFM 'cannot restore$' EAFF 63616E6E EB03 6F742072 EB07 6573746F EB0B 726524 EB0E RDYMSG: DEFM 'drive not ready -$' EB0E 64726976 EB12 65206E6F EB16 74207265 EB1A 61647920 EB1E 2D24 EB20 RWERRS: DEFM 'write protected$' EB20 77726974 EB24 65207072 CROWE Z80 ASSEMBLER V1.1 PAGE 10 EB28 6F746563 EB2C 74656424 DEFM 'write fault$' EB30 77726974 EB34 65206661 EB38 756C7424 DEFM 'record not found$' EB3C 7265636F EB40 7264206E EB44 6F742066 EB48 6F756E64 EB4C 24 DEFM 'bad crc$' EB4D 62616420 EB51 63726324 DEFM 'data overrun$' EB55 64617461 EB59 206F7665 EB5D 7272756E EB61 24 EB62 SIGNON: DEFB CR EB62 0D DEFB LF EB63 0A DEFM '60k CP/M vers 2.2' EB64 36306B20 EB68 43502F4D EB6C 20766572 EB70 7320322E EB74 32 CRLF: DEFB CR EB75 0D DEFB LF EB76 0A DEFB '$' EB77 24 ; EB78 ; EB78 UNIT: DEFS 1 EB78 TRACK: DEFS 1 EB79 SECTOR: DEFS 1 EB7A POINTR: DEFS 1 EB7B FLAGS: DEFS 1 EB7C CLASS: DEFS 1 EB7D DEFS 32 EB7E STACK: DEFS 1 ;LOCAL STACK FOR WARM BOOT EB9E ; EB9F ;******************************************************** EB9F ;* * EB9F ;* DISK I/O BUFFERS FOR BDOS FILE HANDLER * EB9F ;* * EB9F ;******************************************************** EB9F ; EB9F ; EB9F ; EB9F DIRBUF: DEFS 128 ;SCRATCH DIRECTORY BUFFER EB9F ; EC1F ALL0: DEFS 32 ;UNIT 0 ALLOCATION BUFFER EC1F CHK0: DEFS 16 ;UNIT 0 CHECK VECTOR EC3F ALL1: DEFS 32 ;UNIT 1 ALLOCATION VECTOR EC4F CHK1: DEFS 16 ;UNIT 1 CHECK VECTOR EC6F ALL2: DEFS 32 ;UNIT 2 ALLOCATION VECTOR EC7F CHK2: DEFS 16 ;UNIT 2 CHECK VECTOR EC9F ALL3: DEFS 32 ;UNIT 3 ALLOCATION VECTOR ECAF CHK3: DEFS 16 ;UNIT 3 CHECK VECTOR ECCF ; ECDF CROWE Z80 ASSEMBLER V1.1 PAGE 11 ; ECDF ; ECDF ; ECDF ; ECDF END 0000 CROWE Z80 ASSEMBLER V1.1 PAGE 12 ALL0 EC1F ALL1 EC4F ALL2 EC7F ALL3 ECAF BDOS DA06 BIAS 9E00 BITDAT 001C BOMB E8B3 BOOT E833 BVECTR E803 CBIOS E800 CCP D200 CHK0 EC3F CHK1 EC6F CHK2 EC9F CHK3 ECCF CLASS EB7D CONIN E8D3 CONOUT E8D6 CONST E8D0 CR 000D CRLF EB75 DEAD E8BC DIRBUF EB9F DPBLK E92B DPHTAB E93A DSKMSG EABE ERRMSG EAE1 FLAGS EB7C FORCE F7AE GOCPM E875 HOME E9EC HOMER F6E9 INTPND E906 IVECTR E809 LF 000A LOOP E8B9 MONITR F000 MOTOR FF6C MOTRON E9CA MSIZE 003C OPNPRT E8DA OVECTR E80C PAUSE F7A8 PIOINT E907 PMSG EAB3 POINTR EB7B PRTCHR E8F7 RDLOOP E89D RDYMSG EB0E READ EA18 READR F72A READY E9DD REP1 EA58 REP2 EA7A REP4 EA7E REP5 EA90 REP6 EA95 REP7 EA97 REP8 EA9B REPORT EA46 RWERRS EB20 SECTAB E911 SECTOR EB7A SEEK E9FC SEEKR F6FB SEL1 E9B2 SEL1R F6C5 SEL2 E9BF SEL2R F6CB SELDRV E9C3 SELECT E98A SETPTR E985 SETSEC E97A SIGNON EB62 SKERRS EAE9 SKIP EAAA STACK EB9E SVECTR E806 TRACK EB79 TRANS E97F TURN1 F7C9 UNIT EB78 WBOOT E83F WRITE EA2F WRITR F71F  CONOUT E8D6 CONS