tfv: transparent sprite mostly working

This commit is contained in:
Vince Weaver 2017-05-12 16:35:52 -04:00
parent 4d846e778b
commit 37cd697d77
2 changed files with 281 additions and 17 deletions

Binary file not shown.

298
tfv/tfv.s
View File

@ -1,14 +1,22 @@
.define EQU =
KEYPRESS EQU $C000
KEYRESET EQU $C010
;; SOFT SWITCHES
GR EQU $C050
TEXT EQU $C051
FULLGR EQU $C052
TEXTGR EQU $C053
PAGE0 EQU $C054
PAGE1 EQU $C055
LORES EQU $C056
HIRES EQU $C057
GR EQU $C050
TEXT EQU $C051
FULLGR EQU $C052
TEXTGR EQU $C053
PAGE0 EQU $C054
PAGE1 EQU $C055
LORES EQU $C056
HIRES EQU $C057
PADDLE_BUTTON0 EQU $C061
PADDL0 EQU $C064
PTRIG EQU $C070
;; MONITOR ROUTINES
HLINE EQU $F819 ;; HLINE Y,$2C at A
@ -38,15 +46,20 @@ H2 EQU $2C
V2 EQU $2D
MASK EQU $2E
COLOR EQU $30
FIRST EQU $F0
TEMP EQU $FA
RUN EQU $FA
TEMP2 EQU $FB
INL EQU $FC
INH EQU $FD
OUTL EQU $FE
OUTH EQU $FF
FIRST EQU $F0
LASTKEY EQU $F1
PADDLE_STATUS EQU $F2
XPOS EQU $F3
YPOS EQU $F4
TEMP EQU $FA
RUN EQU $FA
TEMP2 EQU $FB
TEMPY EQU $FB
INL EQU $FC
INH EQU $FD
OUTL EQU $FE
OUTH EQU $FF
;=============================
; set low-res graphics, page 0
@ -72,12 +85,61 @@ OUTH EQU $FF
jsr gr_copy
lda #20
sta YPOS
lda #20
sta XPOS
main_loop:
jsr gr_copy
jsr put_sprite
jsr wait_until_keypressed
lda LASTKEY
cmp #('Q')
beq exit
cmp #('I')
bne check_down
dec YPOS
dec YPOS
check_down:
cmp #('M')
bne check_left
inc YPOS
inc YPOS
check_left:
cmp #('J')
bne check_right
dec XPOS
check_right:
cmp #('K')
bne check_done
inc XPOS
check_done:
jmp main_loop
exit:
lda #$4
sta BASH
lda #$0
sta BASL ; restore to 0x400 (page 0)
; copy to 0x400 (page 0)
; call home
jsr HOME
; Return to BASIC?
rts
@ -205,6 +267,7 @@ set_gr_page0:
;=========================================================
; for now copy 0xc00 to 0x400
; 2 + 8*38 + 4*80*23 + 4*120*26 + 13 = 20,159 = 20ms = 50Hz
;
gr_copy:
ldx #0 ; set y to zero ; 2
@ -246,6 +309,202 @@ gr_copy_line_done:
bne gr_copy_loop ; if not, loop ; 3
rts ; 6
;==========================================================
; Wait until keypressed
;==========================================================
;
wait_until_keypressed:
lda KEYPRESS ; check if keypressed
bpl wait_until_keypressed ; if not, loop
jmp figure_out_key
;==========================================================
; Get Key
;==========================================================
;
get_key:
check_paddle_button:
; check for paddle button
bit PADDLE_BUTTON0
bpl no_button
lda #' '+128
jmp save_key
no_button:
lda KEYPRESS
bpl no_key
figure_out_key:
cmp #' '+128 ; the mask destroys space
beq save_key ; so handle it specially
and #$5f ; mask, to make upper-case
check_right_arrow:
cmp #$15
bne check_left_arrow
lda #'K'
check_left_arrow:
cmp #$08
bne check_up_arrow
lda #'J'
check_up_arrow:
cmp #$0B
bne check_down_arrow
lda #'I'
check_down_arrow:
cmp #$0A
bne check_escape
lda #'M'
check_escape:
cmp #$1B
bne save_key
lda #'Q'
jmp save_key
no_key:
bit PADDLE_STATUS
bpl no_key_store
; check for paddle action
; code from http://web.pdx.edu/~heiss/technotes/aiie/tn.aiie.06.html
inc PADDLE_STATUS
lda PADDLE_STATUS
and #$03
beq check_paddles
jmp no_key_store
check_paddles:
lda PADDLE_STATUS
and #$80
sta PADDLE_STATUS
ldx #$0
LDA PTRIG ;TRIGGER PADDLES
LDY #0 ;INIT COUNTER
NOP ;COMPENSATE FOR 1ST COUNT
NOP
PREAD2: LDA PADDL0,X ;COUNT EVERY 11 uSEC.
BPL RTS2D ;BRANCH WHEN TIMED OUT
INY ;INCREMENT COUNTER
BNE PREAD2 ;CONTINUE COUNTING
DEY ;COUNTER OVERFLOWED
RTS2D: ;RETURN W/VALUE 0-255
cpy #96
bmi paddle_left
cpy #160
bmi no_key_store
lda #'K'
jmp save_key
paddle_left:
lda #'J'
jmp save_key
no_key_store:
lda #0 ; no key, so save a zero
save_key:
sta LASTKEY ; save the key to our buffer
bit KEYRESET ; clear the keyboard buffer
rts
;=============================================
; put_sprite
;=============================================
put_sprite:
lda #>tb1_sprite ; hardcoded for tb1 for now
sta INH
lda #<tb1_sprite
sta INL
ldy #0 ; byte 0 is xsize
lda (INL),Y
sta CH
iny
lda (INL),Y ; byte 1 is ysize
sta CV
iny
lda YPOS ; make a copy of ypos
sta TEMPY ; as we modify it
put_sprite_loop:
sty TEMP ; save sprite pointer
ldy TEMPY
lda gr_offsets,Y ; lookup low-res memory address ; 5
clc
adc XPOS ; add in xpos
sta OUTL ; store out low byte of addy ; 3
lda gr_offsets+1,Y ; look up high byte ; 5
sta OUTH ; and store it out ; 3
ldy TEMP ; restore sprite pointer ; 3
ldx CH
put_sprite_pixel:
lda (INL),Y ; get sprite colors
iny ; increment sprite pointer
sty TEMP ; save sprite pointer
ldy #$0
cmp #$0 ; if all zero, transparent
beq put_sprite_done_draw ; don't draw it
sta COLOR ; save color for later
and #$f0 ; check if top nibble zero
bne put_sprite_bottom ; if not skip ahead
lda #$0f ; setup mask
sta MASK
bmi put_sprite_mask
put_sprite_bottom:
lda COLOR ; re-load color
and #$0f ; check if bottom nibble zero
bne put_sprite_all ; if not, skip ahead
lda #$0f
sta MASK ; setup mask
put_sprite_mask:
lda (OUTL),Y ; get color at output
and MASK ; mask off unneeded part
ora COLOR ; or the color in
sta (OUTL),Y ; store it back
jmp put_sprite_done_draw ; we are done
put_sprite_all:
lda COLOR ; load color
sta (OUTL),Y ; and write it out
put_sprite_done_draw:
ldy TEMP ; restore sprite pointer
inc OUTL ; increment output pointer
dex ; decrement x counter
bne put_sprite_pixel ; if not done, keep looping
inc TEMPY ; each line has two y vars
inc TEMPY
dec CV ; decemenet total y count
bne put_sprite_loop ; loop if not done
rts ; return
; waste memory with a lookup table
; maybe faster than using GBASCALC?
gr_offsets:
@ -253,6 +512,11 @@ gr_offsets:
.word $428,$4a8,$528,$5a8,$628,$6a8,$728,$7a8
.word $450,$4d0,$550,$5d0,$650,$6d0,$750,$7d0
tb1_sprite:
.byte $8,$4
.byte $55,$50,$00,$00,$00,$00,$00,$00
.byte $55,$55,$55,$00,$00,$00,$00,$00
.byte $ff,$1f,$4f,$2f,$ff,$22,$20,$00
.byte $5f,$5f,$5f,$5f,$ff,$f2,$f2,$f2
.include "title.inc"