Files
A2osX/A2osX.S.txt
2025-01-19 17:12:51 +01:00

720 lines
13 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/rom.ii.i
.INB inc/mli.i
.INB inc/mli.e.i
.INB inc/zp.i
.INB inc/gfx.i
*--------------------------------------
pRWReg .EQ 0 x.printf.s
*--------------------------------------
TmpPtr1 .EQ $0 main & aux ZP
TmpPtr2 .EQ $2 main & aux ZP
*--------------------------------------
A2osX.PMLOAD .EQ $2000
A2osX.LOGOLOAD .EQ $4000
A2osX.PMMAXLEN .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
Sys.Prefix .EQ $8B00 MLI.MAXPATH
PM.Filename .EQ $8B80 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 /SYSTEM.END-$1F00
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 IO.RROMBNK1
jsr ROM.HOME
>LDYAI MSG.INIT0
jsr X.PrintF
>LDYAI MSG.SYSMEM
jsr X.PrintF
lda MLI.MACHID
and #MACHID.M
cmp #MACHID.M.128
beq A2osX.Init1.128
>LDYAI MSG.SYSMEM.KO
jsr X.PrintF
bra *
*--------------------------------------
A2osX.Init1.128 jsr MLI
.DA #MLI.GETPREFIX
.DA MLIGETPREFIX01
bcs *
ldx Boot.Prefix
.1 lda Boot.Prefix,x
sta Logo.Filename,x
sta Sys.Prefix,x
sta PM.Filename,x
sta A2osX.QC.B.BOOT,x
sta A2osX.QC.B.ROOT,x
dex
bpl .1
jsr A2osX.Screen80
>LDYAI MSG.INIT0
jsr X.PrintF
lda #Boot.Prefix
pha
lda /Boot.Prefix
pha
>LDYAI MSG.BOOTPREFIX
jsr X.PrintF
>LDYAI MSG.SYSMEM
jsr X.PrintF
>LDYAI MSG.SYSMEM.OK
jsr X.PrintF
>LDYAI MSG.CPU
jsr X.PrintF
sed Test 6502 BCD bug
lda #$99
clc
adc #$01
cld
bpl .2 if minus, BUG!, we have 6502
>LDYAI MSG.CPU.KO
jsr X.PrintF
bra *
.2 >LDYAI MSG.CPU.OK
jsr X.PrintF
stz MLI.FLEVEL Back To FILE LEVEL 0
jsr MLI Make sure all files are closed
.DA #MLI.CLOSE
.DA MLICLOSE01
bcs *
*--------------------------------------
A2osX.RamDrv >LDYAI MSG.RAMDRV
jsr X.PrintF
jsr DisableRamDRV
bcc .2
tax
bne .1
>LDYAI MSG.RAMDRV.KO0
bra .8
.1 >LDYAI MSG.RAMDRV.KO1
bra .8
.2 >LDYAI MSG.RAMDRV.OK
.8 jsr X.PrintF
*--------------------------------------
A2osX.SetupQC bit IO.RRAMWRAMBNK2
bit IO.RRAMWRAMBNK2
lda MLI.KVER
cmp #$8D
bne .1
sta IO.SETALTZP
.1 ldx #0
.2 lda A2osX.QC.B.Start,x Still at $2xxx !!! not moved to $1xxx
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 .2
lda MLI.KVER
cmp #$8D
bne .3
sta IO.CLRALTZP
bra A2osX.MLIQuit
.3 bit IO.RROMBNK1
*--------------------------------------
A2osX.EnumPM >LDYAI MSG.PMENUM do this After SetupQC, a PM could override QC
jsr X.PrintF
jsr EnumPM
*--------------------------------------
A2osX.MLIQuit >LDYAI MSG.INIT0OK
jsr X.PrintF
>DEBUGOA
stz $280 Quit to A2osX
jsr MLI
.DA #MLI.QUIT
.DA MLIQUIT01
bra *
*--------------------------------------
A2osX.Screen80 lda #$8C Reset 80 col screen ($0C:HOME)
jsr $C300
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 #MLI.OPEN
.DA MLIOPEN00
bcs .99
lda MLIOPEN00+5
sta MLIREAD00+1
sta MLICLOSE00+1
jsr MLI
.DA #MLI.READ
.DA MLIREAD00
bcs .98
jsr .98
bra A2osX.ScreenDLGR
.98 jsr MLI
.DA #MLI.CLOSE
.DA MLICLOSE00
.99 rts
*--------------------------------------
A2osX.ScreenDLGR
lda #20
sta ZP.WNDTOP
sta ZP.CV
jsr ROM.TABV
* sta IO.SETALTCHAR
sta IO.CLRHIRES
sta IO.SETMIXED
* sta IO.SET80DISP
* sta IO.SET80STORE
* sta IO.CLRPAGE2
bit IO.RDIOUDIS
sta IO.SETIOUDIS
sta IO.SETDHIRES
bmi .10
sta IO.CLRIOUDIS
.10 sta IO.CLRTEXT
lda #A2osX.LOGOLOAD+S.BM
sta TmpPtr1
lda /A2osX.LOGOLOAD+S.BM
sta TmpPtr1+1
ldx #0
.1 phx
lda SCR.BASEL,x
sta TmpPtr2
lda SCR.BASEH,x
sta TmpPtr2+1
ldy #0
.2 lda (TmpPtr1),y
pha
and #$f
tax
lda PALETTE.AUX,x
sta IO.SETPAGE2
sta (TmpPtr2),y
pla
lsr
lsr
lsr
lsr
tax
lda PALETTE.MAIN,x
sta IO.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
tax
lda PALETTE.AUX,x
asl
asl
asl
asl
sta IO.SETPAGE2
ora (TmpPtr2),y
sta (TmpPtr2),y
pla
lsr
lsr
lsr
lsr
tax
lda PALETTE.MAIN,x
asl
asl
asl
asl
sta IO.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 plx
inx
cpx #20
bne .1
rts
*--------------------------------------
DisableRamDRV php
sei
lda MLI.DEVPTRS3D2
cmp MLI.DEVPTRS S0D1=NOVEV
bne .1
lda MLI.DEVPTRS3D2+1
cmp MLI.DEVPTRS+1 S0D1=NODEV
beq .9 S3D2=NODEV, nothing to do
.1 ldx MLI.DEVCNT
.2 lda MLI.DEVLST,x LOOKING FOR $BF, $BB, $B7, $B3, $B0
and #$F3
cmp #$B3
beq .3
cmp #$B0 RAMWORKS
beq .3
dex
bpl .2
plp
lda #1 No device found, exit with error
sec
rts
.3 cpx MLI.DEVCNT
beq .5
.4 lda MLI.DEVLST+1,x
sta MLI.DEVLST,x
inx
cpx MLI.DEVCNT
bne .4
.5 ldx MLI.DEVCNT
stz MLI.DEVLST,x
dec MLI.DEVCNT
lda MLI.DEVPTRS
sta MLI.DEVPTRS3D2
lda MLI.DEVPTRS+1
sta MLI.DEVPTRS3D2+1
plp
jsr MLI
.DA #MLI.ONLINE
.DA MLIONLINE01
clc Success!!
rts
.9 plp
lda #0 Not detected
sec
rts
*--------------------------------------
EnumPM.EPB .EQ $0D
EnumPM.EL .EQ $27
*--------------------------------------
EnumPM ldx #0
ldy Boot.Prefix
.1 inx
lda SYS,x
sta Sys.Prefix+1,y
sta PM.Filename+1,y
iny
cpx SYS
bne .1
sty Sys.Prefix
sty PM.Filename
lda #Sys.Prefix
pha
lda /Sys.Prefix
pha
>LDYAI MSG.PMSYSDIR
jsr X.PrintF
jsr MLI
.DA #MLI.SETPREFIX
.DA MLISETPREFIX02
bcs .19
jsr MLI
.DA #MLI.OPEN
.DA MLIOPEN01
bcc .10
.19 pha
>LDYAI MSG.PMSYSDIR.KO
jsr X.PrintF
sec
rts
.10 lda MLIOPEN01+5
sta MLIREAD01+1
sta MLICLOSE01+1
.2 jsr MLI
.DA #MLI.READ
.DA MLIREAD01
bcs .98
lda #EnumPM.EPB
sta EnumPM.EC
>LDYAI A2osX.ReadBuff+4
>STYA EnumPM.BPTR
.3 >LDYA EnumPM.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 PM. at least enough chars for PM.*?
bcc .5 no, skip
ldy #$10 file type
lda (TmpPtr1),y
cmp #$06 'BIN'?
bne .5 skip
ldy PM.
.4 lda (TmpPtr1),y PM.* ?
cmp PM.,y
bne .5
dey
bne .4
jsr LoadPM
.5 lda EnumPM.BPTR
clc
adc #EnumPM.EL
sta EnumPM.BPTR
bcc .6
inc EnumPM.BPTR+1
.6 dec EnumPM.EC
bne .3
bra .2
.98 cmp #MLI.E.EOF
beq .8
pha
jsr .8
pla
sec
rts
.8 jsr MLI
.DA #MLI.CLOSE
.DA MLICLOSE01
bcs .99
jsr MLI
.DA #MLI.SETPREFIX
.DA MLISETPREFIX01
.99 rts
*--------------------------------------
EnumPM.EC .BS 1
EnumPM.BPTR .BS 2
*--------------------------------------
LoadPM ldy #$1c
lda (TmpPtr1),y
sta LoadPM.VERSION
iny
lda (TmpPtr1),y
sta LoadPM.MVERSION
ldx Sys.Prefix
lda (TmpPtr1)
and #$0F
tay
clc
adc sys.Prefix
sta PM.Filename
tax
.2 bit LoadPM.MVERSION
bpl .6
cpy #8
bcs .3
lda LoadPM.Bits,y
bit LoadPM.MVERSION
beq .6
bra .4
.3 lda LoadPM.Bits-8,y
bit LoadPM.VERSION
beq .6
.4 lda (TmpPtr1),y
eor #$20
.HS 2C BIT ABS
.6 lda (TmpPtr1),y
sta PM.Filename,x
dex
dey
bne .2
lda #PM.Filename
pha
lda /PM.Filename
pha
>LDYAI MSG.PMLOAD
jsr X.PrintF
jsr MLI
.DA #MLI.OPEN
.DA MLIOPEN02
bcs .99
lda MLIOPEN02+5
sta MLIREAD02+1
sta MLICLOSE02+1
jsr MLI
.DA #MLI.READ
.DA MLIREAD02
bcs .98
jsr .9
jmp A2osX.PMLOAD
.98 pha
jsr .9
pla
sec
rts
.9 jsr MLI
.DA #MLI.CLOSE
.DA MLICLOSE02
.99 rts
*--------------------------------------
LoadPM.VERSION .BS 1
LoadPM.MVERSION .BS 1
LoadPM.Bits .HS 8040201008040201
*--------------------------------------
.INB usr/src/shared/x.printf.s
*--------------------------------------
MSG.INIT0 .CZ "A2osX[Stage0]:Init\r"
MSG.SYSMEM .CZ "Checking System Memory..."
MSG.SYSMEM.OK .CZ "128k Detected.\r"
MSG.SYSMEM.KO .CZ "A2osX Requires At Least 128k Memory.\r"
MSG.CPU .CZ "Checking CPU..."
MSG.CPU.OK .CZ "65C02 CPU (or higher) Detected.\r"
MSG.CPU.KO .CZ "A2osX Requires At Least A 65C02 CPU.\r"
MSG.RAMDRV .CZ "Checking ProDOS RamDrive..."
MSG.RAMDRV.OK .CZ "Successfully Disabled.\r"
MSG.RAMDRV.KO0 .CZ "Not Detected.\r"
MSG.RAMDRV.KO1 .CZ "Uninstall Failed.\r"
MSG.BOOTPREFIX .CZ "Boot Prefix:%S\r"
MSG.PMENUM .CZ "Looking For ProDOS Modules...\r"
MSG.PMSYSDIR .CZ "SYS dir is %S\r"
MSG.PMSYSDIR.KO .CZ "***Error : $%h\r"
MSG.PMLOAD .CZ "***Loading PM : %S\r"
MSG.INIT0OK .CZ "A2osX[Stage0]:Complete.\r"
*--------------------------------------
MLIGETPREFIX01
MLISETPREFIX01 .DA #1
.DA Boot.Prefix
*--------------------------------------
MLISETPREFIX02 .DA #1
.DA Sys.Prefix
*--------------------------------------
MLIONLINE01 .DA #2
* .DA #0
.DA #$B0 S3D2
.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 Sys.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 PM.Filename
.DA A2osX.OpenBuff2
.BS 1
MLIREAD02 .DA #4
.BS 1
.DA A2osX.PMLOAD Load address for PMs
.DA A2osX.PMMAXLEN Maxlen of PM
.BS 2
MLICLOSE02 .DA #1
.BS 1
*--------------------------------------
MLIQUIT01 .DA #4
.DA #0
.DA 0
.DA #0
.DA 0
*--------------------------------------
A2osX.LOGO .PS "A2osX.logo"
SYS .PS "sys/"
PM. .PS "PM."
*--------------------------------------
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.MAIN .HS 00.02.04.06.08.0A.0C.0E
.HS 01.03.05.07.09.0B.0D.0F
PALETTE.AUX .HS 00.01.02.03.04.05.06.07
.HS 08.09.0A.0B.0C.0D.0E.0F
*--------------------------------------
.EP
.LIST ON
SYSTEM.END .EQ *
.LIST OFF
*--------------------------------------
A2osX.QC.B.Start
A2osX.QC.B.BOOT .EQ *+4
A2osX.QC.B.ROOT .EQ *+4+64
.INB usr/src/a2osx.s.qc
*--------------------------------------
MAN
SAVE usr/src/a2osx.s
ASM