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