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