NEW
  AUTO 3,1
*--------------------------------------
* DRV.Disk][
* X = IOCTL
* Y,A = PTR to S.IOCTL
*--------------------------------------
DRV.D2			cpx #IOCTL.FORMAT
				.HS 2C					BIT ABS
DRV.BLK			cpx #IOCTL.CONTROL
				bcs .9

				>STYA pIOCTL
				jmp (.1,x)

.1				.DA DRV.BLK.S
				.DA DRV.GBLK			READ
				.DA DRV.GBLK			WRITE
				.DA DRV.GBLK			FORMAT

.9				lda #MLI.E.BADCALL
*				sec
DRV.RTS			rts
*--------------------------------------
DRV.BLK.S		ldy #S.FD.DEV.SIZE
				lda (pFD),y
				tax
				
				iny
				lda (pFD),y
				tay
				bne .8
				
				txa
				bne .8

*				ldx #IOCTL.STATUS

				jsr DRV.GBLK
				bcs DRV.RTS

.8				stx DRV.BLK.DIB+S.DIB.SIZE
				sty DRV.BLK.DIB+S.DIB.SIZE+1

				ldy #S.FD.DEV.TYPE
				lda (pFD),y
				tay
				
				lda DRV.IDS,y
				tax
				lda DRV.IDS+1,y
				sta DRV.BLK.DIB+S.DIB.T
				
				ldy #0
				
.1				lda DRV.D2.IDS,x
				beq .2

				sta DRV.BLK.DIB+S.DIB.IDS+1,y
				inx
				iny
				bra .1
				
.2				sty DRV.BLK.DIB+S.DIB.IDS

				lda #C.SPACE

.3				cpy #16
				beq .4
				
				sta DRV.BLK.DIB+S.DIB.IDS+1,y
				iny
				bra .2

.4				>LDYAI DRV.BLK.DIB
				jmp DRV.STATUS.YA
*--------------------------------------
DRV.BLK.DIB		.DA #S.DIB.S.BLOCK+S.DIB.S.WRITE+S.DIB.S.READ
				.BS 3
				.BS 17					IDString
				.DA #S.DIB.T.BLK
				.DA #0
				.DA K.VER
*--------------------------------------
DRV.IDS			.DA #0,#S.DIB.T.D2
				.DA #DRV.RAM.IDS-DRV.D2.IDS,#S.DIB.T.BLK
				.DA #DRV.USER.IDS-DRV.D2.IDS,#S.DIB.T.BLK
				.DA #DRV.BLK.IDS-DRV.D2.IDS,#S.DIB.T.BLK
				.DA #DRV.RBLK.IDS-DRV.D2.IDS,#S.DIB.T.BLK
				.DA #0,#0				Smartport
				.DA #DRV.RSP.IDS-DRV.D2.IDS,#S.DIB.T.BLK
*--------------------------------------
DRV.D2.IDS		.CZ "Disk ][ 5.25"
DRV.RAM.IDS		.CZ "ProDOS /RAM Disk"
DRV.USER.IDS	.CZ "User Block Dev"
DRV.BLK.IDS		.CZ "ProDOS Block Dev"
DRV.RBLK.IDS	.CZ "Remapped BLK Dev"
DRV.RSP.IDS		.CZ "Remapped SP Dev"
*--------------------------------------
* IOCTL to BLK protocol converter
* in : pIOCTL
*--------------------------------------
DRV.GBLK		txa
				lsr
				sta DRV.BLK.P			CMD

				ldy #S.FD.DEV.DEVID		Drive 1, or 2
				lda (pFD),y
				dec						O or 1
				lsr						in Carry
				php
				ldy #S.FD.DEV.BUSID
				lda (pFD),y
				asl
				asl
				asl
				asl
				asl
				plp
				ror						DSSS0000

				sta DRV.BLK.P+1			UNITNUM
				ldx #3
				ldy #S.IOCTL.BUFPTR+3

.1				lda (pIOCTL),y			BUF,BLKNUM	
				sta DRV.BLK.P+2,x
				dey
				dex
				bpl .1

				ldy #S.FD.DEV.BUSPTR
				lda (pFD),y
				sta .3+1
				iny
				lda (pFD),y
				sta .3+2
				
				jsr GO.ProDOS
				
				ldx #5

.2				lda DRV.BLK.P,x
				sta DRV.BLK.Cmd,x
				dex
				bpl .2

.3				jsr $ffff				SELF MODIFIED

				jsr GO.A2osX
				rts
				
DRV.BLK.P		.BS 6
*--------------------------------------
* Smartport	Driver
*--------------------------------------
DRV.SP			>STYA pIOCTL
				>STYA .3				smartport Params

				txa
				lsr
				sta .2
				tax
				lda DRV.SP.Cnt,x
				sta (pIOCTL)			S.IOCTL.CNT

				ldy #S.FD.DEV.DEVID
				lda (pFD),y
				ldy #S.IOCTL.UNITNUM
				sta (pIOCTL),y

				ldy #S.FD.DEV.BUSPTR
				lda (pFD),y
				sta .1+1
				iny
				lda (pFD),y
				sta .1+2

				jsr GO.ProDOS			Remapped SP
				
.1				jsr $ffff
.2				.BS 1
.3				.BS 2

				jsr GO.A2osX
				rts

DRV.SP.Cnt		.HS 03030301030101010404
*--------------------------------------
* NULL DEVICE 
*  - OPEN,WRITE,CLOSE always succeed.
*  - READ returns EOF.
*--------------------------------------
DRV.NULL	 	>STYA pIOCTL
				txa
				beq DRV.NULL.S

				cmp #IOCTL.READ
				beq DRV.NULL.R
				
				cmp #IOCTL.OPEN
				bcc .9
				
				cmp #IOCTL.IRQ
				bcs .9
				
				rts

.9				jmp A2osX.BADCALL
*--------------------------------------
DRV.NULL.S		>LDYAI DRV.NULL.DIB
*--------------------------------------			
DRV.STATUS.YA	>STYA .2+1

				ldy #S.IOCTL.S
				lda (pIOCTL),y
				beq .1

				cmp #S.IOCTL.S.GETDIB
				bne .9

				ldx #S.DIB-1
				.HS 2C					bit abs
.1				ldx #3

				ldy #S.IOCTL.BUFPTR
				lda (pIOCTL),y
				sta .3+1
				iny
				lda (pIOCTL),y
				sta .3+2

.2				lda $ffff,x				SELF MODIFIED
.3				sta $ffff,x				SELF MODIFIED
				dex
				bpl .2

				clc
				rts

.9				lda #MLI.E.BADCTL
				sec
				rts
*--------------------------------------
DRV.NULL.R		ldx #C.EOF

				ldy #S.IOCTL.BYTECNT
				lda #1
				sta (pIOCTL),y
				iny
				dec
				sta (pIOCTL),y

				ldy #S.IOCTL.BUFPTR
				lda (pIOCTL),y
				sta .1+1
				iny
				lda (pIOCTL),y
				sta .1+2
.1				stx $ffff				SELF MODIFIED

				clc
				rts
*--------------------------------------
DRV.NULL.DIB	.DA #S.DIB.S.WRITE+S.DIB.S.READ+S.DIB.S.OPENED
				.DA #0,#0,#0
				.PS "NULL Device"
				.BS 5
				.DA #S.DIB.T.CHAR
				.DA #0
				.DA K.VER
*--------------------------------------
MAN
SAVE usr/src/sys/kernel.s.drv
LOAD usr/src/sys/kernel.s
ASM
