c64: set_raster_irq(), wait_vblank()

This commit is contained in:
Steven Hugg 2023-11-29 11:15:55 -06:00
parent d9001df5d4
commit 611c174aed
10 changed files with 44 additions and 29 deletions

View File

@ -5,6 +5,10 @@ void raster_wait(byte line) {
while (VIC.rasterline < line) ; while (VIC.rasterline < line) ;
} }
void wait_vblank(void) {
raster_wait(250);
}
static byte VIC_BANK_PAGE[4] = { static byte VIC_BANK_PAGE[4] = {
0xc0, 0x80, 0x40, 0x00 0xc0, 0x80, 0x40, 0x00
}; };
@ -24,3 +28,13 @@ char __fastcall__ poll_keyboard() {
} }
#endif #endif
void set_raster_irq(char scanline) {
// deactivate CIA interrupts (keyboard, etc)
CIA1.icr = 0x7f;
// set raster line for interrupt
VIC.ctrl1 &= 0x7f; // clear raster line bit 8
VIC.rasterline = scanline;
// activate VIC raster interrupts
VIC.imr = 1;
}

View File

@ -80,10 +80,10 @@ typedef enum { false, true } bool; // boolean
// set scrolling registers // set scrolling registers
#define SET_SCROLL_Y(_y) \ #define SET_SCROLL_Y(_y) \
VIC.ctrl1 = (VIC.ctrl1 & 0xf8) | (_y); VIC.ctrl1 = (VIC.ctrl1 & 0xf8) | (_y & 7);
#define SET_SCROLL_X(_x) \ #define SET_SCROLL_X(_x) \
VIC.ctrl2 = (VIC.ctrl2 & 0xf8) | (_x); VIC.ctrl2 = (VIC.ctrl2 & 0xf8) | (_x & 7);
// enable RAM from 0xa000-0xffff, disable interrupts // enable RAM from 0xa000-0xffff, disable interrupts
@ -102,6 +102,9 @@ typedef enum { false, true } bool; // boolean
// wait until specific raster line // wait until specific raster line
void raster_wait(byte line); void raster_wait(byte line);
// wait until end of frame
void wait_vblank();
// get current VIC bank start address // get current VIC bank start address
char* get_vic_bank_start(); char* get_vic_bank_start();
@ -132,4 +135,9 @@ inline void waitvsync() {
} }
#endif #endif
// for use with set_irq()
// sets up the VIC to send raster interrupts
// and disables CIA interrupts
void set_raster_irq(char scanline);
#endif #endif

View File

@ -63,8 +63,8 @@ void main(void) {
// infinite loop // infinite loop
while (1) { while (1) {
// wait for vsync // wait for end of frame
waitvsync(); wait_vblank();
// scroll one pixel to the left // scroll one pixel to the left
// and move screen memory every 8 pixels // and move screen memory every 8 pixels
scroll_one_pixel_left(); scroll_one_pixel_left();

View File

@ -23,8 +23,8 @@ void scroll_one_pixel_left() {
src = scrnbuf[visbuf] + (scroll_x & 7) * 128; src = scrnbuf[visbuf] + (scroll_x & 7) * 128;
// destination = hidden buffer // destination = hidden buffer
dst = scrnbuf[visbuf ^ 1] + (scroll_x & 7) * 128; dst = scrnbuf[visbuf ^ 1] + (scroll_x & 7) * 128;
// wait for vsync // wait for end of frame
waitvsync(); wait_vblank();
// scroll hidden buffer // scroll hidden buffer
memcpy(dst, src+1, 128); memcpy(dst, src+1, 128);
// every 8 pixels, switch visible and hidden buffers // every 8 pixels, switch visible and hidden buffers

View File

@ -17,8 +17,8 @@ void scroll_update_regs() {
void scroll_swap() { void scroll_swap() {
// swap hidden and visible buffers // swap hidden and visible buffers
hidbuf ^= 1; hidbuf ^= 1;
// wait for vblank and update registers // wait for end of frame and update registers
waitvsync(); wait_vblank();
scroll_update_regs(); scroll_update_regs();
SET_VIC_SCREEN(hidbuf ? 0x8000 : 0x8400); SET_VIC_SCREEN(hidbuf ? 0x8000 : 0x8400);
} }

View File

@ -83,8 +83,8 @@ void main(void) {
// animate sprite in shadow sprite ram // animate sprite in shadow sprite ram
sprite_draw(0, n++, 70, 192); sprite_draw(0, n++, 70, 192);
sprite_draw(0, 172, 145, 192); sprite_draw(0, 172, 145, 192);
// wait for vblank // wait for end of frame
waitvsync(); wait_vblank();
// update scroll registers // update scroll registers
// and swap screens if we must // and swap screens if we must
scroll_update(); scroll_update();

View File

@ -118,7 +118,7 @@ void main(void) {
// animate sprite in shadow sprite ram // animate sprite in shadow sprite ram
update_player(); update_player();
// wait for end of frame // wait for end of frame
waitvsync(); wait_vblank();
// then update sprite registers // then update sprite registers
sprite_update(visbuf); sprite_update(visbuf);
// update scroll registers // update scroll registers

View File

@ -34,16 +34,6 @@ char interrupt_handler() {
return IRQ_HANDLED; return IRQ_HANDLED;
} }
void set_frame_irq(char scanline) {
// deactivate CIA interrupts (keyboard, etc)
CIA1.icr = 0x7f;
// set raster line for interrupt
VIC.ctrl1 &= 0x7f; // clear raster line bit 8
VIC.rasterline = scanline;
// activate VIC raster interrupts
VIC.imr = 1;
}
void main(void) { void main(void) {
clrscr(); clrscr();
printf("\nHello World!\n"); printf("\nHello World!\n");
@ -52,7 +42,7 @@ void main(void) {
set_irq(interrupt_handler, (void*)0x9f00, 0x100); set_irq(interrupt_handler, (void*)0x9f00, 0x100);
// disable CIA interrupt, activate VIC interrupt // disable CIA interrupt, activate VIC interrupt
set_frame_irq(255); set_raster_irq(255);
while (1) { while (1) {
printf("%d ", VIC.rasterline); printf("%d ", VIC.rasterline);

View File

@ -3,7 +3,7 @@ import { WASIRunner } from "../common/wasi/wasishim";
import * as fs from "fs"; import * as fs from "fs";
async function loadWASM(filename: string) { async function loadWASM(filename: string) {
const wasmdata = fs.readFileSync(`./wasi/${filename}.wasm`); const wasmdata = fs.readFileSync(`./src/worker/wasm/${filename}.wasm`);
let shim = new WASIRunner(); let shim = new WASIRunner();
await shim.loadAsync(wasmdata); await shim.loadAsync(wasmdata);
return shim; return shim;
@ -12,8 +12,8 @@ async function loadWASM(filename: string) {
async function loadDASM() { async function loadDASM() {
return loadWASM('dasm-wasisdk'); return loadWASM('dasm-wasisdk');
} }
async function loadCC2600() { async function loadCC7800() {
return loadWASM('cc2600'); return loadWASM('cc7800');
} }
describe('test WASI DASM', function () { describe('test WASI DASM', function () {
@ -66,11 +66,14 @@ describe('test WASI DASM', function () {
}); });
}); });
describe('test WASI cc2600', function () { describe('test WASI cc7800', function () {
it('cc2600 help', async function () { it('cc7800 help', async function () {
let shim = await loadCC2600(); let shim = await loadCC7800();
shim.setArgs(["cc2600", '-h']); shim.setArgs(["cc7800", '-h']);
let errno = shim.run(); let errno = shim.run();
assert.strictEqual(errno, 0); assert.strictEqual(errno, 0);
const stdout = shim.fds[1].getBytesAsString();
console.log(stdout);
assert.ok(stdout.indexOf('Usage: cc7800') >= 0);
}); });
}); });

BIN
src/worker/wasm/dasm-wasisdk.wasm Executable file

Binary file not shown.