diff --git a/index.html b/index.html
index b4b8996b..975afa06 100644
--- a/index.html
+++ b/index.html
@@ -152,6 +152,7 @@ body {
Sega Game Gear
Atari 5200
Atari 7800
+ PC Engine
@@ -208,7 +209,6 @@ body {
NES (MAME)
Williams (6809)
- PC Engine
diff --git a/presets/pce/hello.wiz b/presets/pce/hello.wiz
new file mode 100644
index 00000000..684c0be8
--- /dev/null
+++ b/presets/pce/hello.wiz
@@ -0,0 +1,130 @@
+import "pce";
+
+bank zeropage @ 0x2000 : [vardata; 256];
+bank stack @ 0x2100 : [vardata; 256];
+bank prg @ 0xE000 : [constdata; 0x2000];
+bank chr @ 0x8000 : [constdata; 0x4000];
+
+in zeropage {
+ var b0, b1, b2, b3, b4, b5, b6, b7, b8, b9, b10, b11, b12, b13, b14, b15 : u8;
+ var w0 @ &b0, w2 @ &b2, w4 @ &b4, w6 @ &b6, w8 @ &b8 : u16;
+ var mosaic : u8;
+ var timer : u8;
+}
+
+in prg {
+ #[fallthrough] func main() {
+ // Disable decimal arithmetic.
+ decimal = false;
+ // Disable interrupts.
+ nointerrupt = true;
+ // Enable turbo mode on CPU.
+ turbo_speed = true;
+ // mpr7 = a = 0; by power-on
+ // MPR0 = I/O page
+ mpr0 = a = 0xFF;
+ // MPR1 = RAM
+ mpr1 = a = 0xF8;
+ // MPR4/5 = data bank
+ mpr4 = a = 1;
+ mpr5 = a = 2;
+ // Prepare stack.
+ s = x = 0xFF;
+
+ a = pce.vdc.status;
+ pce.irq.disable = a = pce.irq.INTERRUPT_ALL;
+ pce.irq.acknowledge = a;
+ pce.timer.control = 0;
+
+ vdc_select = pce.vdc.SELECT_CONTROL;
+ vdc_data_l = 0;
+ vdc_data_h = 0;
+ vdc_select = pce.vdc.SELECT_SCANLINE_COMPARE;
+ vdc_data_l = 0;
+ vdc_data_h = 0;
+ vdc_select = pce.vdc.SELECT_SCROLL_X;
+ vdc_data_l = 0;
+ vdc_data_h = 0;
+ vdc_select = pce.vdc.SELECT_SCROLL_Y;
+ vdc_data_l = 0;
+ vdc_data_h = 0;
+ vdc_select = pce.vdc.SELECT_MEMORY_SIZE;
+ vdc_data_l = pce.vdc.DATA_L_MEMORY_SIZE_TILEMAP_32x32;
+ vdc_data_h = 0;
+ vdc_select = pce.vdc.SELECT_HSYNC_SETTING;
+ vdc_data_l = 0x02;
+ vdc_data_h = 0x02;
+ vdc_select = pce.vdc.SELECT_HDISP_SETTING;
+ vdc_data_l = 0x1F;
+ vdc_data_h = 0x04;
+ vdc_select = pce.vdc.SELECT_VSYNC_SETTING;
+ vdc_data_l = 0x07;
+ vdc_data_h = 0x0D;
+ vdc_select = pce.vdc.SELECT_VDISP_HEIGHT;
+ vdc_data_l = 0xDF;
+ vdc_data_h = 0x00;
+ vdc_select = pce.vdc.SELECT_VDISP_END;
+ vdc_data_l = 0x03;
+ vdc_data_h = 0x00;
+ vdc_select = pce.vdc.SELECT_DMA_CONTROL;
+ vdc_data_l = pce.vdc.DATA_L_DMA_CONTROL_SATB_AUTO_TRANSFER;
+ vdc_data_h = 0x00;
+ vdc_select = pce.vdc.SELECT_SATB_SOURCE_ADDRESS;
+ vdc_data_l = 0x00;
+ vdc_data_h = 0x7F;
+
+ pce.vce.control = a = pce.vce.CONTROL_FIELD_EXTRA_LINE;
+ pce.vce.address_l = a = 0;
+ pce.vce.address_h = a = 0;
+ load_alt_inc_repeat(&pce.vce.data_l as u16, &bkg_palette_data as u16, sizeof(typeof(bkg_palette_data)));
+
+ let TILESET_DEST_ADDRESS = 0x1000;
+ vdc_select = pce.vdc.SELECT_VRAM_WRITE_ADDRESS;
+ vdc_data_l = <:TILESET_DEST_ADDRESS;
+ vdc_data_h = >:TILESET_DEST_ADDRESS;
+ vdc_select = pce.vdc.SELECT_VRAM_DATA;
+ load_alt_inc_repeat(&pce.vdc.data_l as u16, &hello_tiles_chr as u16, sizeof(typeof(hello_tiles_chr)));
+
+ let START_X = 10;
+ let START_Y = 13;
+ let TILEMAP_ADDRESS = pce.vdc.DATA_VRAM_ADDRESS_TILEMAP + START_Y * 32 + START_X;
+ let TILE_BASE_INDEX = TILESET_DEST_ADDRESS / 16;
+
+ vdc_select = pce.vdc.SELECT_VRAM_WRITE_ADDRESS;
+ vdc_data_l = <:TILEMAP_ADDRESS;
+ vdc_data_h = >:TILEMAP_ADDRESS;
+ vdc_select = pce.vdc.SELECT_VRAM_DATA;
+
+ x = 0;
+ do {
+ pce.vdc.data_l = a = <:TILE_BASE_INDEX + message[x];
+ pce.vdc.data_h = a = >:TILE_BASE_INDEX +# 0;
+ x++;
+ } while x != message.len;
+
+ vdc_select = pce.vdc.SELECT_CONTROL;
+ vdc_data_l = pce.vdc.DATA_L_CONTROL_ENABLE_BG;
+ vdc_data_h = 0x00;
+
+ while true {}
+ }
+
+ let rgb_pack(r, g, b) = ((r & 0x7) << 3) | ((g & 0x7) << 6) | (b & 0x7);
+
+ const bkg_palette_data : [u16] = [
+ rgb_pack(6, 3, 4), rgb_pack(1, 1, 3), rgb_pack(0, 0, 0), rgb_pack(0, 0, 0),
+ rgb_pack(0, 0, 0), rgb_pack(0, 0, 0), rgb_pack(0, 0, 0), rgb_pack(0, 0, 0),
+ rgb_pack(0, 0, 0), rgb_pack(0, 0, 0), rgb_pack(0, 0, 0), rgb_pack(0, 0, 0),
+ rgb_pack(0, 0, 0), rgb_pack(0, 0, 0), rgb_pack(0, 0, 0), rgb_pack(7, 7, 7),
+ ];
+
+ const message = "HELLO WORLD";
+
+ const @ 0xFFFE = main;
+}
+
+in chr {
+ const hello_tiles_chr = embed "hello_tiles.chr";
+ const minirpg_sprites_chr = embed "minirpg_sprites.chr";
+}
+
diff --git a/src/platform/pce.ts b/src/platform/pce.ts
index 0547da75..cc4cd717 100644
--- a/src/platform/pce.ts
+++ b/src/platform/pce.ts
@@ -4,6 +4,7 @@ import { Keys, PLATFORMS, RasterVideo } from "../common/emu";
const PCE_PRESETS = [
{ id: 'test_conio.c', name: 'Hello World (conio)' },
{ id: 'siegegame.c', name: 'Siege Game (conio)' },
+ { id: 'hello.wiz', name: 'Hello World (Wiz)' },
]
class PCEnginePlatform implements Platform {