diff --git a/asminc/accelerator.inc b/asminc/accelerator.inc index 1008b49c1..86d27b3f2 100644 --- a/asminc/accelerator.inc +++ b/asminc/accelerator.inc @@ -40,3 +40,10 @@ C64DTV_Extended_Regs := $D03F C64DTV_Slow = $00 C64DTV_Fast = $03 + + +; --------------------------------------------------------------------------- +; C128 in C64 mode + +C128_VICIIE_CLK := $D030 + diff --git a/doc/c128.sgml b/doc/c128.sgml index 9af66d62b..1bdcf01f5 100644 --- a/doc/c128.sgml +++ b/doc/c128.sgml @@ -94,9 +94,12 @@ The functions listed below are accelerator functions for the C128. See the for declaration and usage. +detect_c128 detect_scpu -scpu_get_speed -scpu_set_speed +get_c128_speed +get_scpu_speed +set_c128_speed +set_scpu_speed diff --git a/doc/c64.sgml b/doc/c64.sgml index f1e678c72..c2c9551b4 100644 --- a/doc/c64.sgml +++ b/doc/c64.sgml @@ -175,10 +175,13 @@ The functions listed below are accelerator functions for the C64. See the for declaration and usage. +detect_c128 detect_c64dtv detect_scpu +get_c128_speed get_c64dtv_speed get_scpu_speed +set_c128_speed set_c64dtv_speed set_scpu_speed diff --git a/doc/funcref.sgml b/doc/funcref.sgml index 268c210fe..55701cf55 100644 --- a/doc/funcref.sgml +++ b/doc/funcref.sgml @@ -68,10 +68,13 @@ function.

+ + + @@ -2923,6 +2926,26 @@ used in presence of a prototype. +detect_c128

+ + + +/ + +The function is specific to the C64 and C128. + +, +, + + + + detect_c64dtv

@@ -3502,6 +3525,28 @@ header files define constants that can be used to check the return code. +get_c128_speed

+ + + +/ + +The function is specific to the C64 and C128. +The function does not check if the C128 CPU is the current CPU. +See the accelerator.h header for the speed definitions. + +, +, + + + + get_c64dtv_speed

@@ -6097,6 +6142,28 @@ clean-up when exitting the program. +set_c128_speed

+ + + +/ + +The function is specific to the C64 and C128. +The function does not check if the C128 CPU is the current CPU. +See the accelerator.h header for the speed definitions. + +, +, + + + + set_c64dtv_speed

diff --git a/include/accelerator.h b/include/accelerator.h index 336bbb036..0fa202bc6 100644 --- a/include/accelerator.h +++ b/include/accelerator.h @@ -136,5 +136,44 @@ extern unsigned char detect_c64dtv (void); * 0x01 : C64DTV present */ + +/* C128 8502 CPU */ + +extern unsigned char __fastcall__ set_c128_speed (unsigned char speed); + +/* Set the speed of the C128 8502 CPU, using SPEED_SLOW will switch to + * 1 Mhz (slow) mode, SPEED_2X or SPEED_FAST will switch to 2Mhz (fast) mode. + * + * Note that any value higher or equal to SPEED_2X will switch to fast mode. + * + * This function will return the actual speed the CPU is at after trying + * to set the requested speed, to my knowledge the switching should not fail. + * + * This function does not check if the C128 CPU is the current CPU, make sure + * you use 'detect_c128();' before using. + */ + +extern unsigned char get_c128_speed (void); + +/* Get the speed of the C128 8502 CPU. + * + * Possible return values: + * SPEED_SLOW : Slow mode + * SPEED_2X : Fast mode + * + * This function does not check if the C128 CPU is the current CPU, make sure + * you use 'detect_c128();' before using. + */ + +extern unsigned char detect_c128 (void); + +/* Check if the C128 CPU is the current CPU. + * + * Possible return values: + * 0x00 : C128 CPU is not the current CPU + * 0x01 : C128 CPU is the current CPU + */ + /* End of accelerator.h */ #endif + diff --git a/libsrc/c128/acc_c128_speed.s b/libsrc/c128/acc_c128_speed.s new file mode 100755 index 000000000..c3012b2c8 --- /dev/null +++ b/libsrc/c128/acc_c128_speed.s @@ -0,0 +1,56 @@ +; +; Marco van den Heuvel, 2018-04-23 +; + +; extern unsigned char __fastcall__ set_c128_speed (unsigned char speed); +; +;/* Set the speed of the C128 8502 CPU, using SPEED_SLOW will switch to +; * 1 Mhz (slow) mode, SPEED_2X or SPEED_FAST will switch to 2Mhz (fast) mode. +; * +; * Note that any value higher or equal to SPEED_2X will switch to fast mode. +; * +; * This function will return the actual speed the CPU is at after trying +; * to set the requested speed, to my knowledge the switching should not fail. +; * +; * For C64 programs a check for a C128 in C64 mode is needed, make sure you +; * use 'detect_c128();' before using. +; * +; * For C128 programs no detect function call is needed. +; */ + +; extern unsigned char get_c128_speed (void); +; +;/* Get the speed of the C128 8502 CPU. +; * +; * Possible return values: +; * SPEED_SLOW : Slow mode +; * SPEED_2X : Fast mode +; * +; * For C64 programs a check for a C128 in C64 mode is needed, make sure you +; * use 'detect_c128();' before using. +; * +; * For C128 programs no detect function call is needed. +; */ + + .export _set_c128_speed + .export _get_c128_speed + + .include "accelerator.inc" + +_set_c128_speed: + cmp #SPEED_2X + bcs high_speed +store_speed: + sta C128_VICIIE_CLK + + .byte $2C ; skip over the lda #$01 +high_speed: + lda #$01 + bne store_speed + +_get_c128_speed: + lda C128_VICIIE_CLK + and #$01 + ldx #$00 + rts + diff --git a/libsrc/c128/acc_detect_c128.s b/libsrc/c128/acc_detect_c128.s new file mode 100755 index 000000000..f40fe395a --- /dev/null +++ b/libsrc/c128/acc_detect_c128.s @@ -0,0 +1,24 @@ +; +; Marco van den Heuvel, 2018-04-23 +; + +; unsigned char detect_c128 (void); +; +;/* Check if the C128 8502 CPU is the current CPU. +; * +; * Possible return values: +; * 0x00 : C128 8502 is not the current CPU +; * 0x01 : C128 8502 is the current CPU +; */ + + .export _detect_c128 + + .include "accelerator.inc" + +_detect_c128: + ldx #$00 + lda #$01 + +; Make sure the CPU is a 8502 + .byte $3A ; NOP on 8502, DEA on 65(S)C(E)02, 4510 and 65816 + rts diff --git a/libsrc/c64/acc_c128_speed.s b/libsrc/c64/acc_c128_speed.s new file mode 100755 index 000000000..bdd559412 --- /dev/null +++ b/libsrc/c64/acc_c128_speed.s @@ -0,0 +1,6 @@ +; +; Marco van den Heuvel, 2018-04-23 +; + +.include "../c128/acc_c128_speed.s" + diff --git a/libsrc/c64/acc_detect_c128.s b/libsrc/c64/acc_detect_c128.s new file mode 100755 index 000000000..71996730e --- /dev/null +++ b/libsrc/c64/acc_detect_c128.s @@ -0,0 +1,36 @@ +; +; Marco van den Heuvel, 2018-04-20 +; + +; unsigned char detect_c128 (void); +; +;/* Check for the presence of a C128 in C64 mode. +; * +; * Possible return values: +; * 0x00 : C128 in C64 mode not present +; * 0x01 : C128 in C64 mode present +; */ + + .export _detect_c128 + + .include "accelerator.inc" + +_detect_c128: + lda #$00 + tax + +; Make sure the CPU is a 8502 + .byte $1A ; NOP on 8502, INA on 65(S)C(E)02, 4510 and 65816 + beq found + .byte $3A ; decrement A again, so a #$00 can be returned + rts + +found: + +; Make sure a C128 VICIIe is present + ldy C128_VICIIE_CLK + cpy #$FF + beq not_found + lda #$01 +not_found: + rts diff --git a/testcode/lib/accelerator/Makefile b/testcode/lib/accelerator/Makefile index a9fe5f78d..121ad57b8 100644 --- a/testcode/lib/accelerator/Makefile +++ b/testcode/lib/accelerator/Makefile @@ -1,6 +1,7 @@ CL ?= cl65 -all: c64-scpu-test.prg c128-scpu-test.prg c64dtv-test.prg +all: c64-scpu-test.prg c128-scpu-test.prg c64dtv-test.prg \ + c64-c128-test.prg c128-test.prg c64-scpu-test.prg: c64-c128-scpu-test.c $(CL) -t c64 c64-c128-scpu-test.c -o c64-scpu-test.prg @@ -11,3 +12,8 @@ c128-scpu-test.prg: c64-c128-scpu-test.c c64dtv-test.prg: c64dtv-test.c $(CL) -t c64 c64dtv-test.c -o c64dtv-test.prg +c64-c128-test.prg: c64-c128-test.c + $(CL) -t c64 c64-c128-test.c -o c64-c128-test.prg + +c128-test.prg: c64-c128-test.c + $(CL) -t c128 c64-c128-test.c -o c128-test.prg diff --git a/testcode/lib/accelerator/c64-c128-test.c b/testcode/lib/accelerator/c64-c128-test.c new file mode 100755 index 000000000..ba212e03d --- /dev/null +++ b/testcode/lib/accelerator/c64-c128-test.c @@ -0,0 +1,8 @@ +/* C128 in C64 mode accelerator test code. */ + +#define ACC_DETECT detect_c128 +#define ACC_GET_SPEED get_c128_speed +#define ACC_SET_SPEED set_c128_speed +#define ACC_NAME "C128 CPU" + +#include "turbo-test.c"