From 5c6c10fe2f53b978e0b2a3a34a3d5b0d4cbb9c80 Mon Sep 17 00:00:00 2001 From: Lars Brinkhoff Date: Sat, 27 Apr 2019 20:50:53 +0200 Subject: [PATCH] New version. --- src/zil/{x.mid => zap.mid} | 879 ++++++++++++++++++------------------- 1 file changed, 420 insertions(+), 459 deletions(-) rename src/zil/{x.mid => zap.mid} (89%) diff --git a/src/zil/x.mid b/src/zil/zap.mid similarity index 89% rename from src/zil/x.mid rename to src/zil/zap.mid index f154527e..06d811f2 100644 --- a/src/zil/x.mid +++ b/src/zil/zap.mid @@ -1,4 +1,4 @@ -TITLE ZAP -- Z-Language Assembler +TITLE ZAP -- New Z-Language Assembler ; ZAP version 3 - Expanded word table to 96 words ; MARC/JMB - 1/7/82 @@ -15,7 +15,9 @@ SUBTTL ACS E=5 F=6 G=7 + ZCHR=7 H=10 + FRMT=10 I=11 J=12 ;called J only during word-frequency pass ;acs below this point are used for special purposes @@ -26,6 +28,8 @@ SUBTTL ACS TP=16 ;pointer into token table TOKENS P=17 ;stack +%FWDCT==512.-16. + ;bits in symbol table words %UNDEF==400000 ;undefined symbol; right half will be ptr to references %VAR==200000 ;symbol is a variable @@ -982,9 +986,9 @@ OUTBYT: CAILE A,377 ;too big? ;enter here to just output the byte directly OUTBY1: IDPB A,Z ;output byte ADDI ZPC,1 ;increment pc - HRRZ 0,(P) + MOVE 0,(P) SKIPN TABLE - SKIPE STRFLG' + CAIL 0,SLOOK POPJ P, SKIPN PASS2 AOS CODLEN' @@ -1359,7 +1363,7 @@ ZFSTR: SKIPN A,4(TP) MOVEM H,-1(G) ;string AOS H,FSTRS MOVEM H,-2(G) ;count - CAIG H,96. + CAIG H,%FWDCT JRST ZFSTR1 MSG [Too many .FSTRs] ZFERR: PUSHJ P,ERROR @@ -1375,7 +1379,7 @@ ZFSTR1: PUSHJ P,WRDBDY POPJ P, SKIPN A,(TP) JRST TFARG - PUSHJ P,MAKSTR + PUSHJ P,MAKFST POPJ P, @@ -1387,7 +1391,7 @@ ZGSTR: PUSHJ P,WRDBDY POPJ P, SKIPN A,(TP) JRST TFARG - PUSHJ P,MAKFRQ + PUSHJ P,MAKSTR POPJ P, ZGVAR: AOS GLBTOT @@ -1490,7 +1494,7 @@ SUBTTLE STRING PSEUDOS ZSTR: SKIPN A,2(TP) JRST TFARG - PUSHJ P,MAKFRQ + PUSHJ P,MAKSTR POPJ P, ZSTRL: MOVEI A,0 @@ -1510,7 +1514,7 @@ ZSTRL: MOVEI A,0 ZZWORD: NXTARG 1 SKIPN A,(TP) JRST TFARG - PUSHJ P,MAKWRD ;make a 6-char word + PUSHJ P,MAKZWD POPJ P, TFARG: MSG [Too few arguments] @@ -1582,7 +1586,7 @@ AOPER1: SKIPN (TP) HRRZ A,A PUSHJ P,OUTBYT MOVE A,(TP) - PUSHJ P,MAKFRQ + PUSHJ P,MAKSTR SKIPN 2(TP) SKIPE 3(TP) JRST TMAPRI @@ -2689,209 +2693,300 @@ SUBTTL STRING ASSEMBLY ;zstrings from strings ; a/ ptr to string to translate -MAKFRQ: SETOM FREQST - MOVEI H,-1 - JRST MAKST1 -MAKWRD: MOVEI H,2 ;count of words allowed (six chars max) - SETZM FREQST ;not frequency string - JRST MAKST1 +MAKFST: SETOM MKFSTR' + SETOM ZWDFLG + JRST MAKS -MAKSTR: MOVEI H,-1 ;many words allowed - SETZM FREQST ;not frequency string +MAKZWD: SETOM ZWDFLG' + SETOM MKFSTR + JRST MAKS -MAKST1: SETOM STRFLG - SKIPE CDEBUG - PUSHJ P,CSTRNG - MOVEI D,0 ;char set - MOVEI E,3 ;"old" character set - MOVEM E,ZCSET ;save it away -ZSTRW: MOVEI F,0 ;build words here - MOVEI G,3 ;count of chars in word -ZSTRLP: MOVE B,A - ILDB C,B ;pick up next character - CAIN C,^J - JRST [MOVE A,B - JRST ZSTRLP] ;linefeeds ignored - JUMPE C,ZSTRND ;leave if zero - JRST ZCHAR +MAKSTR: SETZM ZWDFLG + SETZM MKFSTR +MAKS: SKIPE ZDEBUG + JRST [PUSH P,A + MOVEI A,^M + PBOUT + MOVEI A,^J + PBOUT + MOVE A,(P) + PSOUT + MOVEI A,40 + PBOUT + POP P,A + JRST .+1] + MOVEI ZCHR,0 ; initialize ZCHR byte + SKIPA FRMT,[%FSPC+%FCAP]; at start, default is cap + space +MAKSTL: MOVEI FRMT,%FSPC ; except at start, default is space + MOVEM FRMT,FRMDFL ; set up default + MOVE C,A + ILDB B,C ; get first character + JUMPE B,MAKSTE ; done + PUSHJ P,BALPHA ; check for alphabetic + JRST MAKS1 ; no. goto ascii escape +MAKST0: MOVEI FRMT,%FCAP + CAIG B,"Z + CAIGE B,"A + TRZ FRMT,%FCAP ; turn off capitalize bit if not upper case + SKIPN MKFSTR ; don't bother with freq stuff for fstrs + PUSHJ P,WFREQ ; lookup word in table (a is updated) + JRST MAKS2 ; not there, loser! + PUSH P,C ; save the word number + SKIPE INZASC + PUSHJ P,ENZASC + PUSHJ P,MAKFRM ; setup the format for the word + CAME FRMT,FRMDFL' ; if it's the default, don't bother + PUSHJ P,OUTFRM ; output the format + POP P,C ; restore the word number + SKIPE ZDEBUG + JRST [PUSH P,A + MOVEI A,"W + PBOUT + POP P,A + JRST .+1] + CAIL C,240. + JRST [SUBI C,240. + PUSH P,C + MOVEI C,%FNXT ; output next 256-word byte + PUSHJ P,OUTBYC + POP P,C + JRST .+2] + ADDI C,16. ; frob with word number + PUSHJ P,OUTBYC + JRST MAKSTL ; and loop -;here to output a character -ZOUT: SKIPE CDEBUG - PUSHJ P,COUT - LSH F,5 ;5 bits wide - ADD F,C ;add in new character - SOJG G,ZSTRLP ;loop if haven't filled a word - PUSHJ P,OUTSTW ;put word out - SOJG H,ZSTRW ;loop if haven't counted out words +MAKS1: MOVEI C,%FASC + SKIPN INZASC + PUSHJ P,OUTBYC +MAKS1L: ILDB B,A + JUMPE B,MAKSTX + PUSHJ P,BALPHA + JRST MAKS1A +MAKSEZ: SETOM INZASC' + PUSHJ P,BACKA + MOVEI FRMT,%FSPC ; except at start, default is space + MOVEM FRMT,FRMDFL ; set up default + JRST MAKST0 -ZSTRND: CAIG H,2 ;building string or word? - JRST ZWRDND ; word - CAIN G,3 ; string - JRST ZSTRTG -ZSTRN1: LSH F,5 - ADDI F,5 - SOJG G,ZSTRN1 - PUSHJ P,OUTSTW -ZSTRTG: LDB G,LSTRWD - TRO G,200 - DPB G,LSTRWD - SETZM STRFLG +BACKA: MOVNI B,1 + ADJBP B,A + MOVE A,B POPJ P, -ZWRDND: JUMPE H,ZSTRTG - LSH F,5 - ADDI F,5 - SOJG G,ZWRDND - PUSHJ P,OUTSTW -;reset counter and string - MOVEI G,3 - MOVEI F,0 - SOJG H,ZWRDND - JRST ZSTRTG +MAKS1A: PUSHJ P,MAKZBT + JRST MAKS1L -;here to do character set changes -ZCHAR: PUSHJ P,ZCS ;get set for character - SKIPE FREQST ;don't do this hair if not GSTR or PRINTI string - CAIG H,4 ;assembling string? - JRST ZCHAR1 ;no, word, ignore freq. junk -; CAIN C,40 -; JRST ZCHARS -; CAIG E,1 -; CAML E,ZCSET -; JRST ZCHAR1 -; MOVE 0,ZCSET -; CAIG 0,1 -; JRST ZCHAR1 -ZCHARS: PUSHJ P,WFREQ ;takes string in a, returns ptr in a - JRST ZCHAR1 -;word is in frequency table - LSH F,5 - PUSH P,D - IDIVI C,32. - ADDI F,1(C) ; get the right table - MOVE C,D ; remainder is output next - POP P,D - SKIPE CDEBUG - JRST [PUSH P,C - MOVEI C,1 - PUSHJ P,COUT - POP P,C - JRST .+1] - SOJG G,ZOUT - PUSHJ P,OUTSTW - MOVEI F,0 - MOVEI G,3 - JRST ZOUT +MAKS2: MOVEI C,%FASC ; escape to ZASCII + SETZM MAKSAF' + SKIPE MKFSTR + JRST MAKS2L + SKIPN INZASC + PUSHJ P,OUTBYC +MAKS2L: ILDB B,A ; get next character + JUMPE B,MAKSTX + CAIN B,"' + JRST MAKS2A + PUSHJ P,BALPHA + CAIA + JRST MAKS2A + SETOM MAKSAF + PUSHJ P,MAKZBT + JRST MAKS2L -ZCHAR1: MOVE A,B - MOVEM E,ZCSET - CAIN E,3 - JRST [MOVEI C,0 - JRST ZOUT] - CAMN D,E ;same as current? - JRST ZCC -;next char is different set, see if next-next is the same - MOVE B,A ;see if next-next character is same different set -ZNEXT: ILDB 0,B ;get next-next - JUMPE 0,ZCHCS ;no next-next character - CAIN 0,^J - JRST ZNEXT ;linefeeds don't count - PUSH P,C ;save next char - PUSH P,E ; and its set - MOVE C,0 ;get next-next - PUSHJ P,ZCS ;set for next-next -;decide whether to change set temp. or perm. +MAKS2A: SKIPE MAKSAF + JRST MAKSEZ + PUSHJ P,MAKZBT + JRST MAKS2L - JRST ZCHCST +ENZASC: JUMPN ZCHR,ENZAS1 + MOVEI C,0 + PUSHJ P,OUTBYC + SETZM INZASC + POPJ P, -;code for permanent shifting rests in peace below -;some day it may be resurrected (consult the ZIP document) +ENZAS1: MOVEI 0,0 + PUSHJ P,ADDZCH + SETZM INZASC + POPJ P, - CAME E,(P) ;same set as next? - JRST ZCHCST ; go change temporarily -ZCHCSP: POP P,E ;new permanent char set - POP P,C ;char -;calculate byte for new permanent set - PUSH P,H - EXCH D,E - SUBM D,E - MOVE H,E - ADDI H,3 - IDIVI H,3 - ADDI I,3 - POP P,H ;new perm. set in I +%FEOS==0 +%FSPC==1 +%FCOM==2 +%FCAP==4 +%FFLG==8 -;output set change byte -ZOUTB: SKIPE CDEBUG - JRST [PUSH P,C ;save next char - MOVE C,I - PUSHJ P,COUT - POP P,C - JRST .+1] - LSH F,5 - ADD F,I ;output new char set. - SOJG G,ZCC -;output this word and then continue - PUSHJ P,OUTSTW - SOJE H,CPOPJ ;end for zwords - MOVEI F,0 - MOVEI G,3 - JRST ZCC +%FESS==5 +%FNXT==4 +%FESN==3 +%FEOL==2 +%FASC==1 -;calculate byte for temporary set -ZCHCST: POP P,E ;temporary char set - POP P,C +CHR1T: "e ? "t ? "s ? "a ? "o ? "n ? "r ? "i + "l ? "d ? "h ? "u ? "g ? 0 -;;ZCHCS: PUSH P,H +CHR2T: "c ? "b ? "m ? "w ? "y ? "p ? "f ? "k + "v ? "z ? "j ? "x ? "q ? 40 ? "! ? "? -ZCHCS: MOVEI I,3(E) - JRST ZOUTB +MAKZBT: MOVEI D,CHR1T +MAKZL1: SKIPN C,(D) + JRST MAKZB1 + CAME C,B + AOJA D,MAKZL1 + MOVEI 0,-CHR1T+3(D) + PUSHJ P,ADDZCH + POPJ P, + +MAKZB1: MOVEI D,CHR2T +MAKZL2: SKIPN C,(D) + JRST MAKZB2 + CAME C,B + AOJA D,MAKZL2 + MOVEI 0,1 + PUSHJ P,ADDZCH + MOVEI 0,-CHR2T(D) + PUSHJ P,ADDZCH + POPJ P, + +MAKZB2: MOVEI 0,2 + PUSHJ P,ADDZCH + PUSH P,B + LSH B,-4 + MOVE 0,B + PUSHJ P,ADDZCH + POP P,B + ANDI B,17 + MOVE 0,B + PUSHJ P,ADDZCH + POPJ P, + +ADDZCH: JUMPN ZCHR,ADDZC1 + MOVE ZCHR,0 + POPJ P, + +ADDZC1: LSH ZCHR,4 + ADD ZCHR,0 + MOVE C,ZCHR + PUSHJ P,OUTBYC + SKIPE ZDEBUG + JRST [PUSH P,A + PUSH P,B + PUSH P,C + MOVEI A,"( + PBOUT + MOVE B,ZCHR + LSH B,-4 + MOVEI A,.PRIOU + MOVEI C,10. + NOUT + JFCL + MOVEI B,"+ + BOUT + MOVE B,ZCHR + ANDI B,17 + NOUT + JFCL + MOVEI B,") + BOUT + MOVEI B,40 + BOUT + POP P,C + POP P,B + POP P,A + JRST .+1] + MOVEI ZCHR,0 + POPJ P, -;hairy shift code removed +MAKSTX: PUSHJ P,ENZASC +MAKSTE: MOVEI C,%FEOS ; strings end with EOS + SKIPE ZWDFLG + POPJ P, + MOVE 0,LSTFRM + CAIE 0,%FFLG+%FESS + PUSHJ P,OUTBYC + POPJ P, -;; SUB E,D -;; MOVE H,E -;; ADDI H,3 -;; IDIVI H,3 -;; ADDI I,1 -;; POP P,H -;; JRST ZOUTB +OUTBYC: EXCH A,C ; output byte in c, saving a + SKIPE ZDEBUG + PUSHJ P,PROUTB + PUSHJ P,OUTBYT + MOVE A,C + SKIPN PASS2 + AOS FSTRCT' + POPJ P, -ZCC: PUSHJ P,ZCB ;get byte - JRST ZOUT ;winning char -;here for characters not in the normal set -ZASCII: LSH F,5 - ADDI F,6 ;add in ascii escape byte - SKIPE CDEBUG - JRST [PUSH P,C - MOVEI C,6 - PUSHJ P,COUT - POP P,C - JRST .+1] - SOJG G,ZASCI1 - PUSHJ P,OUTSTW - SOJE H,CPOPJ ;end for zwords - MOVEI F,0 - MOVEI G,3 -ZASCI1: MOVE B,C - LSH B,-5 - LSH F,5 - ADD F,B - SKIPE CDEBUG - JRST [PUSH P,C - MOVE C,B - PUSHJ P,COUT - POP P,C - JRST .+1] - SOJG G,ZASCI2 - PUSHJ P,OUTSTW - SOJE H,CPOPJ ;end for zwords - MOVEI F,0 - MOVEI G,3 -ZASCI2: ANDI C,37 - JRST ZOUT - +PROUTB: PUSH P,A + PUSH P,B + PUSH P,C + MOVE B,A + MOVEI A,.PRIOU + MOVEI C,10. + NOUT + JFCL + MOVEI A,40 + PBOUT + POP P,C + POP P,B + POP P,A + POPJ P, + +OUTFRM: TRO FRMT,%FFLG ; set the format bit + MOVEM FRMT,LSTFRM' + SKIPE ZDEBUG + JRST [PUSH P,A + MOVEI A,"F + PBOUT + POP P,A + JRST .+1] + MOVE C,FRMT ; save A + SKIPN ZWDFLG + PUSHJ P,OUTBYC ; output the format byte + POPJ P, + +MAKFRM: PUSH P,A ; save text pointer + ILDB B,A ; get separator + CAIN B,". + JRST MAKFPR + CAIN B,", ; check for comma + JRST MAKFCM + CAIN B,40 ; check for space + JRST MAKFSP + CAIN B,^M + JRST MAKFEL +MAKFNR: POP P,A ; restore A to get separator into string + POPJ P, + +MAKFEL: ILDB B,A ; read LF + MOVEI C,%FEOL + PUSHJ P,OUTBYC + MOVE FRMT,FRMDFL + JRST POPPO + +MAKFPR: MOVE C,A + ILDB B,C + JUMPE B,[MOVEI C,%FESS + JRST MAKFPS] + CAIE B,40 + JRST MAKFNR + MOVEI C,%FESN +MAKFPS: PUSHJ P,OUTBYC + MOVE FRMT,FRMDFL + MOVE A,C + JRST POPPO + +MAKFSP: TRO FRMT,%FSPC +POPPO: POP P,0 + POPJ P, + +MAKFCM: TRO FRMT,%FCOM ; set the comma next bit + MOVE C,A + ILDB B,C ; get next character + CAIN B,40 ; is it a space? + JRST [MOVE A,C + TRO FRMT,%FSPC + JRST .+1] + POP P,0 ; we're all set now with updated A + POPJ P, ;lookup word in word table ; a/ word @@ -2939,118 +3034,39 @@ WFREQX: POP P,H SFREQ: PUSH P,A PUSH P,C + SETZM SFREQ1' FREQN: ILDB C,B JUMPE C,FREQQ ILDB 0,A + SKIPN SFREQ1 + JRST [CAIL 0,"A + CAILE 0,"Z + CAIA + ADDI 0,32. + JRST .+1] + SETOM SFREQ1 CAME 0,C JRST FREQD JRST FREQN -FREQQ: POP P,C +FREQQ: MOVE C,A + ILDB B,C + CAIN B,"' + JRST FREQD1 + PUSHJ P,BALPHA + JRST FREQQ1 + JRST FREQD1 +FREQQ1: POP P,C POP P,0 POPJ P, FREQD: CAML 0,C - AOS -2(P) +FREQD1: AOS -2(P) AOS -2(P) POP P,C POP P,A POPJ P, -SUBTTL OUTPUT A STRING WORD - -;output a string word -;F/ string word -OUTSTW: PUSH P,A - PUSH P,B - PUSH P,C - MOVE A,F - LSH A,-10 - PUSHJ P,OUTBYT - MOVEM Z,LSTRWD ;save z so stop bit can be stuck in later - MOVE A,F - ANDI A,377 - PUSHJ P,OUTBYT ;low byte - POP P,C - POP P,B - POP P,A - POPJ P, - -SUBTTL Conversion of ASCII to ZASCII - -;return which cs chr in C is in. returns in E -ZCS: CAIE C,40 - JRST ZNRM - MOVEI E,3 ;in all sets, return "set" 3 - POPJ P, - -ZNRM: CAIL C,"a ;CS 0? - CAILE C,"z - JRST ZNRM1 - MOVEI E,0 - POPJ P, - -ZNRM1: CAIL C,"A ;CS 1? - CAILE C,"Z - JRST ZNRM2 - MOVEI E,1 - POPJ P, - -ZNRM2: MOVEI E,2 ;everything else is CS 2 - POPJ P, - -;return byte for this character -; C/ character -;returns -; C/ value -;skip returns if character must be ascii escaped -ZCB: CAIE C," - JRST .+3 - MOVEI C,0 ;space = 0 - POPJ P, - - CAIL C,"a - CAILE C,"z - JRST ZC1 - SUBI C,"a-6 ;a-z = 6-37 - POPJ P, - -ZC1: CAIL C,"A - CAILE C,"Z - JRST ZC2 - SUBI C,"A-6 ;A-Z = 6-37 - POPJ P, - -ZC2: CAIN C,^M - JRST [MOVEI C,7 - POPJ P,] - CAIL C,"0 - CAILE C,"9 - JRST ZCFNY - SUBI C,"0-8 - POPJ P, - -;in set 2 but not a number, search for it -ZCFNY: PUSH P,A - MOVNI A,16. - CAMN C,CS2CH(A) - JRST ZCFND ;got it - AOJL A,.-2 - AOSA -1(P) ;skip return means is not a usual character -ZCFND: MOVE C,CS2VL(A) ;return value in C - POP P,A - POPJ P, - -;table of characters in set 2 and their values - 40 ? ". ? ", ? "! ? "? - "_ ? "# ? "' ? "" ? "/ - "\ ? "- ? ": ? "( ? ") -CS2CH: - 6 ? 22 ? 23 ? 24 ? 25 - 26 ? 27 ? 30 ? 31 ? 32 - 33 ? 34 ? 35 ? 36 ? 37 -CS2VL: - SUBTTL STRING ASSEMBLY DEBUGGING ;print zstring being assembled @@ -3097,16 +3113,38 @@ SUBTTL ROUTINE FOR PRINTING CURRENT ZFUNCTION NAME AND CURRENT PC PFUNCT: PUSH P,A PUSH P,B PUSH P,C - HRROI A,[ASCIZ / = /] + HRROI A,[ASCIZ / Len = /] PSOUT - MOVE B,CODLEN MOVEI A,.PRIOU - SUB B,CODSAV' - MOVEI C,0 + MOVE B,ZPC + SUB B,ZPCLF' + PUSH P,B + MOVEM ZPC,ZPCLF + MOVEI C,10. NOUT JFCL - MOVE B,CODLEN - MOVEM B,CODSAV + HRROI A,[ASCIZ / Str = /] + PSOUT + MOVEI A,.PRIOU + MOVE B,FSTRCT + ADDM B,FSTRTT' + MOVEI C,10. + NOUT + JFCL + HRROI A,[ASCIZ / (/] + PSOUT + POP P,B + MOVE A,FSTRCT + IMULI A,100. + IDIV A,B + MOVE B,A + MOVEI A,.PRIOU + MOVEI C,10. + NOUT + JFCL + HRROI A,[ASCIZ /%)/] + PSOUT + SETZM FSTRCT MOVEI A,^M PBOUT MOVEI A,^J @@ -3149,16 +3187,22 @@ FOPER: TLNN B,%STR POPJ P, FPSEUD: HRRZ B,B + SETZM FPSVFL CAIE B,ZINSER CAIN B,ZENDI JRST (B) + CAIN B,ZZWORD + JRST FPSEUV CAIE B,ZSTRL CAIN B,ZSTR JRST FPSEU1 CAIE B,ZGSTR POPJ P, +FPSEUV: SETOM FPSVFL' + JRST FPSEU1 + FPSEU2: NXTARG 1 FPSEU1: NXTARG 1 SKIPN D,(TP) @@ -3174,44 +3218,30 @@ NEWWRD: JUMPE D,CPOPJ MOVEI J,0 ;count of bytes NXTWRD: ILDB A,D JUMPE A,CPOPJ - PUSHJ P,PUNCT - JRST WRDSTA ;if punct. sequence PUSHJ P,ALPHA JRST NXTWRD - TRNN A,40 ;l.c. letter? -WRDSTA: ADDI J,1 ;U.C. letter takes additional byte - -WRDBEG: IDPB A,E + CAIG A,"Z + CAIGE A,"A + CAIA + ADDI A,40 +WRDLP: IDPB A,E ADDI J,1 MOVE F,D ;save this pointer ILDB A,D JUMPE A,WRDEOS + CAIG A,"Z + CAIGE A,"A + CAIA + ADDI A,40 + CAIN A,"' + JRST WRDLP PUSHJ P,ALPHA JRST WRDEND ;not alphabetic - JRST WRDBEG - -;here check for ' followed by alphabetic (turn ' into alphabetic) -WRDQUT: PUSH P,A - PUSH P,D - ILDB A,D - PUSHJ P,ALPHA - JRST [POP P,D - POP P,A - JRST WRDEN1] - POP P,D - POP P,A - ADDI J,1 ;' takes two bytes - JRST WRDBEG + JRST WRDLP WRDEOS: MOVEI D,0 ;end of input string JRST WRDEN2 -WRDEND: CAIN A,"' - JRST WRDQUT -WRDEN1: CAIN A,40 ;SP is included in words - JRST [IDPB A,E - ADDI J,1 - JRST WRDEN3] - MOVE D,F ;recover non-spaced bptr +WRDEND: MOVE D,F ;recover non-spaced bptr WRDEN3: MOVEI A,0 WRDEN2: IDPB A,E MOVE A,[440700,,WRDBUF] @@ -3259,9 +3289,11 @@ WRDAD1: MOVE A,TABPTR JRST NEWWRD ;here when all done -FILEND: PUSHJ P,BYTES +FILEND: + PUSHJ P,BYTES PUSHJ P,SORT + ;here to output the data MOVE A,[440700,,[ASCIZ /FREQ.ZAP/]] MOVE B,OUTPTR @@ -3280,149 +3312,42 @@ FILEND: PUSHJ P,BYTES ;output the goodies MOVE G,WRDTAB - HRLI G,-<2*96.> + HRLI G,-<2*%FWDCT> PUSHJ P,PTAB - -;output garbage at end - + MOVE A,OJFN HRROI B,[ASCIZ / -;word frequency table of 96 most common words - -WORDS:: .TABLE - FSTR?1 - FSTR?2 - FSTR?3 - FSTR?4 - FSTR?5 - FSTR?6 - FSTR?7 - FSTR?8 - FSTR?9 - FSTR?10 - FSTR?11 - FSTR?12 - FSTR?13 - FSTR?14 - FSTR?15 - FSTR?16 - FSTR?17 - FSTR?18 - FSTR?19 - FSTR?20 - FSTR?21 - FSTR?22 - FSTR?23 - FSTR?24 - FSTR?25 - FSTR?26 - FSTR?27 - FSTR?28 - FSTR?29 - FSTR?30 - FSTR?31 - FSTR?32 - FSTR?33 - FSTR?34 - FSTR?35 - FSTR?36 - FSTR?37 - FSTR?38 - FSTR?39 - FSTR?40 - FSTR?41 - FSTR?42 - FSTR?43 - FSTR?44 - FSTR?45 - FSTR?46 - FSTR?47 - FSTR?48 - FSTR?49 - FSTR?50 - FSTR?51 - FSTR?52 - FSTR?53 - FSTR?54 - FSTR?55 - FSTR?56 - FSTR?57 - FSTR?58 - FSTR?59 - FSTR?60 - FSTR?61 - FSTR?62 - FSTR?63 - FSTR?64 - FSTR?65 - FSTR?66 - FSTR?67 - FSTR?68 - FSTR?69 - FSTR?70 - FSTR?71 - FSTR?72 - FSTR?73 - FSTR?74 - FSTR?75 - FSTR?76 - FSTR?77 - FSTR?78 - FSTR?79 - FSTR?80 - FSTR?81 - FSTR?82 - FSTR?83 - FSTR?84 - FSTR?85 - FSTR?86 - FSTR?87 - FSTR?88 - FSTR?89 - FSTR?90 - FSTR?91 - FSTR?92 - FSTR?93 - FSTR?94 - FSTR?95 - FSTR?96 - .ENDT +WORDS:: .TABLE/] + MOVEI C,0 + SOUT + MOVE G,[-%FWDCT,,1] +FWTBLL: MOVE A,OJFN + HRROI B,[ASCIZ / + FSTR?/] + MOVEI C,0 + SOUT + HRRZ B,G + MOVEI C,10. + NOUT + JFCL + AOBJN G,FWTBLL + MOVE A,OJFN + HRROI B,[ASCIZ / .ENDI /] MOVEI C,0 SOUT - - MOVE A,OJFN CLOSF JFCL - - MSG [Best 96 words: ] - PSOUT - MOVEI A,.PRIOU - MOVE B,D - MOVEI C,10. - NOUT - JFCL - MSG [ zbytes saved, ] - PSOUT - MOVEI A,.PRIOU - MOVE B,E - NOUT - JFCL - MSG [ uses. -] - PSOUT - HALTF ;calculate bytes saved BYTES: MOVE A,WRDTAB + SETZM XTWRDS' BYTES1: HRRZ B,(A) - HLRZ C,(A) - SUBI C,2 - IMUL B,C + ADDM B,XTWRDS HRLM B,(A) ADD A,[2,,2] JUMPL A,BYTES1 @@ -3520,15 +3445,16 @@ PTAB: PUSH P,A PUSH P,C SETZB D,E MOVEI F,0 -PTLOOP: MOVE A,OJFN +PTLOOP: ADDI F,1 + MOVE A,OJFN HRROI B,[ASCIZ / .FSTR FSTR?/] MOVEI C,0 SOUT - ADDI F,1 MOVE B,F MOVEI C,10. NOUT JFCL + MOVE A,OJFN HRROI B,[ASCIZ /,"/] MOVEI C,0 SOUT @@ -3540,13 +3466,6 @@ PTLOOP: MOVE A,OJFN HLRZ B,(G) ADD D,B MOVEI C,10. - NOUT - JFCL - MOVEI B,11 - BOUT - HRRZ B,(G) - ADD E,B - MOVEI C,10. NOUT JFCL MOVEI B,15 @@ -3555,11 +3474,41 @@ PTLOOP: MOVE A,OJFN BOUT ADD G,[2,,2] JUMPL G,PTLOOP + PUSHJ P,PT512 POP P,C POP P,B POP P,A POPJ P, +PT512: HRROI B,[ASCIZ / + +; Top 512 Words: /] + MOVEI C,0 + SOUT + MOVE A,OJFN + MOVE B,D + MOVEI C,10. + NOUT + JFCL + HRROI B,[ASCIZ / uses (/] + MOVEI C,0 + SOUT + MOVE A,OJFN + MOVE B,D + IMULI B,100. + IDIV B,XTWRDS + MOVEI C,10. + NOUT + JFCL + HRROI B,[ASCIZ /%) + +/] + MOVEI C,0 + SOUT + POPJ P, + + + ;lookup word in word table ; a/ word ; +1: not found, loc to add in (g) @@ -3622,6 +3571,17 @@ ALPHA: CAIL A,"A ALPHA1: AOS (P) POPJ P, + +BALPHA: CAIL B,"A + CAILE B,"Z + SKIPA + JRST BALPH1 + CAIL B,"a + CAILE B,"z + POPJ P, +BALPH1: AOS (P) + POPJ P, + PUNCT: CAIE A,", CAIN A,". POPJ P, @@ -3640,6 +3600,7 @@ PDEBUG: 0 ;if non-0, print lines as they are read TDEBUG: 0 ;if non-0, print tokens after parsing them ODEBUG: 0 ;if non-0, print opers info CDEBUG: 0 ;if non-0, print strings in "zascii" +ZDEBUG: -1 FDEBUG: 0 ;if non-0, print functions as they are found STOP: 0 ;if non-0, location to halt at (for changing flags) SYMFLG: 0 ;if non-0, output symbol table