2020-12-15 13:23:22 +00:00
|
|
|
|
NEW
|
|
|
|
|
AUTO 3,1
|
|
|
|
|
.LIST OFF
|
|
|
|
|
.OP 65C02
|
|
|
|
|
.OR $2000
|
|
|
|
|
.TF bin/acc
|
2021-05-24 12:55:23 +00:00
|
|
|
|
*/-------------------------------------
|
|
|
|
|
* # ACC
|
|
|
|
|
* Set behavior of accelerator module.
|
|
|
|
|
* Works with ZipChip, RocketChip,
|
|
|
|
|
* and TransWarp.
|
|
|
|
|
*
|
|
|
|
|
* ## Arguments
|
|
|
|
|
* **-F**
|
|
|
|
|
* Sets accelerator to run in FAST mode.
|
|
|
|
|
*
|
|
|
|
|
* **-S**
|
|
|
|
|
* Sets accelerator to run at normal
|
|
|
|
|
* Apple II speed (SLOW mode).
|
|
|
|
|
*
|
|
|
|
|
* ## Return Value
|
|
|
|
|
* Code does not detect if any accelerator
|
|
|
|
|
* exists, thus return value is limited to
|
|
|
|
|
* whether or not a valid argument was
|
|
|
|
|
* given.
|
|
|
|
|
*\-------------------------------------
|
2020-12-15 13:23:22 +00:00
|
|
|
|
.INB inc/macros.i
|
|
|
|
|
.INB inc/a2osx.i
|
|
|
|
|
*--------------------------------------
|
|
|
|
|
* Zero Page Segment, up to 32 bytes
|
|
|
|
|
*--------------------------------------
|
|
|
|
|
.DUMMY
|
|
|
|
|
.OR ZPBIN
|
|
|
|
|
ZS.START
|
|
|
|
|
ZPPtr1 .BS 2 ; address pointer (used in arg parsing)
|
|
|
|
|
ArgIndex .BS 1 ; index offset for argument parsing
|
|
|
|
|
bFast .BS 1 ; arg variable - fast mode if = 1
|
|
|
|
|
bSlow .BS 1 ; arg variable - slow mode if = 1
|
|
|
|
|
ZS.END .ED
|
|
|
|
|
*--------------------------------------
|
|
|
|
|
* File Header (16 Bytes)
|
|
|
|
|
*--------------------------------------
|
|
|
|
|
CS.START cld
|
|
|
|
|
jmp (.1,x)
|
|
|
|
|
.DA #$61 ; 6502,Level 1 (65c02)
|
|
|
|
|
.DA #1 ; BIN Layout Version 1
|
|
|
|
|
.DA #0 ; Events disabled (enable with S.PS.F.EVENT)
|
|
|
|
|
.DA #0
|
|
|
|
|
.DA CS.END-CS.START ; Code Size (without Constants)
|
|
|
|
|
.DA DS.END-DS.START ; Data SegmentSize
|
|
|
|
|
.DA #32 ; Stack Size
|
|
|
|
|
.DA #ZS.END-ZS.START ; Zero Page Size
|
|
|
|
|
.DA 0
|
|
|
|
|
*--------------------------------------
|
|
|
|
|
* Relocation Table
|
|
|
|
|
*--------------------------------------
|
|
|
|
|
.1 .DA CS.INIT
|
|
|
|
|
.DA CS.RUN
|
|
|
|
|
.DA CS.DOEVENT
|
|
|
|
|
.DA CS.QUIT
|
|
|
|
|
L.MSG.USAGE .DA MSG.USAGE ; msg for usage / help text
|
|
|
|
|
L.MSG.FAST .DA MSG.MSG.FAST ; msg for saying fast mode is enabled
|
|
|
|
|
L.MSG.SLOW .DA MSG.MSG.SLOW ; msg for saying slow mode is enabled
|
|
|
|
|
.DA 0
|
|
|
|
|
*--------------------------------------
|
|
|
|
|
* Called once at process creation
|
|
|
|
|
* Put code for loading LIB here
|
|
|
|
|
*--------------------------------------
|
|
|
|
|
CS.INIT clc ; nothing to init, so just clc and return
|
|
|
|
|
rts
|
|
|
|
|
*--------------------------------------
|
|
|
|
|
* Called until exit with CS
|
|
|
|
|
* if RUN exits with CC, RN entered again
|
|
|
|
|
*--------------------------------------
|
|
|
|
|
CS.RUN
|
|
|
|
|
.1 inc ArgIndex ; Check next argument
|
|
|
|
|
lda ArgIndex
|
|
|
|
|
>SYSCALL ArgV ; check for an arg at index in A
|
|
|
|
|
bcs .4 ; If doesn't exist, we're done with args
|
|
|
|
|
|
|
|
|
|
>STYA ZPPtr1 ; ArgV pointer was in Y,A so stick into ZPPtr1
|
|
|
|
|
lda (ZPPtr1)
|
|
|
|
|
cmp #'-' ; does arg have a hyphen?
|
|
|
|
|
bne .9 ; no, we're done as we don't use any non-hyphened args
|
|
|
|
|
|
|
|
|
|
jsr CS.RUN.CheckOpt ; if it had a hyphen, check and set arg if recognized
|
|
|
|
|
bcc .1 ; if we recognized the arg, then loop again to check next
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
*--- Fast Mode Test -------------------
|
|
|
|
|
.4
|
|
|
|
|
bit bFast ; did they want us to switch to fast mode?
|
|
|
|
|
bpl .5 ; no, so go check next possibility
|
2022-11-02 06:54:30 +00:00
|
|
|
|
|
|
|
|
|
>LDYA L.MSG.FAST ; push address for fast mode message
|
|
|
|
|
>SYSCALL PutS ; print fast mode msg
|
2020-12-15 13:23:22 +00:00
|
|
|
|
jsr CS.RUN.SetFastMode ; call fast mode routine
|
|
|
|
|
jmp .99 ; jump to successful exit
|
|
|
|
|
|
|
|
|
|
*--- Slow mode test -------------------
|
|
|
|
|
.5
|
|
|
|
|
bit bSlow ; did they want us to switch to slow mode?
|
|
|
|
|
bpl .9 ; no, so go display usage
|
2022-11-02 06:54:30 +00:00
|
|
|
|
>LDYA L.MSG.SLOW ; push address for slow mode message
|
|
|
|
|
>SYSCALL PutS ; print slow mode message
|
2020-12-15 13:23:22 +00:00
|
|
|
|
jsr CS.RUN.SetSlowMode ; call slow mode routine
|
|
|
|
|
jmp .99 ; jump to successful exit
|
|
|
|
|
|
|
|
|
|
*--- Display usage and error out ------
|
|
|
|
|
.9
|
2022-11-02 06:54:30 +00:00
|
|
|
|
>LDYA L.MSG.USAGE ; push address for usage text
|
|
|
|
|
>SYSCALL PutS ; print usage message
|
2020-12-15 13:23:22 +00:00
|
|
|
|
lda #E.SYN ; set OS return code as Syntax Error
|
|
|
|
|
sec ; indicate we don't want CS.RUN called again
|
|
|
|
|
rts ; return to OS
|
|
|
|
|
|
|
|
|
|
*--- Successful exit ------------------
|
|
|
|
|
.99
|
|
|
|
|
lda #0 ; set OS return code to success
|
|
|
|
|
sec ; indicate we don't want CS.RUN called again
|
|
|
|
|
rts ; return to OS
|
|
|
|
|
*--------------------------------------
|
|
|
|
|
* Called if option S.PS.F.EVENT enabled in Header
|
|
|
|
|
* Timer Event : every 10th seconds
|
|
|
|
|
*--------------------------------------
|
|
|
|
|
CS.DOEVENT sec ; we don't use this since we don't have timer events
|
|
|
|
|
rts
|
|
|
|
|
*--------------------------------------
|
|
|
|
|
* Called once, when RUN exited with CS
|
|
|
|
|
* Put code for unloading LIB here
|
|
|
|
|
*--------------------------------------
|
|
|
|
|
CS.QUIT clc ; nothing to do on exit except clear carry and return
|
|
|
|
|
rts
|
|
|
|
|
*--------------------------------------
|
|
|
|
|
* CheckOpt assumes a set ZPPtr1 which is the address of the command line argument being examined.
|
|
|
|
|
* We start at 1 to look past the '-' as position 0 since that was checked by the caller.
|
|
|
|
|
* OptionList is a list of possible options and each character correlates with a memory offset
|
|
|
|
|
* in OptionVars, which are only one byte since they are in ZP but this also allows for us to
|
|
|
|
|
* simply use indexed addressing to reference them easily as well instead of doing 16-bit
|
|
|
|
|
* address juggling.
|
|
|
|
|
* The options are checked in reverse from end-to-start and indexed by X.
|
|
|
|
|
*--------------------------------------
|
|
|
|
|
CS.RUN.CheckOpt ldy #1 ; set up y to look at second character of passed in arg
|
|
|
|
|
lda (ZPPtr1),y ; check second character of passed in argument into A
|
|
|
|
|
ldx #OptionVars-OptionList-1 ; clever way to put size of OptionList into X
|
|
|
|
|
|
|
|
|
|
.2 cmp OptionList,x ; compare the arg we got to the OptionList at X
|
|
|
|
|
beq .3 ; if it is a match, go handle it.
|
|
|
|
|
dex ; if not, decrement so we can check next OptionList
|
|
|
|
|
bpl .2 ; if we haven't reached end of OptionList, go check next
|
|
|
|
|
sec ; set carry if we didn't find a match
|
|
|
|
|
rts ; return to caller
|
|
|
|
|
|
|
|
|
|
.3 ldy OptionVars,x ; since we matched, find ZP addr of matching option into Y
|
|
|
|
|
lda #$ff ; we will set this ZP option to $FF
|
|
|
|
|
sta 0,y ; store A into the ZP address we have in Y
|
|
|
|
|
clc ; clear carry since we found a match
|
|
|
|
|
rts ; return to caller
|
|
|
|
|
*--------------------------------------
|
|
|
|
|
* CS.RUN.SetFastMode
|
|
|
|
|
* Calls a few different ways to enable accelerators, mainly ZipChip, Titan, and TransWarp.
|
|
|
|
|
* However, it also works for RocketChip as well.
|
|
|
|
|
* The first one (using $C05C) came from some documentation, but not sure which accelerator uses it.
|
|
|
|
|
*--------------------------------------
|
|
|
|
|
CS.RUN.SetFastMode
|
|
|
|
|
sta $C05C ; not sure which accelerator follows this? Not RC at least..
|
|
|
|
|
|
|
|
|
|
* lda #$05 ; enable Titan Accelerator //e fast mode
|
|
|
|
|
* sta $C086 ; by storing $05 to $C086
|
|
|
|
|
|
|
|
|
|
lda #$5A ; unlock ZipChip so we can configure it
|
|
|
|
|
sta $C05A ; by storing $5A into $C05A 4 times
|
|
|
|
|
sta $C05A ; to trigger the unlock latch
|
|
|
|
|
sta $C05A
|
|
|
|
|
sta $C05A
|
|
|
|
|
|
|
|
|
|
lda #0 ; enable ZipChip fast mode by storing #0
|
|
|
|
|
sta $C05B ; into $C05B
|
|
|
|
|
|
|
|
|
|
lda #$A5 ; lock ZipChip to prevent more configs
|
|
|
|
|
sta $C05A ; by setting $C05A to $A5
|
|
|
|
|
|
|
|
|
|
lda #0 ; enable TransWarp fast mode by storing #0
|
|
|
|
|
sta $C074 ; into $C074
|
|
|
|
|
|
|
|
|
|
rts
|
|
|
|
|
*--------------------------------------
|
|
|
|
|
* CS.RUN.SetSlowMode
|
|
|
|
|
* Calls a few different ways to disable accelerators, mainly ZipChip, Titan, and TransWarp.
|
|
|
|
|
* However, it also works for RocketChip as well.
|
|
|
|
|
* The first one (using $C05C) came from some documentation, but not sure which accelerator uses it.
|
|
|
|
|
*--------------------------------------
|
|
|
|
|
CS.RUN.SetSlowMode
|
|
|
|
|
sta $C05D ; not sure which accelerator follows this? Not RC at least..
|
|
|
|
|
|
|
|
|
|
* lda #$01 ; enable Titan Accelerator //e slow mode
|
|
|
|
|
* sta $C086 ; by storing $01 to $C086
|
|
|
|
|
|
|
|
|
|
lda #$5A ; unlock ZipChip so we can configure it
|
|
|
|
|
sta $C05A ; by storing $5A into $C05A 4 times
|
|
|
|
|
sta $C05A ; to trigger the unlock latch
|
|
|
|
|
sta $C05A
|
|
|
|
|
sta $C05A
|
|
|
|
|
|
|
|
|
|
lda #0 ; disable ZipChip acceleration by setting location
|
|
|
|
|
sta $C05A ; $C05A to #0
|
|
|
|
|
|
|
|
|
|
lda #$A5 ; lock ZipChip to prevent more configs
|
|
|
|
|
sta $C05A ; by setting $C05A to $A5
|
|
|
|
|
|
|
|
|
|
lda #1 ; disable TransWarp acceleration by storing #1
|
|
|
|
|
sta $C074 ; into $C074
|
|
|
|
|
rts
|
|
|
|
|
*--------------------------------------
|
|
|
|
|
CS.END
|
|
|
|
|
*--------------------------------------
|
2022-11-02 06:54:30 +00:00
|
|
|
|
MSG.USAGE .CS "Usage : ACC\r\n"
|
|
|
|
|
.CS " -F : Fast speed\r\n"
|
|
|
|
|
.CZ " -S : Slow speed\r\n"
|
|
|
|
|
MSG.MSG.FAST .CZ "FAST mode enabled"
|
|
|
|
|
MSG.MSG.SLOW .CZ "SLOW mode enabled"
|
2020-12-15 13:23:22 +00:00
|
|
|
|
*--------------------------------------
|
|
|
|
|
OptionList .AS "FfSs"
|
|
|
|
|
OptionVars .DA #bFast,#bFast,#bSlow,#bSlow
|
|
|
|
|
*--------------------------------------
|
|
|
|
|
* Per Process DATA segment (0 filled before INIT)
|
|
|
|
|
*--------------------------------------
|
|
|
|
|
.DUMMY
|
|
|
|
|
.OR 0
|
|
|
|
|
DS.START
|
|
|
|
|
DS.END .ED
|
|
|
|
|
*--------------------------------------
|
|
|
|
|
MAN
|
|
|
|
|
SAVE usr/src/bin/acc.s
|
|
|
|
|
ASM
|