--- \ load screen for 68k assembler 12/23/86 " forth.data" 16 fload \ get calculated goto " forth.data" 18 fload \ get 1-dimensional arrays octal 12 124 loads \ load screens 10 through 93 decimal forth definitions --- --- --- \ error messages 11/25/86 empty stack dictionary full wrong addressing mode isn't unique out of range disc range ? full stack disc error ! string stack empty string stack overflow can't redirect input string too small wrong operand size Hewlett Packard Integral Personal Computer forth --- \ error messages compilation only, use in definition execution only conditionals not paired definition not finished in protected dictionary use only when loading off current editing screen declare vocabulary --- --- --- --- \ FIG-Forth notice This version of forth is based on the FIG-Forth model provided through the courtesy of the: Forth Interest Group P. O. Box 1105 San Carlos, Ca. 94070 (release 1 with compiler security and variable length names) Further distribution must include the above notice. It was adapted for the Hewlett Packard Integral Personal Computer by Lawrence Woestman. \ startup load screen 12/23/86 50 load 150 get \ standard setup load screen 12/23/86 50 load \ get 'get' and 'save' 80 8 loads \ get misc stuff 30 load \ get 'disforther' " screen_ed.data" 1 fload \ get screen editor 150 save \ error messages 11/25/86 empty stack dictionary full wrong addressing mode isn't unique out of range disc range ? full stack disc error ! string stack empty string stack overflow can't redirect input string too small wrong operand size Hewlett Packard Integral Personal Computer forth \ error messages compilation only, use in definition execution only conditionals not paired definition not finished in protected dictionary use only when loading off current editing screen declare vocabulary \ trace colon words forth definitions 0 variable tflag : (trace) \ give trace output. to be inserted as first word tflag @ \ trace if #0 if cr ." ..." r 4 - nfa dup id. ( print name ) c@ 31 and 32 swap - spaces ( name ) .s \ stack then ; : : \ redefined to insert trace word after colon ?exec !csp current @ context ! create ' (trace) cfa dup @ here 4 - ! , ] ; immediate ;s \ double number enhancements 5/28/85 : d>r r> rot rot >r >r >r ; : dr> r> r> r> rot >r ; : ddup over over ; : ddrop drop drop ; : dswap rot >r rot r> ; : drot d>r dswap dr> dswap ; : dover d>r ddup dr> dswap ; : d> rot swap ddup = if ddrop > else > swap drop swap drop then ; : d< dswap d> ; : d= rot = rot rot = and ; : d@ dup 4 + @ swap @ ; : d! swap over ! 4 + ! ; : dvariable ; : dconstant d@ ; : d/ swap over /mod >r swap u/ swap drop r> ; : d* dup rot * rot rot u* rot + ; : d/mod u/ ; ;s \ i' j j' k k' 2* 2^ : i' ( _ return stack-2 ) r> r> i swap >r swap >r ; : j ( _ return stack-3 ) r> r> i' swap >r swap >r ; : j' ( _ return stack-4 ) r> r> j swap >r swap >r ; : k ( _ return stack-5 ) r> r> j' swap >r swap >r ; : k' ( _ return stack-6 ) r> r> k swap >r swap >r ; : 2* ( n _ 2n ) dup + ; : 2^ ( n _ 2^n ) 1 swap -dup if 0 do 2* loop then ; ;s \ case of endof endcase 01/27/87 \ adapted from "just in case" by Dr. Charles E. Eaker, in \ forth dimensions ii/3 : case ?comp csp @ !csp 4 ; immediate : of 4 ?pairs compile over compile = compile 0branch here 0 , compile drop 5 ; immediate : endof 5 ?pairs compile branch here 0 , swap 2 [compile] endif 4 ; immediate : endcase 4 ?pairs compile drop begin sp@ csp @ = 0= while 2 [compile] endif repeat csp ! ; immediate ;s \ documentation for case 5/26/85 \ A case statement may contain any number of of...endof \ pairs, and the constants may be arranged in any order. \ Between an endof and the next of the programmer may insert \ as much code as he wishes, including code to compute the \ "constant". Case statements may be nested; a case...endcase \ pair may appear between an of...endof pair. Furthermore, \ there need not be any code between case and endcase, nor \ must there be code between of and endof. There must be code \ which pushes a number to the stack prior to each of. \ : example case \ 0 of do0thing endof \ 1 of do1thing endof \ 2 of endof \ wrong-number \ endcase ; \ computed goto 5/26/85 \ adapted from Forth Dimensions II/3 by David Kilbridge : (cgoto) ( n _ ) \ execute n'th word in list dup + dup + 0 max r @ 8 - min \ truncate to be in list r> dup dup @ + >r + 4 + @ execute ; : cgoto ( n _ ) \ execute n+2'th word in list compile (cgoto) here 0 , 2 ; immediate ;s example: value cgoto value<=0 value=1 ... value=n-1 value>=n then where n is the number of references between cgoto and then. \ matrix(1d) : matrix(1d) \ defining word for 1-dimensional arrays swap dup + dup + + ; ;s ---------------------------- an nx1 matrix with name array1 is defined as follows: n matrix(1d) array1 array1 is used in the form: s array1 where s=0 through n-1 and array1 returns the address of the s'th vector element. \ matrix(2d) : matrix(2d) \ defining word for 2-dimensional arrays rot over @ * dup + dup + + swap dup + dup + + 4 + ; ;s ---------------------------- an n1xn2 matrix with name array2 is defined as follows: n1 n2 matrix(2d) array2 array2 is used in the form: s1 s2 array2 where s1,s2=0 through n-1 and array2 returns the address of the s1,s2'th element. \ matrix(3d) : matrix(3d) \ defining word for 3-dimensional arrays rot over @ * rot + dup + dup + swap 4 + rot over @ * dup + dup + + + 4 + ; ;s ---------------------------- an n1xn2xn3 matrix with name array3 is defined as follows: n1 n2 n3 matrix(3d) array3 array3 is used in the form: s1 s2 s3 array3 where s1,s2,s3=0 through n-1 and array3 returns the address of the s1,s2,s3'th element. \ virtual (disk) numeric array 9/22/86 : 1d_virtual_array \ one-dimensional numeric array \ stored on disc blocks ( index pfa _ ) @ swap \ get the starting block # 4 b/buf */mod \ convert index to block, offset rot + block \ get correct block from disc + \ get address of indexed number ; \ to 0 variable %var \ if 1 then store, otherwise fetch : to 1 %var ! ; : from 0 %var ! ; : (( r> %var @ >r >r from ; \ preserve %var flag : )) r> r> %var ! >r ; \ restore %var flag : variable ( defined to observe to ) %var @ if ! from \ set, so store else @ then ; \ clear, so fetch \ .base h. o. b. : .base ( _ ) \ prints current base in decimal base @ dup decimal . base ! ; : based. \ : n _ \ create base-specific stack-print operators @ base @ swap base ! swap . base ! ; 16 based. h. \ print tos in hex 8 based. o. \ in octal 2 based. b. \ in binary \ random number generator decimal 0 variable seed : (rand) ( _ random# ) \ generates 0 <= random# <= 32767 seed @ 259 * 3 + 32767 and dup seed ! ; : random ( range _ random# ) \ 0 <= random# <= range-1 (rand) 32767 */ ; ;s \ view : view ( _ ) \ list source screen of definition [compile] ' nfa 4 - @ -dup if list endif ; : >doc< ( _ ) \ save screen # in definition blk @ b/scr / , ; : constant >doc< [compile] constant ; : variable >doc< [compile] variable ; : vocabulary >doc< [compile] vocabulary ; : doc< [compile] doc< [compile] user ; : create >doc< [compile] create ; : : >doc< [compile] : ; ;s \ disforther primitives 5/28/85 \ adapted from HP-9835 forth user's manual 5 variable litlst ] lit (loop) (+loop) branch 0branch [ 4 variable branches ] (loop) (+loop) branch 0branch [ 1 variable strlst ] (.") [ 1 variable $strlst ] (") [ 2 variable terminators ] ;s (;code) [ --> \ more disforther primitives : element? ( n \ list _ pos ) \ list is searched for n dup 4 + \ address of first value in list swap @ 4 * \ number of bytes in list over + swap \ loop from first value to last value do i @ \ get a value over = \ is it the one being searched for? if drop i 0 \ yes: put index of value, FALSE on stack leave \ and leave the loop then 4 +loop \ look at next value if 0 then \ if didn't find it, put FALSE on stack ; --> \ more disforther primitives 5/28/85 : inline-(.") \ addr of (.") _ addr after string 4 + count \ get the addr and length of the string over over type \ duplicate them, type the string + 1+ even ; \ advance to the end of the string : inline-(") \ addr of (") _ addr after string 4 + strlen \ get the addr and length of the string over over type \ duplicate them, type the string + 1+ even ; \ advance to the end of the string : inline-literal ( addr of word _ addr after literal ) dup @ branches element? \ is literal a branch? if dup 4 + dup @ + \ yes: figure resulting addr else dup 4 + @ \ no: get literal value endif u. 8 + ; --> \ output and skip addr or value \ more disforther primitives 5/28/85 : print-word ( address of word _ address after word ) >r cr r 0 6 d.r \ output address of word, r @ 0 6 d.r space space \ cfa of defn. at word, r @ 4 + nfa id. \ name of defn. at word r @ strlst element? \ does defn. use inline (.")? if r> inline-(.") \ handle an inline (.") else r @ $strlst element? \ does defn. use inline (")? if r> inline-(") \ handle an inline (") else r @ litlst element? \ does defn. use inline litera if r> inline-literal \ handle a literal else r> 4 + \ else advance to next word endif endif endif ; --> \ more disforther primitives : print-def ( pfa _ ) \ print the words in a colon definition begin dup @ terminators element? 0= while \ while the word is not a terminator print-word \ print the word repeat print-word drop ; \ print the terminator definition --> \ disforth : disforth ( disforth cccc ) [compile] ' \ get pfa of cccc dup nfa cr id. \ print name of cccc dup nfa c@ 64 and if ." ( immediate ) " then dup cfa @ [ ' . cfa @ ] literal = if print-def \ colon definition else dup cfa @ [ ' fence cfa @ ] literal = if ." is a user variable. offset: " @ . cr else dup cfa @ [ ' 0 cfa @ ] literal = if ." is a symbolic constant. value: " @ . cr else dup cfa @ [ ' use cfa @ ] literal = if ." is a variable. contents: " @ . cr else ." is a code def. " cr drop then then then then ; ;s \ editor \ adapted from fig-forth installation manual provided \ through the courtesy of the forth interest group \ p.o box 1105, san carlos, ca 94070 vocabulary editor immediate hex : where ( scr# \ offset _ ) \ disp screen # and image of error dup b/scr / dup scr ! ." scr# " decimal . swap c/l /mod c/l * rot block + cr c/l type cr here c@ - spaces 5E emit [compile] editor quit ; --> \ line editor editor definitions : #locate ( _ cursor offset \ line ) r# @ c/l /mod ; : #lead ( _ line addr \ offset to cursor ) #locate line swap ; : #lag ( _ cursor address \ count after cursor ) #lead dup >r + c/l r> - ; : h \ hold numbered line at pad line pad 1+ c/l dup pad c! cmove ; --> \ line editing commands : m \ move cursor by signed amount-1, disp its line r# +! cr space #lead type 5E emit #lag type #locate . drop ; : t \ type line-1, save also in pad dup c/l * r# ! dup h 0 m ; : i \ insert text from pad onto line dup sl rl ; : top \ home cursor 0 r# ! ; --> \ edit match routine 0 variable len$ 0 variable text^ \ len$: length of string text^: pointer into screen : compare c@ swap c@ - ; \ compare 2 chars on top of stack : setflag swap drop text^ @ - swap dup if swap len$ @ + else swap 1+ endif ; \ push delta text^ and found flag --> \ edit match routine : nextchar rot 1 - dup if rot rot 1+ 0 else rot rot 1 endif ; \ get the next text char if no match found : comparemore len$ @ 1 do over forth i editor + over forth i editor + compare if leave 0 endif loop -dup if 1 else nextchar endif ; \ if first char matches check len$-1 more : match ( cursor addr\bytes left\string addr\its count ) ( leaves boolean\cursor advancement) len$ ! rot dup text^ ! begin over over compare if nextchar else len$ @ 1 - if comparemore else 1 endif endif until setflag ; --> \ string editing commands : 1line \ scan line with cursor for match to pad text \ update cursor, return boolean #lag pad count match r# +! ; : find \ string at pad over full screen range, else error begin 3FF r# @ < if top pad here c/l 1+ cmove 0 error endif 1line until ; : delete \ backwards at cursor by count-1 >r #lag + forth r - \ save blank fill location editor #lag forth r editor minus r# +! #lead + swap cmove r> blanks update ; \ fill from end of text --> \ string editor commands : n \ find next occurance of previous text find 0 m ; : f \ find occurance of following text 1 text n ; : b \ backup cursor by text in pad pad c@ minus m ; : x \ delete following text 1 text find pad c@ delete 0 m ; : till \ delete on cursor line, from cursor to text end #lead + 1 text 1line 0= 0 ?error #lead + swap - delete 0 m ; --> \ string editor commands : c \ spread at cursor and copy in the following text 1 text pad count #lag rot over min >r forth r r# +! \ bump cursor r - >r \ chars to save dup here r cmove editor \ from old cursor to here here #lead + r> cmove \ here to cursor location r> cmove update \ pad to old cursor 0 m ; \ look at new line : dc \ delete characters-1, reshow line delete 0 m ; forth definitions decimal ;s \ get/save primitives forth definitions octal : block-data @ swap block + ; \ compile: offsetinblock _ run: block# _ address 100 block-data s_start 104 block-data s_dp 110 block-data s_context 114 block-data s_voc-link 120 block-data s_forth_ptr 124 block-data s_fence here constant start-addr \ start addr for save decimal --> \ save-data get-data : save-data ( block# _ ) \ save the pointers [compile] forth definitions start-addr over s_start ! dp @ over s_dp ! context @ over s_context ! context @ @ over s_forth_ptr ! voc-link @ over s_voc-link ! fence @ swap s_fence ! ; : get-data ( block# _ ) \ restore the pointers dup s_dp @ dp ! dup s_context @ context ! dup s_forth_ptr @ context @ ! definitions dup s_voc-link @ voc-link ! s_fence @ fence ! ; --> \ figure-size : figure-size ( _ #ofblocks ) \ computes the number of blocks needed to hold defns here start-addr - 1 - b/buf / 1+ ; --> \ get : get ( screen# _ ) \ load precompiled defns from screens b/scr * \ convert to block# dup s_start @ start-addr = 0= if ." addresses don't match " drop else dup get-data 1+ \ skip data block start-addr swap figure-size over + 1+ swap \ set up limits do i block over b/buf cmove b/buf + loop drop endif ; --> \ save : save ( screen# _ ) \ save ram starting at start-addr \ out to m.s. starting at screen# b/scr * ( to block # ) dup save-data update start-addr swap 1+ figure-size dup b/scr / 1+ cr ." used " . ." screens " cr over + 1+ swap do dup i block b/buf cmove update b/buf + loop drop flush ; here ' start-addr ! \ set start-addr to start after these definitions ;s \ string functions load screen next_screen 7 loads \ $variable $input 6/17/85 : $variable ( builds: max_number_of_chars _ ) ( does: _ addr_of_first_char ) ; \ leave address of first char : $input ( _ ) \ input a string to the string stack pad 80 expect \ read 80 chars or until a NL to pad pad $@ ; \ move chars from pad to string stack \ $drop $length $dup $! : $drop ( _ ) \ drop string from stack ( error checking ) $stack_empty? ($drop) ; : $length ( _ length of top string on stack ) $stack_empty? $sp@ strlen swap drop ; : $dup ( _ ) \ duplicate top string on stack $stack_empty? $sp@ $@ ; : $! ( addr _ ) \ store the top string on stack at address $stack_empty? \ error if no string on stack $sp@ strlen 1+ \ get length of string including null rot swap cmove \ copy string from stack to addr ($drop) ; \ remove string from string stack \ two_strings? $swap : two_strings? ( _ ) \ error message if not two strings on stack $stack_empty? \ error if no first string $sp@ after_string \ get address of second string addr_empty? ; \ error if no second string : $swap ( _ ) \ swap top two strings on stack two_strings? \ error if not two strings on stack pad $! \ store first string temporarily at pad pad after_string \ get addr following first string dup $! \ store second string following first pad $@ $@ ; \ fetch strings in reverse order \ & : & ( _ ) \ concatenate top string to front of next string two_strings? \ error if not two strings pad $! \ store to string at pad pad after_string \ get addr of end of string 1 - $! \ store next string onto end of first pad $@ ; \ fetch combined string to stack \ chr$ num : chr$ ( n _ ) \ create a string of one char on stack from n pad c! \ store n at pad 0 pad 1+ c! \ put a null after n pad $@ ; \ fetch string to string stack : num ( _ n ) \ ordinal of first char in top string $stack_empty? \ error if no string on stack $sp@ c@ \ get first char of string (0 if null) ($drop) ; \ drop string from stack \ $_to_double double_to_$ : $_to_double ( _ d ) \ convert top string to double number \ no leading blanks, at least one trailing blank needed $length pad c! \ put length of string at pad pad 1+ $! \ store string at pad pad number ; \ convert string to number : double_to_$ ( d _ ) \ convert double number to top string swap over dabs \ set up to convert double number <# #s sign #> \ convert double number to string over + 0 swap c! \ put a null at end of string $@ ; \ fetch string to string stack \ $extract 6/17/85 : $extract ( pos count _ ) \ replace top string on stack with \ substring 'count' chars long starting at offset 'pos' over over + \ make sure substring specified fits $length 1+ > \ in top string on stack 12 ?error \ error if string too small pad $! \ store top string at pad swap pad + \ get addr of first char of substring dup rot + \ get addr of first char after substring 0 swap c! \ put null at end of substring $@ ; \ fetch substring to string stack \ ascii control 8/27/86 : ascii ( _ n ) \ return value of first char following bl word \ get following word from input stream here 1+ c@ \ get the first char of the word state @ \ check the state if \ if compiling compile lit , \ compile lit and the value of the char endif ; immediate : control ( _ n ) \ return control code of first char bl word \ get following word from input stream here 1+ c@ \ get the first char of the word 31 and \ make it a control character state @ \ check the state if \ if compiling compile lit , \ compile lit and the control code endif ; immediate \ depth 8/27/86 : depth ( _ n ) \ return the current depth of the stack sp@ \ get current stack pointer value s0 @ \ get original stack pointer value swap - \ get difference between values 4 / \ divide by size of stack (in bytes) 0 max ; \ bounds check depth of stack \ pick 8/27/86 : pick ( n _ n'th_stack_value ) \ pick n'th value from stack 1+ \ account for n being on the stack dup + dup + \ multiply by size of stack value (4) sp@ + \ add offset to stack pointer @ ; \ fetch the stack value \ data-file 12/23/86 : data-file ( _ ) \ attempt to make the file name on the \ string stack the forth data file 2 0 open \ attempt to open the file dup 0< \ save a copy of the file descriptor if \ if it is < 0, then error on open drop ." error " errno . \ report error number ." opening file" else flush empty-buffers \ make sure old file is up to date disk_fd @ close \ close old data file drop \ ignore any error message disk_fd ! \ select new data file endif ; \ fload 9/16/86 : fload ( n _ ) \ load block n from file name on string stack 2 0 open dup 0< \ attempt to open the file if drop drop ." error " errno . ." opening file in fload" else disk_fd @ >r \ save current file descriptor flush empty-buffers \ make sure file is up to date disk_fd ! load \ set to new file and load flush empty-buffers \ make sure file is up to date disk_fd @ close 0< \ attempt to close the file if ." error " errno . ." closing file in fload" endif r> disk_fd ! \ restore old file descriptor endif ; \ printer display pages 11/24/86 output_fd @ variable display_fd \ save the current display_fd : printer ( _ ) \ set the output_fd to the printer printer_fd @ output_fd ! ; : display ( _ ) \ set the output_fd back to the display display_fd @ output_fd ! ; : pages ( start_screen end_screen _ ) \ output screens as pages printer \ output to printer 2+ swap \ make sure to include last screen do \ do pages i triad 3 +loop display ; \ set output back to display \ .char 12/04/86 : .char ( c _ ) \ emit printable chars dup dup \ get two copies of char 32 < swap \ is char unprintable? 126 > or if drop 46 \ if yes, replace it with a "." endif emit \ output the char ; \ wdump 12/04/86 : wdump ( start_addr count _ ) \ dump data a word at a time cr even over + swap \ set up range to dump do i 0 11 d.r space \ output address i @ 0 11 d.r space \ output long at address i w@ 7 .r space \ output word at address i c@ 5 .r space \ output byte at address i 1+ c@ 5 .r 3 spaces \ output byte at address + 1 i c@ .char \ output char at address i 1+ c@ .char cr \ output char at address + 1 ?terminal if leave then \ stop? if yes, leave loop 2 +loop ; lf”FF||T“hÄ Åascii k¶1ò2ê@Ž6€6B1P5Z1:+ª:"+`6´/vÇcontrol lf1ò2ê@Ž6€6B1P+`.x5Z1:+ª:"+`6´/v…depth lª1ò/3ì1:0Ô72ÚIN2šHN/v„picklü1ò6B0ò040ò04/041:/v‰data-file m41ò2º2šZ„0ò0 +ª60¾<’error 3ÔS¢<’ opening file+�$JºJ’6 1:**0¾6 1„/v…fload mf1ò2º2šZ„0ò0 +ªD0¾0¾<’error 3ÔS¢<’opening file in fload +�€6 1:/¤JºJ’6 1„MrJºJ’6 1:**0 +ª4<’error 3ÔS¢<’closing file in fload /¸6 1„/vŠdisplay_fdmì2d‡printer nØ1ò6 1:5ò1„/v‡display nð1ònè1:5ò1„/v…pages o1ònþ6V0Ô,F,`Tä2Ê,ÿÿÿðo$/v….char o<1ò0ò0ò+` 7T0Ô+`~7~.Ž+ª0¾+`.(*/v…wdump ox1ò(Ú<’ is a symbolic constant. value: 1:S¢(Ú+�v0ò8Ž1:+`2‚7*+ª8<’is a variable. contents: 1:S¢(Ú+�"<’ is a code def. (Ú0¾/vÄcaset1ò9L5¢1:8ü2Ú/vÂofu²1ò2Ú9 :"0¦:"7*:"+ª6€2š6´:"0¾+`/vÅendof uØ1ò+`9 :"+�6€2š6´0Ô2ºP2Ú/vÇendcase v$1ò2Ú9 :"0¾/5¢1:7*/à+ª2ºP+�ÿÿÿØ5¢1„/v‰$variable vh1ò;N6€0¦2š>Ô6œCp;j/v†$inputvÂ1ò?t+`P=J?tXÂ/v…$drop vú1òX„X¢/v‡$length w&1òX„W~W¸0Ô0¾/v„$dupwB1òX„W~XÂ/v‚$!wl1òX„W~W¸6B7ª0Ô-ÆX¢/vŒtwo_strings?wŠ1òX„W~WúX /v…$swap wº1òwÌ?tw’?tWú0òw’?tXÂXÂ/v�& wä1òwÌ?tw’?tWú2ª7w’?tXÂ/v„chr$x 1ò?t1š2š?t6B1š?tXÂ/vƒnum xX1òX„W~1PX¢/v‹$_to_double xŠ1òwP?t1š?t6Bw’?tAî/v‹double_to_$ x¬1ò0Ô0¦GúR*RôRtRF0¦042š0Ô1šXÂ/vˆ$extractxæ1ò0¦0¦04wP6B7~+` 9?tw’0Ô?t040ò7ª042š0Ô1šXÂ/vÂ(sy41ò+`)@Ž/vÂ(pyž1ò+`)@Ž/vÅascii yº1ò2ê@Ž6€6B1P5Z1:+ª:"+`6´/v…depth yÖ1ò/3ì1:0Ô72ÚIN2šHN/v‚1-z1ò2ª7/v‚<>zR1ò7*/à/v„2dupzj1ò0¦0¦/v…2drop z‚1ò0¾0¾/v„beepzœ1ò+`(*/v†boundsz¸1ò0¦040Ô/v…bmove zÖ1ò7î+ª\/¤/Ì04zZ0ÔzZ/¸zâ0Ô,F,`1P0¦1šzZ+`ÿÿÿÿ,ÿÿÿà0¾+�z¨/v„movezö1ò7ª7ªzŒDÄ+ª7ª{+� 7ª-Æ/v…case: {r1ò;N:n:’;j0Ô2ÚI041:+z/v…-tidy {´1òzâ,F,`1P2ê7T+ª2ê,`1š+ÐÿÿÿØ/vÆeditor{ð;‚FT� “üF€…&mode Fx2d‡&cursor |X2d‡&update |l2dˆ&buf-adr|‚2d…&e-id |˜2d †%x-off|®2B†%y-off|Î2B…c/scr |â2B…l/scr |ö2B…e-fcn } 2d“‹&end-screen }2d†'crtxy}22d” ‹'crtclr-scr }L2d“n�'clear-to-eol }`2d“¸…crtxy }z1ò}X1:+z/vŠcrtclr-scr}–1ò}r1:+z/vŒclear-to-eol}¶1ò}Ž1:+z/v†curpos}Ú1ò|z1:/v‡+curpos ~1ò|z1~ 2šHN+`ÿH |z1„/v‹move-cursor ~1ò~*~ 2üI.|î040Ô|Ú040Ô}¢/v‡buf-adr ~Z1ò|¦1:04/v†bufpos~ 1ò~ ~®/vˆe-update~Â1ò2ª|�1„/vŽinit-variables~Þ1ò2š|d1„2š|z1„2š|�1„/vˆbuf-move1ò7ª~®7ª~®7ª{|~ì/vŠ?printable@1ò0ò+` 7T0Ô+`~7~.Ž/à/v†>line#r1ò2üIN/v†line#>²1ò2üI/vŒchars-to-eolÎ1ò2üIl2ü0Ô7/vŒchars-to-eosê1ò}0Ô7/vŽdisplay-to-eol€1ò0ò~®0¦ü<7ª0¦04/¤;¼/¸}ì/v‹?empty-line €>1òÚ~®2ü<0Ô0¾/à/vŽdisplay-to-eos€Š1ò~ 0Ô}0Ô,F,`Ú0ò|z1„2š~l€R+ÐÿÿÿÜ|z1„2š~l/v†expand€À1ò0ò0ò2ü04}0¦7N~®2ü?,~ì/v†shrink�(1ò0ò2ü040Ô0¦}0Ô7N+`Ú~®2ü?,~ì/v‹insert-line �l1ò+`€œ+ª0ò�4¾€Ô+�zÂ/v‹delete-line �À1ò0ò�x¾€Ô/vˆins-char‚ 1ò0ò0ò6B0¦üzZN~®1š/vˆdel-char‚41ò0ò0ò6B0Ô0¦üN0òü04zZ~®2ê0Ô1š/v‡r-arrow ‚n1ò2ª~*/v‡l-arrow ‚À1ò+`ÿÿÿÿ~*/v‡u-arrow ‚Þ1ò2ü0p~*/v‡d-arrow ƒ1ò2ü~*/v†i-lineƒ"1ò~ �Ò/v†d-lineƒ@1ò~ ‚/v†d-charƒ\1ò~ ‚|~ €R/v‹insert-mode ƒx1ò|d2ª1"+`(2š}¢|d1:+ª<’ Insert ON +�+` Qò/v†returnƒœ1ò~ ¾6B+`H Ú|z1„/v…e-tab „1ò2Ú~ 2ÚIl7~*/vŠclr-screen„>1ò~ ~®~ €*?,~ ¾€Ô~ì/vƒ$xy „j;‚vö&a00r28C00 00&a00r00C’store_num_as_chars„¦1ò/¤+` I.+`004/Ì1š+`004/¸6B1š/v‡.xydisp „Ð1ò~ 2üI.zŒ„°+` 04„è„°+` 04„è|î04„°+`04„è|Ú04„°+`04„è„°+`;¼/vˆclr-line…,1ò~ 0ò~®~ ü?,~ì2š~l~ }ì|z1„/v‹mark-update …Â1ò}~l(Ú(Ú5Sº|�1:+ª@|º+`6~®+` -Æ<’ modified JRJº+�<’ unmodified /v�?empty-screen † 1òKâ}<0Ô0¾/à/vŠscr-expand†œ1òJºJ’,F,`2ª7,`]4+`ÿÿÿÿ,ÿÿÿà/vŠscr-shrink†Ð1òJºJ’0ò/¤0Ô,F,`6B,`]4+Ðÿÿÿì51:/¸\š51„/vŠquery-user‡1ò4Ò1:/¤4â1:/¤2š4Ò1„>2ET/¸4â1„/¸4Ò1„/vŒget-a-number‡x1òz&/¤‡ˆz&/¸7*/à+ª 0Ô0¾/v�get-end-screen# ‡Ô1ò2š+`}¢<’enter end screen number? }DSº+`+`}¢}D1:‡æ}D1„2š+`}¢2š}ì2š~l}D1:/vŠdel-screenˆ1ò51:ˆ0zŒ7T+ª4†‡(51:Kâ|¦1„2š€Ô+�zÂ0¾0¾/v�do-ins-screen ˆÀ1ò0ò†°+ª†à+�zÂ0¾0¾/vŠins-screen‰01ò51:ˆ0zŒ7T+ª<~ /¤†‰D/¸|z1„51:Kâ|¦1„+�zÂ0¾0¾/v‹get-user-id ‰t1ò|º+` </à+ªŠ(Ú<’enter your id: +` 2š,F+`.(*+Ðÿÿÿð+` 2š,F+`(*+Ðÿÿÿð+` =J|º+` {ü+�0¾/v�init-terminal ‰ì1ò+`(*<’&s1A+`(*<’&f2a5k8d2L Ins Scr+`(*<’t +`(*<’&f2a6k8d2L Del Scr+`(*<’u +`(*<’&f2a7k8d2L Abort +`(*<’v +`(*<’&f2a8k8d2L Exit +`(*<’w /v�restore-terminalЬ1ò+`(*<’&s0A+`(*<’ &f2a5k-1d-1L+`(*<’ &f2a6k-1d-1L+`(*<’ &f2a7k-1d-1L+`(*<’ &f2a8k-1d-1L/vˆprevious‹¾1ò†/¸0¾/¸0¾/¸0¾/¸0¾/¸0¾51:2ª7}*1:+z/v„nextŒj1ò†/¸0¾/¸0¾/¸0¾/¸0¾/¸0¾51:6B}*1:+z/v‰exit-edit ŒÈ1ò‹Ô(Ú/¸0¾/¸0¾/¸0¾/¸0¾/¸0¾/¸0¾/v‹exit-update �1ò†�./vŒexit-scratch�n1ò}~l(Ú(Ú5Sº<’ abandoned �./vŒspecial-keys��1ò(t+`A0¦7*+ª0¾ƒ+�”+`B0¦7*+ª0¾ƒ0+�l+`C0¦7*+ª0¾‚Î+�D+`D0¦7*+ª0¾‚ì+�+`J0¦7*+ª0¾„z+�ô+`K0¦7*+ª0¾…Ð+�Ì+`L0¦7*+ª0¾ƒL+�¤+`M0¦7*+ª0¾ƒh+�|+`P0¦7*+ª0¾ƒ„+�T+`Q0¦7*+ª0¾ƒ®+�,+`U0¦7*+ª0¾ŒÒ+�+`V0¦7*+ª0¾Œx+�Ü+`h0¦7*+ª0¾2š|z1„+�¬+`t0¦7*+ª0¾‰„+�„+`u0¦7*+ª0¾ˆÐ+�\+`v0¦7*+ª0¾�¢+�4+`w0¦7*+ª0¾�€+� zÂ0¾/vŽ(control-char)�Ö;‚{ÔzÂzÂzÂzÂzÂzÂzÂz‚ì„J„zÂz„zÂzÂzÂzÂzÂzÂzÂzÂzÂzÂzÂzÂzÂ�è/vŒcontrol-char�¬1ò0ò+`7*+ª0¾+`0ò+`7T+ª�À+� 0¾zÂ/vŒe-overstrike‘<1ò(t0ò‚+ª(0ò(*~Î1š~ì2ª~*+�‘N/vˆe-insert‘¦1ò(t0ò‚+ª$~ ‚B~ €R2ª~*+�‘N/v‘disp_line_numbers ‘ü1ò}2š,F,`2ÊSf(Ú+Ðÿÿÿì/v†e-init’J1ò51:Kâ|¦1„ŠÀ‰þ}Æ2š|î}¢’b+`2š}¢<’scr:51:2ÚSf2š€Ô/v�e |81òz&+ª 51„’š…:|d1:+ª’ +�‘¸+�ÿÿÿØ/vŒhpcrtclr-scr’Ž1ò+`(*+`h(*+`(*+`J(*/vŒhpcrtclr-eol“\1ò0¾+`(*+`K(*/vˆxystring“¦;‚vö&a00r00C‡hpcrtxy “Ü1ò“ê2Ê04„è“ê+`04„è“ê+` ;¼/vsave tions oaded &a00r00C11