From 3ba934e258c95213c1a964079b49370bd5f6412c Mon Sep 17 00:00:00 2001 From: mooinglemur Date: Sun, 3 Mar 2024 11:06:23 -0700 Subject: [PATCH] [KERNAL] add legacy/c816 extended APIs (#280) --- Makefile | 18 +++++++-- kernal/cbm/channel/channel.s | 6 +++ kernal/cbm/channel/x16additions.s | 8 ++++ kernal/vectors.s | 8 ++-- kernal/x16/65c816/extapi16.s | 42 +++++++++++++++++++++ kernal/{drivers => }/x16/65c816/interrupt.s | 0 kernal/{drivers => }/x16/65c816/stack.s | 0 kernal/x16/extapi.s | 35 +++++++++++++++++ kernsup/kernsup.inc | 4 +- 9 files changed, 112 insertions(+), 9 deletions(-) create mode 100644 kernal/cbm/channel/x16additions.s create mode 100644 kernal/x16/65c816/extapi16.s rename kernal/{drivers => }/x16/65c816/interrupt.s (100%) rename kernal/{drivers => }/x16/65c816/stack.s (100%) create mode 100644 kernal/x16/extapi.s diff --git a/Makefile b/Makefile index f69636ed..d2d930d8 100644 --- a/Makefile +++ b/Makefile @@ -41,7 +41,11 @@ KERNAL_CORE_SOURCES = \ kernal/cbm/nmi.s \ kernal/cbm/irq.s \ kernal/cbm/util.s \ - kernal/cbm/serial.s + kernal/cbm/serial.s \ + kernal/x16/extapi.s \ + kernal/x16/65c816/interrupt.s \ + kernal/x16/65c816/stack.s \ + kernal/x16/65c816/extapi16.s KERNAL_GRAPH_SOURCES = \ kernal/graph/graph.s \ @@ -66,8 +70,6 @@ KERNAL_DRIVER_SOURCES = \ kernal/drivers/x16/i2c.s \ kernal/drivers/x16/smc.s \ kernal/drivers/x16/rtc.s \ - kernal/drivers/x16/65c816/interrupt.s \ - kernal/drivers/x16/65c816/stack.s \ kernal/drivers/generic/softclock_timer.s KERNAL_SOURCES = \ @@ -182,6 +184,16 @@ GENERIC_DEPS = \ KERNAL_DEPS = \ $(GENERIC_DEPS) \ + kernal/cbm/channel/channelio.s \ + kernal/cbm/channel/clall.s \ + kernal/cbm/channel/close.s \ + kernal/cbm/channel/errorhandler.s \ + kernal/cbm/channel/load.s \ + kernal/cbm/channel/messages.s \ + kernal/cbm/channel/open.s \ + kernal/cbm/channel/openchannel.s \ + kernal/cbm/channel/save.s \ + kernal/cbm/channel/x16additions.s \ $(GIT_SIGNATURE) KEYMAP_DEPS = \ diff --git a/kernal/cbm/channel/channel.s b/kernal/cbm/channel/channel.s index 14c55967..82c68a55 100644 --- a/kernal/cbm/channel/channel.s +++ b/kernal/cbm/channel/channel.s @@ -94,6 +94,11 @@ untlk = $ffab .export savehl +; misc x16 additions +.export clear_status +.export get_fa + + .segment "ZPCHANNEL" : zeropage ; C64 location ; VVV @@ -146,4 +151,5 @@ stah .res 1 ;$C2 .include "load.s" .include "save.s" .include "errorhandler.s" +.include "x16additions.s" diff --git a/kernal/cbm/channel/x16additions.s b/kernal/cbm/channel/x16additions.s new file mode 100644 index 00000000..f0aca83d --- /dev/null +++ b/kernal/cbm/channel/x16additions.s @@ -0,0 +1,8 @@ + +clear_status: + stz status + rts + +get_fa: + lda fa + rts diff --git a/kernal/vectors.s b/kernal/vectors.s index 2edb30b1..6918e352 100644 --- a/kernal/vectors.s +++ b/kernal/vectors.s @@ -31,6 +31,8 @@ .import savehl +.import extapi, extapi16 + .import c816_abort_emulated, c816_clall_thunk, c816_getin_thunk .include "banks.inc" @@ -39,10 +41,8 @@ ; *** this is space for new X16 KERNAL vectors *** ; -; !!! DO NOT RELY ON THEIR ADDRESSES JUST YET !!! -; - .byte 0,0,0 ; $FEA8 - .byte 0,0,0 ; $FEAB + jmp extapi16 ; $FEA8 + jmp extapi ; $FEAB .byte 0,0,0 ; $FEAE jmp mciout ; $FEB1 jmp i2c_batch_read ; $FEB4 diff --git a/kernal/x16/65c816/extapi16.s b/kernal/x16/65c816/extapi16.s new file mode 100644 index 00000000..5c9cf17d --- /dev/null +++ b/kernal/x16/65c816/extapi16.s @@ -0,0 +1,42 @@ +.import stack_push, stack_pop +.import stack_enter_kernal_stack, stack_leave_kernal_stack + +.export extapi16 + +.include "65c816.inc" + +.segment "UTIL" + +.setcpu "65816" + +.A16 +.I16 + +; This API call expects and requires m=0, x=0, e=0 +extapi16: + php ; preserve flags + set_carry_if_65c816 + bcc unsupported + phx ; preserve X parameter + asl ; translate API call number to jump table entry + tax + lda apitbl,x + plx ; restore old X + plp ; restore flags + pha ; push api address-1 onto stack + rts ; jump to api + +unsupported: + plp +secrts: + sec + rts + +apitbl: + .word secrts-1 ; slot 0 is reserved + .word stack_push-1 ; API 1 + .word stack_pop-1 ; API 2 + .word stack_enter_kernal_stack-1 ; API 3 + .word stack_leave_kernal_stack-1 ; API 4 + + diff --git a/kernal/drivers/x16/65c816/interrupt.s b/kernal/x16/65c816/interrupt.s similarity index 100% rename from kernal/drivers/x16/65c816/interrupt.s rename to kernal/x16/65c816/interrupt.s diff --git a/kernal/drivers/x16/65c816/stack.s b/kernal/x16/65c816/stack.s similarity index 100% rename from kernal/drivers/x16/65c816/stack.s rename to kernal/x16/65c816/stack.s diff --git a/kernal/x16/extapi.s b/kernal/x16/extapi.s new file mode 100644 index 00000000..a6fd6c62 --- /dev/null +++ b/kernal/x16/extapi.s @@ -0,0 +1,35 @@ +.import clear_status +.import get_fa + +.export extapi + +.segment "UTIL" + +; This API call expects and requires e=1 +extapi: + pha ; reserve two free spots on the stack + pha + php ; preserve caller flags + phx ; preserve caller X parameter + asl + tax + lda apitbl,x ; low byte of jump table entry + pha + lda apitbl+1,x ; high byte of jump table entry + tsx + sta $105,x ; store API high byte on stack + pla + sta $104,x ; store API low byte on stack + plx ; restore caller X + plp ; restore caller flags + rts ; jump to api + +secrts: + sec + rts + +apitbl: + .word secrts-1 ; slot 0 is reserved + .word clear_status-1 ; API 1 + .word get_fa-1 ; API 2 + diff --git a/kernsup/kernsup.inc b/kernsup/kernsup.inc index adf62709..2d90a46d 100644 --- a/kernsup/kernsup.inc +++ b/kernsup/kernsup.inc @@ -1,5 +1,5 @@ -.byte 0,0,0 ; $FEA8 -.byte 0,0,0 ; $FEAB +bridge extapi16 ; $FEA8 +bridge extapi ; $FEAB .byte 0,0,0 ; $FEAE bridge mciout ; $FEB1 bridge i2c_batch_read ; $FEB4