From ef557b62bc93c91979d0402225a09f53cca1cfd3 Mon Sep 17 00:00:00 2001 From: Vince Weaver Date: Thu, 14 Jan 2021 01:28:18 -0500 Subject: [PATCH] tfv: add in credits try to bring them up to speed a bit too --- games/tfv/Makefile | 15 +- games/tfv/TODO | 18 +- games/tfv/credits.s | 668 ++++++++++++++++++++++++++++ games/tfv/credits_sprites.inc | 47 ++ games/tfv/delay_a.s | 25 ++ games/tfv/gr_hline.s | 48 ++ games/tfv/graphics_credits/KATC.BIN | Bin 0 -> 8192 bytes games/tfv/graphics_credits/Makefile | 14 + games/tfv/loader.s | 7 +- games/tfv/mockingboard.s | 188 ++++++++ games/tfv/move_letters.s | 184 ++++++++ games/tfv/music/music.tfv | Bin 0 -> 7680 bytes games/tfv/tfv_flying.s | 7 +- games/tfv/vapor_lock.s | 238 ++++++++++ 14 files changed, 1452 insertions(+), 7 deletions(-) create mode 100644 games/tfv/credits.s create mode 100644 games/tfv/credits_sprites.inc create mode 100644 games/tfv/delay_a.s create mode 100644 games/tfv/gr_hline.s create mode 100644 games/tfv/graphics_credits/KATC.BIN create mode 100644 games/tfv/graphics_credits/Makefile create mode 100644 games/tfv/mockingboard.s create mode 100644 games/tfv/move_letters.s create mode 100644 games/tfv/music/music.tfv create mode 100644 games/tfv/vapor_lock.s diff --git a/games/tfv/Makefile b/games/tfv/Makefile index aeb38399..3113cffe 100644 --- a/games/tfv/Makefile +++ b/games/tfv/Makefile @@ -14,9 +14,10 @@ all: tfv.dsk $(DOS33): cd ../../utils/dos33fs-utils && make -tfv.dsk: $(DOS33) HELLO LOADER TFV_TITLE TFV_FLYING TFV_WORLD +tfv.dsk: $(DOS33) HELLO LOADER TFV_CREDITS TFV_TITLE TFV_FLYING TFV_WORLD $(DOS33) -y tfv.dsk SAVE A HELLO $(DOS33) -y tfv.dsk BSAVE -a 0x1000 LOADER + $(DOS33) -y tfv.dsk BSAVE -a 0x4000 TFV_CREDITS $(DOS33) -y tfv.dsk BSAVE -a 0x2000 TFV_TITLE $(DOS33) -y tfv.dsk BSAVE -a 0x2000 TFV_FLYING $(DOS33) -y tfv.dsk BSAVE -a 0x2000 TFV_WORLD @@ -36,6 +37,16 @@ loader.o: loader.s init_vars.s common_defines.inc zp.inc ### +credits.o: credits.s credits_sprites.inc mockingboard.s \ + vapor_lock.s gr_putsprite.s move_letters.s \ + ./graphics_credits/KATC.lzsa + ca65 -o credits.o credits.s -l credits.lst + +TFV_CREDITS: credits.o + ld65 -o TFV_CREDITS credits.o -C ../../linker_scripts/apple2_4000.inc + +### + TFV_TITLE: tfv_title.o ld65 -o TFV_TITLE tfv_title.o -C ../../linker_scripts/apple2_2000.inc @@ -78,5 +89,5 @@ graphics_map/tfv_backgrounds.inc: ### clean: - rm -f *~ TITLE.GR *.o *.lst TFV TFV_TITLE TFV_FLYING TFV_WORLD HELLO LOADER + rm -f *~ TITLE.GR *.o *.lst TFV_CREDITS TFV_TITLE TFV_FLYING TFV_WORLD HELLO LOADER diff --git a/games/tfv/TODO b/games/tfv/TODO index 1911fba9..e4dae109 100644 --- a/games/tfv/TODO +++ b/games/tfv/TODO @@ -1,5 +1,21 @@ +short-term: ++ Finish mockingboard music (victory and battle) ++ Get credits hooked up ++ Get battle finished + - all menu options + - properly sync hp/mp with title + - hook up name + - sound effects (bleep on menu, clicks/tones during battles) + - rotate intro + - animated fly in + - enemy glow pink before dying ++ load game support + + + + get metrocat by running across him on world map -enemy glow pink before dying + proper slowdown/delay in attack simple sound effects when selecting menu diff --git a/games/tfv/credits.s b/games/tfv/credits.s new file mode 100644 index 00000000..09736328 --- /dev/null +++ b/games/tfv/credits.s @@ -0,0 +1,668 @@ +; +; Cycle-counting text/hgr/lowres demo +; by Vince Weaver +; + +.include "zp.inc" +.include "hardware.inc" + + FRAME = $60 + TREE1X = $61 + TREE2X = $62 + + LETTERL = $63 + LETTERH = $64 + LETTERX = $65 + LETTERY = $66 + LETTERD = $67 + LETTER = $68 + BLARGH = $69 + MBASE = $97 + MBOFFSET = $98 + WAITING = $99 + +MB_VALUE = $91 +DONE_PLAYING = $92 +MB_ADDRL = $93 +MB_ADDRH = $94 +MB_CHUNK_OFFSET = $95 +MB_DETECTED = $96 +WHICH_CHUNK = $97 +STATE = $98 + + ;=================== + ; init screen + + jsr TEXT + jsr HOME + + ;================== + ; Init vars + + lda #28 + sta TREE1X + lda #37 + sta TREE2X + + lda #0 + sta MBOFFSET + lda #>music + sta MBASE + + lda #letters + sta LETTERH + lda #39 + sta LETTERX + lda #1 + sta LETTERY + lda #15 + sta LETTERD + + lda #0 + sta DISP_PAGE + lda #0 + sta DRAW_PAGE + + ;========================== + ; setup mockingboard + + jsr mockingboard_detect_slot4 + stx MB_DETECTED + ldx MB_DETECTED + beq no_init_mb + + jsr mockingboard_init + +no_init_mb: + + + ;========================== + ; Load the background image + + lda #katahdin + sta getsrc_smc+2 + + lda #$20 ; Destination is HGR page0 + + jsr decompress_lzsa2_fast + + + ; Wait + +; jsr wait_until_keypressed + + ; GR part + bit LORES + bit SET_GR + bit FULLGR + +; jsr draw_bottom_green ; 6 + + ; Wait + +; jsr wait_until_keypressed + +; bit HIRES + + + ; Wait + +; jsr wait_until_keypressed + + ;===================================================== + ; attempt vapor lock + ;===================================================== + jsr vapor_lock + + + ;========================== + ; setup text screen + + ; clear top 6 lines to space + + ; takes (Y/2)*(6+435+7)+5 = ? + lda #$A0 ; space ; 2 + ldy #10 ; 6 lines ; 2 + jsr clear_page_loop ; 2693 + +; 1 2 +; 0123456789abcdef0123456789abcdef0123456 +;line1:.asciiz " * . " $400 +;line2:.asciiz " * . . " $480 +;line3:.asciiz " * " $500 +;line4:.asciiz " * " $580 +;line5:.asciiz " . . . " $600 +;line6:.asciiz " . " $680 + + lda #'.'|$80 ; print star ; 2 + sta $420 ; 4 + sta $487 ; 4 + sta $4A4 ; 4 + sta $601 ; 4 + sta $61c ; 4 + sta $621 ; 4 + sta $68d ; 4 + ;============ + ; 30 + ; draw the moon + lda #' ' ; print inv space ; 2 + sta $403 ; 4 + sta $482 ; 4 + sta $502 ; 4 + sta $583 ; 4 + ;============ + ; 18 + + + + ; vapor lock returns with us at beginning of hsync in line + ; 114 (7410 cycles), so with 5070 cycles to go + ; 5070+4550 = 9620 + ; -2745 (draw text) + ; =========== + ; 6875 + + + ; Try X=97 Y=14 cycles=6875 + + ldy #14 ; 2 +loopA: ldx #97 ; 2 +loopB: dex ; 2 + bne loopB ; 2nt/3 + dey ; 2 + bne loopA ; 2nt/3 + + jmp display_loop +.align $100 + + ;===================================================== + ;===================================================== + ; Loop forever display loop + ;===================================================== + ;===================================================== +display_loop: + ; each scan line 65 cycles + ; 1 cycle each byte (40cycles) + 25 for horizontal + ; Total of 12480 cycles to draw screen + ; Vertical blank = 4550 cycles (70 scan lines) + ; Total of 17030 cycles to get back to where was + + ; 16666 = 17030 x=1021.8 + ; 1000 x + + + ; TODO: find beginning of scan + ; Text mode for 6*8=48 scanlines (3120 cycles) + ; hgr for 64 scalines (4160 cycles) + ; gr for 80 scalines (5200 cycles) + ; vblank = 4550 cycles + + ; text + bit SET_TEXT ; 4 + + ;================ + ; clear bottom green + + jsr draw_bottom_green ; 2209+6 + + + ;================ + ; Draw Small Tree + + lda #>small_tree ; 2 + sta INH ; 3 + lda #big_tree ; 2 + sta INH ; 3 + lda #bird_rider_stand_right ; 2 + sta INH ; 3 + lda #bird_rider_walk_right ; 2 + sta INH ; 3 + lda #music+5 ; 2 + bne waste_7 ; + ; 2 + lda MBOFFSET ; 3 + cmp #16 ; 2 + bne waste_12 ; + ; 2 + lda #>music ; 2 + sta MBASE ; 3 + lda #0 ; 2 + sta MBOFFSET ; 3 + jmp not_ready_to_loop ; 3 +waste_7: + lda #0 ; 2 + inc BLARGH ; 5 +waste_12: + ; 3 + lda #0 ; 2 + inc BLARGH ; 5 + inc BLARGH ; 5 + +not_ready_to_loop: + + ; lores want 5200 + ; mockingboard -492 + ; wrap -24 + ; softswitch -4 + ;=================== + ; 4680 cycles + + ; Try X=7 Y=114 cycles=4675 R5 + + inc BLARGH ; 5 +; lda #0 ; 2 +; lda #0 ; 2 +; lda #0 ; 2 +; lda #0 ; 2 + + ldy #114 ; 2 +loop5: + ldx #7 ; 2 +loop6: + dex ; 2 + bne loop6 ; 2nt/3 + + dey ; 2 + bne loop5 ; 2nt/3 + +;======================================================================== + + ; vertical blank + + ; want 4550 cycles + ; Try X=13 Y=64 cycles=4545 R2 + +;========================================================================= + + + + jsr move_letters ; 6+126 + + ; Blanking time: 4550 + ; move_letters -132 + ; JMP at end -3 + ;========================4415 cycles + + ; Try X=24 Y=35 cycles=4411 R4 + + nop + nop + + ldy #35 ; 2 +loop7: ldx #24 ; 2 +loop8: dex ; 2 + bne loop8 ; 2nt/3 + dey ; 2 + bne loop7 ; 2nt/3 + + + jmp display_loop ; 3 + +;=========================================================== +;=========================================================== +;=========================================================== + +;wait_until_keypressed: +; lda KEYPRESS ; check if keypressed +; bpl wait_until_keypressed ; if not, loop +; bit KEYRESET +; rts + + + + ;==================================== + ; Draw bottom green + ;==================================== + ; using hlin 7127, optimized a bit but still awful + ; this one is much better + ; 2209 cycles +draw_bottom_green: + + lda #$44 ; 2 + ldx #39 ; 2 +green_loop: + sta $728,X ; 28 ; 5 + sta $7a8,X ; 30 ; 5 + sta $450,X ; 32 ; 5 + sta $4d0,X ; 34 ; 5 + sta $550,X ; 36 ; 5 + sta $5d0,X ; 38 ; 5 + sta $650,X ; 40 ; 5 + sta $6d0,X ; 42 ; 5 + sta $750,X ; 44 ; 5 + sta $7d0,X ; 46 ; 5 + + dex ; 2 + bpl green_loop ; 2nt/3 + + rts ; 6 + +; 4 + (40*55) + 6 - 1 + + +.align $100 + +letters: + ;.byte 1,15 + .byte "T A L B O T",128 + .byte 2,14,"F A N T A S Y",128 + .byte 3,16,"S E V E N",128 + .byte 1,15," ",128 + .byte 2,14," ",128 + .byte 3,16," ",128 + .byte 1,19,"BY",128 + .byte 3,14,"VINCE WEAVER",128 + .byte 1,19," ",128 + .byte 3,14," ",128 + .byte 1,16,"MUSIC BY",128 + .byte 3,12,"HIROKAZU TANAKA",128 + .byte 1,16," ",128 + .byte 3,12," ",128 + .byte 2,13,"CYCLE COUNTING",128 + .byte 3,16,"IS HARD!" + .byte 255 + +.include "vapor_lock.s" +.include "delay_a.s" +.include "gr_hline.s" +.include "move_letters.s" +.include "gr_putsprite.s" +.include "mockingboard.s" +;.include "../asm_routines/keypress.s" + +.align $100 +.include "credits_sprites.inc" + +.include "decompress_fast_v2.s" + +;.align $1000 + +katahdin: +.incbin "graphics_credits/KATC.lzsa" +katahdin_end: + +.align $100 +music: +.incbin "music/music.tfv" diff --git a/games/tfv/credits_sprites.inc b/games/tfv/credits_sprites.inc new file mode 100644 index 00000000..dee1657f --- /dev/null +++ b/games/tfv/credits_sprites.inc @@ -0,0 +1,47 @@ +bird_rider_stand_right: + .byte $6,$7 + .byte $00,$dd,$bd,$00,$00,$00 + .byte $00,$dd,$db,$00,$dd,$90 + .byte $00,$00,$22,$02,$dd,$00 + .byte $0d,$dd,$d2,$22,$dd,$00 + .byte $00,$00,$0d,$82,$8d,$00 + .byte $00,$00,$00,$99,$00,$00 + .byte $00,$00,$00,$99,$90,$00 + ; 00=22 0X=3 X0=2 XX=15 + ; = 33 + Y*(52)+ [30A + 64B + 69C + 54D]-Y + ; = 33 + 7*52 + 30*22 + 64*3 + 69*2 + 54*15 - 7 + ; = 2190 + +bird_rider_walk_right: + .byte $6,$7 + .byte $00,$dd,$bd,$00,$00,$00 + .byte $00,$dd,$db,$00,$dd,$90 + .byte $00,$00,$22,$02,$dd,$00 + .byte $0d,$dd,$d2,$22,$dd,$00 + .byte $00,$00,$0d,$82,$8d,$00 + .byte $00,$00,$00,$99,$00,$00 + .byte $00,$00,$99,$00,$99,$00 + ; 00=22 0X=3 X0=1 XX=16 + ; = 33 + Y*(52)+ [30A + 64B + 69C + 54D]-Y + ; = 33 + 7*52 + 30*22 + 64*3 + 69*1 + 54*16 - 7 + ; = 2175 + +small_tree: + .byte $3,$3 + .byte $00,$CC,$00 + .byte $CC,$CC,$CC + .byte $00,$88,$00 + ; 00=4 0X=0 X0=0 XX=5 + ; = 33 + Y*(52)+ [30A + 64B + 69C + 54D]-Y + ; = 33 + 3*52 + [30*4 + 54*5]-3 = 576 + +big_tree: + .byte $5,$5 + .byte $00,$00,$CC,$00,$00 + .byte $00,$C0,$CC,$C0,$00 + .byte $00,$CC,$CC,$CC,$00 + .byte $c0,$CC,$CC,$CC,$c0 + .byte $00,$00,$88,$00,$00 + ; 00=12 0X=0 X0=4 XX=9 + ; = 33 + Y*(52)+ [30A + 64B + 69C + 54D]-Y + ; = 33 + 5*52 + 30*12 + 69*4 + 54*9 - 5 = 1410 diff --git a/games/tfv/delay_a.s b/games/tfv/delay_a.s new file mode 100644 index 00000000..2d0802da --- /dev/null +++ b/games/tfv/delay_a.s @@ -0,0 +1,25 @@ +; From http://6502org.wikidot.com/software-delay + +; 25+A cycles (including JSR), 19 bytes (excluding JSR) +; +; The branches must not cross page boundaries! +; + + ; Cycles Accumulator Carry flag + ; 0 1 2 3 4 5 6 (hex) 0 1 2 3 4 5 6 + +; jsr delay_a ; 6 6 6 6 6 6 6 00 01 02 03 04 05 06 + +dly0: sbc #7 +delay_a:cmp #7 ; 2 2 2 2 2 2 2 00 01 02 03 04 05 06 0 0 0 0 0 0 0 + bcs dly0 ; 2 2 2 2 2 2 2 00 01 02 03 04 05 06 0 0 0 0 0 0 0 + lsr ; 2 2 2 2 2 2 2 00 00 01 01 02 02 03 0 1 0 1 0 1 0 + bcs dly1 ; 2 3 2 3 2 3 2 00 00 01 01 02 02 03 0 1 0 1 0 1 0 +dly1: beq dly2 ; 3 3 2 2 2 2 2 00 00 01 01 02 02 03 0 1 0 1 0 1 0 + lsr ; 2 2 2 2 2 00 00 01 01 01 1 1 0 0 1 + beq dly3 ; 3 3 2 2 2 00 00 01 01 01 1 1 0 0 1 + bcc dly3 ; 3 3 2 01 01 01 0 0 1 +dly2: bne dly3 ; 2 2 3 00 00 01 0 1 0 +dly3: rts ; 6 6 6 6 6 6 6 00 00 00 00 01 01 01 0 1 1 1 0 0 1 + ; + ; Total cycles: 25 26 27 28 29 30 31 diff --git a/games/tfv/gr_hline.s b/games/tfv/gr_hline.s new file mode 100644 index 00000000..9465bc7b --- /dev/null +++ b/games/tfv/gr_hline.s @@ -0,0 +1,48 @@ + ;================================== + ; HLINE + ;================================== + ; Color in A + ; Y has which line + ; takes 435 cycles +hline: + pha ; 3 + ldx gr_offsets,y ; 4+ + stx hline_loop+1 ; self-modify code ; 4 + lda gr_offsets+1,y ; 4+ + clc ; 2 + adc DRAW_PAGE ; 3 + sta hline_loop+2 ; self-modify code ; 4 + pla ; 4 + ldx #39 ; 2 + ;=========== + ; 30 +hline_loop: + sta $5d0,X ; 38 ; 5 + dex ; 2 + bpl hline_loop ; 2nt/3 + ;=========== + ; 40*(10)=400 + + ; -1 + rts ; 6 + + ;========================== + ; Clear gr screen + ;========================== + ; Color in A, Clears 0 to and including Y + ; clear_gr: takes 2+(48/2)*(6+435+7)+5 = 10759 + ; cpl: takes (Y/2)*(6+435+7)+5 = ? +clear_gr: + ldy #46 ; 2 +clear_page_loop: + jsr hline ; 6+435 + dey ; 2 + dey ; 2 + bpl clear_page_loop ; 2/3 + rts ; 6 + +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 + diff --git a/games/tfv/graphics_credits/KATC.BIN b/games/tfv/graphics_credits/KATC.BIN new file mode 100644 index 0000000000000000000000000000000000000000..d0cf6985a19492c09b49568d8f03c11d49027558 GIT binary patch literal 8192 zcmdU!e`p)m9l+PJ453kIN^dM3gP@Xe`N~sV-p|i_cklb-eRbeK`yV5`;9Js>1+Ru)ADDS-$8^3jQF(#8XXY#O z+}r**R?9El{2jgJ7Q$7 zO>^-ftoPww0fcVxU&1hYacFnAPV+#BY_Wa?haa8<{I_*aDWj5Z@y){W`|asb*X;o#ia|C7nDbj9d385 zFVb!m{#wK6{7tSKwQ`O#W4^q&yH*9oJ=?ROFSD^sCHaT7`Zv|v<--(7J|h{|t6=8J zEU0mvatsRtEXYjwTDq#y223?U?vb&}52H&63!4MKMfZb%Vn9U4dcZ?6JSdJEBM-?x zICktE_$uV@fo!U>%eS#A)Z9w{pg4R7mI2(D!GbLNt}#kH;%eS)yZLL zc)i-^x(BkU$}YdDa|bea@lP68FI^kFS+Bo*?tEtO!eEN0Uh4p-)ev{_TQ&Tw{Ny4i z$>79z5;cYFZe?PI?6ARZ{Nsj4*n;^Rf8xhKYuZj~m+#wzjOSZH`Wky4ed|C1bod|fgXDOZB=Q|V&y$es7Jsuq zTq3&AiEcjx;U{6ihvLI-$xR-CPjX9-4Ge{R*e(A4z)(ZV??-3p^hKJ>eeB)(ZnF2K z{iF&0^&dC>=xF@C`q^&rNz*e!d-zeAakWpCoW+DJD(YxdQROI46d?naB0cIQ*YG=CuVGpX{Y&}{5AWYMIc$zEbDJc8(t@SOtNUQ zP`XN<_nf<2v*WPXXF5W)6xVoP#PvX=qaxG9B((U%ZC8qcO(e8h(tW{`+fNHkVkkiVrc?O zu}A2|p-|WOwBB&x-JxHhT>V%Q1GMuQS##isT zYN=g52;vlHCfR_jR?Nj;i61Gt*1NM>3AjE+zCZ5|Lb+!{*X*y$59ITUWPc&(3OFex zYj5d-5S3UK8QmoRuxZuBu2N`w{V0-@L%Ad{a`FV60XhZH{{VFI7pU$TN-<0tp!E}MuCcp*(mvRO+XL{!Myw5; z#G{ipTH3(U1dVt+l{8aY=j`%tk*2%+{rFC^@Z1}m)#0KoGko z|EG^9ww|8);EmJd^=C&UR}9GhJAb7rs-PaaKc;4fv*ZIz4zDb5jT^h`Z>-!}{TkOA z*p=#5{L3HL>-)CNrJ7<{zh3Fqv77(pUrzC4HMQq))Te!wCoY{)GG%Q~ayHCA!d%ll KI!6CI{{3I++SOJ7 literal 0 HcmV?d00001 diff --git a/games/tfv/graphics_credits/Makefile b/games/tfv/graphics_credits/Makefile new file mode 100644 index 00000000..ca265666 --- /dev/null +++ b/games/tfv/graphics_credits/Makefile @@ -0,0 +1,14 @@ +include ../../../Makefile.inc + +PNG2RLE = ../../../utils/gr-utils/png2rle +PNG2GR = ../../../utils/gr-utils/png2gr +LZSA = ~/research/lzsa/lzsa/lzsa + +all: KATC.lzsa + +%.lzsa: %.BIN + $(LZSA) -r -f2 $< $@ + +clean: + rm -f *~ KATC.LZSA + diff --git a/games/tfv/loader.s b/games/tfv/loader.s index 9723b809..2776eb8f 100644 --- a/games/tfv/loader.s +++ b/games/tfv/loader.s @@ -80,12 +80,13 @@ which_load_loop: sta OUTH lda WHICH_LOAD + cmp #LOAD_CREDITS bne load_other -load_intro: - lda #<$2000 +load_credits: + lda #<$4000 sta entry_smc+1 - lda #>$2000 + lda #>$4000 sta entry_smc+2 jmp actual_load diff --git a/games/tfv/mockingboard.s b/games/tfv/mockingboard.s new file mode 100644 index 00000000..cc5404e7 --- /dev/null +++ b/games/tfv/mockingboard.s @@ -0,0 +1,188 @@ +; ZP addresses + +; left channel +MOCK_6522_1_ORB = $C400 ; 6522 #1 port b data +MOCK_6522_1_ORA = $C401 ; 6522 #1 port a data +MOCK_6522_1_DDRB = $C402 ; 6522 #1 data direction port B +MOCK_6522_1_DDRA = $C403 ; 6522 #1 data direction port A +MOCK_6522_1_T1C_L = $C404 ; 6522 #1 Low-order counter +MOCK_6522_1_T1C_H = $C405 ; 6522 #1 High-order counter +MOCK_6522_1_T1L_L = $C406 ; 6522 #1 Low-order latch +MOCK_6522_1_T1L_H = $C407 ; 6522 #1 High-order latch +MOCK_6522_1_T2C_L = $C408 ; 6522 #1 Timer2 Low-order Latch/Counter +MOCK_6522_1_T2C_H = $C409 ; 6522 #1 Timer2 High-order Latch/Counter +MOCK_6522_1_SR = $C40A ; 6522 #1 Shift Register +MOCK_6522_1_ACR = $C40B ; 6522 #1 Auxiliary Control Register +MOCK_6522_1_PCR = $C40C ; 6522 #1 Peripheral Control Register +MOCK_6522_1_IFR = $C40D ; 6522 #1 Interrupt Flag Register +MOCK_6522_1_IER = $C40E ; 6522 #1 Interrupt Enable Register +MOCK_6522_1_ORAN = $C40F ; 6522 #1 port a data, no handshake + +; right channel +MOCK_6522_2_ORB = $C480 ; 6522 #2 port b data +MOCK_6522_2_ORA = $C481 ; 6522 #2 port a data +MOCK_6522_2_DDRB = $C482 ; 6522 #2 data direction port B +MOCK_6522_2_DDRA = $C483 ; 6522 #2 data direction port A +MOCK_6522_2_T1C_L = $C484 ; 6522 #2 Low-order counter +MOCK_6522_2_T1C_H = $C485 ; 6522 #2 High-order counter +MOCK_6522_2_T1L_L = $C486 ; 6522 #2 Low-order latch +MOCK_6522_2_T1L_H = $C487 ; 6522 #2 High-order latch +MOCK_6522_2_T2C_L = $C488 ; 6522 #2 Timer2 Low-order Latch/Counter +MOCK_6522_2_T2C_H = $C489 ; 6522 #2 Timer2 High-order Latch/Counter +MOCK_6522_2_SR = $C48A ; 6522 #2 Shift Register +MOCK_6522_2_ACR = $C48B ; 6522 #2 Auxiliary Control Register +MOCK_6522_2_PCR = $C48C ; 6522 #2 Peripheral Control Register +MOCK_6522_2_IFR = $C48D ; 6522 #2 Interrupt Flag Register +MOCK_6522_2_IER = $C48E ; 6522 #2 Interrupt Enable Register +MOCK_6522_2_ORAN = $C48F ; 6522 #2 port a data, no handshake + + +; AY-3-8910 commands on port B +; RESET BDIR BC1 +MOCK_AY_RESET = $0 ; 0 0 0 +MOCK_AY_INACTIVE = $4 ; 1 0 0 +MOCK_AY_READ = $5 ; 1 0 1 +MOCK_AY_WRITE = $6 ; 1 1 0 +MOCK_AY_LATCH_ADDR = $7 ; 1 1 1 + + + ;======================== + ; Mockingboard Init + ;======================== + ; Initialize the 6522s + ; set the data direction for all pins of PortA/PortB to be output + +mockingboard_init: + lda #$ff ; all 8 pins output (1), portA + + sta MOCK_6522_1_DDRA + sta MOCK_6522_2_DDRA + ; only 3 pins output (1), port B + lda #$7 + sta MOCK_6522_1_DDRB + + sta MOCK_6522_2_DDRB + + +reset_ay_both: + ;====================== + ; Reset Left AY-3-8910 + ;====================== +reset_ay_left: + lda #MOCK_AY_RESET + sta MOCK_6522_1_ORB + lda #MOCK_AY_INACTIVE + sta MOCK_6522_1_ORB + + ; AY-3-8913: Wait 5 us + nop + nop + nop + nop + nop + + ;====================== + ; Reset Right AY-3-8910 + ;====================== +reset_ay_right: + lda #MOCK_AY_RESET + sta MOCK_6522_2_ORB + lda #MOCK_AY_INACTIVE + sta MOCK_6522_2_ORB + + ; AY-3-8913: Wait 5 us + nop + nop + nop + nop + nop + + ;========================= + ; Setup initial conditions + ;========================= + + + ; 7: ENABLE + ldx #7 + lda #$38 ; noise disabled, ABC enabled + sta MB_VALUE + jsr write_ay_both + + rts + + + + ;========================================= + ; Write Right/Left to save value AY-3-8910 + ;========================================= + ; register in X + ; value in MB_VALUE + +write_ay_both: + ; address + stx MOCK_6522_1_ORA ; put address on PA1 ; 4 + stx MOCK_6522_2_ORA ; put address on PA2 ; 4 + lda #MOCK_AY_LATCH_ADDR ; latch_address on PB1 ; 2 + sta MOCK_6522_1_ORB ; latch_address on PB1 ; 4 + sta MOCK_6522_2_ORB ; latch_address on PB2 ; 4 + lda #MOCK_AY_INACTIVE ; go inactive ; 2 + sta MOCK_6522_1_ORB ; 4 + sta MOCK_6522_2_ORB ; 4 + ;=========== + ; 28 + ; value + lda MB_VALUE ; 3 + sta MOCK_6522_1_ORA ; put value on PA1 ; 4 + sta MOCK_6522_2_ORA ; put value on PA2 ; 4 + lda #MOCK_AY_WRITE ; ; 2 + sta MOCK_6522_1_ORB ; write on PB1 ; 4 + sta MOCK_6522_2_ORB ; write on PB2 ; 4 + lda #MOCK_AY_INACTIVE ; go inactive ; 2 + sta MOCK_6522_1_ORB ; 4 + sta MOCK_6522_2_ORB ; 4 + ;=========== + ; 31 + + rts ; 6 + ;=========== + ; 65 + + ;======================================= + ; Detect a Mockingboard card in Slot4 + ;======================================= + ; Based on code from the French Touch "Pure Noise" Demo + ; Attempts to time an instruction sequence with a 6522 + ; + ; MB_ADDRL:MB_ADDRH has address of Mockingboard + ; returns X=0 if not found, X=1 if found + +mockingboard_detect_slot4: + lda #0 + sta MB_ADDRL + +mb4_detect_loop: ; self-modifying + lda #$04 ; we're only looking in Slot 4 + ora #$C0 ; make it start with C + sta MB_ADDRH + ldy #04 ; $CX04 + ldx #02 ; 2 tries? +mb4_check_cycle_loop: + lda (MB_ADDRL),Y ; timer 6522 (Low Order Counter) + ; count down + sta TEMP ; 3 cycles + lda (MB_ADDRL),Y ; + 5 cycles = 8 cycles + ; between the two accesses to the timer + sec + sbc TEMP ; subtract to see if we had 8 cycles + cmp #$f8 ; -8 + bne mb4_not_in_this_slot + dex ; decrement, try one more time + bne mb4_check_cycle_loop ; loop detection + inx ; Mockingboard found (X=1) +done_mb4_detect: + rts ; return + +mb4_not_in_this_slot: + ldx #00 + beq done_mb4_detect + diff --git a/games/tfv/move_letters.s b/games/tfv/move_letters.s new file mode 100644 index 00000000..e0310659 --- /dev/null +++ b/games/tfv/move_letters.s @@ -0,0 +1,184 @@ + ;=============================================== + ; Move Letters + ;=============================================== + ; Normal P0 =6+13+2+22+46+37 = 126 + ; Normal P1 =6+13+2+22+46+37 = 126 + ; End of line =6+13+2+22+46+9+(28) = 126 + ; Next line =6+13+5+14+34+(26+28) = 126 + ; done entirely =6+13+5+(6+42+26+28) = 126 + ; Waiting =6+7+(11+6+42+26+28) = 126 + + ; all forced to be 126 + +move_letters: + ldy WAITING ; 3 + beq not_waiting ; 3 + ;============ + ; 6 + + ;-1 + dec WAITING ; 5 + jmp wait_it_out ; 3 + ;=========== + ; 7 + +not_waiting: + ; load letter from pointer, save into LETTER + + ldy #0 ; 2 + lda (LETTERL),Y ; 5 + sta LETTER ; 3 + + ; if high bit set, is special case + bmi letter_special ; 3 + ;========== + ; 13 + + ; just regular letter + + ;-1 + lda LETTERY ; get letter Y ; 3 + bmi letter_page1 + ;========== + ; 2 + +letter_page0: ; -1 + asl ; map to memory address ; 2 + tay ; 2 + lda gr_offsets,Y ; lookup low-res memory address ; 4 + sta BASL ; store out low byte of addy ; 3 + lda gr_offsets+1,Y ; look up high byte ; 4 + sta BASH ; 3 + lda #0 ; cycle-killer ; 2 + jmp letter_erase ; 3 + ;========== + ; 22 + +letter_page1: + asl ; map to memory address ; 2 + tay ; 2 + lda gr_offsets,Y ; lookup low-res memory address ; 4 + sta BASL ; store out low byte of addy ; 3 + lda gr_offsets+1,Y ; look up high byte ; 4 + clc ; 2 + adc #$4 ; adjust to page1 ; 2 + sta BASH ; 3 + ;========== + ; 22 + + ;============================ +letter_erase: + ldy LETTERX ; nop ; 3 + nop ; nop ; 5 + + ldy #0 ; erase old char with space ; 2 + lda #' '|$80 ; 2 + ldy LETTERX ; 3 + sta (BASL),Y ; 6 + + dey ; draw new char ; 2 + sty LETTERX ; 3 + lda LETTER ; 3 + ora #$80 ; 2 + ldy LETTERX ; 3 + sta (BASL),Y ; 6 + + lda LETTERX ; see if we are at destination ; 3 + cmp LETTERD ; 3 + beq letter_next ; 3 + ;=========== + ; 46 + + ;-1 + lda #0 ; 2 + lda #0 ; 2 + jmp waste_28 ; 3 + ;========== + ; 9 +letter_next: + clc ; 16-bit inc letter pointer ; 2 + lda LETTERL ; 3 + adc #1 ; 2 + sta LETTERL ; 3 + lda LETTERH ; 3 + adc #0 ; 2 + sta LETTERH ; 3 + + inc LETTERD ; inc destination X ; 5 + lda #39 ; start at right of screen ; 2 + sta LETTERX ; 3 + rts ; 6 + ;=========== + ; 37 + +letter_special: + cmp #$ff ; handle FF, we're done ; 2 + beq letter_done ; 3 + ;========== + ; 5 + + + ; -1 + and #$7f ; clear top ; 2 + sta WAITING ; this is waiting value ; 3 + + ldy #1 ; otherwise, Y,X pair ; 2 + lda (LETTERL),Y ; get Y, put in LETTERY ; 5 + sta LETTERY ; 3 + ;=========== + ; 14 + + iny ; get dest ; 2 + lda (LETTERL),Y ; 5 + sta LETTERD ; put in LETTERD ; 3 + + clc ; skip 3 bytes to begin of letters ; 2 + lda LETTERL ; 16-bit add ; 3 + adc #3 ; 2 + sta LETTERL ; 3 + lda LETTERH ; 3 + adc #0 ; 2 + sta LETTERH ; 3 + lda LETTERH ; waste ; 3 + jmp waste_26 ; 3 + + ;=========== + ; 34 + +wait_it_out: + ; wait 11 + inc BLARGH ; 5 + lda LETTERH ; 3 + lda LETTERH ; 3 + +letter_done: + lda LETTERH ; 3 + lda LETTERH ; 3 + +waste_42: + ldx #0 ; 2 + inc BLARGH ; 5 + inc BLARGH ; 5 + inc BLARGH ; 5 + inc BLARGH ; 5 + inc BLARGH ; 5 + inc BLARGH ; 5 + inc BLARGH ; 5 + inc BLARGH ; 5 +waste_26: + ldx #0 ; 2 + ldx #0 ; 2 + ldx #0 ; 2 + inc BLARGH ; 5 + inc BLARGH ; 5 + inc BLARGH ; 5 + inc BLARGH ; 5 + +waste_28: + ldx #0 ; 2 + inc BLARGH ; 5 + inc BLARGH ; 5 + inc BLARGH ; 5 + inc BLARGH ; 5 + rts ; 6 + diff --git a/games/tfv/music/music.tfv b/games/tfv/music/music.tfv new file mode 100644 index 0000000000000000000000000000000000000000..ffb297166ac85902c0c6a53693e10cf0e7373ede GIT binary patch literal 7680 zcmeI0F>1p=5JerA1|=8p5pn=Sz$sIx2!=FnQsn^YQW)nBK7%V?!^biNC)uy!iD8x< zkU>KF#W4Jxo&EE*7Pjm9A2Z-R0mSS(fy`Tin3n|QsadU6^(l|+U!Lnk*5~zmdeq?~ zK{cAfMpb?~PzM{Ska<+U_DYrV$$vfy>%16x&fL2XV%f ztRAZ3s?Awx@3R=ITuffMR;m9P_yVZv72v$gpB$9vVU0Jh$LnrfM}u7uhagTtoP$^e zu?^xF#3hKJ{kx$3hoJqZp#A5d{i~q;+o1i&p#2x>Ujkk6oc9s%c+R^4IM)x*l}@jZ zr_&sQQ*puaC!jv*;|Y zMj6&CH_^^ZrZpFpl;k{J^?4?(^7O`A?sfFHbb5U}-kZg#r^4o3sN!m)-|3^hww{dF zpL4yx^IW^i8lFPFJZFFJT#x5o=HYtXlhOSBbH%--S5sboZzr#Y?v