diff --git a/coco/src/bus/bus_ready.c b/coco/src/bus/bus_ready.c index b621e10..6ae53dd 100644 --- a/coco/src/bus/bus_ready.c +++ b/coco/src/bus/bus_ready.c @@ -11,6 +11,24 @@ #include #include + +#define DWWRT_VEC_DRG 0xD941 +#define DWREAD_VEC_DRG 0xD93F +#define DWWRT_VEC_COCO 0xFA00 +#define DWREAD_VEC_COCO 0xF9FE + +static gbDWInited = false; +// default to coco read/write if not inited. +dwvec dwreadvec = DWREAD_VEC_COCO; +dwvec dwwritevec = DWWRT_VEC_COCO; + +// detection logic for dragon stolen from: https://exileinparadise.com/tandy_color_computer:keyscn2 +// +const uint16_t* RESET = 0xFFFE; // Address of MPU Reset Vector +const uint16_t VECCOCO = 0xA027; // CoCo 1/2 reset vector value +const uint16_t VECDRGN = 0xB3B4; // Dragon32/64 reset vector value +const uint16_t VECCOCO3 = 0x8C1B; // CoCo3 reset vector value + void bus_ready(void) { struct _readycmd @@ -19,6 +37,16 @@ void bus_ready(void) uint8_t command; } rc; + if (!gbDWInited) + { + if (*RESET==VECDRGN) + { + dwreadvec = DWREAD_VEC_DRG; + dwwritevec = DWWRT_VEC_DRG; + } + gbDWInited = true; + } + uint8_t z=0, r; rc.opcode = OP_FUJI; diff --git a/coco/src/bus/dwread.c b/coco/src/bus/dwread.c index 9510d8e..d858c6c 100644 --- a/coco/src/bus/dwread.c +++ b/coco/src/bus/dwread.c @@ -6,8 +6,8 @@ */ #include - -typedef unsigned char byte; +#include +#include "dw.h" byte dwread(byte *s, int l) { @@ -16,7 +16,7 @@ byte dwread(byte *s, int l) pshs x,y ldx :s ldy :l - jsr [0xD93F] + jsr [dwreadvec] puls y,x tfr cc,b lsrb diff --git a/coco/src/bus/dwwrite.c b/coco/src/bus/dwwrite.c index 01e7bbf..aaf2753 100644 --- a/coco/src/bus/dwwrite.c +++ b/coco/src/bus/dwwrite.c @@ -7,6 +7,8 @@ #include #include +#include "dw.h" + byte dwwrite(byte *s, int l) { @@ -15,7 +17,7 @@ byte dwwrite(byte *s, int l) pshs x,y ldx :s ldy :l - jsr [0xD941] + jsr [dwwritevec] tfr cc,d puls y,x } diff --git a/coco/src/include/dw.h b/coco/src/include/dw.h index ad01519..c70ef60 100644 --- a/coco/src/include/dw.h +++ b/coco/src/include/dw.h @@ -10,6 +10,12 @@ #define OP_FUJI 0xE2 #define OP_NET 0xE3 +typedef unsigned char (*dwvec)(unsigned char); + +extern dwvec dwreadvec; +extern dwvec dwwritevec; + + /** * @brief Read string to s from DriveWire with expected length l * @param s pointer to string buffer