A2osX/A2osX.S.txt
2017-03-29 17:48:15 +02:00

428 lines
8.3 KiB
Plaintext
Raw 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.

PR#3
PREFIX /A2OSX.BUILD
NEW
INC 1
AUTO 8
.LIST OFF
.OP 65C02
.OR $2000
.TF /A2OSX.BUILD/A2OSX.SYSTEM,TSYS
*--------------------------------------
.INB /A2OSX.BUILD/INC/MACROS.I
.INB /A2OSX.BUILD/INC/A2OSX.I
.INB /A2OSX.BUILD/INC/IO.I
.INB /A2OSX.BUILD/INC/MONITOR.I
.INB /A2OSX.BUILD/INC/PRODOS.I
.INB /A2OSX.BUILD/INC/MLI.ERR.I
*--------------------------------------
TmpPtr1 .EQ $0 main & aux ZP
TmpPtr2 .EQ $2 main & aux ZP
*--------------------------------------
A2osX.KMLOAD .EQ $2000
A2osX.KMMAXLEN .EQ $4000
A2osX.OpenBuff1 .EQ $6000 1024 Buffer for MLIOPEN01
A2osX.OpenBuff2 .EQ $6400 1024 Buffer for MLIOPEN02
A2osX.ReadBuff .EQ $6800 512 Buffer for MLIREAD01
Boot.Prefix .EQ $6A00 MLI.MAXPATH
KM.Filename .EQ $6A80 MLI.MAXPATH
*--------------------------------------
* Kernel Stage 0
*--------------------------------------
.PH $1000
A2osX.Init0 >LDYAI $2000
>STYA TmpPtr1
>LDYAI $1000
>STYA TmpPtr2
ldx #$10 reloc $2000-$2FFF to $1000-$1FFF
ldy #0
.1 lda (TmpPtr1),y
sta (TmpPtr2),y
iny
bne .1
inc TmpPtr1+1
inc TmpPtr2+1
dex
bne .1
jmp A2osX.Init1
*--------------------------------------
A2osX.Init1 ldx #$FF init 6502 stack to highest
txs
bit RROMBNK1
jsr HOME
>LDAXI MSG.INIT0
jsr PrintCStrAX
>LDAXI MSG.SYSMEM
jsr PrintCStrAX
lda MACHID
and #MACHID.RAM
cmp #MACHID.RAM.128
beq .1
>LDAXI MSG.SYSMEM.KO
jsr PrintCStrAX
bra *
.1 lda #$8C Reset 80 col screen ($0C:HOME)
jsr $C300
>LDAXI MSG.INIT0
jsr PrintCStrAX
>LDAXI MSG.SYSMEM
jsr PrintCStrAX
>LDAXI MSG.SYSMEM.OK
jsr PrintCStrAX
>LDAXI MSG.CPU
jsr PrintCStrAX
sed Test 6502 BCD bug
lda #$99
clc
adc #$01
cld
bpl .2 if minus, BUG!, we have 6502
>LDAXI MSG.CPU.KO
jsr PrintCStrAX
bra *
.2 >LDAXI MSG.CPU.OK
jsr PrintCStrAX
*--------------------------------------
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
bcc .2
tax
bne .1
>LDAXI MSG.RAMDRV.KO0
jsr PrintCStrAX
bra A2osX.SetupQC
.1 >LDAXI MSG.RAMDRV.KO1
jsr PrintCStrAX
bra A2osX.SetupQC
.2 >LDAXI MSG.RAMDRV.OK
jsr PrintCStrAX
*--------------------------------------
A2osX.SetupQC 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.QC.B.Start+$200,x
sta $D300,x
inx
bne .1
lda RROMBNK1
*--------------------------------------
A2osX.EnumKM >LDAXI MSG.KMENUM
jsr PrintCStrAX
jsr EnumKM
*--------------------------------------
A2osX.MLIQuit >LDAXI MSG.INIT0OK
jsr PrintCStrAX
>DEBUGOA
jsr MLI
.DA #MLIQUIT
.DA MLIQUIT01
bra *
*--------------------------------------
DisableRamDRV php
sei
lda DEVPTRS3D2
cmp DEVPTRS S0D1=NOVEV
bne .1
lda DEVPTRS3D2+1
cmp DEVPTRS+1 S0D1=NODEV
beq .9 S3D2=NODEV, nothing to do
.1 ldx DEVCNT
.2 lda DEVLST,x LOOKING FOR $BF, $BB, $B7, $B3
and #$F3
cmp #$B3
beq .3
dex
bpl .2
plp
lda #1 No device found, exit with error
sec
rts
.3 cpx DEVCNT
beq .5
.4 lda DEVLST+1,x
sta DEVLST,x
inx
cpx DEVCNT
bne .4
.5 ldx DEVCNT
stz DEVLST,x
dec DEVCNT
lda DEVPTRS
sta DEVPTRS3D2
lda DEVPTRS+1
sta DEVPTRS3D2+1
plp
jsr MLI
.DA #MLIONLINE
.DA MLIONLINE01
clc Success!!
rts
.9 plp
lda #0 Not detected
sec
rts
EnumKM.EPB .EQ $0D
EnumKM.EL .EQ $27
*--------------------------------------
EnumKM ldx #0
ldy Boot.Prefix
.1 inx
lda SYS,x
sta Boot.Prefix+1,y
iny
cpx SYS
bne .1
sty Boot.Prefix
jsr MLI
.DA #MLIOPEN
.DA MLIOPEN01
bcs .99
lda MLIOPEN01+5
sta MLIREAD01+1
sta MLICLOSE01+1
.2 jsr MLI
.DA #MLIREAD
.DA MLIREAD01
bcs .98
lda #EnumKM.EPB
sta EnumKM.EC
>LDYAI A2osX.ReadBuff+4
>STYA EnumKM.BPTR
.3 >LDYA EnumKM.BPTR
>STYA TmpPtr1
lda (TmpPtr1)
and #$F0 Empty ?
beq .5 yes, skip
and #$C0 anything out of type 1,2 or 3 ?
bne .5 yes, skip
lda (TmpPtr1)
and #$0F
cmp KM.PREFIX at least enough chars for KM.*?
bcc .5 no, skip
ldy #$10 file type
lda (TmpPtr1),y
cmp #$06 'BIN'?
bne .5 skip
ldy KM.PREFIX
.4 lda (TmpPtr1),y
cmp KM.PREFIX,y
bne .5
dey
bne .4
jsr LoadKM
.5 lda EnumKM.BPTR
clc
adc #EnumKM.EL
sta EnumKM.BPTR
bcc .6
inc EnumKM.BPTR+1
.6 dec EnumKM.EC
bne .3
bra .2
.8 jsr MLI
.DA #MLICLOSE
.DA MLICLOSE01
rts
.98 cmp #MLI.ERR.EOF
beq .8
pha
jsr .8
pla
.99 sec
rts
*--------------------------------------
EnumKM.EC .BS 1
EnumKM.BPTR .BS 2
*--------------------------------------
LoadKM ldx Boot.Prefix
.1 lda Boot.Prefix,x
sta KM.Filename,x
dex
bne .1
ldx Boot.Prefix
lda (TmpPtr1)
and #$0F
tay
clc
adc Boot.Prefix
sta KM.Filename
tax
.2 lda (TmpPtr1),y
sta KM.Filename,x
dex
dey
bne .2
>LDAXI MSG.KMLOAD
jsr PrintCStrAX
>LDAXI KM.Filename
jsr PrintPStrAX
jsr CROUT
jsr MLI
.DA #MLIOPEN
.DA MLIOPEN02
bcs .99
lda MLIOPEN02+5
sta MLIREAD02+1
sta MLICLOSE02+1
jsr MLI
.DA #MLIREAD
.DA MLIREAD02
bcs .98
jsr .9
jsr A2osX.KMLOAD
jsr CROUT
.98 pha
jsr .9
pla
sec
rts
.9 jsr MLI
.DA #MLICLOSE
.DA MLICLOSE02
.99 rts
*--------------------------------------
.INB /A2OSX.SRC/X.PRINTF.S
*--------------------------------------
MSG.INIT0 >CSTR "A2osX[Stage0]:Init\n"
MSG.SYSMEM >CSTR "Checking System Memory..."
MSG.SYSMEM.OK >CSTR "128k Detected.\n"
MSG.SYSMEM.KO >CSTR "A2osX Requires At Least 128k Memory.\n"
MSG.CPU >CSTR "Checking CPU..."
MSG.CPU.OK >CSTR "65C02 CPU (or higher) Detected.\n"
MSG.CPU.KO >CSTR "A2osX Requires At Least A 65C02 CPU.\n"
MSG.RAMDRV >CSTR "Checking ProDOS RamDrive..."
MSG.RAMDRV.OK >CSTR "Successfully Disabled.\n"
MSG.RAMDRV.KO0 >CSTR "Not Detected.\n"
MSG.RAMDRV.KO1 >CSTR "Uninstall Failed !!!\n"
MSG.BOOTPREFIX >CSTR "Boot Prefix:"
MSG.KMENUM >CSTR "Looking For Kernel Modules...\n"
MSG.KMLOAD >CSTR "***Loading KM : "
MSG.INIT0OK >CSTR "A2osX[Stage0]:Complete.\n"
*--------------------------------------
MLIGETPREFIX01 .DA #1
.DA Boot.Prefix
MLIONLINE01 .DA #2
.DA #0
.DA MLIONLINE01BUF
MLIONLINE01BUF .BS 256
MLIOPEN01 .DA #3 For DIR listing
.DA Boot.Prefix
.DA A2osX.OpenBuff1
.BS 1
MLIREAD01 .DA #4
.BS 1
.DA A2osX.ReadBuff Load address Dir Blocks
.DA $200 Maxlen of Dir Blocks (512)
.BS 2
MLICLOSE01 .DA #1
.BS 1
MLIOPEN02 .DA #3
.DA KM.Filename
.DA A2osX.OpenBuff2
.BS 1
MLIREAD02 .DA #4
.BS 1
.DA A2osX.KMLOAD Load address for KMs
.DA A2osX.KMMAXLEN Maxlen of KM
.BS 2
MLICLOSE02 .DA #1
.BS 1
MLIQUIT01 .DA #4
.DA #0
.DA 0
.DA #0
.DA 0
*--------------------------------------
SYS >PSTR "SYS/"
KM.PREFIX >PSTR "KM."
*--------------------------------------
.EP
*--------------------------------------
A2osX.QC.B.Start
.INB /A2OSX.SRC/A2OSX.S.QC
*--------------------------------------
MAN
SAVE /A2OSX.SRC/A2OSX.S
ASM