Another Bunch of fixes

This commit is contained in:
Rémy GIBERT 2015-03-14 22:48:35 +01:00
parent f34e2b5f7c
commit c04970fa55
49 changed files with 13760 additions and 13013 deletions

View File

@ -8,26 +8,25 @@ AUTO 6
*--------------------------------------
* **** START OF A2osX Global Page ****
*--------------------------------------
A2osX.GP.start .EQ *
A2osX.GP.B.start
.PH $BE00
*--------------------------------------
.PH $300
*--------------------------------------
A2osX.GP bra A2osX.SYSCALL3
bra A2osX.MLICALL3
bra A2osX.LIBCALL3
bra A2osX.SLEEP3
bra Kernel.MLICALL3
bra Kernel.DRVCALL3
bra Kernel.BINCALL3
bra Kernel.LIBCALL3
.BS A2osX.300CODE-*
A2osX.GP.Start bra A2osX.SYSCALL1
bra A2osX.MLICALL1
bra A2osX.LIBCALL1
bra A2osX.SLEEP1
bra Kernel.MLICALL1
bra Kernel.DRVCALL1
bra Kernel.BINCALL1
bra Kernel.LIBCALL1
.BS A2osX.GPCODE-*
*--------------------------------------
* A2osX.SYSCALL (MAINLC to AUXLC)
* In:
* X = SYSfnc.Index
* Y,A = free for Inline param
*--------------------------------------
A2osX.SYSCALL3 jsr GO.AUXLC
A2osX.SYSCALL1 jsr GO.AUXLC
jsr $E003
jsr GO.MAINLC
rts
@ -37,7 +36,7 @@ A2osX.SYSCALL3 jsr GO.AUXLC
* X = MLI Function
* A = Param Count
*--------------------------------------
A2osX.MLICALL3 stx .1
A2osX.MLICALL1 stx .1
sta MLICALL.PARAMS
jsr MLI
.1 .BS 1
@ -50,7 +49,7 @@ A2osX.MLICALL3 stx .1
* X = LIBfnc.Index
* A = free for Inline param
*--------------------------------------
A2osX.LIBCALL3 pha
A2osX.LIBCALL1 pha
phx
tya
>SYSCALL SYS.GetMemPtrA
@ -59,7 +58,7 @@ A2osX.LIBCALL3 pha
pla
.1 jmp $FFFF
*--------------------------------------
A2osX.SLEEP3 jmp A2osX.SLEEP31
A2osX.SLEEP1 jmp A2osX.SLEEP2
*--------------------------------------
* SLEEP (MAINLC to AUXLC)
* In:
@ -69,8 +68,8 @@ A2osX.SLEEP3 jmp A2osX.SLEEP31
* X = MLI Function
* A = Param Count
*--------------------------------------
Kernel.MLICALL3 jsr GO.MAINLC
jsr A2osX.MLICALL3
Kernel.MLICALL1 jsr GO.MAINLC
jsr A2osX.MLICALL1
jsr GO.AUXLC
rts
*--------------------------------------
@ -79,9 +78,9 @@ Kernel.MLICALL3 jsr GO.MAINLC
* X = DRV Function Index
* Y,A = pDevContext
*--------------------------------------
Kernel.DRVCALL3 jsr GO.MAINLC
Kernel.DRVCALL1 jsr GO.MAINLC
>STYA pDevContext
jsr Kernel.JMP3
jsr GO.Kernel
jsr GO.AUXLC
rts
*--------------------------------------
@ -90,9 +89,9 @@ Kernel.DRVCALL3 jsr GO.MAINLC
* X = BIN Function Index
* Y,A = pPsContext
*--------------------------------------
Kernel.BINCALL3 jsr GO.MAINLC
Kernel.BINCALL1 jsr GO.MAINLC
>STYA pPsContext
jsr Kernel.JMP3
jsr GO.Kernel
jsr GO.AUXLC
rts
*--------------------------------------
@ -100,13 +99,11 @@ Kernel.BINCALL3 jsr GO.MAINLC
* In:
* X = Lib Function Index
*--------------------------------------
Kernel.LIBCALL3 jsr GO.MAINLC
jsr Kernel.JMP3
Kernel.LIBCALL1 jsr GO.MAINLC
jsr GO.Kernel
jsr GO.AUXLC
rts
*--------------------------------------
Kernel.JMP3 jmp (Kernel.JMP)
*--------------------------------------
GO.MAINLC php
clc
bra GO.SAVE.REG
@ -127,34 +124,39 @@ GO.SAVE.REG sta A2osX.SaveA
sty GO.EXIT.JMP+2
sei
ldy R.SP
tsx
stx A2osX.SaveS
bcs GO.AUXLC1
GO.MAINLC1 stx CLRALTZP
GO.MAINLC1 tsx
stx A2osX.SaveSX
stx CLRALTZP
ldx RROMBNK2
ldx A2osX.SaveS
ldx A2osX.SaveSM
txs
sty R.SP
bra GO.EXIT
*--------------------------------------
GO.AUXLC1 stx SETALTZP
ldx RRAMWRAMBNK2
ldx RRAMWRAMBNK2
ldx A2osX.SaveS
GO.AUXLC1 tsx
stx A2osX.SaveSM
stx SETALTZP
ldx RRAMWRAMBNK1
ldx RRAMWRAMBNK1
ldx A2osX.SaveSX
txs
sty R.SP
*--------------------------------------
GO.EXIT pha push P on stack
ldy A2osX.SaveY
ldx A2osX.SaveX
lda A2osX.SaveA
plp
GO.EXIT.JMP jmp $FFFF
*--------------------------------------
A2osX.SLEEP31 ldy #S.PS.hCS
GO.Reset jsr GO.AUXLC
jsr $E000
*--------------------------------------
GO.Kernel jmp (Kernel.JMP)
*--------------------------------------
A2osX.SLEEP2 ldy #S.PS.hCS
lda (pPsContext),y
>SYSCALL SYS.GetMemPtrA
>STYA Kernel.JMP
@ -175,10 +177,11 @@ A2osX.SLEEP31 ldy #S.PS.hCS
clc No error,
rts back to Kernel
*--------------------------------------
A2osX.GP.End .EQ *
A2osX.GP.SIZE .EQ A2osX.GP.END-A2osX.GP.START
.BS A2osX.GP.START+$100-*
.EP
*--------------------------------------
A2osX.GP.End
*--------------------------------------
MAN
SAVE A2OSX.S.GP
LOAD A2OSX.S

212
A2osX.S.QC.txt Normal file
View File

@ -0,0 +1,212 @@
PR#3
PREFIX /DATA/A2OSX
NEW
INC 1
AUTO 6
.LIST OFF
.OP 65C02
*--------------------------------------
* ****** START OF MLI QUIT CODE ******
* Load Address :$1000-$11FF
* setup $BE00 Global page :
* Copy from $1200 to $BE00
*--------------------------------------
MLIOPEN01.PATH .EQ $200
MLIOPEN01.BUFF .EQ $0C00 1k Buffer for MLI open
MLIREAD01.ADDR .EQ $2000 for loading kernel.bin before moving to LC1
*--------------------------------------
A2osX.QC.B.Start
.PH $1000
*--------------------------------------
A2osX.QC.Start .EQ *
A2osX.QC cld
jmp A2osX.QC.init
A2osX.QC.Prefix .BS 32
*--------------------------------------
A2osX.QC.init bit RROMBNK1
>LDYAI A2osX.QC
>STYA POWERUP
jsr SETPWRC
ldx #$17
.1 stz MEMTABL,x Reset ProDOS memory bitmap
dex
bpl .1
lda #$CF protect zero page, stack and page 1
sta MEMTABL
lda #$03
sta MEMTABL+$17 protect ProDOS & A2osX global page
lda #$8C Reset 80 col screen ($0C=FF=HOME)
jsr $C300
>LDAXI MSG.STAGE1
jsr A2osX.QC.PrintAX
ldx #0
.2 lda $1200,x Setup Global Page
sta $BE00,x
inx
bne .2
.3 jsr MLI
.DA #MLISETPREFIX
.DA MLISETPREFIX01
bcc .4
>LDAXI MSG.SETPREFIXKO
jsr A2osX.QC.PrintAX
>LDAXI A2osX.QC.Prefix
jsr A2osX.QC.PrintAX
>DEBUG
bra .3
.4 >LDAXI MSG.SETPREFIXOK
jsr A2osX.QC.PrintAX
>LDAXI MSG.KLOADING
jsr A2osX.QC.PrintAX
jsr A2osX.QC.KLoad
bcs .9
>LDAXI MSG.KLOADING.OK
jsr A2osX.QC.PrintAX
>LDYAI GO.Reset
>STYA POWERUP
jsr SETPWRC
php
pla
sei
tsx
stx A2osX.SaveSM
stx SETALTZP
ldx A2osX.SaveSX
txs
bit RRAMWRAMBNK1
bit RRAMWRAMBNK1
pha
plp
jmp $E000
.9 >LDAXI MSG.KLOADING.KO
jsr A2osX.QC.PrintAX
bra *
*--------------------------------------
A2osX.QC.KLoad ldx A2osX.QC.Prefix
.1 lda A2osX.QC.Prefix,x
sta MLIOPEN01.PATH,x
dex
bne .1
ldx A2osX.QC.Prefix
ldy #0
.2 lda SYSKERNEL+1,y
sta MLIOPEN01.PATH+1,x
inx
iny
cpy SYSKERNEL
bne .2
stx MLIOPEN01.PATH
>LDAXI MLIOPEN01.PATH
jsr A2osX.QC.PrintAX
jsr MLI
.DA #MLIOPEN
.DA MLIOPEN01
bcs .9
lda MLIOPEN01+5
sta MLIREAD01+1
sta MLICLOSE01+1
jsr MLI
.DA #MLIREAD
.DA MLIREAD01
bcs .9
jsr MLI
.DA #MLICLOSE
.DA MLICLOSE01
bcs .9
php
sei
sta SETALTZP
lda RRAMWRAMBNK1
lda RRAMWRAMBNK1
>LDYAI MLIREAD01.ADDR+$1F00
>STYA TmpPtr1
>LDYAI $E000+$1F00
>STYA TmpPtr2
ldx #$20
ldy #$F9 do not trash NMI,BRK,IRQ Vectors
.3 lda (TmpPtr1),y
sta (TmpPtr2),y
dey
cpy #$FF
bne .3
dec TmpPtr1+1
dec TmpPtr2+1
dex
bne .3
lda RROMBNK1
sta CLRALTZP
plp
clc
.9 rts
*--------------------------------------
A2osX.QC.PrintAX
>STAX TmpPtr1
lda (TmpPtr1)
tax
beq .9
ldy #1
.1 lda (TmpPtr1),y
ora #$80
jsr COUT
iny
dex
bne .1
.9 jsr CROUT
rts
*--------------------------------------
MLISETPREFIX01 .DA #1
.DA A2osX.QC.Prefix
MLIOPEN01 .DA #3
.DA MLIOPEN01.PATH
.DA MLIOPEN01.BUFF
.BS 1
MLIREAD01 .DA #4
.BS 1
.DA MLIREAD01.ADDR
.DA $1FFA
.BS 2
MLICLOSE01 .DA #1
.BS 1
*--------------------------------------
SYSKERNEL >PSTRING "SYS/KERNEL"
*--------------------------------------
MSG.STAGE1 >PSTRING "A2osX[Stage1]:Init"
MSG.SETPREFIXOK >PSTRING "Set Prefix OK"
MSG.SETPREFIXKO >PSTRING "Insert Vol:"
MSG.KLOADING >PSTRING "Loading Kernel..."
MSG.KLOADING.OK >PSTRING "OK"
MSG.KLOADING.KO >PSTRING "Error While Loading Kernel."
MSG.STAGE1OK >PSTRING "A2osX[Stage1]:Complete."
*--------------------------------------
A2osX.QC.END .EQ *
A2osX.QC.SIZE .EQ A2osX.QC.END-A2osX.QC.START
.BS $200-A2osX.QC.SIZE
.EP
*--------------------------------------
MAN
SAVE A2OSX.S.QC
LOAD A2OSX.S
ASM

View File

@ -8,6 +8,48 @@ AUTO 6
*--------------------------------------
RWBankSelect .EQ $C073
*--------------------------------------
A2osX.RamWorks >LDAXI MSG.RW
jsr PrintCStrAX
jsr RWDetect
bcs .10
>LDAXI MSG.RW.OK
jsr PrintCStrAX
bra A2osX.Z80
.10 jsr RWInit
bcc .1
>LDAXI MSG.RW.KO1
jsr PrintCStrAX
bra A2osX.Z80
.1 pha
>LDAXI MSG.RW.OK1
jsr PrintCStrAX
jsr RWInstall
bcc .2
>LDAXI MSG.RW.KO2
jsr PrintCStrAX
bra A2osX.Z80
.2 >LDAXI MSG.RW.OK2
jsr PrintCStrAX
jsr RWFormat
bcc .3
>LDAXI MSG.RW.KO3
jsr PrintCStrAX
bra A2osX.Z80
.3 >LDAXI MSG.RW.OK3
jsr PrintCStrAX
*--------------------------------------
RWDetect jsr MLI
.DA #MLIONLINE
.DA RW.ONLINE
@ -299,6 +341,15 @@ RW.BLOCK2.END .EQ *
*--------------------------------------
RW.BLOCK .BS 512
*--------------------------------------
MSG.RW >CSTRING "Detecting Ramworks Card..."
MSG.RW.OK >CSTRING "Already Installed as /RAM31.\n"
MSG.RW.OK1 >CSTRING "%d Pages Detected.\n"
MSG.RW.OK2 >CSTRING "RamWorks Driver Installed.\n"
MSG.RW.OK3 >CSTRING "RamWorks Drive Formatted.\n"
MSG.RW.KO1 >CSTRING "Not Detected.\n"
MSG.RW.KO2 >CSTRING "RamWorks Driver Install Error.\n"
MSG.RW.KO3 >CSTRING "RamWorks Drive Format Error.\n"
*--------------------------------------
* Driver for Ramworks in main LC
* $FF00 -> $FF9A (Inclusive)
* $FF58 MUST BE $60 (RTS)

View File

@ -18,54 +18,47 @@ AUTO 6
TmpPtr1 .EQ $0 main & aux ZP
TmpPtr2 .EQ $2 main & aux ZP
*--------------------------------------
IO.Buffer .EQ $3C00 1k Buffer for MLI open
Load.Address .EQ $4000 for loading kernel.bin before relocation
*--------------------------------------
* A2osX LOADER
*--------------------------------------
* TODO :
* /intercept MLI CALLS with
* PREFIX=/MNT/
* Move Global Page From $300 to $BE00
*--------------------------------------
START jmp A2osX.INIT
.DA $EEEE
.DA #$7F
.BS $7F
*--------------------------------------
A2osX.INIT ldx #$FF init 6502 stack to highest
* txs
php
A2osX.INIT php
pla
sei
sta SETALTZP Switch to alt ZP
stx A2osX.SaveS make Alt SP to highest too
sta CLRALTZP Switch to main ZP
ldx #$FF init 6502 stack to highest
txs
stx A2osX.SaveSM
pha
plp
* php EDIT:Already Set By ProDOS
* sei
* sta SETALTZP Switch to alt ZP
* stx A2osX.SaveSX make Alt SP to highest too
* sta CLRALTZP Switch to main ZP
* plp
jsr HOME
>LDAXI MSG.STAGE0
jsr PrintCStrAX
>LDYAI D.STACKSEG
>STYA R.SP init Soft Stack
* >LDYAI WARMBOOT
* >STYA POWERUP
* jsr SETPWRC
>LDAXI MSG.SYSMEM
jsr PrintCStrAX
lda MACHID
and #MACHIDRAM
cmp #MACHIDRAM128
beq A2osX.SysMemOK
beq .1
>LDAXI MSG.SYSMEM.KO
jsr PrintCStrAX
bra *
*--------------------------------------
A2osX.SysMemOK >LDAXI MSG.SYSMEM.OK
.1 >LDAXI MSG.SYSMEM.OK
jsr PrintCStrAX
>LDAXI MSG.65x
>LDAXI MSG.CPU
jsr PrintCStrAX
jsr Init6502
ldy A2osX.CPUTYPE
@ -75,11 +68,29 @@ A2osX.SysMemOK >LDAXI MSG.SYSMEM.OK
jsr PrintCStrAX
lda A2osX.CPUTYPE
bne A2osX.RamDrv
>LDAXI MSG.65x.KO
bne A2osX.Prefix
>LDAXI MSG.CPU.KO
jsr PrintCStrAX
bra *
*--------------------------------------
A2osX.Prefix >LDAXI MSG.BOOTPREFIX
jsr PrintCStrAX
jsr MLI
.DA #MLIGETPREFIX
.DA MLIGETPREFIX01
bcs *
ldx Boot.Prefix
stx A2osX.QC.B.Start+4
ldy #1
.1 lda Boot.Prefix,y
sta A2osX.QC.B.Start+4,y
ora #$80
jsr COUT
iny
dex
bne .1
jsr CROUT
*--------------------------------------
A2osX.RamDrv >LDAXI MSG.RAMDRV
jsr PrintCStrAX
jsr DisableRamDRV
@ -88,56 +99,14 @@ A2osX.RamDrv >LDAXI MSG.RAMDRV
beq .1
>LDAXI MSG.RAMDRV.KO1
jsr PrintCStrAX
bra A2osX.RamWorks
bra A2osX.Z80
.1 >LDAXI MSG.RAMDRV.KO0
jsr PrintCStrAX
bra A2osX.RamWorks
bra A2osX.Z80
.2 >LDAXI MSG.RAMDRV.OK
jsr PrintCStrAX
*--------------------------------------
A2osX.RamWorks >LDAXI MSG.RW
jsr PrintCStrAX
jsr RWDetect
bcs .10
>LDAXI MSG.RW.OK
jsr PrintCStrAX
bra A2osX.Z80
.10 jsr RWInit
bcc .1
>LDAXI MSG.RW.KO1
jsr PrintCStrAX
bra A2osX.Z80
.1 pha
>LDAXI MSG.RW.OK1
jsr PrintCStrAX
jsr RWInstall
bcc .2
>LDAXI MSG.RW.KO2
jsr PrintCStrAX
bra A2osX.Z80
.2 >LDAXI MSG.RW.OK2
jsr PrintCStrAX
jsr RWFormat
bcc .3
>LDAXI MSG.RW.KO3
jsr PrintCStrAX
bra A2osX.Z80
.3 >LDAXI MSG.RW.OK3
jsr PrintCStrAX
*--------------------------------------
A2osX.Z80 >LDAXI MSG.Z80
jsr PrintCStrAX
jsr InitZ80
@ -146,50 +115,21 @@ A2osX.Z80 >LDAXI MSG.Z80
>LDAXI MSG.Z80.OK
jsr PrintCStrAX
bra .8
bra A2osX.MLIQuit
.1 >LDAXI MSG.Z80.KO
jsr PrintCStrAX
.8 >LDAXI MSG.LOADING
*--------------------------------------
A2osX.MLIQuit >LDAXI MSG.STAGE0OK
jsr PrintCStrAX
jsr LoadKernel
bcs .9
phx
pha
>LDAXI MSG.LOADING.OK
jsr PrintCStrAX
ldx #A2osX.GP.End-A2osX.GP.start
.81 lda A2osX.GP.start-1,x
sta A2osX.GP-1,x
dex
bne .81
jsr SetupQuitCode
>DEBUG
php
pla
sei
tsx
stx A2osX.SaveS
stx SETALTZP
bit RRAMWRAMBNK1
bit RRAMWRAMBNK1
ldx A2osX.SaveS
txs
pha
plp
jmp $E000
.9 pha
>LDAXI MSG.LOADING.KO
jsr PrintCStrAX
jsr MLI
.DA #MLIQUIT
.DA MLIQUIT01
bra *
*--------------------------------------
* Out:
@ -272,86 +212,21 @@ DisableRamDRV php
sec
rts
*--------------------------------------
LoadKernel jsr MLI
.DA #MLIGETPREFIX
.DA MLIGETPREFIX01
bcs .9
ldy #0
ldx Path.Buffer
.1 lda SYSKERNEL,y
beq .2
sta Path.Buffer+1,x
SetupQuitCode lda RRAMWRAMBNK2
lda RRAMWRAMBNK2
ldx #0
.1 lda A2osX.QC.B.Start,x
sta $D100,x
lda A2osX.QC.B.Start+$100,x
sta $D200,x
lda A2osX.GP.B.start,x
sta $D300,x
inx
iny
bra .1
.2 stx Path.Buffer
jsr MLI
.DA #MLIOPEN
.DA MLIOPEN01
bcs .9
lda MLIOPEN01+5
sta MLIREAD01+1
sta MLICLOSE01+1
jsr MLI
.DA #MLIREAD
.DA MLIREAD01
bcs .9
jsr MLI
.DA #MLICLOSE
.DA MLICLOSE01
bcs .9
php
sei
sta SETALTZP
lda RRAMWRAMBNK1
lda RRAMWRAMBNK1
>LDYAI Load.Address+$1F00
>STYA TmpPtr1
>LDYAI $E000+$1F00
>STYA TmpPtr2
ldy #$F9 do not trash NMI,BRK,IRQ Vectors
.3 lda (TmpPtr1),y
sta (TmpPtr2),y
dey
cpy #$FF
bne .3
dec TmpPtr1+1
dec TmpPtr2+1
lda TmpPtr2+1
cmp #$DF
bne .3
bne .1
lda RROMBNK1
sta CLRALTZP
plp
>LDAX MLIREAD01+6
clc
.9 rts
*--------------------------------------
MLIGETPREFIX01 .DA #1
.DA Path.Buffer
MLIOPEN01 .DA #3
.DA Path.Buffer
.DA IO.Buffer
.BS 1
MLIREAD01 .DA #4
.BS 1
.DA Load.Address
.DA $2000
.BS 2
MLICLOSE01 .DA #1
.BS 1
*--------------------------------------
Path.Buffer .BS MLI.MAXPATH
SYSKERNEL >CSTRING "SYS/KERNEL"
rts
*--------------------------------------
PrintCStrAX >STAX TmpPtr1
pla
@ -469,32 +344,21 @@ PrintDec stz BCD
.9 ply
rts
*--------------------------------------
MSG.STAGE0 >CSTRING "A2osX[Stage0]:Init\n"
MSG.SYSMEM >CSTRING "Checking System Memory..."
MSG.SYSMEM.OK >CSTRING "128k Detected.\n"
MSG.SYSMEM.KO >CSTRING "A2osX Requires At Least 128k Memory.\n"
MSG.65x >CSTRING "Checking 65x CPU..."
MSG.65x.KO >CSTRING "A2osX Requires At Least A 65C02 CPU.\n"
MSG.CPU >CSTRING "Checking CPU..."
MSG.CPU.KO >CSTRING "A2osX Requires At Least A 65C02 CPU.\n"
MSG.BOOTPREFIX >CSTRING "Boot Prefix:"
MSG.RAMDRV >CSTRING "Checking ProDOS RamDrive..."
MSG.RAMDRV.OK >CSTRING "Successfully Disabled.\n"
MSG.RAMDRV.KO0 >CSTRING "Not Detected.\n"
MSG.RAMDRV.KO1 >CSTRING "Uninstall Failed !!!\n"
MSG.CLOCK.OK1 >CSTRING "Already Installed.\n"
MSG.CLOCK.OK2 >CSTRING "Successfully Installed.\n"
MSG.CLOCK.KO >CSTRING "Install Failed !!!\n"
MSG.RW >CSTRING "Detecting Ramworks Card..."
MSG.RW.OK >CSTRING "Already Installed as /RAM31.\n"
MSG.RW.OK1 >CSTRING "%d Pages Detected.\n"
MSG.RW.OK2 >CSTRING "RamWorks Driver Installed.\n"
MSG.RW.OK3 >CSTRING "RamWorks Drive Formatted.\n"
MSG.RW.KO1 >CSTRING "Not Detected.\n"
MSG.RW.KO2 >CSTRING "RamWorks Driver Install Error.\n"
MSG.RW.KO3 >CSTRING "RamWorks Drive Format Error.\n"
MSG.Z80 >CSTRING "Detecting Z80 CPU..."
MSG.Z80.OK >CSTRING "Detected In Slot %d.\n"
MSG.Z80.KO >CSTRING "Not Detected.\n"
MSG.LOADING >CSTRING "Loading Kernel..."
MSG.LOADING.OK >CSTRING "%D Bytes Read.\n"
MSG.LOADING.KO >CSTRING "Error $%h While Loading Kernel.\n"
MSG.STAGE0OK >CSTRING "A2osX[Stage0]:Complete.\n"
*--------------------------------------
MSG.CPUTYPEL .DA #MSG.6502
.DA #MSG.65C02
@ -510,29 +374,23 @@ MSG.65C02 >CSTRING "CMOS 65C02.\n"
MSG.R65C02 >CSTRING "Rockwell R65C02.\n"
MSG.65C816 >CSTRING "16 Bits 65C816.\n"
*--------------------------------------
MLIGETPREFIX01 .DA #1
.DA Boot.Prefix
MLIQUIT01 .DA #4
.DA #0
.DA 0
.DA #0
.DA 0
*--------------------------------------
Boot.Prefix .BS MLI.MAXPATH
*--------------------------------------
HEX .BS 2
BCD .BS 3
bFlag .BS 1
*--------------------------------------
.INB A2OSX.S.GP
.INB A2OSX.S.RW
.INB A2OSX.S.Z80
*--------------------------------------
* ****** START OF MLI QUIT CODE ******
* setup $0300 Global page :
* Copy Back from $D010-$D0FF to $300-$3F0
* setup $1000 Z80 switch code
*--------------------------------------
.PH $1000
cld
rts
ROOT.PATH .BS MLI.MAXPATH
.EP
*--------------------------------------
* Driver for NoSlotClock
* Load at (DATETIME+1)
*--------------------------------------
.INB A2OSX.S.QC
.INB A2OSX.S.GP
*--------------------------------------
MAN
SAVE A2OSX.S

View File

@ -105,41 +105,15 @@ SYS.SetNetCfg .EQ $B2
SYS.GetNetCfgA .EQ $B4
SYS.ClrNetCfgA .EQ $B6
*--------------------------------------
A2osX.SaveS .EQ $100 Main,Aux
A2osX.SaveSM .EQ $100 Main
A2osX.SaveSX .EQ $101 Aux
*--------------------------------------
* Main $200 -> 2FF : (Reserved, ProDOS,Clock DRV....)
* Main $300 -> 3EF : A2osX Global Page
* Main $300 -> 3EF : <free>
* Main $3F0 -> 3FF : ProDOS Vectors
* Aux $200 -> 3FD : /RAM Driver
* Aux $3FE -> 3FF : RESET Vector
*--------------------------------------
* A2osX GLOBAL PAGE
*--------------------------------------
A2osX.SYSCALL .EQ $0300
A2osX.MLICALL .EQ $0302
A2osX.LIBCALL .EQ $0304
A2osX.SLEEP .EQ $0306
Kernel.MLICALL .EQ $0308
Kernel.DRVCALL .EQ $030A
Kernel.BINCALL .EQ $030C
Kernel.LIBCALL .EQ $030E
*--------------------------------------
A2osX.SCREENS .EQ $0310
A2osX.SCREENS.G .EQ %00000100
A2osX.SCREENS.C .EQ %00000010
A2osX.SCREENS.S .EQ %00000001
A2osX.ACTIVESCRN .EQ $0311
A2osX.TIMER16 .EQ $0312
A2osX.RANDOM16 .EQ $0314
A2osX.CPUTYPE .EQ $0316
A2osX.Z80SLOT .EQ $0317
Kernel.JMP .EQ $0318
A2osX.300CODE .EQ $031A
*--------------------------------------
* Console Screen .EQ $400 -> $7FF
* System Screen .EQ $800 -> $BFF
*--------------------------------------
@ -148,9 +122,7 @@ TmpBuffer256 .EQ $0C00
D.STACKSEG .EQ $0D00 $0DFF Down to $0D00
*--------------------------------------
MLICALL.PARAMS .EQ $0E00 size=$12 (SET_FILE_INFO +1)
A2osX.SaveA .EQ $0E20
A2osX.SaveX .EQ $0E21
A2osX.SaveY .EQ $0E22
*--------------------------------------
MEMMGR.LOMEM .EQ $0E30
MEMMGR.MLLIMIT .EQ $0E32
@ -168,6 +140,36 @@ TSKMGR.TABLE .EQ $1300 K.PS.MAX*S.PS.SIZE=32*16=512
*--------------------------------------
A2osX.LOMEM .EQ $1500
*--------------------------------------
* A2osX GLOBAL PAGE
* $BE00->$BE0F : Public JMP
*--------------------------------------
A2osX.SYSCALL .EQ $BE00
A2osX.MLICALL .EQ $BE02
A2osX.LIBCALL .EQ $BE04
A2osX.SLEEP .EQ $BE06
Kernel.MLICALL .EQ $BE08
Kernel.DRVCALL .EQ $BE0A
Kernel.BINCALL .EQ $BE0C
Kernel.LIBCALL .EQ $BE0E
*--------------------------------------
A2osX.SCREENS .EQ $BE10
A2osX.SCREENS.G .EQ %00000100
A2osX.SCREENS.C .EQ %00000010
A2osX.SCREENS.S .EQ %00000001
A2osX.ACTIVESCRN .EQ $BE11
A2osX.TIMER16 .EQ $BE12
A2osX.RANDOM16 .EQ $BE14
A2osX.CPUTYPE .EQ $BE16
A2osX.Z80SLOT .EQ $BE17
Kernel.JMP .EQ $BE1A
A2osX.SaveA .EQ $BE1C
A2osX.SaveX .EQ $BE1D
A2osX.SaveY .EQ $BE1E
A2osX.GPCODE .EQ $BE20
*--------------------------------------
* MEM STRUCT
*--------------------------------------
S.MEM.F .EQ 0

View File

@ -10,7 +10,7 @@ AUTO 6
OURCH .EQ $57B
OURCV .EQ $5FB
*--------------------------------------
* Software Switches & Cxxx ROMs
* Software Switches
*--------------------------------------
KBD .EQ $C000 R
CLR80STORE .EQ $C000 W
@ -94,10 +94,5 @@ RRAMBNK1 .EQ $C088 R
RROMWRAMBNK1 .EQ $C089 RR
RROMBNK1 .EQ $C08A R
RRAMWRAMBNK1 .EQ $C08B RR
*--------------------------------------
* Cxxx ROMs
*--------------------------------------
CX00ROM .EQ $C100
C300ROM .EQ $C300
MAN
SAVE INC/IO.I

View File

@ -17,44 +17,22 @@ ZPMemMgrTmp2 .EQ ZPMemMgr+10
ZPMemMgrTmp3 .EQ ZPMemMgr+12
*--------------------------------------
* TODO :
* Create a 256 bytes table in SLOT #0
* (eh, mem.ID=0 always used! useful to test if hMem=0)
* mapping hMem's to real memory blocks to help
* Garbage collector move blocks
* - Create a 256 bytes table in SLOT #0
* (eh, mem.ID=0 always used! useful to test if hMem=0)
* mapping hMem's to real memory blocks to help
* Garbage collector move blocks
*--------------------------------------
S.MemMgrInit ldx /A2osX.LOMEM
lda #A2osX.LOMEM
beq .1
inx
.1 phx
txa
lsr
lsr
lsr
tay
txa
and #7
tax
lda #$80
.2 dex
bmi .3
lsr
bra .2
.3 and MEMTABL,y
bne .4
plx
inx
cpx /MLI
bne .1
bra .5
.4 plx
.5 stz MEMMGR.MHLIMIT
S.MemMgrInit stz MEMMGR.MHLIMIT
stz MEMMGR.HIMEM
ldx /MLI
dex Reserve $BE00 For Global Page
stx MEMMGR.MHLIMIT+1
stx MEMMGR.HIMEM+1
>LDYAI A2osX.LOMEM
>STYA MEMMGR.LOMEM
>STYA MEMMGR.MLLIMIT
>STYA MEMMGR.LOMEM
stz MEMMGR.TABLESIZE Init Table Size to 0
* jsr S.UpdateMemStats Not needed, will be called by S.GetMem
>PUSHWI 256 get a 256 bytes buffer for Map Table, hMem=0

View File

@ -268,6 +268,58 @@ S.SysScrSetCharAtYX
ply
rts
*--------------------------------------
* S.ScreenSelectA
* IN :
* A = Screen to display
*--------------------------------------
S.ScreenSelectA and A2osX.SCREENS Screen is available ?
beq .9 ...not setup up
cmp #A2osX.SCREENS.S
bne .1
sta SETTEXT
sta SET80DISP
sta CLR80STORE
sta SETPAGE2
sta SETALTCHAR
lda #A2osX.SCREENS.S
bra .8
.1 cmp #A2osX.SCREENS.C
bne .2
sta SETTEXT
sta SET80DISP
sta SET80STORE
sta CLRPAGE2
sta SETALTCHAR
lda #A2osX.SCREENS.C
bra .8
.2 cmp #A2osX.SCREENS.G
bne .9
sta CLRTEXT
sta CLRMIXED
sta SETHIRES
sta CLRPAGE2
sta SETIOUDIS
sta CLR80DISP
sta SETDHIRES
sta CLRDHIRES
sta SETDHIRES
sta CLRDHIRES
sta SET80DISP
sta SETDHIRES
sta CLRDHIRES
sta SETDHIRES
lda #A2osX.SCREENS.G
.8 sta A2osX.ACTIVESCRN
.9 rts
*--------------------------------------
SYSSCR.CH .BS 1
SYSSCR.CV .BS 1
SYSSCR.CPULOADI .BS 1

View File

@ -14,7 +14,7 @@ AUTO 6
.INB INC/IO.I
.INB INC/PRODOS.I
*--------------------------------------
KERNEL.BOOT jmp S.Kernel
KERNEL.Start jmp S.Kernel
*--------------------------------------
KERNEL.SYSCALL jmp (.1,x)
*--------------------------------------
@ -152,35 +152,34 @@ S.KernelInit >LDYAI D.STACKSEG
stz A2osX.ACTIVESCRN
jsr S.SysScrInit
>LDYAI MSG.INIT0
>LDYAI MSG.Init
jsr S.SysScrPPSTR
>LDYAI MSG.INIT1
>LDYAI MSG.Init.MemMgr
jsr S.SysScrPPSTR
jsr S.MemMgrInit
jsr S.SysScrPRCode
bcs .1
>LDYAI MSG.INIT2
>LDYAI MSG.Init.TskMgr
jsr S.SysScrPPSTR
jsr S.TskMgrInit
jsr S.SysScrPRCode
.1 bcs .2
>LDYAI MSG.INIT3
>LDYAI MSG.Init.DevMgr
jsr S.SysScrPPSTR
jsr S.DevMgrInit
jsr S.SysScrPRCode
.2 bcs .3
>LDYAI MSG.INIT4
>LDYAI MSG.Init.EvtMgr
jsr S.SysScrPPSTR
jsr S.EvtMgrInit
jsr S.SysScrPRCode
.3 bcs .99
>LDYAI MSG.INIT5
>LDYAI MSG.Init.Startup
jsr S.SysScrPPSTR
>PUSHWI STARTUP.FILE Build A2osX.STARTUP full path...
@ -196,8 +195,10 @@ S.KernelInit >LDYAI D.STACKSEG
>PUSHA
jsr S.PStrCat
pha save for discard
jsr S.ExecFileA
bcs .99
jsr S.SysScrPRCode
pla
jsr S.FreeMemA
pla
@ -205,7 +206,7 @@ S.KernelInit >LDYAI D.STACKSEG
pla
jsr S.FreeMemA
>LDYAI MSG.INIT6
>LDYAI MSG.Init.SysEnv
jsr S.SysScrPPSTR
jsr S.PrintSysEnv
@ -304,56 +305,6 @@ S.KernelQuit clc
*--------------------------------------
* PUBLIC
*--------------------------------------
* S.ScreenSelectA
* IN :
* A = Screen to display
*--------------------------------------
S.ScreenSelectA and A2osX.SCREENS Screen is available ?
beq .9 ...not setup up
cmp #A2osX.SCREENS.S
bne .1
sta SETTEXT
sta SET80DISP
sta CLR80STORE
sta SETPAGE2
sta SETALTCHAR
lda #A2osX.SCREENS.S
bra .8
.1 cmp #A2osX.SCREENS.C
bne .2
sta SETTEXT
sta SET80DISP
sta SET80STORE
sta CLRPAGE2
sta SETALTCHAR
lda #A2osX.SCREENS.C
bra .8
.2 cmp #A2osX.SCREENS.G
bne .9
sta CLRMIXED
sta SETHIRES
sta CLRTEXT
sta SETIOUDIS
sta CLR80DISP
sta SETDHIRES
sta CLRDHIRES
sta SETDHIRES
sta CLRDHIRES
sta SET80DISP
sta SETDHIRES
sta CLRDHIRES
sta SETDHIRES
lda #A2osX.SCREENS.G
.8 sta A2osX.ACTIVESCRN
.9 rts
*--------------------------------------
* S.ExecFileA (R)
* in :
* A = hMem of FilePath (PSTRING)
@ -505,13 +456,13 @@ EXECCMDS1 >PSTRING "LOAD"
EXECCMDS2 >PSTRING "EXEC"
.DA #0
*--------------------------------------
MSG.INIT0 >PSTRING "\nKernel Startup...\n"
MSG.INIT1 >PSTRING "->MemMgr Init"
MSG.INIT2 >PSTRING "->TskMgr Init"
MSG.INIT3 >PSTRING "->DevMgr Init"
MSG.INIT4 >PSTRING "->EvtMgr Init"
MSG.INIT5 >PSTRING "EXEC A2osX.Startup...\n"
MSG.INIT6 >PSTRING "SYS ENV:\n"
MSG.Init >PSTRING "A2osX[Stage2]:Init\n"
MSG.Init.MemMgr >PSTRING "->MemMgr Init"
MSG.Init.TskMgr >PSTRING "->TskMgr Init"
MSG.Init.DevMgr >PSTRING "->DevMgr Init"
MSG.Init.EvtMgr >PSTRING "->EvtMgr Init"
MSG.Init.Startup >PSTRING "EXEC A2osX.Startup...\n"
MSG.Init.SysEnv >PSTRING "SYS ENV:\n"
MSG.EVNTPANIC >PSTRING "\nEVT:F/hDev/DATA/W1/W2="
MSG.KRNLPANIC >PSTRING "\n\n!!!Kernel Panic!!!"
*--------------------------------------
@ -536,6 +487,13 @@ ENV.LIB >PSTRING "LIB"
.INB SYS/KERNEL.S.STR
.INB SYS/KERNEL.S.TSK
*--------------------------------------
KERNEL.End .EQ *
Kernel.Size .EQ KERNEL.End-KERNEL.Start
*--------------------------------------
.DO Kernel.Size>$1FFA
ERROR:KERNEL.SIZE too big
.FIN
*--------------------------------------
MAN
SAVE SYS/KERNEL.S
ASM

0
SYS/KM.AECLK.S.txt Normal file
View File

View File

@ -9,7 +9,6 @@ AUTO 6
.TF SYS/KM.NSC
*--------------------------------------
.INB INC/MACROS.I
.INB INC/A2OSX.I
.INB INC/IO.I
.INB INC/MONITOR.I
.INB INC/PRODOS.I

639
SYS/KM.RAMWORKS.S.txt Normal file
View File

@ -0,0 +1,639 @@
PR#3
PREFIX /DATA/A2OSX
NEW
INC 1
AUTO 6
.LIST OFF
.OP 65C02
.OR $2000
.TF SYS/KM.RAMWORKS
*--------------------------------------
.INB INC/MACROS.I
.INB INC/IO.I
.INB INC/MONITOR.I
.INB INC/PRODOS.I
*--------------------------------------
TmpPtr1 .EQ $0
TmpPtr2 .EQ $2
*--------------------------------------
RWBankSelect .EQ $C073
*--------------------------------------
RW.Init >LDAXI RW.MSG
jsr RW.Print
jsr RW.Detect1
bcs .10
>LDAXI RW.MSG.OK
jsr RW.Print
rts
.10 jsr RW.Detect2
bcc .1
>LDAXI RW.MSG.KO1
jsr RW.Print
rts
.1 jsr PRBYTE
>LDAXI RW.MSG.OK1
jsr RW.Print
jsr RW.Install
bcc .2
>LDAXI RW.MSG.KO2
jsr RW.Print
rts
.2 >LDAXI RW.MSG.OK2
jsr RW.Print
jsr RW.Format
bcc .3
>LDAXI RW.MSG.KO3
jsr RW.Print
rts
.3 >LDAXI RW.MSG.OK3
jsr RW.Print
rts
*--------------------------------------
RW.Detect1 jsr MLI
.DA #MLIONLINE
.DA RW.ONLINE
rts
*--------------------------------------
RW.ONLINE .DA #2
.DA #$30 Slot 3,Drive 1
.DA RW.ONLINEBUFFER
RW.ONLINEBUFFER .BS 16
*--------------------------------------
RW.Detect2 php
sei
sta SETALTZP
ldx #0 start detection at page $00
.1 stx RWBankSelect
lda 0
sta RW.SAVEZP0,x save Bank 0 $0000 to prevent ALTZP trash
lda 1
sta RW.SAVEZP1,x
inx
bne .1
lda #0
.2 sta RWBankSelect
sta 0
eor #$FF
sta 1
eor #$FF
inc
bne .2
ldx #0
.3 txa
sta RWBankSelect
cmp 0
bne .4
eor #$FF
cmp 1
bne .4
inx
bne .3
dex we reached 0,last detected page was 255
.4 ldy #255 X = detected page count
.6 sty RWBankSelect
lda RW.SAVEZP0,y
sta 0
lda RW.SAVEZP1,y
sta 1
dey
bne .6
stz RWBankSelect
lda RW.SAVEZP0 Don't forget to restore Bank 0
sta 0
lda RW.SAVEZP1
sta 1
txa
stx RW.PGCNT PGCNT = last detected page, as we do -1 for AuxMem
sta CLRALTZP
plp
lda RW.PGCNT
beq .9
clc
rts
.9 sec
rts
*--------------------------------------
RW.Install lda RRAMWRAMBNK1
lda RRAMWRAMBNK1
ldx #RWDRV.SIZE
.1 lda RWDRV.B.START-1,x
sta RWDRV.START-1,x
dex
bne .1
lda RW.PGCNT
lsr
sta RWDRV.MAXHI+1
lda #0
ror
sta RWDRV.MAXLO+1
lda RROMBNK1
sta SETWRITEAUX
ldx #RWDRVX.SIZE
.2 lda RWDRVX.B.START-1,x
sta RWDRVX.START-1,x
dex
bne .2
sta CLRWRITEAUX
inc DEVCNT
ldx DEVCNT
lda #$30 Slot 3,Drive 1
sta DEVLST,x
lda #RWDRV.START
sta DEVPTRS3D1
lda /RWDRV.START
sta DEVPTRS3D1+1
clc
rts
*--------------------------------------
RW.Format jsr RW.BLOCK.SET00
lda RW.PGCNT
lsr
sta RW.BLOCK2.TB+1
lda #0
ror
sta RW.BLOCK2.TB
jsr MLI
.DA #MLIGETTIME
.DA 0
ldx #3
.1 lda DATELO,x
sta RW.BLOCK2.CT,x
dex
bpl .1
ldx #RW.BLOCK2.END-RW.BLOCK2
.2 lda RW.BLOCK2-1,x
sta RW.BLOCK-1,x
dex
bne .2
jsr MLI Write Block 2,First VOL directory block
.DA #MLIWRITEBLOCK
.DA RW.MLIWRITEBLOCK
bcc .22
rts
*--------------------------------------
.22 jsr RW.BLOCK.SET00
lda #2
sta RW.BLOCK LO byte of previous block pointer
inc RW.MLIWRITEBLOCK.BLK
jsr MLI Write Block 3,Last VOL directory block
.DA #MLIWRITEBLOCK
.DA RW.MLIWRITEBLOCK
bcc .33
rts
*--------------------------------------
.33 lda RW.PGCNT divide RW.PGCNT by 32 to get how many bitmap
lsr blocks we need :
lsr 1 page = 128 blocks = 16 bytes
lsr 32 pages = 512 bytes = 1 Block
lsr
lsr
sta RW.FBITMAPCNT store FULL bitmap block count needed
tax
lda RW.PGCNT
and #$1F need an extra incomplete bitmap block?
beq .3
inx
.3 stx RW.BITMAPCNT store TOTAL bitmap block needed
.4 lda RW.FBITMAPCNT
beq .49
dec RW.FBITMAPCNT
jsr RW.BLOCK.SETFF
bra .5
.49 jsr RW.BLOCK.SET00
lda RW.PGCNT
and #$1F compute incomplete bitmap block
asl
asl
asl
asl times 16 for byte count
tay
lda #$FF
bcc .42 first half of block only
ldx #0
.40 sta RW.BLOCK,x
inx
bne .40
cpy #0
beq .5
.41 sta RW.BLOCK+$ff,y
dey
bne .41
bra .5
.42 sta RW.BLOCK-1,y
dey
bne .42
.5 inc RW.MLIWRITEBLOCK.BLK
lda RW.MLIWRITEBLOCK.BLK
cmp #4 Are we writing first volume bitmap ?
bne .63 no, regular one
lda #$CF Mark Block 0 & 1 free, 2,3 used (vol hdr)
sta RW.BLOCK
ldy #0
lda #$8 Start a BLOCK 4 (%00001000)
ldx RW.BITMAPCNT
.62 pha
eor RW.BLOCK,y Mark bitmap blocks as "used"
sta RW.BLOCK,y
pla
dex
beq .63
lsr
bne .62
lda #$80
iny
bra .62
.63 jsr MLI Write Block 4,5...
.DA #MLIWRITEBLOCK
.DA RW.MLIWRITEBLOCK
bcs .9
dec RW.BITMAPCNT another bitmap block needed ?
bne .4
clc
.9 rts
*--------------------------------------
RW.BLOCK.SETFF lda #$FF
bra RW.BLOCK.SET
RW.BLOCK.SET00 lda #$00
RW.BLOCK.SET ldx #0
.1 sta RW.BLOCK,x
sta RW.BLOCK+$100,x
inx
bne .1
rts
*--------------------------------------
RW.MLIWRITEBLOCK
.DA #3
.DA #$30 Slot 3,Drive 1
.DA RW.BLOCK
RW.MLIWRITEBLOCK.BLK
.DA 2 Start writing block at #2
*--------------------------------------
RW.RAM31 .DA #$30
.DA #5 len=5 chars
.AS 'RAM31'
*--------------------------------------
RW.PGCNT .BS 1
RW.FBITMAPCNT .BS 1
RW.BITMAPCNT .BS 1
RW.SAVEZP0 .BS 256
RW.SAVEZP1 .BS 256
*--------------------------------------
RW.BLOCK2 .DA 0 pointer to previous block
.DA 3 pointer to next block
.DA #$F5 $F=Vol Dir Header, 5=name len
.AS 'RAM31'
.BS 10 (RAM31 len=5, fill to 15)
.HS 0000000000000000
RW.BLOCK2.CT .BS 4 Creation time
.HS 0100C3270D version/min version/access/EL/EPB
.DA 0 File Count
.DA 4 bitmap pointer (Block 2&3 are Volume directory)
RW.BLOCK2.TB .BS 2 Total Blocks
RW.BLOCK2.END .EQ *
*--------------------------------------
RW.BLOCK .BS 512
*--------------------------------------
RW.Print >STAX TmpPtr1
ldy #0
.1 lda (TmpPtr1),y
beq .9
ora #$80
jsr COUT
iny
bne .1
.9 jmp CROUT
*--------------------------------------
RW.MSG >CSTRING "RAMWorks (I,II,III,z-Ram) Driver For A2osX."
RW.MSG.OK >CSTRING "/RAM31 Device Already Installed."
RW.MSG.OK1 >CSTRING " Pages Detected."
RW.MSG.KO1 >CSTRING "Not Detected."
RW.MSG.OK2 >CSTRING "RamWorks Driver Installed."
RW.MSG.KO2 >CSTRING "RamWorks Driver Install Error."
RW.MSG.OK3 >CSTRING "RamWorks Drive Formatted."
RW.MSG.KO3 >CSTRING "RamWorks Drive Format Error."
*--------------------------------------
* Driver for Ramworks in main LC
* $FF00 -> $FF9A (Inclusive)
* $FF58 MUST BE $60 (RTS)
* DO NOT trash DRV.BLKNUM as ProDOS
* reuses it after Block operation
*--------------------------------------
DRV.COMMAND .EQ $42
DRV.BUFF .EQ $44
DRV.BLKNUM .EQ $46
*--------------------------------------
RWDRV.B.START
.PH $FF00
RWDRV.START cld ProDOS will check that byte!!!
ldy DRV.COMMAND 0 = Status ?
beq RMDRV.CMDSTATUS
cpy #3
beq RWDRV.EXITOK 3 = Format : nothing to do, exit with no error
bcs RWDRV.IOERR > 3 = Invalid OP, IO error
lda DRV.BLKNUM
sec
sbc RWDRV.MAXLO+1
lda DRV.BLKNUM+1
sbc RWDRV.MAXHI+1
bcs RWDRV.IOERR DRV.BLKNUM >= RW.DRV.SIZE, IO error
lda DRV.BLKNUM compute PAGE = blocknumLO *2
asl
pha
lda DRV.BLKNUM+1 compute BANK = blocknumHI *2
rol
inc +1 for skipping Aux BANK 0
plx move page into X
beq RWDRV.GOAUX move from/to aux page0/1
cpx #$C0
bcs RWDRV.GOAUX move from/to aux LC
*--------------------------------------
* X=Page($02 -> $BF),A=Bank,Y=CMD
*--------------------------------------
php
sei Disable IRQ as no vector set in RW Banks
sta RWBankSelect Select RAMWorks Bank
sta CLR80STORE make sure SETREADAUX/SETWRITEAUX effective everywhere
stx DRV.COMMAND+1 Reuse DRV.COMMAND for RAM PTR
stz DRV.COMMAND
dey Y=CMD, zero if read
bne RWDRV.W CC, go write
sta SETREADAUX
ldx #DRV.COMMAND READ:copy from RAM to BUFF
ldy #DRV.BUFF
bra RWDRV.RW
RWDRV.W sta SETWRITEAUX
ldx #DRV.BUFF
ldy #DRV.COMMAND WRITE:copy from BUFF to RAM
RWDRV.RW stx RWDRV.RW.SRC+1
sty RWDRV.RW.DST+1
ldx #2 2 pages to copy
ldy #0
RWDRV.RW.SRC lda ($FF),y
RWDRV.RW.DST sta ($FF),y
iny
bne RWDRV.RW.SRC
.HS 24 BIT Zero Page to skip RTS
RWDRV.RTS rts $FF58 Must Be RTS
inc DRV.BUFF+1
inc DRV.COMMAND+1
dex
bne RWDRV.RW.SRC
stz RWBankSelect
sta CLRREADAUX
sta CLRWRITEAUX
plp
RMDRV.CMDSTATUS
RWDRV.MAXLO ldx #$FF return device block count in X,Y...
RWDRV.MAXHI ldy #$FF
RWDRV.EXITOK lda #0 make A=0
clc
rts
RWDRV.IOERR lda #MLI.ERR.IO Carry already set
rts
*--------------------------------------
* X=Page(0/1 or LC),A=Bank
*--------------------------------------
RWDRV.GOAUX pha save BANK
sta SETWRITEAUX
ldy #RWDRVX.XM.SIZE Backup begining of $300 to generate move code
.1 lda RWDRV.XM.RUN-1,y
sta RWDRVX.XM.SAVE-1,y
dey
bne .1
pla restore BANK
sta SETREADAUX
jsr RWDRVX.START Setup Code in main mem at $300 for data move
* returns : CC=WRITE, CS=READ
sta CLRREADAUX CLRWRITEAUX already triggered by code copy
jsr RWDRV.XM.RUN Now execute generated code in main memory
sta SETREADAUX
jsr RWDRVX.RESTORE
sta CLRREADAUX
rts A & carry setup properly by RWDRVX.RESTORE
RWDRV.END .EP
RWDRV.B.END
RWDRV.SIZE .EQ RWDRV.B.END-RWDRV.B.START
*--------------------------------------
* Driver for Ramworks in aux memory
* $0200 -> $02FF TMP buffer for PAGE copy
* $0300 -> $03FD (Inclusive)
* do not trash $03FE-$03FF (IRQ Vector)
* X=Page(0/1 or LC),A=Bank
*--------------------------------------
RMDRVX.TMP .EQ $200
RWDRV.XM.RUN .EQ $300
*--------------------------------------
RWDRVX.B.START
.PH $0300
RWDRVX.START sta RWDRVX.XM.BANK+1 setup BANK
txa
beq .1 page 0/1, no need to check BANK
cmp #$D0 $C0 <= PAGE < $D0 ?
bcc .1 no, store in BNK1
ora #$10 Remap $C0 page to $D0 BNK2
.1 ror RWDRVX.XM.RWLC+1 Save Carry to select proper RW bank later
ldy DRV.BUFF
ldx DRV.BUFF+1
lsr DRV.COMMAND DRV.COMMAND: 1=READ,2=WRITE
bcc .2 CC=WRITE, CS=READ
stz RWDRVX.XM.SRC+1 READ from src LO = 0
sta RWDRVX.XM.SRC+2 READ from src HI = PAGE
sty RWDRVX.XM.DST+1 WRITE to DRV.BUFF
stx RWDRVX.XM.DST+2
bra .3
.2 sty RWDRVX.XM.SRC+1 READ from DRV.BUFF
stx RWDRVX.XM.SRC+2
stz RWDRVX.XM.DST+1 WRITE to dst LO = 0
sta RWDRVX.XM.DST+2 WRITE to dst HI = PAGE
.3 sta CLRWRITEAUX
ldy #RWDRVX.XM.SIZE
.4 lda RWDRVX.XM.START-1,y
sta RWDRV.XM.RUN-1,y
dey
bne .4
rts
*--------------------------------------
* Called form Main LC after RWDRVX.XM execution
*--------------------------------------
RWDRVX.RESTORE ldy #RWDRVX.XM.SIZE Now, restore begining of $300
.1 lda RWDRVX.XM.SAVE-1,y
sta RWDRV.XM.RUN-1,y
dey
bne .1
tya setup A=0 and CC for exit with non error
clc
rts
*--------------------------------------
* "auXMove" Code, moved from Aux to main $300
* $0200 -> $02FF TMP buffer for 2 steps moving between LCs
* CC=WRITE :
* CS=READ :
*--------------------------------------
RWDRVX.XM.START php
sei
ldx #0
ldy #2 2 pages to copy
RWDRVX.XM.COPY jsr RWDRV.XM.RUN+RWDRVX.XM.MNLC-RWDRVX.XM.START WRITE:copy from MAIN to TMP
bcc RWDRVX.XM.SRC CC=WRITE,CS=READ?
jsr RWDRV.XM.RUN+RWDRVX.XM.RWLC-RWDRVX.XM.START READ:copy from BANK to TMP
sta SETALTZP
RWDRVX.XM.SRC lda $FFFF,x
sta RMDRVX.TMP,x
inx
bne RWDRVX.XM.SRC
sta CLRALTZP
jsr RWDRV.XM.RUN+RWDRVX.XM.MNLC-RWDRVX.XM.START READ:copy from TMP to MAIN
bcs RWDRVX.XM.1 CC=WRITE,CS=READ?
jsr RWDRV.XM.RUN+RWDRVX.XM.RWLC-RWDRVX.XM.START WRITE:copy from TMP to BANK
sta SETALTZP
RWDRVX.XM.1 lda RMDRVX.TMP,x
RWDRVX.XM.DST sta $FFFF,x
inx
bne RWDRVX.XM.1
sta CLRALTZP
inc RWDRV.XM.RUN+RWDRVX.XM.SRC+2-RWDRVX.XM.START
inc RWDRV.XM.RUN+RWDRVX.XM.DST+2-RWDRVX.XM.START
dey
bne RWDRVX.XM.COPY
plp
RWDRVX.XM.MNLC stz RWBankSelect ProDOS always uses LCBANK1
bit RRAMWRAMBNK1
bit RRAMWRAMBNK1
rts
RWDRVX.XM.RWLC lda #$FF
bpl RWDRVX.XM.BANK
bit RRAMWRAMBNK2
bit RRAMWRAMBNK2
RWDRVX.XM.BANK lda #$FF
sta RWBankSelect
rts
RWDRVX.XM.END
*--------------------------------------
RWDRVX.XM.SIZE .EQ RWDRVX.XM.END-RWDRVX.XM.START
*--------------------------------------
RWDRVX.XM.SAVE .BS RWDRVX.XM.SIZE
*--------------------------------------
.EP
*--------------------------------------
RWDRVX.B.END
RWDRVX.SIZE .EQ RWDRVX.B.END-RWDRVX.B.START
*--------------------------------------
* CONTROL SECTION :
*--------------------------------------
.DO RWDRV.RTS=$FF58
.ELSE
ERROR:RWDRV.RTS <> $FF58
.FIN
.DO RWDRV.SIZE>$9B
ERROR:RWDRV.SIZE too big
.FIN
.DO RWDRVX.SIZE>$FE
ERROR:RWDRVX.SIZE too big
.FIN
.DO RWDRVX.XM.SIZE>$F0
ERROR:RWDRVX.XM.SIZE too big
.FIN
*--------------------------------------
MAN
SAVE SYS/KM.RAMWORKS.S
ASM

0
SYS/KM.SATURN.S.txt Normal file
View File