From ad7b339c449bb680e58ba240d37db8581015a60c Mon Sep 17 00:00:00 2001 From: Marco van den Heuvel <blackystardust68@yahoo.com> Date: Mon, 30 Apr 2018 14:30:35 -0700 Subject: [PATCH] Added C64 Turbo Master accelerator code and documentation. --- asminc/accelerator.inc | 9 ++++ doc/c64.sgml | 3 ++ doc/funcref.sgml | 67 +++++++++++++++++++++++++++++ include/accelerator.h | 41 ++++++++++++++++++ libsrc/c64/acc_detect_turbomaster.s | 47 ++++++++++++++++++++ libsrc/c64/acc_turbomaster_speed.s | 63 +++++++++++++++++++++++++++ testcode/lib/accelerator/Makefile | 5 ++- 7 files changed, 234 insertions(+), 1 deletion(-) create mode 100755 libsrc/c64/acc_detect_turbomaster.s create mode 100755 libsrc/c64/acc_turbomaster_speed.s diff --git a/asminc/accelerator.inc b/asminc/accelerator.inc index a92b65ff9..23a9686c7 100644 --- a/asminc/accelerator.inc +++ b/asminc/accelerator.inc @@ -69,3 +69,12 @@ C65_VICIII_CTRL_B := $D031 C65_VICIII_UNLOCK_1 = $A5 C65_VICIII_UNLOCK_2 = $96 + + +; --------------------------------------------------------------------------- +; C64 Turbo Master cartridge + +TURBOMASTER_DETECT := $BF53 + +TURBOMASTER_SPEED_REG := $00 + diff --git a/doc/c64.sgml b/doc/c64.sgml index 800314fec..98008ef41 100644 --- a/doc/c64.sgml +++ b/doc/c64.sgml @@ -180,16 +180,19 @@ url="funcref.html" name="function reference"> for declaration and usage. <item>detect_c65 <item>detect_chameleon <item>detect_scpu +<item>detect_turbomaster <item>get_c128_speed <item>get_c64dtv_speed <item>get_c65_speed <item>get_chameleon_speed <item>get_scpu_speed +<item>get_turbomaster_speed <item>set_c128_speed <item>set_c64dtv_speed <item>set_c65_speed <item>set_chameleon_speed <item>set_scpu_speed +<item>set_turbomaster_speed </itemize> diff --git a/doc/funcref.sgml b/doc/funcref.sgml index edca7745e..946b88159 100644 --- a/doc/funcref.sgml +++ b/doc/funcref.sgml @@ -73,16 +73,19 @@ function. <item><ref id="detect_c65" name="detect_c65"> <item><ref id="detect_chameleon" name="detect_chameleon"> <item><ref id="detect_scpu" name="detect_scpu"> +<item><ref id="detect_turbomaster" name="detect_turbomaster"> <item><ref id="get_c128_speed" name="get_c128_speed"> <item><ref id="get_c64dtv_speed" name="get_c64dtv_speed"> <item><ref id="get_c65_speed" name="get_c65_speed"> <item><ref id="get_chameleon_speed" name="get_chameleon_speed"> <item><ref id="get_scpu_speed" name="get_scpu_speed"> +<item><ref id="get_turbomaster_speed" name="get_turbomaster_speed"> <item><ref id="set_c128_speed" name="set_c128_speed"> <item><ref id="set_c64dtv_speed" name="set_c64dtv_speed"> <item><ref id="set_c65_speed" name="set_c65_speed"> <item><ref id="set_chameleon_speed" name="set_chameleon_speed"> <item><ref id="set_scpu_speed" name="set_scpu_speed"> +<item><ref id="set_turbomaster_speed" name="set_turbomaster_speed"> </itemize> @@ -3032,6 +3035,26 @@ used in presence of a prototype. </quote> +<sect1>detect_turbomaster<label id="detect_turbomaster"><p> + +<quote> +<descrip> +<tag/Function/Check for the presence of the C64 Turbo Master cartridge. +<tag/Header/<tt/<ref id="accelerator.h" name="accelerator.h">/ +<tag/Declaration/<tt/unsigned char detect_turbomaster (void);/ +<tag/Description/The function returns a 1 if a C64 Turbo Master cartridge has been detected. +<tag/Notes/<itemize> +<item>The function is specific to the C64. +</itemize> +<tag/Availability/cc65 (not all platforms) +<tag/See also/ +<ref id="get_turbomaster_speed" name="get_turbomaster_speed">, +<ref id="set_turbomaster_speed" name="set_turbomaster_speed">, +<tag/Example/None. +</descrip> +</quote> + + <sect1>div<label id="div"><p> <quote> @@ -3659,6 +3682,28 @@ header files define constants that can be used to check the return code. </quote> +<sect1>get_turbomaster_speed<label id="get_turbomaster_speed"><p> + +<quote> +<descrip> +<tag/Function/Get the current speed of the C64 Turbo Master cartridge. +<tag/Header/<tt/<ref id="accelerator.h" name="accelerator.h">/ +<tag/Declaration/<tt/unsigned char get_turbomaster_speed (void);/ +<tag/Description/The function returns the current speed of the C64 Turbo Master cartridge. +<tag/Notes/<itemize> +<item>The function is specific to the C64. +<item>The function does not check for the presence of the C64 Turbo master cartridge. +<item>See the accelerator.h header for the speed definitions. +</itemize> +<tag/Availability/cc65 (not all platforms) +<tag/See also/ +<ref id="detect_turbomaster" name="detect_turbomaster">, +<ref id="set_turbomaster_speed" name="set_turbomaster_speed">, +<tag/Example/None. +</descrip> +</quote> + + <sect1>get_scpu_speed<label id="get_scpu_speed"><p> <quote> @@ -6320,6 +6365,28 @@ clean-up when exitting the program. </quote> +<sect1>set_turbomaster_speed<label id="set_turbomaster_speed"><p> + +<quote> +<descrip> +<tag/Function/Set the current speed of the C64 Turbo Master cartridge. +<tag/Header/<tt/<ref id="accelerator.h" name="accelerator.h">/ +<tag/Declaration/<tt/unsigned char __fastcall__ set_turbomaster_speed (unsigned char speed);/ +<tag/Description/The function returns the speed after trying to set the speed of the C64 Turbo Master cartridge. +<tag/Notes/<itemize> +<item>The function is specific to the C64. +<item>The function does not check for the presence of the C64 Turbo Master cartridge. +<item>See the accelerator.h header for the speed definitions. +</itemize> +<tag/Availability/cc65 (not all platforms) +<tag/See also/ +<ref id="detect_turbomaster" name="detect_turbomaster">, +<ref id="get_turbomaster_speed" name="get_turbomaster_speed">, +<tag/Example/None. +</descrip> +</quote> + + <sect1>set_scpu_speed<label id="set_scpu_speed"><p> <quote> diff --git a/include/accelerator.h b/include/accelerator.h index 50ff5c35e..fdd2ebaf7 100644 --- a/include/accelerator.h +++ b/include/accelerator.h @@ -263,6 +263,47 @@ unsigned char detect_c65 (void); * 0x00 : C65/C64DX in C64 mode not present * 0x01 : C65/C64DX in C64 mode present */ + + +/* C64 Turbo Master cartridge */ + +unsigned char __fastcall__ set_turbomaster_speed (unsigned char speed); + +/* Set the speed of the Turbo Master cartridge, using SPEED_SLOW will switch to + * 1 Mhz mode, SPEED_4X or SPEED_FAST will switch to 4 Mhz mode. + * + * Note that any value higher or equal to SPEED_4X will switch to 4 Mhz mode, + * any value lower than SPEED_4X will switch to 1 Mhz mode. + * + * This function will return the actual speed the CPU is at after trying + * to set the requested speed, if the speed is different it might indicate + * that the hardware switch has locked the speed. + * + * This function does not check for the presence of a Turbo Master cartridge, + * make sure you use 'detect_turbomaster();' before using. + */ + +unsigned char get_turbomaster_speed (void); + +/* Get the speed of the Turbo Master cartridge. + * + * Possible return values: + * SPEED_SLOW : 1 Mhz mode + * SPEED_4X : 4 Mhz mode + * + * This function does not check for the presence of a Turbo Master cartridge, + * make sure you use 'detect_turbomaster();' before using. + */ + +unsigned char detect_turbomaster (void); + +/* Check for the presence of a C64 Turbo Master cartridge. + * + * Possible return values: + * 0x00 : C64 Turbo Master cartridge not present + * 0x01 : C64 Turbo Master cartridge present + */ + /* End of accelerator.h */ #endif diff --git a/libsrc/c64/acc_detect_turbomaster.s b/libsrc/c64/acc_detect_turbomaster.s new file mode 100755 index 000000000..0af9c3af7 --- /dev/null +++ b/libsrc/c64/acc_detect_turbomaster.s @@ -0,0 +1,47 @@ +; +; Marco van den Heuvel, 2018-04-30 +; + +; unsigned char detect_turbomaster (void); +; +;/* Check for the presence of a Turbo Master cartridge. +; * +; * Possible return values: +; * 0x00 : TurboMaster cartridge not present +; * 0x01 : TurboMaster cartridge present +; */ + + .export _detect_turbomaster + + .include "accelerator.inc" + +_detect_turbomaster: + lda #$00 + tax + +; Make sure the current CPU is not a 6510 + .byte $1A ; NOP on 8502, INA on 65(S)C(E)02, 4510 and 65816 + beq not_found + +; Make sure the current CPU is not a 65816 + clc + .byte $E2,$01 ; NOP #$01 on 65(S)C02, LDA $(01,S),Y on 65CE02 and 4510, SEP #$01 on 65816 + bcs not_found ; carry will be set on 65816 + +; Make sure the current CPU is not a 65CE02/4510 + .byte $A3,$A3 ; NOP NOP on 65(S)C02 and LDZ #$00 on 65CE02 and 4510 + .byte $6B ; NOP on 65(S)C02 and TZA on 65CE02 and 4510 + cmp #$A3 + beq not_found + +; Check for turbo master basic replacement + ldy TURBOMASTER_DETECT + cpy #$A2 + bne not_found +found: + lda #$01 + .byte $24 +not_found: + txa + rts + diff --git a/libsrc/c64/acc_turbomaster_speed.s b/libsrc/c64/acc_turbomaster_speed.s new file mode 100755 index 000000000..679003b03 --- /dev/null +++ b/libsrc/c64/acc_turbomaster_speed.s @@ -0,0 +1,63 @@ +; +; Marco van den Heuvel, 2018-04-30 +; + +; unsigned char __fastcall__ set_turbomaster_speed (unsigned char speed); +; +;/* Set the speed of the Turbo Master cartridge, using SPEED_SLOW will switch to +; * 1 Mhz mode, SPEED_4X or SPEED_FAST will switch to 4 Mhz mode. +; * +; * Note that any value higher or equal to SPEED_4X will switch to 4 Mhz mode, +; * any value lower than SPEED_4X will switch to 1 Mhz mode. +; * +; * This function will return the actual speed the CPU is at after trying +; * to set the requested speed, if the speed is different it might indicate +; * that the hardware switch has locked the speed. +; * +; * This function does not check for the presence of a Turbo Master cartridge, +; * make sure you use 'detect_turbomaster();' before using. +; */ + +; unsigned char get_turbomaster_speed (void); +; +;/* Get the speed of the Turbo Master cartridge. +; * +; * Possible return values: +; * SPEED_SLOW : 1 Mhz mode +; * SPEED_4X : 4 Mhz mode +; * +; * This function does not check for the presence of a Turbo Master cartridge, +; * make sure you use 'detect_turbomaster();' before using. +; */ + + .export _set_turbomaster_speed + .export _get_turbomaster_speed + + .include "accelerator.inc" + +_set_turbomaster_speed: + tay + lda TURBOMASTER_SPEED_REG + cpy #SPEED_4X + bcs high_speed +low_speed: + and #$7F +store_speed: + sta TURBOMASTER_SPEED_REG + jmp _get_turbomaster_speed + +high_speed: + ora #$80 + bne store_speed + + +_get_turbomaster_speed: + ldx #$00 + lda TURBOMASTER_SPEED_REG + and #$80 + beq is_slow_speed +is_high_speed: + lda #SPEED_4X +is_slow_speed: + rts + diff --git a/testcode/lib/accelerator/Makefile b/testcode/lib/accelerator/Makefile index 9ff4d96b4..6b90a9556 100644 --- a/testcode/lib/accelerator/Makefile +++ b/testcode/lib/accelerator/Makefile @@ -2,7 +2,7 @@ CL ?= cl65 all: c64-scpu-test.prg c128-scpu-test.prg c64dtv-test.prg \ c64-c128-test.prg c128-test.prg chameleon-test.prg \ - c65-test.prg + c65-test.prg turbomaster-test.prg c64-scpu-test.prg: c64-c128-scpu-test.c $(CL) -t c64 c64-c128-scpu-test.c -o c64-scpu-test.prg @@ -24,3 +24,6 @@ chameleon-test.prg: chameleon-test.c c65-test.prg: c65-test.c $(CL) -t c64 c65-test.c -o c65-test.prg + +turbomaster-test.prg: turbomaster-test.c + $(CL) -t c64 turbomaster-test.c -o turbomaster-test.prg