A83: I need more help.
[Prev][Next][Index][Thread]
A83: I need more help.
O.K. Now the help that was given to me last time ( by Olle Hedman (thanks!))
worked but now I have a new problem. When you push up and down it is supposed to
cycle between 5 sprites. The first one works fine but the rest don't. Please
help me. I'm trying to do this with multiplication (of sorts) and offsets to a
single address for a reason. Thanks.
---------------------------------------
Michael Cook
MBCook@MBCook.com (website related)
ICQ: 1145861
---------------------------------------
www.MBCook.com (Main Site)
www.MBCook.com/netsmart.html (NetSmart Homepage)
---------------------------------------
E-Mail for PGP key
---------------------------------------
I pledge allegiance to the compatibles of IBM, and to the developers for which
it stands, one platform, under Bill, indestructible, with peripherals and
multimedia for all.
.NOLIST
#define equ .equ
#define EQU .equ
#define end .end
#define Sprite 8265h
#include "ti83asm.inc" ; Needed Files
#include "tokens.inc"
LIST
.org 9327h ; Start of program
Start:
call _RUNINDICOFF ; Turn off the run indicator
ld a, 0
ld (Sprite), a ; Set sprite
ld d, a
call _CLRLCDFULL ; Clear the screen
call _GRBUFCLR ; Clear the graph buffer
call Show_Sprite ; Do it
Main:
ld a, (Sprite) ; Get current sprite
cp d
jp z, Post_Draw ; If we haven't changed, don't draw!
call _GRBUFCLR ; Clear the graph buffer
call Show_Sprite ; Do it
call _GRBUFCPY_V ; Show the graph buffer
Post_Draw:
call _GETKEY ; Get a key
cp 03h ; Is it up?
jp z, Up
cp 04h ; Is it down?
jp z, Down
cp 09h ; Is it [clear]?
jp z, Quit
jp nz, Main ; Nothing happened so start over
Up:
ld a, (Sprite) ; Get sprite
cp 4 ; Make shure we're not out of sprites
jp z, Main
inc a ; Must have room so go up and store it
ld (Sprite), a
jp Main ; Now we're done
Down:
ld a, (Sprite) ; Get sprite
cp 0 ; Make shure we're not out of sprites
jp z, Main
dec a ; Must have room so go up and store it
ld (Sprite), a
jp Main ; Now we're done
Quit:
set appTextSave, (iy+appFlags) ; Make shure that we clear the backup
call _CLRSCRNFULL ; Clear the screen
res appTextSave, (iy+appFlags) ; Always reset flags
call _HOMEUP
ei ; Make shure interupts are on
ret ; Exit
Show_Sprite:
ld a, (Sprite) ; Get sprite
ld hl, Sprite_Data ; Get sprite start address
ld bc, 0 ; Set sprite Number
add a, a ; (have to double it)
ld b, a ; (Then multiply by 8)
add a, b
add a, b
add a, b
add a, b
add a, b
add a, b
add a, b
ld c, a ; Now we've got the offset in BC
add hl, bc ; Get final address in HL
ld a, 0 ; Set cords to upper left
ld e, a
call DRWSPR ; Show sprite
ret ; Return
;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄ¿
;³ÛÛÛÛÛ Z80 ÛÛÛÛÛÛ³ Sprite83 ³ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ³ movax ³ÛÛÛÛÛÛÛÛÛÛÛÛ³
;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÙ
; Sprite draw routine v1.0 and sprite clear routine v1.0
; Coded by Hannes Edfeldt in 1997
; With these two routines you can draw and clear non-aligned sprites. See
; sprdemo.z80 for an example of how to use these routines.
; Feel free to use these routines in your own productions as long as you give
; me some credit.
; This file should of course be viewed in a DOS texteditor ;)
; Hannes Edfeldt -+- movax@algonet.se -+- http://www.algonet.se/~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 ÛÛÛÛÛÛ³ Sprite83 ³ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ³ movax ³ÛÛÛÛÛÛÛÛÛÛÛÛ³
;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÙ
Sprite_Data:
.db 11111111b ; Solid
.db 11111111b
.db 11111111b
.db 11111111b
.db 11111111b
.db 11111111b
.db 11111111b
.db 11111111b
.db 11111111b ; Horzontal Lines
.db 00000000b
.db 11111111b
.db 00000000b
.db 11111111b
.db 00000000b
.db 11111111b
.db 00000000b
.db 10101010b ; Virticle Lines
.db 10101010b
.db 10101010b
.db 10101010b
.db 10101010b
.db 10101010b
.db 10101010b
.db 10101010b
.db 01111110b ; Computer
.db 01000010b
.db 01000010b
.db 01000010b
.db 01000010b
.db 11111111b
.db 10000001b
.db 11111111b
.db 00111100b ; Smily
.db 01000010b
.db 10100101b
.db 10000001b
.db 10100101b
.db 10011001b
.db 01000010b
.db 00111100b
.end
end
Follow-Ups: