mirror of
https://github.com/A2osX/A2osX.git
synced 2025-02-15 11:32:43 +00:00
Kernel 0.93+
This commit is contained in:
parent
22780942a9
commit
a5bcf762ff
204
ProDOS.FX/ProDOS.S.ILDR.txt
Normal file
204
ProDOS.FX/ProDOS.S.ILDR.txt
Normal file
@ -0,0 +1,204 @@
|
||||
NEW
|
||||
AUTO 3,1
|
||||
*--------------------------------------
|
||||
licode jsr MLI check for file 'atinit'
|
||||
.DA #MLIGETFILEINFO
|
||||
.DA gfi_list
|
||||
bcc gfi_ok branch if 'atinit' file found
|
||||
cmp #$46 file not found?
|
||||
beq H23DF if so, continue loading interpreter
|
||||
bne H23E2
|
||||
gfi_ok lda gfi_type
|
||||
cmp #$E2 is 'atinit' correct file type?
|
||||
bne H23E2 error - wrong file type
|
||||
jsr MLI open 'atinit' file
|
||||
.DA #$C8
|
||||
.DA atopen
|
||||
bne H23E2 error
|
||||
lda #$9F max size = 39.75k ($2000-$BF00)
|
||||
sta rdlen+1
|
||||
stz rdlen
|
||||
jsr MLI read 'atinit' file to 'sysentry'
|
||||
.DA #$CA
|
||||
.DA rdparm
|
||||
bne H23E2 error - too big
|
||||
jsr MLI close 'atinit' file
|
||||
.DA #$CC
|
||||
.DA clparm
|
||||
bne H23E2 error
|
||||
lda RROMBNK2 enable ROM
|
||||
jsr sysentry execute ATinit
|
||||
H23DF jmp goloadint execute .system file
|
||||
|
||||
* fatal error
|
||||
|
||||
H23E2 ldx $23F0 BUG: should be ATINIT.ERR
|
||||
H23E5 lda $23F0,x BUG: should be ATINIT.ERR
|
||||
sta vline16,x
|
||||
dex
|
||||
bne H23E5
|
||||
beq *
|
||||
|
||||
ATINIT.ERR .DA #$1A length of message
|
||||
.AS -"Unable to load ATInit file"
|
||||
gfi_list .DA #$0A
|
||||
.DA atinitname
|
||||
.HS 00
|
||||
gfi_type .HS 00000000
|
||||
.HS 0000000000000000
|
||||
.HS 0000
|
||||
atopen .HS 03
|
||||
.DA atinitname
|
||||
.DA iobuf i/o buffer
|
||||
.HS 01 ref# hard coded since no other files
|
||||
atinitname .DA #06 length of name
|
||||
.AS -"atinit" name of appletalk config file
|
||||
goloadint
|
||||
lda /dbuf search directory buffer
|
||||
sta idxl+1
|
||||
lda #$04 start 1 entry past header
|
||||
bne H2434 always.
|
||||
H2432 lda idxl calc next entry position
|
||||
H2434 clc
|
||||
adc dbuf+35 inc to next entry address
|
||||
sta idxl
|
||||
bcs H2451 branch if page cross.
|
||||
adc dbuf+35 test for end of block.
|
||||
bcc H2453 branch if not page cross
|
||||
lda idxl+1
|
||||
lsr end of block?
|
||||
bcc H2453 no.
|
||||
cmp #$09 end of directory?
|
||||
bne H244D no.
|
||||
jmp nointrp no interpreter, go quit.
|
||||
H244D lda #$04 reset index to 1st entry in next block.
|
||||
sta idxl
|
||||
H2451 inc idxl+1 inc to next page.
|
||||
H2453 ldy #$10 check file type.
|
||||
lda #$FF must be a prodos sys file
|
||||
eor (idxl),y
|
||||
bne H2432 if not sys.
|
||||
tay see if active
|
||||
lda (idxl),y
|
||||
beq H2432 if deleted file.
|
||||
and #$0F strip file 'kind'.
|
||||
sta pbuf save length of name.
|
||||
cmp #$08 must be at least 'x.system'
|
||||
bcc H2432 else, ignore it.
|
||||
tay compare last 7 chars for '.system'
|
||||
ldx #$06
|
||||
H246C lda (idxl),y
|
||||
eor iterp,x
|
||||
asl
|
||||
bne H2432 branch if something else
|
||||
dey
|
||||
dex
|
||||
bpl H246C
|
||||
ldy #$00
|
||||
H247A iny
|
||||
lda (idxl),y
|
||||
sta pbuf,y
|
||||
ora #$80 msb on so can be displayed if error
|
||||
sta iomess+$11,y
|
||||
cpy pbuf
|
||||
bne H247A
|
||||
lda #$A0 space after name
|
||||
sta iomess+$12,y
|
||||
tya error message length
|
||||
adc #$13 (carry set)
|
||||
sta ierlen
|
||||
jsr MLI open interpreter file
|
||||
.DA #$C8
|
||||
.DA opparm
|
||||
bne badlod
|
||||
jsr MLI get eof (length of file)
|
||||
.DA #$D1
|
||||
.DA efparm
|
||||
bne badlod
|
||||
lda eof+2
|
||||
bne toolong
|
||||
lda eof+1
|
||||
cmp #$9F max size = 39.75k ($2000-$BF00)
|
||||
bcs toolong
|
||||
sta rdlen+1
|
||||
lda eof
|
||||
sta rdlen (read entire file)
|
||||
jsr MLI read interpreter file
|
||||
.DA #$CA
|
||||
.DA rdparm
|
||||
beq H24C8 go close if successfully read.
|
||||
cmp #$56 memory conflict?
|
||||
beq toolong then too large
|
||||
bne badlod else, unable to load.
|
||||
H24C8 jsr MLI close interpreter file
|
||||
.DA #$CC
|
||||
.DA clparm
|
||||
bne badlod hopefully never taken
|
||||
|
||||
* if booting on a //c then see if esc is in keyboard buffer
|
||||
* and clear it. it may have been pressed to shift speed
|
||||
* of accelerator chip
|
||||
|
||||
lda cflag
|
||||
beq H24DF taken if not booting on a //c
|
||||
lda kbd else, check for keypress
|
||||
cmp #$9B escape?
|
||||
bne H24DF if not.
|
||||
sta KBDSTROBE clear keyboard
|
||||
H24DF lda RROMBNK2 enable ROM
|
||||
jmp sysentry go run interpreter
|
||||
|
||||
cflag .HS 00 set if a //c.
|
||||
|
||||
nointrp jsr MLI no interpreter found,so quit.
|
||||
.DA #$65
|
||||
.DA quitparm
|
||||
|
||||
badlod ldy ierlen center the error message
|
||||
lda #$27
|
||||
sec
|
||||
sbc ierlen
|
||||
lsr
|
||||
adc ierlen
|
||||
tax
|
||||
H24FA lda iomess,y
|
||||
sta vline16,x
|
||||
dex
|
||||
dey
|
||||
bpl H24FA
|
||||
bmi H2511
|
||||
toolong ldy #$1E
|
||||
H2508 lda lgmess,y
|
||||
sta vline16+5,y
|
||||
dey
|
||||
bpl H2508
|
||||
H2511 bmi H2511
|
||||
lgmess .AS -"** System program too large **"
|
||||
iomess .AS -"** Unable to load"
|
||||
.AS -" X.System *********"
|
||||
ierlen .HS 00
|
||||
opparm .HS 03
|
||||
.DA pbuf
|
||||
.DA iobuf
|
||||
.HS 01
|
||||
efparm .HS 02
|
||||
.DA #01
|
||||
eof .HS 000000 length of file.
|
||||
rdparm .HS 04
|
||||
.HS 01
|
||||
.DA sysentry
|
||||
rdlen .HS 0000
|
||||
.HS 0000
|
||||
clparm .HS 01
|
||||
.HS 00
|
||||
quitparm .HS 04
|
||||
.HS 00
|
||||
.HS 0000
|
||||
.HS 00
|
||||
.HS 0000
|
||||
iterp .AS -".SYSTEM" interpreter suffix that is required
|
||||
*--------------------------------------
|
||||
MAN
|
||||
SAVE USR/SRC/PRODOS.FX/PRODOS.S.ILDR
|
||||
LOAD USR/SRC/PRODOS.FX/PRODOS.S
|
||||
ASM
|
@ -1,27 +1,19 @@
|
||||
NEW
|
||||
AUTO 3,1
|
||||
*--------------------------------------
|
||||
H2000 jmp prostart
|
||||
jmp atalkset appletalk setup for network boot
|
||||
jmp p16start GQuit setup for gs/os
|
||||
|
||||
LDR.MSG.AppleII .AS -"Apple II"
|
||||
LDR.MSG.ProDOS .AS -"ProDOS 8 V2.0.3 "
|
||||
.AS -"06-May-93"
|
||||
H202F .AS -"A2osX Custom"
|
||||
LDR.MSG.Copyright
|
||||
.AS -"Copyright Apple Computer, Inc., 1983-93"
|
||||
LDR.MSG.Reserved
|
||||
.AS -"All Rights Reserved."
|
||||
|
||||
LDR.MSG.16 .AS -"Apple II"
|
||||
LDR.MSG.12 .AS -"ProDOS 8 V2.0.3 06-May-93"
|
||||
LDR.MSG.14 .AS -"A2osX Custom"
|
||||
LDR.MSG.23 .AS -"Copyright Apple Computer, Inc., 1983-93"
|
||||
LDR.MSG.10 .AS -"All Rights Reserved."
|
||||
p16start inc setuprts set = 2 for GQuit rts
|
||||
atalkset inc setuprts set = 1 for appletalk rts
|
||||
prostart lda unitnum
|
||||
sta LDR.MLIONLINE.P+1
|
||||
jsr LDR.Splash
|
||||
|
||||
* test for at least a 65c02
|
||||
|
||||
sed
|
||||
lda #$99 a negative #
|
||||
clc
|
||||
@ -29,17 +21,13 @@ prostart lda unitnum
|
||||
cld
|
||||
bmi m48k if 6502 because will not clear N flag
|
||||
|
||||
* machine at least an m65c02
|
||||
|
||||
lda #$01 patch for the gs rom
|
||||
trb statereg to force off intcxrom
|
||||
ldx #H232B yx=232B location table
|
||||
ldy /H232B
|
||||
jsr reloc move interpreter loader to $800
|
||||
bcs m48k error
|
||||
|
||||
* test for at least 64k
|
||||
|
||||
ldy #$00
|
||||
lda #$FF
|
||||
sta kversion at least 48k ?
|
||||
@ -396,7 +384,7 @@ altdsptbl .DA #$01 move GQuit launcher
|
||||
.DA dispadr to dispadr for gsos
|
||||
.DA $0300 length (must be <= 3 pages)
|
||||
.DA SEL2 source
|
||||
.HS FF done
|
||||
.HS FF done
|
||||
|
||||
* tables for moving 64k version of mli for execution
|
||||
|
||||
@ -445,212 +433,6 @@ cortclock .DA #$01 relocation table. 1=move src to dst
|
||||
.DA CCLK source
|
||||
.HS FF done
|
||||
|
||||
* load and run appletalk configuration file (atinit) if present
|
||||
* or continue loading and running .system file
|
||||
|
||||
* loader origin $800
|
||||
|
||||
LOADINT .PH $800
|
||||
|
||||
licode jsr MLI check for file 'atinit'
|
||||
.DA #MLIGETFILEINFO
|
||||
.DA gfi_list
|
||||
bcc gfi_ok branch if 'atinit' file found
|
||||
cmp #$46 file not found?
|
||||
beq H23DF if so, continue loading interpreter
|
||||
bne H23E2
|
||||
gfi_ok lda gfi_type
|
||||
cmp #$E2 is 'atinit' correct file type?
|
||||
bne H23E2 error - wrong file type
|
||||
jsr MLI open 'atinit' file
|
||||
.DA #$C8
|
||||
.DA atopen
|
||||
bne H23E2 error
|
||||
lda #$9F max size = 39.75k ($2000-$BF00)
|
||||
sta rdlen+1
|
||||
stz rdlen
|
||||
jsr MLI read 'atinit' file to 'sysentry'
|
||||
.DA #$CA
|
||||
.DA rdparm
|
||||
bne H23E2 error - too big
|
||||
jsr MLI close 'atinit' file
|
||||
.DA #$CC
|
||||
.DA clparm
|
||||
bne H23E2 error
|
||||
lda RROMBNK2 enable ROM
|
||||
jsr sysentry execute ATinit
|
||||
H23DF jmp goloadint execute .system file
|
||||
|
||||
* fatal error
|
||||
|
||||
H23E2 ldx $23F0 BUG: should be ATINIT.ERR
|
||||
H23E5 lda $23F0,x BUG: should be ATINIT.ERR
|
||||
sta vline16,x
|
||||
dex
|
||||
bne H23E5
|
||||
beq *
|
||||
|
||||
ATINIT.ERR .DA #$1A length of message
|
||||
.AS -"Unable to load ATInit file"
|
||||
gfi_list .DA #$0A
|
||||
.DA atinitname
|
||||
.HS 00
|
||||
gfi_type .HS 00000000
|
||||
.HS 0000000000000000
|
||||
.HS 0000
|
||||
atopen .HS 03
|
||||
.DA atinitname
|
||||
.DA iobuf i/o buffer
|
||||
.HS 01 ref# hard coded since no other files
|
||||
atinitname .DA #06 length of name
|
||||
.AS -"atinit" name of appletalk config file
|
||||
goloadint
|
||||
lda /dbuf search directory buffer
|
||||
sta idxl+1
|
||||
lda #$04 start 1 entry past header
|
||||
bne H2434 always.
|
||||
H2432 lda idxl calc next entry position
|
||||
H2434 clc
|
||||
adc dbuf+35 inc to next entry address
|
||||
sta idxl
|
||||
bcs H2451 branch if page cross.
|
||||
adc dbuf+35 test for end of block.
|
||||
bcc H2453 branch if not page cross
|
||||
lda idxl+1
|
||||
lsr end of block?
|
||||
bcc H2453 no.
|
||||
cmp #$09 end of directory?
|
||||
bne H244D no.
|
||||
jmp nointrp no interpreter, go quit.
|
||||
H244D lda #$04 reset index to 1st entry in next block.
|
||||
sta idxl
|
||||
H2451 inc idxl+1 inc to next page.
|
||||
H2453 ldy #$10 check file type.
|
||||
lda #$FF must be a prodos sys file
|
||||
eor (idxl),y
|
||||
bne H2432 if not sys.
|
||||
tay see if active
|
||||
lda (idxl),y
|
||||
beq H2432 if deleted file.
|
||||
and #$0F strip file 'kind'.
|
||||
sta pbuf save length of name.
|
||||
cmp #$08 must be at least 'x.system'
|
||||
bcc H2432 else, ignore it.
|
||||
tay compare last 7 chars for '.system'
|
||||
ldx #$06
|
||||
H246C lda (idxl),y
|
||||
eor iterp,x
|
||||
asl
|
||||
bne H2432 branch if something else
|
||||
dey
|
||||
dex
|
||||
bpl H246C
|
||||
ldy #$00
|
||||
H247A iny
|
||||
lda (idxl),y
|
||||
sta pbuf,y
|
||||
ora #$80 msb on so can be displayed if error
|
||||
sta iomess+$11,y
|
||||
cpy pbuf
|
||||
bne H247A
|
||||
lda #$A0 space after name
|
||||
sta iomess+$12,y
|
||||
tya error message length
|
||||
adc #$13 (carry set)
|
||||
sta ierlen
|
||||
jsr MLI open interpreter file
|
||||
.DA #$C8
|
||||
.DA opparm
|
||||
bne badlod
|
||||
jsr MLI get eof (length of file)
|
||||
.DA #$D1
|
||||
.DA efparm
|
||||
bne badlod
|
||||
lda eof+2
|
||||
bne toolong
|
||||
lda eof+1
|
||||
cmp #$9F max size = 39.75k ($2000-$BF00)
|
||||
bcs toolong
|
||||
sta rdlen+1
|
||||
lda eof
|
||||
sta rdlen (read entire file)
|
||||
jsr MLI read interpreter file
|
||||
.DA #$CA
|
||||
.DA rdparm
|
||||
beq H24C8 go close if successfully read.
|
||||
cmp #$56 memory conflict?
|
||||
beq toolong then too large
|
||||
bne badlod else, unable to load.
|
||||
H24C8 jsr MLI close interpreter file
|
||||
.DA #$CC
|
||||
.DA clparm
|
||||
bne badlod hopefully never taken
|
||||
|
||||
* if booting on a //c then see if esc is in keyboard buffer
|
||||
* and clear it. it may have been pressed to shift speed
|
||||
* of accelerator chip
|
||||
|
||||
lda cflag
|
||||
beq H24DF taken if not booting on a //c
|
||||
lda kbd else, check for keypress
|
||||
cmp #$9B escape?
|
||||
bne H24DF if not.
|
||||
sta KBDSTROBE clear keyboard
|
||||
H24DF lda RROMBNK2 enable ROM
|
||||
jmp sysentry go run interpreter
|
||||
|
||||
cflag .HS 00 set if a //c.
|
||||
|
||||
nointrp jsr MLI no interpreter found,so quit.
|
||||
.DA #$65
|
||||
.DA quitparm
|
||||
|
||||
badlod ldy ierlen center the error message
|
||||
lda #$27
|
||||
sec
|
||||
sbc ierlen
|
||||
lsr
|
||||
adc ierlen
|
||||
tax
|
||||
H24FA lda iomess,y
|
||||
sta vline16,x
|
||||
dex
|
||||
dey
|
||||
bpl H24FA
|
||||
bmi H2511
|
||||
toolong ldy #$1E
|
||||
H2508 lda lgmess,y
|
||||
sta vline16+5,y
|
||||
dey
|
||||
bpl H2508
|
||||
H2511 bmi H2511
|
||||
lgmess .AS -"** System program too large **"
|
||||
iomess .AS -"** Unable to load"
|
||||
.AS -" X.System *********"
|
||||
ierlen .HS 00
|
||||
opparm .HS 03
|
||||
.DA pbuf
|
||||
.DA iobuf
|
||||
.HS 01
|
||||
efparm .HS 02
|
||||
.DA #01
|
||||
eof .HS 000000 length of file.
|
||||
rdparm .HS 04
|
||||
.HS 01
|
||||
.DA sysentry
|
||||
rdlen .HS 0000
|
||||
.HS 0000
|
||||
clparm .HS 01
|
||||
.HS 00
|
||||
quitparm .HS 04
|
||||
.HS 00
|
||||
.HS 0000
|
||||
.HS 00
|
||||
.HS 0000
|
||||
iterp .AS -".SYSTEM" interpreter suffix that is required
|
||||
|
||||
licode.end .EP
|
||||
|
||||
* 16 bytes moved to $03F0 vectors
|
||||
|
||||
H257B .DA breakv
|
||||
@ -741,6 +523,584 @@ H2620 clc
|
||||
rts
|
||||
LDR.Test128.len .EQ *-LDR.Test128
|
||||
*--------------------------------------
|
||||
LDR.Splash cld
|
||||
sta CLR80DISP disable 80 col hardware
|
||||
sta CLR80STORE disable 80 col store
|
||||
jsr setnorm set normal text mode
|
||||
jsr init init text screen
|
||||
jsr setvid reset output to screen
|
||||
jsr setkbd reset input to keyboard
|
||||
jsr home
|
||||
ldx #$07
|
||||
.1 lda LDR.MSG.16,x
|
||||
sta vline10+16,x
|
||||
dex
|
||||
bpl .1
|
||||
|
||||
ldx #$1D
|
||||
.2 lda LDR.MSG.12,x
|
||||
sta vline12+5,x
|
||||
dex
|
||||
bpl .2
|
||||
ldx #$0B
|
||||
.3 lda LDR.MSG.14,x
|
||||
sta vline14+14,x
|
||||
dex
|
||||
bpl .3
|
||||
ldx #$26
|
||||
.4 lda LDR.MSG.23,x
|
||||
sta vline23,x
|
||||
dex
|
||||
bpl .4
|
||||
ldx #$13
|
||||
.5 lda LDR.MSG.10,x
|
||||
sta vline24+10,x
|
||||
dex
|
||||
bpl .5
|
||||
sec
|
||||
jsr idroutine returns system info
|
||||
bcs .8 taken if not a //gs
|
||||
lda #$80
|
||||
trb newvideo video mode select
|
||||
.8 bit $C000
|
||||
bpl .8
|
||||
sta $C010
|
||||
rts
|
||||
*--------------------------------------
|
||||
* find all disk devices in system slots and set up address
|
||||
* and device table in prodos global page. if there is a disk
|
||||
* card in slot 2 then limit the # of devices in slot 5
|
||||
* smartport to only 2
|
||||
*--------------------------------------
|
||||
numdev2 .HS 0000000000000000 8 bytes for smartport call
|
||||
driveradr .DA 0
|
||||
d2idx .DA #0
|
||||
diskins2 .DA #0 msb clear if drive in slot 2
|
||||
|
||||
devsrch stz dst
|
||||
stz dst+1
|
||||
stz idxl
|
||||
ldx #$FF init to no active devices.
|
||||
stx numdevs count (-1) active devices.
|
||||
lda #$0E start disk // area at end of devlist.
|
||||
sta d2idx
|
||||
|
||||
* check slot 2. if there is a disk card then clear the msb of diskins2. this
|
||||
* will limit the # of devices in any slot 5 spartport card to 2.
|
||||
|
||||
lda #$C2
|
||||
sta idxl+1 check slot 2
|
||||
jsr cmpid is there a disk in slot 2 ?
|
||||
ror diskins2 if so, clear msb else set it.
|
||||
lda #$C7 search slots from high to low
|
||||
sta idxl+1
|
||||
H26AB jsr cmpid
|
||||
bcs H270C if no ProDOS device in this slot.
|
||||
lda (idxl),y check last byte of $Cn rom (y = $ff)
|
||||
beq diskii branch if 16 sector disk II.
|
||||
cmp #$FF if = $FF then 13 sector disk II.
|
||||
bcs H270C ignore if 13 sector boot ROM
|
||||
sta driveradr else assume it's an intelligent disk.
|
||||
ldy #$07 check for a smartport device.
|
||||
lda (idxl),y
|
||||
bne H26C4 no smartport
|
||||
jmp smartprt
|
||||
|
||||
H26C4 ldy #$FE
|
||||
lda (idxl),y get attributes.
|
||||
and #$03 verify it provides read and status calls.
|
||||
cmp #$03
|
||||
sec assume it's an off-brand disk
|
||||
bne H270C
|
||||
jsr setdevid set up the devid byte from attributes
|
||||
clc
|
||||
php remember that it's not a disk //.
|
||||
lsr move # of units (0=1, 1=2) to carry.
|
||||
lda idxl+1 store hi entry addr (low already done)
|
||||
bne H26E6 branch always.
|
||||
|
||||
diskii sta devid =0 since disk ii's have null attributes
|
||||
sec
|
||||
php remember it's a disk //
|
||||
lda #RWTS
|
||||
sta driveradr
|
||||
lda /RWTS
|
||||
|
||||
H26E6 sta driveradr+1
|
||||
jsr installdev install 1 or 2 devices from this slot.
|
||||
plp get back if it's a disk // (carry).
|
||||
bcc nxtdsk2 if not disk //.
|
||||
dex move the list pointer back by 2 devices
|
||||
dex
|
||||
stx numdevs count (-1) active devices
|
||||
dec d2idx increase the disk two index
|
||||
dec d2idx
|
||||
ldy d2idx
|
||||
inx adj since device count starts with $FF.
|
||||
lda devlist+1,x get entries for disk //
|
||||
sta devlist,y move then toward the end of the list
|
||||
lda devlist,x
|
||||
sta devlist+1,y
|
||||
dex back to numdevs again
|
||||
nxtdsk2 clc
|
||||
H270C jsr sltrom test for ROM in given slot and set flags
|
||||
dec idxl+1 next lower slot.
|
||||
lda idxl+1
|
||||
and #$07 have all slots been checked ?
|
||||
bne H26AB no.
|
||||
|
||||
* perform the new device search, mapping unmounted smartport devices
|
||||
* to empty slots in the device table.
|
||||
|
||||
jsr newmount
|
||||
|
||||
* now copy the disk // list to the end of the regular list.
|
||||
* start by making the device count include disk //'s
|
||||
|
||||
ldx numdevs current device count - 1
|
||||
lda #$0E
|
||||
sec
|
||||
sbc d2idx
|
||||
beq H2747 if there were no disk //'s then done.
|
||||
clc
|
||||
adc numdevs sum of disk //'s and others.
|
||||
sta numdevs
|
||||
inx move to open space in regular list.
|
||||
ldy #$0D first disk // entry.
|
||||
H272F lda devlist,y
|
||||
pha
|
||||
lda devlist,x
|
||||
sta devlist,y
|
||||
pla
|
||||
sta devlist,x
|
||||
inx
|
||||
dey
|
||||
sty d2idx use as a temp
|
||||
cpx d2idx
|
||||
bcc H272F continue until indexes cross
|
||||
H2747 ldy #$00
|
||||
ldx numdevs now change the device order so that
|
||||
|
||||
H274C lda devlist,x the boot device will have highest
|
||||
pha priority.
|
||||
and #$7F strip off high bit
|
||||
eor devnum for comparison.
|
||||
asl
|
||||
bne H275A
|
||||
pla
|
||||
iny
|
||||
H275A dex
|
||||
bpl H274C
|
||||
|
||||
ldx numdevs now reverse order of search, hi to lo.
|
||||
tya was boot device found ?
|
||||
beq H2777
|
||||
lda devnum make boot device 1st in search order.
|
||||
sta devlist,x
|
||||
dex
|
||||
bmi H277E branch if only one device.
|
||||
dey is this a 2 drive device ?
|
||||
beq H2777 branch if not.
|
||||
eor #$80 make boot device, drive 2 next.
|
||||
sta devlist,x
|
||||
dex
|
||||
bmi H277E branch if only 1 device, 2 drives.
|
||||
H2777 pla
|
||||
sta devlist,x
|
||||
dex
|
||||
bpl H2777
|
||||
H277E jsr fndtrd save accumulated machine id.
|
||||
beq H2787
|
||||
sta machid machine ID byte
|
||||
rts
|
||||
H2787 jmp H25B6
|
||||
stadrv ora devid combine with attributes.
|
||||
ldx numdevs
|
||||
inx put device # into device list.
|
||||
sta devlist,x
|
||||
asl now form drive 2 device number, if any.
|
||||
rts
|
||||
sltrom bcc H27F3 branch if disk drive
|
||||
* test for clock card
|
||||
ldy #$06
|
||||
|
||||
H2799 lda (idxl),y
|
||||
cmp dskid,y
|
||||
bne H27BA no clock
|
||||
dey
|
||||
dey
|
||||
bpl H2799
|
||||
|
||||
lda idxl+1 transfer hi slot address
|
||||
sbc #$C1 minus $C1 (default) to relocate
|
||||
sta clock64 references to clock rom.
|
||||
lda #$4C enable jump vector in globals.
|
||||
sta clockv P8 clock vector.
|
||||
lda idapple mark clock as present.
|
||||
beq H277E
|
||||
|
||||
ora #$01
|
||||
sta idapple xxxxxxx1 = clock present.
|
||||
bne H27F3 always taken.
|
||||
|
||||
* test for 80 col card
|
||||
|
||||
H27BA ldy #$05
|
||||
lda (idxl),y
|
||||
cmp #$38
|
||||
bne H27E4
|
||||
ldy #$07
|
||||
lda (idxl),y
|
||||
cmp #$18
|
||||
bne H27E4
|
||||
ldy #$0B
|
||||
lda (idxl),y
|
||||
dec must = 1
|
||||
bne H27E4
|
||||
iny
|
||||
lda (idxl),y
|
||||
and #$F0 mask off low nibble.
|
||||
cmp #$80 generic for 80-col card.
|
||||
bne H27E4
|
||||
lda idapple
|
||||
beq H277E
|
||||
ora #$02
|
||||
sta idapple xxxxxx1x = 80 col card.
|
||||
bne H27F3 always taken.
|
||||
|
||||
* test for any other rom
|
||||
|
||||
H27E4 ldx #$00
|
||||
lda (idxl)
|
||||
cmp #$FF apple /// non-slot?
|
||||
beq H2801 invalid rom
|
||||
H27EC cmp (idxl) look for floating bus
|
||||
bne H2801 no rom
|
||||
inx
|
||||
bne H27EC
|
||||
H27F3 lda idxl+1 mark a bit in slot byte
|
||||
and #$07 to indicate rom present.
|
||||
tax
|
||||
lda sltbit,x
|
||||
ora rommap mark bit to flag rom present
|
||||
sta rommap slot ROM bit map
|
||||
H2801 rts
|
||||
|
||||
* id bytes: evens for clock, odds for disk
|
||||
dskid .HS 082028005803703C
|
||||
* slot bits
|
||||
sltbit .HS 0002040810204080
|
||||
|
||||
fndtrd clc
|
||||
ldy sltbit
|
||||
H2818 lda (lookptr),y
|
||||
and #$DF
|
||||
adc sltbit
|
||||
sta sltbit
|
||||
rol sltbit
|
||||
iny
|
||||
cpy sltbit+3
|
||||
bne H2818
|
||||
tya
|
||||
asl
|
||||
asl
|
||||
asl
|
||||
asl
|
||||
tay
|
||||
eor sltbit
|
||||
adc #$0B
|
||||
bne H283B
|
||||
lda idapple
|
||||
rts
|
||||
|
||||
H283B lda #$00
|
||||
rts
|
||||
|
||||
installdev 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.
|
||||
jsr stadrv OR in low nibble, store in dev list.
|
||||
plp restore # of devices in carry.
|
||||
ror if 2 drives, then bit 7=1.
|
||||
bpl H2853 branch if a 1 drive device (e.g. hard drive)
|
||||
inx else presume that 2nd drive is present.
|
||||
sta devlist,x active device list.
|
||||
|
||||
H2853 stx 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 H2862 branch if single drive.
|
||||
sta drivertbl2,y device driver table 2.
|
||||
|
||||
H2862 lda driveradr+1
|
||||
sta drivertbl1+1,y
|
||||
bcc H286D
|
||||
sta drivertbl2+1,y
|
||||
|
||||
H286D rts
|
||||
|
||||
* query smartport status to determine # of devices
|
||||
* and install up to 4 units in table if card is in slot 5
|
||||
* otherwise only 2 units. this includes a patch #74
|
||||
|
||||
smartprt jsr setdevid setup the devid byte from attributes
|
||||
lda idxl+1
|
||||
sta driveradr+1
|
||||
lda driveradr
|
||||
sta pscall+1 modify operand
|
||||
clc
|
||||
adc #$03
|
||||
sta spvect+1
|
||||
lda driveradr+1
|
||||
sta spvect+2
|
||||
sta pscall+2 modify operand
|
||||
asl convert $Cn to $n0
|
||||
asl
|
||||
asl
|
||||
asl
|
||||
sta unitnum unit number
|
||||
stz A4L force a prodos status call
|
||||
stz buf dummy pointer
|
||||
stz bloknml # of bytes to transfer
|
||||
stz bloknml+1
|
||||
lda #$10
|
||||
sta buf+1 dummy pointer should be <> 0
|
||||
|
||||
* do a prodos status call patched in from above
|
||||
|
||||
pscall jsr $0000 self modifying code
|
||||
ldy #$FB
|
||||
lda (idxl),y check device id
|
||||
and #$02 SCSI?
|
||||
beq H28B1 no, no need to init Cocoon
|
||||
sta statunit device = 2 for SCSI
|
||||
|
||||
* initialize SCSI Cocoon to build internal device tables
|
||||
* and report true # of devices attached
|
||||
|
||||
jsr spvect status of Cocoon
|
||||
.HS 00
|
||||
.DA spcparms ignore any errors.
|
||||
|
||||
H28B1 stz statunit set unit# = 0
|
||||
jsr spvect call to get the device count.
|
||||
.HS 00 this is a status call
|
||||
.DA spcparms
|
||||
|
||||
lda numdev2
|
||||
beq donesp no devices, so done.
|
||||
cmp #$02 carry set if 2,3,4
|
||||
jsr installdev do the 1st and 2nd device if exists.
|
||||
lda idxl+1
|
||||
cmp #$C5
|
||||
bne donesp if not slot 5
|
||||
|
||||
* for slot 5, if there is a disk card in slot 2
|
||||
* then only install 2 devices otherwise map
|
||||
* extra devices as slot 2
|
||||
|
||||
bit diskins2 disk in slot 2 ?
|
||||
bpl donesp yes - so done
|
||||
|
||||
lda numdev2
|
||||
cmp #$03 carry set if 3,4,...
|
||||
bcc donesp
|
||||
|
||||
cmp #$04 carry set if 4,5,6,...
|
||||
lda #$C2 map extra devices as slot 2
|
||||
sta idxl+1
|
||||
jsr installdev
|
||||
|
||||
lda #$C5
|
||||
sta idxl+1
|
||||
donesp jmp nxtdsk2 it's a disk device.
|
||||
|
||||
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
|
||||
|
||||
* check unknown card to see if disk id = $Cn00:nn 20 nn 00 nn 03
|
||||
|
||||
cmpid lda CLRC8ROM switch out $C8 ROMs
|
||||
ldy #$05
|
||||
H28F6 lda (idxl),y compare id bytes
|
||||
cmp dskid,y
|
||||
sec set if no disk card
|
||||
bne H2903
|
||||
dey
|
||||
dey
|
||||
bpl H28F6 loop until all 4 id bytes match.
|
||||
clc clear if disk card
|
||||
H2903 rts
|
||||
|
||||
* smartport call parameters
|
||||
|
||||
spcparms .DA #$03 # of parms
|
||||
statunit .DA #$00 unit number (code for smartport stat)
|
||||
.DA numdev2
|
||||
.DA #00 status code (0 = general status)
|
||||
|
||||
* indexes into driver table
|
||||
|
||||
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
|
||||
|
||||
* self modifying jmp = smartport entry address
|
||||
|
||||
spvect jmp $0000 self modifying
|
||||
|
||||
newmount stz idxl
|
||||
lda #$C7 start with slot 7 ($C700)
|
||||
sta idxl+1
|
||||
|
||||
H291F jsr H29EB is there a smartport device here?
|
||||
bcs H2974 no, next device.
|
||||
|
||||
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
|
||||
|
||||
jsr setdevid set up device attributes
|
||||
stz statunit
|
||||
|
||||
jsr spvect do a status call on smartport itself
|
||||
.HS 00
|
||||
.DA spcparms
|
||||
|
||||
lda numdev2 # of devices on smartport
|
||||
cmp #$03
|
||||
bcc H2974 only 2 devices,skip to next one.
|
||||
inc add 1 for comparisons.
|
||||
sta driveradr # of devices + 1.
|
||||
|
||||
lda #$03 start at unit #3 (non-slot 5)
|
||||
|
||||
ldx spvect+2
|
||||
cpx #$C5 is this slot 5?
|
||||
bne H295B no, start at 3.
|
||||
bit diskins2 disk controller in slot 2?
|
||||
bpl H295B yes, so allow remapping of s5 devices
|
||||
lda #$05 else start looking at unit #5
|
||||
|
||||
* find block devices on this smartport
|
||||
|
||||
H295B cmp driveradr have we done all units in this slot?
|
||||
bcs H2974 yes, skip to next slot.
|
||||
|
||||
sta statunit store the unit#.
|
||||
jsr spvect do status call
|
||||
.HS 00
|
||||
.DA spcparms
|
||||
lda numdev2 is this a block device?
|
||||
bmi mount yes, so mount it.
|
||||
|
||||
H296E lda statunit go check the next unit#
|
||||
inc
|
||||
bra H295B
|
||||
|
||||
H2974 dec idxl+1
|
||||
lda idxl+1
|
||||
cmp #$C0 searched down to slot 0?
|
||||
bne H291F if not.
|
||||
rts
|
||||
|
||||
mount ldx #$0C
|
||||
|
||||
H297F ldy driveridx,x
|
||||
lda drivertbl1,y device driver table 1
|
||||
cmp #nodevice
|
||||
bne H2990
|
||||
lda drivertbl1+1,y
|
||||
cmp /nodevice
|
||||
beq H2994
|
||||
H2990 dex
|
||||
bpl H297F
|
||||
rts ran out of space for devices, exit.
|
||||
|
||||
* empty slot found
|
||||
|
||||
H2994 lda idxl+1
|
||||
pha
|
||||
phx
|
||||
phy
|
||||
tya which slot is empty?
|
||||
lsr shift into slot#
|
||||
and #$07 now 1-7
|
||||
ora #$C0 now $C1-$C7
|
||||
sta idxl+1
|
||||
jsr H29EB smartport interface in this slot?
|
||||
ply
|
||||
plx
|
||||
pla
|
||||
sta idxl+1
|
||||
bcc H2990 yes, can't use to mirror the device.
|
||||
jsr lc1in write enable LC ram bank 1.
|
||||
tya divide index by 2
|
||||
lsr
|
||||
tax
|
||||
lda statunit
|
||||
sta spunit-1,x store the smartport unit #
|
||||
lda spvect+1 and entry address.
|
||||
sta spvectlo-1,x
|
||||
lda spvect+2
|
||||
sta spvecthi-1,x
|
||||
lda RROMBNK2 write protect lc ram.
|
||||
inc numdevs
|
||||
ldx numdevs
|
||||
tya
|
||||
lsr
|
||||
cmp #$08
|
||||
bcc nodev2 drive 2 mount
|
||||
sbc #$08
|
||||
ora #$08
|
||||
nodev2 asl
|
||||
asl
|
||||
asl
|
||||
asl
|
||||
ora devid include device attributes
|
||||
sta devlist,x in the active device list.
|
||||
lda #remap_sp
|
||||
sta drivertbl1,y device driver table 1
|
||||
lda /remap_sp
|
||||
sta drivertbl1+1,y
|
||||
bra H296E
|
||||
|
||||
H29EB jsr cmpid is it a disk controller?
|
||||
bcs H29F8 no, so return.
|
||||
sec assume no smartport
|
||||
ldy #$07
|
||||
lda (idxl),y is it a smartport?
|
||||
bne H29F8 if not.
|
||||
clc smartport found
|
||||
H29F8 rts
|
||||
*--------------------------------------
|
||||
MAN
|
||||
SAVE USR/SRC/PRODOS.FX/PRODOS.S.LDR.A
|
||||
LOAD USR/SRC/PRODOS.FX/PRODOS.S
|
||||
|
@ -1,589 +1,6 @@
|
||||
NEW
|
||||
AUTO 3,1
|
||||
*--------------------------------------
|
||||
LDR.Splash cld
|
||||
sta CLR80DISP disable 80 col hardware
|
||||
sta CLR80STORE disable 80 col store
|
||||
jsr setnorm set normal text mode
|
||||
jsr init init text screen
|
||||
jsr setvid reset output to screen
|
||||
jsr setkbd reset input to keyboard
|
||||
jsr home
|
||||
ldx #$07
|
||||
.1 lda LDR.MSG.AppleII,x
|
||||
sta vline10+16,x
|
||||
dex
|
||||
bpl .1
|
||||
|
||||
ldx #$1D
|
||||
.2 lda LDR.MSG.ProDOS,x
|
||||
sta vline12+5,x
|
||||
dex
|
||||
bpl .2
|
||||
ldx #$0B
|
||||
.3 lda H202F,x
|
||||
sta vline14+14,x
|
||||
dex
|
||||
bpl .3
|
||||
ldx #$26
|
||||
.4 lda LDR.MSG.Copyright,x
|
||||
sta vline23,x
|
||||
dex
|
||||
bpl .4
|
||||
ldx #$13
|
||||
.5 lda LDR.MSG.Reserved,x
|
||||
sta vline24+10,x
|
||||
dex
|
||||
bpl .5
|
||||
sec
|
||||
jsr idroutine returns system info
|
||||
bcs .8 taken if not a //gs
|
||||
lda #$80
|
||||
trb newvideo video mode select
|
||||
.8 bit $C000
|
||||
bpl .8
|
||||
sta $C010
|
||||
rts
|
||||
*--------------------------------------
|
||||
* find all disk devices in system slots and set up address
|
||||
* and device table in prodos global page. if there is a disk
|
||||
* card in slot 2 then limit the # of devices in slot 5
|
||||
* smartport to only 2
|
||||
*--------------------------------------
|
||||
numdev2 .HS 0000000000000000 8 bytes for smartport call
|
||||
driveradr .DA 0
|
||||
d2idx .DA #0
|
||||
diskins2 .DA #0 msb clear if drive in slot 2
|
||||
|
||||
devsrch stz dst
|
||||
stz dst+1
|
||||
stz idxl
|
||||
ldx #$FF init to no active devices.
|
||||
stx numdevs count (-1) active devices.
|
||||
lda #$0E start disk // area at end of devlist.
|
||||
sta d2idx
|
||||
|
||||
* check slot 2. if there is a disk card then clear the msb of diskins2. this
|
||||
* will limit the # of devices in any slot 5 spartport card to 2.
|
||||
|
||||
lda #$C2
|
||||
sta idxl+1 check slot 2
|
||||
jsr cmpid is there a disk in slot 2 ?
|
||||
ror diskins2 if so, clear msb else set it.
|
||||
lda #$C7 search slots from high to low
|
||||
sta idxl+1
|
||||
H26AB jsr cmpid
|
||||
bcs H270C if no ProDOS device in this slot.
|
||||
lda (idxl),y check last byte of $Cn rom (y = $ff)
|
||||
beq diskii branch if 16 sector disk II.
|
||||
cmp #$FF if = $FF then 13 sector disk II.
|
||||
bcs H270C ignore if 13 sector boot ROM
|
||||
sta driveradr else assume it's an intelligent disk.
|
||||
ldy #$07 check for a smartport device.
|
||||
lda (idxl),y
|
||||
bne H26C4 no smartport
|
||||
jmp smartprt
|
||||
|
||||
H26C4 ldy #$FE
|
||||
lda (idxl),y get attributes.
|
||||
and #$03 verify it provides read and status calls.
|
||||
cmp #$03
|
||||
sec assume it's an off-brand disk
|
||||
bne H270C
|
||||
jsr setdevid set up the devid byte from attributes
|
||||
clc
|
||||
php remember that it's not a disk //.
|
||||
lsr move # of units (0=1, 1=2) to carry.
|
||||
lda idxl+1 store hi entry addr (low already done)
|
||||
bne H26E6 branch always.
|
||||
|
||||
diskii sta devid =0 since disk ii's have null attributes
|
||||
sec
|
||||
php remember it's a disk //
|
||||
lda #RWTS
|
||||
sta driveradr
|
||||
lda /RWTS
|
||||
|
||||
H26E6 sta driveradr+1
|
||||
jsr installdev install 1 or 2 devices from this slot.
|
||||
plp get back if it's a disk // (carry).
|
||||
bcc nxtdsk2 if not disk //.
|
||||
dex move the list pointer back by 2 devices
|
||||
dex
|
||||
stx numdevs count (-1) active devices
|
||||
dec d2idx increase the disk two index
|
||||
dec d2idx
|
||||
ldy d2idx
|
||||
inx adj since device count starts with $FF.
|
||||
lda devlist+1,x get entries for disk //
|
||||
sta devlist,y move then toward the end of the list
|
||||
lda devlist,x
|
||||
sta devlist+1,y
|
||||
dex back to numdevs again
|
||||
nxtdsk2 clc
|
||||
H270C jsr sltrom test for ROM in given slot and set flags
|
||||
dec idxl+1 next lower slot.
|
||||
lda idxl+1
|
||||
and #$07 have all slots been checked ?
|
||||
bne H26AB no.
|
||||
|
||||
* perform the new device search, mapping unmounted smartport devices
|
||||
* to empty slots in the device table.
|
||||
|
||||
jsr newmount
|
||||
|
||||
* now copy the disk // list to the end of the regular list.
|
||||
* start by making the device count include disk //'s
|
||||
|
||||
ldx numdevs current device count - 1
|
||||
lda #$0E
|
||||
sec
|
||||
sbc d2idx
|
||||
beq H2747 if there were no disk //'s then done.
|
||||
clc
|
||||
adc numdevs sum of disk //'s and others.
|
||||
sta numdevs
|
||||
inx move to open space in regular list.
|
||||
ldy #$0D first disk // entry.
|
||||
H272F lda devlist,y
|
||||
pha
|
||||
lda devlist,x
|
||||
sta devlist,y
|
||||
pla
|
||||
sta devlist,x
|
||||
inx
|
||||
dey
|
||||
sty d2idx use as a temp
|
||||
cpx d2idx
|
||||
bcc H272F continue until indexes cross
|
||||
H2747 ldy #$00
|
||||
ldx numdevs now change the device order so that
|
||||
|
||||
H274C lda devlist,x the boot device will have highest
|
||||
pha priority.
|
||||
and #$7F strip off high bit
|
||||
eor devnum for comparison.
|
||||
asl
|
||||
bne H275A
|
||||
pla
|
||||
iny
|
||||
H275A dex
|
||||
bpl H274C
|
||||
|
||||
ldx numdevs now reverse order of search, hi to lo.
|
||||
tya was boot device found ?
|
||||
beq H2777
|
||||
lda devnum make boot device 1st in search order.
|
||||
sta devlist,x
|
||||
dex
|
||||
bmi H277E branch if only one device.
|
||||
dey is this a 2 drive device ?
|
||||
beq H2777 branch if not.
|
||||
eor #$80 make boot device, drive 2 next.
|
||||
sta devlist,x
|
||||
dex
|
||||
bmi H277E branch if only 1 device, 2 drives.
|
||||
H2777 pla
|
||||
sta devlist,x
|
||||
dex
|
||||
bpl H2777
|
||||
H277E jsr fndtrd save accumulated machine id.
|
||||
beq H2787
|
||||
sta machid machine ID byte
|
||||
rts
|
||||
H2787 jmp H25B6
|
||||
stadrv ora devid combine with attributes.
|
||||
ldx numdevs
|
||||
inx put device # into device list.
|
||||
sta devlist,x
|
||||
asl now form drive 2 device number, if any.
|
||||
rts
|
||||
sltrom bcc H27F3 branch if disk drive
|
||||
|
||||
* test for clock card
|
||||
|
||||
ldy #$06
|
||||
|
||||
H2799 lda (idxl),y
|
||||
cmp dskid,y
|
||||
bne H27BA no clock
|
||||
dey
|
||||
dey
|
||||
bpl H2799
|
||||
|
||||
lda idxl+1 transfer hi slot address
|
||||
sbc #$C1 minus $C1 (default) to relocate
|
||||
sta clock64 references to clock rom.
|
||||
lda #$4C enable jump vector in globals.
|
||||
sta clockv P8 clock vector.
|
||||
lda idapple mark clock as present.
|
||||
beq H277E
|
||||
|
||||
ora #$01
|
||||
sta idapple xxxxxxx1 = clock present.
|
||||
bne H27F3 always taken.
|
||||
|
||||
* test for 80 col card
|
||||
|
||||
H27BA ldy #$05
|
||||
lda (idxl),y
|
||||
cmp #$38
|
||||
bne H27E4
|
||||
ldy #$07
|
||||
lda (idxl),y
|
||||
cmp #$18
|
||||
bne H27E4
|
||||
ldy #$0B
|
||||
lda (idxl),y
|
||||
dec must = 1
|
||||
bne H27E4
|
||||
iny
|
||||
lda (idxl),y
|
||||
and #$F0 mask off low nibble.
|
||||
cmp #$80 generic for 80-col card.
|
||||
bne H27E4
|
||||
lda idapple
|
||||
beq H277E
|
||||
ora #$02
|
||||
sta idapple xxxxxx1x = 80 col card.
|
||||
bne H27F3 always taken.
|
||||
|
||||
* test for any other rom
|
||||
|
||||
H27E4 ldx #$00
|
||||
lda (idxl)
|
||||
cmp #$FF apple /// non-slot?
|
||||
beq H2801 invalid rom
|
||||
H27EC cmp (idxl) look for floating bus
|
||||
bne H2801 no rom
|
||||
inx
|
||||
bne H27EC
|
||||
H27F3 lda idxl+1 mark a bit in slot byte
|
||||
and #$07 to indicate rom present.
|
||||
tax
|
||||
lda sltbit,x
|
||||
ora rommap mark bit to flag rom present
|
||||
sta rommap slot ROM bit map
|
||||
H2801 rts
|
||||
|
||||
* id bytes: evens for clock, odds for disk
|
||||
|
||||
dskid .HS 082028005803703C
|
||||
|
||||
* slot bits
|
||||
|
||||
sltbit .HS 0002040810204080
|
||||
|
||||
fndtrd clc
|
||||
ldy sltbit
|
||||
H2818 lda (lookptr),y
|
||||
and #$DF
|
||||
adc sltbit
|
||||
sta sltbit
|
||||
rol sltbit
|
||||
iny
|
||||
cpy sltbit+3
|
||||
bne H2818
|
||||
tya
|
||||
asl
|
||||
asl
|
||||
asl
|
||||
asl
|
||||
tay
|
||||
eor sltbit
|
||||
adc #$0B
|
||||
bne H283B
|
||||
lda idapple
|
||||
rts
|
||||
|
||||
H283B lda #$00
|
||||
rts
|
||||
|
||||
installdev 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.
|
||||
jsr stadrv OR in low nibble, store in dev list.
|
||||
plp restore # of devices in carry.
|
||||
ror if 2 drives, then bit 7=1.
|
||||
bpl H2853 branch if a 1 drive device (e.g. hard drive)
|
||||
inx else presume that 2nd drive is present.
|
||||
sta devlist,x active device list.
|
||||
|
||||
H2853 stx 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 H2862 branch if single drive.
|
||||
sta drivertbl2,y device driver table 2.
|
||||
|
||||
H2862 lda driveradr+1
|
||||
sta drivertbl1+1,y
|
||||
bcc H286D
|
||||
sta drivertbl2+1,y
|
||||
|
||||
H286D rts
|
||||
|
||||
* query smartport status to determine # of devices
|
||||
* and install up to 4 units in table if card is in slot 5
|
||||
* otherwise only 2 units. this includes a patch #74
|
||||
|
||||
smartprt jsr setdevid setup the devid byte from attributes
|
||||
lda idxl+1
|
||||
sta driveradr+1
|
||||
lda driveradr
|
||||
sta pscall+1 modify operand
|
||||
clc
|
||||
adc #$03
|
||||
sta spvect+1
|
||||
lda driveradr+1
|
||||
sta spvect+2
|
||||
sta pscall+2 modify operand
|
||||
asl convert $Cn to $n0
|
||||
asl
|
||||
asl
|
||||
asl
|
||||
sta unitnum unit number
|
||||
stz A4L force a prodos status call
|
||||
stz buf dummy pointer
|
||||
stz bloknml # of bytes to transfer
|
||||
stz bloknml+1
|
||||
lda #$10
|
||||
sta buf+1 dummy pointer should be <> 0
|
||||
|
||||
* do a prodos status call patched in from above
|
||||
|
||||
pscall jsr $0000 self modifying code
|
||||
ldy #$FB
|
||||
lda (idxl),y check device id
|
||||
and #$02 SCSI?
|
||||
beq H28B1 no, no need to init Cocoon
|
||||
sta statunit device = 2 for SCSI
|
||||
|
||||
* initialize SCSI Cocoon to build internal device tables
|
||||
* and report true # of devices attached
|
||||
|
||||
jsr spvect status of Cocoon
|
||||
.HS 00
|
||||
.DA spcparms ignore any errors.
|
||||
|
||||
H28B1 stz statunit set unit# = 0
|
||||
jsr spvect call to get the device count.
|
||||
.HS 00 this is a status call
|
||||
.DA spcparms
|
||||
|
||||
lda numdev2
|
||||
beq donesp no devices, so done.
|
||||
cmp #$02 carry set if 2,3,4
|
||||
jsr installdev do the 1st and 2nd device if exists.
|
||||
lda idxl+1
|
||||
cmp #$C5
|
||||
bne donesp if not slot 5
|
||||
|
||||
* for slot 5, if there is a disk card in slot 2
|
||||
* then only install 2 devices otherwise map
|
||||
* extra devices as slot 2
|
||||
|
||||
bit diskins2 disk in slot 2 ?
|
||||
bpl donesp yes - so done
|
||||
|
||||
lda numdev2
|
||||
cmp #$03 carry set if 3,4,...
|
||||
bcc donesp
|
||||
|
||||
cmp #$04 carry set if 4,5,6,...
|
||||
lda #$C2 map extra devices as slot 2
|
||||
sta idxl+1
|
||||
jsr installdev
|
||||
|
||||
lda #$C5
|
||||
sta idxl+1
|
||||
donesp jmp nxtdsk2 it's a disk device.
|
||||
|
||||
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
|
||||
|
||||
* check unknown card to see if disk id = $Cn00:nn 20 nn 00 nn 03
|
||||
|
||||
cmpid lda CLRC8ROM switch out $C8 ROMs
|
||||
ldy #$05
|
||||
H28F6 lda (idxl),y compare id bytes
|
||||
cmp dskid,y
|
||||
sec set if no disk card
|
||||
bne H2903
|
||||
dey
|
||||
dey
|
||||
bpl H28F6 loop until all 4 id bytes match.
|
||||
clc clear if disk card
|
||||
H2903 rts
|
||||
|
||||
* smartport call parameters
|
||||
|
||||
spcparms .DA #$03 # of parms
|
||||
statunit .DA #$00 unit number (code for smartport stat)
|
||||
.DA numdev2
|
||||
.DA #00 status code (0 = general status)
|
||||
|
||||
* indexes into driver table
|
||||
|
||||
driveridx .DA #$06 s3, d1
|
||||
.DA #$1E s7, d2
|
||||
.DA #$0E s7, d1
|
||||
.DA #$1C s6, d2
|
||||
.DA #$0C s6, d1
|
||||
.DA #$1A s5, d2
|
||||
.DA #$0A s5, d1
|
||||
.DA #$14 s2, d2
|
||||
.DA #$04 s2, d1
|
||||
.DA #$12 s1, d2
|
||||
.DA #$02 s1, d1
|
||||
.DA #$18 s4, d2
|
||||
.DA #$08 s4, d1
|
||||
|
||||
* self modifying jmp = smartport entry address
|
||||
|
||||
spvect jmp $0000 self modifying
|
||||
|
||||
newmount stz idxl
|
||||
lda #$C7 start with slot 7 ($C700)
|
||||
sta idxl+1
|
||||
|
||||
H291F jsr H29EB is there a smartport device here?
|
||||
bcs H2974 no, next device.
|
||||
|
||||
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
|
||||
|
||||
jsr setdevid set up device attributes
|
||||
stz statunit
|
||||
|
||||
jsr spvect do a status call on smartport itself
|
||||
.HS 00
|
||||
.DA spcparms
|
||||
|
||||
lda numdev2 # of devices on smartport
|
||||
cmp #$03
|
||||
bcc H2974 only 2 devices,skip to next one.
|
||||
inc add 1 for comparisons.
|
||||
sta driveradr # of devices + 1.
|
||||
|
||||
lda #$03 start at unit #3 (non-slot 5)
|
||||
|
||||
ldx spvect+2
|
||||
cpx #$C5 is this slot 5?
|
||||
bne H295B no, start at 3.
|
||||
bit diskins2 disk controller in slot 2?
|
||||
bpl H295B yes, so allow remapping of s5 devices
|
||||
lda #$05 else start looking at unit #5
|
||||
|
||||
* find block devices on this smartport
|
||||
|
||||
H295B cmp driveradr have we done all units in this slot?
|
||||
bcs H2974 yes, skip to next slot.
|
||||
|
||||
sta statunit store the unit#.
|
||||
jsr spvect do status call
|
||||
.HS 00
|
||||
.DA spcparms
|
||||
lda numdev2 is this a block device?
|
||||
bmi mount yes, so mount it.
|
||||
|
||||
H296E lda statunit go check the next unit#
|
||||
inc
|
||||
bra H295B
|
||||
|
||||
H2974 dec idxl+1
|
||||
lda idxl+1
|
||||
cmp #$C0 searched down to slot 0?
|
||||
bne H291F if not.
|
||||
rts
|
||||
|
||||
mount ldx #$0C
|
||||
|
||||
H297F ldy driveridx,x
|
||||
lda drivertbl1,y device driver table 1
|
||||
cmp #nodevice
|
||||
bne H2990
|
||||
lda drivertbl1+1,y
|
||||
cmp /nodevice
|
||||
beq H2994
|
||||
H2990 dex
|
||||
bpl H297F
|
||||
rts ran out of space for devices, exit.
|
||||
|
||||
* empty slot found
|
||||
|
||||
H2994 lda idxl+1
|
||||
pha
|
||||
phx
|
||||
phy
|
||||
tya which slot is empty?
|
||||
lsr shift into slot#
|
||||
and #$07 now 1-7
|
||||
ora #$C0 now $C1-$C7
|
||||
sta idxl+1
|
||||
jsr H29EB smartport interface in this slot?
|
||||
ply
|
||||
plx
|
||||
pla
|
||||
sta idxl+1
|
||||
bcc H2990 yes, can't use to mirror the device.
|
||||
jsr lc1in write enable LC ram bank 1.
|
||||
tya divide index by 2
|
||||
lsr
|
||||
tax
|
||||
lda statunit
|
||||
sta spunit-1,x store the smartport unit #
|
||||
lda spvect+1 and entry address.
|
||||
sta spvectlo-1,x
|
||||
lda spvect+2
|
||||
sta spvecthi-1,x
|
||||
lda RROMBNK2 write protect lc ram.
|
||||
inc numdevs
|
||||
ldx numdevs
|
||||
tya
|
||||
lsr
|
||||
cmp #$08
|
||||
bcc nodev2 drive 2 mount
|
||||
sbc #$08
|
||||
ora #$08
|
||||
nodev2 asl
|
||||
asl
|
||||
asl
|
||||
asl
|
||||
ora devid include device attributes
|
||||
sta devlist,x in the active device list.
|
||||
lda #remap_sp
|
||||
sta drivertbl1,y device driver table 1
|
||||
lda /remap_sp
|
||||
sta drivertbl1+1,y
|
||||
bra H296E
|
||||
|
||||
H29EB jsr cmpid is it a disk controller?
|
||||
bcs H29F8 no, so return.
|
||||
sec assume no smartport
|
||||
ldy #$07
|
||||
lda (idxl),y is it a smartport?
|
||||
bne H29F8 if not.
|
||||
clc smartport found
|
||||
H29F8 rts
|
||||
|
||||
* relocation subroutine. on entry, regs yx = address of parameter table
|
||||
* with the following parameters:
|
||||
*
|
||||
|
@ -3,7 +3,7 @@ NEW
|
||||
.LIST OFF
|
||||
.OP 65816
|
||||
.OR $2000
|
||||
.TF PRODOS,TSYS
|
||||
.TF PRODOS.FX,TSYS
|
||||
*--------------------------------------
|
||||
.INB INC/ZP.I
|
||||
.INB INC/IO.I
|
||||
@ -176,9 +176,14 @@ gbuf .EQ $DC00 general purpose 512 byte block buffer
|
||||
.INB USR/SRC/PRODOS.FX/PRODOS.S.LDR.A
|
||||
.INB USR/SRC/PRODOS.FX/PRODOS.S.LDR.B
|
||||
|
||||
ILDR .PH $800
|
||||
.INB USR/SRC/PRODOS.FX/PRODOS.S.ILDR
|
||||
.EP
|
||||
|
||||
RAM .PH $FF00
|
||||
.INB USR/SRC/PRODOS.FX/PRODOS.S.RAM
|
||||
.EP
|
||||
|
||||
IRQ .PH $FF9B
|
||||
.INB USR/SRC/PRODOS.FX/PRODOS.S.IRQ
|
||||
.EP
|
||||
|
Loading…
x
Reference in New Issue
Block a user