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.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 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 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 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
				bra .8

.1				>LDYAI MSG.RAMDRV.KO1
				bra .8

.2				>LDYAI MSG.RAMDRV.OK

.8				jsr PrintFYA
*--------------------------------------
A2osX.SetupQC	lda RRAMWRAMBNK2
				lda RRAMWRAMBNK2

				ldx #0
.1				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 .1

				lda 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 #MLIQUIT
				.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 #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
				sta CLRPAGE2
				
				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				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 SETPAGE2
				sta (TmpPtr2),y

				pla
				lsr
				lsr
				lsr
				lsr
				tax
				lda PALETTE.MAIN,x
				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
				
				tax
				lda PALETTE.AUX,x
				asl
				asl
				asl
				asl
				sta SETPAGE2
				ora (TmpPtr2),y
				sta (TmpPtr2),y

				pla
				lsr
				lsr
				lsr
				lsr
				tax
				lda PALETTE.MAIN,x
				asl
				asl
				asl
				asl
				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				plx
				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
*--------------------------------------
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 #MLISETPREFIX
				.DA MLISETPREFIX02
				bcs .19

				jsr MLI
				.DA #MLIOPEN
				.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 #MLIREAD
				.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 #MLICLOSE
				.DA MLICLOSE01
				bcs .99

				jsr MLI
				.DA #MLISETPREFIX
				.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 #MLIOPEN
				.DA MLIOPEN02
				bcs .99

				lda MLIOPEN02+5
				sta MLIREAD02+1
				sta MLICLOSE02+1

				jsr MLI
				.DA #MLIREAD
				.DA MLIREAD02
				bcs .98

				jsr .9
				jmp A2osX.PMLOAD

.98				pha
				jsr .9
				pla

				sec
				rts

.9				jsr MLI
				.DA #MLICLOSE
				.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
