A2osX/BIN/FORMAT.S.txt
2020-04-27 08:14:39 +02:00

529 lines
9.0 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

NEW
PREFIX
AUTO 4,1
.LIST OFF
.OP 65C02
.OR $2000
.TF bin/format
*--------------------------------------
.INB INC/MACROS.I
.INB INC/A2OSX.I
.INB INC/MLI.E.I
.INB INC/KERNEL.I
.INB INC/LIBBLKDEV.I
*--------------------------------------
.DUMMY
.OR ZPBIN
ZS.START
ZPPtr1 .BS 2
ZPPtr2 .BS 2
ZPPtrFD .BS 2
ZPPtrDevName .BS 2
Index .BS 1
hDevID .BS 1
hCatBuf .BS 1
hTrackBuf .BS 1
DSSS0000 .BS 1
CurTrack .BS 1
CurQTrack .BS 1
bLL .BS 1
bCustomBlkSize .BS 1
MediaBlkSize .BS 2
CatSize .BS 1
CatBlkCnt .BS 1
CatOptions .BS 1
ZS.END
.ED
*--------------------------------------
* File Header (16 Bytes)
*--------------------------------------
CS.START cld
jmp (.1,x)
.DA #$61 6502,Level 1 (65c02)
.DA #1 BIN Layout Version 1
.DA #0 S.PS.F.EVENT
.DA #0
.DA CS.END-CS.START Code Size (without Constants)
.DA DS.END-DS.START Data SegmentSize
.DA #32 Stack Size
.DA #ZS.END-ZS.START Zero Page Size
.DA 0
*--------------------------------------
* Relocation Table
*--------------------------------------
.1 .DA CS.INIT
.DA CS.RUN
.DA CS.DOEVENT
.DA CS.QUIT
L.LIBBLKDEV .DA LIBBLKDEV
L.MSG.USAGE .DA MSG.USAGE
L.MSG.OK .DA MSG.OK
L.MSG.ERR .DA MSG.ERR
L.MSG.CRLF .DA MSG.CRLF
L.MSG.NOSIZE .DA MSG.NOSIZE
L.MSG.INIT .DA MSG.INIT
L.MSG.LLDISK2 .DA MSG.LLDISK2
L.MSG.LL .DA MSG.LL
L.MSG.WRITECAT .DA MSG.WRITECAT
L.FMT.BLANK .DA FMT.BLANK
.DA 0
*--------------------------------------
CS.INIT >LDYA L.LIBBLKDEV
>SYSCALL LoadLib
bcs .9
sta hLIBBLKDEV
.9 rts
*--------------------------------------
CS.RUN ldy #S.PS.ARGC
lda (pPS),y
beq .99
.1 inc Index
lda Index
>SYSCALL ArgV
bcc .11
jmp .8
.11 >STYA ZPPtr1
lda (ZPPtr1)
cmp #'-'
bne .4
ldy #1
lda (ZPPtr1),y
beq .99
cmp #'0'
bcc .2
cmp #'9'+1
bcs .2
and #$0F
sta CatSize
.10 bra .1
.2 jsr CS.RUN.CheckOpt
bcs .99
cpy #bCustomBlkSize
bne .1
inc Index
lda Index
>SYSCALL ArgV
bcs .99
>SYSCALL atoi
>STYA MediaBlkSize
bra .1
.99 >PUSHW L.MSG.USAGE
>PUSHBI 0
>SYSCALL PrintF
lda #E.SYN
sec
.9 rts
.4 lda hDevID
bne .5 Already have a dev...go get VolName
>LDYA ZPPtr1
>SYSCALL GetDevByName
bcs .9
stx hDevID
>STYA ZPPtrFD
>LDYA ZPPtr1
>STYA ZPPtrDevName
bra .10
.5 ldy #$ff
.6 iny
lda (ZPPtr1),y
sta (pData),y VolName
beq .10
cpy #16
bcc .6
bra .99 VolName too long
.8 lda hDevID
beq .99
*--------------------------------------
CS.RUN.Format jsr CS.RUN.GetDevStatus
bcs .9
>PUSHW L.MSG.INIT
>PUSHW ZPPtrDevName
>PUSHW MediaBlkSize
>PUSHEA.G VolName
>PUSHBI 6
>SYSCALL PrintF
bcs .9
bit bLL
bpl .1
jsr CS.RUN.LL
bcs .9
.1 jsr CS.RUN.InitCat
bcs .9
jsr CS.RUN.BuildCat
bcs .9
jsr CS.RUN.WriteCat
bcs .9
>LDYA L.MSG.OK
>SYSCALL PutS
lda #0
sec
rts
.9 pha
>PUSHW L.MSG.ERR
pla
pha
>PUSHA
>PUSHBI 1
>SYSCALL PrintF
pla
sec
rts
*--------------------------------------
CS.RUN.GetDevStatus
lda bCustomBlkSize
bmi .8
>PUSHB hDevID
>PUSHEA.G DIB
>SYSCALL GetDevStatus
bcs .9
>LDA.G DIB+S.DIB.SIZE
tax
iny
ora (pData),y
beq .9
lda (pData),y
sta MediaBlkSize+1
stx MediaBlkSize
.8 clc
rts
.9 >LDYA L.MSG.NOSIZE
>SYSCALL PutS
lda #MLI.E.IO
sec
rts
*--------------------------------------
CS.RUN.LL >LDA.G DIB+S.DIB.T
cmp #S.DIB.T.DISKII
bne .1
ldy #S.FD.DEV.BUSID
lda (ZPPtrFD),y 00000SSS
lsr
ror
ror
ror
pha SSS00000
iny S.FD.DEV.DEVID
lda (ZPPtrFD),y
dec 0/1
ror in C
pla
ror
sta DSSS0000
bra CS.RUN.LL.DISKII
.1 >PUSHW L.MSG.LL
>PUSHBI 0
>SYSCALL PrintF
bcs .9
>PUSHB hDevID
>PUSHBI IOCTL.FORMAT
>PUSHEA.G IOCTL
>SYSCALL IOCTL
.9
CS.RUN.LL.RTS rts
*--------------------------------------
CS.RUN.LL.DISKII
>LDYAI 4096
>SYSCALL GetMem
bcs CS.RUN.LL.RTS
stx hTrackBuf
>STYA ZPPtr1
jsr CS.RUN.MotorOn
bcs .9
>SLEEP
ldx #16
jsr CS.RUN.ZeroPtr1 16 sectors filled with 0, give some time to spin up
stz CurTrack
lda #160
sta CurQTrack
ldx #0
jsr CS.RUN.SeekToX
.1 >SLEEP
>PUSHW L.MSG.LLDISK2
>PUSHB CurTrack
>PUSHBI 1
>SYSCALL PrintF
bcs .9
>PUSHB DSSS0000
>PUSHBI 254 VOL
>PUSHB CurTrack
>PUSHW ZPPtr1
>LIBCALL hLIBBLKDEV,LIBBLKDEV.D2TrkWrite16s
bcs .9
inc CurTrack
lda CurQTrack
* clc
adc #4
cmp #140
beq .8
tax
jsr CS.RUN.SeekToX
bcc .1
.9 rts
.8 ldx #0
jsr CS.RUN.SeekToX
jsr CS.RUN.MotorOff
>PUSHW L.MSG.CRLF
>PUSHBI 0
>SYSCALL PrintF
rts
*--------------------------------------
CS.RUN.MotorOn sec
.HS 90 BCC
CS.RUN.MotorOff clc
>PUSHB DSSS0000
ror
>PUSHA
>LIBCALL hLIBBLKDEV,LIBBLKDEV.D2MotorControl
rts
*--------------------------------------
CS.RUN.SeekToX >PUSHB DSSS0000
>PUSHB CurQTrack
txa
sta CurQTrack
>PUSHA
>LIBCALL hLIBBLKDEV,LIBBLKDEV.D2MoveHead
rts
*--------------------------------------
CS.RUN.ZeroPtr1 >LDYA ZPPtr1
>STYA ZPPtr2
lda #0
tay
.10 sta (ZPPtr2),y
iny
bne .10
inc ZPPtr2+1
dex
bne .10
rts
*--------------------------------------
CS.RUN.InitCat lda CatSize
bne .1
lda #4
sta CatSize
.1 >LDA.G VolName
bne .8 Volume name ok
>PUSHEA.G VolName
>PUSHW L.FMT.BLANK
>PUSHW A2osX.TIMER16
>PUSHW A2osX.RANDOM16
>PUSHBI 4
>SYSCALL sprintf
rts
.8 clc
rts
*--------------------------------------
CS.RUN.BuildCat jsr .7
>LIBCALL hLIBBLKDEV,LIBBLKDEV.GetProDOSCatSize
bcs .9
stx CatBlkCnt
>SYSCALL GetMem BufferSize
bcs .9
>STYA ZPPtr1
>STYA.G IOCTL+S.IOCTL.BUFPTR
stx hCatBuf
lda CatBlkCnt
asl
tax
lda #0
tay
.1 sta (ZPPtr1),y
iny
bne .1
inc ZPPtr1+1
dex
bne .1
jsr .7
>PUSHEA.G VolName
>PUSHW.G IOCTL+S.IOCTL.BUFPTR
>LIBCALL hLIBBLKDEV,LIBBLKDEV.BuildProDOSCat
.9 rts
.7 >PUSHW MediaBlkSize
>PUSHB CatSize
>PUSHB CatOptions
rts
*--------------------------------------
CS.RUN.WriteCat >PUSHW L.MSG.WRITECAT
>PUSHBI 0
>SYSCALL PrintF
.1 >PUSHB hDevID
>PUSHBI IOCTL.WRITEBLOCK
>PUSHEA.G IOCTL
>SYSCALL IOCTL
bcs .9
lda #'.'
>SYSCALL PutChar
bcs .9
>LDA.G IOCTL+S.IOCTL.BUFPTR+1
inc
inc
sta (pData),y
>INC.G IOCTL+S.IOCTL.BLKNUM
>SLEEP
dec CatBlkCnt
bne .1
clc
.9 rts
*--------------------------------------
CS.DOEVENT sec
rts
*--------------------------------------
CS.QUIT lda hCatBuf
beq .1
>SYSCALL FreeMem
.1 lda hTrackBuf
beq .2
>SYSCALL FreeMem
.2 lda hLIBBLKDEV
beq .8
>SYSCALL UnloadLib
.8 clc
rts
*--------------------------------------
CS.RUN.CheckOpt ldy #1
lda (ZPPtr1),y
ldx #OptionVars-OptionList-1
.2 cmp OptionList,x
beq .3
dex
bpl .2
sec
rts
.3 ldy OptionVars,x
ldx #$ff
stx 0,y
clc
rts
*--------------------------------------
CS.END
*--------------------------------------
LIBBLKDEV .AZ "libblkdev"
hLIBBLKDEV .BS 1
*--------------------------------------
MSG.USAGE .AS "Usage : FORMAT <BLOCKDEV> [VOLUME.NAME]\r\n"
.AS " -L : Low-Level Format\r\n"
.AS " -B xxxx : override Device block size\r\n"
.AZ " -1-9 : Catalog Size (Blocks)\r\n"
MSG.OK .AZ "[OK]"
MSG.ERR .AS "[%h]"
MSG.CRLF .AZ "\r\n"
MSG.NOSIZE .AZ "Unable to get media size."
MSG.INIT .AZ "Formatting %s (%D Blks), Volname:%s\r\n"
MSG.LLDISK2 .AZ "\rWriting Track %02d..."
MSG.LL .AZ "\rLow Level Format..."
MSG.WRITECAT .AZ "Writing Catalog..."
FMT.BLANK .AZ "BLANK%H%H"
*--------------------------------------
OptionList .AS "LlBb"
OptionVars .DA #bLL,#bLL,#bCustomBlkSize,#bCustomBlkSize
*--------------------------------------
.DUMMY
.OR 0
DS.START
VolName .BS 16
IOCTL .BS S.IOCTL
DIB .BS S.DIB
DS.END .ED
*--------------------------------------
MAN
SAVE USR/SRC/BIN/FORMAT.S
ASM