OUP-M/BDOS.s

2478 lines
61 KiB
ArmAsm

12640 ;OUP/M BDOS WRITTEN BY SHAO, JIAN - XIONG
12650 ;ERROR NO. LISTING
12660 ;$02 DISK NO. TOO LARGE
12670 ;$03 FUNCTION NO. TOO LARGE
12680 ;$04 DISK WRITING PROTECTION
12690 ;$05 DUPLICTED FILE WHEN MAKE FILE
12700 ;$06 CHECK AREA NOT MATCH
12710 ;$07 FILE WRITING PROTECTION
12720 ;$08 FILE NOT OPEN
12730 *=$D93A
12740 START=$00 ;WARM BOOT ADDR.
12750 IOBYTE=$03 ;I/O BYTE
12760 CREG=$08 ;WORK STORAGE
12770 DEREG=$09
12780 HLREG=$08
12790 HLREG1=$0D
12800 USERSP=$10
12810 RTNFLG=$18 ;RETURN FLAG
12820 TEMP=$1F
12830 CDTDRN=$25 ;'DR' RESERVATION
12840 SCNPTS=$38 ;SCREEN LINE START POINTER
12850 CHRNUB=$3E ;CHAR. NOS IN INPUT BUFFER
12860 CSBUFS=$3F ;OFFSET OF LAST CHAR TO
12870 ;STARING ADDRESS OF THE BUFFER
12880 COUNT=$3D
12890 BRHTAB=$DBC3 ;BDOS
12900 ADCOFS=$DC80
12910 STRTFG=$DFDA
12920 RETURN=$E3D8
12930 R$TURN=$E3EE
12940 WBOOT=$E477 ;BIOS
12950 CSLTET=$E560
12960 CLINN=$E57A
12970 CLOUTT=$E591
12980 LITOUT=$E5A9
12990 ERROR=$E928
13000 BANBAC .BYTE$00 ;NO. COUNTER OF BACK SPACE
13010 PRTFLG .BYTE$00 ;PRINTER ON/OFF FLAG
13020 SCNPNT .BYTE$00 ;SCREEN LINE COUNTER
13030 PRECHR .BYTE$00 ;PREVIOUS CHARACTER
13040 WMBCOT .BYTE$2D ;
13050 ;
13060 BDOS=*
13070 ;
13080 STX CREG ;STORE PARAMETERS
13090 STA DEREG
13100 STY DEREG+1
13110 LDA #$00 ;INIT. SOME LOCATIONS FOR
13120 STA CRTDRN ;RETURN ROUTINE
13130 STA RTNFLG
13140 STA RTNFLG+1
13150 STA RTNFLG+2
13160 LDA #RETURN-1/256
13170 PHA ;SET RETURN ROUTINE ADDR.
13180 LDA #RETURN-1
13190 PHA
13200 LDA CREG ;CHECK FUNCTION NO. LEGALITY
13210 CMP #$29
13220 BCC B$0S
13230 LDA #$03 ;IF ILLEGAL, ERR!
13240 JMP ERROR
13250 B$OS=*
13260 ASL A
13270 LDX #BRHTAB ;ADDRESS FROM BRHTAB
13280 STX HLREG
13290 LDX #BRHTAB/256
13300 STX HLREG+1
13310 LDY #$00
13320 STY TEMP
13330 JSR ADCOFS
13340 LDA (HLREG),Y
13350 STA HLREG1
13360 INY
13370 LDA (HLREG),Y
13380 STA HLREG1+1
13390 LDA DEREG
13400 JHP (HLREG1) ;JMPE TO DESIRED ROUTINE
13410 REV1*=*+40
13420 ;
13430 ;******************************************************
13440 ;*
13450 ;* FUNCTION 0 : SYSTEM RESET
13460 ;*
13470 ;********************************************************
13480 ;*
13490 ;* ENTRY PARAMETERS :
13500 ;* REGISTER X : $00
13510 ;*
13520 ;*******************************************************
13530 ;
13540 SYMRST=*
13550 ;
13560 JMP WBOOT;
13570 ;
13580 INCHR=* ;GET A CHARACTER FROM CONSOLE
13590 ;
13600 LDA PRECHR
13610 BEQ I$CHR
13620 LDX #$00
13630 STX PRECHR
13640 RTS
13650 I$CHR=*
13660 LDX #$00
13670 STX PRECHR
13680 JMP CLINK
13690 RESV2*=*+4
13700 ;
13710 ;*****************************************************
13720 ;*
13730 ;* FUNCTION 1 : CONSOLE INPUT
13740 ;*
13750 ;*****************************************************
13760 ;*
13770 ;* ENTRY PARAMETERS :
13780 ;* REGISTER X : $01
13790 ;*
13800 ;* RETURNED VALUE :
13810 ;* REGISTER A : ASCII CHARACTER
13820 ;*
13830 ;***************************************************
13840 ;
13850 CSLIN=*
13860 ;
13870 JSR INCHR ;GET A CHAR FROM CONSOLE
13880 JSR C$LIN ;HANDLING CONTROL CHARACTER
13890 BCC CS$IN ;IF CONTROL CHAR EXCEPT
13900 ;'CR','LF','BA','TAB',THEN RETURN
13910 PHA
13920 JSR CSLOUT
13930 PLA
13940 CS$IN=*
13950 JMP STRTFG
13960 C$LIN=*
13970 CMP #$011 ;'CR'?
13980 BNE CSLIN1
13990 RTS
14000 CSLIN1=*
14010 CMP #$0A ;'LF'?
14020 BNE CSLIN2
14030 RTS
14040 CSLIN2=*
14050 CMP #$09 ;'TAB'?
14060 BNE CSLIN3
14070 RTS
14080 CSLIN3=*
14090 CMP #$08 ;'BA'?
14100 BNE CSLIN4
14110 RTS
14120 CSLIN4=*
14130 CMP #$20
14140 RTS
14150 ;
14160 INTPHD=* ;INTERUPTING CHAR HANDLING
14170 ;
14180 LDA PRECHR ;CHECK IF THERE IS A PREVIOUS CHAR
14190 BNE INTPH$
14200 JSR CSLTET ;TEST IF CONSOLE IS READY
14210 AND #$01
14220 BEQ I$TPHD
14230 JSR CLINN ;IF READY,READ A CHAR.
14240 CMP #$13 ;CONTROL-S?
14250 SHE IN%PHD
14260 INT$HD=*
14270 JSR CLINN ;IF IT IS CONTROL-S,WAIT UNTIL NEXT
14280 ;CHAR COMING IN.
14290 CMP #$03 ;CONTROL-C?
14300 SHE INTP$D
14310 JMP $0000 ;IF IS,TO WARM BOOT
14320 INTP$B=.
14330 LDA $00 ;IF ANOTHER CHARACTER,RETURN
14340 RTS
14350 INSPHD=*
14360 STA PRECHR ;WHEN FIRST RENDING IS NOT CTRL-S
14370 ;STORE IT TO PREV. CHAR. LOCATION
14380 INTPH$=*
14390 LDA IBFF
14400 ISTPHD=*
14410 RTS
14420 ;
14430 OUTCHR=* ;OUTPUT A CHARACTER
14440 ;
14450 PHA
14460 LDA BANBAC ;TO SEE IF THIS IS FROMN 'BA'
14470 SHE OSTCHR ;IF IS,NOT OUTPUT TO CSL
14480 JSR INTPHD ;HANDLING INTERUPTING CHAR.
14490 PLA
14500 PHA
14510 JSR CLOUTT ;OUTPUT TIS CHAR TO CONSOLE
14520 PLA
14530 PHA
14540 LDX PRTFLG ;TO SEE IF PRINTER
14550 BEQ OSTCHR
14560 JSR LITOUT ;IF ON,ALSO SENT TO PRINTER.
14570 OSTCHR=*
14580 PLA
14590 CMP #$7F ;IF IS 'DEL' ,RETURN,THAT IS, NOT
14600 ;INCREASING SCNPNT
14610 BNE OUSCHR
14620 RTS
14630 OUSCHR=*
14640 INC SCNPNT ;IF IT LESS THAN $7F, GREATER THEN
14650 ;EQUALTO $20, SCNPNT INCREASED
14660 ;BY 1
14670 CMP #$20
14680 BCC OUT$HR
14690 RTS
14700 OUT$HR=*
14710 DEC SCNPNT ;IF IT IS CTRL CHAR.,THAT IS, LESS
14720 ;THAN $20
14730 LDX SCNPNT ;THEN, NOTCHANGE SCNPNT
14740 BNE OUTC$R
14750 RTS
14760 OUTC$R=*
14770 CMP #$08 ;IF IS 'BA',SCNPNT DECREASED BY 1
14780 ONE OUTCH$
14790 DEC SCNPNT
14800 RTS
14810 OUTCH$=*
14820 CMP #$0A ;IF IS 'LF',SCNPNT SHOULD BE SET
14830 ;TO ZERO
14840 ONE OUTC$$
14850 LDA #$00
14860 STA SCNPNT
14870 OUTC$$=1
14880 RTS
14890 CSLOU$=*
14900 JSR C$LIN ;DISTINGUISH CTRL & NO-CTRL CHAR
14910 BCS CSLOUT ;EXCEPT 'CR','LF','BA','TAB'
14920 PHA
14930 LDA #$5E ;IF CTRL CHAR, OUTPUT '~', FOLLOWED
14940 ;BY A CHAR CORRES, THIS DESIRED
14950 ;CONTROL CHARACTER
14960 JSR OUTCHR
14970 PLA
14980 ORA #$40
14990 ;
15000 ;*******************************************************
15010 ;*
15020 ;* FUNCTION 2 : CONSOLE OUTPUT *
15030 ;*
15040 ;********************************************************
15050 ;*
15060 ;* ENTRY PARAMETERS :
15070 ;* REGISTER X : $02
15080 ;* REGISTER A : ASCII CHARACTER
15090 ;*
15100 ;*******************************************************
15110 ;
15120 CSLOUT=*
15130 ;
15140 CMP #$09 ;CHECK FOR 'TAB'
15150 BEQ C$LOUT
15160 JMP OUTCHR
15170 CLOUT=*
15180 LDA #$20 ;IF IS 'TAB',OUTPUT SOME SPACE TO
15190 JSR OUTCHR ;FIT THE NEEDS OF THE 'TAB'
15200 LDA SCNPNT
15210 AND #$07
15220 ONE C$LOUT
15230 RTS
15240 RESV*=*+1
15250 ;
15260 ;
15270 ;
15280 ;
15290 ;
15300 ;
15310 ;
15320 ;*****************************************************
15330 ;*
15340 ;* FUNCTION 3 : LIST OUTPUT
15350 ;*
15360 ;******************************************************
15370 ;*
15380 ;* ENTRY PARAMETERS :
15390 ;* REGISTER X : $03
15400 ;******************************************************
15410 ;
15420 LITOTT=*
15430 ;
15440 JMP LITOUT
15450 ;
15460 ;*******************************************************
15470 ;*
15480 ;* FUNCTION 4 : DIRECT CONSOLE I/0
15490 ;*
15500 ;********************************************************
15510 ;*
15520 ;* ENTRY PARAMETERS :
15530 ;* REGISTER X : $04
15540 ;* REGISTER A : $FF (INPUT) OR CHAR(OUTPUT)
15550 ;*
15560 ;* RETURNED VALUE :
15570 ;* REGISTER A : CHARACTER OR STATUS
15580 ;*
15590 ;*******************************************************
15600 ;
15610 DRCSIO=*
15620 ;
15630 TAX
15640 INX ;CHECK FOR INPUT OR OUTPUT
15650 BEQ D$CSIO
15660 JMP CLOUTT ;OUTPUT THIS CHARACTER
15670 D$CSIO=*
15680 JSR CSLTET ;TEST IF CONSOLE IS READY INPUT
15690 AND #$01
15700 BEQ DR$SIO ;IF NOT READY,RETURN
15710 JSR CLINN ;INPUT A CHARACTER
15720 DR$SIO=*
15730 JMP STRTFG
15740 REESV*=*+3
15750 ;
15760 ;
15770 ;
15780 ;
15790 ;
15800 ;
15810 ;
15820 ;
15830 ;
15840 ;
15850 ;
15860 ;********************************************************
15870 ;*
15880 ;* FUNCTION 5 : BUFFER OUTPUT
15890 ;*
15900 ;********************************************************
15910 ;*
15920 ;* ENTRY PARAMETERS :
15930 ;* REGISTER X : $05
15940 ;* REGISTER Y,A : STARTING ADDRESS OF THE BUFFER
15950 ;*
15960 ;******************************************************
15970 ;
15980 OUTBUF=*
15990 ;
16000 LDY #$00
16010 OU$BUF=*
16020 LDA (DEREG),Y
16030 CMP #$24 ;'$'?
16040 BNE O$TBUF ;IF IS,END
16050 RTS
16060 O$TBUF=*
16070 JSR CSLOUT ;IF NOT,OUTPUT THIS CHARACTER UNTIL
16080 ;$ IS MET.
16090 INY
16100 BNE OU$BUF
16110 INC DEREG+1
16120 BNE OU$BU
16130 ;
16140 BKSPAC=* ;BACK SPACE ONE CHARACTER
16150 ;
16160 JSR B$SPAC
16170 LDA 11,20
16180 JSR CLOUTT
16190 B$SPAC=*
16200 LDA #$08
16210 JMP CLOUTT
16220 ;
16230 NWLNHD=* ;POSITION CURSOR TO THE LOCA. OF NEW
16240 ;LINE CORRESPONDING TO THE ORIGINAL
16250 ;POSITION IN CURRENT LINE
16260 LDA #$23 ;OUTPUT # TO ENDED CURRENT LINE
16270 JSR OUTCHR
16280 JSR CRLFHD ;CURSOR TO A NEW LINE
16290 NW$NHD=*
16300 LDA SCNPNT ;POSITION CURSOR TO THE LOCA.
16310 ;CORRESPONDING THE ORIGINAL ONE
16320 CMP SCNPTS
16330 BCC N$LNHD
16340 RTS
16350 N$LNHD=*
16360 LDA #$20
16370 JSR OUTCHR
16380 JMP NW$NHD
16390 ;
16400 CRLFH11=*: ;CR AND LF HANDLING
16410 ;
16420 LDA #$011
16430 JSR OUTCHR
16440 LDA #$0A
16450 JMP OUTCHR
16460 ;
16470 ;*******************************************************
16480 ;*
16490 ;* FUNCTION 6 : READ CONSOLE BUFFER
16500 ;*
16510 ;*******************************************************
16520 ;*
16530 ;* ENTRY PARAMETERS ;
16540 ;* REGISTER X ; $06
16550 ;* REGISTER Y,A: STARTING ADDRESS OF THIS BUFFER *
16560 ;*
16570 ;* RETURNED VALUE :
16580 ;* CONSOLE CHARACTERS IN THE BUFFER
16590 ;*
16600 ;*******************************************************
16610 ;
16620 RDCSBF=*
16630 ;
16640 CLD
16650 LDA SCNPNT ;STORE THE INIT VALUE OF SCREEN
16660 ;LINE POINTER TO SCREEN STAR POINTER
16670 STA SCNPTS
16680 LDA #$00
16690 LDY #$01
16700 STA CHRNUB ;KEEP COUNTER OF CURRENT CHAR.S
16710 STY CSBUFS ;AND OFFSET OF THE LAST CHAR TO START
16720 ;ADDRESS OFTHEBUFFER.
16730 RD$SBF=*
16740 JSR INCHR ;GET A CHARACTER
16750 AND #$7F
16760 CMP #30D ;'CR'?
16770 BEQ RD$$$F
16780 CMP #$0A ;'LF'?
16790 BNE RDC$$$
16800 RD$$$F=*
16810 JMP RDC$$F
16820 RDC$$$=*
16830 CMP 1308 ;'BA`?
16840 BNE RDC$BF
16850 LDA CHRNUB ;'BA' HANDLING
16860 BEQ RD$SBF
16870 DEC CHRNUB ;COUNTER DECREASE BY 1
16880 LDA SCNPNT ;STORE SCREEN LINE POINTER
16890 STA BANBAC ;TO BACK SPACE NUMBER ACCOUNTER
16900 JMP RD$$BF
16910 RDC$BF=*
16920 NOP
16930 CMP #$7F ;'DEL'?
16940 BNE RDCS$F
16950 LDX CHRNUB
16960 BEQ RD$SBF
16970 DEC CHRNUB ;NUMBER ACCOUNTER AND BUFFER
16980 DEC CSBUFS ;OFFSET DECREASE BY 1 TO ELIMMINATE
16990 ;THE LAST WORD
17000 JMP RD$SB$
17010 RDCS$F=*
17020 CMP #$05 ;CONTROL-E?
17030 BNE RDCSB$
17040 JSR CRLFHD ;GIVING A 'CR','LF'COMMAND
17050 LDA #$00 ;SET SCREEN START POINTER TO ZERO
17060 STA SCNPTS
17070 JMP RD$SBF ;GET NEXT CHARACTER
17080 RDCSB$=*
17090 CMP #$10 ;CONTROL-P?
17100 BNE R$$SBF
17110 LDA #$B0 ;REVERSE THE PRINTER FLAG
17120 FOR PRTFLG
17130 STA PRTFLG
17140 JMP RD$SBF ;GET NEXT CHARACTER
17150 R$$SBF-*
17160 CMP #$18 ;'CONTROL-X '?
17170 BNE R$C$BF
17180 RDCSB1=*
17190 LDA SCMPTS ;KEEP BACKING SPACE UNTIL THE START
17200 ;POSITION OF CURRENT LINE ARRIVED
17210 CMP SCNPNT
17220 BCS RDCSBF
17230 DEC SCNPNT
17240 JSR BKSPAC
17250 JMP RDCSB1
17260 R$C$BF=*
17270 CMP #$15 ;'CONTROL U'?
17280 BNE R$CS$F
17290 JSR NWLNHD ;CREATE A NEW LINE
17300 JMP RDCSBF
17310 R$CS$F=*
17320 CMP #$12 ;'CONTROL-R'?
17330 BNE R$CSB$
17340 RD$$BF=*
17350 JSR NWLNHD ;NEW LINE HANDLING
17360 LDY #$01 ;START TO WRITE A NEW LINE FROM THE
17370 ;FIRST CHARCACTER OF CURRENT LINE IN
17380 ;CONSOLE BUFFER
17390 STY CSBUFS
17400 LDA CHRNUB
17410 STA TEMP
17420 RIICSB2=*
17430 BEQ RD$S$F
17440 INC CSBUFS ;INCRE. OFFSET TO WRITE NEXT CHAR
17450 LDY CSBUFS
17460 LDA (DEREG),Y
17470 JSR CSLOU$ ;WRITE NEXT CHARACTER
17480 DEC TEMP
17490 JMP RDCSB2
17500 RD$S$F=1
17510 LDA BANBAC ;IF AL CHAR HAVE RETYPED,CHECK FOR
17520 BNE RDCSBS
17530 JMP RD$SBF ;IF BANBAC=0
17540 RDCSB5=*
17550 SEC
17560 SBC SCNPNT ;TO FIND THE DIFFERENCE NO. BETWEEN
17570 ;CURRENT ACCOUNTER AND PREVIOUS
17580 ;ACCOUNTER
17590 STA BANBAC
17600 RDCSB3=*
17610 JSR BKSPAC ;BACK SPACE UNTIL CURRENT ACCOUNTER
17620 DEC BANBAC ;MATCHING PREVIOUS ONE
17630 BNE RDCSB3
17640 JMP RD$SBF
17650 R$C3B$=*
17660 INC CSBUFS ;SET UFFSET TO CURRENT CHAR.
17670 LDY CSBUFS
17680 STA (DEREG),Y ;STORE THE CHAR INTO CORRESPONDING
17690 ;LOCATIONN
17700 INC CHRNUB ;INCREASING CHR NUMBER 1
17710 RD$SB$=*
17720 PHA
17730 JSR CSLOU$ ;TYPE IT
17740 PLA
17750 CMP #$03 ;CHECK FOR CONTROL-C
17760 BNE RDCSB4
17770 LDA CHRNUB
17780 CMP #$01
17790 BNE RDCSB4
17800 JMP $0000 ;IF IS CTRL-C AND IN STARTING
17810 ;POSITION,GO TO WARM BOOT
17820 REICSB4=*
17830 NOP
17840 NOP
17850 LDY #$00 ;TO COMPARE CHAR NO. WITH MAX NO.
17860 LDA (DEREG),Y
17370 CMP CHRNUB
17880 BEQ RDC$$F
17890 JMP RD$SBF ;IF LESS THAN,GET NEXT CHAR.
17900 RDC$$F=*
17910 LDY #$01 ;STORE CHR NO. TO CONSOLE BUFFER
17920 ;WHEN RETURN
17930 LDA CHRNUB
17940 STA (DEREG),Y
17950 JMP CRLFHD
17960 ;
17970 ;
17980 ;
17990 ;
18000 ;
18010 ;
18020 ;*******************************************************
18030 ;*
18040 ;* FUNCTION 7 : GET INPUT/OUTPUT BYTE
18050 ;*
18060 ;*******************************************************
18070 ;*
18030 ;* ENTRY PARAMETERS :
18090 ;* REGISTER X : $07
18100 ;*
18110 ;* RETURNED VALUE :
18120 ;* REGISTER A : INPUT/OUTPUT BYTE VALUE
18130 ;*
18140 ;*******************************************************
18150 ;
18160 GTIOBY=*
18170 ;
18180 LDA IOBYTE
18190 JMP STRTFG
18200 ;
18210 ;*******************************************************
18220 ;*
18230 ;* FUNCTION 8 : SET INPUT/OUTPUT BYTE
18240 ;*
18250 ;******************************************************* *
18260 ;*
18270 ;* ENTRY PARAMETERS :
18280 ;* REGISTER X : $08
18290 ;* REGISTER A : INPUT/OUTPUT BYTE VALUE
18300 ;*
18310 ;*******************************************************
18320 ;
18330 STIOBY=*
18340 ;
18350 STA IOBYTE
18360 RTS
18370 ;
18380 ;******************************************************* *
18390 ;*
18400 ;* FUNCTION 9 : GET CONSOLE STATUS *
18410 ;*
18420 ;******************************************************* *
18430 ;*
18440 ;* ENTRY PARAMETERS :
18450 ;* REGISTER X : $09
18460 ;*
18470 ;* RETURNED VALUE :
18480 ;* REGISTER A : CONSOLE STATUS
18490 ;*
18500 ;*******************************************************
18510 ;
18520 GTCLST=*
18530 ;
18540 JSR INTPHEI
18550 JNP STRTFG
18560 *=$DBCO
18570 START=$00
18580 CREG=$08
19590 DEREG=$09
18600 HLREG=$08
18610 HLREG1=$0D
18620 FLAG=$0F ;BIT3:'1' FOR BUILD UP CHECK AREA
18630 ;BIT4:'1' FOR R/W SECTOR
18640 ;BIT5:'1' FOR ADD MAP BIT
18650 ;BIT6:'1' FOR WRITE
18660 ;BIT7:'1' FOR DIR ENTRY FINISH
18670 DIRBFA=$12 ;DIR BUFFER
18680 MAPBFA=$14 ;MAP AREA
18690 CHKBFA=$16 ;CHECK AREA
18700 RTNFLG=$18 ;THREE RETURN FLAGS
18710 DRERNB=$1C ;DIR ENTRY#
18720 DREROF=$1D ;DIR ENTRY OFFSET
18730 TEMP=$1F
18740 BLKNUB=$21 ;BLOCK NUMBER
18750 TRKNUB=$22 ;TRACK NUMBER
18760 TEMP1=$23
18770 PRVDSK=$24 ;PREVIOUS DISK#
18780 CRTDRN=$25 ;RESERVED FOR DR OF FCB
18790 CMERCT=$27 ;NUMBER OF MATCHING FCB WITH DIR
18800 DERDSK=$29 ;DESIRED DISK#
18810 RTNFG1=$2A ;AXULIRARY RETURN FLAG
18820 FLAG2=$2C
18830 CRRCNB=$2D ;CR
18840 TLRCNB=$2E ;RC
18850 EXNTNB=S2F ;EX
18860 SECNUB=$30 ;SECTOR# WITHIN A TRACK
18870 TEMP2=$37
18880 BKRBLK=$31 ;BACK BLOCK#
18890 ADVBLK=$33 ;ADVANCED BLOCK#
18900 BKOSFG=$35 ;BLOCK OFFSET FLAG
18910 BLKOFS=$36 ;BLOCK OFFSET
18920 IOBFFG=$39 ;'FLUSH' FLAG
18930 CRTDSK=$3A ;CURRENT DISK NO.
18940 CBADRV=$55 ;RESERVED FOR SERCH NEXT
18950 FLAG1=$58
18960 SYMRST=$D9A6 ;BDO1
18970 CSLIN=$D9C0
18980 CSLOUT=$DA5C
18990 LITOTT=$DA71
19000 DRCSIO=$DA74
19010 OUTBUF=$DA8B
19020 RDCSBF=$DACD
19030 GTIOBY=$D8B2
19040 STIOBY=$D8B7
19050 GTCLST=$DBBA
19060 PAMTAB=$E41F ;BIOS
19070 LITOUT=$E5A9
19080 HOMEHD=$E5F5
19090 DKSEL1=$E643
19100 SETTR1=$E665
19110 SETSC1=$E668
19120 SETBL1=$E66B
19130 STDMA1=$E66E
19140 WRTIRK=$E822
14150 RWDBS1=$E887
19160 ERROR=$E928
19170 SIOBDK=$E90A
19180 DFBUFA=$E965
19190 DIRBUF=$EB65
19200 MAPAR0=$ED65
19210 MAPAR1=$EDA5
19220 CHKAR0=SEDE5
19230 CHKAR1=$EDF3
19240 FLCTBK=$EE01
19250 IOBUF=$B000
19260 USERCD .BYTE $01 ;USER CODE
19270 WPTVCT .BYTE $00 ;R/O VECTOR
19280 LOGVTR .BYTE $00 ;LOGIN VECTOR
19290 ;BRANCH TABLE
19300 BRHTAB .WORD SYMRST,CSLIN,CSLOUT,LITOTT,DRCSIO
19310 .WORD OUTBUF,RDCSBF,GTIOBY,STIOBY,GTCLST
19320 .WORD RSDKSM,GTLGVT,GTCRDK,GTMPLT,SETWPT
19330 .WORD GTROVT,GTDKPA,SGTUCD,SETDMA,SELDSK
19340 .WORD MAKFIL,DELFIL,OPNFIL,CLSFIL,RDRCSO
19350 .WORD WTRCSO,RDRCRM,WIRCRM,SHFIST,SHNEXT
19360 .WORD RENAME,CHATRB,CPFISZ,STRDRC,SIODSK
19370 ;
19380 ;*******************************************************
19390 ;*
19400 ;* FUNCTION 10 : RESET DISK SYSTEM
19410 ;*
19420 ;*******************************************************
19430 ;*
19440 ;* ENTRY PARAMETERS :
19450 ;* REGISTERX : $0A
19460 ;*
19470 ;*******************************************************
19480 ;
19490 RSDKSM=*
19500 ;
19510 LDA #$00 ;INITIALIZE WRITING PROTECT VECTOR
19520 STA LOGVTR ;& DISK LOG VECTOR
19530 STA WPTVCT
19540 STA DERDSK ;SELECT DISK A
19550 JSR S$LDSK
19560 LDA #DFBUFA ;SELECT DEFAULT BUF FOR DMA
19570 LDX #DFBUFA/256
19580 JMF STDMA1
19590 ;
19600 ;
19610 ;
19620 ;*******************************************************
19630 ;*
19640 ;* FUNCTION 11 : GET LOGIN VECTOR
19650 ;*
19660 ;*******************************************************
19670 ;*
19680 ;* ENTRY PARAMETERS :
19690 ;* REGISTER X : $0B
19700 ;*
19710 ;* RETURNED VALUE :
19720 ;* REGISTER A : LOGIN VECTOR
19730 ;*
19740 ;******************************************************
19750 ;
19760 GTLGVT=*
19770 ;
19780 LDA LOGVTR
19790 JMP STRTFG
19800 ;
19810 ;*******************************************************
19820 ;*
19830 ;* FUNCTION 12 : GET CURRENT DISK NUMBER *
19840 ;*
19850 ;*******************************************************
19860 ;*
19870 ;* ENTRY PARAMETERS :
19830 ;* REGISTER X : $0C
19890 ;*
19900 ;* RETURNED VALUE :
19910 ;* REGISTER A : CURRENT DISK NUMBER
19920 ;*
19930 ;*******************************************************
19940 ;
19450 GTCRDK=*
19960 LDA CRTDSK
19970 JMP STRTFG
19980 ;
19990 ;********************************************************
20000 ;*
20010 ;* FUNCTION 13 : GET MAP ADDRESS OF CURRENT DISK *
20020 ;*
20030 ;********************************************************
20040 ;*
20050 ;* ENTRY PARAMETERS :
20060 ;* REGISTER X : $0D
20070 ;*
20080 ;* RETURNED VALUE :
20090 ;* REGISTER Y,A : MAP ADDRESS OF CURRENT DISK *
20100 ;*
20110 ;********************************************************
20120 ;
20130 GTMPLT=*
20140 ;
20150 LDA MAPBFA
20160 STA RTNFLG+1
20170 LDA NAPBFA+1
20180 STA RTNFLG+2
20190 RTS
20200 ;
20210 ;********************************************************
20220 ;*
20230 ;* FUNCTION 14 : SET WRITING PROTECT VECTOR
20240 ;*
20250 ;********************************************************
20260 ;*
20270 ;* ENTRY PARAMETERS :
20280 ;* REGISTER X : $0E
20290 ;*
20300 ;****************************************************
20310 ;
20320 SETWPT=*
20330 ;
20340 LDA CRTDSK ;GET BIT PATTERN FOR CURRENT
20350 JSR BNYBIT ;DISK
20360 ORA WPTVCT
20370 STA WPTVCT ;SET R/O FOR CURRENT DISK
20380 RTS
20390 ;
20400 ;********************************************************
20410 ;*
20420 ;* FUNCTION 15 : GET READ ONLY VECTOR
20430 ;*
20440 ;******************************************************
20450 ;*
20460 ;* ENTRY PARAMETERS :
20470 ;* REGISTER X : $0F
20480 ;*
20490 ;* RETURNED VALUE :
20500 ;* REGISTER A : READY ONLY VECTOR
20510 ;*
20520 ;********************************************************
20530 ;
20540 GTROVT=*
20550 ;
20560 LDA WPTVCT
20570 JMP STRTFG
20580 ;
20590 ;
20600 ;
20610 ;
20620 ;
20630 ;
20640 ;
20650 ;
20660 ;
20670 ;
20680 ;
20690 ;
20700 ;*****************************************************
20710 ;*
20720 ;* FUNCTION 1 6 : GET PARAMETER TABLE ADDRESS OF
20730 ;* CURRENT DISK
20740 ;*
20750 ;*****************************************************
20760 ;*
20770 ;* ENTRY PARAMETERS :
20780 ;* REGISTER X : $10
20790 ;*
20800 ;* RETURNED VALUE :
20810 ;* REGISTER Y,A : PARAMETER TABLE ADDRESS
20820 ;*
20830 ;********************************************************
20840 ;
20850 GTDKPA=*
20860 ;
20870 LDA CRTOSK
20880 LDX #$03
20890 JSR ASLDSR
20900 LDX #PAMTAB ;GET CORRES. ADDR.
20910 STX HLREG
20920 LDX #PAMTAB/256
20930 STX HLREG+1
20940 LDX #$00
20950 STX TEMP
20960 JSR ADCOFS
20970 LOA HLREG ;RETURN THE ADDR.
20980 STA RTNFLG+1
20990 LOA HLREG+1
21000 STA RTNFLG+2
21010 RTS
21020 ;
21030 ;*********************************************************
21040 ;*
21050 ;* FUNCTION 17 : SET/GET USERCODE
21060 ;*
21070 ;*********************************************************
21080 ;*
21090 ;* ENTRY PARAMETERS :
21100 ;* REGISTER X : $11
21110 ;* REGISTER A : $FF (GET) OR USERCODE (SET)
21120 ;*
21130 ;* RETURNED VALUE :
21140 ;* REGISTER A :CURRENT CODE OR (NO VALUE)
21150 ;*
21160 ;*********************************************************
21170 ;
21180 SGTUCD=*
21190 CMP #$FF ;CHECK WETHER SET OR GET
21200 ONE S$TUCD
21210 LDA USERCD ;GET IT
21220 JMP STRTFG
21230 S$TUCD=*
21240 AND #$1F
21250 STA USERCD ;GET IT
21260 RTS
21270 ;
21280 ;*********************************************************
21290 ;*
21300 ;* FUNCTION 18 : SET DMA ADDRESS
21310 ;*
21320 ;*****************************************************
21330 ;*
21340 ;* ENTRY PARAMETERS :
21350 ;* REGISTER X : $12
21360 ;* REGISTER Y,A : DMA ADDRESS
21370 ;
21380 ;*********************************************************
21390 ;
21400 SETDMA=*
21410 ;
21420 LDA DEREG
21439 LUX DEREG+1
21440 JMP STDMA1
21450 ;
21460 ASLDSR=* ;VALUE*(2**(X))
21470 ; ;WHERE VALUE IS IN A & TEMP
21480 ;
21490 ASL A
21500 ROL TEMP
21510 DEX
21520 BNE ASLDSR
21530 RTS
21540 ;
21550 ADCOFS=* ;ADD OFFSET TO THE ADDR.
21560 ;
21570 CLC
21530 ADC HLREG
21590 STA HLREG
21600 LDA TEMP
21610 ADC HLREG+1
21620 STA HLREG+1
21630 RTS
21640 ;
21650 GETENT=* ;GET DESIRED DIR ENTRY ADDR.
21660 ;
21670 LDA DIRBFA
21680 STA HLREG
21690 LDA DIRBFA+1
21700 STA HLREG+1
21710 LDA DREROF+1
21720 STA TEMP
21730 LDA DREROF
21740 JMP ADCOFS
21750 ;
21760 BNYBIT=* ;ENTRY:A BINARY
21770 ;EXIT:A BIT PATTERN
21780 ;
21790 TAX
21800 LDA #$01
21810 B$YBIT=*
21820 DEX
21830 BMI BN$BIT
21840 ASL A
21850 JMP B$YBIT
21860 BN$BIT=*
21870 RTS
21880 ;
21890 ;FOR THE INPUT PHYSICAL BLOCK NO.IN A &TEMP
21900 ;CACULATE THE CORRS. BYTE OFFSET FROM BIT MAP
21910 ;AND STORE IT TO Y,THE BIT PATTERN WITHIN THE
21920 ;BYTE ANDSTORE IT TO A
21930 ;
21940 GTMAPB=*:
21950 ;
21960 PHA ;LOW BYTE R-SHIFT 3 TIMES
21970 LSR A
21980 LSR A
21990 LSR A
22000 LDX #$05
22010 G$MAPB=*
22020 ASL TEMP ;HIGH BYTE L-SHIFT 5 TIMES
22030 DEX
22040 BNE G$MAPB
22050 ORA TEMP ;THE RESULT: PHY. BLOCK NO./8
22060 TAY
22070 PLA
22080 AND #$07 ;GET THE CORRES. BIT PATTERN
22090 STA TEMP+1
22100 LDA #$07
22110 SEC
22120 SBC TEMP+1
22130 JMP BNYBIT
22140 ;
22150 GTBKNB=* ;GET PHYSICAL BLOCK NO.
22160 ;AND STORE IN A & TEMP
22170 ;
22180 LDA #$00
22190 STA TEMP
22200 LDA (HLREG1),Y ;GET LOGICAL BLOCK NO.
22210 LDX #$01 ;AND *2
22220 JSR ASLDSR
22230 TAX
22240 TYA
22250 LSR A ;ODD OR EVEN?
22260 BCS G$BKNB ;ODD, -1
22270 JSR G$BKNB ;EVEN, -2
22280 G$BKNB=*
22290 CPX #$00
22300 BNE GT$KNB
22310 DEC TEMP
22320 GT$KNB=*
22330 DEX
22340 TXA
22350 RTS
22360 ;
22370 MDFMPB=* ;BUILD OR MODIFY BIT MAP
22380 ;
72390 JSR GTBKNB ;GET PHSICAL BLOCK NO.
22400 JSR GTMAPB
22410 PHA
22420 LDA #$20 ;ADD OR DELETE?
22430 BIT FLAG
22440 BEQ M$FMPB
22450 PLA
22460 ORA (MAPBFA),Y ;SET CORRES. BIT
22470 STA (MAPBFA),Y
22480 RTS
22490 M$FMPB=*
22500 PLA
22510 EOR #$FF
22520 AND (MAPBFA),Y ;RESET CORRES. BIT
22530 STA (MAPBFA),Y
22540 RTS
22550 ;
22560 MDFMAP=* ;BUILD OR MODIFY BIT MAP FOR
22570 ;WHOLE ENTRY'
22580 ;
22590 LDA HLREG ;DIR ADDR. STORE TO HLREG1
22600 STA HLREG1
22610 LDA HLREG+1
22620 STA HLREG1+1
22630 LDY #$0F
22640 MD$MAP=*
22650 INY
22660 CPY #$20 ;16 BYTES DONE?
22670 BNE M$FMAP ;NO, KEEP DOING
22680 RTS
22690 M$FMAP=*
22700 LDA (HLREG1),Y ;GET LOGICAL BLOCK NO.
22710 BEQ MD$MAP ;IF 0, SKIP IT
22720 STY TEMP1
22730 JSR MDFMPB ;IF NO 0, MODIFY CORRE. BIT MAP
22740 LDY TEMP1
22750 JMP MD$MAP
22760 ;
22770 ADDDIR=* ;GET THE CHECKSUM OF THE DIR
22780 ;BLOCK AND STORE IT TO X & TEMP
22790 ;EXIT:X,TEMP SUM OF WHOLE DIR
22800 ;
22810 LDX #$02
22820 LDY #$00
22830 LDA #$00
22840 A$DDIR=*
22850 CLC ;ADD UP ALL BYTES IN THE BLOCK
22860 ADC (HLREG),Y
22870 BCC AD$DIR
22880 INC TEMP
22890 AD$DIR=*
22900 INY
22910 BNE A$DDIR
22920 INC HLREG+1
22930 DEX
22940 BNE A$DDIR ;TWO PAGE DONE?
22950 TAX
22960 RTS
22970 ;
22980 DIRCHK=* ;BUILD OR CHECK CHECKSUM
22990 ;
23000 LDA BLKNUB ;GET OFFSET FROM CHECKSUM AREA
23010 LDX #$01 ;FOR DESIRED DIR BLOCK
23020 JSR ASLDSR
23030 PHA
23040 LDA #$00 ;SET DIR BUFFER ADDR.
23050 STA TEMP
23060 LDA DIRBFA
23070 STA HLREG
23080 LDA DIRBFA+1
23090 STA HLREG+1
23100 JSR ADDDIR ;GET CKECKSUM FOR THIS DIR BLOCK
23110 PLA
23120 TAY
23130 TXA
23140 LDA #$08
23150 BIT FLAG ;BUILD OR CHECK?
23160 BNE D$RCHK
23170 TXA ;CHECKING CHECKSUM
23180 CMP (CHKBFA),Y
23190 BNE DI$CHK
23200 INY
23210 LDA TEMP
23220 CMP (CHKBFA),Y
23230 BNE DI$CHK
23240 RTS
23250 DI$CHK=*
23260 JSR SETWPT ;IF NOT MATCH, SET CORRES. DISK
23270 LDA #$06 ;TO R/O AND DISPALY ERR
23280 JMP ERROR
23290 D$RCHK=*
23300 TXA ;BUILDING CHECKSUM
23310 STA (CHKBFA),Y
23320 INY
23330 LDA TEMP
23340 STA (CHKBFA),Y
23350 RTS
23360 ;
23370 DSKPRM=* ;GET CORRES. DISK PARAMS.
23380 ;& STORE THEM TO DIRBFA,MAPBFA
23390 ;AND CHKBFA
23400 ;
23410 LDA CRTDSK
23420 JSR DKSELI
23430 LDY #$05
23450 D$KPRM=*
23460 LDA (HLREG),Y
23470 STA DIRBFAsY
23480 DEY
23490 BPL D$KPRM
23500 ;
23510 RWDRBK=* ;READ OR WRITE DIR BLOCK
23520 ;
23530 JSR R$DRBK ;SET DIR BUFFER FOR DMA
23540 JSR RWDBS1 ;R/W A DIR BLOCK
23550 LDA #DFBUFA ;RECOVE DMA TO DEFAULT BUFFER
23560 LDX #DFBUFA/256
23570 JMP STDMA1
23580 R$DRBK=*
23590 LDA DIRBFA
23600 LDX DIRBFA+1
23610 JMP STDMA1
23620 ;
23630 RDDIRB=* ;READ DIR BLOCKS TO DIR BUFFER
23640 ;AND BUILD UP CHECKSUM
23650 ;
23660 INC DRERNB ;SET CURRENT ENTRY NO,
23670 LDA DRERNB
23680 CMP #$70 ;112 ENTRIES DONE?
23690 BCC R$DIRB
23700 LDA #$80 ;IF DONE, SET FLAG DONE
23710 ORA FLAG
23720 STA FLAG
23730 RTS
23740 R$DIRB=*
23750 AND #$0F ;GET CORRES, ENTRY OFFSET
23760 LDX #$05 ;AWAY FROM THE DIR BUFFER
23770 LDY #$00
23780 STY TEMP
23790 JSR ASLDSR
23800 STA DREROF ;STORE IT
23810 LDA TEMP
23820 STA DREROF+1
23830 ORA DREROF ;FIRST ENTRY?
23840 BEQ BDD$RB
23850 BIT FLAG1
23860 BMI BDD$RB
23870 RTS ;IF NO, RETURN
23880 BDD$RB=*
23890 STA FLAG1
23900 LDA DRERNB
23910 AND #$F0
23920 LSR A
23930 LSR A
23940 LSR A
23950 LSR A
23960 STA BLKNUB ;SET BLOCK NO.
23970 JSR SETBL1
23980 LDA #$03
23990 STA TRKNUB ;SET DIR TRACK NO.
24000 JSR SETTR1
24010 JSR RWDRBK ;READ THIS DIR BLOCK
24020 JMP DIRCHK ;BUILD UP CHECKSUM
24030 ;
24040 BUDMAP=* ;BUILD UP BIT MAP FOR
24050 ;CURRENT DISK'
24060 ;
24070 LDA #$00 ;INIT. BIT MAP TO 0
24080 LDY #$3 F
24090 B$DMAP=*
24100 STA (MAPBFA),Y
24110 DEY
24120 BPL B$DMAP
24130 LDA #$F F ;INIT. ENTRY COUNTER
24140 STA DRERNB
24150 LDA #$2 8 ;SET FLAG INDICATING READ BLOCK
24160 STA FLAG ;, BUILD BIT AMAP & CHECKSUM
24170 BUD$AP=*
24180 JSR RDDIRB ;READ A DIR BLOCK
24190 BIT FLAG ;112 ENTRIES DONE?
24200 BPL BUSMAP
24210 RTS ;YES, RETURN
24220 BU$MAP=*
24230 JSR GETENT ;GET CORRES. ENTRY ADDR.
24240 LDA $#E5
24250 LDY #$00
24260 CMP (HLREG),Y
24270 BEQ BUD$AP ;SKIP THE EMPTY ONE
24280 JSR MDFMAP ;BUILD UP THE BIT MAP FOR THE ENTRY
24290 JMP BUDSAP
24300 ;
24310 LGNMAP=* ;LOG IN CURRENT DISK
24320 ;
24330 JSR DSKPRM ;GET DISK PARA. FOR CURRENT DISK
24340 LDA CRTDSK
24350 JSR BNYBIT ;GET BIT PATTERN
24360 BIT LOGVTR
24370 BEQ L$GMAP
24380 RTS
24390 L$GMAP=*
24400 ORA LOGVTR
24410 STA LOGVTR ;LOG IN CURRENT DISK
24420 JMP BUDMAP ;BUILD UP BIT MAP & CHECKSUM
24430 RESV11*=*+3
24440 ;
24450 ;
24460 ;
24470 ;
24480 ;
24490 ;
24500 ;*********************************************************
24510 ;*
24520 ;* FUNCTION 19 : SELECT DISK
24530 ;*
24540 ;**********************************************************
24550 ;*
24560 ;* ENTRY PARAMETERS :
24570 ;* REGISTER X : $13
24580 ;* REGISTER A : SELECT DISK
24590 ;*
24600 ;**********************************************************
24610 ;
24620 SELDSK=*
24630 ;
24640 STA DERDSK ;CHECK LEGALITY
24650 CMP #$02
24660 BCC SE$DSK
24670 LDA #$02
24680 JMP ERROR
24690 SE$DSK=*
24700 CMP CRTDSK ;=CURRENT DISK?
24710 BNE S$LDSK ;IF NOT, SELECT IT AS CURRENT
24720 RTS
24730 S$LDSK=*
24740 JSR SIOBDK ;SEND LAST TRACK IN BUF TO DISK
24750 LDA DERDSK
24760 STA CRTDSK
24770 JMP LGNMAP ;BUILD UP BIT MAP & CHECKSUM FOR IT
24780 ;
24790 MDFYS2=* ;SET FCB.S2 TO INDICATE FCB HAS BEEN
24800 ;ACTIVED
24810 ;
24820 LDY #$0E
24830 LDA #380
24840 STA (DEREG),Y
24850 RTS
24860 ;
24870 FCBINZ=* ;SELECT DISK ACCORDING TO FCB
24880 ;PUT USER'S CODE TO FCB. DR
24890 ;
24900 LDA #$FF ;INIT. RETURN FLAG
24910 STA RTNFLG
24920 LDY #$00
24930 LDA (DEREG),Y ;CURRENT DISK IS DESIRED?
24940 AND #$1F
24950 BEQ F$BINZ
24960 STA DERDSK ;IF NOT, STORE IT AS DESIRED
24970 DEC DERDSK
24980 LDA CRTDSK ;KEEP CURRENT DISK
25990 STA PRVDSK
25000 LDA (DEREG),Y
25010 STA CRTDRN
25020 AND #$E0
25030 STA (DEREG),Y
25040 LDA DERDSK ;SELECT DESIRED DISK
25050 JSR SELDSK
25060 F$BINZ=*
25070 LDA USERCD ;STORE USERCODE TO FCB.DR
25080 LDY #$00
25090 ORA ( DEREG ),Y
25100 STA (DEREG),Y
25110 RTS
25120 ;
25130 TETWPT=* ;TEST FOR DISK WRITING PROTECT
25140 ;
25150 JSR T$TWPT
25160 BNE TE$WPT
25170 RTS
25130 TE$WPT=*
25190 LDA #$04
25200 JMP ERROR
25210 T$TWPT=*
25220 LDA CRTDSK
25230 JSR BNYBIT
25240 BIT WPTVCT
25250 RTS
25260 ;
25270 FBDRMH=* ;MATCHING FCB WITH DIR
25230 ;
25290 LDA #$FF ;INIT. ENTRY COUNTER
25300 STA RTNFG1
25310 FBD$$$=*
25320 STA DRERNB
25330 STX CMERCT ;KEEP MATCH NUMBERS
25340 FBDR$$=*
25350 LDA #$00 ;SET CHECKING,DIR NOT FINISH
25360 STA FLAG ;AND READING BLOCK FLAG
25370 FB$RMH=*
25380 JSR RDDIRB ;READA DIR BLOCK
25390 BIT FLAG ;112 ENTRIES DONE?
25400 BMIFBD$$H
25410 JSR GETENT ;IF NOT, GET DESIRED ENTRY ADDR.
25420 LDX CMERCT
25430 DEX ;TEST FOR MAKING FILE
25440 BEQ FED$MH
25450 INX
25460 LDY I$FF
25470 F$DRMH=*
25480 INY
25490 DEX
25500 BMIFBDR$H ;YES, FILE NAMEFOUND
25510 CPY #$0D
25520 BEQ F$DRMH
25530 LDA (DEREG),Y ;GET CURRENT CHAR AND MATCH IT
25540 JMP F$$RMH
25550 FBD$MH=*
25560 LDA #$E5 ;IF MAKE FILE, MATCH $E5
25570 LDY #$00 ;TO FIND AN EMPTY ENTRY
25580 FS$RMH=*
25590 CMP #$3F ;'?'?
25600 BEQ F$DRMH
25610 SEC
25620 SBC (HLREG),Y
25630 AND #$7F
25640 BEQ F$DRMH ;NEXT BYTE EXPECTED
25650 BNE FB$RMH ;NEXT ENTRY EXPECTED
25660 FBDR$H=*
25670 LDA DRERNB ;IF MATCH FOUND, SET MATCKED
25680 STA RTNFLG+1 ;ENTRYNO.
25690 STA RTNFG1
25700 RTS
25710 FBD$$H=*
25720 LDA #$F F ;IF NOT, SET $FF
25730 STA RTNFLG+1
25740 RTS
25750 ;
25760 PTFBBK=* ;PUT FCB TO DISK
25770 JSR GETENT ;GET DESIRED ENTRY ADDR,.
25780 LDY #$00
25790 P$FBDK=*
25800 LDA (DEREG),Y ;COPY DESIRED CHARS. FROM FCB
25810 STA (HLREG),Y ;TO DIR ENTRY
25820 INY
25830 DEX
25840 BNE P$FBDK
25850 PT$BDK=*
25860 LDA #$48
25870 ORA FLAG ;SET WRITING BLOCK FLAG
25880 STA FLAG
25890 JSR DIRCHK
25900 LDA BLKNUB ;SET DIR BLOCK
25910 JSR SETBL1
25920 LDA #$03 ;SET DIR TRACK NO.
25930 JSR SETTR1
25940 JMP RWDRBK ;WRITE DIR BLOCK TO DISK
25950 ;
25960 MKFILE=*
25970 ;
25980 JSR TETWPT ;DISK WRITE PROTECTED
25990 LDA #$10 ;ORIGINAL MAKING?
26000 BIT FLAG2
26010 BEQ M$FILE
26020 LDX #$0C
26030 JSR FBDRMH ;YES, CHECK FOR DUPLICATION
26040 BIT FLAG
26050 BMI M$FILE
26060 LDA #$05 ;IF DUPLICATED, ERR
26070 JMP ERROR
26080 M$FILE=*
26090 LDX #$01
26100 JSR FBDRMH ;GO TO FIND AN EMPTY DIR
26110 BIT FLAG ;MATCHED?
26120 BPL MK$ILE
26130 RTS
26140 MK$ILE=*
26150 LDY #$0D
26160 LDA #$00
26170 MKF$LE=*
26180 STA (DEREG),Y ;RESET REST BYTE IN FCB TO 0
26190 INY
26200 CPY$$20
26210 BNEMKF$LE
26220 LDX$$20
26230 JSR PTFBDK ;WRITE IT BACK TO DIR TRACK
26240 JMP MDFYS2 ;SET BIT 7 OF S2 TO INDICATE ACTIVED
26250 ;
26260 ;******************************************************* *
26270 ;*
26280 ;* FUNCTION 20 : MAKE FILE *
26290 ;*
26300 ;******************************************************* *
26310 ;*
26320 ;* ENTRY PARAMETERS :
26330 ;* REGISTER X : $14
26340 ;* REGISTER Y,A : FCB ADDRESS
26350 ;*
26360 ;* RETURNED VALUE :
26370 ;* REGISTER A : $FF DIRECTORY SPACE OVERFLOW
26380 ;* DIRECTORY ENTRY NUMBER IF SUCCESS*
26390 ;*
26400 ;******************************************************* ;
26410 ;
26420 MAKFIL=*
26430 ;
26440 JSR FCBINZ
26450 LDA #$10 ;SET BIT 4 OF FLAG2 TO INDICATE
26460 STA FLAG2 ;ORIGINAL MAKING
26470 JMP MKFILE
26480 ;
26490 SETRTN=*
26500 ;
26510 LDA RTNFG1
26520 JMP STRTFG
26530 ;
26540 TETFWT=* ;TEST FOR FILE WRITE PROTECT
26550 ;
26560 JSR GETENT ;GET DIR ENRTRY ADDR.
26570 LDY #$09 ;GET DIR.T1 AND CHECK IT'S BIT 7
26580 LDA (HLREG),Y
26590 TE$FWT=*
26600 ASL A
26610 BCS T$TFWT
26620 RTS
26630 T$TEWT=*
26640 LDA #$07
26650 JMP ERROR
26660 ;
26670 DLFILE=*
26680 ;
26690 JSR TETWPT ;DISK WRITE PROTECTED
26700 LDX #$0C ;FIND DESIRED DIR ENTRY
26710 JSR FBDRMH
26720 DL$ILE=*
26730 BIT FLAG
26740 BPL D$FILE
26750 RTS
26760 D$FILE=*
26770 JSR TETFWT ;FILE WRITE PROTECTED
26780 JSR GETENT ;GET DESIRED ENTRY ADDR.
26790 LDY #$00 ;SET $E5 TO INDICATE DELETED
26800 LDA #$E 5
26810 STA (HLRE6),Y
26820 JSR MDFMAP ;MODIFY MAP
26830 JSR PT$BDK ;PUT DIR TO DISK
26840 JSR FBDR$$
26850 JMP DL$ILE ;KEEP DOING, TILL ALL DONE
26860 RESV12*=*+3
26870 ;
26380 ;*******************************************************
26690 ;*
26900 ;* FUNCTION 2 1 : DELETE FILE
26910 ;*
26920 ;*******************************************************
26930 ;*
26940 ;* ENTRY PARAMETERS :
26950 ;* REGISTER X : $15
26960 ;* REGISTER Y,A: FCB ADDRESS
26970 ;*
26980 ;* RETURNED VALUE :
26990 ;* REGISTER A : $FF FILE NOT FOUND
27000 ;* DIRECTORY ENTRY NUMBER IF SUCCESS *
27010 ;*
27020 ;*******************************************************
27030 ;
27040 DELFIL=*
27050 ;
27060 JSR FCBINZ
27070 JSR DLFILE
27080 JMP SETRTN
27090 ;
27100 CPDRFB=* ;COPY DIR ENTRY TO FCB
27110 ;
27120 JSR GETENT
27130 LDY #$00
27140 C$DRFB=*
27150 LDA (HLREG),Y
27160 STA (DEREG),Y
27170 INY
27180 CPY #$20
27190 BNE C$DRFB
27200 RTS
27210 ;
27220 OPFILE=*
27230 ;
27240 LDX #$0D ;FIND DESIRED DIR ENTRY
27250 JSR FBDRMH
27260 BIT FLAG
27270 BPL O$FILE
27280 RTS
27290 O$FILE=*
27300 JSR CPDRFB ;COPY DIR ENTRY TO FCB
27310 JMP MDFYS2
27320 ;
27330 ;*******************************************************
27340 ;*
27350 ;* FUNCTION 22 : OPEN FILE
27360 ;*
27370 ;*******************************************************
27380 ;*
27390 ;* ENTRY PARAMETERS :
27400 ;* REGISTER X : $16
27410 ;* REGISTER Y,A : FCB ADDRESS
27420 ;*
27430 ;* RETURNED VALUE :
27440 ;* REGISTER A : $FF FILE NOT FOUND
27450 ;* DIRECTORY ENTRY NUMBER IF SUCCESS *
27460 ;*
27470 ;*******************************************************
27480 ;
27490 OPNFIL=*
27500 ;
27510 JSR FCBINZ
27520 JMP OPFILE
27530 ;
27540 CLFILE=*
27550 ;
27560 LDA #$00
27570 STA RTNFLG+1
27580 JSR TETWPT ;DISK WRITE PROTECTED
27590 LDY #$0E
27600 LDA (DEREG),Y
27610 ASL A
27620 ASL A
27630 BCS C$FILE
27640 RTS
27650 C$FILE=4
27660 LDX #$0D ;FIND A MATCHED ENTRY
27670 JSR FBDRMH
27680 BIT FLAG
27690 BPL CL$ILE
27700 RTS
27710 CL$ILE=*
27720 JSR GETENT ;GET THE ADDR.
27730 LDY #$10
27740 CLFI$$=*
27750 ;COPY FILE LOCATION AREA IN FCB TO THE DIR ENTRY'
27760 ;NOTE : IF (CORRS. BYTES NOT MATCH) AND (NONE OF '
27770 ;THEM ARE 0 , THEN ERR. OTHERWISE, COPY NONE 0 BYTE'
27780 ;TO 0 BYTE IF ONE OF THEM IS 0; OR LEAVE MATCHED'
27790 ;PAIR ALONE'
27800 LDA (DEREG),Y ;COPY FILE LOCATION AREA IN FCB
27810 BNE CLF$LE
27820 LDA (HLREG),Y
27830 STA (DEREG),Y
27840 CLF$LE=*
27850 LDA (HLREG),Y
27860 BNE CLFI$E
27870 LDA (DEREG),Y
27880 STA (HLREG),Y
27890 CLFI$E=*
27900 LDA (DEREG),Y
27910 CMP (HLREG),Y
27920 BNE CLFIL$
27930 INY
27940 CPY #$20
27950 BNE CLF#$$
27960 LDY #$0F ;COPY 'RC' FROM FCB TO DIR ENTRY
27970 LDA (DEREG),Y
27980 STA (HLREG),Y
27990 JMP PT$BDK ;PUT DIR BLOCK TO DISK
28000 CLFIL$=*
28010 DEC RTNFLG+1 ;IF ERR, SET $FF TO INDICATE NOT SUECC.
28020 RTS
28030 ;
28040 ;*********************************************************
28050 ;*
28060 ;* FUNCTION 23 : CLOSE FILE
28070 ;*
28080 ;*********************************************************
28090 ;*
28100 ;* ENTRY PARAMETERS :
28110 ;* REGISTER X : $17
28120 ;* REGISTER Y,A: FCB ADDRESSS;
28130 ;*
28140 ;* RETURNED VALUE :;
28150 ;* REGISTER A : $FF FILE NOT FOUND;
28160 ;* DIRECTORY ENTRY NUMBER IF SUCCESS
28170 ;*
28180 ;*********************************************************
28190 ;
28200 CLSFIL=*
28210 ;
28220 JSR FCBINZ
28230 JMP CLFILE
28240 ;
28250 STRTFG=* ;SET RETURN FLAG
28260 ;
28270 STA RTNFLG+1
28280 RTS
28290 ;
28300 FLEDRT=* ;FILE END RETURN
28310 ;
23320 LDA #$01
28330 JMP STRTFG
23340 ;
28350 GETREC=* ;GET RC,EX,CR AND STORE THEM
28360 ;
28370 LDY #$0C
28380 LDA (DEREG),Y
28390 STA EXNTNB
28400 LDY #$0F
28410 LDA (DEREG),Y
28420 STA TLRCNB
28430 LDY #$20
28440 LDA (DEREG),Y
28450 STA CRRCNB
28460 RTS
28470 ;
28480 TETOPN=* ;;TEST FOR FCB OPENING
28490 ;
28500 LDY #$0E
28510 LDA (DEREG),Y
28520 ASL A
28530 RCS T$TOPN
28540 LDA #$08
28550 JMP ERROR
28560 T$TOPN=*
28570 RTS
28580 ;
28590 GTBKOF=* ;KNOWING FCB.RC TO GET CURRENT
28600 ;POSITION IN FCB FILE LOCATION AREA'
28610 ;TO Y AND SECTOR# WITHIN THIS BLOCK
28620 ;TO TEMP2
28630 ;
28640 LDA #$03
28650 AND CRRCNB
28660 STA TEMP2
28670 LDA CRRCNB
28680 LSR A
28690 LSR A
28700 CLC
28710 ADC #$10
28720 TAY
28730 RTS
28740 ;
28750 GTRLBS=* ;GET PHYSICAL BLOCK NO. AND
28760 ;SECTOR NO. WITHIN THE BLOCK
28770 ;
28780 JSR GTBKOF ;GET CURRENT POSITION AND
28790 ;SECTOR NO. WITIHIN THE BLOCK
28800 LDA (DEREG),Y ;GET LOGICAL BLOCK NO.
28810 BEQ G$RLBS ;SKIP 0
28820 LDX DEREG
28830 SIX HLREG ;CACULATE PHYSICAL BLOCK NO.1
28340 LDX DEREG+1
28850 STX HLREGI+1
28360 JSR GTBKNB
28870 LDX #$01
28380 GSRLBS=*
28890 RTS
28900 ;
28910 GTTKSC=* ;GET TRACK# AND PHYSICAL SECTOR
28920 ;WITHIN THIS TRACK
28930 ;ENTRY PHYSICAL BLOCK# IN A,TEMP
28940 ;EXIT X TRACK#,A PHYSICAL SECTOR
28950 ;
28960 LDX #$FF
28970 G$TKSC=*
28980 SEC
28990 INX ;BLOCK# DIV 7 TO GET TRACK NO.
29000 SBC #$07
29010 BCS GSTKSC
29020 DEC TEMP
29030 BPL G$TKSC
29040 ADC #$07 ;BLOCK# MOD 7
29050 ASL A
29060 ASL A ;(BLOCK# MOD 7)*4
29070 CLC
29080 ADC TEMP2 ;ADDING THE SECTOR NO. WITHIN
29090 ;THE BLOCK TO GET SECTOR NO. '
29100 ;WITHIN THE TRACK
29110 PHA
29120 TXA
29130 SED
29140 ADC #$04 ;
29150 CLD
29160 TAX ;PUT TRACKNO.TO X
29170 PLA ;PUT SECTOR NO. TO A
29180 RTS
29190 ;
29200 RWSCDF=* ;READ A SECTOR INTO DEFAULT BUFFER
29210 ;
29220 STX TRKNUB
29230 JSR SETSC1
29240 TXA
29250 JSR SETTR1 ;SET TRACK NO.
29260 JMP RWDBS1
29270 ;
29280 MDFFCB=* ;MODIFY FCB TO FIT NEXT OPERATION
29290 ;
29300 BIT FLAG2 ;RAN. OR SEQ. MODE?
29310 BPL M$FFCB
29320 INC CRRCNB
29330 M$FFCB=*
29340 LDA CRRCNB
29350 LDY #$20
29360 STA (DEREG),Y ;STORE TO FCB.CR
29370 LDA TLRCNB
29380 LDY #$0F
29390 STA (DEREG),Y ;STORE TO FCB.RC
29400 RTS
29410 ;
29420 HDNTEN=* ;DEAL WITH NEXT EXTENT ENTRY
29430 ;
29440 JSR CLFILE ;CLOSE THE CURRENT EXTENT
29450 LDX RTNFLG+1 ;$FF MEANS NOT SUCCES.
29460 INX
29470 ONE H$NTEN ;SUCCES! CONTINUE.
29480 RTS
29490 H$NTEN=*
29500 LDY #$0C
29510 LDA #$01
29520 CLC
29530 ADC (DEREG),Y ;INCREAMENT 'EX' BY 1
29540 STA (DEREG),Y
29550 LDX #$0D ;FIND A CORRES. 'EX' IN DIR
29560 JSR FBDRMH
29570 BIT FLAG ;FOUND?
29580 BPL H$$TEN
29590 BIT FLAG2 ;IF NOT, CHHECK R OR W?
29600 BVC HDN$EN
29610 JMP FLEDRT ;IF R, ERR
29620 HDN$EN=*
29630 JSR MKFILE ;IF W, CREATE A NEW 'EX'
29640 BIT FLAG
29650 BPL HDNT$N
29660 LDA #$03
29670 JMP STRTFG
29680 H$$TEN=*
29690 JSR O$FILE ;COPY CORRES. BYTES IN DIR TO FCB
29700 HEINT$N=4
29710 JSR GETREC ;GET 'EX','RC','CR' AND STORE THEM
29720 LDA #$00
29730 JMP STRTFG ;SET SUCCES.FLAG
29740 ;
29750 RDRCS1=*
29760 ;
29770 JSR TETOPN ;FILE OPENED?
29780 LDA #$E0 ;SET FLAG2 TO INDICATE SEQ. R
29790 STA FLAG2
29800 RDRCS$=*
29810 JSR GETREC
29820 LDA CRRCNB ;'CR'<'RC'?
29830 CMP TLRCNB
29840 BCC R$RCSQ ;YES, GO AHEAD TO READ
29850 CMP #$40 ;NO, CHECK 'CR'=$40?
29860 BEQ RD$CSQ
29870 JMP FLEDRT ;IF NOT,ERR
29880 RD$CS0=*
29890 JSR HDNTEN ;CLOSE CURRENT 'EX', OPEN NEXT
29900 LDA #$00 ;RESET CRRCNB
29910 STA CRRCNB
29920 LDA RTNFLG+1 ;SUCCES.
29930 BEQ R3RCSO
29940 JMP STRTFG
29950 R$RCSQ=*
29960 JSR GTRLBS ;GET PHY. BLOCK NO.
29970 BNE RDRC$Q
29980 LDA #$02 ;IF CORRES. LOG. BLO. NO.=0, ERR
29990 JMP STRTFG
30000 RDRC$Q=*
30010 JSR GTTKSC ;GET TRACK NO. & SECTOR NO.
30020 LDY #$10
30030 STY FLAG
30040 JSR RWSCDF ;READ A SECTOR
30050 JMP MDFFCB ;MODIFY BIT MAP
30060 ;
30070 ;*******************************************************
30080 ;*
30090 ;* FUNCTION 24 : READ SEQUENTIALLY
30100 ;*
30110 ;*******************************************************
30120 ;
30130 ;* ENTRY PARAMETERS
30140 ;* REGISTER X : $18
30150 ;* REGISTER Y , A : FCB ADDRESS
30160 ;*
30170 ;* RETURNED VALUE
30180 ;* REGISTER A:$00 SUCCESS
30190 ;* $01 FILE END
30200 ;* $02 RECORD NOT IN DISK
30210 ;*
30220 ;*******************************************************
30230 ;
30240 RDRCSQ=1
30250 ;
30260 JSR FCBINZ
30270 JMP RDRCS1
30280 ;
30290 FNDEPT=* ;FIND EMPTY BLOCK,ENTRY A,TEMP
30300 ;PHY. BLOCK OF THE ONE BEFORE IT
30310 ;EXIT A,TEMP EMPTY PHY. BLOCK#
30320
30330 STA BKRBLK ;SET BK. & AD. COUNTER
30340 STA ADVBLK
30350 LDA TEMP
30360 STA BKRBLK+1
30370 STA ADVBLK+1
30380 LDA #$01 ;SET CURRENT POINTER ODD OR EVEN FLAG
30390 AND BLKOFS
30400 STA BKOSFG
30410 F$$EPT=*
30420 LDA BKRBLK ;BK. SEARCK REACH BOTTOM?
30430 ORA BKRBLK+1
30440 BEQ F$DEPT ;YES:GO TO AD. SEARCH
30450 FNS$PT=*
30460 LDA BKRBLK
30470 BNE FN$EPT ;BK. SEARCH
30480 DEC BKRBLK+1
30490 FN$EPT=*
30500 DEC BKRBLK
30510 LDA BKRBLK ;BK. COUNTER MATCH THE E/O FLAG SET BEF?
30520 AND #$01
30530 CMP BKOSFG
30540 BNE F$$EPT
30550 LDA BKRBLK ;NO, SKIP IT
30560 LDX BKRBLK+1 ;YES, GET CORRES. BYTE & BIT PATTERN
30570 STX TEMP ;IN BIT MAP AREA
30580 JSR GTMAPB
30590 TAX
30600 AND (MAPBFA),Y
30610 BNE F$DEPT ;OCCUPIED?
30620 TXA :YES: TO AD. SEARCH
30630 ORA (MAPBFA),Y ;NO,SET BIT MAP
30640 STA (MAPBFA),Y
30650 LDA BKRBLK+1
30660 STA TEMP ;BK. COUNTER AS FOUND PHY. BLOCK
30670 LDA BKRBLK ;NO. THEN RETURN
30680 RTS
30690 F$DEPT=*
30700 LDA ADVBLK
30710 CMP #$FF ;AD. SEARCH TOP REACHED?
30720 BNE FNDSPT
30730 LDA ADVBLK+1
30740 CMP #$01
30750 BEQ FNDE$T ;YES: TO CHECK IF BA. BOTTOM REACHED?
30760 FNDSPT=*
30770 INC ADVBLK ;INCREMENT AD. COUNTER BY 1
30780 BNE FNDE$$
30790 INC ADVBLK+1
30800 FNDE$$=*
30810 LDA ADVBLK ;THE SAME PROCESS AS IN BA. SEARCH
30820 AND #$01
30830 CMP BKOSFG
30840 BNE F$DEPT
30850 LDA ADVBLK
30860 LDX ADVELK+1
30870 STX TEMP
30880 JSR GTMAPB
30890 TAX
30900 AND (MAPBFA),Y
30910 BNE F$$EPT
30920 TXA
30930 ORA (MAPBFA),Y
30940 STA (MAPBFA),Y
30950 LDA ADVBLK+1
30960 STA TEMP
30970 LDA ADVBLK
30980 RTS
30990 FNDE$T=*
31000 LDX BKRBLK+1 ;BA. BOTTOM ALSO REACHED?
31010 INX
31020 BNE FN$$PT ;NO, TO BA. SEARCH
31030 LDA #$A8 ;REPORT MAP OVERFLOW
31040 STA FLAG2
31050 RTS
31060 ;
31070 RELFOM=* ;PHY. BLOCK# TO LOGICAL ONE
31080 ;EXIT X LOGICAL BLOCK#
31090 ;
31100 LDX TEMP
31110 STX TEMPI
31120 PHA
31130 INC BLKOFS ;GET CURRENT POSITION IN
31140 LDA BLKOFS ;FCB FILE LOCATION AREA
31150 LSR A ;EVEN OR ODD?
31160 PLA
31170 ADC #$01 ;EVEN/ADD 1;ODD,ADD 2
31180 BCC R$LFOM ;TO PHY. BLOCK#
31190 INC TEMP1
31200 R$LFOM=*
31210 LSR A ;DIVIDED BY 2
31220 LSR TEMPI
31230 BCC RE$FOM
31240 ORA #$80
31250 RE$F0M=*
31260 TAX
31270 DEC BLKOFS
31280 RTS
31290 ;
31300 WTRCS1=*
31310 ;
31320 JSR TETOPN ;OPENED?
31330 LDA #$A0 ;SET FALG2 TO INDICATE SEQ. W
31340 STA FLAG2
31350 WTRCS$=*
31360 JSR TETWPT ;DISK W PROTECTED?
31370 LDY #$09
31380 LDA (DEREG),Y
31390 JSR TE$FWT ;FILE W PROTECTED?
31400 JSR GETREC
31410 LDA CRRCNB ;'CR'<$40
31420 CMP #$40
31430 BCC W$RCSO
31440 JMP FLEDRT
31450 W$RCSQ=*
31460 JSR GTBKOF ;GET CUR. RECORD POST. IN
31470 ;FILE LOCATION AREA'
31480 STY BLKOFS
31490 LDA (DEREG),Y ;GET LOG. BLOCK NO.
31500 BEQ WTR$$3 ;IF 0,GO TO FIND EMPTY BLOCK
31510 JSR GTRLBS ;NO,GET CORRES. PHY. BLOCK NO.
31520 WTRC$$=*
31530 JSR GTTKSC ;GET TRACK# & SECTOR#
31540 LDY #$50
31550 STY FLAG ;SET 'WRITE' TO FLAG
31560 JSR RWSCDF ;WRITE A RECORD
31570 LDY #$0E
31580 LDA #$C0
31590 STA (DEREG),Y ;SET 'WRITTEN' FLAG IN FCB.S2
31600 LDA CRRCNB ;'CR'<'RC'
31610 CMP TLRCNB
31620 BCC WTR$$Q ;GO AHEAD WITH NO INCRESE 'RC'
31630 STA TLRCNB ;STORE 'CR' TO 'RC'
31640 INC TLRCNB ;INCRESE 'RC' BY 1
31650 WTR$$G=*
31660 CMP #$3P ;'CR'=$3F?
31670 BNE WT$$SG ;NO,MODIFY FCB & RETURN
31680 BIT FLAG2 ;OTHERWISE, CHECK RANDOM
31690 BPL WT$$S0
31700 JSR MDFFCB ;IF SEG. CLOSE THIS EXTENT &
31710 JSR HDNTEN ;OPEN NEXT
31720 LDA RTNFLG+1
31730 BNE W$$CSQ ;IF UNSUCC., LEAVE 'CR'=$3F ALONE
31740 LDA #$FF ;IF SUCC., SET 'CR'=$FF
31750 STA CRRCNB
31760 W$$CS0=*
31770 LDA #$00
31780 STA RTNFLG+1
31790 WT$$SQ=*
31800 JMP MDFFCB
31810 WTR$$$=* ;MODIFY FCB, 'CR' WILL BE $40 OR $00
31820 STA TEMP ;FIND AN EMPTY BLOCK
31830 LDA #$01
31840 CPY #$10
31850 BEQ WT$CDSO ;FIRST POINTER?
31860 BEY ;YES, SET BASS PHY. BLOCK# TO $01
31870 LDA (DEREG),Y
31880 BEQ WT$CSO ;NO, GET PHY. BLOCK# BEFORE IT
31890 LDA DEREG ;0?
31900 STA HLREG1 ;NO, CONVERT IT TO BASS BLOCK#
31910 LDA DEREG+1
31920 STA HLREG1+1
31930 JSR GTBKNB
31940 WT$CSQ=*
31950 JSR FNDEPT ;TO FIND AN EMPTY BLOCK
31960 TAX
31970 LDA #$08 ;MAP OVERFLOW?
31980 BIT FLAG2
31990 BEQ WIR$S0
32000 LDA #$02
32010 JMP STRTFG
32020 WTR$S0=*
32030 TXA
32040 PHA
32050 JSR RELFOM ;NO,CHANGE FOUND# TO CORRES, LOGICAL#
32060 LDY BLKOFS
32070 NOP
32080 NOP
32090 NOP
32100 TXA
32110 STA (DEREG),Y ;STORE TO COORES POINTER
32120 PLA ;WRITE THE RECORD TO FIRST
32130 JMP WTRC$$ ;SECTOR OF FOUND BLOCK
32140 ;
32150 ;
32160 ;
32170 ;********************************************************
32180 ;*
32190 ;* FUNCTION 2 5 : WRITE SEQUENTIALLY
32200 ;*
32210 ;************************************************
32220 ;*
32230 ;* ENTRY PARAMETERS
32240 ;* REGISTER X : $19
32250 ;* REGISTER Y,A : FCB ADDRESS
32260 ;*
32270 ;* RETURNED VALUE:
32280 ;* REGISTER A : #$00 SUCCESS
32290 ;* $01 CAN'T CLOSE OR OPEN NEXT
32300 ;* EXTENT
32310 ;* $02 MAP OVERFLOW
32320 ;*
32330 ;*******************************************************
32340 ;
32350 WTRCSQ=*
32360 ;
32370 JSR FCBINZ
32380 JMP WTRCS1
32390 ;
32400 ;
32410 FNDCRN=* ;FIND CURRENT LOGIC RECORD#
32420 ;AND EXTENT
32430 ;
32440 LDY #$21 ;GET R0
32450 LDA (DEREG),Y
32460 AND I9;3F ;CACULATE DESIRED RECORD#
32470 LDY #$20
32480 STA (DEREG),Y ;STORE TO FCB.CR
32490 INY
32500 LDA (DEREG),Y ;GET R0 AGAIN
32510 STA TEMP1
32520 INY
32530 LDA (DEREG),Y ;GET R1
32540 STA EXNTNB ;CACULATE THE 'EX' DESIRED
32550 ROL TEMP1
32560 ROL EXNTNB
32570 ROL TEMPI
32580 ROL EXNTNB
32590 LDA EXNTNB ;DESIRED 'EX'=CURRENT 'EX'?
32600 LDY #$0C
32610 CMP (DEREG),Y
32620 BE0 FNSCRN
32630 JSR CLFILE ;IN NOT, CLOSE CURRENT EXTENT
32640 LDX RTNFLG+1 ;SUCCESS?
32650 LDA #$03
32660 INX
32670 BEQ FNDCR$
32680 LDA EXNTNB ;YES,STORE DESIRED TO FCB.CR
32690 LDY #$0C
32700 STA (DEREG),Y
32710 JSR OPFILE ;OPEN THIS EXTENT
32720 LDX RTNFLG+1 ;SUCCESS?
32730 INX
32740 BNE FN$CRN
32750 LDA #$04 ;IF NOT, CHECK R OR W
32760 BIT FLAG2
32770 BVS FNDCR$
32780 JSR MKFILE ;IF W, CREATE A NEW NEXT
32790 LDA #$05
32800 LDX RTNFLG+1 ;SUCCESS?
32810 INX
32820 BEQ FNDCR$ ;IF NOT REPORT ERR
32830 FN$CRN=*
32840 LDA #$00
32850 FNDCRS=*
32860 JMP STRTFG
32870 ;
32880 RDRCR1=*
32890 ;
32900 JSR TETOPN
32910 LDA #$60 ;SET FLAG TO INDICATE RANDOM R
32920 STA FLAG2
32930 JSR FNDCRN ;FOND 'EX' & 'CR' DESIRED
32940 BNE R$RCRM
32950 JMP RDRCS$ ;IF SUCCESS, READ THE RECORD
32960 R$RCRM=*
32970 RTS
32980 ;
32990 ;*******************************************************
33000 ;*
33010 ;* FUNCTION 26 :READ RANDOM
33020 ;*
33030 ;*******************************************************
33040 ;*
33050 ;* ENTRY PARAMETERS :
33060 ;* REGISTER X #$1A
33070 ;* REGISTER Y,A: FCB ADDRESS
33080 ;*
33090 ;* RETURNED VALUE :
33100 ;* REGISTER A : $00 SUCCESS
33110 ;* $01 READ UNWRITTEN DATA
33120 ;* $03 CAN'T CLOSE CURRENT EXTENT
33130 ;* $04 SEEK TO UNWRITTEN EXTENT
33140 ;*
33150 ;*******************************************************
33160 ;
33170 RDRCRM=*
33180 ;
33190 JSR FCBINZ
33200 JMP RDRCR1
33210 ;
33220 WIRCR1=4
33230 ;
33240 JSR TETOPN ;DISK W PROTECTED?
33250 LDA #$20 ;SET FLAG TO INDICATE RANDOM W
33260 STA FLAG2
33270 JSR FNDCRN ;FIND 'EX' & 'CR' DESIRED
33280 BNE W$RCRM
33290 JMP WTRCS$ ;IF SUCCESS, WRITE THIS RECORD
33300 W$RCRM=*
33310 RTS
33320 ;
33330 ;
33340 ;
33350 ;
33360 ;
33370 ;
33380 ;
33390 ;
33400 ;
33410 ;
33420 ;
33430 ;
33440 ;
33450 ;
33460 ;***************************************************
33470 ;*
33480 ;* FUNCTION 27 : WRITE RANDOM
33490 ;*
33500 ;**************************************************
33510 ;*;
33520 ;* ENTRY PARAMETERS :;
33530 ;* REGISTER X : $1B
33540 ;* REGISTER Y,A: FCB ADDRESS
33550 ;*
33560 ;* RETURNED VALUE
33570 ;* REGISTER A : $00SUCCESS
33580 ;* $02 MAP OVERFLOW
33590 ;* $03 CAN'T CLOSE CURRENT EXTENT
33600 ;* $05 DIRECTORY OVERFLOW
33610 ;*
33620 ;*******************************************************
33630 ;
33640 WIRCRM=*
33650 ;
33660 JSR FCBINZ
33670 JMP WTRCRI
33680 ;
33690 ;******************************************************
33700 ;*
33710 ;* FUNCTION 28 : SEARCH FOR FIRST
33720 ;*
33730 ;***************************************************
33740 ;*
33750 ;* ENTRY PARAMETERS : *
33760 ;* REGISTER X : $1C
33770 ;* REGISTER Y,A:FCB ADDRESS
33780 ;*
33790 ;* RETURNED VALUE :
33800 ;* REGISTER A : $FF FILE NOT FOUND
33810 ;* NUMBER OF DESIRED ENTRY WHITHIN
33820 ;* DIRECTORY BLOCK
33830 ;*
33840 ;*******************************************************
33850 ;
33860 SHFIST=*
33870 JSR FCBINZ ;INITIALIZE FCB
33880 LDA DEREG ;RESERV FCB ADR FOR
33890 ;SERCH NEXT
33900 STA CBADRV
33910 LDA DEREG+1
33920 STA CBADRV+1
33930 LDX #$0D ;FIND DESIRED DIR
33940 JSR FBDRMH
33950 BIT FLAG ;IF NOT FOUND,RETURN WITH A=FF
33960 BPL S$FIST
33970 RTS
33980 S$FIST=*
33990 LDA DRERNB
34000 STA CBADRV+2
34010 LDA *DFBUFA ;IF FOUND,COPY DIRBUFFER TO
34020 ;DEFAULT BUFFER
34030 STA HLREG1
34040 LDA IDFBUFA/256
34050 STA HLREG1+1
34060 LDA DIRBFA
34070 STA HLREG
34080 LDA DIRBFA+1
34090 STA HLREG+1
34100 LDA #$00
34110 STA TEMP
34120 LDA RTNFLG+1
34130 AND #$0C
34140 LDX #$05
34150 JSR ASLDSR
34160 JSR ADCOFS ;GET THE ADDR. OF MATCHE DRECORD
34170 LDY #$00
34180 SH$IST=*
34190 LDA (HLREG),Y ;COPY MATCHED DIR TO DEFAULT BUFFER
34200 STA (HLREG1),Y
34210 INY
34220 CPY #$80
34230 BNE SH$1ST
34240 LDA RTNFLG+1 ;GET THE OFFSET AWAY FROM THE START
34250 AND #$03
34260 STA RTNFLG+1
34270 RTS
34280 ;
34290 ;**********************************************************
34300 ;*
34310 ;* FUNCTION 2 9 SEARCH FOR NEXT
34320 ;*
34330 ;**********************************************************
34340 ;*
34350 ;* ENTRY PARAMETERS :
34360 ;* REGISTER X : $10
34370 ;*
34380 ;* RETURNED VALUE :*
34390 ;* REGISTER A : $FF FILE NOT FOUND
34400 ;* NUMBER OF DESIRED ENTRY WITHIN
34410 ;* DIRECTORY BLOCK
34420 ;*
34430 ;**********************************************************
34440 ;
34450 SHNEXT=*
34460 ;
34470 LDA CBADRV ;GET RESERVED ADR
34480 STA DEREG
34490 LDA CBADRV+1
34500 STA DEREG+1
34510 JSR FCBINZ
34520 LDA #$FF
34530 STA FLAG1
34540 STA RTNFG1
34550 LDX #$0D
34560 LDA CBADRV+2
34570 JSR FBO$$$ ;GO AHEAD TO FIND NEXT USING
34580 ;PREVIOUS FCB AND THE PREVIOUS FOUND
34590 ;ENTRY
34600 BIT FLAG
34610 BPL S$FIST ;IF FOUND, GO TO COPY THEM
34620 RTS
34630 ;
34640 TETOUP=*
34650 ;
34660 CLC
34670 LDA DEREG ;CHANGE ADDR. TO FCB LOCATION AREA
34630 ADC #$10
34690 STA DEREG
34700 BCC T$TOUP
34710 INC DEREG+1
34720 T$TOUP=*
34730 LDX #$0C
34740 JSR FBDRMH ;TRY TO FIND DUPLICATE
34750 BIT FLAG
34760 BMI TE$DUP
34770 PLA ;IF FOUND,REPORT ERR
34780 PLA
34790 LOA #$80
34800 JMP STRTFG
34810 TESOLIP=*
34820 CLC
34830 LDA DEREG ;NO, RECOVE THE FCB ADDR.
34840 ADC #$F0
34850 STA DEREG
34860 LDA DEREG+1
34870 ADC #$FF
34880 STA DEREG+1
34890 RTS
34900 ;
34910 RENAMM=*
34920 ;
34930 JSR TETWPT ;DISK W PROTECTED?
34940 LDX I$0C
34950 JSR FBDRMH ;TRY TO FIND THE OLD FILE
34960 RE$AMM=*
34970 BIT FLAG ;FOUND?
34980 BPL R$NAMM
34990 RTS
35000 R$NAMM=*
35010 JSR TETFWT ;FILE W PROTECTED
35020 JSR GETENT ;GET DIR ENTRY
35030 LDA #$F F
35040 STA TEMP
35050 LOA #$F0
35060 JSR ADCOFS ;SUBTRACT FROM $10
35070 LDX #$0C
35080 LDY #$10
35090 JSR P$FBLIK ;MODIFY DIR DR-T3 ACCORDING TO FCB
35100 ;DO-D1 AND WRITE IT BACK TO DISK DIR.
35110 JSR FBDR$$ ;FIND NEXT EXTENT AND DEAL WITH IT
35120 ;UNTIL ALL FILES ARE DEALT.
35130 JMP RE$AMM
35140 ;
35150 ;****************************************************
35160 ;*
35170 ;* FUNCTION 30 : RENAME FILE;
35180 ;*
35190 ;*********************************************************
35200 ;*
35210 ;* ENTRY PARAMETERS :
35220 ;* REGISTER X : $1E
35230 ;* REGISTER Y,A: FCB ADDRESS
35240 ;*
35250 ;* RETURNED VALUE :
35260 ;* REGISTER A : #$FF FILE NOT FOUND
35270 ;* $80 THE NEW NAME IS ALREADY IN DIR.
35280 ;* DIR CODE FROM $00-$6F IF SUCCESS ;
35290 ;*
35300 ;**********************************************************
35310 ;
35320 RENAME=*
35330 ;
35340 JSR FCBINZ
35350 LDY #$00 ;COPY 'DR' IN OLD FILE TO 'DR' IN
35360 LDA (DEREG),Y ;NEW FILE
35370 LDY I $10
35380 STA (DEREG),Y
35390 JSR TETDUP ;TEST DUPLICATE
35400 JSR RENAMM ;RENAME!
35410 JMP SETRTN
35420 ;
35430 CHATRT=*
35440 ;
35450 JSR TETWPT
35460 LDX #$0C ;TRY TO FIND A ENTRY IN DIR
35470 JSR FBDRMH
35480 CHSTRT=*
35490 BIT FLAG
35500 BPL C$ATRT
35510 RTS
35520 C$ATRT=*
35530 LDX #$0C ;COPY FCB TO DIR TO CHANGE THE
35540 JSR PTFBDK ;ATTR.
35550 JSR FBDR$$ ;KEEP FINDING
35560 JMP CHSTRT
35570 ;
35580 ;
35590 ;
35600 ;
35610 ;
35620 ;******************************************************
35630 ;*
35640 ;* FUNCTION 31 : CHANGE ATTRIBUTES
35650 ;*
35660 ;*******************************************************
35670 ;*
35680 ;* ENTRY PARAMETERS
35690 ;* REGISTER X : $1F
35700 ;* REGISTER Y,A : FCB ADDR.
35710 ;*
35720 ;* RETURNED VALUE : $FF FILE NOT FOUND
35730 ;* DIR NO. IF SUCCESS
35740 ;*
35750 ;****************************************************
35760 ;
35770 CHATRB=*
35780 ;
35790 JSR FCBINZ
35800 JSR CHATRT
35810 JMP SETRTN
35820 ;
35830 ;*******************************************************
35840 ;*
35850 ;* FUNCTION 32 : COMPUTE FILE SIZE
35860 ;*
35870 ;*******************************************************
35880 ;*
35890 ;* ENTRY PARAMETERS
35900 ;* REGISTER X : $20
35910 ;* REGISTER Y,A : FCB ADDRESS
35920 ;*
35930 ;* RETURNED VALUE :
35940 ;* REGISTER A : $FF FILE NOT FOUND
35950 ;* OTHERWISE R0,R1 CONTAIN FILE SIZE
35960 ;*
35970 ;*******************************************************
35980 ;
35990 CPFISZ=*
36000 ;
36010 JSR FCBINZ
36020 LDA $00 ;INIT. R0 &R1
36030 LDY $#21
36040 STA (DEREG),Y
36050 INY
36060 STA (DEREG),Y
36070 LDX $#0C ;GO AHEAD TO FIND THE FILE
36080 JSR FBDRMH
36090 CPF$SZ=*
36100 BIT FLAG ;FOUND?
36110 BPL C$FISZ
36120 RTS
36130 C$FISZ=*
36140 JSR GETENT ;YES,SET HLREG ADDRESS OF THIS ENTRY
36150 LDY #$0F
36160 LDA (HLREG),Y ;GET THE NUMBER OF TOTAL RECORDS
36170 CLC
36180 LDY #$2 1 ;BE ADDED TO SUN STORED IN R0,R1
36190 ADC (DEREG),Y
36200 STA (DEREG),Y
36210 BCC CP$ISZ
36220 INY
36230 LDA
36240 ADC (DEREG),Y
36250 STA (DEREG),Y
36260 CP$ISZ=*
36270 JSR FBDR$$ ;KEPT FINDING UNTIL WHOLE DIRECTORY IS
36280 ;SEARCHED
36290 JMP CPF$SZ
36300 ;
36310 ;*********************************************************
36320 ;*
36330 ;* FUNCTION 33 : SET RANDOM RECORD
36340 ;*
36350 ;********************************************************* *
36360 ;* ENTRY PARAMETERS :
36370 ;* REGISTER X : $21
36380 ;* REGISTER Y,A: FCB ADDRESS
36390 ;*
36400 ;* RETURNED VALUE :
36410 ;* REGISTER A :$FF FILE NOT FOUND
36420 ;* OTHERWISE R0,R1 CONTAIN NUMBER OF
36430 ;* DESIRED RECORD WITH R0 BEING THE
36440 ;* LEAST SIGNIFICANT BYTE
36450 ;*
36460 ;*********************************************************
36470 ;
36480 ;
36490 STRDRC=*
36500 ;
36510 LDY #$0C ;GET 'EX'
36520 LDA (DEREG),Y
36530 STA TEMPI
36540 LDY #$20 ;GET CR
36550 LDA (DEREG),Y
36560 LSR TEMPI ;RIGHT SHIFT 'EX' ONCE
36570 BCC S$RDRC
36580 NOP ;THAT MEANS NUMBER
36590 ;OF RECORDS SOULD BE ADDED BY $40
36600 ADC #$3F
36610 S$RDRC=*
36620 LSR TEMPI ;RIGHT SHIFT 'EX' AGAIN
36630 BCC ST$DRC
36640 NOP ;NUMBER OF RECORDS
36650 ;SHOULD BE ADDED BY $80
36660 ADC #$7F
36670 ST$DRC=*
36680 LDY #$2 1 ;NOW PUT THE LOWER BYTE OF TOTAL NUMBER
36690 STA (DEREG),Y ;TO THE R0
36700 INY
36710 LDA TEMP1 ;THE HIGHER BYTE TO R1
36720 STA (DEREG),Y
36730 RTS
36740 ;
36750 ;
36760 ;
36770 ;
36780 ;
36740 ;
36300 ;
36810 ;
36820 ;
36830 ;*******************************************************
36840 ;*
36850 ;* FUNCTION 34 : SENT I/O BUFFER BACK TO DISK
36860 ;*
36870 ;*******************************************************
36880 ;*
36890 ;* ENTRY PARAMETERS :
36900 ;* REGISTER X : $22
36410 ;*
36920 ;******************************************************
36930 ;
36940 SIODSK=*
36950 ;
36960 JMP SIOBDK
36970 ;
36980 RETURN=*
36990 ;
37000 LDA RTNFLG ;DISK NEEDS TO CHANGE BACK?
37010 BEQ R$TURN
37020 LDA #$00
37030 TAY
37040 STA (DEREG),Y
37050 LDA CRTDRN ;STORE BACK THE 'DR'
37060 BEQ R$TURN
37070 STA (DEREG),Y
37080 LDA PRVDSK ;GET RESERVED DISK NO.
37090 STA DERDSK
37100 JSR SELDSK ;CHANGE BACK TO CURRENT DISK
37110 R$TURN.*
37120 LDY RTNFLG+2 ;RETURN THE FLAG OR ADDR. NEEDED
37130 LDA RTNFLG+1
37140 RTS
37150 .END