mirror of
https://github.com/deater/dos33fsprogs.git
synced 2025-08-15 08:27:41 +00:00
outline: demo: more tuning
This commit is contained in:
@@ -19,7 +19,7 @@ outline2021.dsk: QBOOT QLOAD OUTLINE
|
|||||||
$(DOS33_RAW) outline2021.dsk 0 2 QBOOT 1 1
|
$(DOS33_RAW) outline2021.dsk 0 2 QBOOT 1 1
|
||||||
$(DOS33_RAW) outline2021.dsk 0 4 QBOOT 2 1
|
$(DOS33_RAW) outline2021.dsk 0 4 QBOOT 2 1
|
||||||
$(DOS33_RAW) outline2021.dsk 1 0 QLOAD 0 14
|
$(DOS33_RAW) outline2021.dsk 1 0 QLOAD 0 14
|
||||||
$(DOS33_RAW) outline2021.dsk 2 0 OUTLINE 0 96
|
$(DOS33_RAW) outline2021.dsk 2 0 OUTLINE 0 0
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -61,5 +61,5 @@ outline.o: outline.s zp.inc \
|
|||||||
###
|
###
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
rm -f *~ *.o *.lst HELLO OUTLINE
|
rm -f *~ *.o *.lst HELLO OUTLINE QLOAD QBOOT
|
||||||
|
|
||||||
|
@@ -21,7 +21,9 @@ rocket.inc: \
|
|||||||
ashore13.lzsa ashore14.lzsa ashore15.lzsa ashore16.lzsa \
|
ashore13.lzsa ashore14.lzsa ashore15.lzsa ashore16.lzsa \
|
||||||
ashore17.lzsa ashore18.lzsa ashore19.lzsa ashore20.lzsa \
|
ashore17.lzsa ashore18.lzsa ashore19.lzsa ashore20.lzsa \
|
||||||
ashore21.lzsa ashore22.lzsa ashore23.lzsa ashore24.lzsa \
|
ashore21.lzsa ashore22.lzsa ashore23.lzsa ashore24.lzsa \
|
||||||
clock_n.lzsa tree5_n.lzsa tree4_n.lzsa tree2_n.lzsa tree1_n.lzsa \
|
clock_e.lzsa blank.lzsa \
|
||||||
|
clock_n.lzsa \
|
||||||
|
tree5_n.lzsa tree4_n.lzsa tree2_n.lzsa tree1_n.lzsa \
|
||||||
pool_n.lzsa step_top_n.lzsa pad_n.lzsa spaceship_path_w.lzsa \
|
pool_n.lzsa step_top_n.lzsa pad_n.lzsa spaceship_path_w.lzsa \
|
||||||
spaceship_far_n.lzsa spaceship_switch_n.lzsa spaceship_door_n.lzsa \
|
spaceship_far_n.lzsa spaceship_switch_n.lzsa spaceship_door_n.lzsa \
|
||||||
spaceship_door_open.lzsa \
|
spaceship_door_open.lzsa \
|
||||||
@@ -62,6 +64,8 @@ rocket.inc: \
|
|||||||
echo "ashore22_lzsa: .incbin \"ashore22.lzsa\"" >> rocket.inc
|
echo "ashore22_lzsa: .incbin \"ashore22.lzsa\"" >> rocket.inc
|
||||||
echo "ashore23_lzsa: .incbin \"ashore23.lzsa\"" >> rocket.inc
|
echo "ashore23_lzsa: .incbin \"ashore23.lzsa\"" >> rocket.inc
|
||||||
echo "ashore24_lzsa: .incbin \"ashore24.lzsa\"" >> rocket.inc
|
echo "ashore24_lzsa: .incbin \"ashore24.lzsa\"" >> rocket.inc
|
||||||
|
echo "clock_e_lzsa: .incbin \"clock_e.lzsa\"" >> rocket.inc
|
||||||
|
echo "blank_lzsa: .incbin \"blank.lzsa\"" >> rocket.inc
|
||||||
echo "clock_n_lzsa: .incbin \"clock_n.lzsa\"" >> rocket.inc
|
echo "clock_n_lzsa: .incbin \"clock_n.lzsa\"" >> rocket.inc
|
||||||
echo "tree5_n_lzsa: .incbin \"tree5_n.lzsa\"" >> rocket.inc
|
echo "tree5_n_lzsa: .incbin \"tree5_n.lzsa\"" >> rocket.inc
|
||||||
echo "tree4_n_lzsa: .incbin \"tree4_n.lzsa\"" >> rocket.inc
|
echo "tree4_n_lzsa: .incbin \"tree4_n.lzsa\"" >> rocket.inc
|
||||||
|
BIN
demos/outline2021/demo/animation/clock_e.png
Normal file
BIN
demos/outline2021/demo/animation/clock_e.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 966 B |
@@ -36,43 +36,45 @@ another_mist:
|
|||||||
another_sequence:
|
another_sequence:
|
||||||
.byte 255 ; load to bg
|
.byte 255 ; load to bg
|
||||||
.word ootw_uboot_bg_lzsa ; this
|
.word ootw_uboot_bg_lzsa ; this
|
||||||
.byte 128+5 ; .word ootw_uboot_flash1_lzsa ; (3)
|
.byte 128+5 ; .word ootw_uboot_flash1_lzsa ; (3)
|
||||||
.byte 128+5 ; .word ootw_uboot_flash2_lzsa ; (3)
|
.byte 128+5 ; .word ootw_uboot_flash2_lzsa ; (3)
|
||||||
.byte 128+8 ; .word swim01_lzsa ; (3)
|
.byte 128+30 ; .word swim01_lzsa ; (3)
|
||||||
.byte 128+8 ; .word swim02_lzsa ; (3)
|
.byte 128+20 ; .word swim02_lzsa ; (3)
|
||||||
.byte 128+8 ; .word swim03_lzsa ; (3)
|
.byte 128+20 ; .word swim03_lzsa ; (3)
|
||||||
.byte 128+8 ; .word swim04_lzsa ; (3)
|
.byte 128+20 ; .word swim04_lzsa ; (3)
|
||||||
.byte 128+8 ; .word swim05_lzsa ; (3)
|
.byte 128+20 ; .word swim05_lzsa ; (3)
|
||||||
.byte 128+8 ; .word swim06_lzsa ; (3)
|
.byte 128+20 ; .word swim06_lzsa ; (3)
|
||||||
.byte 255 ; load to bg
|
.byte 255 ; load to bg
|
||||||
.word another_pool_lzsa ; this
|
.word another_pool_lzsa ; this
|
||||||
.byte 128+50; .word ashore01
|
.byte 128+40; .word ashore01
|
||||||
.byte 128+50; .word ashore02
|
.byte 128+40; .word ashore02
|
||||||
.byte 128+50; .word ashore03
|
.byte 128+40; .word ashore03
|
||||||
.byte 128+50; .word ashore04
|
.byte 128+40; .word ashore04
|
||||||
.byte 128+50; .word ashore05
|
.byte 128+40; .word ashore05
|
||||||
.byte 128+50; .word ashore06
|
.byte 128+40; .word ashore06
|
||||||
.byte 128+50; .word ashore07
|
.byte 128+40; .word ashore07
|
||||||
.byte 128+50; .word ashore08
|
.byte 128+40; .word ashore08
|
||||||
.byte 128+50; .word ashore09
|
.byte 128+40; .word ashore09
|
||||||
.byte 128+50; .word ashore10
|
.byte 128+40; .word ashore10
|
||||||
.byte 128+50; .word ashore11
|
.byte 128+40; .word ashore11
|
||||||
.byte 128+50; .word ashore12
|
.byte 128+40; .word ashore12
|
||||||
.byte 128+50; .word ashore13
|
.byte 128+40; .word ashore13
|
||||||
.byte 128+50; .word ashore14
|
.byte 128+40; .word ashore14
|
||||||
.byte 128+50; .word ashore15
|
.byte 128+40; .word ashore15
|
||||||
.byte 128+50; .word ashore16
|
.byte 128+40; .word ashore16
|
||||||
.byte 128+50; .word ashore17
|
.byte 128+40; .word ashore17
|
||||||
.byte 128+50; .word ashore18
|
.byte 128+40; .word ashore18
|
||||||
.byte 128+50; .word ashore19
|
.byte 128+40; .word ashore19
|
||||||
.byte 128+50; .word ashore20
|
.byte 128+40; .word ashore20
|
||||||
.byte 128+50; .word ashore21
|
.byte 128+40; .word ashore21
|
||||||
.byte 128+50; .word ashore22
|
.byte 128+40; .word ashore22
|
||||||
.byte 128+50; .word ashore23
|
.byte 128+40; .word ashore23
|
||||||
.byte 128+50; .word ashore24
|
.byte 128+40; .word ashore24
|
||||||
|
|
||||||
.byte 255 ; load to bg
|
.byte 255 ; load to bg
|
||||||
.word clock_n_lzsa ; this
|
.word clock_e_lzsa ; this
|
||||||
|
.byte 128+90; .word blank
|
||||||
|
.byte 128+90; .word clock_n
|
||||||
.byte 128+90; .word tree5_n
|
.byte 128+90; .word tree5_n
|
||||||
.byte 128+80; .word tree4_n
|
.byte 128+80; .word tree4_n
|
||||||
.byte 128+70; .word tree2_n
|
.byte 128+70; .word tree2_n
|
||||||
|
@@ -4,7 +4,7 @@ MEMORY {
|
|||||||
}
|
}
|
||||||
|
|
||||||
SEGMENTS {
|
SEGMENTS {
|
||||||
CODE: load = RAM, type = ro, align=$100;
|
CODE: load = RAM, type = ro, align=$1000;
|
||||||
RODATA: load = RAM, type = ro;
|
RODATA: load = RAM, type = ro;
|
||||||
DATA: load = RAM, type = rw;
|
DATA: load = RAM, type = rw;
|
||||||
BSS: load = RAM, type = bss, define = yes;
|
BSS: load = RAM, type = bss, define = yes;
|
||||||
|
@@ -399,7 +399,7 @@ next_credit:
|
|||||||
|
|
||||||
write_credits:
|
write_credits:
|
||||||
lda which_credit
|
lda which_credit
|
||||||
cmp #7
|
cmp #8
|
||||||
beq done_credits
|
beq done_credits
|
||||||
|
|
||||||
ldx #4
|
ldx #4
|
||||||
@@ -464,42 +464,49 @@ credits_table:
|
|||||||
.word credits5
|
.word credits5
|
||||||
.word credits6
|
.word credits6
|
||||||
.word credits7
|
.word credits7
|
||||||
|
.word credits8
|
||||||
|
|
||||||
|
|
||||||
credits1:
|
credits1:
|
||||||
.byte " CODE: "
|
.byte " CODE: "
|
||||||
.byte " "
|
.byte " "
|
||||||
.byte " DEATER "
|
.byte " DEATER "
|
||||||
|
|
||||||
credits2:
|
credits2:
|
||||||
.byte " MUSIC: "
|
.byte " MUSIC: "
|
||||||
.byte " "
|
.byte " "
|
||||||
.byte " MAZE "
|
.byte " MA2E "
|
||||||
|
|
||||||
credits3:
|
credits3:
|
||||||
.byte " EFFECTS: "
|
.byte " EFFECTS: "
|
||||||
.byte " J. WARWICK "
|
.byte " J. WARWICK "
|
||||||
.byte " D. MCKELLAR "
|
.byte " D. MCKELLAR "
|
||||||
|
|
||||||
credits4:
|
credits4:
|
||||||
.byte " MAGIC: "
|
.byte " MAGIC: "
|
||||||
.byte " QKUMBA "
|
.byte " QKUMBA "
|
||||||
.byte " 4 A.M. "
|
.byte " 4 A.M. "
|
||||||
|
|
||||||
credits5:
|
credits5:
|
||||||
.byte " GREETS: "
|
.byte "GREETS: "
|
||||||
.byte " FRENCH TOUCH "
|
.byte "--> FRENCH TOUCH"
|
||||||
.byte " IMPHOBIA "
|
.byte "--> IMPHOBIA "
|
||||||
|
|
||||||
credits6:
|
credits6:
|
||||||
.byte " GROUIK "
|
.byte "--> GROUIK "
|
||||||
.byte " FENARINARSA "
|
.byte "--> FENARINARSA "
|
||||||
.byte " WIZ21 "
|
.byte "--> WIZ21 "
|
||||||
|
|
||||||
credits7:
|
credits7:
|
||||||
|
.byte "SCOTT MANLEY "
|
||||||
|
.byte " "
|
||||||
|
.byte " ",34,"FLY SAFE",34," "
|
||||||
|
|
||||||
|
credits8:
|
||||||
.byte " APPLE ][ "
|
.byte " APPLE ][ "
|
||||||
.byte " "
|
.byte " "
|
||||||
.byte " FOREVER "
|
.byte " FOREVER "
|
||||||
|
|
||||||
which_credit:
|
which_credit:
|
||||||
.byte $0
|
.byte $0
|
||||||
|
|
||||||
|
@@ -1,353 +0,0 @@
|
|||||||
;=============================================
|
|
||||||
; put_sprite_crop
|
|
||||||
;=============================================
|
|
||||||
; Sprite to display in INH,INL
|
|
||||||
; Location is XPOS,YPOS
|
|
||||||
; Note, only works if YPOS is multiple of two
|
|
||||||
|
|
||||||
; transparent color is $A (grey #2)
|
|
||||||
; this means we can have black ($0) in a sprite
|
|
||||||
|
|
||||||
; FIXME: force YPOS to be even?
|
|
||||||
|
|
||||||
put_sprite_crop:
|
|
||||||
|
|
||||||
ldy #0 ; byte 0 is xsize ; 2
|
|
||||||
lda (INL),Y ; 5
|
|
||||||
sta CH ; xsize is in CH ; 3
|
|
||||||
iny ; 2
|
|
||||||
clc
|
|
||||||
adc XPOS
|
|
||||||
sta XMAX
|
|
||||||
|
|
||||||
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_crop_loop:
|
|
||||||
sty TEMP ; save sprite pointer ; 3
|
|
||||||
ldy TEMPY ; 3
|
|
||||||
|
|
||||||
bpl put_sprite_crop_pos ; if < 0, skip to next
|
|
||||||
|
|
||||||
clc ; skip line in sprite too
|
|
||||||
lda TEMP
|
|
||||||
adc CH
|
|
||||||
tay
|
|
||||||
|
|
||||||
bne crop_increment_y
|
|
||||||
|
|
||||||
put_sprite_crop_pos:
|
|
||||||
cpy #48 ; bge if >= 48, done sprite
|
|
||||||
bcs crop_sprite_done
|
|
||||||
|
|
||||||
|
|
||||||
lda gr_offsets,Y ; lookup low-res memory address ; 4
|
|
||||||
clc ; 2
|
|
||||||
adc XPOS ; add in xpos ; 3
|
|
||||||
sta OUTL ; store out low byte of addy ; 3
|
|
||||||
clc ; never wraps, handle negative
|
|
||||||
lda gr_offsets+1,Y ; look up high byte ; 4
|
|
||||||
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 XPOS ; load xposition into x ; 3
|
|
||||||
;===========
|
|
||||||
; 34
|
|
||||||
crop_put_sprite_pixel:
|
|
||||||
lda (INL),Y ; get sprite colors ; 5
|
|
||||||
iny ; increment sprite pointer ; 2
|
|
||||||
sty TEMP ; save sprite pointer ; 3
|
|
||||||
|
|
||||||
|
|
||||||
cpx #0 ; if off-screen left, skip draw
|
|
||||||
bmi skip_drawing
|
|
||||||
cpx #40
|
|
||||||
bcs skip_drawing ; if off-screen right, skip draw
|
|
||||||
|
|
||||||
ldy #$0 ; 2
|
|
||||||
|
|
||||||
; check if completely transparent
|
|
||||||
; if so, skip
|
|
||||||
|
|
||||||
cmp #$aa ; if all zero, transparent ; 2
|
|
||||||
beq crop_put_sprite_done_draw ; don't draw it ; 2nt/3
|
|
||||||
;==============
|
|
||||||
; 16/17
|
|
||||||
|
|
||||||
sta COLOR ; save color for later ; 3
|
|
||||||
|
|
||||||
; check if top pixel transparent
|
|
||||||
|
|
||||||
and #$f0 ; check if top nibble zero ; 2
|
|
||||||
cmp #$a0
|
|
||||||
bne crop_put_sprite_bottom ; if not skip ahead ; 2nt/3
|
|
||||||
;==============
|
|
||||||
; 7/8
|
|
||||||
|
|
||||||
lda COLOR
|
|
||||||
and #$0f
|
|
||||||
sta COLOR
|
|
||||||
|
|
||||||
lda #$f0 ; setup mask ; 2
|
|
||||||
sta MASK ; 3
|
|
||||||
bmi crop_put_sprite_mask ; always? ; 3
|
|
||||||
;=============
|
|
||||||
; 8
|
|
||||||
|
|
||||||
crop_put_sprite_bottom:
|
|
||||||
lda COLOR ; re-load color ; 3
|
|
||||||
and #$0f ; check if bottom nibble zero ; 2
|
|
||||||
cmp #$0a
|
|
||||||
bne crop_put_sprite_all ; if not, skip ahead ; 2nt/3
|
|
||||||
;=============
|
|
||||||
; 7/8
|
|
||||||
|
|
||||||
lda COLOR
|
|
||||||
and #$f0
|
|
||||||
sta COLOR
|
|
||||||
lda #$0f ; 2
|
|
||||||
sta MASK ; setup mask ; 3
|
|
||||||
;===========
|
|
||||||
; 5
|
|
||||||
|
|
||||||
crop_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 ; 6
|
|
||||||
|
|
||||||
jmp crop_put_sprite_done_draw ; we are done ; 3
|
|
||||||
;===========
|
|
||||||
; 20
|
|
||||||
|
|
||||||
crop_put_sprite_all:
|
|
||||||
lda COLOR ; load color ; 3
|
|
||||||
sta (OUTL),Y ; and write it out ; 6
|
|
||||||
;============
|
|
||||||
; 9
|
|
||||||
|
|
||||||
crop_put_sprite_done_draw:
|
|
||||||
skip_drawing:
|
|
||||||
|
|
||||||
ldy TEMP ; restore sprite pointer ; 3
|
|
||||||
|
|
||||||
inc OUTL ; increment output pointer ; 5
|
|
||||||
inx ; increment x counter ; 2
|
|
||||||
cpx XMAX
|
|
||||||
bne crop_put_sprite_pixel ; if not done, keep looping ; 2nt/3
|
|
||||||
;==============
|
|
||||||
; 12/13
|
|
||||||
crop_increment_y:
|
|
||||||
|
|
||||||
inc TEMPY ; each line has two y vars ; 5
|
|
||||||
inc TEMPY ; 5
|
|
||||||
dec CV ; decemenet total y count ; 5
|
|
||||||
bne put_sprite_crop_loop ; loop if not done ; 2nt/3
|
|
||||||
;==============
|
|
||||||
; 17/18
|
|
||||||
crop_sprite_done:
|
|
||||||
rts ; return ; 6
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
; 0,0 = 400+0
|
|
||||||
; -1,0 = 400+ff=4ff, inc=400
|
|
||||||
|
|
||||||
; sprite: 5x4
|
|
||||||
;
|
|
||||||
; -2,0 Xstart=0, sprite_offset=2, xsize=3
|
|
||||||
; -1,0, Xstart=0, sprite_offset=1, xsize=4
|
|
||||||
; 0,0, Xstrat=0, sprite_offset=0, xsize=5
|
|
||||||
; 1,0, Xstart=1, sprite_offset=0, xsize=5
|
|
||||||
;
|
|
||||||
; 39,0 Xstart=39, sprite_offset=0, xsize=1
|
|
||||||
;
|
|
||||||
;
|
|
||||||
;
|
|
||||||
;
|
|
||||||
|
|
||||||
;=============================================
|
|
||||||
; put_sprite_flipped_crop
|
|
||||||
;=============================================
|
|
||||||
; Sprite to display in INH,INL
|
|
||||||
; Location is XPOS,YPOS
|
|
||||||
; Note, only works if YPOS is multiple of two
|
|
||||||
|
|
||||||
; transparent color is $A (grey #2)
|
|
||||||
; this means we can have black ($0) in a sprite
|
|
||||||
|
|
||||||
|
|
||||||
put_sprite_flipped_crop:
|
|
||||||
|
|
||||||
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
|
|
||||||
dey ; make Y zero again ; 2
|
|
||||||
|
|
||||||
lda INH ; ???
|
|
||||||
sta ppfc_smc+2
|
|
||||||
clc
|
|
||||||
lda INL
|
|
||||||
adc #1 ; add one (not two) because X counts
|
|
||||||
; from CH to 1 (not CH-1 to 0)
|
|
||||||
sta ppfc_smc+1
|
|
||||||
bcc psfc16
|
|
||||||
inc ppfc_smc+2
|
|
||||||
psfc16:
|
|
||||||
|
|
||||||
|
|
||||||
lda YPOS ; make a copy of ypos ; 3
|
|
||||||
|
|
||||||
sta TEMPY ; as we modify it ; 3
|
|
||||||
;===========
|
|
||||||
; 28
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
put_spritefc_loop:
|
|
||||||
; sty TEMP ; save sprite pointer ; 3
|
|
||||||
ldy TEMPY ; 3
|
|
||||||
|
|
||||||
bmi fcrop_increment_y ; if < 0, skip to next
|
|
||||||
cpy #48 ; bge if >= 48, done sprite
|
|
||||||
bcs fcrop_sprite_done
|
|
||||||
|
|
||||||
|
|
||||||
lda gr_offsets,Y ; lookup low-res memory address ; 4
|
|
||||||
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 ; 4
|
|
||||||
clc
|
|
||||||
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
|
|
||||||
;===========
|
|
||||||
; 34
|
|
||||||
put_spritefc_pixel:
|
|
||||||
|
|
||||||
clc
|
|
||||||
txa ; want (CH-X-1)+XPOS
|
|
||||||
eor #$ff
|
|
||||||
adc CH
|
|
||||||
adc XPOS
|
|
||||||
|
|
||||||
bmi cskip_drawing
|
|
||||||
cmp #40
|
|
||||||
|
|
||||||
bcs cskip_drawing ; if off-screen right, skip draw
|
|
||||||
|
|
||||||
ppfc_smc:
|
|
||||||
lda $C000,X ; 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 #$aa ; if all zero, transparent ; 2
|
|
||||||
beq put_spritefc_done_draw ; don't draw it ; 2nt/3
|
|
||||||
;==============
|
|
||||||
; 16/17
|
|
||||||
|
|
||||||
sta COLOR ; save color for later ; 3
|
|
||||||
|
|
||||||
; check if top pixel transparent
|
|
||||||
|
|
||||||
and #$f0 ; check if top nibble zero ; 2
|
|
||||||
cmp #$a0
|
|
||||||
bne put_spritefc_bottom ; if not skip ahead ; 2nt/3
|
|
||||||
;==============
|
|
||||||
; 7/8
|
|
||||||
|
|
||||||
lda COLOR
|
|
||||||
and #$0f
|
|
||||||
sta COLOR
|
|
||||||
|
|
||||||
lda #$f0 ; setup mask ; 2
|
|
||||||
sta MASK ; 3
|
|
||||||
bmi put_spritefc_mask ; always? ; 3
|
|
||||||
;=============
|
|
||||||
; 8
|
|
||||||
|
|
||||||
put_spritefc_bottom:
|
|
||||||
lda COLOR ; re-load color ; 3
|
|
||||||
and #$0f ; check if bottom nibble zero ; 2
|
|
||||||
cmp #$0a
|
|
||||||
bne put_spritefc_all ; if not, skip ahead ; 2nt/3
|
|
||||||
;=============
|
|
||||||
; 7/8
|
|
||||||
|
|
||||||
lda COLOR
|
|
||||||
and #$f0
|
|
||||||
sta COLOR
|
|
||||||
lda #$0f ; 2
|
|
||||||
sta MASK ; setup mask ; 3
|
|
||||||
;===========
|
|
||||||
; 5
|
|
||||||
|
|
||||||
put_spritefc_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 ; 6
|
|
||||||
|
|
||||||
jmp put_spritefc_done_draw ; we are done ; 3
|
|
||||||
;===========
|
|
||||||
; 20
|
|
||||||
|
|
||||||
put_spritefc_all:
|
|
||||||
lda COLOR ; load color ; 3
|
|
||||||
sta (OUTL),Y ; and write it out ; 6
|
|
||||||
;============
|
|
||||||
; 9
|
|
||||||
|
|
||||||
put_spritefc_done_draw:
|
|
||||||
cskip_drawing:
|
|
||||||
; ldy TEMP ; restore sprite pointer ; 3
|
|
||||||
|
|
||||||
inc OUTL ; increment output pointer ; 5
|
|
||||||
dex ; decrement x counter ; 2
|
|
||||||
bne put_spritefc_pixel ; if not done, keep looping ; 2nt/3
|
|
||||||
;==============
|
|
||||||
; 12/13
|
|
||||||
fcrop_increment_y:
|
|
||||||
inc TEMPY ; each line has two y vars ; 5
|
|
||||||
inc TEMPY ; 5
|
|
||||||
|
|
||||||
lda CH
|
|
||||||
clc
|
|
||||||
adc ppfc_smc+1
|
|
||||||
sta ppfc_smc+1
|
|
||||||
bcc psfco
|
|
||||||
inc ppfc_smc+2
|
|
||||||
psfco:
|
|
||||||
|
|
||||||
dec CV ; decemenet total y count ; 5
|
|
||||||
beq fcrop_sprite_done ; loop if not done ; 2nt/3
|
|
||||||
jmp put_spritefc_loop
|
|
||||||
;==============
|
|
||||||
; 17/18
|
|
||||||
|
|
||||||
fcrop_sprite_done:
|
|
||||||
rts ; return ; 6
|
|
||||||
|
|
||||||
|
|
@@ -1,157 +0,0 @@
|
|||||||
;=============================================
|
|
||||||
; put_sprite_flipped
|
|
||||||
;=============================================
|
|
||||||
; Sprite to display in INH,INL
|
|
||||||
; Location is XPOS,YPOS
|
|
||||||
; Note, only works if YPOS is multiple of two
|
|
||||||
|
|
||||||
; transparent color is $A (grey #2)
|
|
||||||
; this means we can have black ($0) in a sprite
|
|
||||||
|
|
||||||
|
|
||||||
put_sprite_flipped:
|
|
||||||
|
|
||||||
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
|
|
||||||
dey ; make Y zero again ; 2
|
|
||||||
|
|
||||||
lda INH
|
|
||||||
sta ppf_smc+2
|
|
||||||
clc
|
|
||||||
lda INL
|
|
||||||
adc #1 ; add one (not two) because X counts
|
|
||||||
; from CH to 1 (not CH-1 to 0)
|
|
||||||
sta ppf_smc+1
|
|
||||||
bcc psf16
|
|
||||||
inc ppf_smc+2
|
|
||||||
psf16:
|
|
||||||
|
|
||||||
|
|
||||||
lda YPOS ; make a copy of ypos ; 3
|
|
||||||
|
|
||||||
sta TEMPY ; as we modify it ; 3
|
|
||||||
;===========
|
|
||||||
; 28
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
put_spritef_loop:
|
|
||||||
sty TEMP ; save sprite pointer ; 3
|
|
||||||
ldy TEMPY ; 3
|
|
||||||
lda gr_offsets,Y ; lookup low-res memory address ; 4
|
|
||||||
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 ; 4
|
|
||||||
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
|
|
||||||
;===========
|
|
||||||
; 34
|
|
||||||
put_spritef_pixel:
|
|
||||||
ppf_smc:
|
|
||||||
lda $C000,X ; 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 #$aa ; if all zero, transparent ; 2
|
|
||||||
beq put_spritef_done_draw ; don't draw it ; 2nt/3
|
|
||||||
;==============
|
|
||||||
; 16/17
|
|
||||||
|
|
||||||
sta COLOR ; save color for later ; 3
|
|
||||||
|
|
||||||
; check if top pixel transparent
|
|
||||||
|
|
||||||
and #$f0 ; check if top nibble zero ; 2
|
|
||||||
cmp #$a0
|
|
||||||
bne put_spritef_bottom ; if not skip ahead ; 2nt/3
|
|
||||||
;==============
|
|
||||||
; 7/8
|
|
||||||
|
|
||||||
lda COLOR
|
|
||||||
and #$0f
|
|
||||||
sta COLOR
|
|
||||||
|
|
||||||
lda #$f0 ; setup mask ; 2
|
|
||||||
sta MASK ; 3
|
|
||||||
bmi put_spritef_mask ; always? ; 3
|
|
||||||
;=============
|
|
||||||
; 8
|
|
||||||
|
|
||||||
put_spritef_bottom:
|
|
||||||
lda COLOR ; re-load color ; 3
|
|
||||||
and #$0f ; check if bottom nibble zero ; 2
|
|
||||||
cmp #$0a
|
|
||||||
bne put_spritef_all ; if not, skip ahead ; 2nt/3
|
|
||||||
;=============
|
|
||||||
; 7/8
|
|
||||||
|
|
||||||
lda COLOR
|
|
||||||
and #$f0
|
|
||||||
sta COLOR
|
|
||||||
lda #$0f ; 2
|
|
||||||
sta MASK ; setup mask ; 3
|
|
||||||
;===========
|
|
||||||
; 5
|
|
||||||
|
|
||||||
put_spritef_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 ; 6
|
|
||||||
|
|
||||||
jmp put_spritef_done_draw ; we are done ; 3
|
|
||||||
;===========
|
|
||||||
; 20
|
|
||||||
|
|
||||||
put_spritef_all:
|
|
||||||
lda COLOR ; load color ; 3
|
|
||||||
sta (OUTL),Y ; and write it out ; 6
|
|
||||||
;============
|
|
||||||
; 9
|
|
||||||
|
|
||||||
put_spritef_done_draw:
|
|
||||||
|
|
||||||
ldy TEMP ; restore sprite pointer ; 3
|
|
||||||
|
|
||||||
inc OUTL ; increment output pointer ; 5
|
|
||||||
dex ; decrement x counter ; 2
|
|
||||||
bne put_spritef_pixel ; if not done, keep looping ; 2nt/3
|
|
||||||
;==============
|
|
||||||
; 12/13
|
|
||||||
|
|
||||||
inc TEMPY ; each line has two y vars ; 5
|
|
||||||
inc TEMPY ; 5
|
|
||||||
|
|
||||||
lda CH
|
|
||||||
clc
|
|
||||||
adc ppf_smc+1
|
|
||||||
sta ppf_smc+1
|
|
||||||
bcc psfo
|
|
||||||
inc ppf_smc+2
|
|
||||||
psfo:
|
|
||||||
|
|
||||||
dec CV ; decemenet total y count ; 5
|
|
||||||
bne put_spritef_loop ; loop if not done ; 2nt/3
|
|
||||||
;==============
|
|
||||||
; 17/18
|
|
||||||
|
|
||||||
rts ; return ; 6
|
|
||||||
|
|
||||||
|
|
@@ -31,67 +31,6 @@
|
|||||||
; Note: DOS3.3 starts at $9600
|
; Note: DOS3.3 starts at $9600
|
||||||
; I/O starts at $c000
|
; I/O starts at $c000
|
||||||
|
|
||||||
square1_lo = $B600
|
|
||||||
square1_hi = $B800
|
|
||||||
square2_lo = $BA00
|
|
||||||
square2_hi = $BC00
|
|
||||||
|
|
||||||
|
|
||||||
; for(i=0;i<512;i++) {
|
|
||||||
; square1_lo[i]=((i*i)/4)&0xff;
|
|
||||||
; square1_hi[i]=(((i*i)/4)>>8)&0xff;
|
|
||||||
; square2_lo[i]=( ((i-255)*(i-255))/4)&0xff;
|
|
||||||
; square2_hi[i]=(( ((i-255)*(i-255))/4)>>8)&0xff;
|
|
||||||
; }
|
|
||||||
|
|
||||||
|
|
||||||
; note, don't run these more than once?
|
|
||||||
; why not? oh, smc that we don't reset
|
|
||||||
|
|
||||||
init_multiply_tables:
|
|
||||||
|
|
||||||
; Build the add tables
|
|
||||||
|
|
||||||
ldx #$00
|
|
||||||
txa
|
|
||||||
.byte $c9 ; CMP #immediate - skip TYA and clear carry flag
|
|
||||||
lb1: tya
|
|
||||||
adc #$00 ; 0
|
|
||||||
ml1: sta square1_hi,x ; square1_hi[0]=0
|
|
||||||
tay ; y=0
|
|
||||||
cmp #$40 ; subtract 64 and update flags (c=0)
|
|
||||||
txa ; a=0
|
|
||||||
ror ; rotate
|
|
||||||
ml9: adc #$00 ; add 0
|
|
||||||
sta ml9+1 ; update add value
|
|
||||||
inx ; x=1
|
|
||||||
ml0: sta square1_lo,x ; square1_lo[0]=1
|
|
||||||
bne lb1 ; if not zero, loop
|
|
||||||
inc ml0+2 ; increment values
|
|
||||||
inc ml1+2 ; increment values
|
|
||||||
clc ; c=0
|
|
||||||
iny ; y=1
|
|
||||||
bne lb1 ; loop
|
|
||||||
|
|
||||||
; Build the subtract tables based on the existing one
|
|
||||||
|
|
||||||
ldx #$00
|
|
||||||
ldy #$ff
|
|
||||||
second_table:
|
|
||||||
lda square1_hi+1,x
|
|
||||||
sta square2_hi+$100,x
|
|
||||||
lda square1_hi,x
|
|
||||||
sta square2_hi,y
|
|
||||||
lda square1_lo+1,x
|
|
||||||
sta square2_lo+$100,x
|
|
||||||
lda square1_lo,x
|
|
||||||
sta square2_lo,y
|
|
||||||
dey
|
|
||||||
inx
|
|
||||||
bne second_table
|
|
||||||
|
|
||||||
|
|
||||||
rts
|
|
||||||
|
|
||||||
|
|
||||||
; Fast 16x16 bit unsigned multiplication, 32-bit result
|
; Fast 16x16 bit unsigned multiplication, 32-bit result
|
||||||
|
96
demos/outline2021/demo/multiply_init.s
Normal file
96
demos/outline2021/demo/multiply_init.s
Normal file
@@ -0,0 +1,96 @@
|
|||||||
|
; Fast mutiply
|
||||||
|
|
||||||
|
|
||||||
|
; Note for our purposes we only care about 8.8 x 8.8 fixed point
|
||||||
|
; with 8.8 result, which means we only care about the middle two bytes
|
||||||
|
; of the 32 bit result. So we disable generation of the high and low byte
|
||||||
|
; to save some cycles.
|
||||||
|
|
||||||
|
;
|
||||||
|
; The old routine took around 700 cycles for a 16bitx16bit=32bit mutiply
|
||||||
|
; This routine, at an expense of 2kB of looku tables, takes around 250
|
||||||
|
; If you reuse a term the next time this drops closer to 200
|
||||||
|
|
||||||
|
; This routine was described by Stephen Judd and found
|
||||||
|
; in The Fridge and in the C=Hacking magazine
|
||||||
|
; http://codebase64.org/doku.php?id=base:seriously_fast_multiplication
|
||||||
|
|
||||||
|
; The key thing to note is that
|
||||||
|
; (a+b)^2 (a-b)^2
|
||||||
|
; a*b = ------- - --------
|
||||||
|
; 4 4
|
||||||
|
; So if you have tables of the squares of 0..511 you can lookup and subtract
|
||||||
|
; instead of multiplying.
|
||||||
|
|
||||||
|
; Table generation: I:0..511
|
||||||
|
; square1_lo = <((I*I)/4)
|
||||||
|
; square1_hi = >((I*I)/4)
|
||||||
|
; square2_lo = <(((I-255)*(I-255))/4)
|
||||||
|
; square2_hi = >(((I-255)*(I-255))/4)
|
||||||
|
|
||||||
|
; Note: DOS3.3 starts at $9600
|
||||||
|
; I/O starts at $c000
|
||||||
|
|
||||||
|
square1_lo = $1600
|
||||||
|
square1_hi = $1800
|
||||||
|
square2_lo = $1A00
|
||||||
|
square2_hi = $1C00
|
||||||
|
|
||||||
|
|
||||||
|
; for(i=0;i<512;i++) {
|
||||||
|
; square1_lo[i]=((i*i)/4)&0xff;
|
||||||
|
; square1_hi[i]=(((i*i)/4)>>8)&0xff;
|
||||||
|
; square2_lo[i]=( ((i-255)*(i-255))/4)&0xff;
|
||||||
|
; square2_hi[i]=(( ((i-255)*(i-255))/4)>>8)&0xff;
|
||||||
|
; }
|
||||||
|
|
||||||
|
|
||||||
|
; note, don't run these more than once?
|
||||||
|
; why not? oh, smc that we don't reset
|
||||||
|
|
||||||
|
init_multiply_tables:
|
||||||
|
|
||||||
|
; Build the add tables
|
||||||
|
|
||||||
|
ldx #$00
|
||||||
|
txa
|
||||||
|
.byte $c9 ; CMP #immediate - skip TYA and clear carry flag
|
||||||
|
lb1: tya
|
||||||
|
adc #$00 ; 0
|
||||||
|
ml1: sta square1_hi,x ; square1_hi[0]=0
|
||||||
|
tay ; y=0
|
||||||
|
cmp #$40 ; subtract 64 and update flags (c=0)
|
||||||
|
txa ; a=0
|
||||||
|
ror ; rotate
|
||||||
|
ml9: adc #$00 ; add 0
|
||||||
|
sta ml9+1 ; update add value
|
||||||
|
inx ; x=1
|
||||||
|
ml0: sta square1_lo,x ; square1_lo[0]=1
|
||||||
|
bne lb1 ; if not zero, loop
|
||||||
|
inc ml0+2 ; increment values
|
||||||
|
inc ml1+2 ; increment values
|
||||||
|
clc ; c=0
|
||||||
|
iny ; y=1
|
||||||
|
bne lb1 ; loop
|
||||||
|
|
||||||
|
; Build the subtract tables based on the existing one
|
||||||
|
|
||||||
|
ldx #$00
|
||||||
|
ldy #$ff
|
||||||
|
second_table:
|
||||||
|
lda square1_hi+1,x
|
||||||
|
sta square2_hi+$100,x
|
||||||
|
lda square1_hi,x
|
||||||
|
sta square2_hi,y
|
||||||
|
lda square1_lo+1,x
|
||||||
|
sta square2_lo+$100,x
|
||||||
|
lda square1_lo,x
|
||||||
|
sta square2_lo,y
|
||||||
|
dey
|
||||||
|
inx
|
||||||
|
bne second_table
|
||||||
|
|
||||||
|
|
||||||
|
rts
|
||||||
|
|
||||||
|
|
@@ -12,6 +12,10 @@ outline_demo:
|
|||||||
.include "shimmer.s"
|
.include "shimmer.s"
|
||||||
.include "a2_inside.s"
|
.include "a2_inside.s"
|
||||||
|
|
||||||
|
.include "rotoplasma_tiny.s"
|
||||||
|
.include "rotozoom_texture.s"
|
||||||
|
.include "rotozoom.s"
|
||||||
|
.include "multiply_init.s"
|
||||||
|
|
||||||
.align $1000
|
.align $1000
|
||||||
|
|
||||||
@@ -71,15 +75,15 @@ mockingboard_not_found:
|
|||||||
;=============================
|
;=============================
|
||||||
|
|
||||||
|
|
||||||
jsr a2_inside
|
; jsr a2_inside
|
||||||
|
|
||||||
jsr wires
|
; jsr wires
|
||||||
|
|
||||||
jsr rotoplasma
|
; jsr rotoplasma
|
||||||
|
|
||||||
jsr drops
|
; jsr drops
|
||||||
|
|
||||||
jsr mode7_flying
|
; jsr mode7_flying
|
||||||
|
|
||||||
jsr another_mist
|
jsr another_mist
|
||||||
|
|
||||||
@@ -103,14 +107,10 @@ forever:
|
|||||||
.include "pt3_lib_mockingboard_detect.s"
|
.include "pt3_lib_mockingboard_detect.s"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
.include "tfv_flying.s"
|
.include "tfv_flying.s"
|
||||||
.include "drops.s"
|
.include "drops.s"
|
||||||
.include "wires.s"
|
.include "wires.s"
|
||||||
.include "credits.s"
|
.include "credits.s"
|
||||||
.include "rotoplasma_tiny.s"
|
|
||||||
.include "rotozoom_texture.s"
|
|
||||||
.include "rotozoom.s"
|
|
||||||
.include "plasma.s"
|
.include "plasma.s"
|
||||||
|
|
||||||
.include "gr_putsprite.s"
|
.include "gr_putsprite.s"
|
||||||
|
@@ -1,696 +0,0 @@
|
|||||||
;=======================================
|
|
||||||
; Move physicist based on current state
|
|
||||||
;
|
|
||||||
|
|
||||||
move_physicist:
|
|
||||||
lda PHYSICIST_STATE
|
|
||||||
cmp #P_WALKING
|
|
||||||
beq move_physicist_walking
|
|
||||||
cmp #P_RUNNING
|
|
||||||
beq move_physicist_running
|
|
||||||
rts
|
|
||||||
|
|
||||||
;======================
|
|
||||||
; walking
|
|
||||||
|
|
||||||
move_physicist_walking:
|
|
||||||
inc GAIT ; cycle through animation
|
|
||||||
|
|
||||||
lda GAIT
|
|
||||||
and #$7
|
|
||||||
cmp #$4 ; only walk roughly 1/8 of time
|
|
||||||
bne no_move_walk
|
|
||||||
|
|
||||||
lda DIRECTION
|
|
||||||
beq p_walk_left
|
|
||||||
|
|
||||||
inc PHYSICIST_X ; walk right
|
|
||||||
rts
|
|
||||||
p_walk_left:
|
|
||||||
dec PHYSICIST_X ; walk left
|
|
||||||
no_move_walk:
|
|
||||||
rts
|
|
||||||
|
|
||||||
;======================
|
|
||||||
; running
|
|
||||||
move_physicist_running:
|
|
||||||
; inc GAIT ; cycle through animation
|
|
||||||
inc GAIT ; cycle through animation
|
|
||||||
|
|
||||||
lda GAIT
|
|
||||||
and #$3
|
|
||||||
cmp #$2 ; only run roughly 1/4 of time
|
|
||||||
bne no_move_run
|
|
||||||
|
|
||||||
lda DIRECTION
|
|
||||||
beq p_run_left
|
|
||||||
|
|
||||||
inc PHYSICIST_X ; run right
|
|
||||||
rts
|
|
||||||
p_run_left:
|
|
||||||
dec PHYSICIST_X ; run left
|
|
||||||
no_move_run:
|
|
||||||
rts
|
|
||||||
;======================
|
|
||||||
; standing
|
|
||||||
|
|
||||||
move_physicist_standing:
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
pstate_table_lo:
|
|
||||||
.byte <physicist_standing ; 00
|
|
||||||
.byte <physicist_walking ; 01
|
|
||||||
.byte <physicist_running ; 02
|
|
||||||
.byte <physicist_crouching ; 03
|
|
||||||
.byte <physicist_kicking ; 04
|
|
||||||
.byte <physicist_jumping ; 05
|
|
||||||
.byte <physicist_collapsing ; 06
|
|
||||||
.byte <physicist_falling_sideways; 07
|
|
||||||
.byte <physicist_standing ; 08 swinging
|
|
||||||
.byte <physicist_standing ; 09 elevator up
|
|
||||||
.byte <physicist_standing ; 0A elevator down
|
|
||||||
.byte <physicist_shooting ; 0B
|
|
||||||
.byte <physicist_falling_down ; 0C
|
|
||||||
.byte <physicist_impaled ; 0D
|
|
||||||
.byte <physicist_crouch_shooting; 0E
|
|
||||||
.byte <physicist_crouch_kicking ; 0F
|
|
||||||
.byte <physicist_disintegrating ; 10
|
|
||||||
|
|
||||||
|
|
||||||
pstate_table_hi:
|
|
||||||
.byte >physicist_standing
|
|
||||||
.byte >physicist_walking
|
|
||||||
.byte >physicist_running
|
|
||||||
.byte >physicist_crouching
|
|
||||||
.byte >physicist_kicking
|
|
||||||
.byte >physicist_jumping
|
|
||||||
.byte >physicist_collapsing
|
|
||||||
.byte >physicist_falling_sideways
|
|
||||||
.byte >physicist_standing ; 08 swinging
|
|
||||||
.byte >physicist_standing ; 09 elevator up
|
|
||||||
.byte >physicist_standing ; 0A elevator down
|
|
||||||
.byte >physicist_shooting ; 0B
|
|
||||||
.byte >physicist_falling_down ; 0C
|
|
||||||
.byte >physicist_impaled ; 0D
|
|
||||||
.byte >physicist_crouch_shooting; 0E
|
|
||||||
.byte >physicist_crouch_kicking ; 0F
|
|
||||||
.byte >physicist_disintegrating ; 10
|
|
||||||
|
|
||||||
; Urgh, make sure this doesn't end up at $FF or you hit the
|
|
||||||
; NMOS 6502 bug
|
|
||||||
|
|
||||||
.align 2
|
|
||||||
|
|
||||||
pjump:
|
|
||||||
.word $0000
|
|
||||||
|
|
||||||
.align 1
|
|
||||||
|
|
||||||
;======================================
|
|
||||||
; draw physicist
|
|
||||||
;======================================
|
|
||||||
|
|
||||||
draw_physicist:
|
|
||||||
|
|
||||||
lda PHYSICIST_STATE
|
|
||||||
and #$1f ; mask off high state bits
|
|
||||||
tax
|
|
||||||
lda pstate_table_lo,x
|
|
||||||
sta pjump
|
|
||||||
lda pstate_table_hi,x
|
|
||||||
sta pjump+1
|
|
||||||
jmp (pjump)
|
|
||||||
|
|
||||||
|
|
||||||
;==================================
|
|
||||||
; STANDING
|
|
||||||
;==================================
|
|
||||||
|
|
||||||
physicist_standing:
|
|
||||||
|
|
||||||
lda #<phys_stand
|
|
||||||
sta INL
|
|
||||||
|
|
||||||
lda #>phys_stand
|
|
||||||
sta INH
|
|
||||||
|
|
||||||
jmp finally_draw_him
|
|
||||||
|
|
||||||
;==================================
|
|
||||||
; SHOOTING
|
|
||||||
;==================================
|
|
||||||
|
|
||||||
physicist_shooting:
|
|
||||||
|
|
||||||
lda #<shooting1
|
|
||||||
sta INL
|
|
||||||
|
|
||||||
lda #>shooting1
|
|
||||||
sta INH
|
|
||||||
|
|
||||||
jmp finally_draw_him
|
|
||||||
|
|
||||||
|
|
||||||
;==================================
|
|
||||||
; KICKING
|
|
||||||
;==================================
|
|
||||||
|
|
||||||
physicist_kicking:
|
|
||||||
lda #<kick1
|
|
||||||
sta INL
|
|
||||||
|
|
||||||
lda #>kick1
|
|
||||||
sta INH
|
|
||||||
|
|
||||||
; If kicking long enough, return to standing
|
|
||||||
|
|
||||||
dec GAIT
|
|
||||||
bne short_draw
|
|
||||||
|
|
||||||
lda #P_STANDING
|
|
||||||
sta PHYSICIST_STATE
|
|
||||||
|
|
||||||
short_draw:
|
|
||||||
jmp finally_draw_him
|
|
||||||
|
|
||||||
;===================================
|
|
||||||
; CROUCHING
|
|
||||||
;===================================
|
|
||||||
|
|
||||||
physicist_crouching:
|
|
||||||
|
|
||||||
; FIXME: we have an animation?
|
|
||||||
|
|
||||||
; if we have some gait left, slide a bit
|
|
||||||
lda GAIT
|
|
||||||
beq crouch_done_slide
|
|
||||||
|
|
||||||
dec GAIT
|
|
||||||
bne crouch_done_slide
|
|
||||||
|
|
||||||
lda DIRECTION
|
|
||||||
beq p_slide_left
|
|
||||||
inc PHYSICIST_X
|
|
||||||
jmp crouch_done_slide
|
|
||||||
p_slide_left:
|
|
||||||
dec PHYSICIST_X
|
|
||||||
|
|
||||||
crouch_done_slide:
|
|
||||||
|
|
||||||
lda #<crouch2
|
|
||||||
sta INL
|
|
||||||
|
|
||||||
lda #>crouch2
|
|
||||||
sta INH
|
|
||||||
|
|
||||||
jmp finally_draw_him
|
|
||||||
|
|
||||||
;===================================
|
|
||||||
; CROUCH KICKING
|
|
||||||
;===================================
|
|
||||||
|
|
||||||
physicist_crouch_kicking:
|
|
||||||
|
|
||||||
dec GAIT
|
|
||||||
lda GAIT
|
|
||||||
bpl still_kicking
|
|
||||||
|
|
||||||
lda #P_CROUCHING
|
|
||||||
sta PHYSICIST_STATE
|
|
||||||
|
|
||||||
still_kicking:
|
|
||||||
|
|
||||||
lda #<crouch_kicking
|
|
||||||
sta INL
|
|
||||||
|
|
||||||
lda #>crouch_kicking
|
|
||||||
sta INH
|
|
||||||
|
|
||||||
jmp finally_draw_him
|
|
||||||
|
|
||||||
;===================================
|
|
||||||
; CROUCH SHOOTING
|
|
||||||
;===================================
|
|
||||||
|
|
||||||
physicist_crouch_shooting:
|
|
||||||
|
|
||||||
lda #<crouch_shooting
|
|
||||||
sta INL
|
|
||||||
|
|
||||||
lda #>crouch_shooting
|
|
||||||
sta INH
|
|
||||||
|
|
||||||
jmp finally_draw_him
|
|
||||||
|
|
||||||
|
|
||||||
;===================================
|
|
||||||
; JUMPING
|
|
||||||
;===================================
|
|
||||||
|
|
||||||
physicist_jumping:
|
|
||||||
|
|
||||||
lda GAIT
|
|
||||||
cmp #32
|
|
||||||
bcc still_jumping ; blt
|
|
||||||
|
|
||||||
; done juming
|
|
||||||
lda #STATE_RUNNING
|
|
||||||
bit PHYSICIST_STATE
|
|
||||||
beq jump_to_stand
|
|
||||||
|
|
||||||
jump_to_run:
|
|
||||||
lda #0
|
|
||||||
sta GAIT
|
|
||||||
lda #P_RUNNING
|
|
||||||
sta PHYSICIST_STATE
|
|
||||||
jmp physicist_running
|
|
||||||
|
|
||||||
jump_to_stand:
|
|
||||||
lda #0
|
|
||||||
sta GAIT
|
|
||||||
lda #P_STANDING
|
|
||||||
sta PHYSICIST_STATE
|
|
||||||
jmp physicist_standing
|
|
||||||
|
|
||||||
still_jumping:
|
|
||||||
|
|
||||||
lsr
|
|
||||||
and #$fe
|
|
||||||
|
|
||||||
tax
|
|
||||||
|
|
||||||
lda phys_jump_progression,X
|
|
||||||
sta INL
|
|
||||||
|
|
||||||
lda phys_jump_progression+1,X
|
|
||||||
sta INH
|
|
||||||
|
|
||||||
inc GAIT
|
|
||||||
|
|
||||||
lda #STATE_RUNNING
|
|
||||||
bit PHYSICIST_STATE
|
|
||||||
beq jump_change_x_regular
|
|
||||||
|
|
||||||
jump_change_x_running:
|
|
||||||
lda GAIT
|
|
||||||
; 1/4 not enough, 1/2 too much
|
|
||||||
; 3/8?
|
|
||||||
and #$7
|
|
||||||
cmp #5
|
|
||||||
bcc jump_no_move
|
|
||||||
jmp jump_change_x
|
|
||||||
|
|
||||||
; only change X every 8th frame
|
|
||||||
jump_change_x_regular:
|
|
||||||
lda GAIT
|
|
||||||
and #$7
|
|
||||||
bne jump_no_move
|
|
||||||
jump_change_x:
|
|
||||||
lda DIRECTION
|
|
||||||
beq jump_left
|
|
||||||
|
|
||||||
jump_right:
|
|
||||||
inc PHYSICIST_X
|
|
||||||
jmp finally_draw_him
|
|
||||||
|
|
||||||
jump_left:
|
|
||||||
dec PHYSICIST_X
|
|
||||||
|
|
||||||
jump_no_move:
|
|
||||||
jmp finally_draw_him
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
;===============================
|
|
||||||
; Walking
|
|
||||||
;================================
|
|
||||||
|
|
||||||
physicist_walking:
|
|
||||||
lda GAIT
|
|
||||||
cmp #40
|
|
||||||
bcc gait_fine ; blt
|
|
||||||
|
|
||||||
lda #0
|
|
||||||
sta GAIT
|
|
||||||
|
|
||||||
gait_fine:
|
|
||||||
lsr
|
|
||||||
and #$fe
|
|
||||||
|
|
||||||
tax
|
|
||||||
|
|
||||||
lda phys_walk_progression,X
|
|
||||||
sta INL
|
|
||||||
|
|
||||||
lda phys_walk_progression+1,X
|
|
||||||
sta INH
|
|
||||||
|
|
||||||
jmp finally_draw_him
|
|
||||||
|
|
||||||
;===============================
|
|
||||||
; Running
|
|
||||||
;================================
|
|
||||||
|
|
||||||
physicist_running:
|
|
||||||
lda GAIT
|
|
||||||
cmp #40
|
|
||||||
bcc run_gait_fine ; blt
|
|
||||||
|
|
||||||
lda #0
|
|
||||||
sta GAIT
|
|
||||||
|
|
||||||
run_gait_fine:
|
|
||||||
lsr
|
|
||||||
and #$fe
|
|
||||||
|
|
||||||
tax
|
|
||||||
|
|
||||||
lda phys_run_progression,X
|
|
||||||
sta INL
|
|
||||||
|
|
||||||
lda phys_run_progression+1,X
|
|
||||||
sta INH
|
|
||||||
|
|
||||||
jmp finally_draw_him
|
|
||||||
|
|
||||||
|
|
||||||
;==================================
|
|
||||||
; COLLAPSING
|
|
||||||
;==================================
|
|
||||||
|
|
||||||
physicist_collapsing:
|
|
||||||
|
|
||||||
lda GAIT
|
|
||||||
cmp #18
|
|
||||||
bne collapse_not_done
|
|
||||||
|
|
||||||
really_dead:
|
|
||||||
lda #$ff
|
|
||||||
sta GAME_OVER
|
|
||||||
jmp finally_draw_him
|
|
||||||
|
|
||||||
collapse_not_done:
|
|
||||||
|
|
||||||
ldx GAIT
|
|
||||||
|
|
||||||
lda collapse_progression,X
|
|
||||||
sta INL
|
|
||||||
lda collapse_progression+1,X
|
|
||||||
sta INH
|
|
||||||
|
|
||||||
lda FRAME
|
|
||||||
and #$1f
|
|
||||||
bne no_collapse_progress
|
|
||||||
|
|
||||||
inc GAIT
|
|
||||||
inc GAIT
|
|
||||||
|
|
||||||
no_collapse_progress:
|
|
||||||
|
|
||||||
|
|
||||||
jmp finally_draw_him
|
|
||||||
|
|
||||||
;==================================
|
|
||||||
; DISINTEGRATING
|
|
||||||
;==================================
|
|
||||||
|
|
||||||
physicist_disintegrating:
|
|
||||||
|
|
||||||
lda GAIT
|
|
||||||
cmp #28
|
|
||||||
bne disintegrate_not_done
|
|
||||||
|
|
||||||
disintegrate_really_dead:
|
|
||||||
lda #$ff
|
|
||||||
sta GAME_OVER
|
|
||||||
jmp finally_draw_him
|
|
||||||
|
|
||||||
disintegrate_not_done:
|
|
||||||
|
|
||||||
ldx GAIT
|
|
||||||
|
|
||||||
lda disintegrate_progression,X
|
|
||||||
sta INL
|
|
||||||
lda disintegrate_progression+1,X
|
|
||||||
sta INH
|
|
||||||
|
|
||||||
lda FRAME
|
|
||||||
and #$7
|
|
||||||
bne no_disintegrate_progress
|
|
||||||
|
|
||||||
inc GAIT
|
|
||||||
inc GAIT
|
|
||||||
|
|
||||||
no_disintegrate_progress:
|
|
||||||
|
|
||||||
|
|
||||||
jmp finally_draw_him
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
;==================================
|
|
||||||
; FALLING SIDEWAYS
|
|
||||||
;==================================
|
|
||||||
|
|
||||||
physicist_falling_sideways:
|
|
||||||
|
|
||||||
|
|
||||||
lda FRAME
|
|
||||||
and #$3
|
|
||||||
bne no_fall_progress
|
|
||||||
|
|
||||||
inc PHYSICIST_X
|
|
||||||
inc PHYSICIST_Y ; must me mul of 2
|
|
||||||
inc PHYSICIST_Y
|
|
||||||
|
|
||||||
no_fall_progress:
|
|
||||||
|
|
||||||
lda PHYSICIST_Y
|
|
||||||
fall_sideways_destination_smc:
|
|
||||||
cmp #22
|
|
||||||
bne still_falling
|
|
||||||
done_falling:
|
|
||||||
; lda #0
|
|
||||||
; sta GAIT
|
|
||||||
|
|
||||||
lda #P_CROUCHING
|
|
||||||
sta PHYSICIST_STATE
|
|
||||||
jmp physicist_crouching
|
|
||||||
|
|
||||||
still_falling:
|
|
||||||
|
|
||||||
lda #<phys_falling
|
|
||||||
sta INL
|
|
||||||
|
|
||||||
lda #>phys_falling
|
|
||||||
sta INH
|
|
||||||
|
|
||||||
jmp finally_draw_him
|
|
||||||
|
|
||||||
|
|
||||||
;==================================
|
|
||||||
; FALLING DOWN
|
|
||||||
;==================================
|
|
||||||
|
|
||||||
physicist_falling_down:
|
|
||||||
|
|
||||||
falling_stop_smc: ; $2C to fall, $4C for not
|
|
||||||
bit still_falling_down
|
|
||||||
|
|
||||||
lda FRAME
|
|
||||||
and #$1
|
|
||||||
bne no_fall_down_progress
|
|
||||||
|
|
||||||
inc PHYSICIST_Y ; must be mul of 2
|
|
||||||
inc PHYSICIST_Y
|
|
||||||
|
|
||||||
no_fall_down_progress:
|
|
||||||
|
|
||||||
lda PHYSICIST_Y
|
|
||||||
fall_down_destination_smc:
|
|
||||||
cmp #22
|
|
||||||
bne still_falling_down
|
|
||||||
done_falling_down:
|
|
||||||
|
|
||||||
jsr recalc_walk_collision
|
|
||||||
|
|
||||||
lda #P_CROUCHING
|
|
||||||
sta PHYSICIST_STATE
|
|
||||||
jmp physicist_crouching
|
|
||||||
|
|
||||||
still_falling_down:
|
|
||||||
|
|
||||||
lda #<phys_stand
|
|
||||||
sta INL
|
|
||||||
|
|
||||||
lda #>phys_stand
|
|
||||||
sta INH
|
|
||||||
|
|
||||||
jmp finally_draw_him
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
;==================================
|
|
||||||
; IMPALED
|
|
||||||
;==================================
|
|
||||||
|
|
||||||
physicist_impaled:
|
|
||||||
|
|
||||||
lda GAIT
|
|
||||||
cmp #$80
|
|
||||||
bne impale_not_done
|
|
||||||
|
|
||||||
impale_really_dead:
|
|
||||||
lda #$ff
|
|
||||||
sta GAME_OVER
|
|
||||||
jmp finally_draw_him
|
|
||||||
|
|
||||||
impale_not_done:
|
|
||||||
|
|
||||||
cmp #2 ; slide down one more
|
|
||||||
bne impale_enough
|
|
||||||
inc PHYSICIST_Y
|
|
||||||
inc PHYSICIST_Y
|
|
||||||
|
|
||||||
impale_enough:
|
|
||||||
inc GAIT
|
|
||||||
|
|
||||||
lda #<physicist_spike_sprite
|
|
||||||
sta INL
|
|
||||||
|
|
||||||
lda #>physicist_spike_sprite
|
|
||||||
sta INH
|
|
||||||
|
|
||||||
jmp finally_draw_him
|
|
||||||
|
|
||||||
;=============================
|
|
||||||
; Actually Draw Him
|
|
||||||
;=============================
|
|
||||||
|
|
||||||
|
|
||||||
finally_draw_him:
|
|
||||||
lda PHYSICIST_X
|
|
||||||
sta XPOS
|
|
||||||
|
|
||||||
lda PHYSICIST_Y
|
|
||||||
sec
|
|
||||||
sbc EARTH_OFFSET ; adjust for earthquakes
|
|
||||||
sta YPOS
|
|
||||||
|
|
||||||
lda DIRECTION
|
|
||||||
bne facing_right
|
|
||||||
|
|
||||||
facing_left:
|
|
||||||
jmp put_sprite_crop
|
|
||||||
|
|
||||||
facing_right:
|
|
||||||
jmp put_sprite_flipped_crop
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
;======================================
|
|
||||||
;======================================
|
|
||||||
; Check screen limits
|
|
||||||
;======================================
|
|
||||||
;======================================
|
|
||||||
; If too far right or left, stop at boundary
|
|
||||||
; If also > 39 or < -4 then exit room
|
|
||||||
|
|
||||||
check_screen_limit:
|
|
||||||
|
|
||||||
clc
|
|
||||||
lda PHYSICIST_X
|
|
||||||
adc #$80
|
|
||||||
cmp LEFT_WALK_LIMIT
|
|
||||||
bcs just_fine_left ; (bge==bcs)
|
|
||||||
|
|
||||||
left_on_screen:
|
|
||||||
|
|
||||||
; if limit was -4, means we are off screen
|
|
||||||
; otherwise, stop physicist at limit
|
|
||||||
|
|
||||||
lda LEFT_WALK_LIMIT
|
|
||||||
cmp #($80 - 4)
|
|
||||||
beq too_far_left
|
|
||||||
|
|
||||||
left_stop_at_barrier:
|
|
||||||
lda #0
|
|
||||||
sta PHYSICIST_STATE
|
|
||||||
|
|
||||||
lda LEFT_WALK_LIMIT
|
|
||||||
sec
|
|
||||||
sbc #$7f
|
|
||||||
sta PHYSICIST_X
|
|
||||||
|
|
||||||
rts
|
|
||||||
|
|
||||||
too_far_left:
|
|
||||||
lda #1
|
|
||||||
sta GAME_OVER
|
|
||||||
rts
|
|
||||||
|
|
||||||
just_fine_left:
|
|
||||||
|
|
||||||
; Check right edge of screen
|
|
||||||
|
|
||||||
; lda PHYSICIST_X
|
|
||||||
cmp RIGHT_WALK_LIMIT
|
|
||||||
bcc just_fine_right ; blt
|
|
||||||
|
|
||||||
|
|
||||||
right_on_screen:
|
|
||||||
|
|
||||||
; if limit was 39, means we are off screen
|
|
||||||
; otherwise, stop physicist at limit
|
|
||||||
|
|
||||||
lda RIGHT_WALK_LIMIT
|
|
||||||
cmp #($80 + 39)
|
|
||||||
beq too_far_right
|
|
||||||
|
|
||||||
right_stop_at_barrier:
|
|
||||||
lda #0
|
|
||||||
sta PHYSICIST_STATE
|
|
||||||
|
|
||||||
lda RIGHT_WALK_LIMIT
|
|
||||||
clc
|
|
||||||
adc #$7f
|
|
||||||
sta PHYSICIST_X
|
|
||||||
rts
|
|
||||||
|
|
||||||
too_far_right:
|
|
||||||
lda #2
|
|
||||||
sta GAME_OVER
|
|
||||||
|
|
||||||
just_fine_right:
|
|
||||||
|
|
||||||
rts
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
; LIMIT VALUE FLAGS
|
|
||||||
; 0 10 -----
|
|
||||||
; 0 0 Z----
|
|
||||||
; 0 FF
|
|
||||||
|
|
||||||
|
|
||||||
; 1 -> 129
|
|
||||||
; 0 -> 128
|
|
||||||
; -1 -> 127 FF + 80 = 7f
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
; XPOS XSIZE XMAX
|
|
||||||
; -5 8 3
|
|
||||||
; -4 4
|
|
||||||
; -3 5
|
|
||||||
; -2 6
|
|
||||||
; -1 7
|
|
||||||
; 0 8
|
|
||||||
; 1 9
|
|
||||||
; 2
|
|
||||||
; 3
|
|
||||||
; 4
|
|
||||||
; 5
|
|
@@ -1,374 +0,0 @@
|
|||||||
; sierpinski-like demo
|
|
||||||
; based on the code from Hellmood's Memories demo
|
|
||||||
|
|
||||||
; by Vince `deater` Weaver <vince@deater.net>
|
|
||||||
|
|
||||||
; the simple sierpinski you more or less just plot
|
|
||||||
; X AND Y
|
|
||||||
|
|
||||||
; Hellmood's you plot something more or less like
|
|
||||||
; COLOR = ( (Y-(X*T)) & (X+(Y*T) ) & 0xf0
|
|
||||||
; where T is an incrementing frame value
|
|
||||||
|
|
||||||
; to get speed on 6502/Apple II we change the multiplies to
|
|
||||||
; a series of 16-bit 8.8 fixed point adds
|
|
||||||
|
|
||||||
; TODO:
|
|
||||||
; HPLOT: roughly 30s / frame
|
|
||||||
; MOVERIGHT: roughly 14s / frame
|
|
||||||
; MOVERIGHT NO COLORSHIFT:roughly 11s / frame
|
|
||||||
; MOVERIGHT MOVEDOWN roughly 11s / frame
|
|
||||||
; INLINE HPLOT roughly 9s / frame
|
|
||||||
; INLINE EVERYTHING roughly 7s / frame
|
|
||||||
; XT/YT lookup tables roughly 6s / frame
|
|
||||||
; only write 1/7 of time roughly 3s / frame
|
|
||||||
; only draw 128 lines roughly 2s / frame
|
|
||||||
|
|
||||||
; zero page
|
|
||||||
|
|
||||||
HGR_BITS = $1C
|
|
||||||
GBASL = $26
|
|
||||||
GBASH = $27
|
|
||||||
BASL = $28
|
|
||||||
BASH = $29
|
|
||||||
MASK = $2E
|
|
||||||
COLOR = $30
|
|
||||||
HGR_HMASK = $30
|
|
||||||
HGR_X = $E0
|
|
||||||
HGR_Y = $E2
|
|
||||||
HGR_COLOR = $E4
|
|
||||||
HGR_HORIZ = $E5
|
|
||||||
HGR_SCALE = $E7
|
|
||||||
|
|
||||||
DRAW_PAGE = $04
|
|
||||||
FRAME = $05
|
|
||||||
SEVEN = $06
|
|
||||||
NEXTCOL = $07
|
|
||||||
XX_TH = $08
|
|
||||||
XX_TL = $09
|
|
||||||
YY = $0A
|
|
||||||
YY_TH = $0B
|
|
||||||
YY_TL = $0C
|
|
||||||
T_L = $0D
|
|
||||||
T_H = $0E
|
|
||||||
SAVED = $0F
|
|
||||||
|
|
||||||
; Soft switches
|
|
||||||
FULLGR = $C052
|
|
||||||
PAGE1 = $C054
|
|
||||||
PAGE2 = $C055
|
|
||||||
|
|
||||||
; ROM routines
|
|
||||||
HGR = $F3E2
|
|
||||||
HGR2 = $F3D8
|
|
||||||
HPOSN = $F411
|
|
||||||
HPLOT0 = $F457
|
|
||||||
HPLOT1 = $F45A ; skip the HPOSN call
|
|
||||||
COLOR_SHIFT = $F47E ; shift color for odd/even Y (0..7 or 7..13)
|
|
||||||
MOVE_RIGHT = $F48A ; move next plot location one to the right
|
|
||||||
MOVE_DOWN = $F504 ; clc at f504, needed?
|
|
||||||
; f505 is applesoft entry point but assumes c?
|
|
||||||
; move next plot location one to the right
|
|
||||||
|
|
||||||
; note moveright/movedown respect HGR_PAGE
|
|
||||||
|
|
||||||
XDRAW0 = $F65D
|
|
||||||
COLORTBL = $F6F6
|
|
||||||
BASCALC = $FBC1
|
|
||||||
HOME = $FC58
|
|
||||||
CLREOLZ = $FC9E ; clear (BASL),Y to end of line
|
|
||||||
|
|
||||||
XT_LOOKUP_TABLE = $1000
|
|
||||||
YT_LOOKUP_TABLE = $1100
|
|
||||||
|
|
||||||
;.zeropage
|
|
||||||
;.globalzp T_L,T_H
|
|
||||||
|
|
||||||
;================================
|
|
||||||
; Clear screen and setup graphics
|
|
||||||
;================================
|
|
||||||
sier:
|
|
||||||
jsr HGR ; returns with A=0
|
|
||||||
|
|
||||||
sta T_L ; start with multiplier 0
|
|
||||||
sta T_H
|
|
||||||
|
|
||||||
|
|
||||||
;=============================
|
|
||||||
|
|
||||||
sier_outer:
|
|
||||||
|
|
||||||
ldx #24
|
|
||||||
jsr xdraw_desire ; draw desire
|
|
||||||
|
|
||||||
ldx #216
|
|
||||||
jsr xdraw_desire ; draw desire
|
|
||||||
|
|
||||||
|
|
||||||
ldx #0 ; get X 0 for later
|
|
||||||
stx YY ; YY starts at 0
|
|
||||||
|
|
||||||
; create XX_T and YY_T lookup tables
|
|
||||||
|
|
||||||
stx XX_TL ; always start at 0
|
|
||||||
stx XX_TH
|
|
||||||
|
|
||||||
; calc XX*T
|
|
||||||
; only really care about XX_TH
|
|
||||||
xt_table_loop:
|
|
||||||
clc ; 2
|
|
||||||
lda XX_TL ; 3
|
|
||||||
adc T_L ; 2
|
|
||||||
sta XX_TL ; 3
|
|
||||||
|
|
||||||
lda XX_TH ; 3
|
|
||||||
adc T_H ; 3
|
|
||||||
sta XX_TH ; 3
|
|
||||||
|
|
||||||
sta YT_LOOKUP_TABLE,X ; 5
|
|
||||||
|
|
||||||
eor #$ff ; negate, as we subtract ; 2
|
|
||||||
sta XT_LOOKUP_TABLE,X ; 5
|
|
||||||
inx ; 2
|
|
||||||
bne xt_table_loop ; 3/2
|
|
||||||
|
|
||||||
|
|
||||||
; inc T
|
|
||||||
; clc
|
|
||||||
lda T_L
|
|
||||||
speed_smc:
|
|
||||||
adc #2
|
|
||||||
sta T_L
|
|
||||||
bcc no_carry
|
|
||||||
inc T_H
|
|
||||||
no_carry:
|
|
||||||
|
|
||||||
; speed up the zoom as it goes
|
|
||||||
inc speed_smc+1
|
|
||||||
|
|
||||||
; set initial position on screen at line 32
|
|
||||||
|
|
||||||
lda #$0 ;
|
|
||||||
sta GBASL
|
|
||||||
|
|
||||||
lda #$20 ; start on page2 line 32 ($4200)
|
|
||||||
sta GBASH
|
|
||||||
|
|
||||||
sier_yloop:
|
|
||||||
|
|
||||||
; GBASH is in A here
|
|
||||||
|
|
||||||
; lda GBASH ; update output pointer
|
|
||||||
sta gb_smc+2
|
|
||||||
|
|
||||||
lda GBASL ; adjust so centered
|
|
||||||
clc
|
|
||||||
adc #10
|
|
||||||
sta gb_smc+1
|
|
||||||
|
|
||||||
; YY*T only needs to be updated once per line
|
|
||||||
; so do it here and then self-modify into place
|
|
||||||
|
|
||||||
ldx YY ; 3
|
|
||||||
stx add_yy_smc+1 ; 4
|
|
||||||
lda YT_LOOKUP_TABLE,X ; 4
|
|
||||||
sta yy_th_smc+1 ; 4
|
|
||||||
|
|
||||||
; reset XX to 0
|
|
||||||
|
|
||||||
ldx #0 ; XX
|
|
||||||
|
|
||||||
seven_loop:
|
|
||||||
ldy #7 ; apple ii 7 pixels per byte
|
|
||||||
|
|
||||||
sier_xloop:
|
|
||||||
|
|
||||||
; want (YY-(XX*T)) & (XX+(YY*T)
|
|
||||||
|
|
||||||
|
|
||||||
; SAVED = XX+(Y*T)
|
|
||||||
clc ; needed for proper colors ; 2
|
|
||||||
txa ; XX ; 2
|
|
||||||
yy_th_smc:
|
|
||||||
adc #$dd ; 2
|
|
||||||
sta SAVED ; 3
|
|
||||||
|
|
||||||
lda XT_LOOKUP_TABLE,X ; ~(XX*T) ; 4
|
|
||||||
; calc (YY-XX*T)
|
|
||||||
sec ; 2
|
|
||||||
add_yy_smc:
|
|
||||||
adc #$dd ; 2
|
|
||||||
|
|
||||||
; want (YY-(XX*T)) & (XX+(YY*T)
|
|
||||||
|
|
||||||
and SAVED ; 3
|
|
||||||
;============
|
|
||||||
; 20
|
|
||||||
|
|
||||||
clc ; 2
|
|
||||||
beq black ; 2/3
|
|
||||||
white:
|
|
||||||
sec ; 2
|
|
||||||
black:
|
|
||||||
;=====
|
|
||||||
; 5/6
|
|
||||||
|
|
||||||
|
|
||||||
ror NEXTCOL ; rotate in next bit ; 5
|
|
||||||
|
|
||||||
inx ; increment x ; 2
|
|
||||||
|
|
||||||
dey ; dec seven count ; 2
|
|
||||||
bne sier_xloop ; 2/3
|
|
||||||
|
|
||||||
;===========================================================
|
|
||||||
|
|
||||||
|
|
||||||
lda NEXTCOL ; sign extend top bit, ; 3
|
|
||||||
cmp #$80 ; matches earlier cool colors ; 2
|
|
||||||
ror ; 2
|
|
||||||
|
|
||||||
gb_smc:
|
|
||||||
sta $4000 ; write to hi-res display ; 4
|
|
||||||
inc gb_smc+1 ; increase GBASL ; 6
|
|
||||||
|
|
||||||
cpx #124 ; 2
|
|
||||||
bcc seven_loop ; 3/2
|
|
||||||
|
|
||||||
|
|
||||||
;=================
|
|
||||||
; total roughly ???
|
|
||||||
; full screen each inner cycle is done 256*192 = 49152
|
|
||||||
; apple II cyles/frame = 17,030
|
|
||||||
; 1FPS = 1,021,800
|
|
||||||
|
|
||||||
|
|
||||||
;==================================
|
|
||||||
|
|
||||||
jsr MOVE_DOWN ; ROM routine to skip the next line
|
|
||||||
; as this is non-trivial on Apple II
|
|
||||||
; X/Y left alone
|
|
||||||
; returns with GBASH in A
|
|
||||||
|
|
||||||
inc YY ; repeat until YY=128
|
|
||||||
bpl sier_yloop
|
|
||||||
|
|
||||||
;flip_pages:
|
|
||||||
; TODO if frame rate ever gets fast enough
|
|
||||||
|
|
||||||
|
|
||||||
ldx #24
|
|
||||||
jsr xdraw_desire ; erase desire
|
|
||||||
|
|
||||||
ldx #216
|
|
||||||
jsr xdraw_desire ; erase desire
|
|
||||||
|
|
||||||
inc FRAME
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
;===============
|
|
||||||
; clear screen
|
|
||||||
|
|
||||||
jsr HOME
|
|
||||||
|
|
||||||
; ldx #24
|
|
||||||
;clear_screen_loop:
|
|
||||||
; txa
|
|
||||||
; jsr BASCALC ; A is BASL at end
|
|
||||||
; lda BASH
|
|
||||||
; clc
|
|
||||||
; adc DRAW_PAGE
|
|
||||||
; sta BASH
|
|
||||||
|
|
||||||
; ldy #0
|
|
||||||
; jsr CLREOLZ
|
|
||||||
; dex
|
|
||||||
; cpx #20
|
|
||||||
; bne clear_screen_loop
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
ldy #39
|
|
||||||
text_loop:
|
|
||||||
|
|
||||||
tya ; get YY to print at
|
|
||||||
; clc
|
|
||||||
; adc FRAME
|
|
||||||
and #$f
|
|
||||||
tax
|
|
||||||
|
|
||||||
lda cosine,X ; get cosine value
|
|
||||||
jsr BASCALC ; convert to BASL/BASH
|
|
||||||
|
|
||||||
; lda BASH ; add so is proper page
|
|
||||||
; clc
|
|
||||||
; adc DRAW_PAGE
|
|
||||||
; sta BASH
|
|
||||||
|
|
||||||
tya ; lookup char to print
|
|
||||||
clc
|
|
||||||
adc FRAME
|
|
||||||
and #$f
|
|
||||||
tax
|
|
||||||
|
|
||||||
; lda apple,X
|
|
||||||
lda $FB09,X ; 8 bytes of apple II
|
|
||||||
cpx #8
|
|
||||||
bcc blah2
|
|
||||||
; ora #$80
|
|
||||||
lda #$a0
|
|
||||||
blah2:
|
|
||||||
sta (BASL),Y ; print it
|
|
||||||
|
|
||||||
dey ; loop
|
|
||||||
bpl text_loop
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
jmp sier_outer ; branch always
|
|
||||||
|
|
||||||
|
|
||||||
cosine:
|
|
||||||
.byte 23,23,23,22,22,21,20,20,20,20,20,21,21,22,23,23
|
|
||||||
|
|
||||||
shape_dsr:
|
|
||||||
.byte $2d,$36,$ff,$3f
|
|
||||||
.byte $24,$ad,$22,$24,$94,$21,$2c,$4d
|
|
||||||
.byte $91,$3f,$36,$00
|
|
||||||
|
|
||||||
|
|
||||||
;=======================
|
|
||||||
; xdraw desire
|
|
||||||
;=======================
|
|
||||||
|
|
||||||
xdraw_desire:
|
|
||||||
|
|
||||||
|
|
||||||
; setup X and Y co-ords
|
|
||||||
|
|
||||||
ldy #0 ; XPOSH always 0 for us
|
|
||||||
lda #20
|
|
||||||
jsr HPOSN ; X= (y,x) Y=(a)
|
|
||||||
|
|
||||||
|
|
||||||
lda #3
|
|
||||||
sta HGR_SCALE
|
|
||||||
|
|
||||||
shape_smc:
|
|
||||||
ldx #<shape_dsr ; point to our shape
|
|
||||||
xdraw_custom_shape:
|
|
||||||
ldy #>shape_dsr ; code fits in one page so this doesn't change
|
|
||||||
|
|
||||||
rot_smc:
|
|
||||||
lda FRAME ; set rotation
|
|
||||||
and #$f ; necessary?
|
|
||||||
asl
|
|
||||||
asl
|
|
||||||
|
|
||||||
; for scale 2 only 8 positions
|
|
||||||
|
|
||||||
blah:
|
|
||||||
jmp XDRAW0 ; XDRAW 1 AT X,Y
|
|
||||||
; Both A and X are 0 at exit
|
|
||||||
|
|
Reference in New Issue
Block a user