A83: Got another one for 'ya
[Prev][Next][Index][Thread]
A83: Got another one for 'ya
Thanks again. Here is my next problem. You are supposed to be able to use the
arrows to move cords and it is supposed to display what's at the cord on the top
line but it don't work.
---------------------------------------
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 LocX 8265h
#define LocY 8267h
#define TempX 8269h
#define TempY 826Bh
#define Sprite 826Dh
#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 (LocX), a ; Set location
ld (LocY), a
ld (TempX), a
ld (TempY), a
call _CLRLCDFULL ; Clear the screen
call _GRBUFCLR ; Clear the graph buffer
Main:
ld a, (TempX) ; Get current loc in X
ld d, a
ld a, (LocX)
cp d
jp z, Post_Draw ; If we haven't changed, don't draw!
ld a, (TempY) ; Get current loc in Y
ld d, a
ld a, (LocY)
cp d
jp z, Post_Draw ; If we haven't changed, don't draw!
ld a, (LocX) ; We must of changed so change temps
ld (TempX), a
ld a, (LocY)
ld (TempY), a
call _CLRLCDFULL ; Clear the screen
ld hl, 0 ; Clear HL
call Check_Cords
ld l, a ; Put number to disp in HL
ld a, 0
ld (CURCOL), a ; Set cursor
ld (CURROW), a
call _dispHL ; Show HL
ld hl, 0 ; Clear HL
ld a, (LocX)
ld l, a ; Put number to disp in HL
ld a, 0
ld (CURCOL), a ; Set cursor
inc a
ld (CURROW), a
call _dispHL ; Show HL
ld hl, 0 ; Clear HL
ld a, (LocY)
ld l, a ; Put number to disp in HL
ld a, 0
ld (CURCOL), a ; Set cursor
inc a
inc a
ld (CURROW), a
call _dispHL ; Show HL
jp Post_Draw ; Done Here
Check_Cords:
ld hl, Map ; Get main address for map
ld a, (LocX) ; Get X offset
sla a ; Double it
ld bc, 0 ; Clear BC
ld c, a ; Put offset into BC
add hl, bc ; Now HL has address and X offset
push hl ; Save address
ld a, (LocY) ; Get Y location
ld b, a
ld de, 32 ; Offset per row
cp 0 ; Make shure that we're not in the first row
jp z, Post_Calc
ld hl, 0 ; Clear HL
Pre_Calc:
add hl, de
djnz Pre_Calc ; If we've got more rows go to Pre_Calc
Post_Calc
ld b, h ; Put HL into BC
ld c, l
pop hl ; Get address + X
add hl, bc ; Add Y
ld a, (HL) ; Get the data
ret ; Done here
Post_Draw:
call _GETKEY ; Get a key
cp 01h ; Is it right?
jp z, Right
cp 02h ; Is it left?
jp z, Left
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, (LocY) ; Get loc
cp 0 ; Make shure we're not out of locs
jp z, Main
dec a ; Must have room so go up and store it
ld (LocY), a
jp Main ; Now we're done
Down:
ld a, (LocY) ; Get loc
cp 7 ; Make shure we're not out of locs
jp z, Main
inc a ; Must have room so go up and store it
ld (LocY), a
jp Main ; Now we're done
Right:
ld a, (LocX) ; Get loc
cp 15 ; Make shure we're not out of locs
jp z, Main
inc a ; Must have room so go up and store it
ld (LocX), a
jp Main ; Now we're done
Left:
ld a, (LocX) ; Get loc
cp 0 ; Make shure we're not out of locs
jp z, Main
inc a ; Must have room so go up and store it
ld (LocX), 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 _GRBUFCLR ; Clear the graph buffer
call _HOMEUP ; Go to top cords
ei ; Make shure interupts are on
ret ; Exit
Show_Sprite:
; Put sprite (Sprite) at B,C
push bc ; Save X and Y
ld a, (Sprite) ; Get sprite
ld hl, Sprite_Data ; Get sprite start address
ld bc, 0 ; Set sprite Number
sla a ; Multiply by 8
sla a
sla a
ld c, a ; Now we've got the offset in BC
add hl, bc ; Get final address in HL
pop bc ; Get cords back
ld a, b ; Set cords
ld e, c
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
Map:
.db 00,01,00,01,00,01,00,01,00,01,00,01,00,01,00,01
.db 00,01,02,03,04,05,06,07,08,09,00,01,02,03,04,05
.db 00,00,01,00,00,01,00,00,01,00,00,01,00,00,01,00
.db 00,01,00,00,01,00,00,01,00,00,01,00,00,01,00,00
.db 01,00,00,01,00,00,01,00,00,01,00,00,01,00,00,01
.db 00,00,01,00,00,01,00,00,01,00,00,01,00,00,01,00
.db 00,01,00,00,01,00,00,01,00,00,01,00,00,01,00,00
.end
end
Follow-Ups: