55 lines
1.5 KiB
Text
55 lines
1.5 KiB
Text
org 100h
|
|
jmp demo
|
|
;;; Increment the number in the $-terminated string under HL.
|
|
;;; The new string is written back to the original location.
|
|
;;; It may grow by one byte (e.g. 999 -> 1000).
|
|
incstr: mvi a,'$' ; End marker
|
|
lxi d,303Ah ; D='0', E='9'+1
|
|
lxi b,0 ; Find the end of the string and find the length
|
|
isrch: cmp m ; Are we there yet?
|
|
inx b ; If not, try next character
|
|
inx h
|
|
jnz isrch
|
|
dcx h
|
|
dcx b
|
|
mov a,b ; Is the string empty?
|
|
ora c
|
|
rz ; Then return (do nothing)
|
|
inx b
|
|
idigit: dcx b ; Go to previous digit
|
|
dcx h
|
|
mov a,b ; Are we at the beginning of the string?
|
|
ora c
|
|
jz igrow ; Then the string grows (999 -> 1000)
|
|
inr m ; Otherwise, increment the digit
|
|
mov a,e
|
|
cmp m ; Did we try to increment '9'?
|
|
rnz ; If not, we're done, return
|
|
mov m,d ; But if so, this digit is now a 0
|
|
jmp idigit ; And we should do the next digit
|
|
igrow: inx h
|
|
mvi m,'1' ; The string should now be '10000...'
|
|
inx h ; We know the string is at least one char long
|
|
mvi a,'$'
|
|
izero: cmp m ; Are we at the end yet?
|
|
mov m,d ; In any case, write a zero
|
|
inx h
|
|
jnz izero ; If not done, write a zero
|
|
mov m,a ; Finally, reterminate the string
|
|
ret
|
|
;;; Demo code: increment the CP/M command line argument
|
|
demo: lxi h,80h ; $-terminate the string
|
|
mov a,m
|
|
adi 81h ; Length is at 80h, the argument itself at 81h
|
|
mov l,a
|
|
mvi m,'$'
|
|
mvi l,80h ; Skip any spaces
|
|
mvi a,' '
|
|
space: inx h
|
|
cmp m
|
|
jz space
|
|
push h ; Store the beginning of the string
|
|
call incstr ; Increment the number in the string
|
|
pop d ; Print the string
|
|
mvi c,9
|
|
jmp 5
|