diff --git a/asminc/accelerator.inc b/asminc/accelerator.inc index 86d27b3f2..0c687b2ad 100644 --- a/asminc/accelerator.inc +++ b/asminc/accelerator.inc @@ -43,7 +43,20 @@ C64DTV_Fast = $03 ; --------------------------------------------------------------------------- -; C128 in C64 mode +; C128 native and C128 in C64 mode C128_VICIIE_CLK := $D030 + +; --------------------------------------------------------------------------- +; C64 Chameleon cartridge + +CHAMELEON_CFGTUR := $D0F3 +CHAMELEON_CFGENA := $D0FE + +CHAMELEON_ENABLE_REGS = $2A +CHAMELEON_DISABLE_REGS = $FF + +CHAMELEON_CFGTUR_LIMIT_1MHZ = %00001100 +CHAMELEON_CFGTUR_LIMIT_NONE = %10000000 + diff --git a/doc/c64.sgml b/doc/c64.sgml index c2c9551b4..c037b1e0e 100644 --- a/doc/c64.sgml +++ b/doc/c64.sgml @@ -177,12 +177,15 @@ url="funcref.html" name="function reference"> for declaration and usage. detect_c128 detect_c64dtv +detect_chameleon detect_scpu get_c128_speed get_c64dtv_speed +get_chameleon_speed get_scpu_speed set_c128_speed set_c64dtv_speed +set_chameleon_speed set_scpu_speed diff --git a/doc/funcref.sgml b/doc/funcref.sgml index 55701cf55..09ee27e4a 100644 --- a/doc/funcref.sgml +++ b/doc/funcref.sgml @@ -70,12 +70,15 @@ function. + + + @@ -2966,6 +2969,26 @@ used in presence of a prototype. +detect_chameleon + + + +/ + +The function is specific to the C64. + +, +, + + + + detect_scpu @@ -3569,6 +3592,28 @@ header files define constants that can be used to check the return code. +get_chameleon_speed + + + +/ + +The function is specific to the C64. +The function does not check for the presence of the C64 Chameleon cartridge. +See the accelerator.h header for the speed definitions. + +, +, + + + + get_scpu_speed @@ -6186,6 +6231,28 @@ clean-up when exitting the program. +set_chameleon_speed + + + +/ + +The function is specific to the C64. +The function does not check for the presence of the C64 Chameleon cartridge. +See the accelerator.h header for the speed definitions. + +, +, + + + + set_scpu_speed diff --git a/include/accelerator.h b/include/accelerator.h index 0fa202bc6..d29b73467 100644 --- a/include/accelerator.h +++ b/include/accelerator.h @@ -77,7 +77,7 @@ extern unsigned char __fastcall__ set_scpu_speed (unsigned char speed); * make sure you use 'detect_scpu();' before using. */ -extern unsigned char get_scpu_speed (void); +unsigned char get_scpu_speed (void); /* Get the speed of the SuperCPU cartridge. * @@ -89,7 +89,7 @@ extern unsigned char get_scpu_speed (void); * make sure you use 'detect_scpu();' before using. */ -extern unsigned char detect_scpu (void); +unsigned char detect_scpu (void); /* Check for the presence of the SuperCPU cartridge. * @@ -101,7 +101,7 @@ extern unsigned char detect_scpu (void); /* C64DTV */ -extern unsigned char __fastcall__ set_c64dtv_speed (unsigned char speed); +unsigned char __fastcall__ set_c64dtv_speed (unsigned char speed); /* Set the speed of the C64DTV, using SPEED_SLOW will switch to * slow mode, SPEED_2X or SPEED_FAST will switch to fast mode. @@ -115,7 +115,7 @@ extern unsigned char __fastcall__ set_c64dtv_speed (unsigned char speed); * make sure you use 'detect_c64dtv();' before using. */ -extern unsigned char get_c64dtv_speed (void); +unsigned char get_c64dtv_speed (void); /* Get the speed of the C64DTV. * @@ -127,7 +127,7 @@ extern unsigned char get_c64dtv_speed (void); * make sure you use 'detect_c64dtv();' before using. */ -extern unsigned char detect_c64dtv (void); +unsigned char detect_c64dtv (void); /* Check for the presence of the C64DTV. * @@ -139,7 +139,7 @@ extern unsigned char detect_c64dtv (void); /* C128 8502 CPU */ -extern unsigned char __fastcall__ set_c128_speed (unsigned char speed); +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. @@ -153,7 +153,7 @@ extern unsigned char __fastcall__ set_c128_speed (unsigned char speed); * you use 'detect_c128();' before using. */ -extern unsigned char get_c128_speed (void); +unsigned char get_c128_speed (void); /* Get the speed of the C128 8502 CPU. * @@ -165,7 +165,7 @@ extern unsigned char get_c128_speed (void); * you use 'detect_c128();' before using. */ -extern unsigned char detect_c128 (void); +unsigned char detect_c128 (void); /* Check if the C128 CPU is the current CPU. * @@ -174,6 +174,58 @@ extern unsigned char detect_c128 (void); * 0x01 : C128 CPU is the current CPU */ + +/* C64 Chameleon cartridge */ + +unsigned char __fastcall__ set_chameleon_speed (unsigned char speed); + +/* Set the speed of the C64 Chameleon cartridge, the following inputs + * are accepted: + * SPEED_SLOW : 1 Mhz mode + * SPEED_1X : 1 Mhz mode + * SPEED_2X : 2 Mhz mode + * SPEED_3X : 3 Mhz mode + * SPEED_4X : 4 Mhz mode + * SPEED_5X : 5 Mhz mode + * SPEED_6X : 6 Mhz mode + * SPEED_FAST : Maximum speed mode + * + * Note that any value higher or equal to SPEED_7X will switch to maximum + * speed 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 the C64 Chameleon cartridge, + * make sure you use 'detect_chameleon();' before using. + */ + +unsigned char get_chameleon_speed (void); + +;/* Get the speed of the C64 Chameleon cartridge. +; * +; * Possible return values: +; * SPEED_SLOW : Slow mode +; * SPEED_2X : 2Mhz mode +; * SPEED_3X : 3Mhz mode +; * SPEED_4X : 4Mhz mode +; * SPEED_5X : 5Mhz mode +; * SPEED_6X : 6Mhz mode +; * SPEED_FAST : Maximum speed mode +; * +; * This function does not check for the presence of the C64 Chameleon cartridge, +; * make sure you use 'detect_chameleon();' before using. +; */ + +unsigned char detect_chameleon (void); + +/* Check for the presence of the C64 Chameleon cartridge. + * + * Possible return values: + * 0x00 : C64 Chameleon cartridge not present + * 0x01 : C64 Chameleon cartridge present + */ + /* End of accelerator.h */ #endif diff --git a/libsrc/c128/acc_c128_speed.s b/libsrc/c128/acc_c128_speed.s index a104aad1a..7994a52ae 100644 --- a/libsrc/c128/acc_c128_speed.s +++ b/libsrc/c128/acc_c128_speed.s @@ -3,7 +3,7 @@ ; 2018-04-26, Greg King ; -; extern unsigned char __fastcall__ set_c128_speed (unsigned char speed); +; 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. @@ -19,7 +19,7 @@ ; * For C128 programs, no detect function call is needed. ; */ -; extern unsigned char get_c128_speed (void); +; unsigned char get_c128_speed (void); ; ;/* Get the speed of the C128 8502 CPU. ; * diff --git a/libsrc/c128/acc_scpu_speed.s b/libsrc/c128/acc_scpu_speed.s index 4bd142bbb..9f932aecd 100644 --- a/libsrc/c128/acc_scpu_speed.s +++ b/libsrc/c128/acc_scpu_speed.s @@ -2,7 +2,7 @@ ; Marco van den Heuvel, 2018-04-09 ; -; extern unsigned char __fastcall__ set_scpu_speed (unsigned char speed); +; unsigned char __fastcall__ set_scpu_speed (unsigned char speed); ; ;/* Set the speed of the SuperCPU cartridge, using SPEED_SLOW will switch to ; * 1 Mhz mode, SPEED_20X or SPEED_FAST will switch to 20 Mhz mode. @@ -19,7 +19,7 @@ ; * make sure you use 'detect_scpu();' before using. ; */ -; extern unsigned char get_scpu_speed (void); +; unsigned char get_scpu_speed (void); ; ;/* Get the speed of the SuperCPU cartridge. ; * diff --git a/libsrc/c64/acc_c64dtv_speed.s b/libsrc/c64/acc_c64dtv_speed.s index 6a8371a9c..d6cf8b994 100644 --- a/libsrc/c64/acc_c64dtv_speed.s +++ b/libsrc/c64/acc_c64dtv_speed.s @@ -2,7 +2,7 @@ ; Marco van den Heuvel, 2018-04-14 ; -; extern unsigned char __fastcall__ set_c64dtv_speed (unsigned char speed); +; unsigned char __fastcall__ set_c64dtv_speed (unsigned char speed); ; ;/* Set the speed of the C64DTV, using SPEED_SLOW will switch to ; * slow mode, SPEED_2X or SPEED_FAST will switch to fast mode. @@ -16,7 +16,7 @@ ; * make sure you use 'detect_c64dtv();' before using. ; */ -; extern unsigned char get_c64dtv_speed (void); +; unsigned char get_c64dtv_speed (void); ; ;/* Get the speed of the C64DTV. ; * diff --git a/libsrc/c64/acc_chameleon_speed.s b/libsrc/c64/acc_chameleon_speed.s new file mode 100755 index 000000000..ce51b9dde --- /dev/null +++ b/libsrc/c64/acc_chameleon_speed.s @@ -0,0 +1,100 @@ +; +; Marco van den Heuvel, 2018-04-25 +; + +; unsigned char __fastcall__ set_chameleon_speed (unsigned char speed); +; +;/* Set the speed of the Chameleon cartridge, the following inputs +; * are accepted: +; * SPEED_SLOW : 1 Mhz mode +; * SPEED_1X : 1 Mhz mode +; * SPEED_2X : 2 Mhz mode +; * SPEED_3X : 3 Mhz mode +; * SPEED_4X : 4 Mhz mode +; * SPEED_5X : 5 Mhz mode +; * SPEED_6X : 6 Mhz mode +; * SPEED_FAST : Maximum speed mode +; * +; * Note that any value higher or equal to SPEED_7X will switch to maximum +; * speed 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 the Chameleon cartridge, +; * make sure you use 'detect_chameleon();' before using. +; */ + +; unsigned char get_chameleon_speed (void); +; +;/* Get the speed of the Chameleon cartridge. +; * +; * Possible return values: +; * SPEED_SLOW : Slow mode +; * SPEED_2X : 2Mhz mode +; * SPEED_3X : 3Mhz mode +; * SPEED_4X : 4Mhz mode +; * SPEED_5X : 5Mhz mode +; * SPEED_6X : 6Mhz mode +; * SPEED_FAST : Maximum speed mode +; * +; * This function does not check for the presence of the Chameleon cartridge, +; * make sure you use 'detect_chameleon();' before using. +; */ + + .export _set_chameleon_speed + .export _get_chameleon_speed + + .include "accelerator.inc" + +_set_chameleon_speed: + cmp #SPEED_7X + bcs maximum_speed + cmp #SPEED_1X + beq low_speed + ora #$80 +set_speed: + jsr activate_regs + sta CHAMELEON_CFGTUR + jmp return_speed + +low_speed: + lda #CHAMELEON_CFGTUR_LIMIT_1MHZ + bne set_speed + +maximum_speed: + lda #CHAMELEON_CFGTUR_LIMIT_NONE + bne set_speed + +_get_chameleon_speed: + jsr activate_regs +return_speed: + ldx #$00 + lda CHAMELEON_CFGTUR + tay + and #%10000000 + beq return_value + tya + and #%00001000 + bne is_slow_mode + tya + and #%00000111 + beq is_max_mode +return_value: + ldy #CHAMELEON_DISABLE_REGS + sty CHAMELEON_CFGENA + rts + +is_slow_mode: + txa + bne return_value + +is_max_mode: + lda #SPEED_FAST + bne return_value + +activate_regs: + ldy #CHAMELEON_ENABLE_REGS + sty CHAMELEON_CFGENA + rts + diff --git a/libsrc/c64/acc_detect_chameleon.s b/libsrc/c64/acc_detect_chameleon.s new file mode 100755 index 000000000..a16a264e7 --- /dev/null +++ b/libsrc/c64/acc_detect_chameleon.s @@ -0,0 +1,39 @@ +; +; Marco van den Heuvel, 2018-04-25 +; + +; unsigned char detect_chameleon (void); +; +;/* Check for the presence of the Chameleon cartridge. +; * +; * Possible return values: +; * 0x00 : Chameleon cartridge not present +; * 0x01 : Chameleon cartridge present +; */ + + .export _detect_chameleon + + .include "accelerator.inc" + +_detect_chameleon: + lda #$00 + tax + +; Make sure the CPU is a 6510 + .byte $1A ; NOP on 6510, INA on 65(S)C(E)02, 4510 and 65816 + bne not_found + + ldy CHAMELEON_CFGENA + lda #CHAMELEON_ENABLE_REGS + sta CHAMELEON_CFGENA + lda CHAMELEON_CFGENA + sty CHAMELEON_CFGENA + cmp #$FF + beq not_found +found: + lda #$01 + .byte $24 +not_found: + txa + rts + diff --git a/libsrc/c64/acc_scpu_speed.s b/libsrc/c64/acc_scpu_speed.s index 4bd142bbb..9f932aecd 100644 --- a/libsrc/c64/acc_scpu_speed.s +++ b/libsrc/c64/acc_scpu_speed.s @@ -2,7 +2,7 @@ ; Marco van den Heuvel, 2018-04-09 ; -; extern unsigned char __fastcall__ set_scpu_speed (unsigned char speed); +; unsigned char __fastcall__ set_scpu_speed (unsigned char speed); ; ;/* Set the speed of the SuperCPU cartridge, using SPEED_SLOW will switch to ; * 1 Mhz mode, SPEED_20X or SPEED_FAST will switch to 20 Mhz mode. @@ -19,7 +19,7 @@ ; * make sure you use 'detect_scpu();' before using. ; */ -; extern unsigned char get_scpu_speed (void); +; unsigned char get_scpu_speed (void); ; ;/* Get the speed of the SuperCPU cartridge. ; * diff --git a/testcode/lib/accelerator/Makefile b/testcode/lib/accelerator/Makefile index 121ad57b8..e9bd61881 100644 --- a/testcode/lib/accelerator/Makefile +++ b/testcode/lib/accelerator/Makefile @@ -1,7 +1,7 @@ CL ?= cl65 all: c64-scpu-test.prg c128-scpu-test.prg c64dtv-test.prg \ - c64-c128-test.prg c128-test.prg + c64-c128-test.prg c128-test.prg chameleon-test.prg c64-scpu-test.prg: c64-c128-scpu-test.c $(CL) -t c64 c64-c128-scpu-test.c -o c64-scpu-test.prg @@ -17,3 +17,6 @@ c64-c128-test.prg: c64-c128-test.c c128-test.prg: c64-c128-test.c $(CL) -t c128 c64-c128-test.c -o c128-test.prg + +chameleon-test.prg: chameleon-test.c + $(CL) -t c64 chameleon-test.c -o chameleon-test.prg diff --git a/testcode/lib/accelerator/chameleon-test.c b/testcode/lib/accelerator/chameleon-test.c new file mode 100755 index 000000000..ffc1539b5 --- /dev/null +++ b/testcode/lib/accelerator/chameleon-test.c @@ -0,0 +1,8 @@ +/* C64 Chameleon accelerator test code. */ + +#define ACC_DETECT detect_chameleon +#define ACC_GET_SPEED get_chameleon_speed +#define ACC_SET_SPEED set_chameleon_speed +#define ACC_NAME "Chameleon cartridge" + +#include "turbo-test.c"
+ + + +/ + +The function is specific to the C64. + +, +, + + + + detect_scpu @@ -3569,6 +3592,28 @@ header files define constants that can be used to check the return code. +get_chameleon_speed + + + +/ + +The function is specific to the C64. +The function does not check for the presence of the C64 Chameleon cartridge. +See the accelerator.h header for the speed definitions. + +, +, + + + + get_scpu_speed @@ -6186,6 +6231,28 @@ clean-up when exitting the program. +set_chameleon_speed + + + +/ + +The function is specific to the C64. +The function does not check for the presence of the C64 Chameleon cartridge. +See the accelerator.h header for the speed definitions. + +, +, + + + + set_scpu_speed diff --git a/include/accelerator.h b/include/accelerator.h index 0fa202bc6..d29b73467 100644 --- a/include/accelerator.h +++ b/include/accelerator.h @@ -77,7 +77,7 @@ extern unsigned char __fastcall__ set_scpu_speed (unsigned char speed); * make sure you use 'detect_scpu();' before using. */ -extern unsigned char get_scpu_speed (void); +unsigned char get_scpu_speed (void); /* Get the speed of the SuperCPU cartridge. * @@ -89,7 +89,7 @@ extern unsigned char get_scpu_speed (void); * make sure you use 'detect_scpu();' before using. */ -extern unsigned char detect_scpu (void); +unsigned char detect_scpu (void); /* Check for the presence of the SuperCPU cartridge. * @@ -101,7 +101,7 @@ extern unsigned char detect_scpu (void); /* C64DTV */ -extern unsigned char __fastcall__ set_c64dtv_speed (unsigned char speed); +unsigned char __fastcall__ set_c64dtv_speed (unsigned char speed); /* Set the speed of the C64DTV, using SPEED_SLOW will switch to * slow mode, SPEED_2X or SPEED_FAST will switch to fast mode. @@ -115,7 +115,7 @@ extern unsigned char __fastcall__ set_c64dtv_speed (unsigned char speed); * make sure you use 'detect_c64dtv();' before using. */ -extern unsigned char get_c64dtv_speed (void); +unsigned char get_c64dtv_speed (void); /* Get the speed of the C64DTV. * @@ -127,7 +127,7 @@ extern unsigned char get_c64dtv_speed (void); * make sure you use 'detect_c64dtv();' before using. */ -extern unsigned char detect_c64dtv (void); +unsigned char detect_c64dtv (void); /* Check for the presence of the C64DTV. * @@ -139,7 +139,7 @@ extern unsigned char detect_c64dtv (void); /* C128 8502 CPU */ -extern unsigned char __fastcall__ set_c128_speed (unsigned char speed); +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. @@ -153,7 +153,7 @@ extern unsigned char __fastcall__ set_c128_speed (unsigned char speed); * you use 'detect_c128();' before using. */ -extern unsigned char get_c128_speed (void); +unsigned char get_c128_speed (void); /* Get the speed of the C128 8502 CPU. * @@ -165,7 +165,7 @@ extern unsigned char get_c128_speed (void); * you use 'detect_c128();' before using. */ -extern unsigned char detect_c128 (void); +unsigned char detect_c128 (void); /* Check if the C128 CPU is the current CPU. * @@ -174,6 +174,58 @@ extern unsigned char detect_c128 (void); * 0x01 : C128 CPU is the current CPU */ + +/* C64 Chameleon cartridge */ + +unsigned char __fastcall__ set_chameleon_speed (unsigned char speed); + +/* Set the speed of the C64 Chameleon cartridge, the following inputs + * are accepted: + * SPEED_SLOW : 1 Mhz mode + * SPEED_1X : 1 Mhz mode + * SPEED_2X : 2 Mhz mode + * SPEED_3X : 3 Mhz mode + * SPEED_4X : 4 Mhz mode + * SPEED_5X : 5 Mhz mode + * SPEED_6X : 6 Mhz mode + * SPEED_FAST : Maximum speed mode + * + * Note that any value higher or equal to SPEED_7X will switch to maximum + * speed 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 the C64 Chameleon cartridge, + * make sure you use 'detect_chameleon();' before using. + */ + +unsigned char get_chameleon_speed (void); + +;/* Get the speed of the C64 Chameleon cartridge. +; * +; * Possible return values: +; * SPEED_SLOW : Slow mode +; * SPEED_2X : 2Mhz mode +; * SPEED_3X : 3Mhz mode +; * SPEED_4X : 4Mhz mode +; * SPEED_5X : 5Mhz mode +; * SPEED_6X : 6Mhz mode +; * SPEED_FAST : Maximum speed mode +; * +; * This function does not check for the presence of the C64 Chameleon cartridge, +; * make sure you use 'detect_chameleon();' before using. +; */ + +unsigned char detect_chameleon (void); + +/* Check for the presence of the C64 Chameleon cartridge. + * + * Possible return values: + * 0x00 : C64 Chameleon cartridge not present + * 0x01 : C64 Chameleon cartridge present + */ + /* End of accelerator.h */ #endif diff --git a/libsrc/c128/acc_c128_speed.s b/libsrc/c128/acc_c128_speed.s index a104aad1a..7994a52ae 100644 --- a/libsrc/c128/acc_c128_speed.s +++ b/libsrc/c128/acc_c128_speed.s @@ -3,7 +3,7 @@ ; 2018-04-26, Greg King ; -; extern unsigned char __fastcall__ set_c128_speed (unsigned char speed); +; 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. @@ -19,7 +19,7 @@ ; * For C128 programs, no detect function call is needed. ; */ -; extern unsigned char get_c128_speed (void); +; unsigned char get_c128_speed (void); ; ;/* Get the speed of the C128 8502 CPU. ; * diff --git a/libsrc/c128/acc_scpu_speed.s b/libsrc/c128/acc_scpu_speed.s index 4bd142bbb..9f932aecd 100644 --- a/libsrc/c128/acc_scpu_speed.s +++ b/libsrc/c128/acc_scpu_speed.s @@ -2,7 +2,7 @@ ; Marco van den Heuvel, 2018-04-09 ; -; extern unsigned char __fastcall__ set_scpu_speed (unsigned char speed); +; unsigned char __fastcall__ set_scpu_speed (unsigned char speed); ; ;/* Set the speed of the SuperCPU cartridge, using SPEED_SLOW will switch to ; * 1 Mhz mode, SPEED_20X or SPEED_FAST will switch to 20 Mhz mode. @@ -19,7 +19,7 @@ ; * make sure you use 'detect_scpu();' before using. ; */ -; extern unsigned char get_scpu_speed (void); +; unsigned char get_scpu_speed (void); ; ;/* Get the speed of the SuperCPU cartridge. ; * diff --git a/libsrc/c64/acc_c64dtv_speed.s b/libsrc/c64/acc_c64dtv_speed.s index 6a8371a9c..d6cf8b994 100644 --- a/libsrc/c64/acc_c64dtv_speed.s +++ b/libsrc/c64/acc_c64dtv_speed.s @@ -2,7 +2,7 @@ ; Marco van den Heuvel, 2018-04-14 ; -; extern unsigned char __fastcall__ set_c64dtv_speed (unsigned char speed); +; unsigned char __fastcall__ set_c64dtv_speed (unsigned char speed); ; ;/* Set the speed of the C64DTV, using SPEED_SLOW will switch to ; * slow mode, SPEED_2X or SPEED_FAST will switch to fast mode. @@ -16,7 +16,7 @@ ; * make sure you use 'detect_c64dtv();' before using. ; */ -; extern unsigned char get_c64dtv_speed (void); +; unsigned char get_c64dtv_speed (void); ; ;/* Get the speed of the C64DTV. ; * diff --git a/libsrc/c64/acc_chameleon_speed.s b/libsrc/c64/acc_chameleon_speed.s new file mode 100755 index 000000000..ce51b9dde --- /dev/null +++ b/libsrc/c64/acc_chameleon_speed.s @@ -0,0 +1,100 @@ +; +; Marco van den Heuvel, 2018-04-25 +; + +; unsigned char __fastcall__ set_chameleon_speed (unsigned char speed); +; +;/* Set the speed of the Chameleon cartridge, the following inputs +; * are accepted: +; * SPEED_SLOW : 1 Mhz mode +; * SPEED_1X : 1 Mhz mode +; * SPEED_2X : 2 Mhz mode +; * SPEED_3X : 3 Mhz mode +; * SPEED_4X : 4 Mhz mode +; * SPEED_5X : 5 Mhz mode +; * SPEED_6X : 6 Mhz mode +; * SPEED_FAST : Maximum speed mode +; * +; * Note that any value higher or equal to SPEED_7X will switch to maximum +; * speed 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 the Chameleon cartridge, +; * make sure you use 'detect_chameleon();' before using. +; */ + +; unsigned char get_chameleon_speed (void); +; +;/* Get the speed of the Chameleon cartridge. +; * +; * Possible return values: +; * SPEED_SLOW : Slow mode +; * SPEED_2X : 2Mhz mode +; * SPEED_3X : 3Mhz mode +; * SPEED_4X : 4Mhz mode +; * SPEED_5X : 5Mhz mode +; * SPEED_6X : 6Mhz mode +; * SPEED_FAST : Maximum speed mode +; * +; * This function does not check for the presence of the Chameleon cartridge, +; * make sure you use 'detect_chameleon();' before using. +; */ + + .export _set_chameleon_speed + .export _get_chameleon_speed + + .include "accelerator.inc" + +_set_chameleon_speed: + cmp #SPEED_7X + bcs maximum_speed + cmp #SPEED_1X + beq low_speed + ora #$80 +set_speed: + jsr activate_regs + sta CHAMELEON_CFGTUR + jmp return_speed + +low_speed: + lda #CHAMELEON_CFGTUR_LIMIT_1MHZ + bne set_speed + +maximum_speed: + lda #CHAMELEON_CFGTUR_LIMIT_NONE + bne set_speed + +_get_chameleon_speed: + jsr activate_regs +return_speed: + ldx #$00 + lda CHAMELEON_CFGTUR + tay + and #%10000000 + beq return_value + tya + and #%00001000 + bne is_slow_mode + tya + and #%00000111 + beq is_max_mode +return_value: + ldy #CHAMELEON_DISABLE_REGS + sty CHAMELEON_CFGENA + rts + +is_slow_mode: + txa + bne return_value + +is_max_mode: + lda #SPEED_FAST + bne return_value + +activate_regs: + ldy #CHAMELEON_ENABLE_REGS + sty CHAMELEON_CFGENA + rts + diff --git a/libsrc/c64/acc_detect_chameleon.s b/libsrc/c64/acc_detect_chameleon.s new file mode 100755 index 000000000..a16a264e7 --- /dev/null +++ b/libsrc/c64/acc_detect_chameleon.s @@ -0,0 +1,39 @@ +; +; Marco van den Heuvel, 2018-04-25 +; + +; unsigned char detect_chameleon (void); +; +;/* Check for the presence of the Chameleon cartridge. +; * +; * Possible return values: +; * 0x00 : Chameleon cartridge not present +; * 0x01 : Chameleon cartridge present +; */ + + .export _detect_chameleon + + .include "accelerator.inc" + +_detect_chameleon: + lda #$00 + tax + +; Make sure the CPU is a 6510 + .byte $1A ; NOP on 6510, INA on 65(S)C(E)02, 4510 and 65816 + bne not_found + + ldy CHAMELEON_CFGENA + lda #CHAMELEON_ENABLE_REGS + sta CHAMELEON_CFGENA + lda CHAMELEON_CFGENA + sty CHAMELEON_CFGENA + cmp #$FF + beq not_found +found: + lda #$01 + .byte $24 +not_found: + txa + rts + diff --git a/libsrc/c64/acc_scpu_speed.s b/libsrc/c64/acc_scpu_speed.s index 4bd142bbb..9f932aecd 100644 --- a/libsrc/c64/acc_scpu_speed.s +++ b/libsrc/c64/acc_scpu_speed.s @@ -2,7 +2,7 @@ ; Marco van den Heuvel, 2018-04-09 ; -; extern unsigned char __fastcall__ set_scpu_speed (unsigned char speed); +; unsigned char __fastcall__ set_scpu_speed (unsigned char speed); ; ;/* Set the speed of the SuperCPU cartridge, using SPEED_SLOW will switch to ; * 1 Mhz mode, SPEED_20X or SPEED_FAST will switch to 20 Mhz mode. @@ -19,7 +19,7 @@ ; * make sure you use 'detect_scpu();' before using. ; */ -; extern unsigned char get_scpu_speed (void); +; unsigned char get_scpu_speed (void); ; ;/* Get the speed of the SuperCPU cartridge. ; * diff --git a/testcode/lib/accelerator/Makefile b/testcode/lib/accelerator/Makefile index 121ad57b8..e9bd61881 100644 --- a/testcode/lib/accelerator/Makefile +++ b/testcode/lib/accelerator/Makefile @@ -1,7 +1,7 @@ CL ?= cl65 all: c64-scpu-test.prg c128-scpu-test.prg c64dtv-test.prg \ - c64-c128-test.prg c128-test.prg + c64-c128-test.prg c128-test.prg chameleon-test.prg c64-scpu-test.prg: c64-c128-scpu-test.c $(CL) -t c64 c64-c128-scpu-test.c -o c64-scpu-test.prg @@ -17,3 +17,6 @@ c64-c128-test.prg: c64-c128-test.c c128-test.prg: c64-c128-test.c $(CL) -t c128 c64-c128-test.c -o c128-test.prg + +chameleon-test.prg: chameleon-test.c + $(CL) -t c64 chameleon-test.c -o chameleon-test.prg diff --git a/testcode/lib/accelerator/chameleon-test.c b/testcode/lib/accelerator/chameleon-test.c new file mode 100755 index 000000000..ffc1539b5 --- /dev/null +++ b/testcode/lib/accelerator/chameleon-test.c @@ -0,0 +1,8 @@ +/* C64 Chameleon accelerator test code. */ + +#define ACC_DETECT detect_chameleon +#define ACC_GET_SPEED get_chameleon_speed +#define ACC_SET_SPEED set_chameleon_speed +#define ACC_NAME "Chameleon cartridge" + +#include "turbo-test.c"
+ +/ + +The function is specific to the C64. + +, +, + +
@@ -3569,6 +3592,28 @@ header files define constants that can be used to check the return code. +get_chameleon_speed + + + +/ + +The function is specific to the C64. +The function does not check for the presence of the C64 Chameleon cartridge. +See the accelerator.h header for the speed definitions. + +, +, + + + + get_scpu_speed @@ -6186,6 +6231,28 @@ clean-up when exitting the program. +set_chameleon_speed + + + +/ + +The function is specific to the C64. +The function does not check for the presence of the C64 Chameleon cartridge. +See the accelerator.h header for the speed definitions. + +, +, + + + + set_scpu_speed diff --git a/include/accelerator.h b/include/accelerator.h index 0fa202bc6..d29b73467 100644 --- a/include/accelerator.h +++ b/include/accelerator.h @@ -77,7 +77,7 @@ extern unsigned char __fastcall__ set_scpu_speed (unsigned char speed); * make sure you use 'detect_scpu();' before using. */ -extern unsigned char get_scpu_speed (void); +unsigned char get_scpu_speed (void); /* Get the speed of the SuperCPU cartridge. * @@ -89,7 +89,7 @@ extern unsigned char get_scpu_speed (void); * make sure you use 'detect_scpu();' before using. */ -extern unsigned char detect_scpu (void); +unsigned char detect_scpu (void); /* Check for the presence of the SuperCPU cartridge. * @@ -101,7 +101,7 @@ extern unsigned char detect_scpu (void); /* C64DTV */ -extern unsigned char __fastcall__ set_c64dtv_speed (unsigned char speed); +unsigned char __fastcall__ set_c64dtv_speed (unsigned char speed); /* Set the speed of the C64DTV, using SPEED_SLOW will switch to * slow mode, SPEED_2X or SPEED_FAST will switch to fast mode. @@ -115,7 +115,7 @@ extern unsigned char __fastcall__ set_c64dtv_speed (unsigned char speed); * make sure you use 'detect_c64dtv();' before using. */ -extern unsigned char get_c64dtv_speed (void); +unsigned char get_c64dtv_speed (void); /* Get the speed of the C64DTV. * @@ -127,7 +127,7 @@ extern unsigned char get_c64dtv_speed (void); * make sure you use 'detect_c64dtv();' before using. */ -extern unsigned char detect_c64dtv (void); +unsigned char detect_c64dtv (void); /* Check for the presence of the C64DTV. * @@ -139,7 +139,7 @@ extern unsigned char detect_c64dtv (void); /* C128 8502 CPU */ -extern unsigned char __fastcall__ set_c128_speed (unsigned char speed); +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. @@ -153,7 +153,7 @@ extern unsigned char __fastcall__ set_c128_speed (unsigned char speed); * you use 'detect_c128();' before using. */ -extern unsigned char get_c128_speed (void); +unsigned char get_c128_speed (void); /* Get the speed of the C128 8502 CPU. * @@ -165,7 +165,7 @@ extern unsigned char get_c128_speed (void); * you use 'detect_c128();' before using. */ -extern unsigned char detect_c128 (void); +unsigned char detect_c128 (void); /* Check if the C128 CPU is the current CPU. * @@ -174,6 +174,58 @@ extern unsigned char detect_c128 (void); * 0x01 : C128 CPU is the current CPU */ + +/* C64 Chameleon cartridge */ + +unsigned char __fastcall__ set_chameleon_speed (unsigned char speed); + +/* Set the speed of the C64 Chameleon cartridge, the following inputs + * are accepted: + * SPEED_SLOW : 1 Mhz mode + * SPEED_1X : 1 Mhz mode + * SPEED_2X : 2 Mhz mode + * SPEED_3X : 3 Mhz mode + * SPEED_4X : 4 Mhz mode + * SPEED_5X : 5 Mhz mode + * SPEED_6X : 6 Mhz mode + * SPEED_FAST : Maximum speed mode + * + * Note that any value higher or equal to SPEED_7X will switch to maximum + * speed 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 the C64 Chameleon cartridge, + * make sure you use 'detect_chameleon();' before using. + */ + +unsigned char get_chameleon_speed (void); + +;/* Get the speed of the C64 Chameleon cartridge. +; * +; * Possible return values: +; * SPEED_SLOW : Slow mode +; * SPEED_2X : 2Mhz mode +; * SPEED_3X : 3Mhz mode +; * SPEED_4X : 4Mhz mode +; * SPEED_5X : 5Mhz mode +; * SPEED_6X : 6Mhz mode +; * SPEED_FAST : Maximum speed mode +; * +; * This function does not check for the presence of the C64 Chameleon cartridge, +; * make sure you use 'detect_chameleon();' before using. +; */ + +unsigned char detect_chameleon (void); + +/* Check for the presence of the C64 Chameleon cartridge. + * + * Possible return values: + * 0x00 : C64 Chameleon cartridge not present + * 0x01 : C64 Chameleon cartridge present + */ + /* End of accelerator.h */ #endif diff --git a/libsrc/c128/acc_c128_speed.s b/libsrc/c128/acc_c128_speed.s index a104aad1a..7994a52ae 100644 --- a/libsrc/c128/acc_c128_speed.s +++ b/libsrc/c128/acc_c128_speed.s @@ -3,7 +3,7 @@ ; 2018-04-26, Greg King ; -; extern unsigned char __fastcall__ set_c128_speed (unsigned char speed); +; 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. @@ -19,7 +19,7 @@ ; * For C128 programs, no detect function call is needed. ; */ -; extern unsigned char get_c128_speed (void); +; unsigned char get_c128_speed (void); ; ;/* Get the speed of the C128 8502 CPU. ; * diff --git a/libsrc/c128/acc_scpu_speed.s b/libsrc/c128/acc_scpu_speed.s index 4bd142bbb..9f932aecd 100644 --- a/libsrc/c128/acc_scpu_speed.s +++ b/libsrc/c128/acc_scpu_speed.s @@ -2,7 +2,7 @@ ; Marco van den Heuvel, 2018-04-09 ; -; extern unsigned char __fastcall__ set_scpu_speed (unsigned char speed); +; unsigned char __fastcall__ set_scpu_speed (unsigned char speed); ; ;/* Set the speed of the SuperCPU cartridge, using SPEED_SLOW will switch to ; * 1 Mhz mode, SPEED_20X or SPEED_FAST will switch to 20 Mhz mode. @@ -19,7 +19,7 @@ ; * make sure you use 'detect_scpu();' before using. ; */ -; extern unsigned char get_scpu_speed (void); +; unsigned char get_scpu_speed (void); ; ;/* Get the speed of the SuperCPU cartridge. ; * diff --git a/libsrc/c64/acc_c64dtv_speed.s b/libsrc/c64/acc_c64dtv_speed.s index 6a8371a9c..d6cf8b994 100644 --- a/libsrc/c64/acc_c64dtv_speed.s +++ b/libsrc/c64/acc_c64dtv_speed.s @@ -2,7 +2,7 @@ ; Marco van den Heuvel, 2018-04-14 ; -; extern unsigned char __fastcall__ set_c64dtv_speed (unsigned char speed); +; unsigned char __fastcall__ set_c64dtv_speed (unsigned char speed); ; ;/* Set the speed of the C64DTV, using SPEED_SLOW will switch to ; * slow mode, SPEED_2X or SPEED_FAST will switch to fast mode. @@ -16,7 +16,7 @@ ; * make sure you use 'detect_c64dtv();' before using. ; */ -; extern unsigned char get_c64dtv_speed (void); +; unsigned char get_c64dtv_speed (void); ; ;/* Get the speed of the C64DTV. ; * diff --git a/libsrc/c64/acc_chameleon_speed.s b/libsrc/c64/acc_chameleon_speed.s new file mode 100755 index 000000000..ce51b9dde --- /dev/null +++ b/libsrc/c64/acc_chameleon_speed.s @@ -0,0 +1,100 @@ +; +; Marco van den Heuvel, 2018-04-25 +; + +; unsigned char __fastcall__ set_chameleon_speed (unsigned char speed); +; +;/* Set the speed of the Chameleon cartridge, the following inputs +; * are accepted: +; * SPEED_SLOW : 1 Mhz mode +; * SPEED_1X : 1 Mhz mode +; * SPEED_2X : 2 Mhz mode +; * SPEED_3X : 3 Mhz mode +; * SPEED_4X : 4 Mhz mode +; * SPEED_5X : 5 Mhz mode +; * SPEED_6X : 6 Mhz mode +; * SPEED_FAST : Maximum speed mode +; * +; * Note that any value higher or equal to SPEED_7X will switch to maximum +; * speed 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 the Chameleon cartridge, +; * make sure you use 'detect_chameleon();' before using. +; */ + +; unsigned char get_chameleon_speed (void); +; +;/* Get the speed of the Chameleon cartridge. +; * +; * Possible return values: +; * SPEED_SLOW : Slow mode +; * SPEED_2X : 2Mhz mode +; * SPEED_3X : 3Mhz mode +; * SPEED_4X : 4Mhz mode +; * SPEED_5X : 5Mhz mode +; * SPEED_6X : 6Mhz mode +; * SPEED_FAST : Maximum speed mode +; * +; * This function does not check for the presence of the Chameleon cartridge, +; * make sure you use 'detect_chameleon();' before using. +; */ + + .export _set_chameleon_speed + .export _get_chameleon_speed + + .include "accelerator.inc" + +_set_chameleon_speed: + cmp #SPEED_7X + bcs maximum_speed + cmp #SPEED_1X + beq low_speed + ora #$80 +set_speed: + jsr activate_regs + sta CHAMELEON_CFGTUR + jmp return_speed + +low_speed: + lda #CHAMELEON_CFGTUR_LIMIT_1MHZ + bne set_speed + +maximum_speed: + lda #CHAMELEON_CFGTUR_LIMIT_NONE + bne set_speed + +_get_chameleon_speed: + jsr activate_regs +return_speed: + ldx #$00 + lda CHAMELEON_CFGTUR + tay + and #%10000000 + beq return_value + tya + and #%00001000 + bne is_slow_mode + tya + and #%00000111 + beq is_max_mode +return_value: + ldy #CHAMELEON_DISABLE_REGS + sty CHAMELEON_CFGENA + rts + +is_slow_mode: + txa + bne return_value + +is_max_mode: + lda #SPEED_FAST + bne return_value + +activate_regs: + ldy #CHAMELEON_ENABLE_REGS + sty CHAMELEON_CFGENA + rts + diff --git a/libsrc/c64/acc_detect_chameleon.s b/libsrc/c64/acc_detect_chameleon.s new file mode 100755 index 000000000..a16a264e7 --- /dev/null +++ b/libsrc/c64/acc_detect_chameleon.s @@ -0,0 +1,39 @@ +; +; Marco van den Heuvel, 2018-04-25 +; + +; unsigned char detect_chameleon (void); +; +;/* Check for the presence of the Chameleon cartridge. +; * +; * Possible return values: +; * 0x00 : Chameleon cartridge not present +; * 0x01 : Chameleon cartridge present +; */ + + .export _detect_chameleon + + .include "accelerator.inc" + +_detect_chameleon: + lda #$00 + tax + +; Make sure the CPU is a 6510 + .byte $1A ; NOP on 6510, INA on 65(S)C(E)02, 4510 and 65816 + bne not_found + + ldy CHAMELEON_CFGENA + lda #CHAMELEON_ENABLE_REGS + sta CHAMELEON_CFGENA + lda CHAMELEON_CFGENA + sty CHAMELEON_CFGENA + cmp #$FF + beq not_found +found: + lda #$01 + .byte $24 +not_found: + txa + rts + diff --git a/libsrc/c64/acc_scpu_speed.s b/libsrc/c64/acc_scpu_speed.s index 4bd142bbb..9f932aecd 100644 --- a/libsrc/c64/acc_scpu_speed.s +++ b/libsrc/c64/acc_scpu_speed.s @@ -2,7 +2,7 @@ ; Marco van den Heuvel, 2018-04-09 ; -; extern unsigned char __fastcall__ set_scpu_speed (unsigned char speed); +; unsigned char __fastcall__ set_scpu_speed (unsigned char speed); ; ;/* Set the speed of the SuperCPU cartridge, using SPEED_SLOW will switch to ; * 1 Mhz mode, SPEED_20X or SPEED_FAST will switch to 20 Mhz mode. @@ -19,7 +19,7 @@ ; * make sure you use 'detect_scpu();' before using. ; */ -; extern unsigned char get_scpu_speed (void); +; unsigned char get_scpu_speed (void); ; ;/* Get the speed of the SuperCPU cartridge. ; * diff --git a/testcode/lib/accelerator/Makefile b/testcode/lib/accelerator/Makefile index 121ad57b8..e9bd61881 100644 --- a/testcode/lib/accelerator/Makefile +++ b/testcode/lib/accelerator/Makefile @@ -1,7 +1,7 @@ CL ?= cl65 all: c64-scpu-test.prg c128-scpu-test.prg c64dtv-test.prg \ - c64-c128-test.prg c128-test.prg + c64-c128-test.prg c128-test.prg chameleon-test.prg c64-scpu-test.prg: c64-c128-scpu-test.c $(CL) -t c64 c64-c128-scpu-test.c -o c64-scpu-test.prg @@ -17,3 +17,6 @@ c64-c128-test.prg: c64-c128-test.c c128-test.prg: c64-c128-test.c $(CL) -t c128 c64-c128-test.c -o c128-test.prg + +chameleon-test.prg: chameleon-test.c + $(CL) -t c64 chameleon-test.c -o chameleon-test.prg diff --git a/testcode/lib/accelerator/chameleon-test.c b/testcode/lib/accelerator/chameleon-test.c new file mode 100755 index 000000000..ffc1539b5 --- /dev/null +++ b/testcode/lib/accelerator/chameleon-test.c @@ -0,0 +1,8 @@ +/* C64 Chameleon accelerator test code. */ + +#define ACC_DETECT detect_chameleon +#define ACC_GET_SPEED get_chameleon_speed +#define ACC_SET_SPEED set_chameleon_speed +#define ACC_NAME "Chameleon cartridge" + +#include "turbo-test.c"
@@ -3569,6 +3592,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 the C64 Chameleon cartridge. +See the accelerator.h header for the speed definitions. + +, +, + + + + get_scpu_speed @@ -6186,6 +6231,28 @@ clean-up when exitting the program. +set_chameleon_speed + + + +/ + +The function is specific to the C64. +The function does not check for the presence of the C64 Chameleon cartridge. +See the accelerator.h header for the speed definitions. + +, +, + + + + set_scpu_speed diff --git a/include/accelerator.h b/include/accelerator.h index 0fa202bc6..d29b73467 100644 --- a/include/accelerator.h +++ b/include/accelerator.h @@ -77,7 +77,7 @@ extern unsigned char __fastcall__ set_scpu_speed (unsigned char speed); * make sure you use 'detect_scpu();' before using. */ -extern unsigned char get_scpu_speed (void); +unsigned char get_scpu_speed (void); /* Get the speed of the SuperCPU cartridge. * @@ -89,7 +89,7 @@ extern unsigned char get_scpu_speed (void); * make sure you use 'detect_scpu();' before using. */ -extern unsigned char detect_scpu (void); +unsigned char detect_scpu (void); /* Check for the presence of the SuperCPU cartridge. * @@ -101,7 +101,7 @@ extern unsigned char detect_scpu (void); /* C64DTV */ -extern unsigned char __fastcall__ set_c64dtv_speed (unsigned char speed); +unsigned char __fastcall__ set_c64dtv_speed (unsigned char speed); /* Set the speed of the C64DTV, using SPEED_SLOW will switch to * slow mode, SPEED_2X or SPEED_FAST will switch to fast mode. @@ -115,7 +115,7 @@ extern unsigned char __fastcall__ set_c64dtv_speed (unsigned char speed); * make sure you use 'detect_c64dtv();' before using. */ -extern unsigned char get_c64dtv_speed (void); +unsigned char get_c64dtv_speed (void); /* Get the speed of the C64DTV. * @@ -127,7 +127,7 @@ extern unsigned char get_c64dtv_speed (void); * make sure you use 'detect_c64dtv();' before using. */ -extern unsigned char detect_c64dtv (void); +unsigned char detect_c64dtv (void); /* Check for the presence of the C64DTV. * @@ -139,7 +139,7 @@ extern unsigned char detect_c64dtv (void); /* C128 8502 CPU */ -extern unsigned char __fastcall__ set_c128_speed (unsigned char speed); +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. @@ -153,7 +153,7 @@ extern unsigned char __fastcall__ set_c128_speed (unsigned char speed); * you use 'detect_c128();' before using. */ -extern unsigned char get_c128_speed (void); +unsigned char get_c128_speed (void); /* Get the speed of the C128 8502 CPU. * @@ -165,7 +165,7 @@ extern unsigned char get_c128_speed (void); * you use 'detect_c128();' before using. */ -extern unsigned char detect_c128 (void); +unsigned char detect_c128 (void); /* Check if the C128 CPU is the current CPU. * @@ -174,6 +174,58 @@ extern unsigned char detect_c128 (void); * 0x01 : C128 CPU is the current CPU */ + +/* C64 Chameleon cartridge */ + +unsigned char __fastcall__ set_chameleon_speed (unsigned char speed); + +/* Set the speed of the C64 Chameleon cartridge, the following inputs + * are accepted: + * SPEED_SLOW : 1 Mhz mode + * SPEED_1X : 1 Mhz mode + * SPEED_2X : 2 Mhz mode + * SPEED_3X : 3 Mhz mode + * SPEED_4X : 4 Mhz mode + * SPEED_5X : 5 Mhz mode + * SPEED_6X : 6 Mhz mode + * SPEED_FAST : Maximum speed mode + * + * Note that any value higher or equal to SPEED_7X will switch to maximum + * speed 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 the C64 Chameleon cartridge, + * make sure you use 'detect_chameleon();' before using. + */ + +unsigned char get_chameleon_speed (void); + +;/* Get the speed of the C64 Chameleon cartridge. +; * +; * Possible return values: +; * SPEED_SLOW : Slow mode +; * SPEED_2X : 2Mhz mode +; * SPEED_3X : 3Mhz mode +; * SPEED_4X : 4Mhz mode +; * SPEED_5X : 5Mhz mode +; * SPEED_6X : 6Mhz mode +; * SPEED_FAST : Maximum speed mode +; * +; * This function does not check for the presence of the C64 Chameleon cartridge, +; * make sure you use 'detect_chameleon();' before using. +; */ + +unsigned char detect_chameleon (void); + +/* Check for the presence of the C64 Chameleon cartridge. + * + * Possible return values: + * 0x00 : C64 Chameleon cartridge not present + * 0x01 : C64 Chameleon cartridge present + */ + /* End of accelerator.h */ #endif diff --git a/libsrc/c128/acc_c128_speed.s b/libsrc/c128/acc_c128_speed.s index a104aad1a..7994a52ae 100644 --- a/libsrc/c128/acc_c128_speed.s +++ b/libsrc/c128/acc_c128_speed.s @@ -3,7 +3,7 @@ ; 2018-04-26, Greg King ; -; extern unsigned char __fastcall__ set_c128_speed (unsigned char speed); +; 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. @@ -19,7 +19,7 @@ ; * For C128 programs, no detect function call is needed. ; */ -; extern unsigned char get_c128_speed (void); +; unsigned char get_c128_speed (void); ; ;/* Get the speed of the C128 8502 CPU. ; * diff --git a/libsrc/c128/acc_scpu_speed.s b/libsrc/c128/acc_scpu_speed.s index 4bd142bbb..9f932aecd 100644 --- a/libsrc/c128/acc_scpu_speed.s +++ b/libsrc/c128/acc_scpu_speed.s @@ -2,7 +2,7 @@ ; Marco van den Heuvel, 2018-04-09 ; -; extern unsigned char __fastcall__ set_scpu_speed (unsigned char speed); +; unsigned char __fastcall__ set_scpu_speed (unsigned char speed); ; ;/* Set the speed of the SuperCPU cartridge, using SPEED_SLOW will switch to ; * 1 Mhz mode, SPEED_20X or SPEED_FAST will switch to 20 Mhz mode. @@ -19,7 +19,7 @@ ; * make sure you use 'detect_scpu();' before using. ; */ -; extern unsigned char get_scpu_speed (void); +; unsigned char get_scpu_speed (void); ; ;/* Get the speed of the SuperCPU cartridge. ; * diff --git a/libsrc/c64/acc_c64dtv_speed.s b/libsrc/c64/acc_c64dtv_speed.s index 6a8371a9c..d6cf8b994 100644 --- a/libsrc/c64/acc_c64dtv_speed.s +++ b/libsrc/c64/acc_c64dtv_speed.s @@ -2,7 +2,7 @@ ; Marco van den Heuvel, 2018-04-14 ; -; extern unsigned char __fastcall__ set_c64dtv_speed (unsigned char speed); +; unsigned char __fastcall__ set_c64dtv_speed (unsigned char speed); ; ;/* Set the speed of the C64DTV, using SPEED_SLOW will switch to ; * slow mode, SPEED_2X or SPEED_FAST will switch to fast mode. @@ -16,7 +16,7 @@ ; * make sure you use 'detect_c64dtv();' before using. ; */ -; extern unsigned char get_c64dtv_speed (void); +; unsigned char get_c64dtv_speed (void); ; ;/* Get the speed of the C64DTV. ; * diff --git a/libsrc/c64/acc_chameleon_speed.s b/libsrc/c64/acc_chameleon_speed.s new file mode 100755 index 000000000..ce51b9dde --- /dev/null +++ b/libsrc/c64/acc_chameleon_speed.s @@ -0,0 +1,100 @@ +; +; Marco van den Heuvel, 2018-04-25 +; + +; unsigned char __fastcall__ set_chameleon_speed (unsigned char speed); +; +;/* Set the speed of the Chameleon cartridge, the following inputs +; * are accepted: +; * SPEED_SLOW : 1 Mhz mode +; * SPEED_1X : 1 Mhz mode +; * SPEED_2X : 2 Mhz mode +; * SPEED_3X : 3 Mhz mode +; * SPEED_4X : 4 Mhz mode +; * SPEED_5X : 5 Mhz mode +; * SPEED_6X : 6 Mhz mode +; * SPEED_FAST : Maximum speed mode +; * +; * Note that any value higher or equal to SPEED_7X will switch to maximum +; * speed 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 the Chameleon cartridge, +; * make sure you use 'detect_chameleon();' before using. +; */ + +; unsigned char get_chameleon_speed (void); +; +;/* Get the speed of the Chameleon cartridge. +; * +; * Possible return values: +; * SPEED_SLOW : Slow mode +; * SPEED_2X : 2Mhz mode +; * SPEED_3X : 3Mhz mode +; * SPEED_4X : 4Mhz mode +; * SPEED_5X : 5Mhz mode +; * SPEED_6X : 6Mhz mode +; * SPEED_FAST : Maximum speed mode +; * +; * This function does not check for the presence of the Chameleon cartridge, +; * make sure you use 'detect_chameleon();' before using. +; */ + + .export _set_chameleon_speed + .export _get_chameleon_speed + + .include "accelerator.inc" + +_set_chameleon_speed: + cmp #SPEED_7X + bcs maximum_speed + cmp #SPEED_1X + beq low_speed + ora #$80 +set_speed: + jsr activate_regs + sta CHAMELEON_CFGTUR + jmp return_speed + +low_speed: + lda #CHAMELEON_CFGTUR_LIMIT_1MHZ + bne set_speed + +maximum_speed: + lda #CHAMELEON_CFGTUR_LIMIT_NONE + bne set_speed + +_get_chameleon_speed: + jsr activate_regs +return_speed: + ldx #$00 + lda CHAMELEON_CFGTUR + tay + and #%10000000 + beq return_value + tya + and #%00001000 + bne is_slow_mode + tya + and #%00000111 + beq is_max_mode +return_value: + ldy #CHAMELEON_DISABLE_REGS + sty CHAMELEON_CFGENA + rts + +is_slow_mode: + txa + bne return_value + +is_max_mode: + lda #SPEED_FAST + bne return_value + +activate_regs: + ldy #CHAMELEON_ENABLE_REGS + sty CHAMELEON_CFGENA + rts + diff --git a/libsrc/c64/acc_detect_chameleon.s b/libsrc/c64/acc_detect_chameleon.s new file mode 100755 index 000000000..a16a264e7 --- /dev/null +++ b/libsrc/c64/acc_detect_chameleon.s @@ -0,0 +1,39 @@ +; +; Marco van den Heuvel, 2018-04-25 +; + +; unsigned char detect_chameleon (void); +; +;/* Check for the presence of the Chameleon cartridge. +; * +; * Possible return values: +; * 0x00 : Chameleon cartridge not present +; * 0x01 : Chameleon cartridge present +; */ + + .export _detect_chameleon + + .include "accelerator.inc" + +_detect_chameleon: + lda #$00 + tax + +; Make sure the CPU is a 6510 + .byte $1A ; NOP on 6510, INA on 65(S)C(E)02, 4510 and 65816 + bne not_found + + ldy CHAMELEON_CFGENA + lda #CHAMELEON_ENABLE_REGS + sta CHAMELEON_CFGENA + lda CHAMELEON_CFGENA + sty CHAMELEON_CFGENA + cmp #$FF + beq not_found +found: + lda #$01 + .byte $24 +not_found: + txa + rts + diff --git a/libsrc/c64/acc_scpu_speed.s b/libsrc/c64/acc_scpu_speed.s index 4bd142bbb..9f932aecd 100644 --- a/libsrc/c64/acc_scpu_speed.s +++ b/libsrc/c64/acc_scpu_speed.s @@ -2,7 +2,7 @@ ; Marco van den Heuvel, 2018-04-09 ; -; extern unsigned char __fastcall__ set_scpu_speed (unsigned char speed); +; unsigned char __fastcall__ set_scpu_speed (unsigned char speed); ; ;/* Set the speed of the SuperCPU cartridge, using SPEED_SLOW will switch to ; * 1 Mhz mode, SPEED_20X or SPEED_FAST will switch to 20 Mhz mode. @@ -19,7 +19,7 @@ ; * make sure you use 'detect_scpu();' before using. ; */ -; extern unsigned char get_scpu_speed (void); +; unsigned char get_scpu_speed (void); ; ;/* Get the speed of the SuperCPU cartridge. ; * diff --git a/testcode/lib/accelerator/Makefile b/testcode/lib/accelerator/Makefile index 121ad57b8..e9bd61881 100644 --- a/testcode/lib/accelerator/Makefile +++ b/testcode/lib/accelerator/Makefile @@ -1,7 +1,7 @@ CL ?= cl65 all: c64-scpu-test.prg c128-scpu-test.prg c64dtv-test.prg \ - c64-c128-test.prg c128-test.prg + c64-c128-test.prg c128-test.prg chameleon-test.prg c64-scpu-test.prg: c64-c128-scpu-test.c $(CL) -t c64 c64-c128-scpu-test.c -o c64-scpu-test.prg @@ -17,3 +17,6 @@ c64-c128-test.prg: c64-c128-test.c c128-test.prg: c64-c128-test.c $(CL) -t c128 c64-c128-test.c -o c128-test.prg + +chameleon-test.prg: chameleon-test.c + $(CL) -t c64 chameleon-test.c -o chameleon-test.prg diff --git a/testcode/lib/accelerator/chameleon-test.c b/testcode/lib/accelerator/chameleon-test.c new file mode 100755 index 000000000..ffc1539b5 --- /dev/null +++ b/testcode/lib/accelerator/chameleon-test.c @@ -0,0 +1,8 @@ +/* C64 Chameleon accelerator test code. */ + +#define ACC_DETECT detect_chameleon +#define ACC_GET_SPEED get_chameleon_speed +#define ACC_SET_SPEED set_chameleon_speed +#define ACC_NAME "Chameleon cartridge" + +#include "turbo-test.c"
+ +/ + +The function is specific to the C64. +The function does not check for the presence of the C64 Chameleon cartridge. +See the accelerator.h header for the speed definitions. + +, +, + +
@@ -6186,6 +6231,28 @@ clean-up when exitting the program. +set_chameleon_speed + + + +/ + +The function is specific to the C64. +The function does not check for the presence of the C64 Chameleon cartridge. +See the accelerator.h header for the speed definitions. + +, +, + + + + set_scpu_speed diff --git a/include/accelerator.h b/include/accelerator.h index 0fa202bc6..d29b73467 100644 --- a/include/accelerator.h +++ b/include/accelerator.h @@ -77,7 +77,7 @@ extern unsigned char __fastcall__ set_scpu_speed (unsigned char speed); * make sure you use 'detect_scpu();' before using. */ -extern unsigned char get_scpu_speed (void); +unsigned char get_scpu_speed (void); /* Get the speed of the SuperCPU cartridge. * @@ -89,7 +89,7 @@ extern unsigned char get_scpu_speed (void); * make sure you use 'detect_scpu();' before using. */ -extern unsigned char detect_scpu (void); +unsigned char detect_scpu (void); /* Check for the presence of the SuperCPU cartridge. * @@ -101,7 +101,7 @@ extern unsigned char detect_scpu (void); /* C64DTV */ -extern unsigned char __fastcall__ set_c64dtv_speed (unsigned char speed); +unsigned char __fastcall__ set_c64dtv_speed (unsigned char speed); /* Set the speed of the C64DTV, using SPEED_SLOW will switch to * slow mode, SPEED_2X or SPEED_FAST will switch to fast mode. @@ -115,7 +115,7 @@ extern unsigned char __fastcall__ set_c64dtv_speed (unsigned char speed); * make sure you use 'detect_c64dtv();' before using. */ -extern unsigned char get_c64dtv_speed (void); +unsigned char get_c64dtv_speed (void); /* Get the speed of the C64DTV. * @@ -127,7 +127,7 @@ extern unsigned char get_c64dtv_speed (void); * make sure you use 'detect_c64dtv();' before using. */ -extern unsigned char detect_c64dtv (void); +unsigned char detect_c64dtv (void); /* Check for the presence of the C64DTV. * @@ -139,7 +139,7 @@ extern unsigned char detect_c64dtv (void); /* C128 8502 CPU */ -extern unsigned char __fastcall__ set_c128_speed (unsigned char speed); +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. @@ -153,7 +153,7 @@ extern unsigned char __fastcall__ set_c128_speed (unsigned char speed); * you use 'detect_c128();' before using. */ -extern unsigned char get_c128_speed (void); +unsigned char get_c128_speed (void); /* Get the speed of the C128 8502 CPU. * @@ -165,7 +165,7 @@ extern unsigned char get_c128_speed (void); * you use 'detect_c128();' before using. */ -extern unsigned char detect_c128 (void); +unsigned char detect_c128 (void); /* Check if the C128 CPU is the current CPU. * @@ -174,6 +174,58 @@ extern unsigned char detect_c128 (void); * 0x01 : C128 CPU is the current CPU */ + +/* C64 Chameleon cartridge */ + +unsigned char __fastcall__ set_chameleon_speed (unsigned char speed); + +/* Set the speed of the C64 Chameleon cartridge, the following inputs + * are accepted: + * SPEED_SLOW : 1 Mhz mode + * SPEED_1X : 1 Mhz mode + * SPEED_2X : 2 Mhz mode + * SPEED_3X : 3 Mhz mode + * SPEED_4X : 4 Mhz mode + * SPEED_5X : 5 Mhz mode + * SPEED_6X : 6 Mhz mode + * SPEED_FAST : Maximum speed mode + * + * Note that any value higher or equal to SPEED_7X will switch to maximum + * speed 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 the C64 Chameleon cartridge, + * make sure you use 'detect_chameleon();' before using. + */ + +unsigned char get_chameleon_speed (void); + +;/* Get the speed of the C64 Chameleon cartridge. +; * +; * Possible return values: +; * SPEED_SLOW : Slow mode +; * SPEED_2X : 2Mhz mode +; * SPEED_3X : 3Mhz mode +; * SPEED_4X : 4Mhz mode +; * SPEED_5X : 5Mhz mode +; * SPEED_6X : 6Mhz mode +; * SPEED_FAST : Maximum speed mode +; * +; * This function does not check for the presence of the C64 Chameleon cartridge, +; * make sure you use 'detect_chameleon();' before using. +; */ + +unsigned char detect_chameleon (void); + +/* Check for the presence of the C64 Chameleon cartridge. + * + * Possible return values: + * 0x00 : C64 Chameleon cartridge not present + * 0x01 : C64 Chameleon cartridge present + */ + /* End of accelerator.h */ #endif diff --git a/libsrc/c128/acc_c128_speed.s b/libsrc/c128/acc_c128_speed.s index a104aad1a..7994a52ae 100644 --- a/libsrc/c128/acc_c128_speed.s +++ b/libsrc/c128/acc_c128_speed.s @@ -3,7 +3,7 @@ ; 2018-04-26, Greg King ; -; extern unsigned char __fastcall__ set_c128_speed (unsigned char speed); +; 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. @@ -19,7 +19,7 @@ ; * For C128 programs, no detect function call is needed. ; */ -; extern unsigned char get_c128_speed (void); +; unsigned char get_c128_speed (void); ; ;/* Get the speed of the C128 8502 CPU. ; * diff --git a/libsrc/c128/acc_scpu_speed.s b/libsrc/c128/acc_scpu_speed.s index 4bd142bbb..9f932aecd 100644 --- a/libsrc/c128/acc_scpu_speed.s +++ b/libsrc/c128/acc_scpu_speed.s @@ -2,7 +2,7 @@ ; Marco van den Heuvel, 2018-04-09 ; -; extern unsigned char __fastcall__ set_scpu_speed (unsigned char speed); +; unsigned char __fastcall__ set_scpu_speed (unsigned char speed); ; ;/* Set the speed of the SuperCPU cartridge, using SPEED_SLOW will switch to ; * 1 Mhz mode, SPEED_20X or SPEED_FAST will switch to 20 Mhz mode. @@ -19,7 +19,7 @@ ; * make sure you use 'detect_scpu();' before using. ; */ -; extern unsigned char get_scpu_speed (void); +; unsigned char get_scpu_speed (void); ; ;/* Get the speed of the SuperCPU cartridge. ; * diff --git a/libsrc/c64/acc_c64dtv_speed.s b/libsrc/c64/acc_c64dtv_speed.s index 6a8371a9c..d6cf8b994 100644 --- a/libsrc/c64/acc_c64dtv_speed.s +++ b/libsrc/c64/acc_c64dtv_speed.s @@ -2,7 +2,7 @@ ; Marco van den Heuvel, 2018-04-14 ; -; extern unsigned char __fastcall__ set_c64dtv_speed (unsigned char speed); +; unsigned char __fastcall__ set_c64dtv_speed (unsigned char speed); ; ;/* Set the speed of the C64DTV, using SPEED_SLOW will switch to ; * slow mode, SPEED_2X or SPEED_FAST will switch to fast mode. @@ -16,7 +16,7 @@ ; * make sure you use 'detect_c64dtv();' before using. ; */ -; extern unsigned char get_c64dtv_speed (void); +; unsigned char get_c64dtv_speed (void); ; ;/* Get the speed of the C64DTV. ; * diff --git a/libsrc/c64/acc_chameleon_speed.s b/libsrc/c64/acc_chameleon_speed.s new file mode 100755 index 000000000..ce51b9dde --- /dev/null +++ b/libsrc/c64/acc_chameleon_speed.s @@ -0,0 +1,100 @@ +; +; Marco van den Heuvel, 2018-04-25 +; + +; unsigned char __fastcall__ set_chameleon_speed (unsigned char speed); +; +;/* Set the speed of the Chameleon cartridge, the following inputs +; * are accepted: +; * SPEED_SLOW : 1 Mhz mode +; * SPEED_1X : 1 Mhz mode +; * SPEED_2X : 2 Mhz mode +; * SPEED_3X : 3 Mhz mode +; * SPEED_4X : 4 Mhz mode +; * SPEED_5X : 5 Mhz mode +; * SPEED_6X : 6 Mhz mode +; * SPEED_FAST : Maximum speed mode +; * +; * Note that any value higher or equal to SPEED_7X will switch to maximum +; * speed 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 the Chameleon cartridge, +; * make sure you use 'detect_chameleon();' before using. +; */ + +; unsigned char get_chameleon_speed (void); +; +;/* Get the speed of the Chameleon cartridge. +; * +; * Possible return values: +; * SPEED_SLOW : Slow mode +; * SPEED_2X : 2Mhz mode +; * SPEED_3X : 3Mhz mode +; * SPEED_4X : 4Mhz mode +; * SPEED_5X : 5Mhz mode +; * SPEED_6X : 6Mhz mode +; * SPEED_FAST : Maximum speed mode +; * +; * This function does not check for the presence of the Chameleon cartridge, +; * make sure you use 'detect_chameleon();' before using. +; */ + + .export _set_chameleon_speed + .export _get_chameleon_speed + + .include "accelerator.inc" + +_set_chameleon_speed: + cmp #SPEED_7X + bcs maximum_speed + cmp #SPEED_1X + beq low_speed + ora #$80 +set_speed: + jsr activate_regs + sta CHAMELEON_CFGTUR + jmp return_speed + +low_speed: + lda #CHAMELEON_CFGTUR_LIMIT_1MHZ + bne set_speed + +maximum_speed: + lda #CHAMELEON_CFGTUR_LIMIT_NONE + bne set_speed + +_get_chameleon_speed: + jsr activate_regs +return_speed: + ldx #$00 + lda CHAMELEON_CFGTUR + tay + and #%10000000 + beq return_value + tya + and #%00001000 + bne is_slow_mode + tya + and #%00000111 + beq is_max_mode +return_value: + ldy #CHAMELEON_DISABLE_REGS + sty CHAMELEON_CFGENA + rts + +is_slow_mode: + txa + bne return_value + +is_max_mode: + lda #SPEED_FAST + bne return_value + +activate_regs: + ldy #CHAMELEON_ENABLE_REGS + sty CHAMELEON_CFGENA + rts + diff --git a/libsrc/c64/acc_detect_chameleon.s b/libsrc/c64/acc_detect_chameleon.s new file mode 100755 index 000000000..a16a264e7 --- /dev/null +++ b/libsrc/c64/acc_detect_chameleon.s @@ -0,0 +1,39 @@ +; +; Marco van den Heuvel, 2018-04-25 +; + +; unsigned char detect_chameleon (void); +; +;/* Check for the presence of the Chameleon cartridge. +; * +; * Possible return values: +; * 0x00 : Chameleon cartridge not present +; * 0x01 : Chameleon cartridge present +; */ + + .export _detect_chameleon + + .include "accelerator.inc" + +_detect_chameleon: + lda #$00 + tax + +; Make sure the CPU is a 6510 + .byte $1A ; NOP on 6510, INA on 65(S)C(E)02, 4510 and 65816 + bne not_found + + ldy CHAMELEON_CFGENA + lda #CHAMELEON_ENABLE_REGS + sta CHAMELEON_CFGENA + lda CHAMELEON_CFGENA + sty CHAMELEON_CFGENA + cmp #$FF + beq not_found +found: + lda #$01 + .byte $24 +not_found: + txa + rts + diff --git a/libsrc/c64/acc_scpu_speed.s b/libsrc/c64/acc_scpu_speed.s index 4bd142bbb..9f932aecd 100644 --- a/libsrc/c64/acc_scpu_speed.s +++ b/libsrc/c64/acc_scpu_speed.s @@ -2,7 +2,7 @@ ; Marco van den Heuvel, 2018-04-09 ; -; extern unsigned char __fastcall__ set_scpu_speed (unsigned char speed); +; unsigned char __fastcall__ set_scpu_speed (unsigned char speed); ; ;/* Set the speed of the SuperCPU cartridge, using SPEED_SLOW will switch to ; * 1 Mhz mode, SPEED_20X or SPEED_FAST will switch to 20 Mhz mode. @@ -19,7 +19,7 @@ ; * make sure you use 'detect_scpu();' before using. ; */ -; extern unsigned char get_scpu_speed (void); +; unsigned char get_scpu_speed (void); ; ;/* Get the speed of the SuperCPU cartridge. ; * diff --git a/testcode/lib/accelerator/Makefile b/testcode/lib/accelerator/Makefile index 121ad57b8..e9bd61881 100644 --- a/testcode/lib/accelerator/Makefile +++ b/testcode/lib/accelerator/Makefile @@ -1,7 +1,7 @@ CL ?= cl65 all: c64-scpu-test.prg c128-scpu-test.prg c64dtv-test.prg \ - c64-c128-test.prg c128-test.prg + c64-c128-test.prg c128-test.prg chameleon-test.prg c64-scpu-test.prg: c64-c128-scpu-test.c $(CL) -t c64 c64-c128-scpu-test.c -o c64-scpu-test.prg @@ -17,3 +17,6 @@ c64-c128-test.prg: c64-c128-test.c c128-test.prg: c64-c128-test.c $(CL) -t c128 c64-c128-test.c -o c128-test.prg + +chameleon-test.prg: chameleon-test.c + $(CL) -t c64 chameleon-test.c -o chameleon-test.prg diff --git a/testcode/lib/accelerator/chameleon-test.c b/testcode/lib/accelerator/chameleon-test.c new file mode 100755 index 000000000..ffc1539b5 --- /dev/null +++ b/testcode/lib/accelerator/chameleon-test.c @@ -0,0 +1,8 @@ +/* C64 Chameleon accelerator test code. */ + +#define ACC_DETECT detect_chameleon +#define ACC_GET_SPEED get_chameleon_speed +#define ACC_SET_SPEED set_chameleon_speed +#define ACC_NAME "Chameleon cartridge" + +#include "turbo-test.c"
@@ -6186,6 +6231,28 @@ clean-up when exitting the program.
+ + + +/ + +The function is specific to the C64. +The function does not check for the presence of the C64 Chameleon cartridge. +See the accelerator.h header for the speed definitions. + +, +, + + + + set_scpu_speed diff --git a/include/accelerator.h b/include/accelerator.h index 0fa202bc6..d29b73467 100644 --- a/include/accelerator.h +++ b/include/accelerator.h @@ -77,7 +77,7 @@ extern unsigned char __fastcall__ set_scpu_speed (unsigned char speed); * make sure you use 'detect_scpu();' before using. */ -extern unsigned char get_scpu_speed (void); +unsigned char get_scpu_speed (void); /* Get the speed of the SuperCPU cartridge. * @@ -89,7 +89,7 @@ extern unsigned char get_scpu_speed (void); * make sure you use 'detect_scpu();' before using. */ -extern unsigned char detect_scpu (void); +unsigned char detect_scpu (void); /* Check for the presence of the SuperCPU cartridge. * @@ -101,7 +101,7 @@ extern unsigned char detect_scpu (void); /* C64DTV */ -extern unsigned char __fastcall__ set_c64dtv_speed (unsigned char speed); +unsigned char __fastcall__ set_c64dtv_speed (unsigned char speed); /* Set the speed of the C64DTV, using SPEED_SLOW will switch to * slow mode, SPEED_2X or SPEED_FAST will switch to fast mode. @@ -115,7 +115,7 @@ extern unsigned char __fastcall__ set_c64dtv_speed (unsigned char speed); * make sure you use 'detect_c64dtv();' before using. */ -extern unsigned char get_c64dtv_speed (void); +unsigned char get_c64dtv_speed (void); /* Get the speed of the C64DTV. * @@ -127,7 +127,7 @@ extern unsigned char get_c64dtv_speed (void); * make sure you use 'detect_c64dtv();' before using. */ -extern unsigned char detect_c64dtv (void); +unsigned char detect_c64dtv (void); /* Check for the presence of the C64DTV. * @@ -139,7 +139,7 @@ extern unsigned char detect_c64dtv (void); /* C128 8502 CPU */ -extern unsigned char __fastcall__ set_c128_speed (unsigned char speed); +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. @@ -153,7 +153,7 @@ extern unsigned char __fastcall__ set_c128_speed (unsigned char speed); * you use 'detect_c128();' before using. */ -extern unsigned char get_c128_speed (void); +unsigned char get_c128_speed (void); /* Get the speed of the C128 8502 CPU. * @@ -165,7 +165,7 @@ extern unsigned char get_c128_speed (void); * you use 'detect_c128();' before using. */ -extern unsigned char detect_c128 (void); +unsigned char detect_c128 (void); /* Check if the C128 CPU is the current CPU. * @@ -174,6 +174,58 @@ extern unsigned char detect_c128 (void); * 0x01 : C128 CPU is the current CPU */ + +/* C64 Chameleon cartridge */ + +unsigned char __fastcall__ set_chameleon_speed (unsigned char speed); + +/* Set the speed of the C64 Chameleon cartridge, the following inputs + * are accepted: + * SPEED_SLOW : 1 Mhz mode + * SPEED_1X : 1 Mhz mode + * SPEED_2X : 2 Mhz mode + * SPEED_3X : 3 Mhz mode + * SPEED_4X : 4 Mhz mode + * SPEED_5X : 5 Mhz mode + * SPEED_6X : 6 Mhz mode + * SPEED_FAST : Maximum speed mode + * + * Note that any value higher or equal to SPEED_7X will switch to maximum + * speed 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 the C64 Chameleon cartridge, + * make sure you use 'detect_chameleon();' before using. + */ + +unsigned char get_chameleon_speed (void); + +;/* Get the speed of the C64 Chameleon cartridge. +; * +; * Possible return values: +; * SPEED_SLOW : Slow mode +; * SPEED_2X : 2Mhz mode +; * SPEED_3X : 3Mhz mode +; * SPEED_4X : 4Mhz mode +; * SPEED_5X : 5Mhz mode +; * SPEED_6X : 6Mhz mode +; * SPEED_FAST : Maximum speed mode +; * +; * This function does not check for the presence of the C64 Chameleon cartridge, +; * make sure you use 'detect_chameleon();' before using. +; */ + +unsigned char detect_chameleon (void); + +/* Check for the presence of the C64 Chameleon cartridge. + * + * Possible return values: + * 0x00 : C64 Chameleon cartridge not present + * 0x01 : C64 Chameleon cartridge present + */ + /* End of accelerator.h */ #endif diff --git a/libsrc/c128/acc_c128_speed.s b/libsrc/c128/acc_c128_speed.s index a104aad1a..7994a52ae 100644 --- a/libsrc/c128/acc_c128_speed.s +++ b/libsrc/c128/acc_c128_speed.s @@ -3,7 +3,7 @@ ; 2018-04-26, Greg King ; -; extern unsigned char __fastcall__ set_c128_speed (unsigned char speed); +; 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. @@ -19,7 +19,7 @@ ; * For C128 programs, no detect function call is needed. ; */ -; extern unsigned char get_c128_speed (void); +; unsigned char get_c128_speed (void); ; ;/* Get the speed of the C128 8502 CPU. ; * diff --git a/libsrc/c128/acc_scpu_speed.s b/libsrc/c128/acc_scpu_speed.s index 4bd142bbb..9f932aecd 100644 --- a/libsrc/c128/acc_scpu_speed.s +++ b/libsrc/c128/acc_scpu_speed.s @@ -2,7 +2,7 @@ ; Marco van den Heuvel, 2018-04-09 ; -; extern unsigned char __fastcall__ set_scpu_speed (unsigned char speed); +; unsigned char __fastcall__ set_scpu_speed (unsigned char speed); ; ;/* Set the speed of the SuperCPU cartridge, using SPEED_SLOW will switch to ; * 1 Mhz mode, SPEED_20X or SPEED_FAST will switch to 20 Mhz mode. @@ -19,7 +19,7 @@ ; * make sure you use 'detect_scpu();' before using. ; */ -; extern unsigned char get_scpu_speed (void); +; unsigned char get_scpu_speed (void); ; ;/* Get the speed of the SuperCPU cartridge. ; * diff --git a/libsrc/c64/acc_c64dtv_speed.s b/libsrc/c64/acc_c64dtv_speed.s index 6a8371a9c..d6cf8b994 100644 --- a/libsrc/c64/acc_c64dtv_speed.s +++ b/libsrc/c64/acc_c64dtv_speed.s @@ -2,7 +2,7 @@ ; Marco van den Heuvel, 2018-04-14 ; -; extern unsigned char __fastcall__ set_c64dtv_speed (unsigned char speed); +; unsigned char __fastcall__ set_c64dtv_speed (unsigned char speed); ; ;/* Set the speed of the C64DTV, using SPEED_SLOW will switch to ; * slow mode, SPEED_2X or SPEED_FAST will switch to fast mode. @@ -16,7 +16,7 @@ ; * make sure you use 'detect_c64dtv();' before using. ; */ -; extern unsigned char get_c64dtv_speed (void); +; unsigned char get_c64dtv_speed (void); ; ;/* Get the speed of the C64DTV. ; * diff --git a/libsrc/c64/acc_chameleon_speed.s b/libsrc/c64/acc_chameleon_speed.s new file mode 100755 index 000000000..ce51b9dde --- /dev/null +++ b/libsrc/c64/acc_chameleon_speed.s @@ -0,0 +1,100 @@ +; +; Marco van den Heuvel, 2018-04-25 +; + +; unsigned char __fastcall__ set_chameleon_speed (unsigned char speed); +; +;/* Set the speed of the Chameleon cartridge, the following inputs +; * are accepted: +; * SPEED_SLOW : 1 Mhz mode +; * SPEED_1X : 1 Mhz mode +; * SPEED_2X : 2 Mhz mode +; * SPEED_3X : 3 Mhz mode +; * SPEED_4X : 4 Mhz mode +; * SPEED_5X : 5 Mhz mode +; * SPEED_6X : 6 Mhz mode +; * SPEED_FAST : Maximum speed mode +; * +; * Note that any value higher or equal to SPEED_7X will switch to maximum +; * speed 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 the Chameleon cartridge, +; * make sure you use 'detect_chameleon();' before using. +; */ + +; unsigned char get_chameleon_speed (void); +; +;/* Get the speed of the Chameleon cartridge. +; * +; * Possible return values: +; * SPEED_SLOW : Slow mode +; * SPEED_2X : 2Mhz mode +; * SPEED_3X : 3Mhz mode +; * SPEED_4X : 4Mhz mode +; * SPEED_5X : 5Mhz mode +; * SPEED_6X : 6Mhz mode +; * SPEED_FAST : Maximum speed mode +; * +; * This function does not check for the presence of the Chameleon cartridge, +; * make sure you use 'detect_chameleon();' before using. +; */ + + .export _set_chameleon_speed + .export _get_chameleon_speed + + .include "accelerator.inc" + +_set_chameleon_speed: + cmp #SPEED_7X + bcs maximum_speed + cmp #SPEED_1X + beq low_speed + ora #$80 +set_speed: + jsr activate_regs + sta CHAMELEON_CFGTUR + jmp return_speed + +low_speed: + lda #CHAMELEON_CFGTUR_LIMIT_1MHZ + bne set_speed + +maximum_speed: + lda #CHAMELEON_CFGTUR_LIMIT_NONE + bne set_speed + +_get_chameleon_speed: + jsr activate_regs +return_speed: + ldx #$00 + lda CHAMELEON_CFGTUR + tay + and #%10000000 + beq return_value + tya + and #%00001000 + bne is_slow_mode + tya + and #%00000111 + beq is_max_mode +return_value: + ldy #CHAMELEON_DISABLE_REGS + sty CHAMELEON_CFGENA + rts + +is_slow_mode: + txa + bne return_value + +is_max_mode: + lda #SPEED_FAST + bne return_value + +activate_regs: + ldy #CHAMELEON_ENABLE_REGS + sty CHAMELEON_CFGENA + rts + diff --git a/libsrc/c64/acc_detect_chameleon.s b/libsrc/c64/acc_detect_chameleon.s new file mode 100755 index 000000000..a16a264e7 --- /dev/null +++ b/libsrc/c64/acc_detect_chameleon.s @@ -0,0 +1,39 @@ +; +; Marco van den Heuvel, 2018-04-25 +; + +; unsigned char detect_chameleon (void); +; +;/* Check for the presence of the Chameleon cartridge. +; * +; * Possible return values: +; * 0x00 : Chameleon cartridge not present +; * 0x01 : Chameleon cartridge present +; */ + + .export _detect_chameleon + + .include "accelerator.inc" + +_detect_chameleon: + lda #$00 + tax + +; Make sure the CPU is a 6510 + .byte $1A ; NOP on 6510, INA on 65(S)C(E)02, 4510 and 65816 + bne not_found + + ldy CHAMELEON_CFGENA + lda #CHAMELEON_ENABLE_REGS + sta CHAMELEON_CFGENA + lda CHAMELEON_CFGENA + sty CHAMELEON_CFGENA + cmp #$FF + beq not_found +found: + lda #$01 + .byte $24 +not_found: + txa + rts + diff --git a/libsrc/c64/acc_scpu_speed.s b/libsrc/c64/acc_scpu_speed.s index 4bd142bbb..9f932aecd 100644 --- a/libsrc/c64/acc_scpu_speed.s +++ b/libsrc/c64/acc_scpu_speed.s @@ -2,7 +2,7 @@ ; Marco van den Heuvel, 2018-04-09 ; -; extern unsigned char __fastcall__ set_scpu_speed (unsigned char speed); +; unsigned char __fastcall__ set_scpu_speed (unsigned char speed); ; ;/* Set the speed of the SuperCPU cartridge, using SPEED_SLOW will switch to ; * 1 Mhz mode, SPEED_20X or SPEED_FAST will switch to 20 Mhz mode. @@ -19,7 +19,7 @@ ; * make sure you use 'detect_scpu();' before using. ; */ -; extern unsigned char get_scpu_speed (void); +; unsigned char get_scpu_speed (void); ; ;/* Get the speed of the SuperCPU cartridge. ; * diff --git a/testcode/lib/accelerator/Makefile b/testcode/lib/accelerator/Makefile index 121ad57b8..e9bd61881 100644 --- a/testcode/lib/accelerator/Makefile +++ b/testcode/lib/accelerator/Makefile @@ -1,7 +1,7 @@ CL ?= cl65 all: c64-scpu-test.prg c128-scpu-test.prg c64dtv-test.prg \ - c64-c128-test.prg c128-test.prg + c64-c128-test.prg c128-test.prg chameleon-test.prg c64-scpu-test.prg: c64-c128-scpu-test.c $(CL) -t c64 c64-c128-scpu-test.c -o c64-scpu-test.prg @@ -17,3 +17,6 @@ c64-c128-test.prg: c64-c128-test.c c128-test.prg: c64-c128-test.c $(CL) -t c128 c64-c128-test.c -o c128-test.prg + +chameleon-test.prg: chameleon-test.c + $(CL) -t c64 chameleon-test.c -o chameleon-test.prg diff --git a/testcode/lib/accelerator/chameleon-test.c b/testcode/lib/accelerator/chameleon-test.c new file mode 100755 index 000000000..ffc1539b5 --- /dev/null +++ b/testcode/lib/accelerator/chameleon-test.c @@ -0,0 +1,8 @@ +/* C64 Chameleon accelerator test code. */ + +#define ACC_DETECT detect_chameleon +#define ACC_GET_SPEED get_chameleon_speed +#define ACC_SET_SPEED set_chameleon_speed +#define ACC_NAME "Chameleon cartridge" + +#include "turbo-test.c"
diff --git a/include/accelerator.h b/include/accelerator.h index 0fa202bc6..d29b73467 100644 --- a/include/accelerator.h +++ b/include/accelerator.h @@ -77,7 +77,7 @@ extern unsigned char __fastcall__ set_scpu_speed (unsigned char speed); * make sure you use 'detect_scpu();' before using. */ -extern unsigned char get_scpu_speed (void); +unsigned char get_scpu_speed (void); /* Get the speed of the SuperCPU cartridge. * @@ -89,7 +89,7 @@ extern unsigned char get_scpu_speed (void); * make sure you use 'detect_scpu();' before using. */ -extern unsigned char detect_scpu (void); +unsigned char detect_scpu (void); /* Check for the presence of the SuperCPU cartridge. * @@ -101,7 +101,7 @@ extern unsigned char detect_scpu (void); /* C64DTV */ -extern unsigned char __fastcall__ set_c64dtv_speed (unsigned char speed); +unsigned char __fastcall__ set_c64dtv_speed (unsigned char speed); /* Set the speed of the C64DTV, using SPEED_SLOW will switch to * slow mode, SPEED_2X or SPEED_FAST will switch to fast mode. @@ -115,7 +115,7 @@ extern unsigned char __fastcall__ set_c64dtv_speed (unsigned char speed); * make sure you use 'detect_c64dtv();' before using. */ -extern unsigned char get_c64dtv_speed (void); +unsigned char get_c64dtv_speed (void); /* Get the speed of the C64DTV. * @@ -127,7 +127,7 @@ extern unsigned char get_c64dtv_speed (void); * make sure you use 'detect_c64dtv();' before using. */ -extern unsigned char detect_c64dtv (void); +unsigned char detect_c64dtv (void); /* Check for the presence of the C64DTV. * @@ -139,7 +139,7 @@ extern unsigned char detect_c64dtv (void); /* C128 8502 CPU */ -extern unsigned char __fastcall__ set_c128_speed (unsigned char speed); +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. @@ -153,7 +153,7 @@ extern unsigned char __fastcall__ set_c128_speed (unsigned char speed); * you use 'detect_c128();' before using. */ -extern unsigned char get_c128_speed (void); +unsigned char get_c128_speed (void); /* Get the speed of the C128 8502 CPU. * @@ -165,7 +165,7 @@ extern unsigned char get_c128_speed (void); * you use 'detect_c128();' before using. */ -extern unsigned char detect_c128 (void); +unsigned char detect_c128 (void); /* Check if the C128 CPU is the current CPU. * @@ -174,6 +174,58 @@ extern unsigned char detect_c128 (void); * 0x01 : C128 CPU is the current CPU */ + +/* C64 Chameleon cartridge */ + +unsigned char __fastcall__ set_chameleon_speed (unsigned char speed); + +/* Set the speed of the C64 Chameleon cartridge, the following inputs + * are accepted: + * SPEED_SLOW : 1 Mhz mode + * SPEED_1X : 1 Mhz mode + * SPEED_2X : 2 Mhz mode + * SPEED_3X : 3 Mhz mode + * SPEED_4X : 4 Mhz mode + * SPEED_5X : 5 Mhz mode + * SPEED_6X : 6 Mhz mode + * SPEED_FAST : Maximum speed mode + * + * Note that any value higher or equal to SPEED_7X will switch to maximum + * speed 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 the C64 Chameleon cartridge, + * make sure you use 'detect_chameleon();' before using. + */ + +unsigned char get_chameleon_speed (void); + +;/* Get the speed of the C64 Chameleon cartridge. +; * +; * Possible return values: +; * SPEED_SLOW : Slow mode +; * SPEED_2X : 2Mhz mode +; * SPEED_3X : 3Mhz mode +; * SPEED_4X : 4Mhz mode +; * SPEED_5X : 5Mhz mode +; * SPEED_6X : 6Mhz mode +; * SPEED_FAST : Maximum speed mode +; * +; * This function does not check for the presence of the C64 Chameleon cartridge, +; * make sure you use 'detect_chameleon();' before using. +; */ + +unsigned char detect_chameleon (void); + +/* Check for the presence of the C64 Chameleon cartridge. + * + * Possible return values: + * 0x00 : C64 Chameleon cartridge not present + * 0x01 : C64 Chameleon cartridge present + */ + /* End of accelerator.h */ #endif diff --git a/libsrc/c128/acc_c128_speed.s b/libsrc/c128/acc_c128_speed.s index a104aad1a..7994a52ae 100644 --- a/libsrc/c128/acc_c128_speed.s +++ b/libsrc/c128/acc_c128_speed.s @@ -3,7 +3,7 @@ ; 2018-04-26, Greg King ; -; extern unsigned char __fastcall__ set_c128_speed (unsigned char speed); +; 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. @@ -19,7 +19,7 @@ ; * For C128 programs, no detect function call is needed. ; */ -; extern unsigned char get_c128_speed (void); +; unsigned char get_c128_speed (void); ; ;/* Get the speed of the C128 8502 CPU. ; * diff --git a/libsrc/c128/acc_scpu_speed.s b/libsrc/c128/acc_scpu_speed.s index 4bd142bbb..9f932aecd 100644 --- a/libsrc/c128/acc_scpu_speed.s +++ b/libsrc/c128/acc_scpu_speed.s @@ -2,7 +2,7 @@ ; Marco van den Heuvel, 2018-04-09 ; -; extern unsigned char __fastcall__ set_scpu_speed (unsigned char speed); +; unsigned char __fastcall__ set_scpu_speed (unsigned char speed); ; ;/* Set the speed of the SuperCPU cartridge, using SPEED_SLOW will switch to ; * 1 Mhz mode, SPEED_20X or SPEED_FAST will switch to 20 Mhz mode. @@ -19,7 +19,7 @@ ; * make sure you use 'detect_scpu();' before using. ; */ -; extern unsigned char get_scpu_speed (void); +; unsigned char get_scpu_speed (void); ; ;/* Get the speed of the SuperCPU cartridge. ; * diff --git a/libsrc/c64/acc_c64dtv_speed.s b/libsrc/c64/acc_c64dtv_speed.s index 6a8371a9c..d6cf8b994 100644 --- a/libsrc/c64/acc_c64dtv_speed.s +++ b/libsrc/c64/acc_c64dtv_speed.s @@ -2,7 +2,7 @@ ; Marco van den Heuvel, 2018-04-14 ; -; extern unsigned char __fastcall__ set_c64dtv_speed (unsigned char speed); +; unsigned char __fastcall__ set_c64dtv_speed (unsigned char speed); ; ;/* Set the speed of the C64DTV, using SPEED_SLOW will switch to ; * slow mode, SPEED_2X or SPEED_FAST will switch to fast mode. @@ -16,7 +16,7 @@ ; * make sure you use 'detect_c64dtv();' before using. ; */ -; extern unsigned char get_c64dtv_speed (void); +; unsigned char get_c64dtv_speed (void); ; ;/* Get the speed of the C64DTV. ; * diff --git a/libsrc/c64/acc_chameleon_speed.s b/libsrc/c64/acc_chameleon_speed.s new file mode 100755 index 000000000..ce51b9dde --- /dev/null +++ b/libsrc/c64/acc_chameleon_speed.s @@ -0,0 +1,100 @@ +; +; Marco van den Heuvel, 2018-04-25 +; + +; unsigned char __fastcall__ set_chameleon_speed (unsigned char speed); +; +;/* Set the speed of the Chameleon cartridge, the following inputs +; * are accepted: +; * SPEED_SLOW : 1 Mhz mode +; * SPEED_1X : 1 Mhz mode +; * SPEED_2X : 2 Mhz mode +; * SPEED_3X : 3 Mhz mode +; * SPEED_4X : 4 Mhz mode +; * SPEED_5X : 5 Mhz mode +; * SPEED_6X : 6 Mhz mode +; * SPEED_FAST : Maximum speed mode +; * +; * Note that any value higher or equal to SPEED_7X will switch to maximum +; * speed 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 the Chameleon cartridge, +; * make sure you use 'detect_chameleon();' before using. +; */ + +; unsigned char get_chameleon_speed (void); +; +;/* Get the speed of the Chameleon cartridge. +; * +; * Possible return values: +; * SPEED_SLOW : Slow mode +; * SPEED_2X : 2Mhz mode +; * SPEED_3X : 3Mhz mode +; * SPEED_4X : 4Mhz mode +; * SPEED_5X : 5Mhz mode +; * SPEED_6X : 6Mhz mode +; * SPEED_FAST : Maximum speed mode +; * +; * This function does not check for the presence of the Chameleon cartridge, +; * make sure you use 'detect_chameleon();' before using. +; */ + + .export _set_chameleon_speed + .export _get_chameleon_speed + + .include "accelerator.inc" + +_set_chameleon_speed: + cmp #SPEED_7X + bcs maximum_speed + cmp #SPEED_1X + beq low_speed + ora #$80 +set_speed: + jsr activate_regs + sta CHAMELEON_CFGTUR + jmp return_speed + +low_speed: + lda #CHAMELEON_CFGTUR_LIMIT_1MHZ + bne set_speed + +maximum_speed: + lda #CHAMELEON_CFGTUR_LIMIT_NONE + bne set_speed + +_get_chameleon_speed: + jsr activate_regs +return_speed: + ldx #$00 + lda CHAMELEON_CFGTUR + tay + and #%10000000 + beq return_value + tya + and #%00001000 + bne is_slow_mode + tya + and #%00000111 + beq is_max_mode +return_value: + ldy #CHAMELEON_DISABLE_REGS + sty CHAMELEON_CFGENA + rts + +is_slow_mode: + txa + bne return_value + +is_max_mode: + lda #SPEED_FAST + bne return_value + +activate_regs: + ldy #CHAMELEON_ENABLE_REGS + sty CHAMELEON_CFGENA + rts + diff --git a/libsrc/c64/acc_detect_chameleon.s b/libsrc/c64/acc_detect_chameleon.s new file mode 100755 index 000000000..a16a264e7 --- /dev/null +++ b/libsrc/c64/acc_detect_chameleon.s @@ -0,0 +1,39 @@ +; +; Marco van den Heuvel, 2018-04-25 +; + +; unsigned char detect_chameleon (void); +; +;/* Check for the presence of the Chameleon cartridge. +; * +; * Possible return values: +; * 0x00 : Chameleon cartridge not present +; * 0x01 : Chameleon cartridge present +; */ + + .export _detect_chameleon + + .include "accelerator.inc" + +_detect_chameleon: + lda #$00 + tax + +; Make sure the CPU is a 6510 + .byte $1A ; NOP on 6510, INA on 65(S)C(E)02, 4510 and 65816 + bne not_found + + ldy CHAMELEON_CFGENA + lda #CHAMELEON_ENABLE_REGS + sta CHAMELEON_CFGENA + lda CHAMELEON_CFGENA + sty CHAMELEON_CFGENA + cmp #$FF + beq not_found +found: + lda #$01 + .byte $24 +not_found: + txa + rts + diff --git a/libsrc/c64/acc_scpu_speed.s b/libsrc/c64/acc_scpu_speed.s index 4bd142bbb..9f932aecd 100644 --- a/libsrc/c64/acc_scpu_speed.s +++ b/libsrc/c64/acc_scpu_speed.s @@ -2,7 +2,7 @@ ; Marco van den Heuvel, 2018-04-09 ; -; extern unsigned char __fastcall__ set_scpu_speed (unsigned char speed); +; unsigned char __fastcall__ set_scpu_speed (unsigned char speed); ; ;/* Set the speed of the SuperCPU cartridge, using SPEED_SLOW will switch to ; * 1 Mhz mode, SPEED_20X or SPEED_FAST will switch to 20 Mhz mode. @@ -19,7 +19,7 @@ ; * make sure you use 'detect_scpu();' before using. ; */ -; extern unsigned char get_scpu_speed (void); +; unsigned char get_scpu_speed (void); ; ;/* Get the speed of the SuperCPU cartridge. ; * diff --git a/testcode/lib/accelerator/Makefile b/testcode/lib/accelerator/Makefile index 121ad57b8..e9bd61881 100644 --- a/testcode/lib/accelerator/Makefile +++ b/testcode/lib/accelerator/Makefile @@ -1,7 +1,7 @@ CL ?= cl65 all: c64-scpu-test.prg c128-scpu-test.prg c64dtv-test.prg \ - c64-c128-test.prg c128-test.prg + c64-c128-test.prg c128-test.prg chameleon-test.prg c64-scpu-test.prg: c64-c128-scpu-test.c $(CL) -t c64 c64-c128-scpu-test.c -o c64-scpu-test.prg @@ -17,3 +17,6 @@ c64-c128-test.prg: c64-c128-test.c c128-test.prg: c64-c128-test.c $(CL) -t c128 c64-c128-test.c -o c128-test.prg + +chameleon-test.prg: chameleon-test.c + $(CL) -t c64 chameleon-test.c -o chameleon-test.prg diff --git a/testcode/lib/accelerator/chameleon-test.c b/testcode/lib/accelerator/chameleon-test.c new file mode 100755 index 000000000..ffc1539b5 --- /dev/null +++ b/testcode/lib/accelerator/chameleon-test.c @@ -0,0 +1,8 @@ +/* C64 Chameleon accelerator test code. */ + +#define ACC_DETECT detect_chameleon +#define ACC_GET_SPEED get_chameleon_speed +#define ACC_SET_SPEED set_chameleon_speed +#define ACC_NAME "Chameleon cartridge" + +#include "turbo-test.c"