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

				>LDYA PAKME.MAIN
				>STYA ZPInBufPtr
				>LDYAI CORE.Run
				>STYA ZPOutBufPtr
				jsr X.Unpak

				sta SETWRITEAUX

				>LDYA PAKME.AUX
				>STYA ZPInBufPtr
				>LDYAI Mem.XHiMem
				>STYA ZPOutBufPtr
				jsr X.Unpak

				sta CLRWRITEAUX
				
				>LDYA PAKME.GP
				>STYA ZPInBufPtr
				>LDYAI A2osX.SYSCALL
				>STYA ZPOutBufPtr
				jsr X.Unpak

				sta SETALTZP
				bit RRAMWRAMBNK2
				bit RRAMWRAMBNK2

				>LDYA PAKME.D2
				>STYA ZPInBufPtr
				>LDYAI $D000
				>STYA ZPOutBufPtr
				jsr X.Unpak
				
				bit RRAMWRAMBNK1
				bit RRAMWRAMBNK1

				>LDYA PAKME.D1
				>STYA ZPInBufPtr
				>LDYAI $D000
				>STYA ZPOutBufPtr
				jsr X.Unpak

				>LDYA PAKME.E0
				>STYA ZPInBufPtr
				>LDYAI $E000
				>STYA ZPOutBufPtr
				jsr X.Unpak

				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 SETMIXED
				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

				jsr Mem.SetOwner
				lda #1
				sta CORE.PSCount
				>LDYAI K.STACKTOP
				>STYA pStack
				sta pBase+1

				>PUSHWI FD.NULL
				>PUSHWI FD.NULL.NAME
				>SYSCALL2 MKDev
	
				jsr SysScrInit
				bcs *
				>PUSHWI DEV.CONSOLE
				>PUSHBI	O.RDWR
				>PUSHBI S.FI.T.TXT
				>PUSHWZ					Aux type
				>SYSCALL2 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	>PUSHWI MSG.Init3
				>PUSHBI 0
				>SYSCALL2 printf

				jsr HW.Detect
		
				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

				>PUSHWI MSG.CTRLR
				>PUSHBI 0
				>SYSCALL2 printf
				>PUSHWI CTRLR.SHELL
				bra .8

.7				>PUSHWI MSG.EtcInit
				>PUSHWI ETCINIT.CMDLINE
				>PUSHBI 2
				>SYSCALL2 printf

				>PUSHWI ETCINIT.CMDLINE

.8				>PUSHBI 0				PS Flags
				>SYSCALL2 ExecL
				bcs Kernel.Init3.Err
				
				>PUSHWI MSG.Init3.OK
				>PUSHBI 0
				>SYSCALL2 printf
				>DEBUGOA

				jmp CORE.Run
Kernel.Init3.Err
				pha
				>PUSHWI MSG.StartupErr
				pla
				>PUSHA
				>PUSHBI 1
				>SYSCALL2 printf
				bra *					No need to discard Expanded CMDLINE 
*--------------------------------------
* INIT2 Subs
*--------------------------------------
KConfigLoad		>LDYAI MSG.KCREAD
				jsr PrintFYA

				jsr MLI
				.DA #MLIGETFILEINFOEX
				.DA MLIGETFILEINFOEX00
				bcc .1
				eor #MLI.E.BADCALL
				beq .2					regular ProDOS
				
				ror CORE.FSID			Bad file, but ProDOS.FX detected
				bra .9

.1				sec
				ror CORE.FSID			File Present & ProDOS.FX detected

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

.9				>LDYAI MSG.KCREAD.KO
				
.8				jsr PrintFYA
				lda CORE.FSID
				beq .99
				
				>LDYAI MSG.PRODOSFX
				jsr PrintFYA

.99				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.TTY
				>PUSHWI FD.CONSOLE.NAME
				
				>SYSCALL2 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
				>PUSHWI FD.TTY.NAME
				>SYSCALL2 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
*--------------------------------------
* http://www.1000bit.it/support/manuali/apple/technotes/misc/tn.misc.02.html
* https://mirrors.apple2.org.za/apple.cabi.net/FAQs.and.INFO/A2.TECH.NOTES.ETC/A2.CLASSIC.TNTS/a2misc007(1).htm
*--------------------------------------
HW.Detect		>PUSHWI MSG.HW
				>PUSHBI 0
				>SYSCALL2 printf

				bit RROMBNK1
				
				stz A2osX.HWType
				stz A2osX.HWSubT
				
				sec
				jsr $FE1F				IIgs ?
				bcs .2
				
				lda #A2osX.HWType.IIgs
				sta A2osX.HWType

				cpy #2
				bne .1
				
				iny

.1				sty A2osX.HWSubT
				bra .8

.2				lda $FBC0
				beq .4					//c
				
				ldx #A2osX.HWType.IIe
				stx A2osX.HWType
				cmp #$EA
				beq .8					//e OLD ROMs
				
				inc A2osX.HWSubT		//e Enh ROMs
				lda $FBDD
				cmp #2
				bne .8
				
				inc A2osX.HWSubT		//e LC card
				bra .8
				
.4				lda #A2osX.HWType.IIc
				sta A2osX.HWType
				lda $FBBF
				sta A2osX.HWSubT
	
.8				bit RRAMWRAMBNK1
				bit RRAMWRAMBNK1
				
				>PUSHWI MSG.HW.TypeSubT
				>PUSHB A2osX.HWType
				>PUSHB A2osX.HWSubT
				>PUSHBI 2
				>SYSCALL2 printf

				rts
*--------------------------------------
CPU.Init.6502	>PUSHWI MSG.CPU
				>PUSHBI 0
				>SYSCALL2 printf
				jsr Detect6502			A = CPU type
				sta A2osX.CPUTYPE
				and #$F
				asl
				tax
				ldy MSG.CPUTYPE,x
				lda MSG.CPUTYPE+1,x
				>SYSCALL2 puts

				>PUSHWI MSG.CPU.SPEED
				>PUSHBI 0
				>SYSCALL2 printf

				stz A2osX.RANDOM16
				stz A2osX.RANDOM16+1

				php
				sei
				
				clc
				lda MACHID
				and #MACHID.T
				eor #MACHID.T.IIc
				bne	.1

				sec
.1				ror ZPPtr1				save //c flag

				bpl .11
				
				sta CLRIOUDIS
				lda IO.IIC.RDVBLMSK
				sta ZPPtr1+1			Save VBLIRQ enable
								
				sta IO.IIC.ENVBL
				
.11				bit VBL
				bpl .11
				
				bit ZPPtr1				//c ?
				bpl .2
				
				lda IO.IIC.CLRVBLIRQ	yes, clear IRQ

.2				lda VBL
				bmi .2

				ldx #2
				
.20				bit ZPPtr1				//c ?
				bpl .3

				lda IO.IIC.CLRVBLIRQ	yes, clear IRQ
				lda #0					wait for UP again
				
.3				ldy #4					(2)

.4				dey						(2)
				bne .4					(2*)

				inc A2osX.RANDOM16		(6)
				bne .5					(2*)

				inc A2osX.RANDOM16+1	(6)

				bra .6					(3)
				
.5				nop						(2)
				nop						(2)
				nop						(2)

				bra .6					(3)
				
.6				eor VBL					(4)
				bpl .3					(2*)

				dex
				bne .20

				bit ZPPtr1					//c ?

				bpl .60
				
				lda IO.IIC.CLRVBLIRQ		yes, clear IRQ
				
				bit ZPPtr1+1				Disable VBLIRQ ?
				bpl .60
				
				sta IO.IIC.DISVBL

.60				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

				>PUSHWI MSG.CPU.SPEEDOK
				lda A2osX.CPUSPEED
				>PUSHA					push CPU speed HI
				lda A2osX.CPUSPEED+1
				>PUSHA					push CPU speed LO
				>PUSHBI 2
				>SYSCALL2 printf
				rts
*--------------------------------------
CPU.Init.Z80	>PUSHWI MSG.Z80
				>PUSHBI 0
				>SYSCALL2 printf
				jsr DetectZ80
				bcs .9
				sta A2osX.Z80SLOT
				tax
				lda #A2osX.S.Z80
				sta A2osX.S,x
				
				>PUSHWI MSG.Z80.OK
				lda A2osX.Z80SLOT
				>PUSHA
				>PUSHBI 1
				>SYSCALL2 printf
				rts
.9				>LDYAI MSG.Z80.KO
				>SYSCALL2 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
*--------------------------------------
DevMgrInit		>LDYAI MSG.DEV
				>SYSCALL2 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
				bne .6					$Cn07=00 : SmartPort

				jsr DevMgrInit.SP
				lda #A2osX.S.SP
				bra .7
	
.53				jsr DevMgrInit.RSP		Remapped SP devices....
				bra .8					don't mark slot as busy
	
.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
				.HS 2C					BIT ABS
*--------------------------------------
DevMgrInit.DII	ldx #2
				.HS 2C					BIT ABS
*--------------------------------------
DevMgrInit.USR	ldx #4
				.HS 2C					BIT ABS
*--------------------------------------
DevMgrInit.BLK	ldx #6
				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
				.HS 2C					BIT ABS

DevMgrInit.RSP	ldx #10
*--------------------------------------
DevMgrInit.AddBDev
				>LDYA DRV.BLKDEV,x
				>STYA FD.BDEV+S.FD.DEV.DRVPTR
				
				>PUSHWI MSG.BLKDEV
				>PUSHWI FD.BDEV.NAME
				>PUSHW FD.BDEV+S.FD.DEV.BUSPTR
				>PUSHW MSG.BLKDEV.TBL,x
				>PUSHBI 6
				>SYSCALL2 printf

				>PUSHWI FD.BDEV
				>PUSHWI FD.BDEV.NAME
				>SYSCALL2 MKDev
DevMgrInit.AddBDev.RTS
				rts
*--------------------------------------
* Setup AuxLC $FFFE->Kernel IRQ Handler
* if irq not handled, jmp (S.IrqMgrOldFFFE)
*--------------------------------------
IrqMgrInit		>LDYAI MSG.IRQ
				>SYSCALL2 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 .9
				lda K.MLI.PARAMS+1
				sta IRQ.INTNUM

				plp
*--------------------------------------
				lda A2osX.HWType
				cmp #A2osX.HWType.IIgs
				bne .1
				
				lda #"G"
				sta IRQ.Mode
				
				lda #$08
				tsb IO.IIGS.INTEN
				
				jsr IrqMgrInit.HZ2Tick
				
				>LDYAI K.IrqH.IIGS
				jsr IrqMgrInit.SetV
				
				>LDYAI MSG.IRQ.IIGS
				bra .8
				
.1				cmp #A2osX.HWType.IIc
				beq .2
				
				jsr IrqMgrInit.TClock
				bcs .2

				lda #"C"
				sta IRQ.Mode
				>LDYAI K.IrqH.TCLOCK
				jsr IrqMgrInit.SetV
				
				>LDYAI MSG.IRQ.CLOCK
				bra .8

.2				jsr IrqMgrInit.Mouse
				bcs .3

				lda #"V"
				sta IRQ.Mode
				>LDYAI K.IrqH.VBL
				jsr IrqMgrInit.SetV
				
				>LDYAI MSG.IRQ.VBL
				bra .8

.3				jsr IrqMgrInit.HZ2Tick

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

.9				plp
				sec
				rts
*--------------------------------------
IrqMgrInit.SetV	>STYA K.IrqHAuxLC.JSR+1
				>STYA GP.IrqH.JSR+1
				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
				lda A2osX.HZ
				sta CORE.TickPer10t
				sta CORE.Tick10t
				asl
				asl
				clc
				adc A2osX.HZ
				
				asl

				sta CORE.TickPerSec
				sta CORE.TickSec

				rts
*--------------------------------------
EvtMgrInit		>LDYAI MSG.EVT
				>SYSCALL2 puts
				stz CORE.EvtCount
				lda #$A5
				sta A2osX.RANDOM16
				lda #$9B
				sta A2osX.RANDOM16+1

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

				>LDYAI K.ENV.SIZE		get a buffer for ENV
				>SYSCALL NewStkObj		Buffer in AUX mem
				bcs EvtMgrInit.RTS

				>STYA ZPPtr1

				txa

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

				sta CLRWRITEAUX
				
				>LDYAI $2E0				Get ROOT from QC
				>SYSCALL2 strdup
				bcs .9

				txa
				ldy #S.PS.hCWD
				sta (pPs),y

				>PUSHWI I.ENV.BOOT
				>PUSHWI $2C0			Get BOOT from QC
				>SYSCALL2 SetEnv
				bcs .9

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

				>PUSHWI I.ENV.PATH
				>SYSCALL2 PutEnv
				bcs .9

				>PUSHWI I.ENV.LIB
				>SYSCALL2 PutEnv
				bcs .9

				>PUSHWI I.ENV.DRV
				>SYSCALL2 PutEnv
.9				rts
*--------------------------------------
PwdMgrInit		>LDYAI MSG.PWD
				>SYSCALL2 puts

				>PUSHWI ETCPASSWD
				>PUSHBI	O.RDONLY	
				>PUSHBI S.FI.T.TXT
				>PUSHWZ				Aux type
				>SYSCALL2 LoadStkObj
				bcs .1
				stx PWD.hDB
				>STYA PWD.DBSize
*--------------------------------------
.1				>LDYAI PwdMgr.ROOT.Size
				jsr K.Getmem
				>STYA ZPPtr1
				stx S.Table.hSession
				
				ldy #S.PS.hStdIn
				lda (pPS),y
				sta S.Table.hFile
				
				lda #1
				ldy #S.PS.hSID
				sta (pPS),y
				
				ldy #PwdMgr.ROOT.Size-1
.2				lda PwdMgr.ROOT,y
				sta (ZPPtr1),y
				dey
				bpl .2
				
				rts
*--------------------------------------
* 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 ZP.IsDigit.9
ZP.IsDigit		cmp #'0'
				bcc ZP.IsDigit.9
				cmp #'9'+1
				rts
ZP.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.PRODOSFX	.AZ "!!!Running under ProDOS.FX!!! Enabling lowercase mode.\n"
MSG.Init2.OK	.AZ "A2osX[Stage2]:Complete.\n"
*--------------------------------------
SYSSCREEN.TOP	.AZ "A2osX 0.94 Console"
MSG.Init3		.AS "A2osX[Stage3]:Init"
				.AZ "\r\n*** Press Ctrl-R for ROOT Mode ***\r\n"
MSG.DEV			.AZ "Device Manager..."
*--------------------------------------
MSG.BLKDEV		.AZ "  Adding Device: /dev/%s, Addr:%H, 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
				.DA MSG.BLKDEV.RSP
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 "Smart Port"
MSG.BLKDEV.RSP	.AZ "Remapped SP"
DRV.BLKDEV		.DA DRV.RamDrive
				.DA DRV.DiskII
				.DA DRV.BlkDevice
				.DA DRV.BlkDevice
				.DA DRV.SmartPort
				.DA DRV.BlkDevice
*--------------------------------------
MSG.IRQ			.AZ "Interrupt Manager..."
MSG.IRQ.IIGS	.AZ "  Apple IIgs VBL IRQ Activated."
MSG.IRQ.VBL		.AZ "  Mouse Card 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.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.HW			.AZ "Checking Hardware..."
MSG.HW.TypeSubT	.AZ "Type=%h,SubT=%h\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"
ETCINIT.CMDLINE	.AZ "${ROOT}etc/init"
ETCPASSWD		.AZ "${ROOT}etc/passwd"
*--------------------------------------
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
*--------------------------------------
MLIGETFILEINFOEX00
				.DA #2
				.DA MLIOPEN00.FN
				.DA FIEX
FIEX			.BS S.FIEX
*--------------------------------------
MLIOPEN00		.DA #3
				.DA MLIOPEN00.FN
				.DA $B000			
				.BS 1
MLIOPEN00.FN	>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
*--------------------------------------
MAN
SAVE USR/SRC/SYS/KERNEL.S.INIT
LOAD USR/SRC/SYS/KERNEL.S
ASM
