A2osX/BASIC.FX/BASIC.S.XF.txt

695 lines
11 KiB
Plaintext
Raw Normal View History

2022-05-25 18:46:02 +00:00
NEW
AUTO 3,1
*--------------------------------------
BSX.HeadSelect asl A = 0/2
ora BSX.Slotn0
tax x=n0/n2
lda IO.D2.Ph0On,x
lda IO.D2.Ph0On+4,x
lda #1
jsr BSX.Wait100usecA
lda IO.D2.Ph0Off,x
lda IO.D2.Ph0Off+4,x
rts
*--------------------------------------
2022-06-22 06:26:44 +00:00
BSX.Recalibrate ldy BSX.Slotn0
2022-05-25 18:46:02 +00:00
lda IO.D2.Ph0On,y
lda #IO.D2.SeekTimeR
jsr BSX.Wait100usecA
2022-08-20 14:37:37 +00:00
lda #160
php
sei
2022-06-22 06:26:44 +00:00
2022-05-25 18:46:02 +00:00
.1 dec
dec
pha
phy
plx
2022-08-20 14:37:37 +00:00
jsr BSX.SeekPhOnY
2022-05-25 18:46:02 +00:00
lda #IO.D2.SeekTimeR
jsr BSX.Wait100usecA
lda IO.D2.Ph0Off,x
lda #IO.D2.SeekTimeR
jsr BSX.Wait100usecA
pla
bne .1
jsr BSX.Wait25600usec
lda IO.D2.Ph0Off,y
2022-08-20 14:37:37 +00:00
plp
2022-05-25 18:46:02 +00:00
jmp BSX.Wait25600usec
*--------------------------------------
BSX.MoveHead sta BSX.TargetQTrack
lda BSX.CurrentQTrack
bit #1
2022-06-12 20:42:22 +00:00
beq .2 we are on 0/4 or 2/4 track
2022-05-25 18:46:02 +00:00
2022-06-12 20:42:22 +00:00
pha
2022-05-25 18:46:02 +00:00
2022-06-12 20:42:22 +00:00
cmp BSX.TargetQTrack we are on 1/4 or 3/4 track
bcc .1 if CC, C < T, must move in
2022-05-25 18:46:02 +00:00
inc CC: C < T, ON next PH
.1 jsr BSX.SeekPhOnY move in : X = Ph(N)
tya
2022-06-12 20:42:22 +00:00
tax
2022-06-12 20:42:22 +00:00
pla
2022-05-25 18:46:02 +00:00
2022-06-12 20:42:22 +00:00
bcs .2 if CS, C > T, must move out
inc move in : Y = Ph(N+1)
2022-05-25 18:46:02 +00:00
2022-06-12 20:42:22 +00:00
.2 jsr BSX.SeekPhOnY move out: Y = Ph(N)
2022-08-20 14:37:37 +00:00
bra .9 Ph ON to go to 0/4 or 2/4, no wait
2022-05-25 18:46:02 +00:00
*--------------------------------------
.3 bcs .4 if CS, C > T, must move out
inc CC: C < T, ON next PH
.HS B0 BCS
.4 dec CS: C > T, ON prev PH
sta BSX.CurrentQTrack
bit #1
bne .5
lda IO.D2.Ph0Off,x we must go to 0/4 or 2/4 : Off Prev Ph
bra .8 go wait....
.5 phy we must go on 1/4 or 3/4
plx Y already ON, -> X for Ph0Off,x
bcs .6 if CS, C > T, must move out
inc CC: C < T, ON next PH
.6 jsr BSX.SeekPhOnY now X and Y on
.8 lda #IO.D2.SeekTimeF
jsr BSX.Wait100usecA ...wait...
.9 lda BSX.CurrentQTrack
cmp BSX.TargetQTrack
bne .3
2023-05-16 16:53:52 +00:00
* lsr CS if X,Y on
2022-05-25 18:46:02 +00:00
jsr BSX.Wait25600usec
2023-05-16 16:53:52 +00:00
ldy BSX.Slotn0
2022-08-20 14:37:37 +00:00
lda IO.D2.Ph0Off,y
2023-06-02 20:31:09 +00:00
lda IO.D2.Ph0Off+2,y
2023-05-16 16:53:52 +00:00
lda IO.D2.Ph0Off+4,y
2023-06-02 20:31:09 +00:00
lda IO.D2.Ph0Off+6,y
2022-08-20 14:37:37 +00:00
2023-05-16 16:53:52 +00:00
* lda IO.D2.Ph0Off,y
* bcc .10
2022-05-25 18:46:02 +00:00
2023-05-16 16:53:52 +00:00
* lda IO.D2.Ph0Off,x
* clc
* lda IO.D2.Ph0Off,y
2022-06-12 20:42:22 +00:00
2022-08-20 14:37:37 +00:00
.10 rts
2022-05-25 18:46:02 +00:00
*--------------------------------------
BSX.SeekPhOnY and #6
ora BSX.Slotn0
tay
lda IO.D2.Ph0On,y
rts
*--------------------------------------
BSX.Wait25600usec
lda #0
BSX.Wait100usecA
phx
2022-08-20 14:37:37 +00:00
.1 ldx #19 (2)
2022-05-25 18:46:02 +00:00
.2 dex (2)
bne .2 (3)
dec (2)
bne .1 (3)
plx
rts (6)
*--------------------------------------
BSX.FMT.CheckP lda GP.ParamS
asl
asl
asl
asl
asl
pha
lda GP.ParamD
lsr
lsr
pla
ror
sta BS.WBlock.P.NUM unitnum : DSSS0000
stz BS.WBlock.P.BLK
stz GP.ParamV Standard BB
stz GP.ParamT BLK/DiskII flag
lda #1
sta GP.ParamA default Head Count
lda #4
sta GP.ParamL default Cat Block Count
lda GP.FoundBITS+1
bit #CMDBITS1.L
beq .10
lda GP.ParamL+1
bne .9
lda GP.ParamL
bne .11
.9 lda #BS.E.RANGE
sec
rts
*--------------------------------------
.10 lda #4
sta GP.ParamL Cat Block Count
.11 lda GP.ParamS
ora #$C0 make Cn
sta ZPXPtr1+1
stz ZPXPtr1
ldx #3 4 bytes to check
.1 ldy BSX.DiskII.OFS,x
.2 lda (ZPXPtr1),y
eor BSX.DiskII.SIG,x
bne BSX.FMT.CheckBLK
dex
bpl .1
dec GP.ParamT
*--------------------------------------
BSX.FMT.CheckD2 lda GP.FoundBITS+1
bit #CMDBITS1.B
bne .99 not allowed for D2
bit #CMDBITS1.A
beq .10
lda GP.ParamA+1
bne .98
lda GP.ParamA
beq .98
cmp #3
bcs .98
lsr
lsr CS if 2 heads
ror GP.ParamV => V : d0000sss
lda GP.FoundBITS+1
.10 bit #CMDBITS1.E
beq .19
lda GP.ParamE+1
bne .98
bra .20
.19 lda #35
sta GP.ParamE
.20 lda GP.FoundBITS+1
bit #CMDBITS1.F
beq .29
lda GP.ParamF+1
bne .98
lda GP.ParamF
beq .98
cmp #5
bcs .98
tsb GP.ParamV => V : d0000sss
rts
.29 lda #4
sta GP.ParamF Stepping
clc
rts
.98 lda #BS.E.RANGE
.HS 2C BIT ABS
.99 lda #BS.E.INVOPT
sec
rts
*--------------------------------------
BSX.FMT.CheckBLK
lda GP.FoundBITS+1
bit #CMDBITS1.A+CMDBITS1.E+CMDBITS1.F
bne .99 not allowed for BLK dev
bit #CMDBITS1.B
beq .8
lda GP.ParamB+2
bne .98
.8 clc
rts
.98 lda #BS.E.RANGE
.HS 2C BIT ABS
.99 lda #BS.E.INVOPT
sec
rts
*--------------------------------------
BSX.DiskII.OFS .HS 010305FF
BSX.DiskII.SIG .HS 20000300
*--------------------------------------
* GP.ParamS : Slot (1/7)
* GP.ParamD : Drive (1/2)
* GP.ParamA : Head count (1/2)
* GP.ParamE : Track count (0,...)
* GP.ParamF : Stepping (1..4)
* GP.ParamV : VolNum (0..255)
*--------------------------------------
BSX.FMT.D2 lda GP.ParamS
asl
asl
asl
asl
sta BSX.Slotn0
tax
* clc
adc GP.ParamD
tay
lda IO.D2.DrvSel1-1,y
lda IO.D2.DrvOn,x
lda #0
ldy #6
.11 jsr BSX.Wait100usecA
dey
bne .11
jsr BSX.Recalibrate
lda #0
jsr BSX.HeadSelect
lda GP.ParamV
sta X.TRKFMT.VolNum
stz X.TRKFMT.TrkNum
stz BSX.CurrentQTrack
.1 ldx BSX.Slotn0
lda IO.D2.ReadProt,x test for write protected
lda IO.D2.ReadMode,x
asl
lda #BS.E.WPROT
bcs .9
php
sei
jsr X.TRKFMT
plp
lda GP.ParamA head count
dec
beq .2
jsr BSX.HeadSelect
inc X.TRKFMT.TrkNum
php
sei
jsr X.TRKFMT
plp
lda #0
jsr BSX.HeadSelect
.2 dec GP.ParamE track count
beq .8
inc X.TRKFMT.TrkNum
lda BSX.CurrentQTrack
clc
adc GP.ParamF stepping
jsr BSX.MoveHead
bra .1
.8 lda #0
jsr BSX.MoveHead
clc
.9 bit IO.D2.DrvOff,x
rts
*--------------------------------------
BSX.Slotn0 .BS 1
BSX.CurrentQTrack .BS 1
BSX.TargetQTrack .BS 1
*--------------------------------------
BSX.FMT.GetCatBlk
asl
tax
jmp (.1,x)
.1 .DA BSX.GetCatBlk.PRODOS
.DA BSX.GetCatBlk.SOS
.DA BSX.GetCatBlk.FX1
.DA BSX.GetCatBlk.FX2
.DA BSX.GetCatBlk.1ST
.DA BSX.GetCatBlk.NEXT
.DA BSX.GetCatBlk.BM
BSX.GetCatBlk.PRODOS
lda /BB.PRODOS
.HS 2C BIT ABS
BSX.GetCatBlk.SOS
lda /BB.SOS
.HS 2C BIT ABS
BSX.GetCatBlk.FX1
lda /BB.FX2
.HS 2C BIT ABS
BSX.GetCatBlk.FX2
lda /BB.FX2+512
sta ZPXPtr1+1
stz ZPXPtr1
lda BS.WBlock.P.PTR+1
sta ZPXPtr2+1
stz ZPXPtr2
ldy #0
ldx #2
.1 lda (ZPXPtr1),y
sta (ZPXPtr2),y
iny
bne .1
inc ZPXPtr1+1
inc ZPXPtr2+1
dex
bne .1
clc
rts
*--------------------------------------
BSX.GetCatBlk.1ST
jsr BSX.GetCatBlk.Size
jsr BSX.GetCatBlk.CLR
lda BS.WBlock.P.PTR+1
sta ZPXPtr2+1
lda GP.ParamL cat blocks
dec
sta BSX.GetCatBlk.CNT
beq .1
lda #3
sta BSX.GetCatBlk.IDX
ldy #$02 Next Cat Block = 3
sta (ZPXPtr2),y
.1
* lda BS.CMDBUF.LEN
* and #$F0
* bne .9
* lda BS.CMDBUF.LEN
lda #$F7 BLANK+s+d
ldy #$04 storage_type+filelen
sta (ZPXPtr2),y
ldx #0
.2
* lda BS.CMDBUF,x
* jsr BSX.ToUpper
lda BSX.GetCatBlk.BLANK,x
inx
iny
sta (ZPXPtr2),y
* cpx BS.CMDBUF.LEN
cpx #5
bne .2
lda GP.ParamS
ora #$30
iny
sta (ZPXPtr2),y
lda GP.ParamD
ora #$30
iny
sta (ZPXPtr2),y
ldy #$1C+3 date_time
ldx #3
.3 lda MLI.DATETIME,x
sta (ZPXPtr2),y
dey
dex
bpl .3
ldy #$22 access
lda #$C3
sta (ZPXPtr2),y
iny entry_length
lda #$27
sta (ZPXPtr2),y
iny entries_per_block
lda #$0D
sta (ZPXPtr2),y
ldy #$27 bit_map_pointer
lda GP.ParamL
inc
inc
sta (ZPXPtr2),y
ldy #$29 total_blocks
lda GP.ParamB
sta (ZPXPtr2),y
eor #$ff
sta BSX.GetCatBlk.nCnt
iny
lda GP.ParamB+1
sta (ZPXPtr2),y
eor #$ff
sta BSX.GetCatBlk.nCnt+1
clc
rts
.9 lda #BS.E.INVOPT
sec
rts
*--------------------------------------
BSX.GetCatBlk.NEXT
sec
dec BSX.GetCatBlk.CNT
bmi .9
jsr BSX.GetCatBlk.CLR
lda BSX.GetCatBlk.IDX
dec
sta (ZPXPtr2) previous block#
ldy BSX.GetCatBlk.CNT
beq .1
inc
inc
sta BSX.GetCatBlk.IDX
ldy #2 next block#
sta (ZPXPtr2),y
.1 clc
.9 rts
*--------------------------------------
BSX.GetCatBlk.BM
sec
dec BSX.GetCatBlk.BMCNT
bmi .9
jsr BSX.GetCatBlk.CLR
* ldy #0
ldx #2
lda BSX.GetCatBlk.UB
beq .4
.1 lda #%10000000
.2 dec BSX.GetCatBlk.UB
bmi .5
inc BSX.GetCatBlk.nCnt
bne .3
inc BSX.GetCatBlk.nCnt+1
.3 lsr
bne .2
iny
bra .1
.4 lda #%10000000
.5 inc BSX.GetCatBlk.nCnt
bne .6
inc BSX.GetCatBlk.nCnt+1
beq .8
.6 pha
eor (ZPXPtr2),y
sta (ZPXPtr2),y
pla
lsr
bne .5
iny
bne .4
inc ZPXPtr2+1
dex
bne .4
.8 clc
.9 rts
*--------------------------------------
BSX.GetCatBlk.Size
clc
lda GP.ParamB total blocks
beq .1
sec
.1 lda GP.ParamB+1
bit #$0f
beq .2
sec
.2 php
lsr
lsr
lsr
lsr
plp
adc #0
sta BSX.GetCatBlk.BMCNT
inc +1 (ProDOS)
inc +1 (SOS)
adc GP.ParamL +x (cat blocks)
sta BSX.GetCatBlk.UB
rts
*--------------------------------------
BSX.GetCatBlk.CLR
lda BS.WBlock.P.PTR+1
sta ZPXPtr2+1
pha
stz ZPXPtr2
lda #0
tay
ldx #2
.1 sta (ZPXPtr2),y
iny
bne .1
inc ZPXPtr2+1
dex
bne .1
pla
sta ZPXPtr2+1
rts
*--------------------------------------
BSX.GetCatBlk.BLANK .AS "BLANK"
BSX.GetCatBlk.BMCNT .BS 1
BSX.GetCatBlk.UB .BS 1
BSX.GetCatBlk.CNT .BS 1
BSX.GetCatBlk.IDX .BS 1
BSX.GetCatBlk.nCnt .BS 2
*--------------------------------------
MAN
SAVE usr/src/basic.fx/basic.s.xf
LOAD usr/src/basic.fx/basic.s
ASM