A2osX/BIN/ACC.S.txt

236 lines
11 KiB
Plaintext
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

NEW
AUTO 3,1
.LIST OFF
.OP 65C02
.OR $2000
.TF bin/acc
*/-------------------------------------
* # 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.
*\-------------------------------------
.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
>LDYA L.MSG.FAST ; push address for fast mode message
>SYSCALL PutS ; print fast mode msg
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
>LDYA L.MSG.SLOW ; push address for slow mode message
>SYSCALL PutS ; print slow mode message
jsr CS.RUN.SetSlowMode ; call slow mode routine
jmp .99 ; jump to successful exit
*--- Display usage and error out ------
.9
>LDYA L.MSG.USAGE ; push address for usage text
>SYSCALL PutS ; print usage message
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
*--------------------------------------
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"
*--------------------------------------
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