mirror of
https://github.com/A2osX/A2osX.git
synced 2024-11-24 14:31:05 +00:00
1442 lines
26 KiB
Plaintext
1442 lines
26 KiB
Plaintext
NEW
|
||
AUTO 3,1
|
||
*--------------------------------------
|
||
idapple .EQ $0C model machine id
|
||
idxl .EQ $10 general use 16 bit index pointer
|
||
*--------------------------------------
|
||
auxsp .EQ $0101
|
||
*--------------------------------------
|
||
LDR.PBuf .EQ $0280
|
||
*--------------------------------------
|
||
.MA DEBUG
|
||
:1 bit $C000
|
||
bpl :1
|
||
sta $C010
|
||
.EM
|
||
*--------------------------------------
|
||
.MA DEBUGOA
|
||
bit $C061
|
||
bpl :1
|
||
>DEBUG
|
||
:1 .EQ *
|
||
.EM
|
||
*--------------------------------------
|
||
LDR.START jmp LDR.START8
|
||
jmp LDR.STARTATK
|
||
jmp LDR.START8
|
||
*--------------------------------------
|
||
LDR.MSG.PRODOS .AT "PRODOS FX 0.95"
|
||
LDR.MSG.UNSUPP .AT "UNSUPPORTED HARDWARE"
|
||
LDR.MSG.IIe .AT "//e"
|
||
LDR.MSG.IIc .AT "//c"
|
||
LDR.MSG.IIgs .AT "IIgs"
|
||
LDR.MSG.Unknown .AT "Unknown"
|
||
LDR.MSG.CLK .AT "?Clk"
|
||
LDR.MSG.RAM .AT "/RAM"
|
||
LDR.MSG.PFXERR .AT "ERR setting prefix"
|
||
*--------------------------------------
|
||
LDR.START16 inc LDR.BootFlag set = 2 for GQuit rts
|
||
LDR.STARTATK inc LDR.BootFlag set = 1 for appletalk rts
|
||
|
||
LDR.START8 lda ZP.UNITNUM
|
||
sta LDR.MLIOL.P+1
|
||
|
||
cld
|
||
bit IO.RROMBNK2
|
||
|
||
sta IO.CLR80DISP
|
||
sta IO.CLR80STORE
|
||
|
||
jsr ROM.INIT
|
||
jsr ROM.SETVID
|
||
jsr ROM.SETKBD
|
||
jsr ROM.HOME
|
||
|
||
lda #32
|
||
|
||
ldx #39
|
||
|
||
.1 sta $400,x
|
||
dex
|
||
bpl .1
|
||
|
||
ldx #LDR.MSG.PRODOS
|
||
jsr LDR.PrintX
|
||
|
||
sec
|
||
jsr ROM.IDROUTINE returns system info
|
||
bcs .2 taken if not a //gs
|
||
|
||
lda #$80
|
||
trb IO.GS.NEWVIDEO video mode select
|
||
|
||
* test for at least a 65c02
|
||
|
||
.2 sed
|
||
lda #$99
|
||
clc
|
||
adc #$01
|
||
cld
|
||
bmi LDR.UNSUPP.HW
|
||
|
||
stz auxsp
|
||
|
||
sta IO.SETALTZP
|
||
|
||
stz auxsp
|
||
lda auxsp
|
||
bne LDR.UNSUPP.HW
|
||
|
||
dec auxsp init aux sp to $FF
|
||
lda auxsp
|
||
beq LDR.UNSUPP.HW
|
||
|
||
sta IO.CLRALTZP
|
||
|
||
lda auxsp
|
||
bne LDR.UNSUPP.HW NO 128k
|
||
|
||
LDR.CheckROM ldx #LDR.MSG.IIE
|
||
lda #MACHID.T.IIe+MACHID.M.128+MACHID.COL80
|
||
|
||
ldy ROM.VERSION check hardware id
|
||
cpy #$06 apple //e?
|
||
beq .1 if yes
|
||
|
||
cpy #$EA apple //+ or ///?
|
||
beq LDR.UNSUPP.HW
|
||
|
||
ldx #LDR.MSG.UNKNOWN
|
||
bra m128k machine is unknown, Assume //e Enh 128k
|
||
|
||
.1 ldy ROM.ZIDBYTE //c ?
|
||
bne .2
|
||
|
||
ldy IO.KBD //c, check for keypress
|
||
cpy #$9B escape? (to disable accelerator)
|
||
bne .11
|
||
|
||
sta IO.KBDSTROBE clear keyboard
|
||
|
||
.11 lda #MACHID.T.IIc+MACHID.M.128+MACHID.COL80
|
||
ldx #LDR.MSG.IIC
|
||
bra m128k
|
||
|
||
.2 cpy #$EA
|
||
beq LDR.UNSUPP.HW //e UNenh....
|
||
|
||
cpy #$E0
|
||
beq .3
|
||
|
||
ldx #LDR.MSG.UNKNOWN
|
||
bra m128k not a //e Enh....
|
||
|
||
.3 sec
|
||
jsr ROM.IDROUTINE //gs ????
|
||
bcs m128k no.....
|
||
|
||
inc LDR.cortland
|
||
ldx #LDR.MSG.IIGS
|
||
lda #MACHID.T.IIe+MACHID.M.128+MACHID.COL80+MACHID.CLK
|
||
bra m128k
|
||
|
||
LDR.UNSUPP.HW ldx #LDR.MSG.UNSUPP
|
||
jsr LDR.PrintX
|
||
bne * no BRA !!! (6502)
|
||
*--------------------------------------
|
||
m128k sta idapple Save MACHID in temp location
|
||
|
||
lda #$20 "PRODOS" -> "ProDOS"
|
||
tsb LDR.MSG.PRODOS+1
|
||
tsb LDR.MSG.PRODOS+2
|
||
|
||
jsr LDR.Scr80Init X = LDR.MSG.machine type
|
||
|
||
ldx #$F
|
||
|
||
.2 lda LDR.3F0,x
|
||
sta $3F0,x
|
||
dex
|
||
bpl .2
|
||
|
||
lda #$01 patch for the gs rom
|
||
trb IO.GS.STATEREG to force off intcxrom
|
||
|
||
ldx #PAKME.GP.ID
|
||
ldy #GP
|
||
lda /GP
|
||
jsr X.Unpak.XatYA
|
||
|
||
jsr LDR.LCBNK1
|
||
|
||
ldx #PAKME.XRW.ID
|
||
ldy #XRW
|
||
lda /XRW
|
||
jsr X.Unpak.XatYAX
|
||
|
||
ldx #0
|
||
|
||
.1 stz XDOS.FCBs,x
|
||
stz XDOS.VCBs,x
|
||
inx
|
||
bne .1
|
||
|
||
ldx #PAKME.XDOS.ID
|
||
ldy #XDOS
|
||
lda /XDOS
|
||
jsr X.Unpak.XatYAX
|
||
|
||
ldx #XDOS.DATA.LEN
|
||
|
||
.3 stz XDOS.DATA-1,x
|
||
dex
|
||
bne .3
|
||
|
||
ldx #PAKME.IRQ.ID
|
||
ldy #IRQ
|
||
lda /IRQ
|
||
jsr X.Unpak.XatYAX
|
||
|
||
LDR.IRQ lda IO.RROMWRAMBNK2
|
||
ldy irqv interrupt vector
|
||
ldx irqv+1 x = high byte
|
||
|
||
jsr LDR.LCBNK1
|
||
|
||
sta IO.SETALTZP
|
||
sty irqv save irq vector in aux lc
|
||
stx irqv+1
|
||
|
||
sta IO.CLRALTZP
|
||
sty irqv
|
||
stx irqv+1 save irq vector in main lc
|
||
|
||
lda #XDOS.CallDisp
|
||
sta GP.DISPATCH+1 P8 system death vector
|
||
lda /XDOS.CallDisp
|
||
sta GP.DISPATCH+2
|
||
.DO LOWERCASE=0
|
||
lda GP.KVER
|
||
sta xdosver save current version for dir use
|
||
.FIN
|
||
lda idapple
|
||
sta GP.MACHID
|
||
|
||
lda LDR.cortland
|
||
beq LDR.II branch if // family
|
||
*--------------------------------------
|
||
LDR.IIGS sta XDOS.CortFlag
|
||
|
||
lda #XDOS.CallDisp
|
||
sta XDOS.CortDisp
|
||
lda /XDOS.CallDisp
|
||
sta XDOS.CortDisp+1
|
||
|
||
* lda IO.RROMWRAMBNK2
|
||
|
||
* stz ROM.MODE force setvid to reset cursor
|
||
* jsr setvid reset output to screen
|
||
|
||
* jsr LDR.LCBNK1
|
||
|
||
lda #'C'
|
||
ldx #PAKME.CCLK.ID
|
||
jsr LDR.SetupCLK
|
||
|
||
.DO M.SEL
|
||
|
||
* ldx #PAKME.SEL2.ID
|
||
* ldy #$1000
|
||
* lda /$1000
|
||
* jsr X.Unpak.XatYAX
|
||
|
||
ldx #PAKME.SEL2.ID
|
||
jsr LDR.SetupSEL
|
||
|
||
.FIN
|
||
*--------------------------------------
|
||
lda LDR.BootFlag
|
||
bne .1 branch if prodos 8 alone
|
||
|
||
* running from gs/os shell so zero out os_boot for appletalk
|
||
|
||
sta OS_BOOT indicates O/S initially booted.
|
||
jsr patch101 patch for gs/os - rev note #101
|
||
|
||
.1 bra LDR.Common
|
||
*--------------------------------------
|
||
LDR.II .DO M.SEL
|
||
|
||
ldx #PAKME.SEL1.ID
|
||
jsr LDR.SetupSEL
|
||
|
||
.FIN
|
||
|
||
jsr LDR.ClkDevScan
|
||
*--------------------------------------
|
||
LDR.Common jsr LDR.BlkDevScan
|
||
|
||
.DO M.RAM=1
|
||
jsr LDR.SetupRAM
|
||
.FIN
|
||
*--------------------------------------
|
||
lda LDR.MLIOL.P+1 Boot ZP.UNITNUM
|
||
sta GP.DEVNUM
|
||
|
||
ldx GP.DEVCNT
|
||
|
||
.1 lda GP.DEVLST,x
|
||
eor GP.DEVNUM
|
||
and #$f0
|
||
beq .2
|
||
|
||
dex
|
||
bpl .1
|
||
|
||
brk
|
||
|
||
.2 lda GP.DEVLST,x
|
||
pha
|
||
|
||
.3 lda GP.DEVLST+1,x
|
||
sta GP.DEVLST,x
|
||
cpx GP.DEVCNT
|
||
inx
|
||
bcc .3
|
||
|
||
pla
|
||
ldx GP.DEVCNT
|
||
sta GP.DEVLST,x
|
||
|
||
lda LDR.BootFlag get setup entry point flag
|
||
beq LDR.SetPrefix taken if normal boot.
|
||
|
||
bit IO.RROMBNK2
|
||
rts return to caller at setup entry point.
|
||
*--------------------------------------
|
||
LDR.SetPrefix jsr MLI
|
||
.DA #MLI.ONLINE
|
||
.DA LDR.MLIOL.P
|
||
bcs .9
|
||
|
||
lda LDR.PBuf+1 get volume name length.
|
||
and #$0F strip SDDDxxxx
|
||
beq .9
|
||
|
||
inc add 1 for leading '/'
|
||
sta LDR.PBuf save prefix length.
|
||
lda #'/' place leading '/' in prefix buffer
|
||
sta LDR.PBuf+1
|
||
|
||
jsr MLI
|
||
.DA #MLI.SETPREFIX
|
||
.DA LDR.MLISETP.P
|
||
bcs .9
|
||
|
||
jsr ROM.CROUT
|
||
|
||
ldx #PAKME.ILDR.ID
|
||
ldy #ILDR
|
||
lda /ILDR
|
||
jsr X.Unpak.XatYA
|
||
|
||
jmp ILDR
|
||
|
||
.9 ldx #LDR.MSG.PFXERR
|
||
jsr LDR.PrintX
|
||
bra *
|
||
*--------------------------------------
|
||
LDR.SetupSEL bit IO.RRAMWRAMBNK2 read/write RAM bank 2
|
||
bit IO.RRAMWRAMBNK2
|
||
|
||
ldy #$D100
|
||
lda /$D100
|
||
jsr X.Unpak.XatYAX
|
||
|
||
lda #$EE byte to distinguish LC bank 2
|
||
sta $D000
|
||
*--------------------------------------
|
||
LDR.LCBNK1 lda IO.RRAMWRAMBNK1 switch in LC bank 1
|
||
lda IO.RRAMWRAMBNK1
|
||
rts
|
||
*--------------------------------------
|
||
DS121x.DATA1 .EQ idxl
|
||
DS121x.DATA2 .EQ ZP.A1L
|
||
*--------------------------------------
|
||
LDR.ClkDevScan jsr LDR.IsIIc
|
||
bcc LDR.ClkDevNCLK //c only
|
||
|
||
LDR.ClkDevDCLK php
|
||
sei
|
||
|
||
lda $CFFF
|
||
lda $C400
|
||
|
||
ldx #8
|
||
stz $C0C0
|
||
stz $C0C1
|
||
stx $C0C2
|
||
|
||
lda $C0C3
|
||
pha
|
||
|
||
.1 lda DS121x.SIG-1,x
|
||
|
||
ldy #8
|
||
|
||
.2 sta $C0C3
|
||
stz $C0C0
|
||
lsr
|
||
dey
|
||
bne .2
|
||
|
||
dex
|
||
bne .1
|
||
|
||
ldx #8
|
||
|
||
.4 ldy #8
|
||
|
||
stz $C0C0
|
||
|
||
.5 lda $C0C3
|
||
|
||
lsr
|
||
ror DS121x.DATA1-1,x
|
||
dey
|
||
bne .5
|
||
|
||
dex
|
||
bne .4
|
||
|
||
stz $C0C0
|
||
pla
|
||
sta $C0C3
|
||
|
||
plp
|
||
|
||
sed
|
||
|
||
ldx #DS121x.ValidHI-DS121x.ValidLO
|
||
|
||
.6 lda DS121x.DATA1-1,x
|
||
cmp DS121x.ValidLO-1,x
|
||
bcc .9
|
||
|
||
cmp DS121x.ValidHI-1,x
|
||
bcc .7
|
||
|
||
bne .9
|
||
|
||
.7 dex
|
||
bne .6
|
||
|
||
cld
|
||
|
||
lda #'D'
|
||
ldx #PAKME.DCLK.ID
|
||
jmp LDR.SetupCLK
|
||
|
||
.9 cld
|
||
*--------------------------------------
|
||
NSC.IOBASE .EQ $C300
|
||
*--------------------------------------
|
||
LDR.ClkDevNCLK php
|
||
sei
|
||
|
||
lda IO.RDCXROM
|
||
php
|
||
|
||
sta IO.SETCXROM
|
||
|
||
sta NSC.IOBASE
|
||
* lda $C00B Workaround for Ultrawarp bug
|
||
|
||
ldx #8
|
||
|
||
.1 ldy #8
|
||
|
||
.2 lda NSC.IOBASE+4
|
||
lsr
|
||
ror DS121x.DATA1-1,x
|
||
dey
|
||
bne .2
|
||
|
||
dex
|
||
bne .1
|
||
*--------------------------------------
|
||
sta NSC.IOBASE
|
||
* lda $C00B Workaround for Ultrawarp bug
|
||
|
||
lda NSC.IOBASE+4 Reset DS1216E comparison register with READ A2=1
|
||
|
||
ldy #8 Read 8 bytes...
|
||
|
||
.3 lda DS121x.SIG-1,y
|
||
phy
|
||
|
||
ldy #8 ....of 8 bits
|
||
|
||
.4 ldx #0
|
||
lsr
|
||
bcc .5
|
||
|
||
inx
|
||
|
||
.5 bit NSC.IOBASE,x Write Pattern bit in A0, with A2=0
|
||
|
||
dey
|
||
bne .4
|
||
|
||
ply
|
||
dey
|
||
bne .3
|
||
*--------------------------------------
|
||
ldx #8
|
||
|
||
.6 ldy #8
|
||
|
||
.7 lda NSC.IOBASE+4
|
||
lsr
|
||
ror DS121x.DATA2-1,x
|
||
dey
|
||
bne .7
|
||
|
||
dex
|
||
bne .6
|
||
|
||
plp
|
||
bmi .8
|
||
|
||
sta IO.CLRCXROM
|
||
|
||
.8 plp
|
||
*--------------------------------------
|
||
ldx #8
|
||
|
||
.9 lda DS121x.DATA1-1,x
|
||
cmp DS121x.DATA2-1,x
|
||
bne .90
|
||
|
||
dex
|
||
bne .9
|
||
|
||
bra LDR.ClkDevTCLK
|
||
|
||
.90 lda #'N'
|
||
ldx #PAKME.NCLK.ID
|
||
bra LDR.SetupCLK
|
||
*--------------------------------------
|
||
LDR.ClkDevTCLK jsr LDR.IsIIc
|
||
bcs LDR.ClkDevXCLK
|
||
|
||
stz idxl
|
||
lda #$C1
|
||
sta idxl+1
|
||
|
||
lda #1
|
||
sta LDR.SlotIdx
|
||
|
||
.1 jsr LDR.CheckTClkID
|
||
bcs .7
|
||
|
||
stz $478,x
|
||
stz $7f8,x
|
||
|
||
lda idxl+1
|
||
asl
|
||
asl
|
||
asl
|
||
asl
|
||
tax
|
||
|
||
stz $c080,x
|
||
|
||
lda $c088,x
|
||
lda $c080,x
|
||
|
||
lda #'T'
|
||
ldx #PAKME.TCLK.ID
|
||
jsr LDR.SetupCLK
|
||
|
||
lda idxl+1
|
||
sta TCLK.Cx1+2
|
||
sta TCLK.Cx2+2
|
||
rts
|
||
|
||
.7 inc LDR.SlotIdx
|
||
|
||
inc idxl+1
|
||
lda idxl+1
|
||
cmp #$C8
|
||
bne .1
|
||
*--------------------------------------
|
||
LDR.ClkDevXCLK bit IO.RROMBNK2
|
||
sta $C070
|
||
bit $FACA
|
||
bit $FACA
|
||
bit $FAFE
|
||
|
||
lda $DFFE
|
||
cmp #$4A
|
||
bne .9
|
||
|
||
lda $DFFF
|
||
cmp #$CD
|
||
beq .1
|
||
|
||
.9 bit $F851
|
||
rts
|
||
|
||
.1 bit $F851
|
||
lda #'X'
|
||
ldx #PAKME.XCLK.ID
|
||
*--------------------------------------
|
||
LDR.SetupCLK sta LDR.MSG.CLK
|
||
|
||
phx
|
||
|
||
ldx #LDR.MSG.CLK
|
||
jsr LDR.PrintX
|
||
|
||
jsr LDR.LCBNK1
|
||
|
||
plx
|
||
|
||
ldy #CLK
|
||
lda /CLK
|
||
jsr X.Unpak.XatYAX
|
||
|
||
lda #$4C enable clock routine by putting a jmp
|
||
sta GP.CLOCK in front of clock vector
|
||
|
||
lda #MACHID.CLK
|
||
tsb GP.MACHID
|
||
LDR.SetupCLK.RTS
|
||
rts
|
||
*--------------------------------------
|
||
.DO M.RAM=1
|
||
|
||
LDR.SetupRAM lda GP.DEVCNT
|
||
cmp #13
|
||
bcs LDR.SetupCLK.RTS
|
||
|
||
jsr LDR.LCBNK1
|
||
|
||
ldx #PAKME.RAM.ID
|
||
ldy #RAM
|
||
lda /RAM
|
||
jsr X.Unpak.XatYAX
|
||
|
||
lda RAMX.PAK
|
||
bne .1
|
||
|
||
sta IO.SETWRITEAUX
|
||
|
||
ldx #PAKME.RAMX.ID
|
||
ldy #RAMX
|
||
lda /RAMX
|
||
jsr X.Unpak.XatYA
|
||
bra .7
|
||
|
||
.1 ldx #PAKME.RAMX.ID
|
||
ldy #$0800
|
||
lda /$0800
|
||
jsr X.Unpak.XatYA
|
||
|
||
sta IO.SETWRITEAUX
|
||
|
||
ldx #$FE
|
||
|
||
.2 lda $900,x
|
||
sta RAMX+$100,x
|
||
dex
|
||
txa
|
||
bne .2
|
||
|
||
.3 lda $800,x
|
||
sta RAMX,x
|
||
inx
|
||
bne .3
|
||
|
||
.7 sta IO.CLRWRITEAUX
|
||
|
||
lda #RAM put driver address into
|
||
sta GP.DEVPTRS3D2
|
||
lda /RAM
|
||
sta GP.DEVPTRS3D2+1
|
||
|
||
inc GP.DEVCNT count (-1) active devices
|
||
ldx GP.DEVCNT
|
||
lda #$BF unit num of /RAM
|
||
sta GP.DEVLST,x
|
||
|
||
ldx #LDR.MSG.RAM
|
||
jmp LDR.PrintX
|
||
.FIN
|
||
*--------------------------------------
|
||
* find all disk devices in system slots and set up address
|
||
* and device table in prodos global page.
|
||
*--------------------------------------
|
||
LDR.BlkDevScan bit IO.RROMBNK2 write protect lc ram.
|
||
|
||
stz idxl
|
||
lda #$C7 search slots from high to low
|
||
sta idxl+1
|
||
|
||
lda #7
|
||
sta LDR.SlotIdx
|
||
|
||
.1 ldx LDR.SlotIdx
|
||
stz LDR.SlotDevType-1,x
|
||
|
||
jsr LDR.CheckDiskID
|
||
bcs .4 if no ProDOS device in this slot.
|
||
|
||
ldy #$ff
|
||
lda (idxl),y check last byte of $Cn rom (y = $ff)
|
||
bne .2 branch if 16 sector disk II.
|
||
|
||
sta devid =0 since disk ii's have null attributes
|
||
lda #XRW
|
||
sta LDR.driveradr
|
||
lda /XRW
|
||
sta LDR.driveradr+1
|
||
sec 2 devices
|
||
jsr LDR.AddBlkDevs
|
||
bra .4
|
||
|
||
.2 cmp #$FF if = $FF then 13 sector disk II.
|
||
beq .4 ignore if 13 sector boot ROM
|
||
|
||
ldy #$07 check for a smartport device.
|
||
lda (idxl),y
|
||
bne .3 no smartport
|
||
|
||
jsr LDR.AddSPDevs
|
||
bra .4
|
||
|
||
.3 ldy #$FE BLK device...
|
||
lda (idxl),y get attributes.
|
||
and #$03 verify it provides read and status calls.
|
||
cmp #$03
|
||
bne .4 assume it's an off-brand disk
|
||
|
||
jsr LDR.SetDevID
|
||
|
||
and #$3 Device count minus 1
|
||
inc
|
||
ldx LDR.SlotIdx
|
||
sta LDR.SlotDevCnt-1,x
|
||
dec LDR.SlotDevType-1,x set as BlockDeb
|
||
tax
|
||
|
||
iny $CnFF
|
||
lda (idxl),y
|
||
sta LDR.driveradr
|
||
lda idxl+1 store hi entry addr (low already done)
|
||
sta LDR.driveradr+1
|
||
|
||
cpx #2 CS if 2 devs or more
|
||
jsr LDR.AddBlkDevs install 1 or 2 devices from this slot.
|
||
|
||
.4 dec idxl+1 next lower slot.
|
||
dec LDR.SlotIdx have all slots been checked ?
|
||
bne .1
|
||
*--------------------------------------
|
||
* stz idxl
|
||
lda #$C7
|
||
sta idxl+1
|
||
|
||
lda #7
|
||
sta LDR.SlotIdx
|
||
|
||
.5 ldx LDR.SlotIdx
|
||
lda LDR.SlotDevType-1,x
|
||
beq .8
|
||
|
||
lda LDR.SlotDevCnt-1,x
|
||
cmp #3
|
||
bcc .8
|
||
|
||
bit LDR.SlotDevType-1,x
|
||
bpl .6 type = smartport
|
||
|
||
jsr LDR.AddExtraBLKDevs
|
||
bra .8
|
||
|
||
.6 jsr LDR.AddExtraSPDevs
|
||
|
||
.8 dec idxl+1
|
||
dec LDR.SlotIdx
|
||
bne .5
|
||
|
||
LDR.AddExtraDevs.RTS
|
||
rts
|
||
*--------------------------------------
|
||
LDR.AddSPDevs jsr LDR.SetDevID setup the devid byte from attributes
|
||
|
||
iny #$ff
|
||
lda (idxl),y
|
||
|
||
sta LDR.driveradr
|
||
sta .1+1 modify operand
|
||
clc
|
||
adc #$03
|
||
sta LDR.SPVect+1
|
||
|
||
lda idxl+1
|
||
sta LDR.driveradr+1
|
||
sta LDR.SPVect+2
|
||
sta .1+2 modify operand
|
||
|
||
asl convert $Cn to $n0
|
||
asl
|
||
asl
|
||
asl
|
||
sta ZP.UNITNUM
|
||
|
||
stz ZP.CMDNUM force a prodos status call
|
||
|
||
stz ZP.BUFPTR dummy pointer
|
||
lda #$10
|
||
sta ZP.BUFPTR+1 dummy pointer should be <> 0
|
||
|
||
stz ZP.BLKNUM # of bytes to transfer
|
||
stz ZP.BLKNUM+1
|
||
|
||
.1 jsr $0000 SELF MODIFIED
|
||
|
||
ldy #$FB
|
||
lda (idxl),y check device id
|
||
and #$02 SCSI ?
|
||
beq .2 no, no need to init Cocoon
|
||
|
||
jsr LDR.SPStatusCall status of Cocoon : A = device = 2 for SCSI
|
||
|
||
lda #0 set unit# = 0
|
||
|
||
.2 jsr LDR.SPStatusCall
|
||
|
||
lda LDR.SPStatusBuf Device count
|
||
beq LDR.AddExtraDevs.RTS no devices, so done.
|
||
|
||
sta LDR.DevCnt
|
||
ldx LDR.SlotIdx
|
||
inc LDR.SlotDevType-1,x set as smartport
|
||
|
||
.3 inc LDR.SPStatus.U
|
||
|
||
jsr LDR.SPStatusCall.U call to get the device status
|
||
bcs .7
|
||
|
||
lda LDR.SPStatusBuf
|
||
bpl .7 not a block device
|
||
|
||
ldx LDR.SlotIdx
|
||
inc LDR.SlotDevCnt-1,x
|
||
|
||
.7 dec LDR.DevCnt
|
||
bne .3
|
||
|
||
ldx LDR.SlotIdx
|
||
lda LDR.SlotDevCnt-1,x
|
||
beq LDR.AddBlkDevs.RTS
|
||
|
||
sta LDR.SlotDevCnt-1,x
|
||
cmp #2 CC/CS, add 1 or 2 devs
|
||
*--------------------------------------
|
||
LDR.AddBlkDevs php how many drives (carry).
|
||
lda idxl+1 get index to global device table
|
||
and #$07 for this slot...
|
||
asl
|
||
tay into y reg.
|
||
|
||
asl
|
||
asl now form device # = slot #
|
||
asl in high nibble.
|
||
|
||
ora devid combine with attributes.
|
||
ldx GP.DEVCNT
|
||
inx put device # into device list.
|
||
sta GP.DEVLST,x
|
||
asl now form drive 2 device number, if any.
|
||
|
||
plp restore # of devices in carry.
|
||
ror if 2 drives, then bit 7=1.
|
||
bpl .1 branch if a 1 drive device (e.g. hard drive)
|
||
|
||
inx else presume that 2nd drive is present.
|
||
sta GP.DEVLST,x active device list.
|
||
|
||
.1 stx GP.DEVCNT save updated device count.
|
||
asl shift # of drives back into carry.
|
||
lda LDR.driveradr get high address of device driver.
|
||
sta GP.DEVPTRS,y device driver table 1.
|
||
bcc .2 branch if single drive.
|
||
|
||
sta GP.DEVPTRS+16,y device driver table 2.
|
||
|
||
.2 lda LDR.driveradr+1
|
||
sta GP.DEVPTRS+1,y
|
||
bcc .3
|
||
|
||
sta GP.DEVPTRS+17,y
|
||
|
||
.3
|
||
LDR.AddBlkDevs.RTS
|
||
rts
|
||
*--------------------------------------
|
||
LDR.AddExtraBLKDevs
|
||
dec
|
||
dec
|
||
sta LDR.DevCnt
|
||
|
||
jsr LDR.SetDevID set up device attributes
|
||
|
||
jsr LDR.FindFreeDevPtr
|
||
bcs .9
|
||
|
||
.1 cpy #$10
|
||
bcc .2 must be Drive 1
|
||
|
||
.10 jsr LDR.FindFreeDevPtrNext
|
||
bcc .1
|
||
|
||
rts
|
||
|
||
.2 lda LDR.DevCnt
|
||
dec
|
||
beq .4 only one to add
|
||
|
||
tya
|
||
ora #$10
|
||
tay
|
||
|
||
lda GP.DEVPTRS,y device driver table 1
|
||
cmp #XDOS.NoDevice
|
||
bne .10
|
||
|
||
lda GP.DEVPTRS+1,y
|
||
cmp /XDOS.NoDevice
|
||
bne .10 Drive 1 & 2 free
|
||
|
||
jsr LDR.AddY2DEVLST Y = index in GP.DEVPTRS
|
||
jsr .8
|
||
|
||
tya
|
||
and #$F
|
||
tay
|
||
|
||
.4 jsr LDR.AddY2DEVLST Y = index in GP.DEVPTRS
|
||
|
||
.8 phy
|
||
|
||
ldy #$ff
|
||
|
||
lda (idxl),y BLK entry point
|
||
|
||
ply
|
||
sta GP.DEVPTRS,y
|
||
lda idxl+1
|
||
sta GP.DEVPTRS+1,y
|
||
|
||
* clc
|
||
|
||
.9 rts
|
||
*--------------------------------------
|
||
LDR.AddExtraSPDevs
|
||
jsr LDR.SetDevID set up device attributes
|
||
|
||
iny ldy #$fe from SetDevID
|
||
|
||
* ldy #$FF
|
||
|
||
lda (idxl),y
|
||
clc
|
||
adc #$03 add 3 for smartport call
|
||
sta LDR.SPVect+1
|
||
lda idxl+1
|
||
sta LDR.SPVect+2
|
||
|
||
lda #0
|
||
jsr LDR.SPStatusCall do a status call on smartport itself
|
||
|
||
lda LDR.SPStatusBuf # of devices on smartport
|
||
|
||
cmp #$03
|
||
bcc .8 only 2 devices,skip to next one.
|
||
|
||
dec
|
||
dec
|
||
sta LDR.DevCnt
|
||
|
||
lda #3
|
||
sta LDR.SPStatus.U
|
||
|
||
.1 jsr LDR.SPStatusCall.U do status call
|
||
|
||
lda LDR.SPStatusBuf is this a block device?
|
||
bpl .2
|
||
|
||
jsr LDR.FindFreeDevPtr
|
||
bcs .8
|
||
|
||
jsr LDR.LCBNK1
|
||
|
||
tya divide index by 2
|
||
lsr
|
||
tax
|
||
|
||
lda LDR.SPStatus.U
|
||
sta XDOS.SPUnit-1,x store the smartport unit #
|
||
|
||
lda LDR.SPVect+1 and entry address.
|
||
sta XDOS.SPVectLo-1,x
|
||
|
||
lda LDR.SPVect+2
|
||
sta XDOS.SPVectHi-1,x
|
||
|
||
bit IO.RROMBNK2 write protect lc ram.
|
||
|
||
jsr LDR.AddY2DEVLST
|
||
|
||
lda #XDOS.SPREMAP
|
||
sta GP.DEVPTRS,y
|
||
lda /XDOS.SPREMAP
|
||
sta GP.DEVPTRS+1,y
|
||
|
||
.2 inc LDR.SPStatus.U
|
||
|
||
dec LDR.DevCnt
|
||
bne .1
|
||
|
||
.8 rts
|
||
*--------------------------------------
|
||
LDR.SPStatusCall
|
||
sta LDR.SPStatus.U
|
||
LDR.SPStatusCall.U
|
||
LDR.SPVect jsr $0000 self modifying
|
||
.HS 00
|
||
.DA LDR.SPStatus.P
|
||
rts
|
||
*--------------------------------------
|
||
LDR.CheckTClkID ldy #6
|
||
|
||
.HS 2C BIT ABS
|
||
|
||
LDR.CheckDiskID ldy #5
|
||
|
||
lda IO.CLRC8ROM switch out $C8 ROMs
|
||
|
||
.1 lda (idxl),y compare id bytes
|
||
cmp dskid,y
|
||
bne .3
|
||
|
||
dey
|
||
dey
|
||
bpl .1 loop until all 4 id bytes match.
|
||
|
||
clc
|
||
php
|
||
|
||
.8 ldx LDR.SlotIdx
|
||
|
||
lda sltbit-1,x
|
||
tsb GP.SLTBYT mark bit to flag rom present
|
||
|
||
.9 plp
|
||
rts
|
||
|
||
.3 sec
|
||
php
|
||
|
||
ldx #0
|
||
|
||
.4 cmp (idxl),y
|
||
bne .9
|
||
|
||
inx
|
||
bne .4
|
||
|
||
bra .8
|
||
*--------------------------------------
|
||
LDR.FindFreeDevPtr
|
||
ldx #LDR.DEVPTRS.CNT-1
|
||
LDR.FindFreeDevPtrNext
|
||
|
||
.1 ldy LDR.DEVPTRS.IDX,x
|
||
lda GP.DEVPTRS,y device driver table 1
|
||
cmp #XDOS.NoDevice
|
||
bne .2
|
||
|
||
lda GP.DEVPTRS+1,y
|
||
cmp /XDOS.NoDevice
|
||
beq .8
|
||
|
||
.2 dex
|
||
bpl .1
|
||
|
||
sec
|
||
rts
|
||
|
||
.8 clc
|
||
rts
|
||
*--------------------------------------
|
||
LDR.SetDevID ldy #$FE check attributes byte.
|
||
|
||
lda (idxl),y
|
||
lsr move hi nibble to lo nibble for
|
||
lsr device table entries.
|
||
lsr
|
||
lsr
|
||
sta devid
|
||
rts
|
||
*--------------------------------------
|
||
LDR.AddY2DEVLST inc GP.DEVCNT
|
||
ldx GP.DEVCNT
|
||
tya
|
||
|
||
asl convert to DSSS0000
|
||
asl
|
||
asl
|
||
|
||
ora devid include device attributes
|
||
sta GP.DEVLST,x in the active device list.
|
||
|
||
rts
|
||
*--------------------------------------
|
||
LDR.Scr80Init phx Save LDR.MSG
|
||
|
||
jsr LDR.IsIIc
|
||
bcs LDR.Scr80Init2
|
||
|
||
php
|
||
sei
|
||
|
||
sta IO.SETC3ROM
|
||
|
||
ldx #COL80IDX.Cnt-1
|
||
|
||
.1 ldy COL80IDX,x
|
||
lda $C300,y
|
||
cmp COL80VAL,x
|
||
bne .2
|
||
|
||
dex
|
||
bpl .1
|
||
|
||
lda $C30C is it an apple 80 col compatible card?
|
||
and #$F0
|
||
cmp #$80
|
||
beq .3
|
||
|
||
.2 sta IO.CLRC3ROM
|
||
|
||
.3 plp
|
||
*--------------------------------------
|
||
LDR.Scr80Init2 lda #$8C Reset 80 col screen ($0C:HOME)
|
||
jsr $C300
|
||
|
||
jsr ROM.SETNORM
|
||
jsr ROM.HOME
|
||
jsr ROM.SETINV
|
||
|
||
.DO LOGO=1
|
||
lda #20
|
||
sta ZP.CV
|
||
inc
|
||
sta ZP.WNDTOP
|
||
jsr ROM.TABV
|
||
|
||
lda #LOGO.PAKED
|
||
sta ZPInBufPtr
|
||
lda /LOGO.PAKED
|
||
sta ZPInBufPtr+1
|
||
|
||
stz ZPOutBufPtr
|
||
lda #$A0
|
||
sta ZPOutBufPtr+1
|
||
|
||
jsr X.Unpak
|
||
|
||
sta IO.CLRHIRES
|
||
sta IO.SETMIXED
|
||
|
||
bit IO.RDIOUDIS
|
||
sta IO.SETIOUDIS
|
||
sta IO.SETDHIRES
|
||
bmi .10
|
||
|
||
sta IO.CLRIOUDIS
|
||
|
||
.10 sta IO.CLRTEXT
|
||
|
||
stz ZPPtr1
|
||
lda #$A0
|
||
sta ZPPtr1+1
|
||
|
||
lda #0
|
||
|
||
.1 pha
|
||
|
||
jsr ROM.GBSCALC
|
||
|
||
ldy #0
|
||
|
||
.2 lda (ZPPtr1),y
|
||
pha
|
||
|
||
and #$f
|
||
tax
|
||
lda PALETTE.AUX,x
|
||
|
||
sta IO.SETPAGE2
|
||
sta (ZP.GBASL),y
|
||
|
||
pla
|
||
lsr
|
||
lsr
|
||
lsr
|
||
lsr
|
||
tax
|
||
lda PALETTE.MAIN,x
|
||
sta IO.CLRPAGE2
|
||
sta (ZP.GBASL),y
|
||
|
||
iny
|
||
cpy #40
|
||
bne .2
|
||
|
||
lda ZPPtr1
|
||
clc
|
||
adc #40
|
||
sta ZPPtr1
|
||
bcc .3
|
||
|
||
inc ZPPtr1+1
|
||
|
||
.3 ldy #0
|
||
|
||
.4 lda (ZPPtr1),y
|
||
pha
|
||
and #$f
|
||
|
||
tax
|
||
lda PALETTE.AUX,x
|
||
asl
|
||
asl
|
||
asl
|
||
asl
|
||
sta IO.SETPAGE2
|
||
ora (ZP.GBASL),y
|
||
sta (ZP.GBASL),y
|
||
|
||
pla
|
||
lsr
|
||
lsr
|
||
lsr
|
||
lsr
|
||
tax
|
||
lda PALETTE.MAIN,x
|
||
asl
|
||
asl
|
||
asl
|
||
asl
|
||
sta IO.CLRPAGE2
|
||
ora (ZP.GBASL),y
|
||
sta (ZP.GBASL),y
|
||
|
||
iny
|
||
cpy #40
|
||
bne .4
|
||
|
||
lda ZPPtr1
|
||
clc
|
||
adc #40
|
||
sta ZPPtr1
|
||
bcc .7
|
||
|
||
inc ZPPtr1+1
|
||
|
||
.7 pla
|
||
inc
|
||
cmp #20
|
||
bne .1
|
||
|
||
.FIN
|
||
|
||
jsr ROM.CLREOL
|
||
jsr ROM.SETNORM
|
||
|
||
ldx #LDR.MSG.PRODOS
|
||
jsr LDR.PrintX
|
||
|
||
plx get back LDR.MSG.machine type
|
||
*--------------------------------------
|
||
LDR.PrintX bit IO.RROMBNK2
|
||
|
||
lda ZP.INVFLG
|
||
pha
|
||
jsr ROM.SETINV
|
||
|
||
.1 lda $2000,x
|
||
pha
|
||
ora #$80
|
||
jsr ROM.COUT
|
||
inx
|
||
pla
|
||
bpl .1
|
||
|
||
lda #$A0
|
||
jsr ROM.COUT
|
||
|
||
pla
|
||
sta ZP.INVFLG
|
||
sta IO.CLRPAGE2 for screen holes proper access
|
||
rts
|
||
*--------------------------------------
|
||
LDR.IsIIc lda GP.MACHID
|
||
and #MACHID.T
|
||
cmp #MACHID.T.IIc
|
||
beq .9
|
||
|
||
clc
|
||
|
||
.9 rts
|
||
*--------------------------------------
|
||
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
|
||
*--------------------------------------
|
||
* 16 bytes moved to $03F0 vectors
|
||
*--------------------------------------
|
||
LDR.3F0 .DA ROM.BREAKV
|
||
.DA ROM.OLDRST
|
||
.DA #$5A powerup byte
|
||
jmp ROM.OLDRST '&' vector
|
||
jmp ROM.OLDRST ctrl-y vector
|
||
.HS 004000
|
||
.DA GP.IRQV global page interrupt vector
|
||
*--------------------------------------
|
||
* patch to gsos vectors so error is returned for os calls - rev note #101
|
||
*--------------------------------------
|
||
patch101 php
|
||
sei disable interrupts
|
||
clc
|
||
xce full native mode
|
||
>LONGMX
|
||
phb save DBR
|
||
pha
|
||
pha
|
||
pea $0000 length of patch
|
||
pea $0010 0000/0010 = 16 bytes
|
||
pea $3101 user id for prodos 8
|
||
pea $8018 attributes (locked/nospec/nocross)
|
||
pha
|
||
pha
|
||
>IIGS NewHandle
|
||
lda $01,s retrieve handle
|
||
tax
|
||
lda $03,s
|
||
tay
|
||
pea $0000 copy the code into the handle
|
||
pea L2C4D
|
||
phy
|
||
phx
|
||
pea $0000 length of patch = 0000/0010
|
||
pea $0010
|
||
>IIGS PtrToHand
|
||
plx low word of handle
|
||
plb set DBR to handle's bank
|
||
lda >1,x get upper 16 bits of 24 bit address
|
||
tay save in y
|
||
lda >0,x get low 8 bits of address
|
||
and ##$00FF clear high byte
|
||
xba put address in high byte
|
||
ora ##$005C include JML opcode
|
||
sta GSOS2 store in gsos vectors
|
||
clc
|
||
adc ##$000B
|
||
sta GSOS
|
||
tya store upper 16 bits too
|
||
sta GSOS2+2
|
||
adc ##$0000 adj for possible page crossing
|
||
sta GSOS+2
|
||
plb remove garbage byte from stack
|
||
plb restore DBR.
|
||
sec
|
||
xce back to emulation mode
|
||
plp
|
||
rts
|
||
*--------------------------------------
|
||
* copy of the code that goes in the handle
|
||
*--------------------------------------
|
||
L2C4D lda 1,s
|
||
sta 7,s
|
||
lda 2,s
|
||
sta 8,s
|
||
pla
|
||
pla
|
||
pla
|
||
lda ##$00FF #NoOS
|
||
sec
|
||
rtl
|
||
*--------------------------------------
|
||
DS121x.SIG .HS 5CA33AC55CA33AC5 Reverted 7->0
|
||
DS121x.ValidLO .HS 00010101 Y,M,D,DoW
|
||
DS121x.ValidHI .HS 990C1F07
|
||
*--------------------------------------
|
||
* id bytes: evens for clock, odds for disk
|
||
dskid .HS 08.20.28.00.58.03.70
|
||
sltbit .HS 02040810204080
|
||
*--------------------------------------
|
||
COL80IDX .HS 05070BFA + $C30C and $80 = $80
|
||
COL80IDX.Cnt .EQ *-COL80IDX
|
||
COL80VAL .HS 3818012C
|
||
*--------------------------------------
|
||
LDR.MLIOL.P .DA #2
|
||
.DA #$60
|
||
.DA LDR.PBuf+1
|
||
|
||
LDR.MLISETP.P .DA #1
|
||
.DA LDR.PBuf
|
||
|
||
LDR.SPStatus.P .DA #$03 # of parms
|
||
LDR.SPStatus.U .DA #$00 unit number (code for smartport stat)
|
||
.DA LDR.SPStatusBuf
|
||
.DA #00 status code (0 = general status)
|
||
|
||
LDR.DEVPTRS.CNT .EQ 14
|
||
|
||
LDR.DEVPTRS.IDX .DA #$16 S3D2 /RAM
|
||
.DA #$06 S3D1
|
||
.DA #$12 S1D2
|
||
.DA #$02 S1D1
|
||
.DA #$14 S2D2
|
||
.DA #$04 S2D1
|
||
.DA #$18 S4D2
|
||
.DA #$08 S4D1
|
||
.DA #$1A S5D2
|
||
.DA #$0A S5D1
|
||
.DA #$1C S6D2
|
||
.DA #$0C S6D1
|
||
.DA #$1E S7D2
|
||
.DA #$0E S7D1
|
||
*--------------------------------------
|
||
LDR.cortland .DA #0 cortland loader flag (1 = Cortland)
|
||
LDR.BootFlag .DA #0 0 = normal boot, <>0 = return
|
||
*--------------------------------------
|
||
LDR.SPStatusBuf .BS 8 8 bytes for smartport call
|
||
LDR.driveradr .BS 2
|
||
LDR.SlotIdx .BS 1
|
||
LDR.DevCnt .BS 1
|
||
LDR.SlotDevType .BS 7
|
||
LDR.SlotDevCnt .BS 7
|
||
*--------------------------------------
|
||
MAN
|
||
SAVE usr/src/prodos.fx/prodos.s.ldr
|
||
LOAD usr/src/prodos.fx/pdos8m.s
|
||
ASM
|