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