A83: what's wrong with this?
[Prev][Next][Index][Thread]
A83: what's wrong with this?
I made this prog that's supposed to move a little arrow around the screen. I
compiled it and it shows a bunch of random pixels in a little square in the
middle of the screen. It doesn't crash the calc. you can turn off the calc
the normal way.
here's the code: (it's probally realy bad. It's my first prog that's supposed
to actually does something)
.NOLIST
#define equ .equ
#define EQU .equ
#define end .end
#include "ti83asm.inc"
#include "tokens.inc"
#define XCOR 8265h
#define YCOR 8266h
.LIST
.org 9327h
prog_start:
call _RunIndicOff ;run indictator off
call _GrBufClr ;clr graphbuffer
call _GrBufCpy_V ;copy graph buffer to LCD
ld hl,sprdown
push hl
ld a,44
ld (XCOR),a
ld a,28
ld (YCOR),a
jp up
mainloop:
call _getkey ;get key
cp 247 ;up?
jp z,up ;if yes goto up
cp 254 ;down?
jp z,down ;if yes goto down
cp 253 ;left?
jp z,left ;if yes goto left
cp 253 ;right?
jp z,right ;if yes goto right
cp 191 ;clear?
jp z,quit ;if yes goto quit
jp mainloop ;goto mainloop
up: ld hl,sprup
push hl
call clearsprite
inc e
inc e
ld (XCOR),a
ld e,a
ld (YCOR),a
jp drawsprite
down: ld hl,sprdown
push hl
call clearsprite
dec e
dec e
ld (XCOR),a
ld e,a
ld (YCOR),a
jp drawsprite
Right: ld hl,sprright
push hl
call clearsprite
inc a
inc a
ld (XCOR),a
jp drawsprite
Left: ld hl,sprleft
push hl ;put sprite address on stack
call clearsprite ;clr sprite
dec a ;subtract 1 from a
dec a
ld (XCOR),a
jp drawsprite ;drw sprite
clearsprite:
ld a,(YCOR)
ld e,a
ld a,(XCOR)
pop hl ;get sprite address off stack
call CLRSPR ; Clear the sprite in the graphbuf
call _Grbufcpy_V ; Copy the graphbuf to the LCD
push hl ;put sprite address on stack again
drawsprite:
ld a,(YCOR)
ld e,a
ld a,(XCOR)
pop hl
call drwspr
call _grbufcpy_v
jp mainloop
quit: ret
sprup: .db %00011000
.db %00111100
.db %01111110
.db %00011000
.db %00011000
.db %00011000
.db %00011000
.db %00011000
sprdown:
.db %00011000
.db %00011000
.db %00011000
.db %00011000
.db %00011000
.db %01111110
.db %00111100
.db %00011000
sprleft:
.db %00000000
.db %00000100
.db %00000110
.db %11111111
.db %11111111
.db %00000110
.db %00000100
.db %00000000
sprright:
.db %00000000
.db %00100000
.db %01100000
.db %11111111
.db %11111111
.db %01100000
.db %00100000
.db %00000000
;;;;the rest of the stuff is movax's sprite routine
;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄ
¿
;³ÛÛÛÛÛ Z80 ÛÛÛÛÛÛ³ PROCEDURES ³ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ³ movax
³ÛÛÛÛÛÛÛÛÛÛÛÛ³
;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄ
Ù
;ÜÛÛÛÛÛÛÛÛÛÛÛÛß DRWSPR
ßÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
¿
;³ Draw 8x8 sprite þ a=x, e=y, hl=sprite address
³
;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Ù
DRWSPR:
push hl ; Save sprite address
;ÛÛÛÛ Calculate the address in graphbuf ÛÛÛÛ
ld hl,0 ; Do y*12
ld d,0
add hl,de
add hl,de
add hl,de
add hl,hl
add hl,hl
ld d,0 ; Do x/8
ld e,a
srl e
srl e
srl e
add hl,de
ld de,8e29h
add hl,de ; Add address to graphbuf
ld b,00000111b ; Get the remainder of x/8
and b
cp 0 ; Is this sprite aligned to 8*n,y?
jp z,ALIGN
;ÛÛÛÛ Non aligned sprite blit starts here ÛÛÛÛ
pop ix ; ix->sprite
ld d,a ; d=how many bits to shift each line
ld e,8 ; Line loop
LILOP: ld b,(ix+0) ; Get sprite data
ld c,0 ; Shift loop
push de
SHLOP: srl b
rr c
dec d
jp nz,SHLOP
pop de
ld a,b ; Write line to graphbuf
or (hl)
ld (hl),a
inc hl
ld a,c
or (hl)
ld (hl),a
ld bc,11 ; Calculate next line address
add hl,bc
inc ix ; Inc spritepointer
dec e
jp nz,LILOP ; Next line
jp DONE1
;ÛÛÛÛ Aligned sprite blit starts here ÛÛÛÛ
ALIGN: ; Blit an aligned sprite to graphbuf
pop de ; de->sprite
ld b,8
ALOP1: ld a,(de)
or (hl) ; xor=erase/blit
ld (hl),a
inc de
push bc
ld bc,12
add hl,bc
pop bc
djnz ALOP1
DONE1:
ret
;ÜÛÛÛÛÛÛÛÛÛÛÛÛÜ DRWSPR
ÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
;ÜÛÛÛÛÛÛÛÛÛÛÛÛß CLRSPR
ßÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
¿
;³ Clear 8x8 sprite þ a=x, e=y, hl=sprite address
³
;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Ù
CLRSPR:
push hl ; Save sprite address
;ÛÛÛÛ Calculate the address in graphbuf ÛÛÛÛ
ld hl,0 ; Do y*12
ld d,0
add hl,de
add hl,de
add hl,de
add hl,hl
add hl,hl
ld d,0 ; Do x/8
ld e,a
srl e
srl e
srl e
add hl,de
ld de,8e29h
add hl,de ; Add address to graphbuf
ld b,00000111b ; Get the remainder of x/8
and b
cp 0 ; Is this sprite aligned to 8*n,y?
jp z,ALIGN2
;ÛÛÛÛ Non aligned sprite erase starts here ÛÛÛÛ
pop ix ; ix->sprite
ld d,a ; d=how many bits to shift each line
ld e,8 ; Line loop
LILOP2: ld b,(ix+0) ; Get sprite data
ld c,0 ; Shift loop
push de
SHLOP2: srl b
rr c
dec d
jp nz,SHLOP2
pop de
ld a,b ; Write line to graphbuf
cpl
and (hl)
ld (hl),a
inc hl
ld a,c
cpl
and (hl)
ld (hl),a
ld bc,11 ; Calculate next line address
add hl,bc
inc ix ; Inc spritepointer
dec e
jp nz,LILOP2 ; Next line
jp DONE5
;ÛÛÛÛ Aligned sprite erase starts here ÛÛÛÛ
ALIGN2: ; Erase an aligned sprite in graphbuf
pop de ; de->sprite
ld b,8
ALOP2: ld a,(de)
cpl
and (hl)
ld (hl),a
inc de
push bc
ld bc,12
add hl,bc
pop bc
djnz ALOP2
DONE5:
ret
;ÜÛÛÛÛÛÛÛÛÛÛÛÛÜ CLRSPR
ÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄ
¿
;³ÛÛÛÛÛ Z80 ÛÛÛÛÛÛ³ EQUALS ³ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ³ movax
³ÛÛÛÛÛÛÛÛÛÛÛÛ³
;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄ
Ù
WAITKEY .equ 4CFEh ; Wait for a key and read
BUFCLR .equ 515Bh ; Clear the graph backup
BUFCOPY .equ 5164h ; Copy the graph backup to the screen
RINDOFF .equ 4795h ; Turn off runindicator
PRINTHL .equ 4709h ; Print HL in dec. on the screen
OP2TOP1 .equ 41C2h ; Move OP2 to OP1
CONVOP1 .equ 4EFCh ; Convert fp value in OP1 to a 2 byte hex
READKEY .equ 4A18h ; Read key and place it in OP2 as a fp value
GOHOME .equ 47A1h ; Go to home screen (finish gfx program)
CLRTSHD .equ 4765h ; Clear text shadow
HOMEUP .equ 4775h ; Place cursor at home
STRING .equ 470Dh ; Print 0 terminated string to screen (hl->string)
.end
END