DataMuseum.dk

Presents historical artifacts from the history of:

Christian Rovsing CR7, CR8 & CR16 CP/M

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about Christian Rovsing CR7, CR8 & CR16 CP/M

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - download

⟦086c510bc⟧ TextFile

    Length: 15360 (0x3c00)
    Types: TextFile
    Names: »MINIBIOS.ASM«

Derivation

└─⟦be0857eee⟧ Bits:30004395 CP/M-86 files - CR8 Dual floppy
    └─ ⟦this⟧ »MINIBIOS.ASM« 

TextFile

	TITLE 'MINI FLOPPY R/O BIOS FOR SYSTEM INSTALLATION DISK - NF/830629'
	PAGE 43
$*MACRO
;***************************************************************************

;DEFINE TRUE AND FALSE ASSEMBLY PARAMETERS
;
TRUE	EQU	-1		;DEFINE TRUE
FALSE	EQU	NOT TRUE	;DEFINE FALSE

;DEFINE MEMORY BASED I/O MODULE ENTRY POINTS
;
$-PRINT
;
MODBASE EQU	0F800H		;SET JUMP TABLE STARTING ADDRESS
;
INITSER EQU	MODBASE+00	;INITIALIZE MP-SQUARE HARDWARE
;				;(NO PARAMETERS)
SETCBAUD EQU	MODBASE+03	;SET CONSOLE I/O BAUD RATE FACTOR
;				;(HL) = COUNTER TIMER PARAMETER VALUE
SETLBAUD EQU	MODBASE+06	;SET LINE PRINTER I/O BAUD RATE FACTOR
;				;(HL) = COUNTER TIMER VALUE
SETLRMSK EQU	MODBASE+09	;SET LINE PRINTER SIO RECEIVER MASK VALUE
;				;(A) = LINE PRINTER SIO MASK BYTE
SETLRVAL EQU	MODBASE+012	;SET LINE PRINTER SIO RECEIVER POLL VALUE
;				;(A) = LINE PRINTER POLL VALUE
SETLTMSK EQU	MODBASE+015	;SET LINE PRINTER SIO TRANSMITTER MASK VALUE
;				;(A) = LINE PRINTER SIO MASK BYTE
SETLTVAL EQU	MODBASE+018	;SET LINE PRINTER SIO TRANSMITTER POLL VALUE
;				;(A) = LINE PRINTER SIO POLL VALUE BYTE
CONSTAT EQU	MODBASE+021	;GET CONSOLE STATUS
;				;RETURN (A)=00 FOR NOT READY INPUT
;				;	(A)=FF FOR READY INPUT
CONIN	EQU	MODBASE+024	;GO GET CONSOLE INPUT CHARACTER
;				;(A)=INPUT CONSOLE CHARACTER
CONOUT	EQU	MODBASE+027	;PUT OUT CONSOLE CHAR
;				;(C)=CHARACTER TO OUTPUT
LPTSTAT EQU	MODBASE+030	;GET LINE PRINTER STATUS
;				;RETURN (A)=00 FOR NOT NEXT OUTPUT
;				;	(A)=FF FOR READY OUTPUT
LPTIN	EQU	MODBASE+033	;GO GET LINE PRINTER INPUT CHARACTER
;				;(A)=INPUT LPT SERIAL PORT CHARACTER
LPTOUT	EQU	MODBASE+036	;PUT OUT LINE PRINTER CHARACTER
;				;(C)=LPT SERIAL OUTPUT CHARACTER
HUNIT	EQU	MODBASE+039	;SELECT HARD DISK UNIT NUMBER
;				;(C)=UNIT NUMBER ON MSC 9205 CONTROLLER
HPLAT	EQU	MODBASE+042	;SELECT HARD DISK PLATTER (HEAD) NUMBER 
;				;(C)=HEAD SELECT NUMBER
HSURF	EQU	MODBASE+045	;SELECT HARD DISK SURFACE(HEAD 2^2) NUMBER
;				;(C)=MSB OF HEAD NUMBER
HCYL	EQU	MODBASE+048	;SELECT HARD DISK CYLINDER NUMBER
;				;(BC)=CYLINDER NUMBER
HREC	EQU	MODBASE+051	;SELECT HARD DISK RECORD NUMBER
;				;(C)=RECORD NUMBER
HCNT	EQU	MODBASE+054	;SELECT HARD DISK SECTOR COUNT
;				;(C)=RECORD COUNT
HBADDR	EQU	MODBASE+057	;SET 9205 CONTROLLER DMA ADDRESS
;				;(BC)=16 BIT DATA BUFFER ADDRESS
HREST	EQU	MODBASE+060	;RESTORE SELECTED HARD DISK UNIT
;				;(A) RETURNS ERROR CODE
HREAD	EQU	MODBASE+063	;READ SELECTED SECTOR(S)
;				;(A) RETURNS ERROR CODE
HVERF	EQU	MODBASE+066	;VERIFY SELECTED SECTOR(S)
;				;(A) RETURNS ERROR CODE
HWRIT	EQU	MODBASE+069	;WRITE SELECTED SECTOR(S)
;				;(A) RETURNS ERROR CODE
HEXEC	EQU	MODBASE+072	;EXECUTE SPECIAL COMMAND OF MSC 9205
;				;(C) ENTRY WITH MSC 9205 COMMAND
;				;(A) RETURNS ERROR CODE
HRESET	EQU	MODBASE+075	;RESET HARD DISK CONTROLLER MSC 9205
;				;NO PARAMETERS
MUNIT	EQU	MODBASE+078	;SELECT MINI FLOPPY UNIT NUMBER
;				;(C)=FLOPPY PHYSICAL UNIT NUMBER
MSURF	EQU	MODBASE+081	;SELECT MINI FLOPPY SURFACE(HEAD) NUMBER
;				;(C)=FLOPPY SIDE NUMBER
MCYL	EQU	MODBASE+084	;SELECT MINI FLOPPY CYLINDER(TRACK) NUMBER
;				;(C)=FLOPPY TRACK NUMBER
MREC	EQU	MODBASE+087	;SELECT MINI FLOPPY RECORD NUMBER
;				;(C)=FLOPPY SECTOR NUMBER
MCNT	EQU	MODBASE+090	;SELECT MINI FLOPPY PHYSICAL SECTOR COUNT
;				;(C)=MINI FLOPPY SECTOR COUNT
MSIZE	EQU	MODBASE+093	;SELECT FLOPPY SECTOR SIZE (00)=256 BYTES
;				;(BC)=MINI FLOPPY TRACK NUMBER
MBADDR	EQU	MODBASE+096	;SET FLOPPY DISK DATA BUFFER ADDRESS
;				;(BC)=FLOPPY BUFFER ADDRESS
MREST	EQU	MODBASE+099	;RESTORE SELECTED MINI FLOPPY UNIT
;				;(A)=RETURNS ERROR STATUS
MVERF	EQU	MODBASE+102	;VERIFY (READ) SELECTED SECTOR
;				;(A)=RETURNS STATUS
MWRIT	EQU	MODBASE+105	;WRITE SELECTED SECTOR
;				;(A)=RETURNED STATUS
MREAD	EQU	MODBASE+108	;READ SELECTED SECTOR
;				;(A)=RETURNED STATUS
MWTRK	EQU	MODBASE+111	;WRITE SELECTED FLOPPY TRACK
;				;(A)=RETURNED STATUS
MMODE	EQU	MODBASE+114	;SET FLOPPY OPERATION MODE
;				;(C)=STANDARD MODE DEFINITION
MINST	EQU	MODBASE+117	;FETCH CURRENT INSTRUCTION CODE
;				;(A)=RETURNED INSTRUCTION PATTERN
MMOFF	EQU	MODBASE+120	;CHECK MINI FLOPPY MOTOR ON COUNT
;				;OUT TIMER
;
	MACLIB	Z80
	MACLIB	DISKDEF
$+PRINT

;ASCII CHARACTER DEFINITIONS
;
BS	EQU	008H		;ASCII BACK SPACE CHARACTER
LF	EQU	00AH		;ASCII LINE FEED CHARACTER
CR	EQU	00DH		;ASCII CARRIAGE RETURN CHARACTER
ESC	EQU	01BH		;ASCII ESCAPE CHARACTER
RUBOUT	EQU	07FH		;ASCII RUBOUT CHARACTER


;SECTOR DEBLOCKING ALGORITHMS
;
SMASK	MACRO	HBLK		;UTILITY MACRO TO COMPUTE SECTOR MASK
;
;	COMPUTE LOG2(HBLK), RETURN @X AS RESULT
;	(2 ** @X = HBLK ON RETURN)
;
@Y	SET	HBLK
@X	SET	0
;
;	COUNT RIGHT SHIFTS OF @Y UNTIL = 1
;
	REPT	8
	IF	@Y = 1
	EXITM
	ENDIF
;
;	@Y IS NOT 1, SHIFT RIGHT ONE POSITION
;
@Y	SET	@Y SHR 1
@X	SET	@X + 1
	ENDM
	ENDM

; HOST DISK CONSTANTS
;
HSTSIZ	EQU	512		;HOST DISK SECTOR SIZE
HSTBLK	EQU	HSTSIZ/128	;CP/M SECTS/HOST BUFF
SECMSK	EQU	HSTBLK-1	;SECTOR MASK
	SMASK	HSTBLK		;COMPUTE SECTOR MASK
SECSHF	EQU	@X		;LOG2(HSTBLK)

;HOST BUFFER DECLARATION
;PLACED IN THE AREA F600H-F7FFH SINCE THIS CANNOT BE LOADED FROM FLOPPY ANYWAY
;
HSTBUF	EQU	0F600H	;HOST BUFFER

	PAGE
;*******I/O JUMP VECTOR*******************************************************
;THIS IS WHERE XBDOS CALLS WHEN IT NEEDS TO DO ANY INPUT/OUTPUT OPERATION.
;
	ORG	0E600H

	JMP	DUMRET		;FROM COLD START LOADER 
	JMP	DUMRET		;FROM WARM BOOT 
	JMP	CONSTAT		;CHECK CONSOLE KB STATUS 
	JMP	CONIN		;READ CONSOLE CHARACTER 
	JMP	CONOUT		;WRITE CONSOLE CHARACTER 
	JMP	DUMRET		;WRITE LISTING CHAR 
	JMP	DUMRET		;WRITE PUNCH CHAR 
	JMP	DUMRET		;READ READER CHAR 
	JMP	HOME		;MOVE DISK TO TRACK ZERO 
	JMP	SELDSK		;SELECT DISK DRIVE 
	JMP	SETTRK		;SEEK TO TRACK IN REG A 
	JMP	SETSEC		;SET SECTOR NUMBER 
	JMP	SETDMA		;SET DISK STARTING ADR 
	JMP	READ		;READ SELECTED SECTOR
	JMP	DUMRET		;WRITE SELECTED
	JMP	DUMRET		;RETURN LIST STATUS
	JMP	SECTRAN		;SECTOR TRANSLATE

	PAGE
;PARAMETER TABLE FOR ONE TANDON 5 1/4 DOUBLE DENSITY 
;DOUBLE SIDED 96 TRACKS PER INCH MINI FLOPPY DRIVE
;
	DISKS	1			;ONE MINI DRIVE SUPPORTED
	DISKDEF	0,1,32,,2048,304,128,128,2	;A: MINI DRIVE


;SELECT UNIT NUMBER ACCORDING TO REGISTER C 
;
;  WHERE: 00 = MINI DRIVE 0 (DISK A:)
;;;	  01 = MINI DRIVE 1 (DISK B:)
;
SELDSK:	MOV	A,C		;GET NEW UNIT NUMBER
	LXI	H,0		;RETURN 0000 IN H&L REGS., IF ERROR
	CPI	1		;IS SELECT MORE THAN MAX TABLE ENTRY
	RNC			;RETURN WITH ERROR, IF NOT VALID TABLE ENTRY

	STA	SEKDSK		;SET SEKDSK TO CP/M UNIT SELECT CODE
	MOV	L,C
	MVI	H,0
	REPT	4		;SHIFT LEFT 4  (*16)
	DAD	H
	ENDM
	LXI	D,DPBASE	;D&E REGS. = DISK PARAMETER BASE
	DAD	D		;H&L REGS. = BIAS OFFSET INTO TABLE
	XRA	A		;SET A REG. = 00

DUMRET:	RET			;RETURN FROM SELDSK (AND DUMY RETURN)

	PAGE
;VALID DISK DRIVE SELECT TABLES
;
;TABLE ENTRIES CONTAIN VALUES FOR VARIOUS DISK CONFIGURATIONS
;AND ALLOW QUICK INDEXING TO THE DRIVE SELECT CODE PARAMETERS.
;EACH ENTRY CONSISTS OF:
; FIRST BYTE:	LEGAL/ILLEGAL 0=ILLEGAL, 0FFH=LEGAL
; SECOND BYTE:	PHYSICAL UNIT SELECT CODE 00 TO 03
; THIRD BYTE:	MINI/HARD FLAG 0=HARD UNIT, 0FFH=MINI FLOPPY
;		(NOT USED IN MINI ONLY BIOS)
; FOURTH BYTE:	DISK PARAMETER TABLE INDEX (FROM DISKDEF)
;
DSTAB:	DB	0FFH,000H,000H,000H	;MINI FLOPPY DISK UNIT 0


;SUBROUTINE TO GET THE PHYSICAL DRIVE NUMBER OUT OF THE DRIVE
;SELECT PARAMETER TABLE INTO (A)
;
GETDRNO:
	LDA	HSTDSK		;GET UNIT CP/M THINKS WE HAVE
	ADD	A
	ADD	A		;SETUP INDEX INTO FOUR BYTE TABLE ENTRIES
	MOV	C,A
	MVI	B,0
	LXI	H,DSTAB+1	;BASE ADDRESS FOR ENTRIES OF PHYSICAL
				;DRIVE ADDRESS TRANSLATION
	DAD	B
	MOV	C,M		;GET PHYSICAL NUMBER INTO (A)
	RET

	PAGE
;MOVE DISK TO TRACK ZERO 
;
HOME:	LDA	HSTWRT		;CHECK FOR PENDING WRITE
	ORA	A
	JRNZ	HOMEIT
	STA	HSTACT		;CLEAR HOST ACTIVE FLAG
HOMEIT:
	LXI	H,0000H		;ITS LIKE WE ARE GOING TO TRACK 0
	SHLD	SEKTRK

	LDA	SEKDSK		;MUST TRANSFER SELECTED DISK TO "HSTDSK"
	STA	HSTDSK		;FOR THE FLOPPY RESTORE ROUTINE
	CALL	GETDRNO		;GET PHYSICAL DRIVE NUMBER
	CALL	MUNIT
	CALL	MREST		;GO RESTORE THAT MINI FLOPPY
	ORA	A
	JRNZ	HOMEERR
HOMEOK:
	XRA	A
	STA	ERFLAG		;RESET ERROR FLAG
	RET			;RETURN FROM HOME, IF O.K. 

HOMEERR:
	CALL	EREXIT		;PRINT BIOS ERROR MESSAGE
	MVI	A,01H		;SET ERROR FLAG
	STA	ERFLAG
	RET

;SET TRACK NUMBER SPECIFIED BY B&C REGS.
;
SETTRK:	MOV	H,B
	MOV	L,C
	SHLD	SEKTRK		;TRACK TO SEEK
	RET

	PAGE
;TRANSLATE THE SECTOR GIVEN BY B&C REGS.
;
;NO TRANSLATE DONE AT THIS TIME. WE WILL TRANSLATE THE 
;MINI FLOPPY AT THE PHYSICAL SECTOR BASIS IN THE MINI 
;FLOPPY READ/WRITE SETUP ROUTINE.
;
SECTRAN:
	MOV	H,B
	MOV	L,C
	RET			;RETURN FROM SECTRAN

;SET DISK SECTOR NUMBER 
;
SETSEC:	MOV	A,C		;GET SECTOR NUMBER
	STA	SEKSEC		;SECTOR TO SEEK
	RET			;RETURN FROM SETSEC

;SET DISK DMA ADDRESS 
;
SETDMA:	MOV	H,B		;MOVE B&C TO H&L
	MOV	L,C
	SHLD	DMAADR		;PUT AT DMA ADR ADDRESS
	RET			;RETURN FROM SETDMA

	PAGE
;READ THE SELECTED CP/M 2.2 SECTOR
;
READ:	XRA	A		;CLEAR UNALLOCATED COUNT
	STA	UNACNT
	STA	ERFLAG		;NO ERRORS (YET)

	LDA	SEKSEC		;COMPUTE HOST SECTOR
	REPT	SECSHF
	ORA	A		;CARRY = 0
	RAR			;SHIFT RIGHT
	ENDM

;OUR DISK CONTROLLER NUMBERS ITS RECORDS FROM 1 AND NOT ZERO
;SO FIXUP THE "SEKHST" SECTOR NUMBER
;
	INR	A
	STA	SEKHST		;HOST SECTOR TO SEEK

;ACTIVE HOST SECTOR?
;
	LXI	H,HSTACT	;HOST ACTIVE FLAG
	MOV	A,M
	MVI	M,1		;ALWAYS BECOMES 1
	ORA	A		;WAS IT ALREADY?
	JRZ	FILHST		;FILL HOST IF NOT

;HOST BUFFER ACTIVE, SAME AS SEEK BUFFER?
;
	LDA	SEKDSK
	LXI	H,HSTDSK	;SAME DISK?
	CMP	M		;SEKDSK = HSTDSK?
	JRNZ	NOMATCH

;SAME DISK, SAME TRACK?
;
	LXI	H,HSTTRK
	CALL	SEKTRKCMP	;SEKTRK = HSTTRK?
	JRNZ	NOMATCH

;SAME DISK, SAME TRACK, SAME BUFFER?
;
	LDA	SEKHST
	LXI	H,HSTSEC	;SEKHST = HSTSEC?
	CMP	M
	JRZ	MATCH		;SKIP IF MATCH

;PROPER DISK, BUT NOT CORRECT SECTOR
;
NOMATCH:

;MAY HAVE TO FILL THE HOST BUFFER
;
FILHST:	LDA	SEKDSK
	STA	HSTDSK
	LHLD	SEKTRK
	SHLD	HSTTRK
	LDA	SEKHST
	STA	HSTSEC

	CALL	READHST
	XRA	A		;0 TO A REG.
	STA	HSTWRT		;NO PENDING WRITE

	LDA	ERFLAG		;CHECK ERRORS ON PRE-READ
	ORA	A
	RNZ			;BACK TO BDOS IF ERROR

	PAGE
;COPY DATA TO OR FROM BUFFER
;
MATCH:	LDA	SEKSEC		;MASK BUFFER NUMBER
	ANI	SECMSK		;LEAST SIGNIF BITS
	MOV	L,A		;READY TO SHIFT
	MVI	H,0		;DOUBLE COUNT
	REPT	7		;SHIFT LEFT 7
	DAD	H
	ENDM
;HL HAS RELATIVE HOST BUFFER ADDRESS
;
	LXI	D,HSTBUF
	DAD	D		;HL = HOST ADDRESS
	XCHG			;NOW IN DE
	LHLD	DMAADR		;GET/PUT CP/M DATA

;DE IS SOURCE, HL IS DESTINATION
;
	XCHG			;SWITCH FOR 'LDIR'
	LXI	B,128		;COUNT   -    -
	LDIR			;MOVE DATA
	LDA	ERFLAG
	RET			;DATA HAS BEEN MOVED FROM HOST BUFFER

;UTILITY SUBROUTINE FOR 16-BIT COMPARE
;
SEKTRKCMP:			;HL = .UNATRK OR .HSTTRK, COMPARE WITH SEKTRK
	XCHG
	LXI	H,SEKTRK
	LDAX	D		;LOW BYTE COMPARE
	CMP	M		;SAME?
	RNZ			;RETURN IF NOT

;LOW BYTES EQUAL, TEST HIGH FIRST
;
	INX	D
	INX	H
	LDAX	D
	CMP	M		;SETS FLAGS
	RET

;*****************************************************************************
;PERFORM THE PHYSICAL READ FROM THE HOST DISK
;
READHST:	;FALL THROUGH TO 'READSEC'

;HSTDSK = HOST DISK NUMBER, HSTTRK = HOST TRACK NUMBER,
;HSTSEC = HOST SECT NUMBER. READ "HSTSIZ" BYTES
;INTO HSTBUF AND RETURN ERROR FLAG IN ERFLAG.
;
READSEC:
	CALL	MIOPB		;SETUP MINI FLOPPY IOPB
	CALL	MREAD		;GO READ THAT SECTOR
	ORA	A
	JRNZ	RDERR		;EXIT FOR READ ERROR
RDOK:	XRA	A
	STA	ERFLAG
	RET

RDERR:	CALL	EREXIT		;PRINT BIOS ERROR MESSAGE
	MVI	A,01H		;SET ERROR FLAG
	STA	ERFLAG
	RET

	PAGE
;READ/WRITE BIOS ERROR PRINT ROUTINE
;WAITS FOR USER RESPONSE ON CONSOLE AFTER PRINTING MESSAGE
;AND THEN RETURNS TO THE CALLER
;
EREXIT:	STA	IOERR		;SAVE ERROR STATUS
	LXI	H,ERRMSF	;USE MINI FLOPPY ERROR MESSAGE 
	CALL	PRTMSG
	LDA	IOERR		;PRINT ERROR CODE
	PUSH	PSW
	RRC
	RRC
	RRC
	RRC
	CALL	HEXOUT
	POP	PSW
	CALL	HEXOUT
	LXI	H,ERRMS2	;PRINT REST OF MESSAGE
	CALL	PRTMSG
	LDA	HSTDSK		;PRINT CP/M DRIVE DESIGNATOR WITH ERROR
	ADI	'A'
	MOV	C,A
	CALL	CONOUT
	LXI	H,ERRMS3	;PRINT MESSAGE CLOSE
	CALL	PRTMSG
	RET			;BACK TO CP/M

	PAGE
;ERROR ROUTINE MESSAGES
;
ERRMSF:	DB	CR,LF,CR,LF,' *** MINI FLOPPY DISK I/O ERROR - CODE(',0
ERRMS2:	DB	') - DRIVE ',0
ERRMS3:	DB	': ***  ',CR,LF,0

;SUBROUTINE TO SEND A HEX CHAR TO THE CONSOLE
;
HEXOUT:	ANI	0FH		;LOW NIBBLE ONLY
	CPI	0AH		;GREATER THAN 9?
	JM	HEX1
	ADI	07H		;ADD OFFSET FOR A-F
HEX1:	ADI	030H		;ADD IN ASCII OFFSET
	MOV	C,A		;PRINT RESULT
	CALL	CONOUT
	RET

	PAGE
;**************************************************************************
;MINI FLOPPY I/O PARAMETER BLOCK SET UP ROUTINE
;
MIOPB:	CALL	GETDRNO		;GET PHYSICAL DRIVE NUMBER FROM
	CALL	MUNIT		;..FROM DRIVE SELECT TABLE
	LDA	HSTTRK		;GET AND SET TRACK NUMBER
	PUSH	PSW
	ANI	01H		;FIND OUT WHAT THE SIDE NUMBER IS
	MOV	C,A
	CALL	MSURF		;SET MINI HEAD NUMBER
	POP	PSW
	ORA	A
	RAR			;DIVIDE TRACK BY 2
	MOV	C,A		;SEND PHYSICAL TRACK TO IOPB
	CALL	MCYL

	LXI	B,00H		;SET SIZE CODE TO 256 BYTES
	CALL	MSIZE
	MVI	C,02H		;SET SECTOR COUNT TO 2
	CALL	MCNT

	LDA	HSTSEC		;CONVERT SECTOR NUMBER TO PROPER SKEW
	ORA	A		;CONVERT TO PAIRED ODD BASED
	RAL
	DCR	A
	DCR	A		;NOW ZERO BASED FOR INDEXING
	MVI	B,00H
	MOV	C,A		;DOUBLE BYTE INDEX WORD
	LXI	H,MFSTRAN	;TRANSLATE TABLE BASE ADDRESS
	DAD	B
	MOV	C,M
	CALL	MREC		;SET ACTUAL SECTOR TO START READ UPON
	LXI	B,HSTBUF	;SET FLOPPY BUFFER ADDRESS
	CALL	MBADDR
	RET

	PAGE
;MINI FLOPPY PHYSICAL SECTOR TRANSLATE TABLE
;
MFSTRAN:
	DB	1,2,5,6,9,10,13,14,3,4,7,8,11,12,15,16
				;NOTE THAT ONLY ODD SECTORS ALLOWED

;*************************************************************************
;PRINT THE MESSAGE AT H&L UNTIL A ZERO 
;
PRTMSG:	MOV	A,M		;GET CHARACTER TO PRINT
	ORA	A		;SET FLAGS
	RZ			;RETURN, IF END OF STRING FLAG
	MOV	C,A		;CHARACTER IN C REG., FOR CONSOLE OUTPUT
	PUSH	H		;SAVE OUT POINTER
	CALL	CONOUT		;PRINT CHARACTER, CONSOLE OUTPUT
	POP	H		;GET BACK MESSAGE POINTER
	INX	H		;BUMP MESSAGE POINTER
	JR	PRTMSG

	PAGE
;****************************************************************************
;STORAGE AREA FOR VARIABLES BEGINS HERE...
;
;THE NEXT SEVERAL BYTES ARE INITIALIZED TO ZERO FOLLOWING BOOT LOAD
;SINCE THEY ARE DECLARED WITH 'DB'
;
IOERR:	DB	0		;DISK I/O ERROR TYPE

;HOST DISK BLOCKING/DE-BLOCKING DATA AREA
;
TEMPDSK:	
	DB	0		;TEMPORARY STORAGE FOR LOGGED DISK

SEKDSK:	DB	0		;SEEK DISK NUMBER
SEKTRK:	DB	0,0		;SEEK TRACK NUMBER
SEKSEC:	DB	0		;SEEK SECTOR NUMBER

HSTDSK:	DB	0		;HOST DISK NUMBER
HSTTRK:	DB	0,0		;HOST TRACK NUMBER
HSTSEC:	DB	0		;HOST SECTOR NUMBER

SEKHST:	DB	0		;SEEK SHR SECSHF
HSTACT:	DB	0		;HOST ACTIVE FLAG
HSTWRT:	DB	0

UNACNT:	DB	0		;UNALLOCATED RECORD COUNT
UNADSK:	DB	0		;LAST UNALLOCATED DISK
UNATRK:	DB	0,0		;LAST UNALLOCATED TRACK
UNASEC:	DB	0		;LAST UNALLOCATED SECTOR

ERFLAG:	DB	0		;ERROR REPORTING
DMAADR:	DB	0,0		;DISK DMA TRANSFER ADDRESS

	PAGE
;*****************************************************************************
;SCRATCH RAM AREA FOR BDOS USE (ORIGINALLY LAYED OUT BY 'ENDEF')
;
DIRSIZ	EQU	128
ALVSIZ	EQU	38
CSVSIZ	EQU	32

DIRBUF	EQU	$		;DIRECTORY ACCESS BUFFER
ALV0	EQU	DIRBUF+DIRSIZ
CSV0	EQU	ALV0  +ALVSIZ
FORCE	DB	0		;FORCE END FOR HEX FILE

	END
;
;...+++END OF FILE

«eof»