LnSOS BOOT 1.1 SOS.KERNEL SOS KRNLI/O ERRORFILE 'SOS.KERNEL' NOT FOUND%INVALID KERNEL FILE: xةw,@  ȱlmi8#)!)0 WAP /// SIG MENU.MAKER PROGRAM (v. 6.2) =".D1"210: Coldstart (320: Warmstart &*X=11000: TEXT SLOW-DOWN LOOP ,X.1 CHANGE DISK SUBROUTINE23œ202:2200<RFa$=" YOU MAY SELECT YOUR DISK BY I.c.*MENU.MAKER  |R -READ.ME.FIRST^R %SEG.T j^ Ÿ/ SOS.DRIVER 4^ ^SOS.KERNEL ,V^ ^SOS.INTERP^ ^III.GRX.18CS.08u' )BGRAF.INV(I1!L+)DCM.ASCII{9nPS(DCM.TEXT<?|P%Ϊ(*DCMA.ASCII#P S)DCMA.TEXT'(P8P8DISKNAME.DAT >dLԡm#i㰼m#iЕOLԡȱfg hi !dLԡ憦  Ljmkm l y`2 Lԡ8(Je稽)ʈ@LVOLUME NAME (/DISKNAME) OR DEVICE NAME (.Dx)"P12);::"80C";a$;:Zb$="CHANGING DISKS"$d=23:=0::"80C";b$;::12).n=12:=20:"MAKE A NEW MENU FOR DISK: ";N$xN$)<2110=N$ :210 I=1L(A$(I),A$))200B$ 8C";"ANY KEY RETURNS TO THE MENU.">G$:::320H: Error Routine 202:U=11:"79C";"BAD PATH ERROR (NO DISK IN DISK DRIVE OR DESIRED FILE NOT FOUND.)"X=11000:X:::210Z a$="{,|,~,}; selects; back 1 leve 1600 &:WW=1:0 :SEG=1;".D1/SEG.F" SEG=1".D1/SEG.G"diskname$=3802  CATCH PASCAL TEXT FILES 202 :F*=08:"78C";"SORRY BUT MENU.MAKER CAN'T READ PASCAL TEXT FILES."04=10:"7M$="NOVEMBER":1750M$="DECEMBER":1750826);"-";M$;" ";Ѡ,2));", ";"19";Р,2);" ";/П,2))=>13П,2))-12;џ,6);:1780$П,2))=0"12";џ,6);:ٟ;$П,2))=>12" PM-":" AM-" 1830WW=1530 =26:=211660,1670,1680,1690,1700,1710,1720,1730,1740^M$="JANUARY":1750hM$="FEBRUARY":1750rM$="MARCH":1750|M$="APRIL":1750M$="MAY":1750M$="JUNE":1750M$="JULY":1750M$="AUGUST":1750M$="SEPTEMBER":1750M$="OCTOBER":1750T 0")2070H540R\A$="RUNNING "+B$(I),16,B)f"79C";A$;:=0pB$(I),16,B) z::SEG=1".D1/SEG.T"t=+B$(I),16,B) yCT=CT+1~240:=24:=0:"@ ..... "DATE.TIME.LINE" ....JM=Ҡ,4,2))BTM1630,1640,1650,0=+IBOTM/2-.5):I=IBOTM:I/2=I/2)I=I-1 œ2120B=B$(I),16)," ")-1 B$(I),"BASIC 0")850B$(I),"TEXT 0")890 B$(I),"CAT 0")1140*B$(I),"FONT 0")18504B$(I),"FOTO 0")1930>B$(I),"PASTXB$(I);v:520: 500THPOS=4:I/2=I/2)I=I-1I=IBOTM THPOS=44:I/2<>I/2)I=I+1I2=-1:I=I-2:IBOTM<30THPOS=44I=IBOTM/2)*2:=+IBOTM/2)-1:CA)"PRINT.ALL": OA+P 3HA=(81+UCA)A=(81+LCA):::: OA+Q Quits 3IA=(83+LCA)A=(83+UCA)"PRINT.SHOW": OA+S 2JA=(68+LCA)A=(68+UCA)/Screen.Savers/HELLON=THPOS:B$(I);XA<8A>11540bA-7640,660,690,720l:=THPOS:ٺ1600 =Q:WW=0A=:A=21A=9&oldprefix$=40A=31410: Control C "aborts" program to Basic(:A=13770: Return Selects a file *DA=27:50: Escape to change disks/FA=324000: back out one directory level 3GA=(80+UCA)A=(80+L"BASIC 0":150A$="TEXT 0":150A$="CAT 0":150A$="FONT 0":150A$="FOTO 0":150A$(L),"BLOCKS")510*=27:=19:"FREE MEMORY AVAILABLE: ";=7:=20:"80C";A$(L);$:=5:THPOS=4:I=1:IBOTM=J-1:620Q=:=26:=21:sic; +Q Quits."r12);::"80C";a$;:+w#9,"DISKNAME.DAT":#9;DISKNAME$:#9|d$=DISKNAME$$=23:=0::"80C";d$;::12)201M=3:=14:"This /// SIG Disk is \^ 19";Р,2)", Washington Apple `, Ltd."=4:B$(1)="":B$(2)=""A$=16,B) THEN 240 #1, d$="":=10:"80C";d$ ž#1300I=0"I=I+1:#1;A$(I):290,#1 6L=I-1@j=1:same=0 J:SEG=0 Tœ2030^CT<1CT=1cCT>13000Zha$="{,|,~,}; selects; to new disk; J/2)=4:=+1:ۙ=44B$(J);:J=J+1I:1,180,22:2,280,21:2,2380,23:8A$(1000),B$(1000),C%(511),C$(20),name$(20):=10:=0UCA=128:LCA=UCA+32CT=15 IF PREFIX$= PREFIX$+MID$(B$(I),l; ~|zxvtslgbWTSRPMED=hhhh   HH`420.-&#  Phhhh   HH`420.h   HH`420.-&#  Phhhhhhhhhh  HH`DB@><:86421.+*)'jhhhhhhhh    X XLJFE>987410/-   `+(%" Bhhh h h h hh hhhhhh  HH`ZXVTRPNLJHFDB@<;85431hhh    `OLIHEDCB?<;8541.+*x  `"hhhhhhhh    HH`XVTRPN.GRAFIX jj# \\JHFD=;9210-,+*)!   v Q )``.`5`=`C`E` `BGRAF (C) APPLE 1980j @@@@ @``` kLK``9(89:9g:h:h L89:mm95:6:6hg gh h 99 O S   L `ee m`iɂ`0`hIhJh\h] wh]h^ w\\ ]] ]L ]L\A \A JHIH`i8\i]i\`\]`K`M %b&*L+ 16>:)    kL !"#$%GA3/1.01/LINr GRAFIXMO nljhfdcbQNMLJFEDCBA<;6hhhhhh  HH`420.,*)&#"! Rhhhhhh    HH`DB@><:983.+('&$hhhhhhh  HH`420.,*)&#"! Rhhhhhh    HH`DB@><:983.+('&$h J)` `!0 WBUFLEN !UFLEN SOSWRITE$SWRITERWBUF BUF RETADDR ieB>INITCHK UITCHK MOVETO MOVETO  WBUFLEN _UFLEN SOSWRITEbSWRITERETADDR INITCHK ITCHK RANGECHKNGECHKWBUFLEN UFLEN SOSWRITESWRITERWBUF  INITCHK ITCHK FILLPORT FILLPORT RETADDR tpINITCHK ITCHK PENCOLOR PENCOLOR RANGECHKNGECHKWBUFLEN UFLEN SOSWRITESWRITERWBUF |x FILLCOLO FILLCOLO TRETADDR  SETCTAB SETCTAB  INITCHK ITCHK RANGECHKHKWBUFLEN UFLEN SOSWRITESWRITERWBUF  'SOSWRITESWRITERWBUF  RETADDR PLINITCHK sITCHK VIEWPORT VIEWPORTWBUFLEN }UFLEN SOSWRITESWRITERWBUF  xplhd`\XUFLEN SOSWRITESWRITERWBUF ~zvrRETADDR $ INITCHK ITCHK XFROPTIO XFROPTIORANGECHKNGECHKWBUFLEN UFLEN #ITCHK WBUFLEN DUFLEN SOSWRITEGSWRITERWBUF ?:72-(SYSFONT SYSFONT RETADDR njDRAWIMAG DRAWIMAGINITCHK ITCHK WBUFLEN RETADDR INITCHK ITCHK RANGECHKECHKWBUFLEN UFLEN SOSWRITESWRITERWBUF  NEWFONT NEWFONT INITCHK =+SOSWRITE@.!RWBUF  83& INITCHK uITCHK GRAFIXON GRAFIXONWBUFLEN UFLEN SOSWRITESWRITERWBUF zBUF GPGSREQDLGRAFIXMO GRAFIXMORBUFLEN 9RANGECHKwWBUFLEN ASOSWRITERWBUF \SOSREAD GBASADR TSOSSMARK$INITCHK ITCHK INITGRAF INITGRAFWBUFLEN RETADDR ISOSDSTATGSCB kSOSOPEN INITCHK READPARM5CREFNUM DWBUFADR ?BMOVCHK RBUFADR 7WRITEPAR=SREFNUM FRREFNUM 6WREFNUM >INITFLG KSOSCLOSEhhhhhh HHHH`&$<D^Z FpHx  )) y xHHHJJiH 詏 鮀 `}wqnkjba_\[ZYXWVURQ$hhhhhh HH H)HHH`20+*)Hhhhhhh HHHH`&$< 詏 )x `a^]NMJGF>=<10/.+* )) y xHHHJJiH 詏 鮀RWBUF ZRNJFCALCABS BRETADDR SOSDSTATSDSTATGSCB  MOVEREL MOVEREL INITCHK ITCHK WBUFLEN UFLEN SOSWRITESWRITERWBUF  RETADDR c _ < 8 INITCHK O ITCHK WBUFLEN Y UFLEN SOSWRITE\ SWRITERWBUF T L H D @ DOTAT DOTAT &()*+,-./0123456789:O^ YLOC  SDSTATGSCB  INITCHK  ITCHK XLOC XLOC RETADDR     SOSDSTAT SDSTATGSCB   INITCHK  ITCHK YLOC  ASADR SOSSMARK SSMARKRETADDR  z v INITCHK  ITCHK XYCOLOR XYCOLOR RWBUF  F SOSREAD  SREAD RETADDR  SOSDSTATGPGSREQD GSREQDSOSCLOSE SCLOSEGRAFIXMO AFIXMOGLOAD GLOAD RBUFLEN  N RWBUF    SOSREAD  EAD GBASADR GBASADR ( ASADR SOSDSTAT~ SDSTATGSCB  INITCHK { ITCHK CREFNUM  EFNUM RBUFADR  ADR SREFNUM  EFNUM RREFNUM  M WBUFADR   ADR GSAVE GSAVE WREFNUM F  M GPGSREQD5 GSREQDSOSCLOSE> SCLOSEWBUFLEN 8  LEN SOSWRITE; SWRITERWBUF C F INITCHK  ITCHK BMOVCHK  OVCHK INITFLG  ITFLG RWBUF  F SOSDSTAT" SDSTATGSCB % CB INITCHK  ITCHK CREFNUM  EFNUM  T P SOSDSTATj SDSTATGSCB LINEREL LINEREL INITCHK g ITCHK WBUFLEN  UFLEN SOSWRITE SWRITERWBUF } d ` \ X RELEASE RELEASE  RETADDR % ! INITCHK  ITCHK LINETO LINETO WBUFLEN  UFLEN SOSWRITE SWRITERWBUF     CALCABS x q ABS RETADDR CALCABS  ABS RETADDR  SOSDSTAT SDSTATGSCB INITCHK  ITCHK DOTREL DOTREL WBUFLEN  UFLEN SOSWRITE SWRITERWBUF (Therefore, another problem exist requiring bit reversal. This (can be handled in software by declaring a variable of free union (record type (see pascal program manual [p120], free union varaints). (This declares one variable as two types in recounatly, the bits are in reverse (order as to that byte which is sent to the printer. ( 2x 1 1 0 0 1 0 1 = 101 decimal in apple 2 21 0 1 0 0 1 1 0 = 166 decimal for printer < routines (published here transforms Apple's pattern into a usable one for (the MX 80. -We now understanding the relation of the data bytes to (where on the screen they represent and within that byte each bit's (relation to a unique pixel. Unfortlement (showing a difference gave a relation to that pixel and where it (is stored. Eventually, with more tests revealed the pattern. (It is a convoluted one and reproducing my notes will only (distract from further points. Nonetheless, the two (enable sending the correct order of data bytes to the printer. (I did this by storing one array with a blank screen. A second (array was stored of a screen with just one pixel on. These two (arrays were masked and the element and value of that ecks of 256 elements with each (element containing two bytes of graphic data. Included are 1024 (bytes plus the eighth bits which are used for other graphic (parameters. -The next step was to debug Apple's mapping pattern to utine that (stores an image on disk. With this ability it takes approximatly (thirty seconds to store and blockread it back into your own program (variables. The program variable used here is a 32 by 256 array (of integers. In other words 32 blore packed accordingly for output to the printer. I can (reassure you this works, but, takes over twenty four minutes to (complete. -Of course Apple did not see fit to publish the location of (graphic data in memory, however, they did provide a ro(0 is off. The graphic screen's mapped memory consist of 15,360 (bytes using only the lower seven bits of each byte. -One way of resolving the problem is by using a unitwrite (statement to the graphics driver. Each pixel is polled then data (bytes a eight pins in the printer's (head. For example: ( 2bit representation data byte 2 2x 1 1 0 0 1 0 1 = 101 decimal 2 (Each bit correlates to a unque pixel with 1 indicating on while 60 black and white mode to (an Epson MX 80 printer with graphics capability. Both systems (handle the image data in a similar fashion which is in any (byte of data the bit representation indicates a pixel's on/off (status or whether to fire one of the final routines are straightfoward. Thus, the (following discussion pertains to graphic storage and provides (insight to the routines contained herein. -The problem was to design a pascal procedure enabling the (dumping of a graphic screen in 5-A few years ago I started using the Apple III graphics (for ploting data and graphs related to geophysics. Through (this need, a graphics dump program became eminent. Although (the path to solving the problem has been a somewhat laborous (chore,rd format. One, a (variable of one byte and two, the same variable as a packed array (of 8 elements having value 0 or 1. The procedure reads each bit and (packs another byte with the reverse order of bits. Again, I assure (you this works, but, takes approximatly seven to eight minutes to (complete. -My next solution was to build an intermediate switch between (the computer and printer. During the time of data graphics (transfer the bits are reversed through hardware. It works very (well0| |--|--| |----| ----| ----| 0| | | | | 169| 149| 129| 0| |--|--| |----| ----| ----| 0| |14|30| | 233| 213| 193| .32|--------|--|--|--------|----| ----| -------------------------- ----- ----- ,63 | | | | | 41| 21| 1| 0| |--|--| |----| ----| ----| 0| | | | | 105| 85| 65| 213|- (-------------------------- | (| | | (| |14|30| | | -20 (|------------------------| | (| | | % 0| |15|31| 233|- (-------------------------- 2blk ele F 0-----------| (| | %128| |15|31| 193|- (-------------------------- | (| | | (| |14|30| | | -20 (|------------------------| | (| | | % 64| |15|31| #low byte low byte high byte high byte # 4all these values per 1 element 4 (pixel 28..55 decrement element by 1) "Y pixels: " (-------------------------- (| | (| |14|30| | (|----------------- | 15 | 31 | start blk |_____________|_____________|_____________|_____________| "| | | | | | | | | | | | | | | | | | | | | | | | | | | | | bits "|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_| low bit to left " _... >| #0 7 14 21 28 pixel 0 ___________________________ " _____________| | |_____________ "| | | | | "| 15 | 31 =x mod 28; 0If f<7 then g:=f; 0If f>20 then g:=21-f+8; 0If f in[7..13] then g:=f-7; 0If f in[14..20] then g:=f-14+8; 0value:=2^g; 0 "X pixels: " ( array ele index 233 (begin).....252 (last) > ________20 @ 28 dots____________________0If (y mod 64) in[0..31] then c:=1 else c:=0; 0b:=2*(y mod 8); 0If (x mod 14) in[0..6] then block:=14+c-b Felse block:=30+c-b; F /for which ele in that block; 0ele:=(x div 28)+233-(y div 64)*20-((y mod 32) div 8)*64; 0 /for value in that ele; 0f:) } 9 +the integer in those used for screen mapping when broken into +binary represents /14 horz dots (1 for on, 0 for off) /192x560 = 107520 (pixels) = (256-16)x32x14 / /2^7 bit is not used(?) / +eq: for which block; of 256 numbers +each block does NOT use ele: 61..64 (but maybe for color) G125..128 G189..192 G253..256 /except block 0 ele 61 here the mode 0..3 is stored 1value = 4608: mode 0 <9 1 ;10 2 ;11 3 { mode 4..7 not stored(?(introduce an assembly language routine recalling the image data (directly from memory in lieu of storing and retrieving the data. (By best estimate it should reduce the time by thirty seconds. ( (FOTO FILES: % +sequence of blocks (32 for 560 mode)(byte. The extra time for recall is negligable and resulted as the (last revision to the routine. Two procedures PRT1 and PRT2 (accomplish the same pattern transform. Either one may be used. -On a final note one might still lessen the time if to and dumps a screen in two minutes. The only drawback is the (need for a special cable. -The next chapter of this saga is credited to Ken Petracek who (suggested storing the reverse bit value as indexed by the data ----| 0| | | | | 41| 21| 1| 0| |--|--| |----| ----| ----| 0| | | | | 105| 85| 65| 0| |--|--| |----| ----| ----| / | | | | | 169| 149| 129|-- /8| |--|--| |----| ----| ----| | -64 / | |15|31| | 233| 213| 193|-- /0------------------------------ ---- ---- 0 blk ele ele ele ' ' 'dot 8|_15_|_31_|e format: 1st: number of data integer 2nd begining X value real 3rd interval of data " 4rth data 1st value plottrk -is strickly forbiden unless such distribution is to a profit -motive enviroment and with the expressed permission of D.C. -Merk design. - "this program reads a data file of binary or text in format and enables plotting of the data. thPROGRAM PTPLT; { created by D.C. Merk Design 1984 all rights reserved. -this disk may be copied or duplicated onto any media so -desired without the expressed written permission of D.C.Merk -Design. Any sale or profits gained resulting from this wo;=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyR +JO^[,|_11_|_27_| |_10_|_26_| ,|_13_|_29_| |_12_|_28_| +0|_15_|_31_| 32|_14_|_30_| + 0blk blk dot 40|_14_|_30_| ,|__1_|_17_| |__0_|_16_| ,|__3_|_19_| |__2_|_18_| ,|__5_|_21_| |__4_|_20_| ,|__7_|_23_| |__6_|_22_| ,|__9_|_25_| |_ 8_|_24_| ed to left up to 253 numbers (Y values ) plot: to screen or printer dump resave ability: binary or text temp foto file put on d1/tempff } USES REALMODES,PGRAF; TYPE CODE=0..255; %S18=STRING[18]; VAR FB,FF:FILE; { file binary } FT,G,P:TEXT; { file text, graf, print } $F1:INTERACTIVE; { to reset console } RD:ARRAY[ile: B(inary T(ext K(eyboard'); WRITELN('Write file: I(binary X(text R(printer E(screen'); WRITELN('Plot graph: P(rinter S(creen'); WRITELN; WRITELN; WRITELN; WRITELN; WRITELN('File G1: Y2: Y3:'); WRITE( 'misc: arrows (grph cur -,=,\,H (cur speed D(ecml pl at:',D) END; PROCEDURE SCRI; BEGIN WRITE(CHR(28)); WRITELN('Graph ',GN,': 1,2,3 (change C(lear O(ff / on Q(uit'); WRITELN('Read f S:STRING; FUNCTION KYPRS:BOOLEAN; BEGIN UNITSTATUS(1,CNT,21); IF CNT=0 THEN KYPRS:=FALSE ELSE KYPRS:=TRUE END; PROCEDURE SCRI2; BEGIN WRITELN('lable: 9( X1: X2: X3:'); WRITELN(' 0( Y1: OF INTEGER; $ $GPS:ARRAY[1..3] OF REAL; { temp GP[GN].S } E:XCPN; CNT,H,I,J,K,L,N,D,NM1,OFS,GN,TGN,SCT:INTEGER; CXP,CYP,R,XCAL,SP,LX,LY,X,Y,X1,Y1:REAL; XPN,LI,CI,SAM,LN,NXN,CHK,GON:BOOLEAN; C,C1,ESC:CHAR; KED RECORD { 32 block fotofile, with 256 no. in each } LO:0..127; MI:0..1; HI:0..127; EN:0..1 END; YPOS:ARRAY[0..191] OF INTEGER; { fotofile adjacents } MA:ARRAY[0..191] :ARRAY[1..3] OF REAL; { cursor y value } YL:ARRAY[1..3] OF CODE; { y loc save } XN:ARRAY[1..3] OF REAL; { x next node } $RV:ARRAY[0..255] OF CODE; GVAL:ARRAY[0..31,1..256] OF PAC MXY:ARRAY[1..3] OF REAL; { max y } POS:PACKED RECORD { position for readr } X:CODE; Y:CODE END; CX:ARRAY[1..3] OF REAL; { cursor x value } CY { end x } A:S18; { lable absissa } O:S18 { lable ordinate} END; MNY:ARRAY[1..3] OF REAL; { min y } { x scale } Y:REAL; { y scale } B:REAL; { base } S:REAL; { start x } E:REAL; rz scale facter/screen } HFP:ARRAY[1..3] OF REAL; VFS:ARRAY[1..3] OF REAL; VFP:ARRAY[1..3] OF REAL; { vert scale facter/printer } GP:ARRAY[1..3] OF RECORD { parameters } X:REAL; SOL:ARRAY[1..3] OF BOOLEAN; { solid line } PLT:ARRAY[1..3] OF BOOLEAN; { prt plot do } NOD:ARRAY[1..3] OF CHAR; { node character } HFS:ARRAY[1..3] OF REAL; { ho { spline interpolation } B:ARRAY[1..256] OF REAL; CC:ARRAY[1..3,1..256] OF REAL; DD:ARRAY[1..256] OF REAL; SPP:ARRAY[1..3,1..256] OF REAL; LIN:ARRAY[1..3] OF BOOLEAN; { line fit interpolation } { 253 pts max } END; FN:ARRAY[1..3] OF STRING; { filename } SCS:ARRAY[1..1923] OF CODE; { screen save } A:ARRAY[1..256] OF REAL; 1..3] OF RECORD N:INTEGER; { no of data } B:REAL; { begin X coordinate } I:REAL; { X interval } V:ARRAY[1..253] OF REAL; G2: G3:'); WRITELN; WRITELN('V(curve G1: G2: G3:'); WRITELN('N(ode G1: G2: G3:'); WRITELN; WRITELN('scale: 4( X1: X2: X3:'); WRITELN(' 5( Y1: Y2: Y3:'); WRITELN; WRITELN('width: 6( B1: B2: B3:'); WRITELN(' 7( E1:"3:IF XPN THEN WRITE(G,VAL:8) ELSE WRITE(G,VAL:3:D); "6:IF XPN THEN WRITE(P,VAL) ELSE WRITE(P,VAL:3:D) END END; PROCEDURE CURX(H:INTEGER); BEGIN IF ABS(H)<>1 THEN H:=2*H; UC(26,35,17); WRITE(G,CX[1]); { CX cursor value } UEND ELSE J:=0; "IF (J=19) AND NOT EOLN THEN IF C<>CHR(8) THEN BEGIN #UN(8); #WRITE('<'); #UN(8); #UN(7) "END; UNTIL EOLN; DELETE(S,J,20-J) END; PROCEDURE WRITR(U:INTEGER;VAL:REAL); BEGIN CASE U OF "1:IF XPN THEN WRITE(VAL) ELSE WRITE(VAL:3:D);  UNTIL NOT CHK; VAL:=R END; PROCEDURE READS; BEGIN J:=0; S:='1234567890123456789'; REPEAT IF J<19 THEN J:=J+1; READ(C1); S[J]:=C1; IF C1=ESC THEN EXIT(READS); IF C1=CHR(8) THEN IF J>1 THEN BEGIN J:=J-2; UN(8); #WRITE(' '); UN(8) SET(F1,'.CONSOLE') "END; IF C1=ESC THEN BEGIN SETXCPN(INVOP,FALSE); EXIT(READR) END; CHK:=GETXCPN(INVOP); IF NOT EOLN THEN CHK:=TRUE; IF CHK THEN BEGIN SETXCPN(INVOP,FALSE); UN(26); UNITWRITE(1,POS,2,,12); UN(7);UN(31) END ,12); UNITWRITE(3,IX,2,,12); UNITWRITE(3,IY,2,,12) END; PROCEDURE READR(VAR VAL:REAL); BEGIN UNITSTATUS(1,POS,64); REPEAT CHK:=FALSE; GET(INPUT); IF EOLN THEN EXIT(READR); READ(R); READ(C1); "IF C1 IN['R','r'] THEN BEGIN #CLOSE(F1); #RECODE); BEGIN UNITWRITE(1,A,1,,12) END; PROCEDURE UP(A:CODE); BEGIN UNITWRITE(6,A,1,,12) END; PROCEDURE UG(A:CODE); BEGIN UNITWRITE(3,A,1,,12) END; PROCEDURE UC(A:CODE;X,Y:REAL); VAR IX,IY:INTEGER; BEGIN IX:=ROUND(X); IY:=ROUND(Y); UNITWRITE(3,A,1, RV[112]:=14; RV[113]:=142; RV[114]:=78; RV[115]:=206; RV[116]:=46; RV[117]:=174; RV[118]:=110; RV[119]:=238; RV[120]:=30; RV[121]:=158; RV[122]:=94; RV[123]:=222; RV[124]:=62; RV[125]:=190; RV[126]:=126; RV[127]:=254 END; PROCEDURE UN(A:6]:=6; RV[97]:=134; RV[98]:=70; RV[99]:=198; RV[100]:=38; RV[101]:=166; RV[102]:=102; RV[103]:=230; RV[104]:=22; RV[105]:=150; RV[106]:=86; RV[107]:=214; RV[108]:=54; RV[109]:=182; RV[110]:=118; RV[111]:=246; =242; RV[80]:=10; RV[81]:=138; RV[82]:=74; RV[83]:=202; RV[84]:=42; RV[85]:=170; RV[86]:=106; RV[87]:=234 END; PROCEDURE INT3; BEGIN RV[88]:=26; RV[89]:=154; RV[90]:=90; RV[91]:=218; RV[92]:=58; RV[93]:=186; RV[94]:=122; RV[95]:=250; RV[960; RV[61]:=188; RV[62]:=124; RV[63]:=252; RV[64]:=2; RV[65]:=130; RV[66]:=66; RV[67]:=194; RV[68]:=34; RV[69]:=162; RV[70]:=98; RV[71]:=226; RV[72]:=18; RV[73]:=146; RV[74]:=82; RV[75]:=210; RV[76]:=50; RV[77]:=178; RV[78]:=114; RV[79]:END; PROCEDURE INT2; BEGIN RV[44]:=52; RV[45]:=180; RV[46]:=116; RV[47]:=244; RV[48]:=12; RV[49]:=140; RV[50]:=76; RV[51]:=204; RV[52]:=44; RV[53]:=172; RV[54]:=108; RV[55]:=236; RV[56]:=28; RV[57]:=156; RV[58]:=92; RV[59]:=220; RV[60]:=]:=152; RV[26]:=88; RV[27]:=216; RV[28]:=56; RV[29]:=184; RV[30]:=120; RV[31]:=248; RV[32]:=4; RV[33]:=132; RV[34]:=68; RV[35]:=196; RV[36]:=36; RV[37]:=164; RV[38]:=100; RV[39]:=228; RV[40]:=20; RV[41]:=148; RV[42]:=84; RV[43]:=212 [6]:=96; RV[7]:=224; RV[8]:=16; RV[9]:=144; RV[10]:=80; RV[11]:=208; RV[12]:=48; RV[13]:=176; RV[14]:=112; RV[15]:=240; RV[16]:=8; RV[17]:=136; RV[18]:=72; RV[19]:=200; RV[20]:=40; RV[21]:=168; RV[22]:=104; RV[23]:=232; RV[24]:=24; RV[25 E2: E3:'); WRITELN; WRITELN('base : 8( B1: B2: B3:'); WRITELN; SCRI2 END; PROCEDURE INT1; BEGIN RV[0]:=0; RV[1]:=128; RV[2]:=64; RV[3]:=192; RV[4]:=32; RV[5]:=160; RVC(26,221,17); WRITE(G,CX[2]); UC(26,407,17); WRITE(G,CX[3]); UC(26,CXP,191); UC(24,CXP,20); CXP:=CXP+H; UC(26,CXP,191); UC(24,CXP,20); UC(26,35,17); CX[1]:=CXP/HFS[1]+GP[1].S; { CXP cursor pixel position } WRITE(G,CX[1]); UC(26,221,17); CX[2]:=CXP/HFS[2]+GP[2].S; WRITE(G,CX[2]); UC(26,407,17); CX[3]:=CXP/HFS[3]+GP[3].S; WRITE(G,CX[3]) END; PROCEDURE CURY(H:INTEGER); BEGIN UC(26,35,8); WRITE(G,CY[1]); UC(26,221,8); WRITE(G,CY[2]); UC(26,407,8); WRITE(G,CY[3]); =(X-XN[GN]+R)/HF; SP:=CC[GN,N+1]-(SPP[GN,N+1]*0.1666666+SPP[GN,N]*0.3333333)*RD[GN].I; Y:=RD[GN].V[N]+SP*XCAL+SPP[GN,N]*XCAL*XCAL*0.5; Y:=(Y+(SPP[GN,N+1]-SPP[GN,N])*XCAL*XCAL*XCAL*0.1666666/RD[GN].I-GP[GN].B)*VF END END; DRAW UNTIL (X>=].B)*VF END ELSE BEGIN X:=X+9; IF XN[GN]<=X THEN BEGIN IF NOD[GN]<>' ' THEN NXN:=TRUE; X:=XN[GN]; N:=N+1; Y:=(RD[GN].V[N]-GP[GN].B)*VF; XN[GN]:=XN[GN]+R END ELSE BEGIN { spline interp } XCAL: N:=N-1; { adjust for first } LI:=TRUE; { last y infinite } REPEAT IF (N=RD[GN].N) OR KYPRS THEN EXIT(GRPH); IF LN THEN BEGIN N:=N+1; X:=X+R; Y:=(RD[GN].V[N]-GP[GN { LIN true if to close/spline } IF NOD[GN]<>' ' THEN NXN:=TRUE ELSE NXN:=FALSE; { flag for node } X:=X-R { adjust for first } END ELSE X:=X-9; IF R<0 THEN X:=-R*HF; { .B to right of left edge } XN[GN]:=X END; PROCEDURE GRPH(HF,VF:REAL); BEGIN R:=RD[GN].I*HF; LN:=FALSE; IF ((RD[GN].I*HF)<15) OR LIN[GN] THEN BEGIN { nodes to close for spline } LN:=TRUE; { determine X and N } X:=0; R:=GP[GN].S-RD[GN].B; IF R>0 THEN BEGIN { .B offscrn to left } N:=TRUNC(R/RD[GN].I)+1; X:=((N-1)*RD[GN].I+RD[GN].B-GP[GN].S)*HF END; WRITE(G,NOD[GN]); IF NOT LN THEN NXN:=FALSE { NXN put in next node } END; UC(25,X,Y) END ELSE CI:=TRUE; LX:=X; LY:=Y; LI:=CI END; PROCEDURE FSPT(HF:REAL); { find starting pt } BEGIN N:=1; { draws line to X,Y } BEGIN IF FINITE(Y) THEN BEGIN CI:=FALSE; { current y infinite } IF LI THEN UC(26,X,Y) ELSE IF SOL[GN] THEN UC(24,X,Y) ELSE DASL; IF NXN THEN BEGIN UC(26,X-2,Y+3); IV 9; FOR J:=1 TO K DO BEGIN X1:=LX+J*C; Y1:=LY+J*S; UC(24,X1-IX,Y1-IY); UC(26,X1,Y1) END; UC(24,X,Y); END ELSE BEGIN X1:=LX+0.074*C; Y1:=LY+0.074*S; UC(24,X1,Y1); UC(26,X,Y) END END; PROCEDURE DRAW; { draws dashed line LX-X, LY-Y } VAR D,C,S,IX,IY:REAL; BEGIN D:=SQRT(SQR(X-LX)+SQR(Y-LY)); IF D<3 THEN BEGIN UC(25,X,Y); EXIT(DASL) END; C:=9*(X-LX)/D; S:=9*(Y-LY)/D; IX:=C*0.5; IY:=S*0.5; IF D>=9 THEN BEGIN K:=ROUND(D) D UC(26,0,97); { mark upper limit of prt plt } UC(24,3,97); WRITE(G,'p'); UC(26,505,191); { mark right page limit of prt } UC(24,505,188); WRITE(G,'p') END; PROCEDURE DASL; (G,'G3 X:',CX[3]); UC(26,21,8); WRITE(G,'Y:',CY[1]); UC(26,207,8); WRITE(G,'Y:',CY[2]); UC(26,393,8); WRITE(G,'Y:',CY[3]); UC(26,559,0); UC(24,0,0); UC(26,0,20); UC(24,0,191); UC(26,0,0); ]) END; PROCEDURE FLN; BEGIN CX[1]:=GP[1].S; CY[1]:=GP[1].B; CX[2]:=GP[2].S; CY[2]:=GP[2].B; CX[3]:=GP[3].S; CY[3]:=GP[3].B; CXP:=0; CYP:=0; UC(26,0,17); WRITE(G,'G1 X:',CX[1]); UC(26,186,17); WRITE(G,'G2 X:',CX[2]); UC(26,372,17); WRITE UC(26,0,CYP); UC(24,559,CYP); CYP:=CYP+H; UC(26,0,CYP); UC(24,559,CYP); UC(26,35,8); CY[1]:=CYP/VFS[1]+GP[1].B; WRITE(G,CY[1]); UC(26,221,8); CY[2]:=CYP/VFS[2]+GP[2].B; WRITE(G,CY[2]); UC(26,407,8); CY[3]:=CYP/VFS[3]+GP[3].B; WRITE(G,CY[3559) OR (X>=(GP[GN].E-GP[GN].S)*HF); END; PROCEDURE SPLT; { scrn plot } BEGIN UG(15); GON:=TRUE; FSPT(HFS[GN]); GRPH(HFS[GN],VFS[GN]) END; PROCEDURE PRT; { main sort of bits and transfer to printer } BEGIN FOR I:=233 TO 252 DO BEGIN FOR K:=0 TO 191 DO BEGIN YPOS[K]:=I-(K DIV 64)*20-((K MOD 32) DIV 8)*64; N:=2*(K MOD 8); IF (K MOD 64)<32 THEN MA[K]:=14+1-N ELSE MA[K]:=14-N END; UP(27);UP(75);UP(192);UP(0); FOR K:=0 TO 191 DO UP(RV[GOLN THEN BEGIN $CHK:=FALSE; $PLT[J]:=TRUE #END "END END; IF CHK THEN EXIT(ASK); { chk makes sure 1 to plot } UN(26); UN(0); UN(5); WRITE('plot: '); FOR J:=1 TO 3 DO IF PLT[J] THEN WRITE(J,', '); WRITE('chk parms and prin { asure at least 1 graph } WRITE('graph to plot -->',' accepts exits':55); FOR J:=1 TO 3 DO BEGIN "UN(26); "UN(18); "UN(5); "PLT[J]:=FALSE; "IF RD[J].N<>0 THEN BEGIN #WRITE(J,' '); #READ(C1); #IF C1=ESC THEN EXIT(ASK); #IF E IF GP[J].E>GP[L].E THEN L:=J; { find last pts preserve L } END; IF C1=ESC THEN EXIT(LSTCHK); PRTHD END; PROCEDURE ASK; { determine which graphs } BEGIN UN(30); CHK:=TRUE; .B-MXY[J]) THEN NSAM(4); IF 191<((MXY[J]-GP[J].B)*VFP[GN]) THEN NSAM(5); IF 0GP[N].Y THEN NSAM(7); IF GP[J].B<>GP[N].B THEN NSAM(8); M:=TRUE; N:=1; WHILE NOT PLT[N] DO N:=N+1; L:=N; FOR J:=N TO 3 DO IF PLT[J] THEN BEGIN IF GP[J].S<>GP[N].S THEN NSAM(1); { fatal err 1..4 } IF GP[J].X<>GP[N].X THEN NSAM(2); IF 191<((MNY[J]-GP[J].B)*VFP[J]) THEN NSAM(3); IF 0<(GP[J]FOR J:=1 TO 3 DO BEGIN UP(9); { L is one of PLT true } WRITR(6,GP[L].B+J*GP[L].Y); END; UP(10); UP(27);UP(81) END END; PROCEDURE LSTCHK; { last chk and bit reverse } BEGIN SA"WRITR(6,GP[J].B); "WRITELN(P); "WRITELN(P); END; UP(27);UP(70); IF SAM THEN BEGIN UP(27);UP(80); { comp mode } WRITR(6,GP[L].B); UP(27);UP(68);UP(15);UP(31);UP(48);UP(255); { set tab stops } 3 DO IF PLT[J] THEN BEGIN { heading to prt } "WRITELN(P,'G',J,': ',NOD[J],' file: ',FN[J],' ',GP[J].O,' vs ',GP[J].A); "WRITE(P,' scale: '); "WRITR(6,GP[J].X); "WRITE(P,' X/in, '); "WRITR(6,GP[J].Y); "WRITE(P,' Y/in ','base: '); t ') END; UN(7); READ(C1); IF N IN[1..4] THEN C1:=ESC; IF C1=ESC THEN EXIT(LSTCHK); IF EOLN THEN UN(11); UN(30); IF N IN[7,8] THEN SAM:=FALSE END; PROCEDURE PRTHD; BEGIN UP(27);UP(69); { on emph mode } FOR J:=1 TOplot limit exit '); 6:WRITE('WARNING: min value of graph ',J,' below plot base exit '); 7:WRITE('WARNING: graph ',J,' has a different Y scale exit '); 8:WRITE('WARNING: graph ',J,' has a different base exi 2:WRITE('fatal err: all graphs must have the same base scale '); 3:WRITE('fatal err: min value of graph ',J,' above plot limit '); 4:WRITE('fatal err: max value of graph ',J,' below plot base '); 5:WRITE('WARNING: max value of graph ',J,' above KREAD(FF,GVAL,32); CLOSE(FF,PURGE); PRT END; PROCEDURE LSTCHK; FORWARD; PROCEDURE NSAM(N:CODE); BEGIN CASE N OF 1:WRITE('fatal err: all graphs must start plot at the same position '); FOR K:=0 TO 191 DO UP(RV[GVAL[MA[K]+16,YPOS[K]].HI]); UP(10); "IF KYPRS THEN BEGIN #GP[L].S:=GP[L].E; #EXIT(PRT) "END END END; PROCEDURE BITRPRT; BEGIN GSAVE('TEMPFF'); RESET(FF,'TEMPFF'); { test foto file } J:=BLOCVAL[MA[K],YPOS[K]].LO]); UP(10); UP(27);UP(75);UP(192);UP(0); FOR K:=0 TO 191 DO UP(RV[GVAL[MA[K]+16,YPOS[K]].LO]); UP(10); UP(27);UP(75);UP(192);UP(0); FOR K:=0 TO 191 DO UP(RV[GVAL[MA[K],YPOS[K]].HI]); UP(10); UP(27);UP(75);UP(192);UP(0);ter (on)'); READ(C1); IF NOT EOLN THEN C1:=ESC; IF C1=ESC THEN EXIT(ASK); UN(11); UN(30); LSTCHK END; PROCEDURE BSLN; BEGIN { anotate base, mark if same } SCT:=SCT+1; FOR J:=0 TO 7 DO BEGIN OFS:=(SCT*16) MOD 72; { offset of in. on base of nxt scr } K:=J*72+OFS; UC(26,K,8); "WRITR(3,GP[L].S+J*GP[L].X+OFS/HFP[L]); UC(26,K,0); UC(24,K,6); { L is one of PLT true } END; UC(26,559,0); UDR(RD[GN].V[J]); "IF FINITE(RD[GN].V[J]) THEN BEGIN #IF RD[GN].V[J]>MXY[GN] THEN MXY[GN]:=RD[GN].V[J]; #IF RD[GN].V[J] to terminate'); UN(2); J:=0; REPEAT "WRITE(RD[GN].B+RD[GN].I*J:3:D,': '); "J:=J+1; REA WRITR(1,GP[GN].Y); WRITE(' /in'); PLACE(19); WRITR(1,GP[GN].B); PLACE(16); WRITR(1,GP[GN].S); PLACE(17); WRITR(1,GP[GN].E); PLACE(10); WRITE('line / solid'); PLACE(11); WRITE('none'); PLACE(21); PLACE(22) END; PROCEDURE KEBRD; BEGIN UNITSTA.X; HFP[GN]:=72/GP[GN].X; GP[GN].A:=' '; GP[GN].O:=' '; NOD[GN]:=' '; SOL[GN]:=TRUE; { solid straight line } LIN[GN]:=TRUE; PLACE(8); WRITE(FN[GN]); PLACE(13); WRITR(1,GP[GN].X); WRITE(' /in'); PLACE(14); [GN]-GP[GN].Y; { 1" above bot } GP[GN].S:=RD[GN].B; { at 1st data } GP[GN].E:=8*GP[GN].X+RD[GN].B; { at last data } VFS[GN]:=30.5/GP[GN].Y; VFP[GN]:=60/GP[GN].Y; HFS[GN]:=65/GP[GN]N) END; PROCEDURE INIT; BEGIN GP[GN].X:=(RD[GN].N-1)*RD[GN].I/8; { to fit into 1 screen } GP[GN].Y:=(MXY[GN]-MNY[GN])/4; { fit into 4" high } IF GP[GN].Y=0 THEN GP[GN].Y:=1; { prevent VF=infin } GP[GN].B:=MNY UG(21);UG(2); { xor on } GN:=TGN END; PROCEDURE TOGG; BEGIN IF GON THEN BEGIN UN(15); GON:=FALSE END ELSE BEGIN UG(15); GON:=TRUE END END; PROCEDURE CHGGN; BEGIN GN:=ORD(C)-48; UN(26);UN(6);UN(0); WRITE(GT UNTIL GP[L].S>=GP[L].E; UP(27);UP(50); { set norm ln spa, 6/in } CLR; FOR GN:=1 TO 3 DO IF PLT[GN] THEN BEGIN "GP[GN].S:=GPS[GN]; PLACE(16); WRITR(1,GP[GN].S) END; THEN BEGIN Y:=(RD[GN].V[N]-GP[GN].B)*VFP[GN]; IF X<0 THEN UC(26,0,Y+8) ELSE UC(26,X,Y+8); WRITE(G,'G',GN) END; GRPH(HFP[GN],VFP[GN]); GP[GN].S:=560/HFP[GN]+GP[GN].S { increment screen } END; CHK:=FALSE; BITRPR { xor off } CHK:=TRUE; SCT:=-1; { screen count-1 } REPEAT UG(28); BSLN; { put in axis } FOR GN:=1 TO 3 DO IF PLT[GN] THEN BEGIN FSPT(HFP[GN]); IF CHK UP(27);UP(49); { sets line spa to 7 dot/ln } TGN:=GN; { temp graph no. store } FOR J:=1 TO 3 DO GPS[J]:=GP[J].S; { temp start posit } UG(21);UG(0); UN(LN); WRITE(' '); UN(26); UN(J); UN(LN) END; PROCEDURE PPLT; { prt plot } BEGIN SCON; { screen on } ASK; IF CHK OR (C1=ESC) THEN EXIT(PPLT); UN(14); BEGIN UN(15); GON:=FALSE END; PROCEDURE CLR; BEGIN UG(21);UG(0); { xor off } UG(28); UG(21);UG(2); { xor on } FLN END; PROCEDURE PLACE(LN:CODE); BEGIN J:=GN*23-8; UN(26); UN(J); C(24,0,0); IF CHK THEN BEGIN { draw vert axis } UC(24,0,191); { anotate start mark if same } FOR J:=1 TO 3 DO BEGIN K:=J*60; UC(26,0,K); UC(24,6,K) END END END; PROCEDURE SCON; INIT END; " PROCEDURE REFIL; BEGIN SCON; { screen on } MNY[GN]:=MAXREAL; MXY[GN]:=MINNORM; IF C='K' THEN BEGIN "KEBRD; "EXIT(REFIL) END; UN(2); UN(26);UN(79);UN(1); UN(3); UN(12); REPEAT {$IOCHECK-} WRITE('file name: '); READS; IF C1=ESC THEN EXIT(REFIL) ELSE FN[GN]:=S; IF C='T' THEN RESET(FT,FN[GN]) ELSE RESET(FB,FN[GN]) UNTIL IORESULT=0; {$IOCHECK+} IF C='B' THEN J:=BLOCKREAD(FBN]:=0; SPP[GN,NM1]:=B[NM1]/A[NM1]; FOR J:=(RD[GN].N-2) DOWNTO 2 DO SPP[GN,J]:=(B[J]-RD[GN].I*SPP[GN,J+1])/A[J]; SPP[GN,1]:=0; UN(15) END; PROCEDURE CURV; BEGIN SCON; WRITELN('curve type: 1 (spline / solid 2 (spline / d R:=1/RD[GN].I; FOR J:=2 TO RD[GN].N DO CC[GN,J]:=(RD[GN].V[J]-RD[GN].V[J-1])*R; FOR J:=2 TO NM1 DO DD[J]:=6*(CC[GN,J+1]-CC[GN,J]); B[2]:=DD[2]; FOR J:=3 TO NM1 DO B[J]:=DD[J]-RD[GN].I*B[J-1]/A[J-1]; SPP[GN,RD[GN].#IF XPN THEN WRITELN(P,'x:',RD[GN].B+RD[GN].I*J) ELSE /WRITELN(P,'x:',RD[GN].B+RD[GN].I*J:3:D) END; END; UP(10) END; PROCEDURE SPLN; BEGIN UN(14); NM1:=RD[GN].N-1; A[2]:=4*RD[GN].I; FOR J:=3 TO NM1 DO A[J]:=RD[GN].I*(4-RD[GN].I/A[J-1]); SE WRITELN(P,'x:',RD[GN].B:3:D); FOR J:=1 TO RD[GN].N DO BEGIN IF XPN THEN BEGIN #UP(9); #WRITE(P,RD[GN].V[J]) "END ELSE WRITE(P,RD[GN].V[J]:15:D); IF (J MOD 5 = 0) AND (J<>RD[GN].N) THEN BEGIN WRITELN(P); #IF KYPRS THEN EXIT(PRTW); ); WRITELN(P,'file: ',FN[GN]); UP(27);UP(70); WRITE(P,' no of pts: ',RD[GN].N,' first pt:',RD[GN].B); WRITELN(P,' interval:',RD[GN].I); UP(27);UP(68);UP(5);UP(20);UP(35);UP(50);UP(65);UP(255); { tab set } IF XPN THEN WRITELN(P,'x:',RD[GN].B) ELESC THEN READ(C1); UN(4); UNITSTATUS(1,SCS,74) END; PROCEDURE PRTW; BEGIN SCON; WRITE('--> VERIFY <-- the printer is on exit '); READ(C1); IF C1=ESC THEN EXIT(PRTW); UP(27);UP(64); { reset printer } UP(27);UP(69#IF EOLN THEN UN(11); #UN(11); #UN(30); READ(C1); IF C1=ESC THEN J:=RD[GN].N END; IF K = 4 THEN BEGIN WRITELN; #IF XPN THEN WRITELN('x:',RD[GN].B+RD[GN].I*J) ELSE /WRITELN('x:',RD[GN].B+RD[GN].I*J:3:D) END UNTIL J=RD[GN].N; IF C1<>); J:=0; C1:=' '; REPEAT "K:= J MOD 5; J:=J+1; IF XPN THEN BEGIN #UN(24);UN(K*15+5); #WRITE(RD[GN].V[J]) "END ELSE WRITE(RD[GN].V[J]:15:D); IF J MOD 50 = 0 THEN BEGIN WRITELN; WRITELN; #WRITE(' exit any key (cont '); TE(' no of pts: ',RD[GN].N); IF XPN THEN WRITELN(' first pt:',RD[GN].B,' interval:',RD[GN].I) ELSE -WRITELN(' first pt:',RD[GN].B:3:D,' interval:',RD[GN].I:3:D); WRITELN; UN(2); IF XPN THEN WRITELN('x:',RD[GN].B) ELSE WRITELN('x:',RD[GN].B:3:DIN WRITELN(FT,RD[GN].N,RD[GN].B,RD[GN].I); FOR J:=1 TO RD[GN].N DO BEGIN IF J MOD 5 = 0 THEN WRITELN(FT); WRITE(FT,RD[GN].V[J]) END END; CLOSE(FB,CRUNCH); CLOSE(FT,LOCK) END; PROCEDURE SCRW; BEGIN SCON; UNITSTATUS(1,SCS,72); UN(28); WRI READ(C1); IF NOT (C1 IN['Y','y']) THEN BEGIN $CLOSE(FT); $CLOSE(FB); $EXIT(WRFIL) #END END ELSE IF C='X' THEN REWRITE(FT,S) ELSE REWRITE(FB,S) UNTIL IORESULT=0; {$IOCHECK+} IF C='I' THEN J:=BLOCKWRITE(FB,RD[GN],2) ELSE BEG {$IOCHECK-} WRITE('file name: '); READS; IF C1=ESC THEN EXIT(WRFIL); IF C='X' THEN RESET(FT,S) ELSE RESET(FB,S); IF IORESULT=0 THEN BEGIN UN(28); WRITE(' file: ',S,' <-- already exist write over Y/N ? '); N].V[J]; #IF RD[GN].V[J]253 THEN RD[GN].N:=253; FOR J:=1 TO RD[GN].N DO BEGIN IF C='T' THEN READ(FT,RD[GN].V[J]); "IF FINITE(RD[GN].V[J]) THEN BEGIN #IF RD[GN].V[J]>MXY[GN] THEN MXY[GN]:=RD[Gotted'); WRITE(' ':27,'3 (line / solid 4 (line / dotted '); READ(C1); IF NOT (C1 IN['1'..'4']) THEN EXIT(CURV); PLACE(10); IF C1 IN['4','3'] THEN BEGIN WRITE('line /'); LIN[GN]:=TRUE END ELSE BEGIN WRITE('spline /'); LIN[GN]:=FALSE END; IF C1 IN['3','1'] THEN BEGIN SOL[GN]:=TRUE; WRITE(' solid') END ELSE BEGIN SOL[GN]:=FALSE; WRITE(' dotted') END; IF C1 IN['1','2'] THEN SPLN END; PROCEDURE NODE; BEGIN SCON; WRITE('node character: chr (character none '); R C=CHR(10) THEN C:=''; IF C=CHR(11) THEN C:=''; IF C=CHR(8) THEN C:=''; IF C=CHR(21) THEN C:=''; WRITE(C,' '); CASE C OF '1','2','3':CHGGN; 'B','T','K':REFIL; 'I','X':WRFIL; 'E':SCRW; 'R':PRTW; 'V':CURV; 'N':NODE; '4'WRITE('G',GN,' option --> '); READ(C); UN(26);UN(10);UN(5);UN(31); IF C IN['a'..'z'] THEN C:=CHR(ORD(C)-32); IF (C IN['I','X','E','R','V','N','0','4'..'9','S','P']) AND (RD[GN].N=0) THEN C:=' '; IF LIN[GN]:=TRUE; SOL[GN]:=TRUE; RD[GN].N:=0 END; H:=10; GN:=1; D:=3; XPN:=FALSE; ESC:=CHR(27); GON:=FALSE; SCRI; FLN; CNT:=128; UNITSTATUS(1,CNT,23); INT1; INT2; INT3; REPEAT UN(4); UN(26);UN(0);UN(6); UN(31); UN(11);UN(31); ALSE; UN(26);UN(60);UN(23); WRITE(C1) END; BEGIN UN(14); REWRITE(P,'.PRINTER'); RESET(G,'.GRAFIX'); UG(28); UG(21);UG(2); { xor on } FOR E:=INVOP TO CVTOVFL DO SETHALT(E,FALSE); FOR GN:=1 TO 3 DO BEGIN N TOGG; !H:=TRUNC(R) END; PROCEDURE DECM; BEGIN SCON; WRITE('decimal places is ',D,': 1..9 (changes 0(exp exit '); READ(C1); IF C1 IN['0'..'9'] THEN D:=ORD(C1)-48 ELSE EXIT(DECM); IF C1='0' THEN BEGIN "XPN:=TRUE; "D:=9 END ELSE XPN:=F ELSE RES:=FALSE; UN(2); { set viewport } UN(26); UN(79); UN(1); UN(3); UN(12); REPEAT "WRITE('cursor jump is: ',H,' new value: '); "READR(R); "IF C1=ESC THEN EXIT(HVAL) UNTIL (R>0) AND (R<190); " IF RES THE WRITE('lable vert axis (18 chr max) --> <'); "UN(24); "UN(45); READS; IF C1=ESC THEN EXIT(LABL) ELSE GP[GN].O:=S; PLACE(22); WRITE(S) END END; PROCEDURE HVAL; VAR RES:BOOLEAN; BEGIN IF GON THEN BEGIN "RES:=TRUE; "SCON ENDABL; BEGIN SCON; IF C='9' THEN BEGIN WRITE('lable horz axis (18 chr max) --> <'); "UN(24); "UN(45); READS; IF C1=ESC THEN EXIT(LABL) ELSE GP[GN].A:=S; PLACE(21); WRITE(S) END ELSE BEGIN IF C1=ESC THEN EXIT(WIDT); PLACE(17); WRITR(1,GP[GN].E) END END; PROCEDURE BASE; BEGIN SCON; WRITE('min Y is',MNY[GN],', put base of plot at --> '); READR(GP[GN].B); IF C1=ESC THEN EXIT(BASE); PLACE(19); WRITR(1,GP[GN].B) END; PROCEDURE L EXIT(WIDT); IF EOLN THEN UN(11); UN(30); C1:=ESC END UNTIL C1<>ESC; GP[GN].S:=R; PLACE(16); WRITR(1,GP[GN].S) END ELSE BEGIN R:=RD[GN].B+RD[GN].I*(RD[GN].N-1); WRITE('last data at',R,', end plot at --> '); READR(GP[GN].E); WRITE('first data at',RD[GN].B,', start plot at --> '); READR(R); IF C1=ESC THEN EXIT(WIDT); IF R>=RD[GN].B+(RD[GN].N-1)*RD[GN].I THEN BEGIN UN(7); WRITE('--> ',R,' is larger than last data position '); READ(C1); IF C1=ESC THENN EXIT(SCAL); VFS[GN]:=30.5/GP[GN].Y; VFP[GN]:=60/GP[GN].Y; PLACE(14); WRITR(1,GP[GN].Y); WRITE(' /in') END END; PROCEDURE WIDT; BEGIN SCON; IF C='6' THEN BEGIN REPEAT UN(26);UN(14);UN(5);UN(31); ; IF C1=ESC THEN EXIT(SCAL); HFS[GN]:=65/GP[GN].X; HFP[GN]:=72/GP[GN].X; PLACE(13); WRITR(1,GP[GN].X); WRITE(' /in') END ELSE BEGIN R:=MXY[GN]-MNY[GN]; WRITE('Y',GN,': (',R,' total units) units/in --> ' ); READR(GP[GN].Y); IF C1=ESC THEEAD(NOD[GN]); PLACE(11); IF NOD[GN]=' ' THEN WRITE('none') ELSE WRITE(NOD[GN]) END; PROCEDURE SCAL; BEGIN SCON; WRITE('scale '); IF C='4' THEN BEGIN R:=RD[GN].I*(RD[GN].N-1); WRITE('X',GN,': (',R,' total units) units/in --> '); READR(GP[GN].X),'5':SCAL; '6','7':WIDT; '8':BASE; '9','0':LABL; '':CURX(-H); '':CURX(H); '':CURY(-H); '':CURY(H); 'O':TOGG; 'C':CLR; '-':H:=1; '=':H:=10; '\':H:=50; #'H':HVAL; 'D':DECM; 'S':SPLT; 'P':PPLT END UNTIL C='Q'; CLOSE(P); CLOSE(G) END. OF REAL; { horz scale facter/screen } HFP:ARRAY[1..3] OF REAL; VFS:ARRAY[1..3] OF REAL; VFP:ARRAY[1..3] OF REAL; { vert scale facter/printer } GP:ARRAY[1..3] OF RECORD { parameters { line fit interpolation } SOL:ARRAY[1..3] OF BOOLEAN; { solid line } PLT:ARRAY[1..3] OF BOOLEAN; { prt plot do } NOD:ARRAY[1..3] OF CHAR; { node character } HFS:ARRAY[1..3] { screen save } A:ARRAY[1..256] OF REAL; { spline interpolation } B:ARRAY[1..256] OF REAL; CC:ARRAY[1..3,1..256] OF REAL; DD:ARRAY[1..256] OF REAL; SPP:ARRAY[1..3,1..256] OF REAL; LIN:ARRAY[1..3] OF BOOLEAN; te } I:REAL; { X interval } V:ARRAY[1..253] OF REAL; { 253 pts max } END; FN:ARRAY[1..3] OF STRING; { filename } SCS:ARRAY[1..1923] OF CODE; { file text, graf, print } $F1:INTERACTIVE; { to reset console } RD:ARRAY[1..3] OF RECORD N:INTEGER; { no of data } B:REAL; { begin X coordina or printer dump resave ability: binary or text temp foto file put on d1/tempff } USES REALMODES,PGRAF; TYPE CODE=0..255; S18=STRING[18]; VAR FB,FF:FILE; { file binary } FT,G,P:TEXT; a integer 2nd begining X value real 3rd interval of data " 4rth data 1st value plotted to left up to 253 numbers (Y values) plot: to screenz|}~ickly forbiden unless such distribution is to a profit motive enviroment and with the expressed permission of D.C. Merk design. This program reads a data file of binary or text in format and enables plotting of the data. The format: 1st: number of dat PROGRAM PTPLT Created by D.C. Merk Design 1984 all rights reserved. This disk may be copied or duplicated onto any media so desired without the expressed written permission of D.C.Merk Design. Any sale or profits gained resulting from this work is str} X:REAL; { x scale } Y:REAL; { y scale } B:REAL; { base } S:REAL; { start x } E:REAL; { end x } A:S18; { lable absissa } O:S18 { lable ordinate} END; MNY:ARRAY[1..3] OF REAL; { min y } MXY4]:=42; RV[85]:=170; RV[86]:=106; RV[87]:=234 END; PROCEDURE INT3; BEGIN RV[88]:=26; RV[89]:=154; RV[90]:=90; RV[91]:=218; RV[92]:=58; RV[93]:=186; RV[94]:=122; RV[95]:=250; RV[96]:=6; RV[97]:=134; RV[98]:=70; RV[99]:=198; RV[10]:=130; RV[66]:=66; RV[67]:=194; RV[68]:=34; RV[69]:=162; RV[70]:=98; RV[71]:=226; RV[72]:=18; RV[73]:=146; RV[74]:=82; RV[75]:=210; RV[76]:=50; RV[77]:=178; RV[78]:=114; RV[79]:=242; RV[80]:=10; RV[81]:=138; RV[82]:=74; RV[83]:=202; RV[8]:=116; RV[47]:=244; RV[48]:=12; RV[49]:=140; RV[50]:=76; RV[51]:=204; RV[52]:=44; RV[53]:=172; RV[54]:=108; RV[55]:=236; RV[56]:=28; RV[57]:=156; RV[58]:=92; RV[59]:=220; RV[60]:=60; RV[61]:=188; RV[62]:=124; RV[63]:=252; RV[64]:=2; RV[6529]:=184; RV[30]:=120; RV[31]:=248; RV[32]:=4; RV[33]:=132; RV[34]:=68; RV[35]:=196; RV[36]:=36; RV[37]:=164; RV[38]:=100; RV[39]:=228; RV[40]:=20; RV[41]:=148; RV[42]:=84; RV[43]:=212 END; PROCEDURE INT2; BEGIN RV[44]:=52; RV[45]:=180; RV[46 RV[10]:=80; RV[11]:=208; RV[12]:=48; RV[13]:=176; RV[14]:=112; RV[15]:=240; RV[16]:=8; RV[17]:=136; RV[18]:=72; RV[19]:=200; RV[20]:=40; RV[21]:=168; RV[22]:=104; RV[23]:=232; RV[24]:=24; RV[25]:=152; RV[26]:=88; RV[27]:=216; RV[28]:=56; RV[ E2: E3:'); WRITELN; WRITELN('base : 8( B1: B2: B3:'); WRITELN; SCRI2 END; PROCEDURE INT1; BEGIN RV[0]:=0; RV[1]:=128; RV[2]:=64; RV[3]:=192; RV[4]:=32; RV[5]:=160; RV[6]:=96; RV[7]:=224; RV[8]:=16; RV[9]:=144; 1: G2: G3:'); WRITELN; WRITELN('scale: 4( X1: X2: X3:'); WRITELN(' 5( Y1: Y2: Y3:'); WRITELN; WRITELN('width: 6( B1: B2: B3:'); WRITELN(' 7( E1: inter E(screen'); WRITELN('Plot graph: P(rinter S(creen'); WRITELN; WRITELN; WRITELN; WRITELN; WRITELN('File G1: G2: G3:'); WRITELN; WRITELN('V(curve G1: G2: G3:'); WRITELN('N(ode Geed D(ecml pl at:',D) END; PROCEDURE SCRI; BEGIN WRITE(CHR(28)); WRITELN('Graph ',GN,': 1,2,3 (change C(lear O(ff / on Q(uit'); WRITELN('Read file: B(inary T(ext K(eyboard'); WRITELN('Write file: I(binary X(text R(prUNITSTATUS(1,CNT,21); IF CNT=0 THEN KYPRS:=FALSE ELSE KYPRS:=TRUE END; PROCEDURE SCRI2; BEGIN WRITELN('lable: 9( X1: X2: X3:'); WRITELN(' 0( Y1: Y2: Y3:'); WRITE( 'misc: arrows (grph cur -,=,\,H (cur spAL; { temp GP[GN].S } E:XCPN; CNT,H,I,J,K,L,N,D,NM1,OFS,GN,TGN,SCT:INTEGER; CXP,CYP,R,XCAL,SP,LX,LY,X,Y,X1,Y1:REAL; XPN,LI,CI,SAM,LN,NXN,CHK,GON:BOOLEAN; C,C1,ESC:CHAR; S:STRING; FUNCTION KYPRS:BOOLEAN; BEGIN ck fotofile, with 256 no. in each } LO:0..127; MI:0..1; HI:0..127; EN:0..1 END; YPOS:ARRAY[0..191] OF INTEGER; { fotofile adjacents } MA:ARRAY[0..191] OF INTEGER; GPS:ARRAY[1..3] OF REEAL; { cursor y value } YL:ARRAY[1..3] OF CODE; { y loc save } XN:ARRAY[1..3] OF REAL; { x next node } $RV:ARRAY[0..255] OF CODE; GVAL:ARRAY[0..31,1..256] OF PACKED RECORD { 32 blo:ARRAY[1..3] OF REAL; { max y } POS:PACKED RECORD { position for readr } X:CODE; Y:CODE END; CX:ARRAY[1..3] OF REAL; { cursor x value } CY:ARRAY[1..3] OF R0]:=38; RV[101]:=166; RV[102]:=102; RV[103]:=230; RV[104]:=22; RV[105]:=150; RV[106]:=86; RV[107]:=214; RV[108]:=54; RV[109]:=182; RV[110]:=118; RV[111]:=246; RV[112]:=14; RV[113]:=142; RV[114]:=78; RV[115]:=206; RV[116]:=46; RV[117]:=174; RV[118]:=110; RV[119]:=238; RV[120]:=30; RV[121]:=158; RV[122]:=94; RV[123]:=222; RV[124]:=62; RV[125]:=190; RV[126]:=126; RV[127]:=254 END; PROCEDURE UN(A:CODE); BEGIN UNITWRITE(1,A,1,,12) END; PROCEDURE UP(A:CODE); BEGIN UNITWRITE(6,A,11,Y1); UC(26,X,Y) END END; PROCEDURE DRAW; { draws line to X,Y } BEGIN IF FINITE(Y) THEN BEGIN CI:=FALSE; { current y infinite } IF LI THEN UC(26,X,Y) ELSE IF SOL[GN] THEN UC(24,XS:=9*(Y-LY)/D; IX:=C*0.5; IY:=S*0.5; IF D>=9 THEN BEGIN K:=ROUND(D) DIV 9; FOR J:=1 TO K DO BEGIN X1:=LX+J*C; Y1:=LY+J*S; UC(24,X1-IX,Y1-IY); UC(26,X1,Y1) END; UC(24,X,Y); END ELSE BEGIN X1:=LX+0.074*C; Y1:=LY+0.074*S; UC(24,Xit of prt } UC(24,505,188); WRITE(G,'p') END; PROCEDURE DASL; { draws dashed line LX-X, LY-Y } VAR D,C,S,IX,IY:REAL; BEGIN D:=SQRT(SQR(X-LX)+SQR(Y-LY)); IF D<3 THEN BEGIN UC(25,X,Y); EXIT(DASL) END; C:=9*(X-LX)/D; ',CY[3]); UC(26,559,0); UC(24,0,0); UC(26,0,20); UC(24,0,191); UC(26,0,0); UC(26,0,97); { mark upper limit of prt plt } UC(24,3,97); WRITE(G,'p'); UC(26,505,191); { mark right page lim[3]:=GP[3].B; CXP:=0; CYP:=0; UC(26,0,17); WRITE(G,'G1 X:',CX[1]); UC(26,186,17); WRITE(G,'G2 X:',CX[2]); UC(26,372,17); WRITE(G,'G3 X:',CX[3]); UC(26,21,8); WRITE(G,'Y:',CY[1]); UC(26,207,8); WRITE(G,'Y:',CY[2]); UC(26,393,8); WRITE(G,'Y:].B; WRITE(G,CY[1]); UC(26,221,8); CY[2]:=CYP/VFS[2]+GP[2].B; WRITE(G,CY[2]); UC(26,407,8); CY[3]:=CYP/VFS[3]+GP[3].B; WRITE(G,CY[3]) END; PROCEDURE FLN; BEGIN CX[1]:=GP[1].S; CY[1]:=GP[1].B; CX[2]:=GP[2].S; CY[2]:=GP[2].B; CX[3]:=GP[3].S; CY[3]) END; PROCEDURE CURY(H:INTEGER); BEGIN UC(26,35,8); WRITE(G,CY[1]); UC(26,221,8); WRITE(G,CY[2]); UC(26,407,8); WRITE(G,CY[3]); UC(26,0,CYP); UC(24,559,CYP); CYP:=CYP+H; UC(26,0,CYP); UC(24,559,CYP); UC(26,35,8); CY[1]:=CYP/VFS[1]+GP[1 UC(26,CXP,191); UC(24,CXP,20); UC(26,35,17); CX[1]:=CXP/HFS[1]+GP[1].S; { CXP cursor pixel position } WRITE(G,CX[1]); UC(26,221,17); CX[2]:=CXP/HFS[2]+GP[2].S; WRITE(G,CX[2]); UC(26,407,17); CX[3]:=CXP/HFS[3]+GP[3].S; WRITE(G,CXND; PROCEDURE CURX(H:INTEGER); BEGIN IF ABS(H)<>1 THEN H:=2*H; UC(26,35,17); WRITE(G,CX[1]); { CX cursor value } UC(26,221,17); WRITE(G,CX[2]); UC(26,407,17); WRITE(G,CX[3]); UC(26,CXP,191); UC(24,CXP,20); CXP:=CXP+H; 7) "END; UNTIL EOLN; DELETE(S,J,20-J) END; PROCEDURE WRITR(U:INTEGER;VAL:REAL); BEGIN CASE U OF "1:IF XPN THEN WRITE(VAL) ELSE WRITE(VAL:3:D); "3:IF XPN THEN WRITE(G,VAL:8) ELSE WRITE(G,VAL:3:D); "6:IF XPN THEN WRITE(P,VAL) ELSE WRITE(P,VAL:3:D) END E IF J<19 THEN J:=J+1; READ(C1); S[J]:=C1; IF C1=ESC THEN EXIT(READS); IF C1=CHR(8) THEN IF J>1 THEN BEGIN J:=J-2; UN(8); WRITE(' '); UN(8) END ELSE J:=0; "IF (J=19) AND NOT EOLN THEN IF C<>CHR(8) THEN BEGIN UN(8); WRITE('<'); UN(8); UN(D; CHK:=GETXCPN(INVOP); IF NOT EOLN THEN CHK:=TRUE; IF CHK THEN BEGIN SETXCPN(INVOP,FALSE); UN(26); UNITWRITE(1,POS,2,,12); UN(7);UN(31) END UNTIL NOT CHK; VAL:=R END; PROCEDURE READS; BEGIN J:=0; S:='1234567890123456789'; REPEAT AL); BEGIN UNITSTATUS(1,POS,64); REPEAT CHK:=FALSE; GET(INPUT); IF EOLN THEN EXIT(READR); READ(R); READ(C1); "IF C1 IN['R','r'] THEN BEGIN CLOSE(F1); RESET(F1,'.CONSOLE') "END; IF C1=ESC THEN BEGIN SETXCPN(INVOP,FALSE); EXIT(READR) EN,,12) END; PROCEDURE UG(A:CODE); BEGIN UNITWRITE(3,A,1,,12) END; PROCEDURE UC(A:CODE;X,Y:REAL); VAR IX,IY:INTEGER; BEGIN IX:=ROUND(X); IY:=ROUND(Y); UNITWRITE(3,A,1,,12); UNITWRITE(3,IX,2,,12); UNITWRITE(3,IY,2,,12) END; PROCEDURE READR(VAR VAL:RE,Y) ELSE DASL; IF NXN THEN BEGIN UC(26,X-2,Y+3); WRITE(G,NOD[GN]); IF NOT LN THEN NXN:=FALSE { NXN put in next node } END; UC(25,X,Y) END ELSE CI:=TRUE; LX:=X; LY:=Y; LI:=CI END; PROCEDURE FSPT(HF:REAL); { find starting pt } BEGIN N:=1; { determine X and N } X:=0; R:=GP[GN].S-RD[GN].B; IF R>0 THEN BEGIN { .B offscrn to left } N:=TRUNC(R/RD[GN].I)+1; X:=((N-1)*RD[GN].I+,' ',GP[J].O,' vs ',GP[J].A); "WRITE(P,' scale: '); "WRITR(6,GP[J].X); "WRITE(P,' X/in, '); "WRITR(6,GP[J].Y); "WRITE(P,' Y/in ','base: '); "WRITR(6,GP[J].B); "WRITELN(P); "WRITELN(P); END; UP(27);UP(70); IF SAM THEN BEGIN UP(27);UP(80); UN(11); UN(30); IF N IN[7,8] THEN SAM:=FALSE END; PROCEDURE PRTHD; BEGIN UP(27);UP(69); { on emph mode } FOR J:=1 TO 3 DO IF PLT[J] THEN BEGIN { heading to prt } "WRITELN(P,'G',J,': ',NOD[J],' file: ',FN[J] base exit '); 7:WRITE('WARNING: graph ',J,' has a different Y scale exit '); 8:WRITE('WARNING: graph ',J,' has a different base exit ') END; UN(7); READ(C1); IF N IN[1..4] THEN C1:=ESC; IF C1=ESC THEN EXIT(LSTCHK); IF EOLN THENerr: min value of graph ',J,' above plot limit '); 4:WRITE('fatal err: max value of graph ',J,' below plot base '); 5:WRITE('WARNING: max value of graph ',J,' above plot limit exit '); 6:WRITE('WARNING: min value of graph ',J,' below plotOSE(FF,PURGE); PRT END; PROCEDURE LSTCHK; FORWARD; PROCEDURE NSAM(N:CODE); BEGIN CASE N OF 1:WRITE('fatal err: all graphs must start plot at the same position '); 2:WRITE('fatal err: all graphs must have the same base scale '); 3:WRITE('fatal 91 DO UP(RV[GVAL[MA[K]+16,YPOS[K]].HI]); UP(10); "IF KYPRS THEN BEGIN GP[L].S:=GP[L].E; EXIT(PRT) "END END END; PROCEDURE BITRPRT; BEGIN GSAVE('TEMPFF'); RESET(FF,'TEMPFF'); { test foto file } J:=BLOCKREAD(FF,GVAL,32); CL]].LO]); UP(10); UP(27);UP(75);UP(192);UP(0); FOR K:=0 TO 191 DO UP(RV[GVAL[MA[K]+16,YPOS[K]].LO]); UP(10); UP(27);UP(75);UP(192);UP(0); FOR K:=0 TO 191 DO UP(RV[GVAL[MA[K],YPOS[K]].HI]); UP(10); UP(27);UP(75);UP(192);UP(0); FOR K:=0 TO 1233 TO 252 DO BEGIN FOR K:=0 TO 191 DO BEGIN YPOS[K]:=I-(K DIV 64)*20-((K MOD 32) DIV 8)*64; N:=2*(K MOD 8); IF (K MOD 64)<32 THEN MA[K]:=14+1-N ELSE MA[K]:=14-N END; UP(27);UP(75);UP(192);UP(0); FOR K:=0 TO 191 DO UP(RV[GVAL[MA[K],YPOS[K>=(GP[GN].E-GP[GN].S)*HF); END; PROCEDURE SPLT; { scrn plot } BEGIN UG(15); GON:=TRUE; FSPT(HFS[GN]); GRPH(HFS[GN],VFS[GN]) END; PROCEDURE PRT; { main sort of bits and transfer to printer } BEGIN FOR I:=)/HF; SP:=CC[GN,N+1]-(SPP[GN,N+1]*0.1666666+SPP[GN,N]*0.3333333)*R D[GN].I; Y:=RD[GN].V[N]+SP*XCAL+SPP[GN,N]*XCAL*XCAL*0.5; Y:=(Y+(SPP[GN,N+1]-SPP[GN,N])*XCAL*XCAL*XCAL*0.1666666/RD[GN ].I-GP[GN].B)*VF END END; DRAW UNTIL (X>=559) OR (XD ELSE BEGIN X:=X+9; IF XN[GN]<=X THEN BEGIN IF NOD[GN]<>' ' THEN NXN:=TRUE; X:=XN[GN]; N:=N+1; Y:=(RD[GN].V[N]-GP[GN].B)*VF; XN[GN]:=XN[GN]+R END ELSE BEGIN { spline interp } XCAL:=(X-XN[GN]+R { adjust for first } LI:=TRUE; { last y infinite } REPEAT IF (N=RD[GN].N) OR KYPRS THEN EXIT(GRPH); IF LN THEN BEGIN N:=N+1; X:=X+R; Y:=(RD[GN].V[N]-GP[GN].B)*VF ENline } LN:=TRUE; { LIN true if to close/spline } IF NOD[GN]<>' ' THEN NXN:=TRUE ELSE NXN:=FALSE; { flag for node } X:=X-R { adjust for first } END ELSE X:=X-9; N:=N-1; RD[GN].B-GP[GN].S)*HF END; IF R<0 THEN X:=-R*HF; { .B to right of left edge } XN[GN]:=X END; PROCEDURE GRPH(HF,VF:REAL); BEGIN R:=RD[GN].I*HF; LN:=FALSE; IF ((RD[GN].I*HF)<15) OR LIN[GN] THEN BEGIN { nodes to close for sp { comp mode } WRITR(6,GP[L].B); UP(27);UP(68);UP(15);UP(31);UP(48);UP(255); { set tab stops } FOR J:=1 TO 3 DO BEGIN UP(9); { L is one of PLT true } WRITR(6,GP[L].B+J*GP[L].Y); END; UP(10); UP(27);UP(81) END END; PROCEDURE LSTCHK; { last chk and bit reverse } BEGIN SAM:=TRUE; N:=1; WHILE NOT PLT[N] DO N:=N+1; L:=N; FOR J:=N TO 3 DO IF PLT[J] THEN BEGIN IF GP[J].S<>GP[N].S TH { xor on } GN:=TGN END; PROCEDURE TOGG; BEGIN IF GON THEN BEGIN UN(15); GON:=FALSE END ELSE BEGIN UG(15); GON:=TRUE END END; PROCEDURE CHGGN; BEGIN GN:=ORD(C)-48; UN(26);UN(6);UN(0); WRITE(GN) END; PROCEDURE INIT; END; CHK:=FALSE; BITRPRT UNTIL GP[L].S>=GP[L].E; UP(27);UP(50); { set norm ln spa, 6/in } CLR; FOR GN:=1 TO 3 DO IF PLT[GN] THEN BEGIN "GP[GN].S:=GPS[GN]; PLACE(16); WRITR(1,GP[GN].S) END; UG(21);UG(2); FSPT(HFP[GN]); IF CHK THEN BEGIN Y:=(RD[GN].V[N]-GP[GN].B)*VFP[GN]; IF X<0 THEN UC(26,0,Y+8) ELSE UC(26,X,Y+8); WRITE(G,'G',GN) END; GRPH(HFP[GN],VFP[GN]); GP[GN].S:=560/HFP[GN]+GP[GN].S { increment screen } G(0); { xor off } CHK:=TRUE; SCT:=-1; { screen count-1 } REPEAT UG(28); BSLN; { put in axis } FOR GN:=1 TO 3 DO IF PLT[GN] THEN BEGIN THEN EXIT(PPLT); UN(14); UP(27);UP(49); { sets line spa to 7 dot/ln } TGN:=GN; { temp graph no. store } FOR J:=1 TO 3 DO GPS[J]:=GP[J].S; { temp start posit } UG(21);U J:=GN*23-8; UN(26); UN(J); UN(LN); WRITE(' '); UN(26); UN(J); UN(LN) END; PROCEDURE PPLT; { prt plot } BEGIN SCON; { screen on } ASK; IF CHK OR (C1=ESC) END END END; PROCEDURE SCON; BEGIN UN(15); GON:=FALSE END; PROCEDURE CLR; BEGIN UG(21);UG(0); { xor off } UG(28); UG(21);UG(2); { xor on } FLN END; PROCEDURE PLACE(LN:CODE); BEGINT true } END; UC(26,559,0); UC(24,0,0); IF CHK THEN BEGIN { draw vert axis } UC(24,0,191); { anotate start mark if same } FOR J:=1 TO 3 DO BEGIN K:=J*60; UC(26,0,K); UC(24,6,K) :=SCT+1; FOR J:=0 TO 7 DO BEGIN OFS:=(SCT*16) MOD 72; { offset of in. on base of nxt scr } K:=J*72+OFS; UC(26,K,8); "WRITR(3,GP[L].S+J*GP[L].X+OFS/HFP[L]); UC(26,K,0); UC(24,K,6); { L is one of PL] THEN WRITE(J,', '); WRITE('chk parms and printer (on)'); READ(C1); IF NOT EOLN THEN C1:=ESC; IF C1=ESC THEN EXIT(ASK); UN(11); UN(30); LSTCHK END; PROCEDURE BSLN; BEGIN { anotate base, mark if same } SCTWRITE(J,' '); READ(C1); IF C1=ESC THEN EXIT(ASK); IF EOLN THEN BEGIN $CHK:=FALSE; $PLT[J]:=TRUE END "END END; IF CHK THEN EXIT(ASK); { chk makes sure 1 to plot } UN(26); UN(0); UN(5); WRITE('plot: '); FOR J:=1 TO 3 DO IF PLT[Jich graphs } BEGIN UN(30); CHK:=TRUE; { asure at least 1 graph } WRITE('graph to plot -->',' accepts exits':55); FOR J:=1 TO 3 DO BEGIN "UN(26); "UN(18); "UN(5); "PLT[J]:=FALSE; "IF RD[J].N<>0 THEN BEGIN GP[J].Y<>GP[N].Y THEN NSAM(7); IF GP[J].B<>GP[N].B THEN NSAM(8); IF GP[J].E>GP[L].E THEN L:=J; { find last pts preserve L } END; IF C1=ESC THEN EXIT(LSTCHK); PRTHD END; PROCEDURE ASK; { determine whEN NSAM(1); { fatal err 1..4 } IF GP[J].X<>GP[N].X THEN NSAM(2); IF 191<((MNY[J]-GP[J].B)*VFP[J]) THEN NSAM(3); IF 0<(GP[J].B-MXY[J]) THEN NSAM(4); IF 191<((MXY[J]-GP[J].B)*VFP[GN]) THEN NSAM(5); IF 0ESC THEN READ(C1); UN(4); UNITSTATUS(1,SCS,74) END; PROCEDURE PRTW; BEGIN SCON; WRITE('--> VERIFY <-- the printer is on [GN].V[J]) "END ELSE WRITE(RD[GN].V[J]:15:D); IF J MOD 50 = 0 THEN BEGIN WRITELN; WRITELN; WRITE(' exit any key (cont '); IF EOLN THEN UN(11); UN(11); UN(30); READ(C1); IF C1=ESC THEN J:=RD[GN].N END; IF K = 4 THEN BEGIN WRITI) ELSE -WRITELN(' first pt:',RD[GN].B:3:D,' interval:',RD[GN].I:3:D); WRITELN; UN(2); IF XPN THEN WRITELN('x:',RD[GN].B) ELSE WRITELN('x:',RD[GN].B:3:D); J:=0; C1:=' '; REPEAT "K:= J MOD 5; J:=J+1; IF XPN THEN BEGIN UN(24);UN(K*15+5); WRITE(RD THEN WRITELN(FT); WRITE(FT,RD[GN].V[J]) END END; CLOSE(FB,CRUNCH); CLOSE(FT,LOCK) END; PROCEDURE SCRW; BEGIN SCON; UNITSTATUS(1,SCS,72); UN(28); WRITE(' no of pts: ',RD[GN].N); IF XPN THEN WRITELN(' first pt:',RD[GN].B,' interval:',RD[GN].ND END ELSE IF C='X' THEN REWRITE(FT,S) ELSE REWRITE(FB,S) UNTIL IORESULT=0; {$IOCHECK+} IF C='I' THEN J:=BLOCKWRITE(FB,RD[GN],2) ELSE BEGIN WRITELN(FT,RD[GN].N,RD[GN].B,RD[GN].I); FOR J:=1 TO RD[GN].N DO BEGIN IF J MOD 5 = 0HEN EXIT(WRFIL); IF C='X' THEN RESET(FT,S) ELSE RESET(FB,S); IF IORESULT=0 THEN BEGIN UN(28); WRITE(' file: ',S,' <-- already exist write over Y/N ? '); READ(C1); IF NOT (C1 IN['Y','y']) THEN BEGIN $CLOSE(FT); $CLOSE(FB); $EXIT(WRFIL) EN(4); INIT; CLOSE(FB); CLOSE(FT) END; PROCEDURE WRFIL; BEGIN SCON; UN(2); UN(26);UN(79);UN(1); { set viewport } UN(3); UN(12); REPEAT {$IOCHECK-} WRITE('file name: '); READS; IF C1=ESC T); IF RD[GN].N>253 THEN RD[GN].N:=253; FOR J:=1 TO RD[GN].N DO BEGIN IF C='T' THEN READ(FT,RD[GN].V[J]); "IF FINITE(RD[GN].V[J]) THEN BEGIN IF RD[GN].V[J]>MXY[GN] THEN MXY[GN]:=RD[GN].V[J]; IF RD[GN].V[J]MXY[GN] THEN MXY[GN]:=RD[GN].V[J]; IF RD[GN].V[J] to terminate'); UN(2); J:=0; REPEAT "WRITE(RD[GN].B+RD[GN].I*J:3:D,': '); "J:=J+1; READR(RD[GN].V[J]); "IF FINITE(RD[GN].V; PLACE(19); WRITR(1,GP[GN].B); PLACE(16); WRITR(1,GP[GN].S); PLACE(17); WRITR(1,GP[GN].E); PLACE(10); WRITE('line / solid'); PLACE(11); WRITE('none'); PLACE(21); PLACE(22) END; PROCEDURE KEBRD; BEGIN UNITSTATUS(1,SCS,72); UN(28); WRITE('be; GP[GN].A:=' '; GP[GN].O:=' '; NOD[GN]:=' '; SOL[GN]:=TRUE; { solid straight line } LIN[GN]:=TRUE; PLACE(8); WRITE(FN[GN]); PLACE(13); WRITR(1,GP[GN].X); WRITE(' /in'); PLACE(14); WRITR(1,GP[GN].Y); WRITE(' /in') exit '); READ(C1); IF C1=ESC THEN EXIT(PRTW); UP(27);UP(64); { reset printer } UP(27);UP(69); WRITELN(P,'file: ',FN[GN]); UP(27);UP(70); WRITE(P,' no of pts: ',RD[GN].N,' first pt:',RD[GN].B); WRITELN(P,' interval:',RD[GN].I); UP(27);UP(68);UP(5);UP(20);UP(35);UP(50);UP(65);UP(255); { tab set } IF XPN THEN WRITELN(P,'x:',RD[GN].B) ELSE WRITELN(P,'x:',RD[GN].B:3:D); FOR J:=1 TO RD[GN].N DO BEGIN IF XPN THEN BEGIN UP(9); WRITE(P,RD[GN].V[J]) "END ELSE WRITE(P set viewport } UN(26); UN(79); UN(1); UN(3); UN(12); REPEAT "WRITE('cursor jump is: ',H,' new value: '); "READR(R); "IF C1=ESC THEN EXIT(HVAL) UNTIL (R>0) AND (R<190); " IF RES THEN TOGG; !H:=TRUNC(R) END; PROCEDURE DECM; BEGIN SCON; WRITE('de-> <'); "UN(24); "UN(45); READS; IF C1=ESC THEN EXIT(LABL) ELSE GP[GN].O:=S; PLACE(22); WRITE(S) END END; PROCEDURE HVAL; VAR RES:BOOLEAN; BEGIN IF GON THEN BEGIN "RES:=TRUE; "SCON END ELSE RES:=FALSE; UN(2); { END; PROCEDURE LABL; BEGIN SCON; IF C='9' THEN BEGIN WRITE('lable horz axis (18 chr max) --> <'); "UN(24); "UN(45); READS; IF C1=ESC THEN EXIT(LABL) ELSE GP[GN].A:=S; PLACE(21); WRITE(S) END ELSE BEGIN WRITE('lable vert axis (18 chr max) - READR(GP[GN].E); IF C1=ESC THEN EXIT(WIDT); PLACE(17); WRITR(1,GP[GN].E) END END; PROCEDURE BASE; BEGIN SCON; WRITE('min Y is',MNY[GN],', put base of plot at --> '); READR(GP[GN].B); IF C1=ESC THEN EXIT(BASE); PLACE(19); WRITR(1,GP[GN].B); IF C1=ESC THEN EXIT(WIDT); IF EOLN THEN UN(11); UN(30); C1:=ESC END UNTIL C1<>ESC; GP[GN].S:=R; PLACE(16); WRITR(1,GP[GN].S) END ELSE BEGIN R:=RD[GN].B+RD[GN].I*(RD[GN].N-1); WRITE('last data at',R,', end plot at --> '); N(14);UN(5);UN(31); WRITE('first data at',RD[GN].B,', start plot at --> '); READR(R); IF C1=ESC THEN EXIT(WIDT); IF R>=RD[GN].B+(RD[GN].N-1)*RD[GN].I THEN BEGIN UN(7); WRITE('--> ',R,' is larger than last data position '); READ(C1)al units) units/in --> ' ); READR(GP[GN].Y); IF C1=ESC THEN EXIT(SCAL); VFS[GN]:=30.5/GP[GN].Y; VFP[GN]:=60/GP[GN].Y; PLACE(14); WRITR(1,GP[GN].Y); WRITE(' /in') END END; PROCEDURE WIDT; BEGIN SCON; IF C='6' THEN BEGIN REPEAT UN(26);U',GN,': (',R,' total units) units/in --> '); READR(GP[GN].X); IF C1=ESC THEN EXIT(SCAL); HFS[GN]:=65/GP[GN].X; HFP[GN]:=72/GP[GN].X; PLACE(13); WRITR(1,GP[GN].X); WRITE(' /in') END ELSE BEGIN R:=MXY[GN]-MNY[GN]; WRITE('Y',GN,': (',R,' tot WRITE('node character: chr (character none '); READ(NOD[GN]); PLACE(11); IF NOD[GN]=' ' THEN WRITE('none') ELSE WRITE(NOD[GN]) END; PROCEDURE SCAL; BEGIN SCON; WRITE('scale '); IF C='4' THEN BEGIN R:=RD[GN].I*(RD[GN].N-1); WRITE('XN]:=TRUE END ELSE BEGIN WRITE('spline /'); LIN[GN]:=FALSE END; IF C1 IN['3','1'] THEN BEGIN SOL[GN]:=TRUE; WRITE(' solid') END ELSE BEGIN SOL[GN]:=FALSE; WRITE(' dotted') END; IF C1 IN['1','2'] THEN SPLN END; PROCEDURE NODE; BEGIN SCON;CON; WRITELN('curve type: 1 (spline / solid 2 (spline / dotted'); WRITE(' ':27,'3 (line / solid 4 (line / dotted '); READ(C1); IF NOT (C1 IN['1'..'4']) THEN EXIT(CURV); PLACE(10); IF C1 IN['4','3'] THEN BEGIN WRITE('line /'); LIN[G:=3 TO NM1 DO B[J]:=DD[J]-RD[GN].I*B[J-1]/A[J-1]; SPP[GN,RD[GN].N]:=0; SPP[GN,NM1]:=B[NM1]/A[NM1]; FOR J:=(RD[GN].N-2) DOWNTO 2 DO SPP[GN,J]:=(B[J]-RD[GN].I*SPP[GN,J+1])/A[J]; SPP[GN,1]:=0; UN(15) END; PROCEDURE CURV; BEGIN S14); NM1:=RD[GN].N-1; A[2]:=4*RD[GN].I; FOR J:=3 TO NM1 DO A[J]:=RD[GN].I*(4-RD[GN].I/A[J-1]); R:=1/RD[GN].I; FOR J:=2 TO RD[GN].N DO CC[GN,J]:=(RD[GN].V[J]-RD[GN].V[J-1])*R; FOR J:=2 TO NM1 DO DD[J]:=6*(CC[GN,J+1]-CC[GN,J]); B[2]:=DD[2]; FOR J,RD[GN].V[J]:15:D); IF (J MOD 5 = 0) AND (J<>RD[GN].N) THEN BEGIN WRITELN(P); IF KYPRS THEN EXIT(PRTW); IF XPN THEN WRITELN(P,'x:',RD[GN].B+RD[GN].I*J) ELSE /WRITELN(P,'x:',RD[GN].B+RD[GN].I*J:3:D) END; END; UP(10) END; PROCEDURE SPLN; BEGIN UN(cimal places is ',D,': 1..9 (changes 0(exp exit '); READ(C1); IF C1 IN['0'..'9'] THEN D:=ORD(C1)-48 ELSE EXIT(DECM); IF C1='0' THEN BEGIN "XPN:=TRUE; "D:=9 END ELSE XPN:=FALSE; UN(26);UN(60);UN(23); WRITE(C1) END; BEGIN UN(14); REWRITE(P,'.PRINTER'); RESET(G,'.GRAFIX'); UG(28); UG(21);UG(2); { xor on } FOR E:=INVOP TO CVTOVFL DO SETHALT(E,FALSE); FOR GN:=1 TO 3 DO BEGIN LIN[GN]:=TRUE; SOL[GN]:=TRUE; RD[GN].N:=0 END; H:=10; GN:=1; D:=3; XPNness Basic program that prints graph paper on a -: plotter. -: PLOT.UTIL : Business Basic plot utility program. -: WEIGHT.CHART : Business Basic weight chart program for a plotter. -: CRT.IK.VD.PL : Business Basic program to measure CRT , these programs can be looked at for ideas on how to program using graphics. On Side One: -: BUS.GRAPH : Business Basic program that produces a bar graph. -: FREQ.PLOTS : Business Basic program that produces frequency plots. -: GRAPH.PAP.PL : Busi WAP /// SIG PD LIBRARY PLOTING AND GRAPHING WITH THE /// PDS NAME: Graphics Utilities DISK ID#: 3GRX-18 BOOTABLE?: Bootable A series of utility programs in Basic by Dr. Carlo Infante. Mostly designed for use with a plotter |_13_|_29_| |_12_|_28_| 0|_15_|_31_| 32|_14_|_30_| blk blk k |__3_|_19_| |__2_|_18_| |__5_|_21_| |__4_|_20_| |__7_|_23_| |__6_|_22_| |__9_|_25_| |_ 8_|_24_| |_11_|_27_| |_10_|_26_| 193|-- 0------------------------------ ---- ---- blk ele ele ele dot 8|_15_|_31_| dot 40|_14_|_30_| |__1_|_17_| |__0_|_16_| | |--|--| |----| ----| ----| | | | | | 169| 149| 129|-- 8| |--|--| |----| ----| ----| | -64 | |15|31| | 233| 213|; '':CURY(-H); '':CURY(H); 'O':TOGG; 'C':CLR; '-':H:=1; '=':H:=10; '\':H:=50; 'H':HVAL; 'D':DECM; 'S':SPLT; 'P':PPLT END UNTIL C='Q'; CLOSE(P); CLOSE(G) END. CHR(21) THEN C:=''; WRITE(C,' '); CASE C OF '1','2','3':CHGGN; 'B','T','K':REFIL; 'I','X':WRFIL; 'E':SCRW; 'R':PRTW; 'V':CURV; 'N':NODE; '4','5':SCAL; '6','7':WIDT; '8':BASE; '9','0':LABL; '':CURX(-H); '':CURX(H)a'..'z'] THEN C:=CHR(ORD(C)-32); IF (C IN['I','X','E','R','V','N','0','4'..'9','S','P']) AND (RD[GN].N=0) THEN C:=' '; IF C=CHR(10) THEN C:=''; IF C=CHR(11) THEN C:=''; IF C=CHR(8) THEN C:=''; IF C=:=FALSE; ESC:=CHR(27); GON:=FALSE; SCRI; FLN; CNT:=128; UNITSTATUS(1,CNT,23); INT1; INT2; INT3; REPEAT UN(4); UN(26);UN(0);UN(6); UN(31); UN(11);UN(31); WRITE('G',GN,' option --> '); READ(C); UN(26);UN(10);UN(5);UN(31); IF C IN['current. -: GRATICULE : Business Basic program to generate standard scope -: graticule. -: RES.4.GRAPH.S2 : Business Basic program that graphs four of the -: resolution definitions. -: INSTRUCTIONS : How to use this disk. Side Two Contains: -: DCM.TEXT : This program reads a data file of binary or text in format -: and enables plotting of the data. -: DCMA.TEXT: This is a graphics dump utility. Excellent discussion about -: Apple /// graphics. -the relation of the data bytes to where on the screen they represent and within that byte each bit's relation to a unique pixel. Unfortunatly, the bits are in reverse order as to that byte which is sent to the printer. x 1 1 0 0 1 0 1 = h more tests revealed the pattern. It is a convoluted one and reproducing my notes will only distract from further points. Nonetheless, the two routines published here transforms Apple's pattern into a usable one for the MX 80. We now understanding ne array with a blank screen. A second array was stored of a screen with just one pixel on. These two arrays were masked and the element and value of that element showing a difference gave a relation to that pixel and where it is stored. Eventually, wits of graphic data. Included are 1024 bytes plus the eighth bits which are used for other graphic parameters. The next step was to debug Apple's mapping pattern to enable sending the correct order of data bytes to the printer. I did this by storing os ability it takes approximatly thirty seconds to store and blockread it back into your own program variables. The program variable used here is a 32 by 256 array of integers. In other words 32 blocks of 256 elements with each element containing two bytee printer. I can reassure you this works, but, takes over twenty four minutes to complete. Of course Apple did not see fit to publish the location of graphic data in memory, however, they did provide a routine that stores an image on disk. With thiapped memory consist of 15,360 bytes using only the lower seven bits of each byte. One way of resolving the problem is by using a unitwrite statement to the graphics driver. Each pixel is polled then data bytes are packed accordingly for output to thht pins in the printer's head. For example: bit representation data byte x 1 1 0 0 1 0 1 = 101 decimal Each bit correlates to a unque pixel with 1 indicating on while 0 is off. The graphic screen's meen in 560 black and white mode to an Epson MX 80 printer with graphics capability. Both systems handle the image data in a similar fashion which is in any byte of data the bit representation indicates a pixel's on/off status or whether to fire one of eigɳborous chore, the final routines are straightfoward. Thus, the following discussion pertains to graphic storage and provides insight to the routines contained herein. The problem was to design a pascal procedure enabling the dumping of a graphic scr GRAPHICS DUMP UTILITY A few years ago I started using Apple III graphics for ploting data and graphs related to geophysics. Through this need, a graphics dump program became eminent. Although the path to solving the problem has been a somewhat la: /// graphics. -: NOTE: Should the WAP.Standard font (designed for Menu.Maker) make some of the other programs look strange, you can load the STANDARD font on side one and then run your programs. WAP.STANDARD is the font we use for Menu. 101 decimal in apple 1 0 1 0 0 1 1 0 = 166 decimal for printer Therefore, another problem exist requiring bit reversal. This can be handled in software by declaring a variable of free union record type see pascal program manual [p120], free union varaints). This declares one variable as two types in record format. One, a variable of one byte and two, the same variable as a packed array of 8 elements having value 0 or 1. The procedure reads each bit and packs another byte with tt by 1) Y pixels: -------------------------- | | | |14|30| | |------------------------| | | | 128| |15|31| 193|- ------- | | | | | bits |_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_| low bit to left low byte low byte high byte high byte all these values per 1 element (pixel 28..55 decrement elemen|_____________ | | | | | | 15 | 31 | 15 | 31 | start blk |_____________|_____________|_____________|_____________| | | | | | | | | | | | | | | | | | | | | | | | | ________20 @ 28 dots_____________________... | 0 7 14 21 28 pixel ___________________________ _____________| | in[7..13] then g:=f-7; If f in[14..20] then g:=f-14+8; value:=2^g; X pixels: array ele index 233 (begin).....252 (last) array ele index 233 (begin).....252 (last) ele in that block; ele:=(x div 28)+233-(y div 64)*20-((y mod 32) div 8)*64; for value in that ele; f:=x mod 28; If f<7 then g:=f; If f>20 then g:=21-f+8; If f eq: for which block; If (y mod 64) in[0..31] then c:=1 else c:=0; b:=2*(y mod 8); If (x mod 14) in[0..6] then block:=14+c-b else block:=30+c-b; for which the integer in those used for screen mapping when broken into binary represents 14 horz dots (1 for on, 0 for off) 192x560 = 107520 (pixels) = (256-16)x32x14 2^7 bit is not used(?) except block 0 ele 61 here the mode 0..3 is stored value = 4608: mode 0 9 1 10 2 11 3 { mode 4..7 not stored(?) } ocks (32 for 560 mode) of 256 numbers each block does NOT use ele: 61..64 (but maybe for color) 125..128 189..192 253..256 n the time if to introduce an assembly language routine recalling the image data directly from memory in lieu of storing and retrieving the data. By best estimate it should reduce the time by thirty seconds. FOTO FILES: sequence of bls indexed by the data byte. The extra time for recall is negligable and resulted as the last revision to the routine. Two procedures PRT1 and PRT2 accomplish the same pattern transform. Either one may be used. On a final note one might still lessehe bits are reversed through hardware. It works very well and dumps a screen in two minutes. The only drawback is the need for a special cable. The next chapter of this saga is credited to Ken Petracek who suggestted storing the reverse bit value ahe reverse order of bits. Again, I assure you this works, but, takes approximatly seven to eight minutes to complete. My next solution was to build an intermediate switch between the computer and printer. During the time of data graphics transfer t------------------- | | | | | |14|30| | | -20 |------------------------| | | | | 64| |15|31| 213|- -------------------------- | | | | | |14|30| | | -20 |------------------------| | | | | 0| |15|31| 233|- -------------------------- blk ele -----------------a$,1)="/"5060:s=s-1 5030=a$240 MENU.MAKER 6.2 * Thanks to C.M.Davidson for his help!EAD PASCAL TEXT FILES."04=10:"78C";"ANY KEY RETURNS TO THE MENU."!>G$:::".D1/MENU.MAKER",320R",220(204::"79A";""; 2D=1:F=1 <#4;a$ FD=D+1 P#5;a$ZD=60#5;12)dD=60D=1nF=F+1::d$;::Y=1100:Y x13402  CATCH PASCAL TEXT FILES 202 :F*=08:"78C";"SORRY BUT MENU.MAKER CAN'T R".D1/MENU.MAKER",220 d$="" A$="PRINTING "+B$(I),16,B)=01:=0::"80C";A$;:#3,B$(I),16,B)Z=1#3;b$:"78A";b$Z=Z+1:Z=18:1290 1260 #4,B$(I),16,B)#5,".PRINTER"+ž#4#5;12):::".D1/MENU.MAKE30C$="N"C$="n"1160;:=23:=0::"79C";"PRESS ANY KEY TO HALT LISTING": $1020.202 8::Z=1B::=23:=0::"79C";"WOULD YOU LIKE A PRINTED COPY?":1C$:C$<>"Y"C$<>"y"C$<>"N"C$<>"n"1170*C$="N"C$="n"79C";"PRESS ANY KEY TO HALT LISTING"::202 1020#2,B$(I),16,B)ž#242:::1160Z=1#2;A$:"78A";A$Z=Z+1:Z>1842:::Z=1980*:=23:=0::"79C";"CONTINUE...?":1C$:C$<>"Y"C$<>"y"C$<>"N"C$<>"n"10 MENU.MAKER TEXT MODULESEG=0"MENU.MAKER"890&*X=11000: TEXT SLOW-DOWN LOOP ,X.1,180,22:2,280,21:2,2380,23:z:A$="LISTING "+B$(I),16,B)$=01:=0::"80C";A$;::12)>=23:=0::"--------|--|--|--------|----| ----| ----| | | | | | 41| 21| 1| | |--|--| |----| ----| ----| | | | | | 105| 85| 65| |--|--| |----| ----| ----| | | | | | 169| 149| 129| | |--|--| |----| ----| ----| | |14|30| | 233| 213| 193| 32|------------- ----- ----- 63| | | | | 41| 21| 1| | |--|--| |----| ----| ----| | | | | | 105| 85| 65| | >> ""*:<"">""""""""""""">>><2"<""">""" ""  ">"6**"""""&*2""""""""""""*,"" "" ">""""""""""""""**6"""""""> >>>xrL ==L: ,lCL <=L: <,n)LL8 L8 u:L8 ;)ߍ;j`; ;j`uBL8 uCL8 u)u;) u;L8    x) `(,  LuL-upp<`uqq=L: vuL L L #1:CY` 9C<m><=m@=>@?AL8 >m<>@m=@<=L8 <m>?=m@AL8 C9L8 ; ;k`;);k`,@`<,m p<L<`<p<`,ms<L=q=L: ,lXґȥӑ,10 h0  `,g0L  ҅ӥĥŰ+,0p 4 Ls  Ls i )"|tȌs|st HH` MjH,: <J h̰ <rh,oL`%CYgu9 Ln90$0%,7 ҥ L$0T,8OK50P;ҥ,8 L%\   8҅¥Ӆé҅L,5,6  & @jIH,5 p  He҅Ґhe…å逅h,23Lhʩd8,h)ec efeede`,5 H  h 4  `5!    4(P 4 4  `,g0L,10kH0 ԥ f0)ĭ9)9҅xh(ĥŐL i,1HȊ©L,52,9-P" a{) b) )ab)a a,h0& &+%a0 +hcefd(c,@cfabdf`cnx  (,4h`dd,9P"<:J H) +̰ H) +ʭcP h̰BTVSPLH   5"ʘ HH` (# (=  0`)aI88  >!SHOLES 1!1!2@23#3#4$4$5%5%6^67&7&8*8*9(9(0)0)-_-=+=+\|QWERTYUI OP[{]}`~`~ASDFGHJ K L ;:;:'"'"ZXCVBNM ,<,<.>.>/?/?d0hp00000>0# #0~$ <"<"""<< <"""<"><$""< """"  "" 6***""""""""""<""< :< $"""2,"""""**6"""""< >>> <Le Le ,g0L HH`! ( 9EKQWbmz`(" ((è%È`2ȭ3`1`d`c`+È`&È` & IMk`4`5`6`7`8`9`<ȭ=` & @jI`:ȭpȭqé,i0L È`,g HH`LL! l      5  Hdcefh&+si  M0   h) `(" (  (È& 8  `)2ȱÍ3`)1`Ɂ" (cefd`Hc HH`! (`ɖ" (èÈ``,t0L4 HH`L  d!  `ɖ" ( dÈ  ``,t0L4 d0Cս30. , V  @„ȄL5/((((PPPP @``` @@@@`xp<@ @ :H9H` (# ( -l..PcJt`,t$ ( t`tL4`,t0L4www """"""""33333333DDDDDDDDUUUUUUUUffffffffwwwwwwww(C) 1980 Apple Computer (+@EIR[ty} NQ9Copyright (C) 1983 Apple Computer, Inc. Graphics Driver..GRAFIX b """"""""33333333DDDDDDDDUUUUUUUUffffffffwwwww     ! ( 0 7 I N S _  . G R Y f {    ! $ 4 9 F I P S V \ a h m p s x |     ' + < ? D G N U f k p x ?BEJMRUX]`h  2;AGMS[fot|              . 3 6 9 < ? B E H N S V \ _ b w  KORY\aelpu !$(+.147<?BFILORUX]`finsw| !%*/369<+;CNU\eh "*-036<BLORX_fj &+38;?DGLTot <?BGLQgjox',/25:BG̑ʈ0 Ցʭr̈A萠L: ֦ڱΑ0Б֤ h L  p,:0 JfiΥiώJe΅Хiю@ B $p̑бʑΈ0 Б̱ΑʈeمΐeمАA萿 :  `ʝ"`t  !#%')L: 8p,:Jf׮@$PA B $P@/A'ʤ˅΄ϥ̤ͅЄ B $̑бʑΈ0Ƞ h L: $)טɀIim>ٮ@8pذ `$0"8,:Jک@ׅפ؈۩MjL,:08*Ȅ B ,:J}΅н(I I $0;P̑бʑΈ,:JՐrx 0, )ߍ:) J)*PR,T,V( : `,k<,: JI`I`<,:J̰`=m@>,:J}ʅ̽(I I `<Mj,:0pJՐ̑ʈ`pJհ0`ՑʭrpȐ`=m@< B h A$g " x) (,`% (gL,}0, `gé ĩ `:) j:;jN;~j;O,:0'???>>8?>p<<AAA@@8A@q==C)CB)B C}0 x) `(`hh% ( ΍ ύ逅Ñ}`` " ( ĩ~Íĩϭ & &υΠÑΈ~ F ~ҰةeÅÐн},,P,`,g$ ( efh) `xÙ+(`xÙ&(`)4`)5`)6`)7`)8`)9`,i0!M:0p ȱq L `" (~)y ~JJ* I `x|x|,,}P-X~ F }~L } `,`ʝ`))ժuvЭ H ʊJyjhz|ֆ׆ح)JfJf$PIJfש ʈ8 @ש wx LVخ ʊJJJ莟mwwxix 0ޤՐڢ,P<0 )ߍL- J,P,QJ,R,SJ,T,U,W`,t0L40 ( dȅɥŐ ĐL /47=G\x{~'+.149?CGIKMOQSUWY[]_acegikmoqsuwy{}J) ܭL FܪJJJJ)`'+9;=?ACEGINR\aejns~  #&).369<ADGJMP^g $*-06=HLORWcfloruzp Q%Q̑`pPIE1pΦ#$01ʐ1`JJJJ)`%υߥ`1(ȦJJJ`&&*`JJ` **&*&ߥ`J` ***`` ` Jjjߊ` ߊ`JfJfFߪ߆` `JfJfJfF`ߩ`$011̰JJJ LP \LD$7߭$PH8 nߩ nh ߍϭ - k, ϥ- kϱϮEϑʩ`P z  HH` k(h`$0#$E$0p Q%Qʑ`pPIE1p$E$0(L%τ`ϩE҅0Ȅ(fL% ('Άѽн`8Hٰ hIiHمh8Iif٤Φݰ>Jj8ۅe݅eޅ $  m`!J8݅ eۅ$  m` , V $צ!ϤҐ мφi`Jf`<,&ʰ,i8i#Hiihifʦʆi) v`i,ʐi,iPIIʥ)ifʦʆ̐pLj/Fϐ&Ȅ`'@τ`Fϐ@ E҅F8ئȢΆѽϽ`/epɀjff&ݥeepɀjffݠ %)  %)`%  0.)      0  ` ` @ ``8٨JJJ ) u˘ vͽʅ̆`8Hi #i,$0F y բӅLx  mӥmԐL] h `  )`%)8`)    H   ʥ)Ģ    H Ģ L E% %) L 8`ۅ&ۥe륅eٍeڍ808٥8٥ 8مڅ H , V Εm٭mڭ))njnjnjfjfjfj+mӥmԐ8L( Ӣ й` m j`Hآ Hӭԭ h h`8٭028ٍڍ0Z$eٍeڍm٥m8٥08ٍڍ`8٥058ٍڍ0ԭ V 8fxL@ ] I)!) g 80 J8}L y L 0yʽz0 y L7  Lh `*f*&*)` ϭPh0 йPL)`)L` L``  `L` H , 8 V ТΕLϦI ] +)J* g I`LL) @L) L8``Lթ`~L8L)  =H 'HH N M))Mhh0 }LO}~~Șݻ~`}}~L< L }ީ~` ɠɀ)ӮԮmwӥmxԐ mi` HHGH`  &%(-47=FMUX\_jmz  .169DWfy   % * > A H K Z v z }      % , 1 5 : = B K R Z _ b g n s x ~    ) . 6 = J P S X [    $ 3 : = F d  > B H M s `e|&+.QVYcjuy~':{ǠĠӠ!((ͽϠРРSOS NTRPSOS DRVR(.D1(YYYYMMDDWHHMMSSMMM̱忠ΠͽŠ堠Р͠Ю̠Ɔx߭J ʈc(()o/ e/''ʈ((''()(1i / e/''ʈ((''((''((''' ('`ŠDAY, DD-MON-YY HH:MMSUNMONTUEWEDTHUFRISATJANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDECԠŠР@L&I/O ERRORINTERPRETER FILE NOT FOUNDINVALID INTERPRETER FILEINCOMPATIBLE INTERPRETERDRIVER FILE NOT FOUNDINVALID DRIVER FILEDRIVER FILE TOO LARGEROM ERROR: PLEASE NOTIFY YOUR DEALERTOO MANY DEVICESTOO MANY BLOCK DEVICESEMPTY DRIVER FILE '(i%%%h}%%`8 ȥ!8 !)"qȥ#q#e$ȱe%L)%`@(((( % %`((((࠰$(ɠH(@(h((((@(`%z %% %~(A{(L%`.8(.Je.&ʈ.s(1 6$P8"ȥ#L1$8"ȥ#(ϸ`"##L]$"qȥ#q0,$p)@"q"ȩq"8`*$% $% 8% $L$* $8%8 $`8 &'$% 8&$'% 8$%%`H   q ȥ q Hi hi 1  % H H ȱ h h % $$ 0 e e H i hi âz %` 1 8`    # &ȱ ' # i" i# # #`8 ȥ H h `8 6$P`8"#%#%"$w"$#%"`荚ٍ荺 荚`荺``` D ( )  * ) 4* * h* ))` L% q ȥ q Hi hi  i" i# #% $ȱ %ȱ &ȱ '`<!((g %(r(z(q( %y(i(0z %"#$ %&' $"#$%&'   `%$%ɠ%* " ~#C #p $ %*0"#)#)i $"% * %*  L! {" j% %ƌ(X#"$% "$ #%%& '   ` {" & ɠ% %)  !( (" %(r(z(q( %y(a(0: %   "$%&e$'e% R % < %e,ȥ,*,- y,,,-,,,ȱ,,- yL+,ȑ,` 2"p-,-L(Ġ %>,i-i8, ȱ,%,W,pp ڠ %p`l  " ) i SOS KRNLb.D1/SOS.INTERPŠ̠Š.D1/SOS.DRIVERР頞 0 ) (lH'&3&'&#e'#%e'%'&"$"$#%'#%h`$eH v?c,,,,h߈ߢ~))`3PLLP*%(i&`Ѕ񩏍E H pph`X`î** }*`o^`on 8 JJAj@` *?($`ΠņɠŠ堠РѠ͠஠әƆ Wٍۭۅ5ۅƭۅ X̰ ìۈۑ T̰ۅƭۅ X̰ۙ%ۍ" T`K8`)` İ ۱ۈ` ưW/ۈęۈЍ۩@` 8 MƐ  5 Q8`LŅ ۅ ۩ۍۅ Lɰ ʰۅۄÍÍۙ'Ù ۍ*ۨ  Ѝ۹ۙ8v- ðJ ¥ ð, ðLO ʰƥLT`'  mې浰``8 8 nʰ0 ̰+泱Ƴ m° x̰ ̐8` m° x̰8 ۢ8 ˰y ` ¥ nʰ泱Ƴ T̰#泪 Ѳ *Ƴ ` L:Ϡ`泑Ƴ` LaĥH8`JȘ I8`  S`ۈۥۥ۩Íۭۍۭۍ հL¢H8`Jj Ȅ ۍۆeۅiۅ Lɰ ʰWۅۄ ¦J> ɩE` eĐL Ȑ 15WL QL5WW{5 ې'`,55 ې'` ݠ B1 ȩȑ Lɦ8`5  @ R㥶i ` İG8`F`X8``éۅĩ >` T֩xxMH]@ Kۅ5H ɐE$ eİ Ȱ h`h`8`W h8`hR`hLҿ i x +ۅ5ۅ6 ǰ `E8<W`­ `0XLۅ5` ռ``ߤeI`IiţO`Ȯʆ/ )󘑡`()0zq 滅ѺY Ueۅ5Ѻ Ѻ  Qܐ'`i ҩ *C8/y.i/ ȑ  © $ E7<3W`ȽLֽȄ @8`R ) [)_[AͰ")[)_[A:0/.ЩȑΘ8e * ȩ`Loü 7)?۽۩ W٠Յ<ōōř ռV7 uM78 V榠=ü#)@5 ɐ /ݐE ) .) @L `lqhٯ޿=ϓTXIֲ̛̐~ؠIJK,-NOPQ0vt `` LLɠ8`ΛLL渠`0 `8`HiHiH ihhȱh`86)IH)heuQɸ` ` W` ] %饚0` W` ߰4`)|E8LLLRLLLLL*LLLLLhh`LLL`SOS 1.3 01-NOV-82(C) 1980, 1982 BY APPLE COMPUTER INC. ) `Gƭ X̐`LLŠǠ  ݭv̅w̅ ðzv̍ŭw̍ŭƭ ­ōō T̰]ŅƮņ X̠8iȱiiȱi ṰŅǭŅ XLōۭ۩ۅ ȱ8D`F`8eYƍťǍŠ)͠ȍ۱Ǎ X̰% & !J8` *LĢ `8 iۥƍۥǍ`ۅ %  6 )Ѱ Ѱ` 𝭧e ǐ bǰL*ۈ5ȱ۠ƍȱǍ X̐ H h1  /ݐE`ۈۅ ۅ 8Hۑۑh8`P) հ Wհҥ,J+j泭۪ƳۑȊ ) ~ fPL ͊.>.ʱ+,EP!.E.Lw+,,ӄ*- P*e (` հB հ5 Wհ0,J۪泭ۑƳ sϰ(` L Ͱ2 ~ P kҐ#L8 T 2ΠHHȑhhȑ`Ld )N8` xհ*eȱ+eȱ,i۠Ѻ۹ۑ񥤅- ť.Lcԥ.La Ͱ$)rJ Lɰ )# Ԑ) ͰU..++,,IJ/ ӥ-.?Цե,J+jѲ4Ƴǥ4聠 H hH kh8`8-ȥ.L 8*Ʊ )8 0*-`.G.ʱ*+,EP'.E.LұE0+,,ӄ*p-e  )LBѠٳ )8`i (` )N8`*eȱ+eȱ,i۠Ѻ*ȱ+L - ť.Lkҥ. ՅL ͐Ld ~ pа.J/)@߅4N8`) ))УJ8` ۑȭۑǠۑۑȭۑ($S8`O8` "` / 򑺠+* ͐H h8` ΰi `()  *ǵ յý5Ņ4gȩυɩč5 iψ }.8` iϙLIѠ ˢ L΢ ΰ LϠ ˢ ΰ1` Đ@ АP8`B8`ۑJJJJ -ѥ +jѲ84ƳJJ 2ΐ3泑ƳLTΩ潑ƽ`ƱƳ ΰ( {Π۵*+)e`8`)` J J + ΰ" 0 ΰ 🱼ѼL8`ǩ Ϡ` ϰ ƑȥǑ` Ѻе*`)ȥ+8ۍې  ,ѺLTΠ"LΠ5 խ ɐ /ݐE`C8`)@ ϰa)ۥ,8ېu+J,\ ȱLJΠ) ϰ'#,J(] { ΰ ƑȥǑ.8` { ΰ,JѲ ƳL΅ƱƳ ΰҥ,J0`#$"0#`!qȱi 5H5Ƶ ǽ jh5`L2̩ƍv̥Ǎw̩ÎL%ϠƄǥLj̩۬L~̠HHh` ̐`*ѺG0?M`)J"u-- M8`۬` # ː`  = O̰)= I`JJJJѶQi Lˢ  0 ̐ `"L˦ `H8`8$$"$= O̰=`$0`#$"0`$` H hQ)fʅ F jF jF jF &!  eװ*  ̰F湥 ƹ`Z8`@  ʰ泭ۑƳ ʐ` ʐ` ˰ ƹ Wː`ۘ . . .۪8*JۦȱѶ"` ɰ Ȑ`E`Ɔ X̐8`>>5Ѷ Qܩ<`>`\ʊJJJJ ۍ۩  ˰Fȱ X̰6 0 Lɠ 0ۑۑ8ȱ`H8` ɹ $  8JJJJ8 ` ۠ǽi `< Ȱ+<#5 ې'` ɐ /ݐE`W8`R` 5&i ` Ȱ 0i `<8> ȐT eİF cȰB)Hh5 ˭)*ȑƑȥǑ'(ȑ`L)ɭ)Ѷ*e`M) `ۅH)Ѱ%}ʈh Qܐ'``hi ` p6۽ʹZ5 HȐ/i i `гW8`0( ɐ Ȱ ʮ6E`5 խ ɐ ޢ ȰLL  ΐ` Wհ> H۪ȱHۑhƳh sϰq ` ʰiȱi `)5©éՅĩ5 }JJ+`.`8`ɂ )`@ ש ְO ֤Fi ڥ(8` ְ( ȱ5 HȦ)`Lxץ: ש ְ⥺i ꥻ(8`Lx Lxש u )۠0)p խ.8`)@ ϰ) ϰۈۅƭۅǭۅ5 X̰ *ƭ۬͵̶   `x )HH8(=&(+ʈ&ਹ''&&hh(` * @ HH` 2``ӠР    0) ȑȱȱȱ008 8hhh H(`x )HH'Ƚ!88x , ,,(`," , *)` `߭lߩ * xLx @h hhh ,0)ߨ)Ah&'0HHHH xhhhh ,0)ߍLLhhh@)&&&(&('+*H)H(h)H@x )HH30.0\-JM-, J3,e$,d,,  * *l߅߅H ߅ \xi ߅LHHH *ح)0 D) HHHH,, ߩ0  xLߍ󠠩à٠΀ƉŠŠӠҠȠHHH *ح)0 D) HHHH,, ߘ)@ *)X  xI)}h)L, L )ڠ) w߭)Ů􅮈 ߠ'x)) J,QJ,SJ,U,P,W(`)(()  8)j`J j߅`0X ٠͠堘ӠȠŠ=`Insert volume: Τ in device: 蠠ɠ then press the ALPHA LOCK key twicex)_ @,P,R,T,V) )) `)8( ߠ',@ ߠ0  '葺 ݰL`5`i 祻(8`2ޝ51©ޅéąŅƍ >ϩ 1ޠ== f ɰ`ޭ`5=(5= i Х(`=H hDC5 L3ܵ ɐ /ݐ 8`5 ˥JJJJ8 H h ` ܠ825H h5 ɐ /ݐ 8`Hh ܥ5 `ɥܥܥܥܥ5`܅܅܅܅܅5`( ݰ)Ѻ ݰL ݰ泱Ƴ ʰȭۮ ʰͩΪΩۦ eװqȭqLJ  ˰Aۅƭۅ X̰2%&N  ʰƭ X̐`Ӏ堁ӠҠՈ՘̠ƠŠӠ̠ɤӮȪŅ͠Ϊ ܆5 HȰۈ)ۅƭۅ X̰ 3ڰLÍLT̥L㼠  ʰ` İK ХP8` LɐH80)N  հ)@LO ˰)0 ̐` M ­۠泭ۑƳѲƱƳ X̰ RڰäJۑĥ` İo!)N8`WپX0 ĥLä X0 ĥLà !"#$ Đ2@H AڰCŰrP` 3ڰ(` AڰѶ? İG8`Fە1 ռ İ ЩP߭)@N8`1@8` Aڰ񈱴 ˦,+* ʈJj =ؠ yiȩ`y4泱ƳHhz ʠiȱizLA`L;ؠ"  `1` Đ7@8V۩ Lɠ۪8ۊ۠X)JJJƄ X Ġȱ۠ ȍ۱۠ ۭ) ۍ ð*)#  O̰``)(`N8` ) xհۈ ̰آ*գ  Ͱ ݢգ LvL{ؠ; 窭 JJҘ)e}ҭ e8ЅЩѩӠEӅ ЭHH p0Hppxpppp( ̍pJJ ̍phh`HH p0Ex0pp(0 (p8**-p hhJJJJ 00) 0`ǀЀOHH p0%Px0pNp(PhhQL(p8**-phh SU  U.ST  UOSQ R ȥɭ }`` ? }``  }`X0i 8~XX0H }h襯` ©Wéĭ }0W`F X0A */5BL. zF`LLz Lz`Y `Ơ堧 B k L( LO  %   }` ` ?!©UéĩU󥣍V }`` ?)) $p10LYeieLVȱ d0L`Hȱ hh` WɸSI I.ȩ8A 8ɸ4ɠ(H)h h8   `    i Ȣ d` $,)?P^ GL㢮 5L}P.)(Ơ L`ޠ LR  稱 I)0JJJJѤ  БĈ` H`)à`֩ нѽ>`]PU]]UPPX0 0 PPXPP  į󠠩ҙ̙ɠΠɊՐӠӢ̢ՠҠŠԠҚРĠ鱃ԠȠࠠLQ  * WHHH>%H H @`)h8`  HШБˆeЅА SYSTEM FAILURE = $hh8`hhhxآY_Z@tPRVT,p S JJJJ ) ʍL@ i0i6`îӉ͠堧ǥӥ``HhHy)(h`H` 0L?i `h` `` `x)( 8 `jjJJԥ)եӬɂ )Ӆ҅`  `H0Xh`Π'à̠ȈL` 8`څ  Lk%  Lk8Lu텚8嚅 L L Ld V ``  h` ک V `ۅץ  VLFx) ( :` H ) L  .P'pб0 &L:L5'8+8`0Fܢ` ř,Ř 0 8f)J ӭƅХDžѥL1LUȑ  i ߩLL )  札)  ҩLL` **éL0;` H ) 4 )ߍ) hjjjjۥ0CF = -$(L !LLL&L L-LJ٥eƦ ,L  # ` (L.L…ҥÅ,] Xx,f (I0јIFjFjFji```x@gŽPy+wLwԠ͠ŠԹ.D1 .D2 .D3 .D`HJJJJh)y` (2>&dsjs|T}|s[ŭ᭭򭭪𭭠򠭠頭퀠Šӳ頠𠠀𠠠堠젭ӠΠSOS NTRPRHeLZĠР쁭堠堠ՠP򠭠έ魭  )* i LiHh`PQPQ>P Q,PQ"PɀQ@PAQ`8`nɀ<)nopoLpp` 0h8蘠fȊf` ab 1abo)abaݰb L9c`` a N0Ioa0H ha`pLopna n`  3ɠ/8 L %iLɠ8逨J Hh $`b >_-%^%p_^^_ab"08^c_L8^c_L8^c_L8^c_ȑcc\] ab^_ ``aV R0M bba dda `Q8STRQ ST`c\ȱc]a  b 5DU e\^e]_ ^_ ^_LH8\^]_?Je\^e]_,78\^]_ ^ݰ_ ^_LH^_ $bL@A^_aoQ*@A RQL@A `T8`RLSJTKQHIQiHiIKNJ)M8逅OPOPHMIN'a MHNILHOIPaOHPI8JHFKIGFGaHMINNMʆSTL8HSITQQSTde0f`   cCȱcD C Ea  UV 1 ELUFVG FUUCVDեYCWZDXWXCUDV[ v`b0WXYZiUcȥVcWX eeYZ ggE` @SATRDžŠƠŚ̮ÎȠ Ӡ̠Ӡ` LL#L/LL'Lgab `abBcd cdBrcadbho:ab.cݰdDcݰd8abҊ v+abcabRcdTefVghXijSdfhj RR`^0U ` 0 ʠ0 8 `ůàՠԠàࠝӢӠ ȠDž̖͌͊頀ϐωŠŠӠҠȠγ`%!^0 ^)@`a R =` *^)ـooL]^)?i |TU QTU]qUoqTITsUsprRprqs]ToUXa` RL=Xa` R` *R`ssssssssss\3!z~IssssssssssssIG%ӓ,ssևwn7}|tttUUZ{fzxxˆU膅[L<^ENFONEXINPUOUTPUDIREAWRITOPECLOSATEXABYAAAAAWINDOINVOKPERFORAAFRHPOVP