m'"'~& 0&4팼059쌲'^׶' H*挋Ѷ$@ _ʌ״H*&!9]'Z&_On0oDISK NOT LINKED!ERROR LOADING DOS.EXTUTILMD!"  R" CRTSETCMD RUSERINFOCMD RSCANSCMD  RSCANNEWCMD  RSCANPCMD RBROWSECMD   RLOADCMD RDISKDUMPCMD RINITCMD RSAVETEXTCMD RREADTEXTCMD RREDIRECTCMD RREPLACECMD RBACKUPCMD RCRTSETTXT QUSERINFOTXT QSCANSTXT 1 QSCANNEWTXT 7 QSCANPTXT8 QBROWSETXT QLOADTXT QDISKDUMPTXT QINITTXT QRESTORETXT QREADTEXTTXT QREDIRECTTXT QREPLACETXT QBACKUPTXT  QSAVETEXTTXT ! QRESTORECMD!! R ACKUPTXT!"  R  3'%I_Ľ'%J_A'%A_B'=&60f408oɦġ&A' 0l& 2b ?m'V~@? ACAOFFNORREVEOLEOFERFHOM B%įab̰V'X:O9̰0E e_  O ':'$-~$1~E$ 00&90 =  C̼'0"M*O̰̲0Ƚ_PE& ځR&[ ҁW&v ʁC&#O̰̲009 H&̼la~4̰^L̲T̸N50 Q'0Ľ?0 .'0o~?̰̲0ƀ &/m'\'045 &4 5 ʁ&/4 5014 %Z 450 '? & 4 5 'M' #yˆ$s\&l4̰Y̲Q509̼B8̰;̲3o>o;0Jƀ & 4 5M' lZ&90&9~R(ead, W(rite, E(dit, C(ount, H(alt ? Character count=Buffer overflow; input tL erminatedĎTo -$?~m &3&0ٽ؎ƀHJK }N+4ļ}N+)'QM' &A &9|IIK&I}O+QO$>F&& $m'߽ļ  ]&}N+ 1&A}N+4ļsQ5& ]'}N+ M' &A & }Q+ сR&sO=T& ILM'E&RT$' & &_3\$4 5TW' &\J&0Iׁ0& JGKP BÈ&CKHP 0_S' &\+kP&0I43\$Q 5T ɁX&To ~~ @%_94L0L54L0+L5N^'#'T'T45NX9& }NL*94 j&5TDFHDo?|CT'|CF%0{8~CH&90t~4 ̸L9Q5' 9N' R_S&O90&9 # of lines on d4isplay?  Sector map full Error in reading fileI Ľ5Īo -$?~m &3&0,+HĠġ5uθl}Ĥ+7>}Ĥ+)'QM' &à &9|ğğġ&ğ}ĥ+ħĥ>+F&& >$m'߽ 7 l]&}Ĥ+ ė1&G}Ĥ+4X$>sħ5& l]'}Ĥ+ M' &à & }ħ+ сR&sĥ4T& ğĢģE&U5>Ū$' &> l&_3\$4l5Ūĭ' &\JĠ&0ğˁ0& ˆĠGġĦ B&FġHĦ 50_ĩ' &\J+eĦ&0ğ43\$Kl5Ū ɁX&Īo ̺ J~4̸̰̲5~4̰̲̺5@%_94̼54Ģ0Ģ54LľĢ0+Ģ54̰ġ̲̳5Ĥ^'#'Ī'Ū45ĤĮ9& }Ĥ*94 j&5ĪĚĜĞĚo?|ęĪ'|ę%0r,~ęĞ&90k~4Ģ95' 9N' Ĩ_S&ĥ94@0&5 # of lines on display?  Sector map full Error in reading file' %. COPYRIGHT 1981, DICK BARTHOLOMEWĽ@Ųo -$?~m &3&046ƀHŨũ@{w}Ŭ+7I&}Ŭ+)'QM' &ī &9|ŧŧũ&ŧ}ŭ+ůŭ>6F&& I$m'߽& B w]&}Ŭ+ 1&G}Ŭ+4c$I&sů5& w]'}Ŭ+ M' &ī & }ů+ сR&sŭ4T& ŧŪūE&U@IƲ$' &I w&_3\$4w5Ʋŵ' &\UŨ&0ŧÈā0& ŨGũŮ B&FũHŮ @0_ű' &\U+eŮ&0ŧ43\$Kw5Ʋ ɁX&Ųo ̺U~4̸̰̲̳5~4̰̲̳̺5@%_94̼54LŪ0Ū54Ū0+Ū54̰ũ̲̳5Ŭ^'#'Ų'Ʋ45ŬŶ9& }Ŭ*94 j&5ŲŢŤŦŢo?|šŲ'|šL%0o,~šŦ&90h~4Ū95' 9N' Ű_S&ŭ90&9 # of lines on display?  Sector map full Error in reading file  "o -$?~m &3o;&00H0% +&c & !& &4 +&5 599y &Z'f& 40׽5_F& ́B&(>HL4$0 &j&05 M&m'ooo0oward, B(ackward, J(ump, M(ore or E(xit?  B(egin or E(nd? @o -%Rm &O@3&8;B%4͍;m+ 4 쌺팺c쌱㌱挫 զ'@?~@&('&&4&4& 509@& &Z&9 @o -%}B%}4H% &5 5XXXX:焯z0v0U@m &3&/L@& &$  &&%*~? 0$ 4'5 9PZ&9 Illegal port # specified.) $B%+3A4056"~z 0oo -$?m &3B߽B" 0+~00;'? ⦠& ILLEGAL ADDRESSES SPECIFIED!!!e 0^o -$? )m &3B0@& ' ' ?~ 1?4 0 AE END OF FILE AT I B$?~"4_4H% &55 55XXXX:焿0  &B4B04B4B$5245'&$0ν905 ~4400?4AE 50"0S5_5Y&?0=3 X'$ 44<0 5Z&54&5 4 Z&5Replace? Occurance(s)  2 Q0@oJ&$0M0_Y& N&O5+00`0"M+0\0"M+'0t00ʽe00߽0ĈD &*f(- &f &$$1M&c om*0*{04qo1\m*& &o#c&L:LxLqk-ea#+0`$0 L 1?&<~ .M&c6 o000r0r_0Z&\m*& & oLɮ0LĿ&1a ~0[ &90_Z&y90)m ^&M94' 5L0H<,0~<0f40</'0% 90 0½? 0 085~" " ""$' ' ''$LLLL4Insert disk to be copied from into drive and disk to be copied to into drive then hit any key!Master Copy completedDrive to copy from - Drive to copy to - The disk in the "to" drive is formatted differently than the disk in the "from" drive; BACKUP aborted.Invalid drive numberRead  ,Wrote  to DISK BACKUP V3.2 Non-Standa/rd Disk Format; BACKUP abortedVerify Writes?  TTL CRTSET COMMAND - 11,15,81 * * MOD - : AS SEPERATOR CHARACTER DETECTED * NXTCH EQU $CD27 WARMS EQU $CD03 DFCB EQU $C840 RPTERR EQU $CD3F GETHEX EQU $CD42 CRTRAM EQU $CCB0 INDEC EQU $CD48 PUTCHR EQU $CD18 OUTADR EQU $CD45 PCRLF EQU $CD24 ORG $C100 START BRA START1 VN FCB 3 VERSION NUMBER VALID FCB 0 VALID COMMAND FOUND COUNT FCB 0 INDEX INTO TABLE XTEMP FDB 0000 TEMP FDB XTEMP1 FDB 0000 TEMP FDB START1 LEAU START-3,PCR MAKE WORKSPACE JSR NXTCH PULL CHAR FROM LINEBUF BCS DUMPPR NOT ALPHA; DUMP ALL START2 ANDA #$5F FIX UP LOWER CASE STA U SAVE JSR NXTCH 2ND CHAR BCS SYNERR ANDA #$5F STA 1,U SAVE AGAIN JSR NXTCH 3RD & LAST CHAR BCS SYNERR ANDA #$5F STA 2,U FINAL SAVE JSR NXTCH NOT EQUAL SIGN CMPA #'= BNE SYNERR LEAX TABEND,PCR PSHS X LEAX CMDTAB,PCR SYNTAX OK; DECODE CLR COUNT,PCR NXTCMD LDA U CMPA ,X BNE NMATCH LDD 1,U 1ST CHAR OK, NOW CHK LAST CMPD 1,X BEQ CMDMAT IF MATCH NMATCH LEAX 5,X INCREMENT TO NEXT COMMAND INC COUNT,PCR INCREMENT INDEX INTO TABLE CMPX S ARE WE DONE ? BNE NXTCMD IF NO BRA SYNERR YES, TYPO ERROR * CMDMAT LEAS 2,S STA VALID,PCR SET OK FLAG BRA HEXPRT GO TO ROUTINE * DU MPPR TST VALID,PCR IF 0, DUMP ALL LBEQ DMPCNT EXIT JMP WARMS * SYNERR LDX #DFCB LDB #$1A SYNTAX ERROR CODE STB 1,X JSR RPTERR TELL OPERATOR BRA EXIT BACK TO FLEX CMDTAB FCC 'ACA' ABSOLUTE CURSOR ADDRESS FDB HEXPRT FCC 'O FF' X-Y OFFSET BIAS FDB HEXPRT FCC 'NOR' NORMAL VIDEO FDB HEXPRT FCC 'REV' REVERSE VIDEO MODE FDB HEXPRT FCC 'EOL' ERASE TO END OF LINE FDB HEXPRT FCC 'EOF' ERASE TO END OF FRAME FDB HEXPRT FCC 'ERF' ERASE FRAME FDB HEXPRT FCC 'HOM' HOME CURSOR FDB HEXPRT TABEND FCB 0 HEXPRT BSR GOMATC GO MATCH COMMAND JSR GETHEX PULL NEW DATA FROM LINEBUF BCS SYNERR BAD STX [XTEMP,PCR] LBRA START1 GO CHECK FOR ANOTHER CHANGE * GOMATC LDX #CRTRAM ADD R OF TABLE IN FLEX LDB COUNT,PCR LOAD INDEX BEQ FOUND NOT FOUND YETOR ASLB ABX FOUND STX XTEMP,PCR RTS DMPCNT LDY #CRTRAM RAM ADDRESS LEAX CMDTAB,PCR CRTSET TABLE ADDR STX XTEMP1,PCR LBSR PCRLF CARRIAGE RETURN/LINE FEED  BSR DMPHEX GO DUMP EACH PARAMETER BSR DMPHEX BSR DMPHEX BSR DMPHEX BSR DMPHEX BSR DMPHEX BSR DMPHEX BSR DMPHEX LBSR NXTCH CHECK FOR END OF COMMAND CMPA #$D BEQ EXIT2 CMPA #': BEQ EXIT2 LBCC START2 MUST BE MORE EXIT2 JMP WARMS * DMPHEX BSR DMPWRD GO DUMP COMMAND WORD LDA #'$ OUTPUT FOR HEX JSR PUTCHR LDD ,Y++ GET PARAMTER DATA STD U TFR U,X JMP OUTADR OUTPUT 2 BYTES * DMPWRD JSR PCRLF NEXT LINE LDX XTEMP1,PCR RESTORE TABLE ADDR LDA ,X+ START OUTPUTTING CHAR'S JSR PUTCHR LDA ,X+ JSR PUTCHR LDA X JSR PUTCHR LEAX 3,X INCREMENT TO NEXT COMMAND STX XTEMP1,PCR LEAX EQMSG,PCR '=' PSTRNG LDA ,X CMPA #4 BNE PSTA RTS * PSTA JSR PUTCHR LEAX 1, X BRA PSTRNG * STRINGS EQMSG FCC ' = ',4 END START  TTL USER INFORMATION CREATION UTILITY - 11,15,81 * *********************************************** * * THIS UTILITY ALLOWS THE USER TO CREATE AND * SAVE PERSONAL INFORMATION ABOUT THE DISK IN * QUESTION. THE INFORMATION GOES TO TRACK 0, * SECTOR 3. * THE INFORMATION CAN BE EDITED BEFORE BEING * SAVED AND IF THE USER TYPES IN MORE DATA * THAN THE SECTOR CAN HOLD, HE IS NOTIFIED * A MAXIMUM OF 128 CHARACTERS MAY BE SAVED * *********************************************** * ORG $C100 TRANSIENT C OMMAND AREA * * SYSTEM EQUATES * WARMS EQU $CD03 WARM START BACK TO FLEX FMS EQU $D406 CALL TO EXECUTE DISK COMMAND LOC EQU $0003 DISK LOCATION OF INFO RECORD RPTERR EQU $CD3F REPORT ERROR CODE GETCHR EQU $CD15 INPUT ONE CHAR FROM CRT OUTA DR EQU $CD45 OUTPUT 4 HEX DIGITS PUTCHR EQU $CD18 OUTPUT ONE CHAR FROM TERM OUTDEC EQU $CD39 OUTPUT DECIMAL NUMBER TO CRT PSTRNG EQU $CD1E PRINT STRING OF CHARS PCRLF EQU $CD24 PRINT CR/LF NXTCH EQU $CD27 GET NEXT CHAR FROM BUFFER ACA EQU $CCB0 ABSOLUTE CURSOR ADDRESS OFF EQU $CCB2 DISPLAY OFFSET ERF EQU $CCBC ERASE TO END OF FRAME EOL EQU $CCB8 ERASE TO END OF LINE HOME EQU $CCBE HOME CURSOR, NO ERASE * START BRA START1 * COUNT FDB 0000 NUMBER OF CHARS DRIVE FCB 0 DISK DRIVE NUMBER CURGHT FDB $1B43 CURSOR RIGHT FOR TERMINAL * CHANGE FOR YOUR PARTICULAR TERMINAL; MUST BE FDB * START1 LDD ERF CLEAR SCREEN & HOME CURSOR LBSR PUTTWO JSR NXTCH PICK UP DRIVE # SUBA #'0 CMPA #3 BHI BADDRV TSTA  BPL S3A BADDRV CLRA DEFAULT TO DRIVE ZERO S3A STA DRIVE,PCR LBSR READ READ ORIGINAL CONTENTS START2 LDD ACA LBSR PUTTWO LDD #0000 PROMPT WITH COMMANDS ADDD OFF LBSR PUTTWO LEAX MSG1,PCR JSR PSTRNG JSR GETCHR GET COMMAND CHARACTER ANDA #$5F CONVERT LOWER CASE BSR ERASCN ERASE COUNT LINE CMPA #'E WANT TO EDIT ? BNE S1 IF NO LBSR EDIT YES BRA START2 * S1 CMPA #'R WANT TO READ RECORD ? BNE S2 IF NO BSR READ YES BRA START2 * S2 CMPA  #'W WANT TO WRITE A RECORD ? BNE S3 IF NO BSR WRITE YES BRA START2 * S3 CMPA #'C WANT CHAR COUNT ? BNE S4 IF NO LBSR DISPLA LDD ACA LBSR PUTTWO LDD #$0100 ADDD OFF LBSR PUTTWO LEAX CNTMS1,PCR JSR PSTRNG YES, PRINT LEAX COUNT,PCR LDB #$FF RIGHT JUSTIFY JSR OUTDEC OUTPUT COUNT BRA START2 * S4 CMPA #'H WANT TO EXIT ? BNE START2 LDD ERF LBSR PUTTWO LBSR DELAY JMP WARMS * * ERASE COUNT & ERROR MESSAGES * ERASCN PSHS A LDD AC A LBSR PUTTWO LDD #$0100 INCA ADDD OFF LBSR PUTTWO LDD EOL LBSR PUTTWO PULS A,PC * * READ RECORD FROM DISK AND DISPLAY * READ LEAX FCB,PCR DATA FCB LDA #9 READ SINGLE SECTOR STA X LDA DRIVE,PCR PICK UP DRIVE # STA 3,X LDD #LOC DISK ADDRESS OF RECORD STD 30,X JSR FMS GO READ SECTOR BEQ R1 IF NO ERRORS LEAX FCB,PCR JSR RPTERR REPORT ERROR R1 LBRA DISPLA DISPLAY WHAT READ * * WRITE A SINGLE SECTOR TO DISK * WRITE LEAX FCB,PCR WHERE DAT A IS LDA #10 WRITE SINGLE SECTOR CODE STA X LDA DRIVE,PCR STA 3,X LDD #LOC WHERE TO PUT DATA ON DISK STD 30,X JSR FMS GO WRITE SECTOR TO DISK BEQ W1 IF NO ERRORS LEAX FCB,PCR W1 JMP RPTERR REPORT ERROR * * EDIT THE FCB  BEFORE SAVING FILE * EDIT LDD ACA PUT CURSOR ON EDIT LINE LBSR PUTTWO LDD #$0300 ADDD OFF LBSR PUTTWO LEAX FCB+192,PCR FIRST CHAR LOCATION IN FCB LDB #128 E1 JSR GETCHR CMPA #$0C MOVE CURSOR RIGHT CONTROL BNE E11 IF NOT MOVE CURSOR TST X BEQ E1 INCB LBEQ RPTOVF LEAX 1,X PSHS B SAVE CHAR COUNTER LDD CURGHT,PCR JSR PUTCHR TFR B,A JSR PUTCHR PULS B LDA -1,X CMPA #$D IF CR, PUT OUT LF BNE E1 PSHS A LDA #$A JSR PUTCHR PULS A JSR PUTCHR BRA E1 E11 CMPA #8 BACKSPACE BNE E310 PSHS A LDA #$20 JSR PUTCHR PULS A JSR PUTCHR LEAX -1,X LEAY FCB+192,PCR PSHS Y CMPX ,S++ CAN'T GO BELOW MIDDLE OF FCB BLO E15 DECB BRA E1 * E15 PSHS B SAVE CHAR COUNTER LDD CURGHT,PCR JSR PUTCHR TFR B,A JSR PUTCHR PULS B LEAX 1,X BRA E1 * E310 CMPA #3 ^C, TERMINATE INPUT BEQ EDITA CMPA #$D BNE E8 PSHS A LDA #$A JSR PUTCHR PULS A E8 CMPA #$D BEQ E9 TSTA DELETE CHAR BEQ E9 CMPA #$1F LBLS E1 CMPA #$7F LBHS E1 E9 STA ,X+ PUT CHAR IN FCB INCB LBNE E1 RPTOVF PSHS A,B LDD ACA BSR PUTTWO LDD #$0100 ADDD OFF BSR PUTTWO PULS A,B LEAX OVFMS1,PCR JSR PSTRNG EDITA RTS * * DISPLAY FCB DATA IN FORMATTED ASCII DUMP * DISPLA LDD ERF BSR PUTTWO BSR DELAY WAIT FOR SCREEN ERASE LDD ACA SET CURSOR POSITION BSR PUTTWO LDD #$0300 POSITION CURSOR ADDD OFF BSR PUTTWO CLR COUNT,PCR PREPARE TO UPDATE COUNTER CLR COUNT+1,PCR LEAX FCB+192,PCR 1ST DATA BYTE LOC LDB #128 SET UP CHAR COUNTER D2 LDA ,X+ GET CHARACTER TO PRINT CMPA #$D BNE D8 D4 PSHS A LDA #$A JSR PUTCHR PULS A D8 TSTA BEQ D5 JSR PUTCHR INC COUNT+1,PCR D9 DECB UPDATE CHAR COUNTER BNE D2 D5 RTS * DELAY LDX #$F000 DEL1 LEAX 1,X BNE DEL1 RTS * PUTTWO JSR PUTCHR TFR B,A JMP PUTCHR * MSG1 FCC 'R(ead, W(rite, E(dit, C(ount, H(alt ?',$20,8,4 CNTMS1 FCC 'Character count=',4 OVFMS1 FCC 'Buffer overflow; input terminated',4 * FCB RMB 320 * END START   TTL SCAN THRU A TEXT FILE - 3,16,81 * * SCROLLING VERSION * * VALID COMMANDS: * * F - PAGE FORWARD * B - PAGE BACKWARD * 1 - SCROLL ONE LINE FORWARD * 0 - SCROLL ONE/HALF PAGE BACKWARD * T - JUMP TO TOP OF FILE * E - JUMP TO END OF FILE * X - EXIT T O FLEX * R - RUN THRU FILE * S - STOP RUNNING * * COMMAND SYNTAX: SCAN ..[] * SCAN * * FLEX SUBROUTINE LINKAGES * FLEX EQU $CD00 WARMS EQU FLEX+03 GETCHR EQU FLEX+21 PUTCHR EQU FLEX+24 INBUF EQU FLEX+27 PCRLF EQU FLEX+36 GETFIL EQU FLEX+45 OUTDEC EQU FLEX+57 SETEXT EQU FLEX+51 RPTERR EQU FLEX+63 GETHEX EQU FLEX+66 INDEC EQU FLEX+72 STAT EQU FLEX+78 FMS EQU $D406 DREAD EQU $DE00 READ A SECTOR DRIVES EQU $DE0C SELECT A DRIVE LBUFPT EQU $CC14 LINBUF EQU $C080 LNKTAB EQU $C090 USE AS MUCH OF LINBUF AS POSSIBLE LNKEND EQU SCA0-1 RE-USES PART OF THIS PROGRAM EOL EQU $CCB8 * ORG $C200 NEED ALL THE ROOM WE CAN GET * * The first order of business is to get the * number of lines the terminal is capable of * displaying. Input is expected in decimal * and backspacing is allowed. Terminate with * carriage return. * START LDX #PFCB PREPARE FCB FOR USE CLR 12,X CLEAR 1ST BYTE OF EXTENSION JSR GETFIL BCC CONT ERR JSR RPTERR REPORT ANY ERRORS THRU FLEX COMPLT JMP EXIT CONT TST 12,X WAS EXTENSION ENTERED? BNE C1 IF YES LDA #1 NO, FORCE .TXT JSR SETEXT C1 LDA #1 OPEN FILE FOR READ STA X JSR FMS BNE ERR LEAX TYPEST,PCR JSR PSTRNG GET INFO FOR SCREEN LDX #LINBUF STX LBUFPT SET UP LINEBUF FOR INPUT JSR INBUF LDB #$80 STB LBUFPT+1 POINT TO NUMBER JSR INDEC TFR X,D STB LINECT SAVE ACTUAL LINE COUNT SUBB #1 LEAVE ROOM FOR PROMPTS STB LINCNT LBSR BLDMAP BUILD SECTOR MAP OF FILE * * Read the first sector and display a page full of * text before prompting for a command. * SCA0 LDU #LNKTAB 'U' POINTS TO FILE LINKS JSR NXREAD GO READ FIRST SECTOR SCA3B TST ALLFLG IF MINUS, NO MORE TO READ BMI  GET2 JSR INCLIN INCREMENT LINE # OF TEXT SCA3 JSR PUTLIN OUTPUT LINE NUMBER * SCA3A TST ALLFLG BMI GET2 LDA ,X+ READ TEXT FROM FCB TO DISPLAY CMPA #$EE END OF FCB FLAG BEQ SCA1E SCAO11 TSTA IF EQUAL, GO READ AGAIN BEQ SCA3A  SCAO10 CMPA #9 SPACE COMPRESSION FLAG BNE SCA9 * SCA3E JSR SPCOUT GO EXPAND SPACES BRA SCA3A * SCA9 CMPA #$D END OF LINE TERMINATOR BNE SCA1 INC LNGFLE FOR EACH LINE DISPLAYED LDA LNGFLE CMPA LINCNT SEE IF SCREEN FULL BNE  SCA2 CLR LNGFLE CLEAR FOR NEXT PAGE TST RFLAG ARE WE RUNNING THRU FILE? BMI SCA2 GET2 CLR OUTLIN CLR RFLAG NOT RUNNING JSR PCRLF NEW LINE LDA #'> PROMPT JSR PUTCHR JSR GETCMD WHAT TO DO CMPA #'F PAGE FORWARD BNE  SCA4 BRA SCA3B * SCA2 JSR INCLIN INCREMENT DISPLAYED LINE # JSR PCRLF TST X COULD BE END OF FILE BEQ GET2 JSR PUTLIN OUTPUT LINE # BRA SCA3A SCA1 JSR PUTCHR PRINT CHARACTER JSR POLL SEE IF KEY HIT BRA SCA3A SCA1E JSR   NXREAD GO READ NEXT SECTOR TSTB IF EQUAL, END OF FILE BNE SCA3A TST ALLFLG IF ALL READ, STOP BMI GET2 BRA SCA3A * * The '1' command causes the entire screen to scroll * up one line and new a line to be displayed at the * bottom of the screen. Each time the '1' is pressed * the display will scroll one line. * SCA4 CMPA #'1 SCROLL FORWARD ONE LINE BNE SCAO30 TST ALLFLG BMI GET2 PSHS A,B JSR INCLIN UPDATE LINE NUMBER JSR PUTLIN OUTPUT IT COM OUTLIN SET LINE NUMBER FLAG PULS A,B SCAO4 LDA ,X+ CMPA #$EE IF END OF SECTOR BNE SCAO13 JSR NXREAD GET ANOTHER TSTB BEQ GET2 TST ALLFLG BMI GET2 BRA SCAO4 * SCAO13 TSTA BEQ SCAO4 IGNORE NULLS SCAO12 CMPA #9 SPACE COMPRESSION? BNE  SCAO1 SCAO7 JSR SPCOUT YES, EXPAND SPACES BRA SCAO4 * SCAO1 CMPA #$D END OF LINE? BNE SCAO2 BRA GET2 SCAO2 TST OUTLIN SEE IF LINE NUMBER ALREADY PRINTED BMI SCAO3 SCAO3 JSR PUTCHR OUTPUT BRA SCAO4 * * the 'R' command causes  the program to run * thru and display the entire file exactly * like the LIST command. Typing an 'S' * will terminate the run and return to the * prompt mode. Printing stops at the end of * the line where the 'S' key was detected. * SCAO30 CMPA #'R  RUN THRU THE FILE WITHOUT STOPPING BNE SCAO31 COM RFLAG SET RUN FLAG LBRA SCA3B * * The 'T' command returns to the top of the file * and re-displays the first page of text. * SCAO31 CMPA #'T BNE SCAO33 SCAO90 CLR LNGFLE START FRESH ON  LINE COUNT SCAO91 CLR LINNUM RESET LINE NUMBERS TO ZERO CLR LINNUM+1 LBRA SCA0 * * The 'E' command jumps to the end of the file * and displays the last page of text in the * file. This is the slowest command as it must * count all carriage re turns from where it is to * the end of the file in order to maintain correct * line numbering. * SCAO33 CMPA #'E BNE SCAO50 JSR INCLIN UPDATE LINE NUMBER CMPX #PFCB+256 RAN OUT OF FCB BHS SCAO34 SCAO57 LDA ,X+ SEARCH FOR CR'S AND COUNT BACKWARDS CMPA #$EE IS END OF FCB? BEQ SCAO34 CMPA #$D HAVE WE FOUND ONE BNE SCAO57 JSR INCLIN YES, INCREMENT LINE NUMBER BRA SCAO57 SCAO34 JSR NXREAD END OF FCB, READ ANOTHER CMPD #$FFFF END OF FILE? BNE SCAO57 SCAO58 CLR B CLEAR CR COUNTER SCAO39 LEAU -4,U BACK UP ONE SECTOR CMPU #LNKTAB IF BEGINNING, RE-DISPLAY FIRST PAGE BHS SCAO38 LBRA SCA0 SCAO38 PSHS B DON'T LOSE COUNTER JSR NXREAD READ NEXT SECTOR PULS B LDX #PFCB+256 START AT END OF FCB & WORK FORWARD SCAO35 LDA ,-X CMPX #PFCB+3 BEGINNING OF FCB? BEQ SCAO39 CMPA #$D BNE SCAO35 INCB INCREMENT FOR EACH CR FOUND JSR DECLIN AND FIX LINE NUMBERS CMPB LINECT HAVE WE GOT A SCREEN FULL? BNE SCAO35 LEAX 1,X YES,  POINT TO 1ST CHAR, NEXT LINE CLR LNGFLE INDICATE FULL SCREEN LBRA SCA3B * * The '0' command backs up 1/2 of a page and * re-displays the screen. Handy when the line * you want to see is just off the top of the * screen. * SCAO50 CMPA #'0 SCR OLL BACK COMMAND BNE SCAO60 LDA LINECT GET ACTUAL SCREEN LINE COUNT ASRA DIVIDE BY 2 ADDA LINCNT ADD TO DISPLAY LINE COUNT STA BAKCNT NUMBER TO BACK UP BRA SCAO70 * * The 'B' command pages backward thru the file * 23 lines at a tim e. The opposite of the 'F' * command. * SCAO60 CMPA #'B BACK PAGE COMMAND BNE SCA5 LDA LINCNT GET SCREEN LINE COUNT ASLA MULTIPLY BY 2 STA BAKCNT NUMBER TO BACK UP BRA SCAO70 * SCAO70 LEAX -2,X BACKUP PAST LAST CR CLRB CLEAR CR  COUNTER SCAO51 LDA ,-X SEARCH FOR CR'S CMPX #PFCB-1 TEST FOR BEGIN OF FCB BEQ SCAO52 CMPA #$D HAVE WE FOUND A CR? BNE SCAO51 INCB YES, INCREMENT COUNT JSR DECLIN UPDATE LINE NUMBERS LBMI SCAO90 CMPB BAKCNT HAVE WE BACKED UP FAR ENOUGH BNE SCAO51 NO LEAX 1,X YES, INCREMENT PAST THIS CR CLR LNGFLE INDICATE FULL SCREEN DISPLAY LBRA SCA3B SCAO52 PSHS B SAVE COUNTER LEAU -4,U BACK UP ANOTHER SECTOR CMPU #LNKTAB IF BEGIN, RE-DISPLAY FIRST PAGE BHS SCAO59 LBRA SCAO90 SCAO59 JSR NXREAD READ THE SECTOR PULS B LDX #PFCB+256 START AT END OF FCB BRA SCAO51 * * The 'X' command return control to FLEX * The screen is cleared and drive 0 is * selected to restore control after directly * acc essing the drivers. * SCA5 CMPA #'X EXIT COMMAND LBNE GET2 EXIT LDX #PFCB RE-SELECT DRIVE 0 FOR FLEX CLR 3,X JSR DRIVES JSR DELAY  JMP WARMS JUMP TO FLEX * * This routine displays the two characters * in the 'D' register. * PUTTW O JSR PUTCHR OUTPUT CHAR IN A TFR B,A PUT B TO A JMP PUTCHR OUTPUT AND RETURN * * * GETCMD inputs the desired command, and converts * lower case to upper if necessary. * GETCMD JSR GETCHR GET A CHAR FROM KEYBOARD CMPA #$40 TEST FOR LOWE R CASE BLO GET1 ANDA #$5F CONVERT TO UPPER CASE GET1 RTS * * This routine increments the displayed text line * numbers. * INCLIN PSHS X LDX LINNUM GET CURRENT LINE NUMBER LEAX 1,X INCREMENT STX LINNUM STORE BACK PULS X,PC * * Th !is routine decrements the displayed text line * numbers. * DECLIN PSHS X LDX LINNUM PICK UP CURRENT LINE NUMBER LEAX -1,X DECREMENT BMI DECOUT BACKED UP PASE LINE 1 STX LINNUM SAVE BACK DECOUT PULS X,PC * * This routine reads the next " sector in the * link table. If successful, 'B' returns * with a value of 252. An EE is stored in * the first byte after the FCB as an end * flag. 'X' points to the first valid char * in the FCB. ALLFLG is zero. * * If un-successful, 'B' is zero & #ALLFLG is * minus. 'D' contains an FFFF. * NXREAD LDA #$FF STA ALLFLG END OF FILE FLAG LDD -2,U CMPD #$FFFF BEQ SCA12A LDD ,U++ PICK UP NEXT LINK CMPD #$FFFF IS IT THE END? BEQ SCA12A YES, SKIP THE REST LDX #PFCB POINT TO $ FCB JSR DREAD READ THE SECTOR POINTED TO BY 'D' BEQ SCA11 LBRA FILERR ERROR IN READING, EXIT SCA11 LDX #PFCB+$100 POINT TO END OF FCB+1 LDB #0-4 'B' = NUMBER OF VALID BYTES IN FCB SCA12 PSHS A LDA #$EE STORE END OF FCB FLAG S %TA X PULS A CLR ALLFLG NOT END, CLEAR FLAG SCA12A LDX #PFCB+4 POINT TO FIRST VALID BYTE RTS * * This routine expands the space compression * put in the file by FLEX when saved. * SPCOUT LDA ,X+ PICK UP CURRENT BYTE CMPA #$EE AT END OF & FCB? BNE SPC1 BSR NXREAD YES, READ NEXT TST ALLFLG IF MINUS, NO MORE TO GO BPL SPC2 RTS SPC2 LDA ,X+ HERE IF STARTING NEW SECTOR SPC1 PSHS A SAVE COMPRESSION BYTE COUNT SCA10 LDA #$20 SPACES TO OUTPUT JSR PUTCHR DEC S D 'ECREMENT COMPRESSION COUNT BNE SCA10 SPENT PULS A,PC * * This routine scans the file building a map * of all linkages. This is necessary because * a reverse link is required to be able to * scan both directions. * BLDMAP LDX #PFCB WORKING FCB (LDD 17,X START TRK/SEC STD BTKSC LDD 19,X STD ETKSC ENDING TRK/SEC LDD 21,X STB SIZTS SIZE OF FILE LDD BTKSC LDY #LNKTAB POINT TO BEGIN OF LINK TABLE CLR -1,Y TO PREVENT HANGING STD ,Y++ FIRST FORWARD LINK INC SCOU )NT SECTOR COUNTER BLD1 JSR DREAD READ NEXT LINK LDX #PFCB RESTORE POINTER LDD X GET NEXT LINK CMPD #0 SEE IF NO LINK BEQ BLD6 IF YES BLD2 STD ,Y++ AND SAVE INC SCOUNT UPDATE SECTOR COUNT BLD4 CMPY #LNKEND IF END OF AVAILAB *LE ROOM, TERMINATE BLO BLD1 BLD5 LEAX TABFUL,PCR TELL OP LINK TABLE IS FULL BSR PSTRNG JMP EXIT BACK TO FLEX BLD6 LDD #$FFFF STORE LINK TABLE END FLAG STD ,Y++ STD Y LDA SCOUNT CHECK FOR CORRECT # OF SECTORS CMPA SIZTS BN +E FILERR RTS FILERR LEAX FERR,PCR ERROR IN READING PROMPT BSR PSTRNG JMP EXIT * * This routine outputs the line number to the * screen. * PUTLIN PSHS X,A,B LDA #$D JSR PUTCHR PUT CURSOR ON BEGIN OF LINE LDD EOL ERASE LINE JSR  ,PUTTWO LDB #$FF SUPPRESS LEADING ZEROES LDX #LINNUM POINT TO NUMBER TO PRINT JSR OUTDEC PRINT IT LDA #1 ADD A SPACE AFTER LINE NUMBER JSR SPC1 PULS X,A,B,PC * * This routine outputs a string to the screen * without the CR/LF print -ed by FLEX. * PSTRNG LDA ,X+ GET CHAR POINTED TO BY 'X' CMPA #4 EOF? BEQ PST3 IF YES JSR PUTCHR NO, PRINT IT BRA PSTRNG PST3 RTS * * This routine tests for the 'S' key to stop * running. * POLL JSR STAT HAS KEY BEEN HIT? BEQ POL .L1 LDA [CONTPD] YES, READ IT ANDA #$5F LOWER TO UPPER CASE CMPA #'S WAS IT 'S'? BNE POLL1 IF NO CLR RFLAG YES, STOP RUNNING POLL1 RTS * DELAY LDX #$F000 DEL1 LEAX -1,X BNE DEL1 RTS * * Strings * TYPEST FCC $D,$A,'# of lin /es on display? ',4 TABFUL FCC $D,$A,'Sector map full',4 FERR FCC $D,$A,'Error in reading file',4 * SCOUNT FCB 0 # OF SECTORS IN FILE BTKSC RMB 2 BEGIN TRACK-SECTOR OF FILE ETKSC RMB 2 END TRACK-SECTOR OF FILE SIZTS RMB 1 SECTOR COUNT LNGF 0LE FCB 0 PRINTED LINE COUNTER LINECT FCB 0 ACTUAL LINE COUNT OF SCREEN LINCNT FCB 0 DISPLAY AREA MINUS PROMPTS LINNUM FDB 0 DISPLAYED LINE # OF TEXT ALLFLG FCB 0 ALL READ FROM DISK RFLAG FCB 0 RUN FLAG BAKCNT FCB 0 BACKWARD LINE COUNTER 1OUTLIN FCB 0 LINE NUMBER PRINTED FLAG CONTPD FDB $E005 TERMINAL DATA PORT * PFCB RMB 320 * LNKSIZ EQU LNKEND-LNKTAB * END START  TTL SCAN THRU A TEXT FILE - 11,19,81 * * VALID COMMANDS: * * F - PAGE FORWARD * B - PAGE BACKWARD * 1 - SCROLL ONE LINE FORWARD * 0 - SCROLL ONE/HALF PAGE BACKWARD * T - JUMP TO TOP OF FILE * E - JUMP TO END OF FILE * X - EXIT TO FLEX * R - RUN THRU  FILE * S - STOP RUNNING * * COMMAND SYNTAX: SCAN ..[] * SCAN * * FLEX SUBROUTINE LINKAGES * FLEX EQU $CD00 WARMS EQU FLEX+03 GETCHR EQU FLEX+21 PUTCHR EQU FLEX+24 INBUF EQU FLEX+27 PCRLF EQU FLEX+36 GETFIL E QU FLEX+45 OUTDEC EQU FLEX+57 SETEXT EQU FLEX+51 RPTERR EQU FLEX+63 GETHEX EQU FLEX+66 INDEC EQU FLEX+72 STAT EQU FLEX+78 FMS EQU $D406 DREAD EQU $DE00 READ A SECTOR DRIVES EQU $DE0C SELECT A DRIVE ACA EQU $CCB0 ABSOLUTE CURSOR ADDRE SS LEAD-IN OFF EQU $CCB2 EOL EQU $CCB8 ERASE ENTIRE LINE EOF EQU $CCBA ERASE TO END OF SCREEN ERF EQU $CCBC ERASE ENTIRE SCREEN & HOME LBUFPT EQU $CC14 LINBUF EQU $C080 LNKTAB EQU $B800 LNKEND EQU $C000-1 CAN READ FILE UP TO 1000 SECTOR S RO0CL0 EQU $0000 ROW 0, COLUMN 0 ON CRT RO1CL0 EQU $0100 ROW 1, COLUMN 0 ON CRT * COLUMN NUMBERS ON CRT WHEN SETTING ABSOLUTE * CURSOR ADDRESSING. * ORG $C100 * * The first order of business is to get the * number of lines the terminal is ca pable of * displaying. Input is expected in decimal * and backspacing is allowed. Terminate with * carriage return. * START JSR CLRSCN LDX #PFCB PREPARE FCB FOR USE CLR 12,X CLEAR 1ST BYTE OF EXTENSION JSR GETFIL BCC CONT ERR JSR RP TERR REPORT ANY ERRORS THRU FLEX COMPLT JMP EXIT CONT TST 12,X WAS EXTENSION ENTERED? BNE C1 IF YES LDA #1 NO, FORCE .TXT JSR SETEXT C1 LDA #1 OPEN FILE FOR READ STA X JSR FMS BNE ERR LEAX TYPEST,PCR JSR PSTRNG GET IN FO FOR SCREEN LDX #LINBUF STX LBUFPT SET UP LINEBUF FOR INPUT JSR INBUF JSR INDEC TFR X,D STB LINECT SAVE ACTUAL LINE COUNT SUBB #1 LEAVE ROOM FOR PROMPTS STB LINCNT JSR CLRSCN CLEAR SCREEN TO DISPLAY LBSR BLDMAP BUIL  D SECTOR MAP OF FILE * * Read the first sector and display a page full of * text before prompting for a command. * SCA0 LDU #LNKTAB 'U' POINTS TO FILE LINKS JSR NXREAD GO READ FIRST SECTOR SCA3B TST ALLFLG IF MINUS, NO MORE TO READ BMI GET  2 JSR INCLIN INCREMENT LINE # OF TEXT SCA3 JSR TO1PAG SET CURSOR TO LINE 1 JSR PUTLIN OUTPUT LINE NUMBER * SCA3A TST ALLFLG BMI GET2 LDA ,X+ READ TEXT FROM FCB TO DISPLAY CMPA #$EE END OF FCB FLAG BEQ SCA1E SCAO11 TSTA IF EQ  UAL, GO READ AGAIN BEQ SCA3A SCAO10 CMPA #9 SPACE COMPRESSION FLAG BNE SCA9 * SCA3E JSR SPCOUT GO EXPAND SPACES BRA SCA3A * SCA9 CMPA #$D END OF LINE TERMINATOR BNE SCA1 INC LNGFLE FOR EACH LINE DISPLAYED LDA LNGFLE CMPA L INCNT SEE IF SCREEN FULL BNE SCA2 CLR LNGFLE CLEAR FOR NEXT PAGE TST RFLAG ARE WE RUNNING THRU FILE? BMI SCA2 GET2 JSR TOPPAG HOME CURSOR & ERASE LINE CLR OUTLIN CLR RFLAG NOT RUNNING LDA #'> PROMPT JSR PUTCHR JSR GET CMD WHAT TO DO CMPA #'F PAGE FORWARD BNE SCA4 BRA SCA3B * SCA2 JSR INCLIN INCREMENT DISPLAYED LINE # JSR PCRLF TST X COULD BE END OF FILE BEQ GET2 JSR PUTLIN OUTPUT LINE # BRA SCA3A SCA1 JSR PUTCHR PRINT CHARACTER JSR POLL SEE IF KEY HIT BRA SCA3A SCA1E JSR NXREAD GO READ NEXT SECTOR TSTB IF EQUAL, END OF FILE BNE SCA3A TST ALLFLG IF ALL READ, STOP BMI GET2 BRA SCA3A * * The '1' command causes the entire screen to scroll * up one line and new a line to be displayed at the * bottom of the screen. Each time the '1' is pressed * the display will scroll one line. * SCA4 CMPA #'1 SCROLL FORWARD ONE LINE BNE SCAO30 TST ALLFLG BMI GET2 PSHS A,B JSR UP1LIN NO, SET CURSOR AND PRINT IT JSR PCRLF SCROLL DISPLAY ONE LINE JSR INCLIN UPDATE LINE NUMBER JSR PUTLIN OUTPUT IT COM OUTLIN SET LINE NUMBER FLAG PULS A,B SCAO4 LDA ,X+ CMPA #$EE IF END OF SECTOR BNE SCAO13 JSR NXREAD GET ANOTHER TSTB BEQ GET2 TST ALLFLG BMI GET2 BRA SCAO4 * SCAO13 TSTA BEQ SCAO4 IGNORE NULLS SCAO12 CMPA #9 SPACE COMPRESSION? BNE SCAO1 SCAO7 JSR SPCOUT YES, EXPAND SPACES BRA SCAO4 * SCAO1 CMPA #$D END OF LINE? BNE SCAO2 BRA GET2 SCAO2 TST OUTLIN SEE IF LINE NUMBER ALREADY PRINTED BMI SCAO3 SCAO3 JSR PUTCHR OUTPUT BRA SCAO4 * * the 'R' command causes the program to run * thru and display the entire file exactly * like the LIST command. Typing an 'S' * will terminate the run and return to the * prompt mode. Printing stops at the end of * the line where the 'S' key was detected. * SCAO30 CMPA #'R RUN THRU THE FILE WITHOUT STOPPING BNE SCAO31 COM RFLAG SET RUN FLAG LBRA SCA3B * * The 'T' command returns to the top of the file * and re-displays the first page of text. * SCAO31 CMPA #'T BNE SCAO33 SCAO90 CLR LNGFLE START FRESH ON LINE COUNT SCAO91 CLR LINNUM RESET LINE NUMBERS TO ZERO CLR LINNUM+1 LBRA SCA0 * * The 'E' command jumps to the end of the file * and displays the last page of text in the * file. This is the slowest command as it must * count all carriage returns from where it is to * the end of the file in order to maintain correct * line numbering. * SCAO33 CMPA #'E BNE S CAO50 JSR CLRSCN CLEAR THE SCREEN JSR INCLIN UPDATE LINE NUMBER CMPX #PFCB+256 RAN OUT OF FCB BHS SCAO34 SCAO57 LDA ,X+ SEARCH FOR CR'S AND COUNT BACKWARDS CMPA #$EE IS END OF FCB? BEQ SCAO34 CMPA #$D HAVE WE FOUND ONE BNE  SCAO57 JSR INCLIN YES, INCREMENT LINE NUMBER BRA SCAO57 SCAO34 JSR NXREAD END OF FCB, READ ANOTHER CMPD #$FFFF END OF FILE? BNE SCAO57 SCAO58 CLRB CLEAR CR COUNTER SCAO39 LEAU -4,U BACK UP ONE SECTOR CMPU #LNKTAB IF BEGINNING, RE-DISPLAY FIRST PAGE BHS SCAO38 LBRA SCA0 SCAO38 PSHS B DON'T LOSE COUNTER JSR NXREAD READ NEXT SECTOR PULS B LDX #PFCB+256 START AT END OF FCB & WORK FORWARD SCAO35 LDA ,-X CMPX #PFCB+3 BEGINNING OF FCB? BEQ SCAO39 CMPA #$D BNE SCAO35 INCB INCREMENT FOR EACH CR FOUND JSR DECLIN AND FIX LINE NUMBERS CMPB LINECT HAVE WE GOT A SCREEN FULL? BNE SCAO35 LEAX 1,X YES, POINT TO 1ST CHAR, NEXT LINE CLR LNGFLE INDICATE FULL SCREEN LBRA SCA3B * * The '0' command backs up 1/2 of a page and * re-displays the screen. Handy when the line * you want to see is just off the top of the * screen. * SCAO50 CMPA #'0 SCROLL BACK COMMAND BNE SCAO60 LDA LINECT GET ACTUAL SCREEN LINE COUNT ASRA DIVIDE BY 2 ADDA LINCNT ADD TO DISPLAY LINE COUNT STA BAKCNT NUMBER TO BACK UP BRA SCAO70 * * The 'B' command pages backward thru the file * (LINCNT - 1) lines at a time. The opposite of the 'F' * command. * SCAO60 CMPA #'B BACK PAGE COMMAND BNE SCA5 LDA LINCNT GET SCREEN LINE COUNT ASLA MULTIPLY BY 2 STA BAKCNT NUMBER TO BACK UP BRA SCAO70 * SCAO70 JSR CLRSCN CLEAN UP SCREEN LEAX -2,X BACKUP PAST LAST CR CLRB CLEAR CR COUNTER SCAO51 LDA ,-X SEARCH FOR CR'S CMPX #PFCB-1 TEST FOR BEGIN OF FCB BEQ SCAO52 CMPA #$D HAVE WE FOUND A CR? BNE SCAO51 INCB YES, INCREMENT COUNT JSR DECLIN UPDATE LINE NUMBERS LBMI SCAO90 CMPB BAKCNT HAVE WE BACKED UP FAR ENOUGH BNE SCAO51 NO LEAX 1,X YES, INCREMENT PAST THIS CR CLR LNGFLE INDICATE FULL SCREEN DISPLAY LBRA SCA3B SCAO52 PSHS B SAVE COUNTER LEAU -4,U BACK UP ANOTHER SECTOR CMPU #LNKTAB IF BEGIN, RE-DISPLAY FIRST PAGE BHS SCAO59 LBRA SCAO90 SCAO59 JSR NXREAD READ THE SECTOR PULS B LDX #PFCB+256 START AT END OF FCB BRA SCAO51 * * The 'X' command returns control to FLEX * The screen is cleared and drive 0 is * selected to restore control after directly * accessing the drivers. * SCA5 CMPA #'X EXIT COMM AND LBNE GET2 EXIT LDX #PFCB RE-SELECT DRIVE 0 FOR FLEX CLR 3,X JSR DRIVES LDD EOF ERASE MOST OF SCREEN ON EXIT JSR PUTTWO JSR DELAY WAIT FOR COMMAND TO TAKE JMP WARMS JUMP TO FLEX * * The cursor jumps to row 0, column 0 * an !d the first line is erased. * TOPPAG PSHS A,B ALWAYS SAVE REGS LDD ACA GET ABSOLUTE CURSOR LEAD-IN BSR PUTTWO LDD #RO0CL0 SET POINTER TO ROW 0, COL 0 ADDD OFF BSR PUTTWO LDD EOL GET ERASE ENTIRE LINE CODE BSR PUTTWO PULS A,"B,PC RESTORE AND RETURN * * This routine displays the two characters * in the 'D' register. * PUTTWO JSR PUTCHR OUTPUT CHAR IN A TFR B,A PUT B TO A JMP PUTCHR OUTPUT AND RETURN * * This routine places the cursor on line 1, * column 0, and er#ases from the cursor position * to the end of the screen. * TO1PAG PSHS A,B LDD ACA CURSOR LEAD-IN BSR PUTTWO OUTPUT LDD #RO1CL0 SET TO ROW 1, COL 0 ADDD OFF BSR PUTTWO LDD EOF ERASE TO END OF FRAME CODE BSR PUTTWO DO IT PU$LS A,B,PC * * GETCMD inputs the desired command, and converts * lower case to upper if necessary. * GETCMD JSR GETCHR GET A CHAR FROM KEYBOARD CMPA #$40 TEST FOR LOWER CASE BLO GET1 ANDA #$5F CONVERT TO UPPER CASE GET1 RTS * * This routi%ne homes the cursor and clears the screen * CLRSCN PSHS A,B LDD ERF CODE FOR ERASE ENTIRE SCREEN & HOME CURSOR BSR PUTTWO PULS A,B,PC * * This routine increments the displayed text line * numbers. * INCLIN PSHS X LDX LINNUM GET CURRENT &LINE NUMBER LEAX 1,X INCREMENT STX LINNUM STORE BACK PULS X,PC * * This routine decrements the displayed text line * numbers. * DECLIN PSHS X LDX LINNUM PICK UP CURRENT LINE NUMBER LEAX -1,X DECREMENT BMI DECOUT BACKED UP PASE L'INE 1 STX LINNUM SAVE BACK DECOUT PULS X,PC * * This routine places the cursor on line 23 * UP1LIN PSHS A,B LDD ACA CURSOR LEAD-IN BSR PUTTWO LDA LINCNT SET CURSOR TO ROW 23, COL 0 ADDA OFF LDB OFF+1 BSR PUTTWO PULS A,B,PC (* * This routine reads the next sector in the * link table. If successful, 'B' returns * with a value of 252. An EE is stored in * the first byte after the FCB as an end * flag. 'X' points to the first valid char * in the FCB. ALLFLG is zero. * * I)f un-successful, 'B' is zero & ALLFLG is * minus. 'D' contains an FFFF. * NXREAD LDA #$FF STA ALLFLG END OF FILE FLAG LDD -2,U CMPD #$FFFF BEQ SCA12A LDD ,U++ PICK UP NEXT LINK CMPD #$FFFF IS IT THE END? BEQ SCA12A YES, SKIP  *THE REST LDX #PFCB POINT TO FCB JSR DREAD READ THE SECTOR POINTED TO BY 'D' BEQ SCA11 LBRA FILERR ERROR IN READING, EXIT SCA11 LDX #PFCB+$100 POINT TO END OF FCB+1 LDB #0-4 'B' = NUMBER OF VALID BYTES IN FCB SCA12 PSHS A LDA  +#$EE STORE END OF FCB FLAG STA X PULS A CLR ALLFLG NOT END, CLEAR FLAG SCA12A LDX #PFCB+4 POINT TO FIRST VALID BYTE RTS * * This routine expands the space compression * put in the file by FLEX when saved. * SPCOUT LDA ,X+ PICK UP CURRE,NT BYTE CMPA #$EE AT END OF FCB? BNE SPC1 BSR NXREAD YES, READ NEXT TST ALLFLG IF MINUS, NO MORE TO GO BPL SPC2 RTS SPC2 LDA ,X+ HERE IF STARTING NEW SECTOR SPC1 PSHS A SAVE COMPRESSION BYTE COUNT SCA10 LDA #$20 SPACES TO O-UTPUT JSR PUTCHR DEC S DECREMENT COMPRESSION COUNT BNE SCA10 SPENT PULS A,PC * * This routine scans the file building a map * of all linkages. This is necessary because * a reverse link is required to be able to * scan both directions. * B.LDMAP LDX #PFCB WORKING FCB LDD 17,X START TRK/SEC STD BTKSC LDD 19,X STD ETKSC ENDING TRK/SEC LDD 21,X STB SIZTS SIZE OF FILE LDD BTKSC LDY #LNKTAB POINT TO BEGIN OF LINK TABLE CLR -1,Y TO PREVENT HANGING STD ,Y++ /FIRST FORWARD LINK INC SCOUNT SECTOR COUNTER BLD1 JSR DREAD READ NEXT LINK LDX #PFCB RESTORE POINTER LDD X GET NEXT LINK CMPD #0 SEE IF NO LINK BEQ BLD6 IF YES BLD2 STD ,Y++ AND SAVE INC SCOUNT UPDATE SECTOR COUNT BLD4 C0MPY #LNKEND IF END OF AVAILABLE ROOM, TERMINATE BLO BLD1 BLD5 LEAX TABFUL,PCR TELL OP LINK TABLE IS FULL BSR PSTRNG JMP EXIT BACK TO FLEX BLD6 LDD #$FFFF STORE LINK TABLE END FLAG STD ,Y++ STD Y LDA SCOUNT CHECK FOR CORRECT 1# OF SECTORS CMPA SIZTS BNE FILERR RTS FILERR LEAX FERR,PCR ERROR IN READING PROMPT BSR PSTRNG JMP EXIT * * This routine outputs the line number to the * screen. * PUTLIN PSHS X,A,B LDB #$FF SUPPRESS LEADING ZEROES LDX #LINNUM 2POINT TO NUMBER TO PRINT JSR OUTDEC PRINT IT LDA #1 ADD A SPACE AFTER LINE NUMBER BSR SPC1 PULS X,A,B,PC * * This routine outputs a string to the screen * without the CR/LF printed by FLEX. * PSTRNG LDA ,X+ GET CHAR POINTED TO BY 'X' 3CMPA #4 EOF? BEQ PST3 IF YES JSR PUTCHR NO, PRINT IT BRA PSTRNG PST3 RTS * * This routine tests for the 'S' key to stop * running. * POLL JSR STAT HAS KEY BEEN HIT? BEQ POLL1 LDA [CONTPD] YES, READ IT ANDA #$5F LOWER TO UPPE 4R CASE CMPA #'S WAS IT 'S'? BNE POLL1 IF NO CLR RFLAG YES, STOP RUNNING POLL1 RTS * DELAY PSHS X LDX #16384 DEL1 LEAX -1,X BNE DEL1 PULS X,PC * * Strings * TYPEST FCC $D,$A,'# of lines on display? ',4 TABFUL FCC $D,$A,'Secto 5r map full',4 FERR FCC $D,$A,'Error in reading file',4 * SCOUNT FCB 0 # OF SECTORS IN FILE BTKSC FDB 0 BEGIN TRACK-SECTOR OF FILE ETKSC FDB 0 END TRACK-SECTOR OF FILE SIZTS FCB 0 SECTOR COUNT LNGFLE FCB 0 PRINTED LINE COUNTER LINECT FCB 60 ACTUAL LINE COUNT OF SCREEN LINCNT FCB 0 DISPLAY AREA MINUS PROMPTS LINNUM FDB 0 DISPLAYED LINE # OF TEXT ALLFLG FCB 0 ALL READ FROM DISK RFLAG FCB 0 RUN FLAG BAKCNT FCB 0 BACKWARD LINE COUNTER OUTLIN FCB 0 LINE NUMBER PRINTED FLAG CON7TPD FDB $E005 TERMINAL DATA PORT * PFCB RMB 320 * LNKSIZ EQU LNKEND-LNKTAB * END START  TTL SCAN THRU A TEXT FILE - 3,16,81 * * PAGING VERSION * * VALID COMMANDS: * * F - PAGE FORWARD * B - PAGE BACKWARD * 1 - SCROLL ONE LINE FORWARD * 0 - SCROLL ONE/HALF PAGE BACKWARD * T - JUMP TO TOP OF FILE * E - JUMP TO END OF FILE * X - EXIT TO FLEX * R - RUN THRU FILE * S - STOP RUNNING * * COMMAND SYNTAX: SCAN ..[] * SCAN * * FLEX SUBROUTINE LINKAGES * FLEX EQU $CD00 WARMS EQU FLEX+03 GETCHR EQU FLEX+21 PUTCHR EQU FLEX+24 INBUF EQU FLEX+27 PCRLF EQU FLEX+36 GETFIL EQU FLEX+45 OUTDEC EQU FLEX+57 SETEXT EQU FLEX+51 RPTERR EQU FLEX+63 GETHEX EQU FLEX+66 INDEC EQU FLEX+72 STAT EQU FLEX+78 FMS EQU $D406 DREAD EQU $DE00 READ A SECTOR DRIVES EQU $DE0C SELECT A DRIVE ACA EQU $CCB0 ABSOLUTE CURSOR ADDRESS LEAD-IN OFF EQU $CCB2 EOL EQU $CCB8 EOF EQU $CCBA ERASE TO END OF SCREEN ERF EQU $CCBC ERASE ENTIRE SCREEN & HOME LBUFPT EQU $CC14 LINBUF EQU $C080 LNKTAB EQU $C090 USE AS MUCH OF LINBUF AS POSSIBLE LNKEND EQU SCA0-1 RE-USES PART OF THIS PROGRAM * RW0CL0 EQU $0000 CURSOR CO-ORDINATES FOR ROW 0 * COLUMN 0 ON CRT RW1CL0 EQU $0100 CURSOR CO-ORDINATES FOR ROW 1 * ORG $C200 * VER FCB $20 FCB VEREND-* FCB $81,'.,$82,$D,$A FCC 'COPYRIGHT 1981, DICK BARTHOLOMEW' VEREND EQU *-1 * ORG $C200 NEED ALL THE ROOM WE CAN GET * * The first order of business is to get the * number of lines the terminal is capable of * displaying. Input is expected in decimal * and backspacing is allowed. Terminate with  * carriage return. * START JSR CLRSCN LDX #PFCB PREPARE FCB FOR USE CLR 12,X CLEAR 1ST BYTE OF EXTENSION JSR GETFIL BCC CONT ERR JSR RPTERR REPORT ANY ERRORS THRU FLEX COMPLT JMP EXIT CONT TST 12,X WAS EXTENSION ENTERED? BNE  C1 IF YES LDA #1 NO, FORCE .TXT JSR SETEXT C1 LDA #1 OPEN FILE FOR READ STA X JSR FMS BNE ERR LEAX TYPEST,PCR JSR PSTRNG GET INFO FOR SCREEN LDX #LINBUF STX LBUFPT SET UP LINEBUF FOR INPUT JSR INBUF LDB #$80 ST B LBUFPT+1 POINT TO NUMBER JSR INDEC TFR X,D STB LINECT SAVE ACTUAL LINE COUNT SUBB #1 LEAVE ROOM FOR PROMPTS STB LINCNT JSR CLRSCN CLEAR SCREEN TO DISPLAY LBSR BLDMAP BUILD SECTOR MAP OF FILE * * Read the first sector and di splay a page full of * text before prompting for a command. * SCA0 LDU #LNKTAB 'U' POINTS TO FILE LINKS JSR NXREAD GO READ FIRST SECTOR SCA3B TST ALLFLG IF MINUS, NO MORE TO READ BMI GET2 JSR INCLIN INCREMENT LINE # OF TEXT SCA3 JSR  TO1PAG SET CURSOR TO LINE 1 JSR PUTLIN OUTPUT LINE NUMBER * SCA3A TST ALLFLG BMI GET2 LDA ,X+ READ TEXT FROM FCB TO DISPLAY CMPA #$EE END OF FCB FLAG BEQ SCA1E SCAO11 TSTA IF EQUAL, GO READ AGAIN BEQ SCA3A SCAO10 CMPA #9 SPAC E COMPRESSION FLAG BNE SCA9 * SCA3E JSR SPCOUT GO EXPAND SPACES BRA SCA3A * SCA9 CMPA #$D END OF LINE TERMINATOR BNE SCA1 INC LNGFLE FOR EACH LINE DISPLAYED LDA LNGFLE CMPA LINCNT SEE IF SCREEN FULL BNE SCA2 CLR LNGFLE  CLEAR FOR NEXT PAGE TST RFLAG ARE WE RUNNING THRU FILE? BMI SCA2 GET2 JSR TOPPAG HOME CURSOR & ERASE LINE CLR OUTLIN CLR RFLAG NOT RUNNING LDA #'> PROMPT JSR PUTCHR JSR GETCMD WHAT TO DO CMPA #'F PAGE FORWARD BNE SCA4 BRA SCA3B * SCA2 JSR INCLIN INCREMENT DISPLAYED LINE # JSR PCRLF TST X COULD BE END OF FILE BEQ GET2 JSR PUTLIN OUTPUT LINE # BRA SCA3A SCA1 JSR PUTCHR PRINT CHARACTER JSR POLL SEE IF KEY HIT BRA SCA3A SCA1E JSR NXREAD GO READ NEXT SECTOR TSTB IF EQUAL, END OF FILE BNE SCA3A TST ALLFLG IF ALL READ, STOP BMI GET2 BRA SCA3A * * The '1' command causes the entire screen to scroll * up one line and new a line to be displayed at the * bottom of the screen. Each time the '1' is pressed * the display will scroll one line. * SCA4 CMPA #'1 SCROLL FORWARD ONE LINE BNE SCAO30 TST ALLFLG BMI GET2 PSHS A,B JSR UP1LIN NO, SET CURSOR AND PRINT IT JSR PCRLF SCROLL DISPLAY ONE LINE JSR  INCLIN UPDATE LINE NUMBER JSR PUTLIN OUTPUT IT COM OUTLIN SET LINE NUMBER FLAG PULS A,B SCAO4 LDA ,X+ CMPA #$EE IF END OF SECTOR BNE SCAO13 JSR NXREAD GET ANOTHER TSTB BEQ GET2 TST ALLFLG BMI GET2 BRA SCAO4 * SCA O13 TSTA BEQ SCAO4 IGNORE NULLS SCAO12 CMPA #9 SPACE COMPRESSION? BNE SCAO1 SCAO7 JSR SPCOUT YES, EXPAND SPACES BRA SCAO4 * SCAO1 CMPA #$D END OF LINE? BNE SCAO2 BRA GET2 SCAO2 TST OUTLIN SEE IF LINE NUMBER ALREADY PRINTED BMI SCAO3 SCAO3 JSR PUTCHR OUTPUT BRA SCAO4 * * the 'R' command causes the program to run * thru and display the entire file exactly * like the LIST command. Typing an 'S' * will terminate the run and return to the * prompt mode. Printing stops at the end of * the line where the 'S' key was detected. * SCAO30 CMPA #'R RUN THRU THE FILE WITHOUT STOPPING BNE SCAO31 COM RFLAG SET RUN FLAG LBRA SCA3B * * The 'T' command returns to the top of the file * and re-displays the first page of text. * SCAO31 CMPA #'T BNE SCAO33 SCAO90 CLR LNGFLE START FRESH ON LINE COUNT SCAO91 CLR LINNUM RESET LINE NUMBERS TO ZERO CLR LINNUM+1 LBRA SCA0 * * The 'E' command jumps to the end of the file * and displays the last page of text in the * file. This is the slowest command as it must * count all carriage returns from where it is to * the end of the file in order to maintain correct * line numbering. * SCAO33 CMPA #'E BNE SCAO50 JSR CLRSCN CLEAR THE SCREEN JSR INCLIN UPDATE LINE NUMBER CMPX #PFCB+256 RAN OUT OF FCB BHS SCAO34 SCAO57 LDA ,X+ SEARCH FOR CR'S AND COUNT BACKWARDS CMPA #$EE IS END OF FCB? BEQ SCAO34 CMPA #$D HAVE WE FOUND ONE BNE SCAO57 JSR INCLIN YES, INCREMENT LINE NUMBER BRA SCAO57 SCAO34 JSR NXREAD END OF FCB, READ ANOTHER CMPD #$FFFF END OF FILE? BNE SCAO57 SCAO58 CLRB CLEAR CR COUNTER SCAO39 LEAU -4,U BACK UP ONE SECTOR CMPU #LNKTAB IF BEGINNING, RE-DISPLAY FIRST PAGE BHS SCAO38 LBRA SCA0 SCAO38 PSHS B DON'T LOSE COUNTER JSR NXREAD READ NEXT SECTOR PULS B LDX #PFCB+256 START AT END OF FCB & WORK FORWARD SCAO35 LDA ,-X CMPX #PFCB+3 BEGINNING OF FCB? BEQ SCAO39 CMPA #$D BNE SCAO35 INCB INCREMENT FOR EACH CR FOUND JSR DECLIN AND FIX LINE NUMBERS CMPB LINECT HAVE WE GOT A SCREEN FULL? BNE SCAO35 LEAX 1,X YES, POINT TO 1ST CHAR, NEXT LINE CLR LNGFLE INDICATE FULL SCREEN LBRA SCA3B * * The '0' command backs up 1/2 of a page and * re-displays th e screen. Handy when the line * you want to see is just off the top of the * screen. * SCAO50 CMPA #'0 SCROLL BACK COMMAND BNE SCAO60 LDA LINECT GET ACTUAL SCREEN LINE COUNT ASRA DIVIDE BY 2 ADDA LINCNT ADD TO DISPLAY LINE COUNT STA  BAKCNT NUMBER TO BACK UP BRA SCAO70 * * The 'B' command pages backward thru the file * 23 lines at a time. The opposite of the 'F' * command. * SCAO60 CMPA #'B BACK PAGE COMMAND BNE SCA5 LDA LINCNT GET SCREEN LINE COUNT ASLA MULTIPLY BY 2 STA BAKCNT NUMBER TO BACK UP BRA SCAO70 * SCAO70 JSR CLRSCN CLEAN UP SCREEN LEAX -2,X BACKUP PAST LAST CR CLRB CLEAR CR COUNTER SCAO51 LDA ,-X SEARCH FOR CR'S CMPX #PFCB-1 TEST FOR BEGIN OF FCB BEQ SCAO52 CMPA #$D HAVE WE FOUND A CR? BNE SCAO51 INCB YES, INCREMENT COUNT JSR DECLIN UPDATE LINE NUMBERS LBMI SCAO90 CMPB BAKCNT HAVE WE BACKED UP FAR ENOUGH BNE SCAO51 NO LEAX 1,X YES, INCREMENT PAST THIS CR CLR LNGFLE INDICATE FULL SCREEN DISPLAY LBRA SCA3B SCAO52 PSHS B SAVE COUNTER LEAU -4,U BACK UP ANOTHER SECTOR CMPU #LNKTAB IF BEGIN, RE-DISPLAY FIRST PAGE BHS SCAO59 LBRA SCAO90 SCAO59 JSR NXREAD READ THE SECTOR PULS B LDX #PFCB+256 START AT END OF FCB BRA  SCAO51 * * The 'X' command returns control to FLEX * The screen is cleared and drive 0 is * selected to restore control after directly * accessing the drivers. * SCA5 CMPA #'X EXIT COMMAND LBNE GET2 EXIT LDX #PFCB RE-SELECT DRIVE 0 FOR FLEX !CLR 3,X JSR DRIVES LDD EOF ERASE MOST OF SCREEN ON EXIT JSR PUTTWO JSR DELAY GIVE SCREEN TIME TO ERASE JMP WARMS JUMP TO FLEX * * The cursor jumps to row 0, column 0 * and the first line is erased. * TOPPAG PSHS A,B ALWAYS SAVE RE"GS LDD ACA GET ABSOLUTE CURSOR LEAD-IN BSR PUTTWO LDD #RW0CL0 SET POINTER TO ROW 0, COL 0 ADDA OFF ADDB OFF+1 ADD IN CURSOR OFFSETS BSR PUTTWO LDD EOL BSR PUTTWO PULS A,B,PC RESTORE AND RETURN * * This routine displays th#e two characters * in the 'D' register. * PUTTWO JSR PUTCHR OUTPUT CHAR IN A TFR B,A PUT B TO A JMP PUTCHR OUTPUT AND RETURN * * This routine places the cursor on line 1, * column 0, and erases from the cursor position * to the end of the scr$een. * TO1PAG PSHS A,B LDD ACA CURSOR LEAD-IN BSR PUTTWO OUTPUT LDD #RW1CL0 SET TO ROW 1, COL 0 ADDA OFF ADDB OFF+1 ADD IN CURSOR OFFSETS BSR PUTTWO LDD EOF ERASE TO END OF FRAME CODE BSR PUTTWO DO IT PULS A,B,PC * * G %ETCMD inputs the desired command, and converts * lower case to upper if necessary. * GETCMD JSR GETCHR GET A CHAR FROM KEYBOARD CMPA #$40 TEST FOR LOWER CASE BLO GET1 ANDA #$5F CONVERT TO UPPER CASE GET1 RTS * * This routine homes the cur &sor and clears the screen * CLRSCN PSHS A,B LDD ERF CODE FOR ERASE ENTIRE SCREEN & HOME CURSOR BSR PUTTWO PULS A,B,PC * * This routine increments the displayed text line * numbers. * INCLIN PSHS X LDX LINNUM GET CURRENT LINE NUMBER LE'AX 1,X INCREMENT STX LINNUM STORE BACK PULS X,PC * * This routine decrements the displayed text line * numbers. * DECLIN PSHS X LDX LINNUM PICK UP CURRENT LINE NUMBER LEAX -1,X DECREMENT BMI DECOUT BACKED UP PAST LINE 1 STX LIN(NUM SAVE BACK DECOUT PULS X,PC * * This routine places the cursor on line 23 * UP1LIN PSHS A,B LDD ACA CURSOR LEAD-IN BSR PUTTWO LDA LINCNT SET CURSOR TO ROW 23, COL 0 ADDA OFF LDB OFF+1 BSR PUTTWO PULS A,B,PC * * This routine) reads the next sector in the * link table. If successful, 'B' returns * with a value of 252. An EE is stored in * the first byte after the FCB as an end * flag. 'X' points to the first valid char * in the FCB. ALLFLG is zero. * * If un-successful,* 'B' is zero & ALLFLG is * minus. 'D' contains an FFFF. * NXREAD LDA #$FF STA ALLFLG END OF FILE FLAG LDD -2,U CMPD #$FFFF BEQ SCA12A LDD ,U++ PICK UP NEXT LINK CMPD #$FFFF IS IT THE END? BEQ SCA12A YES, SKIP THE REST LDX +#PFCB POINT TO FCB JSR DREAD READ THE SECTOR POINTED TO BY 'D' BEQ SCA11 LBRA FILERR ERROR IN READING, EXIT SCA11 LDX #PFCB+$100 POINT TO END OF FCB+1 LDB #0-4 'B' = NUMBER OF VALID BYTES IN FCB SCA12 PSHS A LDA #$EE STORE END ,OF FCB FLAG STA X PULS A CLR ALLFLG NOT END, CLEAR FLAG SCA12A LDX #PFCB+4 POINT TO FIRST VALID BYTE RTS * * This routine expands the space compression * put in the file by FLEX when saved. * SPCOUT LDA ,X+ PICK UP CURRENT BYTE CMPA -#$EE AT END OF FCB? BNE SPC1 BSR NXREAD YES, READ NEXT TST ALLFLG IF MINUS, NO MORE TO GO BPL SPC2 RTS SPC2 LDA ,X+ HERE IF STARTING NEW SECTOR SPC1 PSHS A SAVE COMPRESSION BYTE COUNT SCA10 LDA #$20 SPACES TO OUTPUT JSR PUT.CHR DEC S DECREMENT COMPRESSION COUNT BNE SCA10 SPENT PULS A,PC * * This routine scans the file building a map * of all linkages. This is necessary because * a reverse link is required to be able to * scan both directions. * BLDMAP LDX #PFCB / WORKING FCB LDD 17,X START TRK/SEC STD BTKSC LDD 19,X STD ETKSC ENDING TRK/SEC LDD 21,X STB SIZTS SIZE OF FILE LDD BTKSC LDY #LNKTAB POINT TO BEGIN OF LINK TABLE CLR -1,Y TO PREVENT HANGING STD ,Y++ FIRST FORWARD L 0INK INC SCOUNT SECTOR COUNTER BLD1 JSR DREAD READ NEXT LINK LDX #PFCB RESTORE POINTER LDD X GET NEXT LINK CMPD #0 SEE IF NO LINK BEQ BLD6 IF YES BLD2 STD ,Y++ AND SAVE INC SCOUNT UPDATE SECTOR COUNT BLD4 CMPY #LNKEND IF1 END OF AVAILABLE ROOM, TERMINATE BLO BLD1 BLD5 LEAX TABFUL,PCR TELL OP LINK TABLE IS FULL BSR PSTRNG JMP EXIT BACK TO FLEX BLD6 LDD #$FFFF STORE LINK TABLE END FLAG STD ,Y++ STD Y LDA SCOUNT CHECK FOR CORRECT # OF SECTORS C2MPA SIZTS BNE FILERR RTS FILERR LEAX FERR,PCR ERROR IN READING PROMPT BSR PSTRNG JMP EXIT * * This routine outputs the line number to the * screen. * PUTLIN PSHS X,A,B LDB #$FF SUPPRESS LEADING ZEROES LDX #LINNUM POINT TO NUMBER 3TO PRINT JSR OUTDEC PRINT IT LDA #1 ADD A SPACE AFTER LINE NUMBER BSR SPC1 PULS X,A,B,PC * * This routine outputs a string to the screen * without the CR/LF printed by FLEX. * PSTRNG LDA ,X+ GET CHAR POINTED TO BY 'X' CMPA #4 EOF? 4BEQ PST3 IF YES JSR PUTCHR NO, PRINT IT BRA PSTRNG PST3 RTS * * This routine tests for the 'S' key to stop * running. * POLL JSR STAT HAS KEY BEEN HIT? BEQ POLL1 LDA [CONTPD] YES, READ IT ANDA #$5F LOWER TO UPPER CASE CMPA #5'S WAS IT 'S'? BNE POLL1 IF NO CLR RFLAG YES, STOP RUNNING POLL1 RTS * DELAY LDX #$F000 DEL1 LEAX -1,X BNE DEL1 RTS * * Strings * TYPEST FCC $D,$A,'# of lines on display? ',4 TABFUL FCC $D,$A,'Sector map full',4 FERR FCC $D,$A,'6Error in reading file',4 * SCOUNT FCB 0 # OF SECTORS IN FILE BTKSC FDB 0 BEGIN TRACK-SECTOR OF FILE ETKSC FDB 0 END TRACK-SECTOR OF FILE SIZTS FCB 0 SECTOR COUNT LNGFLE FCB 0 PRINTED LINE COUNTER LINECT FCB 0 ACTUAL LINE COUNT OF SCREEN 7LINCNT FCB 0 DISPLAY AREA MINUS PROMPTS LINNUM FDB 0 DISPLAYED LINE # OF TEXT ALLFLG FCB 0 ALL READ FROM DISK RFLAG FCB 0 RUN FLAG BAKCNT FCB 0 BACKWARD LINE COUNTER OUTLIN FCB 0 LINE NUMBER PRINTED FLAG CONTPD FDB $E005 TERMINAL DATA PO8RT * PFCB RMB 320 * LNKSIZ EQU LNKEND-LNKTAB * END START   TTL BROWSE THRU A TEXT FILE - 11,19,81 * * SYSTEM EQUATES * MEMSTR EQU $100 MEMEND EQU $CC2B * FLEX SUBROUTINE LINKAGES * FLEX EQU $CD00 WARMS EQU FLEX+03 GETCHR EQU FLEX+21 PUTCHR EQU FLEX+24 INBUFF EQU FLEX+27 PSTRNG EQU FLEX+30 PCRLF  EQU FLEX+36 GETFIL EQU FLEX+45 SETEXT EQU FLEX+51 RPTERR EQU FLEX+63 GETDEC EQU FLEX+72 ERF EQU $CCBC PAGE ERASE AND HOME CURSOR * * DFM LINKAGES * FMS EQU $D406 * * DFM FUNCTION CODES * RWNEXT EQU 0 OREAD EQU 1 ORG $C100 START BRA START1 VN FCB 5 DATE FCB $10,$22,$81 XTEMP FDB 0000 LNGFLE FCB 00 LINCNT FCB 00 START1 LDX #PFCB PREPARE FCB FOR USE CLR 12,X CLEAR 1ST BYTE OF EXTENSION JSR GETFIL BCC CONT ERR JSR RPTERR REPORT ANY ERRORS THRU FLEX COMPLT JMP WARMS * CONT TST 12,X WAS EXTENSION ENTERED? BNE C1 IF YES LDA #1 NO, FORCE .TXT JSR SETEXT C1 LDA #OREAD OPEN FILE FOR READ STA X CLR 59,X UN-DO SPACE COMPRESSION JSR FMS BNE ERR LEAX TYPEST,PCR JSR PSTRNG GET INFO FOR SCREEN JSR INBUFF JSR GETDEC TFR X,D PUT LINE COUNT IN B SUBB #2 LEAVE ROOM FOR PROMPTS STB LINCNT,PCR HEX # OF LINES IN 'B LEAX PFCB,PCR CONT2 LDY #MEMSTR MEMORY POINTER TO Y CONT1 BSR READ GO READ FILE TO MEM BCS ISEND ERROR ON RETURN STA ,Y+ CHAR TO MEM CMPY MEMEND END OF MEM? BNE CONT1 IF NO ERRR1 COM LNGFLE,PCR INDICATE MORE ON DISK BRA IS1 GO DISPLAY WHAT POSSIBLE ISEND LDA 1,X TEST THE ERROR CONDITION CMPA #8 IF END OF FILE, OK BNE ERR ANYTHING ELSE, BAD IS1 STY XTEMP,PCR SAVE LAST ADDR USED BRA INMEM GO TO DISPLAY ROUTINE READ JSR FMS READ NEXT BYTE BNE RDERR CMPA #$D IF CR, ALSO PUT LF BNE READOT PSHS A LDA #$A STA ,Y+ CMPY MEMEND BNE READ01 PULS A BRA ERRR1 * READ01 PULS A READOT ANDCC #$FE REPORT NO ERROR RTS * RDERR ORCC #1 REPORT ERROR RTS INMEM LDX #MEMSTR START OF FILE ADDR TO X IN4 LDB LINCNT,PCR DISPLAY A SCREEN OF DATA IN3 LDA ,X+ START PUTTING CHA RS TO SCREEN CMPA #$D CR SIGNIFYING NEW LINE TO START BNE IN1 DECB UPDATE LINE COUNTER BEQ HOLD IF END OF PAGE IN1 JSR PUTCHR PRINT CHAR IN2 CMPX XTEMP,PCR END OF FILE? BNE IN3 IF NO CONT3 LBSR PROM1 YES BRA HOLD3 HOLD P SHS X SAVE MEM POINTER LEAX PROM,PCR DISPLAY PROMPT LINE JSR PSTRNG PULS X HOLD3 JSR GETCHR GET ANSWER TO PROMPT ANDA #$5F CONVERT LOWER CASE TO UPPER CMPA #'F PAGE FORWARD? BNE HOLD1 LBSR PROMPT ERASE SCREEN AND UPDATE DI SPLAY BRA IN4 * HOLD1 CMPA #'B PAGE BACKWARD? BNE HOLD2 LBSR PROMPT LDA LINCNT,PCR ASLA BACK UP TWO PAGES INCA PSHS A HOLD4 LDA ,-X SEARCH FOR TWO PAGES WORTH OF CR'S CMPX #MEMSTR DON'T GO PAST BEGINNING OF FILE BHS HOL D7 LEAX 1,X IF BEGIN OF FILE, FIX POINTER BRA HOLD8 * HOLD7 CMPA #$D SEARCH AND COUNT ROUTINE BNE HOLD4 DEC S BNE HOLD4 LEAX 1,X FIX FORWARD ONE CHAR HOLD8 PULS A LDB LINCNT,PCR BRA IN2 BACK TO DISPLAY * HOLD2 CMPA #'M GO FOR MORE ON DISK BNE HOLD5 TST LNGFLE,PCR SEE IF THERE IS MORE ON DISK BEQ CONT3 CLR LNGFLE,PCR CLEAR FOR NEXT PASS CLR XTEMP,PCR CLR XTEMP+1,PCR RE-START LEAX PFCB,PCR CLR X LBRA CONT2 * HOLD5 CMPA #'J BNE HOLD9 LEAX BORE,PCR SEE WHICH WAY TO JUMP JSR PSTRNG JSR GETCHR ANDA #$5F CMPA #'B GOING TO BEGINNING? BNE HOLD5A IF YES LBSR PROMPT LBRA INMEM * HOLD5A CMPA #'E GOING TO END? LBNE HOLD IF NO, RE-PROMPT LDX XTEMP,PCR BSR PROMPT LDA LINCNT,PCR JUMP TO END -LINCNT+1 LINES ADDA #1 PSHS A BRA HOLD4 * HOLD9 CMPA #'E EXIT? LBNE HOLD3 IF NO, INVALID ENTRY LDD ERF ERASE SCREEN ON EXIT BSR PUTTWO LBRA COMPLT FINISHED, EXIT PROMPT PSHS D LDD ERF SCREEN ERASE FUNCTION PUTTWO JSR PUTCHR TFR B,A JSR PUTCHR PULS D,PC * PROM1 PSHS D,X SAVE FOR LATER USE PROM2 LEAX PROM,PCR PRINT PROMPT MESSAGE JSR PSTRNG PULS X,D,PC RESTORE REGS AND RETURN * STRINGS TYPEST FCC 'How many lines on display (XX)? ',4 PROM FCC 'F(orward, B(ackward, J(ump, M(ore or ' FCC 'E(xit? ',4 BORE FCC ' B(egin or E(nd?',4 PFCB RMB 320 END START  TTL ABSOLUTE OFFSET LOADER - 11,19,81 * GETFIL EQU $CD2D SETEXT EQU $CD33 GETHEX EQU $CD42 FCB EQU $C840 WARMS EQU $CD03 FMS EQU $D406 PSTRNG EQU $CD1E RPTERR EQU $CD3F FMSCLS EQU $D403 ORG $C100 * LOAD BRA LOADA VN FCB 3 ABSOL FDB 0 VERSION NUMBER PHYSIC FDB 0 BYTCNT FCB 0 OFFSET FDB 0 FIRST FCB 0 LOADA LDX #FCB POINT TO FCB CLR 12,X SET TO TEST EXTENSION JSR GETFIL GET FILE SPEC BCS ERROR9 ERROR? TST 12,X DID EXTENSION COME ALONG? BNE LOAD1 CLRA .BIN EXTENSION LDX #FCB POINT TO FCB JSR SETEXT LOAD1 LDA #1 OPEN FILE FOR READ STA X JSR FMS BNE LOAD7 ERRORS? LDA #$FF NO SPACE COMPRESSION STA 59,X JSR GETHEX GET OFFSET BCS ERROR9 ERROR? STX ABSOL,PCR OF FSET SAVED DLD3 BSR READAD GET PROGRAM ADDR STY PHYSIC,PCR SAVE PHYSICAL ADDRESS STB BYTCNT,PCR TST FIRST,PCR HAS OFFSET BEEN CALCULATED? BMI DLD4 PSHS Y SAVE ACTUAL LOAD ADDR LDD ABSOL,PCR SUBD ,S++ STD OFFSET,PCR COM  FIRST,PCR DLD4 LDD PHYSIC,PCR ADDD OFFSET,PCR TFR D,Y WHERE TO PUT PROGRAM LDB BYTCNT,PCR JSR DLOAD DO LOAD BRA DLD3 * LOAD7 LDA 1,X GET ERROR TYPE CMPA #8 BEQ ERROR8 ERROR9 LDX #FCB JSR RPTERR REPORT ERROR ERROR8 JSR FMSCLS CLOSE ALL JMP WARMS READAD LDX #FCB JSR FMS BNE TSTEND CMPA #$16 TRANSFER BYTE BEQ ERROR8 CMPA #2 WAIT FOR BLOCK START CODE BNE READAD JSR FMS HI BYTE OF ADDR BNE TSTEND PSHS A JSR FMS LOW BYTE OF ADDR BNE TSTEND PSHS A JSR FMS BYTE COUNT BNE TSTEND TFR D,U PULS A,B EXG A,B TFR D,Y TFR U,D TFR A,B BYTE COUNT RTS * TSTEND LDX #FCB LDA 1,X CMPA #8 BNE ERROR9 BRA ERROR8 * DLOAD JSR FMS BNE LOAD7 STA ,Y+ DECB BNE DLOAD RTS END LOAD  TTL DISKDUMP.CMD - 11,19,81 * * SYNTAX: DISKDUMP 2,4 PORT 2 W/4 ADDR IO * DISKDUMP 2,16 PORT 2 W/16 ADDR IO * DISKDUMP 2 PORT 2, DEFAULTS TO 16 ADDR * * FLEX 9.0 COMPATIBLE * NULL EQU 0 WARMS EQU $CD03 GETFIL EQU $CD2D PUTCHR EQU $CD18 PSTRNG EQU $CD1E PCRLF EQU $CD24 SETEXT EQU $CD33 RPTERR EQU $CD3F FCB1 EQU $C840 INDEC EQU $CD48 FMS EQU $D406 FMSCLS EQU $D403 OUTCH EQU $CD0F GETHEX EQU $CD42 RSTRIO EQU $CD2A ACIAC EQU $E000 ORG $C100 START BRA DUMP  VN FCB 2 DUMP LDX #FCB1 CLR 12,X JSR GETFIL GET FILE NAME TO READ LBCS ERROR JSR GETHEX GET PORT # TO DUMP TO BCS BADPRT DUMP1 LDD #ACIAC PULL CONTROL PORT FROM FLEX EXG X,D FIGURE NEW PORT ADDR PSHS B,X SAVE PORT NUMBER JSR INDEC FIND OUT HOW MANY ADDR'S BCS ITS16 CMPX #4 DOES HE WANT 4 BNE ITS16 PULS B,X BRA ITS4 * ITS16 PULS B,X ASLB ASLB ITS4 ASLB ASLB ABX LDD #$1311 INITIALIZE NEW PORT STA X STB X STX OUTPRT,PCR SAVE STATUS ADDR & LEAX 1,X STX OUTPR1,PCR DATA REG ADDR LEAX OUTPUT,PCR RE-ROUTE FLEX I/O STX OUTCH+1 LDX #FCB1 OPEN FILE FOR READ LDA #1 STA 0,X TST 12,X SEE IF EXTENSION GIVEN BNE D1 LDA #1 JSR SETEXT FORCE .TXT EXT ENSION D1 JSR FMS BNE ERROR BSR NULLS OUTPUT 80 NULLS FOR TIME DELAY DUMP2 LDX #FCB1 JSR FMS BNE IFDONE SEE IF EOF ERROR CMPA #$D BNE DUMP3 JSR PCRLF END OF RECORD, SEND CR/LF BRA DUMP2 DUMP3 JSR PUTCHR TRANSMIT CHAR'S  BRA DUMP2 IFDONE LDA 1,X CMPA #8 IF EOF, OK, IF NOT BNE ERROR REPORT ERROR LDA #4 CLOSE FILE STA 0,X JSR FMS BNE ERROR BSR NULLS END WITH 80 NULLS JSR RSTRIO EXIT JMP WARMS ERROR JSR RPTERR BRA EXIT BADPRT LEAX PRTMSG,PCR ILLEGAL PORT SPECIFIED JSR PSTRNG BRA EXIT * * OUTPUT TO SPECIFIED PORT * OUTPUT PSHS A OUT1 LDA [OUTPRT,PCR] ANDA #2 BEQ OUT1 PULS A STA [OUTPR1,PCR] RTS * * SEND THE NULLS TO THE PORT * NULLS LDA #NULL LDB #80 NULOUT BSR OUTPUT DECB BNE NULOUT RTS OUTPRT FDB 0000 OUTPR1 FDB 0000 * PRTMSG FCC $A,$D,'Illegal port # specified.',4 * END START  TTL MEMORY SET TO 'XX' - 11,15,81 * PCRLF EQU $CD24 WARMS EQU $CD03 GETHEX EQU $CD42 MEMEND EQU $CC2B ORG $C100 START BRA GO VN FCB 2 GO JSR PCRLF JSR GETHEX GET NUMBER TO STORE BCS EXIT TFR X,D PUT IN B AND THEN A TFR B,A LDU MEMEND LOAD OUT MEMEND LEAU 1,U FIX STACK TO GET ALL PSHS A,B MAKE EVEN ADDRESS TFR U,D ANDB #$FE TFR D,U PULS A,B CONT PSHU D START STORING WORD CMPU #0 TEST FOR BEGIN OF MEM BHI CONT IF STILL MORE TO GO EXIT JMP WARMS END START  TTL RESTORE OLD I/O VECTOR - 11,19,81 * * FLEX 9.0 COMPATIBLE * * SYSTEM EQUATES WARMS EQU $CD03 ACIAC EQU $D3E5 ACIAD EQU $D3E3 * ORG $C100 * START BRA START1 * VN FCB 2 DATE FCB $12,$8,$80 * START1 LDD ACIAC LDB #4 STD ACIAC  INCB STD ACIAD JMP WARMS END START  TTL TEXT FILE LOADER - 11,15,81 * * EQUATES DFM EQU $D406 GETFIL EQU $CD2D RPTERR EQU $CD3F SETEXT EQU $CD33 GETHEX EQU $CD42 WARMS EQU $CD03 PSTRNG EQU $CD1E OUTADR EQU $CD45 ORG $C100 START BRA START1 * VN FCB 1 * START1 LEAX  FCB,PCR GO GET FILE NAME CLR 12,X JSR GETFIL BCC CONT JSR RPTERR BAD FILE NAME BRA EXIT * CONT TST 12,X DID EXTENSION COME ALONG? BNE CONT1A LDA #1 JSR SETEXT ONLY LOOKING FOR TEXT FILE CONT1A JSR GETHEX WHERE TO PUT FIL E IN RAM TFR X,Y LEAX FCB,PCR PREPARE FILE LDA #1 STA X OPEN FOR READ JSR DFM BNE EXIT1 * CONT2 JSR DFM BEQ CONT3 LDB 1,X CHECK FOR END OF FILE CMPB #8 BEQ CONT4 GOOD ENDING EXIT1 JSR RPTERR BAD ENDING EXIT JMP WARMS * CONT3 STA Y+ PUT FILE TO MEMORY BRA CONT2 * CONT4 LEAY -1,Y PSHS Y SAVE LAST ADDR STORED TO LEAX LOC,PCR DISPLAY LAST ADDRESS JSR PSTRNG TFR S,X POINT TO LAST ADDR SAVED TO JSR OUTADR BRA EXIT LOC FCC 'END OF FILE AT ',4 FCB RMB 320 END START  TTL REDIRECT I/O TO DIFFERENT PORT - 11,19,81 * * SYNTAX: REDIRECT 2,4 PORT 2 W/ 4 ADDR IO * REDIRECT 2,16 PORT 2 W/ 16 ADDR IO (DEFAULT) * REDIRECT 2 PORT 2, DEFAULTS TO 16 ADDR IO * * SYSTEM EQUATES * ACIAC EQU $D3E5 CRT PORT ADDR IN FLEX ACIAD EQU $D3E3 INDEC EQU $CD48 GETHEX EQU $CD42 RPTERR EQU $CD3F WARMS EQU $CD03 * ORG $C100 * START BRA START1 * VN FCB 2 DATE FCB $02,$14,$80 * START1 JSR GETHEX GET REQUESTED PORT # BCC CONT IF NO ERROR EXIT1 JSR RPTERR BAD NUMBER ENTERED EXIT JMP WARMS BACK TO FLEX * CONT TFR X,D CMPB #7 INVALID PORT # BHI EXIT RETURN TO FLEX PSHS B SAVE NEW PORT # LDD ACIAC PULL OLD ACIA ADDR OUT OF FLEX CLRB PSHS D * JSR INDEC GET ADDR COUNT BCS ITS16 INVALID NUMBER CMPX #4 IS IT 4 OR 16? BNE ITS16 IF 16 * PULS X RESTORE PORT POINTER PULS B RESTORE PORT NUMBER BRA ITSA * ITS16 PULS X PULS B ASLB CALCULATE NEW PORT ADDRESS ASLB ITSA ASLB ASLB INITP ABX LDD #$0311 INIT THE NEW PORT STA X STB X STX ACIAC STORE NEW I/O ADDR BACK TO FLEX LEAX 1,X INCREMENT TO DATA REG STX ACIAD REPLACE BRA EXIT FINISHED END START  TTL FIND AND REPLACE BYTE'S - 11,19,81 * * SYSTEM EQUATES * GETCHR EQU $CD15 PUTCHR EQU $CD18 PCRLF EQU $CD24 OUTDEC EQU $CD39 OUTHEX EQU $CD3C GETHEX EQU $CD42 OUTADR EQU $CD45 WARMS EQU $CD03 LINBPT EQU $CC14 * ORG $C100 START BRA  START1 * VERSON FCB 3 DATE FCB 1,$26,$81 COUNT FDB 0 * START1 JSR GETHEX PSHS X JSR GETHEX Y = START ADDR, STACK = END ADDR LEAX 1,X PSHS X JSR GETHEX A = BYTE TO FIND AND REPLACE TFR X,D PSHS B JSR GETHEX B = REPLACEM ENT BYTE TFR X,D JSR PCRLF PULS A,X,Y RESTORE BEGIN, END AND BYTE PSHS X,A FIX STACK * * SEARCH START TO END FOR OCCURENCE OF SELECTED BYTE * GO PULS A CONTIN CMPA ,Y+ BEQ FOUND CMPY S LAST ADDRESS TO SEARCH? BNE CONTIN JSR PCRLF LEAX COUNT,PCR TELL HOW MANY OCCURANCES JSR OUTDEC LEAX OCCSTR,PCR JSR PSTRNG PULS Y FIX STACK EXIT JMP WARMS * * IF HERE, FOUND A MATCH * FOUND PSHS A PSHS B LDX COUNT,PCR KEEP TABS ON OCCURANCES LEAX 1,X STX COUNT,PCR LEAX -1,Y FIX FOR AUTO-INCREMENT PSHS X PRINT ADDRESS WHERE FOUND TFR S,X JSR OUTADR PRINT FOUND ADDR LDA #$20 SPACE OUT DISPLAY JSR PUTCHR PULS X LEAX -2,X BACK UP TO GET PREVIOUS TWO BYTES BSR DUMP DISPLAY 5 BYTES LEAX QUESTR,PCR BSR PSTRNG DO WANT TO CHANGE? JSR GETCHR ANDA #$5F PULS B CMPA #'Y BNE GO1 IF NOT, CONTINUE TO NEXT STB -1,Y YES, STORE NEW BYTE LEAX -3,Y REPRINT ADDRESS BSR OUT4SP BSR DUMP REPRINT 5 BYTES GO1 CMPA #'X BEQ EXIT GO2 JSR PCRLF BRA GO * * THIS ROUTINE DISPLAYS PREVIOUS BYTE, CURRENT BYTE AND NEXT BYTE * DUMP PSHS D LDB #5 # TO DISPLAY DUMP1 PSHS D JSR OUTHEX LEAX 1,X LDA #$20 SPACE THEM OUT JSR PUTCHR PULS D DECB BNE DUMP1 BSR OUT4SP PULS D,PC * * PRINT STRING ROUTINE * PSTRNG PSHS X,A PSTRN2 LDA ,X+ CMPA #4 BNE PSTRN1 PULS X,A,PC PSTRN1 JSR PUTCHR BRA PSTRN2 * * PRINT 4 SPACES * OUT4SP PSHS D LDD #$2004 OUT4S1 JSR PUTCHR DECB BNE OUT4S1 PULS D,PC * QUESTR FCC 'Replace?',4 OCCSTR FCC ' Occurance(s)',4 * END START  TTL MASTER DISK COPY - 11,19,81 * * THE DISK FORMATS VARY DEPENDING ON SIZE, SIDES, TRACKS & DENSITY * DOUBLE STEPPING DRIVES ARE NOT SUPPORTED * * SIZE TYPE #'S TRACKS TRK 0 TRK'S 1--> * ---- ---- --- ------ ----- ---------- * 5" SS/SD 220A 35 TRK 10 10 * 5" SS/DD 2212 35 TRK 10 18 * 5" DS/SD 2214 35 TRK 20 20 * 5" DS/DD 2224 35 TRK 20 36 * 5" SS/SD 270A 40 TRK 10 10 * 5" SS/DD 2712 40 TRK 10 18 * 5" DS/SD 2714 40 TRK 20 20 * 5" DS/DD 2724 40 TRK  20 36 * 8" SS/SD 4C0F 77 TRK 15 15 * 8" SS/DD 4C1A 77 TRK 15 26 * 8" DS/SD 4C1E 77 TRK 30 30 * 8" DS/DD 4C34 77 TRK 30 52 * WARMS EQU $CD03 GETCHR EQU $CD15 PUTCHR EQU $CD18 PSTRNG EQU $CD1E PCRLF EQU $CD24 OUTDEC EQU  $CD39 OUTHEX EQU $CD3C RPTERR EQU $CD3F MEMEND EQU $CC2B * VRFY EQU $D435 CR EQU $D EOT EQU 4 READ EQU 9 READ SINGLE SECTOR FUNCTION CODE WRITE EQU 10 WRITE SINGLE SECTOR FUNCTION CODE FUNC EQU 0 DRV EQU 3 TSX EQU 30 FORMAT EQU $66 DATAIN EQU 64 SECSIZ EQU 256 FMS EQU $D406 RESTOR EQU $DE09 RESTORE TO TRK 00 START BRA START1 VN FCB $32 DATE FCB 9,14,81 TRKMAX FDB 0000 SECMAX EQU TRKMAX+1 RTRKTP FDB 0001 TRK 0, SEC 1 WTRKTP FDB 0 XTEMP FDB 0 FDRIVE FCB 0 TDRIVE FCB 0 LSTMEM FDB 0 BPTR FDB 0 WRTDAT FDB 0 STNDRD FDB 0 TRACK0 FCB 0 TRK0 FCB 0 MINUS WHEN WORKING ON TRK 0 WFLG FCB $FF * * CLEAR FIRST 64 BYTES OF FCB BEFORE USING * START1 LEAX FCB2,PCR CLEAR 1ST 64 BYTES LDA #64 SR1 CLR ,X+ DECA BNE SR1 JSR PCRLF LEAX IDSTR,PCR IDENTIFY YOURSELF JSR PSTRNG DOVER LEAX VERSTR,PCR WANT TO VERIFY WRITES? JSR PSTRNG JSR GETCHR ANDA #$5F CMPA #'Y IF YES BNE DO1 LDA #-1 BRA DO2 * DO1 CMPA #'N IF NO BNE DOVER CLRA DO2 STA VRFY TURN OFF WRITE ERROR CHECKING * * PROMPT FOR THE DRIVE NUMBER TO COPY FROM * LDX MEMEND LEAX -8192,X STX LSTMEM,PCR AVAILABLE MEMORY TO USE LEAX FDRSTR,PCR PROMPT FOR DISK # TO COPY FROM  JSR PSTRNG JSR GETCHR SUBA #'0 CMPA #3 ONLY 4 DRIVES SUPPORTED LBHI DERR TSTA LBMI DERR STA FDRIVE,PCR SAVE 'FROM' DRIVE # * * PROMPT FOR THE DRIVE NUMBER TO COPY TO * LEAX TDRSTR,PCR PROMPT FOR DRIVE # TO COPY TO JSR PST RNG JSR GETCHR SUBA #'0 CMPA #3 LBHI DERR TSTA LBMI DERR STA TDRIVE,PCR SAVE 'TO' DRIVE # * * COMPARE THE TWO DRIVE NUMBERS TO SEE IF DIFFERENT * CMPA FDRIVE,PCR ARE THEY THE SAVE DRIVE ? BEQ START1 IF YES, RE-PROMPT * * PR OMPT TO INSERT DISKETTES THAT ARE TO BE COPIED * LEAX STRTMG,PCR PROMPT TO INSERT DISKS TO USE FOR COPY JSR PSTRNG LDA FDRIVE,PCR TELL OP WHERE TO PUT DISKETTES ORA #'0 JSR PUTCHR LEAX STRTM1,PCR JSR PSTRNG LDA TDRIVE,PCR OR A #'0 JSR PUTCHR LEAX STRTM2,PCR JSR PSTRNG * * WAIT TILL USER HITS ANY KEY * JSR GETCHR WAIT TILL USER READY * * GO READ SYS-INFO RECORDS TO DETERMINE IF BOTH DISKS ARE THE SAME * LBSR START3 GO RESTORE DRIVES * LEAX FCB2,PCR WHE RE TO PUT DATA LDD #0003 READ SYS INFO RECORD STD TSX,X LDA FDRIVE,PCR FROM 'FROM' DRIVE STA DRV,X LDA #READ STA X JSR FMS READ INFO RECORD LBNE ERR * LDD FORMAT,X FIND OUT TYPE OF DISK STD TRKMAX,PCR SAVE DISK FORMAT  INFORMATION LDA TDRIVE,PCR NOW READ OTHER DISK AND COMPARE THE TWO STA DRV,X LDA #READ STA X JSR FMS READ SECOND DISK INFO LBNE ERR LDD FORMAT,X GET THIS DISK TYPE CMPD TRKMAX,PCR ARE THEY THE SAME? LBNE TERR STD STNDRD,PCR SAVE ORIGINAL FORMAT NUMBERS ADDD #$0101 TO USE AS END NUMBERS STD TRKMAX,PCR JSR PCRLF JSR PCRLF LBSR LOOKUP DOAGN LEAY DBUFER,PCR BUFFER DATA HERE STY BPTR,PCR * * READ EACH SECTOR AS THEY ARE CALLED * DOAGN1 LDD RTRKTP,PCR STD WTRKTP,PCR TSTA BNE SKIP2 COM TRK0,PCR BRA DOAGN5 SKIP2 CLR TRK0,PCR DOAGN5 TST WFLG,PCR BPL DOAGN4 LEAX RDSTR,PCR LBSR PDATA LBSR DOTELL LEAX TOSTR,PCR LBSR PDATA CLR WFLG,PCR DOAGN4 LDD RTRKTP,PCR LBSR DOREAD LBSR MOVFCB DOAG2 LDD RTRKTP,PCR INCB STD RTRKTP,PCR TST TRK0,PCR BPL SKPTRK CMPB TRACK0,PCR BNE DOAGN4 BRA SKIP1 * SKPTRK CMPB SECMAX,PCR BNE DOAGN4 SKIP1 CLR TRK0,PCR CMPY LSTMEM,PCR BLS DOAGN2 COM WFLG,PCR CMPB SECMAX,PCR BNE N5 LDB #1 INCA N5 LBSR DOTELL BSR DWRITE DOAGN2 LDD RTRKTP,PCR LDB #1 INCA STD RTRKTP,PCR CMPA TRKMAX,PCR BLT DOAGN5 LDD TRKMAX,PCR SUBD #$0101 CMPD WTRKTP,PCR BLS DOEND BSR DWRITE DOEND LEAX FINIMG,PCR JSR PSTRNG LBRA EXIT2 * START3 JSR PCRLF LEAX FCB2,PCR LDA FDRIVE,PCR RESTORE 'FROM' DRIVE STA DRV,X JSR RESTOR LDY #$1000 WAIT LEAY -1,Y BNE WAIT LDA TDRIVE,PCR RESTORE 'TO' DRIVE STA DRV,X SIN2 JMP RESTOR * DWRITE LDD WTRKTP,PCR TSTA BNE DW1 COM TRK0,PCR BRA DW2 DW1 CLR TRK0,PCR DW2 LEAX DBUFER,PCR STX XTEMP,PCR LEAX WRSTR,PCR LBSR PDATA LDD WTRKTP,PCR LBSR DOTELL LEAX TOSTR,PCR LBSR PDATA WRIT1 LDU XTEMP,PCR CLRB LEAX FCB2+DATAIN,PCR WR1 LDA ,U+ STA ,X+ DECB BNE WR1 LBSR DOWRIT LDD WTRKTP,PCR INCB STD WTRKTP,PCR TST TRK0,PCR BPL SKIP3 CMPB TRACK0,PCR BNE WRIT3 BRA SKIP4 * SKIP3 CMPB SECMAX,PCR  BNE WRIT3 SKIP4 CLR TRK0,PCR INCA LDB #1 STD WTRKTP,PCR WRIT3 LDX XTEMP,PCR LEAX SECSIZ,X STX XTEMP,PCR CMPX BPTR,PCR BNE WRIT1 WR2 LEAY DBUFER,PCR STY BPTR,PCR LDD WTRKTP,PCR LBSR DOTELL LDA #CR JMP PUTCHR  DOREAD LEAX FCB2,PCR LDD RTRKTP,PCR STD TSX,X STORE TRACK & SECTOR TO READ LDA #READ STA FUNC,X LDA FDRIVE,PCR STA DRV,X JSR FMS BNE ERR RTS * MOVFCB LEAX FCB2+DATAIN,PCR POINT TO DISK DATA CLRB LDY BPTR,PCR MOVE1  LDA ,X+ STA ,Y+ DECB BNE MOVE1 STY BPTR,PCR RTS DOWRIT LEAX FCB2,PCR LDA TDRIVE,PCR STA DRV,X LDA #WRITE STA FUNC,X LDD WTRKTP,PCR STD TSX,X JSR FMS BNE ERR RTS * PDATA PSHS A,B PD2 LDA ,X+ CMPA #EOT  BEQ PD1 JSR PUTCHR BRA PD2 PD1 PULS A,B,PC * DOTELL STD WRTDAT,PCR LEAX WRTDAT,PCR JSR OUTHEX LDA #', JSR PUTCHR LEAX 1,X JMP OUTHEX * LOOKUP LEAX STRTMG,PCR PSHS X LEAX SECTAB,PCR LDD STNDRD,PCR LOOK1 CMPD ,X+ + BEQ MATCH LEAX 1,X CMPX ,X BLO LOOK1 BRA NONERR * MATCH LDA X STA TRACK0,PCR RTS * NONERR LEAX NONSTA,PCR BRA EXIT1 * ERR LEAX FCB2,PCR JSR RPTERR BRA EXIT2 * TERR LEAX DIFSTR,PCR BRA EXIT1 * DERR LEAX DRERR, PCR * EXIT1 JSR PSTRNG EXIT2 LDA #-1 STA VRFY TURN ON ERROR CHECKING AGAIN JMP WARMS * SECTAB FDB $220A FCB $0B FDB $2212 FCB $0B FDB $2214 FCB $15 FDB $2224 FCB $15 * FDB $270A FCB $0B FDB $2712 FCB $0B  FDB $2714 FCB $15 FDB $2724 FCB $15 * FDB $4C0F FCB $10 FDB $4C1A FCB $10 FDB $4C1E FCB $1F FDB $4C34 FCB $1F * STRTMG FCC 'Insert disk to be copied from into drive ',4 STRTM1 FCC 'and disk to be copied to into dri ve ',4 STRTM2 FCC 'then hit any key!',4 FINIMG FCC 'Master Copy completed',4 FDRSTR FCC 'Drive to copy from - ',4 TDRSTR FCC 'Drive to copy to - ',4 DIFSTR FCC 'The disk in the "to" drive is formatted' FCC ' differently than',$D,$A,'the di sk in the "from"' FCC ' drive; BACKUP aborted.',4 DRERR FCC 'Invalid drive number',4 RDSTR FCC 'Read ',4 WRSTR FCC ' ,Wrote ',4 TOSTR FCC ' to ',4 IDSTR FCC 'DISK BACKUP V3.2',$D,$A,$A,4 NONSTA FCC 'Non-Standard Disk Format; BACKUP aborted',4 VERSTR FCC 'Verify Writes? ',4 * FCB2 RMB 320 DBUFER EQU * END START  TTL TEXT FILE SAVER - 11,15,81 * * EQUATES DFM EQU $D406 GETFIL EQU $CD2D RPTERR EQU $CD3F SETEXT EQU $CD33 GETHEX EQU $CD42 WARMS EQU $CD03 PSTRNG EQU $CD1E ORG $C100 START BRA START1 VN FCB 1 FIRSLO FDB 2 SAVE FROM HERE LASTL O FDB 2 TO HERE START1 LEAX FCB,PCR CLR 12,X JSR GETFIL GET FILE NAME & DRIVE BCC CONT JSR RPTERR TOO BAD; ERROR CONT TST 12,X DID EXTENSION COME ALONG? BNE CONT1A LDA #1 JSR SETEXT NO, PUT ONE IN (TXT) CONT1A JSR GETHEX  GET BEGINNING ADDRESS STX FIRSLO,PCR JSR GETHEX GET ENDING ADDRESS CMPX FIRSLO,PCR BHI S1 MAKE SURE GOOD ADDRESS RANGE LEAX ERR,PCR JSR PSTRNG EXIT JMP WARMS BACK TO FLEX * S1 LEAX 2,X FIX FOR AUTO-INCREMENT STX LASTLO,PC!R LEAX FCB,PCR PREPARE THE FILE ON DISK LDA #2 STA X OPEN FOR WRITE CONT1 LDY FIRSLO,PCR 'Y = BEGIN ADDRESS CONT3 JSR DFM BEQ CONT2 OPENED OK JSR RPTERR HAD A PROBLEM BRA EXIT * CONT2 LDA Y+ START PULLING DATA CMPY LASTLO,PCR BNE CONT3 BRA EXIT FINISHED ERR FCC 'ILLEGAL ADDRESSES SPECIFIED!!!',4 FCB RMB 320 END START  \~! TTL MASTER DISK COPY - 11,19,81 * * THE DISK FORMATS VARY DEPENDING ON SIZE, SIDES, TRACKS & DENSITY * DOUBLE STEPPING DRIVES ARE NOT SUPPORTED * * SIZE TYPE #'S TRACKS TRK 0 TRK'S 1--> * ---- ---- --- ------ ----- ---------- * 5" SS/SD !220A 35 TRK 10 10 * 5" SS/DD 2212 35 TRK 10 18 * 5" DS/SD 2214 35 TRK 20 20 * 5" DS/DD 2224 35 TRK 20 36 * 5" SS/SD 270A 40 TRK 10 10 * 5" SS/DD 2712 40 TRK 10 18 * 5" DS/SD 2714 40 TRK 20 20 * 5" DS/DD 2724 40 TRK !20 36 * 8" SS/SD 4C0F 77 TRK 15 15 * 8" SS/DD 4C1A 77 TRK 15 26 * 8" DS/SD 4C1E 77 TRK 30 30 * 8" DS/DD 4C34 77 TRK 30 52 * WARMS EQU $CD03 GETCHR EQU $CD15 PUTCHR EQU $CD18 PSTRNG EQU $CD1E PCRLF EQU $CD24 OUTDEC EQU !$CD39 OUTHEX EQU $CD3C RPTERR EQU $CD3F MEMEND EQU $CC2B * VRFY EQU $D435 CR EQU $D EOT EQU 4 READ EQU 9 READ SINGLE SECTOR FUNCTION CODE WRITE EQU 10 WRITE SINGLE SECTOR FUNCTION CODE FUNC EQU 0 DRV EQU 3 TSX EQU 30 FORMAT EQU! $66 DATAIN EQU 64 SECSIZ EQU 256 FMS EQU $D406 RESTOR EQU $DE09 RESTORE TO TRK 00 START BRA START1 VN FCB $32 DATE FCB 9,14,81 TRKMAX FDB 0000 SECMAX EQU TRKMAX+1 RTRKTP FDB 0001 TRK 0, SEC 1 WTRKTP FDB 0 XTEMP FDB 0 FDRIV! E FCB 0 TDRIVE FCB 0 LSTMEM FDB 0 BPTR FDB 0 WRTDAT FDB 0 STNDRD FDB 0 TRACK0 FCB 0 TRK0 FCB 0 MINUS WHEN WORKING ON TRK 0 WFLG FCB $FF * * CLEAR FIRST 64 BYTES OF FCB BEFORE USING * START1 LEAX FCB2,PCR CLEAR 1ST 64 BYTES LDA ! #64 SR1 CLR ,X+ DECA BNE SR1 JSR PCRLF LEAX IDSTR,PCR IDENTIFY YOURSELF JSR PSTRNG DOVER LEAX VERSTR,PCR WANT TO VERIFY WRITES? JSR PSTRNG JSR GETCHR ANDA #$5F CMPA #'Y IF YES BNE DO1 LDA #-1 BRA DO2 * DO1 CMP"A #'N IF NO BNE DOVER CLRA DO2 STA VRFY TURN OFF WRITE ERROR CHECKING * * PROMPT FOR THE DRIVE NUMBER TO COPY FROM * LDX MEMEND LEAX -8192,X STX LSTMEM,PCR AVAILABLE MEMORY TO USE LEAX FDRSTR,PCR PROMPT FOR DISK # TO COPY FROM " JSR PSTRNG JSR GETCHR SUBA #'0 CMPA #3 ONLY 4 DRIVES SUPPORTED LBHI DERR TSTA LBMI DERR STA FDRIVE,PCR SAVE 'FROM' DRIVE # * * PROMPT FOR THE DRIVE NUMBER TO COPY TO * LEAX TDRSTR,PCR PROMPT FOR DRIVE # TO COPY TO JSR PST" RNG JSR GETCHR SUBA #'0 CMPA #3 LBHI DERR TSTA LBMI DERR STA TDRIVE,PCR SAVE 'TO' DRIVE # * * COMPARE THE TWO DRIVE NUMBERS TO SEE IF DIFFERENT * CMPA FDRIVE,PCR ARE THEY THE SAVE DRIVE ? BEQ START1 IF YES, RE-PROMPT * * PR" OMPT TO INSERT DISKETTES THAT ARE TO BE COPIED * LEAX STRTMG,PCR PROMPT TO INSERT DISKS TO USE FOR COPY JSR PSTRNG LDA FDRIVE,PCR TELL OP WHERE TO PUT DISKETTES ORA #'0 JSR PUTCHR LEAX STRTM1,PCR JSR PSTRNG LDA TDRIVE,PCR OR" A #'0 JSR PUTCHR LEAX STRTM2,PCR JSR PSTRNG * * WAIT TILL USER HITS ANY KEY * JSR GETCHR WAIT TILL USER READY * * GO READ SYS-INFO RECORDS TO DETERMINE IF BOTH DISKS ARE THE SAME * LBSR START3 GO RESTORE DRIVES * LEAX FCB2,PCR WHE" RE TO PUT DATA LDD #0003 READ SYS INFO RECORD STD TSX,X LDA FDRIVE,PCR FROM 'FROM' DRIVE STA DRV,X LDA #READ STA X JSR FMS READ INFO RECORD LBNE ERR * LDD FORMAT,X FIND OUT TYPE OF DISK INCA >>>for FHL flex copy STD "TRKMAX,PCR SAVE DISK FORMAT INFORMATION LDA TDRIVE,PCR NOW READ OTHER DISK AND COMPARE THE TWO STA DRV,X LDA #READ STA X JSR FMS READ SECOND DISK INFO LBNE ERR LDD FORMAT,X GET THIS DISK TYPE CMPD TRKMAX,PCR ARE THEY THE S"AME? LBNE TERR STD STNDRD,PCR SAVE ORIGINAL FORMAT NUMBERS ADDD #$0101 TO USE AS END NUMBERS STD TRKMAX,PCR JSR PCRLF JSR PCRLF LBSR LOOKUP DOAGN LEAY DBUFER,PCR BUFFER DATA HERE STY BPTR,PCR * * READ EACH SECTOR AS THEY AR" E CALLED * DOAGN1 LDD RTRKTP,PCR STD WTRKTP,PCR TSTA BNE SKIP2 COM TRK0,PCR BRA DOAGN5 SKIP2 CLR TRK0,PCR DOAGN5 TST WFLG,PCR BPL DOAGN4 LEAX RDSTR,PCR LBSR PDATA LBSR DOTELL LEAX TOSTR,PCR LBSR PDATA CLR WFLG,P" CR DOAGN4 LDD RTRKTP,PCR LBSR DOREAD LBSR MOVFCB DOAG2 LDD RTRKTP,PCR INCB STD RTRKTP,PCR TST TRK0,PCR BPL SKPTRK CMPB TRACK0,PCR BNE DOAGN4 BRA SKIP1 * SKPTRK CMPB SECMAX,PCR BNE DOAGN4 SKIP1 CLR TRK0,PCR CMPY LSTMEM,PCR BLS DOAGN2 COM WFLG,PCR CMPB SECMAX,PCR BNE N5 LDB #1 INCA N5 LBSR DOTELL BSR DWRITE DOAGN2 LDD RTRKTP,PCR LDB #1 INCA STD RTRKTP,PCR CMPA TRKMAX,PCR BLT DOAGN5 LDD TRKMAX,PCR SUBD #$0101 CMPD WT