PR#3
PREFIX /A2OSX.BOOT
DELETE A2OSX.SYSTEM
PREFIX /A2OSX.SRC
NEW
INC 1
AUTO 8
				.LIST OFF
				.OP	65C02
				.OR	$2000
				.TF /A2OSX.BOOT/A2OSX.SYSTEM,TSYS
*--------------------------------------
				.INB INC/MACROS.I
				.INB INC/A2OSX.I
				.INB INC/IO.I
				.INB INC/MONITOR.I
				.INB INC/PRODOS.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 DEVPTRS0D1
				bne .1
				lda DEVPTRS3D2+1
				cmp DEVPTRS0D1+1
				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 DEVPTRS0D1
				sta DEVPTRS3D2
				lda DEVPTRS0D1+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 X.PRINTF.S
*--------------------------------------
MSG.INIT0		>CSTRING "A2osX[Stage0]:Init\n"
MSG.SYSMEM		>CSTRING "Checking System Memory..."
MSG.SYSMEM.OK	>CSTRING "128k Detected.\n"
MSG.SYSMEM.KO	>CSTRING "A2osX Requires At Least 128k Memory.\n"

MSG.CPU			>CSTRING "Checking CPU..."
MSG.CPU.OK		>CSTRING "65C02 CPU (or higher) Detected.\n"
MSG.CPU.KO		>CSTRING "A2osX Requires At Least A 65C02 CPU.\n"

MSG.RAMDRV		>CSTRING "Checking ProDOS RamDrive..."
MSG.RAMDRV.OK	>CSTRING "Successfully Disabled.\n"
MSG.RAMDRV.KO0	>CSTRING "Not Detected.\n"
MSG.RAMDRV.KO1	>CSTRING "Uninstall Failed !!!\n"

MSG.BOOTPREFIX	>CSTRING "Boot Prefix:"

MSG.KMENUM		>CSTRING "Looking For Kernel Modules...\n"
MSG.KMLOAD		>CSTRING "***Loading KM : "
MSG.INIT0OK		>CSTRING "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				>PSTRING "SYS/"
KM.PREFIX		>PSTRING "KM."
*--------------------------------------
				.EP
*--------------------------------------
A2osX.QC.B.Start
				.INB A2OSX.S.QC
*--------------------------------------
MAN
SAVE A2OSX.S
ASM
