A2osX/ProDOS.FX/ProDOS.S.LDR.txt

1071 lines
22 KiB
Plaintext
Raw Normal View History

2019-10-16 06:09:13 +00:00
NEW
AUTO 3,1
2019-11-05 07:29:49 +00:00
*--------------------------------------
2019-11-04 07:21:40 +00:00
.MA DEBUG
:1 bit $C000
bpl :1
sta $C010
.EM
2019-11-05 07:29:49 +00:00
*--------------------------------------
2019-11-04 20:42:38 +00:00
READCAT .EQ 0 Boot Block read Catalog at $C00
2019-11-05 07:29:49 +00:00
*--------------------------------------
2019-10-16 06:09:13 +00:00
H2000 jmp prostart
2019-11-01 20:06:04 +00:00
jmp atalkset
jmp p16start
2019-11-05 07:29:49 +00:00
*--------------------------------------
2019-11-07 14:27:24 +00:00
LDR.MSG.0 .AT "PRODOS FX:"
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"
2019-11-08 07:35:08 +00:00
LDR.MSG.ROOTERR .AT "ERR reading CATALOG"
2019-11-05 07:29:49 +00:00
*--------------------------------------
2019-11-04 07:21:40 +00:00
p16start inc LDR.BootFlag set = 2 for GQuit rts
atalkset inc LDR.BootFlag set = 1 for appletalk rts
2019-10-16 06:09:13 +00:00
prostart lda unitnum
2019-11-01 20:06:04 +00:00
sta LDR.MLIOL.P+1
2019-11-07 14:27:24 +00:00
.DO READCAT=1
sta LDR.MLIRB.P+1
.FIN
2019-11-01 20:06:04 +00:00
cld
bit RROMBNK2
sta CLR80DISP
sta CLR80STORE
jsr setnorm
jsr init
jsr setvid
jsr setkbd
jsr home
2019-11-07 14:27:24 +00:00
lda #$20
ldx #39
.1 sta $400,x
2019-11-01 20:06:04 +00:00
dex
bpl .1
2019-11-07 14:27:24 +00:00
ldx #LDR.MSG.0
jsr LDR.PrintX
2019-11-01 20:06:04 +00:00
sec
jsr idroutine returns system info
bcs .2 taken if not a //gs
lda #$80
trb newvideo video mode select
2019-10-16 06:09:13 +00:00
* test for at least a 65c02
2019-11-01 20:06:04 +00:00
.2 sed
lda #$99
2019-10-16 06:09:13 +00:00
clc
2019-11-01 20:06:04 +00:00
adc #$01
2019-10-16 06:09:13 +00:00
cld
2019-11-01 20:06:04 +00:00
bmi LDR.UNSUPP.HW
2019-11-05 07:29:49 +00:00
stz auxsp
sta SETALTZP
stz auxsp
lda auxsp
bne LDR.UNSUPP.HW
dec auxsp init aux sp to $FF
lda auxsp
beq LDR.UNSUPP.HW
sta CLRALTZP
lda auxsp
bne LDR.UNSUPP.HW NO 128k
2019-11-08 07:35:08 +00:00
LDR.CheckROM ldx #LDR.MSG.IIE
2019-11-06 20:48:15 +00:00
lda #MACHID.T.IIe+MACHID.M.128+MACHID.COL80
2019-11-01 20:06:04 +00:00
2019-11-07 14:27:24 +00:00
ldy $FBB3 check hardware id
cpy #$06 apple //e?
2019-11-01 20:06:04 +00:00
beq .1 if yes
2019-11-07 14:27:24 +00:00
cpy #$EA apple //+ or ///?
2019-11-01 20:06:04 +00:00
beq LDR.UNSUPP.HW
2019-11-07 14:27:24 +00:00
ldx #LDR.MSG.UNKNOWN
2019-11-05 07:29:49 +00:00
bra m128k machine is unknown, Assume //e Enh 128k
2019-11-01 20:06:04 +00:00
2019-11-07 14:27:24 +00:00
.1 ldy $FBC0 //c ?
2019-11-01 20:06:04 +00:00
bne .2
2019-11-05 07:29:49 +00:00
ldy kbd //c, check for keypress
cpy #$9B escape? (to disable accelerator)
bne .11
sta KBDSTROBE clear keyboard
.11 lda #MACHID.T.IIc+MACHID.M.128+MACHID.COL80
2019-11-07 14:27:24 +00:00
ldx #LDR.MSG.IIC
2019-11-01 20:06:04 +00:00
bra m128k
2019-11-07 14:27:24 +00:00
.2 cpy #$EA
2019-11-01 20:06:04 +00:00
beq LDR.UNSUPP.HW //e UNenh....
2019-11-07 14:27:24 +00:00
cpy #$E0
beq .3
ldx #LDR.MSG.UNKNOWN
bra m128k not a //e Enh....
2019-10-16 06:09:13 +00:00
2019-11-07 14:27:24 +00:00
.3 sec
2019-11-01 20:06:04 +00:00
jsr $FE1F //gs ????
2019-11-05 07:29:49 +00:00
bcs m128k no.....
2019-11-01 20:06:04 +00:00
2019-11-08 07:35:08 +00:00
inc LDR.cortland
2019-11-07 14:27:24 +00:00
ldx #LDR.MSG.IIGS
2019-11-01 20:06:04 +00:00
lda #MACHID.T.IIe+MACHID.M.128+MACHID.COL80+MACHID.CLK
bra m128k
2019-11-07 14:27:24 +00:00
LDR.UNSUPP.HW ldx #LDR.MSG.UNSUPP
jsr LDR.PrintX
2019-11-08 07:35:08 +00:00
bra *
*--------------------------------------
2019-11-05 07:29:49 +00:00
m128k sta idapple Save MACHID in temp location
2019-11-01 20:06:04 +00:00
2019-11-07 14:27:24 +00:00
sta SETALTCHAR
jsr LDR.PrintX
2019-11-01 20:06:04 +00:00
sta CLRC3ROM
ldx #$F
.2 lda LDR.3F0,x
sta $3F0,x
dex
bpl .2
lda #$01 patch for the gs rom
trb statereg to force off intcxrom
2019-10-16 06:09:13 +00:00
2019-11-01 20:06:04 +00:00
lda PAKME.ILDR
sta ZPInBufPtr
lda PAKME.ILDR+1
sta ZPInBufPtr+1
lda #ILDR.START
sta ZPOutBufPtr
lda /ILDR.START
sta ZPOutBufPtr+1
jsr X.Unpak
lda PAKME.GP
sta ZPInBufPtr
lda PAKME.GP+1
sta ZPInBufPtr+1
lda #MLI
sta ZPOutBufPtr
lda /MLI
sta ZPOutBufPtr+1
jsr X.Unpak
2019-11-04 07:21:40 +00:00
jsr lc1in switch in language card bank 1.
2019-11-01 20:06:04 +00:00
lda PAKME.XRW
sta ZPInBufPtr
lda PAKME.XRW+1
sta ZPInBufPtr+1
lda #$D000
sta ZPOutBufPtr
lda /$D000
sta ZPOutBufPtr+1
jsr X.Unpak
ldx #0
.1 stz $D700,x
stz $D800,x
stz $D900,x
stz $DA00,x
stz $DB00,x
stz $DC00,x
stz $DD00,x
inx
bne .1
lda PAKME.XDOS
sta ZPInBufPtr
lda PAKME.XDOS+1
sta ZPInBufPtr+1
lda #$DE00
sta ZPOutBufPtr
lda /$DE00
sta ZPOutBufPtr+1
jsr X.Unpak
2019-11-04 07:21:40 +00:00
ldx #XDOS.DATA.LEN
.3 stz XDOS.DATA-1,x
dex
bne .3
2019-11-01 20:06:04 +00:00
lda PAKME.IRQ
sta ZPInBufPtr
lda PAKME.IRQ+1
sta ZPInBufPtr+1
lda #$FF9B
sta ZPOutBufPtr
lda /$FF9B
sta ZPOutBufPtr+1
jsr X.Unpak
2019-10-16 06:09:13 +00:00
2019-11-06 20:48:15 +00:00
LDR.IRQ lda RROMWRAMBNK2
ldy irqv interrupt vector
ldx irqv+1 x = high byte
jsr lc1in set language card bank 1 to r/w
sta SETALTZP
stx irqv+1 interrupt vector
sty irqv save irq vector in aux lc
sta CLRALTZP
stx irqv+1 save irq vector in main lc
sty irqv
lda #calldisp
sta jspare+1 P8 system death vector
lda /calldisp
sta jspare+2
2019-10-16 06:09:13 +00:00
lda kversion
sta xdosver save current version for dir use
2019-11-04 07:21:40 +00:00
lda idapple
sta MACHID
2019-11-08 07:35:08 +00:00
lda LDR.cortland
2019-11-01 20:06:04 +00:00
beq LDR.II branch if // family
2019-11-08 07:35:08 +00:00
*--------------------------------------
LDR.IIGS sta cortflag
2019-11-01 20:06:04 +00:00
2019-11-06 16:25:00 +00:00
lda #calldisp
sta cortdisp
lda /calldisp
sta cortdisp+1
2019-11-08 07:35:08 +00:00
* lda RROMWRAMBNK2
* stz vmode force setvid to reset cursor
* jsr setvid reset output to screen
2019-11-07 14:27:24 +00:00
* jsr lc1in set language card bank 1 to r/w
lda #'C'
2019-11-04 07:21:40 +00:00
ldx PAKME.CCLK
ldy PAKME.CCLK+1
jsr LDR.SetupCLK
2019-11-01 20:06:04 +00:00
ldx PAKME.SEL2
ldy PAKME.SEL2+1
stx ZPInBufPtr
sty ZPInBufPtr+1
lda #$1000
sta ZPOutBufPtr
lda /$1000
sta ZPOutBufPtr+1
jsr X.Unpak
ldx PAKME.SEL2
ldy PAKME.SEL2+1
2019-11-04 07:21:40 +00:00
jsr LDR.SetupQC
2019-11-08 07:35:08 +00:00
*--------------------------------------
2019-11-04 07:21:40 +00:00
lda LDR.BootFlag
2019-11-01 20:06:04 +00:00
bne .1 branch if prodos 8 alone
2019-10-16 06:09:13 +00:00
* running from gs/os shell so zero out os_boot for appletalk
2019-11-08 16:11:49 +00:00
sta OS_BOOT indicates O/S initially booted.
2019-10-16 06:09:13 +00:00
jsr patch101 patch for gs/os - rev note #101
2019-11-08 07:35:08 +00:00
.1 bra LDR.Common
2019-11-07 14:27:24 +00:00
*--------------------------------------
2019-11-04 07:21:40 +00:00
LDR.II ldx PAKME.SEL1
ldy PAKME.SEL1+1
jsr LDR.SetupQC
2019-11-05 16:31:29 +00:00
2019-11-08 07:35:08 +00:00
jsr LDR.ClkDevScan
2019-11-07 14:27:24 +00:00
*--------------------------------------
2019-11-08 07:35:08 +00:00
LDR.Common jsr LDR.BlkDevScan
2019-11-01 20:06:04 +00:00
2019-11-08 07:35:08 +00:00
jsr LDR.SetupRAM
2019-11-07 14:27:24 +00:00
*--------------------------------------
2019-11-04 07:21:40 +00:00
lda LDR.BootFlag get setup entry point flag
beq LDR.ReadRoot taken if normal boot.
2019-11-01 20:06:04 +00:00
lda RROMBNK2
2019-10-16 06:09:13 +00:00
rts return to caller at setup entry point.
2019-11-08 07:35:08 +00:00
*--------------------------------------
2019-11-07 14:27:24 +00:00
LDR.ReadRoot lda LDR.MLIOL.P+1 place boot devnum in globals
sta devnum last device used
jsr MLI
2019-10-16 06:09:13 +00:00
.DA #MLIONLINE
2019-11-01 20:06:04 +00:00
.DA LDR.MLIOL.P
2019-11-04 07:21:40 +00:00
bcs .9
2019-10-16 06:09:13 +00:00
lda pbuf+1 get volume name length.
and #$0F strip devnum
2019-11-04 07:21:40 +00:00
beq .9
2019-11-08 07:35:08 +00:00
2019-10-16 06:09:13 +00:00
inc add 1 for leading '/'
sta pbuf save prefix length.
lda #'/' place leading '/' in prefix buffer
sta pbuf+1
jsr MLI
.DA #MLISETPREFIX
2019-11-01 20:06:04 +00:00
.DA LDR.MLISETP.P
2019-11-04 07:21:40 +00:00
bcs .9
2019-11-04 20:42:38 +00:00
.DO READCAT=1
2019-11-04 07:21:40 +00:00
stz dst
2019-11-04 20:42:38 +00:00
lda /dbuf
2019-11-04 07:21:40 +00:00
ldy #$02 read directory into buffer
ldx #0
.1 sta dst+1
sta LDR.MLIRB.P+3 Data buf HI
sty LDR.MLIRB.P+4 Blk Num LO
stx LDR.MLIRB.P+5 Blk Num HI
2019-10-16 06:09:13 +00:00
jsr MLI
.DA #MLIREADBLOCK
2019-11-01 20:06:04 +00:00
.DA LDR.MLIRB.P
2019-11-04 07:21:40 +00:00
bcs .9
2019-10-16 06:09:13 +00:00
ldy #$03 get next block# from link
lda (dst),y
tax
dey
2019-11-04 07:21:40 +00:00
ora (dst),y 00 00 -> Last Block
beq .8
2019-10-16 06:09:13 +00:00
lda (dst),y
tay
lda dst+1
2019-11-04 07:21:40 +00:00
inc
inc add $200 to buffer pointer
2019-10-16 06:09:13 +00:00
cmp /dbuf+$800 until it points past end of buffer.
2019-11-04 07:21:40 +00:00
bcc .1 if ok, read next block.
2019-11-04 20:42:38 +00:00
.FIN
2019-11-04 07:21:40 +00:00
.8 jmp $800 jmp to "load interpreter" code
2019-10-16 06:09:13 +00:00
2019-11-08 07:35:08 +00:00
.9 ldx #LDR.MSG.ROOTERR
jsr LDR.PrintX
2019-10-16 06:09:13 +00:00
bmi *
2019-11-07 14:27:24 +00:00
*--------------------------------------
2019-11-04 07:21:40 +00:00
LDR.SetupQC bit RRAMWRAMBNK2 read/write RAM bank 2
bit RRAMWRAMBNK2
2019-10-16 06:09:13 +00:00
2019-11-04 07:21:40 +00:00
stx ZPInBufPtr
sty ZPInBufPtr+1
lda #$D100
sta ZPOutBufPtr
lda /$D100
sta ZPOutBufPtr+1
jsr X.Unpak
2019-10-16 06:09:13 +00:00
2019-11-04 07:21:40 +00:00
lda #$EE byte to distinguish LC bank 2
sta $D000
jmp lc1in switch in LC bank 1
*--------------------------------------
2019-11-05 16:31:29 +00:00
DS1216E.DATA1 .EQ $10
DS1216E.DATA2 .EQ A1L
*--------------------------------------
LDR.ClkDevScan php
sei
lda $CFFF
pha
sta $C300
ldx #7
.1 ldy #8
.2 lda $C304
lsr
ror DS1216E.DATA1,x
dey
bne .2
dex
bpl .1
lda $C304 Reset DS1216E comparison register with READ A2=1
ldx #7 Read 8 bytes...
.3 lda DS1216E.PATTERN,x
phx
ldx #8 ....of 8 bits
.4 ldy #0
lsr
bcc .5
iny
.5 pha
lda $C300,y Write Pattern bit in A0, with A2=0
pla
dex
bne .4
plx
dex
bpl .3
ldx #7
.6 ldy #8
.7 lda $C304
lsr
ror DS1216E.DATA2,x
dey
bne .7
dex
bpl .6
pla
bmi .8
sta $CFFF
.8 plp
ldx #7
.9 lda DS1216E.DATA1,x
cmp DS1216E.DATA2,x
bne LDR.ClkDevTCLK
dex
bpl .9
2019-11-07 14:27:24 +00:00
lda #'N'
2019-11-05 16:31:29 +00:00
ldx PAKME.NCLK
ldy PAKME.NCLK+1
2019-11-08 07:35:08 +00:00
bra LDR.SetupCLK
*--------------------------------------
2019-11-05 16:31:29 +00:00
LDR.ClkDevTCLK lda CLRC8ROM switch out $C8 ROMs
stz idxl
lda #$C1
sta idxl+1
.1 ldy #6
.2 lda (idxl),y compare id bytes
cmp dskid,y
bne .3
dey
dey
bpl .2
2019-11-07 14:27:24 +00:00
lda #'T'
2019-11-05 16:31:29 +00:00
ldx PAKME.TCLK
ldy PAKME.TCLK+1
jsr LDR.SetupCLK
lda idxl+1
sta TCLK.Cx1+2
sta TCLK.Cx2+2
rts
.3 inc idxl+1
lda idxl+1
cmp #$C8
bne .1
rts
2019-11-04 07:21:40 +00:00
*--------------------------------------
LDR.SetupCLK stx ZPInBufPtr
sty ZPInBufPtr+1
2019-11-07 14:27:24 +00:00
jsr LDR.PrintA
ldx #LDR.MSG.CLK
jsr LDR.PrintX
2019-11-04 07:21:40 +00:00
lda #$D742
sta ZPOutBufPtr
lda /$D742
sta ZPOutBufPtr+1
jsr X.Unpak
2019-10-16 06:09:13 +00:00
2019-11-04 07:21:40 +00:00
lda #$4C enable clock routine by putting a jmp
sta clockv in front of clock vector
2019-10-16 06:09:13 +00:00
2019-11-04 07:21:40 +00:00
lda #MACHID.CLK
tsb MACHID
2019-11-07 14:27:24 +00:00
LDR.SetupCLK.RTS
2019-11-04 07:21:40 +00:00
rts
*--------------------------------------
2019-11-08 16:11:49 +00:00
LDR.SetupRAM lda GP.numdevs
cmp #13
bcs LDR.SetupCLK.RTS
jsr lc1in
2019-11-08 07:35:08 +00:00
ldx PAKME.RAM
ldy PAKME.RAM+1
stx ZPInBufPtr
sty ZPInBufPtr+1
lda #$FF00
sta ZPOutBufPtr
lda /$FF00
sta ZPOutBufPtr+1
jsr X.Unpak
sta SETWRITEAUX
ldx PAKME.RAMX
ldy PAKME.RAMX+1
2019-10-31 06:54:28 +00:00
2019-11-08 07:35:08 +00:00
stx ZPInBufPtr
sty ZPInBufPtr+1
lda #$0200
sta ZPOutBufPtr
lda /$0200
sta ZPOutBufPtr+1
jsr X.Unpak
2019-10-31 06:54:28 +00:00
2019-11-08 07:35:08 +00:00
sta CLRWRITEAUX
2019-11-04 07:21:40 +00:00
2019-11-08 07:35:08 +00:00
lda #RAMDRV put driver address into
2019-11-08 16:11:49 +00:00
sta DEVPTRS3D2
2019-11-08 07:35:08 +00:00
lda /RAMDRV
2019-11-08 16:11:49 +00:00
sta DEVPTRS3D2+1
2019-11-08 07:35:08 +00:00
inc GP.numdevs count (-1) active devices
ldx GP.numdevs
lda #$BF unit num of /RAM
sta devlist,x
ldx #LDR.MSG.RAM
jmp LDR.PrintX
*--------------------------------------
* find all disk devices in system slots and set up address
* and device table in prodos global page.
*--------------------------------------
LDR.BlkDevScan stz idxl
2019-10-31 06:54:28 +00:00
lda #$C7 search slots from high to low
sta idxl+1
2019-11-04 07:21:40 +00:00
2019-11-08 16:11:49 +00:00
lda #7
sta LDR.SlotIdx
.1 jsr LDR.CheckDiskID
2019-11-08 07:35:08 +00:00
bcs .8 if no ProDOS device in this slot.
ldy #$ff
2019-10-31 06:54:28 +00:00
lda (idxl),y check last byte of $Cn rom (y = $ff)
2019-11-08 07:35:08 +00:00
bne .2 branch if 16 sector disk II.
sta devid =0 since disk ii's have null attributes
lda #RWTS
sta driveradr
lda /RWTS
2019-11-08 16:11:49 +00:00
sta driveradr+1
2019-11-08 07:35:08 +00:00
sec 2 devices
2019-11-08 16:11:49 +00:00
jsr LDR.AddBlkDevs
bra .7
2019-11-08 07:35:08 +00:00
.2 cmp #$FF if = $FF then 13 sector disk II.
beq .8 ignore if 13 sector boot ROM
2019-10-31 06:54:28 +00:00
ldy #$07 check for a smartport device.
lda (idxl),y
2019-11-08 16:11:49 +00:00
bne .3 no smartport
2019-11-08 07:35:08 +00:00
2019-11-08 16:11:49 +00:00
jsr LDR.AddSPDevs
bra .7
2019-10-31 06:54:28 +00:00
2019-11-08 16:11:49 +00:00
.3 ldy #$FE BLK device...
2019-10-31 06:54:28 +00:00
lda (idxl),y get attributes.
and #$03 verify it provides read and status calls.
cmp #$03
2019-11-08 07:35:08 +00:00
bne .7 assume it's an off-brand disk
2019-11-08 16:11:49 +00:00
lda (idxl),y get back ID byte
lsr
lsr
lsr
lsr
sta devid ->DEV LIST NIBBLE
2019-11-08 07:35:08 +00:00
2019-11-08 16:11:49 +00:00
and #$3 Device count minus 1
inc
ldx LDR.SlotIdx
sta LDR.DevCnt-1,x
tax
2019-11-08 07:35:08 +00:00
2019-11-08 16:11:49 +00:00
iny $CnFF
lda (idxl),y
sta driveradr
lda idxl+1 store hi entry addr (low already done)
2019-11-08 07:35:08 +00:00
sta driveradr+1
2019-10-31 06:54:28 +00:00
2019-11-08 16:11:49 +00:00
cpx #2 CS if 2 devs or more
jsr LDR.AddBlkDevs install 1 or 2 devices from this slot.
2019-11-04 07:21:40 +00:00
2019-11-08 16:11:49 +00:00
.7 ldx LDR.SlotIdx
2019-11-08 07:35:08 +00:00
lda sltbit,x
tsb rommap mark bit to flag rom present
.8 dec idxl+1 next lower slot.
2019-11-08 16:11:49 +00:00
dec LDR.SlotIdx have all slots been checked ?
2019-11-08 07:35:08 +00:00
bne .1
2019-11-08 16:11:49 +00:00
*--------------------------------------
LDR.AddExtraDevs
lda #7
sta LDR.SlotIdx
2019-10-31 06:54:28 +00:00
2019-11-08 16:11:49 +00:00
.1 ldx LDR.SlotIdx
lda LDR.DevCnt-1,x
cmp #3
bcc .8
2019-10-31 06:54:28 +00:00
2019-11-08 16:11:49 +00:00
ldy LDR.DevType-1,x
bne .2
2019-11-08 07:35:08 +00:00
2019-11-08 16:11:49 +00:00
jsr LDR.AddExtraBlkDev
bra .8
2019-10-31 06:54:28 +00:00
2019-11-08 16:11:49 +00:00
.2 jsr LDR.AddExtraSPDevs
2019-11-04 07:21:40 +00:00
2019-11-08 16:11:49 +00:00
.8 dec LDR.SlotIdx
bne .1
2019-11-01 20:06:04 +00:00
2019-10-31 06:54:28 +00:00
rts
2019-11-08 07:35:08 +00:00
*--------------------------------------
2019-11-08 16:11:49 +00:00
LDR.AddSPDevs jsr LDR.SetDevID setup the devid byte from attributes
2019-10-31 06:54:28 +00:00
2019-11-08 16:11:49 +00:00
iny #$ff
lda (idxl),y
sta driveradr
2019-10-31 06:54:28 +00:00
sta pscall+1 modify operand
clc
adc #$03
sta spvect+1
2019-11-08 16:11:49 +00:00
lda idxl+1
sta driveradr+1
2019-10-31 06:54:28 +00:00
sta spvect+2
sta pscall+2 modify operand
2019-11-08 16:11:49 +00:00
2019-11-01 20:06:04 +00:00
asl convert $Cn to $n0
2019-10-31 06:54:28 +00:00
asl
asl
asl
sta unitnum unit number
2019-11-08 16:11:49 +00:00
2019-10-31 06:54:28 +00:00
stz A4L force a prodos status call
2019-11-08 16:11:49 +00:00
2019-10-31 06:54:28 +00:00
stz buf dummy pointer
lda #$10
sta buf+1 dummy pointer should be <> 0
2019-11-08 16:11:49 +00:00
stz bloknml # of bytes to transfer
stz bloknml+1
2019-10-31 06:54:28 +00:00
pscall jsr $0000 self modifying code
2019-11-08 16:11:49 +00:00
2019-10-31 06:54:28 +00:00
ldy #$FB
lda (idxl),y check device id
and #$02 SCSI?
2019-11-08 07:35:08 +00:00
beq .1 no, no need to init Cocoon
2019-11-08 16:11:49 +00:00
sta LDR.SPStatus.U device = 2 for SCSI
2019-10-31 06:54:28 +00:00
jsr spvect status of Cocoon
.HS 00
2019-11-08 16:11:49 +00:00
.DA LDR.SPStatus.P ignore any errors.
2019-10-31 06:54:28 +00:00
2019-11-08 16:11:49 +00:00
.1 stz LDR.SPStatus.U set unit# = 0
2019-10-31 06:54:28 +00:00
jsr spvect call to get the device count.
.HS 00 this is a status call
2019-11-08 16:11:49 +00:00
.DA LDR.SPStatus.P
2019-10-31 06:54:28 +00:00
2019-11-08 16:11:49 +00:00
lda LDR.SPStatus.Buf
beq .8 no devices, so done.
2019-10-31 06:54:28 +00:00
2019-11-08 16:11:49 +00:00
ldx LDR.SlotIdx
inc LDR.DevType-1,x set as smartport
.2 inc LDR.SPStatus.U
2019-10-31 06:54:28 +00:00
2019-11-08 16:11:49 +00:00
jsr spvect call to get the device status
.HS 00 this is a status call
.DA LDR.SPStatus.P
bcs .7 no more device
2019-10-31 06:54:28 +00:00
2019-11-08 16:11:49 +00:00
lda LDR.SPStatus.Buf
bpl .2 not a block device
ldx LDR.SlotIdx
inc LDR.DevCnt-1,x
bra .2
2019-10-31 06:54:28 +00:00
2019-11-08 16:11:49 +00:00
.7 ldx LDR.SlotIdx
lda LDR.DevCnt-1,x
beq .8
cmp #2 add 1 or 2 devs
jmp LDR.AddBlkDevs
.8 rts
2019-11-08 07:35:08 +00:00
*--------------------------------------
2019-11-08 16:11:49 +00:00
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.
2019-11-08 07:35:08 +00:00
2019-11-08 16:11:49 +00:00
asl
asl now form device # = slot #
asl in high nibble.
2019-11-08 07:35:08 +00:00
2019-11-08 16:11:49 +00:00
ora devid combine with attributes.
ldx GP.numdevs
inx put device # into device list.
sta devlist,x
asl now form drive 2 device number, if any.
2019-11-08 07:35:08 +00:00
2019-11-08 16:11:49 +00:00
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)
2019-11-08 07:35:08 +00:00
2019-11-08 16:11:49 +00:00
inx else presume that 2nd drive is present.
sta devlist,x active device list.
.1 stx GP.numdevs save updated device count.
asl shift # of drives back into carry.
lda driveradr get high address of device driver.
sta drivertbl1,y device driver table 1.
bcc .2 branch if single drive.
sta drivertbl2,y device driver table 2.
.2 lda driveradr+1
sta drivertbl1+1,y
bcc .3
sta drivertbl2+1,y
.3 rts
2019-11-08 07:35:08 +00:00
*--------------------------------------
2019-11-08 16:11:49 +00:00
LDR.AddExtraBlkDev
rts
2019-11-08 07:35:08 +00:00
*--------------------------------------
2019-11-08 16:11:49 +00:00
LDR.AddExtraSPDevs
rts
2019-10-31 06:54:28 +00:00
ldy #$FF get smartport address.
lda (idxl),y
clc
adc #$03 add 3 for smartport call
sta spvect+1
lda idxl+1
sta spvect+2
2019-11-08 16:11:49 +00:00
jsr LDR.SetDevID set up device attributes
stz LDR.SPStatus.U
2019-10-31 06:54:28 +00:00
jsr spvect do a status call on smartport itself
.HS 00
2019-11-08 16:11:49 +00:00
.DA LDR.SPStatus.P
2019-10-31 06:54:28 +00:00
2019-11-08 16:11:49 +00:00
lda LDR.SPStatus.Buf # of devices on smartport
2019-10-31 06:54:28 +00:00
cmp #$03
2019-11-08 16:11:49 +00:00
bcc .8 only 2 devices,skip to next one.
2019-10-31 06:54:28 +00:00
inc add 1 for comparisons.
sta driveradr # of devices + 1.
* find block devices on this smartport
2019-11-08 16:11:49 +00:00
.1 cmp driveradr have we done all units in this slot?
bcs .8 yes, skip to next slot.
2019-10-31 06:54:28 +00:00
2019-11-08 16:11:49 +00:00
sta LDR.SPStatus.U store the unit#.
2019-10-31 06:54:28 +00:00
jsr spvect do status call
.HS 00
2019-11-08 16:11:49 +00:00
.DA LDR.SPStatus.P
lda LDR.SPStatus.Buf is this a block device?
bpl .2
2019-10-31 06:54:28 +00:00
2019-11-08 16:11:49 +00:00
.2 lda LDR.SPStatus.U go check the next unit#
inc
bra .1
.8 rts
2019-11-08 07:35:08 +00:00
*--------------------------------------
2019-11-08 16:11:49 +00:00
LDR.FindFree dec Drive 0-1
asl
asl
asl
tay
ldx #$0C
2019-10-31 06:54:28 +00:00
2019-11-01 20:06:04 +00:00
.1 ldy driveridx,x
2019-10-31 06:54:28 +00:00
lda drivertbl1,y device driver table 1
cmp #nodevice
2019-11-01 20:06:04 +00:00
bne .2
2019-10-31 06:54:28 +00:00
lda drivertbl1+1,y
cmp /nodevice
2019-11-08 16:11:49 +00:00
beq .8
2019-11-01 20:06:04 +00:00
.2 dex
bpl .1
2019-11-08 16:11:49 +00:00
clc
.8 rts ran out of space for devices, exit.
*--------------------------------------
LDR.MountSPDevs jsr lc1in write enable LC ram bank 1.
2019-10-31 06:54:28 +00:00
tya divide index by 2
lsr
tax
2019-11-08 16:11:49 +00:00
lda LDR.SPStatus.U
2019-10-31 06:54:28 +00:00
sta spunit-1,x store the smartport unit #
2019-11-08 16:11:49 +00:00
2019-10-31 06:54:28 +00:00
lda spvect+1 and entry address.
sta spvectlo-1,x
2019-11-08 16:11:49 +00:00
2019-10-31 06:54:28 +00:00
lda spvect+2
sta spvecthi-1,x
2019-11-08 16:11:49 +00:00
2019-10-31 06:54:28 +00:00
lda RROMBNK2 write protect lc ram.
2019-11-08 16:11:49 +00:00
2019-11-04 07:21:40 +00:00
inc GP.numdevs
ldx GP.numdevs
2019-10-31 06:54:28 +00:00
tya
lsr
cmp #$08
2019-11-08 16:11:49 +00:00
bcc .4 drive 2 mount
2019-10-31 06:54:28 +00:00
sbc #$08
ora #$08
2019-11-08 16:11:49 +00:00
.4 asl
2019-10-31 06:54:28 +00:00
asl
asl
asl
2019-11-08 16:11:49 +00:00
2019-10-31 06:54:28 +00:00
ora devid include device attributes
sta devlist,x in the active device list.
2019-11-08 16:11:49 +00:00
2019-10-31 06:54:28 +00:00
lda #remap_sp
sta drivertbl1,y device driver table 1
lda /remap_sp
sta drivertbl1+1,y
2019-11-08 16:11:49 +00:00
rts
*--------------------------------------
* self modifying jmp = smartport entry address
*--------------------------------------
spvect jmp $0000 self modifying
*--------------------------------------
LDR.CheckDiskID lda CLRC8ROM switch out $C8 ROMs
ldy #$05
.1 lda (idxl),y compare id bytes
cmp dskid,y
sec set if no disk card
bne .2
2019-10-31 06:54:28 +00:00
2019-11-08 16:11:49 +00:00
dey
dey
bpl .1 loop until all 4 id bytes match.
clc clear if disk card
.2 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
2019-11-08 07:35:08 +00:00
*--------------------------------------
LDR.PrintA ldy LDR.Print.CX
and #$7F
cmp #$60
bcs .2
and #$3F
.2 sta $400,y
inc LDR.Print.CX
rts
*--------------------------------------
LDR.PrintX ldy LDR.Print.CX
.1 lda $2000,x
pha
and #$7F
cmp #$60
bcs .2
and #$3F
.2 sta $400,y
inx
iny
pla
bpl .1
* lda #$20
* sta $400,y
iny Add a Space
sty LDR.Print.CX
rts
*--------------------------------------
DS1216E.SIG .HS 5CA33AC55CA33AC5 Reverted 7->0
*--------------------------------------
* id bytes: evens for clock, odds for disk
dskid .HS 082028005803703C
sltbit .HS 0002040810204080
*--------------------------------------
LDR.MLIOL.P .DA #2
.DA #$60
.DA pbuf+1
LDR.MLISETP.P .DA #1
.DA pbuf
.DO READCAT=1
LDR.MLIRB.P .DA #3
.DA #0 unit number
.DA 0 2 byte data buffer
.DA 0 2 byte block number
.FIN
2019-11-01 20:06:04 +00:00
2019-11-08 16:11:49 +00:00
LDR.SPStatus.P .DA #$03 # of parms
LDR.SPStatus.U .DA #$00 unit number (code for smartport stat)
.DA LDR.SPStatus.Buf
2019-11-08 07:35:08 +00:00
.DA #00 status code (0 = general status)
driveridx .DA #$06
.DA #$1E
.DA #$0E
.DA #$1C
.DA #$0C
.DA #$1A
.DA #$0A
.DA #$14
.DA #$04
.DA #$12
.DA #$02
.DA #$18
.DA #$08
*--------------------------------------
LDR.Print.CX .BS 1
2019-11-08 16:11:49 +00:00
*--------------------------------------
LDR.SPStatus.Buf .BS 8 8 bytes for smartport call
driveradr .BS 2
LDR.SlotIdx .BS 1
LDR.DevCnt .BS 7
LDR.DevType .BS 7
2019-11-08 07:35:08 +00:00
LDR.cortland .DA #0 cortland loader flag (1 = Cortland)
LDR.BootFlag .DA #0 0 = normal boot, <>0 = return
2019-11-05 16:31:29 +00:00
*--------------------------------------
2019-11-01 20:06:04 +00:00
* 16 bytes moved to $03F0 vectors
2019-11-05 16:31:29 +00:00
*--------------------------------------
2019-11-01 20:06:04 +00:00
LDR.3F0 .DA breakv
.DA oldrst
.DA #$5A powerup byte
jmp oldrst '&' vector
jmp oldrst ctrl-y vector
.HS 004000
.DA GP.IRQV global page interrupt vector
lc1in lda RRAMWRAMBNK1
lda RRAMWRAMBNK1
rts
2019-11-05 16:31:29 +00:00
*--------------------------------------
2019-11-04 07:21:40 +00:00
* patch to gsos vectors so error is returned for os calls - rev note #101
2019-11-05 16:31:29 +00:00
*--------------------------------------
2019-11-04 07:21:40 +00:00
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
2019-11-05 16:31:29 +00:00
*--------------------------------------
2019-10-16 06:09:13 +00:00
MAN
2019-11-04 07:21:40 +00:00
SAVE USR/SRC/PRODOS.FX/PRODOS.S.LDR
2019-10-16 06:09:13 +00:00
LOAD USR/SRC/PRODOS.FX/PRODOS.S
ASM