A86: Lets Help Me Debug And Optimize
[Next][Index][Thread]
A86: Lets Help Me Debug And Optimize
Here's the code to a small personal project, with a problem- To exit,
you press exit twice, or some other miscellanious key twice. This is bad. I
want it to exit with one puss of only the exit key. Also, any other code
optomizations you can think of (either speed or SIZE) will be greatly
appreciated.
<<<<<<<<<<<<<<<<<<<<<NOTE>>>>>>>>>>>>>>>>>>>>>>
Much of this (Some) is other people's routines
<<<<<<<<<<<<<<<<<<<ENDNOTE>>>>>>>>>>>>>>>>>>>>>
Thanks,
-Elliott Bäck "the KIWI", budding assembler.
#include "ti86asm.inc"
#include "asm86.h"
.org _asm_exec_ram
;========================================================
; TPA PHONEBOOK OPTOMIZATION LIST:
; - ld a,0 --> sub a saved 3 clocks
;
;
;
;========================================================
NumberCounter = _textShadow ;Temp storage for counter variable
;========================================================
;= Shell Filename Information
;========================================================
nop
jp ProgStart
.dw 0
.dw ShellTitle
ShellTitle:
.db "T.P.A. Telephone Book",0
;========================================================
;= Initiates program by clearing everything and then
;= displaying the first phone number
;========================================================
ProgStart:
call _runindicoff
call FastClear
call _Flushallmenus
sub a
ld (NumberCounter),a
call GetString
call PutNumber
call PutDirectionRight
;========================================================
;= A getkey loop
;========================================================
;Loop:
; call _getkey
; cp kLeft ;Left
; jr z,Left
; cp kRight ;Right
; jr z,Right
; cp kExit ;Exit
; jr z,Exit
; jr Loop
Loop:
halt \ halt \ halt ; wait for the interrupt
ld a,%01111110 ; load the row for the arrow keys (bit 0 is 0)
out (1),a ; tell the port to check
nop \ nop ; give the port time to check the hardware
in a,(1) ; read the key status
rra ; move last bit to carry flag
rra ;
jr nc,Left ; bit 1 is for left
rra ; check the next key
jr nc,Right ; bit 2 is for right
rra ;
ld a,%00111111 ; load the row for exit (bit 6 is 0)
out (1),a ; tell the port to check
nop \ nop ; give the port time to check the hardware
in a,(1) ; read the key status
bit 6,a ; test the bit for the exit key
jp nz,Loop ; if it's not set, we can loop
jr Exit ; Exit
Exit:
ret
Left: ;The move it left Loop
ld a, (NumberCounter) ;Load a from memory
cp 0 ;see if zero....
jr z,PutDirectionRight ;if so, wait for another key/
;Display Right Arrow
call FastClear ;Clear previous phone number
ld a, (NumberCounter) ;Load a from memory
dec a ;Decrement it.
ld (NumberCounter),a ;Save a.
call GetString ;Get the string,
call PutNumber ;Put it on Screen,
ld a, (NumberCounter)
cp 0
jr z,PutDirectionRight
jr PutDirectionBoth ;Go back to the key loop.
Right: ;The move it rightLoop
ld a, (NumberCounter) ;Get A from textshadow,
cp 13 ;See if 13,
jr z,PutDirectionLeft ;If so, wait for another key...
call FastClear ;Clear Screen
ld a, (NumberCounter) ;Restores value of a
inc a ;Increments it
ld (NumberCounter),a ;saves a to textshadow,
call GetString ;Gets the right string,
call PutNumber ;Puts it on screen
ld a, (NumberCounter)
cp 13
jr z,PutDirectionLeft
jr PutDirectionBoth
;========================================================
;= Puts those nice directional sprite-arrows
;========================================================
PutDirectionLeft:
ld hl,Sprite5
ld d,1
ld e,6
call GridPutSprite
ld hl,Sprite8
ld d,1
ld e,7
call GridPutSprite
jp Loop
PutDirectionRight:
ld hl,Sprite6
ld d,1
ld e,7
call GridPutSprite
ld hl,Sprite7
ld d,1
ld e,6
call GridPutSprite
jp Loop
PutDirectionBoth:
ld hl,Sprite5
ld d,1
ld e,6
call GridPutSprite
ld hl,Sprite6
ld d,1
ld e,7
call GridPutSprite
jp Loop
;========================================================
;= Puts whatever hl points to at 15,1, and the Sprites
;========================================================
PutNumber:
ld a,1
ld (_penRow),a
ld a,15
ld (_penCol),a
call _vputs
ld e,0
ld d,0
ld hl,Sprite1
call GridPutSprite
ld e,1
ld d,0
ld hl,Sprite2
call GridPutSprite
ld e,14
ld d,0
ld hl,Sprite3
call GridPutSprite
ld e,15
ld d,0
ld hl,Sprite4
call GridPutSprite
ret
;========================================================
;= Input: A, number of string to return in hl
;= Output: String pointed to by hl
;= Impact: 74 clock cycles
;========================================================
GetString:
ld hl,PointerTable
sla a
ld e,a
ld d,0
add hl,de
ld e,(hl)
inc hl
ld d,(hl)
ex de,hl
ret
;========================================================
;= Stores the adresses of the Strings in 2 byte words
;========================================================
PointerTable:
.dw Number0
.dw Number1
.dw Number2
.dw Number3
.dw Number4
.dw Number5
.dw Number6
.dw Number7
.dw Number8
.dw Number9
.dw Number10
.dw Number11
.dw Number12
.dw Number13
;========================================================
;= The actual string data in null terminated strings
;= THESE ARE FICTIONAL PEOPLE
;========================================================
Number0:
.db " Bedk, BillyBob: 956-2349",0
Number1:
.db " Bzak, BobBilly: 111-2149",0
Number2:
.db " TownRise, Matt: 784-4567",0
Number3:
.db " Early, Mike: 542-546-5409",0
Number4:
.db " Hearball, Kelly: 900-9007",0
Number5:
.db " Hzechkslovak, Eerie: 569-7852",0
Number6:
.db " Marty, Fred: 167-9654",0
Number7:
.db " Oobleck, Joe: 456-5644",0
Number8:
.db " Person, Nate: 456-4567",0
Number9:
.db " Vayers, Petre: 789-1234",0
Number10:
.db " Worthless, Isaac: 574-3087",0
Number11:
.db " Whiner, Lynsday: 456-7856",0
Number12:
.db " Yelkling, Answer: 132-1111",0
Number13:
.db " Zounds!: The-End",0
;==============================
;=8,8 B/W Sprite Data
;=Copyright 2000, Elliott Back
;==============================
Sprite0:
.db %00000000
.db %00000000
.db %00000000
.db %00000000
.db %00000000
.db %00000000
.db %00000000
.db %00000000
Sprite1:
.db %00000000
.db %00000000
.db %00000000
.db %00000001
.db %00001110
.db %00000001
.db %00000000
.db %00000000
Sprite2:
.db %01111100
.db %10000000
.db %10000000
.db %10000000
.db %10000000
.db %10000000
.db %10000000
.db %01000000
Sprite3:
.db %00111110
.db %00000001
.db %00000001
.db %00000001
.db %00000001
.db %00000001
.db %00000001
.db %00000010
Sprite4:
.db %00000000
.db %00000000
.db %00000000
.db %10000000
.db %01110000
.db %10000000
.db %00000000
.db %00000000
Sprite5:
.db %00000000
.db %00100000
.db %01100000
.db %11100000
.db %01100000
.db %00100000
.db %00000000
.db %00000000
Sprite6:
.db %00000000
.db %00000100
.db %00000110
.db %00000111
.db %00000110
.db %00000100
.db %00000000
.db %00000000
Sprite7:
.db %00000000
.db %00100000
.db %00000000
.db %10100000
.db %00000000
.db %00100000
.db %00000000
.db %00000000
Sprite8:
.db %00000000
.db %00000100
.db %00000000
.db %00000101
.db %00000000
.db %00000100
.db %00000000
.db %00000000
;==============================
;GridPutSprite
; +Puts an aligned sprite at
; (e,d), hl > sprite
;==============================
; In D = y (0-7)
; E = x (0-15)
; HL = Point to Sprite
; Out AF,BC,DE,HL,IX
; Current total 28b,567t
;==============================
GridPutSprite:
push hl
pop ix
srl d
rra
and $80
or e
ld e,a
ld hl,$fc00
add hl,de
ld b,8
ld de,$10
Gps_Loop
ld a,(ix+0)
ld (hl),a
inc ix
add hl,de
djnz Gps_Loop
ret
FastClear:
ld hl,$fc00 ;load video into hl
ld de,1 ;load 1 into de
ld c,64 ;number of vertical lines
ld a,%00000000 ;load the blank line into a
ld (hl),a ;draw the clear line
clear
ld b,16 ;number of horizontal lines
ld a,%00000000 ;load next blank line
clearing
add hl,de ;adds de to hl
ld (hl),a ;load a into hl
djnz clearing ;decrement and jump to clearing if not zero
dec c ;decrease c
ld a,c ;load c into a
jr nz,clear ;jump relevant to clear if not zero
ret ;exit the routine
.end
________________________________________________________________________
Get Your Private, Free E-mail from MSN Hotmail at http://www.hotmail.com
Follow-Ups: