From 3be732a51deda2f4c57679f26c3c8322ae7c1728 Mon Sep 17 00:00:00 2001 From: Vince Weaver Date: Tue, 15 Mar 2022 16:37:02 -0400 Subject: [PATCH] lemm: add sound effect --- games/lemm/Makefile | 2 +- games/lemm/audio.s | 204 +++++++++++++++++++++++++++++++++++ games/lemm/lemm.s | 10 +- games/lemm/letsgo.s | 29 +++++ games/lemm/level1.s | 2 + games/lemm/level5.s | 1 + games/lemm/qload.s | 2 +- games/lemm/sounds/letsgo.btc | Bin 0 -> 3602 bytes 8 files changed, 246 insertions(+), 4 deletions(-) create mode 100644 games/lemm/audio.s create mode 100644 games/lemm/letsgo.s create mode 100644 games/lemm/sounds/letsgo.btc diff --git a/games/lemm/Makefile b/games/lemm/Makefile index a517b318..4b33b424 100644 --- a/games/lemm/Makefile +++ b/games/lemm/Makefile @@ -71,7 +71,7 @@ lemm.o: lemm.s zp.inc hardware.inc \ hgr_hlin.s hgr_vlin.s update_menu.s \ interrupt_handler.s keyboard.s draw_pointer.s \ pointer_sprites.inc \ - level1.s level5.s title.s + level1.s level5.s title.s audio.s letsgo.s ca65 -o lemm.o lemm.s -l lemm.lst diff --git a/games/lemm/audio.s b/games/lemm/audio.s new file mode 100644 index 00000000..e6193a09 --- /dev/null +++ b/games/lemm/audio.s @@ -0,0 +1,204 @@ +; Based on BTC.SYSTEM by Oliver Schmidt + +; How to generate proper audio for this: + +; -Open MP3 in Audacity +; -Change Project Rate (Hz) to 33,000 (bottom left box) +; -Tracks --> Mix... --> Mix Stereo Down to Mono +; -File --> Export --> Export as WAV +; - Select "WAV (Microsoft) signed 16-bit PCM" +; - Under "Edit Metadata Tags" hit "Clear", then "Okay" +; -Open saved WAV file in BTc Sound Encoder 3.0 +; -Change Algorithm to "1 bit" (leave fineness as BTc16) +; -File --> Export binary file .BTC format + + +spkr = $C030 + +;**************************************************************** +;* Audio playback * +;**************************************************************** +; audio file in BTC_L/BTC_H +; pages to play in X + + +play_audio: + ldy #0 + + ; loop here as long as BITs are [F]alse (aka 0) +F_NX: NOP ; 2 2 + NOP ; 2 2 + NOP ; 2 2 + BIT $00 ; 3 3 +F_RD: LDA (BTC_L),y ; 5 5 5 + ASL ; 2 2 2 + BCS T_1_SW ; 2/3 2 + NOP ; 2 2 + NOP ; 2 2 + NOP ; 2 2 + NOP ; 2 2 +F_1: JSR delay ; 6 (+13) 19 + ASL ; 2 2 = 31 + BCS T_2_SW ; 2/3 + NOP ; 2 + NOP ; 2 + NOP ; 2 + NOP ; 2 +F_2: JSR delay ; 6 (+13) + ASL ; 2 + BCS T_3_SW ; 2/3 + NOP ; 2 + NOP ; 2 + NOP ; 2 + NOP ; 2 +F_3: JSR delay ; 6 (+13) + ASL ; 2 + BCS T_4_SW ; 2/3 + NOP ; 2 + NOP ; 2 + NOP ; 2 + NOP ; 2 +F_4: JSR delay ; 6 (+13) + ASL ; 2 + BCS T_5_SW ; 2/3 + NOP ; 2 + NOP ; 2 + NOP ; 2 + NOP ; 2 +F_5: JSR delay ; 6 (+13) + ASL ; 2 + BCS T_6_SW ; 2/3 + NOP ; 2 + NOP ; 2 + NOP ; 2 + NOP ; 2 +F_6: JSR delay ; 6 (+13) + ASL ; 2 + BCS T_7_SW ; 2/3 + NOP ; 2 + NOP ; 2 + NOP ; 2 + NOP ; 2 +F_7: JSR delay ; 6 (+13) + ASL ; 2 + BCS T_8_SW ; 2/3 2 2 + NOP ; 2 2 2 + NOP ; 2 2 2 + NOP ; 2 2 2 + NOP ; 2 2 2 +F_8: INY ; 2 2 2 + BNE F_NX ; 2/3 3 = 31 2 + INC BTC_H ; 5 5 + DEX ; 2 2 + BNE F_RD ; 2/3 3 = 31 + RTS + ; click speaker on transitions +T_1_SW: STA spkr ; 4 [SW]itch to [T]rue on BIT [1] + BCS T_1 ; 3 (always) +T_2_SW: STA spkr ; 4 [SW]itch to [T]rue on BIT [2] + BCS T_2 ; 3 (always) +T_3_SW: STA spkr ; 4 [SW]itch to [T]rue on BIT [3] + BCS T_3 ; 3 (always) +T_4_SW: STA spkr ; 4 [SW]itch to [T]rue on BIT [4] + BCS T_4 ; 3 (always) +T_5_SW: STA spkr ; 4 [SW]itch to [T]rue on BIT [5] + BCS T_5 ; 3 (always) +T_6_SW: STA spkr ; 4 [SW]itch to [T]rue on BIT [6] + BCS T_6 ; 3 (always) +T_7_SW: STA spkr ; 4 [SW]itch to [T]rue on BIT [7] + BCS T_7 ; 3 (always) +T_8_SW: STA spkr ; 4 [SW]itch to [T]rue on BIT [8] + BCS T_8 ; 3 (always) + +F_1_SW: STA spkr ; 4 [SW]itch to [F]alse on BIT [1] + BCC F_1 ; 3 (always) +F_2_SW: STA spkr ; 4 [SW]itch to [F]alse on BIT [2] + BCC F_2 ; 3 (always) +F_3_SW: STA spkr ; 4 [SW]itch to [F]alse on BIT [3] + BCC F_3 ; 3 (always) +F_4_SW: STA spkr ; 4 [SW]itch to [F]alse on BIT [4] + BCC F_4 ; 3 (always) +F_5_SW: STA spkr ; 4 [SW]itch to [F]alse on BIT [5] + BCC F_5 ; 3 (always) +F_6_SW: STA spkr ; 4 [SW]itch to [F]alse on BIT [6] + BCC F_6 ; 3 (always) +F_7_SW: STA spkr ; 4 [SW]itch to [F]alse on BIT [7] + BCC F_7 ; 3 (always) +F_8_SW: STA spkr ; 4 [SW]itch to [F]alse on BIT [8] + BCC F_8 ; 3 (always) + + ; loop here as long as BITs are [T]rue (aka 1) +T_NX: NOP ; 2 + NOP ; 2 + NOP ; 2 + BIT $00 ; 3 +T_RD: LDA (BTC_L),y ; 5 + ASL ; 2 + BCC F_1_SW ; 2/3 + NOP ; 2 + NOP ; 2 + NOP ; 2 + NOP ; 2 +T_1: JSR delay ; 6 (+13) + ASL ; 2 + BCC F_2_SW ; 2/3 + NOP ; 2 + NOP ; 2 + NOP ; 2 + NOP ; 2 +T_2: JSR delay ; 6 (+13) + ASL ; 2 + BCC F_3_SW ; 2/3 + NOP ; 2 + NOP ; 2 + NOP ; 2 + NOP ; 2 +T_3: JSR delay ; 6 (+13) + ASL ; 2 + BCC F_4_SW ; 2/3 + NOP ; 2 + NOP ; 2 + NOP ; 2 + NOP ; 2 +T_4: JSR delay ; 6 (+13) + ASL ; 2 + BCC F_5_SW ; 2/3 + NOP ; 2 + NOP ; 2 + NOP ; 2 + NOP ; 2 +T_5: JSR delay ; 6 (+13) + ASL ; 2 + BCC F_6_SW ; 2/3 + NOP ; 2 + NOP ; 2 + NOP ; 2 + NOP ; 2 +T_6: JSR delay ; 6 (+13) + ASL ; 2 + BCC F_7_SW ; 2/3 + NOP ; 2 + NOP ; 2 + NOP ; 2 + NOP ; 2 +T_7: JSR delay ; 6 (+13) + ASL ; 2 + BCC F_8_SW ; 2/3 + NOP ; 2 + NOP ; 2 + NOP ; 2 + NOP ; 2 +T_8: INY ; 2 + BNE T_NX ; 2/3 + INC BTC_H ; 5 + DEX ; 2 + BNE T_RD ; 2/3 + RTS + +delay: + nop ; 2 + nop ; 2 + BIT $00 ; 3 + RTS ; 6 = 13 + + diff --git a/games/lemm/lemm.s b/games/lemm/lemm.s index f64591f1..9c6513f0 100644 --- a/games/lemm/lemm.s +++ b/games/lemm/lemm.s @@ -302,6 +302,8 @@ load_song_chunk_good: .include "update_menu.s" .include "wait_a_bit.s" .include "title.s" + .include "audio.s" + .include "letsgo.s" ; pt3 player @@ -320,9 +322,12 @@ config_string: .include "graphics/graphics_level1.inc" -.include "graphics/graphics_level5.inc" +;.include "graphics/graphics_level5.inc" .include "graphics/sprites.inc" +level5_lzsa: +level5_preview_lzsa: + music_parts_h: .byte >lemm5_part1_lzsa,>lemm5_part2_lzsa,>lemm5_part3_lzsa .byte >lemm5_part4_lzsa,>lemm5_part5_lzsa,$00 @@ -361,4 +366,5 @@ lemm6_part4_lzsa: lemm6_part5_lzsa: .incbin "music/lemm6.part5.lzsa" - +letsgo: +.incbin "sounds/letsgo.btc" diff --git a/games/lemm/letsgo.s b/games/lemm/letsgo.s new file mode 100644 index 00000000..43727e58 --- /dev/null +++ b/games/lemm/letsgo.s @@ -0,0 +1,29 @@ + +LETSGO_LENGTH = 14 + +play_letsgo: + ; only avail if language card + ;and #SOUND_IN_LC + ;beq done_link_noise + + ; switch in language card + ; read RAM, no write, $d000 bank 1 + + ; bit $C088 + + ; call the btc player + + lda #letsgo + sta BTC_H + + ldx #LETSGO_LENGTH ; 14 pages long??? + jsr play_audio + + ; restore rom, no write, $d000 bank 1 + +; bit $c08A + + rts + diff --git a/games/lemm/level1.s b/games/lemm/level1.s index 0565cdce..cfed6a56 100644 --- a/games/lemm/level1.s +++ b/games/lemm/level1.s @@ -108,6 +108,8 @@ do_level1: ; Play "Let's Go" ;======================= + jsr play_letsgo + ;======================= ; start music diff --git a/games/lemm/level5.s b/games/lemm/level5.s index ece4ca56..c335d3ad 100644 --- a/games/lemm/level5.s +++ b/games/lemm/level5.s @@ -106,6 +106,7 @@ do_level5: ; Play "Let's Go" ;======================= + jsr play_letsgo ;======================= ; start music diff --git a/games/lemm/qload.s b/games/lemm/qload.s index 0f1615ae..2ffe04c7 100644 --- a/games/lemm/qload.s +++ b/games/lemm/qload.s @@ -217,7 +217,7 @@ sector_array: .byte 0 ; FIRST_SECTOR length_array: - .byte 88,159,157,145 ; MIST_TITLE,MIST,MECHE,SELENA + .byte 92,159,157,145 ; MIST_TITLE,MIST,MECHE,SELENA .byte 128, 20,158,135 ; OCTAGON,VIEWER,STONEY,CHANNEL .byte 61, 31,159,109 ; CABIN,DENTIST,ARBOR,NIBEL .byte 20, 33, 27, 78 ; SHIP,GENERATOR,D'NI,SUB diff --git a/games/lemm/sounds/letsgo.btc b/games/lemm/sounds/letsgo.btc new file mode 100644 index 0000000000000000000000000000000000000000..e923cce66f6f593ab421a740745231d883e031c6 GIT binary patch literal 3602 zcmeHJO>7&-6&_MnRZB1wsdWYPP%4JhLdzACVY;Egr<|dp>jASM&0Dr7Ob*Jiel7eF)Eo!B*C=u zn54jaQz+|;1=aDjMW-I5%Tf_O9!NlVZShZ5Ct*_Bmai?S39TTYce?9%`-VwXIGkI-mFPwioGw(j`F0Aw& z&aun2Q<2>RR@ey_9HEqtnT1|%^$GkfOQ42{@^|fo`#@`)Y(M9 zVDAYYlWG|uN32j|L&wAOUs-&A_41x|yQ*E-wd_Ul{#F`&Oqd!@lAzyBh3bg(g38fp}K~z%p_8!TLVfZmmRsZRFQ1NJ2Y3O+U}(~7@P z-C&Q(TCYr1-ej9)?NlYPw88S_*ShE2>+9i1)yeNH=AKx6`+n$^f6VQ$rP9XWbN(q5 zB9@o=4HlU1oY{Z)D>kuvr~6T{#v;#N3l+>`)?dq5U-+L|J;!6Luy-xie{_}=4t~ud z2j91rpVrvK(;r*G-!NMq|D-GU(+&&n|Ew?g&3Y)Xw)=vi^{ycFMt}VW_wl679I7{(Hcko9HqJuNTg?~=4o_ZG?`Z1sG%TVwc z3Ob0!=KmFWz=F?=aFD%bbp^c}eRZeC`j2LZBS-I{rX9n&yL z8>;e5_i^^hm+ZQq93HPZe@KV-i=VumD7lMP?{j_o<+)w=_g3Ggu{Cg|^|pPnX?-F; zxuI9}@^m<#GSlxZ`l);D{l#KtDxXXk*61${e?X~v$$0pcYEm0a<)k;&Jtw^pHCL2k zrMH5I4dv^@O2xZ+j;A~~{`U7O$@tA^GHHmIy{U_vil39_%3#Gc?I0F-ef#YXQ@TIE`2tS(4ZY+czf73o-o+^NQ;zT?Hz$8s@>0Oj z%bZV-ri@(nyTVNgvGGn$Ca#_n1SBp-O z%ZpD50B3Au5w3P(A-1ML3Q8Hw#FR-5b-7%#xl;1E0U$TQM?pqB)sL^<7SbC7>oG7e zM?k!!(6U4wM0Qlc*R44kOdg*BS196ov<)A#c19JxZevWCW0oo4rZ0K$sLkw1|8f zR+}3xSA}CXkksa~!Ka!~#K7R#ypqs0ZqTwR*bc%}I5vX00vhI{#uj!Q&24gurkUJb zIMIGd)(~dWhMQ(0bSMR#YnrhSAC)RCG_IluAKqw?LQf*n4f;Y0NF2FeT$*TogCC+; z9QX!e`?_pbk3uE>1PTR#C9&Hkf`X{zptbG*Qb2=R6;uFx;poCssahZt%WVn%2S}V^ zoA53%RtW8kP6m=uEe#z#I8F?nP0