PR#3 PREFIX /A2OSX.SRC NEW INC 1 AUTO 6 .LIST OFF .OP 65C02 .OR $2000 .TF /A2OSX.BOOT/A2OSX *-------------------------------------- .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.RelocAddr .EQ $1000 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 *-------------------------------------- A2osX.Start .EQ * .PH A2osX.RelocAddr A2osX.Init0 ldx #$FF init 6502 stack to highest txs >LDYAI A2osX.Start >STYA TmpPtr1 >LDYAI A2osX.RelocAddr >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 bit RROMBNK1 jsr HOME >LDAXI MSG.STAGE0 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=FF=HOME) jsr $C300 >LDAXI MSG.STAGE0 jsr PrintCStrAX >LDAXI MSG.SYSMEM jsr PrintCStrAX >LDAXI MSG.SYSMEM.OK jsr PrintCStrAX >LDAXI MSG.CPU jsr PrintCStrAX jsr Init6502 Y = CPU type tya ora #$60 sta A2osX.CPUTYPE lda MSG.CPUTYPEH,y tax lda MSG.CPUTYPEL,y jsr PrintCStrAX lda A2osX.CPUTYPE bne A2osX.Prefix >LDAXI MSG.CPU.KO jsr PrintCStrAX bra * *-------------------------------------- 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.Z80 .1 >LDAXI MSG.RAMDRV.KO1 jsr PrintCStrAX bra A2osX.Z80 .2 >LDAXI MSG.RAMDRV.OK jsr PrintCStrAX *-------------------------------------- A2osX.Z80 >LDAXI MSG.Z80 jsr PrintCStrAX jsr InitZ80 bcs .1 pha Push Z80Slot >LDAXI MSG.Z80.OK jsr PrintCStrAX bra A2osX.SetupQC .1 >LDAXI MSG.Z80.KO 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.GP.B.start,x sta $D300,x inx bne .1 lda RROMBNK1 *-------------------------------------- A2osX.EnumKM >LDAXI MSG.KMENUM jsr PrintCStrAX jsr EnumKM *-------------------------------------- A2osX.MLIQuit >LDAXI MSG.STAGE0OK jsr PrintCStrAX >DEBUG jsr MLI .DA #MLIQUIT .DA MLIQUIT01 bra * *-------------------------------------- * Out: * Y = 0, 6502 * Y = 1, 65C02 * Y = 2, R65C02 * Y = 3, 65C816 *-------------------------------------- Init6502 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 rts *-------------------------------------- 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 *-------------------------------------- InitZ80 ldx #Z80Code.Size .1 lda Z80Code.Start-1,x sta $1000-1,x 00000H for Z80 dex bne .1 stz TmpPtr1 lda #$C1 sta TmpPtr1+1 .2 sta (TmpPtr1) lda $100D bmi .8 inc TmpPtr1+1 lda TmpPtr1+1 cmp #$C8 beq .9 clc adc #$20 sta $100A bra .2 .8 lda TmpPtr1+1 and #$0F sta A2osX.Z80Slot clc rts .9 stz A2osX.Z80Slot 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 A2OSX.S.TOOLS *-------------------------------------- MSG.STAGE0 >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.KO >CSTRING "A2osX Requires At Least A 65C02 CPU.\n" MSG.BOOTPREFIX >CSTRING "Boot Prefix:" 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.Z80 >CSTRING "Detecting Z80 CPU..." MSG.Z80.OK >CSTRING "Detected In Slot %d.\n" MSG.Z80.KO >CSTRING "Not Detected.\n" MSG.KMENUM >CSTRING "Looking For Kernel Modules...\n" MSG.KMLOAD >CSTRING "***Loading KM : " MSG.STAGE0OK >CSTRING "A2osX[Stage0]:Complete.\n" MSG.CPUTYPEL .DA #MSG.6502 .DA #MSG.65C02 .DA #MSG.65R02 .DA #MSG.65816 MSG.CPUTYPEH .DA /MSG.6502 .DA /MSG.65C02 .DA /MSG.65R02 .DA /MSG.65816 MSG.6502 >CSTRING "6502.\n" MSG.65C02 >CSTRING "65C02.\n" MSG.65R02 >CSTRING "65R02.\n" MSG.65816 >CSTRING "65816.\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." HEX .BS 2 BCD .BS 3 bFlag .BS 1 *-------------------------------------- Z80Code.Start .HS 31FFFF START: LD SP,0FFFFH 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.End .EQ * Z80Code.Size .EQ Z80Code.End-Z80Code.Start *-------------------------------------- .EP A2osX.End .EQ * A2osX.SIZE .EQ A2osX.End-A2osX.Start .BS $1000-A2osX.SIZE *-------------------------------------- .INB A2OSX.S.QC .INB A2OSX.S.GP *-------------------------------------- MAN SAVE A2OSX.S ASM