A2osX/A2osX.S.txt

509 lines
10 KiB
Plaintext
Raw Normal View History

2015-03-14 21:48:35 +00:00
PR#3
2015-03-15 22:00:40 +00:00
PREFIX /A2OSX.BUILD
2015-03-14 21:48:35 +00:00
NEW
INC 1
AUTO 6
.LIST OFF
.OP 65C02
.OR $2000
.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
*--------------------------------------
2015-03-15 22:00:40 +00:00
A2osX.Z80Stack .EQ $0F00 $0fff=0ffffh
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
2015-03-14 21:48:35 +00:00
*--------------------------------------
2015-03-15 22:00:40 +00:00
A2osX.Start .EQ *
.PH A2osX.RelocAddr
A2osX.Init0 ldx #$FF init 6502 stack to highest
2015-03-14 21:48:35 +00:00
txs
stx A2osX.SaveSM
2015-03-15 22:00:40 +00:00
>LDYAI A2osX.Start
>STYA TmpPtr1
>LDYAI A2osX.RelocAddr
>STYA TmpPtr2
ldx #$10 reloc $2000-$2FFF to $1000-$1FFF
ldy #0
2015-03-14 21:48:35 +00:00
2015-03-15 22:00:40 +00:00
.1 lda (TmpPtr1),y
sta (TmpPtr2),y
iny
bne .1
inc TmpPtr1+1
inc TmpPtr2+1
dex
bne .1
jmp A2osX.Init1
*--------------------------------------
A2osX.Init1 jsr HOME
2015-03-14 21:48:35 +00:00
>LDAXI MSG.STAGE0
jsr PrintCStrAX
>LDYAI D.STACKSEG
>STYA R.SP init Soft Stack
>LDAXI MSG.SYSMEM
jsr PrintCStrAX
lda MACHID
2015-03-15 22:00:40 +00:00
and #MACHID.RAM
cmp #MACHID.RAM.128
2015-03-14 21:48:35 +00:00
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
2015-03-15 22:00:40 +00:00
bra A2osX.EnumKM
2015-03-14 21:48:35 +00:00
.1 >LDAXI MSG.Z80.KO
jsr PrintCStrAX
*--------------------------------------
2015-03-15 22:00:40 +00:00
A2osX.EnumKM >LDAXI MSG.KMENUM
jsr PrintCStrAX
jsr EnumKM
*--------------------------------------
2015-03-14 21:48:35 +00:00
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
*--------------------------------------
2015-03-15 22:00:40 +00:00
InitZ80 ldx #Z80Code.Size
.1 lda Z80Code.Start-1,x
sta $1000-1,x 00000H for Z80
dex
2015-03-14 21:48:35 +00:00
bne .1
2015-03-15 22:00:40 +00:00
stz TmpPtr1
lda #$C1
sta TmpPtr1+1
2015-03-14 21:48:35 +00:00
2015-03-15 22:00:40 +00:00
.2 sta (TmpPtr1)
lda $100D
bmi .8
inc TmpPtr1+1
lda TmpPtr1+1
cmp #$C8
2015-03-14 21:48:35 +00:00
beq .9
2015-03-15 22:00:40 +00:00
clc
adc #$20
sta $100A
bra .2
2015-03-14 21:48:35 +00:00
2015-03-15 22:00:40 +00:00
.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
2015-03-14 21:48:35 +00:00
iny
2015-03-15 22:00:40 +00:00
cpx SYS
bne .1
2015-03-14 21:48:35 +00:00
2015-03-15 22:00:40 +00:00
sty Boot.Prefix
2015-03-14 21:48:35 +00:00
2015-03-15 22:00:40 +00:00
jsr MLI
.DA #MLIOPEN
.DA MLIOPEN01
bcs .99
2015-03-14 21:48:35 +00:00
2015-03-15 22:00:40 +00:00
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
2015-03-14 21:48:35 +00:00
lda (TmpPtr1),y
2015-03-15 22:00:40 +00:00
cmp #$06 'BIN'?
bne .5 skip
ldy KM.PREFIX
.4 lda (TmpPtr1),y
cmp KM.PREFIX,y
bne .5
dey
bne .4
2015-03-14 21:48:35 +00:00
2015-03-15 22:00:40 +00:00
jsr LoadKM
.5 lda EnumKM.BPTR
clc
adc #EnumKM.EL
sta EnumKM.BPTR
bcc .6
inc EnumKM.BPTR+1
2015-03-14 21:48:35 +00:00
2015-03-15 22:00:40 +00:00
.6 dec EnumKM.EC
bne .3
bra .2
.8 jsr MLI
.DA #MLICLOSE
.DA MLICLOSE01
rts
.98 cmp #MLI.ERR.EOF
beq .8
2015-03-14 21:48:35 +00:00
pha
2015-03-15 22:00:40 +00:00
jsr .8
pla
.99 sec
rts
EnumKM.EC .BS 1
EnumKM.BPTR .BS 2
2015-03-14 21:48:35 +00:00
*--------------------------------------
2015-03-15 22:00:40 +00:00
LoadKM ldx Boot.Prefix
.1 lda Boot.Prefix,x
sta KM.Filename,x
dex
bne .1
2015-03-14 21:48:35 +00:00
2015-03-15 22:00:40 +00:00
ldx Boot.Prefix
lda (TmpPtr1)
and #$0F
tay
clc
adc Boot.Prefix
sta KM.Filename
tax
2015-03-14 21:48:35 +00:00
2015-03-15 22:00:40 +00:00
.2 lda (TmpPtr1),y
sta KM.Filename,x
2015-03-14 21:48:35 +00:00
dex
2015-03-15 22:00:40 +00:00
dey
2015-03-14 21:48:35 +00:00
bne .2
2015-03-15 22:00:40 +00:00
>LDAXI MSG.KMLOAD
jsr PrintCStrAX
>LDAXI KM.Filename
jsr PrintPStrAX
jsr CROUT
2015-03-14 21:48:35 +00:00
2015-03-15 22:00:40 +00:00
jsr MLI
.DA #MLIOPEN
.DA MLIOPEN02
bcs .99
lda MLIOPEN02+5
sta MLIREAD02+1
sta MLICLOSE02+1
2015-03-14 21:48:35 +00:00
2015-03-15 22:00:40 +00:00
jsr MLI
.DA #MLIREAD
.DA MLIREAD02
bcs .98
jsr .9
jsr A2osX.KMLOAD
jsr CROUT
2015-03-14 21:48:35 +00:00
2015-03-15 22:00:40 +00:00
.98 pha
jsr .9
pla
sec
rts
2015-03-14 21:48:35 +00:00
2015-03-15 22:00:40 +00:00
.9 jsr MLI
.DA #MLICLOSE
.DA MLICLOSE02
.99 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
2015-03-14 21:48:35 +00:00
rts
2015-03-15 22:00:40 +00:00
*--------------------------------------
.INB A2OSX.S.TOOLS
2015-03-14 21:48:35 +00:00
*--------------------------------------
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"
2015-03-15 22:00:40 +00:00
MSG.KMENUM >CSTRING "Looking For Kernel Modules...\n"
MSG.KMLOAD >CSTRING "Loading KM : "
2015-03-14 21:48:35 +00:00
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
2015-03-15 22:00:40 +00:00
MSG.6502 >CSTRING "6502.\n"
MSG.65C02 >CSTRING "65C02.\n"
MSG.R65C02 >CSTRING "R65C02.\n"
MSG.65C816 >CSTRING "65C816.\n"
2015-03-14 21:48:35 +00:00
*--------------------------------------
MLIGETPREFIX01 .DA #1
.DA Boot.Prefix
2015-03-15 22:00:40 +00:00
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
2015-03-14 21:48:35 +00:00
MLIQUIT01 .DA #4
.DA #0
.DA 0
.DA #0
.DA 0
*--------------------------------------
2015-03-15 22:00:40 +00:00
SYS >PSTRING "SYS/"
KM.PREFIX >PSTRING "KM."
2015-03-14 21:48:35 +00:00
HEX .BS 2
BCD .BS 3
bFlag .BS 1
*--------------------------------------
2015-03-15 22:00:40 +00:00
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
2015-03-14 21:48:35 +00:00
.INB A2OSX.S.QC
.INB A2OSX.S.GP
2015-03-15 22:00:40 +00:00
A2osX.End .EQ *
A2osX.SIZE .EQ A2osX.End-A2osX.Start
.DO A2osX.SIZE>$1000
ERROR:A2osX.SIZE too big
.FIN
2015-03-14 21:48:35 +00:00
MAN
SAVE A2OSX.S
ASM