Added C64 Chameleon accelerator code and documentation.
This commit is contained in:
100
libsrc/c64/acc_chameleon_speed.s
Executable file
100
libsrc/c64/acc_chameleon_speed.s
Executable file
@@ -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
|
||||
|
||||
39
libsrc/c64/acc_detect_chameleon.s
Executable file
39
libsrc/c64/acc_detect_chameleon.s
Executable 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 $2C
|
||||
not_found:
|
||||
lda #$00
|
||||
rts
|
||||
|
||||
Reference in New Issue
Block a user