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) ;
}
void wait_vblank(void) {
raster_wait(250);
}
static byte VIC_BANK_PAGE[4] = {
0xc0, 0x80, 0x40, 0x00
};
@ -24,3 +28,13 @@ char __fastcall__ poll_keyboard() {
}
#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
#define SET_SCROLL_Y(_y) \
VIC.ctrl1 = (VIC.ctrl1 & 0xf8) | (_y);
VIC.ctrl1 = (VIC.ctrl1 & 0xf8) | (_y & 7);
#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
@ -102,6 +102,9 @@ typedef enum { false, true } bool; // boolean
// wait until specific raster line
void raster_wait(byte line);
// wait until end of frame
void wait_vblank();
// get current VIC bank start address
char* get_vic_bank_start();
@ -132,4 +135,9 @@ inline void waitvsync() {
}
#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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -34,16 +34,6 @@ char interrupt_handler() {
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) {
clrscr();
printf("\nHello World!\n");
@ -52,7 +42,7 @@ void main(void) {
set_irq(interrupt_handler, (void*)0x9f00, 0x100);
// disable CIA interrupt, activate VIC interrupt
set_frame_irq(255);
set_raster_irq(255);
while (1) {
printf("%d ", VIC.rasterline);

View File

@ -3,7 +3,7 @@ import { WASIRunner } from "../common/wasi/wasishim";
import * as fs from "fs";
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();
await shim.loadAsync(wasmdata);
return shim;
@ -12,8 +12,8 @@ async function loadWASM(filename: string) {
async function loadDASM() {
return loadWASM('dasm-wasisdk');
}
async function loadCC2600() {
return loadWASM('cc2600');
async function loadCC7800() {
return loadWASM('cc7800');
}
describe('test WASI DASM', function () {
@ -66,11 +66,14 @@ describe('test WASI DASM', function () {
});
});
describe('test WASI cc2600', function () {
it('cc2600 help', async function () {
let shim = await loadCC2600();
shim.setArgs(["cc2600", '-h']);
describe('test WASI cc7800', function () {
it('cc7800 help', async function () {
let shim = await loadCC7800();
shim.setArgs(["cc7800", '-h']);
let errno = shim.run();
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.