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/c64.sgml b/doc/c64.sgml index f1e678c72..03a03974c 100644 --- a/doc/c64.sgml +++ b/doc/c64.sgml @@ -176,10 +176,13 @@ url="funcref.html" name="function reference"> for declaration and usage. detect_c64dtv +detect_c128 detect_scpu get_c64dtv_speed +get_c128_speed get_scpu_speed set_c64dtv_speed +set_c128_speed set_scpu_speed diff --git a/doc/funcref.sgml b/doc/funcref.sgml index 268c210fe..17a42b103 100644 --- a/doc/funcref.sgml +++ b/doc/funcref.sgml @@ -69,10 +69,13 @@ function. + + + @@ -2943,6 +2946,26 @@ used in presence of a prototype. +detect_c128 + + + +/ + +The function is specific to the C64. + +, +, + + + + detect_scpu @@ -3524,6 +3547,28 @@ header files define constants that can be used to check the return code. +get_c128_speed + + + +/ + +The function is specific to the C64. +The function does not check for the presence of a C128 in C64 mode. +See the accelerator.h header for the speed definitions. + +, +, + + + + get_scpu_speed @@ -6119,6 +6164,28 @@ clean-up when exitting the program. +set_c128_speed + + + +/ + +The function is specific to the C64. +The function does not check for the presence of a C128 in C64 mode. +See the accelerator.h header for the speed definitions. + +, +, + + + + set_scpu_speed diff --git a/include/accelerator.h b/include/accelerator.h index 336bbb036..0e3ba6e36 100644 --- a/include/accelerator.h +++ b/include/accelerator.h @@ -136,5 +136,44 @@ extern unsigned char detect_c64dtv (void); * 0x01 : C64DTV present */ + +/* C128 in C64 mode */ + +extern unsigned char __fastcall__ set_c128_speed (unsigned char speed); + +/* Set the speed of the C128 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 for the presence of a C128 in C64 mode, + * make sure you use 'detect_c128();' before using. + */ + +extern unsigned char get_c128_speed (void); + +/* Get the speed of the C128 CPU. + * + * Possible return values: + * SPEED_SLOW : Slow mode + * SPEED_2X : Fast mode + * + * This function does not check for the presence of a C128 in C64 mode, + * make sure you use 'detect_c128();' before using. + */ + +extern 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 + */ + /* End of accelerator.h */ #endif + diff --git a/libsrc/c64/acc_c128_speed.s b/libsrc/c64/acc_c128_speed.s new file mode 100755 index 000000000..4ec23b1da --- /dev/null +++ b/libsrc/c64/acc_c128_speed.s @@ -0,0 +1,53 @@ +; +; Marco van den Heuvel, 2018-04-20 +; + +; extern unsigned char __fastcall__ set_c128_speed (unsigned char speed); +; +;/* Set the speed of the C128 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 for the presence of a C128 in C64 mode, +; * make sure you use 'detect_c128();' before using. +; */ + +; extern unsigned char get_c128_speed (void); +; +;/* Get the speed of the C128 CPU. +; * +; * Possible return values: +; * SPEED_SLOW : Slow mode +; * SPEED_2X : Fast mode +; * +; * This function does not check for the presence of a C128 in C64 mode, +; * make sure you use 'detect_c128();' before using. +; */ + + .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 + jmp _get_c128_speed + +high_speed: + lda #$01 + bne store_speed + + +_get_c128_speed: + lda C128_VICIIE_CLK + and #$01 + ldx #$00 + rts + diff --git a/libsrc/c64/acc_detect_c128.s b/libsrc/c64/acc_detect_c128.s new file mode 100755 index 000000000..591ff6c59 --- /dev/null +++ b/libsrc/c64/acc_detect_c128.s @@ -0,0 +1,33 @@ +; +; 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 + bne not_found + +; Make sure a C128 VICIIe is present + ldy C128_VICIIE_CLK + cpy #$FF + beq not_found +found: + lda #$01 +not_found: + rts diff --git a/testcode/lib/accelerator/Makefile b/testcode/lib/accelerator/Makefile index a9fe5f78d..c6423e44f 100644 --- a/testcode/lib/accelerator/Makefile +++ b/testcode/lib/accelerator/Makefile @@ -1,6 +1,6 @@ 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 c64-scpu-test.prg: c64-c128-scpu-test.c $(CL) -t c64 c64-c128-scpu-test.c -o c64-scpu-test.prg @@ -11,3 +11,5 @@ 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 diff --git a/testcode/lib/accelerator/c64-c128-test.c b/testcode/lib/accelerator/c64-c128-test.c new file mode 100755 index 000000000..fd20a665e --- /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 in C64 mode" + +#include "turbo-test.c"
+ + + +/ + +The function is specific to the C64. + +, +, + + + + detect_scpu @@ -3524,6 +3547,28 @@ header files define constants that can be used to check the return code. +get_c128_speed + + + +/ + +The function is specific to the C64. +The function does not check for the presence of a C128 in C64 mode. +See the accelerator.h header for the speed definitions. + +, +, + + + + get_scpu_speed @@ -6119,6 +6164,28 @@ clean-up when exitting the program. +set_c128_speed + + + +/ + +The function is specific to the C64. +The function does not check for the presence of a C128 in C64 mode. +See the accelerator.h header for the speed definitions. + +, +, + + + + set_scpu_speed diff --git a/include/accelerator.h b/include/accelerator.h index 336bbb036..0e3ba6e36 100644 --- a/include/accelerator.h +++ b/include/accelerator.h @@ -136,5 +136,44 @@ extern unsigned char detect_c64dtv (void); * 0x01 : C64DTV present */ + +/* C128 in C64 mode */ + +extern unsigned char __fastcall__ set_c128_speed (unsigned char speed); + +/* Set the speed of the C128 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 for the presence of a C128 in C64 mode, + * make sure you use 'detect_c128();' before using. + */ + +extern unsigned char get_c128_speed (void); + +/* Get the speed of the C128 CPU. + * + * Possible return values: + * SPEED_SLOW : Slow mode + * SPEED_2X : Fast mode + * + * This function does not check for the presence of a C128 in C64 mode, + * make sure you use 'detect_c128();' before using. + */ + +extern 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 + */ + /* End of accelerator.h */ #endif + diff --git a/libsrc/c64/acc_c128_speed.s b/libsrc/c64/acc_c128_speed.s new file mode 100755 index 000000000..4ec23b1da --- /dev/null +++ b/libsrc/c64/acc_c128_speed.s @@ -0,0 +1,53 @@ +; +; Marco van den Heuvel, 2018-04-20 +; + +; extern unsigned char __fastcall__ set_c128_speed (unsigned char speed); +; +;/* Set the speed of the C128 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 for the presence of a C128 in C64 mode, +; * make sure you use 'detect_c128();' before using. +; */ + +; extern unsigned char get_c128_speed (void); +; +;/* Get the speed of the C128 CPU. +; * +; * Possible return values: +; * SPEED_SLOW : Slow mode +; * SPEED_2X : Fast mode +; * +; * This function does not check for the presence of a C128 in C64 mode, +; * make sure you use 'detect_c128();' before using. +; */ + + .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 + jmp _get_c128_speed + +high_speed: + lda #$01 + bne store_speed + + +_get_c128_speed: + lda C128_VICIIE_CLK + and #$01 + ldx #$00 + rts + diff --git a/libsrc/c64/acc_detect_c128.s b/libsrc/c64/acc_detect_c128.s new file mode 100755 index 000000000..591ff6c59 --- /dev/null +++ b/libsrc/c64/acc_detect_c128.s @@ -0,0 +1,33 @@ +; +; 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 + bne not_found + +; Make sure a C128 VICIIe is present + ldy C128_VICIIE_CLK + cpy #$FF + beq not_found +found: + lda #$01 +not_found: + rts diff --git a/testcode/lib/accelerator/Makefile b/testcode/lib/accelerator/Makefile index a9fe5f78d..c6423e44f 100644 --- a/testcode/lib/accelerator/Makefile +++ b/testcode/lib/accelerator/Makefile @@ -1,6 +1,6 @@ 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 c64-scpu-test.prg: c64-c128-scpu-test.c $(CL) -t c64 c64-c128-scpu-test.c -o c64-scpu-test.prg @@ -11,3 +11,5 @@ 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 diff --git a/testcode/lib/accelerator/c64-c128-test.c b/testcode/lib/accelerator/c64-c128-test.c new file mode 100755 index 000000000..fd20a665e --- /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 in C64 mode" + +#include "turbo-test.c"
+ +/ + +The function is specific to the C64. + +, +, + +
@@ -3524,6 +3547,28 @@ header files define constants that can be used to check the return code. +get_c128_speed + + + +/ + +The function is specific to the C64. +The function does not check for the presence of a C128 in C64 mode. +See the accelerator.h header for the speed definitions. + +, +, + + + + get_scpu_speed @@ -6119,6 +6164,28 @@ clean-up when exitting the program. +set_c128_speed + + + +/ + +The function is specific to the C64. +The function does not check for the presence of a C128 in C64 mode. +See the accelerator.h header for the speed definitions. + +, +, + + + + set_scpu_speed diff --git a/include/accelerator.h b/include/accelerator.h index 336bbb036..0e3ba6e36 100644 --- a/include/accelerator.h +++ b/include/accelerator.h @@ -136,5 +136,44 @@ extern unsigned char detect_c64dtv (void); * 0x01 : C64DTV present */ + +/* C128 in C64 mode */ + +extern unsigned char __fastcall__ set_c128_speed (unsigned char speed); + +/* Set the speed of the C128 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 for the presence of a C128 in C64 mode, + * make sure you use 'detect_c128();' before using. + */ + +extern unsigned char get_c128_speed (void); + +/* Get the speed of the C128 CPU. + * + * Possible return values: + * SPEED_SLOW : Slow mode + * SPEED_2X : Fast mode + * + * This function does not check for the presence of a C128 in C64 mode, + * make sure you use 'detect_c128();' before using. + */ + +extern 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 + */ + /* End of accelerator.h */ #endif + diff --git a/libsrc/c64/acc_c128_speed.s b/libsrc/c64/acc_c128_speed.s new file mode 100755 index 000000000..4ec23b1da --- /dev/null +++ b/libsrc/c64/acc_c128_speed.s @@ -0,0 +1,53 @@ +; +; Marco van den Heuvel, 2018-04-20 +; + +; extern unsigned char __fastcall__ set_c128_speed (unsigned char speed); +; +;/* Set the speed of the C128 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 for the presence of a C128 in C64 mode, +; * make sure you use 'detect_c128();' before using. +; */ + +; extern unsigned char get_c128_speed (void); +; +;/* Get the speed of the C128 CPU. +; * +; * Possible return values: +; * SPEED_SLOW : Slow mode +; * SPEED_2X : Fast mode +; * +; * This function does not check for the presence of a C128 in C64 mode, +; * make sure you use 'detect_c128();' before using. +; */ + + .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 + jmp _get_c128_speed + +high_speed: + lda #$01 + bne store_speed + + +_get_c128_speed: + lda C128_VICIIE_CLK + and #$01 + ldx #$00 + rts + diff --git a/libsrc/c64/acc_detect_c128.s b/libsrc/c64/acc_detect_c128.s new file mode 100755 index 000000000..591ff6c59 --- /dev/null +++ b/libsrc/c64/acc_detect_c128.s @@ -0,0 +1,33 @@ +; +; 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 + bne not_found + +; Make sure a C128 VICIIe is present + ldy C128_VICIIE_CLK + cpy #$FF + beq not_found +found: + lda #$01 +not_found: + rts diff --git a/testcode/lib/accelerator/Makefile b/testcode/lib/accelerator/Makefile index a9fe5f78d..c6423e44f 100644 --- a/testcode/lib/accelerator/Makefile +++ b/testcode/lib/accelerator/Makefile @@ -1,6 +1,6 @@ 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 c64-scpu-test.prg: c64-c128-scpu-test.c $(CL) -t c64 c64-c128-scpu-test.c -o c64-scpu-test.prg @@ -11,3 +11,5 @@ 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 diff --git a/testcode/lib/accelerator/c64-c128-test.c b/testcode/lib/accelerator/c64-c128-test.c new file mode 100755 index 000000000..fd20a665e --- /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 in C64 mode" + +#include "turbo-test.c"
@@ -3524,6 +3547,28 @@ header files define constants that can be used to check the return code.
+ + + +/ + +The function is specific to the C64. +The function does not check for the presence of a C128 in C64 mode. +See the accelerator.h header for the speed definitions. + +, +, + + + + get_scpu_speed @@ -6119,6 +6164,28 @@ clean-up when exitting the program. +set_c128_speed + + + +/ + +The function is specific to the C64. +The function does not check for the presence of a C128 in C64 mode. +See the accelerator.h header for the speed definitions. + +, +, + + + + set_scpu_speed diff --git a/include/accelerator.h b/include/accelerator.h index 336bbb036..0e3ba6e36 100644 --- a/include/accelerator.h +++ b/include/accelerator.h @@ -136,5 +136,44 @@ extern unsigned char detect_c64dtv (void); * 0x01 : C64DTV present */ + +/* C128 in C64 mode */ + +extern unsigned char __fastcall__ set_c128_speed (unsigned char speed); + +/* Set the speed of the C128 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 for the presence of a C128 in C64 mode, + * make sure you use 'detect_c128();' before using. + */ + +extern unsigned char get_c128_speed (void); + +/* Get the speed of the C128 CPU. + * + * Possible return values: + * SPEED_SLOW : Slow mode + * SPEED_2X : Fast mode + * + * This function does not check for the presence of a C128 in C64 mode, + * make sure you use 'detect_c128();' before using. + */ + +extern 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 + */ + /* End of accelerator.h */ #endif + diff --git a/libsrc/c64/acc_c128_speed.s b/libsrc/c64/acc_c128_speed.s new file mode 100755 index 000000000..4ec23b1da --- /dev/null +++ b/libsrc/c64/acc_c128_speed.s @@ -0,0 +1,53 @@ +; +; Marco van den Heuvel, 2018-04-20 +; + +; extern unsigned char __fastcall__ set_c128_speed (unsigned char speed); +; +;/* Set the speed of the C128 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 for the presence of a C128 in C64 mode, +; * make sure you use 'detect_c128();' before using. +; */ + +; extern unsigned char get_c128_speed (void); +; +;/* Get the speed of the C128 CPU. +; * +; * Possible return values: +; * SPEED_SLOW : Slow mode +; * SPEED_2X : Fast mode +; * +; * This function does not check for the presence of a C128 in C64 mode, +; * make sure you use 'detect_c128();' before using. +; */ + + .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 + jmp _get_c128_speed + +high_speed: + lda #$01 + bne store_speed + + +_get_c128_speed: + lda C128_VICIIE_CLK + and #$01 + ldx #$00 + rts + diff --git a/libsrc/c64/acc_detect_c128.s b/libsrc/c64/acc_detect_c128.s new file mode 100755 index 000000000..591ff6c59 --- /dev/null +++ b/libsrc/c64/acc_detect_c128.s @@ -0,0 +1,33 @@ +; +; 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 + bne not_found + +; Make sure a C128 VICIIe is present + ldy C128_VICIIE_CLK + cpy #$FF + beq not_found +found: + lda #$01 +not_found: + rts diff --git a/testcode/lib/accelerator/Makefile b/testcode/lib/accelerator/Makefile index a9fe5f78d..c6423e44f 100644 --- a/testcode/lib/accelerator/Makefile +++ b/testcode/lib/accelerator/Makefile @@ -1,6 +1,6 @@ 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 c64-scpu-test.prg: c64-c128-scpu-test.c $(CL) -t c64 c64-c128-scpu-test.c -o c64-scpu-test.prg @@ -11,3 +11,5 @@ 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 diff --git a/testcode/lib/accelerator/c64-c128-test.c b/testcode/lib/accelerator/c64-c128-test.c new file mode 100755 index 000000000..fd20a665e --- /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 in C64 mode" + +#include "turbo-test.c"
+ +/ + +The function is specific to the C64. +The function does not check for the presence of a C128 in C64 mode. +See the accelerator.h header for the speed definitions. + +, +, + +
@@ -6119,6 +6164,28 @@ clean-up when exitting the program. +set_c128_speed + + + +/ + +The function is specific to the C64. +The function does not check for the presence of a C128 in C64 mode. +See the accelerator.h header for the speed definitions. + +, +, + + + + set_scpu_speed diff --git a/include/accelerator.h b/include/accelerator.h index 336bbb036..0e3ba6e36 100644 --- a/include/accelerator.h +++ b/include/accelerator.h @@ -136,5 +136,44 @@ extern unsigned char detect_c64dtv (void); * 0x01 : C64DTV present */ + +/* C128 in C64 mode */ + +extern unsigned char __fastcall__ set_c128_speed (unsigned char speed); + +/* Set the speed of the C128 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 for the presence of a C128 in C64 mode, + * make sure you use 'detect_c128();' before using. + */ + +extern unsigned char get_c128_speed (void); + +/* Get the speed of the C128 CPU. + * + * Possible return values: + * SPEED_SLOW : Slow mode + * SPEED_2X : Fast mode + * + * This function does not check for the presence of a C128 in C64 mode, + * make sure you use 'detect_c128();' before using. + */ + +extern 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 + */ + /* End of accelerator.h */ #endif + diff --git a/libsrc/c64/acc_c128_speed.s b/libsrc/c64/acc_c128_speed.s new file mode 100755 index 000000000..4ec23b1da --- /dev/null +++ b/libsrc/c64/acc_c128_speed.s @@ -0,0 +1,53 @@ +; +; Marco van den Heuvel, 2018-04-20 +; + +; extern unsigned char __fastcall__ set_c128_speed (unsigned char speed); +; +;/* Set the speed of the C128 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 for the presence of a C128 in C64 mode, +; * make sure you use 'detect_c128();' before using. +; */ + +; extern unsigned char get_c128_speed (void); +; +;/* Get the speed of the C128 CPU. +; * +; * Possible return values: +; * SPEED_SLOW : Slow mode +; * SPEED_2X : Fast mode +; * +; * This function does not check for the presence of a C128 in C64 mode, +; * make sure you use 'detect_c128();' before using. +; */ + + .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 + jmp _get_c128_speed + +high_speed: + lda #$01 + bne store_speed + + +_get_c128_speed: + lda C128_VICIIE_CLK + and #$01 + ldx #$00 + rts + diff --git a/libsrc/c64/acc_detect_c128.s b/libsrc/c64/acc_detect_c128.s new file mode 100755 index 000000000..591ff6c59 --- /dev/null +++ b/libsrc/c64/acc_detect_c128.s @@ -0,0 +1,33 @@ +; +; 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 + bne not_found + +; Make sure a C128 VICIIe is present + ldy C128_VICIIE_CLK + cpy #$FF + beq not_found +found: + lda #$01 +not_found: + rts diff --git a/testcode/lib/accelerator/Makefile b/testcode/lib/accelerator/Makefile index a9fe5f78d..c6423e44f 100644 --- a/testcode/lib/accelerator/Makefile +++ b/testcode/lib/accelerator/Makefile @@ -1,6 +1,6 @@ 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 c64-scpu-test.prg: c64-c128-scpu-test.c $(CL) -t c64 c64-c128-scpu-test.c -o c64-scpu-test.prg @@ -11,3 +11,5 @@ 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 diff --git a/testcode/lib/accelerator/c64-c128-test.c b/testcode/lib/accelerator/c64-c128-test.c new file mode 100755 index 000000000..fd20a665e --- /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 in C64 mode" + +#include "turbo-test.c"
@@ -6119,6 +6164,28 @@ clean-up when exitting the program.
+ + + +/ + +The function is specific to the C64. +The function does not check for the presence of a C128 in C64 mode. +See the accelerator.h header for the speed definitions. + +, +, + + + + set_scpu_speed diff --git a/include/accelerator.h b/include/accelerator.h index 336bbb036..0e3ba6e36 100644 --- a/include/accelerator.h +++ b/include/accelerator.h @@ -136,5 +136,44 @@ extern unsigned char detect_c64dtv (void); * 0x01 : C64DTV present */ + +/* C128 in C64 mode */ + +extern unsigned char __fastcall__ set_c128_speed (unsigned char speed); + +/* Set the speed of the C128 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 for the presence of a C128 in C64 mode, + * make sure you use 'detect_c128();' before using. + */ + +extern unsigned char get_c128_speed (void); + +/* Get the speed of the C128 CPU. + * + * Possible return values: + * SPEED_SLOW : Slow mode + * SPEED_2X : Fast mode + * + * This function does not check for the presence of a C128 in C64 mode, + * make sure you use 'detect_c128();' before using. + */ + +extern 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 + */ + /* End of accelerator.h */ #endif + diff --git a/libsrc/c64/acc_c128_speed.s b/libsrc/c64/acc_c128_speed.s new file mode 100755 index 000000000..4ec23b1da --- /dev/null +++ b/libsrc/c64/acc_c128_speed.s @@ -0,0 +1,53 @@ +; +; Marco van den Heuvel, 2018-04-20 +; + +; extern unsigned char __fastcall__ set_c128_speed (unsigned char speed); +; +;/* Set the speed of the C128 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 for the presence of a C128 in C64 mode, +; * make sure you use 'detect_c128();' before using. +; */ + +; extern unsigned char get_c128_speed (void); +; +;/* Get the speed of the C128 CPU. +; * +; * Possible return values: +; * SPEED_SLOW : Slow mode +; * SPEED_2X : Fast mode +; * +; * This function does not check for the presence of a C128 in C64 mode, +; * make sure you use 'detect_c128();' before using. +; */ + + .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 + jmp _get_c128_speed + +high_speed: + lda #$01 + bne store_speed + + +_get_c128_speed: + lda C128_VICIIE_CLK + and #$01 + ldx #$00 + rts + diff --git a/libsrc/c64/acc_detect_c128.s b/libsrc/c64/acc_detect_c128.s new file mode 100755 index 000000000..591ff6c59 --- /dev/null +++ b/libsrc/c64/acc_detect_c128.s @@ -0,0 +1,33 @@ +; +; 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 + bne not_found + +; Make sure a C128 VICIIe is present + ldy C128_VICIIE_CLK + cpy #$FF + beq not_found +found: + lda #$01 +not_found: + rts diff --git a/testcode/lib/accelerator/Makefile b/testcode/lib/accelerator/Makefile index a9fe5f78d..c6423e44f 100644 --- a/testcode/lib/accelerator/Makefile +++ b/testcode/lib/accelerator/Makefile @@ -1,6 +1,6 @@ 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 c64-scpu-test.prg: c64-c128-scpu-test.c $(CL) -t c64 c64-c128-scpu-test.c -o c64-scpu-test.prg @@ -11,3 +11,5 @@ 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 diff --git a/testcode/lib/accelerator/c64-c128-test.c b/testcode/lib/accelerator/c64-c128-test.c new file mode 100755 index 000000000..fd20a665e --- /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 in C64 mode" + +#include "turbo-test.c"
diff --git a/include/accelerator.h b/include/accelerator.h index 336bbb036..0e3ba6e36 100644 --- a/include/accelerator.h +++ b/include/accelerator.h @@ -136,5 +136,44 @@ extern unsigned char detect_c64dtv (void); * 0x01 : C64DTV present */ + +/* C128 in C64 mode */ + +extern unsigned char __fastcall__ set_c128_speed (unsigned char speed); + +/* Set the speed of the C128 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 for the presence of a C128 in C64 mode, + * make sure you use 'detect_c128();' before using. + */ + +extern unsigned char get_c128_speed (void); + +/* Get the speed of the C128 CPU. + * + * Possible return values: + * SPEED_SLOW : Slow mode + * SPEED_2X : Fast mode + * + * This function does not check for the presence of a C128 in C64 mode, + * make sure you use 'detect_c128();' before using. + */ + +extern 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 + */ + /* End of accelerator.h */ #endif + diff --git a/libsrc/c64/acc_c128_speed.s b/libsrc/c64/acc_c128_speed.s new file mode 100755 index 000000000..4ec23b1da --- /dev/null +++ b/libsrc/c64/acc_c128_speed.s @@ -0,0 +1,53 @@ +; +; Marco van den Heuvel, 2018-04-20 +; + +; extern unsigned char __fastcall__ set_c128_speed (unsigned char speed); +; +;/* Set the speed of the C128 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 for the presence of a C128 in C64 mode, +; * make sure you use 'detect_c128();' before using. +; */ + +; extern unsigned char get_c128_speed (void); +; +;/* Get the speed of the C128 CPU. +; * +; * Possible return values: +; * SPEED_SLOW : Slow mode +; * SPEED_2X : Fast mode +; * +; * This function does not check for the presence of a C128 in C64 mode, +; * make sure you use 'detect_c128();' before using. +; */ + + .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 + jmp _get_c128_speed + +high_speed: + lda #$01 + bne store_speed + + +_get_c128_speed: + lda C128_VICIIE_CLK + and #$01 + ldx #$00 + rts + diff --git a/libsrc/c64/acc_detect_c128.s b/libsrc/c64/acc_detect_c128.s new file mode 100755 index 000000000..591ff6c59 --- /dev/null +++ b/libsrc/c64/acc_detect_c128.s @@ -0,0 +1,33 @@ +; +; 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 + bne not_found + +; Make sure a C128 VICIIe is present + ldy C128_VICIIE_CLK + cpy #$FF + beq not_found +found: + lda #$01 +not_found: + rts diff --git a/testcode/lib/accelerator/Makefile b/testcode/lib/accelerator/Makefile index a9fe5f78d..c6423e44f 100644 --- a/testcode/lib/accelerator/Makefile +++ b/testcode/lib/accelerator/Makefile @@ -1,6 +1,6 @@ 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 c64-scpu-test.prg: c64-c128-scpu-test.c $(CL) -t c64 c64-c128-scpu-test.c -o c64-scpu-test.prg @@ -11,3 +11,5 @@ 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 diff --git a/testcode/lib/accelerator/c64-c128-test.c b/testcode/lib/accelerator/c64-c128-test.c new file mode 100755 index 000000000..fd20a665e --- /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 in C64 mode" + +#include "turbo-test.c"