A86: weird program bug (read only if you have extra time)
[Prev][Next][Index][Thread]
A86: weird program bug (read only if you have extra time)
Hey everybody,
If anyone has some extra time and would like to help me out I have been
writing this program and I have encountered a weird bug that I don't know how
to fix. I am writing a [sqrt]home program which runs right the first time
that it is run however the second time it is run it goes into an infinite
loop. THIS PROGRAM WILL CRASH YOUR CALCULATOR, so install it with care.
Thanks for the help,
Andy
just in case the attachment doesent work here is the source:
#include "ti86asm.inc"
bcurrlastentry = $f688
.org _asm_exec_ram
nop
jp progstart
.dw 0
.dw shelltitle
shelltitle:
.db "HomeStck v.1 Install by Andy Hochhaus",0
;this is the installer
progstart:
ld hl,$5a69 ;[sqrt]home name in rom
rst 20h ;"[SQRT]home" in OP1
rst 10h ;_findsym
call nc,_delvar ;delete var if it exists
ld hl,codeend-codestart ;calc size of prog
push hl
call _createprog ;make [sqrt] prog
ld a,b
ex de,hl
call _ahl_plus_2_pg3
call _set_abs_dest_addr
xor a
pop hl
call _set_mm_num_bytes
xor a
ld hl,code
call _set_abs_src_addr
call _mm_ldir
set 4,(iy+$24) ;activate [sqrt]home prog
call $49dc ;flushallmenus
call _clrScrn ;clr LCD and TextMem
ld a,7 ;place cursor
ld (_curRow),a
ret
;actual [sqrt]home program starts here
code:
.org _asm_exec_ram-2
codestart:
.db $8e,$28 ;necessary at start of asm progs
call refreshstack ;my function to display the stack
ld a,(_winBtm)
dec a
ld b,a
ld a,(_curRow)
cp b ;if (_curRow)<(_winBtm) goto movedown
call c,movedown
ld a,b
ld (_curRow),a
ld a,(_asm_reg_a)
ld bc,(_asm_reg_bc)
end:
cp a
ret
movedown:
ld a,(_curRow)
cp 6
jp nz,onemenustillup ;if one menu is still active don't refresh
screen based on text mem
ld a,(_curCol)
push af
call $4ac3 ;rstrShadow NOTE:DESTROYS (_curCol) and makes
screen flicker
pop af
ld (_curCol),a ;restores (_curCol)
onemenustillup:
call $4a7a ;_scrollDown
ld a,(_winBtm)
dec a
ld b,a
ret
;displays the stack on the homescreen in the v width font
refreshstack:
ld a,0 ;entry number to display
ld (bcurrlastentry),a
ld a,0 ;location to display at
ld (_penCol),a
ld h,8
ld a,(_curRow)
dec a
ld l,a
call _HtimesL
ld a,l
ld (_penRow),a ;calculates where to display based on the
cursor location
;loop to display as many entrys as there are in the history stack
disphistloop:
ld a,(bcurrlastentry)
inc a
ld (bcurrlastentry),a
ld (_currlastentry),a
ld b,a
ld a,(_numlastentries)
cp b
ret c ;check to see if (_currlastentry) is
smaller then (_numlastentries)
call disphistentry ;actually displays each individual
entry
ld a,0
ld (_penCol),a
ld a,(_penRow)
sub 6
ld (_penRow),a
jp disphistloop
disphistentry:
call $4627 ;_GETLASTENTRY get ptr to history entry
call _ex_ahl_bde
push af
push hl
call _get_word_ahl
push de
push de
ld hl,equvarname-1
rst 20h
pop hl
call _createequ
;never gets past this point after running two times
call _ex_ahl_bde
call _set_abs_dest_addr
ld a,0
pop hl
call _ahl_plus_2_pg3
call _set_mm_num_bytes
pop hl
pop af
call _set_abs_src_addr
call _mm_ldir ;copy compiled entry out to a temporary
program variable
ld hl,equvarname-1
rst 20h
call $53ca ;_setupEditequ open prog in editor
call $51d9 ;_detok detokenize
call $53d2 ;_bufToTop go to the top
xor a ; insert $00 at the top
call $53ae ;_bufInsert to mark it as uncompiled
call $544a ;_closeEditequ close prog editor
;program var is now decompiled (plain text
form)
ld hl,equvarname-1
rst 20h
rst 10h
call _ex_ahl_bde
call $521d ;_get_word_ahl
dec e
ld b,e
call _inc_ptr_ahl
disploop: ;displays 0 terminated string at AHL in
variable width font
call $521d ;_get_word_ahl
call $463b ;_dec_ptr_ahl
push af
push hl
push bc
ld a,e
call $4aa1 ;_vputmap
pop bc
pop hl
pop de
ld a,d
djnz disploop
ld hl,equvarname-1 ;deletes temporary variable
rst 20h
rst 10h
call nc,_delvar
ret
equvarname:
.db 2,"tv"
codeend:
.end
#include "ti86asm.inc"
bcurrlastentry = $f688
.org _asm_exec_ram
nop
jp progstart
.dw 0
.dw shelltitle
shelltitle:
.db "HomeStck v.1 Install by Andy Hochhaus",0
;this is the installer
progstart:
ld hl,$5a69 ;[sqrt]home name in rom
rst 20h ;"[SQRT]home" in OP1
rst 10h ;_findsym
call nc,_delvar ;delete var if it exists
ld hl,codeend-codestart ;calc size of prog
push hl
call _createprog ;make [sqrt] prog
ld a,b
ex de,hl
call _ahl_plus_2_pg3
call _set_abs_dest_addr
xor a
pop hl
call _set_mm_num_bytes
xor a
ld hl,code
call _set_abs_src_addr
call _mm_ldir
set 4,(iy+$24) ;activate [sqrt]home prog
call $49dc ;flushallmenus
call _clrScrn ;clr LCD and TextMem
ld a,7 ;place cursor
ld (_curRow),a
ret
;actual [sqrt]home program starts here
code:
.org _asm_exec_ram-2
codestart:
.db $8e,$28 ;necessary at start of asm progs
call refreshstack ;my function to display the stack
ld a,(_winBtm)
dec a
ld b,a
ld a,(_curRow)
cp b ;if (_curRow)<(_winBtm) goto movedown
call c,movedown
ld a,b
ld (_curRow),a
ld a,(_asm_reg_a)
ld bc,(_asm_reg_bc)
end:
cp a
ret
movedown:
ld a,(_curRow)
cp 6
jp nz,onemenustillup ;if one menu is still active don't refresh screen based on text mem
ld a,(_curCol)
push af
call $4ac3 ;rstrShadow NOTE:DESTROYS (_curCol) and makes screen flicker
pop af
ld (_curCol),a ;restores (_curCol)
onemenustillup:
call $4a7a ;_scrollDown
ld a,(_winBtm)
dec a
ld b,a
ret
;displays the stack on the homescreen in the v width font
refreshstack:
ld a,0 ;entry number to display
ld (bcurrlastentry),a
ld a,0 ;location to display at
ld (_penCol),a
ld h,8
ld a,(_curRow)
dec a
ld l,a
call _HtimesL
ld a,l
ld (_penRow),a ;calculates where to display based on the cursor location
;loop to display as many entrys as there are in the history stack
disphistloop:
ld a,(bcurrlastentry)
inc a
ld (bcurrlastentry),a
ld (_currlastentry),a
ld b,a
ld a,(_numlastentries)
cp b
ret c ;check to see if (_currlastentry) is smaller then (_numlastentries)
call disphistentry ;actually displays each individual entry
ld a,0
ld (_penCol),a
ld a,(_penRow)
sub 6
ld (_penRow),a
jp disphistloop
disphistentry:
call $4627 ;_GETLASTENTRY get ptr to history entry
call _ex_ahl_bde
push af
push hl
call _get_word_ahl
push de
push de
ld hl,equvarname-1
rst 20h
pop hl
call _createequ
;never gets past this point after running two times
call _ex_ahl_bde
call _set_abs_dest_addr
ld a,0
pop hl
call _ahl_plus_2_pg3
call _set_mm_num_bytes
pop hl
pop af
call _set_abs_src_addr
call _mm_ldir ;copy compiled entry out to a temporary program variable
ld hl,equvarname-1
rst 20h
call $53ca ;_setupEditequ open prog in editor
call $51d9 ;_detok detokenize
call $53d2 ;_bufToTop go to the top
xor a ; insert $00 at the top
call $53ae ;_bufInsert to mark it as uncompiled
call $544a ;_closeEditequ close prog editor
;program var is now decompiled (plain text form)
ld hl,equvarname-1
rst 20h
rst 10h
call _ex_ahl_bde
call $521d ;_get_word_ahl
dec e
ld b,e
call _inc_ptr_ahl
disploop: ;displays 0 terminated string at AHL in variable width font
call $521d ;_get_word_ahl
call $463b ;_dec_ptr_ahl
push af
push hl
push bc
ld a,e
call $4aa1 ;_vputmap
pop bc
pop hl
pop de
ld a,d
djnz disploop
ld hl,equvarname-1 ;deletes temporary variable
rst 20h
rst 10h
call nc,_delvar
ret
equvarname:
.db 2,"tv"
codeend:
.end