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
*--------------------------------------
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 PrintFYA

				>LDYAI MSG.SYSMEM
				jsr PrintFYA

				lda GP.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 #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 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 GP.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 PrintFYA

				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 PrintFYA
*--------------------------------------
A2osX.SetupQC	lda IO.RRAMWRAMBNK2
				lda IO.RRAMWRAMBNK2

				lda GP.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 GP.KVER
				cmp #$8D
				bne .3
				
				sta IO.CLRALTZP
				
				bra A2osX.MLIQuit

.3				lda IO.RROMBNK1
*--------------------------------------
A2osX.EnumPM	>LDYAI MSG.PMENUM		do this After SetupQC, a PM could override QC
				jsr PrintFYA
				jsr EnumPM
*--------------------------------------
A2osX.MLIQuit	>LDYAI MSG.INIT0OK
				jsr PrintFYA
				>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 GP.DEVPTRS3D2
				cmp GP.DEVPTRS			S0D1=NOVEV				
				bne .1

				lda GP.DEVPTRS3D2+1
				cmp GP.DEVPTRS+1		S0D1=NODEV
				beq .9					S3D2=NODEV, nothing to do

.1				ldx GP.DEVCNT

.2				lda GP.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 GP.DEVCNT
				beq .5

.4				lda GP.DEVLST+1,x
				sta GP.DEVLST,x
				inx
				cpx GP.DEVCNT
				bne .4

.5				ldx GP.DEVCNT
				stz GP.DEVLST,x
				dec GP.DEVCNT
				lda GP.DEVPTRS
				sta GP.DEVPTRS3D2
				lda GP.DEVPTRS+1
				sta GP.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 PrintFYA
	
				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 PrintFYA
				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 PrintFYA

				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
