-- AsciiToTASCII.mesa -- created by Haeberli: 10-Feb-82 19:06:58 DIRECTORY AltoDefs, Inline, IODefs, StreamDefs; AsciiToTASCII: PROGRAM IMPORTS AltoDefs, Inline, IODefs, StreamDefs = { bitsLeft: [0..8] ← 8; byte: [0..256) ← 0; inDh: StreamDefs.DiskHandle; outDh: StreamDefs.DiskHandle; maxLength: CARDINAL = 256; record: ARRAY [0..maxLength) OF AltoDefs.BYTE; length: [0..maxLength] ← 0; StartRecord: PROCEDURE = {length ← 0}; EndRecord: PROCEDURE = {IF length # 0 THEN {l: CARDINAL ← length; outDh.put[outDh, Inline.HighByte[l]]; outDh.put[outDh, Inline.LowByte[l]]; FOR i: CARDINAL IN [0..length) DO outDh.put[outDh, record[i]]; ENDLOOP;};}; Put: PROCEDURE [byte: AltoDefs.BYTE] = {record[length] ← byte; length ← length + 1; IF length = maxLength THEN {EndRecord[]; StartRecord[];};}; Initialize: PROCEDURE = {bitsLeft ← 8; byte ← 0}; Flush: PROCEDURE [out: StreamDefs.DiskHandle] = { FOR i: CARDINAL IN [0..6) UNTIL bitsLeft = 0 DO IF bitsLeft = 0 THEN {Put[byte]; bitsLeft ← 8; byte ← 0; }; byte ← Inline.BITSHIFT[byte, 1]; bitsLeft ← bitsLeft - 1; ENDLOOP; Put[byte]; EndRecord[]; Initialize[]; }; Truncate: PROCEDURE [out: StreamDefs.DiskHandle, ch: CHARACTER] = { tch: [0..64) = IF ch = IODefs.CR THEN 63 ELSE Inline.BITAND[(2000B + LOOPHOLE[ch, INTEGER] - 240B), 77B]; rtch: WORD ← Inline.BITSHIFT[tch, 10]; FOR i: CARDINAL IN [0..6) DO IF bitsLeft = 0 THEN {Put[byte]; bitsLeft ← 8; byte ← 0; }; byte ← Inline.BITSHIFT[byte, 1]; byte ← Inline.BITOR[byte, Inline.BITSHIFT[rtch, -15]]; bitsLeft ← bitsLeft - 1; rtch ← Inline.BITSHIFT[rtch, 1]; ENDLOOP; }; Transcribe: PROCEDURE [inName, outName: STRING] = { inDh ← StreamDefs.NewByteStream[ name: inName, access: StreamDefs.Read]; outDh ← StreamDefs.NewByteStream[ name: outName, access: StreamDefs.WriteAppend]; inDh.reset[inDh]; outDh.reset[outDh]; StartRecord[]; Put[53B]; Put[200B]; Put[0B]; Put[0B]; Put[0B]; Put[0B]; Put[340B]; Put[0B]; Put[0B]; Put[0B]; Put[0B]; Put[20B]; Put[0B]; Put[4B]; Put[0B]; Put[312B]; Put[370B]; Put[264B]; EndRecord[]; Initialize[]; UNTIL inDh.endof[inDh] DO Truncate[outDh, inDh.get[inDh]] ENDLOOP; Flush[outDh]; inDh.destroy[inDh]; outDh.destroy[outDh]; }; { Transcribe["MouseTestPatterns.txt", "MouseTestPatterns.tas"]; }; }.