97 lines
1.9 KiB
Text
97 lines
1.9 KiB
Text
org 100h
|
|
lxi h,output
|
|
;;; Make the header
|
|
call skip ; Four spaces,
|
|
mvi m,'|' ; separator,
|
|
inx h
|
|
lxi d,0C01h ; 12 fields starting at 1
|
|
fnum: mov a,e ; Field number
|
|
call num
|
|
inr e
|
|
dcr d ; If not 12 yet, next field number
|
|
jnz fnum
|
|
call nl ; Newline
|
|
mvi a,'-' ; Four dashes,
|
|
mvi b,4
|
|
call bchr
|
|
mvi m,'+' ; Plus,
|
|
inx h
|
|
mvi b,12*4 ; and 12*4 more dashes
|
|
call bchr
|
|
call nl ; Newline
|
|
;;; Write the 12 lines
|
|
mvi d,1 ; Start at line 1,
|
|
line: mov a,d ; Add the line number
|
|
call num
|
|
mvi m,'|' ; separator
|
|
inx h
|
|
mvi e,1 ; Start at column 1
|
|
mvi c,0 ; Cumulative sum at C
|
|
field: mov a,c ; Add line number giving next column
|
|
add d
|
|
mov c,a
|
|
mov a,e ; If column >= line, we need to print
|
|
cmp d
|
|
mov a,c ; the current total
|
|
cc skip ; skip field if column >= line
|
|
cnc num ; print field if column < line
|
|
inr e ; next column
|
|
mov a,e
|
|
cpi 13 ; column 13?
|
|
jnz field ; If not, next field on line
|
|
call nl ; But if so, add newline
|
|
inr d ; next line
|
|
mov a,d
|
|
cpi 13 ; line 13?
|
|
jnz line ; If not, next line
|
|
mvi m,'$' ; Write a CP/M string terminator,
|
|
mvi c,9 ; And use CP/M to print the string
|
|
lxi d,output
|
|
jmp 5
|
|
;;; Add the character in A to the string at HL, B times
|
|
bchr: mov m,a
|
|
inx h
|
|
dcr b
|
|
jnz bchr
|
|
ret
|
|
;;; Add newline to string at HL
|
|
nl: mvi m,13 ; CR
|
|
inx h
|
|
mvi m,10 ; LF
|
|
inx h
|
|
ret
|
|
;;; Add four spaces to string at HL (skip field)
|
|
skip: mvi b,' '
|
|
mov m,b
|
|
inx h
|
|
mov m,b
|
|
inx h
|
|
mov m,b
|
|
inx h
|
|
mov m,b
|
|
inx h
|
|
ret
|
|
;;; Add 3-digit number in A to string at HL
|
|
num: mvi m,' ' ; Separator space
|
|
inx h
|
|
ana a ; Clear carry
|
|
mvi b,100 ; 100s digit
|
|
call dspc
|
|
mvi b,10 ; 10s digit
|
|
call dspc
|
|
mvi b,1 ; 1s digit
|
|
dspc: jc dgt ; If carry, we need a digit
|
|
cmp b ; >= digit?
|
|
jnc dgt ; If not, we need a digit
|
|
mvi m,' ' ; Otherwise, fill with space
|
|
inx h
|
|
cmc ; Return with carry off
|
|
ret
|
|
dgt: mvi m,'0'-1 ; Calculate digit
|
|
dloop: inr m ; Increment digit
|
|
sub b ; while B can be subtracted
|
|
jnc dloop
|
|
add b
|
|
inx h
|
|
ret
|
|
output: equ $
|