Kernel 0.93+ ProDOS 2.0.3 src

This commit is contained in:
Rémy GIBERT 2019-09-16 08:06:02 +02:00
parent 78fbcb711b
commit 7743abc5fc
10 changed files with 230 additions and 384 deletions

Binary file not shown.

View File

@ -4,10 +4,7 @@ NEW
* Cortland clock driver
* $2F80-$2FFC moved to $D742
*--------------------------------------
ofsC .EQ *-tclk_in offset to Cortland clock org
cclock_0
>SHORTMX 8 bit mode.
CCLK.START >SHORTMX 8 bit mode.
lda statereg state register.
sta savestate save for restore after tool call.
and #$CF clear the read/write aux memory bits.
@ -30,11 +27,12 @@ cclock_0
pla
sta p8time+1 hours
pla year
H2FB1 cmp #100 out of range?
bcc H2FB9 no, go ahead and store
.1 cmp #100 out of range?
bcc .2 no, go ahead and store
sbc #$64 else put back in range.
bra H2FB1 try again
H2FB9 sta p8date+1 year
bra .1 try again
.2 sta p8date+1 year
pla
inc increment day for Prodos 8 format.
sta p8date day
@ -53,13 +51,12 @@ H2FB9 sta p8date+1 year
sec go back to emulation mode
xce to continue with Prodos 8
rts
savestate .EQ *-ofsC
.HS 00 state of the state register
savestate .HS 00 state of the state register
.AS "JIMJAYKERRY&MIKE"
.HS 0000000000000000 pad 0's until length
.HS 0000000000000000 of driver = 125 bytes.
.HS 000000000000
cclk_end .EQ * end of obj cclock_0.
CCLK.END .EQ * end of obj cclock_0.
.HS 000000 pad to page boundary
*--------------------------------------
MAN

View File

@ -3,8 +3,6 @@ NEW
* disk ii driver. object code = xrw_0
* $5300-5A00 moved to language card bank 1 at $D000
*--------------------------------------
ofsD .EQ *-rwts offset to disk ii driver or
blockio cld $D8 to flag language card bank 1 (main)
jsr rsetphse
lda q7l,x turn off write enable
@ -40,8 +38,7 @@ L5334 lda #$27 i/o error
* read/write a track/sector
regrwts .EQ *-ofsD
ldy #$01 retry count
regrwts ldy #$01 retry count
sty seekcnt only one recalibrate per call
sta ibsect
lda unitnum get slot # for this operation
@ -162,8 +159,7 @@ hndlerr sec
lda motoroff,x turn off
rts
L53F4 jsr write16 write nibbles
statdne .EQ *-ofsD
bcc L53E7 if no errors.
statdne bcc L53E7 if no errors.
lda #$2B disk write protected.
bne hndlerr always
L53FD ldx A2L
@ -172,8 +168,7 @@ L53FD ldx A2L
rol write protect-->carry-->bit 0=1
lda q6l,x keep in read mode
jmp statdne
myseek .EQ *-ofsD
asl assume two phase stepper
myseek asl assume two phase stepper
sta track save destination track * 2
jsr alloff turn all phases off to be sure.
jsr drvindx get index to previous track
@ -182,8 +177,7 @@ myseek .EQ *-ofsD
lda track where to go next.
sta iobpdn,x
jsr seek move head there
alloff .EQ *-ofsD
ldy #$03 turn off all phases before returning.
alloff ldy #$03 turn off all phases before returning.
L5427 tya (send phase in acc)
jsr clrphase carry clear, phases should be turned off
dey
@ -209,10 +203,9 @@ L5427 tya (send phase in acc)
*
* variables used: curtrk, trkn, countn, prior, A2L, montimel, montimeh
seek .EQ *-ofsD
sta trkn save target track.
seek sta trkn save target track.
cmp curtrk on desired track ?
beq L5487 yes, energize phase and return
beq setphase yes, energize phase and return
lda #$00
sta trkcnt half track count.
L5440 lda curtrk save curtrk for delayed turnoff
@ -244,11 +237,11 @@ L5468 jsr setphase
inc trkcnt count of 'tracks moved'
bne L5440 always taken
L5483 jsr mswait settle 25 msec
clc set for phase off
setphase .EQ *-ofsD
L5487 lda curtrk get current track
clrphase .EQ *-ofsD
and #$03 mask for 1 of 4 phases
setphase lda curtrk get current track
clrphase and #$03 mask for 1 of 4 phases
rol double for phaseon/off index
ora A2L
tax
@ -264,25 +257,20 @@ clrphase .EQ *-ofsD
* nibles in the ranges of $A0-$A3, $C0-$C7, $E0-$E3 are used for
* other tables since no valid nibles are in these ranges.
dnibl .EQ *-ofsD aligned to page boundary minus $96
.HS 0004FFFF080CFF10
dnibl .HS 0004FFFF080CFF10 aligned to page boundary minus $96
.HS 1418
twobit3 .EQ *-ofsD used in fast prenib as lookup for
.HS 008040C0FFFF 2-bit quantities.
twobit3 .HS 008040C0FFFF used in fast prenib as lookup for 2-bit quantities.
.HS 1C20FFFFFF24282C
.HS 3034FFFF383C4044
.HS 484CFF5054585C60
.HS 6468
twobit2 .EQ *-ofsD used in fast prenib.
.HS 00201030
endmrks .EQ *-ofsD table using 'unused' nibbles:
.HS DEAAEBFF ($C4,$C5,$C6,$C7)
twobit2 .HS 00201030 used in fast prenib.
endmrks .HS DEAAEBFF table using 'unused' nibbles ($C4,$C5,$C6,$C7)
.HS FFFFFF6CFF70
.HS 7478FFFFFF7CFFFF
.HS 8084FF888C909498
.HS 9CA0
twobit1 .EQ *-ofsD used in fast prenib.
.HS 0008040CFFA4
twobit1 .HS 0008040CFFA4 used in fast prenib.
.HS A8ACFFB0B4B8BCC0
.HS C4C8FFFFCCD0D4D8
.HS DCE0FFE4E8ECF0F4
@ -297,20 +285,16 @@ twobit1 .EQ *-ofsD used in fast prenib.
* origin = $D200 (page boundary)
* page align the following tables:
dnibl2 .EQ *-ofsD
.HS 00
dnibl3 .EQ *-ofsD
.HS 00
dnibl4 .EQ *-ofsD
.HS 00
dnibl2 .HS 00
dnibl3 .HS 00
dnibl4 .HS 00
* 6-bit to 7-bit nibl conversion table
*
* codes with more than one pair of adjacent zeroes
* or with no adjacent ones (except B7) are excluded.
nibl .EQ *-ofsD
.HS 960200
nibl .HS 960200
.HS 00970100009A0300
.HS 009B0002009D0202
.HS 009E0102009F0302
@ -346,52 +330,34 @@ nibl .EQ *-ofsD
* nibl buffer 'nbuf2' must be on a page boundary !!!
nbuf2 .EQ *-ofsD nibl buffer for read/write of low
.BS 86 2-bits of each byte.
ibtrk .EQ *-ofsD
.HS 00
ibsect .EQ *-ofsD
.HS 00
ibstat .EQ *-ofsD
.HS 00
iobpdn .EQ *-ofsD
.HS 00
curtrk .EQ *-ofsD
.HS 00
nbuf2 .BS 86 nibl buffer for read/write of low 2-bits of each byte.
ibtrk .HS 00
ibsect .HS 00
ibstat .HS 00
iobpdn .HS 00
curtrk .HS 00
.HS 00000000000000 for slots 1 thru 7
.HS 00000000000000 drives 1 & 2
retrycnt .EQ *-ofsD
.HS 00
seekcnt .EQ *-ofsD
.HS 00
trkcnt .EQ *-ofsD halftracks moved count.
countn .EQ *-ofsD 'must find' count.
last .EQ *-ofsD 'odd bit' nibls.
.HS 00
csum .EQ *-ofsD used for address header cksum
.HS 00
csstv .EQ *-ofsD
.HS 00
sect .EQ *-ofsD
.HS 00
track .EQ *-ofsD
montimel .EQ *-ofsD
.HS 00
montimeh .EQ *-ofsD also 'volume'
.HS 00
prior .EQ *-ofsD
.HS 00
trkn .EQ *-ofsD
.HS 00
retrycnt .HS 00
seekcnt .HS 00
trkcnt .EQ * halftracks moved count.
countn .EQ * 'must find' count.
last .HS 00 'odd bit' nibls.
csum .HS 00 used for address header cksum
csstv .HS 00
sect .HS 00
track .EQ *
montimel .HS 00
montimeh .HS 00 also 'volume'
prior .HS 00
trkn .HS 00
* phase on, off time tables
* in 100 usec intervals (seek)
ontable .EQ *-ofsD
.HS 013028
ontable .HS 013028
.HS 24201E1D1C1C
offtable .EQ *-ofsD
.HS 702C
offtable .HS 702C
.HS 26221F1E1D1C1C
* mswait subroutine
@ -402,16 +368,15 @@ offtable .EQ *-ofsD
* montimel, montimeh are incremented once per 100 usec interval
* for motor on timing.
mswait .EQ *-ofsD
L5685 ldx #$11 delay 86 usec
L5687 dex
bne L5687
mswait ldx #$11 delay 86 usec
.1 dex
bne .1
inc montimel
bne L5692
bne .2
inc montimeh
L5692 sec
.2 sec
sbc #$01
bne L5685
bne mswait
rts
* read address field subroutine (16-sector format)
@ -425,8 +390,7 @@ L5692 sec
* expects: original 10-sector normal density nibls (4-bit) odd bits then even.
* observe 'no page cross' warnings on some branches !!!
rdadr16 .EQ *-ofsD
ldy #$FC
rdadr16 ldy #$FC
sty countn 'must find' count
L569D iny
bne L56A5 low order of count.
@ -485,8 +449,7 @@ rderr sec
* acc=$AA, x=unchanged, y=0, carry clear.
* observe 'no page cross' on some branches !!
read16 .EQ *-ofsD
txa get slot #
read16 txa get slot #
ora #$8C prepare mods to read routine.
sta rd4+1 warning: the read routine is
sta rd5+1 self modified !!
@ -529,54 +492,49 @@ L574A lda q6l,x
ldy #$AA
lda #$00
L5757 sta pcl use z-page for keeping checksum
rd4 .EQ *-ofsD
L5759 ldx q6l+$60 warning: self modified
bpl L5759
rd4 ldx q6l+$60 warning: self modified
bpl rd4
lda dnibl-$96,x
sta nbuf2-$AA,y save the two-bit groups in nbuf.
eor pcl update checksum.
iny next position in nbuf.
bne L5757 loop for all $56 two-bit groups.
ldy #$AA now read directly into user buffer.
bne L5772 always taken.
bne rd5 always taken.
L576D sec error
rts
ref1 .EQ *-ofsD
L576F sta $1000,y warning: self modified
rd5 .EQ *-ofsD
L5772 ldx q6l+$60 warning: self modified
bpl L5772
ref1 sta $1000,y warning: self modified
rd5 ldx q6l+$60 warning: self modified
bpl rd5
eor dnibl-$96,x get actual 6-bit data from dnib table.
ldx nbuf2-$AA,y get associated two-bit pattern
eor dnibl2,x and combine to form whole byte.
iny
bne L576F loop for $56 bytes.
bne ref1 loop for $56 bytes.
pha save for now, no time to store...
and #$FC strip low bits.
ldy #$AA prepare for next $56 bytes
rd6 .EQ *-ofsD
L5788 ldx q6l+$60 warning: self modified
bpl L5788
rd6 ldx q6l+$60 warning: self modified
bpl rd6
eor dnibl-$96,x
ldx nbuf2-$AA,y
eor dnibl3,x
ref2 .EQ *-ofsD
sta $1000,y warning: self modified
ref2 sta $1000,y warning: self modified
iny
bne L5788 loop unil this group of $56 read
rd7 .EQ *-ofsD
L579C ldx q6l+$60 warning: self modified
bpl L579C
bne rd6 loop unil this group of $56 read
rd7 ldx q6l+$60 warning: self modified
bpl rd7
and #$FC
ldy #$AC last group is $54 long
L57A5 eor dnibl-$96,x
ldx nbuf2-$AC,y
eor dnibl4,x combine to form full byte
ref3 .EQ *-ofsD
sta $1000,y warning: self modified
rd8 .EQ *-ofsD
L57B1 ldx q6l+$60 warning: self modified
bpl L57B1
ref3 sta $1000,y warning: self modified
rd8 ldx q6l+$60 warning: self modified
bpl rd8
iny
bne L57A5
and #$FC
@ -596,8 +554,7 @@ L57CD pla place last byte into user buffer
* set the slot dependent track location
settrk .EQ *-ofsD
jsr drvindx get index to drive #
settrk jsr drvindx get index to drive #
sta iobpdn,x
rts
@ -606,23 +563,20 @@ settrk .EQ *-ofsD
* if stopped, controller's shift register will not be changing.
* return y = 0 and zero flag set if it is stopped.
chkdrv .EQ *-ofsD
ldx A2L
chkdrv0 .EQ *-ofsD
ldy #$00 init loop counter.
L57DE lda q6l,x read the shift register.
chkdrv ldx A2L
chkdrv0 ldy #$00 init loop counter.
.1 lda q6l,x read the shift register.
jsr ckdrts delay
pha
pla more delay.
cmp q6l,x has shift reg changed ?
bne L57F0 yes, motor is moving.
bne ckdrts yes, motor is moving.
lda #$28 anticipate error.
dey no, dec retry counter
bne L57DE and try 256 times.
ckdrts .EQ *-ofsD
L57F0 rts
drvindx .EQ *-ofsD
pha preserve acc across call
bne .1 and try 256 times.
ckdrts rts
drvindx pha preserve acc across call
lda A4L+1
lsr
lsr
@ -645,8 +599,7 @@ drvindx .EQ *-ofsD
* on exit: carry set if error (write protect violation).
* if no error, acc=uncertain, x=unchanged, y=0, carry clear.
write16 .EQ *-ofsD
sec anticipate write protect error
write16 sec anticipate write protect error
lda q6h,x
lda q7l,x sense write protect flag
bpl L580C
@ -694,21 +647,17 @@ L583D eor nbuf2-1,y (5) xor with current
* end of write byte loop
lda pcl (3) get prior nibl (from nbuf2)
wrefd1 .EQ *-ofsD
ldy #$00 (2) warning: load value modified by prenib.
wrefa1 .EQ *-ofsD
L5853 eor $1000,y (4) warning: address modified by prenib.
wrefd1 ldy #$00 (2) warning: load value modified by prenib.
wrefa1 eor $1000,y (4) warning: address modified by prenib.
and #$FC (2) strip low 2 bits
tax (2) index to nibl table
lda nibl,x (4)
wrefd2 .EQ *-ofsD
ldx #$60 (2) warning: value modified by prenib.
wrefd2 ldx #$60 (2) warning: value modified by prenib.
sta q6h,x (5) write nibl
lda q6l,x (4) handshake
wrefa2 .EQ *-ofsD
lda $1000,y (4) prior nibl. warning: address modified by prenib.
wrefa2 lda $1000,y (4) prior nibl. warning: address modified by prenib.
iny (2) all done with this page ?
bne L5853 (3-) loop until page end.
bne wrefa1 (3-) loop until page end.
lda pch (3) get next (precalculated & translated) nibl.
beq L58C0 (2+) branch if code written was page aligned.
lda A2H (3) get byte address of last byte to be written.
@ -721,32 +670,26 @@ wrefa2 .EQ *-ofsD
nop (2) above test set carry.
iny (2) y=1
bcs L5899 (2+) branch if last byte to be odd.
wrefa3 .EQ *-ofsD
L5881 eor $1100,y (4) warning: address modified by prenib.
wrefa3 eor $1100,y (4) warning: address modified by prenib.
and #$FC (2) strip low 2 bits.
tax (2) index to nibl table
lda nibl,x (4) get nibl
wrefd3 .EQ *-ofsD
ldx #$60 (2) restore slot index. warning: modified by prenib
wrefd3 ldx #$60 (2) restore slot index. warning: modified by prenib
sta q6h,x (5)
lda q6l,x (4)
wrefa4 .EQ *-ofsD
lda $1100,y (4) warning: modified by prenib
wrefa4 lda $1100,y (4) warning: modified by prenib
iny (2) got prior nibl, point to next
wrefa5 .EQ *-ofsD
eor $1100,y (4) warning: modified by prenib
wrefa5 eor $1100,y (4) warning: modified by prenib
L5899 cpy A2H (3) set carry if this is the last nibl
and #$FC (2) strip low 2 bits
tax (2)
lda nibl,x (4)
wrefd4 .EQ *-ofsD
ldx #$60 (2) restore slot. warning: modified by prenib
wrefd4 ldx #$60 (2) restore slot. warning: modified by prenib
sta q6h,x (5)
lda q6l,x (4)
wrefa6 .EQ *-ofsD
lda $1100,y (4) get prior nibl. warning: modified by prenib
wrefa6 lda $1100,y (4) get prior nibl. warning: modified by prenib
iny (2)
bcc L5881 (3-) branch if not the last.
bcc wrefa3 (3-) branch if not the last.
bcs L58B1 (3) waste 3 cycles, branch always.
L58B1 bcs L58C0 (3) branch always.
L58B3 lda >pch (4) absolute reference to zero page
@ -758,8 +701,7 @@ L58B3 lda >pch (4) absolute reference to zero page
pla (4)
L58C0 ldx A1H (3) use last nibl (anded with $FC) for checksum
lda nibl,x (4)
wrefd5 .EQ *-ofsD
ldx #$60 (2) restore slot. warning: modified by prenib
wrefd5 ldx #$60 (2) restore slot. warning: modified by prenib
sta q6h,x (5)
lda q6l,x (4)
ldy #$00 (2) set y = index end mark table.
@ -773,20 +715,16 @@ L58D3 lda endmrks,y (4) dm4, dm5, dm6 and turn off byte.
cpy #$04 (2) have all end marks been written ?
bne L58D3 (3) if not.
clc (2,9)
wexit .EQ *-ofsD
lda q7l,x out of write mode
wexit lda q7l,x out of write mode
lda q6l,x to read mode.
rts return from write.
* 7-bit nibl write subroutines
wnibl9 .EQ *-ofsD
clc (2) 9 cycles, then write.
wnibl7 .EQ *-ofsD
pha (3) 7 cycles, then write.
wnibl9 clc (2) 9 cycles, then write.
wnibl7 pha (3) 7 cycles, then write.
pla (4)
wnibl .EQ *-ofsD
sta q6h,x (5) nibl write
wnibl sta q6h,x (5) nibl write
ora q6l,x (4) clobbers acc, not carry
rts (6)
@ -800,8 +738,7 @@ wnibl .EQ *-ofsD
* on exit: a,x,y undefined. write routine modified to do direct conversion
* of high 6 bits of user's buffer data.
prenib16 .EQ *-ofsD
lda buf self-modify the addresses because of
prenib16 lda buf self-modify the addresses because of
ldy buf+1 the fast timing required.
clc all offsets are minus $AA.
adc #$02 the highest set is buf+$AC.
@ -822,21 +759,18 @@ L5906 sta prn2+1 self mod 2
L5912 sta prn1+1 self mod 1
sty prn1+2
ldy #$AA count up to 0.
prn1 .EQ *-ofsD get byte from lowest group.
L591A lda $1000,y warning: self modified.
prn1 lda $1000,y warning: self modified. get byte from lowest group.
and #$03 strip high 6 bits.
tax index to 2 bit equivalent.
lda twobit1,x
pha save pattern
prn2 .EQ *-ofsD get byte from middle group.
lda $1056,y warning: self modified.
prn2 lda $1056,y warning: self modified. get byte from middle group.
and #$03
tax
pla restore pattern.
ora twobit2,x combine 2nd group with 1st.
pha save new pattern.
prn3 .EQ *-ofsD get byte from highest group.
lda $10AC,y warning: self modified.
prn3 lda $10AC,y warning: self modified. get byte from highest group.
and #$03
tax
pla restore new pattern
@ -848,7 +782,7 @@ prn3 .EQ *-ofsD get byte from highest group.
pla
sta nbuf2,x save in nibl buffer.
iny inc to next set.
bne L591A loop until all $56 nibls formed.
bne prn1 loop until all $56 nibls formed.
ldy buf now prepare data bytes for write16 subr.
dey prepare end address.
sty A2H
@ -890,8 +824,7 @@ L596F ldy #$FF index to last byte of data to write.
stx wrefd4+1
stx wrefd5+1
rts
chkprev .EQ *-ofsD
eor iobpdn same slot as last ?
chkprev eor iobpdn same slot as last ?
asl
beq L59BD
lda #$01
@ -907,8 +840,7 @@ L59A6 lda iobpdn
lda montimeh
bne L59A6
L59BD rts
rsetphse .EQ *-ofsD
lda unitnum get unit number.
rsetphse lda unitnum get unit number.
and #$7F mask off high bit.
tax
@ -919,8 +851,7 @@ rsetphse .EQ *-ofsD
lda phaseoff+4,x
lda phaseoff+6,x
rts
docheck .EQ *-ofsD
lda A4L command #.
docheck lda A4L command #.
cmp #$04 is the command allowed ?
bcs L59E6 if not.
lda bloknml
@ -940,10 +871,8 @@ L59E8 clc
* variables used by mli for smartport interface
spstatlist .EQ *-ofsD ref pathbuf-$14
.HS 00000000 smartport status list buffer
spunit .EQ *-ofsD ref pathbuf-$10
.HS 0000000000000000 smartport unit numbers
spstatlist .HS 00000000 ref pathbuf-$14 smartport status list buffer
spunit .HS 0000000000000000 ref pathbuf-$10smartport unit numbers
.HS 0000000000000000
* pathname buffer starts at this page boundary (pathbuf = $D700)

View File

@ -440,14 +440,14 @@ H2367 .DA #$01 relocation table. 1=move src to dst
* move thunderclock
rlclk64 .DA #$01 relocation table. 1=move src to dst
.DA tclk_in destination
.DA tclk_end-tclock_0 length of thunderclock driver
.DA tclock_0 source
.DA $D742 destination
.DA TCLK.END-TCLK.START length of thunderclock driver
.DA TCLK source
.DA #$04 4=relocate and move program
.DA tclk_in
.DA H2F69-tclock_0
.DA tclk_in
.DA TCLK.START
.DA TCLK.CEND-TCLK.START
.DA TCLK.START
.HS 00
.HS C1C1
clock64 .DA #$00
@ -456,9 +456,9 @@ clock64 .DA #$00
* move cortland clock
cortclock .DA #$01 relocation table. 1=move src to dst
.DA tclk_in destination
.DA cclk_end-cclock_0 length of cortland clock driver
.DA cclock_0 source
.DA $D742 destination
.DA CCLK.END-CCLK.START length of cortland clock driver
.DA CCLK source
.HS FF done
* load and run appletalk configuration file (atinit) if present

View File

@ -903,7 +903,7 @@ L2C4D lda 1,s
sec
rtl
.BS $2C80-*
.BS $2C80-*
MAN
SAVE USR/SRC/PRODOS.203/PRODOS.S.LDR.B

View File

@ -9,9 +9,7 @@ NEW
* must remain somewhere between $E000-$F7FF. this routine must be less
* than 3 pages in length.
ofsS .EQ *-dispadr offset to dispatcher org
disp1obj lda RROMBNK2 read ROM
SEL0.START lda RROMBNK2 read ROM
sta CLR80DISP disable 80 col hardware
sta CLRALTCHAR normal LC, flashing UC
sta CLR80STORE disable 80 column store
@ -52,8 +50,7 @@ L5A52 lda pbuf,x display prefix directly to screen
L5A5D ldx #$00
dec cv
jsr crout
getkey .EQ *-ofsS
jsr rdkey input char with cursor
getkey jsr rdkey input char with cursor
cmp #$8D cr ?
beq L5ABD yes, accept what is entered.
pha no, save the char.
@ -109,13 +106,11 @@ L5AD3 jsr home clear screen for application name.
jsr crout
ldx #disp1msg-dsp1msgs
jsr prntmsg 'enter pathname...'
retryrich .EQ *-ofsS
lda #$03 line 3
retryrich lda #$03 line 3
sta cv
jsr crout
ldx #$00
loop1 .EQ *-ofsS
jsr rdkey input char with cursor.
loop1 jsr rdkey input char with cursor.
cmp #$9B esc ?
bne L5AF4 if not esc.
lda ch esc pressed in column 0 ?
@ -191,11 +186,11 @@ L5B82 lda dsp1refn copy the reference number
jsr MLI get eof
.DA #$D1
.DA dsp1eof
bcs L5BE2
bcs dsp1error
lda dsp1eofb+2 3rd of 3 bytes.
beq L5B9C if 0 then ok
lda #$27 else i/o error because
bne L5BE2 file is too large.
bne dsp1error file is too large.
L5B9C lda dsp1eofb move eof to # of bytes to read.
sta dsp1cnt
lda dsp1eofb+1
@ -209,12 +204,11 @@ L5B9C lda dsp1eofb move eof to # of bytes to read.
.DA dsp1cls
bcc L5BBB
L5BB7 plp get status (it is irrelevant now)
bne L5BE2 if close generated an error
bne dsp1error if close generated an error
plp here if close was ok.
L5BBB bcs L5BB7 error.
jmp sysentry execute system file
delchar .EQ *-ofsS
lda ch is cursor in column 0 ?
delchar lda ch is cursor in column 0 ?
beq L5BD3 yes, ignore it.
dex
lda #$A0 blank out the cursor
@ -224,18 +218,16 @@ delchar .EQ *-ofsS
jsr cout and blank it too.
dec ch point to that location.
L5BD3 jmp loop1 get next char.
prntmsg .EQ *-ofsS
L5BD6 lda dsp1msgs,x
prntmsg lda dsp1msgs,x
beq L5BE1
jsr cout
inx
bne L5BD6
bne prntmsg
L5BE1 rts
* dispatcher 1 error handler
dsp1error .EQ *-ofsS
L5BE2 sta errnum
dsp1error sta errnum
lda #$0C display error message on line 13
sta cv
jsr crout
@ -258,63 +250,44 @@ L5C09 ldx #dsp1err3-dsp1msgs otherwise display 'file/path not found'
L5C0B jsr prntmsg
jmp retryrich retry for application pathname
dsp1msgs .EQ *-ofsS
dsp1msg0 .EQ *-ofsS
dsp1msgs .EQ *
dsp1msg0 .EQ *
.AS -'ENTER PREFIX (PRESS "RETURN" TO ACCEPT)'
.HS 00
disp1msg .EQ *-ofsS
.AS -"ENTER PATHNAME OF NEXT APPLICATION"
disp1msg .AS -"ENTER PATHNAME OF NEXT APPLICATION"
.HS 00
dsp1err1 .EQ *-ofsS
.DA #$87
dsp1err1 .DA #$87
.AS -'NOT A TYPE "SYS" FILE'
.HS 00
dsp1err2 .EQ *-ofsS
.DA #$87
dsp1err2 .DA #$87
.AS -"I/O ERROR "
.HS 00
dsp1err3 .EQ *-ofsS
.DA #$87
dsp1err3 .DA #$87
.AS -"FILE/PATH NOT FOUND "
.HS 00
dsp1info .EQ *-ofsS get file info parms
.DA #$0A 10 parameters
dsp1info .DA #$0A 10 parameters
.DA pbuf pathname buffer
dsp1acess .EQ *-ofsS
.HS 00 access
dsp1type .EQ *-ofsS
.HS 00 file type
dsp1acess .HS 00 access
dsp1type .HS 00 file type
.BS 13 the rest are unimportant
dsp1open .EQ *-ofsS open file parms
.HS 03 3 parameters for open
dsp1open .HS 03 3 parameters for open
.DA pbuf pathname buffer
.DA fbuf fcb buffer
dsp1refn .EQ *-ofsS
.HS 00 reference #
dsp1cls .EQ *-ofsS close file parms
.DA #01 1 parameter for close
dsp1cln .EQ *-ofsS
.HS 00 reference #
dsp1read .EQ *-ofsS
.HS 04 4 parameters for read
dsp1rdn .EQ *-ofsS
.HS 00 reference #
dsp1refn .HS 00 reference #
dsp1cls .DA #01 1 parameter for close
dsp1cln .HS 00 reference #
dsp1read .HS 04 4 parameters for read
dsp1rdn .HS 00 reference #
.DA sysentry .SYS load address
dsp1cnt .EQ *-ofsS
.HS 0000 byte count
dsp1cnt .HS 0000 byte count
.HS 0000
dsp1eof .EQ *-ofsS get eof parms
.HS 02 2 parameters
dsp1eofn .EQ *-ofsS
.HS 00 reference #
dsp1eofb .EQ *-ofsS
.HS 000000 3 byte eof
dsp1pfx .EQ *-ofsS get/set prefix parms
.DA #01 1 parameter
dsp1eof .HS 02 2 parameters
dsp1eofn .HS 00 reference #
dsp1eofb .HS 000000 3 byte eof
dsp1pfx .DA #01 1 parameter
.DA pbuf prefix buffer
disp1end .EQ *
.BS $300-disp1end+disp1obj fill to page boundary
.BS $1300-* fill to page boundary
* end of obj sel_0
*--------------------------------------

View File

@ -2,9 +2,7 @@ NEW
AUTO 3,1
* object code = sel_1
* Bird's Better Bye at org = dispadr
ofsB .EQ *-dispadr offset to Bird's Bye org
*--------------------------------------
birdbye cld
lda RROMBNK2 read ROM
stz softev
@ -32,8 +30,8 @@ L5D16 stz memmap,x P8 memory bitmap
stx lstpntr store in zero page.
lda devnum get last slot/drive
bne volname
ds2 .EQ *-ofsB
L5D32 ldx lstpntr get device list pointer.
ds2 ldx lstpntr get device list pointer.
lda devlist,x get unit number from list.
cpx #$01 make sure it's real.
bcs L5D3F if so, change list pointer.
@ -48,15 +46,14 @@ volname sta ol_unit store unit number for online.
jsr MLI
.DA #$C5 online call
.DA ol_parms
bcs L5D32 error check.
bcs ds2 error check.
stz dlevel haven't read root directory yet.
lda pbuf+1 load description byte.
and #$0F mask for name length.
beq L5D32 if 0, then try next unit.
beq ds2 if 0, then try next unit.
adc #$02 add 2 to length.
tax name length in x.
vnam1 .EQ *-ofsB
stx pbuf save the name length
vnam1 stx pbuf save the name length
lda #$2F '/'
sta pbuf+1 slash before and
sta pbuf,x after name.
@ -69,7 +66,7 @@ vnam1 .EQ *-ofsB
.DA op_parms
bcc L5D7F good open.
lda dlevel trying to open root directory ?
beq L5D32 yes, just move to next volume.
beq ds2 yes, just move to next volume.
jsr bell1 no, generate bell tone
jsr popdir and stay at same level.
stx pbuf
@ -181,7 +178,7 @@ L5E48 lda pbuf+1,x
showfiles stz valcnt
stz topname init top filename index.
lda filecount # of valid files.
beq L5EB0 if no files.
beq keyloop if no files.
cmp #$15 more than what will fit on screen ?
bcc L5E61 no.
lda #$14 limit to 20 files on the screen.
@ -222,9 +219,8 @@ dnarrow jsr nameprnt print old name in normal.
L5EA7 jsr cout
L5EAA jsr setinv set inverse text mode.
jsr nameprnt output last filename.
keyloop .EQ *-ofsB
L5EB0 lda kbd get keyboard input.
bpl L5EB0 loop until key pressed.
keyloop lda kbd get keyboard input.
bpl keyloop loop until key pressed.
sta KBDSTROBE clear strobe.
jsr setnorm set normal text mode.
ldx filecount are any files displayed ?
@ -238,15 +234,14 @@ L5EB0 lda kbd get keyboard input.
L5ECB cmp #$89 tab ?
beq L5EED new volume.
cmp #$9B esc ?
bne L5EB0 no, try again else pop up a directory.
bne keyloop no, try again else pop up a directory.
* pop a directory level
jsr popdir
dec dlevel
bra L5EF1
popdir .EQ *-ofsB
ldx pbuf
popdir ldx pbuf
L5EDD dex
lda pbuf,x
cmp #$2F slash
@ -303,20 +298,17 @@ L5F04 iny start at y = 1.
* output messages. on entry: acc = horizontal position,
* y = index to message teminated by 0.
sethorz .EQ *-ofsB
sta ch
msgout .EQ *-ofsB
L5F4C lda dsp2msg,y
sethorz sta ch
msgout lda dsp2msg,y
beq L5F57
jsr cout
iny
bne L5F4C
bne msgout
L5F57 rts
* name pointer calculator for name storage area
namecalc .EQ *-ofsB
stz fnstore+1 init high byte of 16-bit shift
namecalc stz fnstore+1 init high byte of 16-bit shift
txa
asl shift to high nibble
rol fnstore+1
@ -338,8 +330,7 @@ namecalc .EQ *-ofsB
* output a filename line
nameprnt .EQ *-ofsB
lda #$02
nameprnt lda #$02
sta ch80col horizontal position = 2.
ldx valcnt filename number
txa
@ -364,54 +355,40 @@ L5F9F iny y = 1 (first time).
jsr output put on screen.
cpy namelen end of name ?
bcc L5F9F no.
outsp .EQ *-ofsB output a space.
lda #$A0
outsp lda #$A0
bne L5FB1 branch always.
homecurs .EQ *-ofsB screen control - home cursor
lda #$99
output .EQ *-ofsB
ora #$80 set high bit.
homecurs lda #$99
output ora #$80 set high bit.
L5FB1 jmp cout output to screen.
doread .EQ *-ofsB
jsr MLI mli read call
doread jsr MLI mli read call
.DA #$CA
.DA rd_parms
rts
* data area
dsp2msg .EQ *-ofsB
.AS -"RETURN: Select | TAB: Chg Vol | "
dsp2msg .AS -"RETURN: Select | TAB: Chg Vol | "
.AS -"ESC: Back"
.DA #$00
fldrmsg .EQ *-ofsB
.DA #$0F inverse control code
fldrmsg .DA #$0F inverse control code
.HS 1B enable mousetext
.AS -"XY" folder characters
.HS 18 disable mousetext
.HS 0E normal control code
.HS 00
op_parms .EQ *-ofsB open parameters
.DA #$03 3 parms
op_parms .DA #$03 3 parms
.DA pbuf pathname
.DA op_buf file buffer
op_refn .EQ *-ofsB
.HS 00 reference number
cl_parms .EQ *-ofsB close parameters
.HS 01 1 parm
op_refn .HS 00 reference number
cl_parms .HS 01 1 parm
.HS 00 reference number.
ol_parms .EQ *-ofsB online parameters
.HS 02 2 parms
ol_unit .EQ *-ofsB
.HS 60 unit number, default = s6, d1
ol_parms .HS 02 2 parms
ol_unit .HS 60 unit number, default = s6, d1
.DA pbuf+1 data buffer
pf_parms .EQ *-ofsB set prefix parameters
.DA #01 one parm
pf_parms .DA #01 one parm
.DA pbuf pathname
rd_parms .EQ *-ofsB read parameters
.DA #04 4 parms
rd_refn .EQ *-ofsB
.HS 01 reference number
rd_parms .DA #04 4 parms
rd_refn .HS 01 reference number
.DA sysentry data buffer
* these last 2 parms (4 bytes) may extend past $300 length limit since
@ -420,10 +397,7 @@ rd_refn .EQ *-ofsB
* .HS 0000 requested length
* .HS 0000 actual length
dhdr_len .EQ *-ofsB directory header length
.HS 00 (actually uses 2 bytes)
* end of obj sel_1
dhdr_len .HS 00 directory header length (actually uses 2 bytes)
*--------------------------------------
MAN
SAVE USR/SRC/PRODOS.203/PRODOS.S.SEL1

View File

@ -13,8 +13,6 @@ NEW
* (as other replacement quit code is supposed to do) because GQuit checks
* this to see if this version of quit code is available.
ofsQ .EQ *-dispadr offset to GQuit dispatcher org
GQdisp lda RRAMWRAMBNK1 read/write LC bank 1
clc
xce 16 bit native mode.
@ -121,8 +119,7 @@ L608B jsr dolaunch check for possible 2nd pathname.
L6099 lda RROMBNK2 enable ROM
jmp sysentry execute the system application
gqerror .EQ *-ofsQ
clc
gqerror clc
xce 16 bit native mode
>LONGMX
jsr mountvol mount volume.
@ -166,8 +163,7 @@ L60AB clc native mode
* on exit: carry clear if mount volume displayed and 'return' was pressed.
* carry set if no window displayed or if had window and 'esc' pressed.
mountvol .EQ *-ofsQ
ldy ##$0000 volbuf>>16
mountvol ldy ##$0000 volbuf>>16
ldx ##volbuf set up pointer to volume name.
* if error is 'volume not found' or 'no disk in drive' then display the
@ -224,8 +220,7 @@ L613C sec indicate Escape was pressed.
* inputs: x = length byte of complete pathname containing volume name.
* output: volume name is stored in volbuf.
copyvol .EQ *-ofsQ
lda >1,x get the first slash
copyvol lda >1,x get the first slash
sta volbuf+1
ldy ##$0002 initialize the length count.
@ -247,8 +242,7 @@ L6156 dey fix character count.
* on exit, the z-flag is set if a filename was correctly passed to the
* application elst the z-flag is clear if it couldn't be done.
dolaunch .EQ *-ofsQ
lda sysentry does the app start with a jump ?
dolaunch lda sysentry does the app start with a jump ?
cmp #$4C
bne L616F no, doesn't follow the convention.
lda #$EE check for the signature bytes.
@ -359,8 +353,7 @@ L6231 rts and go launch the app.
* carry clear = disk was found
* carry set = disk not found
ckfordrv .EQ *-ofsQ
SEL2.ckfordrv clc native mode
ckfordrv clc native mode
xce
>LONGX 16-bit regs, 8-bit acc.
ldx ##sysentry+6 point to pathname buffer.
@ -383,41 +376,28 @@ SEL2.ckfordrv clc native mode
* Prodos 8 parameter lists
pfxparms .EQ *-ofsQ set prefix parms.
.DA #01 one parm.
pfxparms .DA #01 one parm.
.DA inbuf address of prefix.
opnparms .EQ *-ofsQ open parms.
.DA #3 3 parms.
opnparms .DA #3 3 parms.
.DA pbuf pathname
.DA op_buf i/o buffer
oprefnum .EQ *-ofsQ
.HS 00 reference #
eofparms .EQ *-ofsQ
.DA #02 2 parms
eofrefn .EQ *-ofsQ
.HS 00 reference #
eofval .EQ *-ofsQ
.HS 000000 3 byte eof value
readparm .EQ *-ofsQ
.DA #04 4 parms
rdrefnum .EQ *-ofsQ
.HS 00 reference #
oprefnum .HS 00 reference #
eofparms .DA #02 2 parms
eofrefn .HS 00 reference #
eofval .HS 000000 3 byte eof value
readparm .DA #04 4 parms
rdrefnum .HS 00 reference #
.DA sysentry read into $2000 (bank 0).
rdcount .EQ *-ofsQ
.HS 0000 # of bytes to read.
rdcount .HS 0000 # of bytes to read.
.HS 0000 transfer count
closeprm .EQ *-ofsQ
.DA #1 1 parm
closeref .EQ *-ofsQ
.HS 00 reference #
quitparms .EQ *-ofsQ
.DA #04 4 parms.
closeprm .DA #1 1 parm
closeref .HS 00 reference #
quitparms .DA #04 4 parms.
.HS 00 quit back to launcher (GQuit)
.HS 0000
.HS 00
.HS 0000
gfiparms .EQ *-ofsQ get file info parms.
.DA #$0A 10 parms
gfiparms .DA #$0A 10 parms
.DA volbuf volume buffer
.DA #0 access
.DA #0 file type
@ -432,36 +412,27 @@ gfiparms .EQ *-ofsQ get file info parms.
* messages for P8 fatal error. maximum length of message is 35 characters.
* the error code will be displayed immediately after the final character.
quitstr1 .EQ *-ofsQ
.DA #$1B
quitstr1 .DA #$1B
.AS "Can't run next application."
quitstr2 .EQ *-ofsQ
.DA #$14
quitstr2 .DA #$14
.AS "ProDOS Error = $"
errval .EQ *-ofsQ hex error code gets stored here
.AS " "
quitbtn2 .EQ *-ofsQ null string (no 2nd button)
.HS 00
errval .AS " "
quitbtn2 .HS 00
* messages for P8 mount volume. maximum length of message is 35 characters.
* the button labels must not be more than 16 characters.
mountmsg .EQ *-ofsQ
.DA #$17
mountmsg .DA #$17
.AS "Please insert the disk:"
button1 .EQ *-ofsQ
.DA #$0D
button1 .DA #$0D
.AS "Accept: "
.DA #$1B mousetext on
.DA #$0F inverse on
.DA #$4D mousetext return
.DA #$0E normal on
.DA #$18 mousetext off
button2 .EQ *-ofsQ
.DA #$0B
button2 .DA #$0B
.AS "Cancel: Esc"
* end of obj sel_2 (must be < GQdisp+$300)
*--------------------------------------
MAN
SAVE USR/SRC/PRODOS.203/PRODOS.S.SEL2

View File

@ -6,16 +6,15 @@ NEW
* $2F00-2F7C moved to $D742
ofsT .EQ *-tclk_in offset to Thunderclock org
TCLK.START ldx TCLK.Cx2+2 clock slot = $C1.
tclock_0 ldx clkslt clock slot = $C1.
lda clkmode,x save current mode
pha
lda #$A3 send numeric mode byte to Thunderclock
jsr wttcp
clkslt .EQ *-ofsT+2 points to $C1.
TCLK.clkslt jsr rdtcp read month, day of week, day of month
TCLK.Cx1 jsr wttcp
TCLK.Cx2 jsr rdtcp read month, day of week, day of month
clc and time into input buffer.
ldx #$04 index for 5 values.
ldy #$0C read minutes 1st, month last.
@ -64,15 +63,14 @@ TCLK.clkslt jsr rdtcp read month, day of week, day of month
lda A2L minute
sta p8time
pla restore previous mode.
ldx clkslt clock slot = $C1
ldx TCLK.Cx2+2 clock slot = $C1
sta clkmode,x
H2F69 rts
TCLK.CEND rts
* this table contains entries for the cumulative # of days in a year,
* one entry for each month. the values are modulo 256.
tdays .EQ *-ofsT
.DA #$00 January
tdays .DA #$00 January
.DA #$1F February
.DA #$3B March
.DA #$5A April
@ -91,16 +89,15 @@ tdays .EQ *-ofsT
* is the year which January 1st is Sunday, and so on backwards thru
* the days of the week.
yradj .EQ *-ofsT
.DA #$07 Monday
yradj .DA #$07 Monday
.DA #$0C Sunday
.DA #$0B Saturday
.DA #$0A Friday
.DA #$09 Thursday
.DA #$08 Wednesday
.DA #$08 Tuesday
tclk_end .EQ * end of obj tclock_0.
.HS 000000 pad
TCLK.END .HS 000000 pad
*--------------------------------------
MAN
SAVE USR/SRC/PRODOS.203/PRODOS.S.TCLK

View File

@ -192,9 +192,14 @@ GP .PH $BF00
.INB USR/SRC/PRODOS.203/PRODOS.S.GP
.EP
TCLK .PH $D742
.INB USR/SRC/PRODOS.203/PRODOS.S.TCLK
.INB USR/SRC/PRODOS.203/PRODOS.S.CCLK
.EP
CCLK .PH $D742
.INB USR/SRC/PRODOS.203/PRODOS.S.CCLK
.EP
XDOS .PH $DE00
.INB USR/SRC/PRODOS.203/PRODOS.S.XDOS.A
.INB USR/SRC/PRODOS.203/PRODOS.S.XDOS.B
@ -213,15 +218,15 @@ XRW .PH $D000
.INB USR/SRC/PRODOS.203/PRODOS.S.DISKII
.EP
SEL0 .PH $D100
SEL0 .PH $1000
.INB USR/SRC/PRODOS.203/PRODOS.S.SEL0
.EP
SEL1 .PH $D100
SEL1 .PH $1000
.INB USR/SRC/PRODOS.203/PRODOS.S.SEL1
.EP
SEL2 .PH $D100
SEL2 .PH $1000
.INB USR/SRC/PRODOS.203/PRODOS.S.SEL2
.EP
*--------------------------------------