From ed674f2cdb175c7e49957cf612564c4c00ea3ab7 Mon Sep 17 00:00:00 2001 From: Steven Hugg Date: Fri, 26 Jun 2020 16:00:04 -0500 Subject: [PATCH] c64: better detection of PRG start addr. --- presets/c64/basicheader.dasm | 10 ++++++++++ presets/c64/skeleton.dasm | 17 +++++++++++++++++ src/machine/c64.ts | 12 ++++++++---- 3 files changed, 35 insertions(+), 4 deletions(-) create mode 100644 presets/c64/basicheader.dasm create mode 100644 presets/c64/skeleton.dasm diff --git a/presets/c64/basicheader.dasm b/presets/c64/basicheader.dasm new file mode 100644 index 00000000..7baf15c7 --- /dev/null +++ b/presets/c64/basicheader.dasm @@ -0,0 +1,10 @@ + + processor 6502 + .org $07FF + .word $0801 ; two-byte start address + .org $0801 ; start of BASIC program + + .word BASIC_END, 10 ; Next line and current line number + .byte $9e," 2064",0 ; SYS 2064 +BASIC_END: + .word 0 ; End of program diff --git a/presets/c64/skeleton.dasm b/presets/c64/skeleton.dasm new file mode 100644 index 00000000..1b99a15e --- /dev/null +++ b/presets/c64/skeleton.dasm @@ -0,0 +1,17 @@ + + include "cartheader.dasm" + +Start + ldy #0 +.Loop + lda Message,y + beq .LoopExit + jsr $FFD2 ; CHROUT + iny + bne .Loop +.LoopExit + jmp . ; infinite loop +Message + ; PETSCII - http://sta.c64.org/cbm64pet.html + byte "HELLO WORLD!" + byte 13,0 diff --git a/src/machine/c64.ts b/src/machine/c64.ts index 274f6d34..f7ba94e1 100644 --- a/src/machine/c64.ts +++ b/src/machine/c64.ts @@ -580,8 +580,12 @@ export class C64_WASMMachine extends BaseWASMMachine implements Machine { // load rom if (this.romptr && this.romlen) { this.exports.machine_load_rom(this.sys, this.romptr, this.romlen); - this.prgstart = this.romarr[0] + (this.romarr[1]<<8); // TODO: get starting address - if (this.prgstart == 0x801) this.prgstart = 0x80d; + this.prgstart = this.romarr[0] + (this.romarr[1]<<8); // get load address + // look for BASIC program start + if (this.prgstart == 0x801) { + this.prgstart = this.romarr[2] + (this.romarr[3]<<8) + 2; // point to after BASIC program + console.log("prgstart", hex(this.prgstart)); + } } // clear keyboard for (var ch=0; ch<128; ch++) { @@ -593,8 +597,8 @@ export class C64_WASMMachine extends BaseWASMMachine implements Machine { this.exports.machine_exec(this.sys, 150000); // set IRQ routine @ 0x314 var old0x314 = this.read(0x314) + this.read(0x315) * 256; - this.write(0x314, 0x0d); - this.write(0x315, 0x08); + this.write(0x314, this.prgstart & 0xff); + this.write(0x315, (this.prgstart >> 8) & 0xff); // wait until IRQ fires for (var i=0; i<50000 && this.getPC() != this.prgstart; i++) { this.exports.machine_tick(this.sys);