A2osX/A2osX.S.txt
2020-06-27 20:30:09 +02:00

648 lines
12 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.

NEW
AUTO 3,1
.LIST OFF
.OP 65C02
.OR $2000
.TF A2OSX.SYSTEM,TSYS
*--------------------------------------
.INB INC/MACROS.I
.INB INC/A2OSX.I
.INB INC/IO.I
.INB INC/MONITOR.I
.INB INC/MLI.I
.INB INC/MLI.E.I
.INB INC/ZP.I
.INB INC/GFX.I
*--------------------------------------
TmpPtr1 .EQ $0 main & aux ZP
TmpPtr2 .EQ $2 main & aux ZP
*--------------------------------------
A2osX.KMLOAD .EQ $2000
A2osX.LOGOLOAD .EQ $4000
A2osX.KMMAXLEN .EQ $6000
A2osX.OpenBuff1 .EQ $8000 1024 Buffer for MLIOPEN01
A2osX.OpenBuff2 .EQ $8400 1024 Buffer for MLIOPEN02
A2osX.ReadBuff .EQ $8800 512 Buffer for MLIREAD01
Boot.Prefix .EQ $8A00 MLI.MAXPATH
LOGO.Filename .EQ $8A80 MLI.MAXPATH
KM.Filename .EQ $8B00 MLI.MAXPATH
MLIONLINE01BUF .EQ $8C00 256
*--------------------------------------
* Kernel Stage 0
*--------------------------------------
SYSTEM.START .EQ *
.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
>LDYAI MSG.INIT0
jsr PrintFYA
>LDYAI MSG.SYSMEM
jsr PrintFYA
lda MACHID
and #MACHID.M
cmp #MACHID.M.128
beq A2osX.Init1.128
>LDYAI MSG.SYSMEM.KO
jsr PrintFYA
bra *
*--------------------------------------
A2osX.Init1.128 jsr MLI
.DA #MLIGETPREFIX
.DA MLIGETPREFIX01
bcs *
ldx Boot.Prefix
.1 lda Boot.Prefix,x
sta A2osX.QC.B.BOOT,x
sta A2osX.QC.B.ROOT,x
dex
bpl .1
jsr A2osX.Screen80
>LDYAI MSG.INIT0
jsr PrintFYA
lda #Boot.Prefix
pha
lda /Boot.Prefix
pha
>LDYAI MSG.BOOTPREFIX
jsr PrintFYA
>LDYAI MSG.SYSMEM
jsr PrintFYA
>LDYAI MSG.SYSMEM.OK
jsr PrintFYA
>LDYAI MSG.CPU
jsr PrintFYA
sed Test 6502 BCD bug
lda #$99
clc
adc #$01
cld
bpl .2 if minus, BUG!, we have 6502
>LDYAI MSG.CPU.KO
jsr PrintFYA
bra *
.2 >LDYAI MSG.CPU.OK
jsr PrintFYA
stz LEVEL Back To FILE LEVEL 0
jsr MLI Make sure all files are closed
.DA #MLICLOSE
.DA MLICLOSE01
bcs *
*--------------------------------------
A2osX.RamDrv >LDYAI MSG.RAMDRV
jsr PrintFYA
jsr DisableRamDRV
bcc .2
tax
bne .1
>LDYAI MSG.RAMDRV.KO0
jsr PrintFYA
bra A2osX.SetupQC
.1 >LDYAI MSG.RAMDRV.KO1
jsr PrintFYA
bra A2osX.SetupQC
.2 >LDYAI MSG.RAMDRV.OK
jsr PrintFYA
*--------------------------------------
A2osX.EnumKM >LDYAI MSG.KMENUM
jsr PrintFYA
jsr EnumKM
bcs *
*--------------------------------------
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.MLIQuit >LDYAI MSG.INIT0OK
jsr PrintFYA
>DEBUGOA
jsr MLI
.DA #MLIQUIT
.DA MLIQUIT01
bra *
*--------------------------------------
A2osX.Screen80 lda #$8C Reset 80 col screen ($0C:HOME)
jsr $C300
ldx Boot.Prefix
.1 lda Boot.Prefix,x
sta LOGO.Filename,x
dex
bne .1
ldx Boot.Prefix
ldy #0
.2 inx
iny
lda A2osX.LOGO,y
sta LOGO.Filename,x
cpy A2osX.LOGO
bne .2
stx LOGO.Filename
jsr MLI
.DA #MLIOPEN
.DA MLIOPEN00
bcs .99
lda MLIOPEN00+5
sta MLIREAD00+1
sta MLICLOSE00+1
jsr MLI
.DA #MLIREAD
.DA MLIREAD00
bcs .98
jsr .98
bra A2osX.ScreenDLGR
.98 jsr MLI
.DA #MLICLOSE
.DA MLICLOSE00
.99 rts
*--------------------------------------
A2osX.ScreenDLGR
lda #20
sta WNDTOP
sta CV
jsr VTAB
sta SETALTCHAR
sta CLRHIRES
sta SETMIXED
sta SET80DISP
sta SET80STORE
bit RDIOUDIS
sta SETIOUDIS
sta SETDHIRES
bmi .10
sta CLRIOUDIS
.10 sta CLRTEXT
lda #A2osX.LOGOLOAD+S.BM
sta TmpPtr1
lda /A2osX.LOGOLOAD+S.BM
sta TmpPtr1+1
ldx #0
.1 lda SCR.BASEL,x
sta TmpPtr2
lda SCR.BASEH,x
sta TmpPtr2+1
ldy #0
.2 lda (TmpPtr1),y
pha
and #$f
phy
tay
lda PALETTE.AUX,y
ply
sta SETPAGE2
sta (TmpPtr2),y
pla
lsr
lsr
lsr
lsr
sta CLRPAGE2
sta (TmpPtr2),y
iny
cpy #40
bne .2
lda TmpPtr1
clc
adc #40
sta TmpPtr1
bcc .3
inc TmpPtr1+1
.3 ldy #0
.4 lda (TmpPtr1),y
pha
and #$f
phy
tay
lda PALETTE.AUX,y
ply
asl
asl
asl
asl
sta SETPAGE2
ora (TmpPtr2),y
sta (TmpPtr2),y
pla
and #$f0
sta CLRPAGE2
ora (TmpPtr2),y
sta (TmpPtr2),y
iny
cpy #40
bne .4
lda TmpPtr1
clc
adc #40
sta TmpPtr1
bcc .7
inc TmpPtr1+1
.7 inx
cpx #20
bne .1
rts
*--------------------------------------
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
lda #Boot.Prefix
pha
lda /Boot.Prefix
pha
>LDYAI MSG.KMSYSDIR
jsr PrintFYA
jsr MLI
.DA #MLIOPEN
.DA MLIOPEN01
bcc .10
pha
>LDYAI MSG.KMSYSDIR.KO
jsr PrintFYA
sec
rts
.10 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 KM.* ?
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
.98 cmp #MLI.E.EOF
beq .8
pha
jsr .8
pla
sec
rts
.8 jsr MLI
.DA #MLICLOSE
.DA MLICLOSE01
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
ldy #$1c
lda (TmpPtr1),y
sta LoadKM.VERSION
iny
lda (TmpPtr1),y
sta LoadKM.MVERSION
ldx Boot.Prefix
lda (TmpPtr1)
and #$0F
tay
clc
adc Boot.Prefix
sta KM.Filename
tax
.2 bit LoadKM.VERSION
bpl .6
cpy #8
bcs .3
lda LoadKM.Bits,y
bit LoadKM.VERSION
beq .6
bra .4
.3 lda LoadKM.Bits-8,y
bit LoadKM.MVERSION
beq .6
.4 lda (TmpPtr1),y
eor #$20
.HS 2C BIT ABS
.6 lda (TmpPtr1),y
sta KM.Filename,x
dex
dey
bne .2
lda #KM.Filename
pha
lda /KM.Filename
pha
>LDYAI MSG.KMLOAD
jsr PrintFYA
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
.98 pha
jsr .9
pla
sec
rts
.9 jsr MLI
.DA #MLICLOSE
.DA MLICLOSE02
.99 rts
*--------------------------------------
LoadKM.VERSION .BS 1
LoadKM.MVERSION .BS 1
LoadKM.Bits .HS 8040201008040201
*--------------------------------------
.INB USR/SRC/SHARED/X.PRINTF.S
*--------------------------------------
MSG.INIT0 .AZ "A2osX[Stage0]:Init\n"
MSG.SYSMEM .AZ "Checking System Memory..."
MSG.SYSMEM.OK .AZ "128k Detected.\n"
MSG.SYSMEM.KO .AZ "A2osX Requires At Least 128k Memory.\n"
MSG.CPU .AZ "Checking CPU..."
MSG.CPU.OK .AZ "65C02 CPU (or higher) Detected.\n"
MSG.CPU.KO .AZ "A2osX Requires At Least A 65C02 CPU.\n"
MSG.RAMDRV .AZ "Checking ProDOS RamDrive..."
MSG.RAMDRV.OK .AZ "Successfully Disabled.\n"
MSG.RAMDRV.KO0 .AZ "Not Detected.\n"
MSG.RAMDRV.KO1 .AZ "Uninstall Failed !!!\n"
MSG.BOOTPREFIX .AZ "Boot Prefix:%S\n"
MSG.KMENUM .AZ "Looking For Kernel Modules...\n"
MSG.KMSYSDIR .AZ "SYS dir is %S\n"
MSG.KMSYSDIR.KO .AZ "***Error : $%h\n"
MSG.KMLOAD .AZ "***Loading KM : %S\n"
MSG.INIT0OK .AZ "A2osX[Stage0]:Complete.\n"
*--------------------------------------
MLIGETPREFIX01 .DA #1
.DA Boot.Prefix
MLIONLINE01 .DA #2
.DA #0
.DA MLIONLINE01BUF
*--------------------------------------
MLIOPEN00 .DA #3 For DIR listing
.DA LOGO.Filename
.DA A2osX.OpenBuff1
.BS 1
MLIREAD00 .DA #4
.BS 1
.DA A2osX.LOGOLOAD
.DA 2048
.BS 2
MLICLOSE00 .DA #1
.BS 1
*--------------------------------------
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
*--------------------------------------
A2osX.LOGO >PSTR "A2osX.logo"
SYS >PSTR "sys/"
KM.PREFIX >PSTR "KM."
*--------------------------------------
SCR.BASEL .HS 00.80.00.80.00.80.00.80.28.A8.28.A8.28.A8.28.A8.50.D0.50.D0.50.D0.50.D0
SCR.BASEH .HS 04.04.05.05.06.06.07.07.04.04.05.05.06.06.07.07.04.04.05.05.06.06.07.07
*--------------------------------------
PALETTE.AUX .HS 00080109020A030B040C050D060E070F
*--------------------------------------
.EP
*--------------------------------------
A2osX.QC.B.Start
A2osX.QC.B.BOOT .EQ *+4
A2osX.QC.B.ROOT .EQ *+4+32
.INB USR/SRC/A2OSX.S.QC
.LIST ON
SYSTEM.END .EQ *
.LIST OFF
*--------------------------------------
MAN
SAVE USR/SRC/A2OSX.S
ASM