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: