;
; PROGRAM: SYSTEST
; AUTHOR: Richard Conn
; PURPOSE: This program dumps the disk file specified by the user
; in hexadecimal and ASCII
; NOTE: This test demonstrates the use of the SYSLIB Byte-Oriented
; File Input routines
;
; External CP/M Buffers
fcb equ 5ch ; address of FCB filled in by CP/M's CCP (or ZCPR2)
; External References for SYSLIB routines used
ext fi1$open ; Open File for Byte-Oriented Input
ext fi1$close ; Close File
ext f1$get ; Get Byte from File
ext cout ; Character Output
ext pa2hc ; Print A as 2 Hex Chars
ext phldc ; Print HL as up to 5 decimal digits
ext print ; String Print
ext crlf ; New Line
;
; Start of Routine -- Print Banner
;
call print
db 'SYSTEST - Sample DUMP Program to Illustrate SYSLIB '
db 'Byte-Oriented File Input'
db 0
call crlf ; new line
;
; Set Offset Counter
;
lxi h,0 ; Init to zero
shld counter
;
; Open File for Input
;
lxi d,fcb ; pt to FCB filled in by Operating System
call fi1$open ; try to open it
jz loop ; continue if OK
call print ; not ok, so file must not have been found
db 'File Not Found',0
ret ; return to Operating System
;
; Main Loop
;
loop:
lhld counter ; get counter value
call phldc ; print as decimal number
lxi d,16 ; add 16 to counter for next print
dad d
shld counter ; save count away
call print
db ': ',0
mvi b,0 ; set byte count to zero
lxi h,buffer ; point to first byte of buffer
readlp:
call f1$get ; get next byte
jnz readdn ; done if past EOF
mov m,a ; store byte into buffer
inx h ; point to next byte in buffer
inr b ; increment byte count
mov a,b ; check for done
cpi 16 ; read in 16 bytes?
jnz readlp
call bufprint ; print contents of buffer
call crlf ; new line
jmp loop ; continue until End of File
;
; Done with Read -- Print current Buffer and Exit
; B = Number of bytes to print
;
readdn:
call bufprint ; print buffer
call crlf ; new line
call fi1$close ; close file
ret
;
; Buffer print routine; print the contents of the buffer for B bytes
;
bufprint:
lxi h,buffer ; point to first byte of buffer
push b ; save character count
bufploop:
mov a,b ; check count first (in case it is zero)
ora a ; done?
jz ascprint ; print as ASCII chars if done
dcr b ; count down
mov a,m ; get byte from buffer
inx h ; point to next byte in buffer
call pa2hc ; print byte as 2 Hex chars
mvi a,' ' ; print a space
call cout
jmp bufploop
; Now print buffer as ASCII characters
ascprint:
lxi h,buffer ; point to first character
pop b ; get character count
call print ; print a separator
db '! ',0
ascploop:
mov a,b ; check for empty buffer
ora a ; done if zero
rz ; return to caller if so
dcr b ; count down
mov a,m ; get byte to output
ani 7fh ; mask out most significant bit
mov c,a ; save character in C
cpi ' ' ; test for printable character
jnc ascp ; print character if printable
mvi c,'.' ; print dot if not printable character
ascp:
mov a,c ; get char to print
call cout ; print it
inx h ; point to next character
jmp ascploop ; continue until count is exhausted