From 3853f9a86a6c37864dc73cc85bde81c6f89edf4a Mon Sep 17 00:00:00 2001 From: Steven Hugg Date: Tue, 6 Sep 2022 13:53:45 -0500 Subject: [PATCH] vic20: added cart support, fixed bugs --- presets/vic20/hellocart.dasm | 16 +++++++++ presets/vic20/siegegame.c | 1 + res/c64.wasm | Bin 107652 -> 107655 bytes res/vic20.wasm | Bin 87545 -> 88311 bytes src/machine/vic20.ts | 67 ++++++++++++++++++++--------------- src/platform/vic20.ts | 9 +++-- 6 files changed, 62 insertions(+), 31 deletions(-) create mode 100644 presets/vic20/hellocart.dasm diff --git a/presets/vic20/hellocart.dasm b/presets/vic20/hellocart.dasm new file mode 100644 index 00000000..b95d6f9c --- /dev/null +++ b/presets/vic20/hellocart.dasm @@ -0,0 +1,16 @@ + processor 6502 + + org $a000-2 ; so we can write the ... + .word $a000 ; cartridge 2-byte header + .word Start ; start vector + .word Start ; RESTORE vector + .byte $41, $30, $c3, $c2, $cd ; "A0CBM" + +Start: + lda $9004 +WaitLine; + cmp $9004 + beq WaitLine + sta $900f + jmp Start + diff --git a/presets/vic20/siegegame.c b/presets/vic20/siegegame.c index 8c3014fc..756d6936 100644 --- a/presets/vic20/siegegame.c +++ b/presets/vic20/siegegame.c @@ -205,6 +205,7 @@ void declare_winner(byte winner) { void play_round() { reset_players(); clrscr(); + bgcolor(COLOR_BLUE); textcolor(COLOR_WHITE); draw_playfield(); while (1) { diff --git a/res/c64.wasm b/res/c64.wasm index 12cbb44d7afd2d1b23d6ad9c71134ab6a494bf7e..98d16f4ee1741f7d67feff9c3bd4c5b8e0e74622 100755 GIT binary patch delta 50 zcmV-20L}k|$p(kX2C#_?0ltHZ47Z950YiWRy|>Pc0r~|G0;fR`c0vCEaY2B9fWQH_ I)RFv`BYgPdE-JrKA*sj2$3z>DsSS+9eIi?c+*%^xAJ_^`JYubqbpPf!+&e-hAu);(Yns ze5E`$fA-S3^4k~BFIMK4#rw^lgYWeZnX}sbGMt;d0Js62(GoTCJ9Mk~9hh>U3C&Jt0aqZI-(pzx8VVy$7JPpIjILz1i!*;xpCj zq4cWG6%;0yA`}J^D3OzoTTj$uAKUwCJq{=jDAjgUy;NJ5Q@V(Lsm2dBkj-j;3)0|J zU!14EgI7DsI{J+`B+0=4Bz_*kw!>QHj>7(<%6RXZ9krC2jVDt=g37eKrSxebN`+kcb)^$P95tBCk8gLEm6mykpu+2ez~4RjHvdPS8rgD-FpGLC*uG^j2d)=akD0l z+J07QNXTn7TBl-;y#Xoa3q!=CHMA_Y_4PQ{Eq=_7sTXTd=XVYVFcvKUw z!rc9ZvX>~1$c;JFkGKR>7{Qj50tTr1Vj$AP2D#4v8#?=B42o6F#in-oRWpx?gPPkx znC*^0k8=!kIJ!G5$qt3AvLrP>lFgu?Hrln3Y2tNktTNH)vPJA#7b;D1ZM8@n*h<1^Qmj$aMsu3($Ng0~~o0@t! z3yE&lqW)v#f`)+VY>4A6u}m!=c7{dKIW9u2P(RHR@O%DnRhS?h0>Q>PYfA^kL}#X? zS-;(XVky?`V>y}tStN4ENvH9ri9BLh^7)T|zt^Y~r~53b@yJSU+V8rRhp{H#lp^pf zqG}Fyf3LCQCpV2 z1Ewhw^h0B*!sfM8*)qjecm8fHrowf;t;}Wg_UphcNU_=bIC`T1t zJqWQ<+&i-HI{hiCQ=%evjPh9}!p(^y%sl$qXA%@SAQ#f)Um?C=P`KtRF%bc8J@Zs& zmos;uv-QpG-ECmLv0H&afy$5Z{bl5d2*T{<44mx&qJZXQ;U(MEbX&xdl9E|G3q9HW zBIH13W)==)`wZ;OF3y6Po(4wr-xs0F6CjnV9hZkImr@wML+nDAhh1rq?Rs~0chdk0 MM+t3yJ_|3yKfSP7c>n+a delta 1074 zcmY*YO=}cE5Ur}7uie=-t42W-t(l0%FT{gUqKWB2gW^REBnX00f`KCFEmRIJKC0aQ zfp)&n#cs5huDN*qaB|BfCvm12v==khc7_-=o6QH!9reKD);_5RB?*I3x}xe)`jF0B zee6Z4S)8$vrN2NJKEE|6%c)~}m8`Ru1->9V|3kbA`mKOzKG1`kFOqg|>J>E>>xKPs zCjpagx?}MnfT%W|1trllFwTc-!sq`AB|~lIIDpTdr1OHZ$aUW+d-=;AJlRHaT7lSn zH^fZ&re54T>_tas=5-Tq9772mVNu~S)VY*}Rq>!cDc5dYlk0)07xV(gT&^7q%dPu~ z`dk&HGU%k`kx*%jL+X;PKq~*)i@Q6OSOxm^C&?~Vbkf2ItM!f)3L1>k=Mwu_P|1f+ zU|*u7Q^LIYVi^}gi`Cfzc()3uQzjf+CXwAmqGO=MAhCWgngamgUk$~fv#Ke`P_b#-E!bv9dlTcV*fq4SO^lm9D6J;^E|QYuMq~&Y?*?eKNGupF zIG>G2KixW4GOiRh${}NOUl|v}WLzz_=}gKpJZU0q+i9{7Pg2djQN*A a+_s*iUt*L&BuyMpzGVobrKdx927d#LP5GGs diff --git a/src/machine/vic20.ts b/src/machine/vic20.ts index 2e7d6c40..465ba4f3 100644 --- a/src/machine/vic20.ts +++ b/src/machine/vic20.ts @@ -1,6 +1,10 @@ //// WASM Machine +// http://www.zimmers.net/anonftp/pub/cbm/documents/chipdata/VIC-I.txt +// http://www.zimmers.net/anonftp/pub/cbm/maps/Vic20.MemoryMap.txt +// http://sleepingelephant.com/denial/wiki/index.php/Autostart + import { Machine } from "../common/baseplatform"; import { Probeable, TrapCondition } from "../common/devices"; import { KeyFlags } from "../common/emu"; @@ -10,7 +14,7 @@ import { BaseWASMMachine } from "../common/wasmplatform"; export class VIC20_WASMMachine extends BaseWASMMachine implements Machine, Probeable { numTotalScanlines = 312; - cpuCyclesPerLine = 63; + cpuCyclesPerLine = 71; videoOffsetBytes = -24 * 4; prgstart : number; @@ -30,42 +34,47 @@ export class VIC20_WASMMachine extends BaseWASMMachine implements Machine, Probe } // load rom if (this.romptr && this.romlen) { + let rom = this.romarr; this.exports.machine_load_rom(this.sys, this.romptr, this.romlen); - this.prgstart = this.romarr[0] + (this.romarr[1]<<8); // get load address - // look for BASIC program start - if (this.prgstart == 0x1001) { - this.prgstart = this.romarr[2] + (this.romarr[3]<<8) + 2; // point to after BASIC program - console.log("prgstart", hex(this.prgstart)); - } - // is program loaded into RAM? - if (this.prgstart < 0x8000) { - // advance BIOS a few frames - this.exports.machine_exec(this.sys, 400000); - // type in command (SYS 2061) - var cmd = "SYS "+this.prgstart+"\r"; - console.log(cmd); - for (var i=0; i