NEW
PREFIX
AUTO 4,1
				.LIST OFF
				.OP	65C02
				.OR	$2000
				.TF BIN/FORMAT
*--------------------------------------
				.INB INC/MACROS.I
				.INB INC/A2OSX.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
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.INIT		.DA MSG.INIT		
L.MSG.OK		.DA MSG.OK
L.MSG.ERR		.DA MSG.ERR
				.DA 0
*--------------------------------------
CS.INIT			ldy #S.PS.ARGC
				lda (pPs),y
				beq .90

.1				>INC.G ArgIndex
				
				>SYSCALL ArgV
				bcc .11
				jmp .8
				
.11				>STYA ZPPtr1
				
				lda (ZPPtr1)
				cmp #'-'
				bne .4
				
				ldy #1 
				lda (ZPPtr1),y
				beq .90

				cmp #'0'
				bcc .20
				cmp #'9'+1
				bcs .20
				
				and #$0F
				>STA.G CatSize
				bra .1
				
.20				ldx OptionList
				
.2				cmp OptionList,x
				beq .3
				dex
				bne .2
.90				bra .99
				
.3				ldy OptionVars-1,x
				lda #$80
				sta (pData),y
				bra .1
				
.4				>LDA.G hDevID
				bne .5					Already have a dev...go get VolName

				>LDYA ZPPtr1
				>SYSCALL GetDevByName
				bcs .99
				>STYA ZPPtrFD
				txa
				>STA.G hDevID
				
				>LDYA ZPPtr1
				>STYA ZPPtrDevName
				bra .1
				
.5				ldy #$ff
				
.6				iny
				lda (ZPPtr1),y
				beq .61
				
				cpy #15
				beq .99					VolName too long

.61				>PUSHW ZPPtr1
				>LEA.G VolName
				>SYSCALL StrCpy
				jmp .1					success, scan for any other args

.8				>LDYA L.LIBBLKDEV
				>SYSCALL LoadLib
				bcs .9
				sta hLIBBLKDEV
				
				clc
.9				rts
				
.99				>PUSHBI 0
				>LDYA L.MSG.USAGE
				>SYSCALL printf
				lda #E.SYN
				sec
				rts							
*--------------------------------------
CS.RUN			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
				>PUSHA
				>PUSHBI 1
				>LDYA L.MSG.ERR
				>SYSCALL printf
				pla
				sec
				rts
*--------------------------------------
CS.RUN.InitCat	>LDA.G CatSize
				bne .1
				lda #4
				sta (pData),y

.1				>LDA.G VolName
				bne .8					Volume name ok

				ldx #$ff
				ldy #VolName-1
				
.2				inx
				iny
				lda BLANK,x
				sta (pData),y
				bne .2
				
				lda A2osX.TIMER16
				jsr A2CharAX
				sta (pData),y
				iny
				txa
				sta (pData),y
				iny
				
				lda A2osX.TIMER16+1
				jsr A2CharAX
				sta (pData),y
				iny
				txa
				sta (pData),y
				iny
				
				lda A2osX.RANDOM16
				jsr A2CharAX
				sta (pData),y
				iny
				txa
				sta (pData),y
				iny
				
				lda A2osX.RANDOM16+1
				jsr A2CharAX
				sta (pData),y
				iny
				txa
				sta (pData),y
				iny
				
				lda #0
				sta (pData),y
				
.8				clc
				rts
*--------------------------------------
CS.RUN.BuildCat	>PUSHEA.G DIB
				>LDA.G hDevID

				>SYSCALL GetDevStatus
				bcs .99
												
				>PUSHEA.G VolName
				>PUSHW.G DIB+S.DIB.SIZE
				
				>PUSHW ZPPtrDevName

				>PUSHBI 6
				>LDYA L.MSG.INIT
				>SYSCALL printf
.99				bcs .9

				jsr .7

				>LIBCALL hLIBBLKDEV,LIBBLKDEV.GetProDOSCatSize			
				bcs .9

				phy
				pha
				txa
				>STA.G BlkCnt
				pla
				ply
				
				>SYSCALL GetMem0		BufferSize
				bcs .9
				
				phx
				>STYA.G IOCTL+S.IOCTL.BUFPTR
				pla
				>STA.G hBuf
				
				jsr .7
				
				>PUSHEA.G VolName
				>PUSHW.G IOCTL+S.IOCTL.BUFPTR
				>LIBCALL hLIBBLKDEV,LIBBLKDEV.BuildProDOSCat
.9				rts

.7				>PUSHW.G DIB+S.DIB.SIZE
				>PUSHB.G CatSize
				>PUSHB.G CatOptions
				rts
*--------------------------------------
CS.RUN.WriteCat	>PUSHEA.G IOCTL
				>PUSHBI IOCTL.WRITEBLOCK		
				>LDA.G hDevID

				>SYSCALL IOCTL
				bcs .9
				
				lda #'.'
				>SYSCALL PutChar
				
				>LDA.G IOCTL+S.IOCTL.BUFPTR+1
				inc
				inc
				sta (pData),y
				
				>INC.G IOCTL+S.IOCTL.BLKNUM
				
				>SLEEP
				
				>DEC.G BlkCnt
				bne CS.RUN.WriteCat
.9				rts
*--------------------------------------
CS.DOEVENT		sec
				rts
*--------------------------------------
CS.QUIT			>LDA.G hBuf
				beq .1
				>SYSCALL FreeMem
					
.1				lda hLIBBLKDEV
				beq .8
				
				>SYSCALL UnloadLib
				
.8				clc
				rts
*--------------------------------------
A2CharAX		pha
				lsr
				lsr
				lsr
				lsr
				ora #$30
				cmp #'9'+1
				bcc .1
				adc #6
.1				tax
				pla
				and #$0F
				ora #$30
				cmp #'9'+1
				bcc .8
				adc #6
.8				rts
*--------------------------------------
CS.END
*--------------------------------------
OptionList		>PSTR "Ll"
OptionVars		.DA #bLL,#bLL
*--------------------------------------
MSG.USAGE		.AS "Usage : FORMAT <BLOCKDEV> [VOLUME.NAME]\r\n"
				.AS "   -L : Low-Level Format\r\n"
				.AZ " -1-9 : Catalog Size (Blocks)\r\n"
MSG.OK			.AZ "[OK]"
MSG.ERR			.AZ "[%h]\r\n"
MSG.INIT		.AZ "Formatting %s (%D Blks),Volname:%s..."
*--------------------------------------
LIBBLKDEV		.AZ "libblkdev"
BLANK			.AZ "BLANK"
hLIBBLKDEV		.BS 1
*--------------------------------------
				.DUMMY
				.OR 0
DS.START
ArgIndex		.BS 1
bLL				.BS 1
VolName			.BS 16
hDevID			.BS 1
CatSize			.BS 1
CatOptions		.BS 1
BlkCnt			.BS 1
IOCTL			.BS S.IOCTL
hBuf			.BS 1
DIB				.BS S.DIB
DS.END			.ED
*--------------------------------------
MAN
SAVE USR/SRC/BIN/FORMAT.S
ASM
