From e32e731612b2e4887f8a8e5aa05ec6f5462339d2 Mon Sep 17 00:00:00 2001 From: Steven Hugg Date: Sat, 22 Aug 2026 14:16:40 +0200 Subject: [PATCH] c64: fixed issue #203, added openroms-compatible cc65 library overrides for _cgetc and PLOT --- src/machine/c64.ts | 7 +- src/worker/lib/c64/Makefile | 13 +++ src/worker/lib/c64/openroms-compat.o | Bin 0 -> 3791 bytes src/worker/lib/c64/openroms-compat.s | 123 +++++++++++++++++++++++++++ src/worker/platforms.ts | 3 +- test/cli/testworker.js | 2 +- 6 files changed, 144 insertions(+), 4 deletions(-) create mode 100644 src/worker/lib/c64/Makefile create mode 100644 src/worker/lib/c64/openroms-compat.o create mode 100644 src/worker/lib/c64/openroms-compat.s diff --git a/src/machine/c64.ts b/src/machine/c64.ts index 0b108b34..0d282aec 100644 --- a/src/machine/c64.ts +++ b/src/machine/c64.ts @@ -28,8 +28,6 @@ export class C64_WASMMachine extends BaseWASMMachine lightpen_y = 0; loadBIOS(srcArray: Uint8Array) { - var patch1ofs = 0xea24 - 0xe000 + 0x3000; - if (srcArray[patch1ofs] == 0xc4) srcArray[patch1ofs] = 0x60; // cursor move, KIL -> RTS super.loadBIOS(srcArray); } reset() { @@ -79,6 +77,11 @@ export class C64_WASMMachine extends BaseWASMMachine for (var i=0; i<100000 && this.getPC() != this.prgstart; i++) { this.exports.machine_tick(this.sys); } + // release RETURN key + // (otherwise it stays stuck down and every keyboard read returns CR, + // e.g. conio cgetc() always returning a bogus char - GH issue #203) + this.exports.machine_key_up(this.sys, 13); + this.exports.machine_exec(this.sys, 1); // chips/kbd.c has a "sticky counter" } else { // get out of reset this.exports.machine_exec(this.sys, 100); diff --git a/src/worker/lib/c64/Makefile b/src/worker/lib/c64/Makefile new file mode 100644 index 00000000..9637077e --- /dev/null +++ b/src/worker/lib/c64/Makefile @@ -0,0 +1,13 @@ +# Rebuild the Open ROMs compatibility object for cc65 on C64. +# +# openroms-compat.o - linked before c64.lib (see src/worker/platforms.ts, +# libargs for the 'c64' platform) so it overrides +# cc65 runtime routines that depend on KERNAL entry +# points not implemented by the Open ROMs BIOS: +# _cgetc (KBDREAD $E5B4) +# PLOT ($FFF0 / UPDCRAMPTR $EA24) + +all: openroms-compat.o + +openroms-compat.o: openroms-compat.s + ca65 -I /Users/sehugg/8bitworkshop-compilers/cc65/asminc openroms-compat.s diff --git a/src/worker/lib/c64/openroms-compat.o b/src/worker/lib/c64/openroms-compat.o new file mode 100644 index 0000000000000000000000000000000000000000..1aea1349dbb72ff0866a79ccfd37568ee163cb9d GIT binary patch literal 3791 zcmY+HYj7K96^74|Wy!J=C!wVTXiM4>mzKu1B-=5!lGSP*ZLC{%C09-_YeyBf65BGC z+Juw>o!~-;`~5P*&;c9>5GdD{OM${nfR+MnN-4v@zz+r(_`wYDtD(br&#t5@lYRC* z?>Xn&Z?)fkJ1(DETiiuN3v$HdsLQcKj+1gYA)-g+V9}4s`ARweUC#2K{wa7QOmr?v zv`3D|hyA*Lh>!YT25~49I`G%6GfzcA{NxAkJNC`1`k$D-u>4>$a+wsKV`^~7qtMoQ zewc~>#UAlR;3VHoedkVu_&VYY|CA~88RB;{^*wwt#3R)ADM{TY9e?9LOYToG{8=LO;le?#15zFfOY#0z}C7!UBB#D{=;d5!p4LFg>;EySDrdC6Z?M)=jp z2}bw|n1TquL-NlmNBBm#f(X9=reK7Br~Tj-pV3-ylYb@rpK^;`^a(b38}V~Mgg>FR z;0RA5FNp9T)dffR55kMeE&h%A;BFa(xW*9-FWBTOF&DuWFQP$Ek`e@ilF__M;Nm7n7c;tRlTz8(eVSXL8#Mb;392=c34`9N2G4U)Cs z>%L2&hd31G({#@j(&cc96Jqq8mb$&6uqWPM__bJ@pOlLe$ymbW0r4*ZzN_&qkY84L z4D$CXQyR}h{#KvebdK0h<;d`{OiTH7qSHYbD-T?Dbpos8wz)c7% zP(y$z5oMsVNW28vzm6pV`1o!7bETw7Gzf_xm7SaaP-N12#^7KT$ z2EfZl^nT?vkh1ECN~nqhM-a-Q!x-}Khgx_L@oAOYAP=GPQH|FiUk;1{w*hrvI|@Ip zHLrq{ms~d^AzoLaL0}1xbtaT;g6NHCwE=7^L=ymBS=lY&o`PxsA60V(ro1!QR0Y^N zh%N)}0^S1bMa|Qi!AnZC3cO3@EF@l6A`fLZ0|(@wJX8#c>!IGJHS*3Ay#nzEG{!q9 zod9+Uq89@<0N>Mi1GSH+9D#c~AiE^d95S~;{aDkxA>Rz#2;6{l0{D@pf1*4gG07&1 zISL%)XMu+_{SoE8$`%SP1x}&hDAX@BGYX0AlSuYcqA}!urtuw+hhgGVA&VAxpUP*H zvcKRvCb$NrFN6AyW}1-Ld5C_XlrM?s?<+5dJOo^ew)d)8L%dr;T7a2Dm_oRvX&2@k z%ohS5QWKvbBJ9VqR8eq2<+qi0q4_Xe+1jMwol5x%5Y5A_0J7Cdd$SCw#%gn4wXwRs*cxr_tS(MX?wL!B#;5n}+mjzNB3^Z=)~be!*+OZ0tlX?^ zG{>5?^8=B{-GjCb9**KreFH_>&IT{qcvC%W!L*PZOT zlU;YJ>rQpu{atszH@_{Iua~jC%1}G7^2YX#t`xobo~Sb1&gJxX+|dqG2fdqH(`JB;^+iQX{T8&33wlfB_oZ@AwNW4H;kD&NAE0EaMG5)^7J>9pGfa(yeEqHM2Vg# zsZT|gq8Cq0t2VQ<(0#6*9+1OxX*X~aS{mFKJQfp>bT0ym_OnnfO6eSb(>sQx@ z{CS&=wL9a_(+O?QH|ourDyO!1donhcmdB7!Ta^K*v{5p`rftLr09l_#Tcl#@q|=Vk zQK_hUB_lYe2K~5@j*kzurR-}RowM_ul8oaI?WO}^n}LvB%1@b23X@47O0*{fp_55? z?a8Rp$s{~~GIG|*$hkckmBD0G2a{3lPbT37lSz2NWaQ29Cj*fhcFkhh!@^B1t{soZ zG;~)QCww)t*lg`k&stkNx>9p$OU<1cr|ZqOG2|PyR;}9Vmsi%v^=E8h*e+Q40n>0@ zJOdR)*+!#qa)nZ~RP<&Hw-lAqLOwem#kWB=?*7qc{gnK95jj%yoWe~5{wZTeeK8#i o&KbM^z=k~Vuvti35vPEQ^rc)ktXDf?IfbHe&$0400 + adc ZP_ROWHI + sta SCREEN_PTR+1 + ; CRAM_PTR = $D800 + offset + lda #<$D800 + clc + adc ZP_ROW + sta CRAM_PTR + lda #>$D800 + adc ZP_ROWHI + sta CRAM_PTR+1 + rts + +@read: ldx CURS_Y + ldy CURS_X + clc + rts +.endproc diff --git a/src/worker/platforms.ts b/src/worker/platforms.ts index c0a29cb1..1b0539ed 100644 --- a/src/worker/platforms.ts +++ b/src/worker/platforms.ts @@ -285,7 +285,8 @@ export var PLATFORM_PARAMS = { arch: '6502', define: ['__CBM__', '__C64__'], cfgfile: 'c64.cfg', // SYS 2061 - libargs: ['c64.lib'], + libargs: ['openroms-compat.o', 'c64.lib'], + extra_link_files: ['openroms-compat.o'], acmeargs: ['-f', 'cbm'], //extra_link_files: ['c64-cart.cfg'], }, diff --git a/test/cli/testworker.js b/test/cli/testworker.js index 99dd69b6..c2a49923 100644 --- a/test/cli/testworker.js +++ b/test/cli/testworker.js @@ -318,7 +318,7 @@ describe('Worker', function() { it('should compile C64 cc65 skeleton', function(done) { var csource = ab2str(fs.readFileSync('presets/c64/skeleton.cc65')); csource = csource.replace('#include "','//'); - compile('cc65', csource, 'c64.wasm', done, 3001, 3, 0); + compile('cc65', csource, 'c64.wasm', done, 3112, 3, 0); }); it('should compile zmachine inform6 skeleton', function(done) { var csource = ab2str(fs.readFileSync('presets/zmachine/skeleton.inform6'));