ACT Apricot disk image㐞 F^ ) (C) ACT 1983 vFONT=BRIT02 KEYS=ACT001 㐞`  @`! #@%'`+/1 3@5`79;=?A C@E`GIKMOQ S@U`WY[]_a c@e`gikmoq s@u`wy{} @` @ ` @ ` @ o @ o ǀ ɠ  @` @`!Aa   !A!!#A%a'1+-//3A5a79;=?A!CAEaGIKMOQ!SAUa㐞WY]_/cAeikmoq!sAuawy{}!A!Aa!A!Aa!Aaǁɡ!Aaׁ١!Aa!Aa " B b  !B!!!!"%'")"+"-"/#1"#3B#5b#7#9#;#=#?$A"$CB$Eb$G$I$K$M$O%Q"%SB%Ub%W%Y%[%]%㐞`  @`! #@%'`+/1 3@5`79;=?A C@E`GIKMOQ S@U`WY[]_a c@e`gikmoq s@u`wy{} @` @ ` @ ` @ o @ o ǀ ɠ  @` @`!Aa   !A!!#A%a'1+-//3A5a79;=?A!CAEaGIKMOQ!SAUa㐞WY]_/cAeikmoq!sAuawy{}!A!Aa!A!Aa!Aaǁɡ!Aaׁ١!Aa!Aa " B b  !B!!!!"%'")"+"-"/#1"#3B#5b#7#9#;#=#?$A"$CB$Eb$G$I$K$M$O%Q"%SB%Ub%W%Y%[%]%㐞Apricot `q SCISSORS  RINSTALL Ut 132COL t -DIRLIST t MOUSE t BOOTEDIT  z CHMOD  ZTEXTED  fREADME DOC { (PLOTTER B GSX w CTRL-DEV  "EMO80 PLT jEMO81 PLT Z>Z>Z> Z>Z>Z>Z>㐞.  ..  README DOC z&SCISSORSCMD ]b \㐞. Ut .. Ut RINSTALLCOM ( RINSTALLOVL xy 8READ ME ϐ)㐞vRINSTALL.OVL$㐞Written by Software Engineering, ACT (Advanced Technology) Ltd.$p\1234567890-=%*/-+ qwertyuiop[]x789asdfghjkl;' 456zxcvbnm,./ 123 0. t^!@#%$&*(㐞 )_+%*/-+ QWERTYUIOP{}|789ASDFGHJKL:" 456ZXCVBNM<>?123 0. \`~|-=%*/-+  []789 ;' 456 ,./123 0. &&HHHEEz @ @ @ A A A D D D B B B C C C㐞memory arena trashed $Not enough memory to load program. $ not found on installed disk. $Assigned program is not of executable format $\l㐞e !&&CC&&2M CJ!s  !TȣK!s6=u  !(=u!Cu@ !` !&CC&2 !L!UU~ W9PP~ W~W%P#݋] _ZY[X;u ;u3_ZY[X;u;t^8 x t^( x^ t x㐞^ t x_YZX[+UF UFF 3FFF tVV FV FtVVFV F FuFF㐞MZ -㐞 BO'UU ~ |0PF[ÈFAPF[- FFFF2]UU FFF‰FFPvw_&FPvd_&F&'P[PPPf*FPPP&*]PPPG*]UUFFF2t@rF2u@PF2u@[ r2~%FHF~WF[×&2= |@P~㐞WF[×&2=~@[#r8P'PPP) PPPw)PPPh)P'PPPN)PPP?)PPP0)PPP!) PP(PPP(PPP(PPP(PPP(~WF[×&h~WF[×F&F2 |@PF2~@[#rF2P'P PPh( F2P4F@FF2$u@P~u@[ rF2$t@r~WF[×&$'P, ]UUQFPP rinstall.comE,FPP =㐞u@FFufFFP FPPF[×F&F@FFPPP~ u@[ rFH%~ }@FFFF2]UUZ'PU Name of keyboard ? PP&FP'P% P="FPPFPQ+FPP=u@FF2r/'P can't find keyboard.PPZ&;FuLFPPPFPPPFPPFP( ]UU]PPPu)'PP'&2P\)&PPPK)%PPP:)'P +*name of file to create (include '.com') ? 㐞PP%FP'P P rFPPFP)FPP=u@FFug%FN+@FFN}!FPl PF[PPPFPPFPF#=u@FF2rD'P *)disk full or other error writing to disk.PP$d]MMUr'P %$Enter full name of file to be run ? PP.$'P'P| P'P'&2[×&2= }@P'&2=~@[#r'P'&2H_&'&2=t''P invalid name㐞 PP#g'&2='P$'P$P$$SPP>['P-,Enter string to output prior to running filePP#'PVterminate with '$'PP"&P'P!*)Enter string to output after running filePP"n'Pterminate with '$'PP`"A%P`f='P#"failed to read file 'RINSTALL.OVR'PP"&U2].. !^[V%r[.. .. !^[V&r[.. Ë.. [ZCS!s.. [.. [㐞ZXS!s.. [.. [^GS!.. [[Z!![_X!& GG&[_X& GG&!.. [ZXS!.. [/!. . . . !>UU>Z(8W~W>Z((&P0$>Z(W>Z((&P]UU~W>Z(8W>Z((&P#>Z(W>Z((&P!]UU T0.(X0(&8(&<(6(:( PB(XD(PF(XH(>6(WX(PPv#V(X(PV(>(X@(>>(W>(PP&>>(WJ(PB&>>(WPP.&>:(W>>(WP#PJ(XL(PR(㐞XT(X(PV(N(XP(>('X'*(P00POR ã.(X0( ã2(X4('PPCON:#'PPE'PPCON:#'PP]Ì.... ;v!OUT OF MEMORY $ȎZ !3Pˌ.&@، .. .ZЋR.. ر ñ P3Pˌ؎& 3Ȏ &&];t&5&GGUN~v=t2;~F] ƪUU=FP~W9P!~t~WvFPFP~W9P ~㐞t'P_'P Can't close: PPVFPPPF in RESETPP-'P}Program abortedPP~!F~t FFFFF~WXZ(X\(FFFFF~8WXFXFFPPF~ux^(FFFFF~WFP9P~uA~t~8WX& ?Fu>Z(W>Z((&PFF~WFP9P[]UU~ WXZ(X\(~ &&<u~ &&<t>~ *&=u~ ,W~ *&_&~ 㐞6&PPB~ 6&P~ &&2PPPPP}P^(~&~&~ &&] UU~ &&<#~ Wv ^(~&~ &&] 69u"o'J h UUF~ ~K`(PF[×&2r"FF`(PF[×&CF@FF'PFCB Table Exhausted!PP{F]UU`(PF[×&]UUP`(PF[(P7 ^(P`(PF[@P ^㐞(]UU FP`(PF[(P^(P`(PF[@P^(>^(uFF2]UU F~WCON:r~&&F~WLST:r~&&Fy~WKBD:oP~WTRM:][ r~&&F;~WRDR:1P~WPUN:[ r~&&FF2]UU0FFP P~PF~&2=~@P~&2=}@[ rVP~&2[FN+@FFN},~WF[×&2PFPrFF2]UU 㐞F2a|@PF2z@[#rF2䓸#ÈFFFF2]UU~&2=t@P~WX&2= u@[#r~WPPM~&2=uF@FP  X@PP!FP X@PP ~WX&2=:tF~WX&2PFFFFF~WF[×&2P.P:P{PF쓋F;ظ}@[#PFP~&2[;ظ@[#r9FPFH[P~WF[×&2P,_&F@FF@Fk~WF[×&2=.u@PFP~&2[;ظ@[#roF@F㐞F~}@PFP~&2[;ظ@[#r8FPFH[P~WF[×&2P_&F@FF@F~W%-PP~WXPF2䓸@+ؓ_&FP~WXPPUFP~WX PP?]UU`(PPP6]UUFFF~u`(PF[@P$PP`(PF[@P~W~WrF^(vj~Whr#^(`(PF[@&qP`(PF[@Pp^(>^(tFv3`(PF[&&`(PF[&^(㐞F]UUFFF~u`(PF[@P$PP`(PF[@P~Wx~WjrF^(vD~WBr#^(`(PF[@&qP`(PF[@PJ^(P`(PF[@P.^(>^(t Fv`(PF[&&^(F]UU ~6&=t~6W~WP_&~6&=uG~&&2=~"P`(P~6&[@Pt^(F~6&P F]UUF2P`(PF[@&2=t@[#r㐞 `(PF[&&=uj`(PF[&&=uD`(PF[ÉFXF~(W~&&[PP~&&[+SPv=P`(PF[@Pu^(v]UUFPFZ(X\(]UU`(PF[ÉFXF~&&=}~Wv_&~&&~(W~&&[×&F~&W~&&@_&F2]UU`(PF[ÉFXF~&&=}v8~&&~(W~&&[×F&~&W~&&@_&]UU ^(>Z(&&2=tPFP㐞FF2u@rP PPP !F2 u@r P P>Z(8WXF&>Z(.WF2u@_&/>Z(&&2=t@PPPlFF2t@r>Z(8WXF&>Z(&&2=t'PFPF>Z(8WXF&>Z(6&F>Z(.&FFFP>Z((&[;ظ@PF2[#r7>Z(WXFXF~8WFH[PvFPb_&F@F>Z(.F&>Z(,WFH_&]UU ^(>Z(&&2=tP>Z(8WX&2P?>㐞Z(&&2=tP>Z(8WX&2P >Z(&&2=tP>Z(8WX&2P>Z(&&2=tP>Z(8WX&2Pn>Z(6&FP>Z((&[FN+@FFN}->Z(WXFXF~8WFH[×&2Pv>Z(*&]UU`(P~6&[@P]UU`(P~6&[&&FPF FXFvP%FF#ÈF~u`(P~6&[ÉFXF~WX &2PF2[;u>~WX F&~WP~W_&㐞~&=t~WX F&~|FF-FFPFPF[[FN+@FFN}>PFPvFP`(P~6&[@PuFFF~F&]UU`(P~6&[&&~&&FPF FXFvPFF#ÈF~u`(P~6&[ÉFXF~WX &2PF2[;u>~WX F&~WP~W_&~&=t~WX F&~|FF-FFPFPF[[FN+@FFN㐞}UPFPvFP`(P~6&[@PF~u ~.&FF~F&]UU P P ]UU>Z(/&2rs F>Z(/&>Z(&&<uO F]UU~WFF[P~WF[P~&2PFFH[+S ~WXP~&2PF[+ؓ_&]UU ~t (F ~.&FF2]UU~/&~WXZ(X\(~.&u ~/&+~4&u~.W~8WX&<u@P~.&㐞2[ _&~8WX&< u@FF2P~.&2[ r ~/&F2P~&&<u@[#r~.&2P~/&2[ r~8WX& ]UU~W$^(]UU ^(FF]ÌZ!Y\U'!][^\%&}Ɏپc$ءlHHHHH3SPSPUUS~&<tFP@:PASTMP00.$$$PP*(PF PPo *(P*(&2@_&*(&<9)*(&0*(P*(&2@_&~WvFP6 ~t㐞~4&F ~4&~.&~/&~&&~WXZ(X\(~*&~,F&~0W~8W ~(F&~WX&<:u@P~WX&Z(&&<>Z(&&<tF. P.P F~W.PQP P P >Z(/&>Z(8WX& .&<t>Z(.W.&<u@_&]>Z(/&2rHF@F5F~t㐞~ FHHFF~WF[×F&>Z(/&2rqF@FF~ u~WF[×F&F@F;~WF[×& F@FF@FF=tFHFz>Z(&&<FHF~WXF&]UU,FPFPFPv$P[×&PF$#PrFF2]"@@iUU FF;| FFFFF]UU~&2F~&2FPvv[FN+@FFN}\~WF[×&F~WF[×&FF2PF2[;u㐞!F2PF2[;FF0뙋F쓋F;tFF쓋F;FFF2]UU ~W~W=u@FF2]UU ~W~W=t@FF2]UU ~W~Wv=u@FF2]UU ~W~WJ=u@FF2]UU ~W~WF~u@P~u@[ ÈFF2]UU ~W~WF~u@P~u@[ ÈFF2]UU~WXP~&2Pvv ];UU~u~ PFHFF2P]U㐞 UPFF+ؓ[FN+@FFN} PEPF[FN+@FFN}~ WFH[×&2P ܋] UU4(P2(PO,Pr F2Pf)>Z(8WXF&>Z(W>Z((&P ]UU~WXZ(X\(] $;|UU L/FXFFF]UUL0L/]UU>L0|+L/L0FL/PL/&2@_&L0@L0]UUPFPFPP&2䉆L0=P[+ؓPL/L0PP L/PL/&㐞2P[_&L0P[ãL0]UU 0(P.(PG-P/r Ff>Z(&&<,>Z(W>Z((&P>Z(8WX&F)>Z(8WX&F>Z(W>Z((&PF2]ù܃"66 X PUN~v] UN~v] UN~OvN] UN~OvN] Z[X PSRUEEю3F;Fȋظ CF][YXS[YXS[ЎU~ ]$S[^ ю SZ[ ю3ˁ㐞6R3F[XY_QYtSUU~ W9PP~ W~W%P#݋] _ZY[X;u ;u3_ZY[X;u;t^8 x t^( x^ t x^ t x_YZX[+UF UFF 3FFF tVV FV FtVVFV F FuFFFFVV VVQvvvvKYs"QvvvvVYF^VV VVFuF^Ft ]F^]_X[SPZ_&2PZ_&PZ_&EP&PZX_&ZX_&㐞ZX[_&&]..(.2([ZXS<u N0R0U*&]2[ZXSU*][ZX2P1. 2222222e2e2222222222233333e2#3(3@3e2e2e2e2e2E3J3O3T3Y3e2e2^3e2e2e2e2e2e2e2e2e2c3f3~33333333!ô m2Undefined Function! $>.>u t2Àutô <tð"ô wPqXôje`[VQ<uôE@;6P0>R0uN0 ô!"# $%(RR0N0P0Ë㐞P0N0㐞 Scissors. Scissors cuts up a large file, say on a winchester, to n number of floppy disks. Run the program by typing "scissors" and press return. Scissors will prompt for the file name to be copied which may include the drive letter, as in A:FRED.DAT. You will then be prompted for the output file name which may also include the drive letter. If scissors cannot open either the input or output file then the following message will be displayed and the program terminated. s㐞cissors: cannot open In the normal course of events the file will be opened and a confirmation message will be printed as follows. Copying to Copying will then proceed until either; the output disk is full or some other disk error occurs; or alternatively, the end of the input file is encountered. If the output disk does become full, then the following message is output. Disk full, or other error in writing to Yo㐞 ************************************************************************* BLACK HOLE SOFTWARE ===================== The software contained on this disk is supplied on the understanding that it is unsupported. ACT (UK) Limited or any other ACT company will NOT be responsible for the results of using this software and will not offer any form of support on its use, nor will they provide correction for any problems that may be encountered. ******㐞******************************************************************************* * * * The files on this disk are pNOTq for general distribution in any form, * * They are pNOTq supported in any way, by this or any other ACT company. * * * ******************************************************************************* The programs 'R㐞 DBASE.COM' and 'RWS.COM' were generated from the program 'RINSTALL.COM' written by Software Engineering ACT (Advanced Technology) Ltd. The actual sources for the the above programs do not exist in any form by which they may be altered or even recompiled as they require extensive re-work in 'DEBUG', and as such will not be released. The 'Rinstall' program on this disk will generate a '.com' type file which performs the following functions:- 1. Swaps keyboards. 2. Output a string (㐞max length 255 characters). 3. Load and run a specified program as a child. 4. Replace the original keyboard. 5. Output a second string. notes:- Rinstall will ask for the file name to be run, this must be entered in full (i.e. 'DBASE.COM'). Rinstall will ask for the name of a keyboard which it will patch into the generated program. This keyboard name must be entered in full (i.e. 'ACT001.KB'). Rinstall will ask for two strings to be entered, these will be output before and after r㐞unning the specified program. Output may be redirected to the microscreen use the standard escape sequences. Rinstall will ask for the name of the file to be created, this must include '.com'. Contained on this disk:- READ.ME This file. RINSTALL.COM Generation program described above. RINSTALL.OVL Overlay. BASDEMO3BAS %|BASDEMO6BAS | BASDEMO5BAS x|BASDEMO4BAS X| 㐞. t -.. t 132C ASM ,.CSET ASM -J132C EXE -%132C COM ̶-%ON COM +b$OFF COM wb$㐞PAGE ,132 COMMENT / ******************************************************************************** * * * 132C.ASM -- 132 COLUMN BY 38 LINE EMULATOR * * * * AUTHOR : NICK J. WILSON - ACT (ADVANCED TECHNOLOGY) LTD. * * * * DATE : 6-10-1983 * * * * COPYRIGHT (C) 1983 ACT (ADVANCED TECHNOLOGY) LTD. * * 㐞 * * NO USE OR DISCLOSURE WITHOUT WRITTEN CONSENT. * * * ********************************************************************************/ CODE SEGMENT 'CODE' ASSUME DS:CODE,CS:CODE ORG 100H MOV AX,CS MOV DS,AX JMP INSTALL TAB_STOP EQU 8 ; MODULO FOR TABS SCOLS EQU 50 ; 50 COLUMNS IN HIRES MODE SROWS EQU㐞 25 ; 25 CHAR LINES DWORDS EQU SCOLS*SROWS*16 ; 20000 WORDS ON SCREEN DBYTES EQU 2*DWORDS ; 40000 BYTES ON SCREEN MAX_XDOTS EQU 16*SCOLS ; 800 DOTS WIDE MAX_YDOTS EQU 16*SROWS ; BY 400 HIGH COL_BYTE EQU 2*MAX_YDOTS ; # BYTE PER COLUMN REV_ATTR EQU 8000H ; REVERSE VIDEO ATTRIBUTE LOW_ATTR EQU 4000H ; LOW INTENSITY ATTRIBUTE UND_ATTR EQU 2000H ; UNDERLINE ATTRIBUTE NON_ATTR EQU 1000H ; NON-DISPLAY ATTRIBUTE RES_ATTR EQU 0800H ; RESERVED ATTRIBUTE DOT_OFF EQU 0 SCN_SEG EQU 0F00㐞0H ; SCREEN SEGMENT XPOS DW 0 ; X OF TOP LEFT OF CHAR CELL YPOS DW 0 ; Y OF TOP LEFT OF CHAR CELL SAVE_XPOS DW 0 ; SAVE CURSOR COLUMN SAVE_YPOS DW 0 ; SAVE CURSOR LINE CELL_WIDTH DW 0 ; WIDTH OF CHAR CELL IN DOTS CELL_HEIGHT DW 0 ; HEIGHT OF CHAR CELL IN RASTER LINES CELL_MASK DW 0 ; MASK FOR CHAR CELL COLM_MAX DW 0 ; MAX # OF CHAR COLUMNS LINE_MAX DW 0 ; MAX # OF CHAR LINES TOP_LINE DW 0 ; TOP LINE OF THE SCREEN BOT_LINE DW 0 ; BOTTOM LINE OF THE SCREEN PUT_VEC DW 0 㐞 ; DISPATCH FOR PUT_CON INSERT_FLAG DB 0 ; IF INSERT MODE ON THEN FLAG = 1 DISCARD_FLAG DB 0 ; IF DISCARD THEN FLAG=1 ATTRIBUTE_FLAG DB 40H ; ALL FIVE ATTRIBUTES, DEFAULT LOW INT. CURSOR_FLAG DB 0 ; IF OFF THEN FLAG=FLAG OR 1 CRLF_FLAG DB 0 ; IF AUTO LF ON CR THEN FLAG=FLAG OR 1 LITERAL_FLAG DB 0 ; IF LITERAL THEN FLAG = 1 GRAPHIC_FLAG DB 0 ; IF GRAPHIC THEN FLAG = 1 BOT_FLAG DB 0 ; IF BOT ENABLED THEN FLAG = 1 BUF_COUNT DB 0 ; COUNT OF CBUFF CHARS SENT TO VT52 CBUFF DB 8 DUP 㐞 (?) ; 8 CHAR BUFFER FOR ESC SEQUENCES CELL_BUFF DW 16 DUP (?) ; SCREEN CELL BUFFER MSCREEN DB 0 ; MICROSCREEN ECHO FLAG ACTIVE DB 0 ; DRIVER ACTIVE FLAG EN132 DB 0 ; ALREADY IN 132 MODE FLAG ;** STORE FOR THE OLD_STUB_CO OLD_STUB_CO LABEL DWORD OLD_O DW ? OLD_S DW ? ;************************************************** ; TABLE FOR THE AMMOUNT OF CHARACTERS THAT ; THE ESCAPE SEQUENCE HANDLER MUST WAIT ; FOR BEFORE IT ACTUALLY HANDLES THEM ;****************************㐞********************* ESC_SIZE DB 0 ; 20H ' ' DB 0 ; 21H '!' DB 0 ; 22H '"' DB 2 ; 23H '#' TRANSMIT PAGE DB 2 ; 24H '$' TRANSMIT CURSOR CHAR DB 0 ; 25H '%' DB 0 ; 26H '&' DB 0 ; 27H ''' DB 2 ; 28H '(' HIGH INTENSITY ON DB 2 ; 29H ')' HIGH INTENSITY OFF DB 0 ; 2AH '*' DB 0 ; 2BH '+' DB 0 ; 2CH ',' DB 0 ; 2DH '-' DB 0 ; 2EH '.' DB 0 ; 2FH '/' DB 2 ; 30H '0' ENTER UNDERLINE MODE DB 2 ; 31H '1' EXIT UNDERLINE MODE DB 0 ; 32H '2' 㐞 DB 0 ; 33H '3' DB 4 ; 34H '4' DB 0 ; 35H '5' DB 0 ; 36H '6' DB 0 ; 37H '7' DB 2 ; 38H '8' LITERAL CHARACTER DB 0 ; 39H '9' DB 0 ; 3AH ':' DB 0 ; 3BH ';' DB 0 ; 3CH '<' DB 0 ; 3DH '=' DB 0 ; 3EH '>' DB 0 ; 3FH '?' DB 2 ; 40H '@' ENTER INSERT CHAR MODE DB 2 ; 41H 'A' CURSOR UP DB 2 ; 42H 'B' CURSOR DOWN DB 2 ; 43H 'C' CURSOR FORWARD DB 2 ; 44H 'D' CURSOR BACKWARD DB 2 ; 45H 'E' CLEAR DISPLAY DB 2 ; 46H 'F' ENTER GRAPHICS M㐞ODE DB 2 ; 47H 'G' EXIT GRAPHICS MODE DB 2 ; 48H 'H' CURSOR HOME DB 2 ; 49H 'I' REVERSE INDEX DB 2 ; 4AH 'J' ERASE TO END OF PAGE DB 2 ; 4BH 'K' ERASE TO END OF LINE DB 2 ; 4CH 'L' INSERT LINE DB 2 ; 4DH 'M' DELETE LINE DB 2 ; 4EH 'N' DELETE CHARACTER DB 2 ; 4FH 'O' EXIT INSERT CHAR MODE DB 0 ; 50H 'P' DB 0 ; 51H 'Q' DB 0 ; 52H 'R' DB 0 ; 53H 'S' DB 0 ; 54H 'T' DB 2 ; 55H 'U' MICROSCREEN ON DB 0 ; 56H 'V' DB 2 ; 57H 'W' MICROSCRE㐞EN OFF DB 2 ; 58H 'X' EXCHANGE FRGND/BKGND (?) DB 4 ; 59H 'Y' DIRECT CURSOR ADDRESSING DB 2 ; 5AH 'Z' IDENTIFY AS VT52 (ESC/K) DB 0 ; 5BH '[' DB 0 ; 5CH '\' DB 2 ; 5DH ']' TRANSMIT BOTTOM LINE DB 2 ; 5EH '^' DB 0 ; 5FH '_' DB 0 ; 60H '`' DB 0 ; 61H 'a' DB 2 ; 62H 'b' ERASE TO BEGINNING OF PAGE DB 0 ; 63H 'c' DB 0 ; 64H 'd' DB 0 ; 65H 'e' DB 0 ; 66H 'f' DB 0 ; 67H 'g' DB 2 ; 68H 'h' REVERSE TAB DB 0 ; 69H 'i' DB 2 ; 6AH 'j' SA㐞VE CURSOR POSITION DB 2 ; 6BH 'k' SET CURSOR TO SAVED POS DB 2 ; 6CH 'l' ERASE ENTIRE LINE DB 5 ; 6DH 'm' SET SIZE DB 2 ; 6EH 'n' CURSOR POSITION REPORT DB 2 ; 6FH 'o' ERASE BEGINNING OF LINE DB 2 ; 70H 'p' ENTER REVERSE VIDEO MODE DB 2 ; 71H 'q' EXIT REVERSE VIDEO MODE DB 0 ; 72H 'r' DB 0 ; 73H 's' DB 0 ; 74H 't' DB 0 ; 75H 'u' DB 2 ; 76H 'v' WRAP AROUND AT END OF LINE DB 2 ; 77H 'w' DISCARD AT END OF LINE DB 3 ; 78H 'x' SET MODE(S) DB 3 㐞 ; 79H 'y' RESET MODE(S) DB 2 ; 7AH 'z' RESET TO 80 COLUMN MODE DB 2 ; 7BH '{' KEYBOARD ENABLED DB 2 ; 7CH '|' ENABLE 132 COLUMN MODE DB 2 ; 7DH '}' KEYBOARD DISABLE DB 0 ; 7EH '~' DB 0 ; 7FH DEL ;************************************* ; CONTROL CODE (<20H) JUMP ; TABLE FOR DISPATCHES ;************************************* CTRL_TAB DW PASS_1,PASS_1,PASS_1,PASS_1,PASS_1,PASS_1,PASS_1,PASS_1 DW CTBS,CTHT,CTLF,PASS_1,PASS_1,CTCR,CTSO,CTSI DW PASS_1,PASS_1,PASS_1,P㐞ASS_1,PASS_1,PASS_1,PASS_1,PASS_1 DW PASS_1,PASS_1,PASS_1,CTESC,PASS_1,PASS_1,PASS_1,PASS_1 ;********************************** ; BINARY CHARACTER SET ;********************************** INCLUDE CSET.ASM ;(PHEW!) ;*************************************************** ; THE NEW CONSOLE OUTPUT SUBROUTINE, CALLED ; AS AN INTERRUPT 29 HEX BY MS-DOS (OR ; ANYTHING ELSE). REMEMBER THAT OLD_STUB_CO ; CONTAINS THE ADDRESS OF THE OLD APRICOT ; SCREEN HANDLER (USED FOR BELLS & SOME ; ESC㐞APE SEQUENCES). ; ASCII OF CHARACTER IS IN AL, NOTHING ELSE ; MATTERS, BUT MUST BE SAVED. ; WE HAVE MUCH TO DO, AND VERY LITTLE TIME TO ; DO IT IN. ;*************************************************** STUBCO: CMP CS:ACTIVE,1 ;ARE WE RE-ENTERING? JE OUTKWIK ;YES, GET OUT QUICK MOV CS:ACTIVE,1 ;SET THE ACTIVE FLAG PUSH BP ;SAVE THE WORLD PUSH BX PUSH CX PUSH DX PUSH DI PUSH SI PUSH ES PUSH AX PUSH DS ;** ENSURE THE INTEGRITY OF THE DS PUSH CS POP DS ;** AS㐞  PER NORMAL: ;** MASK THE TOP BIT SO AS NOT TO ;** MESS UP THE CHARACTERS AND AL,7FH ;** WRITE THE CHARACTER .... CALL PUT_VEC ;** GET BACK XOR AL,AL ;SENDS A NUL PUSHF ;TO OLD DRIVER CALL CS:DWORD PTR OLD_STUB_CO ;SO >STOP< WORKS POP DS POP AX POP ES POP SI POP DI POP DX POP CX POP BX POP BP MOV CS:ACTIVE,0 ;NOT ACTIVE ANY MORE ;** HOME TO ORIGINAL CALLER: IRET OUTKWIK: MOV CS:WORD PTR PUT_VEC,OFFSET STUBCO IRET ;************㐞********************** ; DUMMY ROUTINE TO PLEASE ; THE BIOS ;********************************** PASS_BUFFER: RET ;********************************** ; ROUTINE TO SEND CBUFF ; TO THE OLD SCREEN DRIVER ;********************************** SEND_BUFFER: XOR BX,BX S100: MOV AL,CBUFF[BX] PUSHF CALL CS:DWORD PTR OLD_STUB_CO INC BL CMP BL,BUF_COUNT JB S100 RET ;******************************************** ; HERE IS THE ROUTINE TO PUT THE ; CHARACTER IN AL ON THE SCREEN. 㐞; WE USE CL FROM NOW ON AS AL IS ; TOO IMPORTANT: ;******************************************** PUT_ACTIVE: XOR AH,AH ; CLEAR XOR CH,CH ; CRAP MOV CL,AL ; SWAP THEM AROUND JMP MECHO ; MIGHT ECHO TO MSCREEN NO_ECHO: TEST LITERAL_FLAG,1 ; PRINT LITERALLY ? JNE PUTC170 ; YES XOR CH,CH ; CH=0 CMP CL,20H ; YES - A CTRL CHAR ? JB CTRL99 ; YES CMP CL,7FH ; NO - A DEL ? JE PUTC350 ; YES - NO DISPLAY PUTC170: CALL TOGGLE_CURSOR ; TURN CURSOR OFF TEST INSERT_FLAG,1 ; IN IN㐞SERT MODE ? JE PUTC200 ; NO CALL INSERT_CHAR ; MOVE ALL CHARS RIGHT FROM CURSOR PUTC200: TEST GRAPHIC_FLAG,1 ; IN GRAPHIC MODE ? JE PUTC207 ; NO CMP CL,"^" ; IN GRAPHIC CHARS ? JB PUTC207 ; NO CMP CL,"~" ; CHECK HIGHEST GRAPHIC JNE PUTC205 ; IF GRAPHIC THEN ADJUST INC CL ; ELSE PARA. THEN DISPLAY 7FH JMP PUTC207 PUTC205: SUB CL,"^" PUTC207: CALL CLEAR_CELL CALL CHAR_OR_CELL ; COPY CHAR IN CL TO CELL_BUFF TEST CS:ATTRIBUTE_FLAG,LOW_ATTR/256 ; HIGH INTENSITY JNE PUTC21㐞0 ; NO CALL LSHIFT_CELL ; SHIFT CELL LEFT CALL CHAR_OR_CELL ; SHADOW PRINT CHAR PUTC210: CALL ADD_UNDERLINE ; ADD UNDERLINE IF ON CALL ADD_REVERSE ; ADD REVERSE IF ON CALL PUT_CELL ; PUT THE CELL ON THE SCREEN MOV LITERAL_FLAG,0 ; DID A LITERAL CLEAR FLAG INC CS:XPOS ; MOVE FORWARD ONE CHAR COLUMN MOV AX,CS:XPOS CMP AX,CS:COLM_MAX ; AT RIGHT SIDE OF SCREEN ? JL PUTC300 ; NO MOV AL,CS:DISCARD_FLAG OR AL,AL ; YES - IS DISCARD MODE ON ? JE PUTC240 ; NO MOV AX,CS:COLM_MAX ; YES㐞 - STAY AT RIGHT COLUMN DEC AX MOV CS:XPOS,AX JMP PUTC300 CTRL99: JMP CTRL100 NO_ECHO99: JMP NO_ECHO PUTC240: MOV CS:XPOS,0 ; WRAP TO LEFT COLUMN CALL CTLF ; THEN DO LINE FEED PUTC300: CALL TOGGLE_CURSOR ; TURN CURSOR BACK ON PUTC350: XOR AL,AL ; NO SEQ PENDING RET ;************************************************** ; MICROSCREEN LOGIC - SEND CHAR IN CL ; TO THE BIOS MSCREEN HANDLER ;************************************************** MSCR_OUT: PUSH BX PUSH CX 㐞 PUSH DX MOV BX,33H MOV DX,CX MOV CX,1 INT 0FCH POP DX POP CX POP BX RET ;************************************************** ; THIS TIME, CHECK IF WE ARE ECHOING, ; IF SO, THEN CALL THE ABOVE ROUTINE ;************************************************** MECHO: CMP CS:BYTE PTR MSCREEN,1 ; ECHOING TO MSCREEN ? JNE NO_ECHO99 ; NO CALL MSCR_OUT ; YES JMP NO_ECHO ; BACK ;************************************************** ; CONTROL CODES ;**********************************㐞**************** CTRL100: CMP CL,1BH ; SPECIAL TEST FOR ESC JE CTESC ; YES - RETURN DIFFERENT MOV BX,CX SHL BX,1 CALL TOGGLE_CURSOR ; CURSOR OFF CALL CS:CTRL_TAB[BX] CALL TOGGLE_CURSOR ; CURSOR ON RET ;************************************************** PASS_1: MOV BUF_COUNT,1 MOV CBUFF,CL CALL SEND_BUFFER RET ;************************************************** CTESC: MOV CBUFF,CL ; ESC FIRST CHAR IN BUFFER MOV BUF_COUNT,1 ; ONE CHAR IN BUFFER MOV PUT_VEC,OFFSET BUF㐞FER_ESC RET ;************************************************** CTBS: MOV AX,XPOS ; BACKSPACE DEC AX ; BACKWARD ONE CHAR COLUMN JNS BS500 ; IF NOT AT LEFT SIDE OF SCREEN TEST CS:DISCARD_FLAG,1 ; IN DISCARD MODE ? JNE BS600 ; YES - NO WRAP MOV AX,CS:COLM_MAX ; ELSE WRAP AROUND DEC AX MOV BX,CS:YPOS CMP BX,CS:TOP_LINE ; AT TOP LINE ? JE BS500 ; YES - STAY THERE DEC BX ; SIMULATE BOT+1 CMP BX,CS:BOT_LINE ; AT BOT+1 ? JE BS500 ; YES - STAY THERE MOV CS:YPOS,BX ; ELSE - 㐞 WRAP UP BS500: MOV CS:XPOS,AX BS600: RET ;************************************************** CTHT: MOV AX,CS:XPOS ; HORIZONTAL TAB ADD AX,TAB_STOP AND AX,0FFF8H CMP AX,CS:COLM_MAX ; OFF END ? JL HT550 ; NO MOV AX,CS:COLM_MAX ; ELSE - STICK AT LAST COLUMN DEC AX HT550: MOV CS:XPOS,AX RET ;************************************************** CTLF: CALL LINE_FD ; LINE FEED TEST CS:CRLF_FLAG,2 ; AN AUTO CR ON LF ? JE LF100 ; NO MOV CS:XPOS,0 ; YES - DO A RETURN LF100㐞 : RET LINE_FD: MOV AX,CS:YPOS MOV BX,CS:BOT_LINE CMP AX,BX JE LF300 INC BX ; CHECK BOTTOM +1 CMP AX,BX JE LF200 ; IF BOT+1 DO NOTHING INC AX MOV CS:YPOS,AX LF200: RET ; IF BOT+1 DO NOTHING LF300: MOV SI,CS:TOP_LINE ; SCROLL FROM TOP TO BOTTOM LINE MOV DI,CS:BOT_LINE ; PRINT ON BOTTOM LINE MOV CS:YPOS,DI ; STAY ON BOTTOM LINE - 1 CALL SCROLL_UP RET ;************************************************** CTCR: MOV CS:XPOS,0 ; RETURN, MOVE TO LEFT COLUMN TEST CS:㐞 CRLF_FLAG,1 ; AN AUTO LF ON CR ? JE CR100 ; NO CALL LINE_FD ; YES CR100: RET ;************************************************** CTSO: RET ;************************************************** CTSI: RET ;************************************************** ; BUFFER CHARS FOR ESCAPE SEQUENCE ;************************************************** BUFFER_ESC: PUSH CS POP DS XOR CH,CH XOR AH,AH MOV CL,AL CMP CL,27 ; IS CHAR ANOTHER ESCAPE? JE IGNORE_CHAR ; WE DON'T WANT IT㐞 THEN MOV BL,BUF_COUNT XOR BH,BH MOV CBUFF[BX],CL ; PUT CHAR INTO ESC SEQUENCE BUFFER INC BL ; BUMP COUNT MOV BUF_COUNT,BL MOV DL,CBUFF+1 BUFT200: XCHG DL,BL ; DL=LENGTH, BL=ESC SEQ CHAR SUB BL,20H ; ASCII PRINT CHARS ONLY JB ABORT_ESC ; ELSE ABORT CMP DL,ESC_SIZE[BX] ; GOT ALL OF CHARS IN SEQUENCE ? JB CONT_SEQ ; NO - GET MORE SHL BX,1 ; WORD POINTER CALL TOGGLE_CURSOR ; CURSOR OFF PUSH CS POP DS CALL CS:ESC_DISPATCH[BX] ; ESC DISPATCH ---> CALL TOGGLE_CURS㐞 OR ; CURSOR ON MOV PUT_VEC,OFFSET PUT_ACTIVE RET ABORT_ESC: RET CONT_SEQ: MOV PUT_VEC,OFFSET BUFFER_ESC IGNORE_CHAR: RET ;************************************************** ; ; ESCAPE SEQUENCE HANDLERS ; ;************************************************** ;************************************************** ; TRANSMIT PAGE ; ESC # (1BH,23H) ;************************************************** TRANSMIT_PAGE: RET ;*************************************************㐞 * ; TRANSMIT CHARACTER AT CURSOR ; ESC $ (1BH,24H) ;************************************************** TRANSMIT_CHAR: RET ;************************************************** ; SET HIGH INTENSITY MODE ; ESC ( (1BH,28H) ;************************************************** LOW_INT_OFF: AND ATTRIBUTE_FLAG,NOT (LOW_ATTR/256) ; LOW INTENSITY OFF RET ;************************************************** ; RESET HIGH INTENSITY MODE ; ESC ) (1BH,29H) ;**************************************㐞 ************ LOW_INT_ON: OR ATTRIBUTE_FLAG,LOW_ATTR/256 ; LOW INTENSITY ON RET ;************************************************** ; ENTER UNDERLINE CHARACTER MODE ; ESC 0 (1BH,30H) ;************************************************** UNDERLINE_ON: OR ATTRIBUTE_FLAG,UND_ATTR/256 ; TURN UNDERLINE ON RET ;************************************************** ; EXIT UNDERLINE CHARACTER MODE ; ESC 1 (1BH,31H) ;************************************************** UNDERLINE_OFF: AND ATTR㐞 IBUTE_FLAG,NOT (UND_ATTR/256) ; TURN UNDERLINE OFF RET ;************************************************** ; LITERAL CHARACTER ; ESC 8 (1BH,38H) ;************************************************** LITERAL: MOV LITERAL_FLAG,1 ; NEXT CHAR IS A LITERAL RET ;************************************************** ; ENTER INSERT CHARACTER MODE ; ESC @ (1BH,40H) ;************************************************** INSERT_CHAR_ON: MOV INSERT_FLAG,1 ; ENABLE INSERT CHAR RET ;********㐞 ****************************************** ; CURSOR UP ; ESC A (1BH,41H) ;************************************************** CURSOR_UP: MOV AX,YPOS CMP AX,TOP_LINE ; AT TOP OF SCREEN ? JE CUP100 ; YES - STAY THERE DEC AX ; SIMULATE BOT+1 CMP AX,BOT_LINE ; ON BOTTOM LINE ? JE CUP100 ; YES - STAY THERE MOV YPOS,AX CUP100: RET ;************************************************** ; CURSOR DOWN ; ESC B (1BH,42H) ;************************************************** CURSOR_DOW㐞 N: MOV AX,YPOS MOV BX,BOT_LINE CMP AX,BX ; ON BOTTOM LINE ? JE CDN100 ; YES - STAY THERE INC BX ; ON BOT+1 ? CMP AX,BX JE CDN100 ; YES - STAY THERE INC AX ; ELSE - MOVE DOWN ONE LINE MOV YPOS,AX CDN100: RET ;************************************************** ; CURSOR FORWARD ; ESC C (1BH,43H) ;************************************************** CURSOR_FORWARD: MOV AX,XPOS INC AX ; MOVE FORWARD ONE CHAR COLUMN CMP AX,COLM_MAX ; AT RIGHT SIDE OF SCREEN ? JL 㐞 CRT100 ; NO MOV AX,COLM_MAX ; YES - STAY THERE DEC AX CRT100: MOV XPOS,AX RET ;************************************************** ; CURSOR BACKWARD ; ESC D (1BH,44H) ;************************************************** CURSOR_BACKWARD: MOV AX,XPOS DEC AX ; BACKWARD ONE CHAR COLUMN JNS CLF100 ; IF NOT AT LEFT SIDE OF SCREEN SUB AX,AX ; ELSE STAY THERE CLF100: MOV XPOS,AX RET ;************************************************** ; CLEAR DISPLAY ; ESC E (1BH,45H) 㐞 ;************************************************** CLEAR: MOV SI,TOP_LINE MOV DI,BOT_LINE MOV AX,YPOS CMP AX,DI ; BEYOND BOTTOM LINE JLE CLEAR100 ; NO INC DI ; DI = BOT+1 MOV SI,DI ; CLEAR FROM BOT+1 TO BOT+1 CALL ERASE_LINES ; ERASE BOT LINE +1 MOV XPOS,0 ; MOVE TO BEGINNING OF BOT LINE +1 RET CLEAR100: CALL ERASE_LINES ; ERASE LINE RANGE CALL HOME ; HOME CURSOR RET ;************************************************** ; ENTER GRAPHICS MODE ; ESC F (1BH,46H) 㐞 ;************************************************** GRAPHIC_ON: MOV GRAPHIC_FLAG,1 ; ENABLE GRAPHICS RET ;************************************************** ; EXIT GRAPHICS MODE ; ESC G (1BH,47H) ;************************************************** GRAPHIC_OFF: MOV GRAPHIC_FLAG,0 ; DISABLE GRAPHICS RET ;************************************************** ; HOME CURSOR ; ESC H (1BH,48H) ;************************************************** HOME: XOR AX,AX MOV XPOS,AX ; LEFT C㐞 OLUMN MOV AX,TOP_LINE MOV YPOS,AX ; TOP LINE RET ;************************************************** ; REVERSE LINE FEED ; ESC I (1BH,49H) ;************************************************** REV_LINE_FEED: MOV SI,TOP_LINE MOV DI,BOT_LINE MOV AX,YPOS CMP AX,SI ; AT TOP OF SCREEN JE RVLF100 ; YES - SCROLL DEC AX ;SIMULATE BOT+1 CMP AX,DI JE RVLF200 ; DONT SCROLL IF ON BOT+1 DEC YPOS ; ELSE MOVE UP ONE LINE JMP SHORT RVLF200 RVLF100: CALL SCROLL_DOWN ; SCROLL㐞 THE SCREEN DOWN RVLF200: RET ;************************************************** ; ERASE TO END OF PAGE ; ESC J (1BH,4AH) ;************************************************** ERASE_EOP: CALL ERASE_EOL ; FIRST ERASE TO END OF LINE MOV AX,YPOS MOV SI,AX INC SI MOV DI,BOT_LINE CMP AX,DI ; IF AT BOTTOM THEN DONE JE EEOP200 DEC AX ; SIMULATE BOT+1 CMP AX,DI ; AT BOT+1 ? JE EEOP200 ; YES - DONE CALL ERASE_LINES EEOP200: RET ;******************************************㐞 ******** ; ERASE TO END OF LINE ; ESC K (1BH,4BH) ;************************************************** ERASE_EOL: MOV AX,XPOS ; SAVE CURSOR COLUMN POSITION PUSH AX CALL CLEAR_CELL ; BLANK FOR ERASE EOL100: CALL PUT_CELL ; CLEAR A CHAR CELL INC XPOS MOV AX,XPOS CMP AX,COLM_MAX ; ERASED THE END OF LINE ? JL EOL100 ; NO POP AX ; RESTORE CURSOR POSITION MOV XPOS,AX RET ;************************************************** ; INSERT LINE ; ESC L (1BH,4CH) ;**************㐞 ************************************ INSERT_LINE: MOV SI,YPOS ; SCROLL FROM THIS LINE ... MOV DI,BOT_LINE ; TO BOTTOM LINE ... MOV AX,SI DEC AX ; SIMULATE BOT+1 CMP AX,DI ; DONT INSERT AT BOT+1 JE INST100 CALL SCROLL_DOWN ; DOWN ONE LINE MOV XPOS,0 ; POSITION TO BEGINNING OF LINE INST100: RET ;************************************************** ; DELETE LINE ; ESC M (1BH,4DH) ;************************************************** DELETE_LINE: MOV SI,YPOS ; SCROLL FROM THIS㐞 LINE ... MOV DI,BOT_LINE ; TO BOTTOM LINE ... MOV AX,SI DEC AX ; SIMULATE BOT+1 CMP AX,DI ; DONT DELETE IF AT BOT+1 JE DELE100 CALL SCROLL_UP ; UP ONE LINE MOV XPOS,0 ; POSITION TO BEGINNING OF LINE DELE100: RET ;************************************************** ; DELETE CHARACTER ; ESC N (1BH,4EH) ;************************************************** DELETE_CHAR: MOV AX,XPOS ; SAVE CHAR COLUMN POS PUSH AX DLC100: INC XPOS MOV AX,XPOS CMP AX,COLM_MAX ; MOVED ALL C㐞 HARS RIGHT ? JGE DLC200 ; YES CALL GET_CELL ; GET CELL TO RIGHT DEC XPOS CALL PUT_CELL ; PUT ON TOP OF HERE INC XPOS JMP SHORT DLC100 DLC200: DEC XPOS CALL CLEAR_CELL ; WIPE CELL BUFFER CALL PUT_CELL ; ERASE RIGHT MOST CELL POP AX ; MOVE CURSOR BACK TO ORIGINAL POS MOV XPOS,AX RET ;************************************************** ; EXIT INSERT CHARACTER MODE ; ESC O (1BH,4FH) ;************************************************** INSERT_CHAR_OFF: MOV INSERT_FLAG,0 ; INS㐞 ERT CHARACTER MODE OFF RET ;************************************************** ; SWITCH MICROSCREEN ECHO ; MODE ON AND INIT MSCREEN ; ESC U ;************************************************** MSCREEN_ON: MOV CS:BYTE PTR MSCREEN,1 MOV BX,33H MOV CX,1 MOV DX,27 INT 0FCH MOV DX,"U" ;THIS CODE SWITCHES THE MSCREEN INT 0FCH ;ON, CLEARS IT AND PUTS THE MOV DX,27 ;CURSOR IN THE TOP-LEFT INT 0FCH MOV DX,"r" INT 0FCH RET ;************************************************** 㐞 ; SWITCH MSCREEN ECHO MODE ; OFF AND RESET MSCREEN ; ESC V ;************************************************** MSCREEN_OFF: MOV CS:BYTE PTR MSCREEN,0 MOV BX,33H MOV CX,1 MOV DX,27 INT 0FCH MOV DX,"s" INT 0FCH RET ;************************************************** ; EXCHANGE LINE ; ESC X (1BH,58H) ;************************************************** EXCHANGE_LINE: RET ;************************************************** ; DIRECT CURSOR ADDRESSING ; ESC Y[1][C] (1BH,59H㐞 ,XXH,XXH) ;************************************************** DIRECT_CURSOR: MOV AL,CBUFF+2 ; HEX LINE # XOR AH,AH ; AH=0 SUB AL,20H JB DCR800 ; NOT ASCII MOV BL,CBUFF+3 ; HEX COLUMN # XOR BH,BH ; AH=0 SUB BL,20H JB DCR800 ; NOT ASCII DCR150: CMP AX,TOP_LINE ; ABOVE TOP LINE ? JGE DCR200 ; NO MOV AX,TOP_LINE ; CLIP TO TOP JMP SHORT DCR300 DCR200: MOV CX,BOT_LINE CMP AX,CX ; BELOW OR EQUAL BOTTOM LINE ? JLE DCR300 ; YES - OK THEN INC CX ; NO - ON BOT+1 LINE ? CMP㐞 AX,CX JNE DCR350 ; NO - DONT DO ANYTHING TEST BOT_FLAG,1 ; YES - BOT+1 LINE ENABLED ? JE DCR350 ; NO - DO COLUMN ONLY DCR300: MOV YPOS,AX ; CHANGE LINE POSITION DCR350: CMP BX,COLM_MAX ; BEYOND MAX COLUMNS ? JL DCR400 ; NO - LEAVE OK MOV BX,COLM_MAX ; YES - CLIP TO COLM_MAX-1 DEC BX DCR400: MOV XPOS,BX DCR800: RET ;************************************************** ; IDENTIFY AS VT52 (ESC/K) ; ESC Z (1BH,5AH) ;************************************************** IDENT_VT㐞 52: RET ;************************************************** ; TRANSMIT BOTTOM LINE ; ESC ] (1BH,5DH) ;************************************************** TRANSMIT_BOT: RET ;************************************************** ; ERASE BEGINNING OF DISPLAY ; ESC b (1BH,62H) ;************************************************** ERASE_BOP: CALL ERASE_BOL ; ERASE TO BEGINNING OF LINE MOV SI,TOP_LINE MOV DI,BOT_LINE MOV AX,YPOS CMP AX,SI ; AT TOP LINE ? JE EBOP100 ; YES - DONE D㐞 EC AX ; SIMULATE BOT+1 CMP AX,DI ; AT LINE BOT+1 JE EBOP100 ; YES - DONE MOV DI,AX ; ERASE FROM TOP TO CURSOR-1 LINE CALL ERASE_LINES EBOP100: RET ;************************************************** ; REVERSE TAB ; ESC h (1BH,68H) ;************************************************** REVERSE_TAB: MOV AX,XPOS SUB AX,TAB_STOP AND AX,0FFF8H ; OFF LEFT SIDE OF SCREEN JNS REVT100 ; NO SUB AX,AX ; STOP ON LEFT SIDE REVT100: MOV XPOS,AX RET ;****************************㐞 ********************** ; SAVE CURSOR POSITION ; ESC j (1BH,6AH) ;************************************************** SAVE_POS: MOV AX,XPOS ; SAVE CURSOR COLUMN MOV SAVE_XPOS,AX MOV AX,YPOS ; SAVE CURSOR LINE MOV SAVE_YPOS,AX RET ;************************************************** ; SET CURSOR TO SAVED POSITION ; ESC k (1BH,6BH) ;************************************************** RESTORE_POS: MOV AX,SAVE_YPOS ; GET CURSOR LINE MOV BX,SAVE_XPOS ; GET CURSOR COLUMN JMP DCR150 ;㐞 DO A CURSOR POSITION ;************************************************** ; ERASE ENTIRE LINE ; ESC l (1BH,6CH) ;************************************************** ERASE_LINE: MOV SI,YPOS ; ERASE THIS LINE CALL ERASE_ONE RET ;************************************************** ; SET SIZE ; ESC m[C1][C2][C3] (1BH,6DH,XXH,XXH,XXH) ;************************************************** SET_SIZE: MOV BL,CBUFF+2 ; DISPATCH # CMP BL,'1' ; SET CELL SIZE ? JE SET_CELL ; YES CMP BL,'2'㐞 ; SET SCREEN SIZE ? JE SET_SCREEN RET SET_CELL: XOR BH,BH ; BH=0 MOV BL,CBUFF+3 ; CELL WIDTH SUB BL,1FH CMP BL,1 ; TOO SMALL WIDTH JL SCEL500 ; YES CMP BL,10H ; TOO BIG ? JG SCEL500 ; YES - DON'T CHANGE SUB CH,CH ; CH=0 MOV CL,CBUFF+4 ; CELL HEIGHT SUB CL,1FH CMP CL,1 ; TOO SMALL HEIGHT JL SCEL500 ; YES - DON'T CHANGE CMP CL,10H ; TOO BIG JG SCEL500 ; YES CALL SET_CELL_SIZE SCEL500: RET SET_SCREEN: MOV AX,LINE_MAX ; GET MAX LINE # DEC AX XOR BH,BH㐞 ; BH=0 MOV BL,CBUFF+3 ; TOP LINE # SUB BL,20H ; TOO SMALL TOP LINE # JS SSCN500 ; YES CMP BX,AX ; TOO BIG ? JG SSCN500 ; YES - DON'T CHANGE SUB CH,CH ; CH=0 MOV CL,CBUFF+4 ; BOT_LINE SUB CL,20H CMP BX,CX ; BOT MUST BE GREATER THAN OR EQUAL TOP JG SSCN500 ; ELSE - DON'T CHANGE CMP CX,AX ; TOO BIG JG SSCN500 ; YES CALL SET_SCRN_SIZE SSCN500: RET ;************************************************** ; CURSOR POSITION REPORT ; ESC n (1BH,6EH) ;*********************㐞 ***************************** REPORT_CURSOR: RET ;************************************************** ; ERASE BEGINNING OF LINE ; ESC o (1BH,6FH) ;************************************************** ERASE_BOL: MOV AX,XPOS ; SAVE CURSOR COLUMN POSITION PUSH AX CALL CLEAR_CELL ; TO ERASE EBOL100: CALL PUT_CELL ; ERASE DEC XPOS JGE EBOL100 ; TO BEGINNING OF LINE POP AX ; RESTORE CURSOR COLUMN POSITION MOV XPOS,AX RET ;************************************************** ; E㐞 NTER REVERSE VIDEO MODE ; ESC p (1BH,70H) ;************************************************** REVERSE_ON: OR ATTRIBUTE_FLAG,REV_ATTR/256 ; TURN REVERSE ON RET ;************************************************** ; EXIT REVERSE VIDEO MODE ; ESC q (1BH,71H) ;************************************************** REVERSE_OFF: AND ATTRIBUTE_FLAG,NOT (REV_ATTR/256) ; TURN REVERSE OFF RET ;************************************************** ; WRAP AROUND AT END OF LINE ; ESC v (1BH,76H) 㐞 ;************************************************** WRAP_MODE: MOV DISCARD_FLAG,0 ; ENABLE WRAP MODE RET ;************************************************** ; DISCARD AT END OF LINE ; ESC w (1BH,77H) ;************************************************** DISCARD_MODE: MOV DISCARD_FLAG,1 ; ENABLE DISCARD MODE RET ;************************************************** ; SET MODE(S) ; ESC x [PS] (1BH,78H) ;************************************************** SET_MODES: XOR BH,BH ; BH 㐞 = 0 MOV BL,CBUFF+2 ; FIND WHAT TO SET SUB BL,'1' ; BELOW ASCII "0" ? JS SET_DONE ; YES - EXIT CMP BL,9 ; FROM 0 - 9 ? JL SETM500 ; YES SUB BL,7 CMP BL,7 ; BELOW ASCII "A" ? JL SET_DONE ; YES - EXIT CMP BL,12 ; A - C ? JGE SET_DONE ; NO - EXIT SETM500: SHL BX,1 JMP CS:SET_TAB[BX] SET_TAB DW ENABLE_BOT,SET_DONE,SET_DONE,BLK_CUR DW CUR_OFF,SET_DONE,SET_DONE,SET_LF DW SET_CR,SEND_BUFFER,SEND_BUFFER,SEND_BUFFER ENABLE_BOT: OR BOT_FLAG,1 ; ENABLE BOT LINE 㐞 SET_DONE: RET BLK_CUR: AND CURSOR_FLAG,NOT 2 ; ENABLE BLOCK CURSOR RET CUR_OFF: OR CURSOR_FLAG,1 ; CURSOR OFF RET SET_LF: OR CRLF_FLAG,1 ; ENABLE AUTO LINE FEED ON CR RET SET_CR: OR CRLF_FLAG,2 ; ENABLE AUTO CR ON LINE FEED RET ;************************************************** ; RESET MODE(S) ; ESC y [PS] (1BH,79H) ;************************************************** RESET_MODES: XOR BH,BH ; BH = 0 MOV BL,CBUFF+2 ; FIND WHAT TO SET SUB BL,'1' ; BELOW ASC㐞 II "1" ? JS REST_DONE ; YES - EXIT CMP BL,9 ; FROM 0 - 9 ? JL REST500 ; YES SUB BL,7 CMP BL,7 ; BELOW ASCII "A" ? JL REST_DONE ; YES - EXIT CMP BL,12 ; A - C ? JGE REST_DONE ; NO - EXIT REST500: SHL BX,1 JMP CS:RESET_TAB[BX] RESET_TAB DW DISABLE_BOT,REST_DONE,REST_DONE,UND_CUR DW CUR_ON,REST_DONE,REST_DONE,REST_LF DW REST_CR,SEND_BUFFER,SEND_BUFFER,SEND_BUFFER DISABLE_BOT: AND BOT_FLAG,NOT 1 ; DISABLE BOT LINE REST_DONE: RET UND_CUR: OR CURSOR_FLAG,2 㐞 ; ENABLE UNDERSCORE CURSOR RET CUR_ON: AND CURSOR_FLAG,NOT 1 ; CURSOR ON RET REST_LF: AND CRLF_FLAG,NOT 1 ; NO AUTO LINE RET REST_CR: AND CRLF_FLAG,NOT 2 ; NO AUTO CR RET ;************************************************** ; RESET TO 80 COLUMN TEXT MODE ; ESC z (1BH,7AH) ;************************************************** LAST_ONE DB 0 T132: CMP AL,"|" JE COULD_BE MOV CS:LAST_ONE,AL ITS_NOT: PUSHF CALL CS:DWORD PTR OLD_STUB_CO IRET COULD_BE: CMP CS:LA㐞 ST_ONE,27 JE MUST_BE JMP ITS_NOT MUST_BE: CALL ENABLE_132 IRET RESET: MOV CS:BYTE PTR EN132,0 ;** SWITCH TO TEXT MODE MOV BX,31H MOV CX,1 MOV DX,0 INT 0FCH PUSH CS POP DS MOV DX,OFFSET T132 MOV AH,25H MOV AL,29H INT 21H RET ;************************************************** ; KEYBOARD ENABLE ; ESC { (1BH,7BH) ;************************************************** KEYBOARD_ON: CALL SEND_BUFFER ; VT52 DOES THIS RET ;******************************㐞 ******************** ; ENABLE 132 COLUMN DISPLAY ; ESC | (1BH,7CH) ;************************************************** ENABLE_132: CMP CS:BYTE PTR EN132,1 JE NOTDO MOV CS:BYTE PTR EN132,1 PUSH AX PUSH DS PUSH CX PUSH CS POP DS MOV CX,2 AGAIN: PUSH CX CALL SETHIRES POP CX LOOP AGAIN CALL DO_NEW PUSH CS POP DS MOV DX,OFFSET STUBCO MOV AH,25H MOV AL,29H INT 21H POP CX POP DS POP AX RET NOTDO: JMP CLEAR ;********************㐞 ****************************** ; KEYBOARD DISABLE ; ESC } (1BH,7DH) ;************************************************** KEYBOARD_OFF: CALL SEND_BUFFER ; VT52 DOES THIS RET ;************************************************** ; SCROLL UP ; ENTER SI = TOP LINE # INCLUSIVE ; DI = BOTTOM LINE # INCLUSIVE ;************************************************** SCROLL_UP: ;** SWITCH OFF THE KEYCLICK, AS THE PIT ;** DOES NOT GET A LOOK-IN FOR AT LEAST ;** 50MS: PUSH AX MOV AL,0F㐞 FH OUT 50H,AL POP AX ;** DO THE SCROLL PUSH DI ; SAVE BOTTOM LINE # TO ERASE IT SUB DI,SI ; # LINES -1 TO MOVE MOV AX,CS:CELL_HEIGHT ; CALC # WORDS TO MOVE MUL DI MOV BX,AX MOV AX,CS:CELL_HEIGHT ; CALC TO ADDR SHL AX,1 ; TIMES TWO FOR WORDS MUL SI MOV BP,AX ; SCROLL UP TO THIS LINE ; BP = WHERE TO MOVE WORDS TO ; BX = # WORDS TO MOVE MOV DL,SCOLS ; # OF COLUMNS TO SCROLL UP SCU100: MOV DI,BP ; TO MOV SI,BP ; CALC FROM ADDR MOV AX,CS:CELL_HEIGHT SH㐞 L AX,1 ; TIMES TWO FOR WORDS ADD SI,AX MOV CX,BX ; COUNT PUSH AX MOV AX,280H MOV ES,AX POP AX PUSH DS PUSH ES POP DS CLD REP MOVSW POP DS ADD BP,320H ; NEXT COLUMN LEFT DEC DL JG SCU100 POP SI ; LINE TO ERASE CALL ERASE_ONE RET ;************************************************** ; SCROLL DOWN ; ENTER SI = TOP LINE # INCLUSIVE ; DI = BOTTOM LINE # INCLUSIVE ;************************************************** SCROLL_DOWN: ;** SWITCH OFF THE KE㐞 YCLICK, AS THE PIT ;** DOES NOT GET A LOOK-IN FOR AT LEAST ;** 50MS: PUSH AX MOV AL,0FFH OUT 50H,AL POP AX PUSH CS POP DS PUSH SI ; SAVE TOP LINE # TO ERASE IT SUB SI,DI ; # LINES -1 TO MOVE NEG SI ; BECAUSE IT WAS MINUS MOV AX,CELL_HEIGHT ; CALC # WORDS TO MOVE MUL SI MOV BX,AX MOV AX,CELL_HEIGHT ; CALC TO ADDR SHL AX,1 ; TIMES TWO FOR WORDS INC DI ; BOTTOM LINE +1 MUL DI MOV BP,AX ; SCROLL DOWN TO THIS LINE DEC BP ; BACKUP ONE WORD DEC BP S㐞 TD ; MOVE FOR HI TO LOW MEMORY MOV DL,SCOLS ; # OF COLUMNS TO SCROLL DOWN SCD100: MOV DI,BP ; TO MOV SI,BP ; CALC FROM ADDR MOV AX,CELL_HEIGHT SHL AX,1 ; TIMES TWO FOR WORDS SUB SI,AX MOV CX,BX ; COUNT PUSH AX MOV AX,280H MOV ES,AX POP AX PUSH DS PUSH ES POP DS REP MOVSW POP DS ADD BP,COL_BYTE ; NEXT COLUMN LEFT DEC DL JG SCD100 POP SI ; LINE TO ERASE CALL ERASE_ONE RET ;************************************************** ; ERASE LINES ; ENTE㐞 R: SI = TOP LINE NUMBER ; DI = BOTTOM LINE NUMBER ; ES EQUAL DS ; DESTROYS DL,CX,DI,AX ;************************************************** ERASE_ONE: MOV DI,SI ERASE_LINES: ;** SWITCH OFF THE KEYCLICK, AS THE PIT ;** DOES NOT GET A LOOK-IN FOR AT LEAST ;** 50MS: PUSH AX MOV AL,0FFH OUT 50H,AL POP AX PUSH CS POP DS SUB DI,SI ; CALC # LINES TO ERASE INC DI MOV AX,CELL_HEIGHT ; NOW CALC # RASTER LINES MUL DI MOV BX,AX MOV AX,CELL_HEIGHT SHL AX,1 ; FOR WOR㐞 DS MUL SI ; CALC ADDR OF FIRST LINE MOV SI,AX SUB AX,AX ; FILL WITH ZERO MOV DL,SCOLS ; NUMBER 16 BIT COLUMNS ERL100: MOV DI,SI MOV CX,BX ; # WORD IN COLUMN TO ERASE CLD PUSH AX MOV AX,280H MOV ES,AX POP AX REP STOSW ADD SI,COL_BYTE ; NEXT COLM LEFT DEC DL ; DONE ALL COLMS ? JG ERL100 ; NO RET ;************************************************** ; INSERT A CHARACTER SPACE ; ENTER: XPOS AND YPOS ; SCROLLS ALL CHARS FROM XPOS,YPOS ; TO END OF LINE RIGHT ONE 㐞 CHAR COLUMN ; AND ERASES XPOS,YPOS CHAR ;************************************************** INSERT_CHAR: ;** SWITCH OFF THE KEYCLICK, AS THE PIT ;** DOES NOT GET A LOOK-IN FOR AT LEAST ;** 50MS: PUSH AX MOV AL,0FFH OUT 50H,AL POP AX PUSH CS POP DS PUSH CX MOV AX,XPOS ; SAVE CURSOR POSITION PUSH AX MOV AX,COLM_MAX ; START RIGHT COLUMN DEC AX MOV XPOS,AX IRC100: POP AX ; START POSITION CMP AX,XPOS ; DONE ? JE IRC200 ; YES PUSH AX DEC XPOS CALL GET_CELL ; 㐞GET SCREEN CELL TO LEFT INC XPOS CALL PUT_CELL ; PUT IT HERE DEC XPOS JMP SHORT IRC100 IRC200: CALL CLEAR_CELL ; ERASE ORIGINAL POS CALL PUT_CELL POP CX RET ;************************************************** ; CALCULATE ADDR FOR POSITION ON SCREEN ; ENTER POSITION = XPOS,YPOS ; EXIT BP = ADDR OF TOP WORD IN CELL ; CL = SHIFT COUNT ; BX = MASK FOR WIDTH OF CHAR CELL ;************************************************** CALC_ADDR: PUSH CS POP DS MOV AX,XPOS ; ABS X POSITION㐞 MOV BX,CELL_WIDTH ; CALC ABS POSITION OF ARRAY MUL BX MOV CX,AX ; SAVE IN CX AND CL,0FH ; 16 BIT SHIFT COUNT AND AX,03F0H ; 16*COL# (COLUMN NUMBER) MOV BX,COL_BYTE/16 ; FOR MULT BY 800/16=50 MUL BX ; (16*COL#)*(800/16)=WORD/COLUMN MOV BP,AX MOV AX,YPOS ; CALC ABS LINE FOR CELL MOV BX,CELL_HEIGHT SHL BX,1 ; TIMES 2 FOR WORDS MUL BX ADD BP,AX ; GEN ADDR TO FIRST FONT CELL WORD MOV BX,CELL_MASK ; MASK FOR CELL_WIDTH WIDE CHARS RET ;****************************㐞********************** ; TOGGLE CURSOR ; ENTER POSITION = XPOS,YPOS ;************************************************** TOGGLE_CURSOR: PUSH CS POP DS PUSH BX PUSH CX TEST CURSOR_FLAG,1 ; CURSOR ON ? JNE NO_CURSOR ; NO - SKIP ALL THIS CALL GET_CELL ; GET THE CELL FROM SCREEN INTO CELL_BUFF TEST CURSOR_FLAG,2 ; A BLOCK CURSOR ? JE CXOR100 ; YES - GO DO A BLOCK CURSOR MOV CX,CELL_HEIGHT MOV BX,CELL_MASK PUSH ES MOV SI,CS MOV ES,SI MOV SI,OFFSET CHRSET MOV AX,8000H ; MSB FL㐞AGS UNDERLINE XOR DI,DI CUND100: TEST ES:[SI],AX ; UNDERLINE HERE JE CUND200 ; NO XOR CS:CELL_BUFF[DI],BX CUND200: INC DI INC DI INC SI INC SI LOOP CUND100 POP ES JMP SHORT CXOR200 CXOR100: CALL XOR_CELL ; XOR FOR A BLOCK CURSOR CXOR200: CALL PUT_CELL ; PUT BACK ON SCREEN NO_CURSOR: POP CX POP BX RET ;************************************************** ; OR CHAR FROM TABLE TO CELL_BUFF ; ENTER: CL = CHARACTER ; CHAR_SEG=SEGMENT FOR TABLE ; CHAR_OFF=OFFSET FOR 㐞TABLE ;************************************************** CHAR_OR_CELL: PUSH CS POP DS PUSH CX MOV SI,OFFSET CHRSET MOV AX,32 MUL CX ADD SI,AX MOV DI,OFFSET CELL_BUFF MOV CX,CELL_HEIGHT MOV AX,CS MOV DS,AX MOV ES,AX CLD CTC200: PUSH CS POP DS LODSW ; GET CHAR WORD OR AX,CS:[DI] ; OR TO CELL PUSH CS POP ES STOSW LOOP CTC200 POP CX RET ;************************************************** ; ADD UNDERLINE TO CELL_BUFF IF ON ;*******************************㐞******************* ADD_UNDERLINE: PUSH CS POP DS TEST ATTRIBUTE_FLAG,UND_ATTR/256 JE ADDU400 ; NO UNDERLINE ADDU050: MOV CX,CELL_HEIGHT MOV BX,CELL_MASK MOV AX,8000H ; MSB FLAGS UNDERLINE XOR DI,DI ADDU100: TEST CS:CELL_BUFF[DI],AX ; UNDERLINE HERE JE ADDU200 ; NO MOV CS:CELL_BUFF[DI],BX ADDU200: INC DI INC DI LOOP ADDU100 ADDU400: RET ;************************************************** ; ADD REVERSE TO CELL_BUFF IF ON ;**************************************㐞************ ADD_REVERSE: PUSH CS POP DS TEST ATTRIBUTE_FLAG,REV_ATTR/256 JE ADDR100 ; NO REVERSE CALL XOR_CELL ADDR100: RET ;************************************************** ; SHIFT CELL LEFT ONE DOT ;************************************************** LSHIFT_CELL: PUSH CS POP DS PUSH CX MOV CX,CELL_HEIGHT XOR DI,DI LSCL100: SHL CS:CELL_BUFF[DI],1 ; SHIFT ONE WORD INC DI INC DI LOOP LSCL100 POP CX RET ;************************************************** ; G㐞ET CHARACTER CELL ; READ SCREEN CELL INTO CELL_BUFF ; NORMALIZED TO THE LSB SIDE OF THE BUFFER ; ENTER POSITION = XPOS,YPOS ;************************************************** GET_CELL: PUSH CS POP DS CALL CALC_ADDR ; SET BP TO ADDR OF SCREEN CELL MOV SI,BP ; GET FROM HERE POINTER MOV DI,OFFSET CELL_BUFF ; ADDRESS TO PUT NORMALIZED CELL MOV CH,BYTE PTR CELL_HEIGHT ; NUMBER WORDS IN A CELL CLD PUSH AX MOV AX,280H PUSH AX POP ES POP AX GCL100: PUSH DS PUSH ES POP DS 㐞 LODSW ; GET LEFT WORD POP DS SHR AX,CL ; ADJUST FOR SHIFT AND AX,BX ; MASK OFF BAD STUFF PUSH ES PUSH CS POP ES STOSW ; PUT IN BUFFER POP ES DEC CH JG GCL100 XOR CL,0FH ; NEGATE CL INC CL CMP CL,CS:BYTE PTR CELL_WIDTH ; DO A RIGHT SIDE ? JGE GCL300 ; NO MOV SI,BP ; MOVE TO NEXT COLUMN RIGHT ADD SI,COL_BYTE MOV DI,OFFSET CELL_BUFF ; ADDRESS TO PUT NORMALIZED CELL MOV CH,CS:BYTE PTR CELL_HEIGHT ; NUMBER WORDS IN A CELL GCL200: PUSH DS PUSH ES POP DS 㐞 LODSW ; GET LEFT WORD POP DS SHL AX,CL ; ADJUST FOR SHIFT AND AX,BX ; MASK OFF BAD STUFF OR AX,CS:[DI] ; OR INTO BUFFER PUSH ES PUSH CS POP ES STOSW POP ES DEC CH JG GCL200 GCL300: RET ;************************************************** ; PUT CHARACTER CELL ; PUT CELL_BUFF CHAR ON THE SCREEN ; ENTER POSITION = XPOS,YPOS ;************************************************** PUT_CELL: PUSH CS POP DS CALL CALC_ADDR ; BP = ADDR OF SCREEN CELL MOV DI,BP ; ADDR 㐞TO PUT CHAR MOV SI,OFFSET CELL_BUFF ; ADDRESS OF CELL MOV CH,CS:BYTE PTR CELL_HEIGHT ; LOOP CTR SHL BX,CL ; ADJUST MASK PUSH AX MOV AX,280H MOV ES,AX POP AX CLD PCL100: PUSH CS POP DS LODSW ; WORD FROM CELL SHL AX,CL MOV DX,ES:[DI] ; ADD IN WORD FROM SCREEN XOR AX,DX AND AX,BX ; MASK UNWANTED STUFF XOR AX,DX ; REMOVE AND ADD NEW STOSW ; BACK TO SCREEN DEC CH ; DONE ALL OF LEFT SIDE OF CELL ? JG PCL100 ; NO XOR CL,0FH ; NEGATE CL INC CL CMP CL㐞,CS:BYTE PTR CELL_WIDTH ; ANY DOTS SHIFT INTO NEXT JGE PCL300 ; NO - ALL DONE THEN MOV DI,BP ADD DI,COL_BYTE ; NEXT COLUMN RIGHT MOV SI,OFFSET CELL_BUFF ; ADDRESS OF CELL MOV CH,CS:BYTE PTR CELL_HEIGHT ; LOOP CTR MOV BX,CS:CELL_MASK ; MASK FOR OTHER SIDE SHR BX,CL ; ADJUST MASK PCL200: PUSH CS POP DS LODSW ; WORD FROM CELL SHR AX,CL MOV DX,ES:[DI] ; ADD IN WORD FROM SCREEN XOR AX,DX AND AX,BX ; MASK UNWANTED STUFF XOR AX,DX ; REMOVE AND ADD NEW STOSW ; BA㐞CK TO SCREEN DEC CH ; DONE ALL OF LEFT SIDE OF CELL ? JG PCL200 PCL300: RET ;************************************************** ; CLEAR CHARACTER CELL_BUFF ;************************************************** CLEAR_CELL: PUSH CS POP ES PUSH CX MOV CX,CS:CELL_HEIGHT ; # WORDS TO CLEAR MOV DI,OFFSET CELL_BUFF XOR AX,AX CLD REP STOSW POP CX RET ;************************************************** ; XOR CHARACTER CELL_BUFF ;************************************************㐞** XOR_CELL: PUSH CS POP DS MOV DI,CS:CELL_HEIGHT ; # WORDS TO XOR SHL DI,1 MOV AX,CS:CELL_MASK XCEL100: XOR CELL_BUFF-2[DI],AX DEC DI DEC DI JG XCEL100 RET ;************************************************** ; SET CELL SIZE ; ENTER: BX = CELL WIDTH ; CX = CELL HEIGHT ;************************************************** SET_CELL_SIZE: PUSH CS POP DS MOV CS:CELL_WIDTH,BX ; SAVE WIDTH MOV CS:CELL_HEIGHT,CX ; AND HEIGHT SUB AX,AX ; AX = 0 SETC100: STC ; GEN CELL㐞 MASK RCL AX,1 DEC BX JG SETC100 MOV CS:CELL_MASK,AX ; SAVE MASK XOR DX,DX ; DX = 0 MOV AX,MAX_XDOTS ; 800 DOTS HORZ MOV CX,CS:CELL_WIDTH ; DIVIDE BY CELL WIDTH DIV CX MOV CS:COLM_MAX,AX ; EQUAL MAX COLUMNS XOR DX,DX ; DX = 0 MOV AX,MAX_YDOTS ; 400 LINES VERT MOV CX,CS:CELL_HEIGHT ; DIVIDE BY CELL HEIGHT DIV CX MOV CS:LINE_MAX,AX ; EQUAL MAX LINES XOR BX,BX ; TOP LINE = 0 MOV CX,CS:LINE_MAX DEC CX DEC CX ; BOTTOM LINE = 38 ; FALL THROUGH TO SET SCREEN SIZE ;**㐞************************************************ ; SET SCREEN SIZE ; ENTER: BX = TOP LINE # ; CX = BOTTOM LINE # ;************************************************** SET_SCRN_SIZE: PUSH CS POP DS MOV CS:TOP_LINE,BX ; SAVE TOP AND BOTTOM LINE MOV CS:BOT_LINE,CX CALL HOME ; HOME THE CURSOR RET ;***************************** ; ESCAPE SEQUENCE ; DISPATCH TABLE ;***************************** ESC_DISPATCH DW PASS_BUFFER ; 20H ' ' DW PASS_BUFFER ; 21H '!' DW PASS_BUFFER ; 22H '"'㐞 DW TRANSMIT_PAGE ; 23H '#' TRANSMIT PAGE DW TRANSMIT_CHAR ; 24H '$' TRANSMIT CURSOR CHAR DW PASS_BUFFER ; 25H '%' DW PASS_BUFFER ; 26H '&' DW PASS_BUFFER ; 27H ''' DW LOW_INT_OFF ; 28H '(' HIGH INTENSITY ON DW LOW_INT_ON ; 29H ')' HIGH INTENSITY OFF DW PASS_BUFFER ; 2AH '*' DW PASS_BUFFER ; 2BH '+' DW PASS_BUFFER ; 2CH ',' DW PASS_BUFFER ; 2DH '-' DW PASS_BUFFER ; 2EH '.' DW PASS_BUFFER ; 2FH '/' DW UNDERLINE_ON ; 30H '0' ENTER UNDERLINE MODE DW UNDERLINE_O㐞 FF ; 31H '1' EXIT UNDERLINE MODE DW SET_DONE ; 32H '2' DW SET_DONE ; 33H '3' DW PASS_BUFFER ; 34H '4' DW PASS_BUFFER ; 35H '5' DW PASS_BUFFER ; 36H '6' DW PASS_BUFFER ; 37H '7' DW LITERAL ; 38H '8' LITERAL CHARACTER DW PASS_BUFFER ; 39H '9' DW PASS_BUFFER ; 3AH ':' DW PASS_BUFFER ; 3BH ';' DW PASS_BUFFER ; 3CH '<' DW PASS_BUFFER ; 3DH '=' DW PASS_BUFFER ; 3EH '>' DW PASS_BUFFER ; 3FH '?' DW INSERT_CHAR_ON ; 40H '@' ENTER INSERT CHAR MODE DW CURSOR_UP ; 41㐞H 'A' CURSOR UP DW CURSOR_DOWN ; 42H 'B' CURSOR DOWN DW CURSOR_FORWARD ; 43H 'C' CURSOR FORWARD DW CURSOR_BACKWARD ; 44H 'D' CURSOR BACKWARD DW CLEAR ; 45H 'E' CLEAR DISPLAY DW GRAPHIC_ON ; 46H 'F' ENTER GRAPHICS MODE DW GRAPHIC_OFF ; 47H 'G' EXIT GRAPHICS MODE DW HOME ; 48H 'H' CURSOR HOME DW REV_LINE_FEED ; 49H 'I' REVERSE INDEX DW ERASE_EOP ; 4AH 'J' ERASE TO END OF PAGE DW ERASE_EOL ; 4BH 'K' ERASE TO END OF LINE DW INSERT_LINE ; 4CH 'L' INSERT LINE DW D㐞ELETE_LINE ; 4DH 'M' DELETE LINE DW DELETE_CHAR ; 4EH 'N' DELETE CHARACTER DW INSERT_CHAR_OFF ; 4FH 'O' EXIT INSERT CHAR MODE DW PASS_BUFFER ; 50H 'P' DW PASS_BUFFER ; 51H 'Q' DW PASS_BUFFER ; 52H 'R' DW PASS_BUFFER ; 53H 'S' DW PASS_BUFFER ; 54H 'T' DW MSCREEN_ON ; 55H 'U' SWITH ECHO ON DW MSCREEN_OFF ; 56H 'V' SWITCH ECHO OFF DW PASS_BUFFER ; 57H 'W' DW EXCHANGE_LINE ; 58H 'X' EXCHANGE FRGND/BKGND (?) DW DIRECT_CURSOR ; 59H 'Y' DIRECT CURSOR ADDRESSING DW 㐞IDENT_VT52 ; 5AH 'Z' IDENTIFY AS VT52 (ESC/K) DW SET_DONE ; 5BH '[' DW SET_DONE ; 5CH '\' DW TRANSMIT_BOT ; 5DH ']' TRANSMIT BOTTOM LINE DW SET_DONE ; 5EH '^' DW PASS_BUFFER ; 5FH '_' DW PASS_BUFFER ; 60H '`' DW PASS_BUFFER ; 61H 'a' DW ERASE_BOP ; 62H 'b' ERASE TO BEGINNING OF PAGE DW PASS_BUFFER ; 63H 'c' DW PASS_BUFFER ; 64H 'd' DW PASS_BUFFER ; 65H 'e' DW PASS_BUFFER ; 66H 'f' DW PASS_BUFFER ; 67H 'g' DW REVERSE_TAB ; 68H 'h' REVERSE TAB DW PASS_BUFFER ; 㐞69H 'i' DW SAVE_POS ; 6AH 'j' SAVE CURSOR POSITION DW RESTORE_POS ; 6BH 'k' SET CURSOR TO SAVED POS DW ERASE_LINE ; 6CH 'l' ERASE ENTIRE LINE DW SET_SIZE ; 6DH 'm' SET SIZE DW REPORT_CURSOR ; 6EH 'n' CURSOR POSITION REPORT DW ERASE_BOL ; 6FH 'o' ERASE BEGINNING OF LINE DW REVERSE_ON ; 70H 'p' ENTER REVERSE VIDEO MODE DW REVERSE_OFF ; 71H 'q' EXIT REVERSE VIDEO MODE DW PASS_BUFFER ; 72H 'r' DW PASS_BUFFER ; 73H 's' DW PASS_BUFFER ; 74H 't' DW PASS_BUFFER ; 75H 'u' 㐞 DW WRAP_MODE ; 76H 'v' WRAP AROUND AT END OF LINE DW DISCARD_MODE ; 77H 'w' DISCARD AT END OF LINE DW SET_MODES ; 78H 'x' SET MODE(S) DW RESET_MODES ; 79H 'y' RESET MODE(S) DW RESET ; 7AH 'z' RESET TO 80 COLUMN MODE DW KEYBOARD_ON ; 7BH '{' KEYBOARD ENABLED DW ENABLE_132 ; 7CH '|' ENABLE 132 COLUMN MODE DW KEYBOARD_OFF ; 7DH '}' KEYBOARD DISABLE DW PASS_BUFFER ; 7EH '~' DW PASS_BUFFER ; 7FH DEL ;*************************************** ; SET CRTC TO TEXT MODE ;㐞*************************************** SETTEXT: MOV BX,31H MOV CX,1 MOV DX,0 INT 0FCH RET ;************************************** ; INSTALL THE MODULE ;************************************** INSTALL: MOV DX,OFFSET MESSAGE MOV AH,9 INT 21H CALL INIT_SCR JMP STAY_RES ;************************************** ; INITIALIZE THE SCREEN FOR ; 132 COLUMNS ;************************************** INIT_SCR: CALL SET_INT29 CALL SETHIRES RET ;********************㐞****************** ; SET UP THE INTERRUPT 29H ; TO POINT TO THE 132C ; CONSOLE OUTPUT STUB ; AND SET UP THE OLD_STUB_CO ; ;************************************** SET_INT29: MOV AX,0 MOV ES,AX MOV DI,0A4H PUSH ES:[DI] PUSH ES:[DI+2] POP OLD_S POP OLD_O PUSH CS POP DS MOV DX,OFFSET STUBCO MOV AH,25H MOV AL,29H INT 21H RET CRTC_GRAF DB 59,50,51,7,25,10,25,25,3,14,0,15,0,0,0,0 ;********************************** ; SET SCREEN BUFFER, ; PAR PORT AD㐞DRESS, ; AND CRTC FOR HIRES ;********************************** SETHIRES: PUSH ES PUSH AX PUSH DX PUSH BX PUSH DI PUSH SI PUSH DS ;** CLEAR SCREEN BUFFER + RESET CRTC TO TEXT MODE MOV AL,27 PUSHF CALL CS:DWORD PTR OLD_STUB_CO MOV AL,"z" PUSHF CALL CS:DWORD PTR OLD_STUB_CO CALL DO_NEW ;** SET UP THE SCREEN BUFFER LONGDITUDALLY MOV AX,SCN_SEG MOV ES,AX MOV BX,0 MOV CH,50 MOV AX,0140H ;DOTRAM SHR (1) SH200: PUSH BX MOV CL,25 SH300: MOV ES:[BX],AX 㐞  INC AX ADD BX,50*2 DEC CL JG SH300 POP BX ADD BX,2 DEC CH JG SH200 ;** CLEAR THE DOT RAM MOV AX,280H MOV ES,AX MOV CX,20000 XOR AX,AX MOV DI,AX CLD REP STOSW MOV BX,31H MOV CX,01H MOV DX,01H INT 0FCH PUSHF CLI CRTC10: MOV SI,OFFSET CRTC_GRAF MOV DX,68H MOV BL,0 MOV CX,16 CRTC20: MOV AL,BL OUT DX,AL INC BX INC DX INC DX LODSB OUT DX,AL DEC DX DEC DX LOOP CRTC20 POPF POP DS POP SI POP DI POP BX POP DX POP㐞 AX POP ES RET ;** INIT MESSAGE MESSAGE DB 27,'V',27,'E',27,'/',0,27,'z$' ;********************************* ; SET UP THE DEFAULT SIZES ; FOR THE CHARACTER CELL ; AND SCREEN. ;********************************* DO_NEW: MOV BX,6 MOV CX,10 CALL SET_CELL_SIZE PUSH AX MOV AX,OFFSET PUT_ACTIVE MOV PUT_VEC,AX POP AX CALL TOGGLE_CURSOR RET ;********************************* ; KEEP US RESIDENT & ; SIGN - ON ;********************************* STAY_RES: MOV DX㐞,OFFSET SIGNON MOV AH,9 INT 21H MOV DX,OFFSET ENDRES INT 27H SIGNON DB 27,'p ',27,'q' DB ' Apricot ',27,'0',27,'(' DB ' 132 Column ',27,')',27,'1 Interface - Vr1.4 ' DB 27,'p ',27,'q',13,10,13,10,'$' ENDRES: ;LABEL FOR END OF CODE CODE ENDS END ;END OF 132C.ASM 㐞 CHRSET DW 000000B ; BLANK DW 000000B DW 000000B DW 000000B DW 000000B DW 000000B DW 000000B DW 000000B DW 000000B+8000H,0,0,0,0,0,0,0 DW 000000B ; BLANK DW 000000B DW 000000B DW 000000B DW 000000B DW 000000B DW 000000B DW 000000B DW 000000B+8000H,0,0,0,0,0,0,0 DW 000000B ; RESERVED DW 000000B DW 000000B DW 000000B DW 000000B DW 000000B DW 000000B DW 000000B DW 000000B+8000H,0,0,0,0,0,0,0 DW 011111B ; SOLID RECTANGLE DW 011111B DW 011111B 㐞 DW 011111B DW 011111B DW 011111B DW 011111B DW 000000B DW 000000B+8000H,0,0,0,0,0,0,0 DW 000010B ; 1/ DW 000011B DW 000010B DW 010010B DW 001111B DW 000100B DW 000010B DW 000001B DW 000000B+8000H,0,0,0,0,0,0,0 DW 001111B ; 3/ DW 000100B DW 000110B DW 011000B DW 001111B DW 000100B DW 000010B DW 000001B DW 000000B+8000H,0,0,0,0,0,0,0 DW 001111B ; 5/ DW 000001B DW 000111B DW 011000B DW 001111B DW 000100B DW 000010B DW 000001B DW 000000B㐞+8000H,0,0,0,0,0,0,0 DW 001111B ; 7/ DW 001000B DW 000100B DW 010010B DW 001010B DW 000100B DW 000010B DW 000001B DW 000000B+8000H,0,0,0,0,0,0,0 DW 001100B ; DEGREES DW 010010B DW 010010B DW 001100B DW 000000B DW 000000B DW 000000B DW 000000B DW 000000B+8000H,0,0,0,0,0,0,0 DW 000000B ; PLUS OR MINUS DW 000100B DW 000100B DW 011111B DW 000100B DW 000100B DW 011111B DW 000000B DW 000000B+8000H,0,0,0,0,0,0,0 DW 000000B ; RIGHT ARROW DW 00010㐞0B DW 001000B DW 011111B DW 001000B DW 000100B DW 000000B DW 000000B DW 000000B+8000H,0,0,0,0,0,0,0 DW 000000B ; ELLIPSIS DW 000000B DW 000000B DW 000000B DW 000000B DW 000000B DW 000000B DW 010101B DW 000000B+8000H,0,0,0,0,0,0,0 DW 000000B ; DIVIDE BY DW 000100B DW 000000B DW 011111B DW 000000B DW 000100B DW 000000B DW 000000B DW 000000B+8000H,0,0,0,0,0,0,0 DW 000000B ; DOWN ARROW DW 000100B DW 000100B DW 000100B DW 010101B DW 001110B 㐞 DW 000100B DW 000000B DW 000000B+8000H,0,0,0,0,0,0,0 DW 111111B ; BAR AT SCAN 0 DW 000000B DW 000000B DW 000000B DW 000000B DW 000000B DW 000000B DW 000000B DW 000000B+8000H,0,0,0,0,0,0,0 DW 000000B ; BAR AT SCAN 1 DW 111111B DW 000000B DW 000000B DW 000000B DW 000000B DW 000000B DW 000000B DW 000000B+8000H,0,0,0,0,0,0,0 DW 000000B ; BAR AT SCAN 2 DW 000000B DW 111111B DW 000000B DW 000000B DW 000000B DW 000000B DW 000000B DW 000000B+8000H,㐞0,0,0,0,0,0,0 DW 000000B ; BAR AT SCAN 3 DW 000000B DW 000000B DW 111111B DW 000000B DW 000000B DW 000000B DW 000000B DW 000000B+8000H,0,0,0,0,0,0,0 DW 000000B ; BAR AT SCAN 4 DW 000000B DW 000000B DW 000000B DW 111111B DW 000000B DW 000000B DW 000000B DW 000000B+8000H,0,0,0,0,0,0,0 DW 000000B ; BAR AT SCAN 5 DW 000000B DW 000000B DW 000000B DW 000000B DW 111111B DW 000000B DW 000000B DW 000000B+8000H,0,0,0,0,0,0,0 DW 000000B ; BAR AT SCAN 㐞 6 DW 000000B DW 000000B DW 000000B DW 000000B DW 000000B DW 111111B DW 000000B DW 000000B+8000H,0,0,0,0,0,0,0 DW 000000B ; BAR AT SCAN 7 DW 000000B DW 000000B DW 000000B DW 000000B DW 000000B DW 000000B DW 111111B DW 000000B+8000H,0,0,0,0,0,0,0 DW 000000B ; SUBSCRIPT 0 DW 000000B DW 000000B DW 000110B DW 001001B DW 001001B DW 001001B DW 000110B DW 000000B+8000H,0,0,0,0,0,0,0 DW 000000B ; SUBSCRIPT 1 DW 000000B DW 000000B DW 000010B DW 00㐞0011B DW 000010B DW 000010B DW 000111B DW 000000B+8000H,0,0,0,0,0,0,0 DW 000000B ; SUBSCRIPT 2 DW 000000B DW 000000B DW 000110B DW 001001B DW 000100B DW 000010B DW 001111B DW 000000B+8000H,0,0,0,0,0,0,0 DW 000000B ; SUBSCRIPT 3 DW 000000B DW 000000B DW 001111B DW 000100B DW 000110B DW 001000B DW 000111B DW 000000B+8000H,0,0,0,0,0,0,0 DW 000000B ; SUBSCRIPT 4 DW 000000B DW 000000B DW 000100B DW 000110B DW 000101B DW 001111B DW 000100B DW 㐞000000B+8000H,0,0,0,0,0,0,0 DW 000000B ; SUBSCRIPT 5 DW 000000B DW 000000B DW 001111B DW 000001B DW 000111B DW 001000B DW 000111B DW 000000B+8000H,0,0,0,0,0,0,0 DW 000000B ; SUBSCRIPT 6 DW 000000B DW 000000B DW 000110B DW 000001B DW 000111B DW 001001B DW 000110B DW 000000B+8000H,0,0,0,0,0,0,0 DW 000000B ; SUBSCRIPT 7 DW 000000B DW 000000B DW 001111B DW 001000B DW 000100B DW 000010B DW 000010B DW 000000B+8000H,0,0,0,0,0,0,0 DW 000000B ; SUBS㐞CRIPT 8 DW 000000B DW 000000B DW 000110B DW 001001B DW 000110B DW 001001B DW 000110B DW 000000B+8000H,0,0,0,0,0,0,0 DW 000000B ; SUBSCRIPT 9 DW 000000B DW 000000B DW 000110B DW 001001B DW 001110B DW 001000B DW 000110B DW 000000B+8000H,0,0,0,0,0,0,0 DW 000000B ; SPACE DW 000000B DW 000000B DW 000000B DW 000000B DW 000000B DW 000000B DW 000000B DW 000000B+8000H,0,0,0,0,0,0,0 DW 000100B ; '!' DW 000100B DW 000100B DW 000100B DW 000100B DW㐞 000000B DW 000100B DW 000000B DW 000000B+8000H,0,0,0,0,0,0,0 DW 001010B ; '"' DW 001010B DW 001010B DW 000000B DW 000000B DW 000000B DW 000000B DW 000000B DW 000000B+8000H,0,0,0,0,0,0,0 DW 001010B ; '#' DW 001010B DW 011111B DW 001010B DW 011111B DW 001010B DW 001010B DW 000000B DW 000000B+8000H,0,0,0,0,0,0,0 DW 000100B ; '$' DW 011110B DW 000101B DW 001110B DW 010100B DW 001111B DW 000100B DW 000000B DW 000000B+8000H,0,0,0,0,0,0,0 DW㐞 000011B ; '%' DW 010011B DW 001000B DW 000100B DW 000010B DW 011001B DW 011000B DW 000000B DW 000000B+8000H,0,0,0,0,0,0,0 DW 000010B ; '&' DW 000101B DW 000101B DW 000010B DW 010101B DW 001001B DW 010110B DW 000000B DW 000000B+8000H,0,0,0,0,0,0,0 DW 000100B ; ''' DW 000100B DW 000100B DW 000000B DW 000000B DW 000000B DW 000000B DW 000000B DW 000000B+8000H,0,0,0,0,0,0,0 DW 000100B ; '(' DW 000010B DW 000001B DW 000001B DW 000001B DW 0㐞00010B DW 000100B DW 000000B DW 000000B+8000H,0,0,0,0,0,0,0 DW 000100B ; ')' DW 001000B DW 010000B DW 010000B DW 010000B DW 001000B DW 000100B DW 000000B DW 000000B+8000H,0,0,0,0,0,0,0 DW 000100B ; '*' DW 010101B DW 001110B DW 011111B DW 001110B DW 010101B DW 000100B DW 000000B DW 000000B+8000H,0,0,0,0,0,0,0 DW 000000B ; '+' DW 000100B DW 000100B DW 011111B DW 000100B DW 000100B DW 000000B DW 000000B DW 000000B+8000H,0,0,0,0,0,0,0 DW 0㐞00000B ; ',' DW 000000B DW 000000B DW 000000B DW 000100B DW 000100B DW 000010B DW 000000B DW 000000B+8000H,0,0,0,0,0,0,0 DW 000000B ; '-' DW 000000B DW 000000B DW 011111B DW 000000B DW 000000B DW 000000B DW 000000B DW 000000B+8000H,0,0,0,0,0,0,0 DW 000000B ; '.' DW 000000B DW 000000B DW 000000B DW 000000B DW 000000B DW 000100B DW 000000B DW 000000B+8000H,0,0,0,0,0,0,0 DW 000000B ; '/' DW 010000B DW 001000B DW 000100B DW 000010B DW 000㐞001B DW 000000B DW 000000B DW 000000B+8000H,0,0,0,0,0,0,0 DW 001110B ; '0' DW 010001B DW 011001B DW 010101B DW 010011B DW 010001B DW 001110B DW 000000B DW 000000B+8000H,0,0,0,0,0,0,0 DW 000100B ; '1' DW 000110B DW 000100B DW 000100B DW 000100B DW 000100B DW 001110B DW 000000B DW 000000B+8000H,0,0,0,0,0,0,0 DW 001110B ; '2' DW 010001B DW 010000B DW 001110B DW 000001B DW 000001B DW 011111B DW 000000B DW 000000B+8000H,0,0,0,0,0,0,0 DW 011㐞 111B ; '3' DW 010000B DW 001000B DW 001100B DW 010000B DW 010001B DW 001110B DW 000000B DW 000000B+8000H,0,0,0,0,0,0,0 DW 001000B ; '4' DW 001100B DW 001010B DW 011111B DW 001000B DW 001000B DW 001000B DW 000000B DW 000000B+8000H,0,0,0,0,0,0,0 DW 011111B ; '5' DW 000001B DW 001111B DW 010000B DW 010000B DW 010001B DW 001110B DW 000000B DW 000000B+8000H,0,0,0,0,0,0,0 DW 011100B ; '6' DW 000010B DW 000001B DW 001111B DW 010001B DW 01000㐞1B DW 001110B DW 000000B DW 000000B+8000H,0,0,0,0,0,0,0 DW 011111B ; '7' DW 010000B DW 010000B DW 001000B DW 000100B DW 000010B DW 000001B DW 000000B DW 000000B+8000H,0,0,0,0,0,0,0 DW 001110B ; '8' DW 010001B DW 010001B DW 001110B DW 010001B DW 010001B DW 001110B DW 000000B DW 000000B+8000H,0,0,0,0,0,0,0 DW 001110B ; '9' DW 010001B DW 010001B DW 011110B DW 010000B DW 001000B DW 000111B DW 000000B DW 000000B+8000H,0,0,0,0,0,0,0 DW 00000㐞0B ; ':' DW 000000B DW 000100B DW 000000B DW 000100B DW 000000B DW 000000B DW 000000B DW 000000B+8000H,0,0,0,0,0,0,0 DW 000000B ; ';' DW 000000B DW 000100B DW 000000B DW 000100B DW 000100B DW 000010B DW 000000B DW 000000B+8000H,0,0,0,0,0,0,0 DW 001000B ; '<' DW 000100B DW 000010B DW 000001B DW 000010B DW 000100B DW 001000B DW 000000B DW 000000B+8000H,0,0,0,0,0,0,0 DW 000000B ; '=' DW 000000B DW 011111B DW 000000B DW 011111B DW 000000B㐞 DW 000000B DW 000000B DW 000000B+8000H,0,0,0,0,0,0,0 DW 000010B ; '>' DW 000100B DW 001000B DW 010000B DW 001000B DW 000100B DW 000010B DW 000000B DW 000000B+8000H,0,0,0,0,0,0,0 DW 001110B ; '?' DW 010001B DW 010000B DW 001100B DW 000100B DW 000000B DW 000100B DW 000000B DW 000000B+8000H,0,0,0,0,0,0,0 DW 001110B ; '@' DW 010001B DW 010101B DW 011101B DW 001101B DW 000001B DW 011110B DW 000000B DW 000000B+8000H,0,0,0,0,0,0,0 DW 000100B㐞 ; 'A' DW 001010B DW 010001B DW 010001B DW 011111B DW 010001B DW 010001B DW 000000B DW 000000B+8000H,0,0,0,0,0,0,0 DW 001111B ; 'B' DW 010001B DW 010001B DW 001111B DW 010001B DW 010001B DW 001111B DW 000000B DW 000000B+8000H,0,0,0,0,0,0,0 DW 001110B ; 'C' DW 010001B DW 000001B DW 000001B DW 000001B DW 010001B DW 001110B DW 000000B DW 000000B+8000H,0,0,0,0,0,0,0 DW 001111B ; 'D' DW 010001B DW 010001B DW 010001B DW 010001B DW 010001B 㐞 DW 001111B DW 000000B DW 000000B+8000H,0,0,0,0,0,0,0 DW 011111B ; 'E' DW 000001B DW 000001B DW 001111B DW 000001B DW 000001B DW 011111B DW 000000B DW 000000B+8000H,0,0,0,0,0,0,0 DW 011111B ; 'F' DW 000001B DW 000001B DW 001111B DW 000001B DW 000001B DW 000001B DW 000000B DW 000000B+8000H,0,0,0,0,0,0,0 DW 011110B ; 'G' DW 010001B DW 000001B DW 000001B DW 011001B DW 010001B DW 011110B DW 000000B DW 000000B+8000H,0,0,0,0,0,0,0 DW 010001B 㐞; 'H' DW 010001B DW 010001B DW 011111B DW 010001B DW 010001B DW 010001B DW 000000B DW 000000B+8000H,0,0,0,0,0,0,0 DW 001110B ; 'I' DW 000100B DW 000100B DW 000100B DW 000100B DW 000100B DW 001110B DW 000000B DW 000000B+8000H,0,0,0,0,0,0,0 DW 010000B ; 'J' DW 010000B DW 010000B DW 010000B DW 010000B DW 010001B DW 001110B DW 000000B DW 000000B+8000H,0,0,0,0,0,0,0 DW 010001B ; 'K' DW 001001B DW 000101B DW 000011B DW 000101B DW 001001B D㐞W 010001B DW 000000B DW 000000B+8000H,0,0,0,0,0,0,0 DW 000001B ; 'L' DW 000001B DW 000001B DW 000001B DW 000001B DW 000001B DW 011111B DW 000000B DW 000000B+8000H,0,0,0,0,0,0,0 DW 010001B ; 'M' DW 011011B DW 010101B DW 010101B DW 010001B DW 010001B DW 010001B DW 000000B DW 000000B+8000H,0,0,0,0,0,0,0 DW 010001B ; 'N' DW 010001B DW 010011B DW 010101B DW 011001B DW 010001B DW 010001B DW 000000B DW 000000B+8000H,0,0,0,0,0,0,0 DW 001110B ; 㐞'O' DW 010001B DW 010001B DW 010001B DW 010001B DW 010001B DW 001110B DW 000000B DW 000000B+8000H,0,0,0,0,0,0,0 DW 001111B ; 'P' DW 010001B DW 010001B DW 001111B DW 000001B DW 000001B DW 000001B DW 000000B DW 000000B+8000H,0,0,0,0,0,0,0 DW 001110B ; 'Q' DW 010001B DW 010001B DW 010001B DW 010101B DW 001001B DW 010110B DW 000000B DW 000000B+8000H,0,0,0,0,0,0,0 DW 001111B ; 'R' DW 010001B DW 010001B DW 001111B DW 000101B DW 001001B DW 㐞 010001B DW 000000B DW 000000B+8000H,0,0,0,0,0,0,0 DW 001110B ; 'S' DW 010001B DW 000001B DW 001110B DW 010000B DW 010001B DW 001110B DW 000000B DW 000000B+8000H,0,0,0,0,0,0,0 DW 011111B ; 'T' DW 000100B DW 000100B DW 000100B DW 000100B DW 000100B DW 000100B DW 000000B DW 000000B+8000H,0,0,0,0,0,0,0 DW 010001B ; 'U' DW 010001B DW 010001B DW 010001B DW 010001B DW 010001B DW 001110B DW 000000B DW 000000B+8000H,0,0,0,0,0,0,0 DW 010001B ; 'V㐞' DW 010001B DW 010001B DW 001010B DW 001010B DW 000100B DW 000100B DW 000000B DW 000000B+8000H,0,0,0,0,0,0,0 DW 010001B ; 'W' DW 010001B DW 010001B DW 010101B DW 010101B DW 010101B DW 001010B DW 000000B DW 000000B+8000H,0,0,0,0,0,0,0 DW 010001B ; 'X' DW 010001B DW 001010B DW 000100B DW 001010B DW 010001B DW 010001B DW 000000B DW 000000B+8000H,0,0,0,0,0,0,0 DW 010001B ; 'Y' DW 010001B DW 001010B DW 000100B DW 000100B DW 000100B DW 00㐞0100B DW 000000B DW 000000B+8000H,0,0,0,0,0,0,0 DW 011111B ; 'Z' DW 010000B DW 001000B DW 000100B DW 000010B DW 000001B DW 011111B DW 000000B DW 000000B+8000H,0,0,0,0,0,0,0 DW 011110B ; '[' DW 000010B DW 000010B DW 000010B DW 000010B DW 000010B DW 011110B DW 000000B DW 000000B+8000H,0,0,0,0,0,0,0 DW 000000B ; '\' DW 000001B DW 000010B DW 000100B DW 001000B DW 010000B DW 000000B DW 000000B DW 000000B+8000H,0,0,0,0,0,0,0 DW 001111B ; ']' 㐞 DW 001000B DW 001000B DW 001000B DW 001000B DW 001000B DW 001111B DW 000000B DW 000000B+8000H,0,0,0,0,0,0,0 DW 000100B ; '^' DW 001010B DW 010001B DW 000000B DW 000000B DW 000000B DW 000000B DW 000000B DW 000000B+8000H,0,0,0,0,0,0,0 DW 000000B ; '_' DW 000000B DW 000000B DW 000000B DW 000000B DW 000000B DW 011111B DW 000000B DW 000000B+8000H,0,0,0,0,0,0,0 DW 000010B ; '`' DW 000100B DW 001000B DW 000000B DW 000000B DW 000000B DW 0000㐞00B DW 000000B DW 000000B+8000H,0,0,0,0,0,0,0 DW 000000B ; 'a' DW 000000B DW 001110B DW 010000B DW 011110B DW 010001B DW 011110B DW 000000B DW 000000B+8000H,0,0,0,0,0,0,0 DW 000001B ; 'b' DW 000001B DW 001111B DW 010001B DW 010001B DW 010001B DW 001111B DW 000000B DW 000000B+8000H,0,0,0,0,0,0,0 DW 000000B ; 'c' DW 000000B DW 011110B DW 000001B DW 000001B DW 000001B DW 011110B DW 000000B DW 000000B+8000H,0,0,0,0,0,0,0 DW 010000B ; 'd' 㐞DW 010000B DW 011110B DW 010001B DW 010001B DW 010001B DW 011110B DW 000000B DW 000000B+8000H,0,0,0,0,0,0,0 DW 000000B ; 'e' DW 000000B DW 001110B DW 010001B DW 011111B DW 000001B DW 001110B DW 000000B DW 000000B+8000H,0,0,0,0,0,0,0 DW 011000B ; 'f' DW 000100B DW 000100B DW 011110B DW 000100B DW 000100B DW 000100B DW 000000B DW 000000B+8000H,0,0,0,0,0,0,0 DW 000000B ; 'g' DW 000000B DW 011110B DW 010001B DW 010001B DW 011110B DW 010000㐞B DW 001110B DW 000000B+8000H,0,0,0,0,0,0,0 DW 000001B ; 'h' DW 000001B DW 001111B DW 010001B DW 010001B DW 010001B DW 010001B DW 000000B DW 000000B+8000H,0,0,0,0,0,0,0 DW 000100B ; 'i' DW 000000B DW 000110B DW 000100B DW 000100B DW 000100B DW 001110B DW 000000B DW 000000B+8000H,0,0,0,0,0,0,0 DW 001000B ; 'j' DW 000000B DW 001100B DW 001000B DW 001000B DW 001000B DW 001001B DW 000110B DW 000000B+8000H,0,0,0,0,0,0,0 DW 000010B ; 'k' DW㐞 000010B DW 010010B DW 001010B DW 000110B DW 001010B DW 010010B DW 000000B DW 000000B+8000H,0,0,0,0,0,0,0 DW 000110B ; 'l' DW 000100B DW 000100B DW 000100B DW 000100B DW 000100B DW 001110B DW 000000B DW 000000B+8000H,0,0,0,0,0,0,0 DW 000000B ; 'm' DW 000000B DW 001011B DW 010101B DW 010101B DW 010101B DW 010101B DW 000000B DW 000000B+8000H,0,0,0,0,0,0,0 DW 000000B ; 'n' DW 000000B DW 001111B DW 010001B DW 010001B DW 010001B DW 010001B 㐞 DW 000000B DW 000000B+8000H,0,0,0,0,0,0,0 DW 000000B ; 'o' DW 000000B DW 001110B DW 010001B DW 010001B DW 010001B DW 001110B DW 000000B DW 000000B+8000H,0,0,0,0,0,0,0 DW 000000B ; 'p' DW 000000B DW 001111B DW 010001B DW 010001B DW 001111B DW 000001B DW 000001B DW 000000B+8000H,0,0,0,0,0,0,0 DW 000000B ; 'q' DW 000000B DW 011110B DW 010001B DW 010001B DW 011110B DW 010000B DW 010000B DW 000000B+8000H,0,0,0,0,0,0,0 DW 000000B ; 'r' DW 0㐞 00000B DW 011010B DW 000110B DW 000010B DW 000010B DW 000010B DW 000000B DW 000000B+8000H,0,0,0,0,0,0,0 DW 000000B ; 's' DW 000000B DW 011110B DW 000001B DW 001110B DW 010000B DW 001111B DW 000000B DW 000000B+8000H,0,0,0,0,0,0,0 DW 000100B ; 't' DW 000100B DW 001110B DW 000100B DW 000100B DW 000100B DW 001000B DW 000000B DW 000000B+8000H,0,0,0,0,0,0,0 DW 000000B ; 'u' DW 000000B DW 010001B DW 010001B DW 010001B DW 010001B DW 001110B 㐞DW 000000B DW 000000B+8000H,0,0,0,0,0,0,0 DW 000000B ; 'v' DW 000000B DW 010001B DW 010001B DW 010001B DW 001010B DW 000100B DW 000000B DW 000000B+8000H,0,0,0,0,0,0,0 DW 000000B ; 'w' DW 000000B DW 010001B DW 010001B DW 010101B DW 010101B DW 001010B DW 000000B DW 000000B+8000H,0,0,0,0,0,0,0 DW 000000B ; 'x' DW 000000B DW 010001B DW 001010B DW 000100B DW 001010B DW 010001B DW 000000B DW 000000B+8000H,0,0,0,0,0,0,0 DW 000000B ; 'y' DW 000㐞000B DW 010001B DW 010001B DW 010001B DW 011110B DW 010000B DW 001110B DW 000000B+8000H,0,0,0,0,0,0,0 DW 000000B ; 'z' DW 000000B DW 011111B DW 001000B DW 000100B DW 000010B DW 011111B DW 000000B DW 000000B+8000H,0,0,0,0,0,0,0 DW 001000B ; '{' DW 000100B DW 000100B DW 000010B DW 000100B DW 000100B DW 001000B DW 000000B DW 000000B+8000H,0,0,0,0,0,0,0 DW 000100B ; '|' DW 000100B DW 000100B DW 000000B DW 000100B DW 000100B DW 000100B DW㐞 000000B DW 000000B+8000H,0,0,0,0,0,0,0 DW 000010B ; '}' DW 000100B DW 000100B DW 001000B DW 000100B DW 000100B DW 000010B DW 000000B DW 000000B+8000H,0,0,0,0,0,0,0 DW 000000B ; '~' DW 010110B DW 001101B DW 000000B DW 000000B DW 000000B DW 000000B DW 000000B DW 000000B+8000H,0,0,0,0,0,0,0 DW 011110B ; PARAGRAPH DW 010101B DW 010101B DW 010101B DW 011110B DW 010100B DW 010100B DW 010100B DW 000000B+8000H,0,0,0,0,0,0,0 㐞MZ%  (㐞Ȏ@;l+㐞   ???㐞?????      㐞    㐞     㐞   㐞        㐞     㐞     .>Qt/.㐞QUSQRWVP$2.SX^_ZY[].Q.3ۊ(.S:'r22$u 2 rqttb%t^r ~u^.!@u>($...;|$.  t.H.3{.T2SQR3ѹZY[.>PuLt&.'( È('áHy&. u".H. .;t K.;t. ..%.;|.H..#t.. .;t C;t@. .6.>.> K..#t22Ȁt>'2(È')Ӏ 㐞r:Wr..#$LÀ&!À!@À! À&!$á ;t H;t á ;t C;t@ á@;|HáHy+Ë6> ;~ G %%3 Ë6> ;t H;t  j F>;tH;táP9;|XË6 >H;t !Ë6 >H;t áP;}.X.P3Ur.P3sà*2, r<+2 r1;};~ A;u &t ;|㐞K6> ;t H;tzá-%y+á   á  눋6 IÊ*1t2t+2+|*,|CáH2+ x;*, ;;\áP}XÀ!À&!  2*1x6 | |) }$. "''(.''4:777&À&"À"À#À#2*1x6 | |) }$.d|777&&À"À&"À&#À&#<|t ..S.>t".R1%)!_.>Rt'.RPQQCY%㐞)!YX)PPXW+..2.PX ^KPPXV+ޡءGMM2+PX ^ËPPX+Gء+2PX PPXQPHX;tPH<YȀ%2 SQ"u8"t(Ύƾ3&t.10GGFFAY[Q 0Ȏ؎. Y! t3.0t.0GG!tQ3.ѥ0GGY0.㐞 PPX#.:}# 0..#. 0..PX&3#3«.:}( 0...&3#3«Q.03Y.>.1.OO..+K.3Ҹ ..3Ҹ..3.II..666&'666(.6666664:''6666@6666666FL`u";T666666 '' '666 66666(69FOW6666@ 661ú !㐞4ø&5&uUS%)!;23 PRSWV.Sz.Si2@S&@d[글 N31&hCBBJJ^_[ZXVE/z$ PLXnú !%'p q Apricot 0( 132 Column )1 Interface - Vr1.4 p q $ be encountered in using it. AA Ba GSX Sa SCISSORS ]a DEV$DRV fa AUTOEXECBAT b 㐞Ȏ@;l+   㐞????????  㐞        㐞  㐞   㐞        㐞  㐞         㐞  .>Qt/.QUSQRWVP$2.SX^_ZY[].Q.3ۊ(.S:'r22$u 2 rqttb%t^r ~u^.!@u>($...;|$.  t.H.3{.T2SQR3ѹZY[.>P㐞uLt&.'( È('áHy&. u".H. .;t K.;t. ..%.;|.H..#t.. .;t C;t@. .6.>.> K..#t22Ȁt>'2(È')Ӏ r:Wr..#$LÀ&!À!@À! À&!$á ;t H;t á ;t C;t@ á@;|HáHy+Ë6> ;~ G %%3 Ë6> ;t H;t  j F>;tH;㐞táP9;|XË6 >H;t !Ë6 >H;t áP;}.X.P3Ur.P3sà*2, r<+2 r1;};~ A;u &t ;|K6> ;t H;tzá-%y+á   á  눋6 IÊ*1t2t+2+|*,|CáH2+ x;*, ;;\áP}XÀ!À&!  2*1x6 | |)㐞 }$. "''(.''4:777&À&"À"À#À#2*1x6 | |) }$.d|777&&À"À&"À&#À&#<|t ..S.>t".R1%)!_.>Rt'.RPQQCY%)!YX)PPXW+..2.PX ^KPPXV+ޡءGMM2+PX ^ËPPX+Gء+2PX PPXQPHX;tPH㐞<YȀ%2 SQ"u8"t(Ύƾ3&t.10GGFFAY[Q 0Ȏ؎. Y! t3.0t.0GG!tQ3.ѥ0GGY0.PPX#.:}# 0..#. 0..PX&3#3«.:}( 0...&3#3«Q.03Y.>.1.OO..+K.3Ҹ ..3Ҹ.㐞.3.II..666&'666(.6666664:''6666@6666666FL`u";T666666 '' '666 66666(69FOW6666@ 661ú !4ø&5&uUS%)!;23 PRSWV.Sz.Si2@S&@d[글 N31&hCBBJJ^_[ZXVE/z$ PLXnú !%'p q Apricot 0( 132 Column )㐞1 Interface - Vr1.4 p q $XuҰ~@F + F HN;vˊcPLP*(F^ uvDS^GF<t;À t c:v F^ F: u :FvF^G PFX$<uFF:XvXW<tƀzuoq#7sC7uc7w77{778#8C8c8888#99999:#:C:c:::::;/;C;c;;;;<#c>>>>>?#?C???@㐞 !0!|$cified program. Output may be redirected to the microscreen use the standard escape sequences. Rinstall will ask for the name of the file to be created, this must include '.com'. Contained on this disk:- READ.ME This file. RINSTALL.COM Generation program described above. RINSTALL.OVL Overlay. eWeYe[e]e_fa&fcFfeffgfifkfmfogq&gsFgufgwgyg{g}gh&hFhfhhhhhi&iFifiiiiij&jFj㐞  !0!z$s .. s RINSTALLCOM ( RINSTALLOVL xy8READ ME ϐ㐞. t .. t DIRLIST COM ,READ ME P㐞bI,&! t. ,t~ ddd3/Tt*X>du:8t >dur6t뷺d+ &>G+ǹ 3M.>tu# Mttuu#d+ ut zt .> ut & +!ô&! utu>.t:ôR! Ë6<u G㐞@t 6@ֹ).< u Nֹ <uû@!úd;!ð .6F t<.u6?. Ë>>#< t< t.< t>22>>et #G>ô;#!!\?????????????????????? No sub-directories exist Invalid path  DIRECTORY PATH LISTING FOR VOLUME Path: Sub-dire㐞ctories: Files: None \P0!<t  ! X u !7! when the disk has been changed. Again if the file cannot be created you will be informed and given another opportunity to change disks. If it is possible to continue copying the message: Copying will be displayed so that you know the program is still progressing. The above process is repeated until the input file is completely copied. Caveats!!! This program is completely UNSUPPORTED and cannot be said to be entire㐞 ******************************************************************* Each of the items of software on this disk is contained in its own Sub-Directory. ************************************************************************* 㐞 ly error free. No guarantee can be given that any file will be copied correctly. However, the principle of producing multiple disks from one file appears on the surface to be correct.  12th Oct. 84 $to< tjw'6.t#<I!< `' ! !a r-<:u< u<u<%uQ< u-&-k wt - lt-/)!<t?ABEIKLNQSTF% t% t% u+ t8Pr PiX tP+PPV P PV%@ t)"P+P@P4PP"W=t㐞 FE2PDDFPP%=uFvE2PVDDVyDD~uFXf_^]UVW=u~VtDDPƺXÉǃ~u Pv= u DPvm= u )PvV" tX# _^]U+PvvZ]U+PvvF]UPvv1]UVWvdžF udžFFFF^ t^<%t+ uՃ~vPvFFFF<%tdžFF2F<-uFFFF 㐞!MZ`  Z>!㐞! E(0Apricot Boot Disk Configurator1 Version A1.0) $x1Y% No disk in drive$x1Y% Not a boot Disk$ - Press FINISH to quit or any other key to continue...$Y3'CANNOT REWRITE BOOT SECTOR.J$ RUN ABORTED.J$ Boot disk updated.$Y# J $ $ $ $YES$NO$(Out of Range!)$Y3'Enter your choice or press FINISH to quit:J$Y3'JEnter two Hexadecimal digits :$Y3'JEnter decimal number in the range $Y3'Press space bar to show next optionJY4'Press ENTER to select the option you want.x5$y5$Y5 㐞!J $Reconfigure Disk$Systems Unit$Keyboard$Screen$Serial Communications$Parallel Port$Boot disk type : $Operating System : $Software write protect $Disk generation number $Copy number $Max number of copies $Listing device $Graphics $Disk cache $Winchester format allowed$Sector size $Sectors per track $Tracks per side $Sides $Allocation unit size $Media type $Bell Volume (0=full, 15=off)$Keyclick volume (0-15) $Auto repeat $Auto repeat lead delay (20ms)$Auto repeat interval (20ms)$MicroScreen e㐞!cho $Scan lines on screen $Characters per line $Screen Image On $XON character code $XOFF character code $XON/XOFF receive buffer limit$Nulls sent after a CR $Nulls sent after a FF (x10)$Auto linefeed after CR $Bios error report $Transmit baud rate $Receive baud rate $Transmit bits per char $Receive bits per char $Number of stop bits $Parity Check $Parity Type $Transmit xon/xoff protocol$Receive xon/xoff protocol$DTR/DSR protocol $CTS/RTS protocol $Select line support $Paper Empty support $Fault line su㐞!pport $Return to main menu$More options$Z$ -J 4l J2 (X  j* ~ ,.0] (#6HQR(g] Z(t(  0(BWl (L L '> Sb  㐞!(pl (Apricot PC and XI RAM BIOS$Apricot Generic ROM BIOS$Apricot PC and XI ROM BIOS$Apricot Portable ROM BIOS$Apricot F1 ROM BIOS$d     Invalid!$MS-DOS$UCSD p-system$CP/M-86$Concurrent DOS$BOS$     & Serial printer$Parallel printer$L = 70 track single-sided$80 track single-sided$80 track double-sided$5 Mb Winchester$10 Mb Winchester$20 Mb Winchester$d z     256$200$  40$80$㐞!  50$75$110$134.5$150$300$600$1200$1800$2400$3600$4800$7200$9600$19200$       # ( - 2 7 < A F One$One and a half$Two$z ~  None$Odd$Even$Mark$Space$     3Pû\؎ !u!Ȣ㐞 !%sA !p !!:t뻝 <u Y !ؾ(K=t&s ! !i !^(C) 1984 ACT (UK) Ltd.0 !Vu ! ! !Tu|u<t  !  !u<tu2u&^u7$ H!<< |0д!ú  !["uS\?t:tW ![ !Ã^0 !!:t<0|,0:|!ݸ3Ë2؀tuwtu 4$uu㐞"uKO !PZ ˆq!<0|<9~:20.="0t=" t="t=1t=1t=0u~=0uv]U+PDP>t >t+ t +]UFFF^G2PDDFF\v PHvvv+PP a X0PP =vv +P@Pi X t%` t+ u ~+ tn% t++PPvv L X t +PPvv XZF)+PPvv ! X t +PPvv XZFFv,PFPvpF~t=~~"% t  F FFFPFRPNFFPFRP>F PFRP<FPF㐞 #RP$FF vv +PP< X tv^G2PF tP,PvvX[]UVFF+;vv66&+PPX tPvv!FP+P@PF|Xf^]UP^XЙRPPR `+]UV+V DDF|^]UVWPFXÉVF[GDPPPP+PP P+PP P+PPY+ P PPE+_^]UVWvrX +,PƺXÉNj% uX +_^]UV~u+)P P'@Ƌ9FtFHP P^]㐞$U~tF9FtFHP P]U]UVWv~ƉF }~~ fuF+~ et ~ Et+ t@F ljF uF~~F F 2PvPP@Pv ~ fu WvV)DDFH؊<.u FHF< t9Ft Vv(Ff_^]UF 2Pvvv]UF 2Pvvv]UF 2Pvvv]UVWvF<<.uljF/tJP@@PR=uPP+PPP[;t+ t@PPT +P@P=t@P$P2?PW u*PW~ u+ u4F4PP>؃PWPF~u 3PWMFPF2Pv#FPtDD@P.DDFFPvvDDPWPeF~uWDD2=>u=<u}'NJ t+PDDPDD=u>P?P!+PPP؃PxDDf_^]Uv|Pv|PNP|P|P P׃P'D㐞$D]UVWvP[_^]UVWv~F4FF2FD t;D2HF~ |G1GP0PF X[G:FD tF tOGPD2Ha[G:F\FF< tLGPZPFF2%X؊2% tFF2% PFF2%PX[F~ |G.F \FF< tLGPZPFF2%X؊2% tFF2% PFF2%PX[F~ |Gf_^]UVWvPFXÉFFWV tXE t vE2[G~u?P㐞 $@P t+ tX^G2PDDF~u WPԃ~u^% t WvԃFv^G2P}~t ~t+ tF~+PPXf_^]UVWF .F 0v~_^]UVWv P+Pv P PF@P PFPVXƊ<:u*FPv=u PFPFV(Ɗ<*uP?PF@PYFPF@PFP<.uC PFPFVƊ<*uP?PF PFPF PFPU<;u' PFPFVƸPFPFP(+2= t= t㐞%=tf_^]UVWv~2GPZP2X؊2% t 2P2PX[FN t F t+ u_^]UVWv~GPF2[N t*2P,P u F t+ t+ u_^]UVWv+#Ǻ PF2X-0v@[GZP2X؊2% uƊ t2vZP2X؊2% t 2P2PX-A@[F u"^G<w ^<w+ u+ t+_^]UVWv~ v vFFPp+PPKFFPWvvX u%@ t:"P+P@P4PP%V=tX㐞%z$!P+P@P4PvvVZ=t vvv vXZ=Pvv4PD%XÉF^F~uL P PX tVPoX P}jvvv vbXZE~ uFPP[ XX+GPF2[FPPP XXFPP. XX9Fsv v+PP2X t+ t7v v+PPX tNP PX tVPX PvvXZf_^]UVWv~v vFFPc+PP>FFPJ+PP+PPjX uhP(vvPX u㐞%%@ t:"P+P@P4PPVb=tXF$!P+P@P4PvvV+=tXPvv4PD%XÉF.GPFF2[FPP XXPPw XX9Fsv v+PP{X t+ uv v+PP9X u=P  PAX tVPX PvvXZDFPP XXFFv v+PPFFvv+PPX t!!PvvWvvVRPFFFPvv}Vvv+PP wXPf^vv+PP FPLOvv+PP XZNjP㐞% P JX tVPX Pvvvv X t vvv vXZ,v v+PPX t vvXZ%@ t:"P+P@P4PPV=tX$!P+P@P4PvvV=t vvv v:XZPvvPv v4FGPFF2[FPP XXv v+PPX uϋP PX tVPX PvvXZf_^]UVWv^% t `P DD~svPXP[u0P+P@P$˃[< u㐞%P Pʃ2%9s PPʃ.<u^ +EFPG2[N~v v+ u~vF G+Íf_^]UWV+V Fu Ƌأ.F^ ;wr ;vr+v@6>^_]UVWv~+PvFFFP+PPFFPvvX u%@ t:"P+P@P4PPV=tX$P~PP Pj+P@PrPPX t3!P+P@P4PvvV=tX$P㐞%vv4PD%XÉF+PvFFG< u ~ t+ tF GFNFFPF2[PPXX9Fr ~v+ u9Fr6"P+P@P4PvvV߃=tvvvv]XZQ @~u<P4 P+kX tVP8X P'vvXZ ~vf_^]UVWv~FO _^]UVWvFP+PPXZFP+PvX u%@ t6"P+P@P4PPoVރ=tXPHPP P4+P@Pr^% t=r^% tFllG% ndžvFFF^< u*džvp tF@=|xF Fd^< u n t+ tHPv%X+ÉtFt=}dtvxF Ftt uF xFPFF2[FNv~} ~t+ t.xPFH[㐞 %xPrDD~tF]ZX[Ww7ZX[)_w7ZX[w7WZX[w7)_UVWvLLPF2X#ÉljFF2PPyƒO Ff_^]UF f؋Ff؋Ff]YSPUhP4Pv4PP4P4P PƒPDD]UVWvF2FF$+NjƉF;Ǔ<$u/^<$t v P$PP@ÉFGF9|9Ft v PqFf_^]ÃF FF2n=uDu&t t =ut u Etu㐞& Eut+؉^TV@^ RPFXY؃㓇ҋʋV҃VR ҃R FFufVVVV 3FFFFFߋOOO/ }^FuNfVVVF2n=uDutuEu=ut=tC^5VPF=uDuNu Eu:tV2u Eun=tuD\LE]M;} FNFTVTVTVVF2͈NV+=5vdE]M5㐞&r֊͊ߊĴt NuFu%VN^FF tFn^^^^N6V+VN^FsڃVuNJ݊Ίs^4u N6vF^NV t;#y ؃u3u ԊKs]UEË\ݱxT}`LTD| <$ Ċ֊tu"y؃33ҷt"ú"y@Bx"y"t -x@BËD-y-4|D$ \LU ֊͊ߊt㐞&EuDt]ENJ݊Ίu ]Mܓ3Dt̀24E3ۉ]]=t Dt]ËDEDEDEÁFsFuFuFF tFFF==|FtN2F4EF^NE] E%-D%-þB RPB BXZB R FFuþRs BuBuBFFGG uËGW/_uF ^VNNNð n3FtM]]ð3UVW؎~*ʋ~Ovҋ㐞&sF_^]UVW؎~+ыv~tH@UVW؎~+ыv~t|&]awaawa:t밋W؎6*ыH_UVW؎N~vs_^]UVW؎~FNs_^]UVWv؎~Nī_^]UVW؎^vN ~s_^]û+VW؎6|*6Du6|OuA_^+_^$@Y@@@@j@.AcAחA7yACyCxDnF\)c=Hsȡ1I=P1PK?O8M20HwZ$gAAI0G.+OI~.G ~0GIJuO=0tG^_ä.G.I0 &Z>'Z>'Z>'Z>'㐞'!!!!": unmatched quoteCannot open Cannot append Cannot create : No matchStack Overflow $<>.,=:|[]* 㐞'Raw I/OC RTL - program not linked for Program terminating $㐞'.  Z..  CHMOD EXE rm [Y CHMOD DOC | aj㐞'MZY "+ ,+w+㐞 ',Read Only$$$$$$,Hidden$$$$$$$$$,System$$$$$$$$$,Volume ID$$$$$$,Directory$$$$$$,Updated$$$$$$$$ $ dHSRWUNXYDhsrwunxyd    Incorrect DOS version$Invalid Pathname Specified $ No Files $Files occupying$bytes $Allocation units available $Available bytes $Allocation units in total $Total bytes $Bytes per allocation unit $% Full$ Drive @: is $local to$remote from$ machine $$$$$$$$$$$$$$$$$㐞(*.*/ Jan $ Feb $ Mar $ Apr $ May $ Jun $ Jul $ Aug $ Sep $ Oct $ Nov $ Dec $3Pˌݴ7!؈[0!<  !,\&<u!\2& 㐞(t GtO&:[u W&F:[t < tG<E<:t<\tG2-]ſ& t@G[u8&Q3:u!6 6 >6>?662600<0u д!ִ!2ȲЁ_ !3326㐞(00<0u д!ִ!:!2600д!ִ!3ۊ>+t !2ۃu  tT>] t!=!rشW!>!2  2C! ! !Oi !á=t"3 !6 >/ ! !637 ! &&U !63g !& !63p !+&63S !>t?^!\2S ![D !t  ! ! !3؋ וfa>u *㐞( 8PZրt"̀0*р>t0|ʹ!''ì! 132COL t -DIRLIST t MOUSE t BOOTEDIT  z X hz EADME BAK z &/README DOC { (㐞( CHMOD.EXE is intended to allow manipulation of the property bits in the directory entries of files. Parameter format: CHMOD path /switches where path is a valid pathname possibly including wildcards, somewhat like DIR. If the path terminates with a colon (:) or backslash (\) or is omitted, then *.* is assumed. E.g. "TEST\" becomes "TEST\*.*" and "B:" becomes "B:*.*". The valid switches are: /H Hide Marks the file as being not to 㐞( be shown in the directory. /S Show Reverse of /H. /R Read-Only Marks the file as not to be erased. /W Write-enable Reverse of /R. /U Updated Marks the file as having been updated (the 'archive' bit is set). /N NotUpdated 㐞( Reverse of /U (the 'archive' bit is cleared). /X System Mark a file with the 'system' attribute. /Y NotSystem Reverse of /X. /D reDate a file Puts the current date and time against the directory entry for the file. Does not corrupt 㐞( the file. Examples: CHMOD displays details of all files in the current directory. CHMOD B:\TESTING\*.ASM /R marks all files in the directory \TESTING on drive B: which have the suffix 'ASM' as 'read-only'. CHMOD a: /d redates all the files in the current directory of drive A: CHMOD /swnyd sets all files in the current directory as 'show 㐞 ( in directory, write-enabled, not updated, not system', and redates them all. 㐞).  f..  HISTRIP EXE Lpg=WSTRIP EXE p?㐞)MZ}@B)19ALT_glw '4<DLT_ls{#/6?SZbks{,7HOT_ou*05:?bb b%FQ㐞) bY b"b"b㐞)blA#  U bb bb Ubb&UbbbUb,Ub bl b9@@l bQb4 bbr bb b@@@@b bb bb bbl b bH b b9bb3ɚbb bbbb@@l bQb. bl bQbF b bfb#u}A  b b>À b㐞)  b @ > ~b@l bQb be l bQbPp b bh bbl b9br bl b bV} bbbtbuJbuI #u bbuJbuI #u  b bl bQ bbUbˋښ bUbˋښ bUbUb b bl bQb bT b b bY b bb bbbb㐞)Ubˋښ bUbˋښ bUb b bb+++++++$+.+8+B+L+V+`+j+t+~+++++++++D3CV i 9Q&(2<FPZZZdnx9!6IFNaip}D^"" ,6%@,J3JATDhDrJrPrWru|}v#).499?EQ0LQ0:NN㐞)NXbl7KYBDSCRNLPT1T< ll%ll5mG#w? uؘ.t."&V' u^P&QXPP&V^t P&uPP &VtR<uM^XPPPՉ&PS?t-_߰ItOtRtAu [X QS˳[Yˉ&PVPV^u) ^XQRSڋw[ZYCt K t wSW._[OOuûV6" u^$V^V6" u^V6" u^V6" u^aV6" u^SVt^WSPWSPD. x㐞)2ؘ. tXP.X[_)SV6 t \2b^[F x2PRW *I< s<.tJu_ZXâ trtڰ J JuRWV<:t ^_Z2_W+tIt9VRG=.u.8uJuG. y^^^_ZG.tZ^.}uw ,@r<suÄ&tك3ً>|6\D.T/&Ser QR3ɋZYVW򥥇ڃ?t U_^[ˉ&QRVWp%S [_^ZYˋދ tsN\QVWw;v;_^u;'#YSyntax erroRETURN without GOSUOut㐞 ) of DATIllegal function calOverfloOut of memor Subscript out of rang Division by zer Type mismatcOut of string spacString formula too compleNo RESUMRESUME without erro2FIELD overflo3Internal erro4Bad file numbe5File not foun6Bad file mod7File already ope9Device I/O Erro:File already exist=Disk ful>Input past en?Bad record numbe@Bad file namCToo many fileDDevice UnavailablFDisk Write ProtecGDisk not ReadHDisk Media ErroUnprintable erro.X[&SP-㐞*3 qb `ˉCtK6S83ۋӉ&SRZ[ urg uCKK$+؋+ڀK;rAǓ>OOXY&QPO G ǣ3  c)- +3H ^.V6X[SPyX[SPh 2345679:=>?@CFGHD& 2345679:=>?@CFGHD.MM&&>)u=>$t62X )[>u-$)&%S㐞*6$x 3{STO >)u\ tN in line]XZUY5 at address]_ZU :ô&=t t ĮsG:3ۭ t;s ;rFF tInternal Error - No Line NumbeK$$>)t[6>)t)XSW>)t)XkSˀ>)t) t ;r;sFFXSCu[PRS3ҋ [ZX;&r,^&VP&&x_^X &x X^_&VW;&r2 u(^жK:v t R&&&&Rj7㐞* [˃?t`Vw4 ޷^PXt hطX& u;RSE ڏZX< SRPNtuJ3۸XZ[ ~PQRVW񭒋4 t?Jy;8$}K+ʓ+~'$u QVW_^Yu+_^YZXA < 3QʋӻK bYˉ&Q3 &Q+Yˉ&J|ttRP+~;}1 XZB[ <&R t>|AQPˊŠF AXYZˉ&Rۉ&ڃ?tSPS_[ XZ< |tR;~ }3 Zr <ڋ+=r^_+бҋWV-P@X T  _^&VW_^[VW67^V.," 0㐞* ,.u ? ?.u>>Ç ~1 |-;w)VWQI+;rȋ; v tY_^ _&G4>2;&8&6:>&G,טPW&U ,<u0]_>rw7vww>t6:t8<,t&8?Redo from starI b;>2|:ty2 uWhOverfloVWQ66NN +&66t Y_^;u24&8.24Ӛ#bڋ94/*%  6.<tJ<t+>Au%>@uP@㐞* >rOwB>Au>@uRcа"vV"k < uFY,>tcĴ*̊-v2 4POXt u P.*Xr:v " tV3ì t-1u59<u|)t/QRTU!ZYÀ<t(|)t3ۀ<t8\*u黀*\*x3uK<\'uQRSTL33 [ZY3ۊ\2ÈT/D*Êd2Êd/SH[À<t|*tS3ۊ\)*\*L*@3[ À|)tWur<uD)D*Ë;tCjS[<t|)uP9XS3ۊ\)@3[D)< uD2< T2RQ>u 㐞*uQYV| ^>u`T>uS!!u#!u>u߀>tD<t <t <u\YZÃ|u |u|"V^u)&#3r<tB3|'3D2뤃l"sL$NQRSuB t|扔JDŽSt uĊ23ۉDFZL3ˉH+;rʨt3sFVQ6F>HsY^,DF+3 u[ZYVQ6H>FsY^ $PQRSDC;ut K\'D)D*\"D$t4[ZYXD'QW@3|3_YD!K 㐞*uD)D* D)'".9t 9898?QRS3ɊDňD2< tI<u t:< u tu < r>Dt :&Du tgx&D ÈDPf2> tCXPVCu6N3t=t5H;r6N+tH+^XÓ7FL6N;vt[빰<rS66N=ttuNN@G7FPSVW6H=t#㐞 *u󫓋;wu)@;t $+rF5>N_^[XN during G.C  6 Internal Error - String Space Corrup t$>Pt$VS6PPw\Ӌ^ú:<tsGRQWH_YQVWA_^YSRtr[s]PÇPGXPRCN+rCCCZXPQRVWQSʋ2[^wA_^ZYXPS_;r;w @ G[;uX[XgRQ3BJYS_[ZË>>N@$+-ER>PVELicensed Material - Program Pr㐞+operty of Microsoft, Inc.BÜ3ء&&&&&&à u R!Z tR>u Gt 2 -ÈwFQRS3ɋF[ZYÈT/PX< t< rGd/t:&GwOGÊ&GÊd/CÊGCˈwF˿ tyز-J 㐞+0À>rʻt  tض+ڰ t-:dP>uo>\DɀtPV ZހԊYQ́twr t'RZZϿ+ϰ0AOÿŊ㗊܊ǕƊYQ́t wrt ׿ |+Tl\sTl\̓0-Gf3Ғ';r03d dr 00 00ÿ>Ë;s"++0<5r O<:rA1O0A*ԿpMþOiMD t:w t*܀8w㐞+ّ͵PW2̀ tc| tыˋ3wtHr#|+ t֊͊ߊ2wt#Gu?t ^?t Xp$4L\ts uuZ*4L\ts3 uv|Ntyً3uvdNJ݊Ί xtJqwrtst$߀ ǣ߿ƪyþD tM t2쁀p̀ĀP"tX x utlhDM2 tb t쀀*pĀP2ɭ̀㐞+FG"WWW ‹tY[_j63;s\ u;w;R3 tP t tZ]蕒sOsO+‹ɊD E 3ۋ  ʋU tU3D t tX PD t U t3ɋ tU tыD t t X P t&ʋ t&3ۋD tU tӋD tU t ʃU3E t&ڋD t&ڋD tU t ՋD&E t&&ŗZ^ P㐞+SV6" t'D.u!<u>@t+ tK } x^[XP6"""X6""S"PX$'@'.P$XtXV^ʋw ut t8\u<uF3PQRWSt t9\rDEL˃'wL3s[_ZYXWWSߋ} t;u|[> 6 |_ WwS[i<"t,N3ɬ:t A,tNـ,uNO :tAL't3ۋӋ<&tNw :v㐞+3QˋݸuV^Y䝸u<%t,<#t(t*}r yQ y^:t&<t(b3Ú)b<-t<+uFNû wx3p‹ t3KPWUSRXXXXXЃr t),0r < wu Nì< t< t< t)㐞+6>ˉ6>6>ˏ^& V&&UVWPQRS[ZYX_^] &6666PQRVWU0]_^ZYXˠ<t+4>v:|3:+ ~ K0t .0󤾞+It.E+ yڴ->uH 00c% k%r%z%% %%%%<3۸C%P&"%.:tN.d^XƇ>X^| t Kð\ tK><tP\X릈> t0 t< uQ t ˾>ð#㐞+9XW>sC|&þE4E]5πL|t tc tY:s*܀wGّ͵S| t3ۀrt<~) t֊ߊwt!uދ׋?t ?t psMuE+׋s u vT tN uvEފ x t5qwrt st$ ǣƣyþ4 tM t݋=2쁀pȀĀPӓX x ut~ˀɀSS X؃tXþ3MM㐞 +D tC t2쀀*pĀPɀT$2΀]-2ɀπV ‹t[\;s3sNsþ+ЋsW_SRP y3jXZ[W_SRPπ teXZ[ˉ&PQD I&PQ>&PQV^. y ,VR yN> uGKD&PQ3 t1rڊݑ*͊r;t$π> tp+ y"xYXˁu t> tt x&PQD &PQu x ݀> tsI u݋D Lt L$J*E0i Z98HISTRIP 㐞,Version 1.2 This program removes the top bit5v of each character in a file.3 CAUTION - Updates in-situ!)Please enter filename of file to convert:R File not found2Please wait . . . .JBlock TEND OF CONVERSION : lBlocks$vDo you want to convert another file?YbyNtn ERROR NO.  AT LINE "CHECK BASIC MANUAL FOR ERROR CODES#&>[ع+ḕ33㐞,ь+ȁv3l b*.*<<Pd ]xEco#Ƥ~@zZrN vH Tʚ;  !!!"""####$$$%%%&&&&'''((())))***+++,,,,---㐞,...////0001112222333444555566677788^_B";5J }#~t'Xv%F*Ӯw-;uD1mA4-q7|tP;d<>b}JlA]E62w8HMľfK:|O\ 5$4RKB.aUPo ̼ Y$ /\[_6A_p caw+fCzՔVijl7mGG'peXQsOnwףp= #zL} Hz@PC$t >(kn@C:h* 51_c.1@v:k ^# bx-Àz&XƐn2xʴW ?h)͡SЅ@aQYԦo% 'N x9? 6㐞,!OgI#E@|o|p+L67EV߄vl: {Η@H½p PvP?<&Ok8и'ƫ7Cưe\{2~]30b/5`=! C)/{QFZ$+vﶓ+髤8UqfclN@< 'PKPEZ>,㐞,MZ* @Am)19ALT_glw &.6AIOYanv~EM %?FNW_hpx'AL]dit 㐞,)/?EJOT#yy y>>>%>F>Q> y yy#y*#y㐞,blV>D(0B >U yy y#y0Yy#y6Yy#yKyYy<YyMyp yN@@p yfKyDMyKyMy@@@KyMyKyMyKyMyWyp y  y y y+yy3ɚyKyMysy y y y0y3ɚyKy6My@@p yfKyTMy p yfKylMy 5 y y y#y㐞 , y y> > tfyMy @ >~Y> uK> uJ #u 1> tDfyx9y@ ufy y9y@@;|fyMy @ @p yfKyHyjy#t p yfKy~%y4y%y 4yMyfyMyyyp yNKy9yp y  yV y"#y"yt "yuJyu㐞-I #u y"yuJyuI #u   y  y&p yf yKyYyˋښ yYy&ˋښ yYyYy9y y&p yfKy9yX y4y 9y] y>yKy MyyyKyYyˋښ yYy&ˋښ yYy9y yy+++++++$+.+8+B+L+V+`+j+t+~++++++++++3CViN((f2<FPZZ㐞-Zdn x +(;8sC[p",6@ J"T,T5^?^O^V^Yhcrrr| 0006<Cr&D0:NNNXb bl8l>lCvINNTZfaf    L KYBDSCRNLPT1Kt_$w? uؘ.t.&&V u^P&㐞-QXPP&V] ^t P&uPP &V6 tR<uM^XPPPՉ&PS?t-_߰ItOtRtAu [;X QS˳[Yˉ&PVPVu) ^XQRSڋw[ZYCt K t wSW._[OOuû V6" u^V^V6" u^]V6" u^V6" u^V6" u^Vt^WSPWSPD. x2ؘ. tXP.X[_)SV6 t \2y^[F x2PRW *I< s<.tJu_ZXâ trtڰ J㐞- JuRWV<:t ^_Z2_W+tIt9VRG=.u.8uJuG. y^^^_ZG.tZ^.}uw ,@r<suÄ&tك3ً>|6\D.T/&Sr QR3ɋKZYiVW򥥇ڃ?t U_^[ˉ&QRVWp%SS [_^ZYˋދ ts\QVWw;v;_^u;YSyntax erroRETURN without GOSUOut of DATIllegal function calOverfloOut of memor Subscript out of rang Division by zer Type mismatcOut of string spacString formu㐞-la too compleNo RESUMRESUME without erro2FIELD overflo3Internal erro4Bad file numbe5File not foun6Bad file mod7File already ope9Device I/O Erro:File already exist=Disk ful>Input past en?Bad record numbe@Bad file namCToo many fileDDevice UnavailablFDisk Write ProtecGDisk not ReadHDisk Media ErroUnprintable erro.X[&SP-3 uyp`ˉCtK6S83ۋӉ&SREZ[ urg uCKK$+؋+ڀK;rAǓ>OOXY㐞-&QPO G ǣ3  Uc)- +3H ^.V6X[SPyX[SPh 2345679:=>?@CFGHD& 2345679:=>?@CFGHD.MM&>)u=>$t62X )[>u-$)&%S6$x STO >)uz\$ t in line]XZUYxO at address]_ZU :H,MHô㐞-&=t t ĮsG9:3ۭ t;s ;rFF tInternal Error - No Line Numbe^$$>)t[6>)t)XSW>)t)XkSˀ>)t) t ;r;sFFXSCu[PRS3ҋ [ZX;&r,^&VP&&x_^X &x X^_&VW;&r2 u(^жK:v t R&&&&Rj7\ [˃?t`Vw4L ޷^Pt طX& u;RS ڏZX< SRPJtuJ3۸ XZ[ ~PQRVW񭒋4 t?Jy;8$㐞-}K+ʓ+~'$u QVW_^Yu+_^YZX 3QʋӻO yYˉ&Q3 &Q+Yˉ&J|ttRP+~;} XZB[F <&R t>|AQPˊŠ AXYZˉ&Rۉ&ڃ?tSPS_[ XZ< |tR;~ }3 Z <ڋ+=r^_+бҋWV-P@XP  _^&VW_^[VW67S30># ӓ0 Z'y^V.," 04 ,.u ?{ v~.u>>É&t<t6"0W ,r t< t><"u,㐞 -u |"" r>"t%< tN< u,t_< t< u t,t t :t :t;s<"t< u'r"< t<,t< u"G.x r< t2> tuY_&G4>2;&8&6:>&G,טPW&U ,<u0]_>rw7vww>t6:t8<,t&8X?Redo from star y;>2|:ty2 uWOverfloVWQ66NN +&66t Y_^;u24&8.24Ӛ'yڋ94/*%  76.<tJ<t㐞.+>Au%>@uP@ >rOwB>Au>@uRvа"i" < uFY,>tĴ*̊-v2 PXt u P}*Xr:v q t3ì tNc*]<u|)t/QRTU!ZYÀ<t(|)t3ۀ<t8\*u黀*\*x3uK^<\'uQRSTL33L [ZY3ۊ\2ÈT/D*Êd2Êd/SH[À<t|*tS3ۊ\)*\*L*@3[ À|)tWur<uD)D*Ë;tCS[<t|)uP9XS3㐞.\)@3[D)< uD2< T2RQ>u uQSYV| ^>u`T>uS!!u#!u>u߀>tD<t <t <u\YZÃ|u |u|"V^u)&#3r<tB3|'3D2뤃l"sL$gQRSuB t|扔JDŽSt uĊ23ۉDFZL3ˉH+;rʨt3sFVQ6F>HsY^,DF+3 u[ZYVQ6H>FsY^ $PQRSDC;ut K\'D)D*\"D$t4㐞.[ZYXD'QW@3|3_YD!K uD)D* D)'".9t 9898QRS3ɊDňD2< tI<u t:< u Rtu < r>Dt :&Du tgx&D ÈDPf2> tCXPVCu6J3t=t5H;r6J+tH+^XÓ7FL6J;v[빰<rS66J=ttuNN@G7FPSVW6H=t#u󫓋;wu)@;t $+r㐞.F5>J_^[XM during G.C  5 Internal Error - String Space Corrup t$>Lt$VS6LLw\Ӌ^ú:<sGNQWH_YQVWA_^YSNtr[s]PÇLGXPRCJ+rCCCZXtPQRVWQSʋ2[^wA_^ZYXPS_;r;w @ G[;uX[XgRQ3BJYS_[ZË>>J@$+-EN>LRELicensed Material - Program Property of Microsoft, Inc.BXÜ3ء㐞.&&&&&& à u R!Z tR>u Gt 2 -ÈwF4QRS3ɋF3[ZYÈT/PX< t< rGd/t:&GwNGÊ&GÊd/BÊGCˈwF˿ tyز-J 0À>rʻt  tض+ڰ t-㐞.:dP>uo>\DɀtPU ZހԊYQ́twr t'RZZϿ+ϰ0AOÿŊ㗊܊ǕƊYQ́t wrt ׿ |+Tl\sTl\̓0-Gf3Ғ';r03d dr 00 00ÿ>Ë;s"++0<5r O<:rA1O0A*ԿþpMþOiMD t:w t*܀8wّ͵PW2̀ tc| t㐞.ыˋ3wtHr#|+ t֊͊ߊ2wt#Gu?t ^?t Xp$4L\ts uu*4L\ts3 uv|Ntyً3uvdNJ݊Ί xtJqwrtst$߀ ǣ߿ƪyFþD tM t2쁀p̀ĀP"tX x utlhDM2 tb t쀀*pĀP2ɭ̀FG"WWW ‹㐞 .tY[_j|63;s\ u;w;R3 tP t tZ]蕒sOsO+‹ɊD E 3ۋ  ʋU tU3D t tX PD t U t3ɋ tU tыD t t X P t&ʋ t&3ۋD tU tӋD tU t ʃU3E t&ڋD t&ڋD tU t ՋD&E t&&ŗZ^ PSV6" t'D.u!<u>@t+ t㐞/#K  ^[XP6"""X6"""PX$'@'.P$XtXV^ʋw ut t8\u<uF3PQRWSt t9\rDEL˃(wL3s[_ZYXWWSߋ} t;u|[> 6 |_XwS[i<"t,N3ɬ:t A,tNـ,uNO :tAM't3ۋӋ<&tNw :v3QˋݸuV^Y䝸u㐞/<%t,<#t(t*}r yQ y^:t&<t(y3Úl)y<-t<+uFNû wx3p‹ t3KPWUSRXXXXXЃr t),0r < wu Nì< t< t< t)6>ˉ6>6>㐞/^& V&&UVWPQRS[ZYX_^] &6666PQRVWU1]_^ZYXˠ<t+5>v:|3:+ ~ K0t .0󤾚+It.E+ yڴ->uH 00% %%%% &1&D&P&<3۸%P&%.:tN.d^XƇ>X^ t Kð\ tK><tP\X릈> t0 t< uQ t ˾>ð#9XW>sC}&þ㐞/E4E]5πL|t tc tY:s*܀wGّ͵S| t3ۀrt<~) t֊ߊwt!uދ׋?t ?t psMuE+׋s u vT tN uvEފ x t5qwrt st$ ǣƣyCþ4 tM t݋=2쁀pȀĀPӓX x ut~ˀɀSS X؃tXþ3MMD tC t2쀀*pĀPɀT$2΀]㐞/-2ɀπV ‹t[\h;s3sNsþ+ЋsW_SRP y3jXZ[W_SRPπ teXZ[ˉ&PQD I&PQ>&PQV^. y ,VR yN> uGKD&PQ3 t1rڊݑ*͊r;t$π> tp+ y"xYXˁu t> tt' x&PQD &PQu x ݀> ts u7݋D Lt L4J:E@i Z8HWSTRIP Version 1.0 This program co㐞/nverts a file to3 text only, expanding Tabs.)Please enter filename of file to convert:IFile not foun)Please enter filename of file for output:4O:Error opening Output fileXPlease wait . . . .pRecord | END OF CONVERSION : Records inputRecords output$Do you want to convert another file?Y#yN5n ERROR NO. AT LINE " CHECK BASIC MANUAL FOR ERROR CODESD&>[ع>+㐞/ḷ33ь+ȁv3p y*.*<<Pd ]xEco#Ƥ~@zZrN vH Tʚ;  !!!"""####$$$%%%&&&&'''((()㐞/)))***+++,,,,---...////0001112222333444555566677788^_B";5J }#~t'Xv%F*Ӯw-;uD1mA4-q7|tP;d<>b}JlA]E62w8HMľfK:|O\ 5$4RKB.aUPo ̼ Y$ /\[_6A_p caw+fCzՔVijl7mGG'peXQsOnwףp= #zL} Hz@PC$t >(kn@C:h* 51_c.1@v:k ^# bx-Àz&XƐn2xʴW ?h)͡SЅ@aQYԦo% '㐞 /N x9? 6!OgI#E@|o|p+L67EV߄vl: {Η@H½p PvP?<&Ok8и'ƫ7Cưe\{2~]30b/5`=! C)/{QFZ$+vﶓ+髤8UqfclN@< 'PKPE㐞0`&g&i&㐞0. B .. B README DOC 9),PLOT BAS D8PLOT EXE QmDEMO80 PLT jDEMO81 PLT 㐞0 DISKID ------------------------------------------------------------------- DISKETTE DESCRIPTION DATE ------------------------------------------------------------------- PLOT VER 1.03 17-12-83 ------------------------------------------------------------------- FILES VER DESCRIPTION ------------------------------------------------------------------- PLOT .EXE 1.03 Plotter Driver (Compile㐞0d BASIC) PLOT .BAS 1.03 Plotter Driver (BASIC source code) MSBASIC .COM 5.28 Microsoft BASIC interpreter DEMO80 .PLT Demo plot file for the ACT WRITER-80 DEMO81 .PLT Demo plot file for the ACT WRITER-81 DISKID Description of files - this file README Instructions for use COMMAND .COM 2.02 System file (See Port Configuration Note ) PRINTER .EXE 1.0 Utility to change the system pri㐞0nter port ------------------------------------------------------------------- PRINTER PORT'S The default port is parallel with the serial port set to work with both the Writer 80 & 81 plotters. Use the PRINTER utility to change ports. Parallel Port - This is the Default setting of the Operating System supplied on this disk. Serial Port - This is configured to 1200 Baud, 8 Data bits, 1 Stop Bit, No Parity, RTS/CTS Protocol selected. These settings will work with either the Writer 80 connecte㐞0d with a Writer 102 Serial interface cable or the Writer 81 connected with a Writer 103 Serial interfcae cable. To change from the Parallel port (default) to the Serial port simply run "PRINTER SERIAL" and to go back to the parallel port type "PRINTER PARALLEL". ******************************************************************************** Introduction for the BASIC PLOTTER DRIVER This file contains details of the set of plotter driver routines supplied free with this Plott㐞0er.These are intended as guidance for users and offer basic facilities. Written in MSBASIC (compiled) the PLOT program provides the user with high level access to the plotter functions.In addition the un-compiled BASIC source program is provided as an example, and demonstration, of the use of software drivers for the ACT Plotters. Also enclosed are example programs DEMO80 and DEMO81 which are example programs for use with this plotter driver. Design of the Program --------------------- In 㐞0order to produce a language independent plotter driver the following approach was taken; As printing or plotting output from programs is quite slow in comparison to the execution speed of the program all the commands are written to a sequential disk file, instead of driving the list device directly, the file can then be plotted at some other time. By formally declaring the structure of the file, it would not matter which language had produced it, as long as it could be read by the driver. All㐞 0 filenames under MS-DOS consist of an 8 character filename and 3 character extension, so as to differentiate between source code, (BAS .FOR .PAS), object modules (.OBJ) and executable files (.EXE), the file extension .PLT will be used to identify a plot file. eg. MAP021.PLT Stucture of the System. ----------------------- Two operations are required to produce a plotted output ; the generation of the plot file and using PLOT.EXE to plot the file ie.; 1. A program or manua㐞1l keying of commands produces file on disk eg. ????????.PLT 2. PLOT.EXE when called asks for the name of the file to plot the named file is then output to the plotter. Formal Definition of a Plot File. -------------------------------- A plot file is held as a sequential disk file containing only printable ASCII characters. It can be produced by an applications program or by use of a suitable text editor, and should conform to the following specifications : i) Only one statement is al㐞1lowed on each line, ii) Blank lines are ignored. iii) Leading and trailing spaces are ignored. iv) Input can be in either upper or lower case. v) Keywords and parameters must be separated from each other by at least one space. vi) The space character is the only valid delimiter. vii) Lines must be terminated by a carriage return. viii) If parameters are ommmited, they are assumed to be zero if numeric and spaces if alphanumeric. This does not cause an error or㐞1 warning to be generated. ix) FATAL ERRORS are not recoverable and cause a return to MS-DOS. The error message generated displays the type of error detected and the line number at which it occured. x) The first command in a plot file must identify the type of plotter in use. If ommitted this produces a FATAL ERROR. xi) The last command in a plot file is a DEVEND (or device end), to de-allocate the plotter. Failure to do so is not fatal, but will 㐞1 generate a warning. All commands must conform to the following syntax, (exmples are given of each command). Plot File Command Set. ---------------------- There are two classes of commands available to the programmer, configuration and action commands. The command sets for each are described below :- Configuration Commands. ------------------------- WRITER-80 Declares the plotter type as the ACT Writer 80 (CX4800) and is used to set-up all plotter de㐞1pendent characteristics. WRITER-81 As above, but for ACT Writer 81 (CX6000). DEFINE LINES n (ACT Writer 80 only) Specifies the number of printing lines when the plotter is in PRINT mode. When n = 0 48 lines n = 1 infinite Initially set to n = 0 DEFINE AREA n (ACT Writer 81 only) Specifies the effective plotting area. When n = 0 area is 260 x 186mm n = 1 area is 288 x 216mm 㐞1 Initially set to n = 1 LINE SCALE n Specifies the number of dots used to make dotted (or dashed) lines. The mark to space ratio is 1:1, that is for each set of dots printed there is a gap of the same length. n is valid between 1 and 127 Initially set to n = 30 LINE TYPE n Specifies the type of line drawn, solid or dotted. n = 0 Solid line n = 1 Dotted line Initially set to n = 0 SET ORIGIN x 㐞1y Sets the origin for all LINE and MOVE operations etc... both x and y must be within the plottable range. Initially set to x = 0 y = 0 SET DIREC n Specifies the print direction. n = 0 Left to right n = 1 Top to bottom n = 2 Right to left n = 3 Bottom to top Initially set to n = 0 SET SIZE n Specifies the size of printed characters. n = 1 to 255 I㐞1nitially set to n=4 SET MODE n Sets the operational mode of the plotter. n = 0 Graphics mode n = 1 Print mode 1 n = 2 Print mode 2 Print mode 2 is only valid with ACT Writer 81. Initially set to n = 0 STEP n (ACT Writer 80 only) Specifies the step size for the pen. n = 0 0.05mm step n = 1 0.10mm step Initially set to n = 1 DEVEND Device end, terminate㐞 1s plotting of the file. Action Commands. ------------------ ARC x y r q1 q2 d Draws an arc of a circle based on x,y with radius r. Centre x,y (-9999 to 9999) Radius r (0 to 999) Start angle q1 (0 TO 360) Finish angle q2 (0 to 360) Direction d d = 0 Anticlockwise d = 1 Clockwise 㐞2 AXIS p q r Draws a single axis of a graph from the current pen position. Axis p (0 specifies Y axis, 1 specifies X axis) Step q (0 to 999) Number r (1 to 255) BAR x1 y1 x2 y2 Draws a bar or histogram defined by the diagonal (x1,y1) (x2,y2). Position x,y = (-9999 to 9999) BORDER c s m Draws a border around the plottable area. Colour c = 㐞2(0 to 3 ACT Writer 80 0 to 5 ACT Writer 81) Step in s = (0 to 9999) Mode m = 0 (border size 260 x 186) 1 (border size 288 x 216) Mode only applicable to ACT Writer 81. CIRCLE x y r Draws a circle of radius r around the co-ordinates (x,y). Centre x,y = (-9999 to 9999) Radius r = (0 to 9999) Leaves the pen 㐞2at (x,y). DIRECT string Directly outputs the string to the plotter without any form of error checking. EJECT Sends a form feed to the plotter and redefines the plotting area on the next page.(WRITER-80 ONLY). FILL x1 y1 x2 y2 t p c Fills the bar or histogram defined by the diagonal (x1,y1) (x2,y2) with a coloured fill pattern. Position x,y = (-9999 to 9999) Type t = 0 horizontal shade 1 vertical shade 㐞2 2 both of the above Pitch p = (1 to 9999) Colour c = (0 to 3 ACT Writer 80, 1 to 5 ACT Writer 81) Leaves the pen at (x1,y1) HOME Moves the pen to the home position. LINETO x y Draws a line to the absolute (x,y) co-ordinates. Position x,y = (-9999 to 9999) LINEBY x y Draws a line of length (dx,dy), relative to the current pen po㐞2sition. Displacement x,y = (-9999 to 9999) MOVETO x y Moves the pen to the absolute (x,y) co-ordinates. Position x,y = (-9999 to 9999) MOVEBY x y Moves the pen by (dx,dy), relative to the current pen position. Displacement x,y = (-9999 to 9999) PEN n Changes the pen colour. Colour n = 0 to 3 (ACT Writer 80) n = 0 to 5 (ACT Writer 81) PRINT string Prints the string from the current㐞2 pen position. The results of this facility depend on the direction and size of print selected. Running the Demo Programs. -------------------------- 1. Compiled version; from MS-DOS operating system prompt enter PLOT you will then be prompted for a file, enter either DEMO80 or DEMO81 checking first that the plotter is ready. 2. Interpreted version; from MS-DOS enter MSBASIC PLOT after loading you will be promted for a file, enter DEMO80 or DEMO81 again checking first that the pl㐞2otter is ready. NOTE; that this Interpreted version will be much slower than the compiled version. END OF FILE ___________________________________________________________________________ YS&p` HMOD  ~ LOTTER 6a LACKAA Ba GSX Sa CISSORS ]a EV$DRV fa CTRL-DEV ~ 㐞21000 '************************************************************************* 1010 '* * 1020 '* PLOTTER DRIVER Version 1.03 September 1983 * 1040 '* * 1050 '* (C) ACT (Pulsar) & ACT (Office Products) Ltd * 1060 '* * 1070 '********************㐞 2***************************************************** 1080 ' 1090 ' SET UP ALL THE STRING AND NUMERIC PARAMETERS 1100 ' 1110 DEFINT A-Z 1120 FS$=CHR$(28) 1130 GS$=CHR$(29) 1140 RS$=CHR$(30) 1150 ESC$=CHR$(27) 1160 CLS$=ESC$+"E" 1170 BEL$=CHR$(7) 1180 DR!=ATN(1)/45 1185 MISK$=CHR$(27)+"A"+CHR$(27)+"l" 1190 FLINE=0 1200 ERRM=0 1210 WARN=0 1220 WRTYP=0 1230 ' 1240 ' START PLOTTING 1250 ' 1260 PRINT ESC$+"y4" ' SET UNDERLINE CURSOR 1270 PRINT CLS$ 1280 PRINT SP㐞3C(29) "PLOT ---- version 1.03" ' VERSION NO. 1290 PRINT 1300 PRINT SPC(15) "(C) ACT (Pulsar) & ACT (Office Products) Ltd 1983" 1310 PRINT 1320 PRINT 1330 ' 1340 ' GET THE FILE NAME AND IF ALL IS WELL, OPEN IT FOR INPUT 1350 ' 1360 INPUT "Enter the name of the plot file [.PLT] ";FPLOT$ 1370 IF FPLOT$="" THEN GOTO 2000 ' BACK TO MS-DOS 1371 FOR ZZ1=1 TO LEN(FPLOT$) 1372 IF MID$(FPLOT$,ZZ1,1)="." THEN APLT$="Y" 1373 NEXT ZZ1 1375 IF APLT$="Y" GOTO 1390 1380 FP㐞3LOT$=FPLOT$+".PLT" 1390 ON ERROR GOTO 2340 1400 OPEN "I",1,FPLOT$ 1410 ON ERROR GOTO 0 1420 ' 1430 ' FIND OUT THE TYPE OF PLOTTER IN USE 1440 ' 1450 IF EOF(1) THEN ERRM=9 : GOTO 2090 1460 LINE INPUT#1,COM$ 1470 FLINE=FLINE+1 1480 ' 1490 ' LOAD THE KEY WORD INTO KEY$ 1500 ' 1510 GOSUB 5210 : GOSUB 5370 : KEY$=TMP$ 1520 ' 1530 ' DECIDE ON THE PLOTTER TYPE 1540 ' 1550 IF KEY$="WRITER-80" THEN WRTYP=80 1560 IF KEY$="WRITER-81" THEN WRTYP=81 1570 IF KEY$="" THEN 1420 1580 ' 1590 ' C㐞3HECK THE PLOTTER TYPE 1600 ' 1610 IF WRTYP=0 THEN ERRM=1 : GOTO 2090 1620 ' 1630 ' FORCE THE PLOTTER INTO GRAPHICS MODE 1640 ' 1650 LPRINT RS$ 1660 ' 1670 ' GET THE INSTRUCTION 1680 ' 1690 IF EOF(1) THEN WARN=1 : GOTO 2230 1700 LINE INPUT#1,COM$ 1710 FLINE=FLINE+1 1720 ' 1730 ' LOAD THE KEY WORD INTO KEY$, STRIPPING OFF ALL LEADING SPACES 1740 ' 1750 GOSUB 5210 : GOSUB 5370 : KEY$=TMP$ 1760 ' 1770 ' DECODE INSTRUCTIONS 1780 ' 1790 IF KEY$="DEVEND" THEN 2000 1800 IF KEY$="MOVETO" T㐞3HEN 2420 1810 IF KEY$="LINETO" THEN 2510 1820 IF KEY$="MOVEBY" THEN 2600 1830 IF KEY$="LINEBY" THEN 2690 1840 IF KEY$="PEN" THEN 2780 1850 IF KEY$="CIRCLE" THEN 2870 1860 IF KEY$="ARC" THEN 3110 1870 IF KEY$="BAR" THEN 3480 1880 IF KEY$="FILL" THEN 3680 1890 IF KEY$="LINE" THEN 3950 1900 IF KEY$="HOME" THEN 4110 1910 IF KEY$="STEP" THEN 4160 1920 IF KEY$="PRINT" THEN 4240 1930 IF KEY$="SET" THEN 4310 1940 IF KEY$="AXIS" THEN 4600 1950 IF KEY$="MARKER" THE㐞3N 4710 1960 IF KEY$="BORDER" THEN 4780 1970 IF KEY$="DEFINE" THEN 4960 1980 IF KEY$="DIRECT" THEN 5140 1985 IF KEY$="EJECT" THEN 5800 1990 IF KEY$="" THEN 1660 ELSE ERRM=2 : GOTO 2090 2000 ' 2010 ' DEVICE END ROUTINE 2020 ' 2030 CLOSE 2040 ' 2050 ' FINI - BACK TO MS-DOS 2060 ' 2070 PRINT ESC$+"x4" ' SET BLOCK CURSOR 2080 END 2090 ' 2100 ' JB ERROR TRAP 2110 ' 2120 PRINT BEL$ 2130 PRINT 2140 PRINT "$ FATAL ERROR at line ";FLINE;", "; 2150 IF ERRM=1 THEN PRINT "Plotter t㐞3ype not specified." 2160 IF ERRM=2 THEN PRINT "Undefined plotter operation." 2170 IF ERRM=3 THEN PRINT "Parameter out of range." 2180 IF ERRM=4 THEN PRINT "Invalid option ";PAR$;" in ";KEY$;" statement." 2190 IF ERRM=5 THEN PRINT "Invalid operation for ACT WRITER";WRTYP;"." 2200 IF ERRM=9 THEN PRINT "No data in input file." 2210 PRINT 2220 GOTO 2000 2230 ' 2240 ' JC WARNINGS 2250 ' 2260 PRINT BEL$ 2270 PRINT 2280 PRINT "$ WARNING at line ";FLINE;", "; 2290 IF WARN=1 THEN PRINT "No DEVEND, logi㐞3cal end of file assumed." : GOTO 2000 2300 IF WARN=2 THEN PRINT "Attempt to print a blank line, operation ignored." 2310 IF WARN=3 THEN PRINT KEY$;" not yet implemented for ACT WRITER";WRTYP;"." 2320 PRINT 2330 GOTO 1660 2340 ' 2350 ' JE FILE-NOT-FOUND ERROR 2360 ' 2370 PRINT BEL$ 2380 PRINT 2390 PRINT "$ File not found." 2400 PRINT 2410 RESUME 1330 2420 ' 2430 ' MOVETO MACRO 2440 ' 2450 GOSUB 5210 : PAR1=TMP 2460 IF PAR1<-9999 OR PAR1>9999 THEN ERRM=3 : GOTO 2090 2470 GOSUB 5210 : PAR2=T㐞3MP 2480 IF PAR2<-9999 OR PAR2>9999 THEN ERRM=3 : GOTO 2090 2490 LPRINT "M";PAR1;",";PAR2 2500 GOTO 1660 2510 ' 2520 ' LINETO MACRO 2530 ' 2540 GOSUB 5210 : PAR1=TMP 2550 IF PAR1<-9999 OR PAR1>9999 THEN ERRM=3 : GOTO 2090 2560 GOSUB 5210 : PAR2=TMP 2570 IF PAR2<-9999 OR PAR2>9999 THEN ERRM=3 : GOTO 2090 2580 LPRINT "D";PAR1;",";PAR2 2590 GOTO 1660 2600 ' 2610 ' MOVEBY MACRO 2620 ' 2630 GOSUB 5210 : PAR1=TMP 2640 IF PAR1<-9999 OR PAR1>9999 THEN ERRM=3 : GOTO 2090 2650 GOSUB 5210 : PAR2=TMP 㐞 32660 IF PAR2<-9999 OR PAR2>9999 THEN ERRM=3 : GOTO 2090 2670 LPRINT "R";PAR1;",";PAR2 2680 GOTO 1660 2690 ' 2700 ' LINEBY MACRO 2710 ' 2720 GOSUB 5210 : PAR1=TMP 2730 IF PAR1<-9999 OR PAR1>9999 THEN ERRM=3 : GOTO 2090 2740 GOSUB 5210 : PAR2=TMP 2750 IF PAR2<-9999 OR PAR2>9999 THEN ERRM=3 : GOTO 2090 2760 LPRINT "J";PAR1;",";PAR2 2770 GOTO 1660 2780 ' 2790 ' PEN CHANGE MACRO 2800 ' 2810 GOSUB 5210 : PAR1=TMP 2820 IF PAR1<0 THEN ERRM=3 : GOTO 2090 2830 IF WRTYP=80 AND PAR1>3 THEN ERRM=3 : GOT㐞4O 2090 2840 IF WRTYP=81 AND PAR1>5 THEN ERRM=3 : GOTO 2090 2850 LPRINT "C";PAR1 2860 GOTO 1660 2870 ' 2880 ' CIRCLE MACRO 2890 ' 2900 GOSUB 5210 : PAR1=TMP 2910 IF PAR1<-9999 OR PAR1>9999 THEN ERRM=3 : GOTO 2090 2920 GOSUB 5210 : PAR2=TMP 2930 IF PAR2<-9999 OR PAR2>9999 THEN ERRM=3 : GOTO 2090 2940 GOSUB 5210 : PAR3=TMP 2950 IF PAR3<0 OR PAR3>9999 THEN ERRM=3 : GOTO 2090 2960 IF WRTYP=80 THEN 3000 2970 IF WRTYP=81 THEN 3030 2980 WARN=3 2990 GOTO 2230 3000 LPRINT "W";PAR1;",";PAR2;",";PAR3;"㐞4,";0;",";360;",";1 3010 LPRINT "M";PAR1;",";PAR2 3020 GOTO 1660 3030 LPRINT "M";PAR1+PAR3;",";PAR2 3040 FOR I=1 TO 360 3050 X=PAR3*COS(I*DR!) 3060 Y=PAR3*SIN(I*DR!) 3070 LPRINT "D";PAR1+X;",";PAR2+Y 3080 NEXT I 3090 LPRINT "M";PAR1;",";PAR2 3100 GOTO 1660 3110 ' 3120 ' ARC MACRO 3130 ' 3140 GOSUB 5210 : PAR1=TMP 3150 IF PAR1<-9999 OR PAR1>9999 THEN ERRM=3 : GOTO 2090 3160 GOSUB 5210 : PAR2=TMP 3170 IF PAR2<-9999 OR PAR2>9999 THEN ERRM=3 : GOTO 2090 3180 GOSUB 5210 : PAR3=TMP 3㐞4190 IF PAR3<0 OR PAR3>9999 THEN ERRM=3 : GOTO 2090 3200 GOSUB 5210 : PAR4=TMP 3210 IF PAR4<0 OR PAR4>360 THEN ERRM=3 : GOTO 2090 3220 GOSUB 5210 : PAR5=TMP 3230 IF PAR5<0 OR PAR5>360 THEN ERRM=3 : GOTO 2090 3240 GOSUB 5210 : PAR6=TMP 3250 IF PAR6<0 OR PAR6>1 THEN ERRM=3 : GOTO 2090 3260 IF WRTYP=80 THEN 3300 3270 IF WRTYP=81 THEN 3320 3280 WARN=3 3290 GOTO 2230 3300 LPRINT "W";PAR1;",";PAR2;",";PAR3;",";PAR4;",";PAR5;",";PAR6 3310 GOTO 1660 3320 IF PAR4PAR5 AND PAR6=0 THEN PAR5=PAR5+360 3340 ST=1 3350 IF PAR6=1 THEN ST=-1 3390 X=PAR3*COS(PAR4*DR!) 3400 Y=PAR3*SIN(PAR4*DR!) 3410 LPRINT "M";PAR1+X;",";PAR2+Y 3420 FOR I=PAR4+ST TO PAR5 STEP ST 3430 X=PAR3*COS(I*DR!) 3440 Y=PAR3*SIN(I*DR!) 3450 LPRINT "D";PAR1+X;",";PAR2+Y 3460 NEXT I 3470 GOTO 1660 3480 ' 3490 ' BAR/HISTOGRAM MACRO 3500 ' 3510 GOSUB 5210 : PAR1=TMP 3520 IF PAR1<-9999 OR PAR1>9999 THEN ERRM=3 : GOTO 2090 3530 GOSUB 5210 : PAR2=TMP 3540 IF PAR2<-9999 OR PA㐞4R2>9999 THEN ERRM=3 : GOTO 2090 3550 GOSUB 5210 : PAR3=TMP 3560 IF PAR3<-9999 OR PAR3>9999 THEN ERRM=3 : GOTO 2090 3570 GOSUB 5210 : PAR4=TMP 3580 IF PAR4<-9999 OR PAR4>9999 THEN ERRM=3 : GOTO 2090 3590 IF WRTYP=80 THEN 3630 3600 IF WRTYP=81 THEN 3650 3610 WARN=3 3620 GOTO 2230 3630 LPRINT "T";PAR1;",";PAR2;",";PAR3;",";PAR4 3640 GOTO 1660 3650 LPRINT "M";PAR1;",";PAR2 3660 LPRINT "D";PAR1;",";PAR4;",";PAR3;",";PAR4;",";PAR3;",";PAR2;",";PAR1;",";PAR2 3670 GOTO 1660 3680 ' 3690 ' FILL A BAR W㐞4ITH A SELECTED HASH PATTERN 3700 ' 3710 GOSUB 5210 : PAR1=TMP 3720 IF PAR1<-9999 OR PAR1>9999 THEN ERRM=3 : GOTO 2090 3730 GOSUB 5210 : PAR2=TMP 3740 IF PAR2<-9999 OR PAR2>9999 THEN ERRM=3 : GOTO 2090 3750 GOSUB 5210 : PAR3=TMP 3760 IF PAR3<-9999 OR PAR3>9999 THEN ERRM=3 : GOTO 2090 3770 GOSUB 5210 : PAR4=TMP 3780 IF PAR4<-9999 OR PAR4>9999 THEN ERRM=3 : GOTO 2090 3790 GOSUB 5210 : PAR5=TMP 3800 IF PAR5<0 OR PAR5>2 THEN ERRM=3 : GOTO 2090 3810 GOSUB 5210 : PAR6=TMP 3820 IF PAR6<1 OR PAR6>9999 T㐞4HEN ERRM=3 : GOTO 2090 3830 GOSUB 5210 : PAR7=TMP 3840 IF PAR7<0 THEN ERRM=3 : GOTO 2090 3850 IF WRTYP=80 AND PAR7>3 THEN ERRM=3 : GOTO 2090 3860 IF WRTYP=81 AND PAR7>5 THEN ERRM=3 : GOTO 2090 3870 HITE=PAR4-PAR2 3880 WDTH=PAR3-PAR1 3890 LPRINT "C";PAR7 3900 LPRINT "M";PAR1;",";PAR2 3910 IF PAR5=2 THEN GOSUB 5460 : GOSUB 5580 3920 IF PAR5=0 THEN GOSUB 5460 3930 IF PAR5=1 THEN GOSUB 5580 3940 GOTO 1660 3950 ' 3960 ' DEFINE LINE CHARACTERISTICS 3970 ' 3980 GOSUB 5210 : GOSUB 5370 : PAR$=TMP$ 㐞43990 IF PAR$="SCALE" THEN 4030 4000 IF PAR$="TYPE" THEN 4070 4010 ERRM=4 4020 GOTO 2090 4030 GOSUB 5210 : PAR1=TMP 4040 IF PAR1<1 OR PAR1>127 THEN ERRM=3 : GOTO 2090 4050 LPRINT "B";PAR1 4060 GOTO 1660 4070 GOSUB 5210 : PAR1=TMP 4080 IF PAR1<0 OR PAR1>1 THEN ERRM=3 : GOTO 2090 4090 LPRINT "L";PAR1 4100 GOTO 1660 4110 ' 4120 ' MOVE PEN TO THE HOME POSITION 4130 ' 4140 LPRINT "H" 4150 GOTO 1660 4160 ' 4170 ' SET STEP RATE 4180 ' 4190 IF WRTYP<>80 THEN ERRM=5 : GOTO 2090 4200 GOSUB 5210 :㐞 4 PAR1=TMP 4210 IF PAR1<0 OR PAR1>1 THEN ERRM=3 : GOTO 2090 4220 LPRINT "G";PAR1 4230 GOTO 1660 4240 ' 4250 ' PLOTTER PRINT FACILITY 4260 ' 4270 GOSUB 5310 : PAR$=COM$ 4280 IF PAR$=" " THEN WARN=2 : GOTO 2230 4290 LPRINT "P";PAR$ 4300 GOTO 1660 4310 ' 4320 ' SET PLOTTER PARAMETERS 4330 ' 4340 GOSUB 5210 : GOSUB 5370 : PAR$=TMP$ 4350 IF PAR$="ORIGIN" THEN 4410 4360 IF PAR$="DIREC" THEN 4450 4370 IF PAR$="SIZE" THEN 4490 4380 IF PAR$="MODE" THEN 4530 4390 ERRM=4 4400 GOTO 2090 4410 GO㐞5SUB 5210 : PAR1=TMP 4420 GOSUB 5210 : PAR2=TMP 4430 LPRINT "I";PAR1;",";PAR2 4440 GOTO 1660 4450 GOSUB 5210 : PAR1=TMP 4460 IF PAR1<0 OR PAR1>3 THEN ERRM=3 : GOTO 2090 4470 LPRINT "Q";PAR1 4480 GOTO 1660 4490 GOSUB 5210 : PAR1=TMP 4500 IF PAR1<1 OR PAR1>255 THEN ERRM=3 : GOTO 2090 4510 LPRINT "S";PAR1 4520 GOTO 1660 4530 GOSUB 5210 : PAR1=TMP 4540 IF PAR1<0 OR PAR1>2 THEN ERRM=3 : GOTO 2090 4550 IF WRTYP=80 AND PAR1=2 THEN ERRM=3 : GOTO 2090 4560 IF PAR1=0 THEN LPRINT RS$ 4570 IF PAR1=1 THEN㐞5 LPRINT FS$ 4580 IF PAR1=2 THEN LPRINT GS$ 4590 GOTO 1660 4600 ' 4610 ' DRAW GRAPH AXIS 4620 ' 4630 GOSUB 5210 : PAR1=TMP 4640 IF PAR1<0 OR PAR1>1 THEN ERRM=3 : GOTO 2090 4650 GOSUB 5210 : PAR2=TMP 4660 IF PAR2<0 OR PAR2>9999 THEN ERRM=3 : GOTO 2090 4670 GOSUB 5210 : PAR3=TMP 4680 IF PAR3<1 OR PAR3>255 THEN ERRM=3 : GOTO 2090 4690 LPRINT "X";PAR1;",";PAR2;",";PAR3 4700 GOTO 1660 4710 ' 4720 ' PLOT A MARKER 4730 ' 4740 GOSUB 5210 : PAR1=TMP 4750 IF PAR1<0 OR PAR1>5 THEN ERRM=3 : GOTO 2090 㐞5 4760 LPRINT "N";PAR1 4770 GOTO 1660 4780 ' 4790 ' DRAW A BORDER IN A SPECIFIC PEN COLOUR 4800 ' 4810 GOSUB 5210 : PAR1=TMP 4820 IF PAR1<0 THEN ERRM=3 : GOTO 2090 4830 IF WRTYP=80 AND PAR1>3 THEN ERRM=3 : GOTO 2090 4840 IF WRTYP=81 AND PAR1>5 THEN ERRM=3 : GOTO 2090 4850 GOSUB 5210 : PAR2=TMP 4860 IF PAR2<0 OR PAR2>9999 THEN ERRM=3 : GOTO 2090 4870 IF WRTYP=80 THEN 4890 ELSE GOSUB 5210 : PAR3=TMP 4880 IF PAR3<0 OR PAR3>1 THEN ERRM=3 : GOTO 2090 4890 LPRINT "M";PAR2;",";PAR2 4900 LPRINT "C";PAR㐞51 4910 IF WRTYP=80 THEN HITE=2032-(2*PAR2) : WDTH=1920-(2*PAR2) 4920 IF WRTYP=81 AND PAR3=0 THEN HITE=1860-(2*PAR2) : WDTH=2600-(2*PAR2) 4930 IF WRTYP=81 AND PAR3=1 THEN HITE=2160-(2*PAR2) : WDTH=2880-(2*PAR2) 4940 LPRINT "J";WDTH;",";0;",";0;",";HITE;",";-WDTH;",";0;",";0;",";-HITE 4950 GOTO 1660 4960 ' 4970 ' DEFINE PLOTTER CHARACTERISTICS 4980 ' 4990 GOSUB 5210 : GOSUB 5370 : PAR$=TMP$ 5000 IF PAR$="LINES" THEN 5040 5010 IF PAR$="AREA" THEN 5090 5020 ERRM=4 5030 GOTO 2090 5040 IF WRTYP<>80㐞5 THEN ERRM=5 : GOTO 2090 5050 GOSUB 5210 : PAR1=TMP 5060 IF PAR1<0 OR PAR1>1 THEN ERRM=3 : GOTO 2090 5070 LPRINT "U";PAR1 5080 GOTO 1660 5090 IF WRTYP<>81 THEN ERRM=5 : GOTO 2090 5100 GOSUB 5210 : PAR1=TMP 5110 IF PAR1<0 OR PAR1>1 THEN ERRM=3 : GOTO 2090 5120 LPRINT "F";PAR1 5130 GOTO 1660 5140 ' 5150 ' DIRECTLY OUTPUT STRING TO THE PLOTTER 5160 ' 5170 GOSUB 5210 : GOSUB 5370 : PAR$=TMP$ 5180 IF PAR$=" " THEN WARN=2 : GOTO 2230 5190 LPRINT PAR$ 5200 GOTO 1660 5210 ' 5220 ' FIND A NUMERIC O㐞5R STRING PARAMETER 5230 ' 5240 GOSUB 5310 ' TO STRIP OFF ANY LEADING SPACES 5250 TEMP$=COM$ 5260 IF LEFT$(TEMP$,1)<>" " THEN TEMP$=RIGHT$(TEMP$,LEN(TEMP$)-1) : GOTO 5260 5270 TMP$=LEFT$(COM$,LEN(COM$)-LEN(TEMP$)) 5280 TMP=VAL(TMP$) 5290 COM$=RIGHT$(COM$,LEN(COM$)-(LEN(TMP$)+1)) 5300 RETURN 5310 ' 5320 ' STRIP LEADING SPACES FROM THE COMMAND STRING 5330 ' 5340 IF LEFT$(COM$,1)=" " THEN COM$=RIGHT$(COM$,LEN(COM$)-1) : GOTO 5340 5350 COM$=COM$+" " 5360 RETURN 5370 ' 5380 ' CONVERT ALL LOWER CAS㐞5E INPUT INTO UPPER CASE 5390 ' 5400 XLEN=LEN(TMP$) 5410 FOR I=1 TO XLEN 5420 X=ASC(MID$(TMP$,I,1)) 5430 IF X>96 AND X<123 THEN MID$(TMP$,I,1)=CHR$(X-32) 5440 NEXT I 5450 RETURN 5460 ' 5470 ' HORIZONTAL FILL PATTERN 5480 ' 5490 FOR II=PAR6 TO HITE-PAR6 STEP PAR6*2 5500 LPRINT "R";0;",";PAR6 5510 LPRINT "J";WDTH;",";0 5520 IF HITE<=II+PAR6 THEN 5550 5530 LPRINT "R";0;",";PAR6 5540 LPRINT "J";-WDTH;",";0 5550 NEXT II 5560 LPRINT "M";PAR1;",";PAR2 5570 RETURN 5580㐞5 ' 5590 ' VERTICAL FILL PATTERN 5600 ' 5610 FOR II=PAR6 TO WDTH-PAR6 STEP PAR6*2 5620 LPRINT "R";PAR6;",";0 5630 LPRINT "J";0;",";HITE 5640 IF WDTH<=II+PAR6 THEN 5670 5650 LPRINT "R";PAR6;",";0 5660 LPRINT "J";0;",";-HITE 5670 NEXT II 5680 LPRINT "M";PAR1;",";PAR2 5690 RETURN 5800 ' 5810 ' EJECT 5815 ' 5817 IF WRTYP=81 THEN ERRM=5:GOTO 2090 5820 LPRINT CHR$(29); 5825 LPRINT CHR$(27)+CHR$(34); 5830 LPRINT CHR$(12); 5835 LPRINT CHR$(27)+CHR$(39); 5840 LPRINT CHR$(30); 㐞 55850 GOTO 1660 !!"!""#B"%b"'")"+"-"/#1"#3B#5b#7#9#;#=#?$A"$CB$Eb$G$I$K$M$O%Q"%㐞6MZ7Ji ()19AIQYait|$)16>FKSX`hnx7?KR_j.>N^n~.>N^qv'/㐞67?NV_gv~',4<DIQV^cksxG~'/8@wH P Y a " * 3 ; F M X _ h o y    # , 2 : B G M V ^ k s / e # + 㐞64 < G N Y ` k r }  !'4=CKSX^go|,4Axqy $+28>IPW^emI~8@INV_gp)1:Bw,4<㐞6DKXcs'08nv $,a >FOW<DMW^ckt '.5<GMV]dkry$?t| (3;CHT`nuz#2Gdls{㐞69AJR[`} RZckty   [y yny}y%FQIyyyQyywy㐞6bl {8@B U y,yy,yy,yy,yy@,yy,yyFyJyyӚ,yN,yښ,y,yT,yyyZ,yyyyyLy`yyzyyLy~yyzyyzyyyyzfyuy,yfyt y@;}Ȼfyu,yy9by㐞6! y3ɚk y3Қby y#u  \y'y@ayayyfytP fytQzfyu|>t yyӚ y#uy'y@ayayy fyuY fyuP* fyu4 fyu`> fyuH fyupP fyuZ fyu9b fyu j fyu r fyuz fyu fyu fyu fyuL fy㐞6u$ fyu fyu/ fyuQ fyuE fyu&zfyuX yy ,yyxyyyyzyy yy y>t y y>t y y>t y< y>t-yX yyl yyt y>ty yyy> t y yyzyyyyzyy yy y>ty y>t y y>t㐞 6&yy: yyyyzyyyyzyyb yyzyb|yay>ػ}K>'~J #u ay > ػ}K> '~J #u yx yy~ y  yay>ػ}K>'~J #u Iay > ػ}K> '~J #u y yy~ y  yay>ػ}K>'~J #u ay > ػ}K> '~㐞7J #u zy yy~ y  yay>ػ}K>'~J #u ay > ػ}K> '~J #u y yy~ y  yay>| >PuK>~J##u p>QuK>~J##u Hy y y_ay>ػ}K>'~J #u ay > ػ}K> '~J #u ay > }K> '~J #u 㐞7>Pu>Quqy yy~ yӋ yښyӋ yښy3ۚyښyӻhyښy yyx yy~ y  y yx y y~ y  y 9yy9yWy8y\yy 9yy9yWySy\yyy yy~ y  y@>hQyx yy~ y  yay>ػ}K>'~J #u ay㐞7 > ػ}K> '~J #u aay > }K> '~J #u +ay>}K>h~J #u ay>}K>h~J #u ay>}K>~J #u >Pu>Qu{py yy~ yӋ yښyӋ yښyӋyښyӋyښy y+;~K>uJ##u;}K>uJ##uh>t 9y㐞7y9yWy8y\yy 9yy9yWySy\yyyx yy~ y  y 9yy9yWy8y\yy 9yy9yWySy\yyy yy~ y  y>|;C ;|4Hay>ػ}K>'~J #u ay > ػ}K> '~J #u ay > ػ}K> 㐞7'~J #u say>ػ}K>'~J #u <>Pu>QuW"y yy~ yӋ yښyӋ yښy yyx yy~ y  yy yyӻ~ yˋyٚyË yyٚyٚyyyˋ yٚyښyښyٚ ySay>ػ}K>'~J #u ay > ػ}K> '~J #u ay > ػ}K> '~J #㐞7u ~ay>ػ}K>'~J #u Gay>}K>~J #u ay>}K>'~J #u ay > | >PuK> ~J##u >QuK> ~J##u l+ " +$y y  yyx yy~ y  y>tayIayb>tayI>taybayayy fyu fyuWay>㐞7}K>~J #u gy y y~ay>}K>~J #u y y y0y y >Pu ay>}K>~J #u y y yay|y fyt gy yy|ayayy fyu9 fyum fyu fyuayay yyy~ y  yay>}K㐞7>~J #u qy y yay>}K>~J #u "y y y9ay>}K>~J #u >PuK>uJ##u >t yy>t yy>t yyay>}K>~J #u /ay > }K> '~J #u ay > }K> ~J #u y yy~ yӋ yښy  㐞 7yay>}K>~J #u Ry y yiay>| >PuK>~J##u >QuK>~J##u ay > }K> '~J #u >Pu5ay > }K> ~J #u Tyx y yӻ~ yښ yy y y>Pt +ã"+ã$>QuK> uJ##u D+ã"( +ã$>QuK> uJ##u p+ã"@ +ã$㐞8y y$yӻ~ y3ۚyٚyٚyٚyË"yyڇښyښyٚyٚyٚyٚyؓ y7ayayy fyu$ fyuj>Pu ay>}K>~J #u }y, y y>Qu Qay>}K>~J #u y2 y y3ayayy fyt yyay|&y&˚y fyuًӚ㐞8yKӋ˚yњy&yӻ˚y+ڇهњyy yyyӻ˚y+Kهы˚yњyy˚y fytًӚyKӋ˚yњy ,yyyy**,Vy y>`~K>{}J##u,yy@,;}y"+.0y y3ۚy~ y yy y$y~ y3ۚ y2;"|Ly y3ۚy~ y yy y$ۚy~ y㐞83ۚ y022>0|.;2: .;2|+yx yy~ y  yy$+46y yy~ y3ۚ yy y3ۚy~ y" y2;$|Ly yy~ y3ۚ yy y3ۚy~ y"ۚ y622>6|4;2: 4;2|+yx yy~ y  yy>Qt y,yyy,yӻ",y,yyy ,yyy,yӻ',y,yyy,㐞8yyoy++++++$+.+8+B+L+V+`;jKt[~k~& 3HU(b2b<bFbPzZn[\]_nd9$ x*1AHHHHZaaaaw",6@JT^hr|ut %  5( E&= U0 e:^ 6 uD & Nu Xj`bnlv@A)fT㐞8%`5E{Unnnsss s 4>HR\fpz Ai ) 6 9. 98 9B FL SV `` mj u~ u u          D Q {  2 < F P Z d n :x = = = J t           E " [ , ^ @ ^ J ^ T k ^ h r |      S    0 : D N X  b , l 9 v b o    㐞8   > -H dR \ f p z C r u u u       ' Qn.[Bek$8LgVjjjtj~wFS{ !+(52K<rFITbPZdx?&<Lt",6JT^hr||)>AAAZ:jbz5&0DNXlv2Bk&)) )6 ^*k4>㐞8HR\pz;QTTTat9`$v.8BLVjt~)&<Iq (2<FPdnx=Nw|||",64@DJI^IhIra|6]bbbz &O0v:{{{ E4E]5πL|t tc tY:s*܀wGّ͵S㐞8| t3ۀrt<~) t֊ߊwt!uދ׋?t ?t psMuE+׋s u vT tN uvEފ x t5qwrt st$ ǣƣyþ4 tM t݋=2쁀pȀĀPӓX x ut~ˀɀSS X؃tXþ.MD tC t2쀀*pĀPɀT$2΀]-2ɀπV ‹t[\8;s3sNsþ+Ћs ҉nu8st㐞 8[6fh>stgXSH>stWXf^Sˀ>stDf` t ;r;sFFXSCuPhPRSj3 [ZX3shÉ&\Scr QR3ɋZYVW򥥇ڃ?t U_^[ˉ&\QRVWp%S [_^ZYˋދ tsLQVWw;v;_^u;%!Y˾˾˿˿ˉ6B>D)6B>Dˉ6B>D6B>DˏF^&VV&FF&\UVWPQRSF[ZYX_^]Syntax erroRETURN without GOSUOut of DATIllegal function ca㐞9lOverfloOut of memor Subscript out of rang Division by zer Type mismatcOut of string spacString formula too compleNo RESUMRESUME without erro2FIELD overflo3Internal erro4Bad file numbe5File not foun6Bad file mod7File already ope9Device I/O Erro:File already exist=Disk ful>Input past en?Bad record numbe@Bad file namCToo many fileDDevice UnavailablFDisk Write ProtecGDisk not ReadHDisk Media ErroUnprintable erroNJL.PX[&HSP`-^ZyUˉCt㐞9K6SB3ۋӉ&\SRlZ[ urq uHCKK$+؋+ڀK;LrKǓNJ>HOOXY&QPY RQ ǣT3^XY)-V+3bH ^.V6^X[SPyX[SPh 2345679:=>?@CFGHD&\ 2345679:=>?@CFGHD.HMM&Z>su=>nt62hXfjs[>hu-$)p%S6nx FSTO 㐞9>suGr t in line]XZUY+ at address]_ZU :.ô&=t t ĮsG:`3ۭ t;s ;rFF tInternal Error - No Line NumbeKYBDSCRNLPT1%"77"77"8"w u"ؘ.^ t.p &\V!u^P&\\dXPP&\Vu!^t P&\Pˉ&\P VS!t^<uY4^Xˉ&\P&\Pۉ&\P҉&\PS?t-_߰ItOtRtAu [XX,QS˳[Yˉ&\P㐞9VPV u2 ^XSQRWڋwx u_ZY[Ct K t wd SW._[OOuûj V6l u^V^V6l u^dV6l u^V6l u^V6l u^V! t^WSPWSPD. x2ؘ.^ tXP.vX[v_>SV6XuÄ&tك3و\D.T/JtwS[j<"t,N3ɬ:t A,tNـ,uNO :tAi*t3ۋӋ<&tNw :v3QˋݸuV^Yu1<%t,<#t(t* }r y y^:t&<t[y㐞93Úy<-t<+uFNû wx3p‹ t3KPWUSRXXXXXЃr t),0r < wu Nì< t< t< tÉ&\Ht<t6lilxr t< t<"u,u ""r>"t%< tN< u,tn< t< u t,t t :t :tJ_s<"t< u'Rr"< t<,t< ulG.x 7r< t2 @- t t"uu RT Zû;t ƚ0y7 [˃?t:Vw4 ޷^PF t L طX&\ uRSڏZX`pPSRPtuJ3۸XZ㐞9[ ~PQRVW񭒋4 t?Jy;8$}K+ʓ+~'$u QVW_^Yu+_^YZX3QʋӻryYˉ&\Q3 &\Q+Yj&\J|tRP+~;}XZB[`&\R tA|QPˊŠAXYZˉ&\R &\ڃ?tSPS_[CXZ` |tR;~ }3bZ`z ty$6Àr  GBs@@g  0zW_SRP y3XZ[W_SRPπ 㐞 9tXZ[ˉ&\PQD I&\PQ>&\PQV^. y ,VR yN> uGKD&\PQ3 t1rڊݑ*͊r;t$π> tp+ y"xYXˁu t> tt7 x&\PQD &\PQu x ݀> ts uGD Lt LÇ ~1 |-;w)VWQI+;rȋ; v tY_^_&G>&&&G>טPW&\U ,<u_]_>rw7vww>Zt6t8<,t&p?Redo from stary>|ty2 uZ㐞:W1OverfloVWQ6NN +&6t Y_^u&.4Ӛyڋ94/*%  6.<tJ<t+>u% >uP@ >rOw >u>uR,!а"_"T < uFY,>tLĴ*̊-v2 P8Xt u P*Xr:v t 3ì t7w="&, $㐞:{-y>r>@$r yF$0lll։&\\VXt <t 6l^~aaaasaaaaaaa;jTaaa&QRS3Ɉ]3Ҵ^[ZYÀ>]t ]\ ]\&QRS3ɊhŇ02< tI<u  tA:< u Ktu < r >ht :&huM t&hP:&hu2> tCXPVC>u63t=t5H;r6+tH+^XÓ7FL6;v[빰><rS6L㐞:6=ttuNN@G7FPSVW6LH=t#u󫓋;wu)@;t $+rF5>_^[X during G.C` Z Internal Error - String Space Corrup t$>t$VS6w\Ӌ^ú^`>sGQWH_YQVWA_^YSt>r[s]PÇGXPRC+rCCNCZXxPQRVWQSʋ2[^wA_^ZYXPS_;Lr;Nw @ G[;uX[X# RQ3BJYS_[ZË>L>N@$+-E㐞:>E>Microsoft BASIC Compiler Runtime Version 5.35 (C)Copyright Microsoft Corp. 1982,83 $f9Ü3ء&R&T&V&X&Z&\HPSR!ZtPw @CP[Ã>Put@PtQVWP@F_^YR>^u rʻt  tض+ڰ t-d^dP>uo>\DɀtPZހԊYQ́twr t'RZZϿ+ϰ0AOÿŊ㗊܊ǕƊYQ́t wrt ׿㐞: +Tl\sTl\̓0-Gf3Ғ';r03d dr 00 00ÿ>Ë;s"++0<5r O<:rA1O0A*ԿePSV36l t$D.u<u t+ tK ^[XP6lllX6llslPX$'@'.P$XtXV^ʋw23&G&T&%q&('u&&&y&}&<u|)t(QRTa!ZYÀ<t(|)t3ۀ<t8\*u黀*\*x3uKA<\'uQRSTL33[ZY3ۊ\2㐞 :ÈT/D*Êd2Êd/SH[À<t|*tS3ۊ\)*\*L*@3[ À|)t[ur<uD)D*Ë;tCS[<t|)uP2XS3ۊ\)@3[D)< uD2< T2RQ>u uQrYV|x ^">uhT>u[!!u#!u>u߀>tD<t <t<u`YZÃ|u |u|"V^u&' 3r<tB3 |'3D2붃l"sL$JQRS[ZYèuB t|߉JDŽSt u23ۉZ㐞;L3ˉ+;rʨt0sCVQ6>sY^)+3 uVQ6>sY^ $PQRSC;ut K\'D)D*\"D$t)[ZYXD'EW!^ uD)D* D):"AX}t}u;tVWFG _^u}_ڻ0 ڿxG= u ?vt:|3㐞;:+ ~ K0t .0d+It.E+ yڴ->uH 00~66PDP t$3XPDPD tXPDP3ۀ|tK3ۀ|t K3ۀ>tK &&6^P&>t&XV6s؇QsYˇQcYˇQ>ttQ{YQ?Y>tkYu#u3ɉYˇeQPSW,v&++r$: 2O_[XVQNNY\uFF^W_W_. ..㐞;.. // ;/N/3۸.P&< s<sf. .:tN.d^XƇX^ t Kð\ tK<tP\X릈 tE }b t< tA t ˾_ð#W)XM ktuÈsC/*&S[󭑿QV^V^Y66DS>[󭑿QV^V|^Y6666DDDDE4RAXl^y4dPLOT ---- version 1.03~2(C) ACT (Pulsa㐞;r) & ACT (Office Products) Ltd 1983'Enter the name of the plot file [.PLT] .Y.PLTI WRITER-80 WRITER-81, DEVEND$ MOVETO. LINETO8 MOVEBYB LINEBYL PENT CIRCLE^ ARCf BARn FILLv LINE~ HOME STEP PRINT SET AXIS MARKER BORDER DEFINE DIRECT EJECT x4 $ FATAL ERROR at line  ,  Plotter type not specified. Undefined plotter operation.@ Parameter out of range.\ Invalid option p in x statement. Invalid 㐞;operation for ACT WRITER No data in input file. $ WARNING at line ' No DEVEND, logical end of file assumed.1 Attempt to print a blank line, operation ignored.#> not yet implemented for ACT WRITERf $ File not found.| M , D R J C W T SCALE TYPE B L H G  P ORIGIN DIREC SIZE MODE Q S X N LINES( AREA0 U6 F&>[{ع+F33ь+ȁv㐞;{3yb5~P$L~ye&X4#]I``Pd ]xEco#Ƥ~@zZrN vH Tʚ;  !!!"""####$$$%%%&&&&'''㐞;((())))***+++,,,,---...////0001112222333444555566677788^_B";5J }#~t'Xv%F*Ӯw-;uD1mA4-q7|tP;d<>b}JlA]E62w8HMľfK:|O\ 5$4RKB.aUPo ̼ Y$ /\[_6A_p caw+fCzՔVijl7mGG'peXQsOnwףp= #zL} Hz@PC$t >(kn@C:h* 51_c.1@v:k ^# bx-Àz&XƐn2xʴW ?h)͡SЅ@aQYԦo%㐞 ; 'N x9? 6!OgI#E@|o|p+L67EV߄vl: {Η@H½p PvP?<&Ok8и'ƫ7Cưe\{2~]30b/5`=! C)/{QFZ$+vﶓ+髤8UqfclN@< 'PKPEe35DNn"~h!II,k  j0 0 TeB׳]\);8zr1r160*.*㐞<㐞<WRITER-80 LINE TYPE 0 BORDER 0 0 PEN 0 MOVETO 200 1000 LINETO 200 1500 ARC 300 1500 100 180 90 1 MOVETO 300 1600 LINETO 600 1600 ARC 600 1700 100 270 0 0 MOVETO 700 1700 LINETO 700 1800 ARC 800 1800 100 180 90 1 MOVETO 800 1900 LINETO 1620 1900 ARC 1620 1800 100 90 0 1 MOVETO 1720 1800 LINETO 1720 1300 ARC 1620 1300 100 0 270 1 MOVETO 1620 1200 LINETO 1000 1200 ARC 1000 1100 100 90 180 0 MOVETO 900 1100 LINETO 900 1000 ARC 800 1000 100 0 270 1 MOVETO 800 900 LINETO 300 900 ARC 300㐞< 1000 100 270 180 1 CIRCLE 300 1500 50 CIRCLE 300 1500 40 CIRCLE 800 1800 50 CIRCLE 800 1800 40 CIRCLE 1620 1800 50 CIRCLE 1620 1800 40 CIRCLE 1620 1300 50 CIRCLE 1620 1300 40 CIRCLE 800 1000 50 CIRCLE 800 1000 40 CIRCLE 300 1000 50 CIRCLE 300 1000 40 BAR 1000 1400 1500 1700 MOVETO 200 300 LINETO 200 500 LINETO 1720 500 LINETO 1720 200 LINETO 1300 200 LINETO 1300 300 LINETO 200 300 MOVETO 260 300 LINETO 260 490 LINETO 250 500 MOVETO 350 500 LINETO 340 490 LINETO 260 490 MOVETO 3㐞<40 490 LINETO 340 300 MOVETO 1000 300 LINETO 1000 500 MOVETO 1500 500 LINETO 1500 200 MOVETO 100 1500 LINE SCALE 30 LINE TYPE 1 LINETO 1820 1500 PEN 1 LINE SCALE 5 LINE TYPE 1 MOVETO 1300 1900 LINETO 1300 1700 MOVETO 1300 1400 LINETO 1300 1200 MOVETO 760 300 LINETO 760 490 LINETO 750 500 MOVETO 850 500 LINETO 840 490 LINETO 760 490 MOVETO 840 490 LINETO 840 300 MOVETO 1580 200 LINETO 1580 490 LINETO 1570 500 MOVETO 1670 500 LINETO 1660 490 LINETO 1580 490 MOVETO 1660 490㐞< LINETO 1660 200 PEN 2 LINE SCALE 20 LINE TYPE 1 MOVETO 300 1700 LINETO 300 200 MOVETO 800 2000 LINETO 800 200 MOVETO 1300 2000 LINETO 1300 1900 MOVETO 1300 1200 LINETO 1300 100 MOVETO 1620 2000 LINETO 1620 100 PEN 3 LINE TYPE 0 FILL 200 300 260 500 0 25 3 FILL 340 300 1000 500 0 25 3 FILL 1500 200 1720 500 0 25 3 PEN 0 MOVETO 1320 0 LINETO 1320 80 LINETO 1920 80 PEN 2 MOVETO 1380 25 PRINT ACT WRITER 80 1/9/83 HOME DEVEND 㐞<WRITER-81 DEFINE AREA 0 LINE TYPE 0 BORDER 0 0 0 BAR 2000 0 2600 100 ARC 400 1000 100 180 270 0 MOVEBY -100 100 LINEBY 0 500 ARC 400 1500 100 90 180 0 MOVEBY 100 100 LINEBY 400 0 ARC 800 1500 100 0 90 0 ARC 1000 1500 100 180 270 0 LINEBY 700 0 ARC 1700 1300 100 0 90 0 MOVEBY 100 -100 LINEBY 0 -500 ARC 1700 800 100 270 0 0 MOVEBY -100 -100 LINEBY -1100 0 ARC 600 800 100 180 270 0 ARC 400 800 100 0 90 0 PEN 5 CIRCLE 400 1000 50 CIRCLE 400 1500 50 CIRCLE 800 1500 50 CIRCLE 1700 1300 5㐞<0 CIRCLE 1700 800 50 CIRCLE 600 800 50 PEN 2 BAR 1000 1000 1500 1200 BAR 300 200 1800 250 BAR 1000 100 1500 200 BAR 1000 250 1500 350 BAR 2300 700 2350 1600 BAR 2200 1000 2300 1200 BAR 2350 1000 2450 1200 LINE SCALE 10 LINE TYPE 1 PEN 3 MOVETO 400 1700 LINEBY 0 -1600 MOVEBY 200 0 LINEBY 0 800 MOVETO 800 1700 LINEBY 0 -1600 MOVETO 1700 1500 LINEBY 0 -1400 MOVETO 200 1500 LINEBY 2250 0 MOVEBY 0 -200 LINEBY -950 0 MOVETO 400 800 LINEBY 2050 0 MOVETO 2550 1000 LINEBY -2350 0 PEN 1 㐞< MOVETO 2050 40 PRINT DRAWING 1A 24/6/83 HOME DEVEND s contained in its own Sub-Directory. ************************************************************************* 㐞 <. w .. w GSXBASCMOBJ Fl3GSXBASCMASM Fl README DOC ڍ*x!㐞=A;CODEDATAEXTRASTACKhhhhcaUPSQRVWތȎػӃFMMCC7CCs..&Ȏ..&_^ZY[X] h+]38;qGN] qҢq Ġǐ GSXm  @` @`!Aa   !A!!#A%a'+-/㐞=; MSBASIC COMPILER TO GSX GRAPHICS INTERFACE PROGRAM ; ; REVISED:- ; 11/10/84 ; TO RESOLVE PROBLEMS DUE TO INSUFFICIENT STACK IN PROGRAMS ; COMPILED WITH MSBASIC COMPILER. ; ; PROVIDES FOR COMMUNICATION WITH GSX FROM COMPILED ; BASIC USING CALLS TO 'GSX' ; FORMAT: ; ; CALL GSX(ARRAY1,ARRAY2,ARRAY3,ARRAY4,ARRAY5) ; STAKSIZE EQU 1024 ; MSBASIC COMPILER DOES NOT HAVE SUFFICIENT STACK FOR SOME GSX ; OPERATIONS SO A TEMPORARY STACK HAS BEEN IMPLEMENTED IN THIS ; MODULE. THE EQUATE STAKSIZ㐞=E ABOVE DETERMINES THE SIZE OF THE ; TEMPORARY STACK. IF YOUR MEMORY LIMITS ARE TIGHT, THEN TRY ; DECREASING STAKSIZE (BUT DON'T FORGET TO RETEST YOUR PROGRAM ; AFTERWARDS). ; ; IF YOU ARE USING A COMPILER VERSION WHICH ALLOCATES SUFFICIENT ; STACK SPACE (ie MICROSOFT BUSINESS BASIC), OR ARE NOT CHANGING ; WORKSTATIONS DURING YOUR PROGRAM (OPEN WORKSTATION BEING THE ; MOST STACK CONSUMING CALL TO GSX IF THE SPECIFIED DRIVER IS ; DIFFERENT TO THE CURRENT ONE), THEN TRY REMOVING THE LINES OF ; CODE㐞= COMMENTED ';*' BELOW TO SAVE MEMORY. EXTRA SEGMENT PUBLIC 'EXTRA' EXTRA ENDS STACK SEGMENT PUBLIC 'STACK' STACK ENDS DATA SEGMENT PUBLIC 'DATA' DATA ENDS CODE SEGMENT PUBLIC 'CODE' ASSUME CS:CODE,DS:DATA,ES:EXTRA,SS:STACK ; PUBLIC GSX GSX PROC FAR ; ; STACK ON ENTRY: ; SP -> | RET OFFSET | ; 2 | RET SEGMENT | ; 4 | ARRAY 5 OFF | ; 6 | ARRAY 4 OFF | ; 8 | ARRAY 3 OFF | ; 10 | ARRAY 2 OFF | ; 12 | ARRAY 1 OFF | ; BEGIN: PUSH BP M㐞=OV BP,SP ; POINT INTO STACK PUSH AX ; SAVE THE WORLD PUSH BX PUSH CX PUSH DX PUSH SI PUSH DI PUSH DS ; SAVE REGS PUSH ES MOV SI,DS ; SAVE DS IN SI MOV AX,CS ; SET UP DS MOV DS,AX MOV BX,OFFSET ARRAY ; OFFSET OF TABLE FROM START MOV DX,BX ; SAVE IN DX FOR GSX ADD BP,14 ; POINT TO ARRAY 1 OFFSET ON STACK MOV CX,5 ; FIVE POINTERS TO CONSTRUCT SETUP: MOV AX,[BP] ; GET ARRAY OFFSET MOV [BX],AX ; COPY INTO TABLE DEC BP DEC BP ; POINT TO NEXT STACK EN㐞=TRY INC BX INC BX ; SET-UP SEGMENT ADDRESS MOV [BX],SI ; USING OLD DS SAVED IN SI INC BX INC BX ; BUMP TO NEXT ENTRY LOOP SETUP ; FILL TABLE MOV CX,473H ; GSX COMMAND CLI ;* SWITCH TO LOCAL STACK MOV AX,SS ;* MOV CS:WORD PTR OLDSS,AX ;* MOV CS:WORD PTR OLDSP,SP ;* MOV SP,OFFSET STAKTOP ;* MOV AX,CS ;* MOV SS,AX ;* STI ;* INT 224 ; GO TO GSX CLI ;* BACK TO BASIC STACK MOV AX,CS:WORD PTR OLDSS ;* MOV SS,AX ;* MOV SP,CS:WORD PTR OLDSP 㐞=;* STI ;* POP ES POP DS POP DI POP SI POP DX POP CX POP BX POP AX POP BP RET 10 ; GSX ENDP ; ARRAY DW 10 DUP(0) ; ARRAY POINTERS FOR GSX GSXSTAK DW STAKSIZE DUP(0) ;* LOCAL STACK STAKTOP: ;* DW 10 DUP(0) ;* IN CASE OF STACK OVER-RUN OLDSS DW 0 ;* SAVE AREA FOR OLD STACK WHILST IN GSX OLDSP DW 0 ;* ; CODE ENDS END BEGIN 㐞= These files; GSXBASCM.OBJ GSXBASCN.ASM are temporary replacements for the Compiled BASIC to GSX interface as supplied on the MSBASIC Compiler disk. They fix a bug whereby in compiled (but not Interpreted) programs the system "Hangs" after printing. A!CAEaGIKMOQ!SAUa㐞 =.  "..  ACDI OBJ Y. #TACDI ASM M. $hREADME DOC 9)&q㐞>CTLDEVCODED !Uv v v^] IO̊t㐞>name ctldev title Control device driver ; Interfaces Compiled Microsoft basic to the control device driver ; public IO cdev equ 252 code segment BYTE 'CODE' assume cs:code IO proc far push bp ;save environment mov bp,sp mov si,[bp+12] ;bx device number mov bx,[si] mov si,[bp+10] ;command mov cx,[si] mov si,[bp+8] ;data mov dx,[si] int cdev ;make the call to device driver mov bx,[bp+6] mov 㐞> [bx],ax pop bp ;get old environment ret 8 IO ENDP code ends end s contained in its own Sub-Directory. ************************************************************************* 㐞>November 1984 Control Device Documentation ****************************** 1 INTRODUCTION The Control Device driver is a generic interface to I/O functions across the whole Apricot range. It provides the applications programmer with a very easy method of writing I/O routines. Because of the generic and standardised nature of the Control Device, applications using it are portable across the Apricot range. All I/O accesses should be made via㐞> the Control Device instead of directly to the hardware as this permits portability of the applications across the Apricot range. Calls and interrupts to the Control Device are validated and passed to the relevant device driver for execution. It thus provides applications programmers with a simplified method of using the device-driver routines in BIOS . For example, the same routine can be used from within a program to access all devices including the floppy disks, serial I/O p㐞>ort etc. Note that MS-DOS calls to the BIOS are also routed via the Control Device. The Control Device is currently implemented in the F1 and Portable models, and a fully functional version for the Apricot PC and Xi machines will be available in the near future. Currently a limited form of the Control Device is available on the Apricot PC and Xi range. This is a subset of the Control Device described here, and functions not supported by PC and Xi are so marked. 1.2 Using the C㐞>ontrol Device The Control Device allows for the setting and interrogating of various BIOS driver parameters by application programs, and of the ROM/RAM BIOS interface. For example, the Serial port driver can be initialized, and Baud rates etc. can be set and reset as required. Note that initializing a driver (COM = 0000) causes that driver to be re-initialized to the boot state as described in the previous chapter. For example, initializing the screen driver causes the screen to㐞> be cleared and all attributes reset. When using the Contol Device and BIOS to access disks, care should be taken to avoid corrupting disks. Two methods of calling the Control Device are provided: via an interrupt, suitable for assembly- level programming, or by a CALL IO used from a high-level language (e.g. MS-Basic). To access the Control Device via an interrupt, use INTERRUPT 0FCH. Parameters are passed and returned via registers: ENTRY: 㐞 > BX = Device number (DEV) CX = Command (COM) DX = Data (DAT) Optionally DX:SI is a double word pointer to a data table. This is dependent on Device and Command type. (DX = Segment, SI = offset). EXIT: AX = Returned data/status (RET) Optionally, additional data may be returned in the data table (see above). All registers except AX are preserved. DEV, COM, DAT and RET are the equivalent words when CALLing the ro㐞?utine, and the registers are referred to by those names in the text for particular commands. To access the Control Device via a call, use FAR CALL TO 0600H. Parameters are passed via the stack, and four stack entries are required. These are four word- length pointers to parameters in the current Data Segment. First Parameter pushed: Word Pointer to Device Number (DEV) Second Parameter pushed: Word Pointer to Command (COM) Third Paramete㐞?r pushed: Word Pointer to Data out (DAT) Fourth Parameter pushed: Word pointer to Data/Status return (RET) Optionally the third and fourth parameters form a double-word pointer to a data table. In this case the third parameter is the segment address and the fourth is the offset. The data table may be used for data out and return. All registers are preserved. 1.3 Device Numbers Valid device numbers (DEV) are as follo㐞?ws:- ASCII HEX Device 1 31 Screen Driver 2 32 Keyboard Driver 3 33 MicroScreen Driver 4 34 Serial I/O Driver 5 35 Parallel I/O Driver 6 36 Mouse Driver 7 37 Clock Driver 8 38 Sound Generator / Key click / Bell 9 39 Floppy Disk Drivers @ 40 Winchester㐞? Disk Drivers A 41 Modem Board Drivers B 42 Cache / Graphics / IBM configuration 1.4 Returned Status Codes These codes are returned by any device when an "Initialize Device" call (command '0'), or I/O command is issued: 0000H - Device present and on- line, status OK 8000H - Write Protect 8001H - Unknown Unit 8002H - Not Ready 8003H - Un㐞?known Command 8004H - CRC Error 8005H - Bad Request Length 8006H - Seek Error 8007H - Unknown Media 8008H - Sector Not Found 8009H - Printer out of Paper 800AH - Write Fault 800BH - Read Fault 800CH - General Failure FFFFH - Device Error (also invalid device/command) (FFFFH is equivalent to -1 in Basic) Note: These codes may be returned in place 㐞?of any codes that are returned in response to specific commands for devices listed below. Some status returns set the 0200H bit to indicate device busy. Calls to non-existent device drivers are trapped by the Control Device, and return Device Error (FFFFH). No other action is taken. 2 Device-Specific Commands The following sub-sections list all commands available for each device type. Symbols in the left-hand column indicate where commands are not supported by particular㐞? models. These are as follows: # - Not currently implemented on Apricot pc, xi. % - Not implemented on Apricot Portable. $ - Not implemented on Apricot F1. Model-type can be determined by reading the one-byte value at 401H. (i.e. the Pointers/Constants area). 0 = Apricot pc, xi 1 = Apricot Portable 2 = Apricot F1. 2.1 Screen Driver DEV = 0031H COM = 0000H Initialise Driver DAT = not used RET = 0000H, ok 㐞? COM = 0001H Get/Set Text/Graphics Display Mode DAT = 0000H, Set Text Mode DAT = 0001H, Set Graphics mode RET = setting (current if DAT invalid) COM = 0002H Get/Set Display On DAT = 0000H, Display on DAT = 0001H, Display off RET = setting (current if DAT invalid) COM = 0003H Copy virtual screen image to real screen (if option installed) DAT = 0, Update Colour scr㐞 ?een (F1 & Portable) DAT = 1, Update LCD screen (Portable) RET = 0000H COM = 0004H Print single character DAT = Character to print (lower byte) RET = 0000H Note: the use of INT 0F1H is somewhat faster COM = 0005H Print string DEV and RET (DX:SI) is a pointer to: WORD number of characters to output DWORD pointer to string RET = 0000H (returned) 2.2 Keyboard Driver, DEV = 0032H 㐞@ COM = 0000H Initialise Driver DAT = not used RET = 0000H, ok RET = 0001H, keyboard missing COM = 0001H Get/Set Auto-repeat DAT = 0000H - Disable auto-repeat DAT = 0001H - Enable auto-repeat RET = setting (current if DAT invalid) COM = 0002H Get/set Auto-repeat lead-in delay (20ms intervals) DAT = 0001H - 00FFH (times 20ms) RET = setting (current if DAT inv㐞@alid) COM = 0003H Get/set Auto-repeat rate (20ms intervals) DAT = 0001H - 00FFH (times 20ms) RET = setting (current if DAT invalid) COM = 0004H Get/Set keyboard fall-through mode DAT = 0000H - keys interpreted by BIOS DAT = 0001H = Raw up/down codes passed to DOS RET = setting (current if DAT invalid) Note: the infra-red keyboard only produces downcodes, and no code is generated for SHI㐞@FT or CONTROL keys. Downcodes are Apricot compatible. COM = 0005H Flush keyboard input buffer DAT = not used RET = 0000H COM = 0006H Reset Keyboard control/shift status and clear downcode buffer. DAT = not used RET = 0000H COM = 0007H Get/Set HELP key detection in fall-through mode. DAT = 0000H - HELP key terminates fall through mode. DA㐞@T = 0001H - HELP key ignored. RET = setting (current if DAT invalid) COM = 0008H Place data in keyboard buffer DAT = ASCII data (lower byte) RET = 0000H - ok RET = FFFFH - no room in buffer (bell sounds) COM = 0009H Sound the bell DAT = not used RET = 0000H COM = 000AH Return number of keys in keyboard buffer DAT = not used RET = number㐞@ of keys in buffer (0 = none) COM = 000BH Get Key from Keyboard Buffer (waits if none available). DAT = not used RET = ASCII key data (lower byte). COM = 000CH Return next character in queue but do not extract it (look-ahead). DAT = not used RET = 00XXH - next character in buffer RET = 0FFFFH if no characters. COM = 000DH Place string in keyboard buffer DAT (DX:SI) 㐞@is pointer to: WORD Byte count (80 max. not checked) DWORD Pointer to string RET = 0 if string fitted COM = 000EH Get string from Keyboard buffer DAT (DX:SI) is pointer to: WORD Byte count DWORD Pointer to string space RET = 0 COM = 000FH Get/Set Keyboard status DAT: DH contains the AND mask and DL the OR mask for the status byte. Status 㐞@byte is returned in AL. 0 = off, 1 = active. bit 0 = Ignore HELP key in raw mode bit 1 = STOP mode on bit 2 = CALCULATOR mode on bit 3 = SHIFT LOCK on bit 4 = raw mode on (raw downcodes sent direct to DOS) bit 5 = VOICE LED on bit 6 = KEYBOARD LOCK on bit 7 = CAPS LOCK on RET = Status byte For example, to get the current status without changing any, send DAT = 0FF00h (status is AND㐞@'ed with 0FFh, then OR'ed with 00h - end result is no change). To set the STOP mode on send DAT=0FD02h, etc. 2.3 MicroScreen Driver, DEV = 0033H COM = 0000H Initialise Driver DAT = not used RET = 0 COM = 0001H Print character (lower 8 bits of data word) DAT = character to print (lower byte, DL) RET = 0. COM = 0002H Send character straight to Micr㐞 @oScreen/Keyboard as raw, non-interpreted, output. DAT = raw data to keyboard unit RET = 0. 2.4 Serial Port Driver, DEV = 0034H COM = 0000H Initialise Driver DAT = not used RET = 0. COM = 0001H Transmit Character (lower 8 bits of data word) DAT = Character to transmit (lower byte) RET = 00000H - ok RET = 0FFFFH - failed. COM = 0002H Receive character 㐞A DAT = not used RET = 0FFFFH - no character available RET = 000XXH - received character COM = 0003H Update SIO settings as set by calls 0004H to 0009H, 0018h to 0019h. DAT = not used RET = 0. COM = 0004H Get/Set Transmit Baud rate DAT = 1 to 15, baud rate setting (See table at end of section) RET = setting (current if DAT invalid) 㐞A COM = 0005H Get/Set Receive Baud rate DAT = 1 to 15, baud rate setting (See table at end of section) RET = setting (current if DAT invalid) COM = 0006H Get/Set Transmit bits per character DAT = 5 to 8, bits per character RET = setting (current if DAT invalid) COM = 0007H Get/Set Receive bits per character DAT = 5 to 8, bits per character RET = setting (current if D㐞AAT invalid) COM = 0008H Get/Set number of stop bits per character DAT = 1 to 3, stop bit code (1 = 1 stop bit, 2 = 1.5, 3 = 2 stop bits). RET = setting (current if DAT invalid) COM = 0009H Get/Set Parity Type DAT = 0 to 2, parity type code (data: 0=none, 1=odd, 2=even). RET = setting (current if DAT invalid) COM 㐞A= 000AH Get/Set Transmit XON/XOFF protocol DAT = 0, disabled DAT = 1, enabled RET = setting (current if DAT invalid) COM = 000BH Get/Set Receive XON/XOFF protocol DAT = 0, disabled DAT = 1, enabled RET = setting (current if DAT invalid) COM = 000CH Set/Reset/Get RTS line DAT = 0, reset DAT = 1, set RET = setting (current if DAT invalid) COM = 000DH Set/Reset/Get DTR line 㐞A DAT = 0, reset DAT = 1, set RET = setting (current if DAT invalid) COM = 000EH Set/Reset/Get Transmit enable DAT = 0, disable DAT = 1, enable RET = setting (current if DAT invalid) COM = 000FH Get/Set Keyboard Status DAT = 0, disable DAT = 1, enable RET = setting (current if DAT invalid) COM = 0010H Get CTS line status DAT = not used RET = 0, reset RET = 㐞A1, set COM = 0011H Get DCD line status DAT = not used RET = 0, reset RET = 1, set COM = 0012H Get DSR line status DAT = not used RET = 0, reset RET = 1, set COM = 0013H Set/Reset nulls after CR (carriage return) DAT = 0000H to 00FFH nulls (0 = disabled) RET = setting (current if DAT invalid) COM = 0014H Set/Reset nulls after FF 㐞A (form feed) DAT = 0000H to 00FFH nulls (0 = disabled) Note: ten times the number of nulls will be sent. RET = setting (current if DAT invalid) COM = 0015H Set/Reset auto LF after CR DAT = 0, disable DAT = 1, enable RET = setting (current if DAT invalid) COM = 0016H Enable serial mouse (Serial receive data generates an INT 0FAH 㐞Awith the data in AL). DAT = not used RET = 0. COM = 0017H Disable Serial Mouse. DAT = not used RET = 0. COM = 0018H Set/Reset RTS/CTS protocol DAT = 0, disable DAT = 1, enable DAT = 2, Auto-enables mode RET = setting (current if DAT invalid) COM = 0019H Set/reset DTR/DSR protocol DAT = 0, disable DAT = 1, enable DAT = 2, Auto-enables mode 㐞 A RET = setting (current if DAT invalid) COM = 001AH Set/Reset External SIO control $ DAT = 0, SIO controlled by BIOS DAT = 1, SIO RS232 channel interrupts vectored via interrupt 0F0H. RET: Low byte (AL) = Base SIO port address Order: [base+0] = Ch A data [base+2] = Ch A status [base+4] = Ch B data [base+6] = Ch B status High byte (AH), 㐞B0 = RS232 on channel A, 1 = channel B. COM = 001BH Return next received character but do not remove from queue (look-ahead). DAT = not used RET = 000XXH, received character (0FFFFH if none available). COM = 001CH Flush Transmit Buffer DAT = not used RET = 0. COM = 001DH Flush Receive Buffer DAT = not used RET = 0. COM = 001EH Get Receive Characte㐞Br status (and reset error bits). DAT = not used RET = Status in lower byte as for SIO Read Register 1, i.e. Bit 6 - CRC / framing error Bit 5 - Rx overrun error Bit 4 - Parity error (See also SIO description) COM = 001FH Transmit string DAT (DX:SI) is a pointer to: WORD Byte count DWORD String pointer RET = 0 if string transmitted, or RET 㐞B= error code. Note: Byte Count field is updated with number of bytes transmitted COM = 0020H Receive string DAT (DX:SI) is a pointer to: WORD Byte count DWORD String space pointer RET = 0 COM = 0021H Get/Set receive queue length (512 bytes max) DAT = 1 to 512, queue length RET = setting (current if DAT invalid) COM = 0022H Get/Set transmit queue length 㐞B (512 bytes max) DAT = 1 to 512, queue length RET = setting (current if DAT invalid) TABLE 1 Values for Baud rates are as follows:- 1 - 50 baud 2 - 75 baud 3 - 110 baud 4 - 134.5 baud 5 - 150 baud 6 - 300 baud 7 - 600 baud 8 - 1200 baud 9 - 1800 baud 10 - 2400 baud 11 - 3㐞B600 baud 12 - 4800 baud 13 - 7200 baud 14 - 9600 baud 15 - 19200 baud Values for stop bits are as follows:- 1 - one 2 - one and a half 3 - two Values for Parity type are:- 0 - no parity 1 - odd parity 2 - even parity 2.5 Parallel I/O driver, DEV 㐞B= 0035H COM = 0000H Initialise Driver DAT = not used RET = 0 COM = 0001H Return number of bytes free in printer output buffer (if less than 3 regard as full) DAT = not used RET = free bytes. COM = 0002H Get/Set FAULT line status detect $ DAT = 0, disable DAT = 1, enable RET = setting (current if DAT invalid) COM = 000㐞B3H Get/Set SELECT line status detect $ DAT = 0, disable DAT = 1 - enable RET = setting (current if DAT invalid) COM = 0004H Get/Set PAPER ERROR line status detect $ DAT = 0, disable DAT = 1, enable RET = setting (current if DAT invalid) COM = 0005H Get/Set Auto LF after CR enable DAT = 0, disable DAT = 1, enable RET = setting (current if DAT inva㐞Blid) COM = 0006H Get/Set Serial/Parallel PRN: device output DAT = 0, Parallel PRN: DAT = 1, Serial PRN: RET = setting (current if DAT invalid) COM = 0007H Print character on device set by call 0006H (Serial or Parallel) DAT = Character in lower byte (DL) RET = 0, ok, or RET = error code COM = 0008H Flush pr㐞 Binter output buffer DAT = not used RET = 0. COM = 0009H Transmit string (serial or parallel) DAT and RET (DX:SI) is a pointer to: WORD byte count DWORD Pointer to string RET = 0 if string transmitted, or RET = error code. COM = 000AH Return output status DAT = not used RET = 0 ok, or RET = Printer busy, or no paper code. 2.6 Mouse driver, DEV = 0036H 㐞C Not implemented 2.7 Clock Driver, DEV = 0037H COM = 0000H Initialise Clock Driver and resets time to 0:00:00 1-1-80 DAT = not used RET = 0 COM = 0001H Set Date/Time DAT and RET (DX:SI) points to data table: WORD Days Since 1-1-80 BYTE Minutes BYTE Hours BYTE Hundredths Of Seconds BYTE Seconds RET = 0. COM = 0002H Get Date/Time DAT and RET (DX:SI㐞C) points to 6-BYTE data space for above table. RET = 0. 2.8 Sound Generator / Key click / bell, DEV = 0038H COM = 0000H Initialise Sound Driver DAT = not used RET = 0. COM = 0001H Get/Set Key feedback click volume DAT = 0 to 15 (0 = max, 15 = min) RET = setting (current if DAT invalid) COM = 0002H Get/Set bell volume DAT = 0 to 15 (0 = max, 15 = min㐞C) RET = setting (current if DAT invalid) COM = 0003H Set channel 2 volume $ DAT = 0 to 15 (0 = max, 15 = min) RET = setting (current if DAT invalid) COM = 0004H Set channel 3 volume $ DAT = 0 to 15 (0 = max, 15 = min) RET = setting (current if DAT invalid) COM = 0005H Set channel 2 frequency $ DAT = 0 to 1023 (0 = max, 1023 = min) RET = setting㐞C (current if DAT invalid) COM = 0006H Set channel 3 frequency $ DAT = 0 to 1023 (0 = max, 1023 = min) RET = setting (current if DAT invalid) COM = 0007H Set bell frequency DAT = 0 to 1023 (0 = max, 1023 = min) RET = setting (current if DAT invalid) COM = 0008H Set bell duration DAT = 1 to 255 (times 20ms) RET = sett㐞Cing (current if DAT invalid) COM = 0009H Sound Bell DAT = not used RET = 0 COM = 000AH Sound Click DAT = not used RET = 0 2.9 Floppy Disk drivers, DEV = 0039H COM = 0000H Initialise Drivers DAT = not used RET = 0 COM = 0001H Set Drive number for format DAT = 0 or 1 (floppy 0 & 1) RET = setting or 0FFFFh if invalid 㐞C COM = 0002H Set Segment address of Track image for Format DAT = segment address of image RET = 0 COM = 0003H Set Offset address of Track image for format DAT = offset address of image RET = 0 COM = 0004H Format Disk (floppy only) DAT = 0 70 track SS DAT = 1 80 track SS DAT = 2 80 track DS RET = 0, ok, or Error status 㐞C COM = 0005H Return status of requested disk DAT = 0 or 1 (drive 0 or 1) RET = status as WD279X type 1 status, or RET = 0FFFFH if invalid. COM = 0006H Set disk status to swapped DAT = 0 or 1 (drive 0 or 1) RET = 0, or 0FFFFH if invalid. COM = 0007H Return disk type DAT = drive number (0 or 1) RET = 0 70 track SS floppy 1 80 track DS floppy 㐞C 2 80 track DS floppy 80H No drive fitted COM = 0008H Return drive type DAT = drive number (0 or 1) RET = 0 70 track SS floppy 1 80 track SS floppy 2 80 track DS floppy 80H No drive fitted COM = 0009H Check For Disk Swapped DAT = drive number (0 or 1) RET = 0 Disk not swapped 1 Disk swa㐞 Cpped 2 No Disk Note: If RET = 1 is returned, a COM = 6 must be done, else swapped status will be lost. COM = 000AH Get BPB (this should be called whenever a disk has been swapped). DAT and RET (DX:SI) points to a data table: WORD Drive (0 or 1) DWORD Pointer to 512 Byte scratch space RET = return status, and pointer to loaded BPB in DWORD. COM = 000BH Read/Write/Verify/Write with 㐞D Verify. DAT and RET (DX:SI) points to data table: WORD Drive (0 or 1) WORD Command:- 0 = Read 1 = Write 2 = Verify 3 = Write With Verify WORD Starting Logical Sector WORD Number of Sectors DWORD Transfer Address (not needed for verify) RET = status, Number of Sectors field set to number of sectors transferred. 2.10 Winchester Disk drivers, DEV = 0040H C㐞DOM = 0000H Initialise Drivers DAT = not used RET = 0. COM = 0001H Set disk status to swapped DAT = drive number (0 or 1) RET = 0, or 0FFFFH invalid drive COM = 0002H Return Drive type DAT = drive number (0 or 1) RET = 3 5 Megabyte Winchester 4 10 Megabyte Winchester 5 20 Megabyte Winchester 80H No drive fitted COM = 0003H Check For D㐞Disk Swapped DAT = drive number (0 or 1) RET = 0 Disk not swapped 1 Disk swapped 2 No Disk Note: If RET = 1 is returned, a COM = 1 must be done, else swapped status will be lost. COM = 0004H Get BPB (this should be called whenever a disk has been swapped). DEV and RET (DX:SI) points to a data table: WORD Drive (0 or 1) DWORD Pointer to 512 Byte scratch space RET = return status, and p㐞Dointer to loaded BPB in DWORD. COM = 0005H Read/Write/Verify/Write with Verify. DEV and RET (DX:SI) points to data table: WORD Drive (0 or 1) WORD Command: 0 = Read 1 = Write 2 = Verify 3 = Write With Verify WORD Starting Logical Sector WORD Number of Sectors (128 max) DWORD Transfer Address RET = status, also Number of sectors field set to number㐞D of sectors transferred. 2.11 Modem board drivers, DEV = 0041H Not implemented 2.12 Cache/Graphics/IBM configuration, DEV = 0042H COM = 0000H Return status DAT = not used RET = 0, present; 0FFFFH, error COM = 0001H Set/Reset Cache on DAT = 0, reset; 1, set RET = setting (current if DAT invalid) COM = 0002H Set/Reset Graphics/IBM on 㐞D DAT = 0, reset, 1, Set Graphics, 2, Set IBM RET = setting (current if DAT invalid) ***************** E N D o f F I L E **************** Z>DNZ>DNZ> DNZ>ENZ>ENZ>ENZ>ENZ>ENZ>ENZ>ENZ>ENZ> EN㐞Oapricot SOFTWARE APRICOT UTILITY DISK BLACKHOLE DISK 2 PRODUCT CODE : ZC AAG2