// QCASS.SR get "ginn.df" get "char.df" get "bravo.df" // Incoming procedures external [ CASWRITE CASREAD CASSB qcheckstop setmenu setmessage establishww format cpmin ult disestablishww getvch invalidatewindow updatedisplay specstate nextspecstate ] // Incoming statics external [ vlook vlookremark vcp vchremain vwwcurrent rgdoc rgcpfdispl rgmaccp vdoc vcplastd vpara ] // Outgoing procedures external [ qwritecass ] // Outgoing statics external [ vcasson vcassstop ] // Local statics static [ vcasson vcassstop redactdel redactcr redactspeccr ] // Local manifests manifest [ command = 177770B status = 177771B datain = 177772B dataout = 177773B maxpy = 50 ] structure REDACTCODE: [ blank bit 8 special bit 1 char bit 7 ] let qwritecass() = valof [ let asciitoredact = table [ // THE FORMAT FOR EACH LINE IN THE TABLE IS: // REDACT - ASCII - CHAR - DIFFERENCES // THE REDACT CODES MUST BE CORRECTED BY SHIFTING EACH RIGHT BY // TWO PLACES. THEY ARE WRITTEN THIS WAY IN ORDER TO FACILITATE // READING OF THE CODE CONVERSION TABLE IN THE MANUAL. // UNTRANSLATABLE CHARACTERS ARE CONVERTED TO PLUS/MINUS. #0770 // 0 #0770 // 1 #0770 // 2 #0770 // 3 #0770 // 4 #0770 // 5 #0770 // 6 #0770 // 7 #0224 // 10 BS #0424 // 11 TAB #0770 // 12 #0770 // 13 #0770 // 14 #0724 // 15 CR #0770 // 16 #0770 // 17 #0770 // 20 #0770 // 21 #0770 // 22 #0770 // 23 #0770 // 24 #0770 // 25 #0770 // 26 #0770 // 27 #0770 // 30 #0770 // 31 #0770 // 32 #0770 // 33 #0770 // 34 #0770 // 35 #0770 // 36 #0770 // 37 #0124 // 40 SP #0770 // 41 ! #0250 // 42 " #0760 // 43 # #0710 // 44 $ #0650 // 45 % #0750 // 46 & #0254 // 47 ' #0600 // 50 ( #0610 // 51 ) #0740 // 52 * #0060 // 53 + #0144 // 54 , #0004 // 55 - #0264 // 56 . #0114 // 57 / #0614 // 60 0 #0774 // 61 1 #0664 // 62 2 #0764 // 63 3 #0714 // 64 4 #0654 // 65 5 #0644 // 66 6 #0754 // 67 7 #0744 // 70 8 #0604 // 71 9 #0150 // 72 : #0154 // 73 ; #0770 // 74 < #0064 // 75 = #0770 // 76 > #0110 // 77 ? #0660 // 100 @ #0340 // 101 A #0400 // 102 B #0540 // 103 C #0550 // 104 D #0450 // 105 E #0160 // 106 F #0170 // 107 G #0410 // 110 H #0240 // 111 I #0070 // 112 J #0440 // 113 K #0510 // 114 L #0370 // 115 M #0460 // 116 N #0310 // 117 O #0050 // 120 P #0040 // 121 Q #0350 // 122 R #0210 // 123 S #0470 // 124 T #0560 // 125 U #0360 // 126 V #0200 // 127 W #0570 // 130 X #0010 // 131 Y #0670 // 132 Z #0770 // 133 [ #0770 // 134 \ #0770 // 135 ] #0000 // 136 ↑ ** redactron UL, photon em-dash ** #0274 // 137 ← ** redactron half, photon bell ** #0254 // 140 ' #0344 // 141 a #0404 // 142 b #0544 // 143 c #0554 // 144 d #0454 // 145 e #0164 // 146 f #0174 // 147 g #0414 // 150 h #0244 // 151 i #0074 // 152 j #0444 // 153 k #0514 // 154 l #0374 // 155 m #0464 // 156 n #0314 // 157 o #0054 // 160 p #0044 // 161 q #0354 // 162 r #0214 // 163 s #0474 // 164 t #0564 // 165 u #0364 // 166 v #0204 // 167 w #0574 // 170 x #0014 // 171 y #0674 // 172 z #0770 // 173 { #0770 // 174 | #0770 // 175 } #0770 // 176 ~ #0324 // 177 DEL ] redactdel = (asciitoredact ! $*177) rshift 2 redactcr = (asciitoredact ! $*C) rshift 2 redactspeccr = (asciitoredact ! $*C) rshift 2 vcassstop = false setmenu() setmessage(" Bug Stop to terminate writing") qcasswrite1(asciitoredact, vwwcurrent) vcasson = false vcassstop = false resultis 1 ] and qcasswrite1(convert, ww) be [ let buffer = vec 256 let doc = rgdoc ! ww let cp = rgcpfdispl ! ww let cpl = rgmaccp!doc - 2 vchremain = 0 vdoc = doc let ycur = 0 for i = 0 to 100 do @command = 100000B @command = 0 [ if not ult(cp, cpl) then [ setmessage(" Writing finished") return ] establishww(ww, devdp) format(doc, cp, devdp) vcp = cp vchremain = 0 cp = cpmin(vcplastd, cpl)+1 vcp = specstate(vdoc, vcp, vpara) let changecp = nextspecstate() disestablishww() let i = 0 let eop = false let parity = 0 while vcp ls cp do [ let char = getvch() if ((vlook & mvanish) ne 0) % (((vlook & mremark) ne 0) & (not vlookremark)) then loop if vcp-1 eq changecp then [ changecp = nextspecstate() if changecp eq -1 then eop = true break ] if vcp eq cp & char eq chsp then [ eop = false break ] if char eq chcr then [ eop = true break ] char = ((convert ! char) rshift 2) & #000377 buffer ! i = char parity = parity xor char i = i+1 ] qcasswrite2(buffer, i, eop, parity) unless qcheckstop(lv vcassstop) do [ setmessage(" Writing terminated") return ] ycur = ycur+1 if ycur eq maxpy then [ invalidatewindow(ww) rgcpfdispl ! ww = cp updatedisplay() ycur = 0 ] ] repeat ] and qcasswrite2(buf, n, eop, parity) = valof [ for i = 0 to 3 do [ buf ! (n+i) = redactdel parity = parity xor redactdel ] let cr = eop? redactspeccr, redactcr buf ! (n+4) = cr parity = parity xor cr test parity<<REDACTCODE.special ifso parity<<REDACTCODE.special = 0 ifnot parity<<REDACTCODE.special = 1 buf ! (n+5) = parity & #000377 resultis CASWRITE(buf, n+6, false) ]