antoine-source/misc/iigsaccelerators.s
2024-09-15 22:10:33 +02:00

182 lines
3.4 KiB
ArmAsm

*
* Apple IIgs accelerators
* Set 2.8MHz & Restore speed
*
* (c) 2024, Brutal Deluxe Software
*
org $1000
mx %00
lst off
*----------------------------------------
* Accelerators
* Applesqueezer
* Transwarp GS
* ZipGSX (+ KEGS, Sweet16)
*
* In full 16-bits
* set28SPEED
* identifies the accelerator
* set the closest speed to 2.8MHz
*
* restoreSPEED
* set the previous or highest speed
*----------------------------------------
*----------------------------------------
* EQUATES
*----------------------------------------
*-------------- Applesqueezer
* Niek says: "These 5 settings correspond to the 5 speed options in
* the AppleSqueezer control panel.
* 255 is the fastest setting corresponding to 14MHz. and
* 223 is the slowest setting, corresponding to 3MHz
* Possible values are 255, 251, 247, 239, and 223.
FL_IDLE = $e2000a
FL_VERSION = $e2000c
SET_SPEED = $e50000
*-------------- Transwarp GS
* Possible values: 1000 (1MHz), 2600 (2.6MHz), 7000 (7MHz)
GetCurSpeed = $bcff20 ; value returned in A
SetCurSpeed = $bcff24 ; value passed in A
* or, if your prefer indexes: 0 (1MHz), 1 (2.6MHz), 2 (7MHz)
GetICurSpeed = $bcff28 ; value returned in X
SetICurSpeed = $bcff2c ; value passed in X
*-------------- ZipGS
* Sixteen possible speeds (in % of full speed)
* 0: full speed, 4: 75% of full speed, 8: 50%, 12: 25%, 16: 1MHz (disabled)
* Set the value in bits 4-7 of CLRAN2
SETAN0 = $e0c058
CLRAN0 = $e0c059
SETAN1 = $e0c05a
CLRAN1 = $e0c05b
SETAN2 = $e0c05c
CLRAN2 = $e0c05d
SETAN3 = $e0c05e
CLRAN3 = $e0c05f
*----------------------------------------
* SAVE SPEED & SET 2.8MHz
*----------------------------------------
* Entry in full 16-bits
set28SPEED sep #$20 ; Check Applesqueezer
ldal FL_IDLE ; do we have an AS?
and #$ff
cmp #1
bne no_AS ; no AS present
* ldal SET_SPEED ; get current speed
* sta accSPEED ; save it
lda #233 ; set 3.10MHz
stal SET_SPEED ; the closest match
rep #$20
lda #1 ; tell we have an AS acc
sta theACC
rts
mx %10
no_AS rep #$20 ; Check Transwarp IIgs
ldal $bcff00 ; do we have a TWGS?
cmp #'TW'
bne no_TW
ldal $bcff02
cmp #'GS'
bne no_TW ; no TWGS present
jsl GetCurSpeed ; get current speed
sta accSPEED ; save it
lda #2600 ; set 2.6MHz
jsr SetCurSpeed ; the closest match
lda #2
sta theACC ; tell we have a TWGS
rts
no_TW sep #$20 ; Check ZipGSX
lda #$5a ; unlock
stal SETAN1
stal SETAN1
stal SETAN1
stal SETAN1
ldal CLRAN0 ; do we have a ZipGS?
eor #$f8
sta temp
stal CLRAN0
ldal CLRAN0
cmp temp
bne no_ACC ; no ZipGS present
eor #$f8
stal CLRAN0
lda #%1010_0000 ; #$10-#$6th option (3.10MHz) or #%1011_0000 for 2.56MHz
stal CLRAN2 ; set speed
stal CLRAN1 ; enable card
lda #$a5 ; lock
stal SETAN1
lda #3
sta theACC ; tell we have a ZipGS
no_ACC rep #$20
rts
*----------------------------------------
* RESTORE ORIGINAL SPEED
*----------------------------------------
* Entry in full 16-bits
restoreSPEED lda theACC ; Applesqueezer?
cmp #1
bne check_TW
sep #$20
lda accSPEED
stal SET_SPEED
rep #$20
rts
check_TW cmp #2 ; Transwarp GS?
bne check_ZIP
lda accSPEED ; restore speed
jsl SetCurSpeed
rts
check_ZIP cmp #3 ; ZipGSX?
bne check_NADA
sep #$20 ; restore speed
lda #$5a ; unlock
stal SETAN1
stal SETAN1
stal SETAN1
stal SETAN1
lda #%0000_0000 ; any write to set fastest speed
stal CLRAN2
stal CLRAN1
lda #$a5 ; lock
stal SETAN1
rep #$20
check_NADA rts
*-------------- Data
theACC ds 2 ; 1:AS / 2:TW / 3:ZIP
accSPEED ds 2
*-------------- End of code