!* -*-TECO-*-! !* BASIC20.EMACS.10, 21-Feb-83 15:17:22, Edit by GERGELY! !* BASIC20..71, 9-May-80 11:40:31, Edit by GERGELY! !~FILENAME~:! !Library of macros for editing programs written in BASIC20! BASIC20 !& Setup BASIC20 Library:! !S Sets up for Basic20 Mode! 0FO..Q BASIC20_Setup_Hook[0 fq0"G :M0' 10 M.C BASIC20_Line_Number_Difference*_Line_increments 100 M.C BASIC20_Starting_Line_Number*_Starting_Line_Number M.CBASIC20_Upper_Line_NumberValue_of_the_next_line_number_found. M.CBASIC20_Lower_Line_NumberValue_of_the_previous_line_number_found.  !BASIC20 Mode:! !C This module sets up EMACS for editing BASIC20 programs. The following definitions are made: TAB -- move past the line number if ahead of it otherwise insert a tab ! M(M.M &_INIT_BUFFER_LOCALS) M(m.mMake_Local_q-register)..d 1,32 M.L Comment_Column 1,(:i*!) M.L Comment_Start 1,(:i*) m.l Comment_End 1,1M.LDisplay_ Matching_ ParenW !* Want matching )! 100 M.L BASIC20_Starting_Line_Number 10 M.L BASIC20_Line_Number_Difference 0 M.LBASIC20_Upper_Line_Number 0 M.LBASIC20_Lower_Line_Number 1,(M.M ^R_Basic20_Tab) M.Q I Q.0,1M(M.M &_SET_MODE_LINE) BASIC20  !& BASIC20 Auto Line Numbers:! !S Subroutine that gets the next line number! [a [b [c [d [N !* Push temporary registers! !* QN: Next line number value! !* BASIC line number cannot exceed 5 characters positions therefore I make the! !* assumption that infinity is 100000! 100000 UBASIC20_Upper_Line_Number !* Set + infinity for upper! -100000 UBASIC20_Lower_Line_Number !* Set - infinity for lower! .( 0@l w<.-b @; 0,1A"'D:; -1@L> !* Find first line with a number on it! \F(F"GUBASIC20_Lower_Line_Number' )ub W)J !* QB gets current line number! .(1@l w<.-z; 0,1A"'D:; 1@L> !* Find first successive line with a no.! \F(F"GUBASIC20_Upper_Line_Number' )UC W)J !* QC gets next line number,! !* if any! QB"E QC"E !* IF NO LINE NUMBERS, THEN ... ! QBASIC20_Starting_Line_Number UN' "# QC-QBASIC20_Starting_Line_Number-( )QBASIC20_Line_Number_Difference"G QBASIC20_Starting_Line_Number UN' "# QC-(QBASIC20_Line_Number_Difference/2)UN' '' "# QC"E QBASIC20_Line_Number_DifferenceUD QB/QD*QD+QD UN' "# QC-QB-1F"G+1/2+QB UN' "#WQB UN' ' ' QN !^R BASIC20 Tab:! !^R The definition for tab. A positive numeric argument will insert that value as the line number for the line. A numeric argument of 0 will remove any line number, while a negative one will either insert a line number (or a tab, if the current position on the line is greater than 6).! -1[A !* QA: The argument! .[0 !* Q0: The current point! .(:L .-Q0[2W)J !* Q2: The current point wrt the end! !* of then line! M(M.M &_BASIC20_Auto_Line_Number)[N !* QN is the next line number! FF"N UA' QA"L FShposition-7"G .,(9i .)' :L FS H Position"E QN UA' "# 0l 0,1a"D \ W OCheck-Tab' "# QN UA''' 0l \ W0K !Line-Number! QAF"G :\U0 0K 5-FQ0 :"L 5-FQ0 F"G,48I'W G0' !* Insert the number with preceding! !* zeroes! "# :I*C0_is_too_big_for_a_line_number. fsechodisp 0fs echoactive 0'' !Check-Tab! 0,1a-9F"E 1C OReturn' "# -23"E 1D'' 9I !* Insert a tab! !Return! QA:"L :L q2R' QA F"G QBASIC20_Lower_Line_Number-QA:"'L+( QBASIC20_Upper_Line_Number-QA:"'G)"N QA :\U0 QBASIC20_Lower_Line_Number:\[1 QBASIC20_Upper_Line_Number:\[2 :I*CLine_number_0_is_outside_the_range_(1,2).!* !fsechodisp 0fsechoactive''  !Set Line Increment:! !C Set the Default line number increments. The value of Q$Basic20 Line Number Difference$, which is also an option, gets set to 10 by default or any positive argument if any were given.! 10UBASIC20_Line_Number_Difference FF"N F"GUBASIC20_Line_Number_Difference''  !Set Starting Line Number:! !C Set the Default Starting Line number. Resets the value of Q$BASIC20 Starting Line Number$ to either the positive given argument or 100 if none given.! 100UBASIC20_Starting_Line_Number FF"N F"GUBASIC20_Starting_Line_Number''  !Resequence BASIC20 Program:! !C Resequences the buffer if in BASIC20 mode. NOTE: If for more than about 300 lines, it is suggested to use the RESEQ command in the BASIC Subsystem. The first line number is set by Q$BASIC20 Starting Line Number$ and uses Q$BASIC20 Line Number Difference$ as the difference between consecutive lines. Given a positive argument, the resequencing is done from the current location to the end of the file, updating ALL entries, even if they appear before the current location. Given a negative argument, the resequencing is ONLY done in the currently defined region. ! FSRUNTIME !* QE gets starting time! [A [B [C [D !* push TEMPORARY Register! :I*`~[0 !* Q0 String identifier for processed line! !* numbers! F=(QMODE)BASIC20"N !* If not in BASIC mode then return! W :I*CWrong_Mode fsechodisp 0FS ECHO ACTIVE ' B[F 0[G Z[H 0[Y !* QF gets the starting point! FF"N 0L.UF !* no arg, then QF=BEG, otherwise QF=.! UG' !* QG GETS THE ARGUMENT! QG"L M(M.M ^R_SET_BOUNDS_REGION) !* IF ARG<0 then only do region! BUF ZUH' !* QH gets the last location! QF,QHM(M.M &_Save_for_Undo)Buffer_Resequencing QG"L QF,QHFSBOUNDARIES ' !* Neg. Arg ==> region is the bounds! "# 0,fszfsboundaries' [..D !* Push the dispatch table! F[BBIND !* Push for a temporary buffer! 34*5,32I 94 0,.FX..D !* Create the new DISPATCH table! F]BBIND !* Back to the normal buffer! 38 *5:F..D_____ !* ONLY COMMA SPACE AND CONTROLS CHAR.! 44 *5:F..D_____ 92 *5:F..D_____ !* EXCLAMATION, & AND \ ARE ! 127*5:F..D_____ !* DELIMETERS INCLUDING RUBOUT! 0[L !* QL gets the number of lines to do! .(<.-z; W\ "N %Lw'w 1l> )J QBASIC20_Starting_Line_NumberUA !* QA has current NEW line number! QBASIC20_Line_Number_DifferenceUB !* QB gets the differences between! !* lines! (QL-1)*QB+QA-99999 F"G +99999 :\[L !* Check for early problems! :I*CLine_Numbers_[L]_will_exceed_the !* ! _allowed_maximum_of_99999.( )fsechodisp ]L (99999-QA)/(QL-1):\UL :I*AThe_maximum_line_increment_is_L.fsechodisp 0fsechoactive qfj 0,fszfsboundaries 0' ]L !* Pop this accumulator! J<:SFOR; !* PREPARE FOR ... TO SEQUENCES! <:FB=TOSTEP ; :FB "L 1R 1A"D G0'' > !* the insert to be made! > J <:SMARGINPAGEDATA; <:FB; 1R 1A"D G0' 1FWLW> > QFJ<:s00001 REM_00002 REM_; 0l G0 wl> !* Ignore all EDIT lines, if any! -1uK <.-Z; 1A"D !* If first character is a number, then DO! QA:\ UC !* QC gets the NEW line no. in characters! \:\UD !* QD Gets the old line number! 0K G0 !* Insert used number separator `~ ! 5-FQCF"G,48I' W GC !* Kill old line number and insert new one! .( !* If LINO or OLD NUMBER DELIMITED, than! J<:SLINO(D)D; !* change the number to the! !* new one! R -FQDD W G0 GC> )J QA+QBUA !* Update QA! QA-99999"G !* if > 100000, the line numbers are out! !* of range and advise user! J <:S`~;FKD> !* Strip `~ which is flag ! W :I*C?_Cannot_Continue,_LINE_NUMBERS_are_too_big!* !fsechodisp 0FS ECHO ACTIVE !* ERROR message! 0,FSZFSBOUNDARIES '' 1@L FQC"G FQD"G !_Cfsechodisp0fsechoactive'' > J 0S0 W <:S;FKD> !* Strip QZ which is flag ! :I*CResequencing_Complete_in_fsechodisp !* PUT IN THE MODE THE! !* AMOUNT OF TIME IT! @:(FS RUNTIME-QE+500)/1000=@FT_sec.  !* TOOK TO RUN THIS MACRO,! 0FS ECHO ACTIVE !* FOR THE USER'S BENEFIT. ---THE END---! QFJ 0,FSZFSBOUNDARIES  !* / Local Modes: \ / MM Compile: 1: M(M.M^R Save File) M(M.MGenerate Library)BASIC20BASIC20 1:W \ / End: \ !