 .PAGE 'BLOCK COMMAND'
;  ROM 1.1 ADDITIONS
; USER COMMANDS
 .SKIP
USER LDY CMDBUF+1
 CPY #'0
 BNE US10 ;0 RESETS PNTR
 .SKIP
USRINT LDA #<UBLOCK ;SET DEFAULT BLOCK ADD
 STA USRJMP
 LDA #>UBLOCK
 STA USRJMP+1
 RTS
 .SKIP
US10 JSR USREXC ;EXECUTE CODE BY TABLE
 JMP ENDCMD
 .SKIP
USREXC DEY ;ENTRY IS(((INDEX-1)AND$F)*2)
 TYA
 AND #$F
 ASL A
 TAY
 LDA (USRJMP)Y
 STA IP
 INY
 LDA (USRJMP)Y
 STA IP+1
 JMP (IP)
 .PAGE 'BLOCK COMMANDS'
; OPEN DIRECT ACCESS BUFFER
;  FROM OPEN "#"
 .SKIP
OPNBLK LDX CMDSIZ
 DEX
 BNE OB10
 .SKI
 LDA #1 ;GET ANY BUFFER
 JSR GETRCH
 JMP OB30
 .SKIP
OB05 LDA #NOCHNL
 JMP CMDERR
 .SKIP
OB10 LDY #1 ;BUFFER # IS REQUESTED
 JSR BP05
 LDX FILSEC
 CPX #BAMJOB ;MUST BE LESS THAN 13.
 BCS OB05
 .SKI
 LDA #0
 STA TEMP
 STA TEMP+1
 SEC
 .SKI
OB15
 ROL TEMP
 ROL TEMP+1
 DEX
 BPL OB15
 .SKI
 LDA TEMP
 AND BUFUSE
 BNE OB05 ;BUFFER IS USED
 LDA TEMP+1
 AND BUFUSE+1
 BNE OB05 ;BUF IS USED
 .SKI
 LDA TEMP
 ORA BUFUSE ;SET BUFFER AS USED
 STA BUFUSE
 LDA TEMP+1
 ORA BUFUSE+1
 STA BUFUSE+1
 .SKI
 LDA #0 ;SET UP CHANNEL
 JSR GETRCH
 LDX LINDX
 LDA FILSEC
 STA BUF0,X
 .SKI
OB30 LDX SA
 LDA LINTAB,X ;SET LINDX TABLE
 ORA #$40
 STA LINTAB,X
 .SKI
 LDY LINDX
 LDA #$FF
 STA LSTCHR,Y
 .SKIP
 LDA #RNDRDY
 STA CHNRDY,Y ;SET CHANNEL READY
 .SKIP
 LDA BUF0,Y
 STA CHNDAT,Y ;BUFFER # AS 1ST CHAR
 ASL A
 TAX
 LDA #1
 STA BUFTAB,X
 LDA #DIRTYP+DIRTYP
 STA FILTYP,Y ;SET DIRECT FILE TYPE
 JMP ENDCMD
 .PAGE
; BLOCK COMMANDS
BLOCK LDY #0
 LDX #0
 LDA #'- ;"-" SEPARATES CMD FROM SUBCMD
 JSR PARSE ;LOCATE SUB-CMD
 BNE BLK40
 .SKI
BLK10 LDA #BADCMD
 JMP CMDERR
 .SKI
BLK30 LDA #BADSYN
 JMP CMDERR
 .SKI
BLK40 TXA
 BNE BLK30
 .SKI
 LDX #NBCMDS-1 ;FIND COMMAND
 LDA CMDBUF,Y
BLK50 CMP BCTAB,X
 BEQ BLK60
 DEX
 BPL BLK50
 BMI BLK10
 .SKI
BLK60
 TXA
 ORA #$80
 STA CMDNUM
 JSR BLKPAR ;PARSE PARMS
 .SKI
 LDA CMDNUM
 ASL A
 TAX
 LDA BCJMP+1,X
 STA TEMP+1
 LDA BCJMP,X
 STA TEMP
 .SKI
 JMP (TEMP) ;GOTO COMMAND
 .SKI
BCTAB .BYT 'AFRWEP'
NBCMDS =*-BCTAB
 .SKIP
BCJMP .WORD BLKALC ;BLOCK-ALLOCATE
 .WORD BLKFRE ;BLOCK-FREE
 .WORD BLKRD ;BLOCK-READ
 .WORD BLKWT ;BLOCK-WRITE
 .WORD BLKEXC ;BLOCK-EXECUTE
 .WORD BLKPTR ;BLOCK-POINTER
 .SKIP
BLKPAR LDY #0 ;PARSE BLOCK PARMS
 LDX #0
 LDA #':
 JSR PARSE
 BNE BP05 ;FOUND ":"
 .SKIP
 LDY #3 ;ELSE CHAR #3 IS BEGINNING
BP05 LDA CMDBUF,Y
 CMP #' 
 BEQ BP10
 .SKI
 CMP #29 ;SKIP CHARACTER
 BEQ BP10
 .SKI
 CMP #',
 BNE BP20
 .SKIP
BP10 INY
 CPY CMDSIZ
 BCC BP05
 .SKIP
 RTS ;THAT'S ALL
 .SKIP
BP20 JSR ASCHEX
 INC F1CNT
 LDY F2PTR
 CPX #MXFILS-1
 BCC BP10
 .SKIP
 BCS BLK30 ;BAD SYNTAX
 .SKIP
; CONVERT ASCII TO HEX (BINARY)
;  & STORE CONVERSION IN TABLES
;  .Y= PTR INTO CMDBUF
ASCHEX LDA #0
 STA TEMP
 STA TEMP+1
 STA TEMP+3
 .SKIP
 LDX #$FF
AH10 LDA CMDBUF,Y ;TEST FOR DEC #
 CMP #$40
 BCS AH20 ;NON-NUMERIC TERMINATES
 CMP #$30
 BCC AH20 ;NON-NUMERIC
 .SKIP
 AND #$F
 PHA
 LDA TEMP+1 ;SHIFT DIGITS (*10)
 STA TEMP+2
 LDA TEMP
 STA TEMP+1
 PLA
 STA TEMP
 INY
 CPY CMDSIZ
 BCC AH10 ;STILL IN STRING
 .SKIP
AH20 STY F2PTR ;CONVERT DIGITS TO...
 CLC ;...BINARY BY DEC TABLE
 LDA #0
 .SKIP
AH30 INX
 CPX #3
 BCS AH40
 .SKIP
 LDY TEMP,X
AH35 DEY
 BMI AH30
 .SKIP
 ADC DECTAB,X
 BCC AH35
 .SKIP
 CLC
 INC TEMP+3
 BNE AH35
 .SKIP
AH40 PHA
 LDX F1CNT
 LDA TEMP+3
 STA FILTRK,X ;STORE RESULT IN TABLE
 PLA
 STA FILSEC,X
 RTS
 .SKIP
DECTAB .BYT 1,10,100 ;DECIMAL TABLE
 .SKIP
;BLOCK-FREE
BLKFRE JSR BLKTST
 JSR FRETS
 JMP ENDCMD
 .SKIP
;BLOCK-ALLOCATE
BLKALC JSR BLKTST
 LDX DRVNUM
 LDA IPBM,X
 STA BMPNT+1
 .SKIP
BA10 JSR AVAIL
BA20 JSR AV2
 BCS BA40 ;SEARCH FOR NEXT AVAIL SECTOR
 .SKIP
 LDX SECTOR
 INX
 STX SECTOR
 STX ERWORD ;SET NOT AVAIL FLAG
 CPX R0
 BCC BA20
 .SKIP
 LDA #0
 STA SECTOR
 LDX TRACK
 INX
 STX TRACK
 CPX #36
 BCS BA30
 .SKIP
 JSR BT05
 JMP BA10
 .SKIP
BA30 STA TRACK
BA35 LDA #NOBLK
 JMP CMDER2
 .SKIP
BA40 LDX ERWORD ;FINISHED SEARCH 
 BNE BA35 ;BLOCK WAS'NT AVAILABLE
 .SKIP
 JSR USEDTS ;BLOCK AVAIL, SET AS USED
 JMP ENDCMD
 .SKIP
; BLOCK READ SUBS
BLKRD2 JSR BKOTST ;TEST PARMS
 JMP DRTRD
 .SKIP
GETSIM JSR GETPRE ;GET BYTE W/O INC
 LDA (BUFTAB,X)
 RTS
 .SKIP
; BLOCK READ
BLKRD3 JSR BLKRD2
 LDA #0
 JSR SETPNT
 JSR GETSIM ;Y=LINDX
 
 .SKIP
 STA LSTCHR,Y
 LDA #RNDRDY
 STA CHNRDY,Y
 RTS
BLKRD
 JSR BLKRD3
 JSR RNGET1
 JMP ENDCMD
 .SKIP
;USER DIRECT READ, LSTCHR=$FF
UBLKRD
 JSR BLKPAR
 JSR BLKRD3
 LDA LSTCHR,Y
 STA CHNDAT,Y
 LDA #$FF
 STA LSTCHR,Y
 JMP ENDCMD ;(RTS)
 .SKIP 2
;BLOCK-WRITE
BLKWT JSR BKOTST
 .SKIP
 JSR GETPNT
 TAY
 DEY
 CMP #2
 BCS BW10
 LDY #1
 .SKIP
BW10 LDA #0 ;SET RECORD SIZE
 JSR SETPNT
 TYA
 JSR PUTBYT
 TXA
 PHA
 .SKIP
BW20 JSR DRTWRT ;WRITE BLOCK
 PLA
 TAX
 JSR RNGET2
 JMP ENDCMD
 .SKIP
;USER DIRCT WRITE, NO LSTCHR
UBLKWT JSR BLKPAR
 JSR BKOTST
 JSR DRTWRT
 JMP ENDCMD
 .SKIP
;IN .FILE VECTOR:
;*=$FFFA-6 ;USER DIRECT ACCESS
;UBLOCK .WORD UBLKRD
;       .WORD UBLKWT
 .SKIP 2
;BLOCK-EXECUTE
BLKEXC JSR BLKRD2 ;READ BLOCK & EXECUTE
 LDA #0
 .SKIP
BE05 STA TEMP
 LDX JOBNUM
 LDA BUFIND,X
 STA TEMP+1
 JSR BE10 ;INDIRECT JSR
 JMP ENDCMD
 .SKIP
BE10 JMP (TEMP)
 .SKIP 2
;BUFFER-POINTER, SET BUFFER POINTER 
BLKPTR JSR BUFTST
 LDA JOBNUM
 ASL A
 TAX
 LDA FILSEC+1
 STA BUFTAB,X
 JSR GETPRE
 JSR RNGET2 ;SET UP GET
 JMP ENDCMD
 .SKIP
;TEST FOR ALLOCATED BUFFER..
;  ..RELATED TO SA
BUFTST LDX F1PTR
 INC F1PTR
 LDA FILSEC,X
 TAY
 DEY
 DEY
 CPY #BAMJOB
 BCC BT20
 .SKIP
BT15 LDA #NOCHNL
 JMP CMDERR
 .SKIP
BT20 STA SA
 JSR FNDRCH
 BCS BT15
 JSR GETACT
 STA JOBNUM
 RTS
 .SKIP
;TEST BLOCK OPERATION PARMS
BKOTST JSR BUFTST
;
;TEST FOR LEGAL BLOCK &..
;  ..SET UP DRV, TRK, SEC
BLKTST LDX F1PTR
 LDA FILSEC,X
 AND #1
 STA DRVNUM
 LDA FILSEC+2,X
 STA SECTOR
 LDA FILSEC+1,X
 STA TRACK
BT05
 JSR TSCHK
 STA R0
 JMP SETLDS ;(RTS)
 .SKIP
 .END
