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..5797cb36c 100644 --- a/include/accelerator.h +++ b/include/accelerator.h @@ -174,6 +174,58 @@ extern unsigned char detect_c128 (void); * 0x01 : C128 CPU is the current CPU */ + +/* C64 Chameleon cartridge */ + +extern 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. + */ + +extern 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. +; */ + +extern 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/c64/acc_chameleon_speed.s b/libsrc/c64/acc_chameleon_speed.s new file mode 100755 index 000000000..0e3e1320f --- /dev/null +++ b/libsrc/c64/acc_chameleon_speed.s @@ -0,0 +1,100 @@ +; +; Marco van den Heuvel, 2018-04-25 +; + +; extern 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. +; */ + +; extern 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..4b90c6ea9 --- /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 $2C +not_found: + lda #$00 + rts + 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..5797cb36c 100644 --- a/include/accelerator.h +++ b/include/accelerator.h @@ -174,6 +174,58 @@ extern unsigned char detect_c128 (void); * 0x01 : C128 CPU is the current CPU */ + +/* C64 Chameleon cartridge */ + +extern 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. + */ + +extern 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. +; */ + +extern 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/c64/acc_chameleon_speed.s b/libsrc/c64/acc_chameleon_speed.s new file mode 100755 index 000000000..0e3e1320f --- /dev/null +++ b/libsrc/c64/acc_chameleon_speed.s @@ -0,0 +1,100 @@ +; +; Marco van den Heuvel, 2018-04-25 +; + +; extern 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. +; */ + +; extern 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..4b90c6ea9 --- /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 $2C +not_found: + lda #$00 + rts + 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..5797cb36c 100644 --- a/include/accelerator.h +++ b/include/accelerator.h @@ -174,6 +174,58 @@ extern unsigned char detect_c128 (void); * 0x01 : C128 CPU is the current CPU */ + +/* C64 Chameleon cartridge */ + +extern 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. + */ + +extern 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. +; */ + +extern 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/c64/acc_chameleon_speed.s b/libsrc/c64/acc_chameleon_speed.s new file mode 100755 index 000000000..0e3e1320f --- /dev/null +++ b/libsrc/c64/acc_chameleon_speed.s @@ -0,0 +1,100 @@ +; +; Marco van den Heuvel, 2018-04-25 +; + +; extern 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. +; */ + +; extern 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..4b90c6ea9 --- /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 $2C +not_found: + lda #$00 + rts + 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..5797cb36c 100644 --- a/include/accelerator.h +++ b/include/accelerator.h @@ -174,6 +174,58 @@ extern unsigned char detect_c128 (void); * 0x01 : C128 CPU is the current CPU */ + +/* C64 Chameleon cartridge */ + +extern 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. + */ + +extern 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. +; */ + +extern 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/c64/acc_chameleon_speed.s b/libsrc/c64/acc_chameleon_speed.s new file mode 100755 index 000000000..0e3e1320f --- /dev/null +++ b/libsrc/c64/acc_chameleon_speed.s @@ -0,0 +1,100 @@ +; +; Marco van den Heuvel, 2018-04-25 +; + +; extern 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. +; */ + +; extern 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..4b90c6ea9 --- /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 $2C +not_found: + lda #$00 + rts + 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..5797cb36c 100644 --- a/include/accelerator.h +++ b/include/accelerator.h @@ -174,6 +174,58 @@ extern unsigned char detect_c128 (void); * 0x01 : C128 CPU is the current CPU */ + +/* C64 Chameleon cartridge */ + +extern 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. + */ + +extern 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. +; */ + +extern 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/c64/acc_chameleon_speed.s b/libsrc/c64/acc_chameleon_speed.s new file mode 100755 index 000000000..0e3e1320f --- /dev/null +++ b/libsrc/c64/acc_chameleon_speed.s @@ -0,0 +1,100 @@ +; +; Marco van den Heuvel, 2018-04-25 +; + +; extern 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. +; */ + +; extern 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..4b90c6ea9 --- /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 $2C +not_found: + lda #$00 + rts + 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..5797cb36c 100644 --- a/include/accelerator.h +++ b/include/accelerator.h @@ -174,6 +174,58 @@ extern unsigned char detect_c128 (void); * 0x01 : C128 CPU is the current CPU */ + +/* C64 Chameleon cartridge */ + +extern 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. + */ + +extern 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. +; */ + +extern 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/c64/acc_chameleon_speed.s b/libsrc/c64/acc_chameleon_speed.s new file mode 100755 index 000000000..0e3e1320f --- /dev/null +++ b/libsrc/c64/acc_chameleon_speed.s @@ -0,0 +1,100 @@ +; +; Marco van den Heuvel, 2018-04-25 +; + +; extern 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. +; */ + +; extern 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..4b90c6ea9 --- /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 $2C +not_found: + lda #$00 + rts + 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..5797cb36c 100644 --- a/include/accelerator.h +++ b/include/accelerator.h @@ -174,6 +174,58 @@ extern unsigned char detect_c128 (void); * 0x01 : C128 CPU is the current CPU */ + +/* C64 Chameleon cartridge */ + +extern 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. + */ + +extern 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. +; */ + +extern 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/c64/acc_chameleon_speed.s b/libsrc/c64/acc_chameleon_speed.s new file mode 100755 index 000000000..0e3e1320f --- /dev/null +++ b/libsrc/c64/acc_chameleon_speed.s @@ -0,0 +1,100 @@ +; +; Marco van den Heuvel, 2018-04-25 +; + +; extern 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. +; */ + +; extern 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..4b90c6ea9 --- /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 $2C +not_found: + lda #$00 + rts + 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"