PR#3 PREFIX /DATA/A2OSX NEW INC 1 AUTO 6 .LIST OFF .OP 65C02 .OR $2000 * .TF A2osX.SYSTEM .TF A *-------------------------------------- .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 LOADER *-------------------------------------- A2osX.INIT php pla sei ldx #$FF init 6502 stack to highest txs stx A2osX.SaveSM pha plp * php EDIT:Already Set By ProDOS * sei * sta SETALTZP Switch to alt ZP * stx A2osX.SaveSX make Alt SP to highest too * sta CLRALTZP Switch to main ZP * plp jsr HOME >LDAXI MSG.STAGE0 jsr PrintCStrAX >LDYAI D.STACKSEG >STYA R.SP init Soft Stack >LDAXI MSG.SYSMEM jsr PrintCStrAX lda MACHID and #MACHIDRAM cmp #MACHIDRAM128 beq .1 >LDAXI MSG.SYSMEM.KO jsr PrintCStrAX bra * .1 >LDAXI MSG.SYSMEM.OK jsr PrintCStrAX >LDAXI MSG.CPU jsr PrintCStrAX jsr Init6502 ldy 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 beq .1 >LDAXI MSG.RAMDRV.KO1 jsr PrintCStrAX bra A2osX.Z80 .1 >LDAXI MSG.RAMDRV.KO0 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.MLIQuit .1 >LDAXI MSG.Z80.KO jsr PrintCStrAX *-------------------------------------- A2osX.MLIQuit >LDAXI MSG.STAGE0OK jsr PrintCStrAX jsr SetupQuitCode >DEBUG jsr MLI .DA #MLIQUIT .DA MLIQUIT01 bra * *-------------------------------------- * Out: * A = 0, 6502 * A = 1, 65C02 * A = 2, R65C02 * A = 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 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 sty A2osX.CPUTYPE 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 ldx #0 .4 lda DEVLST+1,x sta DEVLST,x inx cpx DEVCNT bne .4 stz DEVLST,x dec DEVCNT lda DEVPTRS0D1 sta DEVPTRS3D2 lda DEVPTRS0D1+1 sta DEVPTRS3D2+1 plp clc Success!! rts .9 plp lda #0 Not detected sec rts *-------------------------------------- SetupQuitCode 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 rts *-------------------------------------- PrintCStrAX >STAX TmpPtr1 pla sta TmpPtr2 pla sta TmpPtr2+1 ldy #0 .1 lda (TmpPtr1),y beq .9 cmp #'%' bne .4 iny lda (TmpPtr1),y beq .9 cmp #'d' bne .2 pla jsr PrintADec bra .8 .2 cmp #'D' bne .3 pla plx jsr PrintAXDec bra .8 .3 cmp #'h' bne .4 pla jsr PRBYTE .4 cmp #'\' bne .7 iny lda (TmpPtr1),y beq .9 cmp #'n' bne .9 lda #$0D .7 ora #$80 jsr COUT .8 iny bne .1 .9 lda TmpPtr2+1 pha lda TmpPtr2 pha rts *-------------------------------------- PrintADec ldx #0 PrintAXDec >STAX HEX PrintDec stz BCD stz BCD+1 stz BCD+2 phy ldx #16 let's roll 16 bits sed .2 asl HEX rol HEX+1 php cpy will disturb carry while BCD adc ldy #0 .3 plp lda BCD,y adc BCD,y sta BCD,y php iny cpy #3 Last byte of BCDBUF? bne .3 plp dex bne .2 cld stz bFlag ldx #2 .4 lda BCD,x lsr lsr lsr lsr bne .5 bit bFlag bpl .6 .5 sec ror bFlag ora #$B0 jsr COUT .6 lda BCD,x and #$0F bne .7 bit bFlag bpl .8 .7 sec ror bFlag ora #$B0 jsr COUT .8 dex bpl .4 bit bFlag bmi .9 lda #$B0 jsr COUT .9 ply rts *-------------------------------------- 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.STAGE0OK >CSTRING "A2osX[Stage0]:Complete.\n" *-------------------------------------- MSG.CPUTYPEL .DA #MSG.6502 .DA #MSG.65C02 .DA #MSG.R65C02 .DA #MSG.65C816 MSG.CPUTYPEH .DA /MSG.6502 .DA /MSG.65C02 .DA /MSG.R65C02 .DA /MSG.65C816 *-------------------------------------- MSG.6502 >CSTRING "NMOS 6502.\n" MSG.65C02 >CSTRING "CMOS 65C02.\n" MSG.R65C02 >CSTRING "Rockwell R65C02.\n" MSG.65C816 >CSTRING "16 Bits 65C816.\n" *-------------------------------------- MLIGETPREFIX01 .DA #1 .DA Boot.Prefix MLIQUIT01 .DA #4 .DA #0 .DA 0 .DA #0 .DA 0 *-------------------------------------- Boot.Prefix .BS MLI.MAXPATH *-------------------------------------- HEX .BS 2 BCD .BS 3 bFlag .BS 1 *-------------------------------------- .INB A2OSX.S.Z80 .INB A2OSX.S.QC .INB A2OSX.S.GP *-------------------------------------- MAN SAVE A2OSX.S ASM