From 1dca9e69e0bd4a34dfb6529de0acefb0e33ac344 Mon Sep 17 00:00:00 2001 From: Michaelangel007 Date: Sun, 16 Apr 2017 07:15:22 -0700 Subject: [PATCH] Add C scale demo --- Makefile | 6 +- scales.dsk | Bin 0 -> 143360 bytes scales.s | 431 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 436 insertions(+), 1 deletion(-) create mode 100644 scales.dsk create mode 100644 scales.s diff --git a/Makefile b/Makefile index b5d141d..e6ec30d 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,4 @@ -all: test_mock freq +all: test_mock scales freq .PHONY: test_mock @@ -8,6 +8,10 @@ test_mock: src2dsk test_mock.s applewin.sh -d1 test_mock.dsk +scales: scales.s + src2dsk $< + applewin.sh -d1 $(basename $<).dsk + freq: freq.c g++ $(C_FLAGS) $< -o $@ diff --git a/scales.dsk b/scales.dsk new file mode 100644 index 0000000000000000000000000000000000000000..96886dafe1fc66e4ad6dbbe76e773fa8528c1472 GIT binary patch literal 143360 zcmeI%d3+RAo&fObGo4OII`N7q_yi0AMB;cwWFZM@=wLx09Et~)2ih{A%!s>;vnz3i zW+R*G?To7s$A+RwC#kZl)1gx|fiwh2FbNQfQ}K)nF$4&O2t*LFzt;hE_A~pL{kVVZ zXNO;o>greT{MI|_(D{e9#H(rk5tHC2zQHw4e8M$0O}=bd&}-o@TY|lo%p0PUEv|oP z>$O0rYiQeLOT~!!W0~&D7WgA?UM6o{CZjGw*d+_oFCjk8WY8rgS}kUyKA8zkm3Jzx zTzQw`8ZU2GTzPV%;awkb8arFm^zm1gxADXZyjR7yG&GN8KqD}_c# zBA;y3^}L~ z{K!Wmfg=&3L;@!x#kM#hxvQ(~M5N?or0sO1?aPSz1!q}Im}tn5k;Y|YadN%FLuL%G zMda_5{9gWegcF&n(%feCBFEgMx8BkjVQO`pj$w2cBTR(R>EkZbZ;bBLM~sgV^u;w} zCyiz5>3*`WA5@w@+Xc{?PS2uv}cciP^;Uf() z7-kr58X-lC8Y)I`&ddwYo1F-H8qEqz3o8_3WsNB=J(qA7N}R3DZhJ z*IZeqH@s&wnT0jJwdMXeOO+_aTN4udg=&(LZ7HeOZMgo18*fUxxqrjfZQC20c6`v> z(t69TTL%nO_wKvxz(I2RM}r0rxg&jOM*EjveSKuu@DZJNj=XDB=H0*2PTzCyefK|* z)$`!!hsONF*l{{*ik`_J`ZTlt?j&8}h(Sz$vl%L2xQnq^nBkVRA*p&sZ%MIQ^cg9- z2M67)Go_IXz0ItT*PHINF_ya+lRhI&pE+1heq~J2U$3{sr;?;mgEQeT@uuP9h7Qhr zU~pz?e@o^l`0M*NdeFUNhTmtoZ`APNbaMx6hS@B4j~bRjH_3EkOG!ydPEFM%Lkh^L zzdjc8fgjV1hCOp%DQQ=tK{5SDj~=ZbK6-R&|Gt9KEO!qZKG^cmILkw$?j3vG=!_9e z=C9JnFxL$pHrSXsoJnJBYwQ-CugLPu%?V8p8Sf4hGtRVIp!tb)I&wQxHHh;#;&qnW z^M(zw2zK+4<&EYWxgsGxJIy-8dShrjLpCwjTLjM9@bA_?wx;A+rddh)q@t`V)5M(E z4DlJAA;|W6_=7PE-@1xb4W@~M^)OAq<{jAhb4X*oKaXz4(M^s$&pysE$uzcaVsOSw z
    l2UpV^hrP5bbHSBpkg*fGR=m{J6`LI3J4bf-MIL5da;jeKVY_@X)6nu~&A^sa z@U{k#;h3ckSH7Sx=`jn&k{+X=t8qv|@?M8_%W?FzPnV}@e2+Y)`VK`_@i%I;^H8?5R%!B8{CHBr#lI0PGHYA$tT2#jT(#}r-O z5Hdvnt>O9mGAwF>5C?;^SiKPJF$u;R2YGCBhMH17(bi8$Esl-O^Boh_GeTmGLwl^n zs69H*0*fNELC7pwY=Sf-ug){1ZL!IA2FABTWU1{t>n`UmXJHc$1F=H+crQA(uQOS{eY?%#D{P2Xre9D?EuU%^PC=wmHc}1 zl*LBQHJrFN*DW>D148(E<)w#HU*4k|Y9`THQg)B5u$ z9Ic)!N0eM+g;_8o=9Tqs0ykK-U@K0AHi;Q7J9MMRHj{o^L`!Ihn8`0TWdV+MGcbkD z`bVm#q57c{9eMt|mcgF=X&w`;dKRraNZt44j)vp*bh1>`GM`|~SwkEsZeoW`Gx0pgHSsXoJf+9V)LM{5@ zCHP0SB&)H&5*m0siz^>lSG6VcGqD%4-!abC>d#ZHemfL=bccP1J&o)AFF*hFQj0uS z88XpjKU;26*nJh^W&VdSd$Bq;n=<6_%94o0k=KL4KZoBXH?H02{&QH2XIdRm$o?tM6JpZ8f)g;p!>=)be-Ms^zE3pYbj9E%F`n_4haVll`Ci zeZCdGBHsf4uY6;C8NQLeslMO&z5dL#PpswFeqR4W`48oDKVsU)9QgLY{hde4zy6wO zH?;pel&@DvRR!ttvH#+ek45OU6+cgsyCS?(f~&QBqNeccC7(6=wAVY++p3;t>%C$& z4N8pu`btn%C{sl+!bI&GC# zHMGK&o{wawqTEnqhyl^qdUXoZPA}4zTNnTFg zCIz-i96PP5tBaj|ft}mSKH5vSb9?9ZlD(_sX_9t>Lw-Uk&2VNK*z^j*tSTQOa-|ux zItKEG3efi=k-?C94!o@j9Y5FU^AMJ6`g*w6U|(JzMe_ zqSK|f?{BsBaKQ*<#x7nRgyJkMTeMf3?$L(&^zK4w_c}?vxfOO=-A_uvCnYbV?}WV; zUVW9_y&69L#mB%=wtRK$vxV2UW+6;98IAk^yy8r>wCXnm6^*s|4- zx8`bDuATN7Aq(|OI5&lob_aY!Bsf*Exikk4LmMEnOWTY`x%jEn^p_GB~MAsCC^CRPf0$;5{+f7>S$X? z`I=!%W-qO3wrYB(#iM0tq;6@Idgw~w256hC(?i|OaMIbgSF?>3Nl!_ErzB{aCsEWt z7%yrjF&RcygIU!ty+)c1x(uldxR1h;e_ry%dFM;5whK@}^#*9# z`QTHMJXacE6`!<<>I(L?H9qTS+0d?5wMT1=P7*U`_Jg!@p&L9W(c(h#a}wNK`R!`F zKkx8N(etj~e)v(*lc1Ku_eVsJUOl^V5*#mkLGtI7Juk6Ggur$MZt_T1wUZQv;C_xR zt8s`$efc_vE$Ig}TO_H6G&d<)!~StKXp`U?7-drQHt56yy$%jKAe=eqWad~W3~aiS)%j{^eg}(9`A$qHN!2}6d zqtBnmzI_=s|8`lPBhgmOk+?e-NmC7^d9}E3@*)YkDh&hwFkm=fl6AtI!XBs;O+@m+ z{46jlOS3sK4*InPLf~pdOjOUw7B3%F5+sG06i$b&X>MH0iSZ-n zN-gm)lQ4p4BnQ{ZuSkL4N~C=)R3tDzwi63sd)JaGpSWb?HU+L(46Irq8sYMcyjD&- z;V_+QcK=o?c}0SND>uoLBIL=nFuLdeR)Tq5BmP4+1G}q2)I%v*{_3MIRQW?koluhB zS^ffKFY00k*rTmg{>evo(gQooTj2n|O>sckPPVbKWUErLU4a0&7}}%&TWsBdXA7_n z017<@Yk{6!?1kkB+@YFq=4izSL&Y@>QqsC)KqYF*p{i+fUyxSLbv7*uEp&xk^OjXF zd$Hn$awmZse5g3*g*wIJW%=2YoFw@tpL|;K*sB^J_GD{gm+oBF>fWxDz^Jg6%T_Pc zK~C_}3NW;WdVZ?{Gd)yOf2EpFOAuZqa}pfk=wi96VmH+4I~d6BXQWA>y2{VK<|pez z?40%RtOT~Swgx)4URMr1lUC|cuYZzjm;Yhc?)kI4Z>mJuf?7k0!o0Qhp z_gAP!U8Aer~U%ngoaNM z&2&+NL75CgK{V`!Wvop!LCsp)J^EowV10tcNQ-ZU$t%7HmQYxu9rSD@Rs3V8*0188 z_Rq99XBy`}ocX;IE(?F~(Um5=8ZI{I$TO&G`p*5;F1lUeWJPl2$hDFynOnfT(1MNrk1~^d4AEBxAxvM{*B_uQ z@KrQ~4D%oJ!lhAkoFuuQm7>299q~o5&IX^AI-RzY9GpXbiy}KEzCn@a(H8 zakR(!v-twapTkd;IAK8Dt5RupFC53cKgo*l3mFz2( zbV?Zjvk6?=X1ntIIW9XqrW;U`efU*L{kqt84rXpnX1qb2SG5Xv)MRV%QgKc8vK&|T za>%YGn}e$jEeS-Lvf&A$A~oe`x>jy73<>M7C7PLz5VeBKf-GFwvd#;5k4P|Y#-=x6 zV3t4o*vQgshd<{S(_ES@wK^T}vHYjq=H;c?ZO=;DO_DR~SUQ9|md9eca-6Pg_GqO; zr0L*~>Lxf{i(Ctxu2)p}km zyG``K49R~#KV6cIUf2Dy$?JN6%b${efGx;roSrkQsc>f7ct=itTb`Y@&uC%`#_yat zg>J{Q1=E`f?KzG1NA24mDa@bIG__!Q{*3&Bwt}hlww$R`?Nb^H?Nf3lH;vDkk;4{z zFu9;@N&#%97Ou^ovUYOLqZ9I3`~C@P{*(i`w4hvCVlEUnWA@Z0<}j19P*}JI{>hbJ zju~Voiw2no83!*Ov@mmF_QLF<>>>+eVT=syGq?Ya{04p(9ctXaYu~o5+gtWz6Pv}T z*EI+phPlk>7(M*Q!GG@(=BNMOesMgTGiBn;oQZZarC~ocIIR|nVdg;a?XtL&H1AW z`qJm+Pk)$9n91&nMF+lz?TyoCPnnVPXy5TE1tfRogbDV-=|2@8iwYJ$We4R?EX(Q$!40HcJ10D{IVazQphBm*{Z6$n)dJ6aiBA@DZHtcX?Q(+ z`}?NABY~F#!{rrnci?Q`!9a@42XB&J55FFMGtd%P7T6J>`_aJLfsKJb!G1fV>EQ<8 zDT&?=l6gUSlhV>JlmIsrt&$_!A~`tr*)Yj?A0Eq*Pv3{d;AIb(pEe)!HeJaep5{75yowcIQ`%NvxB6;f|iuZ$B zexJf0P~_8!cSkM1SK;^5C;r~%TJk`MBvz9{5i+_OV#2K3q(oy;qOnBL=2}=3`EyG2 zn_9kGiFVfVrxf>LMeOC<75+;_{wmCWtfaAXszpZf?o~S5N2)!r=D?Hj?-jX0;d>N# z0bzw7$$efCQ}_$8v<|2y_g0hb>qPy?gNk-LIS+}`NJ=QH?IQ)Qn-42;w*vK-Pbtt8 zs38@}cwauJWR3t1c*C(7-f%!|$*t@9j>`2gRmUhhfbuA%d?C#KK1`GJ^d0O5=WpTQ zX*fujFsTZ_>`F6+{Vp%RbiMlz>q)SNG?lZz55W>2N~pqN!}QzTqa zT;OPbqbH1>i5q!un2ZX-pD!U=9frqwaLKXEE}x6I@<@1n-ywRoLQlf&W2|1<^vp?u z0By7B1!*Ouh&5A)vsy#&obEzhCCxq zbDgI$vAX;0TnV_CnsdbQT5i%(P4f8RY*{4_aK4bI)=+Dt+=+E4p2bG07 zjvT3mWQ8Gd3ycluNt}F8$%NpCuLLi-8r-7LcTlbLbyP5RemM&rRS#D~U&si>2lpz0 zeG02o!-K(G%_7k*0pIAPW7PEYLD@P%Uz+PEhB*N~VEDr%AeiLODUbXGY@L#`N`y*^ zI`@911o}^52%b#l@}DYc3qDr(&lSj$|4do%iNb%OfG$*A#}m#l=70fj== z_E2y|H~`=EkVbBjXv=pYUg3{L+XQ2(TT?Z6AuTSKy2u9gxd@CEE!Rq2J_y6*rPm;fj(kb5@r~fC?FJO zVtB(m9)^q;mL2{hC9V4-h0YAqew-O@%N!&yFve?gKig5OTALdNs%Ky_gL4X_{FBfg zXp*{>Zcbf^26G#YbQU6IacS~<;TH!>?PuYtmPT5^{!wij-HRx>&f12Lo!JK;@Dt|n@;6zx9-+e0VxnAsrJ9?OsAAl;a3d2B8dy$TL zh+jotYa7$xy|x$fH^cZZI~Oi)Rl7Y=80fMV<~2oqv#)qn$2lPDfTlRpV)H1Zhljtu zA6`F4Cxhl)T3G!S^3#%Ge4kcsJ{RuG>kJ307Y~wM3anr}oaW=So<|kICdnPjq>y2` zCn*h1{DMveLYFT%rp$ZksPfVg<)sdI3iC-Cy_Y)?I~N_Xwe_U305UnEzuqW}Nj zhW||qQegOB%Rec`Yq|9dlVZBY+i$+c+aGt0x8HJ&w?F=(zkTbjru~2QI0Rnf z_ZwHW@e>7500mG01yBG5{;vdzeqhMNB2r%@GOk|VP@#w{FDmcdd|y#!BHemA{07LjTan|M90ni)f)mja-%cjYjf8QOO&PY-?ZMr;AFy z{W0%@SMvUOZmHMcqkt<=nukK2@%TOzJnsIbCAXBuPQr&Ca@o^&5`GT#_q6Z1Lq}G4 z$Wf2)Ho-%-dVC|{Be@hhzS~2h9yX!$FZ=xxhW=h11?&n>tT)$qe0l;KBi+OaW8p(c z?u6~tf8f;7V+Oi0T{+-O_*sltiEPyKx5ra#*!Vnj*!cU-*e*}WZqL;-7W%7a?7tZ( zKR=bJiK*Az!;n$T4Hhf2@tcf$hdnfCe9nvdemo_regs_1 + jsr MOCK1_Play + +play_loop: + ldy note_index + ldx demo_half_notes,y + bmi play_done + + jsr MOCK1_ANoteX + lda #0 + jsr DelayA + + inc note_index + bne play_loop + +play_done: + jmp MOCK1_Stop + +; === DATA === + +; $3E = Only enable Tone A +channels = DISABLE_NOISE_C | DISABLE_NOISE_B | DISABLE_NOISE_A | DISABLE_TONE_C | DISABLE_TONE_B + +demo_regs_1: + .byte $80,$00 ; [0] Tone A + .byte $80,$00 ; [2] Tone B + .byte $80,$00 ; [4] Tone C + .byte $00 ; [6] Noise + .byte channels ; [7] Disable + .byte $0F,$0F,$0F ; [8] Amp A, B, C + .byte $00 ; [B] Env Lo + .byte $00 ; [C] Env Hi + .byte $00 ; [D] Env Type + +demo_half_notes: + .byte $00 ; C4 + .byte $02 ; D4 + .byte $04 ; E4 + .byte $05 ; F4 + .byte $07 ; G4 + .byte $09 ; A4 + .byte $0B ; B4 + .byte $0C ; C5 + .byte $FF ; end-of-music + + ;Tone Control Fine 128 ($80) Register 0/2/4 + ;Tone Control Coarse 0 Register 1/3/5 + ;Noise Period 0 Register 6 + ;Enable Mask 62 ($3E) Register 7 + ;Amplitude 15 ($0F) Register 8/9/A + ;Envelope Fine 0 Register B + ;Envelope Coarse 0 Register C + ;Envelope Shape 0 Register D + +; ____________________ Utility ____________________ + +; ==================== +; Delay ((A * ? + ?) * (A * ? + ?) +; ==================== +DelayA: + tax + tay +@1: inx + bne @1 + iny + bne @1 + rts + +; ____________________ Mockingboard 1 ____________________ + +; ==================== +; Initialize Mockingboard +; ==================== +MOCK1_Init: + lda #_6522_PORT_B_OUT + sta MOCK1_DIR_B +; lda #_6522_PORT_A_OUT + sta MOCK1_DIR_A + ; NOTE: Intentional fall-into reset! +MOCK1_Reset: + lda #_6522_RESET ; -->+ + .byte $2C ; | +MOCK1_SetReg: ; | + lda #_6522_LATCH ;-->+ | + .byte $2C ; | | +MOCK1_SetData: ; | | + lda #_6522_WRITE ; | | + sta MOCK1_OR_B ;<--+ <--+ + lda #_6522_PORT_B + sta MOCK1_OR_B + rts + +; ==================== +; IN: +; X = Note Index +; OUT: +; A = trash +; X = trash +; Y = trash +; ==================== +MOCK1_ANoteX: + lda #MOCK_TONE_A_LO + .byte $2c +MOCK1_BNoteX: + lda #MOCK_TONE_B_LO + .byte $2c +MOCK1_CNoteX: + lda #MOCK_TONE_C_LO + +MOCK1_nNoteX: + sta _mock_note+1 ; X = Mockingboard Register, 0=Tone A, 2=Tone B, 4=Tone C + + lda note_to_tone_hi,x + pha + lda note_to_tone_lo,x +_mock_note: + ldx #MOCK_TONE_A_LO ; *** SELF-MODIFIED! + jsr MOCK1_PokeXA + inx ; X = MOCK_TONE_A_HI + pla + ; NOTE: Intentional fall-into MOCK1_PokeXA ! + +; ==================== +; Plays one note +; IN: +; X = Register: $0 .. $D +; A = Value +; OUT: +; A = trash +; X = unchanged +; Y = trash +; ==================== +MOCK1_PokeXA: + TAY + ; NOTE: Intentional fall-into! + +; ==================== +; Poke (set) byte to Mockingboard +; IN: +; X = Register: $0 .. $D +; Y = Value +; OUT: +; A = trash +; X = unchanged +; Y = unchanged +; ==================== +MOCK1_PokeXY: + stx MOCK1_OR_A + jsr MOCK1_SetReg + sty MOCK1_OR_A + jmp MOCK1_SetData + +; ==================== +; Stop all sounds by setting all regs to zero +; ==================== +MOCK1_Stop: + LDX #mockN_off_data + ; NOTE: Intentional fall-into! + +; ==================== +; Plays one note by setting all Mockingboard registers +; IN: +; X = Low Address of registers +; Y = High Address of +; ==================== +MOCK1_Play: + STX _mock1_load_reg+1 ; *** SELF-MODIFIES! + STY _mock1_load_reg+2 +_mock1all_regs: + ldy #0 + ldx #MOCK_REG_FIRST +_mock1_load_reg: + lda mockN_off_data,X ; *** SELF-MODIFIED! + jsr MOCK1_PokeXA + inx + cpx #MOCK_REG_NUM ; BUG: $B ! + bcc _mock1_load_reg + rts + +; === DATA === + +note_to_tone_lo: + .byte $F4 ; C4 261.626 Hz + .byte $E6 ; C4# 277.183 Hz + .byte $D9 ; D4 293.665 Hz + .byte $CD ; D4# 311.127 Hz + .byte $C1 ; E4 329.628 Hz + .byte $B7 ; F4 349.228 Hz + .byte $AC ; F4# 369.994 Hz + .byte $A3 ; G4 391.995 Hz + .byte $99 ; G4# 415.305 Hz + .byte $91 ; A4 440.000 Hz + .byte $89 ; A4# 466.164 Hz + .byte $81 ; B4 493.883 Hz + + .byte $7A ; C5 523.251 Hz + .byte $73 ; C5# 554.365 Hz + +note_to_tone_hi: + +; NOTE: Intentional Data overlap/re-use +; .byte $00 ; C4 261.626 Hz +; .byte $00 ; C4# 277.183 Hz +; .byte $00 ; D4 293.665 Hz +; .byte $00 ; D4# 311.127 Hz +; .byte $00 ; E4 329.628 Hz +; .byte $00 ; F4 349.228 Hz +; .byte $00 ; F4# 369.994 Hz +; .byte $00 ; G4 391.995 Hz +; .byte $00 ; G4# 415.305 Hz +; .byte $00 ; A4 440.000 Hz +; .byte $00 ; A4# 466.164 Hz +; .byte $00 ; B4 493.883 Hz +; .byte $00 ; C5 523.251 Hz +; .byte $00 ; C5# 554.365 Hz + +mockN_off_data: + BRK ; Reg 0,1 Tone A + BRK + BRK ; Reg 2,3 Tone B + BRK + BRK ; Reg 4,5 Tone C + BRK + BRK ; Reg 6 Noise + BRK ; Reg 7 Enable + BRK ; Reg 8 Amp A + BRK ; Reg 9 Amp B + BRK ; Reg A Amp C + BRK ; Reg B Env Low + + BRK ; Reg C Env Hi + BRK ; Reg D Env Type + + + +; ____________________ Mockingboard 2 ____________________ + +; ==================== +; Initialize Mockingboard +; ==================== +MOCK2_Init: + lda #_6522_PORT_B_OUT + sta MOCK2_DIR_B +; lda #_6522_PORT_A_OUT + sta MOCK2_DIR_A + ; NOTE: Intentional fall-into reset! +MOCK2_Reset: + lda #_6522_RESET ; -->+ + .byte $2C ; | +MOCK2_SetReg: ; | + lda #_6522_LATCH ;-->+ | + .byte $2C ; | | +MOCK2_SetData: ; | | + lda #_6522_WRITE ; | | + sta MOCK2_OR_B ;<--+ <--+ + lda #_6522_PORT_B + sta MOCK2_OR_B + rts + +; ==================== +; Plays one note +; IN: +; X = Register: $0 .. $D +; A = Value +; OUT: +; A = trash +; X = unchanged +; Y = trash +; ==================== +MOCK2_PokeXA: + TAY + ; NOTE: Intentional fall-into! + +; ==================== +; Poke (set) byte to Mockingboard +; IN: +; X = Register: $0 .. $D +; Y = Value +; OUT: +; A = trash +; X = unchanged +; Y = unchanged +; ==================== +MOCK2_PokeXY: + stx MOCK2_OR_A + jsr MOCK2_SetReg + sty MOCK2_OR_A + jmp MOCK2_SetData + +; ==================== +; Stop all sounds by setting all regs to zero +; ==================== +MOCK2_Stop: + LDX #mockN_off_data + ; NOTE: Intentional fall-into! + +; ==================== +; Plays one note by setting all Mockingboard registers +; IN: +; X = Low Address of registers +; Y = High Address of +; ==================== +MOCK2_Play: + STX _mock2_load_reg+1 ; *** SELF-MODIFIES! + STY _mock2_load_reg+2 +_mock2_all_regs: + ldy #0 + ldx #MOCK_REG_FIRST +_mock2_load_reg: + lda mockN_off_data,X ; *** SELF-MODIFIED! + jsr MOCK2_PokeXA + inx + cpx #MOCK_REG_NUM ; BUG: $B ! + bcc _mock2_load_reg + rts + +__END: +