Merge pull request #631 from blackystardust/master

Added C64 Chameleon accelerator code and documentation.
This commit is contained in:
Oliver Schmidt
2018-04-27 20:47:03 +02:00
committed by GitHub
12 changed files with 303 additions and 18 deletions

View File

@@ -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.
; *

View File

@@ -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.
; *

View File

@@ -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.
; *

100
libsrc/c64/acc_chameleon_speed.s Executable file
View File

@@ -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

View File

@@ -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

View File

@@ -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.
; *