mirror of
https://github.com/sehugg/8bitworkshop.git
synced 2024-06-16 12:29:28 +00:00
c64: set_raster_irq(), wait_vblank()
This commit is contained in:
parent
d9001df5d4
commit
611c174aed
|
@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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
BIN
src/worker/wasm/dasm-wasisdk.wasm
Executable file
Binary file not shown.
Loading…
Reference in New Issue
Block a user