2.m'~x0ԍI'0 n- Can't read IPL G_0m'+' Z&Ŝ9+&& Z&Ŝ9&'ch99[%@'!mJ'HOJ&ҍm1'9$'{3='&3/aO9'#a5 '45Z& 33D'9'j'܆ WEj&00.0- Not Linked - Nucleus I/O Error - Bad Nucleus UTILITIE!'?W'$UTILITIE'"'bW'$BACKUPCMDTBACKUPDOC SBACKUPTXTTSCHECKSUMCMD #TCHECKSUMDOC$ SCHECKSUMTXT !:SDIRCMD"TDIRTXTTDISKEDITCMD$TDISKEDITTXT9TWORDSWAPCMD''!TWORDSWAPTXT'"!#RISLBL09BIN# PISLBL09TXT  PDKCOPYCMD TDKCOPYTXT  "SDKDIFFCMD # TDKDIFFTXT  0SDKNAMECMD  TDKNAMEDOC  SDKNAMETXT  "SDRIVERSTXT #  RDSKALIGNTXT  (RYNAMITECMD # PFILESORTCMD TFILESORTTXT! SFINDCMD TFINDTXT7 SFIXCHAINCMDTFIXCHAINTXT S FREEMAPCMDTFREEMAPDOC SFREEMAPTXT  "SGETEXTCMD  TGETEXTTXT  SHELPCMDTHELPTXTSINDEXDOC!SINITLIB"  SINITTXT S LETTEROUT 0 RLISACMDTLISADOCRLISATXTSLISTNEWCMD!TLISTNEWTXT"SLOWERCASCMDTLOWERCASTXT TMAPCMD  TMAPDOC  S MAPTXT SMEMDUMPCMD  TMEMDUMPDOC  $ SMEMDUMPTXT!!SFLEXLBLBIN!!PFLEXLBLTXT!!PNEWFILESCMD!!TNEWFILESTXT!" SOLOADDOC""SOLOAD9SCMD""T OLOAD9STXT""SOSAVECMD""TOSAVETXT"#SSAV2CMD##TSAV2DOC# # RSAV2TXT# # SSAVECMD## TSAVEtxt#$ TSAVTEXTCMD$$TSAVTEXTTXT$$ S BUGLBLBIN$$PBUGLBLTXT$$PSECTORCMD$$TSECTORDOC$$SSECTORTXT$ % SSQUEEZECMD% %TSQUEEZETXT%% QWTBGLBLBIN%%!PWTBGLBLTXT%"&PTESTCMD&&  TTESTTXT& '0 TESTCMDTXT''PESTFILEBIN''PORDSWAPCMD''T !"#$  O H%]'"C0OH%]'"ɃC'0T0%9#|C ''000 ''+& 4 ',&05T'nā '}'x,' &0 0H%' " H%'"H%'M&c"  0{0 C} +V" x '$Ţ$CˆW$ ' $~@&-;m*&}+@ɀ&ц;}* Z& @m'ɀl+@'&LĖ0 >'C0 9`0&ɀ&a'0 } ' @ &? ɀ&% z' "$'#?~ɽ @ @ @Ą&";%!"0%%+ %"ɀ& &}&x!&oo"}' "$ DɄZ&9C0.& Z&.Ā& Z&Y9əoA9-J=:Z&-B99JanFebMarAprMayJunJulAugSepOctNovDecBackup from x to x - same dates after and includingInsert disks, press any key. (CRŘy to stop)From File Source Date Dest Date ActionILLEGAL OPTION SPECIFIED NOT COPIED - BACKUP NEWERSAME DATE - COPIED@Hm&m&Z䦄.' !%9#"m' oo90k *El&'3"00I'$ 04&|'¾.'!%A$'$ o<0= oZ&.' 0%-% |0'%Z* s0&rl0&@m'B+&m&01 '&0Z&0} Z&9&"&\l  0F?~ '9  BACKUP   The BACKUP command is used to archive files onto a backup disk. Backups can be performed on a single file, a matchlist of files, or all of the files on a disk. If the files already exist, the dates are used in determining whe ther or not to produce the backup. BACKUP need not be on either disk.   DESCRIPTION  The general syntax of the BACKUP command is:  BACKUP,,[,][,+(options)]  where and are the respective dri ve numbers,  is the optional set of name and/or extension characters to be matched against names in the source directory. The date of the source file is maintained in the destination file. (The Backup utility will function better  if the COPY program used also preserved dates.) The optional date tells from when backups can be made if the source and destination files have the same date.  Backups are performed according to these rules:  1. Destination file does not e xist - copy it 2. Copy is of older date than source - delete and copy 3. Copy is of newer date than source - no copy made -WARNING 4. Copy is of same date - no copy made (unless same as or later than optional date)  The options are:  mm,dd,yy - The date after which all same date files are copied.  T - The short form of today's date (the date entered at bootup).  EXAMPLES  +++BACKUP,0,1 +++BACKUP,0,1,A.Z,B,+08,30,82 +++BACKUP,1,0,.CMD,.TXT,+T  The first example would copy all files from drive 0 to drive 1 except those which already exist on 1, having the same date. The second example would copy only those files which begin with A and whose extension begins with Z, and those files which begin with B. Of those files, any with the same date of 8/30/82 and later will be copied. The third example would copy all files with extensions of .CMD and .TXT including any whose dates are the same and equal to today. Files are NEVER copied if the desti nation date is later than the source date!  Normal output from this command is as follows:  0.FILE1 .EXT 30-Aug-82 29-Jul-82 COPIED 0.FILE2 .EXT 25-Aug-82 1-Sep-82 NOT COPIED - BACKUP NEWER 0.FILE3 .EXT 4-Jul-82 4-Jul-82 NOT C OPIED  With the date option set:  0.FILE3 .EXT 4-Jul-82 4-Jul-82 SAME DATE - COPIED    All Flex error handling and conventions are supported including ignoring files that are catalog protected and excluding the TTYSET DP count.  The handling of the line buffer, matchlist, and directory searching is performed by the position independent subroutine MTCHLIST.  Version 1.0 AUG 82 John Higley and Ken Smith  Non-commercial license for this version is granted by the au thors. This utility may be freely copied by any hobbyist so long as credit to the authors is given, and this restriction is included.  OPT PAGE TTL BACKUP File backup utility STTL Main program PAG * John Higley, Ken S. Smith * 12625 SW Colony Ln #31 * Beaverton, OR 97005 * TEK (503) 627-2573 * AUG 82 * * The following description can be printed and put into * the FLEX manual. (Change *'s to 6 spaces) * BACKUP * * * The BACKUP command is used to archive files onto a backup * disk. Backups can be performed on a single file, a * matchlist of files, or all of the files on a disk. If * the files already exist, the dates are used in determining * whether or not to produce the backup. BACKUP need not be on * either disk. * * * DESCRIPTION * * The general syntax of the BACKUP command is: * * BACKUP,,[,][,+(options)] * * where and are the respective drive numbers, * is the optional set of name and/or extension * characters to be matched against names in the source * directory. The date of the source file is maintained in the * destination file. (The Backup utility will function better * if the COPY program used also preserved dates.) The optional * date tells from when backups can be made if the source and * destination files have the same date. * * Backups are performed according to these rules: * * 1. Destination file does not exist - copy it * 2. Copy is of older date than source - delete and copy * 3. Copy is of newer date than source - no copy made -WARNING * 4. Copy is of same date - no copy made * (unless same as or later than optional date) * * The options are: * * mm,dd,yy - The date after which all same date files are * copied. * * T - The short form of today's date (the date entered at * bootup). * * EXAMPLES * * +++BACKUP,0,1 * +++BACKUP,0,1,A.Z,B,+08,30,82 * +++BACKUP,1,0,.CMD,.TXT,+T * * The first example would copy all files from drive 0 to drive 1 * except those which already exist on 1, having the same date. * The second example would copy only those files which begin * with A and whose extension begins with Z, and those files  * which begin with B. Of those files, any with the same date * of 8/30/82 and later will be copied. The third example would * copy all files with extensions of .CMD and .TXT including * any whose dates are the same and equal to today. * Files are NEV ER copied if the destination date is later than * the source date! * * Normal output from this command is as follows: * * 0.FILE1 .EXT 30-Aug-82 29-Jul-82 COPIED * 0.FILE2 .EXT 25-Aug-82 1-Sep-82 NOT COPIED - BACKUP NEWER * 0.FILE3 .EXT 4-Jul -82 4-Jul-82 NOT COPIED * * With the date option set: * * 0.FILE3 .EXT 4-Jul-82 4-Jul-82 SAME DATE - COPIED * * * * All Flex error handling and conventions are supported including * ignoring files that are catalog protected and excluding the * TT YSET DP count. The handling of the line buffer, matchlist, * and directory searching is performed by the position independent * subroutine MTCHLIST. * * Version 1.0 AUG 82 John Higley and Ken Smith * * Non-commercial license for this version is gran! ted by the authors. * This utility may be freely copied by any hobbyist so long as * credit to the authors is given, and this restriction is included. * FLEX System equates CLASS EQU $CD21 Classify character GETCHR EQU $CD15 Read character from KB GET"FIL EQU $CD2D Input file spec from buffer INDEC EQU $CD48 Input decimal number NXTCH EQU $CD27 Get next buffer character OUTADR EQU $CD45 Output HEX address OUTDEC EQU $CD39 Output decimal number OUTHEX EQU $CD3C Output HEX number PCRLF EQU $CD24 Outpu#t CR LF PSTRNG EQU $CD1E Output messages PUTCHR EQU $CD18 Output single character RPTERR EQU $CD3F Report disk error SETEXT EQU $CD33 Set disk extension WARMS EQU $CD03 FLEX warm start * FLEX variables BUFPNT EQU $CC14 Line buffer pointer MONTH EQU $CC$0E System date registers (mmddyy) DAY EQU $CC0F YEAR EQU $CC10 EOL EQU $CC02 End of line char LASTTRM EQU $CC11 Last terminator MEMEND EQU $CC2B Memory end PAUSE EQU $CC09 TTYSET Pause control WORKDRV EQU $CC0C Working drive * FMS equates FMS EQU $D406 File management entry FMSCLS EQU $D403 File management close entry * File control blocks SOURCE EQU $C840 Source file control block DESTIN EQU $C980 Destination file control block * Buffer area MEMBEG EQU $0800 MTCHLIST loads at $0 * * Program starts here ORG $C100 BACKUP BRA START VERSION FCB $10 Version number 1.0 MVNMSR FDB $0 Source addr for MOVNAM MVNMDS FDB $0 Dest address BUFTMP FDB $0 Temp for buffer pointer BUFEND FDB $0 Temp for end of line buffer DONFLG FCB $0 Set when read is done PSETMP FCB $0 Temp for TTYSET PAUSE DTMON FCB $FF Month of optional date DTDAY FCB $FF Day DTYEAR FCB $FF Year DATEMP FCB 0,0,0 Temp for system date STATUS FCB $0 Status bits * START LDD MONTH Read system date STD DATEMP .save it LDB YEAR ..the year STB DATEMP+2 ..save it too LDA PAUSE Read the TTYSET PAUSE STA PSETMP .save it for restoring CLRA STA PAUSE Turn off the pause control JSR INDEC Get source drive number LBCS SYNERR .not a number TSTB .anything? LBEQ SYNERR .nothing TFR X,D .into B acc CMPB #3 LBHI ILDRIV .illegal drive STB SOURCE+3 ...put into FCB ADDB #'0 .make it ascii STB FROM+12 Put it into message JSR INDEC Get destination drive number LBCS SYNERR .not a number TSTB .anything? LBEQ SYNERR . nothing TFR X,D .into B acc CMPB #3 LBHI ILDRIV .illegal drive STB DESTIN+3 ...put into FCB CMPB SOURCE+3 Same drive? LBEQ SYNERR .syntax error ADDB #'0 .make it ascii STB FROM+17 Put it into message LDX BUFPNT Prepare buffer for MTCHLST routine LDA ,X Any more drives specified? CMPA #'0 BLO NOTNUM .no, proceed CMPA #'9 LBLS SYNERR .yes, syntax error NOTNUM LDA SOURCE+3 .source drive number LDB LASTTRM Anymore buffer CMPB #$0D BEQ NOMTCH .no more buffer CMPB EOL BEQ NOMTCH .no more buffer LEAX -1,X NOMTCH LEAX -1,X put source drive number ADDA #'0 .(ascii) back STA 0,X .into line buffer STX BUFTMP temporary * Check buffer for options NEXT LDA ,X+ Get the buffer character CMPA #$0D .CR? LBEQ NOMORE ..Yes, no options CMPA EOL .End of line? LBE Q NOMORE ..Yes, no options CMPA #'+ Option symbol? BNE NEXT .No, try another LDB #$20 .Yes, replace with space STB -1,X PSHS X save this spot SPACLP LDA ,-X Clean up the buffer CMPA #$20 space? BEQ SPACLP CMPA #', comma? BNE NOTCOMMA .no, repl ace the space LEAX -1,X .yes, replace the comma NOTCOMMA LDB EOL ..with the end of line char STB 1,X PULS X restore to the options * * Read the options * OPTSRCH LDA 0,X Read option character CMPA #'T .Today's date option? BEQ TODAY ..yes, fill in  todays date CMPA #$0D CR? BEQ NONE .yes, end of options CMPA EOL End of line? BEQ NONE .yes, end of options CMPA #', Date option may preceded by BEQ OPTS2 .a delimeter. If so skip it. OPTS1 CMPA #$20 Skip multiple spaces BNE OPTS3 .no delimeter , date starts here LEAX 1,X LDA ,X BRA OPTS1 OPTS2 LEAX 1,X Skip the comma OPTS3 STX BUFPNT Option must be date JSR INDEC Read the month LBCS OPTERR .illegal date CMPB #0 A number? LBEQ OPTERR .no, illegal date TFR X,D Month into B acc CMPB #1 2 Beyond December? LBHI OPTERR .yes, illegal STB DTMON ..save it JSR INDEC Read the day LBCS OPTERR .illegal date CMPB #0 A number? LBEQ OPTERR .no, illegal date TFR X,D Day into B acc CMPB #31 Beyond 31 days? LBHI OPTERR .yes, illegal STB DTDAY ..save it JSR INDEC Read the year LBCS OPTERR .illegal date CMPB #0 A number? LBEQ OPTERR .no, illegal date TFR X,D Year into B acc TSTA Number too big? LBNE OPTERR .yes, illegal date CMPB #99 Beyond 99 years LBHI OPTERR .yes, illegal STB DTYEAR ..save it LDX BUFPNT Point to next char BRA OPTSRCH ..yes, get next option TODAY LDD MONTH Read the system date STD DTMON .save it LDB YEAR STB DTYEAR LEAX 1,X Next character LBRA OPTSRCH Get next option NOMORE LEAX -1,X Fix the buffer e nd NONE STX BUFEND Save the end of the line buffer AGAIN LDX BUFTMP Restore the buffer to STX BUFPNT .the fixed up start LDX #FROM Tell what your doing JSR PSTRNG TST DTMON Any optional date? BMI NODATE .no, skip it LDX #AFTER Output it LDY PSTR!NG+1 JSR 2,Y .no leading CR LF LDX #DTMON LBSR WRDAT2 .output the date NODATE LDX #READY Wait for insertion of disks JSR PSTRNG .ask user NOP JSR GETCHR Ready yet? CMPA #$0D CR to stop BEQ EXIT JSR PCRLF LDX #TITLE Output header JSR PSTRNG "NOP JSR PCRLF NEXTFIL LDX #SOURCE+3 Point to src FCB name JSR MTCHLIST Get next filename BCC FILEFND .got one * No files left, backup completed JSR FMSCLS Allow for FLEX's bug BRA AGAIN Ask to do another disk EXIT LDX BUFEND Set up line buffer fo#r STX BUFPNT . next command JSR NXTCH LDA PSETMP Restore TTYSET PAUSE STA PAUSE JSR PCRLF JSR FMSCLS Close all files JMP WARMS Return to FLEX * FILEFND LDX #SOURCE Open file for read LDA #$01 STA ,X .function code JSR FMS LBNE ERR ..tell any$ error LDA #$FF STA 59,X Turn off space compression LDA #$80 Set status bits to no file STA STATUS TST 16,X Test future system byte BPL OPENWR Check for destin LDA #4 Close the source file STA ,X JSR FMS LBNE ERR .any errors LBRA NEXTFIL Try% next file OPENWR LBSR WRTNAM Write the source name OPNWR TST STATUS Second date known? BMI OPNWR2 .no, proceed with open LBSR WRDATE Print the second date OPNWR2 LDX #SOURCE Point to source FCB LDD 25,X Read creation date STD MONTH .put into syste&m date LDB 27,X ..year STB YEAR LBSR MOVNAM Move src name to dest FCB LDX #DESTIN Open dest file for write LDA #$02 STA ,X .function code JSR FMS LDD DATEMP Restore today's date STD MONTH LDB DATEMP+2 STB YEAR LDB 1,X Read FMS error code L'BNE CHKERR .check for file exists error LDA #$FF STA 59,X Turn off space compression TST STATUS Second date printed? BPL COPY .yes, make the copy PUTSPC LDB #12 .no, pad with spaces PTSPC LDA #$20 .space JSR PUTCHR DECB BNE PTSPC Not finished ye(t * COPY CLR DONFLG Clear flag for reading LDX #SOURCE TST 23,X Check sector map indicator BEQ SEQUEN .EQ: no sector map LDX #DESTIN INC 23,X .Else: set dst sec map ind SEQUEN LDX #MEMBEG STX MVNMSR move addr of ram to temp LDX MEMEND STX MVNMD)S move final ram addr to temp RDNEXT LDX #SOURCE Read a byte from src file JSR FMS BEQ STBYTE .EQ: no error...store it LDA $1,X CMPA #$08 Is error eof? LBNE ERR .NE: no...tell it LDX MVNMSR .Yes: move pointer back one LEAX -$1,X STX MVNMSR BRA* RDDONE Finished reading file * STBYTE LDX MVNMSR store byte at pointer STA ,X CMPX MVNMDS compare pointer to end ram BEQ FULL .EQ: ram full..begin write LEAX $1,X .Else: point to next space STX MVNMSR BRA RDNEXT .read next byte * * TIMRTS RTS Pa+rt of timing loop * WRDEST LDX #$6000 Timing loop.. TIMING BSR TIMRTS .total cycles for loop is LEAX -$1,X . 540476 (app .5 sec @ 1MHz) BNE TIMING * LDX MVNMSR WRNEXT LDA ,X Read byte at pointer STX MVNMSR .(update pointer) LDX #DESTIN JSR FMS Wr,ite byte to dest file BNE ERR Any error: tell it LDX MVNMSR CMPX MVNMDS Compare pointer to end ram BEQ EMPTY .EQ: ram is empty LEAX $1,X .Else: set pointer for next BRA WRNEXT .write next byte * EMPTY TST DONFLG File completely copied? BEQ SEQUE-N .EQ: no...do more BRA FILEDN .Else: yes..close and return * RDDONE LDX #SOURCE File is read (eof reached) LDA #$04 STA ,X .close file... STA DONFLG .set flag to indicate eof JSR FMS BNE ERR Any error closing: tell it FULL LDX MVNMSR Move last s.tored location... STX MVNMDS .into final pointer LDX #MEMBEG Move addr of beginning ram.. STX MVNMSR .into starting pointer BRA WRDEST Write the ram area to file * FILEDN LDX #DESTIN File is fully written.. FILDN2 LDA #$04 STA ,X close file JSR F/MS BNE ERR Any error: tell it LDA #$20 space JSR PUTCHR JSR PUTCHR LDX #SAMEDT Same date message DEC STATUS Check status bits BEQ FILDN3 LDX #COPIED Copied message FILDN3 LDY PSTRNG+1 .no leading CR LF JSR 2,Y JSR PCRLF End the line LBRA NEX 0TFIL Do another file * CHKERR LDA $1,X Check error given CMPA #$03 File already exists? BEQ DUPLFL .yes, check the date ERR JSR RPTERR Tell the error ERRXIT JSR FMSCLS Close all files JMP WARMS Return to FLEX OPTERR LDX #ILLOPT Illegal option messag!1e JSR PSTRNG BRA ERRXIT Exit to FLEX SYNERR LDX #SOURCE LDA #26 Syntax error code STA 1,X BRA ERR ILDRIV LDX #SOURCE LDA #15 Illegal drive error code STA 1,X BRA ERR * DUPLFL LDY #SOURCE Compare the file dates CLR STATUS Set status for file ex"2ists LDA #$1 STA ,X Open dest for read JSR FMS BNE ERR .any errors LDB 27,X Read the year CMPB 27,Y Compare to source year BHI NEWER .Backup is newer BLO OLDER .Go delete it LDD 25,X Month and day CMPD 25,Y BHI NEWER .Backup is newer BLO OL#3DER .Go delete it * Files have same date LDB 27,X Compare to option year CMPB DTYEAR BLO NOCOPY .Not at or beyond LDD 25,X Compare to option month and day CMPD DTMON BLO NOCOPY .Not at or beyond LDA #$1 Set status to Same date copied STA STATUS$4 * Delete and re-open the file OLDER LDX #DESTIN LDA #$4 STA ,X Close the destination file JSR FMS BNE ERR .any errors LDA #12 STA ,X Delete the file JSR FMS BNE ERR .any error LBRA OPNWR Try it again NEWER LDA #4 Backup is newer - DON'T touch5 STA STATUS Save status as Not copied - Backup newer NOCOPY LDA #4 Close the file STA ,X .FMS function code STA ,Y .FMS function code (source) JSR FMS Close the file LBNE ERR .any error TFR Y,X Source FCB JSR FMS .Close the file LBNE ERR . any 6errors BSR WRDATE Write the second date LDX #NOTCOP Not copied message LDY PSTRNG+1 JSR 2,Y .no leading CR LF TST STATUS Test status for Backup newer BEQ PUTCR .no, end the line LDX #BACNEW Backup newer message LDY PSTRNG+1 JSR 2,Y .no leading7 CR LF PUTCR JSR PCRLF end the line LBRA NEXTFIL Do another file * * MOVNAM: Move source name (from FCB) to dest FCB * MOVNAM LDB #11 11 bytes... LDX #SOURCE+4 STX MVNMSR .from source name... LDX #DESTIN+4 MVNAM2 STX MVNMDS .to destination name. L8DX MVNMSR LDU MVNMDS MVNAM3 LDA ,X+ Read source character STA ,U+ Store in destination DECB Finished yet? BNE MVNAM3 .no, move another RTS * WRTNAM LDX #SOURCE+3 Output source name LDA ,X+ .drive number ADDA #'0 . make it ascii JSR PUTCHR LDA 9#'. .output dot JSR PUTCHR LDB #8 .Output 8 char name WRNAM2 LDA ,X+ BNE NOTNUL LDA #' . replace null with space NOTNUL JSR PUTCHR DECB BNE WRNAM2 . Finish the name LDA #'. .output dot JSR PUTCHR LDB #3 .Output 3 char ext WRNAM3 LDA ,X+ BNE N:ONUL2 LDA #' . replace null with space NONUL2 JSR PUTCHR DECB BNE WRNAM3 . Finish the extension LDX #SOURCE+25 Point to date BSR WRDAT2 Write the date RTS * WRDATE LDX #DESTIN+25 Destination date WRDAT2 TFR X,U Hold this spot LDX #MVNMSR Temp fo;r OUTDEC routine CLR 0,X LDB 1,U Read the day STB 1,X JSR OUTDEC Output with leading spaces LDA #'- JSR PUTCHR LDA ,U Read the month DECA LDB #3 MUL Calculate offset for month LDX #MONTHS ABX LDB #3 3 chars WRDAT3 LDA ,X+ .read the letter ED',4 BACNEW FCC ' - BACKUP NEWER',4 SAMEDT FCC 'SAME DATE - ' COPIED FCC 'COPIED',4 * * * Subroutines STTL Disk file matchlist search subroutine PAG ************************************************************** * NAME: * MTCHLIST (RETURN MATCHI ?NG FILE NAMES) * DESCRIPTION: * This routine will take a match list from the line buffer * and return the next matching file name to the 12 bytes * initially pointed to by the X reg. Each succeeding * call will return the following match until ca @rry is * set (no more). All line buffer handling, disk accesses * (directory reading) and error checking is done. * Arguments should be in form of * [,][,] * For further details see use in a utility such as CHECKSUM. * IN APUT: X reg. (file name returned in next 12 bytes) * OUTPUT: Carry bit (set if no more file names found) * REGISTERS/VARIABLES (IN)DIRECTLY MODIFIED: * A, B, Y, CC * SUBROUTINES,GLOBAL VARIABLES DIRECTLY ACCESSED(%=MODIFIED): * CLASS, GETFIL, NXBTCH, RPTERR, WARMS * EOL, %LASTTRM, %BUFPNT, WORKDRV * ERROR EXIT: * A syntax or disk error returns to FLEX (error report) *************************************************************** ORG $0 Load at $0 * INTERNAL VARIABLES/STORAGE FCBCAT RMB 32C0 File control block OPENFLG FCB 0 Directory open flag AUTOFLG FCB 0 Auto drive searching flag MTCHVN FCB $11 Version number 1.1 MLSTFLG FCB 0 Match list flag (set if none) DUMMY RMB 4 Dummy for GETFIL routine MATCHNAM FDB 0,0,0,0 Working match list naDme MATCHEXT FCB 0,0,0 Working match extension RETPTR FDB 0 File name return pointer SAVBUFF FDB 0 Line buffer pointer * MTCHLIST STX RETPTR,PCR File name return pointer TST OPENFLG,PCR Directory open? LBNE GETENT .Yes, Get next entry LDX BUFPNT SaveE line buffer pointer STX SAVBUFF,PCR * Major loop for each drive (then matchlist) DRIVELP TST AUTOFLG,PCR Auto drive searching? LBNE NXTDRV .Yes, next drive FINDRV LDX SAVBUFF,PCR Read first line buffer char LDA ,X CMPA #'. Extension given? BEQ NOFDRV .Yes, no drive number JSR CLASS Numeric char? BCS NODRV .No CMPA #'9 Number? BLS GETDRV .Yes, get drive number NODRV TST OPENFLG,PCR Directory open? BEQ GETWRK .No, get working drive FINISH LDX RETPTR,PCR Resfore return pointer CLR OPENFLG,PCGR Set for re-entry CLR AUTOFLG,PCR ORCC #01 Set out of entries RTS Calling program * GETWRK LEAX FCBCAT,PCR Set working drive LDA WORKDRV STA 3,X BPL LOOP Not auto drive search INC AUTOFLG,PCR Set for auto drive search LBRA NXTDRV GETDRV LDX SAHVBUFF,PCR Restore line buffer pointer STX BUFPNT JSR NXTCH Get drive number CMPA #'3 .Legal drive? LBHI ILLDRV ..No SUBA #'0 .Make it hex LEAX FCBCAT,PCR STA 3,X JSR NXTCH Waste delimeter LBCC SYNTAX If Alphanumeric, syntax error LDX BUFPNT SIave line buffer pointer STX SAVBUFF,PCR BRA LOOP NXTDRV LEAX FCBCAT,PCR Auto drive searching LDA #$14 .Find next drive function STA ,X JSR FMS BNE FINISH If none, return to caller LDX SAVBUFF,PCR Restore line buffer pointer STX BUFPNT .to firstJ match entry LDA ,X STA LASTTRM Restore last terminator * LOOP LBSR CHKEOL End of Line? LBEQ ALLDISK .Yes, no matchlist found LDX BUFPNT Get next buffer char LDA ,X CMPA #'. File extension BEQ NXTPRM .Yes JSR CLASS Alphanumeric? LBCS SYNTAX .NKo CMPA #'A File name? BHS NXTPRM .Yes NXTERM JSR NXTCH Move to next terminator BCC NXTERM BRA LOOP NXTPRM CLR MLSTFLG,PCR Set matchlist found LEAX MATCHNAM,PCR Clear 11 byte name LDB #11 CLRNXT CLR ,X+ DECB BNE CLRNXT LDX BUFPNT Read line buffLer char LDA ,X CMPA #'. Extension? BEQ GETEXT .Yes, get it LEAX MATCHNAM-4,PCR Get file specification JSR GETFIL LBCS SYNTAX .Error BRA DOMATCH GETEXT INC BUFPNT+1 Bump past period LDB #3 Length of extension LEAX MATCHEXT,PCR Point to ExtensioMn NEXTCH JSR NXTCH Read from buffer BCS DOMATCH If terminator, finished STA ,X+ DECB Finished? BPL NEXTCH .No, get another BRA SYNTAX Not delimiter, error * DOMATCH LEAX FCBCAT,PCR Open directory LDA #6 STA ,X JSR FMS BNE ERROR .Disk access erNror INC OPENFLG,PCR .Set open directory flag GETENT LEAX FCBCAT,PCR Get next directory entry LDA #7 .Get information record function STA ,X JSR FMS BNE CHKEOF Error TST 4,X Empty Directory Entry? BEQ EOD .Yes BMI GETENT Deleted entry LDA 15,X OGet file attributes ANDA #$10 .Catalog protect? BNE GETENT .Yes TST MLSTFLG,PCR Match list given? BNE MATCH .No LEAX 4,X Point to catalog file name LEAY MATCHNAM,PCR Point to attempted matching name LDB #11 Length of name-extenstion NXTMTCH LDA P,Y+ Match name character BEQ MTCHCHR .Null char CMPA ,X Character match? BNE GETENT .No MTCHCHR LEAX 1,X Advance a char DECB Finished? BNE NXTMTCH .No MATCH LEAX FCBCAT+3,PCR Point to actual file name LDY RETPTR,PCR Point to return storage locatiQon LDB #12 Number of bytes to transfer MOVEIT LDA ,X+ .Read one char STA ,Y+ .Transfer it DECB Finished? BNE MOVEIT .No, next char LDX RETPTR,PCR Restore return pointer ANDCC #$FE Match name found, clr carry RTS Return to main * CHKEOF LDA 1,X RRead error code CMPA #8 End of file? BNE ERROR .No, Error EOD BSR CHKEOL End of line? LBNE NXTPRM .No LBRA DRIVELP ALLDISK INC MLSTFLG,PCR Signify no match list given BRA DOMATCH * SYNTAX LDB #26 Syntax error code BRA STRERR Tell it ILLDRV LDB #15S Illegal drive error code STRERR LEAX FCBCAT,PCR Point to FCB for STB 1,X .Reporting system errors ERROR JSR RPTERR JSR FMSCLS Close any mainline files JMP WARMS Exit to Flex CHKEOL LDA LASTTRM Check for end of line CMPA #$0D CR? BEQ EOLRTS .Yes, Treturn with EQ set CMPA EOL Flex end of line char? EOLRTS RTS Return with status in CC * END BACKUP ! +& ( 'N'I+& 4 ',&05 B&| S&| ' & Cf$} '?$ҽ<E'@&;ŽC0Ć.& Z&.& Z& "= @} '&'H'6&jO &R'' M'q&i&d ۽&]&X&SO&O1?ˆ& &*&!<E?~Checksum of Total checksum of all file#s listed = Not a valid binary filePWm&m&T䦄.' !%9#m'90r *Dl&'3"00P'$ 0;&'¾.'!%A$'$ oC0D oZ&.' 0,-% |0&'%Z* s0dž&rl0&@m'B+&m&01 '&0Z&0 Z&9&"&\l  0N?~ '9 CHECKSUM   The CHECKSUM command is used to compute a 24 bit checksum for disk files. The checksum can be used to verify file and disk integrity. A single file, matchlist of files, or all the files on one or more disks can be done. File copying, archiving, and verifing PROM programmer results are some of the most useful applications.   DESCRIPTION  The general syntax of the CHECKSUM command is:  CHECKSUM[,][,][,+(options)]  where can be one or more drive numbers separated by commas/spaces.  is a set of name and/or extension characters to be matched against names in the disk directory. For example, if only file names which started with the characters 'VE' were to be checksummed, then VE would be an entry in the match list. If only files with 'TXT' extensions were to be done, then .TXT should be used in the match list. Two options are also supported. If a +B option is given, then all binary and command files will have the checksums calculated on the data areas of the file only (no load information, transfer addresses ...) The checksum can then be used to check the result of most PROM programmers (calculated by straight binary addition). A +S option will print the Sum of all files calculated during execution. Saves comparing effort when copying many files.  EXAMPLES  +++CHECKSUM +++CHECKSUM,1,A.Z,B +++CHECKSUM,0,1,A,A.CMD,.CMD,+BS  The first example will calculate a checksum for all file names on the working drive or on all drives if auto drive searching is set. The second example will do drive 1 for all files that begin with A and have first extension character of Z, and all files that have a B for the first character. The last example will use the same matchlist for each drive. Files having an A as first character, first character A and extenstion of .CMD, and .CMD files will have a checksum calculated. The options will cause binar y files to have data only added and a summation of all the above files listed. A complete matchlist is done for a disk before going on to the next disk. Since each matchlist entry is independent, it is possible to calculate a file more than o nce. ABC.CMD would have been done three times.   All Flex error handling and conventions are supported including ignoring files that are catalog protected. The handling of the line buffer, matchlist, directory searching and returning of a v alid file name was written as a position independent subroutine which could be of use in other programs.  Version 1.0 JUN 82 Ken Smith and John Higley  Non-commercial license for this version is granted by the authors. This utility may be freely copied by any hobbyist so long as credit to the authors is given, and this restriction is included.   OPT PAG NAM CHECKSUM UTILITY PAG * Ken S. Smith, John M. Higley * 13455 SW Driftwood Place * Beaverton, OR 97005 * Tek (503) 627-2319 * JUN 82 * * The following description can be printed and put in * the FLEX manual. (Change *'s to 6 spaces) * CHECKSUM * * * The CHECKSUM command is used to compute a 24 bit checksum * for disk files. The checksum can be used to verify file * and disk integrity. A single file, matchlist of files, or all * the files on one or more disks can be done. File copying, * archiving, and verifing PROM programmer results are some of the * most useful applications. * DESCRIPTION * The general syntax of the CHECKSUM command is: * CHECKSUM[,][,][,+(options)] * where can be one or more drive numbers separated by * commas/spaces.  is a set of name and/or extension * characters to be matched against names in the disk directory. * For example, if only file names which started with the characters * 'VE' were to be checksummed, then VE would be an entry in the match * list. If only files with 'TXT' extensions were to be done, then * .TXT should be used in the match list. Two options are also * supported. If a +B option is given, then all binary and * command files will have the checksums calculated on the data * areas of the file only (no load information, transfer addresses ...) * The checksum can then be used to check the result of most PROM * programmers (calculated by straight binary addition). A +S * option will print the Sum of all files calculated during * execution. Saves comparing effort when copying many files. * EXAMPLES * +++CHECKSUM * +++CHECKSUM,1,A.Z,B * +++CHECKSUM,0,1,A,A.CMD,.CMD,+BS * The first example will calculate a checksum for all file names on * the working drive or on all drives if auto drive searching is set. * The second example will do drive 1 for all files that begin with * A and have first extension character of Z, and all files that * have a B for the first cha racter. The last example will use the * same matchlist for each drive. Files having an A as first * character, first character A and extenstion of .CMD, and .CMD * files will have a checksum calculated. The options will cause * binary files to have  data only added and a summation of all * the above files listed. A complete matchlist is done for a * disk before going on to the next disk. Since each matchlist * entry is independent, it is possible to calculate a file more than * once. ABC.CMD wo uld have been done three times. * All Flex error handling and conventions are supported including * ignoring files that are catalog protected. The handling of the * line buffer, matchlist, directory searching and returning of a valid * file name was written as a position independent subroutine which * could be of use in other programs. * Version 1.0 JUN 82 Ken Smith and John Higley * Non-commercial license for this version is granted by the authors. * This utility may be freely copied by any  hobbyist so long as credit * to the authors is given, and this restriction is included. * * Flex System equates CLASS EQU $CD21 Classify character GETFIL EQU $CD2D Input file spec from buffer NXTCH EQU $CD27 Get next buffer char OUTADR EQU $CD45 Output HEX address OUTHEX EQU $CD3C Output HEX number PCRLF EQU $CD24 Output CR LF PSTRNG EQU $CD1E Output messages PUTCHR EQU $CD18 Output single character RPTERR EQU $CD3F Report disk error SETEXT EQU $CD33 Set disk extension WARMS EQU $CD03 FLEX warm start * FLEX VARIABLES LASTTRM EQU $CC11 Last terminator BUFPNT EQU $CC14 Line buffer pointer EOL EQU $CC02 End of line char WORKDRV EQU $CC0C Working drive * FMS equates FMS EQU $D406 File management entry FMSCLS EQU $D403 File management close entry FCB EQU $C840 File control block * ORG $C100 CHECK BRA START Branch around temps FCB $10 Version number 1.0 CKSUM FCB 0,0,0 Cumulative checksum of data TCKSUM FCB 0,0,0 Total of checksums SUMFLG FCB 0 Overall checksum list flag BINFLG FCB 0 Binary file mode flag * Program starts here * Search line buffer for options START LDX BUFPNT Current buffer position LDA ,X First char of buffer CMPA #'+ Only options entered? BNE CHARSRCH .No, normal search LDA EOL Replace option symbol STA ,X+ .Point to first option char BRA OPTSRCH CHARSRCH LDA ,X+ Check buffer for options CMPA #$0D CR ? BEQ NXTFILE .Yes, no options found CMPA EOL Flex end of line char ? BEQ NXTFILE .Yes, no options found CMPA #'+ Option character? BNE CHARSRCH .No, next character * Options exist, set them up and clean up line buffer so FLEX * will not get indigestion, and multi command lines will work. LDB #$20 Replace option symbol STB -1,X PSHS X Start of option char(s) SPACLP LDA ,-X CMPA #$20 .Space ? BEQ SPACLP ..Y es, get next char back CMPA #', .Comma ? BNE NOTCOMMA ..No, replace space LEAX -1,X .Replace comma NOTCOMMA LDB EOL STB 1,X PULS X OPTSRCH LDA ,X+ Get next option character LDB #$20 Replace option char STB -1,X CMPA #'B Binary file option? BNE! SUMTST .no, test end of line INC BINFLG .Set binary file option BRA OPTSRCH SUMTST CMPA #'S Total sum option? BNE EOLTST .No, test if end of line INC SUMFLG .Yes, set option flag EOLTST CMPA EOL Flex end of line char ? BEQ NXTFILE .Yes, options d"one CMPA #$0D CR ? BNE OPTSRCH .No, next option character * The cleaned up buffer looks like 2 command lines to Flex * with the second looking like a CR only LDB #$0D Restore the CR STB -1,X * Clear total checksum of all files CLR TCKSUM CLR TCKS#UM+1 CLR TCKSUM+2 * Get next file name to work on NXTFILE LDX #FCB+3 File name return JSR MTCHLIST Get next file name LBCC FILEFND File name found, work on it ** All files done, print (if Sum option) total checksum and exit TST SUMFLG Total sum opt$ion? LBEQ EXIT .No, exit JSR PCRLF Output heading LDX #MESS2 JSR PSTRNG LDX #TCKSUM Output closing checksum JSR OUTHEX .Upper byte LDX #TCKSUM+1 .Lower bytes JSR OUTADR LBRA EXIT * Prepare to access disk file FILEFND LDX #FCB Open file for read LDA #1 STA 0,X JSR FMS LBNE ERR .Report any errors LDA #$FF Turn off space compression STA 59,X * Clear checksum in memory CLR CKSUM CLR CKSUM+1 CLR CKSUM+2 * Print heading and file name LDX #MESS1 Output heading JSR PSTRNG LDX #FCB+3 Out drive number LDA ,X+ ADDA #'0 .make it ASCII JSR PUTCHR LDA #'. Out dot JSR PUTCHR LDB #8 Output 8 char name NAMELP LDA 0,X+ CMPA #$00 .Null? BNE NOTNUL .No, leave char alone LDA #$20 .Replace with a space NOTNUL JSR PUTCHR DECB BNE NAMELP  LDA #'. Out dot JSR PUTCHR LDB #3 Output 3 char ext EXTLP LDA 0,X+ CMPA #$00 .Null? BNE NONULL1 .No, leave char alone LDA #$20 .Replace with a space NONULL1 JSR PUTCHR DECB BNE EXTLP LDA #$20 SPACE JSR PUTCHR LDA #'= JSR PUTCHR LDA #$20 SPACE JSR PUTCHR * Normal or binary file mode LDX #FCB Point to FCB TST BINFLG Binary option flag set? BEQ NORMAL .No, normal mode JSR FMS Read first byte of file LBNE DONE .Error CMPA #$02 Binary file? LBEQ LOADPT .Yes, a load entry CMPA #$16 LBEQ TXPT .Yes, a transfer address STA CKSUM+2 Include first byte * The normal mode of checksum calculation also includes any * codes used to store information (space compression, * transfer addresses, load info ...) NORMAL JSR FMS Read a data byte LBNE DONE .Error or end of file TFR A,B Form a 16 bit number CLRA ADDD CKSUM+1 Add (24 bit) to memory location STD CKSUM+1 LDA CKSUM ADCA #00 STA CKSUM BRA NORMAL * This section calculates checksum based on data only for * a binary file (no load info or transfer addresses). This * mode will give a result that will match most PROM programmers NEXTREC JSR FMS Read first byte of record BNE DONE .Any error should be EOF CMPA #2 Load address? BEQ LOADPT .Yes, work on it CMPA #$16 Transfer poi nt? BEQ TXPT .Yes, work on it TSTA Null? BEQ NEXTREC .Yes, ignore LDX #NOTBIN Error in binary file JSR PSTRNG LBRA ERR+3 TXPT JSR FMS Waste transfer address BNE ERR JSR FMS BNE ERR BRA NEXTREC Next record * LOADPT JSR FMS Waste load address  !BNE ERR JSR FMS BNE ERR JSR FMS Get record length BNE ERR TFR A,B .Length into B CLRA .Clear the most sig TFR D,Y .Length into Y reg * CALSUM JSR FMS Read a data byte LBNE DONE Errors or end of file TFR A,B Form a 16 bit number CLRA ADDD CKS "UM+1 Add (24 bit) to memory location STD CKSUM+1 LDA CKSUM ADCA #00 STA CKSUM LEAY -1,Y All bytes calculated? BNE CALSUM .No, continue BRA NEXTREC * DONE LDA 1,X Check disk error CMPA #8 End of File? BNE ERR .No! Report it LDA #4 Close files  # STA 0,X JSR FMS BNE ERR LDX #CKSUM Output closing checksum JSR OUTHEX .Upper byte LDX #CKSUM+1 .Lower bytes JSR OUTADR LDD CKSUM+1 24 bit add to total checksum ADDD TCKSUM+1 .Lower 16 bits STD TCKSUM+1 LDA CKSUM .Upper 8 bits ADCA TCKSUM S $TA TCKSUM LBRA NXTFILE Repeat for next file * ERR JSR RPTERR Report the disk error EXIT JSR FMSCLS Close all files JMP WARMS Back to FLEX * Messages MESS1 FCC 'Checksum of ' FCB 4 MESS2 FCC 'Total checksum of all files listed = ' FCB 4 NOTBIN FCC ' %Not a valid binary file' FCB 4 * Subroutines STTL Disk file matchlist search subroutine PAG ************************************************************** * NAME: * MTCHLIST (RETURN MATCHING FILE NAMES) * DESCRIPTION: * This routine will take a& match list from the line buffer * and return the next matching file name to the 12 bytes * initially pointed to by the X reg. Each succeeding * call will return the following match until carry is * set (no more). All line buffer handling, disk ac'cesses * (directory reading) and error checking is done. * Arguments should be in form of * [,][,] * For further details see use in such as CHECKSUM. * INPUT: X reg. (file name returned in next 12 bytes) * OUTPUT: Carry( bit (set if no more file names found) * REGISTERS/VARIABLES (IN)DIRECTLY MODIFIED: * A, B, Y, CC * SUBROUTINES,GLOBAL VARIABLES DIRECTLY ACCESSED(%=MODIFIED): * CLASS, GETFIL, NXTCH, RPTERR, WARMS * EOL, %LASTTRM, %BUFPNT, WORKDRV * ERROR EXIT:) * A syntax or disk error returns to FLEX (error report) *************************************************************** * INTERNAL VARIABLES/STORAGE FCBCAT RMB 320 File control block OPENFLG FCB 0 Directory open flag AUTOFLG FCB 0 Auto drive searchin*g flag MLSTFLG FCB 0 Match list flag (set if none) DUMMY RMB 4 Dummy for GETFIL routine MATCHNAM FDB 0,0,0,0 Working match list name MATCHEXT FCB 0,0,0 Working match extension RETPTR FDB 0 File name return pointer SAVBUFF FDB 0 Line buffer pointer * MT+CHLIST STX RETPTR,PCR File name return pointer TST OPENFLG,PCR Directory open? LBNE GETENT .Yes, Get next entry LDX BUFPNT Save line buffer pointer STX SAVBUFF,PCR * Major loop for each drive (then matchlist) DRIVELP TST AUTOFLG,PCR Auto drive sear,ching? LBNE NXTDRV .Yes, next drive FINDRV LDX SAVBUFF,PCR Read first line buffer char LDA ,X CMPA #'. Extension given? BEQ NODRV .Yes, no drive number JSR CLASS Numeric char? BCS NODRV .No CMPA #'9 Number? BLS GETDRV .Yes, get drive number NOD-RV TST OPENFLG,PCR Directory open? BEQ GETWRK .No, get working drive FINISH LDX RETPTR,PCR Resfore return pointer ORCC #01 Set out of entries RTS Calling program * GETWRK LEAX FCBCAT,PCR Set working drive LDA WORKDRV STA 3,X BPL LOOP Not auto dri.ve search INC AUTOFLG,PCR Set for auto drive search LBRA NXTDRV GETDRV LDX SAVBUFF,PCR Restore line buffer pointer STX BUFPNT JSR NXTCH Get drive number CMPA #'3 .Legal drive? LBHI ILLDRV ..No SUBA #'0 .Make it hex LEAX FCBCAT,PCR STA 3,X JSR/ NXTCH Waste delimeter LBCC SYNTAX If Alphanumeric, syntax error LDX BUFPNT Save line buffer pointer STX SAVBUFF,PCR BRA LOOP NXTDRV LEAX FCBCAT,PCR Auto drive searching LDA #$14 .Find next drive function STA ,X JSR FMS BNE FINISH If none, retu0rn to caller LDX SAVBUFF,PCR Restore line buffer pointer STX BUFPNT .to first match entry LDA ,X STA LASTTRM Restore last terminator * LOOP LBSR CHKEOL End of Line? LBEQ ALLDISK .Yes, no matchlist found LDX BUFPNT Get next buffer char LDA ,X CM1PA #'. File extension BEQ NXTPRM .Yes JSR CLASS Alphanumeric? LBCS SYNTAX .No CMPA #'A File name? BHS NXTPRM .Yes NXTERM JSR NXTCH Move to next terminator BCC NXTERM BRA LOOP NXTPRM CLR MLSTFLG,PCR Set matchlist found LEAX MATCHNAM,PCR Clear 112 byte name LDB #11 CLRNXT CLR ,X+ DECB BNE CLRNXT LDX BUFPNT Read line buffer char LDA ,X CMPA #'. Extension? BEQ GETEXT .Yes, get it LEAX MATCHNAM-4,PCR Get file specification JSR GETFIL LBCS SYNTAX .Error BRA DOMATCH GETEXT INC BUFPNT+1 Bu3mp past period LDB #3 Length of extension LEAX MATCHEXT,PCR Point to Extension NEXTCH JSR NXTCH Read from buffer BCS DOMATCH If terminator, finished STA ,X+ DECB Finished? BPL NEXTCH .No, get another BRA SYNTAX Not delimiter, error * DOMATCH LEA4X FCBCAT,PCR Open directory LDA #6 STA ,X JSR FMS BNE ERROR .Disk access error INC OPENFLG,PCR .Set open directory flag GETENT LEAX FCBCAT,PCR Get next directory entry LDA #7 .Get information record function STA ,X JSR FMS BNE CHKEOF Error TS5T 4,X Empty Directory Entry? BEQ EOD .Yes BMI GETENT Deleted entry LDA 15,X Get file attributes ANDA #$10 .Catalog protect? BNE GETENT .Yes TST MLSTFLG,PCR Match list given? BNE MATCH .No LEAX 4,X Point to catalog file name LEAY MATCHNAM,PCR P6oint to attempted matching name LDB #11 Length of name-extenstion NXTMTCH LDA ,Y+ Match name character BEQ MTCHCHR .Null char CMPA ,X Character match? BNE GETENT .No MTCHCHR LEAX 1,X Advance a char DECB Finished? BNE NXTMTCH .No MATCH LEAX FCBCAT7+3,PCR Point to actual file name LDY RETPTR,PCR Point to return storage location LDB #12 Number of bytes to transfer MOVEIT LDA ,X+ .Read one char STA ,Y+ .Transfer it DECB Finished? BNE MOVEIT .No, next char LDX RETPTR,PCR Restore return pointer 8 ANDCC #$FE Match name found, clr carry RTS Return to main * CHKEOF LDA 1,X Read error code CMPA #8 End of file? BNE ERROR .No, Error EOD BSR CHKEOL End of line? LBNE NXTPRM .No LBRA DRIVELP ALLDISK INC MLSTFLG,PCR Signify no match list given BR!9A DOMATCH * SYNTAX LDB #26 Syntax error code BRA STRERR Tell it ILLDRV LDB #15 Illegal drive error code STRERR LEAX FCBCAT,PCR Point to FCB for STB 1,X .Reporting system errors ERROR JSR RPTERR JSR FMSCLS Close any mainline files JMP WARMS Exit to :Flex CHKEOL LDA LASTTRM Check for end of line CMPA #$0D CR? BEQ EOLRTS .Yes, return with EQ set CMPA EOL Flex end of line char? EOLRTS RTS Return with status in CC * END CHECK # $}'@&$ G.' !%9#}'~@ *# '@'%~§@ &lBo_9ć½ĊȐ½Ć.Ș½đ½ț9Ĕȝ%0&&Fm+?m*0 *OCQR~B%]'  &9 9@-%U3!%F#'L&6 ' B%* -&B% ' &Î @' A2@?2 ~@ o&fg!# N"#<#!B%ȀB%ȁȀȁ ϗ 1 &*@ & '45/L"q].M'J?@0@& @''*@' ' ' &~!&# &> 0 % $ @@&mA&~A~ % " &'# L_9QožSzŞž^žȀŽ '~ & $  "!$~?Y'y9F"^H%ޗ$4Ȁ6 . %!"!%`F" %  Ľ< ~ħ ~N& ^0ȀD kP&^0 R&~ &' &N Y ''.'' ','^& ~snv^J ` &@ ~@@&mA&~A4L&O5~ č #0~< 0&9~$@m')0. Z' 0' .0Z&\9;Ȁ$ 0Z& ~%. ".0Z&$9 STARTING ENDING  TRK $ SEC $ LAST  PRESENT LINK  SECTOR COUNT  Link, Next, $Previous, Reprompt, HEX ADDRESS, CAR RTN: REPLACE :  WITH :  OKAY TO REPLACE THIS SECTOR (Y-N)?  0 1 2 3 4 5 6 7 8 9 \ A B C D E F 0123456789ABCDEFENTER MAX TRK,SEC (eg 22,0A or 4C,0F):  1.P.BIN 3-5 L = list sectors 3 to 5 0 1A 9 CB = drv trk sec byte ENTER FILE NAME OR TRACK AND SECTOR: IGNORE CRC  ERROR? (Y/N): 99 NAM DISKEDIT OPT PAG PAG * DISKEDIT DUMPS FLEX SECTORS AS HEX AND * ASCII. DISPLAYS LOCATION AND DATA, CHANGES * MAY BE PATCHED AND RECORDED IN DISK SECTOR. * * CALLING FORMATS: * * DISKEDIT 1.PROG.CMD file name * DISKEDIT 1.PROG.CMD 3-5 3rd-5th sectors * DISKEDIT 1.PROG.CMD B 13th sector onward * DISKEDIT 1.PROG.CMD L list non-stop * DISKEDIT 2 1A trk sec * DISKEDIT 1 D 5 drv trk sec * DISKEDIT 0 21 5 DE drv trk sec byte * * ALL FORMATS: DEFAULT DRIVE IS WORK DRIVE, * DEFAULT EXTENSION IS .CMD, ALL ENTRIES ARE * IN HEX AND DO NOT REQUIRE LEADING ZEROS, FLEX * ESCAPE AND EXIT CONVENTIONS HONORED, FLEX * PAUSE IS DISABLED BUT RESTORED WHEN FINISHED. * LIST PRINTS THREE SECTORS (63 LINES) PER PAGE. * * ORIGINAL AUTHOR KENNETH ERICKSON * * CONVERTED TO FLEX BY BRUNO PUGLIA. * ADDED SPACES IN DATA DUMP FOR EASIER READING. * ADDED PATCH AREAS FOR FORM FEEDS, HOMEUP, ETC. * * IMPROVED BY LEO TAYLOR. * FIXED CLOSE FILE, ADDED COMMENTS. * SIMPLIFIED SECTOR MEMORY EDITING. * ADDED NEXT, PREV, REPROMPT COMMANDS. * ADDED TRACK SECTOR BYTE MODE. * IMPROVED PROMPTS AND ERROR REPORTING. * ADDED TRYSIR TO GET MAXIMUM TRK AND SEC. * * COMMANDS: * * L LINK NEXT FILE SECTOR (DEFAULT) * N NEXT HIGHER DISK SECTOR * P PREVIOUS LOWER DISK SECTOR * R REPROMPT NEW FILE OR SECTOR * HEX SECTOR ADDRESS TO CHANGE (0-FF) * CR RETURN TO FLEX * PAG * ADDRESS ASSIGNMENTS: * * CHANGE THE NEXT EQUATE FOR CPU * $A000 FOR 6800 OR $C000 FOR 6809 * FLEX EQU $C000 FCB EQU FLEX+$840 FILE CONTROL BLOCK DRV EQU FCB+3 LOCATION IN FCB TRK EQU FCB+$11 LOCATION IN FCB SEC EQU FCB+$12 LOCATION IN FCB EOL EQU FLEX+$C02 TTYSET END OF LINE PAUSE EQU FLEX+$C09 PAUSE FLAG WASN EQU FLEX+$C0C WORK DRIVE ASSIGNED LSTTRM EQU FLEX+$C11 LAST TERMINATOR LBPNTR EQU FLEX +$C14 LINE BUFFER POINTER WARMS EQU FLEX+$D03 WARMSTART GETCHR EQU FLEX+$D15 GET CHARACTER PUTCHR EQU FLEX+$D18 PUT CHARACTER INBUFF EQU FLEX+$D1B INPUT TO BUFFER PSTRNG EQU FLEX+$D1E OUTPUT DATA STRING CLASS EQU FLEX+$D21 CLASIFY CHAR TYPE PCRLF EQU F LEX+$D24 CRLF NXTCH EQU FLEX+$D27 NEXT BUFFER CHAR RSTRIO EQU FLEX+$D2A RESTORE I-O VECTORS GETFIL EQU FLEX+$D2D GET FILE NAME SETEXT EQU FLEX+$D33 SET FILE TYPE ADDBX EQU FLEX+$D36 ADD B REG TO X REG OUTDEC EQU FLEX+$D39 OUTPUT DECIMAL NUMBER OUTHEX  EQU FLEX+$D3C OUTPUT HEX NUMBER RPTERR EQU FLEX+$D3F REPORT ERROR GETHEX EQU FLEX+$D42 HEX CHAR FROM BUFFER FMSCLS EQU FLEX+$1403 FMS CLOSE FMS EQU FLEX+$1406 FMS CALL SPC 2 * VARIABLES * PSETMP RMB 1 SAVE FLEX PAUSE CNT16 RMB 1 HEX COUNTER 10,20,30 E TC BYT RMB 1 BYTE WITHIN SECTOR BYTFLG RMB 1 0=FOUND BYTE PAGCNT RMB 1 COUNT SECTORS PER PAGE CHNGFLG RMB 1 CHANGE OF SECTOR PENDING LISTFLG RMB 1 LIST TO PRINTER PREVTRK RMB 1 LAST TRACK EXAMINIED PREVSEC RMB 1 LAST SECTOR EXAMINED SECNUM RMB 2 RECORD NUMBER IN FILE FIRSTS RMB 2 FIRST SECTOR FROM USER LASTSEC RMB 2 LAST SECTOR FROM USER DTAREG RMB 2 SCRATCH DATA REGISTER BUFTEMP RMB 2 SAVE POINTERS BYTENUM RMB 1 BYTE BEING MODIFIED NUMBUF RMB 4 NUMBER BUFFER TEMP1 RMB 2 SCRATCH MAXTRK RMB 1 HIGHEST TRACK ON DISK MAXSEC RMB 1 HIGHEST SECTOR ON DISK PAG * DISK SECTOR EDIT PROGRAM * ORG $0100 SPC 2 START BRA START1 VN FCB 3 VERSION BRA START1 WARM START SPC 2 * USER DEFINED AREA * * TWO SETS OF MEMORY EDIT CHARACTERS * FORM FEED STRING * BACKWRD EQU ', COMMA BACKW2 EQU '^ UP ARROW ALTERNATE FORWARD EQU 27 ESCAPE FORWA2 EQU '. PERIOD ALTERNATE STOP EQU 3 CONTROL C STOP2 EQU $D RETURN ALTERNATE FORMFD FCB $C,0,4 PRINTER FORM FEED CLRSCR FCB $C,0,4 DISPLAY CLEAR SCREEN SPC 3 * START BY SETTING UP VARIABLES * START1 LDAA PAUSE SAVE OLD PAUSE STAA PSETMP LDAA LSTTRM CMPA #$D NOTHING? BNE START3 LDX #HLPMSG JSR PSTRNG START2 LDX #PROMSG JSR PSTRNG JSR INBUFF GET LINE START3 LDX #CNT16 CLRVBL CLR 0,X CLEAR VARIABLES INX CPX #MAXSEC+1 BNE CLRVBL LDX #$FFFF STX LASTSEC SET TO MAX STX NUMBUF+1 FLAG EMPTY INC BYTFLG BYTE NOT FOUND YET LDX LBPNTR STX BUFTEMP SAVE POINTER CLR FCB+4 FIRST CHAR OF NAME SPC 3 * READ 2-4 NUMBERS INTO NUMBUF * CHECK FOR DRV, TRK, SEC, BYT * LDX #NUMBUF STX TEMP1 REDNUM BSR INHEX READ BUFFER BCS NONUM BAD HEX OR EOL? LDX TEMP1 STAA 0,X PUT IN BUFFER INX STX TEMP1 CPX #NUMBUF+4 BNE REDNUM BUFFER FULL? CLR BYTFLG GOT 4TH NUMBER NONUM BNE FILMOD NOT EOL? LDX #NUMBUF TST 1,X BMI FILMOD ONLY ONE NUMBER? LDAA 0,X MAY BE DRV TST 2,X 3 OR MORE NUMBERS? BPL GOTDRV DEX 1ST NUM NOT DRV LDAA WASN USE WORK DRIVE BPL GOTDRV ALL=$FF CLRA 0 FOR ALL GOTDRV ANDA #7 INSURE 1-7 STAA DRV LDAA 1,X TRACK STAA TRK LDAA 2,X SECTOR STAA SEC LDAA 3,X BYTE NOT VALID IF STAA BYT BYTFLG=1 JMP TRYSIR SPC 3 * GET BYTE FROM BUFFER AND CHECK IF VALID * INHEX JSR GETHEX BCS BADHEX TSTB BEQ BADHEX NO NUM STX DTAREG TST DTAREG FIRST BYTE ZERO? BNE BADHEX LDAA DTAREG+1 GET BYTE CLC FLAG GOOD HEX RTS BADHEX LDAA LSTTRM CMPA #$D EOL? SEC RTS SPC 3 * GET FILE NAME FROM LINE BUFFER THEN * CHECK FOR OPTIONS. * FILMOD LDX BUFTEMP STX LBPNTR RESTORE POINTER LDX #FCB JSR GETFIL GET FILE NAME BCS ERROR LDAA #2 JSR SETEXT SET COMMAND DEFAULT BUFLOOP LDX LBPNTR LDAA 0,X JSR CLASS CLASSIFY IT BCS TRYDASH CMPA #'F IS IT HEX NUMBER? BLS TRYNUM JSR NXTCH CMPA #'L BNE SYNERR INC LISTFLG JSR NXTCH BRA BUFLOOP SPC 2 TRYNUM JSR GETHEX GET FIRST USER SECTOR BCS SYNERR STX FIRSTS  LDAA LSTTRM TRYDASH CMPA #$2D - BNE TSTTRM JSR GETHEX GET LAST USER SECTOR BCS SYNERR STX LASTSEC TSTTRM LDAA LSTTRM CMPA EOL BEQ OPENFIL CMPA #$D BNE BUFLOOP OPENFIL LDX #FCB LDAA #1 STAA 0,X JSR FMS OPEN FILE BEQ TRYSIR BRA ERROR SPC 3 * ERROR HANDLING * SYNERR LDAA #26 ERRORA STAA FCB+1 ERROR JSR RESETD RESET BEFORE MESSAGE LDX #FCB JSR RPTERR EXIT JSR FMSCLS CLOSE ALL JSR RESETD RESTORE DISPLAY LDAA PSETMP STAA PAUSE RESTORE OLD PAUSE JMP WARMS SPC 3 * TRY SYSTEM INFORMATION RECORD FOR MAXIMUM * TRACK AND SECTOR NUMBER. IF THE SIR CAN'T * BE READ OR IF DATA IS UNRELIABLE THE USER * IS PROMPTED TO ENTER MAX TRACK AND SECTOR. * TRYSIR LDX #FCB LDAA #9 STAA 0,X READ CLR 30,X TRACK ZERO LDAA #3 STAA 31,X SECTOR 3 JSR FMS BNE BADATA UNABLE TO READ SIR LDAA $66,X GET MAX TRACK LDAB $67,X GET MAX SECTOR TRYLOOP CMPA #33 MINIMUM TRACK BLS BADATA CMPA #78 MAXIMUM TRACK BHI BADATA CMPB #8 MINIMUM SECTOR BLS BADATA CMPB #60 MAXIMUM SECTOR BLS MAXOK SPC 3 * PROMPT USER FOR MAX TRACK AND SECTOR * BADATA LDX #MAXMES JSR PSTRNG DISPLAY MESSAGE JSR INBUFF GET RESPONSE JSR GETHEX BCS BADATA STX FCB+64 USE AS SCRATCH JSR GETHEX BCS BADATA LDAA FCB+65 GET TRACK STX FCB+64 LDAB FCB+65 GET SECTOR BRA TRYLOOP SPC 3 * GOT MAXIMUMS, PREPARE TO READ SECTOR * MAXOK STAA MAXTRK SAVE MAXIMUMS STAB MAXSEC CLR PAUSE NO PAUSE DURING USE JSR SETUPD INITIALIZE DISPLAY TST LISTFLG BNE GETTS JSR RSTRIO GETTS LDX #FCB LDAA $11,X LDAB $12,X GETNEXT TST PAGCNT BNE NOPAGE TST LISTFLG BEQ NOPAGE PSHA STX DTAREG LDX #FORMFD JSR PDATAS FEED TO NEXT PAGE LDX DTAREG PULA NOPAGE CMPB MAXSEC PAST END OF TRACK? BLE UNDERM LDAB #1 FIRST SECTOR INCA NEXT TRACK UNDERM CMPA MAXTRK TOO FAR? BHI EXIT3 ABORT IF TRACK>MAXTRK TSTB BGT SECOK TSTA BEQ SECOK ALLOW TRK 0 SEC 0 LDAB MAXSEC MOVE TO PREVIOUS TRACK DECA SECOK STAA $1E,X TRK,SEC TO READ STAB $1F,X LDAA #'? QUESTION MARK SETFCB STAA $40,X PRESET DATA INX CPX #FCB+256 BNE SETFCB LDAA #9 RWSECT LDX #FCB STAA 0,X JSR FMS READ OR WRITE SECTOR BEQ READOK SPC 3 * Convert R/W sector error to FLEX error * LDAB 1,X Get R/W error BPL NOBIT7 LDAA #16 Drive not ready NOBIT7 BITB #$40 BEQ NOBIT6 LDAA #11 Write protected NOBIT6 BITB #$20 BEQ  NOBIT5 LDAA #10 Write error NOBIT5 BITB #$10 BEQ NOBIT4 LDAA #9 Use for sector not found NOBIT4 BITB #$F BNE REDERR JMP ERRORA Report new error in A REDERR LDX #CRCERR JSR GETMSG GET RESPONSE BNE EXIT3 READOK TST CHNGFLG BNE NOTLAST LDX SECNU! M INX STX SECNUM LDAA SECNUM CMPA FIRSTS BCS NOTYET LDAA SECNUM+1 CMPA FIRSTS+1 BCC TRYLAST NOTYET LDX #FCB LDAA $40,X BNE LINKOK TST $41,X IF LINK=0000 THEN EXIT BNE LINKOK EXIT3 JMP EXIT SPC 1 LINKOK LDAB $1E,X STAB PREVTRK LDAB $1F,X"! STAB PREVSEC LDAB $41,X JMP NOPAGE GET ANOTHER SECTOR SPC 2 TRYLAST LDAA SECNUM CMPA LASTSEC BCS NOTLAST LDAA SECNUM+1 CMPA LASTSEC+1 BHI EXIT3 NOTLAST CLR CHNGFLG TST LISTFLAG BNE SKPFORM LDX #CLRSCR JSR PDATAS SKPFORM JSR DSPNAME PRINT#" NAME IF VALID BEQ SKIPSOM LDX #SECCNT JSR PDATAS LDX #SECNUM CLRB JSR OUTDEC PRINT RECORD NUMBER LDX FCB+$11 STX DTAREG LDX #STARTIN JSR TRKSEC PRINT STARTING SECTOR LDX FCB+$13 STX DTAREG LDX #ENDING JSR TRKSEC PRINT ENDING SECTOR SKI$#PSOM LDX PREVTRK STX DTAREG LDX #LAST JSR TRKSEC PRINT PREVIOUS SECTOR LDX FCB+$1E STX DTAREG LDX #PRSENT JSR TRKSEC PRINT CURRENT SECTOR LDX FCB+$40 STX DTAREG LDX #NEXT JSR TRKSEC PRINT NEXT SECTOR JSR PHEAD GO PRINT HEADER TST LISTFLG $BEQ TRYBYT JMP ADVANCE TRYBYT TST BYTFLG BYTE IN COMMAND LINE? BNE GETCOM JSR PCRLF INC BYTFLG ONLY USE ONCE LDAA BYT BRA SETBYT SPC 3 * COMMAND INPUT SECTION * GETCOM LDX #COMMAND BSR GETMSG JSR CLASS BCC ISALPH JMP CHKMODE NOT ALPHA=ADVA%NCE GETMSG JSR PSTRNG PRINT MESSAGE JSR GETCHR GET REPONSE CMPA #'Y YES? BEQ YES CMPA #'y LOWER CASE YES RTS ISALPH CMPA #'F HIGHEST HEX BHI TRYMOR TEST OTHER COMMANDS BSR BYTEIN COMPLETE BYTE BCS GETCOM BAD HEX SETBYT STAA BYTENUM NEXTBYT JSR& PCRLF LDX #BYTENUM POINT AT ADDR BSR OUTHXS LDX #FCB+$40 START OF DATA LDAB BYTENUM JSR ADDBX STX BUFTEMP SAVE FOR LATER LDAA 0,X CMPA #$20 PRINTABLE? BGT *+4 LDAA #$20 SPACE INSTEAD BSR PUTCISL DISPLAY ASCII BSR OUTSPC BSR OUTHXS DISPLAY' HEX CONTENTS IGNORE JSR GETCHR WAIT FOR RESPONSE JSR CLASS BCS NOTALPH CMPA #'F BHI ONWARD G AND HIGHER BSR BYTEIN FINISH BYTE BCS ONWARD BAD HEX LDX BUFTEMP STAA 0,X STORE IN SECTOR LDAA #1 STAA CHNGFLG ONWARD INC BYTENUM ALLOW WRAP AROUND ( BRA NEXTBYT SPC 2 OUTHXS JSR OUTHEX OUTSPC LDAA #$20 SPACE PUTCISL JMP PUTCHR SPC 2 BYTEIN LDX #NUMBUF SMALL BUFFER STX LBPNTR FAKE LINE INPUT STAA 0,X FIRST CHAR IN JSR GETCHR GET SECOND NIBBLE STAA 1,X LDAA #$D TERMINATOR STAA 2,X JMP INHEX) READ BUFFER SPC 3 TRYMOR CMPA #'N BNE NOTN LDX FCB+$1E CURRENT SECTOR INX MOVE TO NEXT FORCE STX FCB+$40 FORCE LINK CLR FCB+4 FLAG LINK CHAIN BROKEN BRA ADVANCE NOTN CMPA #'P BNE NOTP LDX FCB+$1E CURRENT SECTOR DEX MOVE BACK ONE SECTOR BRA *FORCE NOTP CMPA #'R BNE CHKMODE JSR FMSCLS CLOSE ANY FILE JMP START2 SPC 1 CHKMODE TST CHNGFLG BNE TRYREP CMPA #$D BNE ADVANCE BRA EXIT4 QUIT SPC 3 * MEMORY EDIT SECTION * NOTALPH CMPA #$20 SPACE ENTERED? BEQ IGNORE CMPA #FORWARD BEQ ONWARD+ CMPA #FORWA2 BEQ ONWARD CMPA #STOP BEQ CHKMODE DISPLAY SECTOR CMPA #STOP2 BEQ CHKMODE CMPA #BACKWRD BEQ GOBACK CMPA #BACKW2 BNE ONWARD GOBACK DEC BYTENUM BACK UP IN FCB JMP NEXTBYT SPC 3 TRYREP LDX #CLRSCR BSR PDATAS LDX #REPLAC BSR PD ,ATAS REQUEST REPLACE BSR DSPNAME LDX FCB+$1E STX DTAREG BSR TRKSE2 LDX #WITH BSR PDATAS JSR PHEAD GO PRINT HEADER LDX #OKTREP JSR GETMSG BNE ADVANCE LDX #FCB LDAA #$A JMP RWSECT SPC 3 * ADVANCE TO NEXT SECTOR * ADVANCE LDX #FCB LDAA $40 -,X IF LINK=0000 THEN EXIT BNE NOTZERO TST $41,X BNE NOTZERO EXIT4 JMP EXIT SPC 1 NOTZERO LDAB $1E,X STAB PREVTRK LDAB $1F,X STAB PREVSEC LDAB $41,X CLR CHNGFLG PSHA LDAA PAGCNT INCA CMPA #3 SECTORS PER PAGE BNE NOTPAG CLRA NOTPAG STAA . PAGCNT PULA JMP GETNEXT SPC 3 * DISPLAY MESSAGE PLUS TRK AND SEC FROM DTAREG * TRKSEC BSR PDATAS TRKSE2 LDX #TRKNO BSR PDATAS LDX #DTAREG BSR OUTHX2 LDX #SECNO BSR PDATAS LDX #DTAREG INX OUTHX2 JMP OUTHEX SPC 3 * PRINT DATA STRING * PD /LOOP BSR PUTCH2 INX PDATAS LDAA 0,X CMPA #4 BNE PDLOOP RTS PUTCH2 JMP PUTCHR ISLAND SPC 3 * DISPLAY FILE NAME IF ANY * DSPNAME JSR PCRLF LDX #FCB TST 4,X VALID NAME AVAILABLE? BEQ NONAME LDAA 3,X ORAA #'0 BSR PUTCH2 DRIVE NUMBER LDAA #'.  0BSR PUTCH2 LDAB #9 PNTNAM DECB BEQ PNTNA2 INX LDAA 3,X BEQ PNTNAM BSR PUTCH2 BRA PNTNAME PNTNA2 LDAA #'. BSR PUTCH2 LDAB #3 PNTEXT INX LDAA 3,X BSR PUTCH2 DECB BNE PNTEXT INCB FLAG NAME DONE NONAME RTS SPC 3 * HEX DUMP SECTION * PHEA1D LDX #HEADER JSR PSTRNG LDX #FCB+$40 STX DTAREG CLR CNT16 SET HEX COUNTER TO 00 NLINE JSR PCRLF START NEW LINE OF DUMP LDX #CNT16 HEX COUNTER 10,20,30 ETC BSR OUTHX2 PRINT HEX COUNTER LDAA #$20 PRINT SPACE BSR PUTCH2 LDX DTAREG GET DATA LOCAT2ION LDAB #$10 SET FOR 16 ACROSS DPRINT JSR OUTHXS PRINT DATA INX DECB BNE DPRINT PRINT TILL DONE LDAA #$20 SPACE LDAB #$10 SET ASCII FOR 16 ACROSS BSR PUTCH2 LDX DTAREG RESTORE POINTER SPC 3 * ASCII DUMP SECTION * ASCDMP LDAA 0,X CMPA #$7E 3OVER 7E ? BCS QCR NO,CHECK FOR $D OR BELOW LDAA #'. OVER 7E PRINT A PERIOD BRA GPRINT ASCII SO PRINT IT QCR CMPA #$1F 1F OR BELOW ? BHI GPRINT IF>1F PRINT ASCII CHARACTER LDAA #'. PERIOD FOR $1F AND BELOW GPRINT BSR PUTCH2 INX +1 TO ADDRESS DEC4B BNE ASCDMP STX DTAREG UPDATE POINTER LDAA CNT16 HEX COUNTER 10,20,30 ETC ADDA #$10 ADD $10 FOR NEXT SET STAA CNT16 HEX COUNTER 10,20,30 ETC BCC NLINE NO CARRY,DO NEXT LINE RTS CARRY SET, ALL DONE... SPC 3 * MESSAGES * STARTIN FCB $D,$A FCC5 'STARTING' FCB 4 ENDING FCC ' ENDING ' FCB 4 TRKNO FCC ' TRK $' FCB 4 SECNO FCC ' SEC $' FCB 4 LAST FCB $D,$A FCC 'LAST ' FCB 4 PRSENT FCC ' PRESENT' FCB 4 NEXT FCB $D,$A FCC 'LINK ' FCB 4 SECCNT FCC ' SECTOR COUNT ' FCB 4 COMMAND FCB $6D,$A FCC 'Link, Next, Previous, ' FCC 'Reprompt, HEX ADDRESS, ' FCC 'CAR RTN: ' FCB 4 REPLAC FCC 'REPLACE :' FCB $D,$A FCB $D,$A FCB 4 WITH FCC ' WITH :' FCB $D,$A FCB 4 OKTREP FCB $D,$A FCC 'OKAY TO REPLACE' FCC ' THIS SECTOR (Y' FCC '-N)7? ' FCB 7 BEEP FCB 4 HEADER FCC ' 0 1 2 3 4 ' FCC '5 6 7 8 9 A B C ' FCC ' D E F 012345678' FCC '9ABCDEF' FCB 4 MAXMES FCC 'ENTER MAX TRK,SEC ' FCC '(eg 22,0A or 4C,0F): ' FCB 4 HLPMSG FCB $D,$A FCC '1.P.BIN 3-5 L ' FCC '= li8st sectors 3 to 5' FCB $D,$A FCC '0 1A 9 CB ' FCC '= drv trk sec byte' FCB 4 PROMSG FCB $D,$A FCC 'ENTER FILE NAME OR ' FCC 'TRACK AND SECTOR: ' FCB 4 CRCERR FCC 'IGNORE CRC ERROR? (Y/N): ' FCB 7,4 SPC 3 * THIS SECTION CAN BE USED FOR SETTING9 UP DISPLAY * SETUPD RTS RESETD RTS SPC 2 END START  separated, and followed by a * non-alphanumeric delimiter. This allows * swapping words that contain a period. The * maximum total characters (not including * delimiters) in a word pair is 32. This * is set during assembly by WPSIZE EQU XX. * This number must be a power of two and * shouldn't need to be changed. A few word * pair examples follow: * * OLD.NEW (replace OLD with NEW) * apple.pear (lower case accepted) * Apple.PEAR (note case must be exact} * " I " me " (spaces isolate letter) * .ZB406.FMS. (used by SUPER SLEUTH) * /1.23/ABCD/ (period part of word) * eliminate (change word to nothing) * PAG ******************************************* * * Equates * WPSIZE EQU 32 CHANGE WITH CAUTION! MASK EQU 256-WPSIZE FLEX EQU $C000 START OF FLEX LSTTRM EQU FLEX+$C11 MEMEND EQU FLEX+$C2B WARMS EQU FLEX+$D03 PUTCHR EQU FLEX+$D18 PSTRNG EQU FLEX+$D1E CLASS EQU FLEX+$D21 GETFIL EQU FLEX+$D2D SETEXT EQU FLEX+$D33 RPTERR EQU FLEX+$D3F INDEC EQU FLEX+$D48 FMSCLS EQU FLEX+$1403 FMS EQU FLEX+$1406 ORG 0 TEMPS ON BASE PAGE TOP RMB 2 LOWEST ADDRESS ENTRY TOPMOV RMB 2 MOVING TOP MIDDLE RMB 2 CURRENT CENTER BOTMOV RMB 2 MOVING BOTTOM BOTTOM RMB 2 NEXT EMPTY LOCATION TXTEND RMB 2 END OF SOURCE TEXT RAMEND RMB 2 END OF TEXT BUFFER TEMP1 RMB 2 T EMP2 RMB 2 DONFLG RMB 1 FILE DONE DUPFLG RMB 1 DUPLICATE WORD DELIM RMB 1 WORD PAIR DELIMITER DLMFLG RMB 1 FOUND DELIMITER COUNT RMB 1 CHARACTER COUNT WRDBUF RMB WPSIZE SAVE WORD PAIR WRDEND RMB 2 OVERFLOW BYTES PAG *********************************** ******** * * EXECUTIVE PROGRAM CALLS SUBROUTINES * ORG $100 WSWAP BRA EXEC VN FCB 2 VERSION NUMBER EXEC BSR INIT SET UP BSR PARSE READ COMMAND LINE LBSR DUMMY INSERT DUMMY ENTRIES LEAX REDMSG,PCR JSR PSTRNG LBSR RDPAIR READ WORD LIST FILE TS T DUPFLG BNE ABORT IDENTICAL PAIRS? NEWBUF LEAX TXTMSG,PCR JSR PSTRNG LBSR RDTEXT READ FIRST TEXT BUFFER LEAX PROMSG,PCR JSR PSTRNG LBSR PROCESS PROCESS OUTPUT FILE TST DONFLG SOURCE FILE COMPLETE? BEQ NEWBUF READ ANOTHER BUFFER LBSR CLOSE CLO SE ALL FILES LEAX FINMSG,PCR PNTMSG JSR PSTRNG PRINT MESSAGE BRA EXIT SPC 3 ******************************************* * * INITIAL SET UP * INIT LDX #TOP CLRTMP CLR 0,X+ CLEAR TEMPS CPX #WRDEND BLS CLRTMP LDD MEMEND SUBA #8 LEAVE ROOM FOR EXEC  ANDB #MASK EVEN BOUNDS FOR TESTING STD RAMEND LDD #ENDPRG END+WPSIZE ANDB #MASK EVEN BOUNDS FOR TESTING STD TOP START OF WORD PAIRS RTS SPC 3 ******************************************* * * PARSE COMMAND LINE FOR FILES TO OPEN * * PARSE LEAX HLP!MSG,PCR LDA LSTTRM HELP WANTED? CMPA #$D BEQ PNTMSG LEAX FCBSRC,PCR JSR GETFIL GET NAME OF FILE BCS ERROR LDA #1 SET FOR READ STA 0,X JSR SETEXT SET EXTENSION JSR FMS OPEN FOR READ BEQ OPENOK ERROR JSR RPTERR DISPLAY ERROR ABORT JSR FMSCLS "EXIT JMP WARMS OPENOK LEAX FCBDES,PCR JSR GETFIL GET NAME OF FILE BCS ERROR LDA #1 JSR SETEXT SET EXTENSION LDA #2 SET FOR WRITE STA 0,X JSR FMS OPEN FOR WRITE BNE ERROR LEAX FCBWL,PCR JSR GETFIL GET NAME OF FILE BCS ERROR LDA #1 SET FOR #READ STA 0,X JSR SETEXT SET EXTENSION JSR FMS OPEN FOR READ BNE ERROR RTS SPC 3 * PRESET DUMMY WORD LIST INTO RAM * DUMMY LDX TOP LDA #$20 LDB #WPSIZE FILSPC STA 0,X+ DUMMY START DECB BNE FILSPC LDA #'z LOWER CASE LDB #WPSIZE FILLZ STA 0,X$+ DUMMY END DECB BNE FILLZ STX BOTTOM RTS SPC 3 * READ WORD PAIR AND FORMAT * RDPAIR CLR DELIM NO DELIMITER DEFINED CLR DLMFLG NO DELIMITER FOUND LDU #WRDBUF LEAX FCBWL,PCR WORD LIST LDB #WPSIZE MAX SIZE STB COUNT RPAIR JSR FMS READ CHAR BEQ  NOTDON LDA 1,X GET ERROR CMPA #8 EOF? ERROR3 BNE ERROR RTS ALL PAIRS READ NOTDON TST DELIM SET YET? BNE DELSET CMPA #$D NULL ENTRY? BEQ RDPAIR IGNORE EMPTY LINES LDB #'. DEFAULT STB DELIM SET TO PERIOD JSR CLASS ALPHANUMERIC? BCC DELSET CHA R STILL IN A STAA DELIM SET DELIMITER BRA RPAIR DELSET CMPA #$D END OF PAIR? BEQ WRDONE CMPA DELIM BNE NOTDLM NOT DELIMITER? INC DLMFLG BRA RPAIR GET ANOTHER CHAR NOTDLM TST DLMFLG LAST CHAR=DELIMITER? BEQ NOPAR ORA #$80 SET PARITY BIT NOPAR  STA 0,U+ CLR DLMFLG DEC COUNT BPL RPAIR GET ANOTHER LEAX SIZMSG,PCR ENTRY TOO LONG JSR PSTRNG LEAX FCBWL,PCR LONG JSR FMS FINISH WORD BNE ERROR3 CMPA #$D END OF LINE? BNE LONG LDB #$80 STB 0,U TERMINATE BRA BADWRD PRINT BAD ENTRY WRDONE C LR 0,U+ MARK END OF PAIR DEC COUNT FILL OUT BUFFER BPL WRDONE SPC 3 * FIND HOLE FOR NEW WORD * LDX TOP RESET TO FULL SIZE STX TOPMOV LDX BOTTOM STX BOTMOV FHOLE LDD TOPMOV FHOLE2 ADDD BOTMOV RORA DIVIDE BY TWO RORB ANDB #MASK ROUND DOWN STD MIDDLE ADDD #WPSIZE NEXT WORD STD TEMP1 ADDD #WPSIZE STD TEMP2 NEXT AFTER THAT LDX MIDDLE BSR COMPAR WRDBUF VS MIDDLE BNE NOTDUP DBL LEAX DOUBLE,PCR WRD = STRING JSR PSTRNG BADWRD INC DUPFLG LDX #WRDBUF PNTDUP LDAA 0,X+ BMI RDPAR2 JSR PUTCHR  PRINT DUPLICATE BRA PNTDUP NOTDUP BCS TRYNXT LDX MIDDLE WRD < STRING STX BOTMOV BRA FHOLE HIGHER LDD MIDDLE STD TOPMOV BRA FHOLE2 TRYNXT LDX TEMP1 NEXT AFTER MIDDLE BSR COMPAR WRDBUF VS TEMP1 BEQ DBL BCS HIGHER WRD > TEMP1 LDU BOTTOM MAKE  HOLE IN RAM LEAU WPSIZE,U STU BOTTOM NEW RAM END CMPU RAMEND WORD LIST TOO LONG? BLO FITS LEAX OVERMS,PCR JSR PSTRNG PRINT ERROR LBRA ABORT CLOSE FILES FITS LEAU WPSIZE,U END OF SPACE MOVDWN LDX -(WPSIZE+2),U PSHU X DECREMENT+STORE CMPU TEMP 2 DONE? BNE MOVDWN LDX #WRDEND LDB #WPSIZE MOVWRD LDA 0,-X READ WRD BACKWARDS PSHU A STORE IN HOLE DECB BNE MOVWRD RDPAR2 LBRA RDPAIR SPC 3 * COMPARE STRING IN X TO WRDBUF * * ENTER --- X=STRING * EXIT --- EQUAL SET WRDBUF SAME * CARRY SET WRD BUF LARGER * CARRY CLR WRDBUF SMALLER * COMPAR LDU #WRDBUF COMPA2 LDA 0,X+ GET STRING CHAR BMI STDONE STRING PARITY CMPA 0,U+ GET WRDBUF CHAR BEQ COMPA2 MATCH SO FAR BLT WLARGE CARRY SET CLC WRD SMALLER RTS STDONE LDB 0,U+ BOTH PARITY? BPL WLA RGE CLRB SET EQUAL WLARGE SEC RTS SPC 3 * READ TEXT FILE INTO RAM * RDTEXT LDU BOTTOM START OF TEXT RDLOOP LEAX FCBSRC,PCR JSR FMS READ CHAR BEQ NOERR LDA 1,X GET ERROR NUMBER CMPA #8 END OF FILE BNE ERROR2 INC DONFLG SOURCE FILE COMPLETE STU  TXTEND RTS NOERR STAA 0,U+ SAVE IN BUFFER CMPU RAMEND BLO RDLOOP READ SOME MORE STU TXTEND SOURCE FILE STILL OPEN RETRN2 RTS SPC 3 * PROCESS TEXT * PROCESS LDU BOTTOM START OF SOURCE LEAX FCBDES,PCR OUTPUT FILE MATLOP STU MIDDLE DESTROY OLD MID!DLE STU TEMP1 SAVE ORIGINAL POSITION CMPU TXTEND BEQ RETRN2 END OF BUFFER LDY TOP RESET TO FULL SIZE STY TOPMOV LDY BOTTOM STY BOTMOV FMATCH LDU TEMP1 START OF TEXT WORD LDD TOPMOV ADDD BOTMOV RORA DIVIDE BY TWO RORB ANDB #MASK ROUND DOWN   ĆuqOL^+"q?$& • &^+" ?$~^&ֽ & !% 3"0%09@?~@ ')W when done Remove destination disk, insert source disk Hit when done  * Direct Disk-to-Disk Copy * The destination disk must have been newdisked. * This routine will copy the source disk * verbatim on the destination disk. * If the source disk is the same as the destination disk, * the user will be prompted when to swap diskettes. * Written by * William W. Pfeifer * P.O. Box 102 * Beaverton, OR, 97075 * System Equates Version Equ 1 Version number Memend Equ $CC2B Top of memory Flex Equ $CD03 Warm start entry Fms Equ $D406 File management system Fcb Equ $C840 System  file control block Rpterr Equ $CD3F Error print routine Putchr Equ $CD18 Character output routine Pstring Equ $CE84 String output without CR/LF Crstrng Equ $CD1E String output preceded by CR/LF Linptr Equ $CC14 Input buffer line pointer Class Equ $CD2 1 Classify character Outhex Equ $CD3C Output single hex number Pcrlf Equ $CD24 Print CR/LF Getchr Equ $CD15 get a character from terminal Track Equ Fcb+30 Current track address Sector Equ Fcb+31 Current sector address Ntrks Equ 34 Number of tracks per  disk Nsecs Equ 10 Number of sectors per track Nbyts Equ 256 Number of bytes per sector * Storage Declarations Org $C102 Fcb Version Version Number From Rmb 1 Source drive number To Rmb 1 Destination drive number Memstrt Rmb 2 Start of unused memo ry area Savtrk Rmb 1 Next track to processed Savsec Rmb 1 Next sector to be processed Endvar Equ * End of variables * Macros Print Macro Ldx #&1 point to string Jsr Pstring output it Endm Crprnt Macro Ldx #&1 point to string Jsr Crstrng output it Endm Hexprt Macro Ldx #&1 get address of hex number Jsr Outhex output it Endm Org $C100 in FLEX's utility area Dkcopy Bra Start Org Endvar Start Lda #$C1 Tfr A,Dp Set up direct page register Setdp $C1 Tell the assembler about it Ldx Lin ptr get input buffer pointer Bsr Getdrv Get source drive number Sta From Save it Bsr Getdrv Get destination drive number Sta To Save it Clra Sta Savtrk Initialize track counter Inca Sta Savsec Ditto for sector counter Rd Ldd #0 Std Memstrt Sta  rt at memory bottom Ldd Savtrk Std Track Continue reading where we left off Read Ldd Memstrt Get start of unused buffer area Addd #Nbyts Cmpd Memend Enough left for one more sector? Bhi Rfull Bsr Rdsec Read next sector Jsr Incst Increment sector  and/or track Bcc Read All done? Rfull Lda From Cmpa To Bne Wrt Same Drive? Rprmpt Crprnt Fromto Prompt user to switch diskettes Jsr Getchr Get a response Cmpa #$0D Bne Rprmpt Back if not a CR Wrt Ldd #0 Std Memstrt Start at the beginning Ldd S  avtrk Std Track Write Ldd Memstrt Addd #Nbyts Cmpd Memend Is there a full sector in the buffer left? Bhi Wfull Jsr Wrtsec Write one sector Jsr Incst Increment sector and/or track Bcc Write All done? Jmp Flex Return to FLEX Wfull Ldd Track Std  Savtrk Remember current track and sector Lda From Cmpa To Same drive? Bne Rd Wprmpt Crprnt Tofrom Jsr Getchr Cmpa #$0D Bne Wprmpt Bra Rd * * Subroutines * * Subr: Getdrv - Get drive number Getdrv Lda ,X++ Get character and move pointer 2 beyo  nd Jsr Class Classify it Bcs Synerr Not Alpha-numeric Cmpa #'3 Bhi Synerr >3 - Syntax error Cmpa #'0 Blo Synerr <0 - Syntax error Suba #'0 Make it binary Rts * Subr: Synerr - Report Syntax error Synerr Ldx #Fcb Lda #26 Syntax error code Sta  1,X Error Jsr Rpterr Report error Jmp Flex Back to FLEX * Subr: Rdsec - Read 1 sector Rdsec Ldx #Fcb point to file control block Lda From Sta 3,X Set source drive Lda #9 Sector read command Sta 0,X Jsr Fms Do it. Beq Rdok Any errors? * Print error message Crprnt Rstr Hexprt From Print Tstr Hexprt Track Print Sstr Hexprt Sector Jsr Pcrlf Bra Error Exit to FLEX Rdok Ldd #Nbyts Ldx #Fcb+64 Point to data ares Ldy Memstrt Bsr Move Sty Memstrt Set new Memstrt Rts * Subr: Move - Mov e from X to Y length D Move Ldu ,X++ Stu ,Y++ Subd #2 Bhi Move Rts * Subr: Wtsec - Write 1 sector Wrtsec Ldd #Nbyts Ldx Memstrt Ldy #Fcb+64 Bsr Move Stx Memstrt Ldx #Fcb Point to system Fcb Lda To Sta 3,X Set up destination drive Lda #10  Sector write command Sta 0,X Jsr Fms Do it. Beq Wtok Any Errors? Crprnt Wstr Hexprt To Print Tstr Hexprt Track Print Sstr Hexprt Sector Jsr Pcrlf Jmp Error Wtok Rts * Subr: Incst - Increment sector and/or track Incst Ldd Track Incb Incre !ment sector Cmpb #Nsecs Bls Incrts Over the top? Ldb #1 Yes - Reset sector to zero Inca and increment track Cmpa #Ntrks Bls Incrts Over the top? Sec Yes - set carry Rts Incrts Clc Clear Carry Std Track Store updated track and sector Rts * * "Strings * Rstr Fcc /Read error on Drive / Fcb 4 Tstr Fcc /, Track / Fcb 4 Sstr Fcc /, Sector / Fcb 4 Wstr Fcc /Write error on Drive / Fcb 4 Fromto Fcc /Remove source disk, insert destination disk/ Fdb $0D0A CR/LF fcc /Hit when done / Fcb 4 Tofrom Fcc /Remove destination disk, insert source disk/ Fdb $0D0A Fcc /Hit when done / Fcb 4 End Dkcopy $ ĽH%]'"H%]'"#'' ',''+&u'D&| S&| ''L$DDDD0.0$$"0GB#0M 'ݽ$$O &|@ &Ć O & @&Ć1'?33A'1 &Z&' L&'N&&A0 $ |$$$?~ս @ @ ILLEGAL OPTION SPECIF IEDDKDIFF Utility Version # DKDIFF execution completeChecking differences between drives  and Enter Sany character to continue ( to stop)ܽ#0B3PZ&.3XZ& B0[9)$9Drive #  Name: Vol. # Files NOT found on other drive.NaIme Type Size Date`oA9-J=b:Z&-`B93C9bJanFebMarAprMayJunJulAugSepOctNovDec+ ' 'D% 2b'+ 1Z&1Z&'P oZ&9yExecution aborted - not enough RAM (memory) aream'C+<& Z&.& Z& 09)$ 3 9  OPT PAG NAM DKDIFF UTILITY PAG * Ken S. Smith, John M. Higley * 13455 SW Driftwood Place * Beaverton, OR 97005 * Tek (503) 627-2319 * SEP 82 * * The following description can be printed and put in * the FLEX manual. (Change *'s to 6 spaces) * DK DIFF * * * The DKDIFF utility compares file directory entries * on two disk drives. The unique files for each drive * are listed. Optional date and size comparison can * also be included. * DESCRIPTION * The general syntax of the DKDIFF command is : * DKDIFF,,[,+] * where and can be any legal disk drive * number (can't be equal) separated by commas/spaces. The * order of the drive numbers is not important as the files * that are different will be liste d for each disk separately. * The options supported are D and S. The D option includes * file dates when determining if file entries are equal. * The S option is similar as it includes file size (in sectors) * in the comparison. Both options can be e ntered at the same * time. If no options are included, the comparison will be made * on the file name and extension. This command need not be on * either diskette, as it will wait after loading. DKDIFF * will automatically restart under the same inp ut conditions to * allow convenient comparisons of several pairs of diskettes. * EXAMPLES * +++DKDIFF,0,1 * +++DKDIFF,1,0 * +++DKDIFF,0,2,+DS * The first example will compare drive 0 and drive 1's file * names and extensions, and produce a lis t of file entries that * are not found on the other drive. The second will give the * same results as the first except for the order the lists appear. * The last example adds further to what is compared. File dates * and number of sectors will have to match in order to not be * included on a list. If a duplicate file name exists with a * different date or size, it will be on both drive's lists. * All Flex error handling and conventions are supported including * ignoring files that are catalog p rotected. * Version 1.0 SEP 82 Ken Smith and John Higley * Non-commercial license for this version is granted by the authors. * This utility may be freely copied by any hobbyist so long as credit * to the authors is given, and this restriction is i  ncluded. * * Flex System equates CLASS EQU $CD21 Classify character DATE EQU $CC0E System date registers (3) GETCHR EQU $CD15 Read char from KB INDEC EQU $CD48 Input decimal number NXTCH EQU $CD27 Get next buffer char OUTADR EQU $CD45 Output HEX addre  ss OUTDEC EQU $CD39 Output decimal 2 bytes number OUTHEX EQU $CD3C Output HEX number PCRLF EQU $CD24 Output CR LF PSTRNG EQU $CD1E Output messages PUTCHR EQU $CD18 Output single character RPTERR EQU $CD3F Report disk error SETEXT EQU $CD33 Set disk ext  ension WARMS EQU $CD03 FLEX warm start * FLEX VARIABLES EOL EQU $CC02 End of line char MEMEND EQU $CC2B Available RAM * FMS equates FMS EQU $D406 File management entry FMSCLS EQU $D403 File management close entry OPENDIR EQU $06 FMS open directory GETD  IR EQU $07 FMS get next directory entry OPENSYS EQU $10 FMS open system info record DIRFCB EQU $C840 File control block for directory access DRV1FCB EQU $0000 Drive 1 system info sector DRV2FCB EQU $0320 Drive 2 system info sector * *General equates CO MMDORG EQU $C100 RAMDIR EQU $0800 Beginning of directory RAM area *Disable direct paging SETDP ORG COMMDORG Flex command area DKDIFF BRA START Around version, variables FCB $10 Version # (position dependant) DATEOPT FCB $00 Date option flag SIZEOP T FCB $00 Size option flag RAMDR2 RMB 2 Beginning of dir 2 in RAM *Start of program *Get drive numbers from input buffer START JSR INDEC Get drive 1 number LBCS SYNERR .not a number TSTB .anything? LBEQ SYNERR ..no data found TFR X,D .into B acc C MPB #3 Legal drive # ? LBHI ILDRIV .not legal STB DRV1FCB+3 Put into drive1 FCB JSR INDEC Get drive 2 number LBCS SYNERR .not a number TSTB .anything? LBEQ SYNERR ..no data found TFR X,D .into B acc CMPB #3 Legal drive # ? LBHI ILDRIV .not leg al STB DRV2FCB+3 Put in drive 2 FCB CMPB DRV1FCB+3 Same drive? LBEQ SYNERR .syntax error *Get options (if any) from line buffer. JSR NXTCH CMPA #$0D End of options? BEQ OPTDONE .Yes CMPA EOL End of options? BEQ OPTDONE .Yes CMPA #'+ Options fo und? LBNE SYNERR .No, syntax trouble OPTIONLP JSR NXTCH CMPA #'D Date option? BNE NODATE .No INC DATEOPT Set date compare flag BRA OPTIONLP NODATE CMPA #'S Size option? BNE NOSIZE .No INC SIZEOPT Set size compare flag BRA OPTIONLP NOSIZE CMPA # $0D End of options? BEQ OPTDONE .Yes CMPA EOL End of options? BEQ OPTDONE .Yes LBRA OPTERR Unidentified option character *Print utility name and version # OPTDONE JSR PCRLF LDX #VERSNMS Message JSR PSTRNG LDA COMMDORG+2 Version number LSRA .Mos t significant LSRA LSRA LSRA ADDA #$30 .Make ASCII JSR PUTCHR LDA #'. JSR PUTCHR LDA COMMDORG+2 ANDA #$0F .Least significant digit ADDA #$30 .Make ASCII JSR PUTCHR JSR PCRLF JSR PCRLF *Prompt user to insert disks, continue PROGLP LDX #OPER MS JSR PSTRNG LDA DRV1FCB+3 First drive number ADDA #$30 .Make ASCII JSR PUTCHR LDX #ANDMS LDU PSTRNG+1 .No CR LF JSR 2,U LDA DRV2FCB+3 Second drive number ADDA #$30 .Make ASCII JSR PUTCHR LDX #WAITMS JSR PSTRNG JSR GETCHR User input CMPA  #$0D .CR? LBEQ MESSEXIT ..Yes, exit program JSR PCRLF JSR PCRLF *Get drive 1 name (whole system info sector) LDX #DRV1FCB CLRA Set for track zero STA 30,X LDA #$03 Sector three STA 31,X LDA #$09 Low level read STA 0,X JSR FMS LBNE ERR .Err or check *Print headings for drive 1 LDY #DRV1FCB Info sector contains drive name JSR PRTHEAD *Read directory 1 into memory LDX #DRV1FCB Get drive number LDA 3,X LDX #DIRFCB STA 3,X LDA #OPENDIR Open directory STA ,X JSR FMS LBNE SYNERR .Erro r check LDU #RAMDIR Directory storage area beginning JSR READDIR STU RAMDR2 Starting point for directory 2 *Get drive 2 name (whole system info sector) LDX #DRV2FCB CLRA Set for track zero STA 30,X LDA #$03 Sector three STA 31,X LDA #$09 Low l evel read STA 0,X JSR FMS LBNE ERR .Error check *Read directory 2 into memory LDX #DRV2FCB Get drive number LDA 3,X LDX #DIRFCB STA 3,X LDA #OPENDIR Open directory STA ,X JSR FMS LBNE SYNERR .Error check LDU RAMDR2 Directory storage area be ginning JSR READDIR *Compare directory entries in RAM and if equal mark out LDX #RAMDIR-1 X is first dir pointer LDY RAMDR2 Y holds start of dir2 for quick reloads LEAY -17,Y .Adjust for pre incrementing DIR1LP LDA 1,X End of directory 1? BEQ PRIN T .Yes LEAU ,Y U is second dir pointer DIR2LP LEAU 16,U Next dir 2 entry LDA 1,U End of directory 2? BEQ INCDR1 .Yes LDB #11 Compare name CMPNAMLP LDA B,X CMPA B,U BNE DIR2LP .No match DECB BNE CMPNAMLP LDA SIZEOPT Size option? BEQ SIZNOT .No  LDD 12,X Compare size CMPD 12,U BNE INCDR1 .No match SIZNOT LDA DATEOPT Date option? BEQ DATNOT .No LDD 14,X Compare date CMPD 14,U BNE INCDR1 .No match month,day LDA 16,X CMPA 16,U BNE INCDR1 .No match year DATNOT LDA #$FF Match found, mark ! out duplicate entries STA 1,X STA 1,U INCDR1 LEAX 16,X Next dir 1 entry BRA DIR1LP *Print unique directory entries for first drive PRINT JSR PCRLF LDU #RAMDIR JSR PRTDIRLP *Print headings for drive 2 LDY #DRV2FCB Info sector contains drive name " JSR PRTHEAD *Print unique directory entries for second drive JSR PCRLF LDU RAMDR2 JSR PRTDIRLP LBRA PROGLP Restart program *Execution complete, print end message and exit MESSEXIT JSR PCRLF JSR PCRLF LDX #ENDMS JSR PSTRNG LBRA EXIT *Error rep #orting and exits ERR JSR RPTERR Tell the error ERRXIT JSR FMSCLS Close all files EXIT JMP WARMS Return to FLEX OPTERR LDX #ILLOPT Illegal option message JSR PSTRNG BRA ERRXIT Exit to FLEX SYNERR LDX #DIRFCB LDA #26 Syntax error code STA 1,X BRA ER $ R ILDRIV LDX #DIRFCB LDA #15 Illegal drive error code STA 1,X BRA ERR *Messages ILLOPTMS FCC 'ILLEGAL OPTION SPECIFIED',4 VERSNMS FCC 'DKDIFF Utility Version # ',4 ENDMS FCC 'DKDIFF execution complete',4 OPERMS FCC 'Checking differences between driv !es ',4 ANDMS FCC ' and ',4 WAITMS FCC 'Enter any character to continue ( to stop)',4 *Subroutines *Print headings subroutine *On entry Y should point to FCB containing disk name PRTHEAD LDX #DRIVEMS Drive number message JSR PSTRNG LDA 3,Y .Driv "e number ADDA #$30 .Make ASCII JSR PUTCHR LDX #DKNAMEMS Drive name message LDU PSTRNG+1 .No CR,LF JSR 2,U LDB #8 .Number of char in name LEAU 80,Y .Drive name location NAMELP LDA ,U+ .Single char of name JSR PUTCHR DECB .Name all out? BNE NAM #ELP ..No LDA #'. .Period out JSR PUTCHR LDB #3 .Number of char in extension LEAU 88,Y .Extension location EXTLP LDA ,U+ .Single char of extension JSR PUTCHR DECB .Extension all out? BNE EXTLP ..No LDA #$20 .Space JSR PUTCHR JSR PUTCHR LDX #V $OLMS Volume number message LDU PSTRNG+1 .No CR,LF JSR 2,U LEAX 91,Y .Volume number JSR OUTDEC LDU #DATE Location of FLEX date registers JSR PRTDATE Output date LDX #FILNOTMS .Header message JSR PSTRNG JSR PCRLF LDX #HEADERMS .Header,label mes %sage JSR PSTRNG RTS *Messages for print date subroutine DRIVEMS FCC 'Drive # ',4 DKNAMEMS FCC ' Name: ',4 VOLMS FCC 'Vol. # ',4 FILNOTMS FCC 'Files NOT found on other drive.',4 HEADERMS FCC 'Name Type Size Date',4 *Print date *On entry U reg points &to date,exit U point to byte after PRTDATE LDX #SCRATCH Temp for OUTDEC routine CLR 0,X LDB 1,U Read the day STB 1,X JSR OUTDEC Output with leading spaces LDA #'- JSR PUTCHR LDA ,U Read the month DECA LDB #3 MUL Calculate offset for month LD 'X #MONTHMS ABX LDB #3 3 chars WRDAT3 LDA ,X+ .read the letter of the month JSR PUTCHR DECB . finished yet? BNE WRDAT3 . no, do next character LDA #'- JSR PUTCHR LDX #SCRATCH LDA 2,U Read the year STA 1,X JSR OUTDEC Output w/o leading spaces ( LEAU 3,U Beyond date RTS SCRATCH RMB 2 Temp RAM area MONTHMS FCC 'JanFebMarAprMayJunJulAugSepOctNovDec' *Read directory into RAM subroutine *On entry directory should be open with X pointing to the FCB. *U reg is used to point to beginning of RAM ar )ea. READDIR LDD MEMEND FLEX memory end SUBD #$0020 .Size of 2 dir entries STD ADJMEND .Do not exceed value DIRENTLP LDA #GETDIR Get next dir entry STA 0,X JSR FMS BEQ NOERR .Good directory read LDA 1,X .Error code CMPA #8 .End of file? BEQ ALLR *EAD ..Yes LBRA ERR .Error found NOERR CMPU ADJMEND RAM area available for entry BLO ENOGHRAM .Yes LDX #OUTRAM Out of RAM message JSR PSTRNG LEAS 2,S Clean off return address LBRA EXIT *Transfer directory entry from FCB to RAM area ENOGHRAM LDA 4, +X Directory entry status? BEQ DIRENTLP .Not used entry BMI DIRENTLP .Deleted entry LDB #11 File name and extension LEAY 4,X DIRNMLP LDA ,Y+ STA ,U+ DECB BNE DIRNMLP LDY 21,X File size STY ,U++ LDB #3 Date of dir entry LEAY 25,X DIRDATLP LDA ,,Y+ STA ,U+ DECB BNE DIRDATLP *Mark out entry if catalog protected LDA 15,X ANDA #$10 Catalog protect bit? BEQ DIRENTLP .No LDA #$FF Delete entry STA -16,U BRA DIRENTLP *Create final directory entry of all zeros ALLREAD LDB #16 End of dir zero - entry CLRLP CLR ,U+ DECB BNE CLRLP RTS ADJMEND RMB 2 Adjusted memory end OUTRAM FCC 'Execution aborted - not enough RAM (memory) area',4 *Print directory entries subroutine *On entry U points to first RAM dir entry and continues until *finding a d .ir entry of zeros. PRTDIRLP TST 0,U Status of dir entry BEQ ENDRDR .Last entry BMI DELENT .Marked out (deleted) entry LDB #8 Print 8 char name PNAMELP LDA 0,U+ CMPA #$00 .Null? BNE NOTNUL ..No LDA #$20 .Space NOTNUL JSR PUTCHR DECB BNE PNAMELP / LDA #'. Out period JSR PUTCHR LDB #3 Out 3 char extension PEXTLP LDA 0,U+ CMPA #$00 .Null? BNE NONULL ..No LDA #$20 .Space NONULL JSR PUTCHR DECB BNE PEXTLP LDA #$20 Out spaces JSR PUTCHR JSR PUTCHR LEAX 0,U++ Out file size LDB #1 .Spaces 0instead of leading zeros JSR OUTDEC JSR PRTDATE Out date JSR PCRLF BRA PRTDIRLP DELENT LEAU 16,U BRA PRTDIRLP ENDRDR RTS END START  !H% ]'  @ &ϽȐ.Ș~޽ț9$Ͻ? 'H Ȑ'.' &Z& 'Z ޽?Hț@ &~?~*'Z&9_9NAME OF DISK: VOLUME NUMBER:   DKNAME The DKNAME command is used to read or change the disk name and volume number. It allows for the use of disk extensions in the name. DESCRIPTION The general syntax of the DKNAME command is: DKNAME[,] where is the number of the drive containing the disk you wish to change. The default is the working drive. Example: +++DKNAME,1 The command will display the current name and volume number of the disk. It will then prompt for the new name. A c arriage return will cause the program to exit without changing the disk. The new name is entered as: SOURCE 2.BAK The volume number is then entered as a number (0-65535). The name allows up to eight characters including spaces (no periods), and the extension allows up to three characters.  OPT PAG NAM DISK NAME UTILITY PAG * * DKNAME Disk Name Utility * * Don Van Beek (V1.0) * John Higley (extensively revised to V2.0) * Component Engineering * Tektronix, Inc. * * Misc Equates DRVLOC EQU 3 Loc of Drive number in FCB TRKLOC EQU 30  Loc of track and sector for reading NAMLOC EQU 80 Loc of disk name EXTLOC EQU 88 Loc of disk extension VLMLOC EQU 91 Loc of disk volume number * * FLEX Variables BUFPTR EQU $CC14 LSTTRM EQU $CC11 Last terminator from line buffer WRKDRV EQU $CC0C Work ing drive number * * FLEX routines INBUFF EQU $CD1B INDEC EQU $CD48 NEXTCH EQU $CD27 OUTDEC EQU $CD39 PCRLF EQU $CD24 PSTRNG EQU $CD1E PUTCHR EQU $CD18 RPTERR EQU $CD3F WARMS EQU $CD03 * * FMS routines FMSCLS EQU $D403 FMSCLL EQU $D406 * * File Cont rol Block FCB EQU $C840 * ORG $C100 DKNAME BRA START VERSION FCB $21 Version 2.1 2 Dec 81 START JSR INDEC Get drive number BCS WORKING Invalid..use working drive TSTB .any number? BEQ WORKING . No, use working drive TFR X,D Drive number into B AN DB #3 Remove garbage (0-3 only) BRA SETDRV WORKING LDB WRKDRV Get working drive number SETDRV LDX #FCB Point to FCB STB DRVLOC,X Put drive num into FCB LDD #$0003 Set up to read system trk and sec STD TRKLOC,X Store track and sec into FCB LDA #$09  Set for read a sector STA $00,X JSR FMSCLL Read the sector LBNE ERROR .report any error LDX #DSKNAM JSR PSTRNG Put out disk name LDX #FCB+NAMLOC .Point to it LDB #8 .Eight characters LBSR PSTNGL LDA #'. Put out disk extension JSR PUTCHR .Out put a dot LDB #3 .Three characters LDX #FCB+EXTLOC .Point to disk ext BSR PSTNGL . Output it LDX #VOLNUM Output the volume number JSR PSTRNG LDX #FCB+VLMLOC JSR OUTDEC JSR PCRLF LDX #DSKNAM Get new disk name JSR PSTRNG .output disk name messs age LDA #'? .make it a question JSR PUTCHR JSR INBUFF . answer into line buffer LDY BUFPTR Point to buffer LDA 0,Y Change the name? CMPA #$0D .CR? BEQ NOCHNG .Yes. No name change * * Get name and extension from buffer LDB #11 Eleven characters  LDY #FCB+NAMLOC Point to name NAMLUP JSR NEXTCH Get a character CMPA #'. A dot as a delimeter (name.ext) BEQ EXTENS .Yes.. next 3 for extension CMPA #$0D CR? BNE SETIT .No.. store the character in name LDA #0 .Yes.. remaining bytes are null SETI  T STA ,Y+ Save the byte and point to next DECB Done yet? BNE NAMLUP .No.. Get next char (CR will be maintained) BRA VOLUME Get volume number EXTENS CMPB #3 3 bytes left for ext BEQ NAMLUP .Yes.. get them LDA #0 .Else.. clear rest of name STA ,Y+ DECB Done yet? BRA EXTENS .check VOLUME LDX #VOLNUM Get new volume number JSR PSTRNG .output the message LDA #'? .make it a question JSR PUTCHR JSR INBUFF . answer into line buffer LDX #BUFPTR Get volume number from buffer JSR INDEC STX FCB+VL ! MLOC .store it WRITE LDX #FCB Write a single sector LDA #$0A STA $00,X JSR FMSCLL .do it BNE ERROR .report any errors NOCHNG JSR FMSCLS Close the file and goto FLEX JMP WARMS ERROR JSR RPTERR Report error, close file, goto FLEX JSR FMSCLS JMP WA " RMS * * PSTNGL: Output 'B' char or until null PSTNGL LDA ,X+ Read the character BEQ PSTRTS .null, stop output of string JSR PUTCHR Output it DECB Done yet? BNE PSTNGL .No..get next char RTS .Yes..go back PSTRTS CLRB Clear counter (no string left) RTS .go back * * Messages DSKNAM FCC /NAME OF DISK: / FCB 4 VOLNUM FCC /VOLUME NUMBER: / FCB 4 END DKNAME $ NAM FLEX2 - DISK DRIVERS OPT PAG PAG * FLEX DISK DRIVERS * * GENERAL NOTES: * * THIS DISK DRIVER PROGRAM IS WRITTEN * FOR USE WITH THE F&D MDI-1 CONTROLLER. * IT WILL OPERATE WITH THE SWTP MF-68 * CONTROLLER IF THE LINES MARKED <<< ARE * DELETED. OT HER CONTROLLERS MAY WORK IF * THEY ARE SIMILAR TO THE MF-68. WHEN USED * WITH THE F&D CONTROLLER THE DRIVER WILL * SUPPORT MIXED 5 AND 8 INCH SINGLE DENSITY * DRIVES. EACH DRIVE MAY HAVE A DIFFERENT * STEP SPEED. DOUBLE SIDED IS SUPPORTED * WITH THE LI MITATION THAT THERE IS ONLY * ONE SIDE SIZE EQUATE. THIS MEANS YOU MAY * HAVE ONLY ONE SIZE DOUBLE SIDED DRIVE * MIXED WITH ANY SIZE SINGLE SIDED DRIVE. * THIS DRIVER IS LONGER THAN THE DRIVER * SUPPLIED WITH FLEX; BE SURE YOU HAVE * ENOUGH ROOM. * * Y OU MUST SET UP THE STEP SPEED TABLE AND * DRIVE TYPE TABLE BEFORE ASSEMBLING THIS * PROGRAM. FOR EXAMPLE THIS PROGRAM IS * DISTRIBUTED SET UP FOR THE FOLLOWING * MIXTURE OF DRIVES: * * 0 SINGLE SIDED 5 INCH 20 MSEC (SA-400) * 1 DOUBLE SIDED 5 INCH 12  MSEC (T100-2) * 2 SINGLE SIDED 8 INCH 8 MSEC (SA-901) * 3 SINGLE SIDED 8 INCH 8 MSEC (SA-800) * * 6809 ADAPTATION CONSISTS OF CHANGING * THREE EQUATES, ELIMINATING THE AUTO- * CONFIGURE BLOCK, AND ADDING 'JMP DINIT' * AFTER 'QCHECK JMP QCHEK1' * *  SYSTEM EQUATES * FLEX EQU $A000 START OF FLEX DRIVER EQU $BE80 DRIVER AREA COMREG EQU $8018 COMMAND/STATUS COLDS EQU FLEX+$D00 FBFLAG EQU FLEX+$C34 FOREGROUND/BACKROUND DRVREG EQU COMREG-4 DRIVE NUMBER TYPREG EQU COMREG-3 DRIVE TYPE FOR F&D TRKREG E QU COMREG+1 TRACK SECREG EQU COMREG+2 SECTOR DATREG EQU COMREG+3 DATA SIDSIZ EQU 10 SIZE OF FIRST SIDE PAG * ENTRY POINT JUMP TABLE * ORG $BE80 SPC 1 READ JMP READ1 WRITE JMP WRITE1 VERIFY JMP VRIFY1 RESTOR JMP RESTR1 DRIVE JMP DRIVE1 CHECK JMP QCHE K1 QCHECK JMP QCHEK1 SPC 3 * THE FOLLOWING 4 BYTES PLUS TRACK TABLE * ARE REFERENCED BY THE FMS. THESE BYTES * SHOULD NOT BE MOVED. * DRIVEN FCB 0 CURRENT DRIVE NUMBER STEPSP FCB 0 CURRENT STEP SPEED DRVTYP FCB 0 CURRENT DRIVE TYPE FCB 0 SPARE SPC 3  * TRACK TABLE STORES HEAD POSITION (TRACK) * FOR EACH DRIVE WHEN IT ISN'T BEING USED. * TRKTBL FCB 0 0 FCB 0 1 FCB 0 2 FCB 0 3 SPC 3 * DRIVE STEP SPEED IN MSEC FOR 1771: * * BYTE $18 $19 $1A $1B * FIVE IN. 12 16 20 40 * EIGHT IN. 6 8 10  20 * STPTBL FCB $1A 0 FCB $18 1 FCB $19 2 FCB $19 3 TEMPX FDB 0 SAVE X REG SPC 3 * AUTO-CONFIGURE BLOCK OF ADDRESSES. * THIS TABLE IS REFERENCED BY FLEX-2 * AND SHOULD NOT BE MOVED. * INVECT FDB $E1AC OUTVEC FDB $E1D1 ACIA FDB $8004 TIMER FDB $801 0 IRQ FDB $A000 SWI FDB $A012 MONITR FDB $E0D0 PCV FDB $A048 SPC 3 * F&D DRIVE TYPE BIT ASSIGNMENTS: * * 7 6 5 4 3-0 * * SIZE DENS SIDE FREQ NONE * TYPTBL FCB 0 0 FCB $20 1 FCB $90 2 FCB $90 3 SPC 3 * READ SECTOR * READ1 BSR SEEK LDAA #$ 88 NO HEAD LOAD TST FBFLAG BEQ READ2 SWI READ2 NOP SEI STAA COMREG BSR DELAY BRA READ4 SPC 1 READ3 LDAA DATREG GET CHAR STAA 0,X STORE IN FCB INX READ4 LDAB COMREG WAIT FOR DATA BITB #2 BNE READ3 BITB #1 BNE READ4 BSR WAIT BITB #$1C SET CONDITION CODES BRA CLRINT SPC 3 * SEEK TRACK A SECTOR B * SEEK STAA DATREG DESIRED TRACK BSR DELAY STAB SECREG DESIRED SECTOR BSR DELAY LDAA DRVTYP 5/8 INCH S/D SIDED <<< CMPB #SIDSIZ SIDE TWO? <<< BHI SIDTWO KEEP SIDE BIT <<< ANDA #$DF FO RCE SIDE ONE <<< SIDTWO STAA TYPREG SET DRV TYPE <<< LDAA STEPSP ALWAYS LOAD HEAD DOCOM STAA COMREG BSR DELAY SPC 3 * WAIT UNTIL READY * WAIT TST FBFLAG BEQ WAIT2 SWI WAIT2 LDAB COMREG BITB #1 BNE WAIT DINIT RTS SPC 3 * WASTE TIME FOR COMMAND  TO TAKE * DELAY BSR DELAY2 DELAY2 BSR DELAY3 DELAY3 BSR DELAY4 DELAY4 RTS SPC 3 * WRITE SECTOR * WRITE1 BSR SEEK LDAA #$AC TST FBFLAG BEQ WRITE2 SWI WRITE2 NOP SEI STAA COMREG WRITE COMMAND BSR DELAY BRA WRITE5 GET FIRST BYTE SPC 1 WRITE3 ST AA DATREG WRITE CHAR WRITE5 LDAA 0,X GET CHAR FROM FCB INX WRITE4 LDAB COMREG BITB #2 BNE WRITE3 BITB #1 BNE WRITE4 BSR WAIT BITB #$5C CLRINT NOP CLI RTS SPC 3 * VERIFY LAST SECTOR WITH DUMMY READ. * ONLY PERFORMS CRC CHECK ON SECTOR. * VRIFY 1 LDAA #$8C TST FBFLAG BEQ VRIFY2 SWI VRIFY2 NOP SEI BSR DOCOM BITB #$18 BRA CLRINT SPC 3 * RESTORE TO TRACK ZERO * RESTR1 BSR DRIVE1 LDAA #$A RESTORE SPEED BSR DOCOM BITB #$80 BNE RESTR3 BITB #$40 BEQ RESTR2 LDAB #$B FLAG WRITE PROTECT RESTR2 CLC RTS SPC 1 RESTR3 LDAB #$F SEC FLAG NO DRIVE RTS SPC 3 * SELECT DRIVE FROM FCB * DRIVE1 STX TEMPX LDAA 3,X ANDA #3 MAX DRIVE NUMBER STAA DRVREG SELECT DRIVE BSR COUNTUP TRACK TBL OF OLD DRIVE LDAB TRKREG STAB 0,X SAVE OLD TRACK REG ISTER STAA DRIVEN SAVE DRIVE NUMBER BSR COUNTUP LDAA STPTBL-TRKTBL,X STAA STEPSP SAVE SPEED FOR SEEK LDAA TYPTBL-TRKTBL,X STAA DRVTYP SAVE TYPE FOR SEEK LDAA 0,X GET TRACK STAA TRKREG TRACK OF NEW DRIVE JSR DELAY LDX #$1800 +++ DELAY FOR READ Y +++ WAITRD LDAA TRKREG PRESENT TRACK CLRB DUMMY SECTOR JSR SEEK GET STATUS LDAB COMREG BPL ISRDY DEX BNE WAITRDY NOTRDY LDX TEMPX NOREDY LDAB #$80 NOT READY BIT SEC RTS SPC 3 * CHECK DRIVE READY * * THIS ROUTINE IS USED WHEN ASSIGNED * DRIVE  IS ALL. ANY DRIVES CAN BE * SKIPPED BY DRIVE SCAN BY ALTERING * LINES MARKED ###. * QCHEK1 LDAA 3,X CMPA #3 DRIVES TO SKIP ### BHI NOREDY SOFTWARE NOT READY ### BSR DRIVE1 SELECT BCS NOREDY HARDWARE NOT READY ISRDY LDX TEMPX CLC RTS SPC 1 COUNTUP LDX #TRKTBL-1 LDAB DRIVEN COUNT INX DECB BPL COUNT RTS SPC 1 END COLDS  NAM DSKALIGN OPT PAG PAG * DISK ALIGNMENT AND TESTING PROGRAM * * MODES OF OPERATION: * * 1. SEEKS TO SECTORS SELECTED BY USER. * 2. READ ONLY TEST WITH ERROR REPORT. * 3. READ/WRITE TEST WITH ERROR REPORT. * * CALLING SEQUENCE: * * DSKALIGN 2 FORCES DRIVE 2 * DSKALIGN ASSUMES WORK DRIVE * * PROGRAM DISPLAYS MENU OF FUNCTIONS AND WILL TEST * PRESET TRACKS AND SECTORS OR TWO USER SELECTED * POINTS ON DISK. USER ENTRIES CAN BE ANY VALID * CHOICE AND MAY BE THE SAME. ALL TESTS EXPECT * A PRE -INITIALIZED DISK. ATTEMPTS TO TEST A * NON-EXISTANT SECTOR WILL BE LOGGED AS A FIND * ERROR. NO RETRIES ARE MADE SO TRUE ERROR RATE * WILL BE HIGHER THAN WHEN USING DOS. ANY WRITE * TYPE TEST WILL DESTROY DATA AND REQUIRE THAT * THE DISK BE INITIALIZE D AFTER TESTING. OTHER * TESTS ARE NON-DESTRUCTIVE BUT A BACK-UP DISK * IS RECOMMENDED. THE NUMBER OF TRACKS AND SECTORS * PER DISK IS SET BY SUBROUTINES SET5IN AND SET8IN. * DEPENDING ON YOUR TRACK ZERO INITIALIZATION YOU * MAY ALWAYS GET ONE SEEK ERR OR ON TRACK 0. * IF USED WITH 8 INCH ONLY CHANGE DEFAULT TO: * * DEFAULT JSR SET8INCH * * WRITTEN BY LEO TAYLOR * * CHANGE NEXT THREE EQUATES FOR 6800/6809 * * FOR 6800 USE $A000, $BE80, $8004 * FOR 6809 USE $C000, $DE00, $E004 * FLEX EQU $C000 START OF FLEX CNTLPOR EQU $8004 CONTROL PORT READ EQU $BE80 READ SECTOR WRITE EQU READ+3 WRITE ONE SECTOR RESTOR EQU READ+9 RETRACT TO TRK 0 SELECT EQU READ+$C DRIVE SELECT WARMS EQU FLEX+$D03 RETURN TO FLEX FCB EQU FLEX+$840 FILE CONTROL BLOCK GETCHR EQU FLEX+$D15 GET CHAR FROM TERMINAL PUTCHR EQU FLEX+$D18 OUTPUT TO TERMINAL INBUFF EQU FLEX+$D1B INPUT TO LINE BUFFER PSTRNG EQU FLEX+$D1E PRINT STRING TO ETX CLASS EQU FLEX+$D21 CLASSIFY ALPHANUMERIC PCRLF EQU FLEX+$D24 CAR RETURN LINE FEED NXTCH EQU FLE X+$D27 GET BUFFER CHAR OUTDEC EQU FLEX+$D39 OUT DECIMAL NUMBER RPTERR EQU FLEX+$D3F REPORT FILE ERROR GETHEX EQU FLEX+$D42 GET HEX FOM BUFFER INDEC EQU FLEX+$D48 INPUT DECIMAL NUMBER FMSCLS EQU FLEX+$1403 CLOSE FILES FMS EQU FLEX+$1406 FILE MANAGER SYS  TEM PAUSE EQU FLEX+$C09 TTYSET PAUSE WASN EQU FLEX+$C0C WORK DRIVE ASSIGNED ORG $100 * CONSTANTS AND VARIABLES. * DECIMAL DATA IS TWO BYTES * * CLEAR SCREEN, MAXIMUM SECTORS PER * TRACK, AND DISPLAY RATE SHOULD BE * CHANGED TO MATCH USER'S SYSTEM.  * START BRA START2 VN FCB 2 VERSION BRA WRMSTRT ALLOW ENTRY AT $0103 CLRSCR FCB $C,0,0,4 CLEAR SCREEN MAXSE5 FDB 10 5 INCH SEC PER TRK MAXSE8 FDB 15 8 INCH SEC PER TRK DSPRATE FCB 1 USE 7 FOR SLOW DISPLAY PAUSET FDB 0 TEMP FOR PAUSE TRKALI FDB 38 AL IGNMENT TRK FDB 1 DUMMY ALIGN SECTOR MAXTRK FDB 0 MAX TRACK (INCLUDING ZERO) MAXSEC FDB 0 MAX SECTOR (NOT INCLUDING ZERO) TRK FDB 1 USER TRACK BEING TESTED SEC FDB 1 SECTOR BEING TESTED TRK2 FDB 34 ALTERNATE TRACK SEC2 FDB 10 ALTERNATE SECTOR TRKNOW F ! DB 0 TRACK NOW BEING READ DRIVE FDB 1 DRIVE BEING TESTED TEMP FDB 0 SAVE X TEMP2 FDB 0 HEADFL FCB 0 ZERO = HEADS UP WRITEFL FCB 0 ZERO = READ ONLY LOOPCO FDB 0 LOOP COUNTER FOR TEST FINDERR FDB 0 CAN'T FIND SECTOR CRCERR FDB 0 CRC ERROR * START BY GET " TING DRIVE * START2 JSR GETHEX GET DRIVE NUMBER BCC GOTNUM ABORT LDX #BADRIVE JSR PDATAX BAD DRIVE NUMBER ABORT EXITFL JMP WARMS GOTNUM TSTB BNE DRIVEFOUND GETWASN LDAA WASN USE ASSIGNED DRIVE BPL GOTIT LDAA #1 SET ONE IF ALL BRA GOTIT DRIVEF S #TX TEMP LDAA TEMP+1 GET DRIVE BYTE CMPA #3 BGT ABORT GOTIT LDX #FCB STAA 3,X STORE DRIVE IN FCB STAA DRIVE JSR SELECT * INITIALIZE WORKSPACE * WRMSTRT LDAA PAUSE RETAIN OLD PAUSE STAA PAUSETEMP CLR PAUSE NO PAUSE DURING USE CLR HEADFLAG CLR $WRITEFLAG DEFAULT JSR SET5INCH DEFAULT DRIVE SIZE * MAIN SELECTION MENU * MENU LDX #CLRSCR BSR PDATAX CLEAR SCREEN LDX #MENUMESSAGE STX TEMP FIRST MENU LINE LDX #TRKALIGN-2 STX TEMP2 FIRST DISPLAY VARIABLE LOOPME LDX TEMP BSR PDATAX DISPLAY MEN U LINE INX SKIP ETX STX TEMP NEXT MESSAGE CPX #USRMES END OF MENU BEQ MENUDONE LDX TEMP2 INX INX STX TEMP2 START OF TRACK CLRB SPACE FLAG JSR OUTDEC DISPLAY TRACK LDAA #$20 JSR PUTCHR LDX TEMP2 INX INX STX TEMP2 START OF SECTOR CLRB J SR OUTDEC DISPLAY SECTOR BRA LOOPMENU MENUDO LDX #TRKNOW CURRENT POSITION CLRB JSR OUTDEC LDX #REQUEST BSR PDATAX TSTHEAD TST HEADFLAG BEQ WAITKEY LDAA CNTLPORT ASRA BCS GOTKEY BSR SEEK2 KEEP HEAD DOWN BRA TSTHEAD WAITKEY LDAA CNTLPOR CHEC K KEY PRESSED ASRA BCC WAITKEY GOTKEY LDAA CNTLPORT+1 GET ITEM NUMBER JSR CLASS BCS MENU CMPA #'9 HIGHEST DECIMAL BLE GOTDEC CMPA #'J HIGHEST LETTER BGT MENU REJECT > MAX LETTER SUBA #$7 REDUCE $41 TO $3A GOTDEC SUBA #$2F REDUCE TO BINARY LDX  #TABLE-2 LOOPT1 INX MOVE TO NEXT ENTRY INX DECA BNE LOOPT1 LDX 0,X GET VECTOR JSR 0,X DO IT JMP MENU PDATAX JMP PSTRNG * SEEK VARIOUS TRACKS * TRKAL2 LDAA TRKALIGN+1 BRA DOSEEK TRKMAX LDAA MAXTRK+1 BRA DOSEEK TRKU1 LDAA TRK+1 BRA DOSEEK TRK U2 LDAA TRK2+1 BRA DOSEEK STEPIN LDAA TRKNOW+1 INCA BRA DOSEEK STEPOUT LDAA TRKNOW+1 BEQ RESTR0 OUT TOO FAR DECA DOSEEK STAA TRKNOW+1 SEEK2 LDAA TRKNOW+1 LDX #FCB+$40 DATA AREA LDAB #1 DUMMY SECTOR NUMBER STAB HEADFLAG JMP READ BOTHTRK LDAA T RK+1 BSR DOSEEK LDAA TRK2+1 BSR DOSEEK LDAA CNTLPORT ASRA BCC BOTHTRK NO KEY PRESSED LDAA CNTLPORT+1 RTS RESTR0 CLR HEADFLAG CLR TRKNOW+1 LDAA DRIVE LDX #FCB STAA 3,X JMP RESTORE ENTERT LDX #TRKMES BSR GETDEC BHI NOENTR BRA DOSEEK SE EKNO LDAA TRKNOW+1 PSHA SAVE BSR RESTR0 RESTORE HEAD PULA BRA DOSEEK * SET USER TRACK AND SECTOR * TSU1 LDX #USRMESS BSR GETDEC BHI TSU1 STAA TRK+1 SU1 LDX #SECMESSAGE BSR GETDEC CMPA MAXSEC+1 BHI SU1 STAA SEC+1 NOENTR RTS TSU2 LDX #USRME2  BSR GETDEC BHI TSU2 STAA TRK2+1 SU2 LDX #SECMESSAGE BSR GETDEC CMPA MAXSEC+1 BHI SU2 STAA SEC2+1 RTS GETDEC JSR PDATAX JSR INBUFF GET NUMBER IN BUFFER JSR INDEC STX TEMP BETTER BE GOOD NUM LDAA TEMP+1 IGNORE UPPER BYTE CMPA MAXTRK+1 MOST  USED COMPARE RTS * READ ONLY TEST * RDUSER BSR SETUP LOOPRU LDAA TRK+1 TEST FIRST USER SECTOR LDAB SEC+1 BSR TESTSEC LDAA TRK2+1 TEST ALTERNATE SECTOR LDAB SEC2+1 BSR TESTSEC BRA LOOPRU RDWHOLE BSR SETUP RDWHO2 CLR TRK+1 LDAB #1 STAB SEC+1 LOOPRW LDAA TRK+1 CMPA MAXTRK+1 TOO FAR? BLE *+5 JMP TESTCOMPLETE LDAB SEC+1 BSR TESTSEC LDAA SEC+1 CMPA MAXSEC+1 TOO FAR? BLT BUMPSEC CLR SEC+1 INC TRK+1 BUMPSEC INC SEC+1 MOVE TO NEXT SECTOR BRA LOOPRW * WRITE AND THEN READ TEST * RWUSER BSR WARNING INC WRITEFLAG BRA LOOPRU RWWHOLE BSR WARNING INC WRITEFLAG BRA RDWHO2 * SET UP FOR TESTING * WARNING LDX #WARNMESS JSR PDATAX JSR GETCHR CMPA #'Y BEQ SETUP OK TO PROCEED INS INS RTS SETUP LDX #CLRSCR JSR PDATAX CLR WRITEFLG S TART WITH READ MODE LDX #TESTMESSAGE JSR PDATAX LDX #LOOPCOUNT LOOPCLR CLR 0,X INX CPX #CRCERR+2 BNE LOOPCLR RTS * WRITE OR READ SECTOR AND CHECK ERROR * WRITE TEST PATTERN IS $00,$55,$AA,$FF * TESTSE TST WRITEFLAG BEQ RONLY PSHA PSHB LDX # FCB+$40 LDAA #$55 TEST PATTERN LDAB #$AA TEST PATTERN LOOPPA CLR 0,X STAA 1,X STAB 2,X CLR 3,X DEC 3,X INX INX INX INX CPX #FCB+$40+256 BNE LOOPPATTERN LDX #FCB+$40 PULB PULA PSHA SAVE AGAIN PSHB JSR WRITE PULB PULA RONLY LDX #FCB+$ 40 JSR READ BITB #%10000000 CHECK READY BIT BEQ ISREDY LDAA CNTLPORT ASRA CHECK KEY PRESSED BCC RONLY DO NOT COUNT LOOP ISREDY LDX LOOPCOUNT INX STX LOOPCOUNT BITB #%00010000 BEQ FINDOK LDX FINDERROR INX STX FINDERROR BRA CRCOK DON'T COUN T ERROR TWICE FINDOK BITB #%00001000 BEQ CRCOK LDX CRCERROR INX STX CRCERROR CRCOK LDAA LOOPCOUNT+1 BITA DSPRATE DISPLAY RATE BEQ REPORT RTS * PRINT ERROR REPORT * REPORT LDAA CNTLPORT ASRA BCC NOBREAK INS FIX STACK INS BRA TESTDONE NOBRE AK LDAA #$D CAR RTN JSR PUTCHR LDAB #1 LDX #LOOPCOUNT JSR OUTDEC DISPLAY RESULTS LDAB #5 BSR TAB LDX #FINDERROR JSR OUTDEC LDAB #6 BSR TAB LDX #CRCERROR JSR OUTDEC LDAB #3 TAB OVER TAB LDAA #$20 SPACE JSR PUTCHR DECB BNE TAB+2 INCB NE  EDED FOR OUTDEC RTS * TEST COMPLETED * TESTCOM DEC TRK+1 TESTDON LDX #DONEMESSAGE JSR PDATAX LDX #RPTMESSAGE JSR PDATAX BSR REPORT JSR GETCHR WAIT FOR RESPONSE INS FIX STACK SOME INS JMP MENU * SET DRIVE SIZE * SET8IN LDX #76 STX MAXTRK L !DX #38 STX TRKALIGN LDX MAXSE8 MAX SECTORS 8 INCH STX MAXSECTOR RTS SET5IN LDX #34 STX MAXTRK LDX #16 STX TRKALIGN LDX MAXSE5 MAX SECTORS 5 INCH STX MAXSECTOR RTS * RAISE OR LOWER HEAD * HDUP CLR HEADFLAG RTS HDDOWN INC HEADFLAG RTS * T "ABLE OF COMMANDS BY NUMBER * TABLE FDB EXITFLEX FDB TRKAL2 FDB RESTR0 FDB TRKMAX FDB TSU1 FDB TRKU1 FDB TSU2 FDB TRKU2 FDB RDUSER FDB RWUSER FDB RDWHOLE FDB RWWHOLE FDB STEPIN FDB STEPOUT FDB SET5INCH FDB SET8INCH FDB HDUP FDB HDDOWN #FDB ENTERTRK FDB SEEKNOW * MESSAGES * BADRIVE FCC /BAD DRIVE NUMBER/ FCB 7,$D,$A,4 REQUEST FCB $D,$A,0 FCC /SELECT MENU ITEM BY ONE / FCC /NUMBER OR LETTER: / FCB 4 MENUMES FCC /0. RETURN TO FLEX / FCC /1. SEEK ALIGNMENT TRACK / FCB 4 FCC /2 $. RESTORE TRACK 0 / FCC /3. SEEK MAXIMUM TRACK / FCB 4 FCC /4. SET USER TRACK / FCC /5. SEEK MAIN USER TRACK / FCB 4 FCC /6. SET ALTERNATE TRACK / FCC /7. SEEK ALTERNATE TRACK / FCB 4 MENUM2 FCC /8. READ ONLY ALTERNATE / FCC /9. READ WR %ITE ALTERNATE/ FCB $D,$A,0 FCC /A. READ ONLY WHOLE DISK / FCC /B. READ WRITE WHOLE DISK/ FCB $D,$A,0 FCC /C. STEP IN TOWARD MAX / FCC /D. STEP OUT TOWARD TRACK 0/ FCB $D,$A,0 FCC /E. SET 5 INCH DISK / FCC /F. SET 8 INCH DISK/ FCB $D,$A,0 & FCC /G. RAISE HEAD UP / FCC /H. LOWER HEAD DOWN/ FCB $D,$A,0 FCC /I. ENTER TRACK TO SEEK / FCC /J. RE-SEEK CURRENT TRACK> / FCB 4 USRMES FCC /ENTER USER TRACK: / FCB 4 USRME2 FCC /ENTER ALTERNATE TRACK: / FCB 4 SECMESS FCC /ENTER SECTOR FOR A 'BOVE / TRKMES FCC /TRACK: / FCB 4 WARNME FCC /WARNING! IS IT OK/ FCC ' TO DESTROY DATA (Y/N)? ' FCB 4 TESTMES FCC /TESTS MAY BE STOPPED/ FCC / BY PRESSING ANY KEY./ FCB $D,$A,0,$D,$A,0 RPTMES FCC / COUNT FIND ERROR CRC ERROR/ FCB $D,$A,0,4 DONE(ME FCB $D,$A,0 FCC /TEST COMPLETE PRESS / FCC /ANY KEY FOR MENU./ FAB 7,$D,$A,0,4 END START  6.: 09/13/80 COPYRIGHT 1980 BY PHILIP LUCIDO 6+2aoJ&3!$5 ! w~C4@-%h3!0 % -%O C0 Z&o03'+&*+&0#@-%3l, '&90mSyntax er ror in command linem]'NmX'im^'9(0*90(1 'Z&  Z&9Title? 0p1!OB0$S290#'R'P&9Q%45C Data segment type: Ascii, Byte, Label, Word, Reset, or Proceed? 0 '0Z&99ABLW0=(*9 What are the bounds of the segment to disassemblLe?0d40'\5$ 0* 9Starting address? Ending address?  Start > End, Reenter both addresses4B%]'2b905 Illegal entry , re-enterm,'h0!,E%E'ہ '*'4!$'50E'0Z& 1n '0 o,0 9Command syntax error+ABL"SuTW&    2}B%a-&B% 5/ 0Illegal segment address  specificationl. & m-&!om-&l-0-%O3(09Multiple 'S' or 'T' commands in command file0//& &9&q9'$9A%'0. ' 0Z&0:'m,+ ρ3"04 ABDGLNPSZ Illegal option switch42% "  bT$4Bb$ %0 0d"f&jm&^b&j'4=B400B2%T5$0 02b!b' o\b555#'!90 0;2am,+˽2e90>Word or Label segment has odd lengthData segm ents overlapTables out of memory ',&'9BD02m.'m'3m-'Bm.&'0.1 č Z&m_'04o-029DISLBL09BIN0lj;oQ2xb '* 0L2h91dTZ&91bID9DbB$ %'0 4D402 !%ЯD5$ 501bZ&90mQ&' & QjQ9&9DFB$ 1( 91ƀZ&l191ƀZ&o19"@j;mY&A0'4&T0)_N'Y&0܆ S " $ Ž~9Output file exists - Delete it (Y/N)? "4@&07 0&0/ 0&0( 0(0)oK5?5InputOutputLabelCommand file error"45m1'lڽ~m,*0 0/_99Command file line #JoQ&0 # n&& ,&ŀ&C&)'"! o$m%'&@ 9L0Jo#!H0n ?MMo<ŀ&o! 0moo# %& 0: oo oour!&ꮤ@ _O!@~OL &  $ '!@^/m_&%M+'8o'lH0n%% -  Q_ 6@m&m'!`&"@t!`& !`&&1!!J00@AJ0N9oo}&pm_&F&ln&a4 0S1S& &#lU&H4 01C 'Z&5 .Z5 0 č 0x::DDDD_H&@]9'2b9'04jZ' 5 lm#'m$'@mQ&L'&l$|&%§&' ց&LMQJ0L'l# EjQ0 |l5!'4!" 5! _J0J1m'1!(%*#ʀ]9J0B$!%1% ;94'2'001Z&01Z&N0J154"9%""540#4F40F2%eH0H5$  @2b5"54Hb4cF1=1DV15"'%b  2d5Go0JF$1#4 oE&%5 " ŀ&""1= 2b&Lo# o$9@(j;oQ9"Jo!"hl&,0  Ćn  : -6Nl@Tj<&92boo&& (&ŀ&E&('"! - o$  [9o#L0J ;!"H0nuwwoYŀ&o!m'+L K <  0B' C Ā+ 0  .' Z& .' Z& 9* DISASSEMBLY BY DYNAMITE OF {9oD1=F%{"`&a"D'0 m&+* STANDARD PRE-NAMED LABEL EQUATESl t W4 ' *Z& ;  EQU  5 j "~'R9ooo1:m'_m&G* ASCII CODE EQUATES%l  aO@0Jb=0 ' Z&   EQU  a  lblab %"a m'2c9NULSOHSTXETXEOTENQACKBEPLBS HT LF VT FF CR SO SI DLEDC1DC2DC3DC4NAKSYNETBCANEM SUBESCFS GS RS US DELoD1=F%S"@&A"m&T* EXTERNAL LABEL EQUATES/l 줍L EQU   '9 94wc' c 540xT5hm_&< `!Om!& m_&> A!# .! %u0 mm_'O,XTM+'GjHHHGGG?;o'lH0n%:Qf} ! H@%m&O_+ O_y++m&e0,-R0,--0KB A q4m&XXXWWW&<5eT^wtu?"4&>"?.8D !`&&EF<"Jm,PCR!`&"4&>" m'Ѧ!`&" J`!JM'0:4d$(' ' 'U Sm' ,0Z&2aECCABDPXYPCNMDDDD$"" % " ""0*H0',0X0$Ħ'DXYUSPCABC CDPӆ#['!!2oeop&m_&e&Z FCC oaobc $mb&,la1fle %$"'='l$Lmb& "lalbla C j0L=0 '.laZ& $M'"lalam_&'la 4lalalaa%E mb'f"me ' 1cn'&2md' H",lclcod9e&%% z+FCB mb$'& % "'992tocoB&7c&4FCB ٯa `$,1dlc@c% mc' 1a'2l22rob!&lboeoaoR&a&Ze&wFDB k0c   $7a,1f1emb& J% "&la ep% Wme'41c4ma'%cJN EQU *-1!\'V2nv2}m[&!RaoV 0 AB0#" aRmZ&m[&m'  2c940 5b#4"%'mW'P0P40  4|5~Z&cb9Z':N1!N%*q4N5EQU )**-O5DZ&9X FCB cv1 2d9L(%8*"2C) 0 @CORG L%9m%'&(lVENDm%' &>9 }k9460 oN1Z'3m'Z'&0 EZ'&LZ'mW'0 1Z&54=00ā 'Z&'0H0ۦ'5ABDXYUSCCP4[ 4]m'5;,4!`DDDDD0 05XYUS42N%"'546JN%"&"No754DB$'%0  '5Z& L540 40 40V5mW'0m\'0R9 %x%.9 94m\'0.R55W540RR Z&0[T-Z&oV5$4 5$4DDDD 5 r$4@v54D 4O2{doce* M-CSa06oa+l a& mc& md' c0,0&Ԧb0 2e5'd 4c' c54RRmV'TT594m[&% m]'m9&0! ' $j950e00_2~oa_09-a_09-a_090-P07908;ܧ92b9   6809/6800 DISASSEMBLER PAGE ' 946mY& 10ԦM &5@;mY& 0,9'%-, 9!(7FH)ss18   $4$D$d$T*g+g*W+W/.&4'%-, 9'%-, 9'%-, 9!'%-, 9!303) #)9#9303! #2)1"#121303$ #2)4"#424303" #2)T2"#22230) #)#)#Y30! #2)#!2!#Q2Q30$ #2)#$2$#T2T30" #2)#"2"#R2RG=A>@D:IJEC;B *** SYNTAX ERROR ***READY? CHECKING FOR DUPLICATION*** NOT A CATALOG FILE ****** DISK READ ERROR ****** BUFFER OVERFLOW ***Are you SURE? 260+"+DV4 " +0 0 +O_0்230"000% '' 0m&0 0 4 %&$50[ %4 5 ' ' ,';' 1! '91?9ЍM&) G%< %!Z&Ħ+9&0 ^$ 0 % Ze 0ߍV ;9' ?m9l @-%H@m & C A TA@  4@' &55\%9 خ\%& 4 Z&50 % ކ צ0%Ɓ3"C4 4 b0  '"Y&@ '?0 5Z&910P !$ @&l@'&  lզ+'0 0^% 0Fh&0 0N\$>1 _' &\ %o1 %0 ڍQH\%L&o0 % \m&1 $m' Z&o 0 %99ލ~ 00̽Y&9"z"9O_F\';%\4X&0 %2b p409cZ0M9D50`$jH&6$$09030F90: &2H}"& FF9 Ć Z&9/~* 4$5 &9ڦ ݦצ4O40 $ _95 & &.Z&9]K9R0404졁 '$0>' 0m&큯b"񦠁 & J2dģ\B\ DBZZDV Z&9BZV TTRRZXD4FRD43bb7M+101%'"Z& 5p 4椧j&2aRZ%R& 5pT TVT$ 4? '`b%R'VZ#P0l '0m& ==&74400?0a::&2 | bীZ&2c?,'555 ';',99b'5+g턦?9O_40% 9"4hbiaahbiahbiaa 5d & Z&'9?'-'_'0%9#A%z"99/& /& 9?92e\401@ f%``%Zo%Ti%NN%HH%BW%<Q%64".."(=""7"""%" "55' 4??&5Z&_9&Z&_94Z'01! 50~ ?0 Z&OJ0 OZ&9" TTL M6809 FILE CATALOGING UTILITY STTL FILESORT V6.3C (4/6/80 --- BRIAN F. BAILEY WB4MMP) OPT PAG PAG ORG $0600 (Relocatable code) * * * FILESORT V6.3C COPYRIGHT 1980 BY BRIAN F. BAILEY WB4MMP * Modified to work with ASM. October 2, 1983 by K#ent Meyers. * * * "FILESORT" is a program for the cataloging of FLEX2 and FLEX9 * disk files. It has commands for reading, writing, cataloging, * deleting, sorting, and printing the file list according to * one or more sets of user-entered paramet$er limits. The program * is written using position-independent code for the powerful * MOTOROLA M6809 microprocessor. FILESORT may be moved and * run anywhere in memory without any changes; however, since the * initialization routine places the catalog buffer space either * above or below FILESORT, whichever has more room, placing FILESORT * near either end of memory will yield maximum catalog capacity. * Each file entry requires 32 bytes, which includes File Name, * File Extension, File Size, File Creation Date, Disk Name, Disk * Extension, Disk Volume Number, and Disk Creation Date. * The sorting subroutine is an extremely fast multiple key sort using * the SHELL-METZNER algorithm. The sort may be keyed on any or all * of the file or disk parameters, in any order. The cataloging * commands may also be followed by a parameter list with the * lower and upper limits of any or all parameters. * * LPERPG EQU 50 Catalog entry lines per page * * * The following references are to the "FLEX" disk operating system, * by Technical Systems Consultants (TSC). All references to FLEX * subroutines and variables are made using absolute addresses * since FLEX resides at a fixed address. All subroutines and * variables within FILESORT are referenced using relative addresses * since it is position-independent. * TRACK EQU 30 FCB Track offset DSKNAM EQU 80 Disk name offset in System Information Record (SIR) FCB EQU $C840 File Control Block ESCRTN EQU $CC16 Escape return pointer  OUTFLG EQU $CC22 Output flag MEMEND EQU $CC2B User memory limit FMS EQU $D406 File Management System FMSCLS EQU $D403 Close all open files RPTERR EQU $CD3F Report disk error OUTDEC EQU $CD39 Output decimal number GETFIL EQU $CD2D Parse file specificati on INCHR EQU $CD15 Input single character INBUFF EQU $CD1B Input characters to line buffer LINBUF EQU $CC14 FLEX line buffer pointer OUT EQU $CD18 Output character GETCHR EQU $CD15 Input character PCRLF EQU $CD24 Print CR, LF, and null(s) DOCMND EQU $C D4B Process FLEX command line WARMS EQU $CD03 FLEX re-entry point upon FILESORT termination * * "FILESORT" begins here: * BEGPRG EQU * Program origin address FILSRT BRA COLD Bypass version number and branch to cold start VERSN FCB 63 Version number WA RM LBRA MNLOOP Warm start COLD LBRA INIT Cold start * * The following variables are local to FILESORT. Since they are * referenced either by PCR addressing, or relative to the U * register which is the variable base register initialized with * PCR addressing, this program is completely position-independent. * The U register is initialized so that all of the variables may * be accessed using the shorter five bit signed offset. The equates * represent the offset from the base U register value . * VARBEG RMB 59 Reserve space for variables and stack VARBSE EQU VARBEG+14 Make use of 5 bit signed offset I EQU -14 SHELL-METZNER sort index J EQU -12 SHELL-METZNER sort index K EQU -10 SHELL-METZNER sort index L EQU -8 SHELL-METZNER sort index M EQ U -6 SHELL-METZNER sort index BUFBEG EQU -4 Address of start of catalog buffer BUFEND EQU -2 Address of end of catalog buffer BUFPTR EQU 0 Catalog buffer pointer SIZE EQU 2 Size of catalog buffer START EQU 4 Starting address for sort PAGENO EQU 6 Curre nt page number LINENO EQU 8 Line number on current page * RMB 256 STACK EQU * Top of stack SCHTBL RMB 20 Sort key table ENDSCH EQU SCHTBL+17 Reserve default key storage * * "LO" and "HI" are the lower and upper parameter limit tables. * LO RMB 32 Lower table HI RMB 32 Upper table * * "CMDTBL" contains the available commands and the offsets from * CMDTBL of the processing subroutines for each command. * CMDTBL FCC /R/ Read catalog file from disk FDB CMDR-CMDTBL FCC /W/ Write catalog file to disk FDB CMDW-CMDTBL FCC /C/ Catalog disk FDB CMDC-CMDTBL FCC /P/ Print data FDB CMDP-CMDTBL FCC /T/ Output to terminal FDB CMDT-CMDTBL FCC /D/ Delete one or more catalog entries FDB CMDD-CMDTBL FCC /N/ Clear buffer for new entries FDB CMDN-CMDTBL FCC /E/ End FILESORT FDB CMDE-CMDTBL FCC /S/ Sort buffer FDB CMDS-CMDTBL FCC /X/ Process FLEX command FDB CMDX-CMDTBL FCB 0 End-of-table flag * * "PRMTBL" contains the parameter names and associated values * (offset from beginning of catalog entry, length of parameter, * and parameter data type). * PRMTBL FCC /FN/,0,8,0,/FE/,8,3,0,/FD/,11,3,$FF FCC /FS/,14,2,1,/DN/,16,8,0,/DE/,24,3,0 FCC /DV/,27,2,1,/DD/,29,3,$FF,/XX/,$FF,0,0,0 * * MESSAGES: * TTL FCC $FF,$FF,!FILESORT V6.3C 4/6/80 BRIAN F. BAILEY WB4MMP!,4 STTL FCC $FF,$FF,/FILENAME EXT SIZE DATE DISKNAME EXT VOL# DATE/ FCC $FF,$FF,4 PAGE FCC / PAGE /,4 NOTFND FCC $FF,/WHAT?/,$07 PROMPT FCC $FF,$FF,/===> /,4 SYNERR FCC $07,$FF,/*** SYNTAX ERROR ***/,4 DRVRDY FCC $FF,/READY? /,4 DUPMSG FCC $FF,/CHECKING FOR DUPLICATION/,4 NTCAT FCC $FF,/*** NOT A CATALOG FILE ***/,4 DSKNOT FCC $07,$FF,/*** DISK READ ERROR ***/,4 OVRMSG FCC $07,$FF,/*** BUFFER OVERFLOW ***/,4 SURMSG FCC $FF,/Are you SURE? /,4 * * The program code begins here: * * INIT LEAS STACK,PCR Point to stack area LEAX MIDPNT,PCR Point to middle of FILESORT CMPX MEMEND Compare with FLEX user memory limit BHI ALL If above, use all of user memory for buffer LDD MEMEND Get FLEX memory end value LSRA Divide MSB by two RORB Divide LSB by two using carry (if any) from MSB PSHS D Save on stack CMPX 0,S++ Compare with midpoint of program and restore stack BHI LOWMEM If higher, use low memory for buffer LDD MEMEND Get memory end again LEAX ENDPRG,PCR Point to end of FILESORT EXG D,X Exchange pointers BRA SETBUF Set buffer parameters LOWMEM LEAX BEGPRG-1,PCR Point to byte before FILESORT BRA LOWLIM Set lower limit ALL LDX MEMEND Get FLEX user memory end LOWLIM CLRA Clear MSB of lower limit CLRB Clear LSB of lower limit SETBUF LEAX -32,X Allow for buffer overflow STX BUFEND+VARBSE,PCR Set buffer end location STD BUFBEG+VARBSE,PCR Set buffer start location STD BUFPTR+VARBSE,PCR Set buffer pointer to initial value * * MAIN PROGRAM LOOP * MNLOOP LEAS STACK,PCR Point to stack area LEAU VARBSE,PCR Set variable base register LEAX X+ Get byte STA 0,Y+ Copy it DECB Decrement counter BNE COPY Repeat until done RTS Return * * "DSKNM" gets the file and disk attributes and saves them * in the catalog buffer. * DSKNM LEAY SCHTBL,PCR Point to variable space for disk attributes L?EAX DSKNAM,X Add offset to pointer (point to disk specification) LDB #13 8 byte name + 3 byte extension + 2 byte volume number BSR COPY Copy disk data to variable space * NOTE: Dates are stored in the disk catalog as MONTH/DAY/YEAR; * however, the@y must be stored in the buffer as * YEAR/MONTH/DAY for proper sorting. LDA 8,X Get disk year STA 0,Y Save it LDD 6,X Get disk month and day STD 1,Y Save it CATLOP LDY 0,S Get parameter working pointer LBSR PARSE Parse parameter limits STY 0,S SaAve new pointer value BCC RDCAT Branch if not end of parameter limit specification BRA RDYQ Get next disk RDCAT LDX #FCB Point to FCB LDA #6 FMS "open disk catalog" function code STA 0,X Set function code JSR FMS Call FMS BNE ERR1 Branch on error B INC 0,X Increment FMS function code to "get next catalog entry" DSKCAT LDX #FCB Point to FCB JSR FMS Call FMS BEQ GDREAD Branch if no error LDA 1,X Get error code CMPA #8 Is it read end-of-file? BNE ERR1 Branch if not BRA CATLOP Get next parametCer specification GDREAD LDA 4,X Check first byte of file name BMI DSKCAT Skip deleted files BEQ CATLOP Empty entry indicates end-of-directory LDY BUFPTR,U Get buffer pointer LEAX 4,X Point to beginning of file name in directory entry LDB #11 8 bytDe file name + 3 byte extension BSR COPY Copy data LDA 12,X Get file year STA 0,Y+ Save it and increment pointer by one LDD 10,X Get file month and day STD 0,Y++ Save it and increment pointer by two LDD 6,X Get file size STD 0,Y++ Save it and incErement pointer by two LEAX SCHTBL,PCR Point to disk attribute variable area LDB #16 16 bytes of disk attributes BSR COPY Copy disk data to buffer CMPY BUFEND,U Check for buffer overflow BLO FILCHK Branch if no overflow LEAX OVRMSG,PCR Point to ovFerflow message LBSR OUTLN Print it BSR DUPLCT Check for duplicate entries LBRA MNLOOP Return to main loop (stack is re-initialized) FILCHK LDX BUFPTR,U Get buffer pointer again LBSR MATCH Is file within parameter match limits? BNE DSKCAT Try next  Gfile data if no LEAX 32,X Point to next available space in catalog buffer STX BUFPTR,U Save new pointer value BRA DSKCAT Get next file data * * "DUPLCT" is a subroutine which checks the catalog buffer for * duplicate entries. It is called after t!Hhe "R" and"C" commands, * and deletes identical entries which could result from reading * catalog files containing the same entries, from cataloging * the same disk twice with the "C" command, or from having * one or more files which match several "Idifferent sets of * parameter limits. * DUPLCT LEAX DUPMSG,PCR Point to message LBSR OUTLN Print it LDX BUFBEG,U Point to beginning of catalog buffer ID1 CMPX BUFPTR,U Compare with current buffer end BHS PACK Pack deleted entries if higher or same #J LEAY 32,X Set Y pointer to next entry ID2 CLRB Clear byte counter LDA 0,Y Check for deleted entry BEQ ID4 Skip deleted entry ID3 LDA B,X Get byte CMPA B,Y Compare it BNE ID4 Branch if entries not identical INCB Increment counter CMPB #32 Compare$K to limit BLO ID3 Repeat until done CLR 0,Y Flag identical entry as deleted ID4 LEAY 32,Y Advance pointer to next entry CMPY BUFPTR,U Compare with buffer end BLO ID2 Check next file if lower LEAX 32,X Advance X pointer BRA ID1 Continue checking fLiles * * "CMDD" is a subroutine to delete all files which match the * given parameter limits. After all matching files have been * flagged as deleted, the remaining files are packed in the buffer. * CMDD BSR SURE Make sure command is intended LBSRM CHKPTD Check parameter line syntax CMDD1 LBSR PARSE Parse file parameter limits LDX BUFBEG,U Point to start of buffer (carry is not affected) BCS PACK Branch if ready to pack data CMDD2 LBSR MATCH Is file within limits? BNE NODEL Do not delete it iNf not CLR 0,X Flag file as deleted NODEL LEAX 32,X Point to next file CMPX BUFPTR,U Compare with current buffer end BLO CMDD2 Check next file entry if lower BRA CMDD1 Parse next parameter limit PACK LDX BUFBEG,U Point to start of buffer PK1 TST 0,XO Is file flagged as deleted? BNE NXTPCK Advance pointer if not TFR X,Y Copy pointer to Y register PK2 LEAY 32,Y Point to next entry CMPY BUFPTR,U Is Y pointing past the current buffer end? BHS NOMORE Branch if no more undeleted entries TST 0,Y ChePck entry for deletion indicator BEQ PK2 Try next one if this one is flagged as deleted LDB #32 Set up counter for one entry (32 bytes) MOVLP LDA 0,Y+ Get byte and increment pointer STA 0,X+ Move byte and increment pointer DECB Decrement counter BNQE MOVLP Repeat until done CLR -32,Y Flag moved file as deleted BRA PK3 Check pointer against limit NXTPCK LEAX 32,X Point to next entry PK3 CMPX BUFPTR,U Compare with current buffer end BLO PK1 Check next file if lower RTS Return NOMORE STX BUFPTR,RU Set new buffer end RTS Return * * "CMDN" clears the catalog buffer and restarts FILESORT. * CMDN BSR SURE Make sure command is intended LBRA INIT Restart FILESORT * * "CMDE" ends FILESORT and returns to FLEX. * CMDE BSR SURE Make sure command is Sintended JMP WARMS Jump to FLEX warm start location * * "SURE" is a subroutine to prevent accidentally entering the * "N" or "E" command through mistyping and thereby erasing * the entire catalog buffer inadvertantly. * SURE LEAX SURMSG,PCR Point t To message LBSR OUTLN Print it JSR GETCHR Get answer CMPA #'Y Is answer yes? LBNE MNLOOP Get new command if not (stack is re-initialized) RTS Return * * "CMDT" and "CMDP" are the command subroutines to output the * catalog entries to the terminal U and printer respectively (note * that the "P" command assumes that the system print driver is * available; e.g. using "P,FILESORT" to call this program). * Each file is checked against the parameter list(s). * CMDP CLR OUTFLG Clear output flag for V printer BSR CMDT Print catalog list DEC OUTFLG Set output flag for terminal TDONE RTS Return CMDT CLRA Clear MSB of initial page number value CLRB Clear LSB of initial page number value STD PAGENO,U Save it LDX BUFBEG,U Point to start of catalog  Wbuffer CMPX BUFPTR,U Is buffer empty? BEQ TDONE Branch if buffer empty * * NOTE: The following three lines are used with my * homebrew time/date board and firmware. * * PSHS X,Y,U Save registers * JSR GETTIM Update time and date values * PU XLS X,Y,U Restore registers * LBSR CHKPTD Check parameter syntax TLOOP1 LBSR PARSE Parse parameter limits LBCS FMFEED Output form feed and return if done LDX BUFBEG,U Get buffer start PSHS X Save buffer pointer BSR NEWPG Output heading for new paYge TLOOP2 LDX 0,S Get buffer pointer LBSR MATCH Check whether file is within parameter limits BNE NXTPT Skip file if not BSR OUTFIL Print file attributes NXTPT LDX 0,S Get pointer again LEAX 32,X Point to next entry STX 0,S Save new value CMPX BUZFPTR,U Past last entry? BLO TLOOP2 Check next file if not LEAS 2,S Restore stack BRA TLOOP1 Output files for next parameter list OUTFIL LBSR PRTNAM Print file name and extension LDB #1 Count for one space BSR SPC Print the space PSHS X Save point[er LEAX 3,X Point to file size LDB #$FF Set leading space flag JSR OUTDEC Print decimal number LDB #1 Count for one space BSR SPC Print the space LDX 0,S Get pointer LBSR PDATE Print file date LDB #4 Count for four spaces BSR SPC Print the spa\ces LDX 0,S Get pointer again LEAX 5,X Point to disk attributes LBSR PRTNAM Print disk name and extension STX 0,S Save pointer LDB #1 Count for one space BSR SPC Print the space LDB #$FF Set leading space flag JSR OUTDEC Print decimal number L]DB #2 Count for two spaces BSR SPC Print the spaces PULS X Get pointer again and restore stack LEAX 2,X Point to disk date BSR PDATE Print disk date JSR PCRLF Print CR/LF DEC LINENO,U Decrement line number BNE OLRTN Return if not zero NEWPG BSR ^FMFEED Advance to next page JSR PCRLF Print CR/LF JSR PCRLF Print CR/LF LEAX TTL,PCR Point to page heading BSR OUTLN Print it * * NOTE: The following three lines are used with my * homebrew time/date board and firmware. * * PSHS X,Y,U Save re_gisters * JSR PTIMDT Print time and date * PULS X,Y,U Restore registers * LEAX PAGE,PCR Point to page number message BSR OUTLN Print it LEAX PAGENO,U Point to two byte binary page number LDB #$FF Set leading space flag JSR OUTDEC Print decim`al number LEAX STTL,PCR Point to subtitle heading BRA OUTLN Print it and return FMFEED LDB #LPERPG Load number of catalog lines per page STB LINENO,U Save it as line counter TST OUTFLG Test output flag BNE SKIPFF No form feed for terminal (screen awould be erased) LDA #$0C Load ASCII form feed character JSR OUT Print it SKIPFF LDD PAGENO,U Get current page number ADDD #1 Increment it by one STD PAGENO,U Save new page number OLRTN RTS Return SPC LDA #$20 Load ASCII space character JSR OUT Prbint it DECB Decrement space counter BNE SPC Repeat until done RTS Return SLASH LDA #'/ Load ASCII slash character OUTBRA JMP OUT Print it OUTLN1 BSR OUTBRA Print character * * "OUTLN" prints a character string pointed to by "X" and * terminated byc EOT ($04). In order to save space in messages, * a CR,LF, and null(s) sequence is replaced by a single negative * byte. This routine then replaces the negative byte with the * required CR sequence. * OUTLN LDA 0,X+ Get character and increment poidnter BPL ON1 Branch if positive PSHS X Save X register JSR PCRLF Print CR, LF, and null(s) PULS X Restore X register BRA OUTLN Get next character ON1 CMPA #$04 Is message ended? BNE OUTLN1 Continue if not RTS Return PDATE LDB #1 Count for one speace BSR SPC Print the space LDA 1,X Get month BSR DEC Print one byte decimal number BSR SLASH Print slash LDA 2,X Get day BSR DEC Print one byte decimal number BSR SLASH Print slash LDA 0,X Get year DEC PSHS X,A Save pointer and number CLRA Clfear MSB of number PSHS A Save it LEAX 0,S Point to number on stack LDA 1,X Get number CMPA #10 Is it a one digit number? BHS DC1 Branch if not LDA #$20 Load ASCII space character BSR OUTBRA Print it DC1 CLRB Clear space suppression flag JSR OUTgDEC Print decimal number PULS D,X,PC Restore stack and pointer and return PRTNAM LDB #11 8 byte name + 3 byte extension PM1 LDA 0,X+ Get byte BNE PM2 Skip if non-zero LDA #$20 Substitute space for null character PM2 BSR OUTBRA Print character CMPB h#4 Is name done (ready for extension)? BNE PM3 Branch if not LDA #'. Load name/extension separator BSR OUTBRA Print it PM3 DECB Decrement counter BNE PM1 Repeat until done RTS Return * * "CMDX" calls the FLEX DOCMND subroutine, enabling the use *i of FLEX utilities from FILESORT; however, the user is * cautioned against using utilities which may overwrite * FILESORT or its buffer space. * CMDX LBSR DELIM Skip delimiter STY LINBUF Set FLEX line pointer JSR DOCMND Do FLEX command RTS Returjn to MNLOOP * * "CMDS" establishes the sort parameters and then calls "SORT", the * sorting routine. * CMDS LBSR DELIM Skip delimiter LEAX ENDSCH,PCR Point to end of sort key table PSHS X Save it LEAX SCHTBL,PCR Point to beginning of sort key tabl ke PSHS X Save it SLOOP1 LDD 0,Y++ Get parameter name and increment pointer by two CMPA #$0D Is it a C/R? BEQ SORTIT Branch if yes LEAX PRMTBL,PCR Point to parameter name table SLOOP2 CMPD 0,X Compare name with table entry BEQ SFND Branch if found !l LEAX 5,X Point to next entry TST 0,X Check for end-of-table BNE SLOOP2 Check next entry if not end-of-table SRTERR LBRA CHKERR Print error message and get new command SFND LDD 2,X Get offset and length parameters LDX 0,S Get key table pointer STD "m0,X++ Save keys in table and increment pointer by two STX 0,S Save new pointer value CMPX 2,S Check for table overflow BHI SRTERR Branch on overflow LDA 0,Y+ Get separator character CMPA #$0D Is it a C/R? BNE SLOOP1 Get next parameter if not SORT#nIT LDD #$0020 Set default sort parameters STD 0,X Save in key table DECA Set accumulator A to $FF ($00-$01=$FF) STA 2,X Set key table end flag LEAS 4,S Restore stack * * "SORT" is an extremely fast multiple key SHELL-METZNER sort. * SORT LDD BUFPT$oR,U Get present buffer end SUBD BUFBEG,U Subtract buffer start to get buffer size STD SIZE,U Save it LDD BUFBEG,U Get buffer start SUBD #32 Subtract 32 bytes (one entry) STD START,U Save it LDD SIZE,U Get buffer size STD M,U Set initial M value p* * The SHELL-METZNER algorithm is an extremely fast sorting method * which uses five indices (I, J, K, L, and M) to search and * compare in a binary fashion. * LOOPA LDD M,U Get index M LSRA Divide MSB by two RORB Divide LSB by two, using carry q(if any) from MSB ANDB #$E0 Round off quotient to an integer multiple of 32 STD M,U Save new M BNE ST1 Continue sorting if not zero RTS If M=0, then the buffer is sorted; return ST1 LDD SIZE,U Get buffer size SUBD M,U Subtract index M STD K,U Thre result is K LDD #32 Load value for one entry (32 bytes) STD J,U This is the initial J value for this loop LOOPB LDD J,U Get J STD I,U Initialize I (I=J) LOOPC LDD I,U Get I ADDD M,U Add M STD L,U Save as L ADDD START,U Add lower boundary PSHS sD,U Save U register and address of second entry for comparison LDD I,U Get I index ADDD START,U Add lower boundary PSHS D Save address of first entry for comparison LEAU SCHTBL,PCR Point to key table SCHLP LDX 0,S Get first base address LDY 2,S Gtet second base address PULU A,B Get key table entries * * A = Starting offset for comparison for this key * B = Number of bytes to be compared for this key * TSTA Check for end of key table BMI LOWER End of table indicates equal entries (no switchu) LEAX A,X Add offset to first base address LEAY A,Y Add offset to second base address CMPLP LDA 0,X+ Get byte for comparison and increment pointer CMPA 0,Y+ Compare with byte in other entry and increment pointer BLO LOWER Branch if lower BHI HIGHvER Branch if higher DECB Decrement key length counter if equal BNE CMPLP Continue comparison with this key if count not zero BRA SCHLP Get next key and continue comparison HIGHER PULS X,Y,U Restore registers LDB #32 Load number of bytes to be switcwhed PSHS B Save counter on stack HR1 LDA 0,X Get byte from first entry LDB 0,Y Get byte from second entry STA 0,Y+ Store first byte and increment pointer STB 0,X+ Store second byte and increment pointer DEC 0,S Decrement counter BNE HR1 Repeat un xtil done LEAS 1,S Restore stack LDD I,U Get index I SUBD M,U Subtract index M BLO LOWER1 Branch if lower STD I,U Save as new index I BNE LOOPC Branch if I<>0 BRA LOWER1 Skip next instruction LOWER PULS X,Y,U Restore registers LOWER1 LDD J,U Get  yindex J ADDD #32 Add one entry (32 bytes) STD J,U Save new value LDD K,U Get index K SUBD J,U Subtract index J BHS LOOPB Repeat second loop if not lower BRA LOOPA Repeat first loop * * "PARSE" is the subroutine which parses the file specificatio zn * limits. The lower file specification limit is stored in the * 32 byte "LO" area, and the upper file specification limit is * stored in the 32 byte "HI" area. Flags are set as follows: * End-of-line: Carry set * Syntax error: Zero clear, Car {ry clear * Normal exit: Zero set, Carry clear * The "Y" register must point to the line portion to be parsed * on entry. The routine will return when either a C/R (end of * line) or a semicolon (end of parameter set) is reached. * PARSE PSHS X Sa |ve X register LBSR DEFLT Set default parameter limits PARSE1 LDA -1,Y Check previous terminator CMPA #$0D Is it a C/R? BEQ PRSEOL Process end-of-line if yes BSR CHKCHR Get and classify character BCS PRSOK Branch on null line BEQ PRSERR Branch on }syntax error TFR A,B Move character to B accumulator BSR CHKCHR Get and classify next character BLS PRSERR Branch on syntax error EXG A,B Exchange order of characters LEAX PRMTBL,PCR Point to parameter table PE1 CMPD 0,X Compare with entry in para~meter table BEQ PE2 Branch if found LEAX 5,X Point to next entry TST 5,X Check for end-of-table past next entry * NOTE: Skip last entry since "XX" is a valid parameter * only for sorting. BNE PE1 Branch if not end-of-table BRA PRSERR Branch (syntax error) PE2 LDA 0,Y+ Get parameter name separator character CMPA #'= Is it an equals sign? BNE PRSERR Branch on syntax error LDD 2,X Get offset and length data from table PSHS D Save data LDB 4,X Get parameter data type flag * 0 = Alphanumeric format (Name or extension) * - = Calendar format (Date) * + = Numeric format (Size or Volume number) PSHS B Save flag LEAX LO,PCR Point to base address for lower limit LEAX A,X Add offset to base pointer BSR PRSDAT Parse data into lower limit LEAX HI,PCR Point to base address for upper limit LDB 1,S Get offset ABX Add offset to base pointer CMPA #': Check for double data separator BNE SAME Branch if only one value given BSR PRSDAT Parse data into upper limit BRA PRSOK1 Branch (syntax correct) SAME LDB 2,S Get length of parameter data SM1 LDA -32,X Get byte from LO STA 0,X+ Save in HI and increment pointer DECB Decrement counter BNE SM1 Repeat until done PRSOK1 LEAS 3,S Restore stack LDA -1,Y Get terminator character CMPA #', Is it a comma (more parameters in this set)? BEQ PARSE1 Parse next parameter if yes PRSOK ANDCC #$FE Clear carry bit ORCC #$04 Set zero bit PULS X,PC Restore X register and return PRSERR ANDCC #$FA Clear zero and carry bits PULS X,PC Restore X register and return PRSEOL ORCC #$05 Set zero and carry bits PULS X,PC Restore X register and return CHKCHR LDA 0,Y+ Get character and increment pointer CMPA #$0D Is it a C/R? BEQ CREOL Branch if yes CMPA #'; Is it a semicolon? BEQ CR10 Branch if yes CMPA #', Is it a comma? CR10 RTS Return answer CREOL ORCC #$01 Set carry bit RTS Return PRSDAT LDA 2,S Get data type flag BEQ NAME Branch if alphanumeric format BMI DATE Branch if calendar format * Numeric format BSR GETNUM Get decimal number STD 0,X Save in parameter limit area LDA -1,Y Get number terminator character RTS Return GETNUM CLRA Clear MSB of total CLRB Clear LSB of total PSHS D Save on stack NUMLP LDA 0,Y+ Get ASCII number and increment pointer CMPA #'0 Compare with ASCII zero BLO NOTNUM Branch if lower CMPA #'9 Compare with ASCII nine BHI NOTNUM Branch if higher ANDA #$0F Convert to binary PSHS A Save it ASL 2,S Multiply LSB of total by two ROL 1,S Multiply MSB of toal by two with carry (if any) LDD 1,S Get doubled total ASL 2,S Multiply LSB by two ROL 1,S Multiply MSB by two with carry (if any) ASL 2,S Multiply LSB by two ROL 1,S Multiply MSB by two with carry (if any) ADDD 1,S Add partial product * NOTE: N*10=(N*2*2*2)+(N*2) ADDB 0,S+ Add new digit to LSB of total and restore stack ADCA #0 Add carry (if any) to MSB of total STD 0,S Save new total BRA NUMLP Get next digit NOTNUM PULS D,PC Get total and return NAME LDB 4,S Get byte count LTRLP1 BSR CLASFY Get letter and classify it BNE NOTLTR Branch if not valid name character STA 0,X+ Save in parameter limit area and increment pointer DECB Decrement counter BNE LTRLP1 Repeat until done LTRLP2 BSR CLASFY Get letter and classify it BEQ LTRLP2 Branch if alphanumeric NOTLTR RTS Return CLASFY LDA 0,Y+ Get letter and increment pointer CMPA #'? Is it the "wild card" character? BEQ LTR Branch if yes CMPA #'- Is it a hyphen? BEQ LTR Branch if yes CMPA #$5F is it an underscore? BEQ LTR Branch if yes CMPA #'0 Compare with "0" BLO NTLTR Branch if lower CMPA #'9 Compare with "9" BLS LTR Branch if lower or same CMPA #'A Compare with "A" BLO NTLTR Branch if lower CMPA #'z Compare with "z" BHI NTLTR Branch if higher LTR ORCC #$04 Set zero bit RTS Return NTLTR ANDCC #$FB Clear zero bit RTS Return DATE BSR DATNUM Get one byte decimal number STB 1,X Save month CMPA #'/ Correct separator? BNE DATERR Branch on syntax error BSR DATNUM Get one byte decimal number STB 2,X Save day CMPA #'/ Correct separator? BNE DATERR Branch on syntax error BSR DATNUM Get one byte decimal number STB 0,X Save year RTS Return DATNUM BSR GETNUM Get decimal number LDA -1,Y Get separator character RTS Return DATERR LEAS 5,S Restore stack LBRA PRSERR Return error condition * * "MATCH" checks t he catalog entry pointed to by "X" against the * lower and upper limits stored in "LO" and "HI". It returns * an equal condition if the file is within the limits and a * not equal condition if the file is not within the limits. * MATCH PSHS X,Y Sav!e registers LEAY LO,PCR Point to lower limit base register LDB #8 Load data length for file name BSR MCHNAM Check alphanumeric data item BLO NG Branch if below lower limit LDB #3 Load data length for file extension BSR MCHNAM Check alphanumeric d"ata item BLO NG Branch if below lower limit LDB #3 Load data length for file date BSR MCHNUM Check numeric data item BLO NG Branch if below lower limit LDB #2 Load data length for file size BSR MCHNUM Check numeric data item BLO NG Branch if bel#ow lower limit LDB #8 Load data length for disk name BSR MCHNAM Check alphanumeric data item BLO NG Branch if below lower limit LDB #3 Load data length for disk extension BSR MCHNAM Check alphanumeric data item BLO NG Branch if below lower limit $ LDB #2 Load data length for disk volume number BSR MCHNUM Check numeric data item BLO NG Branch if below lower limit LDB #3 Load data length for disk date BSR MCHNUM Check numeric data item BLO NG Branch if below lower limit LDX 0,S Reset catalog entry pointer LDB #8 Load data length for file name BSR MCHNAM Check alphanumeric data item BHI NG Branch if above upper limit LDB #3 Load data length for file extension BSR MCHNAM Check alphanumeric data item BHI NG Branch if above upper limit LDB #3 Load data length for file date BSR MCHNUM Check numeric data item BHI NG Branch if above upper limit LDB #2 Load data length for file size BSR MCHNUM Check numeric data item BHI NG Branch if above upper limit LDB #8 Load data length for disk name BSR MCHNAM Check alphanumeric data item BHI NG Branch if above upper limit LDB #3 Load data length for disk extension BSR MCHNAM Check alphanumeric data item BHI NG Branch if above upper limit LDB #2 Load data length for disk volume number BSR MCHNUM Check numeric data item BHI NG Branch if above upper limit LDB #3 Load data length for disk date BSR MCHNUM Check numeric data item BHI NG Branch if above upper limit ORCC #$04 Set zero bit if entry is within limits PULS X,Y,PC Restore registers and return NG ANDCC #$FB Clear zero bit if entry is outside limits PULS X,Y,PC Restore registers and return MCHNAM LDA 0,X+ Get character and increment pointer CMPA 0,Y+ Compare character and increment pointer BEQ DECMCH Branch if equal PSHS CC Save results of comparison LDA -1,Y Check for "wild card" CMPA #'? Is it the "wild card" character? BNE NH1 Branch if not PULS CC Restore stack DECMCH DECB Decrement counter BNE MCHNAM Branch if counter not zero CLRB Clear carry bit  RTS Return equal condition MCHNUM LDA 0,X+ Get character and increment pointer CMPA 0,Y+ Compare character and increment pointer BNE NOMTCH Branch if no match DECB Decrement counter BNE MCHNUM Branch if counter not zero CLRB Clear carry bit RTS Return equal condition NOMTCH PSHS CC Save condition codes NH1 DECB Decrement counter BEQ MTCHDN Branch if done LEAX 1,X Increment catalog entry pointer LEAY 1,Y Increment parameter limit pointer BRA NH1 Repeat MTCHDN PULS CC,PC Restore condition c odes and return comparison * * "DEFLT" sets the default values for all of the parameter * limits which are not explicitly set by the user. * DEFLT LEAX LO,PCR Point to lower parameter limit table LDB #11 Set counter for 8 byte name + 3 byte extensio n LDA #'? Load "wild card" character FILL1 STA 48,X Store in upper disk name limit STA 32,X Store in upper file name limit STA 16,X Store in lower disk name limit STA 0,X+ Store in lower file name limit and increment pointer DECB Decrement counter BNE FILL1 Repeat until done LDB #5 Reset counter for remaining bytes CLRA Clear A accumulator FILL2 DECA Upper limit = $FF STA 48,X Store in upper disk area STA 32,X Store in upper file area CLRA Lower limit = $00 STA 16,X Store in lower disk area STA 0,X+ Store in lower file area and increment pointer DECB Decrement counter BNE FILL2 Repeat until done RTS Return ENDPRG EQU * MIDPNT EQU ((ENDPRG-BEGPRG)/2)+BEGPRG Program midpoint END FILSRT   @-$i f'}&' ','Ot_\@M3ĉ$&&|j" " | @':s"?"~}'Jy}&1  ގ@&90o&_A'0H'0S'0l9;}'}&Ao Bi }'™ a}&}'9Õ}&4_C&| ҁD&~ĺN'ǽ}'~ҍ w~s""9i' '@0|ˆ&|&| iHHHHM 4ৄ0| ' ' &2a2a90+ / +%@~'i@' '2a2a~|$_ ~9 &| &|}'i&% /}&}' 0 LČ'. &ˌi&%Ȃ^@"Ji0Z'~9} &} & t..| &| 9~>0~5~+~}& .Z&9 0Ą0~<&~֎ؽi0Z&YiĦ~$| &| }& 9:03 &@'~- &| &| 9Z&9 ~\D.0Z&9 %%.0Z&9iC0@4! +'`oK~4DDDD 5 @094'% &|59. '  '.  | |&|z&|59 FILE BEING SEARCHED:  SECTOR DISC DISC BYTE Ř PROGRAM NUMBER TRACK# SECTOR# NUMBER ADDRESSENTER ITEM TO FIND: TOTAL OCCURRENCES: Complete Diskedit Flex Next Address Hex String (enter one letter):  NO ADDRESS WITH TEXT FILES\! DISKEDIT FIND LETR.TXT DEAR LEO (TEXT) FIND ASMB.CMD A 10C5 (ADDR) FIND LIST.CMD H BD AD18 (HEX) FIND COPY.CMD S FOUND (STRING) NAM FIND COMMAND OPT PAG PAG * FIND UTILITY FOR FLEX 1/2/9 * * BUGS EXTERMINATED BY KENT D. MEYERS, 7 OCTOBER, 1983. * ADDITIONAL MODS BY KENT D. MEYERS, 8 OCTOBER, 1983. * MORE MODS BY KENT D. MEYERS, 15 OCTOBER, 1983. * * * PROGRAM HAS TWO MODES OF OPERATION: * * TEXT MODE IS ENTERED WITHOUT AN OPTION * LETTER ON THE COMMAND LINE AND WILL LIST * ALL OCCURRENCES OF A STRING IN TEXT FILE. * DEFAULT EXTENSION IS .TXT. * * BINARY MODE IS ENTERED WITH AN OPTION * LETTER (A,H,S) ON THE COMMAND LINE. THE * PROGRAM WILL SEARCH A BINARY FILE FOR * EACH MATCH OF ADDRESS, HEX BYTES, OR * STRING. THE PROGRAM WILL STOP AND LIST * RECORD NUMBER, TRACK, SECTOR, BYTE NUMBER, * PROGRAM ADDRESS, AND THE FILE CONTENTS AT * THE PROGRAM ADDRESS. THE DEFAULT EXTENSION * IS .CMD. * * CALLING FORMAT: * * FIND (NO PARAMETERS) * * DISPLAY EXAMPLES OF COMMANDS. * * FIND FILENAME STRING * * LISTS ALL THE LINES CONTAINING "STRING" * IN TEXT FILE. * * FIND FILENAME A AC00 * * PRINT FILE AND DISK ADDRESS WHEN THE * PROGRAM ADDRESS MATCHES ADDRESS ON * COMMAND LINE. * * FIND FILENAME H 7E AD03 * * PRINT FILE AND DISK ADDRESS FOR EACH * OCCURRENCE OF HEX DATA IN BINARY FILE. * UP TO 128 BYTES CAN BE ENTERED WITH * OR WITHOUT SPACES. * * FIND FILENAME S STRING * * PRINT FILE AND DISK ADDRESS FOR EACH * OCCURRRENCE OF "STRING" IN BINARY FILE. * PAG * EXAMPLE OF USE TO CHANGE THE FLEX BACKSPACE: * * FIND 0.FLEX.SYS A AC00 (USER COMMAND LINE) * * FILE BEING SEARCHED: FLEX.SYS * * SECTOR DISC DISC BYTE PROGRAM * NUMBER TRACK# SECTOR# NUMBER ADDRESS * * 2 11 06 FO AC00 08 * * Complete Diskedit Flex Next * Address Hex String (enter one letter): D * (DISKEDIT IS CALLED FROM THE SYSTEM DRIVE) * * DEFINITIONS OF OPTION LETTERS * * A Address to find * C Complete file without prompting * D call system Diskedit command * F return to FLEX * H Hex data to find * N proceed to Next occurrence * S String to find * CR return to FLEX * * * CHANGE NEXT EQUATE FOR  6800/6809 * USE $A000 FOR 6800 or $C000 FOR 6809 * * FLEX EQU $C000 * ADDED ONE EQUATE EOL EQU FLEX+$C02 FCB EQU FLEX+$840 BUFPTR EQU FLEX+$C14 OUTCHN EQU FLEX+$C22 WARMS EQU FLEX+$D03 GETCHR EQU FLEX+$D15 PUTCHR EQU FLEX+$D18 INBUFF EQU FLEX+$ D1B PSTRNG EQU FLEX+$D1E PCRLF EQU FLEX+$D24 NXTCH EQU FLEX+$D27 GETFIL EQU FLEX+$D2D SETEXT EQU FLEX+$D33 OUTHEX EQU FLEX+$D3C RPTERR EQU FLEX+$D3F OUTDEC EQU FLEX+$D39 GETHEX EQU FLEX+$D42 DOCMND EQU FLEX+$D4B FMSCLS EQU FLEX+$1403 FMS EQU FLEX+$1406 * * MOVE FILE INPUT BUFFER BUFER2 EQU FLEX+$080 PAG * START OF FIND COMMAND * ORG FLEX+$100 UTILITY AREA FIND1 BRA FIND2 VN FCB $81 SPC 3 * OPTION FLAGS AND WORKSPACE * ADRFLG FCB 0 1=ADDRESS SEARCH HEXFLG FCB 0 1=HEX DATA SEARCH STRFLG FCB  0 1=STRING SEARCH TXTFLG FCB 0 1=TEXT FILE MODE COMFLG FCB 0 1=COMPLETE FILE LINCNT FDB 0 COUNT CARRIAGE RETURNS OCCUR FDB 0 OCCURANCE COUNTER SENPTR FDB 0 SENTENCE POINTER SNUMAT FDB 0 MATCH SEC NUMBER TSMAT FDB 0 MATCH TRK SEC ADRMAT FDB 0 MATCH AD DRESS DATMAT FCB 0 MATCH DATA BYTMAT FCB 0 MATCH BYTE IN SEC CHRCNT FCB 0 CHARACTER COUNTER FILDON FCB 0 FILE COMPLETE SPC 1 ADRNOW FDB 0 TRACKING ADDRESS ADRCHR FCB 0 CONTENTS OF ADRNOW ADRMOD FCB 0 ADDRESS TRACKER MODE ADRCNT FCB 0 BYTE COUNT * DEF!INE BINARY FILE FLAG * NOT RESET ON REWIND!! BINFLG FCB 0 TEMP FDB 0 GENERAL PURPOSE PAG * PARSE COMMAND BUFFER FOR FILE NAME. * CHECK FOR HELP, TEXT, OR BINARY MODE. * SET EXTENSION. DEFAULT .TXT or .CMD * OPEN FILE FOR READ. * FIND2 LDX "#FCB JSR GETFIL BCC CHKMOD LDX #BUFER1 MESSAGE IN BUFFER JSR PSTRNG DISPLAY HELP BRA EXIT CHKMOD LDX BUFPTR SAVE POSITION STX TEMP JSR NXTCH GET OPTION LETTER * WAS BSR CHKOPT JSR CHKOPT LDAB #1 TEXT EXTENSION TST TXTFLG ANY OPTION FOU#ND? BNE OPNFIL JSR NXTCH GET SEPARATOR CMPA #$20 SPACE BEQ CMDEXT CMPA #', COMMA BEQ CMDEXT CLRA BSR CHKOPT SET TEXT MODE CLRB CMDEXT INCB BUMP EXTENSION OPNFIL LDX #FCB TBA JSR SETEXT JSR PNTNAM FILE BEING SEARCHED JSR PCRLF LDAA #1 READ$ COMMAND * NEW CODE SETS FLAG ON BINARY FILE BSR REWIND JSR FMS BNE ERROR CMPA #$02 BNE FILFIX INC BINFLG FILFIX DEC 34,X REWIND THE FILE BRA OPENOK * CHANGED TO SUBROUTINE REWIND LDX #BUFER2 SENTENCE BUFFER STX SENPTR INITIALIZE POINTER INC LINCNT+1 FIRST LINE LDX #FCB STAA 0,X JSR FMS OPEN OR REWIND * WAS BEQ OPENOK BEQ RETRN3 ERROR COM OUTCHN JSR RPTERR CLR OUTCHN JSR FMSCLS CLOSE FILE EXIT JMP WARMS SPC 3 * TEXT MODE SEARCHES COMPLETE FILE * FOR TEXT STRING. DISPLAYS SENTENCES * WITHOUT DISK ADDRESS. * OPENOK TST TXTFLG BEQ BINMOD NOT TEXT MODE? LDX TEMP STX BUFPTR RESTORE LINE BUFFER JSR STRBUF LOAD BUFFER TXLOOP JSR SEARCH TST FILDON BNE CLOSE2 JSR SENOUT DISPLAY SENTENCE BRA TXLOOP CLOSE2 BSR CLOSE BRA EXIT CLOSE LDX #FCB LDAA #4 CLOSE COMMAND STAA 0,X JSR FMS BNE ERROR * WAS RTS RETRN3 RTS SPC 3 * CHECK FOR OPTION OR COMMAND * * ENTER - A CONTAINS LETTER * EXIT - YES FOUND FLAG SET * NOT FOUND TEXT SET * CHKOPT LDX #ADRCNT+1 END LESS TEMP CLEAR DEX CLR 0,X CLEAR WORKSPACE CPX #ADRFLG TOP OF TABLE BNE CLEAR ANDA #$5F UPPER CASE CMPA #'A BEQ GOTOPT ADDRESS OPTION INX CMPA #'H BEQ GOTOPT HEX OPTION INX CMPA #'S BEQ GOTOPT STRING OPTION INX NO OPTION=TEXT MODE GOTOPT INC 0,X SET FLAG RTS SPC 3 * BINARY MODE SEARCHES UNTIL FIRST * MATCH IS FOUND, THEN PROMPTS USER. * BINMOD LDAB #$FF STAB 59,X NO COMPRESSION TST ADRFLG BEQ NOTADR * NEW CODE ADDED * ADDRESS MODE NOT FOR TEXT FILES TST BINFLG BNE ADDROK LDX #NADMSG JSR PTERM BRA CLOSE2 * END OF NEW CODE * ADDED LABEL ADDROK JSR GETHEX READ ADDRESS STX BUFER1 SAVE IN BUFFER LDAB #1 STAB CHRCNT ONLY ONE COMPARE BRA BINMO2 NOTADR TST HEXFLG BEQ NOTHEX JSR HEXBUF LOAD BUFFER * WAS BRA BINMO2 BRA BINMO3 NOTHEX BSR STRBUF LOAD BUFFER * ADDED CODE BINMO3 JSR OUTITM PRINT ITEM * END NEW CODE * BINMO2 JSR SEARCH LDX #PROMP2 SHORT PROMPT TST FILDON BNE DOPROM TST STRFLG BEQ SKPSEN * WAS JSR SENOUT JSR OUTLIN PRINT SENTENCE SKPSEN JSR REPORT PRINT DISK ADDR TST COMFLG NO PROMPT? BNE BINMO2 LDX #PROMPT DOPROM BSR PTERM MESSAGE TO TERMINAL JSR GETCHR GET LETTER ANDA #$5F UPPER CASE CMPA #'C BNE NOTC INC COMFLG COMPLETE FILE * WAS B RA BINMO2 BRA BINMO2 NOTC CMPA #'D BNE NOTD JMP DISKED DISKEDIT NOTD CMPA #'N BEQ BINMO2 NEXT ITEM JSR CHKOPT PARSE LETTER TST TXTFLG NOT OPTION? BEQ ISOPT JMP CLOSE2 ISOPT LDX #ITEM BSR PTERM MESSAGE TO TERMINAL JSR INBUFF LOAD LINE  BUFFER LDAA #5 REWIND COMMAND * WAS JMP REWIND JSR REWIND * NEW CODE JMP OPENOK * END NEW CODE PTERM COM OUTCHN JSR PSTRNG CLR OUTCHN RTS SPC 3 * GET STRING INTO BUFFER1 * STRBUF LDX #BUFER1 STLOOP JSR NXTCH CMPA #$D BEQ RE TRN2 STAA 0,X MOVE STRING TO BUFFER INX INC CHRCNT * ADDED CODE TO ALLOW EOL CHAR IN STRING CMPA EOL BNE STLOOP INC BUFPTR+1 BNE STLOOP INC BUFPTR * END OF NEW CODE BRA STLOOP SPC 3 * GET HEX DATA INTO BUFFER1 * HEXBUF LDX #BUFE R1 HXLOOP BSR HEXIN ASLA ASLA ASLA ASLA TAB BSR HEXIN ABA STAA 0,X INX INC CHRCNT BRA HXLOOP HEXIN JSR NXTCH CMPA #$20 ALLOW SPACE BEQ HEXIN CMPA #$D BNE ASCHEX INS FIX STACK INS RETRN2 RTS SPC 2 ASCHEX SUBA #'0 BMI SYNTAX CMPA #9   BLE RETRN2 SUBA #7 CMPA #10 BMI SYNTAX CMPA #16 BLO RETRN2 SYNTAX LDAA #26 SYNTAX LDX #FCB STAA 1,X JMP ERROR SPC 3 * SEARCH FOR MATCH OF BUFFER1 * SEARCH LDAB CHRCNT RESTORE COUNTER * NEW CODE ADDED BEQ SYNTAX * END OF NEW CODE  LDX #BUFER1 SEARC2 STX TEMP LDX #FCB JSR FMS READ CHAR BEQ SEARC3 LDAA 1,X CMPA #8 END OF FILE? BEQ ISEOL INS FIX STACK INS JMP ERROR BAD READ ISEOL INC FILDON JSR PCRLF LDX #OCCURM JSR PSTRNG CLRB LDX #OCCUR JMP OUTDEC TOTAL MATCHES SEARC3 CMPA #$D BNE NOTCR INC LINCNT+1 COUNT LINE BNE NOTCR INC LINCNT NOTCR JSR ADRTRK TRACK ADDRESS TST ADRFLG ADDRESS ONLY? BEQ TRYSEN LDX BUFER1 TARGET ADDRESS CPX ADRNOW SEARC4 BNE SEARCH LDAA ADRMOD CMPA #5 TRACK IN PROGRESS? BLO SEA!RCH BRA MOVDAT FOUND ADDR TRYSEN TST STRFLG BNE DOSENT TST TXTFLG BEQ NOSENT DOSENT LDX SENPTR BUILD SENTENCE STAA 0,X SAVE SENTENCE INX STX SENPTR CPX #BUFER2+128 BEQ OVRFLO CMPA #$1F PRINTABLE? BGT NOSENT OVRFLO LDX #BUFER2 STX SENPTR RE"SET TO START NOSENT LDX TEMP CMPA 0,X ACTUAL COMPARE BNE SEARC4 RESTORE POINTER CPX #BUFER1 FIRST MATCH CHAR? BNE NOTFIR MOVDAT LDX ADRNOW MOVE CURRENT ADDRESS STX ADRMAT LDAA ADRCHR CHAR AT ADDRESS STAA DATMAT LDX FCB+$42 SECTOR NUMBER STX SN#UMAT LDX FCB+$1E TRACK AND SECTOR STX TSMAT LDX #FCB LDAA 34,X BYTE IN SECTOR DECA WAS PRE-INCREMENTED STAA BYTMAT LDX #BUFER1 RESTORE POINTER NOTFIR INX DECB FULL MATCH? BEQ RETRN1 JMP SEARC2 RETRN1 RTS % SPC 3 * REPORT RESULTS OF MATCH * $REPORT TST OCCUR 0=FIRST MATCH BNE MATCH3 SKIP HEADER TST OCCUR+1 BNE MATCH3 LDX #SECBYT JSR PSTRNG JSR CRLF2 MATCH3 JSR CRLF2 INC OCCUR+1 COUNT MATCH BNE SNUOUT INC OCCUR SNUOUT LDX #SNUMAT LDAB #1 JSR OUTDEC LDX #TSMAT LDAB #7 JSR TABOV%R BSR HEXISL INX LDAB #7 JSR TABOVR BSR HEXISL LDX #BYTMAT LDAB #7 JSR TABOVR BSR HEXISL LDAB #6 * WAS BSR TABOVR JSR TABOVR * NEW CODE TO BLANK ADDRESS * FOR TEXT FILES TST BINFLG BNE DOADDR LDAB #4 BSR OUTDOT LDAB #3 LDA&A #$20 BRA OUTDO1 OUTDOT LDAA #$2E OUTDO1 JSR PUTCHR DECB BNE OUTDOT RTS * END OF NEW CODE * ADDED LABEL DOADDR LDX #ADRMAT BSR HEXISL DISPLAY ADDRESS INX BSR HEXISL JSR OUTSPC INX HEXISL JMP OUTHEX * CODE MOVED HERE FOR SUBROUTIN'E * NEW CODE ADDED OUTITM LDAB CHRCNT BNE OUTIT2 JMP SYNTAX * END OF NEW CODE OUTIT2 LDX #ITEM2 JSR PSTRNG LDX #BUFER1 LDAB CHRCNT MATCH2 BSR HEXISL TARGET IN HEX INX DECB BNE MATCH2 LDAB #2 BSR TABOVR LDX #BUFER1 LDAB C(HRCNT JSR OUTASC TARGET IN ASCII * END OF MOVED CODE CRLF2 JMP PCRLF * OUTPUT LINE NUMBER AND SENTENCE * * WAS SENOUT BSR CRLF2 SENOUT INC OCCUR+1 COUNT MATCH BNE OUTLIN INC OCCUR * WAS OUTLIN LDAB #1 OUTLIN BSR CRLF2 * NEW CODE T)O BLANK LINE #'S * ON BINARY FILES TST BINFLG BNE LOOPSX * END NEW CODE LDAB #1 LDX #LINCNT JSR OUTDEC BSR OUTSPC * ADDED LABEL LOOPSX LDX #BUFER2 LOOPSE LDAA 0,X INX BSR PUTCH2 CPX SENPTR DONE? BNE LOOPSE LDX #FCB LOOPS2* JSR FMS FINISH SENTENCE BEQ LOOPS3 JMP ERROR LOOPS3 CMPA #$1F BLT QUITSE NON-PRINTABLE BSR PUTCH2 FINISH SENTENCE BRA LOOPS2 SPC 1 QUITSE CMPA #$D BNE NOTCR2 INC LINCNT+1 COUNT LINE BNE NOTCR2 INC LINCNT NOTCR2 LDX #BUFER2 STX SENPTR RTS + SPC 2 TABOVR BSR OUTSPC DECB BNE TABOVR RTS OUTSPC LDAA #$20 PUTCH2 JMP PUTCHR SPC 3 * PRINT FILE NAME * PNTNAM LDX #FSTRNG JSR PSTRNG LDX #FCB+4 PROGRAM NAME LDAB #8 BSR PNTNA2 LDAA #'. BSR PUTCH2 LDAB #3 PNTNA2 LDAA 0,X BSR PUTCH2 INX , DECB BNE PNTNA2 RTS SPC 2 OUTASC LDAA 0,X CMPA #$20 BLO PNTPER CMPA #$7F BLO OKPRNT PNTPER LDAA #'. PERIOD IF NOT PRINTABLE OKPRNT BSR PUTCH2 INX DECB BNE OUTASC RTS SPC 3 * CALL DISKEDIT AS SUBROUTINE * DISKED JSR CLOSE LDX #BUFER1 BUILD- COMMAND HERE LDAA FCB+3 GET DRIVE NUMBER ANDA #7 MAKE 0-7 ORAA #'0 MAKE ASCII BSR PUTBUF BSR PUTSPC SPACE AFTER DRIVE LDAA TSMAT TRACK BSR PUTBYT LDAA TSMAT+1 SECTOR BSR PUTBYT LDAA BYTMAT BYTE BSR PUTBYT LDAA #$D DOS TERMINATOR BSR PUTBU.F LDAA #4 PSTRNG TERMINATOR BSR PUTBUF LDX #DSKMSG STX BUFPTR POINT FLEX AT STRING JSR PTERM REPORT JSR DOCMND CALL DOS JMP EXIT PUTBYT PSHA LSRA FIRST NIBBLE LSRA LSRA LSRA BSR PUTNIB PULA ANDA #$F SECOND NIBBLE BSR PUTNIB PUTSPC LDAA /#$20 BRA PUTBUF PUTNIB ADDA #$90 HEX TO ASCII DAA ADCA #$40 DAA PUTBUF STAA 0,X INX RTS SPC 3 * ADDRESS TRACKING SUBROUTINE * * ENTER WITH CHARACTER IN ACC A AND * CLEAR ADRMOD BEFORE FIRST ENTRY. * EXITS WITH ADRNOW EQUAL TO CURRENT * PROGRAM 0ADDRESS AND ADRCHR EQUAL TO * ITS CONTENTS. ALL REGISTERS PRESERVED. * * ADRMOD CODED AS FOLLOWS * 0 = NOT TRACKING (NO $02 RECEIVED) * 1 = BLOCK ADDR MSB PENDING * 2 = BLOCK ADDR LSB PENDING * 3 = BYTE COUNT PENDING * 4 = TRACKING PENDING * 5 =  1TRACKING IN PROGRESS * 6 = TRACKING JUST ENDED * ADRTRK PSHB SAVE LDAB ADRMOD BEQ ADRNEW CMPB #6 BLO ADRRUN 1-5? CLR ADRMOD RESET MODE ADRNEW CMPA #2 START OF BLOCK BNE ADROFF ADREXT INC ADRMOD BUMP MODE ADROFF PULB RESTORE RTS SPC 1 ADRRUN CM!2PB #2 BGT ADRDON ADDRESS BEEN MADE? BEQ ADRLSB STAA ADRNOW MSB OF BLOCK ADDRESS BRA ADREXT SPC 1 ADRLSB STAA ADRNOW+1 BRA ADREXT SPC 1 ADRDON CMPB #4 BEQ ADROK BGT ADRINC STAA ADRCNT BYTE COUNTER BRA ADREXT SPC 1 ADROK INC ADRMOD BRA ADRDE"3C SPC 1 ADRINC INC ADRNOW+1 BUMP TRACKING ADDRESS BNE ADRDEC INC ADRNOW ADRDEC DEC ADRCNT REDUCE BYTE COUNT BNE ADRCOK INC ADRMOD BLOCK COMPLETE ADRCOK STAA ADRCHR SAVE CURRENT BYTE PULB RTS SPC 3 * MESSAGES * * ADDED CRLF FSTRNG FCB $0D,#4$0A FCC 'FILE BEING SEARCHED: ' FCB 4 * ADDED SPACE FOR FORMATTING SECBYT FCC ' SECTOR DISC DISC ' FCC 'BYTE PROGRAM' FCB $D,$A,0 * ADDED SPACE FOR FORMATTING FCC ' NUMBER TRACK# SECTOR# ' FCC 'NUMBER ADDRESS' FCB 4 ITEM FCC $5'ENTER ' ITEM2 FCC 'ITEM TO FIND: ' FCB 4 * CORRECTED TYPO OCCURM FCC 'TOTAL OCCURRENCES: ' FCB 4 PROMPT FCC 'Complete Diskedit ' FCC 'Flex Next' FCB $D,$A PROMP2 FCC 'Address Hex String ' FCC '(enter one letter): ' FCB 4 * NEW MESSAGE NADMSG FCC ' NO ADDRESS WITH TEXT FILES!' FCB $0D,$0A,4 * END OF NEW MESSAGE DSKMSG FCC 'DISKEDIT ' MUST PRECEDE BUFFER1 BUFER1 FCC 'FIND LETR.TXT ' FCC 'DEAR LEO (TEXT)' FCB $D,$A FCC 'FIND ASMB.CMD A ' FCC '10C5 (ADDR)' FCB $D,$A 7 FCC 'FIND LIST.CMD H ' FCC 'BD AD18 (HEX)' FCB $D,$A FCC 'FIND COPY.CMD S ' FCC 'FOUND (STRING)' FCB 4 * BUFER2 RMB 128 REMOVED HERE END FIND1  !ľ0O'%3"0 @~ƶ '& @ &e$ȧȡ ȝ\#L@ &, 0 Ȁ'̾Ȁ-'  ?~I 9} 'ؽN& ~~Y& ' Ñ~n*O_0Z&J'| ^@ &sȀ &b&^@ &Iȟȝ@ &. Ÿ9~E-E ==9$9% '" 0%0 پ0 ύ9'0 0| 9CURRENT NUMBER OF INDIVIDUcAL BLOCKS:FINAL NUMBER OF INDIVIDUAL BLOCKS:NUMBER OF SECTORS ENCOUNTERED NOT EQUAL TO NUMBER LEFT FIXING ABORTEDFIX THE CHAIN? THE CHAIN IS FIXED OPT PAG NAM FREE CHAIN FIXER 6809 version PAG * John Higley * Component Engineering * Tektronix, Inc. * * System variables EOL EQU $CC02 TTYSET end-of-line character LASTRM EQU $CC11 Last non-alphanumeric character WRKDRV EQU $CC0C Working drive number * * System equates GETCHR EQU $CD15 Input single character from KB NXTCH EQU $CD27 Input single character from buffer OUTADR EQU $CD45 Output HEX address OUTDEC EQU $CD39 Output decimal number PCRLF EQU $CD24 Output CR LF PSTRNG EQU $CD1E Output  string PUTCHR EQU $CD18 Output single character RPTERR EQU $CD3F Report disk error WARMS EQU $CD03 FLEX warm start * * File management system equates FMS EQU $D406 FCB EQU $C840 * * Freechain table goes here TABLE EQU 0 Address to place table * ORG $ C100 FIX BRA FIX1 FCB $21 Version number 2.1 TOP FDB TABLE+2 First location of Freechain table BOTTOM FDB TABLE+2 Last location of Freechain table NEXT FDB TABLE+2 Pointer for storing next entry to table BLOCKS FDB 0 Count of individual blocks FIXFLG  FCB 0 The chain needs fixing if set SECTOR RMB 2 Number of sectors in freechain SECMAX RMB 1 Maximum sectors per track TEMP RMB 2 Temp for computing size of block START RMB 2 Starting trk/sec of block STOP RMB 2 Ending trk/sec of block CURREN RMB 2 Nex t trk/sec to read CURSEC EQU START Current sector for modifying chain LINK EQU STOP New link for modifying chain * FIX1 LDX BOTTOM Setup RAM for table LDA #$FF 0000...table...FFFF STA 0,X TOP ^ BOTTOM ^ STA 1,X LEAX -2,X Clear two previous location s CLRA STA 0,X STA 1,X JSR NXTCH Get drive number BCS CKEOL Not a number. error? CMPA #'3 BHI ILLDRV Only 3 drives allowed SUBA #'0 ASCII to HEX BRA SETDRV ILLDRV LDX #FCB Set up illegal drive error LDB #15 STB 1,X .into error byte JMP ERR Tell it CKEOL LDA LASTRM Get last terminator from system CMPA #$D CR? BEQ GETWD .Yes, use working drive CMPA EOL TTYSET end-of-line character? BNE ILLDRV No, bad news! GETWD LDA WRKDRV Get working drive SETDRV LDX #FCB STA 3,X Put drive number int o FCB LDD #$0003 Get system information record STD 30,X .into current drive bytes LDA #9 Read single sector function (FMS) STA 0,X .into function byte JSR FMS Read BNE ERR Tell any error JSR PCRLF LDA FCB+103 Number of sectors per track STA SE CMAX .save it LDX FCB+97 System size of freechain STX SECTOR .into size counter LDX FCB+93 Starting trk/sec of freechain STX START .into START SETNXT STX CURREN LDD CURREN Calculate next linkage INCB .bump one sector CMPB SECMAX .too far? BLS N XTSEQ No, next is sequential LDB #1 First sector of INCA .next track NXTSEQ STD STOP Next trk/sec into STOP LDX #FCB LDD CURREN Read current sector STD 30,X .into current trk/sec bytes LDA #9 Read single sector function STA 0,X .into function by te JSR FMS Read it BNE ERR Tell any error LDX SECTOR Decrease remaining sector count LEAX -1,X STX SECTOR LDX FCB+64 Read linkage CPX STOP Does it match calculated linkage? BEQ SETNXT Yes, do next sector LDX CURREN Read current trk/sec STX ST OP .save it as closing LDX FCB+64 Read linkage STX CURREN .save it as next current LBSR PRINT Output the block and size LBSR STORE Save the start and stop in the table LDX CURREN Read the new starting trk/sec BEQ DONE Zero means chain is finished STX START Otherwise, save it as new start BRA SETNXT .and go on reading ERR JSR RPTERR Report disk errors JMP WARMS Exit to FLEX DONE LDX #CNTMSG JSR PSTRNG Output # of blocks msg LDX #BLOCKS .Output number of blocks LDB #1 .suppress leading spaces JSR OUTDEC . print it TST FIXFLG Is the chain ok? BEQ FIXXED Yes, tell it ASK LDX #QUEST JSR PSTRNG Output the question JSR GETCHR Get the answer CMPA #'N .Is it no? BNE ISITY No, check for yes JMP WARMS .Else exit to FLEX FIXXED LDX #FIXED Point to fixed message JSR PSTRNG .output it JMP WARMS Exit to FLEX ISITY CMPA #'Y Is it yes? BNE ASK .No, ask again! * * Fix the chain CLR BLOCKS+1 Clear the blocks count LDX SECTOR Read the sector count BEQ AOK Zero means system freechain is same size LDX #SECERR .Else: System and chain do not match! JSR PSTRNG .Output the message JMP WARMS Exit to FLEX AOK LDX #FINAL JSR PSTRNG Output final size message LDX TOP Begin new linking STX NEXT .top of table NXTBLK LDX NEXT LDD 2,X Get last trk/sec of block STD CURSEC LDD 4,X Get first trk/sec of next block BPL NOTLST Last sector? CLRA CLRB NOTLST STD LINK LEAX 4,X Bump to next entry STX NEXT DECB Decrease linkage by one BNE CONT No sector zero LDB SECMAX set to max sector DECA .of previous track CONT CMPD CURSEC compare to current trk/sec BEQ MODIFY .EQ: still a contiguous block INCBLK INC BLOCKS+1 Increment for non-adjacent blocks MODIFY LDX CURSEC Rewrite linkage for current sector STX FCB+30 Current trk/sec bytes LDX #FCB LDA #9 Read single sector function STA 0,X .into function byte JSR FMS Read LBNE ERR Tell any error LDD LINK Read new linkage STD FCB+64 .into linkage bytes LDA #10 Write single sector function STA 0,X .into function byte JSR FMS Write  LBNE ERR Tell any error LDX LINK Last sector? BNE NXTBLK No, do next linkage LDX #3 Modify system information record STX FCB+30 .into current trk/sec bytes LDX #FCB LDA #9 Read single sector function STA 0,X .into function byte JSR FMS Read LBNE ERR Report any error LDX CURSEC Read current sector STX FCB+95 .into end of freechain LDX [TOP] Read the starting trk/sec STX FCB+93 .into start of freechain LDX #FCB LDA #10 Write single sector function STA 0,X JSR FMS Write it LBNE ERR Tell any error LDX #BLOCKS Output number of blocks LDB #1 .suppress leading spaces JSR OUTDEC JMP WARMS Exit to FLEX * * Print start stop and size of block PRINT LDX #START JSR OUTADR Output start of block LDA #'- JSR PUTCHR .output dash LDX #STOP JSR OUTADR .output end of block LDA #$20 .output space JSR PUTCHR * Calculate size of block LDB START Get starting track LDA SECMAX Number of sectors per track MUL ADDB START+1 Add starting sector ADCA #0 STD TEMP Save it LDB STOP Get ending track LDA SECMAX Number of sectors per track MUL ADDB STOP+1 Add ending sector ADCA #0 ADDD #1 Bump it one more SUBD TEMP Subtract starting number STD TEMP .save it LDX #TEMP Output size of block LDB #1 .suppress leading spaces JSR OUTDEC   JSR PCRLF RTS That's all * * Numeric store routine * Places START and STOP into table STORE LDX NEXT CHECK LDX 0,X Get last starting entry CPX START Compare last start to START BLO INCR Last start is lower move pointer LDX NEXT Last start is highe!r CPX BOTTOM If NEXT equals BOTTOM BEQ HERE .then chain is ok and entry goes here LDA #1 STA FIXFLG Chain will need fixing LEAX -2,X Drop to check last stop entry LDX 0,X CPX START Compare prior stop to START BLO HERE Next points to correct ins"ert location LDX NEXT LEAX -4,X Drop one complete block STX NEXT BRA CHECK Go check this point INCR LDX NEXT Last start was lower than START LEAX 4,X Bump to next block STX NEXT BRA CHECK Go check this point * Place START and STOP into table at #NEXT HERE BSR PSHUP Make a space in the table LDX NEXT NEXT points to entry LDD START Get START of block STD 0,X Place it LDD STOP Get STOP of block STD 2,X Place it RTS * * Make 4 byte hole in table at NEXT * Push up ram from NEXT to BOTTOM PSH$UP LDX BOTTOM Get Bottom of table PSH1 LDD 0,X Read two bytes STD 4,X Place 4 bytes up CPX NEXT Done yet? BEQ PSHDUN Yes, change BOTTOM LEAX -2,X Next two bytes BRA PSH1 Move them PSHDUN LDX BOTTOM LEAX 4,X Point BOTTOM 4 further STX BOTTOM INC BLOCKS+1 Increment count of blocks RTS CNTMSG FCC 'CURRENT NUMBER OF INDIVIDUAL BLOCKS:' FCB 4 FINAL FCC 'FINAL NUMBER OF INDIVIDUAL BLOCKS:' FCB 4 SECERR FCC 'NUMBER OF SECTORS ENCOUNTERED NOT EQUAL TO ' FCC 'NUMBER LEFT' FDB $D0A FCC 'FIXING A BORTED' FCB 4 QUEST FCC 'FIX THE CHAIN? ' FCB 4 FIXED FCC 'THE CHAIN IS FIXED',4 END FIX  ' ''3"0 ϶ @O &ȦLȧ=X1?&Oȧ1?D1?&SSȝC &Q  ȧ= .1! @& ȡ& ȟ'GUȟ<0] WHERE REPRESENTS A SINGLE DIGIT DRIVE NUMBER AND SPECIFIES THE DRIVE TO BE MAPPED. DEFAULT IS WORKING DRIVE. FREEMAP SHOWS IN A TABLE FORMAT, THE STATUS OF SECTORS ON A DISK.  IT IS MAINLY FOR CHECKING HOW FRACTURED THE FREE CHAIN BLOCKS ARE, AND THEIR DISK LOCATIONS. ERROR CHECKING IS ALSO DONE ON THE FREE CHAIN, AND IF ANY PROBLEMS, THE SUSPECT RESULTS ARE LISTED. A DISK WITH SMALL GROUPS OF FREE AREAS SCATTERE D ABOUT IS WORTH COPYING COMPLETELY TO A BLANK DISK AND "NEWDISKING" THE ORIGINAL. THIS RESTORES THE FILES AND FREE AREAS AS SEQUENTIAL BLOCKS THAT CAN BE ACCESSED MUCH FASTER. NOTE: THIS UTILITY SHOULD ADAPT TO ANY FORMAT (SINGLE OR DOUBLE  DENSITY, SINGLE OR DOUBLE SIDED, 5 OR 8 INCH DRIVES, OR EVEN CUSTOM FORMATS AS THE STRUCTURE IS READ FROM THE SYSTEM INFORMATION SECTOR EXAMPLES +++FREEMAP +++FREEMAP,1 THE FIRST WILL MAP THE WORKING DRIVE, WHILE THE SECOND WILL DO DRIV E 1 ALL FLEX ERROR CHECKING IS SUPPORTED, AND ALL SYSTEM TTYSETS AND VARIABLES ARE HONORED. ALSO, ONLY COMPLETE BLOCKS OF INFORMATION WILL BE DISPLAYED PER LINE (AS MANY AS WILL FIT DEPENDING ON WD IN TTYSET). (PUT AT BOTTOM OF PAGE) -F1.1X-  OPT PAG NAM FREEMAP UTILITY FOR 6809 FLEX PAG * KEN S SMITH AUG 81 * 13455 S.W. DRIFTWOOD * BEAVERTON, OR 97005 * TEK (503) 627-2319 78-573 * THE FOLLOWING DESCRIPTION CAN BE PRINTED AND PUT IN THE * FLEX MANUAL * FREEMAP * * * THE FREEMAP COMMAND IS USED TO DISPLAY GRAPHICALLY THE * LOCATION AND STATUS (FREE OR USED) OF ALL THE SECTORS * ON A DISK, AND CHECK THE STRUCTURE OF THE FREECHAIN FOR * ERRORS (SEE ADVANCED PROGRAMMERS GUIDE). * DESCRIPTION * * THE GENERAL SYNTAX OF THE FREEMAP COMMAND IS: * * FREEMAP[,] * * WHERE REPRESENTS A SINGLE DIGIT DRIVE NUMBER AND * SPECIFIES THE DRIVE TO BE MAPPED. DEFAULT IS WORKING DRIVE. * FREEMAP SHOWS IN A TABLE FORMAT, THE STATUS OF SECTORS * ON A DISK. IT IS MAINLY FOR CHECKING HOW FRACTURED THE * FREE CHAIN BLOCKS ARE, AND THEIR DISK LOCATIONS. ERROR * CHECKING IS ALSO DONE ON THE FREE CHAIN, AND IF ANY * PROBLEMS, THE SUSPECT RESULTS ARE LISTED. A DISK WITH * SMALL GROUPS OF FREE AREAS SCATTERED ABOUT IS WORTH * COPYING COMPLETELY TO A BLANK DISK AND "NEWDISKING" THE * ORIGINAL. THIS RESTORES THE FILES AND FREE AREAS AS * SEQUENTIAL BLOCKS THAT CAN BE ACCESSED MUCH FASTER. * * NOTE: THIS UTILITY SHOULD ADAPT TO ANY FORMAT (SINGLE * OR DOUBLE DENSITY, SINGLE OR DOUBLE SIDED, 5 OR * 8 INCH DRIVES, OR EVEN CUSTOM FORMATS AS THE * STRUCTURE IS READ FROM THE SYSTEM INFORMATION SECTOR * * EXAMPLES * * +++FREEMAP * +++FREEMAP,1 * * THE FIRST WILL MAP THE WORKING DRIVE, WHILE THE SECOND WILL DO DRIVE 1 * * ALL FLEX ERROR CHECKING IS SUPPORTED, AND ALL SYSTEM TTYSETS * AND VARIABLES ARE HONORED. ALSO, ONLY COMPLETE BLOCKS OF INFORMATION * WILL BE DISPLAYED PER LINE (AS MANY AS WILL FIT DEPENDING ON WD * IN TTYSET). * * (PUT AT BOTTOM OF PAGE) -F1.1X- * FLEX ROUTINES FCB EQU $C840 FILE CONTROL BLOCK WARMS EQU $CD03 WARM START ENTRY PSTRNG EQU $CD1E PRINT STRING PCRLF EQU $CD24 PUT CR AND LF PUTCHR EQU $CD18 PUT CHARACTER NXTCH EQU $CD27 NEXT BUFFER CHARACTER OUTDEC EQU $CD39 OUTPUT DECIMAL NUMBER (16 B IT) OUTHEX EQU $CD3C OUTPUT BYTE AS HEX RPTERR EQU $CD3F REPORT ERROR FMSCLS EQU $D403 FILE MANAGEMENT SYSTEM CLOSE FMS EQU $D406 FILE MANAGEMENT SYSTEM ENTRY * FLEX VARIABLES WIDTH EQU $CC04 TERMINAL WIDTH WDRIVE EQU $CC0C WORKING DRIVE COLUMN EQU $C C29 CURRENT COLUMN POSITION ENDLIN EQU $CC02 FLEX END OF LINE CHAR * POINTERS AND VARIABLES * POINTERS TO SYSTEM INFO IN THE FCB DKNAME EQU FCB+80 DISK NAME VOLNUM EQU FCB+91 DISK VOLUMN NUMBER SRTFRE EQU FCB+93 START OF FREE CHAIN ENDFRE EQU FCB+95  END OF FREE CHAIN SIZFRE EQU FCB+97 SIZE OF FREE CHAIN TRKMAX EQU FCB+102 MAXIMUM TRACKS ON DISK SECMAX EQU FCB+103 MAXIMUN SECTORS ON DISK * VARIABLE PRESETS ARRAY EQU $0001 BEGINNING OF ARRAY IN RAM FREFCB EQU $1000 BEGINNING OF FCB FOR USE WITH FRE E CHAIN ORG $C100 FREEMAP BRA START FCB $10 VERSION NUMBER 1.0 * SCRATCH VARIABLES TOTLSEC FDB $0000 HOLD TOTAL NUMBER OF SECTORS ON DISK LINK FDB $0000 FREE CHAIN TRACK AND SECTOR POINTER TRKOUT FDB $0000 CURRENT TRACK RESULTS BEING OUTPUT FREECNT F DB $0000 # OF FREE SECTORS SCRATCH FDB $0000 SCRATCH AREA * DETERMINE WHICH DISK TO WORK ON START JSR NXTCH GET PARAMATER (DRIVE #) CMPA #$0D CR ? BEQ DEFLT YES, BRANCH CMPA ENDLIN END OF LINE CHAR ? BEQ DEFLT YES, BRANCH CMPA #'3 DRIVE 0-3? BHI BADNUM NO, BRANCH SUBA #'0 ASCII TO BINARY BRA A1 BADNUM LDX #OUT1 BAD DRIVE MESSAGE LBRA OUTEND DEFLT LDA WDRIVE GET FLEX WORKING DRIVE A1 LDX #FCB SET UP FILE BLOCK POINTER STA 3,X STORE DRIVE # * READ THE SYSTEM SECTOR * NOTE: THE SYSTEM SECTOR WILL BE KEPT FOR DURATION CLRA SET FOR TRACK ZERO STA 30,X LDA #$03 SET FOR SECTOR 3 (SYSTEM) STA 31,X LDA #$09 SET FOR LOW LEVEL SECTOR READ STA 0,X JSR FMS READ SYSTEM SECTOR LBNE ERROR CHECK FOR DISK ERROR * CREATE ARRAY IN RAM AND INTIALIZE TO X'S LDX #ARRAY BEGINNING OF ARRAY IN RAM LDA TRKMAX CALCULATE TOTAL # OF SECTORS INCA .ACCOUNT FOR TRACK ZERO LDB SECMAX MUL STD TOTLSEC .TUCK AWAY PRODUCT LDD #ARRAY BUILD END ARRAY ADDRESS ADDD TOTLSEC TFR D,Y LDA #'X INTIALIZE ARRAY TO X'S INIT STA ,X+ LEAY -1,Y ALL LOCATIONS INTIALIZE? BNE INIT NO,BRANCH BACK * INTIALIZE SYSTEM TRACK OF ARRAY LDX #ARRAY POINT TO TRACK ZERO SECTOR 1 CLRA BUILD POINTER TO LAST SECTOR LDB SECMAX ADDD #ARRAY TFR D,Y LEAY -1,Y LDA #'D SET ALL TRACK 0 TO D'S INITSYS STA ,X+ LEAY -1,Y ALL SECTORS TRACK ZERO OUT BNE INITSYS NO;BRANCH BACK LDX #ARRAY SET FIRST 4 SECTORS TO S (SYSTEM) LDY #$5353 .ASCII "SS" STY ,X++ STY ,X * GET,FOLLOW, AND SET ARRAY WITH FREECHAIN LDX SRTFRE START OF  FREECHAIN STX LINK .INTIALIZE FREECHAIN POINTER LDA FCB+3 GET DRIVE NUMBER LDX #FREFCB POINTER TO FREECHAIN FCB STA 3,X DRIVE # TO FREECHAIN FCB LDY #$0000 INTIALIZE FREE SECTOR COUNT FREELP LDX #FREFCB LDA #9 SET FOR FCB READ STA ,X LDD LINK !SET TRACK AND SECOR TO READ STD 30,X JSR FMS READ SECTOR LBNE ERROR CHECK FOR DISK ERRORS ** UPDATE ARRAY CLR SCRATCH BUILD CURRENT SECTOR # AS 16 BIT LDA LINK+1 CURRENT SECTOR STA SCRATCH+1 LDA LINK CURRNET TRACK # LDB SECMAX MAX SECTORS ON A" TRACK MUL ADDD SCRATCH COMPLETE ARRAY POINTER TFR D,X .AND PUT IN X LDA #'. UPDATE ARRAY LOCATION STA ,X LEAY 1,Y INC FREE SECTOR COUNT STU SCRATCH SAVE PREVIOUS DISK ADDRESS FOR END FREE COMPARISONS LDU FREFCB+64 POSITION FOR NEXT TRACK AND S#ECTOR STU LINK BNE FREELP CONTINUE UNTIL LINK IS ZERO STY FREECNT SAVE # FREE SECTORS * SEE IF FREE SECTOR COUNT AND DISK AGREE CMPY SIZFRE # SECTORS OK ? BNE A5 NO, BRANCH LDU SCRATCH GET LAST SECTOR ADDRESS CMPU ENDFRE ENDING ADDRESS OK? BEQ$ B1 YES, BRANCH A5 LDX #OUT2 BAD FREECHAIN MESSAGE JSR PSTRNG LDX #OUT5 OUTPUT DISK END FREECHAIN JSR PSTRNG LDX #ENDFRE JSR OUTHEX LEAX 1,X JSR OUTHEX LDX #OUT6 OUTPUT ACTUAL END JSR PSTRNG LDX #SCRATCH JSR OUTHEX LEAX 1,X JSR OUTHEX LDX #OUT7 OUTPUT # OF FREE SECTORS ON SYSTEM SECTOR JSR PSTRNG LDX #SIZFRE JSR OUTDEC LDX #OUT8 OUTPUT ACTUAL # OF FREE SECTORS JSR PSTRNG STY SCRATCH LDX #SCRATCH JSR OUTDEC JSR PCRLF *OUTPUT TITLE AND HEADINGS B1 JSR PCRLF JSR PCRLF LDX #OUT9 OUT TITLE JSR PSTRNG LDA FCB+3 GET DRIVE # STA SCRATCH+1 CLRB SET FOR ZERO SUPPRESS STB SCRATCH .ALSO CLEAR UPPER BYTE LDX #SCRATCH OUTPUT DRIVE # JSR OUTDEC LDX #OUT10 OUT DISK NAME LINE JSR PSTRNG LDX #DKNAME POINT TO DISK NAME LDB #8 # OF CHAR TO OUTPUT DKNAMLP LDA ,X+ GET CHAR JSR PUTCHR DECB ALL CHARS. OUTPUT? BNE DKNAMLP NO, BRANCH LDA #$20 OUTPUT 2 SPACES JSR PUTCHR JSR PUTCHR LDA #'V OUTPUT VOL# ON SAME LINE JSR PUTCHR LDA #'O JSR PUTCHR LDA #'L JSR PUTCHR LDA #'# JSR PUTCHR LDX VOLNUM GET VOLUME # STX SCRATCH LDX #SCRATCH OUTPUT VOLUME # JSR OUTDEC JSR PCRLF LDX #OUT11 OUT HEADER JSR PSTRNG JSR PCRLF JSR PCRLF * OUTPUT ARRAY IN TABLE FORMAT ARRYOUT LDX #TRKOUT+1 CURRENT TRACK BEING DISPLAYED JSR OUTHEX OUTPUT HEX TRACK # LDA #$20 OUTPUT SPACE JSR PUTCHR * BUILD ARRAY POINTER LDB TRKOUT+1 CURRENT TRACK LDA SECMAX MUL TFR D,X * OUTPUT SECTORS LDB #$01 SECOUT LDA B,X ARRAY ELEMENT JSR PUTCHR INCB NEXT SECTOR CMPB SECMAX ALL SECTORS OUTPUT? BLE SECOUT NO BRANCH LDA #$20 3 SPACES OUT LDB #3 SPACE JSR PUTCHR DECB BNE SPACE * CHECK IF ALL TRACKS OUTPUT INC TRKOUT+1 NEXT TRACK LDA TRKMAX CMPA TRKOUT+1 ALL TRACKS DISPLAYED? BLT ENDMES YES BRANCH * CHECK IF ENOUGH ROOM ON LINE FOR ANOTHER TRACK OUTPUT LDA COLUMN COLUMN POSITION ADDA SECMAX NUMBER OF SECTORS ADDA #7 TRACK NUMBER AND MISC SPACES CMPA WIDTH EXCEED LENGTH OF LINE? BLE ARRYOUT NO BRANCH JSR PCRLF NEW LINE BRA ARRYOUT NEXT TRACK ENDMES JSR PCRLF LDX #OUT13 OUT STATUS INFO JSR PSTRNG JSR PCRLF LDX #OUT12 OUT FREE SECTOR COUNT JSR PSTRNG LDX #FREECNT CLRB .SET FOR ZERO SUPPRESSION JSR OUTDEC LDX #OUT4 END MESSAGE BRA OUTEND OUTEND JSR PSTRNG BRA EXIT ERROR JSR RPTERR REPORT ERROR EXIT JSR FMSCLS CLOSE FILE JMP WARMS WARM START IN FLEX OUT1 FCC 'ILLEGAL DRIVE NUMBER' FCB $04 OUT2 FCC 'FREE CHAIN AND DISK DO NOT MATCH' FCB $04 OUT3 FCC ' ' FCB $04 OUT4 FCC 'FREEMAP UTILITY COMPLETE' FCB $04 OUT5 FCC 'SYSTEM END FREECHAIN = ' FCB $04 OUT6 FCC 'A !CTUAL END FREECHAIN = ' FCB $04 OUT7 FCC 'SYSTEM FREE SECTORS = ' FCB $04 OUT8 FCC 'ACTUAL FREE SECTORS = ' FCB $04 OUT9 FCC 'FREE SECTOR MAP FOR DRIVE # ' FCB $04 OUT10 FCC 'DISK = ' FCB $04 OUT11 FCC 'TRACK #/SECTOR STATUS' FCB $04 OUT12 FCC 'T"OTAL FREE SECTORS = ' FCB $04 OUT13 FCC 'S=SYSTEM D=DIRECTORY .=FREE X=FILE' FCB $04 END FREEMAP  @-%6@3@&"o;B%8]'=@& 0 @'?@'?~n FILE SPEC NOT HEX! INCOMPLETE FILE SPEC!  * **** GETEXT **** *  * THIS UTILITY ALLOWS A FLEX USER TO LOAD ASCII FROM * DISK TO MEMORY BY SPECIFYING A LOAD ADDRESS IN HEX * FORM. ALL ERROR POSSIBILITIES ARE CHECKED FOR AND * REPORTED IF ENCOUNTERED. *  * FERROUS C. STEINKA * 18570 S.W. ALDERWOOD DRIVE * ALOHA, OREGON 97006 *  * *** FORM OF THE CALL IS *** * GETEXT,, *  *  MAINORG EQU $C000 $A000 FOR FLEX II, $C000 FOR FLEX09 *  *  FCB EQU MAINORG+$840 GETFIL EQU MAINORG+$D2D SETEXT EQU MAINORG+$D33 GETHEX EQU MAINORG+$D42 FMS EQU MAINORG+$1406 RPTERR EQU MAINORG+$D3F WARMS EQU MAINORG+$D03 PSTRING EQU MAINORG+$D1E TXT EQU 1 TEXT EXTENSION BYTE READ EQU 1 OPEN FOR READ COMMAND FILECLS EQU 4 FMS CLOSE FILE COMMAND ENDERR EQU 8 END OF FILE ERROR BYTE *  ORG MAINORG+$100 *  GETEXT BRA START BRANCH AROUND TEMPS *  FCB 1 THE VERSION NUMBER TEMP1 RMB 2 CURRENT MEMORY POINTER *  START LDX #FCB POINT TO THE FCB JSR GETFIL GET THE FILE SPEC BCS ERROR GO REPORT THE ERROR LDA A #TXT THE DEFAULT EXTENSION LDX #FCB POINT TO THE FCB JSR SETEXT PUT EXTENSION IN THE FCB LDX #FCB POINT TO THE FCB LDA A #READ OPEN FILE FOR READING STA 0,X STORE COMMAND IN FCB JSR FMS CALL FILE MANAGEMENT SYSTEM BNE ERROR GO REPORT THE ERROR CLR 59,X TURN ON SPACE COMPRESSION JSR GETHEX GET HEX WORD FROM BUFFER BCS HEXERR BUFFER DATA NOT HEX TST B IS THERE AN ENTRY? BEQ NOADD NO, GO REPORT IT STX TEMP1 SAVE THE MEMORY POINTER LOOP LDX #FCB POINT TO THE FCB JSR FMS LOAD CHARACTER FROM FCB BNE ERROR GO CHECK OUT ERROR TYPE LDX TEMP1 THE MEMORY POINTER STA A 0,X STORE THE CHARACTER INX UP THE MEMORY POINTER STX TEMP1 POINT TO NEXT LOCATION BRA LOOP NOT DONE, CONTINUE *  ERROR LDX #FCB POINT TO THE FCB LDA A #ENDERR THE END OF FILE BYTE CMP A 1,X CHECK AGAINST THE FCB BEQ CLOSE IF END, GO CLOSE FILE JSR RPTERR ELSE, TELL THE SAD NEWS *  CLOSE LDX #FCB POINT TO THE FCB LDA A #FILECLS THE CLOSE FILE COMMAND STA A 0,X STORE COMMAND IN FCB JSR FMS CALL FILE MANAGEMENT SYSTEM BEQ GOBACK N O ERRORS, RETURN JSR RPTERR TELL THE SAD NEWS GOBACK JMP WARMS RETURN CONTROL TO FLEX *  HEXERR LDX #HEXMSG POINT TO MESSAGE SNDMSG JSR PSTRING SEND IT TO TERMINAL BRA CLOSE NOW, GO CLOSE FILE *  NOADD LDX #ADDMSG POINT TO MESSAGE BRA SNDMSG GO SE ND IT *  HEXMSG FCC /FILE SPEC NOT HEX!/ FCB $D,$A,4 *  ADDMSG FCC /INCOMPLETE FILE SPEC!/ FCB $D,$A,4 *  END GETEXT *   30XĿ B @-%IHLP &5$@& &$  && BĿ ~' '? 0@ 0O Help Utility Type "HELP[,<.drive number>]" If the file with "filename" extension ".HLP" exists, the text data within that file will be printed on the terminal device. Auto drive search is the default for help file searcˆxhes. Adding the drive number will initiate a search for the help file on that drive. That help file does not exist. OPT PAG PAG * * HELP UTILITY * * WRITTEN APRIL 1982 BY * * WALT CATINO * * ATOMIC-DYNAMIC INDUSTRIES * PO BOX 237 * BANKS, OREGON * 97106 * * THIS PROGRAM IS A RELOCATABLE HELP UTILITY THAT RUNS * UNDER FLEX/9. THE BASIC CALL IS "HELP<,FILENAME><.DRIVE>". * IF "HELP" IS TYPED WITHOUT ANY PARAMETERS, INFORMATION * ABOUT THE USE OF THE HELP UTILITY WILL BE OUTPUT TO THE * TERMINAL DEVICE. IF HELP IS TYPED WITH A FILENAME, THE * SYSTEM DRIVE AND THE WORK DRIVE WILL BE SEARCHED FOR THE FILE * "FILENAME.HLP", AND THE CONTENTS OF THAT FILE WILL BE OUTPUT * TO THE TERMINAL. * IF THE OPTIONAL DRIVE NUMBER IS ADDED ONTO THE END OF THE * FILENAME, THE SEARCH FOR THE HELP FILE WILL BE LIMITED TO THAT * DRIVE ALONE. * * FILES THAT ARE CREATED FOR USE BY THIS PROGRAM MUST BE TEXT * FILES HAVING THE EXTENSION ".HLP". * * ALL FLEX ERRORS ARE HANDLED. ESCAPE RETURN SEQUENCES ARE ALLOWED. * THIS ROUTINE IS A MODIFICATION OF A TSC LIST UTILITY. * * DOS EQUATES WARMS EQU $CD03 DOS WARM START ENTRY GETFIL EQU $CD2D GET FILE SPECIFICATION PUTCHR EQU $CD18 PUT CHARACTER ROUTINE PCRLF EQU $CD24 PRINT CR & LF SETEXT EQU $CD33 SET DEFAULT NAME EXT RPTERR EQU $CD3F REPORT DISK ERROR PSTRNG EQU $CD1E PRINT STRING WORKDRV EQU $CC0C WORKING DRIVE NUMBER ESCRET EQU $CC16 ESCAPE RETURN REGISTER * FMS EQUATES FMS EQU $D406 FMSCLS EQU $D403 * SYSTEM EQUATES FCB EQU $C840 SYSTEM FCB * HELP UTILITY STARTS HERE ORG $C100 HELP BRA HELP2 GET AROUND VERSION NO VN FCB 1 VERSION NUMBER  HELP2 LEAU DATA,PCR SET STACK SPACE LEAX ABORT,PCR GET ABORT ADDRESS LDY ESCRET STY 0,U SAVE ESCAPE-RETURN ADDRESS STX ESCRET STORE IN ESCAPE-RETURN LOCATION LDA WORKDRV GET CURRENT WORKING DRIVE NUMBER STA 2,U SAVE IT LDA #$FF GET DRIVE 1-2 A!UTO SEARCH CONSTANT STA WORKDRV STORE IN WORKING DRIVE LOCATION LDX #FCB POINT TO FCB JSR GETFIL GET FILE SPEC BCS HELP9 ANY ERRORS? LDA #1 GET OPEN FILE CODE STA 0,X PUT IN FCB LDY #$484C GET "HL" TO Y REG LDA #'P "P" TO A REG STY 12,X STORE " "HL" IN FCB EXTENSION STA 14,X STORE "P" IN FCB EXTENSION JSR FMS CALL FMS - OPEN FILE BNE HELP9 CHECK FOR ERROR JSR PCRLF OUTPUT A CARRIAGE RETURN HELP4 LDX #FCB POINT TO FCB JSR FMS CALL FMS - GET CHARATER BNE HELP6 ANY ERRORS? CMPA #$D IS CH# AR A CR? BNE HELP5 JSR PCRLF OUTPUT CR/LF BRA HELP4 REPEAT HELP5 JSR PUTCHR OUTPUT THE CHARACTER BRA HELP4 REPEAT SEQUENCE HELP6 LDA 1,X GET ERROR STATUS CMPA #8 IS IT EOF ERROR? BNE HELP9 LDA #4 CLOSE FILE CODE STA 0,X STORE IN FCB JSR FMS $ CALL FMS - CLOSE FILE BNE HELP9 ANY ERRORS? ABORT LDA 2,U GET DRIVE CONSTANT LDX 0,U GET ESCAPE VECTOR STX ESCRET RESTORE ESCAPE-RETURN VECTOR STA WORKDRV RESTORE WORKING DRIVE NUMBER JMP WARMS RETURN TO FLEX HELP9 LDA 1,X GET ERROR CODE CMPA #2 1 BAD FILE SPEC? BEQ PHELP PRINT SPIEL CMPA #4 FILE NOT FOUND? BEQ TELLEM GIVE OPERATOR THE STORY JSR RPTERR REPORT ERRORS ENDIT JSR FMSCLS CLOSE ALL FILES BRA ABORT RETURN TO FLEX PHELP LEAX DATA1,PCR SET X POINTER STRNG JSR PSTRNG PRINT THE ST RING LDX #FCB RESET FCB POINTER BRA ENDIT CLOSE TELLEM LEAX DATA2,PCR SET POINTER FOR STRING BRA STRNG DATA1 FDB $0A0A FCC ' Help Utility',$0A,$0A,$0D FCC 'Type "HELP[,<.drive number>]"',$0A,$0A,$0D FCC 'If the file with "filename" extension ".HLP" exists,',$0A,$0D FCC 'the text data within that file will be printed on',$0A,$0D FCC 'the terminal device.',$0A,$0D FCC 'Auto drive search is the default for help',$0D,$A FCC 'file searches. Adding the drive number will',$0D,$A FCC 'initiate a search for the help file on that drive.',$0A,$A,$0D,$4 DATA2 FCC 'That help file does not exist.',$04 DATA EQU * END HELP  This file contains a short description of each of the Tektronix public domain software contributed by the various FLEX users at Tek. Each entry contains the name of the source, who wrote it, what system it runs on, and a short description and example of the use of the program. NAME: BACKUP AUTHOR: John Higley and Ken Smith FLEX VSN: FLEX09 DESCRIPTION: This command is used to archive files onto a backup disk. Backups can be performed on a single file, a matchlist of files, or all of the files on a disk. If the files already exist the dates are used in determining whether or not to produce the backup. BACKUP need not be on either disk. NAME: CHECKSUM AUTHOR: Ken Smith and John Higley FLEX VSN: FLEX 6809 DESCRIPTION: This utility is used to compute a 24 bit checksum for disk files. The checksum can be used to verify file and disk integrity. A single file, matchlist, or all the files on one or more disks can be done. File copying, archiving, and verifing PROM p rogrammer results are some of the most useful applications. Command form is +++CHECKSUM[,][,][,+(options)] NAME: COUNT AUTHOR: WALT CATINO FLEX VSN: FLEX 6809 DESCRIPTION: This is a utility which counts the number of li nes and characters in the specified file and reports the totals to the console. Form of the call is . NAME: DIR AUTHOR: BILL PFEIFER FLEX VSN: FLEX 6809 DESCRIPTION: This is a system command similar to CAT. Unlike CAT, DIR  displays information pertaining to the physical location on the disk as well as the date the file was created. DIR observes TTYSET limits. NAME: DKCOPY AUTHOR: BILL PFEIFER FLEX VSN: FLEX 6809 DESCRIPTION: This is a utility which allows one  to copy entire disks with a minimum of 'clicking'. NAME: DKDIFF AUTHOR: Ken Smith FLEX VSN: FLEX09 DESCRIPTION: This command tells which files exist on one disk but not on another. Two options allow the comparison to include the creation da te and file size. Form of the call is . NAME: DKNAME AUTHOR: JOHN HIGLEY, DON VANBEEK(original) FLEX VSN: FLEX09 DESCRIPTION: Allows the user to rename a disk. DKNAME supports FLEX disk extensions and allows any ch aracter (except dot) in the name. Form of the call is DKNAME[,]. NAME: FIXCHAIN AUTHOR: JOHN HIGLEY FLEX VSN: FLEX09 DESCRIPTION: This program maps the sector arrangement of the FREE CHAIN on the disk. The user is then asked if he  wants to have the chain reordered from the outside of the disk into the center. This operation changes the linkage and results in fewer non-contiguous blocks of disk space. Form of the call is FIXCHAIN[,]. NAME: FREEMAP AUTHOR: KEN S SMITH FLEX VSN: FLEX 09 (6809) DESCRIPTION: The FREEMAP command is used to display graphically the location and status (free or used) of all the sectors on a disk, and check the structure of the freechain for errors. Form of the command is  FREEMAP[,] default is working drive. NAME: GETEXT AUTHOR: FERROUS STEINKA FLEX VSN: FLEX II (6800) DESCRIPTION: GETEXT is a utility that allows the user to GET a TEXT file from the disk and roll it into memory at a specified starting address. All error possibilities are checked for and reported if encountered. No upper memory limit is imposed so it is possible to over-write FLEX with a large text file. Form of the call is: GETEXT,, Default extension is .TXT, and address must be hex. NAME: HELP AUTHOR: Walt Catino FLEX VSN: Flex/9 DESCRIPTION: This utility will search the system drive and the work drive for text files with the extension ".HLP". Upon locating the file, HELP will print the file to the terminal obeying all of the TTYSET parameters. The form of the call is: "HELP<,filename><.drive>". If "HELP" alone is called, information about how to use the Help command will be output. If "HELP,filename" is typed, the system drive and the work drive will be searched for a file with that filename and a '.HLP' extension. If the file is not found, a message indicating such will be output to the terminal. If the drive containing the filename is known, adding a ".drivenumber" will limit the search to that drive alone. All flex errors are handled and the escape-return sequence for large listings is allowed. NAME: MAP AUTHOR: JOHN HIGLEY FLEX VSN: FLEX09 DESCRIPTION: This program reads a FLEX binary file and displays its load and transfer addresses. Form of the call is MAP,  Default extension is .CMD. NAME: MEMDUMP AUTHOR: RICK BENSENE FLEX VSN: FLEX/09 DESCRIPTION: This utility is used to dump the content of memory on the system console. The user specifies a starting and ending address with the command. The content of memory will be dumped in hexadecimal, along with ASCII interpretation of each byte. The output format is very similiar to the DDT 'Q' dump. See  documentation in SPECLIB for operation of the utility. NAME: OLOAD9S AUTHOR: BILL PFEIFER FLEX VSN: FLEX 6809 DESCRIPTION: This utility allows one to load a binary file at an address other than the one specified in its 'ORG' statement. It was written to do the same as FLEX's OLOAD in their utility package. Since it was written here at TEK, it does not carry a copyright. NAME: OSAVE AUTHOR: RICK BENSENE FLEX VSN: FLEX 6809 DESCRIPTION: This utility performs the compliment of the 'OLOAD' utility. It allows one to save data in ram, so that the resulting binary file will load at different address than the original ram copy. This is useful along with OLOAD for making customized versions of FLEX, by using OLOAD to load FLEX at a low memory area, modifying it using DDT or similiar, then saving the modified binary with OSAVE, with an offset so that the binary will load where FLEX is supposed to load. The format of the call is: OSAVE,,,,[,] The added to the addresses. the is is optional, and works similiar to the 'SAVE' command. Note that this program does not re-locate anything. It just makes a binary that will load at a different place. It does not guarantee that it will run there! For more information, see the source for documentation. NAME: SAVTEXT AUTHOR: FERROUS STEINKA FLEX VSN: FLEX II (6800) DESCRIPTION: SAVTEXT is a utility that allows the user to SAVE a TEXT file from memory to the disk on a specified file name. All error possibilities are checked for and reported to the user if encountered. Form of the call is: SAVTEXT,,, Default extension is .TXT, and addresse s must be hex. NAME: SECTOR AUTHOR: JOHN HIGLEY FLEX VSN: FLEX09 DESCRIPTION: This program displays the sector arrangement of a file on disk. Also a chain of sectors starting at a specific point can be displayed. Form of the call is SECTOR!, for a file or SECTOR,<+DTTSS> where D is the disk drive number, and TT is the starting track, and SS is the starting sector. First digit of the specification is always used as the drive number, and the remaining digits of the specification are right justified to determine the starting track and sector. #* UTILITY FOR INITIALIZING 5 AND 8 INCH * SOFT SECTOR SINGLE DENSITY DISKS USING * FLEX-1, FLEX-2, OR FLEX-9. * * SUPPORTED HARDWARE: * * SWTP MF-68 1 SIDED 5 INCH * F&D MDI-1 1/2 SIDED 5/8 INCH * SWTP DMAF-1 1/2 SIDED 8 INCH * * FORMATS DISKS$ USING TABLES FOR SECTOR SIZE, * SECTORS PER TRACK, SECTOR INTERLEAVE ORDER, * AND SIDES PER DISK. ALSO CAN FORMAT AN IBM * 8 INCH OR RADIO SHACK MODEL I DISK. IF NO * PARAMETERS ARE GIVEN ON THE COMMAND LINE THE * PROGRAM WILL PROMPT FOR ALL DATA NEEDED. THE * PROMPTING CAN BE REDUCED TO THE DISK NAME AND * NUMBER IF THE DRIVE IS INCLUDED ON THE COMMAND * LINE. THE PROGRAM WILL DEFAULT THE OPTIONS BY * USING A DRIVE DEFAULT TABLE FOR EASE OF USE * WITH A MIXED DRIVE SYSTEM. YOU CAN OVERRIDE * THE DEFAULT BY ADDING AN OPTION ALONG WITH * THE DRIVE ON THE COMMAND LINE. THIS PROGRAM * CONFORMS TO SEVERAL FLEX SECTOR ORDERING * PATTERNS OR ANY USER CREATED SECTOR ORDER * AND INITIALIZES VERY QUICKLY. REPORTS SOFT * ERRORS WHICH MAY BE MORE FREQUENT THAN YOU * EXPECT. MULTIPLE RETRIES AFTER SOFT ERRORS. * REPORTS PROGRESS AFTER EACH PROGRAM MODULE. * NUMBERS ARE IN DECIMAL EXCEPT TRK/SEC. IF * THE USER DESIRES THERE ARE PROVISIONS FOR AN * EXTENDED LENGTH FLEX CATALOG USING TRACK ONE. * REQUIRES ABOUT 16K OF RAM STARTING AT $20 BUT * MAY BE ASSEMBLED ELSEWHERE. SELECTING A DISK * OPTION THAT DOESN'T MAKE SENSE (SUCH AS 8 INCH * FORMAT ON A 5 INCH DRIVE) IS ILL ADVISED. YOU * MUST SET UP THE HARDWARE ADDRESSES AND THE * OPTION TABLES (ELEVEN BYTES) TO MATCH YOUR * SYSTEM BEFORE ASSEMBLING. THE LOCATIONS TO BE * CHANGED ARE MARKED WITH <<. THE DEFAULT DRIVE * TABLE IS EIGHT BYTES LONG. THE TABLE CONTAINS * A TYPE LETTER FOR EACH DRIVE AND THE NUMBER OF * TRACKS PER SIDE. THE NEXT THREE BYTES AFTER * THE DRIVE DEFAULT TABLE ARE: * * DMAFLG SET FOR DMAF-1 CONTROLLER. * USEMFLG SET IF DRIVES 0 AND 1 ARE DMAF-1 AND * DRIVES 2 AND 3 ARE MF68 AND USEMF.CMD * HAS BEEN LOADED. * EXTFLG SET ONLY IF AN EXTENDED DIRECTORY IS * DESIRED MOST O F THE TIME. * PAG * A FEW EXAMPLES OF DEFAULT TABLE SETUP: * * FOR A FLEX-2 SYSTEM WITH MF68 * CONTROLLER AND 1 MHZ CLOCK USE: * * 'M,'M,'M,'M,35,35,35,35,$0,$0,$0. * * FOR A FLEX-9 SYSTEM WITH DOUBLE SIDED * DMAF-1 AND MF68 AND 1 MHZ USE: * * ' B,'B,'M,'M,77,77,35,35,$1,$1,$0. * * FOR A FLEX-2 SYSTEM WITH F&D 5 AND * 8 INCH AND 2 MHZ CLOCK USE: * * 'O,'P,'G,'G,35,40,77,77,$0,$0,$0. * * A BOOTSTRAP IS SELECTED FROM FOUR BOOTSTRAP * PROGRAMS FOR EITHER PROCESSOR AND CONTROLLER. * THE DEFAULT BOOT IS THE ONE FOR THE SYSTEM THE * DISK IS BEING INITIALIZED ON. THE BOOT WILL BE * STORED AT TRK 0 SEC 0 FOR FLEX-2/MF68, OTHER * SYSTEMS WILL HAVE THE BOOTSTRAP ON SEC 1. * PAG * * * COMMAND LINE FORMAT: * * [INIT] PROMPTS FOR DRIVE AND OPTIONS * [INIT 0] DRIVE 0 DEFAULT OPTION * [INIT 2 A] DRIVE 2 A=8 IN SSSD DMAF-1 * * * * * LEO'S UNIVERSAL DISK FORMATTER * * DRIVE NUMBER TO INITIALIZE (0-3): [1] * * 0=68 00 R=RADIO SHACK * 9=6809 S=STANDARD IBM * * DISK TO BE USED WITH (0,9,R,S): [9] * * 8 INCH 5 INCH * DMAF MF68 DMAF MF68 * SINGLE SIDED NORMAL A E I M * DOUBLE SIDED NORMAL B F J N * SINGLE SIDED FAST C G K O * DOUBLE SIDED FA ST D H L P * * ENTER DESIRED OPTION CHAR. (A-P): [M] * * TRACKS PER SIDE (RETURN=40):[35] * * NORMAL OR OVERSIZE CATALOG (N,O): [N] * * * * ORIGINAL NAME AND VOLUME: UTILITY 123 * NAME FOR DISK IN DRIVE 1 * OR PRE SS RETURN TO ABORT: [MAX8CHAR] * VOLUME NUMBER: [12345] * TRACK ZERO VERIFIED * ALL TRACKS WRITTEN * FORMAT FINISHED * AVAILABLE SECTORS: 340 * * * ERROR MESSAGES: * * DISK IS PROTECTED (INSERT UNPROTECTED DISK) * SOFT ERROR AT TT SS (RETRIES IF FLEX FORMAT) * HARD ERROR AT TT SS (FLEX SECTORS DELETED) * FORMAT ABORTED (FATAL ERROR OCCURED) *  NAM UNIVERSAL DISK FORMATTER OPT PAG PAG * UNIVERSAL DISK FORMATTER BY LEO TAYLOR * * LIB INIT.LIB OPTIONAL INSTRUCTIONS PAG * STANDARD FLEX ADDRESS ASSIGNMENTS * * ONLY THREE EQUATES NEED TO BE CHANGED FOR * 6809; THE START OF FLEX AND THE ADDRESSES * OF THE DISK CONTROLLERS. * FLEX EQU $A000 USE $C000 FOR 6809 << MF68 EQU $8018 USE $E018 FOR 6809 << DMAF EQU $9000 USE $F000 FOR 6809 << FCB EQU FLEX+$840 FLEX FILE CONTROL BLOCK PAUSE EQU FLEX+$C09 TTYSET PAUSE WASN EQU FLEX+$C0C WORK DRIVE ASSIGNED FLXDAT EQU FLEX+$C0E FLEX DATE REGISTERS LIPNTR EQU FLEX+$C14 LINE BUFFER POINTER WARMS EQU FLEX+$D03 GETCHR EQU FLEX+$D15 PUTCHR EQU FLEX+$D18 INBUFF EQU FLEX+$D1B PSTRNG EQU FLEX+$D1E NXTCH EQU FLEX+$D27 GETFIL EQU FLEX+$D2D ADDBX EQU FLEX+$D36 OUTDEC EQU FLEX+$D39 OUTHEX EQU FLEX+$D3C RPTERR EQU FLEX+$D3F GETHEX EQU FLEX+$D42 INDEC EQU FLEX+$D48 FMS EQU FLEX+$1406 OFSET EQU $C000-FLEX OFFSET EQU OFSET/64 FIX FLEX INCONSISTANCY READ EQU FLEX+$1E00+OFFSET $BE80 OR $DE00 RESTOR EQU READ+9 PAG * VARIABLES * ORG $20 BASE PAGE DRIVE RMB 1 DRIVE NUMBER VOLUME RMB 2 VOLUME NUMBER FATLFL RMB 1 MULTI-PURPOSE ERROR FLAG DELFLG RMB 1 SECTOR DELETED SIDNOW RMB 1 SIDE OF DISK LSTSEC RMB 1 LAST GOOD DISK SEC TYPNTR RMB 2 TYPE OF DISK POINTER TBLPNT RMB 2 FORMAT TABLE IN USE TOTALS RMB 2 MAXTRK * MAXSEC MAXTRK RMB 1 TRKS PER SIDE MAXSEC RMB 1 SECS PER TRK SPCFMT RMB 1 SPECIAL FORMAT BYTSEC RMB 1 BYTES PER SECTOR-1 GAPCHR RMB 1 GAP FILL CHAR GAPSIZ RMB 1 SIZE OF LARGER GAPS DBLFLG RMB 1 1 = DOUBLE SIDED TRKNOW RMB 1 CURRENT TRACK SECNOW RMB 1 CURRENT SECTOR WORKEN RMB 2 COMPUTED END OF WORKSPACE ENDMOV RMB 2 END OF BLOCK MOVE NAME RMB 8 VOLUME NAME TEMP RMB 2 GENERAL PURPOSE LETTER RMB 1 SAVE FORMAT LETTER PAUSTM RMB 1 SAVE FLEX PAUSE NXTLNK RMB 2 NEXT GOOD LINK SOURCE RMB 2 POINTER FOR BLOCK MOVE SECCNT RMB 1 SECTOR COUNTER DMADRV RMB 1 DMA DRIVE (1,2,4,8) BOOTNU RMB 1 BOOT NUMBER (0-3) FDSIDE RMB 1 F&D BOOT SIDE FLX2FL RMB 1 1 = FLEX-2 (6800) FLX9FL RMB 1 1 = FLEX-9 (6809) EXTEND RMB 1 1 = OVERSIZE FLEX CATALOG SYSFLG RMB 1 1 = DMA SYSTEM CONTROLLER PAG ORG $0100 START BRA INIT VN FCB 4 VERSION NUMBER BRA INIT ALLOW WARMSTART AT $103 SPC 3 * DEFAULT DRIVE FORMAT TABLE USES SAME * LETTER AS CALLING FORMAT. THE DEFAULT * TRACKS P ER SIDE IN DECIMAL. THE DMAFLG * MUST BE SET TO 1 FOR DMAF CONTROLLER. * IF THE USEMFLG IS ALSO SET THEN DMA * WILL BE USED FOR DRIVES 0 OR 1 AND * MF68 USED FOR DRIVES 2 OR 3. EXTFLG * WOULD ONLY BE SET IF YOU ALWAYS WANT * AN EXTENDED DIRECTORY. * DE FTBL FCB 'O 0 SINGLE SIDE 5 FAST FCB 'P 1 DOUBLE SIDE 5 FAST FCB 'G 2 SINGLE SIDE 8 FAST FCB 'G 3 SINGLE SIDE 8 FAST FCB 35 0 TRACKS FCB 40 1 TRACKS FCB 77 2 TRACKS FCB 77 3 TRACKS DMAFLG FCB 0 0=USE MF68 1=USE DMAF USEMFLG FCB 0 0=ALL DMAF1  1=USEMF 2/3 EXTFLG FCB 0 0=NORMAL 1=EXTEND DIR SPC 3 * MAIN PROGRAM CALLS ALL SUBPROGRAMS * INIT LDAA EXTFLG GET DEFAULT STAA EXTEND LDAA PAUSE STAA PAUSTMP CLR PAUSE NO PAUSE DURING PROMPTS BSR PARSE PARSE PARAMETER LIST JSR PROMPT GET DISK N AME AND NUMBER TST SPCFMT RADIO SHACK OR IBM BNE ALLSAME NO SPECIAL TRACK TRYAGA JSR WRITE0 WRITE TRK 0 JSR VERIF0 TEST TRACK ZERO BEQ NOFATAL CLR TRKNOW STAB SECNOW JSR RPTSEC DISPLAY BAD SECTOR DEC FATLFLG COUNT RETRIES BNE TRYAGAIN FATAL LDX #FATALMSG JSR PSTRNG BRA EXIT2 FIVE FATAL ERRORS NOFATAL LDX #VER0MSG JSR PSTRNG ALLSAM JSR WRTALL WRITE REMAINING TRACKS LDX #ALWRTMSG JSR PSTRNG JSR VERIFALL TST SPCFMT BNE NOUPDATE JSR UPDATE FILL IN TRK 0 SEC 3 BNE FATAL NOUPDA JSR REPORT DISPLAY RESULTS EXIT2 JMP EXIT SPC 3 * PARSE INPUT LINE FOR DRIVE AND FORMAT * IF NONE REQUEST PARAMETERS FROM USER * PARSE JSR GETHEX GET DRIVE NUMBER BCS BADRIVE TSTB BEQ NDRIVE JMP DRIVEFOUND BADRIV LDAA #15 ILLEGAL DRIVE NUMBER JMP ERROR2 NDRIVE LDX #DRIVMSG TITLE AND PROMPT LDAA #'0 MIN LDAB #'3 MAX JSR REPLY SUBA #'0 REDUCE '0 TO $0 STAA DRIVE JSR SETUP CONFIGURE HARDWARE MENU LDX #SYSTMSG 0,9,R,S LDAA #'0 MIN LDAB #'S MAX JSR REPLY LDAB #1 CMPA #'0 6800 BNE NOT0 STAB FLX2FLG SET 6800 CLR FLX9FLG CLR 6809 BRA GETLETR NOT0 CMPA #'9 6809 BNE NOT9 CLR FLX2FLG CLR 6800 STAB FLX9FLG SET 6809 BRA GETLETR NOT9 LDAB #35 TRKS FOR RS STAB MAXTRK CMPA #'R RADIO SHACK BEQ GOTCH2 LDAB #77 TRKS FOR IBM STAB MAXTRK C MPA #'S STANDARD IBM BNE MENU GOTCH2 JMP GOTCHR SKIP REMAINING QUESTIONS GETLETR LDX #LETRMSG LDAA #'A MAX LDAB #'P MIN BSR REPLY TAB STAA LETTER SAVE FOR TABLE SUBB #'A REDUCE A TO $0 BITB #4 DMAF OR MF68? BEQ SETDMA LDAB FLX9FLG 0 OR 1 AS!LB STAB BOOTNUM 0 OR 2 BRA GETTRK SETDMA LDAB FLX9FLG 0 OR 1 ASLB ORAB #1 STAB BOOTNUM 1 OR 3 CLR FLX2FLG GETTRK BSR TRKSID LOOKUP TRACKS LDX #TRKMSG JSR PSTRNG LDX #MAXTRK-1 CLR 0,X CLRB JSR OUTDEC PRINT DEFAULT TRACKS LDAA #') JSR PUTC"HR LDAA #': JSR PUTCHR JSR INBUFF GET RESPONSE JSR INDEC BCS GETTRK RECYCLE TSTB BEQ DEFTRK GOT CAR RTN STX TEMP LDAB TEMP+1 CMPB #3 MINIMUM TRACKS BLO GETTRK RECYCLE STAB MAXTRK DEFTRK CLR EXTEND LDX #CATMSG LDAA #'N NORMAL CATALOG LDAB# #'O OVERSIZE BSR REPLY CMPA #'N BEQ NOEXT INC EXTEND DO EXTENDED CATALOG NOEXT LDAA LETTER BRA GOTCHR SPC 3 * COMPUTE DEFAULT TRKS/SIDE * TRKSID LDX #DEFTBL DEFAULT LETTER/TRKS LDAB DRIVE JSR ADDBX LDAB 4,X GET DEFAULT TRACKS STAB MAXTRK RT$S SPC 3 * PRINT MESSAGE AND WAIT FOR USER REPLY. * CHECKS RANGE OF REPLY AND RECYCLES IF NEEDED. * ENTER WITH X=MESSAGE, A=MINIMUM, B=MAXIMUM * RNGERR LDX #OUTMSG OUT OF RANGE JSR PSTRNG LDX TEMP ORIGINAL MESSAGE BRA REPLY2 REPLY STX TEMP STAA SOURCE STAB SOURCE+1 REPLY2 JSR PSTRNG JSR GETCHR CMPA #$40 LETTER? BLO NOTLTR ANDA #$5F UPPER CASE NO PARITY NOTLTR CMPA #$D RETURN=ABORT BNE NABORT JMP FATAL NABORT CMPA SOURCE MIN BLO RNGERR CMPA SOURCE+1 MAX BHI RNGERR RTS SPC 3 * SAVE DRIVE AND FIND FORMAT TABLE * DRIVEF STX TEMP LDAA TEMP+1 GET DRIVE BYTE CMPA #3 MAX DRIVE BLS NOTBAD JMP BADRIVE NOTBAD STAA DRIVE SAVE FOR LATER JSR SETUP CONFIGURE HARDWARE BSR TRKSID DEFAULT TRACKS JSR NXTCH GET DISK TYPE BCC GOTCHR LDAA 0,X GET DEFAULT LETTER GOTCHR ANDA #$5F UPPER CASE NO PARITY CMPA #'A MINIMUM LETTER BLT SYNTAX CMPA #'S MAXIMUM LETTER BHI SYNTAX LDX #FTABLE TABLE OF FORMATS SUBA #'A REDUCE LETTER A TO ZERO STAA LETTER SAVE FOR FAST FLAG TAB ASLB FORMAT LETTER*2 JSR ADDBX INDEX INTO TABLE LDX 0,X GET TABLE ADDRESS STX TYPNTR START OF TABLE LDAB #6 SIZE OF PARAMETER TABLE JSR ADDBX STX TBLPNTR SECTOR TABLE POINTER STX ENDMOVE SETUP BLOCK MOVE LDX #MAXSEC FIRST PARAMETER STX TEMP LDX TYPNTR TABLE START JSR MOVE TABLE TO TEMP AREA SPC 3 * COMPUTE TOTAL SECTORS AND F&D DOUBLE SIDE * LDAA MAXTRK 35,40,77 ETC DECA STAA MAXTRK USER TRACKS LDX #0 ADDTRK LDAB MAXSEC JSR ADDBX MAXTRK*MAXSEC DECA BNE ADDTRK STX TOTALSEC TST DBLFLG F&D DOUBLE SIDED? BEQ BOOTOK TST DMAFLG BNE BOOTOK LDAA #$B0 8 INCH SECOND SIDE LDAB MAXSEC LSRB CMPB #10 CHECK SIZE BHI EIGHT LDAA #$20 5 INCH SECOND SIDE EIGHT STAA B0TYPE+1 FIX BOOT TYPE STAA B2TYPE+1 STAB B0FLIP+1 FIX BOOT FLIP SIDE STAB B2FLIP+1 BOOTOK LDAA #5 STAA FATLFLG MAXIMUM FATAL ERRORS LDAA MAXSEC STAA LSTSEC LAST GOOD SEC RTS SYNTAX LDAA #26 ERROR2 LDX #FCB STAA 1,X ERROR JSR RPTERR EXIT NOP CLI ALLOW SPOOLER LDAA PAUSTMP STAA PAUSE RESTORE ORIG PAUSE JMP WARMS NODRIV LDAA #16 DRIVE NOT READY BRA ERROR2 SPC 3 * PROMPT FOR NAME OF DISK * PROMPT JSR CLRFCB PUT DRIVE IN FCB JSR RESTORE SEEK TRACK ZERO BCS NODRIVE NO SUCH DRIVE BEQ PROMP2 PROTECTED? LDX #PROTMSG JSR PSTRNG CONTINUE ON ANYWAY PROMP2 LDX #SPCMSG TST SP CFMT NO VOLUME? BNE ASKNAME JSR CLRFCB LDAA #3 STAA $1F,X LDAA #9 READ SECTOR JSR READSE BNE NOSIR FOUND SIR? LDX #ORGNAM JSR PSTRNG LDX #FCB+$50 START OF NAME LDAB #8 NAMPNT LDAA 0,X BMI NOSIR CMPA #$21 BLO NAMDON JSR PUTCHR PRINT OLD V OLUME INX DECB BNE NAMPNT NAMDON LDAA #$20 JSR PUTCHR LDX #FCB+$5B START OF NUMBER CLRB JSR OUTDEC NOSIR LDX #NAMEMSG ASKNAM JSR PSTRNG LDAA DRIVE ORAA #'0 DRIVE IN ASCII JSR PUTCHR LDX #NAM2MSG JSR PSTRNG TST SPCFMT BEQ GETNAME JSR GETC !HR CMPA #'Y YES OK? BEQ JOG FATAL2 JMP FATAL SPC 2 GETNAM JSR INBUFF GET DISK NAME LDX LIPNTR POINT AT FLEX BUFFER LDAA 0,X GET FIRST CHAR CMPA #$D RETURN? BEQ FATAL2 LDX #FCB JSR GETFILE FLEX PARSES NAME BCC NAMEOK JMP ERROR NAMEOK LDX #NA "ME SET UP MOVE STX TEMP LDX #FCB+12 STX ENDMOVE LDX #FCB+4 JSR MOVE FROM FCB TO NAME GETVOL LDX #VOLMSG JSR PSTRNG JSR INBUFF GET VOLUME NUMBER JSR INDEC BCS GETVOLUME TSTB NUMBER FOUND? BEQ FATAL2 STX VOLUME JOG JSR CLRFCB JSR RESTORE SEL #ECT LDAA #2 TRK 2 JSR SEEK HEAD IN JSR RESTORE HEAD BACK BNE FATAL2 STILL PROTECTED? SPC 3 * WRITE TRACK ZERO * WRITE0 CLR SIDNOW CLR TRKNOW TRK ZERO FIRST SIDE JSR SETRAM CLRA JSR WRITRK WRITE EMPTY TRACK ZERO TST DBLFLG BEQ NOTDB1 INC SID$NOW CLR TRKNOW TRK ZERO SECOND SIDE JSR SETRAM CLRA JSR WRITRK NOTDB1 JSR CLRFCB LDAA #3 TRK 0 SEC 3 STAA $1F,X LDAA #1 PREPARE SYS INFO RECORD STAA $5D,X FIRST TRK STAA $5E,X FIRST SEC LDAA MAXTRK STAA $5F,X LAST TRK STAA $66,X MAX TRK LD%AA MAXSEC STAA $60,X LAST SEC STAA $67,X MAX SEC CLR $61,X SET TOTAL SECTORS TO CLR $62,X ZERO FOR NOW LDAA FLXDATE MONTH DAY YEAR STAA $63,X LDAA FLXDATE+1 STAA $64,X LDAA FLXDATE+2 STAA $65,X LDAA VOLUME NUMBER STAA $5B,X LDAA VOLUME+1 &STAA $5C,X LDAA LETTER LDAB #$FF FAST FORMAT FLAG BITA #2 FAST FORMAT? BNE ISFAST CMPA #'Q-'A QUICK FORMAT? BNE NOTQUI LDAB #1 QUICK FORMAT FLAG ISFAST STAB FCB+319 FAST FORMAT FLAG NOTQUI TST EXTEND EXTENDED DIR? BEQ NOTEXT LDAA #$FF STAA FC'B+318 EXTENDED DIR FLAG NOTEXT LDX #FCB+$50 SET UP MOVE STX TEMP LDX #NAME+8 STX ENDMOVE LDX #NAME BSR MOVE FROM NAME TO FCB BSR WRITSECT WRITE SIR BSR CLRFCB TRK 0 SEC 0 TST DMAFLG BNE ISDMA TST FLX2FLG BNE ISFLX2 ISDMA INC $1F,X TRK 0 SEC (1 ISFLX2 LDX #FCB+$40 STX TEMP FCB DATA POINTER LDAA BOOTNUM SELECT BOOTSTRAP BEQ USEB0 CMPA #2 BLO USEB1 BEQ USEB2 BHI USEB3 USEB0 LDX #B0END STX ENDMOVE LDX #BOOT0 BRA MOVEBT USEB1 LDX #B1END STX ENDMOVE LDX #BOOT1 BRA MOVEBT USEB2 LD)X #B2END STX ENDMOVE LDX #BOOT2 BRA MOVEBT USEB3 LDX #B3END STX ENDMOVE LDX #BOOT3 MOVEBT BSR MOVE FROM BOOT TO FCB BRA WRITSECTOR SPC 3 * BLOCK MOVE SUBROUTINE * MOVE STX SOURCE SOURCE POINTER LDAA 0,X LDX TEMP DESTINATION POINTER STAA 0,X * INX STX TEMP LDX SOURCE GET SOURCE INX CPX ENDMOVE END OF SOURCE+1 BNE MOVE RTS SPC 3 * CLEAR FILE CONTROL BLOCK * CLRFCB LDX #FCB CLRFC2 CLR 0,X INX CPX #FCB+$40+256 BNE CLRFC2 LDX #FCB POINT X AT START LDAA DRIVE STAA 3,X RESTORE DRIVE + RTS SPC 3 * READ OR WRITE SECTOR USING FMS * FLEX MAKES SEVERAL RETRIES * WRITSE LDAA #$A WRITE MODE READSE LDX #FCB STAA 0,X JMP FMS WRITE SEC SPC 3 * SETUP TRACK IN RAM * SETRAM CLR SECNOW CLR SECCNT TST DBLFLG BEQ SETRA2 TST SIDNOW SECOND S,IDE? BEQ SETRA2 LDAA MAXSEC LSRA 1/2 MAXSEC STAA SECCNT LDX TBLPNTR LOOKU2 INX DECA BNE LOOKU2 LDAA 0,X FIRST SEC SECOND SIDE STAA SECNOW LDX #WORKSPACE BRA SECZER DON'T BUMP SECNOW SETRA2 LDX #WORKSPACE TST SPCFMT NO SEC 0 FOR IBM BMI SE-CZERO ALWAYS SEC 0 FOR RS BNE BUMPSEC TST FLX2FLG BEQ BUMPSEC TST TRKNOW FLEX-2 HAS TRK 0 SEC 0 BEQ SECZERO BUMPSE INC SECNOW FIRST SEC NORMALLY ONE SECZER LDAA GAPCHR LDAB #40 LEADER SIZE GAP1 STAA 0,X 40 GAPCHR BYTES INX DECB BNE GAP1 LDAB .#6 GAP2 CLR 0,X 6 ZERO BYTES INX DECB BNE GAP2 LDAB #$FC STAB 0,X INDEX MARK INX LDAB GAPSIZE GAP3 STAA 0,X GAPSIZE GAPCHR BYTES INX DECB BNE GAP3 SPC 3 * SETUP SECTORS * SECLOOP LDAB #6 GAP4 CLR 0,X 6 ZERO BYTES INX DECB BNE GAP4 LDAB #/$FE STAB 0,X ID ADDRESS MARK INX LDAB TRKNOW STAB 0,X TRACK INX CLR 0,X SEPARATOR TST SIDNOW BEQ SEPOK INC 0,X SEPOK INX LDAB SECNOW NOP SPACE FOR TEST TRAP NOP NOP STAB 0,X SECTOR INX CLRB CODE 00 FOR 128 BYTES TST BYTSEC BPL SEC128 0 INCB CODE 01 FOR 256 BYTES SEC128 STAB 0,X SECTOR SIZE CODE INX LDAB #$F7 STAB 0,X CRC FOR ADDRESS MARK INX LDAB #11 GAP5 STAA 0,X 11 GAPCHR BYTES INX DECB BNE GAP5 LDAB #6 GAP6 CLR 0,X 6 ZERO BYTES INX DECB BNE GAP6 LDAB #$FB STAB 0,X D1ATA ADDRESS MARK INX CLRA RS FILL CHAR TST SPCFMT BEQ FLXFMT BMI RADSHK LDAA #$E5 IBM FILL CHAR RADSHK LDAB BYTSEC SECTOR SIZE SPCFIL STAA 0,X SECTOR FILLED WITH $E5 INX DECB BNE SPCFILL STAA 0,X ONE MORE INX BRA SECFULL SPC 2 FLXFMT LDAA 2SECNOW LDAB TRKNOW CMPA MAXSEC BLT SECOK NOT LAST SEC CLRA TSTB BEQ DIRECTORY INCB SECOK INCA LINK NEXT SECTOR DIRECT STAB 0,X LINK TRK INX STAA 0,X LINK SECTOR INX LDAB BYTSEC SIZE OF SECTOR DECB ADJUST FOR LINK FLXFIL CLR 0,X FILL WITH ZE3ROS INX DECB BNE FLXFILL SECFUL LDAB #$F7 STAB 0,X CRC INX LDAB GAPSIZE LDAA GAPCHR GAP7 STAA 0,X GAPSIZE GAPCHR BYTES INX DECB BNE GAP7 SPC 3 * SECTOR COMPLETE. COMPUTE NEXT SECTOR * TST SPCFMT BEQ FLEXFMT INC SECNOW NUMERICAL ORDER LD4AB SECNOW CMPB MAXSEC DONE? BLE SECLO2 LOOP FOR ANOTHER SEC BRA TRKDONE FLEXFM INC SECCNT BUMP COUNTER LDAB MAXSEC TST DBLFLG BEQ NOTDB3 TST SIDNOW SECOND SIDE? BNE NOTDB3 LSRB 1/2 MAXSEC NOTDB3 CMPB SECCNT DONE? BLE TRKDONE STX TEMP SAVE W5ORKSPACE POSITION LDX TBLPNTR LDAB SECCNT LOOKUP INX NEXT SEC FROM TABLE DECB BNE LOOKUP LDAB 0,X STAB SECNOW NEXT PHYSICAL SECTOR LDX TEMP SECLO2 JMP SECLOOP SPC 2 TRKDONE STX WORKEND SAVE END OF WORKSPACE RTS SPC 3 * VERIFY TRACK ZERO USING 6 FLEX READ * VERIF0 CLRB TST FLX2FLG FLEX-2 HAS SEC 0 BNE V0LOOP INCB V0LOOP LDX #FCB+$40 CLRA TRACK PSHB SAVE SECTOR JSR READ PULB BNE BADTR0 TSTB BNE INCSEC INCB FLEX-2 SKIP SEC 1 INCSEC INCB CMPB MAXSEC BLE V0LOOP CLRB FLAG TRK 0 OK BA!7DTR0 RTS SPC 3 * WRITE ALL REMAINING TRACKS * WRTALL CLRA TST SPCFMT BNE WRLOOP IBM STARTS WITH TRK 0 INCA FLX STARTS WITH TRK 1 WRLOOP STAA TRKNOW CLR SIDNOW JSR SETRAM LDAA TRKNOW JSR WRITRK FIRST SIDE TST DBLFLG BEQ NOTDB4 INC SIDNOW SECO"8ND SIDE JSR SETRAM SETUP TRACK LDAA TRKNOW JSR WRITRK NOTDB4 LDAA TRKNOW INCA CMPA MAXTRK DONE? BLE WRLOOP JSR CLRFCB LDX MAXTRK REWRITE LAST SECTOR STX FCB+$1E JMP WRITSECTOR SPC 3 * VERIFY ALL TRACKS QUICKLY BY USING * FAST READ AND TRACK #9SKEWING * VERIFA LDAA MAXTRK STAA TRKNOW LDAB #2 DUMMY SEC LDX #FCB+$40 JSR READ DROP HEAD ON INSIDE TRK LDAA MAXSEC STAA SECCNT LDX TBLPNT STX TEMP CLR FATLFLG CLR DELFLG VESEEK LDAA TRKNOW JSR SEEK VELOOP LDX TEMP POINTS TO TABLE LDAB 0,X$: SECTOR BNE NOTEND LDX TBLPNT RESET POINTER LDAB 0,X NOTEND INX STX TEMP STAB SECNOW SAVE FOR ERROR JSR FSTRED HIGH SPEED READ BEQ GOODS2 JSR RPTSECT 'SOFT' ERROR TST SPCFMT BEQ VESLOW LDAB #2 DUMMY SEC LDX #FCB+40 JSR READ INSURE HEAD STI;LL DOWN GOODS2 JMP GOODSEC ONLY FLEX CAN DELETE SPC 3 * IF SOFT ERROR IS FOUND ENTIRE TRACK MUST BE * VERIFIED WITH FLEX AND BAD SECTORS DELETED. * VESLOW JSR CLRFCB LDAA TRKNOW STAA $1E,X LDAA MAXSEC LOGICAL END OF TRK STAA SECNOW VLOOP2 STAA $1F<,X LDAA #9 JSR READSEC BEQ VEROK THIS SECTOR OK? LDX #HARDMSG JSR RPTSECT+3 TST DELFLG FIRST CONSECUTIVE DELETE BNE NOTLAST INC DELFLG LDAA TRKNOW SAME TRACK STAA NXTLNK LDAA SECNOW INCA NEXT HIGHER SECTOR STAA NXTLNK+1 CMPA MAXSEC LAST I=N TRACK? BLE NOTLAST LDAA #1 FIRST SEC NEXT TRK STAA NXTLNK+1 LDAA TRKNOW INCA NEXT TRK STAA NXTLNK CMPA MAXTRK LAST SEC ON DISK? BLT NOTLAST COM DELFLG FLAG LAST SECTOR CLR NXTLNK END DISK LINKS ZERO CLR NXTLNK+1 NOTLAST LDAB #1 STAB FATLF>LG LDX TOTALSECTORS DEX STX TOTALSECTORS LDX #FCB BRA MOVEON VEROK TST DELFLG ANY DELETIONS PENDING? BEQ MOVEON BPL FLGNORMAL LDAA SECNOW LAST GOOD SEC STAA LSTSEC FLGNORM LDAA NXTLNK NEXT GOOD LINK STAA $40,X LINK IN SECTOR LDAA NXTLNK+1 ?STAA $41,X JSR WRITSEC CLR DELFLG NO DELETIONS PENDING MOVEON LDAA SECNOW DECA STAA SECNOW BACK UP ONE BNE VLOOP2 TST DELFLG BEQ NXTTRK HIGH SPEED NEXT TRACK DEC TRKNOW BNE VESLOW CONTINUE SLOW VERIFY JMP FATAL RAN INTO TRK 0 SPC 3 * SKEW OU@T SIX SECTORS PER TRACK * GOODSE DEC SECCNT BEQ NXTTRK JMP VELOOP NXTTRK LDAB MAXSEC RESET COUNTER STAB SECCNT LDAB #6 TRK TO TRK SKEW LDX TEMP SKEWLO TST 0,X BNE NOTEN2 LDX TBLPNT RESET POINTER DEX NOTEN2 INX ADD SKEW TO TEMP DECB BNE SKEWLAOOP STX TEMP DEC TRKNOW BEQ ENDVERIFY BLT RETRN3 ONEMOR JMP VESEEK STEP OUT TOWARD ZERO ENDVER TST SPCFMT IF SPECIAL THEN BNE ONEMORE VERIFY TRK 0 RETRN3 RTS SPC 3 * UPDATE SIR FOR TOTAL SECTORS * UPDATE JSR CLRFCB LDAA #3 SIR STAA $1F,X LDAAB #9 READ MODE JSR READSEC BNE RETRN3 TST EXTEND BEQ DIROK NORMAL DIRECTORY LDAA MAXSEC LDX TOTALSECTORS DOEXTE DEX REDUCE BY ONE TRACK DECA BNE DOEXTEND STX TOTALSECTORS INC FCB+$5D FIRST USER TRACK BSR DIROK UPDATE SIR BNE RETRN3 JSR CLRF CCB LDAA #1 STAA $1E,X TRK 1 SEC MAX LDAA MAXSEC STAA $1F,X SEC BSR WRITS2 END OF DIRECTORY BNE RETRN3 CLR $1E,X TRK 0 SEC MAX LDAA #1 STAA $40,X LINK EXTENDED DIRECTORY STAA $41,X BRA WRITS2 SPC 2 DIROK LDX TOTALSECTORS STX FCB+$61 LDAA L DSTSEC NORMALLY=MAXSEC STAA FCB+$60 NEW LAST SECTOR WRITS2 JMP WRITSECTOR SPC 3 * REPORT PROGRAM FINISHED * REPORT LDX #FINIMSG JSR PSTRNG LDX #TOTALSECTORS CLRB JMP OUTDEC SPC 3 * REPORT BAD SECTOR * RPTSEC LDX #SOFTMSG LDAB TRKNOW BSR PNTNUM  EBAD TRK LDAA #$20 SPACE JSR PUTCHR LDAB SECNOW BRA PNTNU2 BAD SEC PNTNUM JSR PSTRNG PRINT MESSAGE PNTNU2 STAB ENDMOVE USE AS TEMP LDX #ENDMOVE JMP OUTHEX SPC 3 * INDEX TABLE FOR FORMAT TABLES * FTABLE FDB TABLEA FDB TABLEB FDB TABLEC FDB TAB FLED FDB TABLEA FDB TABLEB FDB TABLEC FDB TABLED FDB TABLEI FDB TABLEJ FDB TABLEK FDB TABLEL FDB TABLEI FDB TABLEJ FDB TABLEK FDB TABLEL FDB TABLEQ FDB TABLER FDB TABLES SPC 3 * FORMAT TABLES FOR SEVERAL DISKS * * BYTES 1 MAXIMUM SECTOR GS PER TRACK * BYTE 2 SPECIAL FORMAT FLAG (1=IBM $FF=RS) * BYTE 3 BYTES PER SECTOR-1 * BYTES 4-5 GAP CHARACTER AND SIZE * BYTE 6 DOUBLE SIDED=1 * BYTES A-N PHYSICAL ORDER OF SECTORS * BYTE N+1 NULL MARKS END OF TABLE * TABLEA FCB 15 NORMAL 8 HINCH SINGLE FCB 0 NOT SPECIAL FCB 255 SEC SIZE-1 FCB $FF,27 GAP CHARACTER AND LENGTH FCB 0 SINGLE SIDED FCB 1,6,$B,3,8,$D,5,$A,$F,2 FCB 7,$C,4,9,$E,0 SPC 2 TABLEB FCB 30 NORMAL 8 INCH DOUBLE FCB 0 FCB 255 FCB $FF,27 FCB 1 FCB 1,6,$B,3,8,$D,I5,$A,$F,2 FCB 7,$C,4,9,$E FCB $10,$15,$1A,$12,$17,$1C FCB $14,$19,$1E,$11,$16,$1B FCB $13,$18,$1D,0 SPC 3 TABLEC FCB 15 FAST 8 INCH SINGLE FCB 0 FCB 255 FCB $FF,27 FCB 0 FCB 1,6,$B,4,9,$E,2,7,$C FCB 5,$A,$F,3,8,$D,0 SPC 2 TABLED FCB 30 FASJT 8 INCH DOUBLE FCB 0 FCB 255 FCB $FF,27 FCB 1 FCB 1,6,$B,4,9,$E,2,7,$C FCB 5,$A,$F,3,8,$D FCB $17,$1C,$10,$15,$1A,$13 FCB $18,$1D,$11,$16,$1B,$14 FCB $19,$1E,$12,0 SPC 3 TABLEI FCB 10 NORMAL 5 INCH SINGLE FCB 0 FCB 255 FCB $FF,13 FCB 0K FCB 1,3,5,7,9,2,4,6,8,$A,0 SPC 2 TABLEJ FCB 20 NORMAL 5 INCH DOUBLE FCB 0 FCB 255 FCB $FF,13 FCB 1 FCB 1,3,5,7,9,2,4,6,8,$A FCB $B,$D,$F,$11,$13,$C FCB $E,$10,$12,$14,0 SPC 2 TABLEK FCB 10 FAST 5 INCH SINGLE FCB 0 FCB 255 FCB $FF,13 FCLB 0 FCB 1,6,4,9,2,7,5,$A,3,8,0 SPC 2 TABLEL FCB 20 FAST 5 INCH DOUBLE FCB 0 FCB 255 FCB $FF,13 FCB 1 FCB 1,6,4,9,2,7,5,$A,3,8 FCB $B,$10,$E,$13,$C,$11 FCB $F,$14,$D,$12,0 SPC 2 TABLEQ FCB 15 QUICK 8 INCH SINGLE FCB 0 FCB 255 FCB $FF,27 MFCB 0 FCB 1,4,7,$A,$D,$F,2,5,8,$B FCB $E,3,6,9,$C,0 SPC 2 TABLER FCB 10 RADIO SHACK FCB $FF FCB 255 FCB 0,13 FCB 0 FCB 0,5,1,6,2,7,3,8,4,9,0 SPC 2 TABLES FCB 26 STANDARD IBM FCB 1 FCB 127 FCB $FF,27 FCB 0 FCB 1,2,3,4,5,6,7,8,9,10 FCB 11,N12,13,14,15,16,17,18,19,20 FCB 21,22,23,24,25,26,0 SPC 2 * MESSAGES * FATALM FCC /FORMAT ABORTED!!/ FCB 7,4 ORGNAM FCB $D,$A FCC /ORIGINAL NAME AND NUMBER: / FCB 4 VER0MS FCC /TRACK ZERO VERIFIED/ FCB 4 ALWRTM FCC /ALL TRACKS WRITTEN/ FCB 4 PROTOMS FCC 'DISK IS PROTECTED!' FCB 7,4 SPCMSG FCC /ENTER Y FOR SPECIAL FORMAT / FCC /ON DRIVE / FCB 4 NAMEMS FCC /NAME FOR DISK IN DRIVE / FCB 4 NAM2MS FCC /OR PRESS RETURN TO ABORT: / FCB 4 VOLMSG FCC /VOLUME NUMBER: / FCB 4 FINIMS FCC /FORMAT FINIPSHED/ FCB $D,$A,0 FCC /AVAILABLE SECTORS: / FCB 7,4 SOFTMS FCC /SOFT ERROR AT / FCB 4 HARDMS FCC /HARD ERROR AT / FCB 4 DRIVMS FCB $A,$A FCC /LEO'S UNIVERSAL DISK FORMATTER/ FCB $D,$A,$A FCC /DRIVE NUMBER TO INITIALIZE (0-3):/ FCB 4 SYSTMS FCBQ $D,$A FCC /0=6800 R=RADIO SHACK/ FCB $D,$A FCC /9=6809 S=STANDARD IBM/ FCB $D,$A,$A FCC /DISK TO BE USED WITH (0,9,R,S):/ FCB 4 LETRMS FCB $D,$A FCC / / FCC / 8 INCH 5 INCH/ FCB $D,$A FCC / / FCC / DMAF MF68 DMAF MF68/ FCB $D,$AR FCC /SINGLE SIDED NORMAL / FCC / A E I M/ FCB $D,$A FCC /DOUBLE SIDED NORMAL / FCC / B F J N/ FCB $D,$A FCC /SINGLE SIDED FAST / FCC / C G K O/ FCB $D,$A FCC /DOUBLE SIDED FAST / FCC / D H L P/ FCB $D,$A,$A FCC /ENTER DSESIRED OPTION CHAR. (A-P):/ FCB 4 TRKMSG FCB $D,$A FCC /TRACKS PER SIDE (RETURN=/ FCB 4 CATMSG FCB $D,$A FCC /NORMAL OR OVERSIZE CATALOG (N,O):/ FCB 4 OUTMSG FCB $D,$A FCC /OUT OF RANGE/ FCB $D,$A,7,4 PAG * DISK DRIVERS FOR BOTH MF68 AND DMATF * DRIVER IS SELECTED BY VALUE OF SYSFLG * SETUP TST DMAFLG WHICH SYSTEM? BEQ MSETUP JMP DSETUP WRITRK TST SYSFLG DMA OR MF68? BEQ MWRTRK JMP DWRTRK SEEK TST SYSFLG DMA OR MF68? BEQ MSEEK JMP DSEEK FSTRED TST SYSFLG DMA OR MF68? BEQ MFSTRD UJMP DFSTRD SPC 3 * DRIVER FOR SWTP MF-68 OR F&D MDI-1 * * LOCAL ADDRESS EQUATES * MCOMRG EQU MF68 1771 COMMAND REGISTER MTRKRG EQU MCOMRG+1 TRACK MSECRG EQU MCOMRG+2 SECTOR MDATRG EQU MCOMRG+3 DATA SPC 3 * SET CONTROLLER TYPE * MSETUP LDAB #2 BOOT 68V09 MF68 CLR FLX2FLG LDAA TESTBYT CMPA #$CE 6800 IN USE? BNE IS6809 CLRB INC FLX2FLG IS6809 STAB BOOTNUM 0 OR 2 CLR SYSFLG NO DMA RTS SPC 3 * WRITE TRACK FROM RAM TO DISK * MWRTRK BSR MSETSID BSR MSEEK FIND TRACK TESTBY LDX #WORKSPACE NOP SEWI STOP SPOOLER LDAB #$F4 WRITE TRACK COMMAND STAB MCOMRG BSR DELAY LDAB #2 DATA REQUEST BIT WRITR1 LDAA 0,X GET BYTE IN ADVANCE WRITR2 BITB MCOMRG BEQ WRITR2 STAA MDATRG WRITE BYTE INX CPX WORKEND OUT OF DATA? BNE WRITR1 DECB BUSY BIT LDAA GXAPCHR TRAILER BYTE TRAIL CMPB MCOMRG BGT RETRN2 END OF TRACK BEQ TRAIL NO DATA REQUEST STAA MDATRG TRAILER OF GAPCHR BRA TRAIL MSEEK CMPA MTRKRG ALREADY THERE? BEQ RETRN2 SEEK2 STAA MDATRG BSR DELAY LDAA #$1B SEEK STAA MCOMRG BSR DELAY MREADYY LDAA MCOMRG BITA #1 BUSY BIT BNE MREADY RETRN2 RTS MSETSI TST DBLFLG NEEDED? BEQ NOTDB6 LDAB LETTER TYPE CMPB #8 5/8? BLO M8IN CLRB F&D 5 INCH BRA M5IN M8IN LDAB #$90 F&D 8 INCH M5IN TST SIDNOW BEQ MSIDE0 ORAB #$20 SIDE SELECT BIT MSIDE0  ZSTAB MF68-3 F&D TYPE REGISTER NOTDB6 RTS MFSTRD STAB MSECRG CLR SIDNOW ASSUME FIRST SIDE TST DBLFLG BEQ NOTDB7 LDAB MAXSEC LSRB MAXSEC/2 CMPB SECNOW BGE NOTDB7 INC SIDNOW SECOND SIDE NOTDB7 BSR MSETSID NOP SEI STOP SPOOLER LDAA #$88 READ WI![THOUT DELAY STAA MCOMRG NODATA LDAB MCOMRG CMPB #1 BNE NODATA BSR MREADY BITA #$18 ERROR MASK RTS DELAY BSR *+2 WASTE TIME BSR *+2 BSR *+2 BSR *+2 RTS SPC 3 * DRIVER FOR DMAF1 * * LOCAL ADDRESS EQUATES * ADDREG EQU DMAF+$00 FIRST ADDRESS FO"\R DMA CNTREG EQU DMAF+$02 BYTES TO BE TRANSFERED CCREG EQU DMAF+$10 PRIREG EQU DMAF+$14 DCOMRG EQU DMAF+$20 1771 COMMAND AND STATUS DTRKRG EQU DMAF+$21 1771 TRACK DSECRG EQU DMAF+$22 1771 SECTOR DDATRG EQU DMAF+$23 1771 DATA DRVREG EQU DMAF+$24 SPC 3 #]* SET CONTOLLER TYPE AND DRIVE * DSETUP LDAB #1 BOOT 6800 DMA STAB SYSFLG ASSUME DMA CLR FLX2FLG LDAA TSTBYT CMPA #$CE 6800 IN USE? BEQ IS6800 LDAB #3 BOOT 6809 DMA IS6800 STAB BOOTNUM 1 OR 3 LDAA DRIVE 0-3 TST USEMFLG USEMF.CMD IN USE? BEQ KE$^EPDMA CMPA #2 BLO KEEPDMA CLR SYSFLG USE MF68 ANDB #2 STRIP DMA BIT STAB BOOTNUM 0 OR 2 BNE KEEPDM INC FLX2FLG 6800 MF68=FLEX-2 KEEPDM LDAB #1 LDAA DRIVE BEQ DMADOK DRLOOP ASLB SHIFT DRIVE BIT DECA BNE DRLOOP DMADOK STAB DMADRV 1 2 4 OR 8 R_TS SPC 3 * WRITE TRACK FROM RAM TO DISK * DWRTRK BSR SETDRV BSR DSEEK NOP SEI STOP SPOOLER TSTBYT LDX #$FFFF-WORKSPACE STX ADDREG LDX #WORKSPACE STX TEMP MOVE TO MEMORY LDAA WORKEND+1 SUBA TEMP+1 LDAB WORKEND SBCB TEMP COMA COMB STAB CNTR`EG -(WORKEND-WORKSPACE) STAA CNTREG+1 LDX CNTREG GET COMPLIMENT LDAB #$FE STAB CCREG LDAB #$FE STAB PRIREG LDAA #$F4 TRACK WRITE STAA DCOMRG BLOOP1 TST CCREG STARTED COUNTING? BMI BLOOP1 LDX #$FFFF STX PRIREG BRA DREADY * SEEK TRACK * DSEEaK CMPA DTRKRG ALREADY THERE BEQ DRETRN STAA DDATRG LDAA #$19 SEEK SPEED STAA DCOMRG BSR DELAYI USE MF68 DELAY DREADY LDAA DCOMRG BITA #1 BNE DREADY DRETRN RTS SPC 3 * SET DRIVE NUMBER * SETDRV LDAB DMADRV ORAB #$A0 TST SIDNOW SECOND SIDE? BEbQ SETDR2 ORAB #$B0 SETDR2 COMB STAB DRVREG DELAYI JMP DELAY SPC 3 * FAST READ CHECKS WITHOUT HEADLOAD DELAY * DFSTRD STAB DSECRG CLR SIDNOW ASSUME FIRST SIDE TST DBLFLG BEQ NOTDB5 LDAB MAXSEC LSRB MAXSEC/2 CMPB SECNOW BGE NOTDB5 INC SIDNOW ScECOND SIDE NOTDB5 BSR SETDRV LDX #$FFFF-FCB-$40 LOAD DATA HERE STX ADDREG LDX #$FFFF-256 BYTES TO TRANSFER TST BYTSEC SECTOR SIZE BMI NOT128 LDX #$FFFF-128 NOT128 STX CNTREG LDAB #$FF STAB CCREG LDAB #$FE STAB PRIREG NOP SEI STOP SPOOLER LdDAA #$88 READ WITHOUT DELAY STAA DCOMRG LDX #$F000 TIME OUT LIMIT FSTRE2 TST CCREG BPL FSTRE3 DEX BNE FSTRE2 FSTRE3 LDX #$FFFF STX PRIREG BSR DREADY BITA #$18 RTS SPC 3 * BOOTSTRAP LOADER FOR TRK 0 SEC 0/1 * * THIS SECTOR IS READ BY ROM BOOTSeTRAP * AND IN TURN READS ALL OF THE FLEX.SYS * FILE STARTING AT THE SECTOR STORED IN * THE FIFTH AND SIXTH BYTES BY 'LINK.CMD'. * * THERE ARE FOUR VERSIONS OF THE BOOTSTRAP. * THE VALUE OF BOOTNUM DETERMINES WHICH ONE * WILL BE USED. THESE BOOTS ARE REfLOCATABLE * AND WILL ASSEMBLE CORRECTLY REGARDLESS OF * WHICH PROCESSOR ASSEMBLES THIS PROGRAM. * * BOOT0 = 6800 MF68 * BOOT1 = 6800 DMAF * BOOT2 = 6809 MF68 * BOOT3 = 6809 DMAF * * LOCAL ADDRESS EQUATES FOR 6800 AND 6809 * BPNTR0 EQU $A07C POINTER AND g BUFFERS BPNTR9 EQU $C1FC BTEMP0 EQU BPNTR0+2 BTEMP9 EQU BPNTR9+2 BFCB0 EQU $A200 BFCB9 EQU $C200 MCOMR0 EQU $8018 6800 MF68 MTRKR0 EQU MCOMR0+1 MSECR0 EQU MCOMR0+2 MDATR0 EQU MCOMR0+3 ADDRE0 EQU $9000 6800 DMAF CNTRE0 EQU ADDRE0+$02 CCREG0 EQU ADDRE h0+$10 PRIRE0 EQU ADDRE0+$14 DCOMR0 EQU ADDRE0+$20 DTRKR0 EQU ADDRE0+$21 DSECR0 EQU ADDRE0+$22 DDATR0 EQU ADDRE0+$23 DRVRE0 EQU ADDRE0+$24 MCOMR9 EQU $E018 6809 MF68 MTRKR9 EQU MCOMR9+1 MSECR9 EQU MCOMR9+2 MDATR9 EQU MCOMR9+3 ADDRE9 EQU $F000 6809 DMA iF CNTRE9 EQU ADDRE9+$02 CCREG9 EQU ADDRE9+$10 PRIRE9 EQU ADDRE9+$14 DCOMR9 EQU ADDRE9+$20 DTRKR9 EQU ADDRE9+$21 DSECR9 EQU ADDRE9+$22 DDATR9 EQU ADDRE9+$23 DRVRE9 EQU ADDRE9+$24 SPC 3 * BOOT0 * BOOT0 FCB $8E LDS # FDB BPNTR0-2 LEAVE ROOM FOR TEMPS F jCB 1 NOP TO ADJUST POSITION FCB $CE,0,0 LDX #LINK ADDR. BNE GOTLN0 FCB $FE,$FF,$FE GET VECTOR FCB $6E,0 JMP 0,X RESET GOTLN0 FCB $FF STX FDB BPNTR0 SAVE LINK SECTOR BRA BRSTR0 RESTORE HEAD FRST0 LDAA BPNTR0 FIRST TRK AND SEC LDAB BPNTR0+1 BREA kD0 BSR BSEEK0 LDAA #$8C READ COMMAND STAA MCOMR0 BSR BDEL0 CLRB COUNT 256 BYTES FCB $CE LDX # FDB BFCB0 READ DATA INTO HERE MORED0 LDAA MCOMR0 BITA #2 DATA AVAILABLE BIT BNE GBYTE0 DATA IS READY BITA #1 READY BIT BNE MORED0 BRA BOOT0 ENDED TlOO SOON GBYTE0 LDAA MDATR0 GET A BYTE FCB $A7,$00 STORE IN MEMORY FCB 8 INX DECB COUNT BYTES BNE MORED0 BSR BRDY0 WAIT FOR CRC CHECK BITB #$1C READ ERROR? BNE BOOT0 YES, TRY AGAIN FCB $CE LDX # FDB BFCB0+4 SAVPT0 FCB $FF STX FDB BPNTR0 BOOTmFCB POINTER RTS BSEEK0 STAA MDATR0 TRACK BSR BDEL0 STAB MSECR0 SECTOR BSR BDEL0 B0TYPE LDAA #0 USED BY F&D DOUBLE BEQ SSIDE0 SINGLE SIDE? B0FLIP CMPB #0 BHI B0FLP ANDA #$DF SELECT FIRST SIDE B0FLP STAA MCOMR0-3 F&D TYPE/SIDE SSIDE0 LDAA #$1B SnTAA MCOMR0 SEEK COMMAND BSR BDEL0 BRDY0 LDAB MCOMR0 BITB #1 READY? BNE BRDY0 NO RTS BDEL0 BSR *+2 WASTE TIME BSR *+2 BSR *+2 RTS FRSTS0 BRA FRST0 ISLAND RDBYT0 FCB $FE LDX FDB BPNTR0 CPX #BFCB0+256 BEQ GETLN0 END OF CURRENT SECTOR FCB $A6o,0 LDAA BYTE FROM SECTOR FCB 8 INX BRA SAVPT0 GETLN0 LDAA BFCB0 LINK TO NEXT SECTOR LDAB BFCB0+1 BSR BREAD0 BRA RDBYT0 BRSTR0 LDAA #$B RESTORE COMMAND STAA MCOMR0 BSR BDEL0 BSR BRDY0 BSR FRSTS0 GET FLEX SEC GETYP0 BSR RDBYT0 CMPA #2 BINARY pBLOCK? BEQ GETAD0 CMPA #$16 START ADR BLOCK? BNE GETYP0 BSR RDBYT0 STAA BTEMP0 STARTING ADDRESS BSR RDBYT0 STAA BTEMP0+1 FCB $FE LDX FDB BTEMP0 FCB $6E,00 JUMP TO FLEX GETAD0 BSR RDBYT0 STAA BTEMP0 BSR RDBYT0 STAA BTEMP0+1 BSR RDBYT0 FCqB $16 TAB BYTE COUNT BEQ GETYP0 EMPTY BLOCK MOVSE0 FCB $37 PSH B BSR RDBYT0 GET BYTE FROM BOOTFCB FCB $33 PUL B FCB $FE LDX FDB BTEMP0 FCB $A7,0 STAA IN MEMORY FCB 8 INX FCB $FF STX FDB BTEMP0 DECB BNE MOVSE0 BRA GETYP0 LOOK FOR NEXT BLOCK r B0END EQU * END OF BOOT0 SPC 3 * BOOT1 * BOOT1 FCB $8E LDS # FDB BPNTR0-2 LEAVE ROOM FOR TEMPS FCB 1 NOP TO ADJUST POSITION FCB $CE,0,0 LDX #LINK ADDR. BNE GOTLN1 FCB $FE,$FF,$FE GET VECTOR FCB $6E,0 JMP 0,X RESET GOTLN1 FCB $FF STX FDB BPNTRs0 SAVE START SECTOR BRA BRSTR1 FRST1A LDAA BPNTR0 FIRST TRK AND SEC LDAB BPNTR0+1 BREAD1 BSR BSEEK1 LDAB #$FF FCB $CE LDX # FDB $FFFF-BFCB0 LOAD DATA HERE FCB $FF STX FDB ADDRE0 FCB $CE LDX # FDB $FFFF-256 BYTES TO TRANSFER FCB $FF STX FDB tCNTRE0 STAB CCREG0 LDAB #$FE LDAA #$8C READ COMMAND STAB PRIRE0 STAA DCOMR0 FCB $CE LDX # FDB $F000 TIME OUT TIME1 TST CCREG0 BPL OK1 FCB 9 DEX BNE TIME1 OK1 FCB $CE LDX # FDB $FFFF FCB $FF STX FDB PRIRE0 BSR BRDY1 WAIT FOR CRC CHECK BIuTB #$1C READ ERROR? BNE BOOT1 YES, TRY AGAIN FCB $CE LDX # FDB BFCB0+4 SAVPT1 FCB $FF STX FDB BPNTR0 BOOTFCB POINTER RTS BRSTR1 BRA BRST1A ISLANDS FRSTS1 BRA FRST1A BREA1A BRA BREAD1 BSEEK1 STAB DSECR0 CMPB #$F 8 INCH FIRST SIDE BHI FLIP1 LDAvB #$5E DRV 0 FIRST SIDE BRA DOSID1 FLIP1 LDAB #$4E DRV 0 SECOND SIDE DOSID1 STAB DRVRE0 CMPA DTRKR0 ALREADY THERE? BEQ BDEL1 STAA DDATR0 BSR BDEL1 LDAA #$19 SEEK SPEED STAA DCOMR0 BSR BDEL1 BRA BRDY1 BDEL1 BSR *+2 WASTE TIME BSR *+2 BSR *+w2 BSR *+2 RTS BRDY1 LDAB DCOMR0 BITB #1 READY? BNE BRDY1 NO RTS RDBYT1 FCB $FE LDX FDB BPNTR0 CPX #BFCB0+256 BEQ GETLN1 END OF CURRENT SECTOR FCB $A6,0 LDAA BYTE FROM SECTOR FCB 8 INX BRA SAVPT1 GETLN1 LDAA BFCB0 LINK TO NEXT SECTOR LDABx BFCB0+1 BSR BREA1A BRA RDBYT1 BRST1A LDAA #$9 RESTORE SPEED STAA DCOMR0 BSR BDEL1 BSR BRDY1 BSR FRSTS1 GET FLEX SEC GETYP1 BSR RDBYT1 CMPA #2 BINARY BLOCK? BEQ GETAD1 CMPA #$16 START ADR BLOCK? BNE GETYP1 BSR RDBYT1 STAA BTEMP0 STARTING AyDDRESS BSR RDBYT1 STAA BTEMP0+1 FCB $FE LDX FDB BTEMP0 FCB $6E,00 JUMP TO FLEX GETAD1 BSR RDBYT1 STAA BTEMP0 BSR RDBYT1 STAA BTEMP0+1 BSR RDBYT1 FCB $16 TAB BYTE COUNT BEQ GETYP1 EMPTY BLOCK MOVSE1 FCB $37 PSH B BSR RDBYT1 GET BYTE FROM BOzOTFCB FCB $33 PUL B FCB $FE LDX FDB BTEMP0 FCB $A7,0 STAA IN MEMORY FCB 8 INX FCB $FF STX FDB BTEMP0 DECB BNE MOVSE1 BRA GETYP1 LOOK FOR NEXT BLOCK B1END EQU * END OF BOOT1 SPC 3 * BOOT 2 * BOOT2 FDB $10CE LDS # FDB BPNTR9-2 LEAVE ROOM FOR{ TEMPS FCB $8E,0,0 LDX #LINK ADDR. BNE GOTLN2 FCB $BE,$FF,$FE GET VECTOR FCB $6E,0 JMP 0,X RESET GOTLN2 FCB $BF STX FDB BPNTR9 SAVE START SECTOR BRA BRSTR2 FRST2 LDAA BPNTR9 FIRST TRK AND SEC LDAB BPNTR9+1 BREAD2 BSR BSEEK2 LDAA #$8C READ COM|MAND STAA MCOMR9 BSR BDEL2 CLRB COUNT 256 BYTES FCB $8E LDX # FDB BFCB9 READ DATA INTO HERE MORED2 LDAA MCOMR9 BITA #2 DATA AVAILABLE BIT BNE GBYTE2 DATA IS READY BITA #1 READY BIT BNE MORED2 BRA BOOT2 ENDED TOO SOON GBYTE2 LDAA MDATR9 GET A} BYTE FCB $A7,$00 STORE IN MEMORY FDB $3001 INX DECB COUNT BYTES BNE MORED2 BSR BRDY2 WAIT FOR CRC CHECK BITB #$1C READ ERROR? BNE BOOT2 YES, TRY AGAIN FCB $8E LDX # FDB BFCB9+4 SAVPT2 FCB $BF STX FDB BPNTR9 BOOTFCB POINTER RTS BSEEK2 STAA ~ MDATR9 TRACK BSR BDEL2 STAB MSECR9 SECTOR BSR BDEL2 B2TYPE LDAA #0 USED BY F&D DOUBLE BEQ SSIDE2 SINGLE SIDE? B2FLIP CMPB #0 BHI B2FLP ANDA #$DF SELECT FIRST SIDE B2FLP STAA MCOMR9-3 F&D TYPE/SIDE SSIDE2 LDAA #$1B STAA MCOMR9 SEEK COMMAND BSR !BDEL2 BRDY2 LDAB MCOMR9 BITB #1 READY? BNE BRDY2 NO RTS BDEL2 BSR *+2 WASTE TIME BSR *+2 BSR *+2 RTS FRSTS2 BRA FRST2 ISLAND RDBYT2 FCB $BE LDX FDB BPNTR9 CPX #BFCB9+256 BEQ GETLN2 END OF CURRENT SECTOR FCB $A6,0 LDAA BYTE FROM SECTOR FDB" $3001 INX BRA SAVPT2 GETLN2 LDAA BFCB9 LINK TO NEXT SECTOR LDAB BFCB9+1 BSR BREAD2 BRA RDBYT2 BRSTR2 LDAA #$B RESTORE TRK 0 STAA MCOMR9 BSR BDEL2 BSR BRDY2 BSR FRSTS2 GET FLEX SEC GETYP2 BSR RDBYT2 CMPA #2 BINARY BLOCK? BEQ GETAD2 CMPA #$#16 START ADR BLOCK? BNE GETYP2 BSR RDBYT2 STAA BTEMP9 STARTING ADDRESS BSR RDBYT2 STAA BTEMP9+1 FCB $BE LDX FDB BTEMP9 FCB $6E,00 JUMP TO FLEX GETAD2 BSR RDBYT2 STAA BTEMP9 BSR RDBYT2 STAA BTEMP9+1 BSR RDBYT2 FDB $1F89 TAB BYTE COUNT BEQ$ GETYP2 EMPTY BLOCK MOVSE2 FDB $3404 PSH B BSR RDBYT2 GET BYTE FROM BOOTFCB FDB $3504 PUL B FCB $BE LDX FDB BTEMP9 FCB $A7,0 STAA IN MEMORY FDB $3001 INX FCB $BF STX FDB BTEMP9 DECB BNE MOVSE2 BRA GETYP2 LOOK FOR NEXT BLOCK B2END EQU * END OF BOOT2 SPC 3 * BOOT3 * BOOT3 FDB $10CE LDS # FDB BPNTR9-2 LEAVE ROOM FOR TEMPS FCB $8E,0,0 LDX #LINK ADDR. BNE GOTLN3 FCB $BE,$FF,$FE GET VECTOR FCB $6E,0 JMP 0,X RESET GOTLN3 FCB $BF STX FDB BPNTR9 SAVE START SECTOR BRA BRSTR3 FRST3A LDAA BPNTR9 FIRST TRK AND SEC LDAB BPNTR9+1 BREAD3 BSR BSEEK3 LDAB #$FF FCB $8E LDX # FDB $FFFF-BFCB9 LOAD DATA HERE FCB $BF STX FDB ADDRE9 FCB $8E LDX # FDB $FFFF-256 BYTES TO TRANSFER FCB $BF STX FDB CNTRE9 STAB CCREG9 LDAB #$FE LDAA #$8C READ COMMAND STAB PRIRE9 STAA DCOMR9 FCB $8E LDX # FDB $F000 TIME OUT TIME3 TST CCREG9 BPL OK3 FDB $301F DEX BNE TIME3 OK3 FCB $8E LDX # FDB $FFFF FCB $BF STX FDB PRIRE9 BSR BRDY3 WAIT FOR CRC CHECK BITB #$1C READ ERROR? BNE BOOT3 YES, TRY AGAIN FCB $8E LDX # FDB BFCB9+4 SAVPT3 FCB $BF STX FDB BPNTR9 BOOTFCB POINTER RTS BRSTR3 BRA BRST3A ISLANDS FRSTS3 BRA FRST3A BREA3A BRA BREAD3 BSEEK3 STAB DSECR9 CMPB #$F 8 INCH END FIRST SIDE BHI FLIP3 LDAB #$5E DRV 0 FIRST SIDE BRA DOSID3 FLIP3 LDAB #$4E DRV 0 SECOND SIDE DOSID3 STAB DRVRE9 CMPA DTRKR9 ALREADY THERE? BEQ BDEL3 STAA DDATR9 BSR BDEL3 LDAA #$19 SEEK SPEED STAA DCOMR9 BSR BDEL3 BRA BRDY3 BDEL3 BSR *+2 WASTE TIME BSR *+2 BSR *+2 BSR *+2 RTS BRDY3 LDAB DCOMR9 BITB #1 READY? BNE BRDY3 NO RTS RDBYT3 FCB $BE LDX FDB BPNTR9 CPX #BFCB9+256 BEQ GETLN3 END OF CURRENT SECTOR FCB $A6,0 LDAA BYTE FROM SECTOR FDB $3001 INX BRA SAVPT3 GETLN3 LDAA BFCB9 LINK TO NEXT SECTOR LDAB BFCB9+1 BSR BREA3A BRA RDBYT3  BRST3A LDAA #$9 RESTORE SPEED STAA DCOMR9 BSR BDEL3 BSR BRDY3 BSR FRSTS3 GET FLEX SEC GETYP3 BSR RDBYT3 CMPA #2 BINARY BLOCK? BEQ GETAD3 CMPA #$16 START ADR BLOCK? BNE GETYP3 BSR RDBYT3 STAA BTEMP9 STARTING ADDRESS BSR RDBYT3 STAA BTEMP9+1 FCB $BE LDX FDB BTEMP9 FCB $6E,00 JUMP TO FLEX GETAD3 BSR RDBYT3 STAA BTEMP9 BSR RDBYT3 STAA BTEMP9+1 BSR RDBYT3 FDB $1F89 TAB BYTE COUNT BEQ GETYP3 EMPTY BLOCK MOVSE3 FDB $3404 PSH B BSR RDBYT3 GET BYTE FROM BOOTFCB FDB $3504 PUL B FCB $BE LDX FDB BTEMP9 FCB $A7,0 STAA IN MEMORY FDB $3001 INX FCB $BF STX FDB BTEMP9 DECB BNE MOVSE3 BRA GETYP3 LOOK FOR NEXT BLOCK B3END EQU * END OF BOOT 3 PGMSIZ EQU *-START SIZE IN BYTES WORKSP EQU *+$20 START OF WORKSPACE END START   4Dec 24, 1982 Dear FLEX user, The source of INIT has only subtle changes since the  article in '68 Journal (Apl 82). It supports MF-68, F&D, DMAF-1, and DMAF-2. It supports single or double sided but SINGLE DENSITY ONLY. I now  have a friend who uses INIT with an F&D board and a 1791 (in single density mode). Unlike NEWDISK my program uses the proper gaps to be compatible with the 1791 controller. The DRIVERS source file is an improved version of the listin g in SS-50 Computing (Nov 81). The new drivers have double  sided capability. I also added selectable seek speed for each drive from a table. This enables me to use 20 msec for my SA-400, 12 msec for TANDON T100-2, and 8 msec for SA-90 1s. The 6800 drivers will allow 8 inch drives at 1.25 MHZ and fast format at  1.4 MHZ. The 6809 will handle 8 inch at 1.1 MHZ if the write loop LDAA 0,X INX is changed to LDA ,X+. I have not measured the fast  format threshold since my dual processor system always uses a 68B00 to do I/O. My choice of pin 34 for the ready circuit in SS- 50 Computing has not produced any conflicts. This pin was unused on my Shugarts or on my F&D controller. At the Newark Flea Market I bought a TANDON DSDD drive for $125. When I got home I discov- ered this drive uses pin 32 for side select. F&D did not connect  the side select latch to the connector but after adding a jumper I was able to operate double sided. The driver allows mixing  single and double sided as long as ALL double sided drives have the same number of sectors per track. I included on the disk an assortment of utilities that you  may be interested in. Our New England area FLEX user group has several local standards we abide by. Whenever a new utility is  written we try to replace one or more old ones. This enables us to use 5 inch drives for system disks and still have a powerful  system on line. I use my 8 inch drives fo r data disks. A few other standards can be seen in programs like DATE. We always put  some instructions at the beginning of the source, this way the manual and program source will stay together. You MUST read the  first few pages of the  listing for adaptation information . Most of our recent programs have help instructions built in. The help  is invoked by typing the command name without any parameters. In those cases where the command is sometimes used without para- mete rs (such as DATE) then enter the command name followed by a "+". We try to keep some structure in our sources and you can see CAT, DATE, INIT, and COPY are modularized. This allows easy modi- fication and debugging. Each module has a header with three blank lines above it; this allows your eyes to find sections quickly. All but one program (WORDSWAP) are written in 6800 code since  several members do not use the 6809. Myself, I use the 6809 for mostly for STYLUS to edit a prog ram which I assemble on the 6800. This has improved productivity considerably since I can debug the program without overwriting the editor and source. When I find  something I need to fix I swap CPUs (both in one SWTP frame) and edit the source. Conversion between systems is eased by my FLEX  EQU $A000. All FLEX references are relative to that one equate making conversion as easy as changing one letter. This avoids the dangerous global changes usually associated with 6800 to 6809 conversion. TEST and INIT must reference the disk controllers and use a similar scheme: MF68 EQU $8018 and DMAF EQU $9000. All other controller registers are relative to these equates. These are the only equates that need change. CAT, COPY, and INIT have  several FCB flags for options. So far all of our members have been able to follow the comments. All user adaptation is located  at the beginning of the source and explained in the comments. Here is a list of the programs: CAT is very popular and has a manual. What we did was take  all the columns of information and made them options. You can select as little as the file names as displayed in the TSC  FILES.CMD or as much as displayed in the TSC DIR.CMD. A unique feature is CAT will compute how many columns can fit on your  display or printer. For example if only the file names are desired you can print nine columns on a 132 character per line  printer. CAT replaces many utilities. CLEANUP is a byte exchange program. It is used to clean control characters from a file, convert to lower case, strip  parity and other such chores. Like most of our utilities it replaces several programs such as LOW-UP, UP-LOW, and REMSPC. COPY is our most popular program; it has been in use several months thus is fairly well debugged. It was written from scratch but is compatible with the FLEX COPY.CMD, thus can be used with- out any training. To use it to its fullest requires a manual which I am enclosing. I've never written a manual before so I'd  be glad to hear any suggestions. The more you use COPY the more you wonder how anyone can survive without it. COPY replaces COPY, RAWCOPY, COPYNEW, ARCHIVE, MV, DUP, PCOPY, and RECOVER. So far! DATE does everything the original did plus allow you to change the date on a file, volume date, volume name, and volume  number. It replaces DATE, TOUCH, a nd VOLSET. DIRALL is a directory with repeat. Usual operation is to type O 0.OUTFILE DIRALL 1. This creates a file with the direct- ories of all your disks. I then sort the big file and print out a master directory. DISKEDIT is a c!ompilation of several programs. It allows  examination and editing by file name or track and sector. A recent addition is accepting DRV TRK SEC BYT for compatibility  with FIND. It is somewhat easier to use then the three programs " it replaces. DSKALIGN is used for aligning drives, testing controllers,  drivers, etc. It is a powerful program in the hands of a hardware person. FIND is a file search program. It will search for STRING,  HEX, and ADDRESS. It #reports track, sector, byte, and for ASCII it reports the sentence the character was found in. FIND was  totally restructured last MAY. The original was a mixture of three programs jammed together. A new feature is it will call  D$ISKEDIT directly. Typing 'D' will call in DISKEDIT and point it at the byte to be edited. INIT replaces NEWDISK with a much faster and more versatile program. It supports double sided DMAF-1 and F&D MDI-1 assuming  your FLEX driver supports double sided. It allows defaulting of many items such as tracks per side, norm/fast format, disk size,  etc. When properly set-up it will only ask two questions: Volume Name and Number. One can always get the full menu when formatting a disk for someone elses system; for example I use my 6800 F&D system to format disks that can be booted on my friend's 6809  DMAF-1 computer! LOWERCAS is an intelligent case conversion that capitalizes the first letter of a sentence, the word I, etc. RESIDENT loads FLEX transient commands into a reserved area  of memory and makes them resident. At first the second or two saved each time you access a resident commands seems small but  once you get used to the 'instant' commands the old method seems painfully slow! Don't let the long manual fool you, RESIDENT is  easy to use. SAVE was a quicky I wrote to store text from memory to disk. It does everything the FLEX program did plus saves te xt without  the block address found in binary files. SQUEEZE was written to get the most out of my small system disk. It MAY save a sector or two on files created by APPEND or  diskedited to zero out sections. I saved space on FLEX and! BASIC this way. It is also useful for skimming off extra starting  addresses. For example if you append something to FLEX there will be two starting addresses, one in the middle of the file. SQUEEZE holds the last starting address an"d adds it to the end of the file. TEST is a spinoff of INIT which uses the fast read subrou-  tine to test a disk much faster then the TSC TEST. It also dis- plays the boot link and status of our FAST FORMAT and EXTENDED  DIR flags. # WORDSWAP is a global change program. It accepts three file names: original file, new file, and wordlist. The wordlist con- sists of pairs of words separated by a period. It is the only file that uses 6809 code and runs very fast.  $If you find bugs in any of these programs I'd like to hear  from you. These programs are protected from normal typos and improper syntax. I'm sure there are people who can find some odd  sequence of letters that the command didn't anti %cipate; I don't consider that a "bug". The only bug I'm aware of is INIT some-  times doesn't like the FLEX spooler to be printing while a disk is formatting. Some users haven't had any problem with this but  others have. To be safe I wo &uldn't spool while formatting disks. Leo Taylor Additional Notes by Bruno Puglia While not a bug sometimes INIT will display a soft error on 00-10 when side flip is made using DMA only. In every case, the  disks have been ' OK and no problem could be found in actual use. I generally put a large number of files on a disk so I have used  the other side of the dir track and have no problems. I have a DMAF-2 compatible wirewrapped controller now run- ning doub (le sided double density. I have data on the wirewrapped  DMAF-2 controller using the Western Digital chip set. The chip set is very reliable and easy to adjust. When Leo wrote INIT I tested the DMA section on my DMAF-1,  thus early ve)rsions would not work on a DMAF-2. After I built my DMAF-2 controller I made the necessary changes to INIT and TEST  so they now work with the DMAF-2 in SINGLE DENSITY ONLY. Copy has many options and some combinations of letters may not *work together. Copy by file number "F" has many routines  which cannot be mixed with other options such as "A". The "F" option also has additional checks and you may not be able to copy by file number if the directory is bad. The "A+" option in CAT can't be used with match strings. When INIT is setup for the 6809 it will work with the DC-2 controller for 5 inch FLEX and will also work with 8 inch FLEX  system with the use of USEMF. INIT will also work in single, density mode on a DDC-16 disk controller with USEMF. The older 6809 VALIDATE program would not check certain  formats and I had to patch it so would handle the newer density formats such as SWTPC's EXTRA double density format. S-ome SWTPC FLEX versions have not worked well but SWTPC FLEX 2.8:3 can work if a timer port is installed in slot 5. It works with 4x or 16x IO mother boards. It can be patched to work with  DMAF1, DMAF2, DC-2, DC-3, DC-4 and DDC-16 disk contro.llers. Print and spooling problems have been fixed. Make sure to tighten down  the IO decode to at most 1k when using older mother boards. The newer S-BUG-E (V1.8) monitor allows lowercase operation and is an improvement over the old monit/or. These comments are  based on having standard SWTPC equipment such as older modified mother boards (tighter IO decode) and MP-09 CPU card. SWTPC DMAF  users may have problems with some dymanic memory boards and less problems when the 0CPU is replaced with newer 6909 IC. Bruno D. Puglia 27 Maitland Ave Randolph Mass 02368 Weekends Work-weekdays 617 961-3548 203 385-3844    @-%3&1&$403A95  o$#@&<% & ˽l#$'%*& #&$ Ӂ &$l$#$ņ l# & &~?~LISA is a utility to LISt in Assembler layout - it gives you a line-numbered listing of an assembler source file with assembler-type columnar display - a quick way to view a large assembler source file if you don't need object code. Format of the command is LISA SOURCFIL with TXT being the default extension. * TTL ASSEMBLER-FORMAT LISTING PAG * * BY HAL SNYDER, MD * PO BOX 311 * DEERFIELD, IL 60015 * * LIST TEXT FILE TABBED FOR 680X ASSEMBLER FIELDS * WARMS EQU $CD03 GETFIL EQU $CD2D PUTCHR EQU $CD18 OUTDEC EQU $CD39 PCRLF EQU $CD24 SETEXT EQU $CD33 RPTERR EQU $CD3F FMS EQU $D406 FMSCLS EQU $D403 FCB EQU $C840 * ORG $C100 LISA BRA LS0 FCB 1 VERSION * DATA EQU * FCB 8,13,23 TAB FIELDS COLUMN EQU 3 FIELD EQU 4 CHAR EQU 5 LINE EQU 6 RMB 5 * LS0 LDX #FCB JSR GETFIL LBCS LS9 LDA #1 OPEN FOR READ STA ,X JSR SETEXT JSR FMS LBNE LS9 LEAY DATA,PCR POINT TO RAM LDD #0 STD LINE,Y NEWLIN JSR PCRLF PSHS X LEAX LINE+DATA,PCR POINT TO LINE # LDU ,X INCREMENT LINE # LEAU 1,U STU ,X LDB #$FF JSR OUTDEC PULS X LDA #$20 JSR PUTCHR LDA #$20 JSR PUTCHR CLR FIELD,Y LDA #1 DATA COLUMN 1 STA COLUMN,Y NEWCHR LDX #FCB READ A BYTE JSR FMS BNE LS6 STA CHAR,Y CMPA #$D CRETN? BNE LS5 BRA NEWLIN LS5 JSR PUTCHR PRINT A BYTE INC COLUMN,Y LDB FIELD,Y CMPB #3 COMMENT FIELD? BEQ NEWCHR LDA CHAR,Y CMPA #'* COMMENT LINE? BNE LS5B LDB COLUMN,Y CMPB #2 BNE LS5B LDA #3 STA FIELD,Y BRA NEWCHR LS5B CMPA #$20 SPACE? BNE NEWCHR LDB FIELD,Y INC FIELD,Y LS5D LDA COLUMN,Y CMPA B,Y BHS NEWCHR LDA #$20 JSR PUTCHR INC COLUMN,Y BRA LS5D * LS6 LDA 1,X ERROR TYPE CMPA #8 END OF FILE? BNE LS9 LDA #4 IFSO, CLOSE IT STA ,X JSR FMS BNE LS9 JMP WARMS * LS9 JSR RPTERR JSR FMSCLS JMP WARMS * END LISA  ~ 'n'i%eM'b "^%WM'T"P%Ic"E@ &8»&3$˽Bo_9F5I5$ @?~@&$»'~•m&H$$~+&ĎY"&Ѧ" &Ȧ%CR 0  0 Z&ìQo_9.Sņ.Ŏéս &~_Y'~O$&F&)'C & &¬O$ 'M' ݦ&ˆ& ~'~~òO O Ύ@~'|0Z&9' 0Z&9_9H%]' ! 99SJ' 0m&0 (   _9A _ 99'0 9, 19, toL date.JanuaryFebruaryMarchAprilMayJuneJulyAugustSeptemberOctoberNovemberDecember? List Can't list binary files!List new files on Drive # Y will list the file, CR will return to FL?EX. Any other character will advance to the next file. # OPT PAG OPT NOG TTL LIST NEWFILES UTILITY PAG * * LIST NEW FILES WITH PROMPT UTILITY PROGRAM * SYNTAX: LISTNEW 1 1 83 * USER WILL BE OFFERED THE OPTION OF PRINTING * ANY OF THE FILES ON THE "ASN"ED WORKING DRIVE * CREATED JANUARY FIRST, 1983 $OR LATER. * FORMAT SAME AS PDEL UTILITY. * THE ESCAPE RETURN REGISTER IS SET TO RETURN * TO THE UTILITY AFTER AN ESCAPE/RETURN. * * CONVERTED TO LIST ONLY NEW FILES. * CONTROLLED BY DATE ON COMMAND LINE. * MODS BY KENT MEYERS. * APRIL 30,1983 * * THE BULK OF THE CODE IS: * COPYRIGHT (C) 1978 BY * * TECHNICAL SYSTEMS CONSULTANTS, INC. * P.O. BOX 2574 * WEST LAFAYETTE, INDIANA 47906 * (317) 423-5465 * * GLOBAL VARIABLES EOL EQU $CC02 FCB EQU $C840 WASN EQU $CC0C LSTTRM EQU $CC11 ASN EQU WASN SPC EQU $20 FMS EQU $D406 WARMS EQU $CD03 GETCHR EQU $CD15 PUTCHR EQU $CD18 PSTRNG EQU $CD1E PCRLF EQU $CD24 NXTCH EQU $CD27 OUTDEC EQU $CD39 RPTERR EQU $CD3F INDEC EQU $CD48 ESCRET EQU $CC16 PAG ORG $C100 FIL BRA FIL1 VN FCB 1 VERSION NUMBER DATE FCB 0,0,0 COUNT FCB 0 TEMP FDB 0 TEMP2 FDB 0 VALUE FDB 0 * PROGRAM HERE GETDAT JMP GETDT1 * GET DATE FROM FLEX COMMAND LINE. FIL1 LDAA LSTTRM CHECK TERM CHAR CMPA #$D IS IT CR? BEQ DATE4 CMPA EOL IS IT EOL? BEQ DATE4 BSR GETDAT INPUT NUMBER BCS DATE4 ERROR? TSTA BEQ DATE4 CMPA #12 GREATER THAN 12? BHI DATE4 STAA DATE SAVE MONTH BSR GETDAT GET DAY NUMBER BCS DATE4 ERROR? TSTA BEQ DATE4 CMPA #31 GREATER THAN 31? BHI DATE4 STAA DATE+1 SAVE DAY BSR GETDAT GET YEAR NUMBER BCS DATE4 ERROR? CMPA #99 GREATER THAN 99? BHI DATE4 STAA DATE+2 SAVE YEAR LDX #FCB POINT TO FCB LDAA ASN GET DRIVE STAA 3,X SET IN FCB LDAA #16 OPEN SYSTEM REC STAA 0,X JSR FMS BNE ERR ERROR? JSR GETIR GET FIRST RECORD BNE ERR ERROR? JSR PCRLF PAG * PRINT EXPLANATORY MESSAGES. LDX #FILST POINT TO STRING JSR PSTRNG PRINT IT LDX #FCB+2 POINT TO DRIVE CLR 0,X CLR B JSR OUTDEC PRINT IT LDX #COLST JSR PST JSR PDAT LDX #FINST JSR PST LDX #EXPST JSR PSTRNG JSR PCRLF BRA PRDIR * REPORT SY NTAX ERROR DATE4 EQU * SERR LDX #FCB POINT TO FCB LDAB #26 SET IN ERROR STAB 1,X * REPORT DISK ERROR ERR JSR RPTERR REPORT ERROR ERR2 JMP WARMS RETURN TO FLEX PAG * MAIN PROGRAM. PRDIR LDX #FCB POINT TO FCB LDAA #6 OPEN DIRECTORY STAA 0,X JS R FMS BNE ERR ERRORS? * QUALIFY THE RECORDS. PRDIR2 JSR PCRLF PRINT CR & LF PRDIR3 JSR GETIR GET INFO RECORD BEQ PRDI32 ERRORS? JMP PRDIR6 PRDI32 TST 4,X NAME PRESENT? BNE PRDI34 EXIT LDX #SIGST JSR PSTRNG JSR PCRLF JSR PCRLF JMP WARMS PRDI34 BMI PRDIR3 DELETED NAME? LDAA 15,X CHECK C PROT ANDA #$10 BNE PRDIR3 * COMPARE THE DATES. LDX #FCB+25 LDAA 2,X CMPA DATE+2 BHI PRDIR4 BNE PRDIR3 LDAA 0,X CMPA DATE BHI PRDIR4 BNE PRDIR3 LDAA 1,X CMPA DATE+1 BLO PRDIR3 PAG * PRINT FI LE NAME AND QUERY. PRDIR4 LDX #FCB+3 POINT TO FCB STX TEMP SAVE LDX #FCB2+3 POINT TO FCB 2 STX TEMP2 LDAB #12 SET COUNTER PRDI45 LDX TEMP GET POINTER LDAA 0,X GET CHARACTER INX BUMP TO NEXT STX TEMP LDX TEMP2 RESET POINTER STAA 0,X PUT CHARAC TER INX STX TEMP2 DECB DEC THE COUNT BNE PRDI45 LDX #DST POINT TO STRING JSR PSTRNG PRINT IT LDX #FCB2+2 POINT TO DRIVE CLR 0,X CLRB JSR OUTDEC PRINT DRIVE LDAA #'. PRINT "." JSR PUTCHR LDX #FCB2+4 POINT TO NAME LDAB #8 SET COUNTER JSR P RNAM PRINT IT LDAA #'. PRINT "." JSR PUTCHR LDAB #3 SET COUNTER JSR PRNAM PRINT EXT LDX #DST2 POINT TO STRING LDAB #3 SET COUNT JSR PDATA PRINT IT * GET KEYBOARD RESPONSE. JSR GETCHR GET RESPONSE CMPA #$D IS IT CR? BNE PRDI48 JMP EXIT RETU RN TO FLEX PRDI48 ANDA #$5F MASK TO UPPER CMPA #'Y IS IT "Y"? BEQ PRDIR5 JMP PRDIR3 PAG * PRINT THE FILE. PRDIR5 LDX #FCB2 POINT TO FCB LDAA #1 SET OPEN STAA 0,X JSR PCRLF JSR FMS CALL TO OPEN BNE PRDI65 JSR FMS READ CHARACTER BNE CON6 ERROR? * TEST FIRST CHARACTER FOR BINARY. CMPA #2 BEQ BINARY BRA CON7 CON4 JSR FMS BNE CON6 CON7 CMPA #$D IS IT CR? BNE CON5 * SET ESCAPE RETURN BEFORE CR/LF. LDX #ESCAPE STX ESCRET LDX #FCB2 JSR PCRLF DO CR & LF BRA CON4 REPEAT CON5 CMPA #$A IS IT LINEFEED? BEQ CON4 SKIP IF SO TSTA IS IT NULL? BEQ CON4 SKIP IF SO JSR PUTCHR OUTPUT CHARACTER BRA CON4 REPEAT CON6 LDAA 1,X GET ERROR NUM CMPA #8 IS IT EOF? BNE PRDI65 REPORT ERROR CANCEL LDAA #4 CLOSE FILE STAA 0,X JSR FMS BNE PRDI65 ERROR JMP PRDIR2 PRDIR6 LDAA 1,X GET ERROR TYPE CMPA #8 IS IT EOF? BEQ PRDIR7 PRDI65 JMP ERR REPORT ERROR PRDIR7 JMP EXIT PAG * REFUSE BINARY FILE AND CLOSE. BINARY LDX #BINST JSR PSTRNG LDX #FCB2 BRA CANCEL * ESCAPE ENTRY CLEARS STACK AND RESETS * ESCAPE RETURN REGISTER TO WARMS. ESCAPE LDS #$C07F LDX #WARMS STX ESCRET LDX #FCB2 BRA CANCEL * GET INFO RECORD GETIR LDX #FCB POINT TO FCB LDAA #7 GET IR CODE STAA 0,X JMP FMS CALL FMS * PRINT FILE NAME PRNAM LDAA 0,X GET CHARACTER BEQ PRNAM2 JSR PUTCHR OUTPUT CHAR INC COUNT BUMP COUNT PRNAM2 INX BUMP TO NEXT DECB BNE PRNAM RTS RETURN * PRINT STRING WITHOUT CR & LF PDATA LDAA 0,X GET CHARACTER BEQ PDATA2 NULL? JSR PUTCHR PRINT IT INX BUMP TO NEXT DECB DEC COUNT BNE PDATA RTS RETURN PDATA2 CLR B RTS PAG * INPUT DATE DIGIT GETDT1 JSR INDEC INPUT NUMBER BCS GETDA4 ERROR? TSTB NUMBER THERE? BEQ GETDA3 STX VALUE SAVE VALUE LDAA VALUE+1 GET LS PART CLC CLEAR ERRORS RTS GETDA3 SEC SET ERRORS GETDA4 RTS * PRINT DATE PDAT LDAA DATE GET MONTH LDX #MONTH POINT TO TABLE PDAT1 DECA CHECK DATE BEQ PDAT3 PDAT2 INX FIND MONTH STRING TST 0,X BNE PDAT2 INX BRA PDAT1 PDAT3 BSR PST GO PRINT IT LDAA #$20 OUTPUT SPACE JSR PUTCHR CLR VALUE LDAA DATE+1 GET DAY NUMBER STAA VALUE+1 LDX #VALUE POINT TO IT CLRB CLEAR FLAG JSR OUTDEC PRINT DAY LDX #CST POINT TO STRING BSR PST PRINT IT LDAA DATE+2 GET YEAR STAA VALUE+1 CLRB LDX #VALUE POINT TO VALUE JSR OUTDEC PRINT YEAR RTS * PRINT STRING PST LDAA 0,X GET CHARACTER BEQ PST2 IS IT NULL? JSR PUTCHR OUTPUT CHARACTER INX BUMP TO NEXT BRA PST REPEAT PST2 RTS PAG * TEXT STRINGS CST FCC ", 19",0 COLST FCC ", ",0 FINST FCC " to date.",0 * MONTH STRINGS MONTH FCC "January",0 FCC "February",0 FCC "March",0 FCC "April",0 FCC "May",0 FCC "June",0 FCC "July",0 FCC "August",0 FCC "September",0 FCC "October",0 FCC "November",0 FCC "December",0 * STRINGS DST2 FCC "? " DST FCC "List ",4 BINST FCC "Can't list binary files!",4 FILST FCC "List new files on Drive # ",4 EXPST FCC "Y will list the file, CR will return to FLEX.",$0D,$0A FCC "Any other character will advance to the next file.",4 SIGST FCC " ",4 FCB2 RMB 320 END FIL  @-% 3' ?~߽-%3&@'&ӎ߆& ˁA%Z" &,&i&.&* /'&4I 4i5_ a-z.   ߽&9 . .'?'!&a-Z/a-z.9 OPT PAG NAM LOWERCASE CONVERSION PAG * UPPER TO LOWER CASE CONVERTER FOR TSC FLEX-2.0 * * THIS PROGRAM WILL CONVERT AN INPUT FILE OF ANY * CASE TO AN OUTPUT FILE OF LOWER CASE WITH THE * FOLLOWING CHARACTER SEQUENCES SET TO UPPER CASE: * * 1. ANY OUTPUT CHARACTER FOLLOWING A PERIOD, A * QUESTION MARK, OR AN EXCLAMATION POINT WILL BE * IN UPPER CASE. SPACES, CARRIAGE RETURN, OR LINE * FEEDS BETWEEN THE PUNCTUATION AND CHARACTER * WILL BE IGNORED. * * 2. AN 'I' WILL BE UPPER CASE IF PRECEEDED BY A * SPACE AND FOLLOWED BY EITHER ANOTHER SPACE OR * AN APOSTROPHE. * * 3. THE FIRST CHARACTER OF A FILE WILL BE UPPER CASE. * * THE PROGRAM IS CALLED BY: LOWERC OLDFILE NEWFILE. * THE OLD FILE IS PRESERVED. A FILE TYPE OF TXT IS * ASSUMED UNLESS YOU SPECIFY ANOTHER TYPE. USE OF * THIS COMMAND ON A BINARY FILE WILL PRODUCE STRANGE * RESULTS! * * PROGRAM CONVERTED BY LEO TAYLOR FROM LSI-11 PROGRAM * WRITTEN BY ROBERT MEISTER. * * FLEX ADDRESS ASSIGNMENTS: * FLEX EQU $C000 FCB EQU FLEX+$840 FILE CONTROL BLOCK WARMS EQU FLEX+$D03 GETCHR EQU FLEX+$D15 PUTCHR EQU FLEX+$D18 PSTRNG EQU FLEX+$D1E PCRLF EQU FLEX+$D24 GETFIL EQU FLEX+$D2D SETEXT EQU FLEX+$D33 RPTERR EQU FLEX+$D3F FMSCLS EQU FLEX+$1403 FMS EQU FLEX+$1406 ORG FLEX+$100 PAG * PROGRAM STARTS BY OPENING TWO FILES LOWERC BRA LOWER1 VN FCB 1 VERSION NUMBER FLAG FCB P FLAG STARTS WITH PERIOD SPC 1 A EQU 1 ALPHA BIT OF FLAG I EQU 2 'I' BIT P EQU 4 '.' OR '?' OR '!' SPC 3 LOWER1 LDX #FCB POINT TO FCB JSR GETFIL GET THE FILE NAME BCS ERROR  LDAA #1 SET FOR READ STAA 0,X SAVE IN FCB JSR SETEXT SET DEFAULT EXT JSR FMS OPEN FOR READ BEQ LOWER2 ERROR JSR RPTERR REPORT ERROR JSR FMSCLS CLOSE ALL FILES WARMISL JMP WARMS RETURN TO FLEX LOWER2 LDX #FCB2 POINT TO FCB JSR GETFIL GET FILE NA!ME BCS ERROR LDAA #1 SET EXTENSION JSR SETEXT LDAA #2 SET FOR WRITE STAA 0,X JSR FMS OPEN FOR WRITE BNE ERROR LOOPLOW LDX #FCB POINT TO READ JSR FMS GET CHARACTER BEQ READOK LDAA 1,X CHECK ERROR CMPA #8 IS IT EOF? BNE ERROR LDX #FCB2 POI" NT TO WRITE LDAA #4 SET FOR CLOSE STAA 0,X JSR FMS CLOSE WRITE FILE ERRORIS BNE ERROR BRA WARMISL RETURN TO FLEX SPC 1 READOK CMPA #'A UPPER CASE? BLO LOWALL CMPA #'Z BHI LOWALL ADDA #$20 MAKE LOWER SPC 3 * ALL CHARACTERS LOWER CASE * NOW CHE# CK FLAG * LOWALL LDAB FLAG BITB #P LAST CHAR PERIOD TYPE? BNE UPPER FORCE UPPER CASE BITB #I 'I' JUST RECEIVED? BNE GETI CMPA #'I+32 LOWER CASE 'I' BNE NOFLAG BITB #A LAST CHAR ALPHA? BNE NOFLAG ORAB #I SET 'I' FLAG STAB FLAG BRA LOOPLOW GET$ NEXT CHAR SPC 1 GETI CMPA #$20 SPACE OR CONTROL? BLE ISPACE CMPA #'' APOSTROPHE? BNE NOTI ISPACE PSHA SAVE PRESENT CHAR LDAA #'I BRA SENDI SPC 1 NOTI PSHA SAVE PRESENT CHAR LDAA #'I+32 LOWER CASE I SENDI BSR WRITE PULA RESTORE CHAR CLRB NORM  AL CHAR BRA NOFLAG TREAT NORMALLY SPC 1 UPPER CMPA #$61 LOWER CASE? BLT NOFLAG CMPA #$7A LOWER CASE? BGT NOFLAG GREATER THAT LC Z SUBA #$20 CONVERT TO UPPER NOFLAG STAB FLAG BSR SETFLAG SET FLAGS FOR THIS CHAR BSR WRITE BRA LOOPLOW SPC 3 * CO  NVERSION DONE SO WRITE CHARACTER * WRITE LDX #FCB2 POINT TO WRITE JSR FMS WRITE CHARACTER BNE ERRORISL RTS SPC 2 SPC 3 * SUBROUTINE TO SET FLAG BYTE * SETFLAG LDAB FLAG START WITH OLD FLAG CMPA #$20 PRINTING CHAR? BGT SETF1 YES PROCESS ANDB #% 11111110 CLEAR ALPHA BRA SETF11 SETF1 ANDB #%11111011 PRINTING CHAR SETF11 CMPA #'. PERIOD? BEQ SETF2 CMPA #'? QUESTION MARK? BEQ SETF2 CMPA #'! EXCLAMATION POINT? BNE SETF3 SETF2 ORAB #P SET PERIOD TYPE SETF3 CMPA #'a ALPHA? BLT SETF5 CMPA #'Z UPPER CASE? BLE SETF4 CMPA #'A+32 ALPHA? BLT SETF5 CMPA #'Z+32 LOWER CASE ALPHA? BGT SETF5 SETF4 ORAB #A SET ALPHA ANDB #%11111011 CLEAR P FLAG SETF5 STAB FLAG NEW FLAG BITS RTS SPC 3 FCB2 RMB 320 END LOWERCASE  @-%3& ;yC0.Z&.Z&@_$]' &Z &z'' M'A } & E-  Ľ& @h  0E$ &?&6z  E0& e~SE$~?~&9NOT A BINARY FILETRANSFER ADDR IS NO TRANSFER ADDRESSMAP OF   $MAP The MAP utility is used to display the load and transfer addresses of binary files. This command is useful in conjunction with the SAVE command. DESCRIPTION The general syntax of the MAP command is: MAP, where t he file spec defaults to a CMD extension and to the working drive. The beginning and ending addresses of each block of object code will be printed on the terminal. If a transfer address is contained in the file, it will be printed at the end of t he list of addresses. If more than one transfer address is found in a file, only the effective one (the last one encountered) will be displayed. An example will demonstrate the use of MAP. +++MAP,0.FLEX.SYS +++MAP,MONITOR The first example would cause the load and transfer addresses of the file FLEX.SYS on drive 0 to be displayed. The second would be MONITOR.CMD on the working drive.  OPT PAG NAM COMMAND MAP UTILITY PAG * THIS IS A MODIFIED VERSION OF FLEX'S * FILE LIST UTILITY * * JOHN HIGLEY * COMPONENT ENGINEERING * TEKTRONIX, INC. * * System equates GETFIL EQU $CD2D Input file spec from buffer OUTADR EQU $CD45 Output HEX addr ess PCRLF EQU $CD24 Output CR LF PSTRNG EQU $CD1E Output messages PUTCHR EQU $CD18 Output single character RPTERR EQU $CD3F Report disk error SETEXT EQU $CD33 Set disk extension WARMS EQU $CD03 FLEX warm start * * FMS equates FMS EQU $D406 FMSCLS EQU $ D403 FCB EQU $C840 * ORG $C100 MAP BRA MAP1 Branch around temps FCB $10 Version number 1.0 ADH FCB 0 Load address (high) ADL FCB 0 Load address (low) PREV FDB 0 Load address of previous record TXH FCB $FF Transfer address (high) TXL FCB $FF Transfer address (low) FLAG FCB 0 0 indicates not in a block LEN FCB 0 Length of current record * Program starts here MAP1 LDX #FCB Point to FCB JSR GETFIL Get file spec LBCS ERR .Report any errors LDA #2 STA 0,X Default ext is .CMD JSR SETEXT Set the ext  LDA #1 Function to open for read (FMS) STA 0,X JSR FMS OPEN FOR READ LBNE ERR .Report any errors LDA #$FF TURN OFF SPACE COMPRESSION STA 59,X LDX #MAPOF Point to message JSR PSTRNG .Output it LDX #FCB+3 Point to drive number LDA ,X+ .read it  ADDA #'0 . make it ASCII JSR PUTCHR . output it LDA #'. JSR PUTCHR Output dot LDB #8 Output 8 char name LUP1 LDA 0,X+ .read char JSR PUTCHR . output it DECB . done yet? BNE LUP1 . No, do more LDA #'. JSR PUTCHR Output dot LDB #3 Output 3 cha r ext LUP2 LDA 0,X+ .read char JSR PUTCHR . output it DECB . done yet BNE LUP2 . no, do next LDX #FCB Point to FCB CLRB JSR PCRLF Output CR LF * NEXT TSTB Byte count = 0? BEQ NEXT1 .Yes...next record JSR FMS Read a byte LBNE DONE Report any er rors DECB decrease byte count BRA NEXT Waste another byte * NEXT1 JSR FMS Read first byte of record BNE DONE Any error should be EOF CMPA #2 Load address? BEQ LOADPT Yes, work on it CMPA #$16 Transfer point? BEQ TXPT Yes, work on it TSTA BEQ N  EXT1 Ignore nulls LDX #NOTBIN Point to not binary msg JSR PSTRNG PRINT 'FILE NOT BINARY' LBRA ERR+3 TXPT LBSR GETBYT GET TRANSFER POINT STA TXH (high byte) LBSR GETBYT STA TXL (low byte) BRA NEXT Next record * LOADPT LBSR GETBYT Load address (hi  gh) STA ADH LBSR GETBYT Load address (low) STA ADL TST FLAG Inside a block? BNE CHECK .Yes, check if new start CHEK CLR LEN .No, This is the start of a block LDX ADH Store current address STX PREV . in PREV LDX #ADH Point to Load addr JSR OUTA  DR .Output it LDA #'- STA FLAG Signify inside block JSR PUTCHR Output dash CHECK LDD PREV GET LAST ADDRESS ADDB LEN ADD RECORD LENGTH ADCA #0 STD PREV . PREV + LEN should eq next ld addr CMPD ADH COMPARE NEXT TO NUMBER BNE NEWSEC B/ NOT CONTIGU  OUS LDX #FCB BSR GETBYT GET RECORD LENGTH STA LEN TFR A,B Length into B BRA NEXT Waste LEN bytes NEWSEC LDX PREV Next load addr not contiguous LEAX -1,X .Correct to end addr of block STX PREV LDX #PREV Output end of last block JSR OUTADR JSR  PCRLF BRA CHEK Set up for next block DONE LDA 1,X Check disk error CMPA #8 End of File? BNE ERR .No! Report it LDA #4 Close file function (FMS) STA 0,X JSR FMS .close it BNE ERR report error DEC LEN Correct LEN to show end of block LDD ADH AD DB LEN Add LEN to current load addr ADCA #0 .overflow STD ADH LDX #ADH OUTPUT CLOSING ADDRESS JSR OUTADR LDX TXH check for Xfer address INX BNE ADDR .NE: Yes, output it LDX #NONE .Else: Output NO Xfer ADDR JSR PSTRNG JMP WARMS Back to FLEX AD DR LDX #TXADD JSR PSTRNG Output message LDX #TXH JSR OUTADR Output transfer addr JSR PCRLF JMP WARMS Back to FLEX * ERR JSR RPTERR Report the disk error JSR FMSCLS Close all files JMP WARMS Back to FLEX * GETBYT JSR FMS Read a byte BNE ERR Report any error RTS NOTBIN FCC 'NOT A BINARY FILE' FCB 4 TXADD FCC 'TRANSFER ADDR IS ' FCB 4 NONE FCC 'NO TRANSFER ADDRESS' FCB 4 MAPOF FCC /MAP OF / FCB 4 * END MAP  B%]'ůS' & *B%]'2%(45'0΄0E0΄0E0΄ᮍ۬'70ѽE 4E 50Z&ﮍ'%Ħ$ ý$~0N 0] 0h~  -}/.Z&9 MEMORY DUMP FROM $ TO $. INVALID HEX ADDRESS.MISSING ADDRESS.END ADDRESS .LT. START ADDRESS.  #MEMDUMP The MEMDUMP utility is used to dump out the content of system memory to the terminal. A starting address, and an optional ending address, are specified on the command line to define the area of memory to be dumped. If the ending  address is not specified, 16 bytes of memory will be dumped starting at the sepcified starting address. If the ending address is specified, then memory will be dumped starting at the start address, and ending at least at the end address. D ESCRIPTION The general syntax of the MEMDUMP command is: MEMDUMP,[,] Where is a hexadecimal address specifying the location that the dump is to begin at, and is an optional hex address specifying where the dump  is to finish. If is not specified, then 16 bytes will be dumped beginning at the starting address. The utility will always dump an even multiple of 16 bytes, regardless of the specified ending address. For example: +++MEMDUMP,C100,C1 !02 will dump from $C100 through (and including) $C10F. If a non-hex address is specified, the message: INVALID HEX ADDRESS. will be displayed. If a parameter is omitted, the program will display: MISSING ADDRESS. and, finally ", if the starting address is greater than the ending address, END ADDRESS .LT. START ADDRESS. will be output. In the case of all the error messages mentioned above, control will be returned to FLEX command mode. Each line of the dump w #ill contain the address of the first byte in the line, then 8 WORDS of memory content, followed by the ASCII interpretation of each byte with unprintable characters printing as periods (.). Examples: +++MEMDUMP,0,15 MEMORY DUMP FROM $ $0000 TO $001F. 0000 0142 4344 4546 4748 494A 4B4C 4D4E 4F50 .BCDEFGH IJKLMNOP 0010 3132 3334 3536 FFFF 3738 3912 1416 1820 123456.. 789.... +++MEMDUMP,0 MEMORY DUMP FROM $0000 TO $000F. 0000 0143 4344 4546 4748 494A 4B4C 4D4E 4 F50 .BCDEFGH IJKLMNOP +++ VERSION 2 - 04/82 RICK BENSENE Non-commercial license granted by author. This utility may be freely copied by any hobbyist so long as credit to the author is given. !* * MEMDUMP - A MEMORY DUMP UTILITY FOR FLEX/09 * WRITTEN BY RICK BENSENE, 10/28/81 * * MODIFIED FOR OPTIONAL ENDING ADDRESS, 04/09/82, BY * RICK BENSENE. * * * RELEASED TO PUBLIC DOMAIN. ANYONE IS FREE TO USE AND * MODIFY THIS PROGRAM AS DESIRE!D, SO LONG AS THE ORIGIN OF * PROGRAM IS MAINTAINED IN THE DOCUMENTATION. * * TO USE: * * ENTER: MEMDUMP,[,] * * WHERE:  IS HEXADECIMAL STARTING ADDRESS, * AND  IS OPTIONAL ENDING HEXADECIMAL ADDRESS. * * THE DUMP WILL! BE PRINTED GROUPED IN WORDS, WITH THE * PRINTABLE ASCII CHARACTERS ALSO PRINTED. THE DUMP WILL * ALWAYS DUMP AN EVEN MULTIPLE OF 16 BYTES. IF NO ENDING * ADDRESS IS SPECIFIED, THEN 16 BYTES OF MEMORY STARTING AT * THE SPECIFIED START ADDRESS WIL!L BE DUMPED. * * * NOTE: THIS PROGRAM WAS ORIGINALLY WRITTEN TO BE * POSITION INDEPENDENT. WHEN MAKING MODIFICATIONS, * THIS FACT SHOULD BE TAKEN INTO CONSIDERATION. * * * ** SYSTEM EQUATES ** * GETHEX EQU $CD42 WARMS EQU $CD03 PSTRN EQU $CE84 PS!TRNG WITH NO LEAD CRLF PCRLF EQU $CD24 PSTRNG EQU $CD1E PUTCHR EQU $CD18 OUTADR EQU $CD45 * LASTERM EQU $CC11 TTYEOL EQU $CC02 * SPACE EQU $20 CR EQU $0D CARRIAGE RETURN * * ORG $C100 MEMDMP BRA BEGIN VERSN FCB 2 VERSION NUMBER 2, 04/82 * BEGIN JSR GE!THEX GET STARTING ADDRESS LBCS HEXERR ILLEGAL HEX ADDRESS TSTB CHECK IF ANY ADDRESS AT ALL? LBEQ MISADD NOPE. TELL EM. STX BEGADD,PCR SAVE START ADDRESS LDA LASTERM CHECK FOR ADDRESS SEPERATOR CMPA TTYEOL CHECK FOR 'TTYSET END OF LINE' BEQ DFAUL!T YES, DEFAULT TO 16 LOCATIONS CMPA #CR CHECK FOR CR BNE GETEND DFAULT LDD #16 DEFAULT TO DUMP 16 LOCATIONS BRA NOINC GETEND JSR GETHEX GET ENDING ADDRESS LBCS HEXERR BAD ADDRESS.. TSTB CHECK FOR ANY ADDRESS? LBEQ MISADD NO. CMPX BEGADD,PCR CHEC! K FOR END! OPT PAG OPT NOG TTL NEWFILES UTILITY PAG * * NEWFILES UTILITY PROGRAM * * CONVERTED TO SHOW ONLY NEW FILES. * CONTROLLED BY DATE ON COMMAND LINE. * SYNTAX: NEWFILES 1 1 83 * THIS WILL DISPLAY ALL FILES ON THE "ASN"ED * WORKING DRIVE CREATED JA! NUARY FIRST, 1983 * OR LATER IN THE SAME FORMAT AS THE TSC * FILES UTILITY. * MODS BY KENT MEYERS. * APRIL 25,1983 * * THE BULK OF THE CODE IS: * COPYRIGHT (C) 1978 BY * * TECHNICAL SYSTEMS CONSULTANTS, INC. * P.O. BOX 2574 * WEST LAFAYETTE, INDIANA 47!!906 * (317) 423-5465 * GLOBAL VARIABLES EOL EQU $CC02 WIDTH EQU $CC04 FCB EQU $C840 WASN EQU $CC0C LSTTRM EQU $CC11 ASN EQU WASN SPC EQU $20 FMS EQU $D406 WARMS EQU $CD03 GETCHR EQU $CD15 PUTCHR EQU $CD18 PSTRNG EQU $CD1E PCRLF EQU $CD24 NXTCH EQU $C!"D27 OUTDEC EQU $CD39 RPTERR EQU $CD3F INDEC EQU $CD48 ORG $C100 FIL BRA FIL1 VN FCB 1 VERSION NUMBER DATE FCB 0,0,0 COUNT FCB 0 COL FCB 0 NPL FCB 0 VALUE FDB 0 * PROGRAM HERE GETDAT JMP GETDT1 FIL1 LDAA WIDTH GET WIDTH BEQ FIL12 SET? ASRA DIVID!#E BY 16 ASRA ASRA ASRA BRA FIL15 FIL12 LDAA #5 SET DEFAULT FIL15 STAA NPL SET NUM PER LINE JSR PCRLF PRINT CR & LF * GET DATE FROM COMMAND LINE. DATE1 LDAA LSTTRM CHECK TERM CHAR CMPA #$D IS IT CR? BEQ DATE4 CMPA EOL IS IT EOL? BEQ DATE4 BS!$R GETDAT INPUT NUMBER BCS DATE4 ERROR? TSTA BEQ DATE4 CMPA #12 GREATER THAN 12? BHI DATE4 STAA DATE SAVE MONTH BSR GETDAT GET DAY NUMBER BCS DATE4 ERROR? TSTA BEQ DATE4 CMPA #31 GREATER THAN 31? BHI DATE4 STAA DATE+1 SAVE DAY BSR GETDAT G"ET YEAR NUMBER BCS DATE4 ERROR? CMPA #99 GREATER THAN 99? BHI DATE4 STAA DATE+2 SAVE YEAR * MAIN SUPERVISORY ROUTINE. LDX #FCB POINT TO FCB LDAA ASN GET DRIVE STAA 3,X SET IN FCB LDAA #16 OPEN SYSTEM REC STAA 0,X JSR FMS BNE ERR ERROR? JS"R GETIR GET FIRST RECORD BNE ERR ERROR? LDX #FILST POINT TO STRING JSR PSTRNG PRINT IT LDX #FCB+2 POINT TO DRIVE CLR 0,X CLR B JSR OUTDEC PRINT IT LDX #COLST JSR PST JSR PDAT LDX #FINST JSR PST JSR PCRLF JSR PRDIR LDX #SIGST JSR PSTRNG " JSR PCRLF JSR PCRLF PRINT CR & LF JMP WARMS RETURN TO FLEX * REPORT SYNTAX ERROR DATE4 EQU * SERR LDX #FCB POINT TO FCB LDAB #26 SET IN ERROR STAB 1,X * REPORT DISK ERROR ERR JSR RPTERR REPORT ERROR ERR2 JMP WARMS RETURN TO FLEX * PRINT DIREC" TORY LIST PRDIR CLR COL LDX #FCB POINT TO FCB LDAA #6 OPEN DIRECTORY STAA 0,X JSR FMS BNE ERR ERRORS? PRDIR2 JSR PCRLF PRINT CR & LF PRDIR3 JSR GETIR GET INFO RECORD BEQ PRDI32 ERRORS? JMP PRDIR6 PRDI32 LDX #FCB POINT TO FCB TST 4,X NAME PRESE" NT? BNE PRDI34 TST COL CHECK COLUMN BEQ PRDI33 JSR PCRLF PRINT CR & LF PRDI33 RTS PRDI34 BMI PRDIR3 DELETED NAME? LDAA 15,X CHECK C PROT ANDA #$10 BNE PRDIR3 * COMPARE THE DATES. LDX #FCB+25 LDAA 2,X CMPA DATE+2 BHI PRDIR4 BNE PRDIR3 LDA" A 0,X CMPA DATE BHI PRDIR4 BNE PRDIR3 LDAA 1,X CMPA DATE+1 BLO PRDIR3 * FILENAME OUTPUT. PRDIR4 LDX #FCB+4 POINT TO NAME CLR COUNT LDAB #8 SET COUNTER JSR PRNAM PRINT NAME LDAA #'. OUTPUT PERIOD JSR PUTCHR LDAB #3 SET COUNT JSR PRNAM PRI" NT EXT INC COL BUMP COLUMN COUNT LDAA COL GET COUNT CMPA NPL MAX YET? BNE PRDI45 CLR COL CLEAR COUNT JMP PRDIR2 REPEAT PRDI45 LDAB #15 FILL SPACES SUBB COUNT PRDIR5 LDAA #$20 SETUP SPACE JSR PUTCHR OUTPUT IT DECB DEC THE COUNT BNE PRDIR5 JMP" PRDIR3 PRDIR6 LDAA 1,X GET ERROR TYPE CMPA #8 IS IT EOF? PRDI65 BEQ PRDIR7 JMP ERR REPORT ERROR PRDIR7 RTS * GET INFO RECORD GETIR LDX #FCB POINT TO FCB LDAA #7 GET IR CODE STAA 0,X JMP FMS CALL FMS * PRINT FILE NAME PRNAM LDAA 0,X GET CHARAC" TER BEQ PRNAM2 JSR PUTCHR OUTPUT CHAR INC COUNT BUMP COUNT PRNAM2 INX BUMP TO NEXT DECB BNE PRNAM RTS RETURN * PRINT STRING WITHOUT CR & LF PDATA LDAA 0,X GET CHARACTER BEQ PDATA2 NULL? JSR PUTCHR PRINT IT INX BUMP TO NEXT DECB DEC COUNT B" NE PDATA RTS RETURN PDATA2 CLR B RTS * INPUT DATE DIGIT GETDT1 JSR INDEC INPUT NUMBER BCS GETDA4 ERROR? TSTB NUMBER THERE? BEQ GETDA3 STX VALUE SAVE VALUE LDAA VALUE+1 GET LS PART CLC CLEAR ERRORS RTS GETDA3 SEC SET ERRORS GETDA4 RTS * PRIN" T DATE PDAT LDAA DATE GET MONTH LDX #MONTH POINT TO TABLE PDAT1 DECA CHECK DATE BEQ PDAT3 PDAT2 INX FIND MONTH STRING TST 0,X BNE PDAT2 INX BRA PDAT1 PDAT3 BSR PST GO PRINT IT LDAA #$20 OUTPUT SPACE JSR PUTCHR CLR VALUE LDAA DATE+1 GET DAY N" UMBER STAA VALUE+1 LDX #VALUE POINT TO IT CLRB CLEAR FLAG JSR OUTDEC PRINT DAY LDX #CST POINT TO STRING BSR PST PRINT IT LDAA DATE+2 GET YEAR STAA VALUE+1 CLRB LDX #VALUE POINT TO VALUE JSR OUTDEC PRINT YEAR RTS * PRINT STRING PST LDAA 0," X GET CHARACTER BEQ PST2 IS IT NULL? JSR PUTCHR OUTPUT CHARACTER INX BUMP TO NEXT BRA PST REPEAT PST2 RTS * TEXT STRINGS CST FCC ", 19",0 COLST FCC ", ",0 FINST FCC " to date.",0 * MONTH STRINGS MONTH FCC "January",0 FCC "February",0 FCC "March",0 FCC "April",0 FCC "May",0 FCC "June",0 FCC "July",0 FCC "August",0 FCC "September",0 FCC "October",0 FCC "November",0 FCC "December",0 * STRINGS FILST FCC "New files on Drive # ",4 SIGST FCC " ",4 END FIL " OLOAD The OLOAD command is used to load a .BIN file at an address other than the one specified in its 'ORG' statement. Use: +++OLOAD,, is a hex number which will be added to the load address of <filename> before it will be loaded into RAM. M @-%.O@3B%@&;0~> ? Illegal offset"* OFFSET LOAD * OLOAD,, * WHERE IS A HEX NUMBER THAT WILL BE * ADDED TO THE LOAD ADDRESS OF * BEFORE IS LOADED INTO RAM. * WRITTEN BY * WILLIAM W. PFEIFER * TEKTRONIX, INC. * COMPONENT ENGINEERING V"ERSION EQU 1 FCB EQU $C840 SYSTEM FILE CONTROL BLOCK GETFIL EQU $CD2D GET FILE NAME AND PUT INTO FCB RPTERR EQU $CD3F REPORT ERROR SETEXT EQU $CD33 SET FILE EXTENSION IN FCB GETHEX EQU $CD42 GET HEX NUMBER FROM LINE BUFFER OFFSET EQU $CC1B LOCATION TO "STORE LOAD OFFSET FMS EQU $D406 FILE MANAGEMENT SYSTEM LOAD EQU $CD30 FLEX'S FILE LOADER WARMS EQU $CD03 FLEX RE-ENTRY ADDRESS PSTRNG EQU $CD1E PRINT STRING POINTED TO BY X REGISTER * ORG $C100 OLOAD BRA OLOAD1 FCB VERSION OLOAD1 LDX #FCB JSR GETFI"L BCS ERROR CLRA LDX #FCB JSR SETEXT JSR GETHEX BCS ILLEGAL STX OFFSET LDX #FCB LDA #1 STA 0,X JSR FMS BNE ERROR LDA #$FF STA 59,X JSR LOAD BACK JMP WARMS ILLEGAL LDX #ILLMSG JSR PSTRNG BRA BACK ERROR JSR RPTERR BRA BACK ILLMSG FCC /Illegal offset/ FCB 4 END OLOAD " o@-%ц3#ׯ#ͯ%#%'l@'-&0Ľ_Y&@ &g$ ʆ;nh'\l4X YY5WSZ&İ>1?9&m5' 8,.&~? 0Z 0~B9&9ILLEGAL ADDRESS SPECIFIED.MAY THE EXISTING FILE BE DELETED? START ADDRESS .LT. END ADDRESS." ORG $C100 * * THIS PROGRAM SERVES TO COMPLIMENT THE FUNCTION OF THE * 'OLOAD' COMMAND. IT SAVES BINARY DATA IN A SPECIFIED * AREA OF RAM, TO A BINARY FILE, WITH AN ADDRESS OFFSET. * * THE FORMAT OF THE COMMAND IS: * * OSAVE,,,,[,] * *  IS THE NAME OF THE FILE TO RECIEVE THE BINARY * DATA. IT'S DEFAULT EXTENSION WILL BE .BIN. * *  IS A HEX ADDRESS SPECIFYING WHERE TO BEGIN * SAVING THE DATA. * *  IS A HEX ADDRESS SPECI"FYING WHERE THE SAVE IS * TO FINISH. * *  IS A HEX NUMBER, WHICH IS ADDED TO THE ADDRESSES * TO CREATE LOAD ADDRESS BLOCKS FOR THE BINARY FILE. * * [] IS AN OPTIONAL TRANSFER ADDRESS, WHICH WILL * APPEND A TRANSFER ADDRESS BLOCK "TO THE BINARY FILE. * * IF THE FILE SPECIFIED ALREADY EXISTS, THE USER WILL BE * ASKED IF THE EXISTING FILE MAY BE DELETED. IF THE USER * RESPONDS WITH ANYTHING OTHER THAN 'Y', CONTROL WILL * RETURN TO FLEX, WITH NO DAMAGE TO THE EXISTING FILE. I"F * THE USER RESPONDS WITH 'Y', THE EXISTING FILE WILL BE * DELETED, AND THE SAVE WILL COMMENCE WITH A NEW FILE. * * THIS PROGRAM IS HEREBY RELEASED TO THE PUBLIC DOMAIN. * ANY HOBBYIST MAY COPY AND USE THIS PROGRAM SO LONG AS * NO MONETARY GAIN I"S MADE, AND CREDIT TO THE ORIGINAL * AUTHOR IS MAINTAINED IN THE SOURCE CODE. * * BY: * * RICK BENSENE * 13502 S.E. HAROLD * PORTLAND, OREGON 97236 (503) 761-7301 * * VERSION 0, 4/82. * * NOTE: THIS PROGRAM ORIGINALLY WAS WRITTEN TO BE * POSI"TION INDEPENDENT. IT SHOULD RUN CORRECTLY WHEN * LOADED AT ADDRESSES OTHER THAN THE 'FLEX UTILITY * COMMAND SPACE'. (PROVIDED YOU DON'T OVERLOAD FLEX, OR * ANYTHING SILLY LIKE THAT!) * * * EQUATES * SYSFCB EQU $C840 FMS EQU $D406 FMSCLS EQU $D403 " * WARMS EQU $CD03 GETCHR EQU $CD15 PSTRNG EQU $CD1E GETFIL EQU $CD2D SETEXT EQU $CD33 RPTERR EQU $CD3F GETHEX EQU $CD42 * * BEGINNING OF CODE * OSAVE BRA BEGIN SKIP OVER LOCALS VERSN FCB 0 VERSION 0, 4/82 STARTA FDB 0 START ADDRESS STORAGE ENDA FDB 0 E"! ND ADDRESS STORAGE XFERF FCB 0 XFER ADDRESS FLAG XFERAD FDB 0 XFER ADDRESS STORAGE OFFSET FDB 0 SAVE OFFSET STORAGE * BEGIN CLR XFERF,PCR CLEAR XFER FLAG LDX #SYSFCB JSR GETFIL PARSE FILENAME LBCS BADFN FILE NAME BAD LDA #0 SET DEFAULT EXT TO .BIN "" JSR SETEXT LBSR ADDGET PARSE START ADDRESS LBLS ILLADD STX STARTA,PCR SAVE START ADDRESS LBSR ADDGET PARSE END ADDRESS LBLS ILLADD STX ENDA,PCR SAVE IT TOO TFR X,D CHECK FOR START>END ERROR CMPD STARTA,PCR LBLO BADAD IT DOAN WORK THAT WAY! L"# BSR ADDGET PARSE OFFSET LBLS ILLADD STX OFFSET,PCR SAVE OFFSET LBSR ADDGET ATTEMPT TO PARSE XFER ADDRESS LBCS ILLADD INVALID XFER ADDRESS BEQ NOXF NONE SPECIFIED. INC XFERF,PCR SET XFER FLAG NOXF STX XFERAD,PCR SAVE TRANSFER ADDRESS LDX #SYSFCB "$ FCB IN X FROM NOW ON OPENW LDA #2 ATTEMPT TO OPEN FOR WRITE STA ,X JSR FMS BEQ WOK IT OPENED OKAY. LDA 1,X ALREADY EXISTS? CMPA #3 LBNE ERR1 IF NOT THAT, THEN ERROR. LEAX DELEX,PCR ASK IF CAN KILL EXISTING FILE JSR PSTRNG JSR GETCHR GET RESPON# SE ANDA #$5F UPCASE IT CMPA #'Y IS IT YES? LBNE HOME IF NOT, GET OUT. LDX #SYSFCB PSTRNG KILLED FCB ADDR. LDA #12 KILL FILE STA ,X JSR FMS BNE ERR1 SOMETHING WENT WRONG. LDA 36,X RESTORE ZAPPED 1ST CHAR. OF STA 4,X THE FILENAME. BRA OPENW GO# OPEN NEW ONE WOK LDA #$FF SET BINARY MODE STA 59,X BLOCK LDD ENDA,PCR FIGURE OUT BYTE COUNT SUBD STARTA,PCR CMPB #$FF BEQ L1 INCB L1 LDA #2 WRITE START OF BLOCK BSR WRA PSHS B SAVE BYTE COUNT FOR A BIT LDY STARTA,PCR GET POINTER INTO Y TFR Y,#D FIGURE OUT 'REAL' ADDRESS ADDD OFFSET,PCR BSR WRADD AND WRITE IT PULS B RESTORE BYTE COUNT TFR B,A WRITE BYTE COUNT BSR WRA LOOP LDA ,Y+ GET BYTE OF BINARY BSR WRA WRITE IT DECB COUNT IT BNE LOOP MORE TO DO? STY STARTA,PCR SAVE START FOR NEX#T BLOCK LEAY -1,Y FIGURE OUT IF DONE CMPY ENDA,PCR BNE BLOCK NO, DO NEXT BLOCK. TST XFERF,PCR IS THERE A TRANSFER ADDR.? BEQ DONE NO. LDA #$16 WRITE XFER ADDR. RECORD. BSR WRA LDD XFERAD,PCR BSR WRADD DONE LDA #4 ATTEMPT TO CLOSE IT UP. STA ,#X JSR FMS BNE ERR1 OOPS... JMP WARMS ALL DONE! * * ERROR HANDLING * BADFN LDA #21 INVALID FILE NAME ERROR CODE STA 1,X ERR1 JSR RPTERR REPORT ERROR TO USER. JSR FMSCLS CLOSE UP SHOP BRA HOME BADAD LEAX ADMSG,PCR TELL 'EM OF BAD ADDRESS BRA ERROU#T ILLADD LEAX ILLMSG,PCR ERROUT JSR PSTRNG WRITE ERROR TEXT HOME JMP WARMS BACK TO OS * * SUBROUTINES * ADDGET JSR GETHEX GET HEX ADDRESS BITB #$FF SET CONDITIONS RTS WRADD BSR WRA GO WRITE WHAT'S IN A REG. TFR B,A GET B REGISTER WRA JSR FMS WRITE CHARACTER IN A REGISTER BNE ERR1 PROBLEM.. RTS * * ERROR TEXT & MESSAGES * ILLMSG FCC /ILLEGAL ADDRESS SPECIFIED./,$04 DELEX FCC /MAY THE EXISTING FILE BE DELETED? /,$04 ADMSG FCC /START ADDRESS .LT. END ADDRESS./,$04 END OSAVE #  ---???@-%uO3&hc;)o' ' &o 'B'hT&-'B%%]'@@ ~ &9@o?~)&9 &9'B%B%0ZB%]&'># @.)$  z & _SAV2 is a command to save discontiguous blocks of memory. The command is SAV2 filename. You are then prompted for each block to be saved - enter B ssss eeee for each. To end the process, use T tttt (for transfer address) or just T. #  OPT PAG TTL SAV2.CMD PAG * * BY HAL SNYDER, MD * PO BOX 311 * DEERFIELD, IL 60015 * * SAVE BLOCKS OF MEMORY TO DISK. * ALLOW LOAD ADDRESS DIFFERENT FROM * STARTING ADDRESS OF DATA IN RAM. * TO USE, ENTER SAV2 filename * DEFAULT EXTENSION IS .BIN; # ENTER BOUNDS AS * B xxxx yyyy OR B xxxx yyyy zzzz * xxxx IS STARTING ADDRESS OF DATA IN RAM * yyyy IS ENDING ADDRESS * zzzz IS ADDRESS WHERE DATA WILL BE LOADED, * IF DIFFERENT FROM xxxx. * SEVERAL SETS OF BOUNDS MAY BE ENTERED. * FINALLY, ENTER#  EITHER * T tttt OR T * tttt IS TRANSFER ADDRESS, IF ANY. * CRETN EQU $D EOT EQU 4 * EOLN EQU $CC02 FMS EQU $D406 FMSCLS EQU $D403 GETFIL EQU $CD2D GETHEX EQU $CD42 INBUFF EQU $CD1B LBPTR EQU $CC14 LBUF EQU $C080 LSTTRM EQU $CC11 NXTCH EQU $CD27 PST#RNG EQU $CD1E RPTERR EQU $CD3F SETEXT EQU $CD33 SYSFCB EQU $C840 WARMS EQU $CD03 * ORG $C100 START BRA ST FCB 1 VERSION LOWBD RMB 2 HIPLS1 RMB 2 LOADAD RMB 2 LENGTH RMB 2 PROMPT FCC /---/,EOT PROMTE FCC /???/,EOT * ST LDX #SYSFCB GET FILE NAME JSR G#ETFIL BCS ERRORB CLRA DEFAULT EXTENSION IS .BIN JSR SETEXT LDA #2 OPEN FOR WRITE STA ,X JSR FMS BNE ERRORB COM 59,X NO SPACE COMPRESSION LDY #CMDBUF SAVE COMMAND BUFFER, IF NEC. CLR ,Y CHKBUF JSR NXTCH CMPA #CRETN BEQ GETLIN CMPA EOLN BN#E CHKBUF LDX LBPTR SAVE NEEDED BSR CMDMOV GETLIN LDX #PROMPT GET A LINE OF SPECIFICATIONS GETLN0 JSR PSTRNG JSR INBUFF JSR NXTCH CMPA #'B BEQ BOUNDS CMPA #'T BNE GETLN2 JSR NXTCH GET TRANSFER ADDR, IF ANY JSR GETHEX BCS GETLN2 TSTB BEQ BYE# BRANCH IF NO TRANSFER ADDR. STX LOWBD LDX #SYSFCB LDA #$16 16 = TRANSFER RECORD BSR FMS1 LDA LOWBD BSR FMS1 LDA LOWBD+1 BSR FMS1 BYE LDA #4 CLOSE FILE LDX #SYSFCB STA ,X BSR FMS1 BSR RESTOR JMP WARMS * ERROR PROMPT GETLN2 LDX #PROMTE BRA# GETLN0 * SUBROUTINES FMS1 JSR FMS BNE ERRORA RTS ERRORA BSR RESTOR ERRORB JSR FMSCLS LDX #SYSFCB CLR 2,X ZAP FILE STATUS JSR RPTERR JMP WARMS * RESTOR LDX #CMDBUF PUT BACK PENDING COMMAND(S) LDA ,X BNE R2 RTS NOTHING TO RESTORE R2 STA LSTTRM# LDY #LBUF STY LBPTR CMDMOV LDA ,X+ STA ,Y+ CMPA #CRETN BNE CMDMOV RTS * BACK TO MAIN PROG BOUNDS JSR NXTCH GET BOUNDS & STORE ON DISK JSR GETHEX BCS GETLN2 STX LOWBD JSR GETHEX BCS GETLN2 LEAX 1,X INX STX HIPLS1 JSR GETHEX BCS GETLN2 T# STB IF NO LOAD ADDR GIVEN, BNE Z1 DEFAULT IS DATA START ADDR. LDX LOWBD Z1 STX LOADAD OUTREC LDD HIPLS1 HOW MUCH TO STORE? SUBD LOWBD BEQ GETLN1 THIS BATCH DONE? CMPD #$00FF NO. BLS Z2 LDD #$00FF Z2 STD LENGTH SET RECORD LENGTH LDX #SYSFCB LD# A #2 2 = BINARY DATA RECORD BSR FMS2 LDA LOADAD BSR FMS2 LDA LOADAD+1 BSR FMS2 LDA LENGTH+1 BSR FMS2 LDY LOWBD LDD LOADAD ADDD LENGTH STD LOADAD OUTLP LDA ,Y+ MOVE DATA OUT BSR FMS2 DEC LENGTH+1 BNE OUTLP STY LOWBD BRA OUTREC * BRIDGE G ETLN1 LBRA GETLIN FMS2 LBRA FMS1 * CMDBUF RMB 124 * END START # o0 &¥-$~#'('!"%$k B%]9Q m+' | '| ¥} &}±&M E O3'4&"‚_Y&¥ &$ $?~o;} &[&¥& ߶&%L D?: 5'z & } '! '09¥&9ILLEGAL ADDRESS SPECIFIEDSTART GREATER THAN ENDMAY THˆE EXISTING FILE BE DELETED? # NAM SAVE COMMAND OPT PAG PAG ************************************************ * * EXPANDED SAVE UTILITY FOR FLEX 1/2/9 * * Saves memory as a TSC FLEX binary file * or memory image file. * * Program expanded by: Leo Taylor * * Calling format for FLE#X binary: * * SAVE FILENAME.EXT SSSS EEEE TTTT * * Saves normal FLEX binary file that can * be loaded with GET or used as a command. * Starting, Ending, and optional Transfer * addresses are in HEX. Default extension * is .BIN. Data is saved as follow#s: * * Block marker char ($02) * 16 bit block address * 8 bit block byte count * 0-255 bytes of data * * Additional blocks as required * * transfer marker char ($16) * 16 bit transfer address * * * * Calling format for memory image: * * SAVE FI#LENAME.EXT SSSS EEEE + * * Saves memory as a binary memory image * from starting address to ending address. * Unlike FLEX binary files there are no * block markers. File created is an exact * image of what is in memory. The default * extension for a me#mory image file is .MEM. * Can be helpful to recover from an EDITOR * crash by saving edit buffer. * PAG ************************************************ * * FLEX Address assignments: * * Change the next EQUATE for 6800/6809 * Use $A000 for 6800 or $C#000 for 6809 * FLEX EQU $C000 START OF FLEX BUFPNT EQU FLEX+$C14 GETCHR EQU FLEX+$D15 GETFIL EQU FLEX+$D2D GETHEX EQU FLEX+$D42 PCRLF EQU FLEX+$D24 PSTRNG EQU FLEX+$D1E RPTERR EQU FLEX+$D3F SETEXT EQU FLEX+$D33 WARMS EQU FLEX+$D03 FMS EQU FLEX+$1406# FMSCLS EQU FLEX+$1403 SPC 3 ************************************************ * * INITIAL SET UP * ORG FLEX+$100 UTILITY COMMAND SPACE SAVE BRA SAVE2 VN FCB 2 VERSION NUMBER START FDB 0 STARTING ADDRESS END FDB 0 ENDING ADDRESS TRNFER FDB 0 TRANFER#  ADDRESS TRNFLG FCB 0 1=TRANFER FOUND NORMAL FCB 0 0=MEMORY IMAGE BYTCNT FCB 0 BLOCK BYTE COUNTER SAVE2 LDX #START CLRTMP CLR 0,X CLEAR TEMPS INX CPX #BYTCNT+1 BNE CLRTMP SPC 3 ************************************************ * * PARSE COMMAND LIN#! E FOR FILE NAME * AND START/END ADDRESSES * PARSE LDX #FCB JSR GETFIL GET NAME OF FILE BCC NOERR JMP ERROR NOERR BSR GETNUM START BEQ BADNUM STX START BSR GETNUM END BEQ BADNUM STX END LDAA END CHECK START>END LDAB END+1 CMPA START BHI INO#" RDR BCS OUTORD CMPB START+1 BCC INORDR OUTORD LDX #ORDER BRA PNTERR REPORT ORDER SPC 3 * GET AND CHECK NUMBER * GETNUM JSR GETHEX READ COMMAND BUFFER BCS BADNUM TSTB RTS BADNUM LDX #ILEGAL PNTERR JSR PSTRNG BRA EXIT SPC 3 * PARSE FOR TRANSFE## R OR PLUS SIGN * INORDR LDX BUFPNT LDAA 0,X CMPA #'+ MEMORY IMAGE? BEQ OPEN INC NORMAL NORMAL BINARY MODE BSR GETNUM TRANSFER BEQ OPEN FOUND? STX TRNFER INC TRNFLG SPC 3 * SET EXTENSION AND OPEN * OPEN LDX #FCB LDAA #2 SET FOR WRITE STAA 0,X#$ TST NORMAL BNE NORML2 TST FCB+12 EXTENSION ALREADY? BNE OPEN2 LDAA #'M FORCE .MEM STAA 12,X STAA 14,X LDAA #'E STAA 13,X BRA OPEN2 NORML2 CLRA JSR SETEXT .BIN OPEN2 JSR FMS OPEN FOR WRITE BEQ OPENOK LDAA 1,X GET ERROR CMPA #3 FILE EXIS$ TS? ERROR2 BNE ERROR LDX #DELMSG DELETE ORIGINAL JSR PSTRNG JSR GETCHR ANDA #$5F CMPA #'Y YES DELETE? BNE EXIT LDX #FCB LDAA #12 STAA 0,X JSR FMS DELETE FILE BNE ERROR LDAA $24,X FIX NAME STAA 4,X BRA OPEN SPC 3 * ERROR AND EXIT ROUTINES$ * ERROR JSR PCRLF JSR RPTERR OUTPUT MESSAGE JSR FMSCLS EXIT JMP WARMS OPENOK CLR 0,X SERIAL WRITE LDAA #$FF STAA 59,X NO COMPRESSION TST NORMAL WHICH MODE? BNE NORML3 SPC 3 * WRITE MEMORY IMAGE TO DISK * LOOP BSR WRTMEM WRITE ONE BYTE BNE LOO$P SPC 3 * CLOSE FILE * CLOSE LDX #FCB LDAA #4 STAA 0,X CLOSE FILE JSR FMS ERROR3 BNE ERROR BRA EXIT SPC 3 * SAVE NORMAL FLEX BINARY FILE * NORML3 LDAA END+1 DETERMINE BLOCK SIZE SUBA START+1 LDAB END SBCB START BNE MAXSIZ CMPA #$FF BCS BUMP$UP MAXSIZ LDAA #$FE MAX SIZE $FF BUMPUP INCA STAA BYTCNT LDAA #2 BSR WRBYTE BLOCK MARKER LDAA START BSR WRBYTE START ADDRESS LDAA START+1 BSR WRBYTE LDAA BYTCNT BSR WRBYTE BYTE COUNT DATLOP BSR WRTMEM DATA BEQ DONE DEC BYTCNT BNE DATLOP B$RA NORML3 DONE TST TRNFLG ANY TRANSFER? BEQ CLOSE LDAA #$16 BSR WRBYTE TRANSFER MARKER LDAA TRNFER BSR WRBYTE TRANSFER ADDR LDAA TRNFER+1 BSR WRBYTE BRA CLOSE SPC 3 * WRITE TO DISK FILE * WRTMEM LDX START LDAA 0,X GET MEMORY BYTE BSR WRBYTE$ LDX START CPX END DONE? BEQ FINISH INX STX START FINISH RTS WRBYTE LDX #FCB WRITE BYTE JSR FMS BNE ERROR3 LDX START RTS SPC 3 * MESSAGES * ILEGAL FCC 'ILLEGAL ADDRESS' FCC ' SPECIFIED' FCB 4 ORDER FCC 'START GREATER THAN END' FCB 4 DELMSG FCC 'MAY THE EXISTING' FCC ' FILE BE DELETED? ' FCB 4 SPC 2 FCB RMB 320 END SAVE  @-%H@3@&4o;B%D]'IB%9]'>000'@'@?@'?~| FILE SPEC NOT HEX! INCOMPLETE FILE SPEC! $ * **** SAVTEXT **** *  * THIS UTILITY ALLOWS A FLEX USER TO SAVE ASCII FROM * MEMORY TO DISK AS TRUE .TXT FILES INSTEAD OF BINARY * FILES. ALL ERROR POSSIBILITIES ARE CHECKED FOR AND * REPORTED IF ENCOUNTERED. *  * FERROUS C. STEINKA * 18570 $ S.W. ALDERWOOD DRIVE * ALOHA, OREGON 97006 *  *  * *** FORM OF THE CALL IS *** * SAVTEXT,,, *  *  *  MAINORG EQU $C000 $A000 FOR FLEX II, $C000 FOR FLEX09 *  *  FCB EQU MAINORG+$840 GETFIL EQU MAINORG+$D2$ D TXT EQU 1 TEXT EXTENSION VALUE SETEXT EQU MAINORG+$D33 WRITE EQU 2 OPEN FOR WRITE COMMAND GETHEX EQU MAINORG+$D42 FMS EQU MAINORG+$1406 RPTERR EQU MAINORG+$D3F FILECLS EQU 4 FMS CLOSE FILE COMMAND WARMS EQU MAINORG+$D03 PSTRING EQU MAINORG+$D1E *  $ ORG MAINORG+$100 *  SAVTEXT BRA START BRANCH AROUND TEMPS *  FCB 1 THE VERSION NUMBER TEMP1 RMB 2 FOR THE START ADDRESS TEMP2 RMB 2 FOR THE END ADDRESS *  START LDX #FCB POINT TO THE FCB JSR GETFIL GET THE FILE SPEC BCS ERROR GO REPORT THE ERROR $  LDA A #TXT THE DEFAULT EXTENSION LDX #FCB POINT TO THE FCB JSR SETEXT PUT EXTENSION IN FCB LDX #FCB POINT TO THE FCB LDA A #WRITE OPEN FILE FOR WRITING STA A 0,X STORE COMMAND IN FCB JSR FMS CALL FILE MANAGEMENT SYSTEM BNE ERROR GO REPORT THE E$RROR CLR 59,X TURN ON SPACE COMPRESSION JSR GETHEX GET HEX WORD FROM BUFFER BCS HEXERR BUFFER DATA NOT HEX TST B IS THERE AN ENTRY? BEQ NOADD NO, GO REPORT IT STX TEMP1 THE CHARACTER POINTER JSR GETHEX GET HEX WORD FROM BUFFER BCS HEXERR BUFFER$ DATA NOT HEX TST B IS THERE AN ENTRY? BEQ NOADD NO, GO REPORT IT INX MAKE END = END + 1 INX STX TEMP2 TEXT END + 1 LOOP LDX TEMP1 THE CHARACTER POINTER LDA A 0,X GET THE CHARACTER INX UP THE CHARACTER POINTER STX TEMP1 POINT TO NEXT CHARACTER $ CPX TEMP2 TEXT END + 1 BEQ CLOSE ALL DONE, CLOSE FILE LDX #FCB POINT TO THE FCB JSR FMS WRITE CHARACTER TO FCB BEQ LOOP NO ERROR, DO IT AGAIN *  ERROR LDX #FCB POINT TO THE FCB JSR RPTERR TELL THE SAD NEWS *  CLOSE LDX #FCB POINT TO THE FCB LD$ A A #FILECLS THE CLOSE FILE COMMAND STA A 0,X STORE COMMAND IN FCB JSR FMS CALL FILE MANAGEMENT SYSTEM BEQ GOBACK NO ERRORS, RETURN JSR RPTERR TELL THE SAD NEWS GOBACK JMP WARMS RETURN CONTROL TO FLEX *  HEXERR LDX #HEXMSG POINT TO MESSAGE SNDMSG JSR PSTRING SEND IT TO TERMINAL BRA CLOSE NOW, GO CLOSE FILE *  NOADD LDX #ADDMSG POINT TO MESSAGE BRA SNDMSG GO SEND IT *  HEXMSG FCC /FILE SPEC NOT HEX!/ FCB $D,$A,4 *  ADDMSG FCC /INCOMPLETE FILE SPEC!/ FCB $D,$A,4 *  END SAVTEXT $USERV SWI3V SWI2V FIRQV IRQV SWIV SVCVO SVCVO ACIAADEKOFLGLS189 LS189AMONITRNEXTCMINCH INCHE INCHEKOUTCH PDATA PCRLF PSTRNGLRA START GETRNG GET4THX+GET2HX or +++SECTOR,+ where the file spec defaults$ to a TXT extension on the working drive, or DTTSS specifies the actual drive, track, and sector to start on. Using the DTTSS mode, the first digit in the buffer is the drive number, and the remaining digits are right justified to supply the track a$nd sector. Examples: +++SECTOR,0.FLEX.SYS +++SECTOR,+140A +++SECTOR,+00F02 The first displays the linkage of the file FLEX.SYS on drive 0. The second displays the linkage starting at track 04 sector 0A on drive 1 (one). The third is drive 0 track 0F sector 02. The linkage always ends with a sector linking to track/sector 00/00. $! OPT PAG NAM FILE SECTOR LIST UTILITY PAG * JOHN HIGLEY * COMPONENT ENGINEERING * TEKTRONIX, INC. * * System variables BUFPTR EQU $CC14 Line buffer pointer EOL EQU $CC02 TTYSET End-of-line character LASTRM EQU $CC11 Last non-alphanumeric character WR$"KDRV EQU $CC0C Working drive number * * System equates GETFIL EQU $CD2D Input file spec from buffer GETHEX EQU $CD42 Input HEX number from buffer NEXTCH EQU $CD27 Input character from buffer OUTADR EQU $CD45 Output HEX address OUTDEC EQU $CD39 Output d$#ecimal number PCRLF EQU $CD24 Output CR LF PSTRNG EQU $CD1E Output string PUTCHR EQU $CD18 Output single character RPTERR EQU $CD3F Report disk error SETEXT EQU $CD33 Set disk extension WARMS EQU $CD03 FLEX warm start * * FMS equates FMS EQU $D406 FMSC$$LS EQU $D403 FCB EQU $C840 * ORG $C100 SECT BRA SECT1 FCB 11 VERSION NUMBER 1.1 BLOCKS FDB 0 Count of individual blocks TEMP RMB 2 Temp for size of block START RMB 2 Starting trk/sec of block STOP RMB 2 Ending trk/sec of block CURREN RMB 2 Current tr%k/sec to read MAXSEC RMB 1 Maximum sector number * SECT1 LDX BUFPTR Check buffer for + LDA ,X CMPA #'+ BEQ SECNUM .EQ: + means trk/sec given LDX #FCB Get filename JSR GETFIL LBCS ERR Tell errors LDA #1 Operand for SETEXT STA 0,X JSR SETEXT Def%ault is .TXT NOP Necessary for debugging JSR FMS Open for read LBNE ERR Any error: tell it JSR FMS Read a character to get to file LBNE ERR Any error: tell it JSR PCRLF LDX FCB+30 Get starting trk/sec STX START LDX #FCB LDA #4 Close the file % STA 0,X Function for FMS JSR FMS LBNE ERR Report any error BRA SYSTEM Get maximum sector number * BADHEX LDX #FCB LDA #14 Illegal disk address STA 1,X Put into error byte LBRA ERR Tell it SECNUM LEAX 1,X Point to drive num in buffer STX BUFPTR %.fix pointer JSR PCRLF New line LDX #FCB Point to FCB JSR NEXTCH Read drive number ANDA #$3 Clear off garbage STA 3,X Put drive number into FCB JSR GETHEX Read trk/sec BCS BADHEX Not a HEX input TSTB Any number? BEQ BADHEX No number given STX% START Put it in start SYSTEM LDX #FCB Get max sector number LDD #0003 System information record STD 30,X Put into current trk/sec (FCB) LDA #09 Read single sector (FMS) STA 0,X Into function byte JSR FMS BNE ERR Report any error LDA 64+39,X 39t% h byte is max sector STA MAXSEC LDX START Restore starting track and sector SETNXT STX CURREN LDD CURREN Current is trk/sec to read INCB .Increment to compare to linkage CMPB MAXSEC Compare to max sector num BLS NXTSEQ LDB #1 Skip over gap INCA% NXTSEQ STD STOP Next sequential trk/sec into stop LDX #FCB LDD CURREN Put current into FCB STD 30,X LDA #9 Read single sector function STA 0,X JSR FMS .Read it BNE ERR .Tell any error LDX FCB+64 Get linkage from sector buffer CPX STOP Compare% it to calculated BEQ SETNXT .EQ: No break. read this one LDX CURREN Current is end of block STX STOP .move it to stop LDX FCB+64 Read linkage to next STX CURREN .save it JSR PRINT Output start stop and size INC BLOCKS+1 Up the counter of blocks% LDX CURREN Get back linkage BEQ DONE Zero is closing linkage STX START Linkage is start of new block BRA SETNXT Read on DONE LDX #CNTMSG JSR PSTRNG Output ending message LDX #BLOCKS Output number of blocks LDB #1 .no leading spaces JSR OUTDEC %  BRA DONE1 close eveything and go to FLEX * ERR JSR RPTERR Tell any disk errors DONE1 JSR FMSCLS close all files JMP WARMS Jump to FLEX PRINT LDX #START Output the start and end of block JSR OUTADR .Output start LDA #'- JSR PUTCHR .Output dash LDX%  #STOP JSR OUTADR .Output end LDA #$20 Space JSR PUTCHR .Output space * * Calculate the size of this block LDB START GET STARTING TRACK LDA MAXSEC MUL ADDB START+1 ADD STARTING SECTOR ADCA #0 STD TEMP LDB STOP GET ENDING TRACK LDA MAXSEC MU% L ADDB STOP+1 ADD ENDING SECTOR ADCA #0 ADDD #0001 Bump it one more SUBD TEMP Subtract starting number STD TEMP LDX #TEMP Output the size of the block LDB #1 .No leading spaces JSR OUTDEC JSR PCRLF RTS CNTMSG FCC 'NUMBER OF INDIVIDUAL BLOCKS:' FCB 4 END SECT % w-%lm &~7-h-B A K7 &57&)ow&o7&M''O'k~& }'n|f|^ ?7w~#s r( && 쎢7&w&z&92a2a~ EXTENSION REQUIRED% NAM SQUEEZE.CMD OPT PAG PAG * SQUEEZE FILE COMPRESSION COMMAND. * * SQUEEZE IS USED TO REMOVE EXTRA SPACE * FROM A FILE. FILES THAT WILL BENIFIT * FROM SQUEEZING ARE THOSE THAT ARE MADE * WITH APPEND.CMD OR THOSE WHERE DISKEDIT * WAS USED TO NULL OU%T PART OF A PROGRAM. * THIS PROGRAM WILL BE OF BENIFIT IF YOU * HAVE A LIMITED AMOUNT OF SPACE ON YOUR * SYSTEM DISK AND WANT TO SQUEEZE EVERY * LAST SECTOR OUT OF IT. * * IF TWO OR MORE FILES HAVE BEEN APPENDED * THERE IS A GOOD CHANCE THE NEWLY MADE %* FILE IS A SECTOR LONGER THAN NEED BE. IF * THE APPENDED PORTION OVERLAPS PART OF THE * ORIGINAL (EG ADDING NEW DRIVERS TO FLEX) * THAN THE ORIGINAL SECTION CAN BE NULLED * OUT AND THE SPACE RECOVERED WITH SQUEEZE. * ANOTHER EXAMPLE IS NULLING OUT THE% TEXT * HEADERS AT THE START OF SOME PROGRAMS AND * USING SQUEEZE TO RECOVER THE SPACE. * * * CALLING FORMAT: * * SQUEEZE FILENAME.EXT WORK DRIVE * SQUEEZE 2.FILENAME.EXT DRIVE 2 * * THE ORIGINAL FILE WILL BE RENAMED TO * .BAK AND THE SQUEEZED FI%LE WILL HAVE * THE ORIGINAL NAME AND EXTENSION. NOTE: * THE EXTENSION IS REQUIRED TO PREVENT * ACCIDENTAL SQUEEZING! * PAG * FLEX EQUATES * * ONLY ONE EQUATE NEED BE CHANGED FOR 6809. * FLEX EQU $A000 USE $C000 FOR 6809 BUFPNT EQU FLEX+$C14 WARMS EQU% FLEX+$D03 PSTRNG EQU FLEX+$D1E GETFIL EQU FLEX+$D2D RPTERR EQU FLEX+$D3F FMS EQU FLEX+$1406 ORG FLEX+$100 SPC 3 * START OF PROGRAM * START BRA START2 VN FCB 2 VERSION NUMBER COUNT FCB 0 BYTE COUNTER TEMP FDB 0 FLAG FCB 0 FOUND STARTING ADDR SPC 1 %START2 LDX BUFPNT STX TEMP TO BE REUSED LDX #FCB2 POINT TO DESTINATION FCB JSR GETFIL BCS ERROR TST 12,X ANY EXTENSION? BNE EXTOK JMP EXTERR EXTOK LDX TEMP STX BUFPNT RESTORE POINTER LDX #FCB1 POINT TO SOURCE FCB JSR GETFIL REREAD FILE NAME % LDX TEMP STX BUFPNT LDX #FCB1+49 SCRATCH BYTES AREA JSR GETFILE LDAA #'B BAK EXTENSION STAA 12,X LDAA #'A STAA 13,X LDAA #'K STAA 14,X LDX #FCB1 LDAA #13 RENAME FUNCTION STAA 0,X JSR FMS BNE ERROR LDX #FCB1 SOURCE FILE LDAA #1 STAA 0,% X JSR FMS BNE ERROR CLR 0,X SET FOR READ LDX #FCB2 LDAA #2 STAA 0,X JSR FMS OPEN FOR WRITE BNE ERROR CLR 0,X SET FOR WRITE CLR FLAG DEFAULT TO TEXT GETYPE LDX #FCB1 JSR FMS BNE ERROR TSTA NULL? BEQ GETYPE CMPA #2 BINARY FILE ? BEQ BINA% RY YES,BINARY FILE TYPE CMPA #$16 STARTING ADDRESS? BEQ STRADR PROCESS STARTING ADDRESS JMP TEXT NOT 0 OR 2 OR 16 SPC 3 * MULTI-PURPOSE ERROR SECTION * ERROR LDAA 1,X GET ERROR NUMBER CMPA #8 IS IT 8? BNE ERRBAD ERROR 8 IS EOF TST FLAG BEQ ERRO% K LDAA #$16 STARTING ADDRESS MARK LDAB #1 STAB COUNT BSR WRITE LDAA TEMP INC COUNT BSR WRITE LDAA TEMP+1 INC COUNT BSR WRITE BRA ERROK ERRBAD JSR RPTERR ERROK LDAA #$04 CLOSE FUNCTION LDX #FCB1 STAA 0,X JSR FMS LDAA #$04 CLOSE FUNCTION % LDX #FCB2 STAA 0,X JSR FMS WARMS2 JMP WARMS EXTERR LDX #NOEXTM JSR PSTRNG BRA WARMS2 SPC 3 * BINARY FILE SECTION * BINARY LDAB #$FF STAB FLAG INDICATE BINARY STAB FCB1+59 TURN OFF COMPRESSION STAB FCB2+59 LDAB #1 STAB COUNT BSR WRITE OUTPU% T 2 LDAB #3 OUTPUT ADR AND COUNT STAB COUNT BYTE COUNT BSR REDWRT STAA COUNT BYTE COUNT BSR REDWRT OUTPUT DATA BLOCK GETYP2 BRA GETYPE SPC 3 * START ADDRESS SECTION * STRADR JSR FMS GET START ADR BNE ERROR STAA TEMP SAVE ADR JSR FMS BNE ERROR% STAA TEMP+1 BRA GETYP2 SPC 3 * READ AND WRITE SECTION * READS THEN WRITES BYTE 'COUNT' TIMES * REDWRT LDX #FCB1 READ FILE JSR FMS GET BYTE BNE ERROR2 SPC 1 WRITE LDX #FCB2 WRITE FILE JSR FMS WRITE BINARY BYTE BNE ERROR2 DEC COUNT BNE REDWRT % RTS SPC 1 ERROR2 INS FIX STACK INS JMP ERROR SPC 3 * TEXT FILE PROCESSING * TEXT BSR WRITE WRITE FIRST CHARACTER TLOOP LDAA #255 MAXIMUM COUNT STAA COUNT BSR REDWRT BRA TLOOP LOOP TILL REDWRT EXITS SPC 3 * MESSAGES * NOEXTM FCC 'EXTENSION REQUIRED' FCB 7,4 FCB1 RMB 320 FCB2 RMB 320 END START % IRQ BEGA ENDA NMI SP PORADD PORECH XHI XLOW XTEMP SWIJMPBKPT BKLST TW DTEMP FBYTECTGIRQV JUMP CURSOR LOADSB BADDR GBYTE UOUTHL gOUTHR kOUTEEEOUTCHBuINCHSBxINEEE INCH8 INHEX PDAT%!A1~CHANGEOUT4HSOUT2HSOUTS START CONTRLSFE1 $PRINT 0LOOK sSFE S9 MTAPE1MCL E1A5 NMIV SEARCHGOTO SAVGETISACIABILD ACIAINACIOUTIN1 #IOUT @OPTL iPIAECH}PIAINIDELAY DELAY1CLEAR BREA%"K PNCHS9RDON 4RDOFF GPNCHONMPNCHOFSSTROBEWPUNCH vTABLE %#* * STANDARD LABEL FILE FOR SWTBUG ON THE 6800 * FOR USE OF THE 6800/6809 DISASSEMBLER, DYNAMITE * SPC 1 * TEMPORARY STORAGE LOCATIONS FCC "IRQ " FDB $A000 FCC "BEGA " FDB $A002 FCC "ENDA " FDB $A004 FCC "NMI " FDB $A006 FCC "SP " FDB $%$A008 FCC "PORADD" FDB $A00A FCC "PORECH" FDB $A00C FCC "XHI " FDB $A00D FCC "XLOW " FDB $A00E FCC "XTEMP " FDB $A010 FCC "SWIJMP" FDB $A012 FCC "BKPT " FDB $A014 FCC "BKLST " FDB $A016 FCC "TW " FDB $A044 FCC "TEMP " FDB $A046 & FCC "BYTECT" FDB $A047 SPC 1 * SWTBUG SUBROUTINES & TEXT STRINGS FCC "IRQV " FDB $E000 FCC "JUMP " FDB $E005 FCC "CURSOR" FDB $E009 FCC "LOADSB" FDB $E00C FCC "BADDR " FDB $E047 FCC "BYTE " FDB $E055 FCC "OUTHL " FDB $E067 FCC "OUT&HR " FDB $E06B FCC "OUTEEE" FDB $E1D1 FCC "OUTCHB" FDB $E075 FCC "INCHSB" FDB $E078 FCC "INEEE " FDB $E1AC FCC "INCH8 " FDB $E1F6 FCC "INHEX " FDB $E0AA FCC "PDATA1" FDB $E07E FCC "CHANGE" FDB $E088 FCC "OUT4HS" FDB $E0C8 FCC "OUT2H&S" FDB $E0CA FCC "OUTS " FDB $E0CC FCC "START " FDB $E0D0 FCC "CONTRL" FDB $E0E3 FCC "SFE1 " FDB $E124 FCC "PRINT " FDB $E130 FCC "LOOK " FDB $E173 FCC "SFE " FDB $E18B FCC "S9 " FDB $E190 FCC "MTAPE1" FDB $E193 FCC "MCL " FD&B $E19D FCC "E1A5 " FDB $E1A5 FCC "NMIV " FDB $E1A7 FCC "SEARCH" FDB $E1AE FCC "GOTO " FDB $E1D0 FCC "SAVGET" FDB $E1D3 FCC "ISACIA" FDB $E1D9 FCC "BILD " FDB $E1F3 FCC "ACIAIN" FDB $E1FF FCC "ACIOUT" FDB $E212 FCC "IN1 " FDB $&E223 FCC "IOUT " FDB $E240 FCC "OPTL " FDB $E269 FCC "PIAECH" FDB $E27D FCC "PIAINI" FDB $E284 FCC "DELAY " FDB $E2C2 FCC "DELAY1" FDB $E2C5 FCC "CLEAR " FDB $E2CC FCC "BREAK " FDB $E2D9 FCC "PNCHS9" FDB $E31E FCC "RDON " FDB $E3'34 FCC "RDOFF " FDB $E347 FCC "PNCHON" FDB $E34D FCC "PNCHOF" FDB $E353 FCC "STROBE" FDB $E357 FCC "PUNCH " FDB $E376 FCC "TABLE " FDB $E3D1 SPC 2 * THAT'S ALL! FCC " " FDB $0000 SPC 1 END & Ďo0&B$ @?~]& * .4'+5&|@\ $ o'~!}' p}~'ÉȦȧ %y"u %q<"mL ã_9z ü _9 &   & h&& 000m& 6o 5ӽB%]&~=B%~o ~@V& O' ' O' #_<*ȅ< Ȇ<¡ O c&0 j'8@%3@   'R' 0 & Ȁz& m&00Z& &}&L /X~} & ,9A  9e~< FAST FORMAT FLAG FOUND EXTENDED DIR FLAG FOUND TRACKS PER SIDE: SECTORS PER TRACK:  ENTER MAX TRK,SEC (eg 22,0A o& r 4C,0F): BOOT NOT FOUND!THE BOOTSTRAP SECTOR: 00 )WAS LINKED TO SECTOR: VERIFY ERROR AT  HARDVERIFY COMPLETE āČėĬ                         &          !"#$%&'()*+,-./0123456789:;<=}' c}' B}'~9|u&9f' "߷M ֍5!ű'D# : &9' }'"XJ&ʠ94 /S$59"܎7\ }*0&9&  NAM TEST.CMD HIGH SPEED DISK VERIFY OPT PAG PAG * HIGH SPEED DISK TEST PROGRAM * * UTILITY FOR TESTING 5 AND 8 INCH SOFT * SECTOR DISKS WITH FD17X1 CONTROLLERS. * READS DISK QUICKLY BY USING PHYSICAL * ORDER OF SECTORS RATHER THAN THE FLEX * LOGICA&L ORDER. TESTS 3-4 TIMES FASTER * THAN TSC 'TEST.CMD'. REPORTS SOFT AND * HARD ERRORS. NORMALLY USED WITH DISKS * THAT HAVE SIR AT TRACK 0 SECTOR 3. IF * THE DISK DOES NOT HAVE AN SIR THE USER * WILL BE PROMPTED FOR NUMBER OF SECTORS * AND TRACKS. NON-&STANDARD DISKS WILL BE * TESTED IN THE SLOWER LOGICAL ORDER. IF * CONTROLLER IS DMAF-1 SET DMAFLG TO 1 * * THIS PROGRAM WILL REPORT THE NUMBER OF * TRACKS PER SIDE AND SECTORS PER TRACK. * ALSO REPORTED IS THE TRACK ZERO SECTOR * THE BOOTSTRAP WAS FOUN&D ON AS WELL THE * SECTOR THE BOOTSTRAP LINKS. AN OPTION * ALLOWS TESTING OF TRACK ZERO ONLY. * * THIS PROGRAM WILL TEST THE LAST 2 BYTES * OF THE SIR TO DETERMINE THE ORDER OF * THE SECTORS ON THE DISK AND IF THE * DIRECTORY EXTENDS THROUGH TRACK 1. I&F * THE FAST FORMAT FLAG IS ZERO THAN * THIS PROGRAM WILL ASSUME THE STANDARD * TSC FORMAT. IF THAT BYTE IS NOT ZERO * THE DISK WILL BE TESTED WITH THE SWTP * FAST SECTOR ORDER. IF THE FORMAT DOES * NOT AGREE WITH THE FLAG THE DISK WILL * STILL BE TEST&ED BUT AT A SLOWER RATE. * IF THE DIRECTORY EXTENSION FLAG IS NOT * ZERO THIS WILL BE REPORTED. * * THIS PROGRAM WILL OPERATE WITH MF-68 * OR DMAF-1 TYPE CONTROLLERS. TWO FLAGS * MUST BE SET UP BEFORE ASSEMBLY: * * DMAFLG USED FOR DMAF-1 CONTROLLER *& USEMFLG USED IF DRIVES 0/1 ARE DMAF * AND DRIVES 2/3 ARE MF68 AND * USEMF.CMD HAS BEEN LOADED. * * * CALLING FORMAT: * * TEST WORK DRIVE COMPLETE TEST * TEST 2 DRIVE 2 COMPLETE TEST * TEST 1 + DRIVE 1 TRACK ZERO ONLY * * ERROR REPORTS: * &* VERIFY ERROR AT TT SS (ONE READ ERROR) * VERIFY ERROR AT TT SS HARD (MANY READ ERRORS) PAG * ADDRESS ASSIGNMENTS: * * USE $A000,$8018,$9000 FOR 6800 * USE $C000,$E018,$F000 FOR 6809 * FLEX EQU $C000 START OF FLEX MF68 EQU $E018 MF-68 CONTROLLER & DMAF EQU $F000 DMAF CONTROLLER ORG FLEX+$100 FCB EQU FLEX+$840 FILE CONTROL BLOCK WASN EQU FLEX+$C0C WORK DRIVE ASSIGNED WARMS EQU FLEX+$D03 PUTCHR EQU FLEX+$D18 INBUFF EQU FLEX+$D1B PSTRNG EQU FLEX+$D1E NXTCH EQU FLEX+$D27 ADDBX EQU FLEX+$D36 OUTD& EC EQU FLEX+$D39 OUTHEX EQU FLEX+$D3C RPTERR EQU FLEX+$D3F GETHEX EQU FLEX+$D42 FMS EQU FLEX+$1406 OFSET EQU $C000-FLEX OFFSET EQU OFSET/64 FIX FLEX INCONSISTANCY READ EQU FLEX+$1E00+OFFSET $BE80 OR $DE00 RESTOR EQU READ+9 SPC 3 * ENTRY POINT AND TEM& PS * START BRA CLRVAR VN FCB 2 VERSION NUMBER DMAFLG FCB 0 0=MF68 1=DMAF-1 USEMFL FCB 0 0=DMAF 1=MF68 2/3 FSTFLG RMB 1 FAST FORMAT SYSFLG RMB 1 DISK SYSTEM IN USE T0ONLY RMB 1 TRACK ZERO ONLY MAXTRK RMB 2 TRKS PER SIDE MAXSEC RMB 2 SECS PER TRK TRK& NOW RMB 1 CURRENT TRACK SECNOW RMB 1 CURRENT SECTOR SECCNT RMB 1 SECTOR COUNTER DRIVE RMB 1 SELECTED DRIVE TEMP RMB 2 GENERAL PURPOSE TEMP2 RMB 2 GENERAL PURPOSE TBLPNT RMB 2 START OF SECTOR TABLE FDFLIP RMB 2 F&D START SIDE TWO FDSIDE RMB 1 SIDE BYTE & F&D PAG * CLEAR VARIABLE AREA * CLRVAR LDX #FSTFLG CLOOP CLR 0,X INX CPX #FDSIDE+1 BNE CLOOP SPC 3 * PARSE INPUT LINE FOR DRIVE NUMBER * PARSE JSR GETHEX GET DRIVE NUMBER BCC GOTNUM BADRIV LDAA #15 ILLEGAL DRIVE NUMBER LDX #FCB STRERR STAA 1,X S&TORE ERROR IN FCB ERROR JSR RPTERROR JMP WARMS GOTNUM TSTB BNE DRIVEFOUND LDAA WASN USE WORK DRIVE BPL GOTIT LDAA #1 ONE FOR ALL BRA GOTIT DRIVEF STX TEMP LDAA TEMP+1 GET DRIVE BYTE CMPA #3 MAX DRIVE BGT BADRIVE PSHA SAVE DRIVE JSR NXTCH G&ET OPTION CMPA #'+ PULA BNE GOTIT INC T0ONLY SELECT OPTION GOTIT LDX #FCB STAA 3,X STORE DRIVE IN FCB STAA DRIVE JSR CONTYPE SET CONTROLLER TYPE JSR RESTORE USE FLEX DRIVE SELECT BCC TRYSIR LDAA #16 NOT READY BRA STRERR SPC 3 * READ SYSTEM& INFORMATION RECORD FOR MAXIMUM * TRACK AND SECTOR NUMBER. IF THE SIR CAN'T * BE READ OR IF DATA IS UNRELIABLE THE USER * IS PROMPTED TO ENTER MAX TRACK AND SECTOR. * TRYSIR LDAA #9 STAA 0,X READ MODE CLR 30,X TRACK ZERO LDAA #3 STAA 31,X SECTOR 3 & JSR FMS BEQ NOTBAD JMP BADATA UNABLE TO READ SIR NOTBAD TST FCB+319 FAST FORMAT FLAG BEQ NOTFST LDX #FSTMSG JSR PSTRNG LDAA #$80 MASK STAA FSTFLG INDICATE FAST NOTFST TST FCB+318 EXTENDED DIR FLAG BEQ NOTEXT LDX #EXTMSG JSR PSTRNG NOTEXT LD&AA FCB+$66 GET MAX TRACK LDAB FCB+$67 GET MAX SECTOR TRYLOOP CMPA #9 MINIMUM TRACK BLO BADATA CMPA #156 MAXIMUM TRACK BHI BADATA CMPB #9 MINIMUM SECTOR BLO BADATA CMPB #60 MAXIMUM SECTOR BHI BADATA INCA NEEDED FOR REPORT STAA MAXTRK+1 SAVE MA&XIMUMS STAB MAXSEC+1 LDX #TRKMSG JSR PSTRNG LDX #MAXTRK CLRB JSR OUTDEC REPORT TRACKS DEC MAXTRK+1 LDX #SECMSG JSR PSTRNG LDX #MAXSEC CLRB JSR OUTDEC REPORT SECTORS LDAB MAXSEC+1 CMPB #20 5 IN DOUBLE? BNE NOT5D LDAA #$20 F&D SECOND SIDE&  STAA FDSIDE LDAA #10 STAA FDFLIP BRA NOT8D NOT5D CMPB #30 BNE NOT8D LDAA #$B0 STAA FDSIDE F&D SECOND SIDE LDAA #15 STAA FDFLIP NOT8D ORAB FSTFLG SET BIT 7 IF FAST LDX #FTABLE TABLE OF FORMATS SEARCH CMPB 0,X SEARCH THROUGH TABLE BNE NOTYET&! LDX 1,X GET TABLE START BRA SAVTBL NOTYET INX MOVE DOWN TABLE INX INX TST 0,X TABLE ENDS WITH 0 BNE SEARCH LDX #TABLEX ALL NON-STANDARD FORMATS SAVTBL STX TBLPNT LDAB MAXSEC+1 JSR ADDBX FIND END OF TABLE CLR 0,X MARK END OF TABLE BRA CHKBO&"OT READY FOR TEST SPC 3 * PROMPT USER FOR MAX TRACK AND SECTOR * BADATA LDX #MAXMES JSR PSTRNG DISPLAY MESSAGE JSR INBUFF GET RESPONSE JSR GETHEX BCS BADATA TSTB RETURN? BNE NOTCR JMP EXIT NOTCR STX TEMP2 USE AS WORK AREA JSR GETHEX BCS BADA&#TA LDAA TEMP2+1 GET TRACK STX TEMP2 LDAB TEMP2+1 GET SECTOR JMP TRYLOOP SPC 3 * LOOK FOR BOOTSTRAP AND REPORT * CHKB2 CLR $1E,X TRACK 0 STAA $1F,X LDAA #9 STAA 0,X READ COMMAND JMP FMS CHKBOOT LDX #FCB LDAA CHKBOOT EXAMINE LDX CMPA #$CE 680&$0 BNE NO6800 CLRA FIRST TRY BSR CHKB2 BEQ GOTBOOT LDAA #1 BRA IS6800 NO6800 LDAA #1 FIRST TRY BSR CHKB2 BEQ GOTBOOT CLRA IS6800 BSR CHKB2 BEQ GOTBOOT NOBOOT LDX #BOOTM1 BAD BOOT MESSAGE JSR PSTRNG BRA VERIFY DO REMAINDER OF DISK GOTBOOT L'DX #BOOTM2 JSR PSTRNG LDX #FCB+$1F SECTOR JUST READ JSR OUTHEX LDX #BOOTM3 JSR PSTRNG LDX #FCB+$45 LINK.CMD WRITES HERE JSR OUTHEX LDAA #$20 JSR PUTCHR LDX #FCB+$46 JSR OUTHEX SPC 3 * VERIFY ALL TRACKS QUICKLY BY USING * FAST READ AND TRACK' SKEWING * VERIFY LDAA MAXSEC+1 STAA SECCNT LDX TBLPNT STX TEMP CLRA START AT ZERO VESEEK STAA TRKNOW JSR SEEK VELOOP LDX TEMP POINTS TO TABLE LDAB 0,X SECTOR BNE NOTEND LDX TBLPNT RESET POINTER LDAB 0,X NOTEND INX BUMP POINTER STX TEMP STAB' SECNOW SAVE FOR ERROR JSR FSTRED HIGH SPEED READ BEQ GOODSEC JSR RPTSECT 'SOFT' ERROR BCS GOODSEC SKIP RETRIES IF BOOT LDX #FCB SET UP FMS LDAA TRKNOW STAA $1E,X LDAA SECNOW STAA $1F,X LDAA #9 READ MODE STAA 0,X JSR FMS READ SEVERAL TIMES ' BEQ GOODSEC LDX #HARDMES PDATAZ LDAA 0,X BEQ DROPHEAD JSR PUTCHR PRINT HARD MESSAGE INX BRA PDATAZ VESEE2 BRA VESEEK ISLAND DROPHED LDAA TRKNOW LDAB #2 DUMMY SECTOR LDX #FCB+$40 JSR READ INSURE HEAD DOWN SPC 3 * ADVANCE TO NEXT SECTOR. IF 'LAST IN TRACK * THEN SKEW IN SIX SECTORS. * GOODSE DEC SECCNT BNE VELOOP NXTTRK LDAB MAXSEC+1 RESET COUNTER STAB SECCNT LDAB #6 TRK TO TRK SKEW LDX TEMP SKEWLO TST 0,X BNE NOTEN2 LDX TBLPNT RESET POINTER DEX NOTEN2 INX ADD SKEW TO TEMP DECB B'NE SKEWLOOP STX TEMP LDAA TRKNOW BNE NOTZERO TST T0ONLY OPTION SET? BNE EXIT NOTZER INCA CMPA MAXTRK+1 BLE VESEE2 NOP CLI ALLOW SPOOLER LDX #DONEMES JSR PSTRNG ALL DONE EXIT JMP WARMS SPC 3 * REPORT BAD SECTOR * RPTSEC TST TRKNOW BNE REPOR'T LDAA SECNOW CMPA #3 TRK 0 SEC 3 IS SIR BGE REPORT SKIP REPORT FOR BOOT SEC FLAG REPORT DELETED RTS REPORT LDX #VERRMES LDAB TRKNOW BSR PNTNUM BAD TRK LDAA #$20 SPACE JSR PUTCHR LDAB SECNOW BSR PNTNU2 BAD SEC CLC FLAG NORMAL RTS PNTNUM ' JSR PSTRNG PRINT MESSAGE PNTNU2 STAB TEMP2 USE AS TEMP LDX #TEMP2 JMP OUTHEX SPC 3 * MESSAGES * FSTMSG FCB $D,$A FCC /FAST FORMAT FLAG FOUND/ FCB 4 EXTMSG FCB $D,$A FCC /EXTENDED DIR FLAG FOUND/ FCB 4 TRKMSG FCB $D,$A FCC /TRACKS PER SIDE: / ' !FCB 4 SECMSG FCC /SECTORS PER TRACK: / FCB 4 MAXMES FCB $D,$A,$D,$A FCC 'ENTER MAX TRK,SEC (eg 22,0A or 4C,0F): ' FCB 4 BOOTM1 FCC /BOOT NOT FOUND!/ FCB 7,4 BOOTM2 FCC /THE BOOTSTRAP SECTOR: 00 / FCB 4 BOOTM3 FCC /WAS LINKED TO SECTOR: / FCB 4 V' "ERRME FCC /VERIFY ERROR AT / FCB 4 HARDME FCC / HARD/ FCB 0 SPECIAL TERMINATOR DONEME FCC /VERIFY COMPLETE/ FCB 4 SPC 3 * SECTOR FORMAT TABLES * FTABLE FCB 10 FIVE INCH SINGLE FDB TBL5S FCB $80+10 BIT 7=FAST FDB TBL5SF FCB 20 FIVE INCH DOUBLE ' #FDB TBL5D FCB $80+20 FDB TBL5DF FCB 15 EIGHT INCH SINGLE FDB TBL8S FCB $80+15 FDB TBL8SF FCB 30 EIGHT INCH DOUBLE FDB TBL8D FCB $80+30 FDB TBL8DF FCB 0 END OF TABLE TBL5S FCB 1,3,5,7,9,2,4,6,8,$A,0 TBL5SF FCB 1,6,4,9,2,7,5,$A,3,8,0 TBL5D ' $FCB 1,3,5,7,9,2,4,6,8,$A FCB $B,$D,$F,$11,$13,$C FCB $E,$10,$12,$14,0 TBL5DF FCB 1,6,4,9,2,7,5,$A,3,8 FCB $B,$10,$E,$13,$C,$11 FCB $F,$14,$D,$12,0 TBL8S FCB 1,6,$B,3,8,$D,5,$A,$F,2 FCB 7,$C,4,9,$E,0 TBL8SF FCB 1,6,$B,4,9,$E,2,7,$C FCB 5,$A,$F,' %3,8,$D,0 TBL8D FCB 1,6,$B,3,8,$D,5,$A,$F,2 FCB 7,$C,4,9,$E,$10,$15,$1A,$12,$17 FCB $1C,$14,$19,$1E,$11,$16,$1B,$13 FCB $18,$1D,0 TBL8DF FCB 1,6,$B,4,9,$E,2,7,$C FCB 5,$A,$F,3,8,$D,$17,$1C,$10,$15 FCB $1A,$13,$18,$1D,$11,$16,$1B FCB $14,$19,$1E,'&$12,0 TABLEX FCB 1,2,3,4,5,6,7,8,9,10 FCB 11,12,13,14,15,16,17,18,19,20 FCB 21,22,23,24,25,26,27,28,29,30 FCB 31,32,33,34,35,36,37,38,39,40 FCB 41,42,43,44,45,46,47,48,49,50 FCB 51,52,53,54,55,56,57,58,59,60 FCB 61 SPC 3 * DRIVER SECTION SELECT''S MF68 OR DMAF * CONTYP TST DMAFLG BEQ MTYPE BRA DTYPE SEEK TST SYSFLG BEQ MSEEK BRA DSEEK FSTRED TST SYSFLG BEQ MFSTRD JMP DFSTRD SPC 3 * DRIVER FOR F & D MDI-1 OR SWTP MF-68 * * LOCAL ADDRESS EQUATES: * MCOMRG EQU MF68 1771 COMMAND RGISTER M'(TRKRG EQU MCOMRG+1 TRACK MSECRG EQU MCOMRG+2 SECTOR MDATRG EQU MCOMRG+3 DATA SPC 3 * SET UP CONTROLLER * MTYPE CLR SYSFLG SET MF68 RTS SPC 3 * SEEK TRACK * MSEEK STAA MDATRG BSR DELAY LDAA #$1B SEEK STAA MCOMRG BSR DELAY MREADY LDAA MCOMRG BITA') #1 BUSY BIT BNE MREADY BITA #$18 ERROR MASK RETRN RTS SPC 3 * READ QUICKLY WITHOUT HEADLOAD DELAY * MFSTRD STAB MSECRG BSR DELAY LDAA FDSIDE BEQ NOSIDE NOT NEEDED CMPB FDFLIP FLIP TO SIDE 1? BHI NOFLIP ANDA #$DF CLR SIDE BIT NOFLIP STAA MCOMR'*G-3 F&D REGISTER NOSIDE NOP SEI STOP SPOOLER LDAA #$88 READ WITHOUT DELAY STAA MCOMRG BSR DELAY BRA MREADY WAIT TILL DONE SPC 3 * DRIVER FOR DMAF1 * * LOCAL ADDRESS EQUATES * ADDREG EQU DMAF FIRST ADDRESS FOR DMA CNTREG EQU DMAF+$02 BYTES TO BE T'+RANSFERED CCREG EQU DMAF+$10 PRIREG EQU DMAF+$14 DCOMRG EQU DMAF+$20 1771 COMMAND AND STATUS DTRKRG EQU DMAF+$21 1771 TRACK DSECRG EQU DMAF+$22 1771 SECTOR DDATRG EQU DMAF+$23 1771 DATA DRVREG EQU DMAF+$24 * SEEK TRACK * DSEEK BSR SETSID CMPA DTRKRG ', BEQ DELAY ALREADY THERE? STAA DDATRG LDAA #$1C SEEK STAA DCOMRG BSR DELAY DREADY NOP LDAA DCOMRG BITA #1 BNE DREADY RTS SPC 3 * SET UP CONTROLLER * DTYPE LDAB #1 STAB SYSFLG DMA SYSTEM LDAA DRIVE 0-3 BEQ CONTY2 TST USEMFLG USE MINIFLOPPY '- BEQ DRLOOP CMPA #1 BHI MTYPE SWITCH BACK TO MF68 DRLOOP ASLB SHIFT DRIVE BIT DECA BNE DRLOOP CONTY2 ORAB #$A0 B=A1 A2 A4 OR A8 STAB DRIVE DMA DRIVE CODE RTS SPC 3 * SET SIDE * SETSID LDAB DRIVE PSHA LDAA SECNOW CMPA #15 FIRST SIDE 8 INCH BL'.E SETSI2 ORAB #$10 CHANGE SIDE BIT SETSI2 COMB STAB DRVREG PULA DELAY BSR *+2 WASTE TIME BSR *+2 BSR *+2 BSR *+2 BSR *+2 RTS SPC 3 * FAST READ CHECKS WITHOUT HEADLOAD DELAY * DFSTRD STAB DSECRG BSR SETSID LDX #$FFFF-FCB-$40 LOAD DATA HERE S'/TX ADDREG LDX #$FFFF-256 BYTES TO TRANSFER STX CNTREG NOP SEI STOP SPOOLER LDAB #$FD STAB CCREG INCB STAB PRIREG LDAA #$88 READ WITHOUT DELAY STAA DCOMRG LDX #$F000 TIME OUT LIMIT FSTRE2 TST CCREG BPL FSTRE3 DEX BNE FSTRE2 FSTRE3 LDX #$FF0FF STX PRIREG BSR DREADY BITA #$18 RTS SPC 2 END START '+ZG B A102-A103 W A104-A105 A A115-A120 ! Ρ~TEST STRING' 7P0 &b00 '0ٽ Ao7#+ 90 '0-% 3' ?~0ս-%3&0-%׆3&9 Z&z Z&90 '&9 & '.!$ ' '0&  ' *00& &ƀ /o *FV  _&0 +J %   Ş6'%3  % 0č33 6&7 6Z&+ '-9*_90N' &i  9 % 90n' 'FV''  +Ϧ+"'%  '5'&LĠ& 0č&0 &04&9~WORDSWAP OLDFILE NEWFILE WORDLISTREADING WORD LISTWORD PAIR IS TOO LONG: MEMORY OVERFLOWREADING TEXT FILEPROCESSING OUTPUT FILEDUPLICATE WORD IN LIST:  FINISHED' 7P0 &b00 '0ٽ Ao7#+ 90 '0-% 3' ?~0ս-%3&0-%׆3&9 Z&z Z&90 '&9 & '.!$ '  '0&  ' *00& &ƀ /o *FV  _&0 +J %   Ş6'%3  % 0č33 6&7 6Z&+ '-9*_90N' &i  9 % 90n'! 'FV''  +Ϧ+"'%  '5'&LĠ& 0č&0 &04&9~WORDSWAP OLDFILE NEWFILE WORDLISTREADING WORD LISTWORD PAIR IS TOO LONG: MEMORY OVERFLOWREADING TEXT FILEPROCESSING OUTPUT FILEDUPLICATE WORD IN LIST:  FINISHED'# NAM WORDSWAP COMMAND OPT PAG PAG ******************************************* * * WORDSWAP UTILITY FOR FLEX 9 * * Performs a high speed character string * replacement. Word pairs to be swapped * are read from a WORDLIST file. Program * is most useful'$ for changes that must * be done often, files larger than memory, * or when the number of pairs is large. The * original files are not destroyed. * * * Calling format: * * WORDSWAP OLDFILE.EXT NEWFILE.EXT WORDLIST.EXT * * Default extension for files is .TXT. * * OLDFILE is the file to be processed. * * NEWFILE is the destination file that * will be created. * * WORDLIST contains substitution word list * containing pairs of words separated by * a period. Alternately the word pair can be * preceeded,