68 lines
1.1 KiB
Text
68 lines
1.1 KiB
Text
org 100h
|
|
mvi a,32 ; Start with space
|
|
mvi d,16 ; 16 lines
|
|
dochar: mov c,a ; Print number
|
|
call putnum
|
|
mov a,c
|
|
lxi h,spc ; Is it space?
|
|
cpi 32
|
|
jz print
|
|
lxi h,del
|
|
cpi 127 ; Is it del?
|
|
jz print
|
|
lxi h,chr ; Character
|
|
mov m,a
|
|
print: call puts
|
|
adi 16 ; Next column
|
|
jp dochar ; Done with this line?
|
|
lxi h,nl
|
|
call puts
|
|
sui 95 ; Next line
|
|
dcr d
|
|
jnz dochar
|
|
ret
|
|
;;; Print number in A. C, D preserved.
|
|
putnum: lxi h,num ; Set number string to spaces
|
|
push h
|
|
mvi b,' '
|
|
mov m,b
|
|
inx h
|
|
mov m,b
|
|
inx h
|
|
mov m,b
|
|
dgts: mvi b,-1
|
|
divmod: sui 10 ; B = A/10, A = (A mod 10)-10
|
|
inr b
|
|
jnc divmod
|
|
adi 58 ; Make digit
|
|
mov m,a ; Store digit
|
|
dcx h
|
|
mov a,b ; Next digit
|
|
ana a
|
|
jnz dgts
|
|
pop h ; Print number
|
|
;;; Print zero-terminated (...ish) string
|
|
puts: mov e,m
|
|
call putch
|
|
inx h
|
|
dcr e
|
|
jp puts
|
|
ret
|
|
;;; Output character in E using CP/M call,
|
|
;;; preserving registers
|
|
putch: push psw
|
|
push b
|
|
push d
|
|
push h
|
|
mvi c,2
|
|
call 5
|
|
pop h
|
|
pop d
|
|
pop b
|
|
pop psw
|
|
ret
|
|
nl: db 13,10,0 ; Newline
|
|
num: db ' : ',0 ; Placeholder for number string
|
|
spc: db 'Spc ',0 ; Space
|
|
del: db 'Del ',0 ; Del
|
|
chr: db '* ',0 ; Placeholder for character
|