diff --git a/STATUS.md b/STATUS.md index c23d642d..d5d73c1f 100644 --- a/STATUS.md +++ b/STATUS.md @@ -98,8 +98,8 @@ NOTE: Even the 'DONE' routines won't support features described as missing in on | `$FF81` | `$FF5B` | `CINT` | DONE | | | `$FF84` | `$FDA3` | `IOINIT` | PARTIAL | CIA initialization incomplete | | `$FF87` | `$FD50` | `RAMTAS` | DONE | | -| `$FF8A` | | `RESTOR` | DONE | | -| `$FF8D` | `$FD15` | `VECTOR` | PARTIAL | wrong address, code starts from RESTOR | +| `$FF8A` | `$FD15` | `RESTOR` | DONE | | +| `$FF8D` | `$FD1A` | `VECTOR` | DONE | | | `$FF90` | | `SETMSG` | DONE | | | `$FF93` | | `SECOND` | DONE | | | `$FF96` | | `TKSA` | DONE | | @@ -153,6 +153,7 @@ Not all of them - only these we want to have implemented. | `$EA31` | default IRQ | PARTIAL | | | `$EA7E` | ack CIA1 + below | DONE | | | `$EA81` | ret from IRQ/NMI | DONE | | +| `$FD30` | default vectors | DONE | | | `$FE47` | default NMI | PARTIAL | | | `$FE66` | default BRK | DONE | | | `$FF80` | revision byte | DONE | | diff --git a/c64/kernal/fd15.restor.s b/c64/kernal/fd15.restor.s new file mode 100644 index 00000000..c71fe1c4 --- /dev/null +++ b/c64/kernal/fd15.restor.s @@ -0,0 +1,24 @@ + +// +// Official Kernal routine, described in: +// +// - [RG64] C64 Programmer's Reference Guide - page 293 (RESTOR), 304 (VECTOR) +// - [CM64] Compute's Mapping the Commodore 64 - page 237 +// +// CPU registers that has to be preserved (see [RG64]): none +// + +RESTOR: + + clc // clear carry - for writing to system table + ldx #vector_defaults + + // FALLTHROUGH + +VECTOR: + +// Our implementation is longer than the original one, +// placing it here would cause a collision with VECTOR defaults + + jmp vector_real diff --git a/c64/kernal/fd30.interop b/c64/kernal/fd30.interop new file mode 100644 index 00000000..13c67365 --- /dev/null +++ b/c64/kernal/fd30.interop @@ -0,0 +1,3 @@ +Location of the default Kernal vector values, described in Compute's Mapping the Commodore 64, page 237 + +It is referenced by GEOS - see https://github.com/mist64/geos/blob/master/inc/c64.inc diff --git a/c64/kernal/vector_defaults.s b/c64/kernal/fd30.vector_defaults.s similarity index 100% rename from c64/kernal/vector_defaults.s rename to c64/kernal/fd30.vector_defaults.s diff --git a/c64/kernal/fd15.vector.s b/c64/kernal/vector_real.s similarity index 68% rename from c64/kernal/fd15.vector.s rename to c64/kernal/vector_real.s index 7b7fd00d..0f16c325 100644 --- a/c64/kernal/fd15.vector.s +++ b/c64/kernal/vector_real.s @@ -1,22 +1,5 @@ -// -// Official Kernal routine, described in: -// -// - [RG64] C64 Programmer's Reference Guide - page 293 (RESTOR), 304 (VECTOR) -// - [CM64] Compute's Mapping the Commodore 64 - page 237 -// -// CPU registers that has to be preserved (see [RG64]): none -// - -RESTOR: - - clc // clear carry - for writing to system table - ldx #vector_defaults - - // FALLTHROUGH - -VECTOR: +vector_real: // Temporary storage location - checked on real C64 that this is the // address originally used; after calling VECTOR and checking zero page @@ -41,17 +24,10 @@ VECTOR: ldy #$1F bcc vector_restore - // FALLTHROUGH - -vector_store: lda CINV, y sta (_caller_arr_ptr), y - dey - bpl vector_store - - // Restore status register (IRQ) before return - plp - rts + + // FALLTHROUGH vector_restore: lda (_caller_arr_ptr), y