




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