Files
Digital-Research-Source-Code/CONTRIBUTIONS/cpm-handbook/cpmsrc/FIG5-19.ASM
Sepp J Morris 31738079c4 Upload
Digital Research
2020-11-06 18:50:37 +01:00

95 lines
2.3 KiB
NASM
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

; Figure 5-19
;
; PUTC
; This subroutine either puts the next chararacter out
; to a sequential file, writing out completed 'records'
; (128-byte sectors) or, if requested to, will fill the
; remainder of the current 'record' with 1AH's to indicate
; End of File to CP/M.
;
; Entry Parameters
;
; DE -> File Control Block
; B = 0, A = next data character to be output
; B /= 0, fill the current 'record' with 1AH's
;
; Exit Parameters
;
; None.
;
; Calling sequence
;
; LXI D,FCB
; MVI B,0 ;Not end of File
; LDA CHAR
; CALL PUTC
; ..or
; LXI D,FCB
; MVI B,1 ;Indicate end of file
; CALL PUTC
;
B$WRITESEQ EQU 21 ;Write Sequential
B$SETDMA EQU 26 ;Set DMA Address
BDOS EQU 5 ;BDOS Entry Point
;
PUTCBS EQU 128 ;Buffer Size
PUTCBF: DS PUTCBS ;Declare buffer
PUTCCC: DB 0 ;Char. count (initially 'empty')
;
PUTC:
PUSH D ;Save FCB Address
PUSH PSW ;Save data character
MOV A,B ;Check if end of file requested
ORA A
JNZ PUTCEF ;Yes
CALL PUTCGA ;No, get address of next free byte
;HL -> next free byte
;E = Current Char. count (as well as A)
POP PSW ;Recover data character
MOV M,A ;Save in buffer
MOV A,E ;Get current character count
INR A ;Update character count
CPI PUTCBS ;Check if buffer full
JZ PUTCWB ;Yes, write buffer
STA PUTCCC ;No, save updated count
POP D ;Dump FCB Address for return
RET
;
PUTCEF: ;End of file
POP PSW ;Dump data character
CALL PUTCGA ;HL -> next free byte
;A = Current character count
PUTCCE: ;Copy EOF character
CPI PUTCBS ;Check for end of buffer
JZ PUTCWB ;Yes, write out the buffer
MVI M,1AH ;No, store EOF in buffer
INR A ;Update count
INX H ;Update buffer pointer
JMP PUTCCE ;Continue until end of buffer
;
PUTCWB: ;Write buffer
XRA A ;Reset character count to 0
STA PUTCCC
LXI D,PUTCBF ;DE -> Buffer
MVI C,B$SETDMA ;Set DMA Address -> Buffer
CALL BDOS
POP D ;Recover FCB Address
MVI C,B$WRITESEQ ;Write Sequential Record
CALL BDOS
ORA A ;Check if error
JNZ PUTCX ;Yes if A = NZ
RET ;No, return to caller
;
PUTCX: ;Error exit
MVI A,0FFH ;Indicate such
RET
;
PUTCGA: ;Return with HL -> next free char.
;and A = current char. count
LDA PUTCCC ;Get current character count
MOV E,A ;Make word value in DE
MVI D,0
LXI H,PUTCBF ;HL -> Base of buffer
DAD D ;HL -> next free character
RET