Hi, I was wondering if anyone could help me with debugging this program? It's not printing out the way I expected it to, and I could use another set of eyes to help me figure out what's wrong with it. It's supposed to print out 3 vertical lines of X's of a length determined by the user, but isn't printing out the lines correctly.
Thanks!
Thanks!
Code:
bdos equ 5 ; CP/M function call address
boot equ 0 ; address to get back to CP/M
conin equ 1 ; keyboard read function number
conout equ 2 ; console output function number
sprint equ 9 ; string print function number
cr equ 0Dh ; value of ASCII code of <CR>
lf equ 0Ah ; value of ASCII code of line feed
;
org 0100h
lxi sp,sp0 ;init stack
mvi c, sprint
lxi d, title ;calls first part of title at title
call bdos
mvi c, sprint
lxi d, title2 ;calls second part of title
call bdos
call lines
call print
mvi c, sprint
lxi d,endgraph
call bdos
lxi d,endmess
call bdos
jmp boot
;lines subroutine
lines: mvi c, sprint
lxi d, line1 ;prompts for 1st length
call bdos ;1=b
mvi c, conin
call bdos
mov b,a ;moves 1st length into b
mvi c, sprint
lxi d, line2 ;prompts for 2nd length
call bdos
mvi c, conin ;2=d
call bdos
mov d,a ;moves 2nd length into d
push d
mvi c, sprint
lxi d, line3 ;prompts for 3rd length
call bdos
mvi c, conin ;3=h
call bdos
mov h,a ;moves 3rd length into h
pop d
ret
;print subroutine
print: mvi c,conout
push d ;keeps d from being overwritten
lxi d,enter ;puts in an enter
call bdos
pop d
mov a,b ;1st len to a
cmp d ;1st-2nd
jm sec ;2nd>=1st
jz sec
cmp h ;1st-3rd
jm threeh ;3rd>=1st>2nd, otherwise is 1st>2nd>3rd
jz threeh
jmp oneh
sec: mov a,d
cmp h ;2nd-3rd
jm threeh ;3rd>=2nd>=1st, otherwise 2nd is highest
jz threeh
jmp twoh
oneh: mov a,b
reponeh:
cpi 0
rz ;ends prog once gets to end of 1s
push d ;keeps d from being overwritten
lxi d,xchar ;puts in an x
call bdos
mvi c,conout
lxi d,fourspace ;puts in 4 spaces
call bdos
pop d
call bdos
cmp d ;1st-2nd
jp twospace ;puts in space
push d ;keeps d from being overwritten
lxi d,xchar ;puts in an x
call bdos
two: lxi d,fourspace ;puts in 4 spaces
call bdos
call bdos
cmp h ;1st-3rd
jp threespace ;puts in space
lxi d,xchar ;puts in an x
call bdos
three: sui 1 ;decriments counter
lxi d,enter ;puts in an enter
call bdos
pop d
jmp reponeh
twospace:
push d ;keeps d from being overwritten
lxi d,space ;puts in a space
call bdos
jmp two
threespace:
lxi d,space ;puts in a space
call bdos
jmp three
twoh: mov a,d
reptwoh:
cpi 0
rz
cmp b ;2nd-1st
jp twohonespace ;puts in space
lxi d,xchar ;puts in an x
call bdos
twohone:
lxi d,fourspace ;puts in 4 spaces
call bdos
lxi d,xchar ;puts in an x
call bdos
lxi d,fourspace ;puts in 4 spaces
call bdos
call bdos
cmp h ;2nd-3rd
jp twohthreespace ;puts in space
lxi d,xchar ;puts in an x
call bdos
twohthree:
sui 1 ;decriments counter
lxi d,enter ;puts in an enter
call bdos
jmp reptwoh
twohonespace:
lxi d,space ;puts in a space
call bdos
jmp twohone
twohthreespace:
lxi d,space ;puts in a space
call bdos
jmp twohthree
threeh: mov a, h
repthreeh:
cpi 0
rz
cmp b ;3rd-1st
jp threehonespace ;puts in space
push d ;keeps d from being overwritten
lxi d,xchar ;puts in an x
call bdos
threehone:
lxi d,fourspace ;puts in 4 spaces
call bdos
pop d
call bdos
cmp d ;3rd-2nd
jp threehtwospace
push d ;keeps d from being overwritten
lxi d,xchar ;puts in an x
call bdos
threehtwo:
lxi d,fourspace ;puts in 4 spaces
call bdos
lxi d,xchar ;puts in an x
call bdos
sui 1 ;decriments counter
lxi d,enter ;puts in an enter
call bdos
pop d
jmp repthreeh
threehonespace:
lxi d,space ;puts in a space
call bdos
jmp threehone
threehtwospace:
push d ;keeps d from being overwritten
lxi d,space ;puts in a space
call bdos
jmp threehtwo
title: db 'Three Lines$'
title2: db lf,cr, 'I will print three lines of given lengths$'
line1: db lf,cr,'Length of first line: $'
line2: db lf,cr,'Length of second line: $'
line3: db lf,cr,'Length of third line: $'
xchar: db 'X $'
enter: db lf,cr, '$'
fourspace: db ' $'
space: db ' $'
endgraph: db lf,cr, '1 2 3$'
endmess: db lf,cr,'Thank you for using the Three Lines program$'
ds 20 ;reserve for stack
sp0 equ $ ;stack pointer address
end