From 08af6ae3a5d062372eb374630d57e5848bd0b59f Mon Sep 17 00:00:00 2001 From: Steven Hugg Date: Sat, 18 Jul 2020 15:38:39 -0500 Subject: [PATCH] loadBIOS() now on Machine interface, updated c64 BIOS, emulator types SYS command --- doc/notes.txt | 4 +- package-lock.json | 15 ++++---- package.json | 4 +- presets/c64/eliza.c | 4 +- presets/coleco/fonts.s | 2 +- presets/sms-sms-libcv/fonts.s | 2 +- res/c64.bios | Bin 20480 -> 20480 bytes src/common/baseplatform.ts | 36 +++++++++++++++--- src/common/devices.ts | 4 ++ src/ide/ui.ts | 4 +- src/machine/c64.ts | 69 +++++++++++++++++++--------------- src/platform/astrocade.ts | 1 - src/platform/coleco.ts | 3 ++ 13 files changed, 95 insertions(+), 53 deletions(-) diff --git a/doc/notes.txt b/doc/notes.txt index 32efc55b..a7205bf5 100644 --- a/doc/notes.txt +++ b/doc/notes.txt @@ -178,7 +178,8 @@ TODO: - C64 - disk image support - https://github.com/cc65/cc65/issues/946 - - need to sync advanceFrame() w/ vsync + - player 2 joystick and keyboard conflict + - problems with cgetc() - upgrade to ES2020? - https://github.com/microsoft/TypeScript/issues/16577 @@ -386,6 +387,7 @@ Emulator Lib - MAME - debugging? - kbd instructions don't work + Markdown (showdown) interface - add code patches to files diff --git a/package-lock.json b/package-lock.json index 539451e8..036025e3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -32,9 +32,9 @@ } }, "@types/node": { - "version": "14.0.22", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.0.22.tgz", - "integrity": "sha512-emeGcJvdiZ4Z3ohbmw93E/64jRzUHAItSHt8nF7M4TGgQTiWqFVGB8KNpLGFmUHmHLvjvBgFwVlqNcq+VuGv9g==", + "version": "14.0.23", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.0.23.tgz", + "integrity": "sha512-Z4U8yDAl5TFkmYsZdFPdjeMa57NOvnaf1tljHzhouaPEp7LCj2JKkejpI1ODviIAQuW4CcQmxkQ77rnLsOOoKw==", "dev": true }, "@types/sizzle": { @@ -1067,7 +1067,8 @@ "lodash": { "version": "4.17.19", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", - "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==" + "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==", + "dev": true }, "lodash.sortby": { "version": "4.7.0", @@ -1766,9 +1767,9 @@ } }, "typescript": { - "version": "3.9.6", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.6.tgz", - "integrity": "sha512-Pspx3oKAPJtjNwE92YS05HQoY7z2SFyOpHo9MqJor3BXAGNaPUs83CuVp9VISFkSjyRfiTpmKuAYGJB7S7hOxw==", + "version": "3.9.7", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.7.tgz", + "integrity": "sha512-BLbiRkiBzAwsjut4x/dsibSTB6yWpwT5qWmC2OfuCg3GgVQCSgMs4vEctYPhsaGtd0AeuuHMkjZ2h2WG8MSzRw==", "dev": true }, "typescript-formatter": { diff --git a/package.json b/package.json index 7cbfb183..d30360c4 100644 --- a/package.json +++ b/package.json @@ -18,7 +18,7 @@ "@types/bootbox": "^4.4.36", "@types/bootstrap": "^3.4.0", "@types/jquery": "^3.5.0", - "@types/node": "^14.0.22", + "@types/node": "^14.0.23", "atob": "^2.1.x", "btoa": "^1.2.x", "clipboard": "^2.0.6", @@ -28,7 +28,7 @@ "octokat": "^0.10.0", "pngjs": "^3.4.0", "rgbquant": "^1.1.2", - "typescript": "^3.9.6", + "typescript": "^3.9.7", "typescript-formatter": "^7.2.2", "vgm-parser": "^0.6.3" }, diff --git a/presets/c64/eliza.c b/presets/c64/eliza.c index 77951e13..efc56fda 100644 --- a/presets/c64/eliza.c +++ b/presets/c64/eliza.c @@ -262,7 +262,7 @@ void readline(char *instr) { printf("Exceeded Max Line Length\n"); } c=getchar(); - } + } instr[slen]='\0'; } @@ -278,7 +278,7 @@ void main() char inputstr[MAXLINELEN]; int x,s; char *location; - + // use the first reply for each keyword match the first time you see that keyword for (x=0;xOIoaac zIa%Vn{O&gDGt??3uYt^|q_xCyiTd#13(Du~&x$2$=8uxawPo`SXT|rZXa3#C#bR_3 z_%VKoBidbLOB*?~i=5nHqxW}c#rvy#+NP=HQ)x8$ChXGj34ZcjC595bT9P`aQpzW; zu$LoWhkZ8#aY}sK3urUh{|TqP$h*o5jS`2XJ34Z#vy&Q?y%ol4P8*md>-a~u1b&Ox z{yk*b53DTHH9PRA?@4MDBPC8mKXIj`6<3jOcF~ohvBKy_8zSp2%GU~wSRDE9?Y;=| z<}SRcu`yE7k=jbWq@4WM9=?7X$=>DBkbBPsI9Vfj^lBMNF0sV zSY4r2wB87QPNiV|;YLzCXMN@!184o~z+FgQxvS<8D>u);g~O62W8`dJ-$lx{`yz2b zJ{`%~Q=U;V<;R05yuSd)r0CcR2CK-!6ziy%aS;VC`fy^{l7oz^@EZTNFy{SVx0nZ! z!9RDKeq2muMJS7Anfv&M{BENm%_)p}avkU4uyT7d9^w-Yai$=kAn{yirK}CD5{RBH z#iipP^WbW<)Gc$xd0E zvM6Pts}t3>j!2&td&^P?T_i4~i^WAWTU<<+i`gh$ZdhnoWLRv-mg~hV;h$Emo}o0Q z;{Nif$2z81H zQq-4JcR7(uAOGl!ry@ssn$ny9IArDq@2Z(S7|&|@5{45bEB95f-;#9Z)NsP#IL=y- zG{yQ?YsDKF=|8M}mZZ&VtlWQCf43^omuNLxJ3bs4>OVTIC%7SVs4ro=b@foP$;6#m zc`NCNbK_G1s{tEibGmONJZ-_=Kd@%Cn=o?WEz5Z82WJnQ8=3IFTgiV6aMtrH`_0_? zS2$~Vi7A%D9~-(a;njNrSIjKS;V7;rJd4Hk7&y-QgSGUAxi49od}5?heX^TV#o2k2 z=E!=;Yd>8w=S|$&z;>EN3_EBJd!%&aiz&WHn%cp+4vVQY73#YQ#bOrPS?F@|MiqH$ zr%M}3q1iu4FaAk-(NEF~f0CXoE~n{Ywv(noJyM}2DNvUzOHL%Tche3ri$7GMyd+Md z%ZSsTJz1Q*COchBcSVQNlx05%RD2tgXx>Bq=)nVLwd_M4Amg9dGlC^}Ms7oHTU;r+*y5Ya&e}V|loS z7nDS@JuI7GtJL8)a@uD8_?998lX$tJ%qW-`fW<}m3MP@bih7TLEwCjugnhq&jcW?~ z<}*WQXOG#Qa5H;9hG8(YnQV7IAD439FLqOxvJWc<;M?(Xz+j>!wtlm$VrBU%-XE@A zO*A+wJDFOKbpW=EfaCiFc`&Ybtn-0XDN zPv^F|Oa(ly<~csA#$lHS%lV49Oc)2?y`3(yud&y+&GPB^G=E)Do4xKo@jtiC&VODF zS$U2=Cm(b`V7#yM$9Fz4^YI7npZu>=Uc4{uxmSK|e|7%EUp+l{c3kRfPfqmGgGlD3UH4oQhG zHtVE^ixYH`zj%}mGyB9^GNGN{ex7DE<|r@t7SJ49Fe{Men-++4jaSu4%)$)IF;g~X zT#T6)q2EH~L@3L$WZ{xUOBOH5b}oT!Ys`^*7%HHFh{ouWqas8wCqR4;V7M_f2ihs- z&^&P&U5bV0ic8TxS2+{Pu`J15vUEw_l4a^Ry=)xRimW9zEC?JYlrJN@cJL3M6WDEJ zC{YmdtGEW6U=f_cPdJJWvO-HUb$r!M@{8SMUIqW@wmW(BB+6i5hH@2mne9z39PJ%b zm>h88URL-56~5>ye`1~8-@U^w1P&_kfkVoqz~5yZfAaio$>NZi?hiz`*sIEa(r@=4 z_1iH&M!sFAyIr^Qyxm`S-Y$T%pcB^gsQ4J2AwG^3(V2!P)G|&jdcBUmq4`T5| z4v2+E%UH^zDp#2S8?I73t6!yfRzGGwY~b9gDdNOp?m&ujC>qZ=7!3{A`3lz#>gFmAV62J*7~zAn z-0#nD)@P$R>$L;}Y+VeOa~SzLj2Dc99gOFStyf~eNcTCprPgaP+>q%o_i-F|=1tBN z$(anCDS|WUIg^oVHgFPW(r_j%XVP&ulVUkcFpwC-eG$!ViswFv;ciAnb1epLJuKO9 zTm&YM;a0_R#j)I}SS~ai%eBXHXKsw*tbfsSJFKX`WLh}XK_`iJ4<7w26w9q1eP zNWU4il9Tg{->A_PnQt&&eV>a2R{6#Ok@bPcU5TFf)4p0IzDOSMB%jWyQ65K1$k1!d zsb$gl+iK8^iO_6}&|ETTF6lLvH?^8Kb()KpG@5FSCSa7Sg)%fj{b9W(^9R;%LYZAs z{?V=3u`wc3)4W#gZ5!$B+IzcCbGivVi|QgYQ7pk)v0+ZRKZ+dp;QTK?(Q1lX%>52t z`J$+(D7wMv`rhG54LDs%cCX&z=QRJB{pBaz?Ka6@x-UkK*N*?vZH)R&G9v*3DcYtA zJ8VcrVtJAvz>n&KAH|Lx=r|h4O5-w_sz8gk13GpBLUvhTLZ^r`X@>X&q~GDPpRaCZ>y%1q(CGFx9C7xpxDbA1*8zyr zq;|eV!fc7>;QdB0zhP=U`bEGZsB?Nr#IlsUl%*-TDd{O`DXA$bHkuyH28&D!E*2-! z)ZilVKAI9-=t>kP&`DxCohYW!`@~c_K}-oPYmplSev-3Y5DsfJiZx!RnX1+J?uD*G zZ!^tBP(P@ms*_Md$S`ygIxnDs#IYvPMJPclzM>w9+ZomZJVG&%wdcv(HSD?eJfu_L zr}+v9js{n{#8WQ~@}`}*S(Uj#TA8HY?*}>8@r@FbR&j~s5mV4O^)@$$r3X3JHi4Ey zlF^9K^5i{W=44(yUB+aZNi-8@aUle)Vsx9;#TX3qJJLcYn>9EcaWaJxf`F%?dn!gx zak@r@CW8^D%ReF8X#)T8E0#TaS|J|V)hb#}nMVwlnXiWp+AU>(UULZFr>0(2+Aq(R{t(p6Koh}p; zful(bNB`-PC@z`CgLkP+uu3ttn4c(3u$GeO(#+9LK;WE8M-|TAt5Z+?pD(~W{2}f@ zQ09sgC9Y}Gl8G*D_N3hZk5_0?6`jbu`znjT<6_77e^r|8EP1AUPsN^H0<#U7>^dG( zG8mC&R>ExdaQm~AXfpX63o-E5R0|RfqSuCI2KgkM5n!>SF%Bm&#jl!`F@A@*)FI|N z#2n=w$h(O#PA02NX8GULSh90mEPO_?cOpleO`WQ#u`?S}<$%DEy>M{EUFmRcb_Cv&wc_z+*(LqSKJmDDOu92LO1UdtkWCI4^*Npja?cjW zW?r|)!43gC{kPqM!@>9M2L3_OnWitN+44A=1wNhJ5sB^oGcP|&v(q(l0%Sa{=|_g{ z>JSz<<`rXL>U<>%-H2%i{{_Vp zA+b7sVYzAngyNO51l%rOB}PYV_)#QD^ym_VCv)I}fg}sIK~Y{Ir9+_w3o(Uf#ZaXKk&2*RGvp$}W}e z+sXs^J{{t{d{jA$AI8!8^Z{JkqX_))VS33 zu$)8}H|Dvf$Z<5gahdBr*?{S?1RKo`GC)`yWVpR3$dG#>3^&7WvSSb1|8mIBG8i;K zdr+k-!9{448w6WHBZ({KG!;g~n5#KWqfv3bR>Nr+rJVpB_)huPz>~^vNa7bDrpjy5 zJAh!HIGuFWxrp>fWavodS?L*M+D0;ulhS(L{lgkN2D0SjV`Q@9oFib8KNBu-nvv0! zD;Pgo?qw*r5iL-`|KSJeV20#8w3X8!B5-j{^IA1Q{&o&k(1R3FQ@heGrHUGdpk`+B zW6!CHg-ArIshrZKMe<-%Zc|>)YzaHTxmlKRnkt+qHl^qQ(wK_g}es?fSsrjhnZIhQpjjtJ9zRfBsZ@btfLe0!63A^Kt?LLptyyDHfsZ zNHGav)NgjVMdQ6Q>$iosPMB_;zR8MnD2ss)R^5## zl`D)805dEx*cLux0HHGd_)_4$+c?K*y|Cba$3854jn~u`E5~l8#|@_xeHlNmtE_eS znjGc7=epe=f88#$n7{X$TED$0N0bz5`PnyG%$M=>84HdTo*;R_@?#Yz1mX$u5A=$k z2z9S&afYid*DcZ#dp8!5-d*=_+e2!O|J`LN-(%T$8u6GLUJD6#w3u)3OM>(y z*&O!i_`W{=TpzUgn0SIDD|}}!Ssz5l>fR_tEGGwh!1S}i{OZdi868qW!0d_$2nv|6 zMR0qjJ>aAod-^aGWM7p-)T|NiWOwqXf_Kt2Nb|G9d}S}KC$oC^1!2cX;-g-=UDokm z_L9F3qr~3rJB8Ez_n_|xdE=7rD2ft$e1DgOk@>&EV#qg_eD!2gNUULxZM4oQN7B7w z4gE^oMuNlCEt~14fChs$UJkI+sSlCE1HK}%aoG2lPz@rn+h|R?RW_}$lVA_&xrXiP zLyoG6t`|;{(czJ0%?z_XQPh<_OV-hHW)ug50{>2Mg@>!=TGJ1Ro1%zVp24-gaMMXQ z6?3iLyI3Z7%01;N$$)+J(GI=Hlj2xr$!mEdQ@h%{5bvTsKcCXf>Mc!e@he3xEn>Bd< z1yx?Igvb}oL*59yJ7pzOJqUdoKkr7G`fX{$zzQ<=nk#~w@5CFmT707k7wcNFHccyW z4e$pp;7Lw)dX2J?Zc=n)xQCYiTr9`ux~&8J&I{zT0n*XQ+H`cbn9sc84Og4ER&ylw zovGt1dialf+@H?wc5-)f+&FGL!uj`bt_aS+aS5EuFz&OD@3DTm`uz_!lx_U*qv~R9 zx?YL)M0vwxO*aczaCP5u5Y^@ei+mNfsE_RFt}fDw)#5hklz3FU0zs`2`=vB-t9S%J zv$eFQ_DE@e!ybGEyAn8~#5K!Zq3Y1K&=qIssQd%D*{4c;(}{_v&2Bzfk<1x!XO)}P z5v|@AOH8ee>u}--8T;4vo3E!k`J-X-Mi+Uzi!AFQhFipO-KXQn+$2-4Lqf*f^l+tL zG?U{Bo(%?|*>RsaSWw|ob^&S?KzT?l2gn6Fb!u@UZ;_z~f+ z`);Be;WTqTLbh(0Gz`m^P*R0{?H|dA8sFm2-hy0O6i1aOwYpGS+AopPBSq#bLiu(j zX+*`VdTAXr1dFQbg_7`v{bbX1@>!U4hN&jqtVEI1U5{bH2E|Alu+ZDgxqBl+<%(!=#!o?-ZUY~#m8Kb2o6SyW2f^> zke_vfEMZS?bc=aNP~~5MLS)_);=(%o6KLg}E#ek;+!GHts}tlXb8&(!tSImlelB`n z5muCYDn6%3V0p*IQ@}MCX_q!<51(*@Zo~mR4ZGP_mR%#(Al|S|fHG^C?#;$W>OxKF zKK2x(e7I7acmTa6&NFT!cO1~h77=AmKM55R5X0A7q&UQd4i8|Lr3^*U>Dtg9r!(J7 z^csy;PwN>rNMST)EIbk{JfE>}pjQ-;^*G4yMU7B?tRc;%FY8F#+`tL{K*l!U0Qj&m zpm*s4R)h|`2EQ)9wQES$wa8b6^0J~#8mYry0+LN^Um2fkdD&I{iq2{b;aV`&(}UprUnA7SiHF3mA%GD7Lk!gZv6)#;v78|sf3T%oPeRV#Ms(W0u4?miEkCk z?B!)jbP>!T*%#&udmNj|!~MK|2+LaU#DT*fB#klE9{+2A6m{dk%?!yftA$^2LCP=Y&Q@#A!pkU?oFi#NsaPs_Cb5<=fGxVo9K)Om zKq^jQlQ3Xs-?0PE=$y<`z?T6>x+%cYP$75;|ED*ll2*d8HZ+?rXGTB_JDHeZjnD}3 z06QxsnjMoNq?+W?A$Y3Wl~LroVDtX%7FlD%ab;iNb1va>pz8Ev=rKR3YXwGVswT4d zF&RI^f8Qm&9)Sw7mznUsAz#e?O4(SH{wMh&o9!=R;oC*O<+)khOTT=62FEXW>KSg< zM2^!LqG1=y?2#+Tjsajh*E-p3Y>}_0;Xu-W?FIV__o)`ieebNqxR3|mHb0jQAuk{7 zahvBRMO-L;Pb*z_PnmnS6L+Fo;m1^RlGpZt-Ubjucyt zOKi#D6}iP8s5lCcWo~^2a|g8p zQ=OEWAuSNU5h_kF19TK;djvtDcqz@2eMCG0a5~x|U#3UIetOi_Q>3-zoD!ia?C4I_ z`}Kffw`oR_Q!D!X5t#*MgN`a^^=DekGLP04T&Ep+cW3-QkSEvf+=(dyAP6lb;SCK85rBF%n8sAwCa5n=mi7wE(~}kz z;vC{Ohgj_pYaHTM{_AeGQ2o#vayLWVhq^(V6{l%rpci`sIz^SyMOtyAx)(gagk2F^ z|E#T9tzG+PZOLk_@V^W(dSrxqgFhMJLw@>Y*55Y*E#OS+y1<#BLzvu`#t1uuT7IQw z*!}s__e}JLOSrSb3fN4j_xK@pMu2@!_|AEClCo}h>(dWAPhPH4ndR*h0&`1{3(G+= z`GOvf9Ph@_ZIpE4hYYtBy^Xwe!GRy{3;`$23@00R;P5{0ZGg`AmzOm};~YNir8_ph zs-^WC7inqT#%0>(f-=xxb$Lkur^mHMF7D+yPrWqTKJR(=W6wS7Ui;kLP6(Td6O99m z6Sj7ef&qpQke*}(QZ%AbebA`O05fwZsGMi?{u4@!D+&s>@mmf;TYdr|>2En{v@Li- zd9DhYX35d1Z10T9_8L^SSEjPP)H`gi$b6M{7+}ReqfcGZ(^^3UB zmTt{i#ZLBI##^34uPKjv!d|04iH+npbj4}TBHlNqAuLby7*8j4$x&sNKaTI(%)fHA z$lRNWaO&}fuo5}aU%5}3B{mAMMd>Dw&UyNkZbe^Y9uVq;Zt-f};%@O;-Rs?(_ctom zf<`I1c&(N;9ePLWnUXtD^Wk^3z+4P~enQ@R+JbF`HC2Dph+qAU6Zhslq*Kq&IdWtrH`$SmzMvQs z9cUIDn2HmBJ8d3C9=gVuE346wq$>J<<$|lHgI!gKZmy}=K;BYd;0LeKCPfAe z1>)pcq~$uGh#bBSa1PL;Vv8z>nI;-w(+BYRp~drptj9u|i!!C!06x%PZ!T!|XbR+_ zg5!!8!+7JC|$2hjBAm%Rc39eL=I zFVoxL(HCxj6TpZ-k$k0MLyO$QYLdNCYN;~l;o2+ZZe&{IYp{mQ21wj&W-d8#g9q`B z4*UzGxs<>~Uw5F+rES^}*x=KKHqZ@$AtkEF+(tKKs^6Qy+MaAWWPS|H?LI)d`_S~! z4_M%69i(65=QW`&dbspR_1nzr;KZ+`L@+w(Tk)!NLA(ZOPd8TieeirP(*5jN_$ew~$?!PviXciSzhZz^!k5~I zG+ZElCL_u2$LBquZ5ePcn>PX8w5pnUeGFe#Fkk_^%)Lf_)uZ~WM)=Zp{_a69eq?&v zm`pa`aOB!OV<0?}&Cx~jbr=u_tOg<}Adn8R95`G>%Pp@6jAw*xJ+O+5VZb`tdOW}! z12X&zgQyiUoVP22>zL(iT&JY@5@9aib`e{LR$NCvuyyFf59CoO``8z2$x+J~Y<(cm zPnAbJQS3x!V7K(s#?O>gb}m}%{?H&IQh)97CA;F;E8>5g!TW=(F}#i~0gY3r_{@)J z=sr2luhBH_2gCX-^clpAiS)@T#O~oHwyz1a`J%uR3~*Z$Zh%$9+d5`}U>F0ld^$@G zslsKhF&rp8LQlcGpIQTzQN79XV=(6pX|fSI89D*?hW+5TbO>=JGTe<|&zy3zWDMarQ5zQ(;rp(0z z$+TbAH(hBu+SK24#G4A<+k1o0=)Vb}qlrnHaH4TPpVsjN&sM*e)0coqDJ*ZH3}$&>-ely8`SyMrM2_Mq=F^Tz{l z&*4W0G)g3>!q?ytb!fyK^L?aR!BWtTHGuoAsBcuhJ*XDJ1E*h#`{@_rK7sBRzhWjs z0I9eWq`HsAhY+Od2El|6?hCRgRoh6}X(>x}WPCEBRES8GGiM1=DfNv7VB)WXw{s)D zKMRH(x}x@$eo*_u2~x{IUL3FR2#zs_-t3)*;0_{HzD|}$Xhb76kV*JJReXv3`4T={ zzSZF|)PBLf;WQ-4*T{e0^6e$1w|vifH16m48BXjkI82H!0V|t2@wN$cyMm*V$o}m< zZSBs$WTm~C{T=y2K965!6g8OT^A`5eG1vpB8-+E*dh-#ZX;I@e9n6Ek#E6#h2$cQ# z62f^aPI<#0lDKYJm&fIM(@K(MQV=F@Bd`-D?qNP+jKnF?)D<-gQtpb%7hQtIGvv+W z`!2c1&;PxJc|EtuC$NP{gg3QN<9)y_&7b&6WQpl4oIONryhgA@a-x?xe`md`OXAM* z>$>)Rb;y>9Bl$>jg8Tlm(>FmeN@|G3wxrT`iItcY_!o0Nk|Vt_h>U^tdZTQ!Ll-5`fh{UmU1{=$jejMXo zaUX7YzYy9dYeV}XGL74?!F`Q20{z6Cgb$#&8Ror3!+T@b!=D&tH8;H`>c(%^N2A`G zj>p4{kSOtpWJl9&>?i*~K5)3yPq$G%_pwE#;MJF0`AHUsmSX`OF z(lLt!CJt(%qRluJ(t!yRU1WnsBA4vUoJBebMi5w|WQM?zN#{ypNcwxL1MWWGv)>XATD<77nXY@rO>m`+GrBUzjhu;VI^+j& zon|k?AA51=ru!av()j^R9qgW-8;%TmEm9^czUj$K6p zohoL~6mg+Ya=g*(VFopwF)M0~*(%6Lv||%>n~pyF&XYk)52WEw z;@!x4^x5A(`OdS=`Iatf-}H=Vr*?(23U~|+Z=@S7t>j*VMgJSFlh=^!3|$c>~ycyLG_ zGmtY3wR+hqye8|B$MEuHtCp=>!E zd<9vG#t!ws&*hvw#etufojkcu0};WG!ZnJ z4hK#4#`CtrL-_JI-aD92!WN!vleNQh=gdW9P7{;6VuF=09ZDC>71@O^=PNxmFV*DK zyrQ%w4V3tmp72ZIoSLb6k${h1m2M(r_nuv*h}^!u9>tP%rm*l zqejo`peFTniOGw&K&HYI+u^_jc&u&0tG{ApY0k{RJl_Ip63sFaO>k|MIq`K^gUetX zwl=W|e^}z<@#{^@FjOAz^pKke@797RY__b4^I<`@T{am>#$sg1xBOz4Mg|O%Sm?ZD#4EaGzyPf>4)OB;{$hZaaeyFII+$?n^3>(LFl)BP}{fC3eHGq|9d_pGA z%gkN^^Hp6kv@ne)FL+o5*aY80ETLw?Fhd5FRgEmORgEaKK`Q~2G8Wq12kqEKv5vOM zta5m(!i7P}whpM=>(_Oa11tl9gbvbq;&14DhqwUCS80ZEpZEfIHC`>G8xForU34G){^~pQUHTq%6wzY(KK+1xNcYo^=*Lu|2dJBVLOqny z5_*u9Qkj;~L-a89(sFu)`e+6HlzvA4LXXnV=`s3OT1k)7FX)%FihlLK|CjNab9W^>$|Mb6_S#GBfxU_`G9^kp?^mkiZQy`9O~e1;k>jO!d|Z{m)L^@wjH7I|)^ng4LSRk}ee4^t>92YZ(Qxm->~T?Q$YaMkteafL{D4&K+ntp<+&Qd;meqiaCLP zg$w!v4(P`Z{rni7OD=nhtefVDbLd>yF4hEUA$3)tUtI~hwlY~&7efbXKvh>)%y}4o zWkt5C#zq*(Udnn_CkEoxVNlo@uMUEFM*r(ecohTV91`#=8;u%q5Xa{x?Pcps&f4B52P?311B7sAS3DPeB zpt&sOk>;QWYT%&9HQjuVV+>_D*INZG-R5^T1}(kfZy{Y^F%%3ni07%PV3@&cF`OM{ zP~yvn8gzxsV{m_7kWB>%hH{Gm_7{vWX21x^iLV0pJEwsvnm`qK$kOx5c&Oz~Fo-6M z8mT#80Zkb#;nuI5qaEKQ7?dyJ_2HqcAJCr2P(#FGARE4d(Lni|_Y5_Fy>jAtn1yw7 zf&pd*FJS^EF_xOe!JgO>Q#h8!1}-T)S#_cc87^-7NeMOkYX&QAC9y#e_po5qwx3`Z zV%ZZmjVHIhl5+L512%bJ=b8RQ1#PwBgmV!GZoLG z0GI=02&}-3Ee>i@fZ{-}W-*o--N{Cn$fGn?8P!Zp0fWlRT8i8s#LqOcx6d?^(ngQD z5*cFR!TE-nAJ?0~3(`2y0t8ap7=&3o(s}gS9x*5G~%4pbgcASrWD3BSva* zR&5j{Mr&inYU9Rh6R>vAy%V*#N!sN5v?(Y_<40=A=zeW#iZ*7Nma0wH(zF@c%vm$F z*>mP<4`?&f=grqfJAR`X7ibgHu4S!9M+4S~}3VVTq-|nuyn4#tWvM zM4|k(ZBS+Tk7#{i+aC~VSv&$Q>c%~5x)$KiguUw*JJz9%DbJ&}^mB{R0{k0va0D-~EDHXHO=UFSC|R zo{c(3Jl&35ThYd??OJMoT*pSoN`%&;j#pQr*U&9A;yIyX%Z4SWqy3)T&l6DV+?+b} z%*FAJ#CxPf=`#UV0`pyadHO`SVcNKHD=NfoGt+W1pGF&Z%(dvNV$0juxFZA2Mm@jB zFxH!$7Jb+QzWQEE!&+$EuomWo-`Rm$-$kuA(BAdAAkS9UcGNZ$E$Ts2I{K3)qQ9Vm z*8ZgFHjwlNyki{dpV~jI|Nj2z{m=YPnv41u_Gk1j*tT~x#Dm*W_ z+R%h`N^3e2GpA&}mRUPtB`VC^@#-Yh`3JP66}5IjvhdSeXj5C)^hqdmWD;siD@>T_ z5OjwFH)&YqniCf*n^dE0$T`-OZ&AqN zH|AJF2O*GS_rxZkgW%eyLL`tPrpmlHO+rP5Q~iZg({ZuZmhi{pzC9j!EFKu&EN;HNM|gujIqYk*mOrI15h_Uv=DOf*AX~Dp2SHs z7GmX-6oNt)O~$f#`8veQR-v!+-=U}=0HZ*=+zE}b%HUFZ-grTcDk85%imtpAQevw1 zgltuR4B3RBX0+izFZf#H6}i74>I%Nyi%qw&Gb~x~6XC*7{nf)24k(sIQQ51hw|!S(e?Gwb z!|e5`WgkHLM8DDoxiYBG^nnA0tG!Jw-3Cpn!q12At8(^G@a&e9xXWs5_lOR?L=PSPil}<>wW1#l{r}jvwsY;1JCa81? z%*Xs)pnq2~YtC90&~wUUeLox(wc*vXMJ^&V#I5@JoVM9 zor7TPdh*sSm@_`yLRwqB1zf=%4mP5IbE7@emEh0Q6*ZO`k~0;fY=KhASZP!X(B;Zl zwP3nZnV?QHTvlSB*{G2!yw0~Y;_sT>$gzjJ>_wM@@BmH`uRPnl2VK_tGh9|z;#HBK zp_z?#sSiRV(sRpgs!EAKuT^6safZvl-$nrqoFthprbLvOBI_HoBc)^#92T{t#Ro0t zt2Na;(1kit&J@oGUIUCG@fSC=s8RWrZlUr;M~m25`ErZcRry>?>FG1->YZog5e2(B zT66Z#obLshFL;Zq&U8js{#hl3%@v(xu!7`~0gDpXxX2mP__WWs3#3`Ls|*MiTV1k2 z<=nZu)Iv{9@qcmQ8o|4ZON%RV^H(0bp&Emh?zEfU-JBZr&2CQczQw7I_r7_HW8`r+ z2O|kNdpW0Z?8hIDpYYN4ciw%ksQCR41o!WWsl^$6cn4R$o!h;G+q0b$$P$engN=T? z8&A~ealF0F_p@xk<63^Co*a1M&-($TPKh1|D`h6p z4o%L5^mf4UnT3OW>t$9@t(mQ0evfp=G=i1py;o$TU|(na%3x3n#a>$So>h($!b)jH zpv+#ntK>Z#X#qNYEKF%(ZaVU&u_cI->6$7+R3}W0;>d#-0_H{)q#9g=i zJN=;eiiFfJpoQCbWoy4W803Y6tqxA~8NuT(!}wzj-_Sr4EouzD2v{Ljt0r0vXGK5sl5IB@a3)0S)2}CiK5xB7>#f<4 z!XN#@G7ZLhum)BhW;fTi`SU99Bz|U$lf+(=M!Ay&8Iw8ZdSS`eIQF5GBAacY;_o-3ocyEuLjS^!?{;mLBVQN#zU|!Buy67i5 zbpF&se%tC^>n#D*;@nxFIrKQ76wp|KItBV2F4cTI*f061HDCrbh;s6Q32+qVHdgVu zSFZIbJb;+sDaubXU0ly8-Rzi*MWR(Rdo8yBOX@T;8%d2yB71w1$lPB%4V4!W93^L^ z$Wz2`;Uu!ihO=Ao+Y#)@ZY7VXC>Kka)k34indV!q{8okOC!555-r)-1#&AU#5*KSS znKb~H9f7H9cpur-LW}V~BH)C$ zYxI3RMb3p7ye0s&#(}`kijH%j4WLtJg)*qM3v5Ila9yC-pz8Wm&0BC@4;Fgx?VETR ztmhFmFvc0r;4<*EkI&8(0=Wz>Gljkr4u_`ydV6y%I4aj*FmO?3yz_M4DQSY!RGG*Z zo&wHtsyGo&+Pj5r+rthBY6F9^(^yOj*aoQ!AU>GdJ~&S)1N(S8ayLU(bQjq?Me3k@ z@OJo=MqX6yrFd35+1RZMG@}Pc^?~FpJb6-u=~~IV;9X81Qxht_@Si?rRSfB1vI#Au zNCh!SlUdbRN50ZcKe5DuA2(ui1SIi^urqzm-kGx>m@#JRw1T*~^Jby6)WU@Q<;pED-a^6Zx=mGPi&#t-y!DHPyUowYp2Z5E65Wx@@h6Yh9(H^`4=7j^%eE=CS?VZZgyF2wiA z+&0$WQAWeyJ&d=aI|h??+F@{C5~E4X3dr)1>%ijiZDmF2o65y=#Obo8Rdkl)-mO6e*()8OO82H}o>VE&dYgYg*!&eH4yi83CiGIHvACquP)yX&}3(Frg{mFWUe1(l%cWuF|1VKsYkHe zNowcLBYEXzM-Af1qe%QZXC|-9Z$NO|br9SZ8~&sZVgbC=5dueIL(k$?@=R-3awyT^1Bx;1CJ)`B2Lhwv>!~}CrL@Ab z+~NWCy4+K+my^2-oE-Be;@{l{h_2j&_WYSqUvR)nLvk)~Qk@3_!(5?>g+ZXOvI7bs zZ!8oG1uz=W+}HKMMhDWnfz68{r-K0o`9EziUcINmodm*4Go-jz!`XVRSWD}&kyr;B zTgO%z;GHqFHgL_!HwV{19W=)0G*E2>2&s@Qj*-AZ@HOf3R>!5RZO{NHOmMN z%?xm{!!sVPD7cJpMZ;x+%M4cxTq;~h1m@w4$sBm(!UH~DSwTDC2H-5CK5IdkUXGGABmlEyV#}kc2il^q=>6~ z`7GBTZK>Q_J+8yHd+oaOUDvY(oRBjba}jvrN16L^o8aW}6P3q4m3kf)J-%pgGvt&` zC4l`voow(um)5y8Kw^tIsC1_>*A4t)i{58e%N@^^{6iW31rBHyrOe~Oxq+;7K(-eQ zSHOL3adI`E=na6SKpW~wjxVcvP*13~l6`DG(E8PfXFDE&VCxEuO81fNzX-Gg&USlf zd!Sk!1Z%c#Y7c~+*J~PnH9OtpE{Gi>^8sLT^kNz>C#A@%b;Cn${;uiymCmp?To*nP z?g%P3=wZ1zJ#@J2*SA5XLpQjIx~$;4890tj3e!NU60KhkM;CpaR51p8{R;!}&oM{>yFOUi{u|`1omYEhFUk2ZUT6@z4dQ5GTkc>|s^Klhl1nyUxYClz)S?m8{-}qrTfSjQahzxe; z;^@90T=~j%ol=K;0ln8Tz?1QDtJLRCBjZ%p zxJQ0x^;(r=uE45*217E2Q`+5A@(k`4m;A`2b*4S&3OmdhILdJ+>=|;|y?syIW%739 z)XB5yY52c80CdGVw(BJgs#Quldcnd;tKnnKuUHc#y?vDFgpN22S33mP{dfmZHo_h^%;QEke9;Q2bDjOM$Qbh2=~PwdHDex)3gh z55h+T@OY;n2t6%?PeJ}PJ$>c~?B%I5II}NH3UW4@4@V{tGEv}R-t3#(>jD)T4 z2AztM$0<$nSO{;dAu>KB?!Oxl{Gms;+WRdgAe>2HwJa=9$rrbBg6a1=svO$ zNP37|x=AMY6SbNA=^EMHNB$TgJ6Z^L4M;fI-bV7<$=4AwBtnKqaz^v6Q(2=XWk<-9 ik(?wx=YBpXg(v(i(s+{$3Q6ES1cY8~`RO)) extends BaseDebugPlatform implements Platform { machine : T; @@ -1064,6 +1067,11 @@ export abstract class BaseMachinePlatform extends BaseDebugPl m.connectProbe(null); }; } + if (hasBIOS(m)) { + this.loadBIOS = (title, data) => { + m.loadBIOS(data, title); + }; + } } loadROM(title, data) { @@ -1071,12 +1079,18 @@ export abstract class BaseMachinePlatform extends BaseDebugPl this.reset(); } + loadBIOS; // only set if hasBIOS() is true + pollControls() { this.poller && this.poller.poll(); if (hasPaddleInput(this.machine)) { this.machine.setPaddleInput(0, this.video.paddle_x); this.machine.setPaddleInput(1, this.video.paddle_y); } + // TODO: put into interface + if (this.machine['pollControls']) { + this.machine['pollControls'](); + } } advance(novideo:boolean) { @@ -1209,6 +1223,8 @@ export abstract class BaseWASMMachine { romptr : number; romlen : number; romarr : Uint8Array; + biosptr : number; + biosarr : Uint8Array; audio : SampledAudioSink; audioarr : Float32Array; probe : ProbeAll; @@ -1246,12 +1262,11 @@ export abstract class BaseWASMMachine { // fetch BIOS var biosResponse = await fetch('res/'+this.prefix+'.bios'); var biosBinary = await biosResponse.arrayBuffer(); - const cBIOSPointer = this.exports.malloc(0x5000); - const srcArray = new Uint8Array(biosBinary); - const destArray = new Uint8Array(this.exports.memory.buffer, cBIOSPointer, 0x5000); - destArray.set(srcArray); + this.biosptr = this.exports.malloc(biosBinary.byteLength); + this.biosarr = new Uint8Array(this.exports.memory.buffer, this.biosptr, biosBinary.byteLength); + this.loadBIOS(new Uint8Array(biosBinary)); // init machine instance - this.sys = this.exports.machine_init(cBIOSPointer); + this.sys = this.exports.machine_init(this.biosptr); console.log('machine_init', this.sys); // create state buffers var statesize = this.exports.machine_get_state_size(); @@ -1287,9 +1302,18 @@ export abstract class BaseWASMMachine { this.romlen = rom.length; this.reset(); } + // TODO: can't load after machine_init + loadBIOS(srcArray: Uint8Array) { + this.biosarr.set(srcArray); + } reset() { this.exports.machine_reset(this.sys); } + /* TODO: we don't need this because c64_exec does this? + pollControls() { + this.exports.machine_start_frame(this.sys); + } + */ read(address: number) : number { return this.exports.machine_mem_read(this.sys, address & 0xffff); } diff --git a/src/common/devices.ts b/src/common/devices.ts index c017c44a..284d57cd 100644 --- a/src/common/devices.ts +++ b/src/common/devices.ts @@ -63,6 +63,10 @@ export interface AcceptsROM { loadROM(data:Uint8Array, title?:string) : void; } +export interface AcceptsBIOS { + loadBIOS(data:Uint8Array, title?:string) : void; +} + export interface Resettable { reset() : void; } diff --git a/src/ide/ui.ts b/src/ide/ui.ts index ade922b6..f467fa13 100644 --- a/src/ide/ui.ts +++ b/src/ide/ui.ts @@ -1076,8 +1076,8 @@ async function loadBIOSFromProject() { var biospath = platform_id + '.rom'; var biosdata = await store.getItem(biospath); if (biosdata instanceof Uint8Array) { - console.log('loading BIOS') - platform.loadBIOS('BIOS', biosdata); + console.log('loading BIOS', biospath, biosdata.length + " bytes") + platform.loadBIOS(biospath, biosdata); } else { console.log('BIOS file must be binary') } diff --git a/src/machine/c64.ts b/src/machine/c64.ts index a259eaa3..4cb0d2f1 100644 --- a/src/machine/c64.ts +++ b/src/machine/c64.ts @@ -24,8 +24,17 @@ export class C64_WASMMachine extends BaseWASMMachine implements Machine, Probeab joymask0 = 0; joymask1 = 0; + loadBIOS(srcArray: Uint8Array) { + var patch1ofs = 0xea24 - 0xe000 + 0x3000; + /*if (srcArray[patch1ofs] == 0x02)*/ srcArray[patch1ofs] = 0x60; // cursor move, KIL -> RTS + super.loadBIOS(srcArray); + } reset() { super.reset(); + // clear keyboard + for (var ch=0; ch<128; ch++) { + this.setKeyInput(ch, 0, KeyFlags.KeyUp); + } // load rom if (this.romptr && this.romlen) { this.exports.machine_load_rom(this.sys, this.romptr, this.romlen); @@ -35,38 +44,36 @@ export class C64_WASMMachine extends BaseWASMMachine implements Machine, Probeab this.prgstart = this.romarr[2] + (this.romarr[3]<<8) + 2; // point to after BASIC program console.log("prgstart", hex(this.prgstart)); } - } - // clear keyboard - for (var ch=0; ch<128; ch++) { - this.setKeyInput(ch, 0, KeyFlags.KeyUp); - } - // is program loaded into RAM? - if (this.prgstart < 0x8000) { - // advance BIOS a few frames - this.exports.machine_exec(this.sys, 150000); - // set IRQ routine @ 0x314 - var old0x314 = this.read(0x314) + this.read(0x315) * 256; - this.write(0x314, this.prgstart & 0xff); - this.write(0x315, (this.prgstart >> 8) & 0xff); - // wait until IRQ fires - for (var i=0; i<50000 && this.getPC() != this.prgstart; i++) { - this.exports.machine_tick(this.sys); - } - // reset 0x314 to old value - this.write(0x314, old0x314 & 0xff); - this.write(0x315, old0x314 >> 8); - } else { - // get out of reset - this.exports.machine_exec(this.sys, 100); - // wait until cartridge start - // TODO: detect ROM cartridge - var warmstart = this.romarr[0x4] + this.romarr[0x5]*256; - for (var i=0; i<150000 && this.getPC() != warmstart; i++) { - this.exports.machine_tick(this.sys); + // is program loaded into RAM? + if (this.prgstart < 0x8000) { + // advance BIOS a few frames + this.exports.machine_exec(this.sys, 250000); + // type in command (SYS 2061) + var cmd = "SYS "+this.prgstart+"\r"; + for (var i=0; i impl getPresets() { return ASTROCADE_PRESETS; } getDefaultExtension() { return ".c"; }; readAddress(a) { return this.machine.read(a); } - loadBIOS(title,bios) { this.machine.loadBIOS(bios); } getMemoryMap = function() { return { main:[ {name:'BIOS',start:0x0,size:0x2000,type:'rom'}, //{name:'Cart ROM',start:0x2000,size:0x2000,type:'rom'}, diff --git a/src/platform/coleco.ts b/src/platform/coleco.ts index db60c316..b1a768a8 100644 --- a/src/platform/coleco.ts +++ b/src/platform/coleco.ts @@ -32,6 +32,9 @@ class ColecoVisionPlatform extends BaseZ80MachinePlatform implemen {name:'BIOS',start:0x0,size:0x2000,type:'rom'}, {name:'Cartridge Header',start:0x8000,size:0x100,type:'rom'}, ] } }; + showHelp(tool:string, ident:string) { + window.open("https://8bitworkshop.com/blog/platforms/coleco/", "_help"); + } } /// MAME support