;CHNGDIR.ACT - program to modify›; directories›;BY Phillip R. Poulos›;›MODULE›BYTE ARRAY BUFADR=$8000,WKAREA(88)›BYTE DNSFLG=$800E›CARD TEMP›;›;Machine Language Subroutine SECRW›; ›;This routine reads/writes a specified›; sector from a disk›;›;CALLING SEQUENCE:›; A=SECRW(SECTOR,BUFADR,DENSITY,RW,DRIVE)›;›;WHERE: SECRW is defined as an INT FUNC›; SECTOR....sector addressed›; BUFADR....buffer address›; DENSITY...density of disk (1 or 2)›; RW........READ/WRITE flag (0=read 1=write)›; DRIVE.....Drive Number›;›;›; The INTEGER A is returned as either:›; NEGATIVE ERROR NUMBER›; or›; ACTUAL # Bytes READ/WRITTEN›;›;›INT FUNC SECRW= *(CARD SECTOR,BUFADR BYTE DENSITY,RW,DRIVE)› [› $8D$0A$03 ;SECRW STA DAUX1› $8E$0B$03 ; STX DAUX2› $8C$04$03 ; STY DBUFLO› $A5$A3 ; LDA $A3› $8D$05$03 ; STA DBUFHI› $A5$A4 ; LDA $A4› $C9$02 ; CMP #2› $F0$0C ; BEQ DBLDENS› $A9$80 ; LDA #$80› $8D$08$03 ; STA DBYTLO› $A9$00 ; LDA #0› $8D$09$03 ; STA DBYTHI› $F0$09 ; BEQ CONT01› $A0$00 ;DBLDENS LDY #0› $8C$08$03 ; STY DBYTLO› $C8 ; INY › $8C$09$03 ; STY DBYTHI› $A5$A5 ;CONT01 LDA $A5› $C9$01 ; CMP #1› $D0$0C ; BNE READSEC› $A9$57 ; LDA #'W› $8D$02$03 ; STA DCOMND› $A9$80 ; LDA #$80› $8D$03$03 ; STA DSTATS› $D0$0A ; BNE CONT02› $A9$52 ;READSEC LDA #'R› $8D$02$03 ; STA DCOMND› $A9$40 ; LDA #$40› $8D$03$03 ; STA DSTATS› $A5$A6 ;CONT02 LDA $A6› $8D$01$03 ; STA DUNIT› $A9$31 ; LDA #$31› $8D$00$03 ; STA DDEVIC› $A9$07 ; LDA #$07› $8D$06$03 ; STA DTIMLO› $20$59$E4 ; JSR SIOV› $30$0B ; BMI ERROR› $AD$08$03 ; LDA DBYTLO› $85$A0 ; STA $A0› $AD$09$03 ; LDA DBYTHI› $85$A1 ; STA $A1› $60 ; RTS › $38 ;ERROR SEC› $A9$00 ; LDA #0› $ED$03$03 ; SBC DSTATS› $85$A0 ; STA $A0› $A9$FF ; LDA #$FF› $85$A1 ; STA $A1› $60 ; RTS› ]›;›;Short ERROR routine to ignore›; record truncate errors (#137)›;›PROC BADNEWS(BYTE CODE)› IF CODE<>137 THEN› ERROR=TEMP› [$4C ERROR]› FI›RETURN›;›;This routine READS a directory sector ›; indicated by the parameters SECTOR,›; DENSITY, and DRIVE #.›;All valid filenames (ie. - not deleted)›; are stored in a workarea›;›;Either the number of filenames read›; (0-8) or the ERROR number on SECTOR›; READ is returned.›;›BYTE FUNC READDIR(CARD SECTOR BYTE DENSITY,DRIVE)›INT ERR ›BYTE X› ERR=SECRW(SECTOR,BUFADR,DENSITY,0,DRIVE)› IF ERR<0 THEN RETURN(-ERR) FI› DRIVE=0› FOR DENSITY=0 TO 7 DO› X=BUFADR(16*DENSITY)› IF X=0 THEN EXIT FI› IF X<$80 THEN› MOVEBLOCK(WKAREA+(11*DRIVE),BUFADR+5+(16*DENSITY),11)› DRIVE==+1› FI› OD›RETURN(DRIVE)›;›;This routine writes a Directory sector›; indicated by the parameters SECTOR,›; DENSITY, and DRIVE.›;WORKAREA contains the new filenames.›;Either a ZERO (0) is returned for success›; or the ERROR number is returned.›;›BYTE FUNC WRITEDIR(CARD SECTOR BYTE DENSITY,DRIVE)›INT ERR›BYTE X,Y,Z› Z=0› FOR X=0 TO 7 DO› Y=BUFADR(16*X)› IF Y=0 THEN EXIT FI› IF Y<$80 THEN› MOVEBLOCK(BUFADR+5+16*X,WKAREA+11*Z,11)› Z==+1› FI› OD› ERR=SECRW(SECTOR,BUFADR,DENSITY,1,DRIVE)› IF ERR<0 THEN RETURN(-ERR) FI›RETURN(0)›;›;This routine returns the file number›; requested to change. Invalid requests›; are ingnored.›;›BYTE FUNC RECNUM(BYTE CNT,START)›BYTE X› DO POSITION(2,19)› PRINT("œWhich one? ")› X=INPUTB()› IF X>START-1 AND X255 THEN › POSITION(13,6)› CT=GETD(7)› PUTD(6,CT)› RETURN(CT)› FI› FOR X=0 TO 100 DO OD› OD› POSITION(13,6)› IF (Z MOD 2)=0 THEN PUTD(6,CT)› ELSE PUTD(6,' ) FI › Z==+1› OD› POSITION(13,6)› Y=GETD(7)› PUTD(6,Y)›RETURN(Y)›;›PROC MAIN()›INT ERR›BYTE ARRAY FILNME(13)›BYTE X,Y,CNT,DENSITY,DRIVE,› FLG,START,COLOR1=710›CARD SECTOR=[361]› GRAPHICS(18)› POSITION(0,6)› PRINTD(6,"DRIVE NUMBER:")› DO DRIVE='_› DRIVE=GETC(DRIVE)› IF DRIVE>'0 AND DRIVE<'5 THEN› DRIVE==-48› EXIT FI› OD›;›;Sector #1 is read from the specified›; drive to determine the density of›; that drive for further READS/WRITES›;› ERR=SECRW(1,BUFADR,1,0,DRIVE)› IF ERR<0 THEN ERR=-ERR› POSITION(0,6)› PRINTD(6,"?ERROR NUMBER:")› PRINTID(6,ERR)› FOR ERR=0 TO 30000 DO OD› FOR ERR=0 TO 30000 DO OD› FOR ERR=0 TO 30000 DO OD› RETURN› FI› DENSITY=DNSFLG›;A disk without a standard DOS (eg. -›; a MICRODOS XL disc) will not have›; the density flag properly set. IF›; a value other than 1 or 2 is found,›; SINGLE density is assumed.›;To change a NONSTANDARD disk, the›; DENSITY must be set, NOT read: eg.›; DENSITY=2› GRAPHICS(0)› COLOR1=0› TEMP=ERROR› ERROR=BADNEWS› SECTOR=361› DO START=1› DO CNT=READDIR(SECTOR,DENSITY,DRIVE)› IF CNT=0 THEN EXIT FI› IF CNT>8 THEN› GRAPHICS(0)› POSITION(2,12)› PRINTF("ý?ERROR #%U%E",CNT)› ERROR=TEMP› RETURN› FI› PUT('})› POSITION(11,4)› PRINT("# F-NAMEEXT")› POSITION(11,5)› PRINT(" ")› FLG=0› DO POSITION(2,7)› PLIST(CNT,START)› POSITION(2,19)› IF FLG=0 THEN› PRINT("œWant to change a record ? ") › ELSE PRINT("œAnother change ? ")› FI› DO X=GETD(7)› IF X<>'N AND X<>'Y› AND X<>'n AND X<>'y THEN› PUT('ý)› ELSE PUT(X)› EXIT› FI› OD› IF X<>'Y AND X<>'y THEN EXIT FI › X=RECNUM(CNT,START)› POSITION(2,19)› PRINT("œNEW filename/ext:")› POSITION(20,20)› PRINT(" ")› POSITION(19,19)› PUT(' )› SETBLOCK(FILNME,13,$20)› INPUTMD(0,FILNME,12)› Y=FILNME(0)+1› FILNME(Y)=$20› POSITION(20,20)› PRINT(" ")› FLG=1› MOVEBLOCK(WKAREA+11*(X-1),FILNME+1,11)› OD› START==+CNT› IF FLG THEN› CNT=WRITEDIR(SECTOR,DENSITY,DRIVE)› IF CNT THEN› GRAPHICS(0)› POSITION(2,12)› PRINTF("ý?ERROR #%U%E",CNT)› ERROR=TEMP› RETURN› FI› FI› SECTOR==+1› IF SECTOR>368 THEN EXIT FI› OD› POSITION(2,19)› PRINT("œAny more changes ? ")› X=GETD(7)› IF X<>'Y AND X<>'y THEN EXIT FI› SECTOR=361› OD›ERROR=TEMP›GRAPHICS(0)›RETURN››