mirror of
https://github.com/deater/dos33fsprogs.git
synced 2024-06-12 11:29:37 +00:00
tfv: more splitting up of utils
This commit is contained in:
parent
b2cfa68e14
commit
56eb315cc9
|
@ -1,552 +0,0 @@
|
||||||
;=====================================================================
|
|
||||||
;= ROUTINES
|
|
||||||
;=====================================================================
|
|
||||||
|
|
||||||
|
|
||||||
clear_screens:
|
|
||||||
;===================================
|
|
||||||
; Clear top/bottom of page 0
|
|
||||||
;===================================
|
|
||||||
|
|
||||||
lda #$0
|
|
||||||
sta DRAW_PAGE
|
|
||||||
jsr clear_top
|
|
||||||
jsr clear_bottom
|
|
||||||
|
|
||||||
;===================================
|
|
||||||
; Clear top/bottom of page 1
|
|
||||||
;===================================
|
|
||||||
|
|
||||||
lda #$4
|
|
||||||
sta DRAW_PAGE
|
|
||||||
jsr clear_top
|
|
||||||
jsr clear_bottom
|
|
||||||
|
|
||||||
rts
|
|
||||||
|
|
||||||
;==========
|
|
||||||
; page_flip
|
|
||||||
;==========
|
|
||||||
|
|
||||||
page_flip:
|
|
||||||
lda DISP_PAGE ; 3
|
|
||||||
beq page_flip_show_1 ; 2nt/3
|
|
||||||
page_flip_show_0:
|
|
||||||
bit PAGE0 ; 4
|
|
||||||
lda #4 ; 2
|
|
||||||
sta DRAW_PAGE ; DRAW_PAGE=1 ; 3
|
|
||||||
lda #0 ; 2
|
|
||||||
sta DISP_PAGE ; DISP_PAGE=0 ; 3
|
|
||||||
rts ; 6
|
|
||||||
page_flip_show_1:
|
|
||||||
bit PAGE1 ; 4
|
|
||||||
sta DRAW_PAGE ; DRAW_PAGE=0 ; 3
|
|
||||||
lda #1 ; 2
|
|
||||||
sta DISP_PAGE ; DISP_PAGE=1 ; 3
|
|
||||||
rts ; 6
|
|
||||||
;====================
|
|
||||||
; DISP_PAGE=0 26
|
|
||||||
; DISP_PAGE=1 24
|
|
||||||
|
|
||||||
;======================
|
|
||||||
; memset
|
|
||||||
;======================
|
|
||||||
; a=value
|
|
||||||
; x=length
|
|
||||||
; MEMPTRL/MEMPTRH is address
|
|
||||||
memset:
|
|
||||||
ldy #0
|
|
||||||
memset_loop:
|
|
||||||
sta MEMPTRL,Y
|
|
||||||
iny
|
|
||||||
dex
|
|
||||||
bne memset_loop
|
|
||||||
rts
|
|
||||||
|
|
||||||
;==========================================================
|
|
||||||
; set_gr_page0
|
|
||||||
;==========================================================
|
|
||||||
;
|
|
||||||
set_gr_page0:
|
|
||||||
;lda #4
|
|
||||||
;sta GR_PAGE
|
|
||||||
bit PAGE0 ; set page 0
|
|
||||||
bit LORES ; Lo-res graphics
|
|
||||||
bit TEXTGR ; mixed gr/text mode
|
|
||||||
bit SET_GR ; set graphics
|
|
||||||
rts
|
|
||||||
|
|
||||||
;==========================================================
|
|
||||||
; 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 ; 4
|
|
||||||
bpl no_button ; 2nt/3
|
|
||||||
lda #' '+128 ; 2
|
|
||||||
jmp save_key ; 3
|
|
||||||
|
|
||||||
no_button:
|
|
||||||
lda KEYPRESS ; 3
|
|
||||||
bpl no_key ; 2nt/3
|
|
||||||
|
|
||||||
figure_out_key:
|
|
||||||
cmp #' '+128 ; the mask destroys space ; 2
|
|
||||||
beq save_key ; so handle it specially ; 2nt/3
|
|
||||||
|
|
||||||
and #$5f ; mask, to make upper-case ; 2
|
|
||||||
check_right_arrow:
|
|
||||||
cmp #$15 ; 2
|
|
||||||
bne check_left_arrow ; 2nt/3
|
|
||||||
lda #'D' ; 2
|
|
||||||
check_left_arrow:
|
|
||||||
cmp #$08 ; 2
|
|
||||||
bne check_up_arrow ; 2nt/3
|
|
||||||
lda #'A' ; 2
|
|
||||||
check_up_arrow:
|
|
||||||
cmp #$0B ; 2
|
|
||||||
bne check_down_arrow ; 2nt/3
|
|
||||||
lda #'W' ; 2
|
|
||||||
check_down_arrow:
|
|
||||||
cmp #$0A ; 2
|
|
||||||
bne check_escape ; 2nt/3
|
|
||||||
lda #'S' ; 2
|
|
||||||
check_escape:
|
|
||||||
cmp #$1B ; 2
|
|
||||||
bne save_key ; 2nt/3
|
|
||||||
lda #'Q' ; 2
|
|
||||||
jmp save_key ; 3
|
|
||||||
|
|
||||||
no_key:
|
|
||||||
bit PADDLE_STATUS ; 3
|
|
||||||
bpl no_key_store ; 2nt/3
|
|
||||||
|
|
||||||
; check for paddle action
|
|
||||||
; code from http://web.pdx.edu/~heiss/technotes/aiie/tn.aiie.06.html
|
|
||||||
|
|
||||||
inc PADDLE_STATUS ; 5
|
|
||||||
lda PADDLE_STATUS ; 3
|
|
||||||
and #$03 ; 2
|
|
||||||
beq check_paddles ; 2nt/3
|
|
||||||
jmp no_key_store ; 3
|
|
||||||
|
|
||||||
check_paddles:
|
|
||||||
lda PADDLE_STATUS ; 3
|
|
||||||
and #$80 ; 2
|
|
||||||
sta PADDLE_STATUS ; 3
|
|
||||||
|
|
||||||
ldx #$0 ; 2
|
|
||||||
LDA PTRIG ;TRIGGER PADDLES ; 4
|
|
||||||
LDY #0 ;INIT COUNTER ; 2
|
|
||||||
NOP ;COMPENSATE FOR 1ST COUNT ; 2
|
|
||||||
NOP ; 2
|
|
||||||
PREAD2: LDA PADDL0,X ;COUNT EVERY 11 uSEC. ; 4
|
|
||||||
BPL RTS2D ;BRANCH WHEN TIMED OUT ; 2nt/3
|
|
||||||
INY ;INCREMENT COUNTER ; 2
|
|
||||||
BNE PREAD2 ;CONTINUE COUNTING ; 2nt/3
|
|
||||||
DEY ;COUNTER OVERFLOWED ; 2
|
|
||||||
RTS2D: ;RETURN W/VALUE 0-255
|
|
||||||
|
|
||||||
cpy #96 ; 2
|
|
||||||
bmi paddle_left ; 2nt/3
|
|
||||||
cpy #160 ; 2
|
|
||||||
bmi no_key_store ; 2nt/3
|
|
||||||
lda #'D' ; 2
|
|
||||||
jmp save_key ; 3
|
|
||||||
paddle_left:
|
|
||||||
lda #'A' ; 2
|
|
||||||
jmp save_key ; 3
|
|
||||||
|
|
||||||
no_key_store:
|
|
||||||
lda #0 ; no key, so save a zero ; 2
|
|
||||||
|
|
||||||
save_key:
|
|
||||||
sta LASTKEY ; save the key to our buffer ; 2
|
|
||||||
bit KEYRESET ; clear the keyboard buffer ; 4
|
|
||||||
rts ; 6
|
|
||||||
;============
|
|
||||||
; 33=nokey
|
|
||||||
; 48=worstkey
|
|
||||||
|
|
||||||
|
|
||||||
;=============================================
|
|
||||||
; put_sprite
|
|
||||||
;=============================================
|
|
||||||
; Sprite to display in INH,INL
|
|
||||||
; Location is XPOS,YPOS
|
|
||||||
; Note, only works if YPOS is multiple of two?
|
|
||||||
|
|
||||||
put_sprite:
|
|
||||||
|
|
||||||
ldy #0 ; byte 0 is xsize ; 2
|
|
||||||
lda (INL),Y ; 5
|
|
||||||
sta CH ; xsize is in CH ; 3
|
|
||||||
iny ; 2
|
|
||||||
|
|
||||||
lda (INL),Y ; byte 1 is ysize ; 5
|
|
||||||
sta CV ; ysize is in CV ; 3
|
|
||||||
iny ; 2
|
|
||||||
|
|
||||||
lda YPOS ; make a copy of ypos ; 3
|
|
||||||
sta TEMPY ; as we modify it ; 3
|
|
||||||
;===========
|
|
||||||
; 28
|
|
||||||
put_sprite_loop:
|
|
||||||
sty TEMP ; save sprite pointer ; 3
|
|
||||||
|
|
||||||
ldy TEMPY ; 3
|
|
||||||
lda gr_offsets,Y ; lookup low-res memory address ; 5
|
|
||||||
clc ; 2
|
|
||||||
adc XPOS ; add in xpos ; 3
|
|
||||||
sta OUTL ; store out low byte of addy ; 3
|
|
||||||
lda gr_offsets+1,Y ; look up high byte ; 5
|
|
||||||
adc DRAW_PAGE ; ; 3
|
|
||||||
sta OUTH ; and store it out ; 3
|
|
||||||
ldy TEMP ; restore sprite pointer ; 3
|
|
||||||
|
|
||||||
; OUTH:OUTL now points at right place
|
|
||||||
|
|
||||||
ldx CH ; load xsize into x ; 3
|
|
||||||
;===========
|
|
||||||
; 36
|
|
||||||
put_sprite_pixel:
|
|
||||||
lda (INL),Y ; get sprite colors ; 5
|
|
||||||
iny ; increment sprite pointer ; 2
|
|
||||||
|
|
||||||
sty TEMP ; save sprite pointer ; 3
|
|
||||||
ldy #$0 ; 2
|
|
||||||
|
|
||||||
; check if completely transparent
|
|
||||||
; if so, skip
|
|
||||||
|
|
||||||
cmp #$0 ; if all zero, transparent ; 2
|
|
||||||
beq put_sprite_done_draw ; don't draw it ; 2nt/3
|
|
||||||
; FIXME: use BIT? ;==============
|
|
||||||
; 17
|
|
||||||
|
|
||||||
sta COLOR ; save color for later ; 3
|
|
||||||
|
|
||||||
; check if top pixel transparent
|
|
||||||
|
|
||||||
and #$f0 ; check if top nibble zero ; 2
|
|
||||||
bne put_sprite_bottom ; if not skip ahead ; 2nt/3
|
|
||||||
|
|
||||||
lda #$f0 ; setup mask ; 2
|
|
||||||
sta MASK ; 3
|
|
||||||
bmi put_sprite_mask ; 2nt/3
|
|
||||||
|
|
||||||
put_sprite_bottom:
|
|
||||||
lda COLOR ; re-load color ; 3
|
|
||||||
and #$0f ; check if bottom nibble zero ; 2
|
|
||||||
bne put_sprite_all ; if not, skip ahead ; 2nt/3
|
|
||||||
lda #$0f ; 2
|
|
||||||
sta MASK ; setup mask ; 3
|
|
||||||
|
|
||||||
put_sprite_mask:
|
|
||||||
lda (OUTL),Y ; get color at output ; 5
|
|
||||||
and MASK ; mask off unneeded part ; 3
|
|
||||||
ora COLOR ; or the color in ; 3
|
|
||||||
sta (OUTL),Y ; store it back ; 5
|
|
||||||
|
|
||||||
jmp put_sprite_done_draw ; we are done ; 3
|
|
||||||
|
|
||||||
put_sprite_all:
|
|
||||||
lda COLOR ; load color ; 3
|
|
||||||
sta (OUTL),Y ; and write it out ; 5
|
|
||||||
|
|
||||||
|
|
||||||
put_sprite_done_draw:
|
|
||||||
|
|
||||||
ldy TEMP ; restore sprite pointer ; 3
|
|
||||||
|
|
||||||
inc OUTL ; increment output pointer ; 5
|
|
||||||
dex ; decrement x counter ; 2
|
|
||||||
bne put_sprite_pixel ; if not done, keep looping ; 2nt/3
|
|
||||||
|
|
||||||
inc TEMPY ; each line has two y vars ; 5
|
|
||||||
inc TEMPY ; 5
|
|
||||||
dec CV ; decemenet total y count ; 5
|
|
||||||
bne put_sprite_loop ; loop if not done ; 2nt/3
|
|
||||||
|
|
||||||
rts ; return ; 6
|
|
||||||
|
|
||||||
|
|
||||||
;================================
|
|
||||||
; htab_vtab
|
|
||||||
;================================
|
|
||||||
; move to CH/CV
|
|
||||||
htab_vtab:
|
|
||||||
lda CV
|
|
||||||
asl
|
|
||||||
tay
|
|
||||||
lda gr_offsets,Y ; lookup low-res memory address
|
|
||||||
clc
|
|
||||||
adc CH ; add in xpos
|
|
||||||
sta BASL ; store out low byte of addy
|
|
||||||
|
|
||||||
lda gr_offsets+1,Y ; look up high byte
|
|
||||||
adc DRAW_PAGE ;
|
|
||||||
sta BASH ; and store it out
|
|
||||||
; BASH:BASL now points at right place
|
|
||||||
|
|
||||||
rts
|
|
||||||
|
|
||||||
;================================
|
|
||||||
; move_and_print
|
|
||||||
;================================
|
|
||||||
; move to CH/CV
|
|
||||||
move_and_print:
|
|
||||||
jsr htab_vtab
|
|
||||||
|
|
||||||
;================================
|
|
||||||
; print_string
|
|
||||||
;================================
|
|
||||||
|
|
||||||
print_string:
|
|
||||||
ldy #0
|
|
||||||
print_string_loop:
|
|
||||||
lda (OUTL),Y
|
|
||||||
beq done_print_string
|
|
||||||
ora #$80
|
|
||||||
sta (BASL),Y
|
|
||||||
iny
|
|
||||||
bne print_string_loop
|
|
||||||
done_print_string:
|
|
||||||
rts
|
|
||||||
|
|
||||||
;====================
|
|
||||||
; point_to_end_string
|
|
||||||
;====================
|
|
||||||
point_to_end_string:
|
|
||||||
iny
|
|
||||||
tya
|
|
||||||
clc
|
|
||||||
adc OUTL
|
|
||||||
sta OUTL
|
|
||||||
lda #0
|
|
||||||
adc OUTH
|
|
||||||
sta OUTH
|
|
||||||
|
|
||||||
rts
|
|
||||||
|
|
||||||
|
|
||||||
;================================
|
|
||||||
; print_both_pages
|
|
||||||
;================================
|
|
||||||
print_both_pages:
|
|
||||||
lda DRAW_PAGE
|
|
||||||
pha
|
|
||||||
|
|
||||||
lda #0
|
|
||||||
sta DRAW_PAGE
|
|
||||||
jsr move_and_print
|
|
||||||
|
|
||||||
lda #4
|
|
||||||
sta DRAW_PAGE
|
|
||||||
jsr move_and_print
|
|
||||||
|
|
||||||
pla
|
|
||||||
sta DRAW_PAGE
|
|
||||||
|
|
||||||
rts ; oops forgot this initially
|
|
||||||
; explains the weird vertical stripes on the screen
|
|
||||||
|
|
||||||
|
|
||||||
;================================
|
|
||||||
; hlin_setup
|
|
||||||
;================================
|
|
||||||
; put address in GBASL/GBASH
|
|
||||||
; Ycoord in A, Xcoord in Y
|
|
||||||
hlin_setup:
|
|
||||||
sty TEMPY ; 3
|
|
||||||
tay ; y=A ; 2
|
|
||||||
lda gr_offsets,Y ; lookup low-res memory address ; 4
|
|
||||||
clc ; 2
|
|
||||||
adc TEMPY ; 3
|
|
||||||
sta GBASL ; 3
|
|
||||||
iny ; 2
|
|
||||||
|
|
||||||
lda gr_offsets,Y ; 4
|
|
||||||
adc DRAW_PAGE ; add in draw page offset ; 3
|
|
||||||
sta GBASH ; 3
|
|
||||||
rts ; 6
|
|
||||||
;===========
|
|
||||||
; 35
|
|
||||||
;================================
|
|
||||||
; hlin_double:
|
|
||||||
;================================
|
|
||||||
; HLIN Y, V2 AT A
|
|
||||||
; Y, X, A trashed
|
|
||||||
; start at Y, draw up to and including X
|
|
||||||
hlin_double:
|
|
||||||
;int hlin_double(int page, int x1, int x2, int at) {
|
|
||||||
|
|
||||||
jsr hlin_setup ; 41
|
|
||||||
|
|
||||||
sec ; 2
|
|
||||||
lda V2 ; 3
|
|
||||||
sbc TEMPY ; 3
|
|
||||||
|
|
||||||
tax ; 2
|
|
||||||
inx ; 2
|
|
||||||
;===========
|
|
||||||
; 53
|
|
||||||
; fallthrough
|
|
||||||
|
|
||||||
;=================================
|
|
||||||
; hlin_double_continue: width
|
|
||||||
;=================================
|
|
||||||
; width in X
|
|
||||||
|
|
||||||
hlin_double_continue:
|
|
||||||
|
|
||||||
ldy #0 ; 2
|
|
||||||
lda COLOR ; 3
|
|
||||||
hlin_double_loop:
|
|
||||||
sta (GBASL),Y ; 6
|
|
||||||
inc GBASL ; 5
|
|
||||||
dex ; 2
|
|
||||||
bne hlin_double_loop ; 2nt/3
|
|
||||||
|
|
||||||
rts ; 6
|
|
||||||
;=============
|
|
||||||
; 53+5+X*16+5
|
|
||||||
|
|
||||||
;================================
|
|
||||||
; hlin_single:
|
|
||||||
;================================
|
|
||||||
; HLIN Y, V2 AT A
|
|
||||||
; Y, X, A trashed
|
|
||||||
hlin_single:
|
|
||||||
|
|
||||||
jsr hlin_setup
|
|
||||||
|
|
||||||
sec
|
|
||||||
lda V2
|
|
||||||
sbc TEMPY
|
|
||||||
|
|
||||||
tax
|
|
||||||
|
|
||||||
; fallthrough
|
|
||||||
|
|
||||||
;=================================
|
|
||||||
; hlin_single_continue: width
|
|
||||||
;=================================
|
|
||||||
; width in X
|
|
||||||
|
|
||||||
hlin_single_continue:
|
|
||||||
|
|
||||||
hlin_single_top:
|
|
||||||
lda COLOR
|
|
||||||
and #$f0
|
|
||||||
sta COLOR
|
|
||||||
|
|
||||||
hlin_single_top_loop:
|
|
||||||
ldy #0
|
|
||||||
lda (GBASL),Y
|
|
||||||
and #$0f
|
|
||||||
ora COLOR
|
|
||||||
sta (GBASL),Y
|
|
||||||
inc GBASL
|
|
||||||
dex
|
|
||||||
bne hlin_single_top_loop
|
|
||||||
|
|
||||||
rts
|
|
||||||
|
|
||||||
hlin_single_bottom:
|
|
||||||
|
|
||||||
lda COLOR
|
|
||||||
and #$0f
|
|
||||||
sta COLOR
|
|
||||||
|
|
||||||
hlin_single_bottom_loop:
|
|
||||||
ldy #0
|
|
||||||
lda (GBASL),Y
|
|
||||||
and #$f0
|
|
||||||
sta (GBASL),Y
|
|
||||||
inc GBASL
|
|
||||||
dex
|
|
||||||
bne hlin_single_bottom_loop
|
|
||||||
|
|
||||||
rts
|
|
||||||
|
|
||||||
|
|
||||||
;=============================
|
|
||||||
; clear_top
|
|
||||||
;=============================
|
|
||||||
clear_top:
|
|
||||||
lda #$00
|
|
||||||
|
|
||||||
;=============================
|
|
||||||
; clear_top_a
|
|
||||||
;=============================
|
|
||||||
clear_top_a:
|
|
||||||
|
|
||||||
sta COLOR
|
|
||||||
|
|
||||||
; VLIN Y, V2 AT A
|
|
||||||
|
|
||||||
lda #40
|
|
||||||
sta V2
|
|
||||||
|
|
||||||
lda #0
|
|
||||||
|
|
||||||
clear_top_loop:
|
|
||||||
ldy #0
|
|
||||||
pha
|
|
||||||
|
|
||||||
jsr hlin_double
|
|
||||||
|
|
||||||
pla
|
|
||||||
clc
|
|
||||||
adc #$2
|
|
||||||
cmp #40
|
|
||||||
bne clear_top_loop
|
|
||||||
|
|
||||||
rts
|
|
||||||
|
|
||||||
clear_bottom:
|
|
||||||
lda #$a0 ; NORMAL space
|
|
||||||
sta COLOR
|
|
||||||
|
|
||||||
lda #40
|
|
||||||
sta V2
|
|
||||||
|
|
||||||
clear_bottom_loop:
|
|
||||||
ldy #0
|
|
||||||
pha
|
|
||||||
|
|
||||||
jsr hlin_double
|
|
||||||
|
|
||||||
pla
|
|
||||||
clc
|
|
||||||
adc #$2
|
|
||||||
cmp #48
|
|
||||||
bne clear_bottom_loop
|
|
||||||
|
|
||||||
rts
|
|
||||||
|
|
||||||
|
|
||||||
; move these to zero page for slight speed increase?
|
|
||||||
gr_offsets:
|
|
||||||
.word $400,$480,$500,$580,$600,$680,$700,$780
|
|
||||||
.word $428,$4a8,$528,$5a8,$628,$6a8,$728,$7a8
|
|
||||||
.word $450,$4d0,$550,$5d0,$650,$6d0,$750,$7d0
|
|
||||||
|
|
14
tfv/Makefile
14
tfv/Makefile
|
@ -56,8 +56,18 @@ TFV: tfv.o
|
||||||
|
|
||||||
tfv.o: tfv.s \
|
tfv.o: tfv.s \
|
||||||
tfv_flying.s tfv_info.s tfv_multiply.s tfv_opener.s tfv_title.s \
|
tfv_flying.s tfv_info.s tfv_multiply.s tfv_opener.s tfv_title.s \
|
||||||
tfv_textentry.s tfv_utils.s tfv_worldmap.s \
|
tfv_textentry.s tfv_worldmap.s \
|
||||||
tfv_backgrounds.inc tfv_sprites.inc tfv_zp.inc
|
tfv_backgrounds.inc tfv_sprites.inc tfv_zp.inc \
|
||||||
|
../asm_routines/hlin_clearscreen.s \
|
||||||
|
../asm_routines/pageflip.s \
|
||||||
|
../asm_routines/gr_setpage.s \
|
||||||
|
../asm_routines/keypress.s \
|
||||||
|
../asm_routines/gr_putsprite.s \
|
||||||
|
../asm_routines/text_print.s \
|
||||||
|
../asm_routines/memset.s \
|
||||||
|
../asm_routines/gr_vlin.s \
|
||||||
|
../asm_routines/gr_copy.s \
|
||||||
|
../asm_routines/gr_unrle.s
|
||||||
ca65 -o tfv.o tfv.s -l tfv.lst
|
ca65 -o tfv.o tfv.s -l tfv.lst
|
||||||
|
|
||||||
|
|
||||||
|
|
12
tfv/tfv.s
12
tfv/tfv.s
|
@ -84,13 +84,23 @@ exit:
|
||||||
;===============================================
|
;===============================================
|
||||||
|
|
||||||
.include "tfv_opener.s"
|
.include "tfv_opener.s"
|
||||||
.include "tfv_utils.s"
|
|
||||||
.include "tfv_title.s"
|
.include "tfv_title.s"
|
||||||
.include "tfv_textentry.s"
|
.include "tfv_textentry.s"
|
||||||
.include "tfv_flying.s"
|
.include "tfv_flying.s"
|
||||||
.include "tfv_worldmap.s"
|
.include "tfv_worldmap.s"
|
||||||
.include "tfv_info.s"
|
.include "tfv_info.s"
|
||||||
|
|
||||||
|
.include "../asm_routines/hlin_clearscreen.s"
|
||||||
|
.include "../asm_routines/pageflip.s"
|
||||||
|
.include "../asm_routines/gr_setpage.s"
|
||||||
|
.include "../asm_routines/keypress.s"
|
||||||
|
.include "../asm_routines/gr_putsprite.s"
|
||||||
|
.include "../asm_routines/text_print.s"
|
||||||
|
.include "../asm_routines/memset.s"
|
||||||
|
.include "../asm_routines/gr_vlin.s"
|
||||||
|
.include "../asm_routines/gr_copy.s"
|
||||||
|
.include "../asm_routines/gr_unrle.s"
|
||||||
|
|
||||||
;===============================================
|
;===============================================
|
||||||
; Variables
|
; Variables
|
||||||
;===============================================
|
;===============================================
|
||||||
|
|
776
tfv/tfv_utils.s
776
tfv/tfv_utils.s
|
@ -1,776 +0,0 @@
|
||||||
;=====================================================================
|
|
||||||
;= ROUTINES
|
|
||||||
;=====================================================================
|
|
||||||
|
|
||||||
|
|
||||||
clear_screens:
|
|
||||||
;===================================
|
|
||||||
; Clear top/bottom of page 0
|
|
||||||
;===================================
|
|
||||||
|
|
||||||
lda #$0
|
|
||||||
sta DRAW_PAGE
|
|
||||||
jsr clear_top
|
|
||||||
jsr clear_bottom
|
|
||||||
|
|
||||||
;===================================
|
|
||||||
; Clear top/bottom of page 1
|
|
||||||
;===================================
|
|
||||||
|
|
||||||
lda #$4
|
|
||||||
sta DRAW_PAGE
|
|
||||||
jsr clear_top
|
|
||||||
jsr clear_bottom
|
|
||||||
|
|
||||||
rts
|
|
||||||
|
|
||||||
;==========
|
|
||||||
; page_flip
|
|
||||||
;==========
|
|
||||||
|
|
||||||
page_flip:
|
|
||||||
lda DISP_PAGE ; 3
|
|
||||||
beq page_flip_show_1 ; 2nt/3
|
|
||||||
page_flip_show_0:
|
|
||||||
bit PAGE0 ; 4
|
|
||||||
lda #4 ; 2
|
|
||||||
sta DRAW_PAGE ; DRAW_PAGE=1 ; 3
|
|
||||||
lda #0 ; 2
|
|
||||||
sta DISP_PAGE ; DISP_PAGE=0 ; 3
|
|
||||||
rts ; 6
|
|
||||||
page_flip_show_1:
|
|
||||||
bit PAGE1 ; 4
|
|
||||||
sta DRAW_PAGE ; DRAW_PAGE=0 ; 3
|
|
||||||
lda #1 ; 2
|
|
||||||
sta DISP_PAGE ; DISP_PAGE=1 ; 3
|
|
||||||
rts ; 6
|
|
||||||
;====================
|
|
||||||
; DISP_PAGE=0 26
|
|
||||||
; DISP_PAGE=1 24
|
|
||||||
|
|
||||||
;======================
|
|
||||||
; memset
|
|
||||||
;======================
|
|
||||||
; a=value
|
|
||||||
; x=length
|
|
||||||
; MEMPTRL/MEMPTRH is address
|
|
||||||
memset:
|
|
||||||
ldy #0
|
|
||||||
memset_loop:
|
|
||||||
sta MEMPTRL,Y
|
|
||||||
iny
|
|
||||||
dex
|
|
||||||
bne memset_loop
|
|
||||||
rts
|
|
||||||
|
|
||||||
|
|
||||||
;=================
|
|
||||||
; load RLE image
|
|
||||||
;=================
|
|
||||||
; Output is BASH/BASL
|
|
||||||
; Input is in GBASH/GBASL
|
|
||||||
load_rle_gr:
|
|
||||||
lda #$0
|
|
||||||
tay ; init Y to 0
|
|
||||||
sta TEMP ; stores the xcoord
|
|
||||||
|
|
||||||
sta CV ; ycoord=0
|
|
||||||
|
|
||||||
jsr load_and_increment ; load xsize
|
|
||||||
sta CH
|
|
||||||
|
|
||||||
rle_loop:
|
|
||||||
jsr load_and_increment
|
|
||||||
|
|
||||||
cmp #$A1 ; if 0xa1
|
|
||||||
beq rle_done ; we are done
|
|
||||||
|
|
||||||
pha
|
|
||||||
|
|
||||||
and #$f0 ; mask
|
|
||||||
cmp #$a0 ; see if special AX
|
|
||||||
beq decompress_special
|
|
||||||
|
|
||||||
pla ; note, PLA sets flags!
|
|
||||||
|
|
||||||
ldx #$1 ; only want to print 1
|
|
||||||
bne decompress_run
|
|
||||||
|
|
||||||
decompress_special:
|
|
||||||
pla
|
|
||||||
|
|
||||||
and #$0f ; check if was A0
|
|
||||||
|
|
||||||
bne decompress_color ; if A0 need to read run, color
|
|
||||||
|
|
||||||
decompress_large:
|
|
||||||
jsr load_and_increment ; get run length
|
|
||||||
|
|
||||||
decompress_color:
|
|
||||||
tax ; put runlen into X
|
|
||||||
jsr load_and_increment ; get color
|
|
||||||
|
|
||||||
decompress_run:
|
|
||||||
rle_run_loop:
|
|
||||||
sta (BASL),y ; write out the value
|
|
||||||
inc BASL ; increment the pointer
|
|
||||||
bne rle_skip3 ; if wrapped
|
|
||||||
inc BASH ; then increment the high value
|
|
||||||
|
|
||||||
rle_skip3:
|
|
||||||
pha ; store colore for later
|
|
||||||
|
|
||||||
inc TEMP ; increment the X value
|
|
||||||
lda TEMP
|
|
||||||
cmp CH ; compare against the image width
|
|
||||||
bcc rle_not_eol ; if less then keep going
|
|
||||||
|
|
||||||
lda BASL ; cheat to avoid a 16-bit add
|
|
||||||
cmp #$a7 ; we are adding 0x58 to get
|
|
||||||
bcc rle_add_skip ; to the next line
|
|
||||||
inc BASH
|
|
||||||
rle_add_skip:
|
|
||||||
clc
|
|
||||||
adc #$58 ; actually do the 0x58 add
|
|
||||||
sta BASL ; and store it back
|
|
||||||
|
|
||||||
inc CV ; add 2 to ypos
|
|
||||||
inc CV ; each "line" is two high
|
|
||||||
|
|
||||||
lda CV ; load value
|
|
||||||
cmp #15 ; if it's greater than 14 it wraps
|
|
||||||
bcc rle_no_wrap ; Thanks Woz
|
|
||||||
|
|
||||||
lda #$0 ; we wrapped, so set to zero
|
|
||||||
sta CV
|
|
||||||
|
|
||||||
; when wrapping have to sub 0x3d8
|
|
||||||
sec ; this is a 16-bit subtract routine
|
|
||||||
lda BASL
|
|
||||||
sbc #$d8 ; LSB
|
|
||||||
sta BASL
|
|
||||||
lda BASH ; MSB
|
|
||||||
sbc #$3 ;
|
|
||||||
sta BASH
|
|
||||||
|
|
||||||
rle_no_wrap:
|
|
||||||
lda #$0 ; set X value back to zero
|
|
||||||
sta TEMP
|
|
||||||
|
|
||||||
rle_not_eol:
|
|
||||||
pla ; restore color
|
|
||||||
dex
|
|
||||||
bne rle_run_loop ; if not zero, keep looping
|
|
||||||
beq rle_loop ; and branch always
|
|
||||||
|
|
||||||
rle_done:
|
|
||||||
lda #$15 ; move the cursor somewhere sane
|
|
||||||
sta CV
|
|
||||||
rts
|
|
||||||
|
|
||||||
|
|
||||||
load_and_increment:
|
|
||||||
lda (GBASL),y ; load value ; 5?
|
|
||||||
inc GBASL ; 5?
|
|
||||||
bne lskip2 ; 2nt/3
|
|
||||||
inc GBASH ; 5?
|
|
||||||
lskip2:
|
|
||||||
rts ; 6
|
|
||||||
|
|
||||||
|
|
||||||
;==========================================================
|
|
||||||
; set_text_page0
|
|
||||||
;==========================================================
|
|
||||||
;
|
|
||||||
set_text_page0:
|
|
||||||
bit PAGE0 ; set page0
|
|
||||||
bit TEXT ; set text mode
|
|
||||||
rts
|
|
||||||
|
|
||||||
;==========================================================
|
|
||||||
; set_gr_page0
|
|
||||||
;==========================================================
|
|
||||||
;
|
|
||||||
set_gr_page0:
|
|
||||||
;lda #4
|
|
||||||
;sta GR_PAGE
|
|
||||||
bit PAGE0 ; set page 0
|
|
||||||
bit LORES ; Lo-res graphics
|
|
||||||
bit TEXTGR ; mixed gr/text mode
|
|
||||||
bit SET_GR ; set graphics
|
|
||||||
rts
|
|
||||||
|
|
||||||
;=========================================================
|
|
||||||
; gr_copy_to_current
|
|
||||||
;=========================================================
|
|
||||||
; copy 0xc00 to DRAW_PAGE
|
|
||||||
; 2 + 8*38 + 4*80*23 + 4*120*26 + 13 = 20,159 = 20ms = 50Hz
|
|
||||||
;
|
|
||||||
gr_copy_to_current:
|
|
||||||
ldx #0 ; set y to zero ; 2
|
|
||||||
|
|
||||||
gr_copy_loop:
|
|
||||||
stx TEMP ; save y ; 3
|
|
||||||
txa ; move to A ; 2
|
|
||||||
asl ; mult by 2 ; 2
|
|
||||||
tay ; put into Y ; 2
|
|
||||||
lda gr_offsets,Y ; lookup low byte for line addr ; 5
|
|
||||||
sta OUTL ; out and in are the same ; 3
|
|
||||||
sta INL ; 3
|
|
||||||
lda gr_offsets+1,Y ; lookup high byte for line addr ; 5
|
|
||||||
adc DRAW_PAGE
|
|
||||||
sta OUTH ; 3
|
|
||||||
lda gr_offsets+1,Y ; lookup high byte for line addr ; 5
|
|
||||||
adc #$8 ; for now, fixed 0xc ; 2
|
|
||||||
sta INH ; 3
|
|
||||||
ldx TEMP ; restore y ; 3
|
|
||||||
|
|
||||||
ldy #0 ; set X counter to 0 ; 2
|
|
||||||
gr_copy_line:
|
|
||||||
lda (INL),Y ; load a byte ; 5
|
|
||||||
sta (OUTL),Y ; store a byte ; 6
|
|
||||||
iny ; increment pointer ; 2
|
|
||||||
|
|
||||||
cpx #$4 ; don't want to copy bottom 4*40 ; 2
|
|
||||||
bcs gr_copy_above4 ; 3
|
|
||||||
|
|
||||||
gr_copy_below4:
|
|
||||||
cpy #120 ; for early ones, copy 120 bytes ; 2
|
|
||||||
bne gr_copy_line ; 3
|
|
||||||
beq gr_copy_line_done ; 3
|
|
||||||
|
|
||||||
gr_copy_above4: ; for last four, just copy 80 bytes
|
|
||||||
cpy #80 ; 2
|
|
||||||
bne gr_copy_line ; 3
|
|
||||||
|
|
||||||
gr_copy_line_done:
|
|
||||||
inx ; increment y value ; 2
|
|
||||||
cpx #8 ; there are 8 of them ; 2
|
|
||||||
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 ; 4
|
|
||||||
bpl no_button ; 2nt/3
|
|
||||||
lda #' '+128 ; 2
|
|
||||||
jmp save_key ; 3
|
|
||||||
|
|
||||||
no_button:
|
|
||||||
lda KEYPRESS ; 3
|
|
||||||
bpl no_key ; 2nt/3
|
|
||||||
|
|
||||||
figure_out_key:
|
|
||||||
cmp #' '+128 ; the mask destroys space ; 2
|
|
||||||
beq save_key ; so handle it specially ; 2nt/3
|
|
||||||
|
|
||||||
and #$5f ; mask, to make upper-case ; 2
|
|
||||||
check_right_arrow:
|
|
||||||
cmp #$15 ; 2
|
|
||||||
bne check_left_arrow ; 2nt/3
|
|
||||||
lda #'D' ; 2
|
|
||||||
check_left_arrow:
|
|
||||||
cmp #$08 ; 2
|
|
||||||
bne check_up_arrow ; 2nt/3
|
|
||||||
lda #'A' ; 2
|
|
||||||
check_up_arrow:
|
|
||||||
cmp #$0B ; 2
|
|
||||||
bne check_down_arrow ; 2nt/3
|
|
||||||
lda #'W' ; 2
|
|
||||||
check_down_arrow:
|
|
||||||
cmp #$0A ; 2
|
|
||||||
bne check_escape ; 2nt/3
|
|
||||||
lda #'S' ; 2
|
|
||||||
check_escape:
|
|
||||||
cmp #$1B ; 2
|
|
||||||
bne save_key ; 2nt/3
|
|
||||||
lda #'Q' ; 2
|
|
||||||
jmp save_key ; 3
|
|
||||||
|
|
||||||
no_key:
|
|
||||||
bit PADDLE_STATUS ; 3
|
|
||||||
bpl no_key_store ; 2nt/3
|
|
||||||
|
|
||||||
; check for paddle action
|
|
||||||
; code from http://web.pdx.edu/~heiss/technotes/aiie/tn.aiie.06.html
|
|
||||||
|
|
||||||
inc PADDLE_STATUS ; 5
|
|
||||||
lda PADDLE_STATUS ; 3
|
|
||||||
and #$03 ; 2
|
|
||||||
beq check_paddles ; 2nt/3
|
|
||||||
jmp no_key_store ; 3
|
|
||||||
|
|
||||||
check_paddles:
|
|
||||||
lda PADDLE_STATUS ; 3
|
|
||||||
and #$80 ; 2
|
|
||||||
sta PADDLE_STATUS ; 3
|
|
||||||
|
|
||||||
ldx #$0 ; 2
|
|
||||||
LDA PTRIG ;TRIGGER PADDLES ; 4
|
|
||||||
LDY #0 ;INIT COUNTER ; 2
|
|
||||||
NOP ;COMPENSATE FOR 1ST COUNT ; 2
|
|
||||||
NOP ; 2
|
|
||||||
PREAD2: LDA PADDL0,X ;COUNT EVERY 11 uSEC. ; 4
|
|
||||||
BPL RTS2D ;BRANCH WHEN TIMED OUT ; 2nt/3
|
|
||||||
INY ;INCREMENT COUNTER ; 2
|
|
||||||
BNE PREAD2 ;CONTINUE COUNTING ; 2nt/3
|
|
||||||
DEY ;COUNTER OVERFLOWED ; 2
|
|
||||||
RTS2D: ;RETURN W/VALUE 0-255
|
|
||||||
|
|
||||||
cpy #96 ; 2
|
|
||||||
bmi paddle_left ; 2nt/3
|
|
||||||
cpy #160 ; 2
|
|
||||||
bmi no_key_store ; 2nt/3
|
|
||||||
lda #'D' ; 2
|
|
||||||
jmp save_key ; 3
|
|
||||||
paddle_left:
|
|
||||||
lda #'A' ; 2
|
|
||||||
jmp save_key ; 3
|
|
||||||
|
|
||||||
no_key_store:
|
|
||||||
lda #0 ; no key, so save a zero ; 2
|
|
||||||
|
|
||||||
save_key:
|
|
||||||
sta LASTKEY ; save the key to our buffer ; 2
|
|
||||||
bit KEYRESET ; clear the keyboard buffer ; 4
|
|
||||||
rts ; 6
|
|
||||||
;============
|
|
||||||
; 33=nokey
|
|
||||||
; 48=worstkey
|
|
||||||
|
|
||||||
|
|
||||||
;=============================================
|
|
||||||
; put_sprite
|
|
||||||
;=============================================
|
|
||||||
; Sprite to display in INH,INL
|
|
||||||
; Location is XPOS,YPOS
|
|
||||||
; Note, only works if YPOS is multiple of two?
|
|
||||||
|
|
||||||
put_sprite:
|
|
||||||
|
|
||||||
ldy #0 ; byte 0 is xsize ; 2
|
|
||||||
lda (INL),Y ; 5
|
|
||||||
sta CH ; xsize is in CH ; 3
|
|
||||||
iny ; 2
|
|
||||||
|
|
||||||
lda (INL),Y ; byte 1 is ysize ; 5
|
|
||||||
sta CV ; ysize is in CV ; 3
|
|
||||||
iny ; 2
|
|
||||||
|
|
||||||
lda YPOS ; make a copy of ypos ; 3
|
|
||||||
sta TEMPY ; as we modify it ; 3
|
|
||||||
;===========
|
|
||||||
; 28
|
|
||||||
put_sprite_loop:
|
|
||||||
sty TEMP ; save sprite pointer ; 3
|
|
||||||
|
|
||||||
ldy TEMPY ; 3
|
|
||||||
lda gr_offsets,Y ; lookup low-res memory address ; 5
|
|
||||||
clc ; 2
|
|
||||||
adc XPOS ; add in xpos ; 3
|
|
||||||
sta OUTL ; store out low byte of addy ; 3
|
|
||||||
lda gr_offsets+1,Y ; look up high byte ; 5
|
|
||||||
adc DRAW_PAGE ; ; 3
|
|
||||||
sta OUTH ; and store it out ; 3
|
|
||||||
ldy TEMP ; restore sprite pointer ; 3
|
|
||||||
|
|
||||||
; OUTH:OUTL now points at right place
|
|
||||||
|
|
||||||
ldx CH ; load xsize into x ; 3
|
|
||||||
;===========
|
|
||||||
; 36
|
|
||||||
put_sprite_pixel:
|
|
||||||
lda (INL),Y ; get sprite colors ; 5
|
|
||||||
iny ; increment sprite pointer ; 2
|
|
||||||
|
|
||||||
sty TEMP ; save sprite pointer ; 3
|
|
||||||
ldy #$0 ; 2
|
|
||||||
|
|
||||||
; check if completely transparent
|
|
||||||
; if so, skip
|
|
||||||
|
|
||||||
cmp #$0 ; if all zero, transparent ; 2
|
|
||||||
beq put_sprite_done_draw ; don't draw it ; 2nt/3
|
|
||||||
; FIXME: use BIT? ;==============
|
|
||||||
; 17
|
|
||||||
|
|
||||||
sta COLOR ; save color for later ; 3
|
|
||||||
|
|
||||||
; check if top pixel transparent
|
|
||||||
|
|
||||||
and #$f0 ; check if top nibble zero ; 2
|
|
||||||
bne put_sprite_bottom ; if not skip ahead ; 2nt/3
|
|
||||||
|
|
||||||
lda #$f0 ; setup mask ; 2
|
|
||||||
sta MASK ; 3
|
|
||||||
bmi put_sprite_mask ; 2nt/3
|
|
||||||
|
|
||||||
put_sprite_bottom:
|
|
||||||
lda COLOR ; re-load color ; 3
|
|
||||||
and #$0f ; check if bottom nibble zero ; 2
|
|
||||||
bne put_sprite_all ; if not, skip ahead ; 2nt/3
|
|
||||||
lda #$0f ; 2
|
|
||||||
sta MASK ; setup mask ; 3
|
|
||||||
|
|
||||||
put_sprite_mask:
|
|
||||||
lda (OUTL),Y ; get color at output ; 5
|
|
||||||
and MASK ; mask off unneeded part ; 3
|
|
||||||
ora COLOR ; or the color in ; 3
|
|
||||||
sta (OUTL),Y ; store it back ; 5
|
|
||||||
|
|
||||||
jmp put_sprite_done_draw ; we are done ; 3
|
|
||||||
|
|
||||||
put_sprite_all:
|
|
||||||
lda COLOR ; load color ; 3
|
|
||||||
sta (OUTL),Y ; and write it out ; 5
|
|
||||||
|
|
||||||
|
|
||||||
put_sprite_done_draw:
|
|
||||||
|
|
||||||
ldy TEMP ; restore sprite pointer ; 3
|
|
||||||
|
|
||||||
inc OUTL ; increment output pointer ; 5
|
|
||||||
dex ; decrement x counter ; 2
|
|
||||||
bne put_sprite_pixel ; if not done, keep looping ; 2nt/3
|
|
||||||
|
|
||||||
inc TEMPY ; each line has two y vars ; 5
|
|
||||||
inc TEMPY ; 5
|
|
||||||
dec CV ; decemenet total y count ; 5
|
|
||||||
bne put_sprite_loop ; loop if not done ; 2nt/3
|
|
||||||
|
|
||||||
rts ; return ; 6
|
|
||||||
|
|
||||||
|
|
||||||
;================================
|
|
||||||
; htab_vtab
|
|
||||||
;================================
|
|
||||||
; move to CH/CV
|
|
||||||
htab_vtab:
|
|
||||||
lda CV
|
|
||||||
asl
|
|
||||||
tay
|
|
||||||
lda gr_offsets,Y ; lookup low-res memory address
|
|
||||||
clc
|
|
||||||
adc CH ; add in xpos
|
|
||||||
sta BASL ; store out low byte of addy
|
|
||||||
|
|
||||||
lda gr_offsets+1,Y ; look up high byte
|
|
||||||
adc DRAW_PAGE ;
|
|
||||||
sta BASH ; and store it out
|
|
||||||
; BASH:BASL now points at right place
|
|
||||||
|
|
||||||
rts
|
|
||||||
|
|
||||||
;================================
|
|
||||||
; move_and_print
|
|
||||||
;================================
|
|
||||||
; move to CH/CV
|
|
||||||
move_and_print:
|
|
||||||
jsr htab_vtab
|
|
||||||
|
|
||||||
;================================
|
|
||||||
; print_string
|
|
||||||
;================================
|
|
||||||
|
|
||||||
print_string:
|
|
||||||
ldy #0
|
|
||||||
print_string_loop:
|
|
||||||
lda (OUTL),Y
|
|
||||||
beq done_print_string
|
|
||||||
ora #$80
|
|
||||||
sta (BASL),Y
|
|
||||||
iny
|
|
||||||
bne print_string_loop
|
|
||||||
done_print_string:
|
|
||||||
rts
|
|
||||||
|
|
||||||
;====================
|
|
||||||
; point_to_end_string
|
|
||||||
;====================
|
|
||||||
point_to_end_string:
|
|
||||||
iny
|
|
||||||
tya
|
|
||||||
clc
|
|
||||||
adc OUTL
|
|
||||||
sta OUTL
|
|
||||||
lda #0
|
|
||||||
adc OUTH
|
|
||||||
sta OUTH
|
|
||||||
|
|
||||||
rts
|
|
||||||
|
|
||||||
|
|
||||||
;================================
|
|
||||||
; print_both_pages
|
|
||||||
;================================
|
|
||||||
print_both_pages:
|
|
||||||
lda DRAW_PAGE
|
|
||||||
pha
|
|
||||||
|
|
||||||
lda #0
|
|
||||||
sta DRAW_PAGE
|
|
||||||
jsr move_and_print
|
|
||||||
|
|
||||||
lda #4
|
|
||||||
sta DRAW_PAGE
|
|
||||||
jsr move_and_print
|
|
||||||
|
|
||||||
pla
|
|
||||||
sta DRAW_PAGE
|
|
||||||
|
|
||||||
rts ; oops forgot this initially
|
|
||||||
; explains the weird vertical stripes on the screen
|
|
||||||
|
|
||||||
;=========================================
|
|
||||||
; vlin
|
|
||||||
;=========================================
|
|
||||||
; X, V2 at Y
|
|
||||||
vlin:
|
|
||||||
|
|
||||||
sty TEMPY ; save Y (x location)
|
|
||||||
vlin_loop:
|
|
||||||
|
|
||||||
txa ; a=x (get first y)
|
|
||||||
and #$fe ; Clear bottom bit
|
|
||||||
tay ;
|
|
||||||
lda gr_offsets,Y ; lookup low-res memory address low
|
|
||||||
sta GBASL ; put it into our indirect pointer
|
|
||||||
iny
|
|
||||||
lda gr_offsets,Y ; lookup low-res memory address high
|
|
||||||
clc
|
|
||||||
adc DRAW_PAGE ; add in draw page offset
|
|
||||||
sta GBASH ; put into top of indirect
|
|
||||||
|
|
||||||
ldy TEMPY ; load back in y (x offset)
|
|
||||||
|
|
||||||
txa ; load back in x (current y)
|
|
||||||
lsr ; check the low bit
|
|
||||||
bcc vlin_low ; if not set, skip to low
|
|
||||||
|
|
||||||
vlin_high:
|
|
||||||
lda #$F0 ; setup masks
|
|
||||||
sta MASK
|
|
||||||
lda #$0f
|
|
||||||
bcs vlin_too_slow
|
|
||||||
|
|
||||||
vlin_low: ; setup masks
|
|
||||||
lda #$0f
|
|
||||||
sta MASK
|
|
||||||
lda #$f0
|
|
||||||
vlin_too_slow:
|
|
||||||
|
|
||||||
and (GBASL),Y ; mask current byte
|
|
||||||
sta (GBASL),Y ; and store back
|
|
||||||
|
|
||||||
lda MASK ; mask the color
|
|
||||||
and COLOR
|
|
||||||
ora (GBASL),Y ; or into the right place
|
|
||||||
sta (GBASL),Y ; store it
|
|
||||||
|
|
||||||
inx ; increment X (current y)
|
|
||||||
cpx V2 ; compare to the limit
|
|
||||||
bcc vlin_loop ; if <= then loop
|
|
||||||
|
|
||||||
rts ; return
|
|
||||||
|
|
||||||
|
|
||||||
;================================
|
|
||||||
; hlin_setup
|
|
||||||
;================================
|
|
||||||
; put address in GBASL/GBASH
|
|
||||||
; Ycoord in A, Xcoord in Y
|
|
||||||
hlin_setup:
|
|
||||||
sty TEMPY ; 3
|
|
||||||
tay ; y=A ; 2
|
|
||||||
lda gr_offsets,Y ; lookup low-res memory address ; 4
|
|
||||||
clc ; 2
|
|
||||||
adc TEMPY ; 3
|
|
||||||
sta GBASL ; 3
|
|
||||||
iny ; 2
|
|
||||||
|
|
||||||
lda gr_offsets,Y ; 4
|
|
||||||
adc DRAW_PAGE ; add in draw page offset ; 3
|
|
||||||
sta GBASH ; 3
|
|
||||||
rts ; 6
|
|
||||||
;===========
|
|
||||||
; 35
|
|
||||||
;================================
|
|
||||||
; hlin_double:
|
|
||||||
;================================
|
|
||||||
; HLIN Y, V2 AT A
|
|
||||||
; Y, X, A trashed
|
|
||||||
; start at Y, draw up to and including X
|
|
||||||
hlin_double:
|
|
||||||
;int hlin_double(int page, int x1, int x2, int at) {
|
|
||||||
|
|
||||||
jsr hlin_setup ; 41
|
|
||||||
|
|
||||||
sec ; 2
|
|
||||||
lda V2 ; 3
|
|
||||||
sbc TEMPY ; 3
|
|
||||||
|
|
||||||
tax ; 2
|
|
||||||
inx ; 2
|
|
||||||
;===========
|
|
||||||
; 53
|
|
||||||
; fallthrough
|
|
||||||
|
|
||||||
;=================================
|
|
||||||
; hlin_double_continue: width
|
|
||||||
;=================================
|
|
||||||
; width in X
|
|
||||||
|
|
||||||
hlin_double_continue:
|
|
||||||
|
|
||||||
ldy #0 ; 2
|
|
||||||
lda COLOR ; 3
|
|
||||||
hlin_double_loop:
|
|
||||||
sta (GBASL),Y ; 6
|
|
||||||
inc GBASL ; 5
|
|
||||||
dex ; 2
|
|
||||||
bne hlin_double_loop ; 2nt/3
|
|
||||||
|
|
||||||
rts ; 6
|
|
||||||
;=============
|
|
||||||
; 53+5+X*16+5
|
|
||||||
|
|
||||||
;================================
|
|
||||||
; hlin_single:
|
|
||||||
;================================
|
|
||||||
; HLIN Y, V2 AT A
|
|
||||||
; Y, X, A trashed
|
|
||||||
hlin_single:
|
|
||||||
|
|
||||||
jsr hlin_setup
|
|
||||||
|
|
||||||
sec
|
|
||||||
lda V2
|
|
||||||
sbc TEMPY
|
|
||||||
|
|
||||||
tax
|
|
||||||
|
|
||||||
; fallthrough
|
|
||||||
|
|
||||||
;=================================
|
|
||||||
; hlin_single_continue: width
|
|
||||||
;=================================
|
|
||||||
; width in X
|
|
||||||
|
|
||||||
hlin_single_continue:
|
|
||||||
|
|
||||||
hlin_single_top:
|
|
||||||
lda COLOR
|
|
||||||
and #$f0
|
|
||||||
sta COLOR
|
|
||||||
|
|
||||||
hlin_single_top_loop:
|
|
||||||
ldy #0
|
|
||||||
lda (GBASL),Y
|
|
||||||
and #$0f
|
|
||||||
ora COLOR
|
|
||||||
sta (GBASL),Y
|
|
||||||
inc GBASL
|
|
||||||
dex
|
|
||||||
bne hlin_single_top_loop
|
|
||||||
|
|
||||||
rts
|
|
||||||
|
|
||||||
hlin_single_bottom:
|
|
||||||
|
|
||||||
lda COLOR
|
|
||||||
and #$0f
|
|
||||||
sta COLOR
|
|
||||||
|
|
||||||
hlin_single_bottom_loop:
|
|
||||||
ldy #0
|
|
||||||
lda (GBASL),Y
|
|
||||||
and #$f0
|
|
||||||
sta (GBASL),Y
|
|
||||||
inc GBASL
|
|
||||||
dex
|
|
||||||
bne hlin_single_bottom_loop
|
|
||||||
|
|
||||||
rts
|
|
||||||
|
|
||||||
|
|
||||||
;=============================
|
|
||||||
; clear_top
|
|
||||||
;=============================
|
|
||||||
clear_top:
|
|
||||||
lda #$00
|
|
||||||
|
|
||||||
;=============================
|
|
||||||
; clear_top_a
|
|
||||||
;=============================
|
|
||||||
clear_top_a:
|
|
||||||
|
|
||||||
sta COLOR
|
|
||||||
|
|
||||||
; VLIN Y, V2 AT A
|
|
||||||
|
|
||||||
lda #40
|
|
||||||
sta V2
|
|
||||||
|
|
||||||
lda #0
|
|
||||||
|
|
||||||
clear_top_loop:
|
|
||||||
ldy #0
|
|
||||||
pha
|
|
||||||
|
|
||||||
jsr hlin_double
|
|
||||||
|
|
||||||
pla
|
|
||||||
clc
|
|
||||||
adc #$2
|
|
||||||
cmp #40
|
|
||||||
bne clear_top_loop
|
|
||||||
|
|
||||||
rts
|
|
||||||
|
|
||||||
clear_bottom:
|
|
||||||
lda #$a0 ; NORMAL space
|
|
||||||
sta COLOR
|
|
||||||
|
|
||||||
lda #40
|
|
||||||
sta V2
|
|
||||||
|
|
||||||
clear_bottom_loop:
|
|
||||||
ldy #0
|
|
||||||
pha
|
|
||||||
|
|
||||||
jsr hlin_double
|
|
||||||
|
|
||||||
pla
|
|
||||||
clc
|
|
||||||
adc #$2
|
|
||||||
cmp #48
|
|
||||||
bne clear_bottom_loop
|
|
||||||
|
|
||||||
rts
|
|
||||||
|
|
||||||
; move these to zero page for slight speed increase?
|
|
||||||
gr_offsets:
|
|
||||||
.word $400,$480,$500,$580,$600,$680,$700,$780
|
|
||||||
.word $428,$4a8,$528,$5a8,$628,$6a8,$728,$7a8
|
|
||||||
.word $450,$4d0,$550,$5d0,$650,$6d0,$750,$7d0
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user