NEW
  AUTO 3,1
*--------------------------------------
Kernel.Init2	sei
 				ldx	#$FF
				txs
				sta SETALTZP

				stx A2osX.SaveSM
				stx A2osX.SaveSX

				ldx #Kernel.ZP.S-1
				
.1				lda Kernel.ZP,x			
				sta CHARGET,x
				dex
				bpl .1

				sta CLRALTZP
				
				>LDYAI MSG.Init2
				jsr PrintFYA
				
				>LDYAI A2osX.MAIN
				>STYA ZPPtr1
				>LDYAI CORE.Run
				>STYA ZPPtr2
				>LDYAI A2osX.MAIN.S^$FFFF

				jsr Kernel.Move

				>LDYAI A2osX.AUX
				>STYA A1L				Src Start Address (MAIN)
				>LDYAI A2osX.GP
				>STYA A2L				Src End Address (MAIN)
				>LDYAI X.GUIOSD
				>STYA A4L				Dst Address (AUX)
				sec	  				Main To Aux
				jsr AuxMove
				
				>LDYAI A2osX.GP
				>STYA ZPPtr1
				>LDYAI A2osX.SYSCALL
				>STYA ZPPtr2
				>LDYAI A2osX.GP.S^$FFFF

				jsr Kernel.Move
				
				sta SETALTZP
				bit RRAMWRAMBNK2
				bit RRAMWRAMBNK2

				>LDYAI A2osX.D2
				>STYA ZPPtr1
				>LDYAI $D000
				>STYA ZPPtr2
				>LDYAI A2osX.D2.S^$FFFF

				jsr Kernel.Move
				
				bit RRAMWRAMBNK1
				bit RRAMWRAMBNK1

				>LDYAI A2osX.D1
				>STYA ZPPtr1
				>LDYAI $D000
				>STYA ZPPtr2
				>LDYAI A2osX.D1.S^$FFFF

				jsr Kernel.Move
				
				>LDYAI A2osX.E0
				>STYA ZPPtr1
				>LDYAI $E000
				>STYA ZPPtr2
				>LDYAI A2osX.E0.S^$FFFF

				jsr Kernel.Move
				
				bit RROMBNK1
				sta CLRALTZP
				cli
				
				jsr KConfigLoad
				
				lda A2osX.HZ
				pha
				>LDYAI MSG.HZ
				jsr PrintFYA
				
				>LDYAI MSG.Init2.OK
				jsr PrintFYA
*--------------------------------------
				>DEBUGOA
*--------------------------------------
Kernel.Init3	sta SETALTZP
				bit RRAMWRAMBNK1
				bit RRAMWRAMBNK1
				
				lda #$ff				Make sure we are in Kernel Mode during setup
				sta IRQ.InKernel
				stz IRQ.InLib

				sta SETALTCHAR
				sta CLRMIXED
				sta CLRHIRES
				sta SET80STORE
				sta CLRPAGE2
				sta SETDHIRES

				jsr MemMgrInit

				>LDYAI S.PS				Select Process 0 (Kernel)
				jsr K.GetMem0
				>STYA pPs
				stx PS.Table.hPS

				lda #1
				sta CORE.PSCount
				
				>LDYAI K.STACKTOP
				>STYA pStack
				sta pLocal+1

				>PUSHWI FD.NULL.NAME
				>LDYAI FD.NULL
				>SYSCALL MKDev

				jsr SysScrInit
				bcs *
				
				>PUSHWI 0				Aux type
				>PUSHBI S.FI.T.TXT
				>PUSHBI	O.RDWR
				>LDYAI DEV.CONSOLE
				>SYSCALL fopen
				bcs *
	
				ldy #S.PS.hStdIn
				sta (pPs),y
				iny						#S.PS.hStdOut
				sta (pPs),y
				iny						#S.PS.hStdErr
				sta (pPs),y
*--------------------------------------
Kernel.Init3C	>LDYAI MSG.Init3
				>SYSCALL puts

				jsr CPU.Init.6502

				jsr CPU.Init.Z80

				jsr DevMgrInit

				jsr IrqMgrInit
				bcs *

				jsr EvtMgrInit

				jsr TskMgrInit
				bcs *

				jsr PwdMgrInit

				lda KBD
				bpl .7
				sta KBDSTROBE
				cmp #146				CTRL-R for ROOT mode
				bne .7
				
				>PUSHBI 0
				>LDYAI MSG.CTRLR
				>SYSCALL printf
				
				>PUSHBI 0				PS Flags
				>LDYAI CTRLR.SHELL
				bra .8
				
.7				>PUSHWI ETCINIT.CMDLINE
				>PUSHBI 2
				>LDYAI MSG.EtcInit
				>SYSCALL printf

				>PUSHBI 0				PS Flags
				>LDYAI ETCINIT.CMDLINE
				
.8				>SYSCALL ExecL
						
				bcs Kernel.Init3.Err
				
				>PUSHBI 0
				>LDYAI MSG.Init3.OK
				>SYSCALL printf
				
				>DEBUGOA

				jmp CORE.Run
				
Kernel.Init3.Err
				>PUSHA
				>PUSHBI 1
				>LDYAI MSG.StartupErr
				>SYSCALL printf
				bra *					No need to discard Expanded CMDLINE 
*--------------------------------------
* INIT2 Subs
*--------------------------------------
Kernel.Move		>STYA ZPPtr3

				ldy #0

.1				inc ZPPtr3
				bne .2
				inc ZPPtr3+1
				beq .9
			
.2				lda (ZPPtr1),y
				sta (ZPPtr2),y
				iny
				bne .1
				
				inc ZPPtr1+1
				inc ZPPtr2+1
				bne .1
				
.9				rts				
*--------------------------------------
KConfigLoad		>LDYAI MSG.KCREAD
				jsr PrintFYA

				jsr MLI
				.DA #MLIOPEN
				.DA MLIOPEN00
				bcs .9

				lda MLIOPEN00+5
				sta MLIREAD00+1
				sta MLICLOSE00+1
				
				jsr MLI
				.DA #MLIREAD
				.DA MLIREAD00
				php
				pha
				jsr MLI
				.DA #MLICLOSE
				.DA MLICLOSE00
				pla
				plp
				bcs .9
				
				>LDYAI MSG.KCREAD.OK
				jsr PrintFYA
				rts
				
.9				>LDYAI MSG.KCREAD.KO
				jsr PrintFYA
				rts
*--------------------------------------
* INIT3 Subs
*--------------------------------------
MemMgrInit		>LDYAI Mem.MHiMem
				>STYA Mem.HiMem
				>STYA Mem.Free
				>LDYAI Mem.MLoMem
				>STYA Mem.LoMem
				stz Mem.LastSlot		Reserve Slot #0

				sta SETWRITEAUX

				>LDYAI Mem.XLoMem
				>STYA Mem.LoMem

				stz Mem.LastSlot		Reserve Slot #0
				
				sta CLRWRITEAUX

				ldx #K.DEV.MAX*2-1
				
.1				stz Dev.Table,x
				dex
				bpl .1
				
				ldx #K.FLT.MAX*2-1
				
.11				stz Flt.Table.hPath,x
				dex
				bpl .11

				ldx #K.NOD.MAX*2-1
				
.2				stz Nod.Table.hPath,x
				dex
				bpl .2
				
				ldx #K.PS.MAX*4-1
				
.3				stz PS.Table.PID,x
				dex
				bpl .3
				
				ldx #K.OF.MAX*2-1
				
.4				stz OF.Table.hPath,x
				dex
				bpl .4

				ldx #K.EVT.MAX*S.EVT-1
				
.5				stz Evt.Table,x
				dex
				bpl .5
				
				ldx #K.USR.MAX*2-1
				
.6				stz S.Table.hSession,x
				dex
				bpl .6
				
				rts
*--------------------------------------
SysScrInit		>LDYAI Mem.XHiMem
				>STYA FD.TTY+S.FD.DEV.BUFPTR

				jsr SysScrInit.TTYPtrs

				>PUSHWI FD.CONSOLE.NAME
				>LDYAI FD.TTY
				>SYSCALL MKDev
				bcs .9
				
				ldx A2osX.TTYDEVS
				
.1				phx
				inc FD.TTY+S.FD.DEV.DEVID
				inc FD.TTY.NAME+3
				
				jsr SysScrInit.TTYPtrs
				
				>PUSHWI FD.TTY.NAME
				>LDYAI FD.TTY
				>SYSCALL MKDev
				
				plx
				bcs .9
				
				dex
				bne .1
				
				>LDYA FD.TTY+S.FD.DEV.BUFPTR
				sta SETWRITEAUX
				>STYA Mem.HiMem
				>STYA Mem.Free
				sta CLRWRITEAUX
				
				clc
.9				rts
*--------------------------------------
SysScrInit.TTYPtrs
				lda DevMgr.Free
				sta FD.TTY+S.FD.DEV.DCBPTR
				sta .1+1
				
				clc
				adc #S.DCB.TTY
				sta DevMgr.Free

				lda DevMgr.Free+1
				sta FD.TTY+S.FD.DEV.DCBPTR+1
				sta .1+2

				adc /S.DCB.TTY
				sta DevMgr.Free+1
				
				ldx #S.DCB.TTY-1
				
.1				stz $ffff,x				SELF MODIFIED
				dex
				bpl .1
				
				lda FD.TTY+S.FD.DEV.BUFPTR
				sec
				sbc #TTY.BUF.SIZE
				sta FD.TTY+S.FD.DEV.BUFPTR

				lda FD.TTY+S.FD.DEV.BUFPTR+1
				sbc /TTY.BUF.SIZE
				sta FD.TTY+S.FD.DEV.BUFPTR+1
				
				rts
*--------------------------------------
CPU.Init.6502	>PUSHBI 0
				>LDYAI MSG.CPU
				>SYSCALL printf
				
				jsr Detect6502			A = CPU type
				sta A2osX.CPUTYPE
				
				and #$F
				asl
				tax
				ldy MSG.CPUTYPE,x
				lda MSG.CPUTYPE+1,x
				
				>SYSCALL puts

				lda MACHID
				and #MACHID.T
				cmp #MACHID.T.IIc
				bne	.10

				jmp CPU.Init.Z80
				
.10				>PUSHBI 0
				>LDYAI MSG.CPU.SPEED
				>SYSCALL printf

				stz A2osX.RANDOM16
				stz A2osX.RANDOM16+1
				
				php
				sei
				
.1				bit VBL
				bpl .2

.2				bit VBL
				bmi .2

				ldx #0					Count LO
				lda #0					Count HI
				
.3				ldy #3					(2)
				
.4				nop						(2)
				dey						(2)
				bne .4					(2*)
				
				inc A2osX.RANDOM16		(6)
				bne .5					(2*)
				
				inc A2osX.RANDOM16+1	(6)
				bit VBL					(4)
				bpl .3					(2*)
				bmi .6
				
.5				nop						(2)
				nop						(2)
				nop						(2)
				bit VBL					(4)
				bpl .3					(2*)
				
.6				plp

				stz A2osX.CPUSPEED
				
.7				sec
				lda A2osX.RANDOM16
				sbc #100
				tax
				lda A2osX.RANDOM16+1
				sbc /100
				bcc .8
				
				stx A2osX.RANDOM16
				sta A2osX.RANDOM16+1
				inc A2osX.CPUSPEED
				bra .7

.8				lda A2osX.RANDOM16
				sta A2osX.CPUSPEED+1
				>PUSHA					push CPU speed LO
				lda A2osX.CPUSPEED
				>PUSHA					push CPU speed HI
				>PUSHBI 2
				>LDYAI MSG.CPU.SPEEDOK
				>SYSCALL printf
				rts
*--------------------------------------
CPU.Init.Z80	>PUSHBI 0
				>LDYAI MSG.Z80
				>SYSCALL printf
				
				jsr DetectZ80
				bcs .9
				sta A2osX.Z80SLOT
				>PUSHA
				
				tax
				lda #A2osX.S.Z80
				sta A2osX.S,x
				
				>PUSHBI 1
				>LDYAI MSG.Z80.OK
				>SYSCALL printf
				rts
				
.9				>LDYAI MSG.Z80.KO
				>SYSCALL puts
				rts
*--------------------------------------
* Out:
*  A = $60, 6502
*  A = $61, 65C02
*  A = $62, 65R02
*  A = $63, 65816
*--------------------------------------
Detect6502		ldy #0					Test 6502 BCD bug
				sed
				lda #$99
				clc
				adc #$01
				cld
				bmi .9					BUG!, we have 6502

				ldy #3					test 65C816 TYX Instruction
				ldx #0
				.OP 65816
				tyx						TYX: if 65C816, x becomes non-zero
				.OP 65C02
				bne .9					worked! 65C816

				dey						y=2 -> R65C02
				ldx $EA					save zp $EA
				stz $EA					store 0 in $EA
*				.OP 65R02
				.HS F7EA				For compatibility with A2osX.ASM
*				smb 7,$EA				if not Rockwell, assemble as nop nop
*				.OP	65C02
				asl $EA					cs if Rockwell
				stx $EA					restore zp $EA
				bcs .9
				
				dey						y=1 -> 65C02
				
.9				tya
				ora #$60
				rts
*--------------------------------------
* Out:
*  A = Z80 Slot
*--------------------------------------
DetectZ80		ldx #Z80Code.Size
.1				lda Z80Code.Start-1,x
				sta Z80CODE-1,x			00000H for Z80
				dex
				bne .1
				
				stz ZPPtr1
				lda #$C1
				sta ZPPtr1+1
				
.2				sta (ZPPtr1)
				lda $100D
				bmi .8
				inc ZPPtr1+1
				lda ZPPtr1+1
				cmp #$C8
				beq .9					CS
				clc
				adc #$20
				sta $100A
				bra .2
				
.8				lda ZPPtr1+1
				and #$0F
				clc
.9				rts
*--------------------------------------
* Setup AuxLC $FFFE->Kernel IRQ Handler
* if irq not handled, jmp (S.IrqMgrOldFFFE)
*--------------------------------------
IrqMgrInit		>LDYAI MSG.IRQ
				>SYSCALL puts
				
				php
				sei
				>LDYA $FFFE
				>STYA K.IrqHAuxLC.JMP+1
				>LDYAI K.IrqHAuxLC
				>STYA $FFFE

				>LDYAI GP.IrqH
				>STYA K.MLI.PARAMS+2

				>MLICALL MLIALLOCIRQ
				bcs .90
				
				lda K.MLI.PARAMS+1
				sta IRQ.INTNUM

				plp
				
				jsr IrqMgrInit.TClock
				bcs .1
								
				lda #"C"
				sta IRQ.Mode
				
				>LDYAI K.IrqH.TCLOCK
				>STYA K.IrqHAuxLC.JSR+1
				>STYA GP.IrqH.JSR+1
				
				>LDYAI MSG.IRQ.CLOCK
				>SYSCALL puts
				
				clc
				rts

.1				jsr IrqMgrInit.Mouse
				bcs .8
								
				lda #"V"
				sta IRQ.Mode
				
				>LDYAI K.IrqH.VBL
				>STYA K.IrqHAuxLC.JSR+1
				>STYA GP.IrqH.JSR+1
								
				>LDYAI MSG.IRQ.VBL
				>SYSCALL puts
				
				clc
				rts
				
.8				jsr IrqMgrInit.HZ2Tick

				lda #"P"
				sta IRQ.Mode
				
				>LDYAI MSG.IRQ.POLL
				>SYSCALL puts
				
				clc
				rts

.90				plp
.9				sec
				rts				
*--------------------------------------
IrqMgrInit.TClock
				stz ZPPtr1				Try finding a TClock Card...
				lda #$C1
				sta ZPPtr1+1
				
.1				ldy #TClock.SIG.Cnt-1

.2				lda (ZPPtr1),y
				cmp TClock.SIG,y
				bne .3
				dey
				bpl .2
				bra .4
				
.3				inc ZPPtr1+1			no match, try next slot....
				lda ZPPtr1+1
				cmp #$C8
				bne .1	
				
				sec
				rts

.4				lda ZPPtr1+1			get $Cn
				and #$f
				tax						get $0n
				asl
				asl
				asl
				asl
				tay						get $n0
				sty IRQ.VBL.n0
				
				lda #A2osX.S.CLK
				sta A2osX.S,x
				
				php
				sei
				
				lda #$40+$20			Enable interrupt + 64Hz
				sta $c080,y
				
				lda #$40	
				sta CLRPAGE2
				sta $478,x
				sta $7f8,x

				lda #64
				sta CORE.TickPerSec
				sta CORE.TickSec
				
				lda #11
				sta CORE.TickPer10t
				sta CORE.Tick10t
				
				dec CORE.IRQMode
				
				plp
				
				clc
				rts
*--------------------------------------
IrqMgrInit.Mouse
				stz ZPPtr1				Try finding a Mouse Card...
				lda #$C1
				sta ZPPtr1+1
				
.1				ldx #Mouse.SIG-Mouse.OFS-1

.2				ldy Mouse.OFS,x
				lda (ZPPtr1),y
				cmp Mouse.SIG,x
				bne .3
				dex
				bpl .2
				bra .4
				
.3				inc ZPPtr1+1			no match, try next slot....
				lda ZPPtr1+1
				cmp #$C8
				bne .1	

				sec
				rts
				
.4				lda ZPPtr1+1

				sta .11+2
				sta K.IrqH.VBL.MSM+2
				sta K.IrqH.VBL.MRM+2
				
				and #$0f
				sta IRQ.VBL.0n
				asl
				asl
				asl
				asl

				sta IRQ.VBL.n0

				php
				sei
				
				bit RROMBNK2			Renable ROM to allow MOUSE II firmware works properly
				
				ldy #INITMOUSE
				jsr .10
				
				ldy #SETMOUSE
				lda #MOUSEMODx.INTVBL+MOUSEMODx.ACTIVE
				jsr .10

				bit RRAMWRAMBNK1		Back To LC Ram
				bit RRAMWRAMBNK1
				
				ldy #SERVEMOUSE
				lda (ZPPtr1),y
				sta K.IrqH.VBL.MSM+1

				ldy #READMOUSE
				lda (ZPPtr1),y
				sta K.IrqH.VBL.MRM+1

				jsr IrqMgrInit.HZ2Tick
				
				dec CORE.IRQMode
				
				plp
				clc				
				rts
				
.9				plp
				sec
				rts

.10				pha
				lda (ZPPtr1),y
				sta .11+1
				pla
				
				ldx .11+2				Cn
				ldy IRQ.VBL.n0

.11				jmp $ffff				SELF MODIFIED
*--------------------------------------
IrqMgrInit.HZ2Tick
				ldx #50
				lda A2osX.HZ
				sta CORE.TickPer10t
				sta CORE.Tick10t
				cmp #5
				beq .1
				ldx #60
				
.1				stx CORE.TickPerSec
				stx CORE.TickSec

				rts
*--------------------------------------
DevMgrInit		>LDYAI MSG.DEV
				>SYSCALL puts
				
				lda DEVCNT
				sta .1+1
				
.1				ldx #$ff				SELF MODIFIED
				lda DEVLST,x
				
				and #$F0
				
				asl
				php						Save Drive 1/2 in C
				ror						DSSS0000
				
				lsr
				lsr
				lsr

				tax						000DSSS0
				lsr						0000DSSS
				and #$7
				sta FD.BDEV+S.FD.DEV.BUSID
				ora #$30
				sta FD.BDEV.NAME+1		SnDy
				
				lda DEVPTRS,x
				sta FD.BDEV+S.FD.DEV.BUSPTR
				
				lda DEVPTRS+1,x
				sta FD.BDEV+S.FD.DEV.BUSPTR+1
				
				sta ZPPtr1+1			
				stz ZPPtr1				Cn00
				
				plp
				lda #0
				adc #1					Make DevID 1 or 2
				sta FD.BDEV+S.FD.DEV.DEVID
				ora #$30
				sta FD.BDEV.NAME+3		SxDn
				
				lda ZPPtr1+1

				cmp #$FF				/RAM is always $FF00
				bne .2

				jsr DevMgrInit.RAM
				bra .8					keep slot free
				
.2				cmp #$D0				Disk II Driver is $D000
				bne .3
				
				jsr DevMgrInit.DII
				lda #A2osX.S.DII
				bra .7					Go mark slot as USED
				
.3				bcs .53					> $D0, Some BLK remapped DRV
				
				cmp #$C0
				bcs .4					$C0 .. $CF, in slot ROM 
				
				jsr DevMgrInit.USR		Outside ROM/LC space, User loaded BLK dev
				bra .8					keep slot free
				
.4				ldx #SmartPort.SIG-SmartPort.OFS-1

.5				ldy SmartPort.OFS,x			Check if there is a smartport firmware
				lda (ZPPtr1),y
				cmp SmartPort.SIG,x
				bne .8						not a Disk Controller...
				dex
				bpl .5
				
				ldy #7
				lda (ZPPtr1),y
				beq .51						$Cn07=00 : SmartPort
				
				ldx #AWSmartPort.SIG-AWSmartPort.OFS-1
				
.50				ldy AWSmartPort.OFS,x		Check if there is AWsmartport firmware
				lda (ZPPtr1),y
				cmp AWSmartPort.SIG,x
				bne .6						not on AW
				dex
				bpl .50

.51				lda ZPPtr1+1				get $Cn
				and #$f						get $0n
				cmp FD.BDEV+S.FD.DEV.BUSID 	same as SSS ?
				beq .52
				
				inc FD.BDEV+S.FD.DEV.DEVID		Remapped SP devices....
				inc FD.BDEV+S.FD.DEV.DEVID		Add 2 to DEVID (2 & 3)
				
				jsr DevMgrInit.SP
				bra .8							Phantom slot...
				
.52				jsr DevMgrInit.SP
				lda #A2osX.S.SP
				bra .7
	
.53				inc FD.BDEV+S.FD.DEV.DEVID		Remapped BLK devices....
				inc FD.BDEV+S.FD.DEV.DEVID		Add 2 to DEVID (2 & 3)
	
.6				jsr DevMgrInit.BLK
				lda #A2osX.S.BLK
				
.7				ldx FD.BDEV+S.FD.DEV.BUSID
				sta A2osX.S,x
				
.8				dec .1+1
				bmi .80
				jmp .1
				
.80				clc
				rts
*--------------------------------------
DevMgrInit.RAM	ldx #0
				>LDYAI DRV.RamDrive
				bra DevMgrInit.AddBDev
*--------------------------------------
DevMgrInit.DII	ldx #2
				>LDYAI DRV.DiskII
				bra DevMgrInit.AddBDev
*--------------------------------------
DevMgrInit.USR	ldx #4
				>LDYAI DRV.BlkDevice
				bra DevMgrInit.AddBDev			
*--------------------------------------
DevMgrInit.BLK	ldy #$ff
				lda (ZPPtr1),y
				sta FD.BDEV+S.FD.DEV.BUSPTR
				
				ldx #6
				>LDYAI DRV.BlkDevice
				bra DevMgrInit.AddBDev
*--------------------------------------
DevMgrInit.SP	ldy #$ff
				lda (ZPPtr1),y
				clc
				adc #3					Compute smartport entry point
				sta FD.BDEV+S.FD.DEV.BUSPTR
				
				ldx #8
				>LDYAI DRV.SmartPort
*--------------------------------------
DevMgrInit.AddBDev
				>STYA FD.BDEV+S.FD.DEV.DRVPTR
				
				>PUSHW MSG.BLKDEV.TBL,x
				>PUSHWI FD.BDEV.NAME
				>PUSHBI 4
				>LDYAI MSG.BLKDEV
				>SYSCALL printf
				
				>PUSHWI FD.BDEV.NAME
				>LDYAI FD.BDEV 
				>SYSCALL MKDev

DevMgrInit.AddBDev.RTS				
				rts
*--------------------------------------
EvtMgrInit		>LDYAI MSG.EVT
				>SYSCALL puts
				
				stz CORE.EvtCount
				
				lda #$A5
				sta A2osX.TIMER16
				lda #$9B
				sta A2osX.TIMER16+1

				lda /Evt.Table
				sta pEvent+1
				clc
EvtMgrInit.RTS	rts
*--------------------------------------
TskMgrInit		>LDYAI MSG.TSK
				>SYSCALL puts

				>LDYAI K.ENV.SIZE		get a buffer for ENV
				jsr K.GetMem
				bcs EvtMgrInit.RTS
				
				>STYA ZPPtr1
				
				ldy #S.PS.ENVPAGECNT
				lda /K.ENV.SIZE
				sta (pPs),y

				txa
*				ldy #S.PS.hENV
				iny
				sta (pPs),y
				
				lda #0
				sta (ZPPtr1)			make sure blank!!

				>LDYAI $2E0				Get ROOT from QC
				>SYSCALL strdup
				bcs .9
				
				txa
				ldy #S.PS.hPREFIX
				
				>PUSHWI $2C0			Get BOOT from QC
				>LDYAI I.ENV.BOOT
				>SYSCALL SetEnv
				bcs .9

				>PUSHWI $2E0			Get ROOT from QC
				>LDYAI I.ENV.ROOT
				>SYSCALL SetEnv
				bcs .9

				>LDYAI I.ENV.PATH
				>SYSCALL PutEnv
				bcs .9

				>LDYAI I.ENV.LIB
				>SYSCALL PutEnv
				bcs .9

				>LDYAI I.ENV.DRV
				>SYSCALL PutEnv
.9				rts
*--------------------------------------
PwdMgrInit		>LDYAI MSG.PWD
				>SYSCALL puts
				
				>PUSHWI 0				Aux type
				>PUSHBI S.FI.T.TXT
				>PUSHBI	O.RDONLY	
				>LDYAI ETCPASSWD
				>SYSCALL LoadStkObj
				bcs .1
				stx PWD.hDB
				>STYA PWD.DBSize
*--------------------------------------
.1				>LDYAI PwdMgr.ROOT.Size
				jsr K.Getmem
				>STYA pSession
				stx S.Table.hSession
				
				lda #1
				ldy #S.PS.hSID
				sta (pPS),y
				
				ldy #PwdMgr.ROOT.Size-1
				
.2				lda PwdMgr.ROOT,y
				sta (pSession),y
				dey
				bpl .2
				
				ldy #S.PS.hStdIn
				lda (pPS),y
				
				sta S.Table.hFile
				rts
*--------------------------------------
PwdMgr.ROOT		.DA #S.SESSION.P.ROOT
				.DA #0					UID
				.DA #0					GID
				.AZ "ROOT"				NAME
				.AZ "Root User"			GECOS
				.AZ "${ROOT}ROOT/"		DIR
				.AZ "${ROOT}BIN/SH"		SHELL
PwdMgr.ROOT.Size	.EQ	*-PwdMgr.ROOT
*--------------------------------------
* Modified CHARGET/CHARGOT for ROM CALL
* CHRGET         .EQ $B1 - C8
*--------------------------------------
Kernel.ZP		.PH $B1
CHARGET			inc TXTPTR
				bne CHARGOT
				inc TXTPTR+1
				
CHARGOT			lda $ffff
				beq IsDigit.9
				
IsDigit			cmp #'0'
				bcc IsDigit.9
				cmp #'9'+1
				rts
				
IsDigit.9		sec
				rts				
				.EP
Kernel.ZP.S		.EQ *-Kernel.ZP				
*--------------------------------------
Z80Code.Start	.HS	31FF00				START:	LD SP,000FFH		Init Stack
				.HS	3EFF						LD A,0FFH			Set Flag
				.HS	320D00						LD (FLAG),A
				.HS	3200E1						LD (0E100H),A		Back to 6502
				.HS	18F3						JR START			Loop
				.HS 00					FLAG:	.DB 0
Z80Code.Size	.EQ *-Z80Code.Start
*--------------------------------------				
Mouse.OFS		.HS 05070B0CFB
Mouse.SIG		.HS 38180120D6
*--------------------------------------	
TClock.SIG		.HS	0878282c58ff700538b00118b8087848
				.HS 8a489848adffcf201ac86868ba8df807
TClock.SIG.Cnt	.EQ *-TClock.SIG
*--------------------------------------
MSG.Init2		.AZ "A2osX[Stage2]:Init\nRelocating Kernel...\n"
MSG.HZ			.AZ "Kernel SYS Timer Set For %d0 hz Machine.\n"
MSG.KCREAD		.AZ "Reading Kernel Config File..."
MSG.KCREAD.OK	.AZ "OK\n"
MSG.KCREAD.KO	.AZ "\nError While Reading Kernel Config File, Using Default.\n"
MSG.Init2.OK	.AZ "A2osX[Stage2]:Complete.\n"
*--------------------------------------
SYSSCREEN.TOP	.AZ "A2osX 0.93 Console"
MSG.Init3		.AZ "A2osX[Stage3]:Init *** Press Ctrl-R for ROOT Mode ***"
MSG.DEV			.AZ "Device Manager..."
MSG.BLKDEV		.AZ "  Adding Device: /DEV/%s, Type: %s\r\n"
MSG.BLKDEV.TBL	.DA MSG.BLKDEV.RAM
				.DA MSG.BLKDEV.DII
				.DA MSG.BLKDEV.USR
				.DA MSG.BLKDEV.BLK
				.DA MSG.BLKDEV.SP
MSG.BLKDEV.RAM	.AZ "/RAM Disk"
MSG.BLKDEV.DII	.AZ "Disk ]["
MSG.BLKDEV.USR	.AZ "User"
MSG.BLKDEV.BLK	.AZ "Generic Block"
MSG.BLKDEV.SP	.AZ "Smartport"
MSG.IRQ			.AZ "Interrupt Manager..."
MSG.IRQ.VBL		.AZ "  Mouse VBL IRQ Activated."
MSG.IRQ.CLOCK	.AZ "  Clock Card IRQ Activated."
MSG.IRQ.POLL	.AZ "  Polling Mode."
MSG.EVT			.AZ "Event Manager..."
MSG.TSK			.AZ "Task Manager..."
MSG.PWD			.AZ "Password Manager..."
MSG.BOOTROOT	.AZ "Boot Path:%S\r\nRoot Path:%S\r\n"
MSG.CTRLR		.AZ "Ctrl-R Pressed, entering ROOT mode..."
MSG.PWDINIT		.AZ "Loading ETC/PASSWD file..."
MSG.ETCINIT		.AZ "Executing %s..."
MSG.StartupErr	.AZ "Failed : [$%h]\r\n"
MSG.Init3.OK	.AZ "OK\r\nA2osX[Stage3]:Complete.\r\n"
*--------------------------------------
MSG.CPU			.AZ "Checking CPU..."
MSG.CPUTYPE		.DA MSG.6502
				.DA MSG.65C02
				.DA MSG.65R02
				.DA MSG.65816
MSG.6502		.AZ "6502."
MSG.65C02		.AZ "65C02."
MSG.65R02		.AZ "65R02."
MSG.65816		.AZ "65816."
MSG.CPU.SPEED	.AZ "Checking CPU Speed..."
MSG.CPU.SPEEDOK	.AZ "%d.%02d Mhz.\r\n"
MSG.Z80			.AZ "Checking Z80 CPU..."
MSG.Z80.OK		.AZ "Detected In Slot %d.\r\n"
MSG.Z80.KO		.AZ "Not Detected."
*--------------------------------------
DEV.CONSOLE		.AZ "/DEV/CONSOLE"
RAMx			.AZ "/RAMx"
I.ENV.BOOT		.AZ "BOOT"
I.ENV.ROOT		.AZ "ROOT"
I.ENV.PATH		.AZ "PATH=${BOOT}SBIN/:${BOOT}BIN/"
I.ENV.LIB		.AZ "LIB=${BOOT}LIB/"
I.ENV.DRV		.AZ "DRV=${BOOT}DRV/"
CTRLR.SHELL		.AZ "${BOOT}BIN/SH"
ETCPASSWD		.AZ "${ROOT}ETC/PASSWD"
ETCINIT.CMDLINE	.AZ "${ROOT}ETC/INIT"
*--------------------------------------
MLIOPEN00		.DA #3
				.DA .1
				.DA $B000			
				.BS 1
.1				>PSTR "A2osX.KCONFIG"
*--------------------------------------
MLIREAD00		.DA #4
				.BS 1
				.DA A2osX.KCONFIG
				.DA 16
				.BS 2
*--------------------------------------
MLICLOSE00		.DA #1
				.BS 1
*--------------------------------------
FD.NULL			.DA #S.FD.T.CDEV
				.DA #0					HANDLER
				.DA #0					BUSID
				.DA #0					DEVID
				.DA 0					BUSPTR
				.DA DRV.NULL
				.DA 0					DCBPTR
				.DA 0					BUFPTR
FD.NULL.NAME	.AZ "NULL"				NAME
*--------------------------------------
FD.TTY			.DA #S.FD.T.CDEV
				.DA #0					HANDLER
				.DA #0					BUSID
				.DA #1					DEVID
				.DA 0					BUSPTR
				.DA DRV.TERM
				.BS 2					DCBPTR
				.BS 2					BUFPTR
*--------------------------------------
FD.CONSOLE.NAME	.AZ "CONSOLE"
FD.TTY.NAME		.AZ "TTY0"
*--------------------------------------
FD.BDEV			.DA #S.FD.T.BDEV
				.DA #0					HANDLER
				.DA #0					BUSID
				.DA #0					DEVID
				.BS 2					BUSPTR
				.BS 2					DRVPTR
				.DA 0					DCBPTR
				.DA 0					BUFPTR
FD.BDEV.NAME	.AZ "S1D1"
*--------------------------------------
SmartPort.OFS	.HS 010305
SmartPort.SIG	.HS 200003
AWSmartPort.OFS	.HS 12131415161718191A1B
AWSmartPort.SIG	.HS A9008DF2C0A9708DF3C0
*--------------------------------------
MAN
SAVE USR/SRC/SYS/KERNEL.S.INIT
LOAD USR/SRC/SYS/KERNEL.S
ASM
