From b7eb1c5c7b58baebb992ebc693487f873e66ac4f Mon Sep 17 00:00:00 2001 From: Lance Ewing Date: Sat, 7 Feb 2026 10:52:59 +0000 Subject: [PATCH 1/5] Started adding support for the VIC44K mode. --- assets/data/programs.json | 9 ++++ assets/roms/vic_44k_basic.rom | Bin 0 -> 8192 bytes assets/roms/vic_44k_kernal.rom | Bin 0 -> 8192 bytes core/src/main/java/emu/jvic/JVic.java | 2 + core/src/main/java/emu/jvic/JVicRunner.java | 42 +++++++++++++++ core/src/main/java/emu/jvic/Machine.java | 3 ++ .../src/main/java/emu/jvic/MachineScreen.java | 1 + core/src/main/java/emu/jvic/MachineType.java | 8 ++- core/src/main/java/emu/jvic/video/Vic.java | 5 +- core/src/main/java/emu/jvic/video/Vic44.java | 18 ++++++- core/src/main/java/emu/jvic/video/Vic44k.java | 50 ++++++++++++++++++ .../main/java/emu/jvic/gwt/GwtJVicRunner.java | 10 +--- .../emu/jvic/lwjgl3/DesktopJVicRunner.java | 10 +--- 13 files changed, 138 insertions(+), 20 deletions(-) create mode 100644 assets/roms/vic_44k_basic.rom create mode 100644 assets/roms/vic_44k_kernal.rom create mode 100644 core/src/main/java/emu/jvic/video/Vic44k.java diff --git a/assets/data/programs.json b/assets/data/programs.json index 038515d..978ec2a 100644 --- a/assets/data/programs.json +++ b/assets/data/programs.json @@ -781,6 +781,15 @@ "machineType": "VIC44", "ram": "RAM_UNEXPANDED" }, + { + "name": "VIC44K", + "displayName": "VIC 44K", + "filePath": "", + "fileType": "ROM", + "iconPath": "screenshots/V/VIC44/VIC44.png", + "machineType": "VIC44K", + "ram": "RAM_UNEXPANDED" + }, { "name": "Whack-E", "filePath": "https://archive.org/download/tosec-20161111-commodore-vic-20_20170305/TOSEC.2016.11.11.Commodore.VIC20.AlphaBot.zip/TOSEC.2016.11.11.Commodore.VIC20.AlphaBot%2FCommodore%20VIC20%20-%20Games%20-%20%5BPRG%5D%2FWhack-E%20%282009%29%28McCrea%2C%20Steve%29.zip", diff --git a/assets/roms/vic_44k_basic.rom b/assets/roms/vic_44k_basic.rom new file mode 100644 index 0000000000000000000000000000000000000000..038f86eadd8abd0206cf29dcb845a91496ce7975 GIT binary patch literal 8192 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 literal 0 HcmV?d00001 diff --git a/assets/roms/vic_44k_kernal.rom b/assets/roms/vic_44k_kernal.rom new file mode 100644 index 0000000000000000000000000000000000000000..67827a27a47878c3f18935116c50f050f497cc6a GIT binary patch literal 8192 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 Mf#T5A!4HD}3r7=y`v3p{ literal 0 HcmV?d00001 diff --git a/core/src/main/java/emu/jvic/JVic.java b/core/src/main/java/emu/jvic/JVic.java index 99c5c3f..93653eb 100644 --- a/core/src/main/java/emu/jvic/JVic.java +++ b/core/src/main/java/emu/jvic/JVic.java @@ -172,6 +172,8 @@ private void applyTvConfig(AppConfigItem appConfigItem, String tv) { case "VIC44": appConfigItem.setMachineType("VIC44"); break; + case "VIC44K": + appConfigItem.setMachineType("VIC44K"); default: break; } diff --git a/core/src/main/java/emu/jvic/JVicRunner.java b/core/src/main/java/emu/jvic/JVicRunner.java index 96bb166..1dcef12 100644 --- a/core/src/main/java/emu/jvic/JVicRunner.java +++ b/core/src/main/java/emu/jvic/JVicRunner.java @@ -192,6 +192,48 @@ public MachineInputProcessor getMachineInputProcessor() { return (machineScreen != null? machineScreen.getMachineInputProcessor() : null); } + public byte[] loadKernalRom(MachineType machineType) { + byte[] kernalRom = null; + + switch (machineType) { + case NTSC: + kernalRom = Gdx.files.internal("roms/kernal_ntsc.rom").readBytes(); + break; + case PAL: + kernalRom = Gdx.files.internal("roms/kernal_pal.rom").readBytes(); + break; + case VIC44: + kernalRom = Gdx.files.internal("roms/vic_44_kernal.rom").readBytes(); + break; + case VIC44K: + kernalRom = Gdx.files.internal("roms/vic_44k_kernal.rom").readBytes(); + break; + } + + return kernalRom; + } + + public byte[] loadBasicRom(MachineType machineType) { + byte[] basicRom = null; + + switch (machineType) { + case NTSC: + basicRom = Gdx.files.internal("roms/basic.rom").readBytes(); + break; + case PAL: + basicRom = Gdx.files.internal("roms/basic.rom").readBytes(); + break; + case VIC44: + basicRom = Gdx.files.internal("roms/vic_44_basic.rom").readBytes(); + break; + case VIC44K: + basicRom = Gdx.files.internal("roms/vic_44k_basic.rom").readBytes(); + break; + } + + return basicRom; + } + public abstract void start(AppConfigItem appConfigItem); public abstract void reset(); diff --git a/core/src/main/java/emu/jvic/Machine.java b/core/src/main/java/emu/jvic/Machine.java index b7da7a6..2601619 100644 --- a/core/src/main/java/emu/jvic/Machine.java +++ b/core/src/main/java/emu/jvic/Machine.java @@ -22,6 +22,7 @@ import emu.jvic.sound.libgdx.GdxSoundGenerator; import emu.jvic.video.Vic; import emu.jvic.video.Vic44; +import emu.jvic.video.Vic44k; import emu.jvic.video.Vic6560; import emu.jvic.video.Vic6561; @@ -138,6 +139,8 @@ public Callable> init( // Create the VIC chip and configure it as per the current TV type. if (machineType.isVIC44()) { vic = new Vic44(pixelData, machineType, snapshot); + } else if (machineType.isVIC44K()) { + vic = new Vic44k(pixelData, machineType, snapshot); } else if (machineType.isNTSC()) { vic = new Vic6560(pixelData, machineType, snapshot); } else { diff --git a/core/src/main/java/emu/jvic/MachineScreen.java b/core/src/main/java/emu/jvic/MachineScreen.java index b687774..2610009 100644 --- a/core/src/main/java/emu/jvic/MachineScreen.java +++ b/core/src/main/java/emu/jvic/MachineScreen.java @@ -157,6 +157,7 @@ public MachineScreen(JVic jvic, JVicRunner jvicRunner, DialogHandler dialogHandl createScreenResourcesForMachineType(MachineType.PAL); createScreenResourcesForMachineType(MachineType.NTSC); createScreenResourcesForMachineType(MachineType.VIC44); + createScreenResourcesForMachineType(MachineType.VIC44K); warpSpeedIcon = new Texture("png/warp_speed_icon.png"); cameraIcon = new Texture("png/camera_icon.png"); diff --git a/core/src/main/java/emu/jvic/MachineType.java b/core/src/main/java/emu/jvic/MachineType.java index 1f3d51c..96af504 100644 --- a/core/src/main/java/emu/jvic/MachineType.java +++ b/core/src/main/java/emu/jvic/MachineType.java @@ -11,7 +11,9 @@ public enum MachineType { NTSC(1022727, 260, 263, 199, 252, 49, 8, 60), - VIC44(1108405, 568, 312, 440, 272, 103, 31, 50); + VIC44(1108405, 568, 312, 440, 272, 103, 31, 50), + + VIC44K(1108405, 568, 312, 440, 272, 103, 31, 50); private int cyclesPerSecond; private int totalScreenWidth; @@ -147,4 +149,8 @@ public boolean isNTSC() { public boolean isVIC44() { return equals(VIC44); } + + public boolean isVIC44K() { + return equals(VIC44K); + } } diff --git a/core/src/main/java/emu/jvic/video/Vic.java b/core/src/main/java/emu/jvic/video/Vic.java index b679b06..0ed7516 100644 --- a/core/src/main/java/emu/jvic/video/Vic.java +++ b/core/src/main/java/emu/jvic/video/Vic.java @@ -42,8 +42,8 @@ public abstract class Vic extends MemoryMappedChip { /** * A lookup table to map between the VIC chip's memory addresses and VIC 20 memory map. */ - protected final static int[] VIC_MEM_TABLE = new int[0x4000]; - { + protected final int[] VIC_MEM_TABLE = new int[0x4000]; + private void buildMemTable() { for (int i=0; i<0x2000; i++) { VIC_MEM_TABLE[i] = 0x8000 + i; } @@ -166,6 +166,7 @@ public Vic(PixelData pixelData, MachineType machineType, Snapshot snapshot) { this.machineType = machineType; reset(); + buildMemTable(); if (snapshot != null) { loadSnapshot(snapshot); diff --git a/core/src/main/java/emu/jvic/video/Vic44.java b/core/src/main/java/emu/jvic/video/Vic44.java index 6246d22..d8ddf61 100644 --- a/core/src/main/java/emu/jvic/video/Vic44.java +++ b/core/src/main/java/emu/jvic/video/Vic44.java @@ -91,6 +91,9 @@ public class Vic44 extends Vic { private int[] pal_palette = pal_palette_e; private int[] pal_trunc_palette = pal_palette; + private static final int VIC44_COLOUR_RAM_BASE_ADDRESS = 0x9400; + private int colourRamBaseAddress; + /** * Constructor for Vic44. * @@ -99,7 +102,20 @@ public class Vic44 extends Vic { * @param snapshot Optional snapshot of the machine state to start with. */ public Vic44(PixelData pixelData, MachineType machineType, Snapshot snapshot) { + this(pixelData, machineType, snapshot, VIC44_COLOUR_RAM_BASE_ADDRESS); + } + + /** + * Constructor for Vic44. + * + * @param pixelData Interface to the platform specific mechanism for writing pixels. + * @param machineType The type of machine, PAL or NTSC. + * @param snapshot Optional snapshot of the machine state to start with. + * @param colourRamBaseAddress The base address for colour RAM. + */ + public Vic44(PixelData pixelData, MachineType machineType, Snapshot snapshot, int colourRamBaseAddress) { super(pixelData, machineType, snapshot); + this.colourRamBaseAddress = colourRamBaseAddress; } /** @@ -846,7 +862,7 @@ public boolean emulateCycle() { // index also happens to automatically fetch the foreground colour from the // Colour Matrix via the top 4 lines of the data bus (DB8-DB11), which are // wired directly from colour RAM in to the VIC chip. - colourData = mem[0x9400 + (screenAddress & 0x3ff)]; + colourData = mem[colourRamBaseAddress + (screenAddress & 0x3ff)]; // Output the 1st pixel of next character. Note that this is not the character // that relates to the cell index and colour data fetched above. diff --git a/core/src/main/java/emu/jvic/video/Vic44k.java b/core/src/main/java/emu/jvic/video/Vic44k.java new file mode 100644 index 0000000..b44109a --- /dev/null +++ b/core/src/main/java/emu/jvic/video/Vic44k.java @@ -0,0 +1,50 @@ +package emu.jvic.video; + +import emu.jvic.MachineType; +import emu.jvic.PixelData; +import emu.jvic.snap.Snapshot; + +public class Vic44k extends Vic44 { + + private static final int VIC44_COLOUR_RAM_BASE_ADDRESS = 0xB800; + + /** + * Constructor for Vic4k. + * + * @param pixelData Interface to the platform specific mechanism for writing pixels. + * @param machineType The type of machine, PAL or NTSC. + * @param snapshot Optional snapshot of the machine state to start with. + */ + public Vic44k(PixelData pixelData, MachineType machineType, Snapshot snapshot) { + super(pixelData, machineType, snapshot, VIC44_COLOUR_RAM_BASE_ADDRESS); + + // NOTE: VIC chip vs VIC 20 memory map is different. This is why we have + // the control registers appearing at $1000. The Chip Select for reading + // and writing to the VIC chip registers is when A13=A11=A10=A9=A8=0 and + // A12=1, i.e. $10XX. Bottom 4 bits select one of the 16 registers. + // + // VIC chip addresses VIC 20 addresses and their normal usage + // + // $0000 $8000 1K RAM + // $0400 $8400 1K RAM + // $0800 $8800 1K RAM + // $0C00 $8C00 1K RAM + // $1000 $9000 1K RAM + // $1400 $9400 1K RAM + // $1800 $9800 1K RAM + // $1C00 $9C00 1K RAM + // + // $2000 $A000 1K RAM + // $2400 $A400 1K RAM + // $2800 $A800 1K RAM + // $2C00 $AC00 1K RAM + // $3000 $B000 1K RAM + // $3400 $B400 Default Screen memory + // $3800 $B800 Colour RAM (fixed location) + // $3C00 $BC00 VIC and VIA chips + + for (int i=0; i<0x4000; i++) { + VIC_MEM_TABLE[i] = 0x8000 + i; + } + } +} diff --git a/html/src/main/java/emu/jvic/gwt/GwtJVicRunner.java b/html/src/main/java/emu/jvic/gwt/GwtJVicRunner.java index 959373c..3a11f25 100644 --- a/html/src/main/java/emu/jvic/gwt/GwtJVicRunner.java +++ b/html/src/main/java/emu/jvic/gwt/GwtJVicRunner.java @@ -112,16 +112,10 @@ private ArrayBuffer convertProgramToArrayBuffer(Program program, AppConfigItem a int index = 0; MachineType machineType = MachineType.valueOf(appConfigItem.getMachineType()); - byte[] basicRom = (machineType.equals(MachineType.VIC44)? - Gdx.files.internal("roms/vic_44_basic.rom").readBytes() : - Gdx.files.internal("roms/basic.rom").readBytes()); + byte[] basicRom = loadBasicRom(machineType); byte[] dos1541Rom = Gdx.files.internal("roms/dos1541.rom").readBytes(); byte[] charRom = Gdx.files.internal("roms/char.rom").readBytes(); - byte[] kernalRom = (machineType.equals(MachineType.VIC44)? - Gdx.files.internal("roms/vic_44_kernal.rom").readBytes() : - (machineType.equals(MachineType.NTSC)? - Gdx.files.internal("roms/kernal_ntsc.rom").readBytes() : - Gdx.files.internal("roms/kernal_pal.rom").readBytes())); + byte[] kernalRom = loadKernalRom(machineType); for (int i=0; i < basicRom.length; index++, i++) { programUint8Array.set(index, (basicRom[i] & 0xFF)); diff --git a/lwjgl3/src/main/java/emu/jvic/lwjgl3/DesktopJVicRunner.java b/lwjgl3/src/main/java/emu/jvic/lwjgl3/DesktopJVicRunner.java index c5d49be..e3f2b27 100644 --- a/lwjgl3/src/main/java/emu/jvic/lwjgl3/DesktopJVicRunner.java +++ b/lwjgl3/src/main/java/emu/jvic/lwjgl3/DesktopJVicRunner.java @@ -69,16 +69,10 @@ private void runProgram(AppConfigItem appConfigItem, Program program) { machine = new Machine(soundGenerator, keyboardMatrix, pixelData); // Load the ROM files. - byte[] basicRom = (machineType.equals(MachineType.VIC44)? - Gdx.files.internal("roms/vic_44_basic.rom").readBytes() : - Gdx.files.internal("roms/basic.rom").readBytes()); + byte[] basicRom = loadBasicRom(machineType); byte[] dos1541Rom = Gdx.files.internal("roms/dos1541.rom").readBytes(); byte[] charRom = Gdx.files.internal("roms/char.rom").readBytes(); - byte[] kernalRom = (machineType.equals(MachineType.VIC44)? - Gdx.files.internal("roms/vic_44_kernal.rom").readBytes() : - (machineType.equals(MachineType.NTSC)? - Gdx.files.internal("roms/kernal_ntsc.rom").readBytes() : - Gdx.files.internal("roms/kernal_pal.rom").readBytes())); + byte[] kernalRom = loadKernalRom(machineType); Queue autoRunCmdQueue = null; Callable> autoLoadProgram = machine.init( From 089b6e88149fff28ea9c55884f9d8dad7d1d31e1 Mon Sep 17 00:00:00 2001 From: Lance Ewing Date: Sun, 8 Feb 2026 11:36:23 +0000 Subject: [PATCH 2/5] Adding more of the VIC44K implementation. Very nearly working. --- assets/roms/vic_44k_kernal.rom | Bin 8192 -> 8192 bytes .../java/emu/jvic/memory/Vic20Memory.java | 253 +++++++++++------- core/src/main/java/emu/jvic/video/Vic.java | 207 +++++--------- core/src/main/java/emu/jvic/video/Vic44.java | 46 ++-- core/src/main/java/emu/jvic/video/Vic44k.java | 51 ++-- .../java/emu/jvic/gwt/GwtSoundGenerator.java | 9 +- .../jvic/lwjgl3/DesktopSoundGenerator.java | 9 +- 7 files changed, 283 insertions(+), 292 deletions(-) diff --git a/assets/roms/vic_44k_kernal.rom b/assets/roms/vic_44k_kernal.rom index 67827a27a47878c3f18935116c50f050f497cc6a..3cf51e5199c646502004593e1a6d9f1515db2c3e 100644 GIT binary patch delta 1069 zcmX|AZ)h837|*@Agq%r}TbtBNnLu9P^zK zzN%dDJ@AIWO2g((fHxS0$~B1!M?uXv!J=orW+gx(wzOKayRcMSS`torSpsPCmNp2v z3%RvihI<$z#mxK_Y`>U>-`mb{zJqnq!;c&H_-*6wQUG7rN`sjV4&gj+1>eN;=imW< z^$20UY9$a#3q4h=CV%;BvtS2#YsBYX&BI+gevtAErDVcSiXBbwhWn!^S0bqM+g1BI z7nusy2$&bbDL<%lE_f?Ey4xp2G_mvZ;}NynC9v<0FW(zK@u~IDqM1mag2Hy)b6NHO zDOV!XIB6p?isz90Q~(UlDNBO+y8P-K$OCrLN`iXGZfY`|{Kt~fEGC0{@f~W?UPsYC zUm@RJ{g^n7r4_R9eiQwBLC~#pghj#nkgyo=8uCqU*Nt=588W^+tOlGxPLM+W+KIb% zyRi*yd8cPekYM*}{t(RwP>IE!C1~sV1DjcQ81s6k39{WvE}A#Wi|+lvnsIt zFs)xyq1ZlqXBcj)VBbAmURxT5B^A!zD4#BmpKw2`my|aSYiW#ddU*ynjP=zI zj15QP9%G$naH2}F@2C)h0`8x}kpO1S^d^2poo=fba z=1&8I6RxBV29JKg#3q3MirX)F3f)j@7xucXE8GhSaF!e*u)b}YQ*+D ZvIeiT5eLWG2*UoHMAbU7nlGll_z!E7;==#{ delta 1069 zcmX|AZ)h837|*@=L(Zhhtxf8sO_MjX>w4^3Cul*K7!)CE`(a9P#lbi~I3u<={33p8 z9KBIW-*^usC2YKZxQVWP-Rg$6#ierss1R6~de6CBNtQ zKEL1dODSKg z@7Ave@B5=*=A+Y@_nzg(#G9{}c{~F>|Ir{XOdRl8lH0VE&%ok4cE(#HKWKHI!hd2$#$s zhK8p+NnH#cgMf)m1OFMfU-gxHq3V|RdetLPEtUJcDhqV6$xoq~lr?c_*gS%gcmV~O zh0Gkrp)i(#b^McM>C+wCKSwI+9-xo6=x?q)MqlXAc8AJ0=STxLBbEw$0lAjZs09By zxPh;uUqz4pqvrIB?y^Fiecr|e{S!-uKl|q~Gcs5yn8(c3InITHt_C2(I Y> 10) & 0xF) { - case 4: - case 5: - case 6: - case 7: - case 9: - case 10: - case 11: - // Unconnected memory, so VIC chip sees what CPU put on bus. - cellIndex = memory.getLastBusData(); + case 0: + case 1: + case 2: + case 3: + // PIVIC has char ROM embedded. Not useful to have screen mem here though. + cellIndex = charRom[screenAddress]; break; - default: + // All other VIC chip read address go to main memory. cellIndex = mem[VIC_MEM_TABLE[screenAddress & 0x3FFF]]; - memory.setLastBusData(cellIndex); break; } @@ -895,20 +894,16 @@ public boolean emulateCycle() { charDataOffset = char_mem_start + (cellIndex << char_size_shift) + cellDepthCounter; switch ((charDataOffset >> 10) & 0xF) { - case 4: - case 5: - case 6: - case 7: - case 9: - case 10: - case 11: - // Unconnected memory, so VIC chip sees what CPU put on bus. - charDataLatch = memory.getLastBusData(); + case 0: + case 1: + case 2: + case 3: + // PIVIC has char ROM embedded. + charDataLatch = charRom[charDataOffset]; break; default: // Fetch cell data, initially latched to the side until it is needed. charDataLatch = mem[VIC_MEM_TABLE[(charDataOffset & 0x3FFF)]]; - memory.setLastBusData(charDataLatch); break; } @@ -1007,4 +1002,13 @@ public boolean emulateCycle() { return frameRenderComplete; } + + /** + * For the VIC44 and VIC44K, the char ROM data is embedded and used directly. + * + * @param charRom The content of the char ROM to use. + */ + public void setCharRom(byte[] charRom) { + this.charRom = charRom; + } } diff --git a/core/src/main/java/emu/jvic/video/Vic44k.java b/core/src/main/java/emu/jvic/video/Vic44k.java index b44109a..a1d9963 100644 --- a/core/src/main/java/emu/jvic/video/Vic44k.java +++ b/core/src/main/java/emu/jvic/video/Vic44k.java @@ -6,7 +6,8 @@ public class Vic44k extends Vic44 { - private static final int VIC44_COLOUR_RAM_BASE_ADDRESS = 0xB800; + private static final int VIC44K_COLOUR_RAM_BASE_ADDRESS = 0xB800; + private static final int VIC44K_REGISTER_BASE_ADDRESS = 0xBC00; /** * Constructor for Vic4k. @@ -16,35 +17,37 @@ public class Vic44k extends Vic44 { * @param snapshot Optional snapshot of the machine state to start with. */ public Vic44k(PixelData pixelData, MachineType machineType, Snapshot snapshot) { - super(pixelData, machineType, snapshot, VIC44_COLOUR_RAM_BASE_ADDRESS); + super(pixelData, machineType, snapshot, VIC44K_COLOUR_RAM_BASE_ADDRESS); - // NOTE: VIC chip vs VIC 20 memory map is different. This is why we have - // the control registers appearing at $1000. The Chip Select for reading - // and writing to the VIC chip registers is when A13=A11=A10=A9=A8=0 and - // A12=1, i.e. $10XX. Bottom 4 bits select one of the 16 registers. - // // VIC chip addresses VIC 20 addresses and their normal usage // - // $0000 $8000 1K RAM - // $0400 $8400 1K RAM - // $0800 $8800 1K RAM - // $0C00 $8C00 1K RAM - // $1000 $9000 1K RAM - // $1400 $9400 1K RAM - // $1800 $9800 1K RAM - // $1C00 $9C00 1K RAM + // $0000 $A000 1K RAM [Char ROM during VIC cycle] + // $0400 $A400 1K RAM [Char ROM during VIC cycle] + // $0800 $A800 1K RAM [Char ROM during VIC cycle] + // $0C00 $AC00 1K RAM [Char ROM during VIC cycle] + // $1000 $B000 1K RAM + // $1400 $B400 1K RAM Default Screen memory + // $1800 $B800 Colour RAM (fixed location) + // $1C00 $BC00 VIC and VIA chips // - // $2000 $A000 1K RAM - // $2400 $A400 1K RAM - // $2800 $A800 1K RAM - // $2C00 $AC00 1K RAM - // $3000 $B000 1K RAM - // $3400 $B400 Default Screen memory - // $3800 $B800 Colour RAM (fixed location) - // $3C00 $BC00 VIC and VIA chips + // $2000 $8000 1K RAM + // $2400 $8400 1K RAM + // $2800 $8800 1K RAM + // $2C00 $8C00 1K RAM + // $3000 $9000 1K RAM + // $3400 $9400 1K RAM + // $3800 $9800 1K RAM + // $3C00 $9C00 1K RAM - for (int i=0; i<0x4000; i++) { + for (int i=0; i<0x2000; i++) { + VIC_MEM_TABLE[i] = 0xA000 + i; + } + for (int i=0x2000; i<0x4000; i++) { VIC_MEM_TABLE[i] = 0x8000 + i; } } + + protected void initRegNumbers() { + initRegNumbers(VIC44K_REGISTER_BASE_ADDRESS); + } } diff --git a/html/src/main/java/emu/jvic/gwt/GwtSoundGenerator.java b/html/src/main/java/emu/jvic/gwt/GwtSoundGenerator.java index 2931c76..5e15d74 100644 --- a/html/src/main/java/emu/jvic/gwt/GwtSoundGenerator.java +++ b/html/src/main/java/emu/jvic/gwt/GwtSoundGenerator.java @@ -20,8 +20,8 @@ public class GwtSoundGenerator extends SoundGenerator { // Number of samples to queue before being output to the audio hardware. public static final int SAMPLE_LATENCY = 3072; - private static final int VIC_REG_10 = 0x900A; - private static final int VIC_REG_14 = 0x900E; + private int VIC_REG_10 = 0x900A; + private int VIC_REG_14 = 0x900E; private int cyclesPerSample; private AudioDevice audioDevice; @@ -88,6 +88,11 @@ public void initSound(MachineType machineType) { voiceCounters = new int[4]; voiceShiftRegisters = new int[4]; voiceClockDividerTriggers = new int[] { 0xF, 0x7, 0x3, 0x1 }; + + if (machineType.isVIC44K()) { + VIC_REG_10 = 0xBC0A; + VIC_REG_14 = 0xBC0E; + } } /** diff --git a/lwjgl3/src/main/java/emu/jvic/lwjgl3/DesktopSoundGenerator.java b/lwjgl3/src/main/java/emu/jvic/lwjgl3/DesktopSoundGenerator.java index afbe570..5753325 100644 --- a/lwjgl3/src/main/java/emu/jvic/lwjgl3/DesktopSoundGenerator.java +++ b/lwjgl3/src/main/java/emu/jvic/lwjgl3/DesktopSoundGenerator.java @@ -16,8 +16,8 @@ public class DesktopSoundGenerator extends SoundGenerator { private static final int SAMPLE_RATE = 22050; - private static final int VIC_REG_10 = 0x900A; - private static final int VIC_REG_14 = 0x900E; + private int VIC_REG_10 = 0x900A; + private int VIC_REG_14 = 0x900E; private int cyclesPerSample; private byte[] sampleBuffer; @@ -54,6 +54,11 @@ public void initSound(MachineType machineType) { voiceCounters = new int[4]; voiceShiftRegisters = new int[4]; voiceClockDividerTriggers = new int[] { 0xF, 0x7, 0x3, 0x1 }; + + if (machineType.isVIC44K()) { + VIC_REG_10 = 0xBC0A; + VIC_REG_14 = 0xBC0E; + } } @Override From 41700dd057249cd2d2c4bbdf997a7ae5b9bfcd70 Mon Sep 17 00:00:00 2001 From: Lance Ewing Date: Tue, 10 Feb 2026 00:12:50 +0000 Subject: [PATCH 3/5] More updates for VIC44K mode. Mostly working now. --- assets/roms/vic_44k_kernal.rom | Bin 8192 -> 8192 bytes .../emu/jvic/lwjgl3/DesktopProgramLoader.java | 6 +++++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/assets/roms/vic_44k_kernal.rom b/assets/roms/vic_44k_kernal.rom index 3cf51e5199c646502004593e1a6d9f1515db2c3e..fe6fcab8a36d48f97048dff5a003ff2c42374244 100644 GIT binary patch delta 39 vcmZp0XmHrDRaR>0^bc%H51ridfm31PKOje9!}BGFmL2rD^mp@lSwkiOphFdK delta 39 xcmV+?0NDS4K!8B7wH+EDk^ZHZ@FKABq{61bz#xz%z#*^*pd5^d0<+H@F#?445?TNN diff --git a/lwjgl3/src/main/java/emu/jvic/lwjgl3/DesktopProgramLoader.java b/lwjgl3/src/main/java/emu/jvic/lwjgl3/DesktopProgramLoader.java index efe70c7..1763707 100644 --- a/lwjgl3/src/main/java/emu/jvic/lwjgl3/DesktopProgramLoader.java +++ b/lwjgl3/src/main/java/emu/jvic/lwjgl3/DesktopProgramLoader.java @@ -32,7 +32,11 @@ public void fetchProgram(AppConfigItem appConfigItem, Consumer programC byte[] data = null; try { - if (!appConfigItem.getFilePath().startsWith("http")) { + if ((appConfigItem.getFilePath() == null) || + (appConfigItem.getFilePath().trim().equals(""))) { + // Ignore. Nothing to load. + } + else if (!appConfigItem.getFilePath().startsWith("http")) { FileHandle fileHandle = null; if ("ABSOLUTE".equals(appConfigItem.getFileType())) { fileHandle = Gdx.files.absolute(appConfigItem.getFilePath()); From fd30ddbbb73a411fa7fad022bb73b2ff01181045 Mon Sep 17 00:00:00 2001 From: Lance Ewing Date: Tue, 10 Feb 2026 20:21:50 +0000 Subject: [PATCH 4/5] Updated VIC44K ROM. --- assets/roms/vic_44k_kernal.rom | Bin 8192 -> 8192 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/assets/roms/vic_44k_kernal.rom b/assets/roms/vic_44k_kernal.rom index fe6fcab8a36d48f97048dff5a003ff2c42374244..b44ac90b384e9eb93e27d4907833a27f3c482e2d 100644 GIT binary patch delta 29 jcmZp0XmHq|$HJop1PWoE&I%?b-jgj^WHyJftda%*bO8sd delta 28 icmZp0XmHq|$HJ|k1q2FVp3WvFldV`}HixpTmIeT8xd&eW From 297d9237e77f8384bb1d8448e5f9944f9948cf59 Mon Sep 17 00:00:00 2001 From: Lance Ewing Date: Tue, 10 Feb 2026 22:38:15 +0000 Subject: [PATCH 5/5] Fixed VIC44K ROM. Found another colour address reference that needed changing. --- assets/roms/vic_44k_kernal.rom | Bin 8192 -> 8192 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/assets/roms/vic_44k_kernal.rom b/assets/roms/vic_44k_kernal.rom index b44ac90b384e9eb93e27d4907833a27f3c482e2d..85f95ee66a327a8f4afdf66c4d2ee5f491d12c98 100644 GIT binary patch delta 14 VcmZp0XmHq2#l^T|b2V41C;%yk1wa4* delta 14 VcmZp0XmHq2#l<*fb2V41C;%w01snhX