IMD 1.17: 1/01/1998 2:36:34 IBM PC CPM86 CSE.C SCREEN EDT Ȏ؎м|-Q|Q|s S|u.O|T|+u *** Error while reading Loader *** Try another diskette. Ȏ؎м<:<4%:<4Otu@O.@u=6<,>tt >AE#.E ð.]AuSQ+gY[CCNJN@%!E E CN JIAN@Q6:>A>Yt A Ë.+6G+E0E+&>}u.02ËGG6E tG 8Ë6:D nul8؎..4K&263N G:IuâI<(rO*CJrôKu ôt?@ABCDEFGHIJKLCSEIN @MNOPCPM86 C QRSTUVWXYCSEDEF 'Z[\SAMPLE C =]^_`}}}MiJJ68DDF uv8DD3PWDDvvF uPs8DD3PWDDtF uvV8DD3P}WDDJAG3FhP6XF=t-3P3PgA3PDD3 aP DDF u6P@6j3P u433 h6j3PD P3PDvDD3FvtDD3P3PS*VF^;u2v DDFF u* FF=ct3P3PA3P3PK@3P$VDD]'IPP^FF=|PP^FF=|$]ø~P6Vv^FvTDDF=~u6]3]Ë]H3plj3F=|]Ív, uv44F-VvƊ^;uvƊPaDDPvDDjj=| j=B3]vyDDpp='| p=3]OvFDDll='| l=3]3]FLCRQF u]Ëv4VP`3PP\=|3FFF=tPPA`v44VP'`PP`IPPA7PPS=|3]ÍPP_MPP6F]Ë]zF3FvPVDD u)vƊƁV PvX^^ƉFF]Ë]*F4F uF]3p|t3]Ë]EF;j~FFPvP6XXF;r VvƊ^;u]}E vvc3vv3F uOhFF6 VF^;|v3vvv,vFP6X4Vx"F6lvX^Ph^ƉF3FFP6X4FF;Fr Vv^;t5FP6nXFl+FPvYv3FgF;l|[v VvPvX^;t1v.DDFF;F|vv3v;]C3P3Pw<3P3P:FF;j|3PvM<3FF;l|F;Fs3]þ Vv^;t vF;} F;| vP0DDv VvƊ^;tCv-DDFF;F|-F;} F;| Pl0DDv8F;l} VvƊ^;uv]B3P3P7;Fv uvƊP/DDF u63PjP:v uvƊP/DD]3BFP6X4F6r3P:rF3Vv^;u vƊPT/DDv6pVv^;| P)/DD+P66:]A 3F6lF^Ph^ƉFvVn^ƉFv, uv6lvY3Vv4XF^;}IFF3FF;F|*vƊ u vvvzF]Ë]@VFP6X4VFFP6X4^+^ t3FF+FPFP6X4FPF uF]6lvX^Ph^ƉFFP6X4FvVn^ƉFv, uv4XF3FF;F|7v uvPvXvvF=}vƸ l+FPvYh3]Ë]?FP43P3P83P3P6 > >3]3] >]C?3h3F3P6F]Ë] ?6 ur6 u3]&+FS6 uL FFPvTDDFt3F vDDFv63F3FFv*DDFvDDFv6 Fv6Y;trt;w3FZv6 3FAv6N3F(v DDFF= FF=p|pFjPvX^P63F8 Fv DDFv DDFv!DDFvFDDFv DDF u 3]]øF[< {k[PzeUE:( F uF]s u ]3]Ë]\< u]ËF=~]Ë;t u]Ë6zVV+t^ t3^;s]øPDDFFF=I;r6zVV+t^ t3^;r V6ƊP6X^;tQ&83Vv,^;t3PDD3])FFl8 u+ u]R6zVV+t^ t3^;sFF]Ë u ]L6~6|6*FF=t ]ËF=t|F|]{:F=~]6DD u]6mDD u]Í66SDDF6SDDF3FPDD3Vv,^;bv6F u?Fvv66 uv6Y F F3PTDDF]Ë]z9F uF]ËFFFF;tr tFF;wFF;FtF]ËF;FwQV+F^ t3PvvNPVF+F^ t3^P6Y+F]NV+F^ t3Pvv/NPVF+F^ t3^P6Y+F]Ë]q86QP# u]Ë u]Ë uPP$ u@PPHQUPPr(PP# u PQDDV+t^ t3P6t_ F uF]Ë u%V+^ t3P6# F uF]Ë u|P%DDVv+t^ t3P6t6%'FPF^;t ]3PF^;tv6t F uF]w6BDD u]3PP" u5PP" uPPN u ]6BDD u ]3PLPDDPPzN u ]øc]Ë](6F=~]63DD u]Í66_ODDFPDD3Vv,^;.v6F u FF]3P_DD3]Ë]5 F u3]D4 u!]v6FF=FFF FFF PDD3FF;Fr Vv^;t83F P2DD P2DD2 u% u 3]^F;l|RvP2DDv Vv^;t+vDDFF;F|v Pg2DDvAg33PDD3]Ë]E4F=~]vvF uF]Ív, uvƸ 3]Ë]3F uF]vvMFF;FtF]ËF;FwQV+F^ t3PvvIPVF+F^ t3^P6Y+F]NV+F^ t3PvvHPVF+F^ t3^P6Y+F]Ë]26F=~]ËF3Fv, u F uFF6,F]Ë]2v,F=| F;l}]Ë;Ft3]ËF6lVp^;l3]Ë]26YP u]Ë u 6 >DD u6=DDPKDDc]Ë]1 6DD u3P6TGF6& u3PP+GF]ËF=|]þVv+^ t3FV+^ t3PPvX^P^P6FPDDv6v F3PDDF;Fs3FF3FV+^ t3PPvX^P^PPvX^P^PFPvX^P6YvVFP u]Í6fVFP uJQF6nVFP u]Í6vVFP u]3]Ë]/ PtDDFFPDD uD3FPDD u-FƁV P6X^^ƉP"DDFF]Ë] vƊPFPX#DD^;tRPDD3Vv^;})+P-#DDPvƊ^;u3]3P]DD]3]Ë]7 6VF3Vv^;}vƊPDD6^4DD]F u F u6tF6|4XF6jF6r4XF3Vv^;}33Vv^;}vƊPDDv+DDMFFFFF;j|)vvvv$3Fvvv]6`F3Vv^;}:3Vv^;}vƊPDDD6h4~DD3FFF;p| PDDvvv]n6>F3Vv^;}vƊPDDvv6NP6FF3Vv^;}vƊPuDDvv6OPK6JF3Vv^;}vƊP(DD6T4bDD]FPx6P4F^PDDv6R4F^PDD]6P4F^P,DDD6R4F^PDD+PDD3PDD4CRcrs]v, uG6~F3Vv^;}vƊP.DD6Ɔ4hDD]v, uG6ƊF3Vv^;}vƊPDD6ƒ4 DD]'v, u 3PDD] 3F3PvF uI6jVFF^;}3P3PF 3P3Pvv,;6jVFF^;}3V6j^;}3PvFv, u3VFP6nX4XF^;|6jVFF^;|(3PvF u 3Pv]ËF;F3Pvr6lvX^Ph^FFF;F| vƊPDDvF uF+Pvvv]_]EF6Vv^;sFF;u HF uFFP6X]F u ]V+^ t3]Ë]];tMF6Vv^;sFF=tFv]Ë]F;t6V6^;s6]Ë]F u VF^;t FFPP ]PP ]Ë]PPi F uF]Ë]s-FPP5 ]Z3PP! ]F64X u 3PP ]$64X uH uP3PP  uHPX]Ë]64X u 3PP ]_Xˎ& A. v  v ûWg؎Ћ&>O3 UF t5x t/PV±$'@'Nuӱ 9nvnX&^3^.U+;&v^.PF^;r PvX^P ^ƉƋ4F uF]øP Pk PD]4F̍v4^Fv4,X ux Pv̊^;t Pv̊^;t PvX6APv̊^;sZPv̊^;v Pv̊Yv́4XwPvXF҉FЉFθF̸FPv4^^ƉFv4,X uv̊ u<Pv̊^;t F́F<>Pv̊^;t F́FFPv4^VF^ƉXF=}P P Pv̊ uv́4Xv,4Xv́4X+F̸>PvЊ^;tvЁ4XF̸PPv ^;uPvvx ^;uPPv] ^;uP P% PPFԉXFPv?P# ]%FFF=|,vV ^ƉƋ4 u v4XF=tPPFF uPv4X5^#PvtXPv^;:PFƊ^;tFFF=|5FF=|@vVPvX^P^ƉƉ^ƉƊPvVF^ƉƊP^;t v4XF=t*PF^#PPvX^P^ƉƊD^;tPvtY PvX^P^ƉƊDPvXPPvtX^#^;t3Pv4^;tPvtX PvtX PvtX v4XPvtX5^# uvv PvX uF uv4VPPv4VFP^;PYPvtXvtPvtX ufPvtvtVFPvV ^ƉXPvtX5^# u F uv4V#PPv4t#t!XZYQRPvtXZTPZPvtX^# uvttXZ uv4t!,\t4XZvtVPnv4V!P^FPYPF^;|1PvVvt^ƉƊ^;t v4XPYPF^+ƙRPvtTY[ӉTF]ËF u#v4 u v4VLvC]Ë]PvtX^# uPvtX^# uPv4^;tqvtvtV PK PP=vt Pvt^Pvt Xvt XPvtX hv4VDDPvtXPvtX^# u Pvt^;tvt vt  vt ]øRPvtt XZY[RFZ3FFF=|vttPvX^RPvtt XZ^_^_;u;rPvX^Pvt^PPFF3RPv4t!XZTPZv4V!PFF=t F=t-3PPPvX^Pvt^P3F F u vF u@PvtY PvX^Pvt Xvtt vttXZ^_+RPvt X^_;u;w&vtt vttXZ^_+RPvt XZ] PvtX^# ugvtvt X^;|Pvt vt^ƉXvt XRPvtt XZ^_RPvttXZ^_;u;r.vt XRPvtt XZ^_RPvtXZTPZFvt PYPvX^^;|PYPvX^Pvt^PPvXRPPvtt XZYK^_RPv4t!XZTPZv4V"P u@PvtY v4XIPvtY#]~vF uPvv P PPF]Ë]UNV]$vvX^FvrF uPvv F]Ë]PF^P u]vFPvtX5^# u v4Vvt u vtVvPPvX^P ^ƉX]Ë]FvF4F^+Ƌ]Ë]Pvv]Ë] FF=|0vV ^ƉƋ4 u vv4Xvp]PF^+PFPvtX^# uO PvtX^# u vjPv4VP'^;@PvtY @PvtX^# uPPX]Ë]FFFv uv4^PdFF uFPvY F uFF uFPvY awrb _FPRPFFPvFF=u F=t3PFFPvFV.F=tF=uPRPvF=u F]ø]Ë]PvY+v4VF^;uP PBP6*Fv4 uvVv4^;r v4Fv4VvXFPvXPvtX^PF^ƁPF^;t+PvtX^PvtYv4VvXFFv4FPvtX^PF^ƁPF^;t(PvtX^PvtYv4VvX]cFP0^;ƸvH uH uP9PF^;ƸvH uHPX]Ë]v1FPvtX^# u 3ҋ]øPvtY#F Pmvt XRPvvvtt XZ^_^_׉VFPvvXZVF?vvvttXZ^_׉VF3ҋ]vt X u$vtt vvXZ^_;u;r9vt XRPvtt XZ^_RPvvXZ^_;u;sp PvtX^# u vPYP^5RPvvXZ^_##RPvt XZTPZPvt Xvvtt vvXZ^_+RPvt XZvt vt X^;vt vt XvvXZ]Ë] P%PF u:PFƊ^;tIvPFF=A}F=P~F@PvXgPvY P PvtVvVPvtVF uvVPvt V( uF]v]Ë]0v4Fv udv4^PFF=.t:F=!|]ËF uv,4XFPv4^XFPvX]Ë]PPF^^#ƉF6*Fv4F uvVvtX^;sPF^PvtX^;sMPvX^PF^ƁFv4VvXPvtX+F^+PvtXFPvX vtXFv4VvX FFSF uPF^PF u%FPvtXFPvXPvYF]Ë]U؎v~N;rNO]OPvv]Ë]9vKDDFPvtX^# uP PPDD3FvVvX^;r3VvDDF^;|vƋFvPvtX^# uF=tvt ,v,nF= tR3VvDDF^;|JF= tv 0vtFPvtY F= t@PvtX^# uPFPX]Ë]PvtX^# uPvtY#vD]Ëvt vt X^;} PvtX^# uvDDPvtX^# uOvtvt X^;t*vtXRPvt TY[ӉTvt 3vt X uvt 3v4DDvt vt X^;}]Ëvt PvtX]Ë]vF u]vF uv]øPFPvvP5FvvF u]ø]Ë].vV4XF^;s]Í44X^+ƉFvƋYF]Ë]U؎~NF]FFv4^Pv4^X uF]Ë]v4XFv4^ uPF+F^ t3]Ë]@FPa^;~ zPF^;~PvYF]Ë]vF u]vPFv,F u]ø]Ë]vFPvtX^# uP PMP&PvtX^# uwFvVvX^;r^ Pv^;tPvtX^# u Pv4Vv4^Pv4Vv4XFvVvX^;rX Pv^;tPvtX^# u v Ptvv4^P]v4Xvt vt X^;vt vt X@PvtX^# uPFPX]Ë]%vtvt X^;}Ovtvt XvvtXRPvt TY[ӉTPvt XPvt Xvt X uPvtX5^# u3Pvt Xvvt X u Pvt X PvtY FPvt 4vt^ƉX]CSE v1.3b (c) 1982,83 NW Microsystem DesignCommands: new fileexisting fileillegal countillegal formatstring not foundno input fileno output filecan't close inputcan't close outputcan't rename inputcan't rename outputread errorwrite errorend of filetext buffer fullillegal commandcan't open savecan't close saveno data to saveno macro activeno macro endno file specifiedinsert modereadingwritingprocess abortedend of textchangingsearchingretrievingsavingprintingprinter busyillegal command linecse.trma:cse.trmCSE.TRM not foundcan't read CSE.TRM$$$$SVXITBAKUITbuffer columns less than screen columnsinsufficient memory Illegal cursor position codeBAD FILE$con: TOO MANY ARGS$warw REDIRECTION ERROR$cALLOC$FREE$READ$WRITE$k,78AO]l} *:K[kx'd  (08@HPX`hpx NO CORE$ $CONCONRDRPUNPRNCSE v1.3b (c) 1982,83 NW Microsystem DesignComm!  u/PDD3!FVF^;t3PoDDFPDDyVF^;tYVF^;t. PDD! = PDD!R PDD3P DD uP P&FF=| PbDD3PDDP6 Vv&FP6Vv&FPF^;uPF^;u PDD3PDD!FKFF u3P\DD3FF;!t !P6r!X4V,DDF= PDD PDD3P DD uFP6r!X4VDDFF uv[DD3PDDF uv>DD3PDD P-DD3PU DD u.*PDD3P: DD uaPDD3PqDDFP6r!X4!PxP-FF=|PDD3P(DDPFP6r!X4Vv%)FP6Vv)Fv-DDPF^;uPF^;uP(DDP4DD3PDDPh(DDPP& uPJ(DDP DD3PuDDP DD3PdDD]3FFP6r!X4 u vF]Ë] u+P DD3FV!^ tPF^;|vDD P& DDvGPE DDn FF=|3]ËF= F;!~?jP DDFP6r!X4tV DDP DD uF] ~P DD)] 3F3PFP6r!X4^;t]ËFP6r!X4tFPFP  P9 DDv u vvƊP DDV!^ tPvY3PFP6r!X4^;t]ËFP6r!X4tFVv^;| P DDPFP  P~ DDv uvƊP] DD]Ë]} P DDvtVP#vtVPPDDPvtVPPvtVPsPvt&VP^Pvt.VPIPvt6VP4PoDDPvt>VPPvtFVPPvtJV$PvtNVDDvtOVDDPDDvtPVCP#vtRVSPPDDvtTVfPmP2 DDPvtVVPnPDDvt^VPP DDPvt`VP5PpDDvthVPPvtjV&PP@ DDvtrVKPUPvttVRPPDDvt|VhP%oP` DDPvt~VPPDDvVPvVPPvVPXPDDvVPvVP3]Ë] PXDD3PDD u3]ÍP7DDP6V,PP6VCPzP6VSPcP6VgPLP6 V|P5P6(VPP60VPP68VPP6@VPP6HVPP6PVPP6XVPP6`V!P}P6hV9PfP6pVNPOP6xVfP8P6ƀV~P!P6ƈVP P6ƐVPP6ƘVPP6ƠVPP6ƨVPP6ưVPP6ƸV3PP6VKPiP6VYPRP6VkP;P6VP$P6VP 3]Ë]PDDvDDvDDPDD3PDD u]vvv] uFF u[ PWDDvDDvIDDPrDDFF=t3PDDF=t]ËF;F|v, u*P DDPvXvƊP+DDvPDD u]2] uPZDDvPDDPDD9FFPkDDFP.FPvXPDD u]'PlDD CRcrs]> uaFFv+DDv4DDJFPBDD u0F=t 3PyDDF=uvFF]]3FF uHFFPDD u2FPiDDFƁV PvX^^ƉFvVF^;tVF^;t3 VF^ tFP7DDF= v,@VF^;t ]& VF^;tF u]F]Ë]F u PDDEFFPwDD PnDDyVF^;tYVF^;t ]3]Ë]c3F u8vPvX4Fv u v+DD]]"PDD3Pv%PDD]dVF^ tFdVF^ tЉFF u0FPDDF u PnDD VF^ tF VF^ tЉFF u F u0FP&DDF u PDD0FPDD]&(P(DD3Vv^;}1vƊP,DD3Vv^;} PDD+PDD] VF^; ~VF^;~ FPxDD2VF^;t .PDDFP6X4VwDD]j u+PP FF uF]]( VF^;t PP FPP ]v uvƊPDD]_Xˎ& A. v  v û!Wg؎Ћ&>O3 !UF! t5x t/PV!±$'@'Nuӱ 9nvnX!&!^3^.U+;&!v^.PF^;r PvX^P!^ƉƋ4F uF]ø2P P PD]4F̍v4^Fv4,X ux Pv̊^;t Pv̊^;t PvX6APv̊^;sZPv̊^;v Pv̊Yv́4XwPvX<F҉FЉFθF̸FPv4^^ƉFv4,X uv̊ u<Pv̊^;t F́F<>Pv̊^;t F́FFPv4^VF^ƉXF=}AP P Pv̊ uv́4Xv,4Xv́4X+QF̸>PvЊ^;tvЁ4XSF̸PUPv# ^;uPvv ^;uPWPv ^;uYP PPmPFԉXFPvP ]%FFF=|,vV!^ƉƋ4 u v4XF=tPPTFF uPv4X5^#PvtXPvR^;:PFƊ^;tFFF=|5FF=|@vVPvX^P!^ƉƉ^ƉƊPvVF^ƉƊP^;t v4XF=t*PF^#PPvX^P!^ƉƊD^;tPvtY PvX^P!^ƉƊDPvXPPvtX^#^;t3Pv4^;tPvtX PvtX PvtX v4XPvtX5^# uvvr PvX uF uv4VPVPv4VFP?^;P  YPvtXvt~PvtX ufPvtvtVFPvV!^ƉXPvtX5^# u F uv4V#PPv4t#t!XZYQRPvtXZTPZPvtX^# uvttXZ uv4t!,\t4XZvtVP!v4V!PFPYPF^;|1PvVvt^ƉƊ^;t v4XPYPF^+ƙRPvtTY[ӉTF]ËF u#v4 u v4Vv]Ë]PvtX^# uPvtX^# uPv4^;tqvtvtV P PPvt Pvt^Pvt Xvt XPvtX hv4VDDPvtXPvtX^# u Pvt^;tvt vt  vt ]øRPvtt XZY[RFZ3FFF=|vttPvX^RPvtt XZ^_^_;u;rPvX^Pvt^PPFF3RPv4t!XZTPZv4V!PFF=t F=t-3PPPvX^Pvt^Ps3F F u vF u@PvtY PvX^Pvt Xvtt vttXZ^_+RPvt X^_;u;w&vtt vttXZ^_+RPvt XZ] PvtX^# ugvtvt X^;|Pvt vt^ƉXvt XRPvtt XZ^_RPvttXZ^_;u;r.vt XRPvtt XZ^_RPvtXZTPZFvt PYPvX^^;|PYPvX^Pvt^PPvXRPPvtt XZYK^_RPv4t!XZTPZv4V"PA u@PvtY v4XIPvtY#]UNV]qvvX^FvPF uPvv F]Ë]2PF^P u]v%FPvtX5^# u v4Vvt u vtVvPPvX^P!^ƉX]Ë]Pvv^]Ë]xFF=|0vV!^ƉƋ4 u vv4Xv]&PF^+P0FPvtX^# uO PvtX^# u vPv4VPI^;@PvtY @PvtX^# uPPX]Ë]~FFFv uv4^PdFF uFPvY F uFF uFPvY awrb _FPRPFFPvFF=u F=t3PFFPvXFVF=tF=uPRPvF=u F]ø]Ë]PvY+v4VF^;uoP PdP6!Fv4 uvVv4^;r v4Fv4VvXFPvXPvtX^PF^ƁPF^;t+PvtX^PvtYv4VvXFFv4FPvtX^PF^ƁPF^;t(PvtX^PvtYv4VvX]FP0^;ƸvH uH uP9PF^;ƸvH uHPX]Ë]vFPvtX^# u 3ҋ]øPvtY#F Pmvt XRPvvvtt XZ^_^_׉VFPvvXZVF?vvvttXZ^_׉VF3ҋ] vt X u$vtt vvXZ^_;u;r9vt XRPvtt XZ^_RPvvXZ^_;u;sp PvtX^# u v9PYP^5RPvvXZ^_##RPvt XZTPZPvt Xvvtt vvXZ^_+RPvt XZvt vt X^;vt vt XvvXZ]Ë]P%PF u:PFƊ^;tIvPXFF=A}F=P~F@PvXgPvY P PvtVvVPvtVF uvVPvt V( uF]v]Ë]v4Fv udv4^PFF=.t:F=!|]ËF uv,4XFPv4^XFPvX]Ë] PPF^^#ƉF6!Fv4F uvVvtX^;sPF^PvtX^;sMPvX^PF^ƁFv4VvXPvtX+F^+PvtXFPvX vtXFv4VvX FFSF uPF^PF u%FPvtXFPvXPvYF]Ë]U؎v~N;rNO]Pvv]Ë]  vDDFPvtX^# uuP PPDD3FvVvX^;r3VvDDF^;|vƋFvPvtX^# uF=tvt ,v,kF= tR3VvDDF^;|GF= tv vtFPvtY  F= t@PvtX^# uPFPX]Ë]UPvtX^# uPvtY#vD]Ëvt vt X^;} PvtX^# uvDDPvtX^# uOvtvt X^;t*vtXRPvt TY[ӉTvt 3vt X uvt 3vDDvt vt X^;}]Ëvt PvtX]Ë]<vF u]vF uv]øPFPvvPZFvvF u]ø]Ë]vV!4XF^;s]Í!4!4X^+ƉFv!ƋYF]Ë]U؎~NF]6v4XFv4^ uPF+F^ t3]Ë]FPa^;~ zPF^;~PvYF]Ë]vF u]vP FvjF u]ø]Ë][vmFPvtX^# u{P PPPvtX^# uwFvVvX^;r^ Pv^;tPvtX^# u Pv4VAv4^Pv4V'v4XFvVvX^;rX Pv^;tPvtX^# u v Ptvv4^P]v4Xvt vt X^;vt vt X@PvtX^# uPFPX]Ë]vtvt X^;}Ovtvt XvvtXRPvt TY[ӉTPvt XPvt Xvt X uPvtX5^# u3Pvt Xv_vt X u Pvt X PvtY FPvt 4vt^ƉX] CSE v1.3 Terminal Installation Program copyright (c) 1982,83 NW Microsystem Design Installing for an MP/M system? Custom Terminal Installation First, specify the size of the terminal. Next, you must specify the cursor keys for the terminal. Each key will be specified by the number of characters in the string, followed by the characters themselves. For single-character strings, simply press the cursor key itself. For multicharacter strings, enter each character in the string individually; otherwise, some characters in in the string may be missed. For example, if the up arrow key sends the string ESC [ A, enter the string by typing ESC, then [, then A, not by pressing the up arrow key. A WARNING : on many systems, multicharacter cursor strings may not work, due to lost characters. In such a case (due to inability of CSE and the BDOS to read input characters that quickly), you will have to use the CONTROL/E-S-D-X-T keys for cursor control. If your terminal has no key for the specified function, enter 0 as the number of characters Now, you must specify the cursor positioning format. The general cursor positioning format consists of a leadin string, the row or column, a separator string, the column or row, and a terminator string. In addition, row and column may be in either binary or ASCII format, there may be row and column offsets, and there may be a delay after the string is issued. Specify whether row or column is specified next, and whether it is in binary or ASCII format. The choices are : r : binary row c : binary column R : ASCII row C : ASCII column Type ( For most terminals, an offset must be added to the row and column address. For example, the Televideo terminals require an offset of 32 Some terminals require a delay following this operation. It is specified in terms of null char- acters issued after the operation. Most terminals do not require a delay, so if you are unsure, try 0 for now.    CSE allows user-definition of almost all command control sequences. For example, if you wish, you may redefine the 'page forward' key from the default (CTRL/P) to the key of your choice (such as one of the function keys on your terminal). In this way, you can define the CSE command structure as you wish. Do you want to modify any of the editor control sequences? You will be asked whether you wish to modify each modifiable editor command sequence. The default string is enclosed in parentheses. If you wish to modify the string, type 'Y' or 'y'; if you do not wish to modify the string, type anything else, and the string will be left unchanged. NULSOHSTXETXEOTENQACKBELLBSTABLFVTFFCRSOSIDLEDC1DC2DC3DC4NAKSYNETBCANEMSUBESCFSGSRSUSSPACECTRL/@'CTRL/ACTRL/BCTRL/CCTRL/DCTRL/ECTRL/FCTRL/GCTRL/HTABLFCTRL/KCTRL/LCRCTRL/NCTRL/OCTRL/PCTRL/QCTRL/RCTRL/SCTRL/TCTRL/UCTRL/VCTRL/WCTRL/XCTRL/YCTRL/ZESCCTRL/\CTRL/]CTRL/^CTRL/_SPACE MP/M system Not an MP/M system Do want to modify an existing configuration file? cse.trm CSE.TRM not found on default drive Can't read CSE.TRM Do you want to modify the terminal characteristics? Are you ready to create the terminal file? Do you want to make more changes (otherwise, abort)? aborting installationcse.$$$can't create temporary file cse.$$$bad write on temporary file cse.trmcse.$$$cse.trmcse.$$$can't rename temporary file Successful installation, process complete  Terminal Choices Select terminal type by number : You have selected Invalid terminal selection Number of rows Number of columns Up arrow Down arrow Left arrow Right arrow Home Cursor positioning leadin Row/column separator Cursor positioning terminator Offset for row Offset for column Delay Now, special terminal control strings Initialization string (executed at startup)Delay Now, the strings which clear parts of the screen Erase from cursor to end of line Delay Erase from cursor to end of screen Delay Erase entire screen Delay Now, terminal editing function strings Delete current line Delay Max # of lines to delete without redisplay Insert line at cursor Delay Max # of lines to insert without redisplaybackspace, then deletedelete in placealternate up cursoralternate down arrowalternate left arrowalternate right arrowalternate home cursorgoto bottom of screenright multipleleft multipledelete current lineerase to end of current lineturn insert mode on/offdisplay buffer spacescroll forward one linescroll forward one pagescroll forward to cursor linescroll backward one linescroll backward one pagekill current lineinsert a line at cursor lineprocess screen bufferdetach from console [MP/M only]cancel unlogged changesabort processterminate processinitiate special processingkill next n linesinsert n lines at cursor line Modify string for ? Number of characters in string : Char : ): Invalid choice Is this correct? () () DELBAD FILE$con: TOO MANY ARGS$warw REDIRECTION ERROR$cFREE$READ$WRITE$!) )Vwx T-bI$UV1h @Qj,OP' / 0 c  K  V         $ ( , 0 4 8 ; ? C F I L O U ] d k r y     ! ( PKISQKITVI 910 P  =rc C+TY+R E TVI 912/920 P  =rc C+TY+RdEdTVI 925/950 P  =rc C+TY+R   E ADM-3A P  =rc ADM-5 P  =rc T YR E ADM-31/32 P  =rc T YYREADM-42 P  =rc T YYRESoroc IQ120/140P  =rc T YZenith H-19 PABDCHYrc KJEM L DEC VT-52 PABDCHYrc K JHJMLVisual 200 PABDCHYrc XJHJADDS Viewpoint P =rc K ADDS Reg. 40/65P =rc K lMDEC VT-100 RC  ANSI Standard RC  Hazltn 14/1500 P  cr\ddCustom TerminalPrc|>j,XF NO CORE$ $CONCONRDRPUNPRNJADDS Viewpoint P = DEC VT-52 PABDCHYrc KJEJMLMKOFPUMLSQKIF1 ;\1A\00 Scroll forward one line (^Z) F2 <\17\00 Scroll backward one line (^W) F3 =\1BP\00 Page to cursor line (ESC P) F4 >\1BK\00 Erase to EOL (ESC K) F5 ?\1BM\00 Delete cursor line (ESC M) F6 @\1BL\00 Insert line at cursor line (ESC L) F7 A\03\00 Terminate process (^C) F8 B\11\00 Abort process (^Q) F9 C\1B\1B\00 Update buffer, process command line (ESC ESC) F10 D\1BQ\00 Cancel changes to screen (ESC Q) G\1BH\00 Home (ESC H) H\1BA\00 Up arrow (ESC A) I\1BU\00 Page Up (ESC U) K\1BD\00 Left arrow (ESC D) M\1BC\00 Right arrow (ESC C) OFUNCTION CPM.PFK\0D\00 End (Reset to CPM function keys) P\1BB\00 Down arrow (ESC B) Q\1BF\00 Page down (ESC F) R\1BO\00 INS (ESC O) S\7F\00 DEL (DEL) ;DIR A:\0D\00 F1 STAT \00 F4 ?STAT A:*.*\0D\00 F5 @STAT B:*.*\0D\00 F6 AASSIGN\0D\00 F7 BFUNCTION CSE.PFK\0D\00 F8 CDSKMAINT\0D\00 F9 DFUNCTION\0D\00 F10 G\1BH\00 Home H\1BA\00 Up arrow I\1BI\00 Page Up K\1BD\00  Left arrow M\1BC\00 Right arrow O\1A\00 End P\1BB\00 Down arrow Q\0A\00 Page Down R\1BL\00 Ins S\7F\00 Del  Notes on the IBM CP/M-86 Version of CSE 5/20/83 1. CP/M-86 defines the function keys to a number of command strings on startup. To use CSE, you should first run FUNCTION CSE.PFK This redefines the function and special editing keys to match the strings expected by CSE. If you start up CSE without doing this, the function keys will not work; the best approach is to type , then QUIT, then type the key twice. This will abort CSE, allowing you to run the FUNCTION command. 2. When you are done editing, if you want to redefine the function keys to the CP/M-86 startup values, type . This will execute the command FUNCTION CPM.PFK which redefines the function keys to CP/M-86 defaults. 3. There is one exception: CPM.PFK defines to be FUNCTION CSE.PFK so you can set up the function keys for CSE by just typing 4. CTRL/X does not move the cursor down. CP/M-86 filters this key at the BIOS level, and does not pass it on to the editor. 5. Recompilation is performed in the same manner as the CP/M-86 version in the user's manual. ld first run FUNCTION CSE.PFK This redefines the function and special e/* */ /* CSE : C Screen Editor */ /* */ /* copyright (c) 1982,83 Northwest Microsystem Design */ /* created 4/11/82, 1130 hrs */ /* version 1.3b */ /* last modified 1/26/84, 1615 hrs */ /* */ /* The editor consists of two major sections : (1) the */ /* screen loop processor, which maintains the screen */ /* buffer during screen editing, and (2) the command line */ /* processor, which processes the macro commands typed on */ /* the command line of the screen. The command line is */ /* not processed until a "process screen" sequence */ /* is typed by the operator */ #include "stdio.h" #include "csedef.c" /* screen loop return definitions */ #define ESCQUIT 1 /* cancel changes to text */ #define ESCESC 2 /* normal return */ #define ESCDTCH 3 /* detach from console (MP/M only) */ /* command type definitions */ #define NOCMD 0 /* illegal command type */ #define APPEND 1 /* append to end of text buffer */ #define BEGIN 2 /* move text ptr to beginning of buffer */ #define CHANGE 3 /* change one string to another */ #define DELCHR 4 /* delete characters in text buffer */ #define END 5 /* move textp ptr to end of buffer */ #define EXIT 6 /* exit from editor */ #define FIND 7 /* find a string */ #define HDCPY 8 /* print hard copy */ #define INSERT 9 /* insert lines in text buffer */ #define JUMP 10 /* scroll fwd/bkwd characters in buffer */ #define KILL 11 /* kill lines in text buffer */ #define LINES 12 /* scroll fwd/bkwd lines in text buffer */ #define MARGIN 13 /* set left margin */ #define PAGE 14 /* scroll fwd/bkwd pages in text buffer */ #define QUIT 15 /* abort edit */ #define RETRIEV 16 /* retrieve save file, deposit in text buffer */ #define SAVE 17 /* save text in save file */ #define TYPE 18 /* list file with continuous scroll */ #define WRITE 19 /* write text to output file */ #define LPAREN 20 /* initiate macro command */ #define RPAREN 21 /* terminate macro command */ /* message and error code definitions */ #define MSGNUL 0 /* no error (null message) */ #define ERNF 1 /* new file */ #define EREEF 2 /* editing existing file */ #define ERILCT 3 /* illegal iteration count */ #define ERILFMT 4 /* illegal command format */ #define ERSNF 5 /* string not found */ #define ERNIF 6 /* no input file */ #define ERNOF 7 /* no output file */ #define ERCCIF 8 /* can't close input file */ #define ERCCOF 9 /* can't close output file */ #define ERCRIF 10 /* can't rename input file */ #define ERCROF 11 /* can't rename output file */ #define ERRD 12 /* read error */ #define ERWRIT 13 /* write error */ #define EREOF 14 /* end of file */ #define ERTBF 15 /* text buffer full */ #define ERILCMD 16 /* illegal command */ #define ERCOSF 17 /* can't open save file */ #define ERCCSF 18 /* can't close save file */ #define ERND 19 /* no data to save */ #define ERNMCRO 20 /* no macro active */ #define ERNMEND 21 /* no macro termination */ #define ERNFS 22 /* no filename specified */ #define MSGINS 23 /* insert mode */ #define MSGRD 24 /* reading */ #define MSGWRT 25 /* writing */ #define MSGAP 26 /* process aborted */ #define MSGEOT 27 /* end of text buffer */ #define MSGCHG 28 /* changing (replacing) */ #define MSGSRCH 29 /* searching */ #define MSGRTRV 30 /* retrieving */ #define MSGSAV 31 /* saving */ #define MSGPRT 32 /* printing (hard copy) */ #define ERPBSY 33 /* printer busy */ #define DONE 99 /* done with processing */ /* global symbol storage */ /* file I/O storage */ int infd,outfd; /* input and output */ /* text buffer storage */ char *txtend, /* limit of actual text */ *txtptr; /* window pointer */ /* screen buffer storage */ char *scrptr; /* screen buffer ptr */ int srow,scol, /* row, column counters */ lftcol,rtcol, /* left, right margins for display */ linctr, /* line counter (set by movptr) */ dspflg, /* redisplay flag */ escval; /* escape value */ /* command processor storage */ char *cmdptr; int mlevel; /* read (input) buffer storage */ char *rdptr,*rdend; /* ptrs to start/end of data */ /* miscellaneous storage */ int donflg, /* done flag */ insflg, /* insert flag */ eof; /* end of file */ char *copymsg = "CSE v1.3b (c) 1982,83 NW Microsystem Design"; char *hdrmsg = "Commands: "; char *errmsg[] = {"", "new file", "existing file", "illegal count", "illegal format", "string not found", "no input file", "no output file", "can't close input", "can't close output", "can't rename input", "can't rename output", "read error", "write error", "end of file", "text buffer full", "illegal command", "can't open save", "can't close save", "no data to save", "no macro active", "no macro end", "no file specified", "insert mode", "reading", "writing", "process aborted", "end of text", "changing", "searching", "retrieving", "saving", "printing", "printer busy" }; /* term : CSE configuration structure */ struct config term; /* System-dependent variables (compiled separately) */ /* text buffer storage */ extern char *txtbuf,*txtbufe; /* limits of text buffer */ extern unsigned txtbufl,txtmaxl; /* actual, maximum length */ /* screen buffer storage */ extern char *scrbuf; /* ptrs to screen buffer */ extern int scrlin,scrcol, /* screen buffer size */ scrbufl, /* physical screen buffer length */ dspcol, /* # of columns screen can display */ msgcol; /* message start column */ /* read buffer storage */ extern char *rdbuf; /* start, end of read buffer */ extern unsigned rdbufl; /* length of read buffer */ /* buffers and pointers to buffers */ extern char infn[], /* input filename */ outfn[], /* output filename */ wrkfn[], /* work filename */ savfn[], /* save filename */ bakfn[], /* backup filename */ msgbuf[]; /* screen message buffer */ extern char *linbuf, /* line buffer */ *str1, /* string buffer */ *str2, /* string buffer */ *rowptr[]; /* row pointer array */ extern int rowflg[], /* row flag buffer */ tabstop[]; /* tab stop array */ /* functions */ extern char *sysinit(); /* initialize for system */ extern int buildfn(),fndchr(),tststop(),initcrt(); extern int dispscr(); /* display screen buffer */ extern int erase(),erasline(),cursor(); /* terminal control strings */ extern int initkb(),loadkb(); /* keyboard buffer handling */ extern int testch(),getch(),getnch(); /* keyboard character input */ extern int setkbp(); /* set keyboard buffer pointer */ extern int putcrt(); /* output to screen */ extern int attcon(),detcon(); /* attach, detach console */ extern int attlst(),detlst(); /* attach, detach list */ /* */ /* main : main function for editor */ /* */ /* performs initialization, opens input and output files, */ /* and initiates editing */ /* */ main(argc,argv) int argc; char *argv[]; {char *p,*gettrm(),*init(),*kill(); int scrval,erval; putstr(copymsg); if (p = gettrm()) /* read terminal file */ {putstr(p); /* bad terminal file */ exit(0); } if (!(erval = options(argc,argv))) /* process command line */ {putstr("illegal command line"); exit(0); } if (p = init()) /* initialize memory */ {putstr(p); /* error in initialization */ exit(0); /* abort */ } initcrt(); /* initialize the CRT */ initkb(); /* initialize keyboard buffer */ p = NULL; /* no message */ rowptr[0] = scrbuf; /* set command buffer pointer */ dspflg = 1; /* force display first time */ if (erval == EREEF) /* test for existing file */ {erase(0,0); /* erase the screen */ disphdr(NULL); srow = 0; /* set cursor to upper left */ scol = HDRLEN; erval = append(LRGVAL); /* read it into buffer */ } while (!donflg) /* process until done */ {buildrp(1,txtptr); /* build row pointer array */ build(0,scrlin); /* build screen buffer */ if (dspflg) /* test for redisplay */ {dspflg = 0; /* clear redisplay flag */ srow = 0; /* cursor in command line */ scol = lftcol+HDRLEN; scrptr = scrbuf+scol; dispscr(0,scrlin); /* display screen buffer */ } else dispscr(0,1); /* just display first line */ disphdr(p); /* display header message */ p = NULL; /* copyright message disappears */ dispmsg(erval); /* display error message */ movcur(0,0); /* set cursor */ if ((scrval = scrnlp()) != ESCQUIT) /* process screen input */ {erval = proret(scrval); /* process special return */ if (!erval) /* test for error */ erval = proclin(); /* process command line */ if (erval == DONE) /* test for done */ donflg = 1; /* set done flag */ } else dspflg = 1; /* force redisplay */ } cursor(0,0); /* clear the screen before */ erase(0,0); /* returning */ exit(0); /* return to operating system */ } /* */ /* gettrm : read terminal configuration file */ /* */ char *gettrm() {int trmfd,trmct; trmfd = open("cse.trm",BREAD); /* open for binary read */ if (trmfd < 0) /* test for error */ trmfd = open("a:cse.trm",BREAD); /* try drive A */ if (trmfd < 0) /* test for error */ return ("CSE.TRM not found"); trmct = read(trmfd,&term,sizeof term); /* read the file */ close(trmfd); if (trmct != sizeof term) /* test for error */ return ("can't read CSE.TRM"); return NULL; /* good read */ } /* */ /* options : get command line options, open files */ /* */ options(argc,argv) int argc; char *argv[]; {char *argp; int oval; scrlin = scrcol = dspcol = 0; /* clear screen size parameters */ infd = outfd = 0; /* initialize file descriptors */ if (argc < 2) /* test for at least one filename */ return ERNFS; /* no filename specified */ while (--argc) /* process all -x arguments */ {argp = *++argv; /* get ptr to argument */ if (*argp++ != '-') /* test for - argument */ break; switch(toupper(*argp++)) /* search for the argument */ {case 'R': /* set row count */ scrlin = getnum(argp); if ((scrlin < MINROW)||(scrlin > MAXROW)) return 0; break; case 'C': /* set column count */ dspcol = getnum(argp)-1;  if ((dspcol < MINCOL-1)||(dspcol > MAXCOL)) return 0; break; case 'L': /* set screen buffer line length */ scrcol = getnum(argp)-1; if ((scrcol < MINCOL-1)||(scrcol > MAXCOL)) return 0; break; default: /* illegal argument */ return 0; } } if (!argc) /* test for filename arguments */ return ERNFS; /* no filename specified */ strcpy(infn,*argv); /* save input filename */ infd = open(infn,AREAD); /* open input file */ if (infd < 0) /* test for not opened */ {infd = 0; /* indicate no input file */ oval = ERNF; /* display new file message */ } else oval = EREEF; /* editing existing file */ if (argc == 1) /* test for output filename */ strcpy(outfn,infn); /* none : use input filename */ else strcpy(outfn,*++argv); /* use specified filename */ strcpy(wrkfn,outfn); /* create work filename */ buildfn(wrkfn,"$$$"); /* filename.$$$ */ outfd = creat(wrkfn,AWRITE); /* open output file */ if (outfd < 0) /* test for error */ return 0; /* can't open output */ strcpy(savfn,outfn); /* create save filename */ buildfn(savfn,"$SV"); /* filename.$SV */ return oval; } /* */ /* getnum : get value from command line argument */ /* */ getnum(argp) char *argp; {int val; val = 0; while (isdigit(*argp)) /* get all digits */ val = val*10 + ((*argp++)&15); /* combine with forming value */ return val; } /* */ /* init : perform memory initialization */ /* */ char *init() {char *p; if (p = sysinit()) /* allocate buffer space */ return p; /* problem in allocation */ donflg = /* no end flag */ insflg = /* insert off */ lftcol = 0; /* left margin at zero */ rtcol = lftcol+dspcol; /* set right margin */ rdptr = rdend = rdbuf; /* no data in read buffer */ txtptr = txtend = txtbuf; /* nothing in text buffer */ return NULL; } /* */ /* Screen utilities */ /* */ /*  */ /* buildrp : build the row pointer array */ /* */ buildrp(row,p) int row; char *p; {while (row <= scrlin) /* do all following rows */ {rowptr[row++] = p; /* store start of line */ while ((p < txtend)&&(*p++ != '\n')) /* look for newline */ ; } } /* */ /* build : build the screen buffer from the text buffer */ /* */ /* builds the screen buffer from the next n lines of the */ /* text buffer, displaying as it builds */ /* NOTE : assumes the row pointer array has been built */ /* */ build(row,n) int row,n; {char *sptr,*tptr,*lptr,*movptr(); int col,tcol; clrsbuf(row,n); /* clear the screen buffer */ clrrbuf(row,n); /* clear the row flag buffer */ if (!row) /* test for command line included */ {sptr = scrbuf; /* treat header area as a tab */ for (col = lftcol; col < lftcol+HDRLEN; col++) *sptr++ = '\0'; /* fill header with nulls */ row++; /* bump past command line */ n--; /* decrement count */ } lptr = movptr(rowptr[row],n); /* get end of display region */ sptr = scrbuf+row*scrcol; /* set ptr to beg of window */ col = 0; for (tptr = rowptr[row]; tptr < lptr; tptr++) /* do text area */ {if (*tptr == '\n') /* test for newline */ {rowflg[row] = col; /* set row flag to last column */ sptr += scrcol-col; /* move screen pointer */ row++; /* bump row counter */ col = 0; } else if (col < scrcol) /* truncate long lines */ {col++; if ((*sptr++ = *tptr) == '\t') /* expand tabs */ {tcol = fndtab(col); /* get next tab stop */ while (col < tcol) /* fill with nulls */ {col++; *sptr++ = '\0'; } } } } } /* */ /* disptxt : display the text buffer on the screen */ /* displays the specified window of the text */ /* */ disptxt(s,p) char *s,*p; {int row,col,tcol; cursor(0,0); /* erase screen */ erase(0,0); /* erase entire screen */ for (row = 1 ; row < scrlin; row++) /* do all rows */ {cursor(row,0); /* position cursor */ for (col = 0; col < scrcol;) /* do one line */ {if (s >= p) /* test for end of text */ return 0; if (*s == '\n') /* test for end of line */ {s++; /* bump ptr */ break; /* then go to next line */ } if ((col >= lftcol)&&(col < rtcol)) echo(*s); col++; /* bump column counter */ if (*s++ == '\t') /* expand tabs */ {tcol = fndtab(col); /* get next tab stop */ while (col < tcol) /* fill with spaces */ {if ((col >= lftcol)&&(col < rtcol)) echo(' '); col++; } } } if (col >= scrcol) /* test for long line */ while (*s++ != '\n') /* truncate if so */ ; } } /* */ /* disphdr : display header message in command line */ /* */ disphdr(p) char *p; {char *s; cursor(0,0); /* home the cursor */ s = hdrmsg; /* get start of message string */ while (*s) /* display whole string */ echo(*s++);  if (p) /* test for copyright message */ {cursor(scrlin-1,0); /* position cursor */ while (*p) /* print copyright message */ echo(*p++); } } /* */ /* dispmsg : display error message in message area */ /* */ dispmsg(msg) int msg; {char *s; int col; s = errmsg[msg]; /* get ptr to message */ cursor(0,msgcol); /* position cursor */ for (col = msgcol; *s != '\0'; col++) /* display message */ echo(*s++); while (col++ < dspcol) /* clear rest of message area */ echo(' '); cursor(srow,scol-lftcol); /* reset cursor position */ } /* */ /* scrcnt : count characters in screen buffer */ /* */ scrcnt(row,n) int row,n; {char *sptr,*sp; int slen,col,lcol,*rp; slen = 0; /* clear screen count */ sp = scrbuf+(row-1)*scrcol; /* set screen buffer pointer */ rp = rowflg+row; /* set rowflag pointer */ while (n--) /* do n lines */ {sp += scrcol; /* update pointer */ if ((lcol = *rp++) >= 0) /* test for nonempty line */ {sptr = sp; /* set pointer */ for (col = 0; col < lcol; col++) /* nonempty : count */ {if (*sptr++) /* count nonzero characters */ slen++; } slen++; /* count the newline */ } } return slen; } /* */ /* store : store screen buffer in text buffer */ /* */ store(row,n,slen) int row,n,slen; {char *dp,*sp; int tlen,err,col,lcol,*rp; tlen = rowptr[row+n]-rowptr[row]; if (err = shift(rowptr[row]+tlen,slen-tlen)) /* shift text buffer */ return err; /* error in shift */ sp = scrbuf+row*scrcol; /* initialize screen ptr */ dp = rowptr[row]; /* initialize text ptr */ rp = rowflg+row; /* set ptr to rowflag array */ while (n--) /* store n rows */ {lcol = *rp++; /* set last column */ for (col = 0; col < lcol; col++, sp++) /* scan entire line */ {if (*sp) /* transfer a byte if not null */ *dp++ = *sp; } if (lcol >= 0) /* test for nonempty line */ *dp++ = '\n'; /* store newline */ sp += scrcol-col; /* set screen pointer to next line */ } return 0; } /* */ /* proret : process special returns */ /* */ proret(retval) int retval; {switch (retval) /* process special return */ {case ESCDTCH: /* detach console */ cursor(0,0); /* home the cursor */ erase(0,0); /* erase the screen */ detcon(); /* detach from console */ attcon(); /* wait to reattach */ dspflg = 1; /* force redisplay */ return 0; default: return 0; } } /* */ /* proclin : process command line */ /* */ proclin() {int i,pval; getcmd(); /* get command line from screen */ cmdptr = scrbuf; /* set ptr to beg of command line */ mlevel = 0; /* reset macro level */ pval = procmd(); /* process the commands */ txtptr = movptr(txtptr,0); /* force to beginning of line */ return pval; } /* */ /* procmd : process command line */ /*  */ /* processes individual commands, one at a time, until */ /* end of line or an error is encountered */ /* */ procmd() {char *delch(); int iter,ctype,cval; while (*cmdptr) /* process entire line */ {blanks(); /* skip blanks */ if (!*cmdptr) /* test for eol */ return 0; iter = getval(); /* get iteration count */ blanks(); /* skip blanks */ if (*cmdptr) /* test for eol */ {dspflg = 1; /* redisplay the screen */ ctype = fndcmd(); /* get command type */ switch(ctype) /* process the command */ {case APPEND: /* append lines from input */ cval = append(iter); break; case BEGIN: /* go to beginning of buffer */ txtptr = txtbuf; cval = 0; break; case CHANGE: /* change one string to another */ cval = change(iter); break; case DELCHR: /* delete characters */ txtptr = delch(txtptr,iter); cval = 0; break; case END: /* go to end of buffer */ txtptr = txtend; cval = 0; break; case EXIT: /* end edit with update */ cval = exitcse(); break; case FIND: /* find a string */ cval = find(iter); break; case HDCPY: /* print hard copy */ cval = hdcpy(iter); break; case INSERT: /* insert lines */ cval = insert(txtptr,iter); break; case JUMP: /* scroll up/down chars */ txtptr += iter; /* set new ptr */ if (txtptr < txtbuf) /* test for past beginning */ txtptr = txtbuf; if (txtptr > txtend) /* test for past end */ txtptr = txtend; cval = 0; /* clear error flag */ break; case KILL: /* delete lines */ txtptr = kill(txtptr,iter); cval = 0; /* clear error flag */ break; case LINES: /* scroll up/down lines */ txtptr = movptr(txtptr,iter); cval = 0; break; case MARGIN: /* set left margin */ cval = margin(iter); break; case PAGE: /* scroll up/down pages */ if (iter > MAXPAGE) /* test for value too large */  iter = MAXPAGE; /* set max value */ else if (iter < -MAXPAGE) /* test for too small */ iter = -MAXPAGE; /* set min value */ txtptr = movptr(txtptr,iter*(scrlin-1)); cval = 0; break; case QUIT: /* abort with no update */ cval = quit(); break; case RETRIEV: /* replace string */ cval = retrieve(iter); break; case SAVE: /* save n lines in save file */ cval = save(iter); break; case TYPE: /* type n lines of text buffer */ cval = type(iter); break; case WRITE: /* write output */ cval = wrtout(iter); break; case LPAREN: /* initiate macro command */ cval = macro(iter); break; case RPAREN: /* terminate macro command */ if (mlevel) /* test for macro active */ return 0; else return ERNMCRO; /* no macro active */ default: /* invalid command type */ cval = ERILCMD; } if (cval) /* quit if error */ return cval; } } if (mlevel) /* test for macro active */ return ERNMEND; /* no macro end */ else return 0; } /* */ /* command line command processors */ /* */ /* */ /* append : append lines from input file to end of */ /* text buffer */ /* */ append(lines) int lines; {char *lasttp,*lastrp; int rdcnt; if (!infd) /* test for no input file */ return ERNIF; if (lines <= 0) /* test for invalid count */ return ERILCT; if ((rdptr == rdend)&&(eof)) /* test for no more input */ return EREOF; if ((txtend-txtbuf) >= txtmaxl) /* test for text buffer full */ return ERTBF; dispmsg(MSGRD); /* display read message */ lasttp = txtend; /* initialize text save ptr */ lastrp = rdptr; /* initialize read save ptr */ while (lines > 0) {while ((rdptr < rdend)&&(txtend-txtbuf) < txtmaxl) {if ((*txtend++ = *rdptr++) == '\n') /* transfer a character */ {loadkb(); /* read char if available */ if (--lines == 0) /* test for done */ {dispmsg(MSGNUL); /* clear read message */ return 0; } else {lasttp = txtend; /* save text ptr at beg of line */ lastrp = rdptr; /* save read ptr at beg of line */ if (testch()&&tststop()) /* test for stop read */ return MSGAP; } } } if (txtend-txtbuf >= txtmaxl) /* test for buffer full */ {txtend = lasttp; /* stop at end of last full line */ rdptr = lastrp; return ERTBF; } if (eof) /* test for end of file */ return EREOF; else {rdcnt = rdblk(infd,rdbuf,rdbufl); /* read next blk of file */ if (rdcnt == -1) /* test for error */ return ERRD; if (rdcnt == 0) /* test for short read */ eof = 1; /* got end of file */ rdend = rdbuf+rdcnt; /* compute end of read buffer */ rdptr = rdbuf; /* reset read pointer */ } } } /* */ /* change : change next n occurrences of one string */ /* to another */ /* */ change(times) int times; {char *tp,*fndstr(),*substit(); int slen1,slen2,err; if (times <= 0) /* test for invalid count */ return ERILCT; if (!getstr(str1)) /* get first string */ return ERILFMT; /* illegal command format */ if (!getstr(str2)) /* get second string */ return ERILFMT; /* illegal command format */ cmdptr++; /* bump past string terminator */ slen1 = strlen(str1); /* get length of first string */ slen2 = strlen(str2); /* get length of second string */ err = 0; /* clear error indicator */ dispmsg(MSGCHG); /* display change method */ while (times-- >0) {if (tp = fndstr(str1,slen1)) /* look for first string */ {txtptr = tp; /* set text ptr */ if (substit(txtptr,str2,slen1,slen2)) /* replace it */ txtptr += slen2; /* skip past this occurrence */ else {err = ERTBF; /* set error value */ break; } } else {err = ERSNF; /* string not found */ break; } } dispmsg(MSGNUL); /* clear message */ return err; } /* */ /* delch : delete forward or backward n characters */ /* */ char *delch(p,nchar) char *p; int nchar; {char *tp; if (!nchar) /* test for zero count */ return p; tp = p+nchar; /* compute new pointer */ if (tp < txtbuf) /* test for before beginning */ tp = txtbuf; /* can't delete past beginning */ else if (tp > txtend) /* test for past end */ tp = txtend; /* can't delete past end */ if (tp == p) /* test for no move */ return p; if (tp > p) /* test direction of delete */ {movmem(tp,p,txtend-p); /* forward : shift buffer */ txtend -= tp-p; /* compute new end of buffer */ return p; } else {movmem(p,tp,txtend-p); /* backward delete */ txtend -= p-tp; /* compute new end of buffer */ return tp; } } /* */ /* exitcse : read and write text buffer and rest of */ /* input file to output, then close output and rename */ /* input and output files */ /* */ exitcse() {int err; unsigned rdcnt; if (ucstrcom("XIT",cmdptr)) /* must be 'EXIT' */ return ERILCMD; /* illegal command */ if (!outfd) /* test for output file */ return ERNOF; if (infd && (!ucstrcmp(infn,outfn))) /* test for in, out same */ {strcpy(bakfn,infn); /* make .BAK filename */ buildfn(bakfn,"BAK"); if (ucstrcmp(infn,bakfn)) /* test for input .BAK file */ unlink(bakfn); /* not .BAK, delete .BAK */ } if (err = wrtbuf(txtbuf,txtend-txtbuf)) /* write to output file */ return err; if (infd) /* test for input file */ {if (err = wrtbuf(rdptr,rdend-rdptr)) /* write rest of rd buffer*/ return err; /* write error */ while (!eof) /* read/write rest of input */ {dispmsg(MSGRD); /* display read message */ rdcnt = rdblk(infd,txtbuf,txtbufe-txtbuf); if (rdcnt == -1) /* test for error */ return ERRD; if (rdcnt == 0) /* test for short read */ eof=1; if (err = wrtbuf(txtbuf,rdcnt)) /* write to output */ return err; /* write error */ } if (close(infd)) /* close input, test for error */ return ERCCIF; infd = 0; /* log input as closed */ if (!ucstrcmp(infn,outfn)) /* test for input, output same */ if (ucstrcmp(infn,bakfn)) /* test for input not .BAK file */ {if (rename(infn,bakfn)) /* rename input to .BAK */ return ERCRIF; /* can't rename input file */ } } if (close(outfd)) /* close output file */ return ERCCOF; /* can't close output file */ outfd = 0; /* log output as closed */ unlink(outfn); /* delete existing output file */ if (rename(wrkfn,outfn)) /* rename output file */ return ERCROF; /* can't rename */ return DONE; /* return exit indicator */ } /* */ /* find : find the nth occurrence of a string */ /* */ find(times) int times; {char *tp; int slen; if (times <= 0) /* test for valid count */ return ERILCT; if (!getstr(str1)) /* get the string */ return ERILFMT; /* command format error */ cmdptr++;  /* bump past second quote */ slen = strlen(str1); /* compute length of string */ dispmsg(MSGSRCH); /* display search message */ while (times-- > 0) /* forward direction */ {if (tp = fndstr(str1,slen)) /* search for the string */ txtptr = tp+slen; /* update text ptr */ else return ERSNF; } dispmsg(MSGNUL); return 0; } /* */ /* hdcpy : print hard copy on printer */ /* */ hdcpy(lines) int lines; {char *p,*s,*t; int col,tcol; if (!lines) /* test for null count */ return 0; if (attlst()) /* attach list if necessary */ return ERPBSY; /* printer busy, can't print */ p = movptr(txtptr,lines); /* scan forward or backward */ if (lines > 0) {s = txtptr; /* forward in buffer */ t = p; } else {s = p; /* backward in buffer */ t = txtptr; } dispmsg(MSGPRT); /* display printing message */ for (col = 0 ; s < t; s++) /* print entire region */ {if (*s == '\n') /* test for end of line */ {col = 0; /* reset column counter */ print('\r'); /* issue CR/LF */ print('\n'); if (testch()&&tststop()) /* test for abort print */ {detlst(); /* detach list if necessary */ return MSGAP; } } else {if (col < scrcol) /* truncate long lines */ {print(*s); /* echo the character */ col++; /* bump column count */ if (*s == '\t') /* test for tab */ {tcol = fndtab(col); /* expand tabs to spaces */ while (col < tcol) /* fill with spaces */ {col++; print(' '); } } } } } detlst(); /* detach list if necessary */ dispmsg(MSGNUL); /* clear message */ return 0; } /* */ /* insert : insert n blank lines at specified text pointer */ /* */ insert(p,lines) char *p; int lines; {int err; if (lines <= 0) /* test for valid count */ return ERILCT; if (err = shift(p,lines)) /* shift buffer to make room */ return err; /* not enough room */ while (lines--) /* insert the new lines */ *p++ = '\n'; return 0; } /* */ /* kill : delete forward or backward n lines */ /* */ char *kill(p,lines) char *p; int lines; {char *tp; if (!lines) /* test for nothing to do */ return p; tp = movptr(p,lines); /* move n lines up or down */ if (tp == p) /* test for any move */ return p; /* no move */ if (tp > p) /* test for forward delete */ {movmem(tp,p,txtend-tp); /* shift buffer */ txtend -= tp-p; /* set text end ptr */ return p; } else {movmem(p,tp,txtend-p); /* backward delete */ txtend -= p-tp; /* set text end ptr */ return tp; } } /* */ /* macro : process a macro command */ /* */ macro(times) int times; {char *mcptr; int mval; mlevel++; /* increment level count */ if (times <= 0) /* test for legal count */ return ERILCT; mcptr = cmdptr; /* save current pointer */ mval = 0; while ((times--)&&(!mval)) {cmdptr = mcptr; /* reset index */ mval = procmd(); /* process macro command */ } mlevel--; /* decrement level count */ return mval; } /* */ /* margin : set left margin */ /* */ margin(col) int col; {--col; /* decrement by 1 */ if ((col < 0)||(col >= scrcol)) /* test for valid margin */ return ERILCT; if (lftcol == col) /* test for change */ return 0; lftcol = col; /* set margin specified */ if ((rtcol = lftcol+dspcol) > scrcol) /* test for past right edge */ rtcol = scrcol; /* can't go past end of line */ return 0; } /* */ /* quit : abort edit without updating files */ /* */ quit() {if (ucstrcom("UIT",cmdptr)) /* must be 'QUIT' */ return ERILCMD; /* illegal command */ if (infd) /* test for input file */ close(infd); /* close input file */ if (outfd) /* test for output file */ {close(outfd); /* close output file */ unlink(wrkfn); /* delete the work file */ } return DONE; /* signal done */ } /* */ /* retrieve : get save file or specified file from disk, */ /* store in text buffer at current location */ /* */ retrieve() {char *sp,*dp; int err,rdfd; unsigned tlen,rdcnt; if (getstr(str1)) /* test for filename specified */ {rdfd = open(str1,AREAD); /* got filename : open the file */ cmdptr++; /* bump past second quote */ } else {if (outfd) /* test for output file */ rdfd = open(savfn,AREAD); /* use save file */ else return ERNFS; /* no file specified */ } if (rdfd < 0) /* test for good open */ return ERCOSF; /* can't open save file */ tlen = txtbufe-txtend; /* get available space */ movmem(txtptr,txtptr+tlen,txtend-txtptr); /* shift buffer down */ dispmsg(MSGRTRV); /* display retrieve message */ rdcnt = rdblk(rdfd,txtptr,tlen); /* read into text buffer */ dispmsg(MSGNUL); /* clear message */ if (rdcnt >= tlen) /* test for too much data */ {rdcnt = 0; /* cancel the read */ err = ERTBF; } else err = 0; movmem(txtptr+tlen,txtptr+rdcnt,txtend-txtptr); /* compress */ txtend += rdcnt; /* set new end of buffer */ if (close(rdfd)) /* close save file */ err = ERCCSF; /* error in close */ return err; } /* */ /* save : save n lines in the save file */ /* */ save(lines) int lines; {char *tp; int err,wrtct,wrtnct,savfd; if (lines <= 0) /* if no lines, delete save file */ {if (getstr(str1)) /* test for filename specified */ {unlink(str1); /* delete the file */ cmdptr++; /* bump past second quote */ } else {if (outfd) /* test for output file */ unlink(savfn); /* delete save file */ else return ERNFS; /* no filename specified */ } return 0; } tp = movptr(txtptr,lines); /* get text region to save */ wrtct = tp-txtptr; /* get number of bytes */ if (!wrtct) /* test for no data */ return ERND; /* no data to be saved */ if (getstr(str1)) /* test for filename specified */ {savfd = creat(str1,AWRITE); /* got filename : open for output */ cmdptr++; /* bump past second quote */ } else {if (outfd) /* test for output file */ savfd = creat(savfn,AWRITE); /* create save file */ else return ERNFS; /* no filename specified */ } if (savfd < 0) /* test for good open */ return ERCOSF; /* can't open save file */ dispmsg(MSGSAV); /* display save message */  wrtnct = write(savfd,txtptr,wrtct); /* write data to save file */ dispmsg(MSGNUL); /* clear message */ close(savfd); /* close the save file */ if (wrtnct != wrtct) /* test for good write */ return ERWRIT; return 0; /* good save */ } /* */ /* type : type next n lines of text buffer */ /* */ type(lines) int lines; {char c,*p,*q,*s,*t; int n,tval; if (!lines) /* test for null count */ return 0; p = movptr(txtptr,lines); /* scan forward or backward */ if (lines > 0) {s = txtptr; /* forward in buffer */ q = p; } else {s = p; /* backward in buffer */ q = txtptr; lines = -lines; } while (lines > 0) {if (lines > (scrlin-1)) /* test for more than a screen */ n = scrlin-1; else n = lines; /* not full screen */ t = movptr(s,n); /* define text region */ if (t > q) /* test for past end of region */ {t = q; /* set end of region */ lines = n = 0; /* force end of display */ } disptxt(s,t); /* display the region */ cursor(0,0); tval = tststop(); /* test for abort/terminate */ if (tval == ABORT) /* test for abort */ return MSGAP; else if (tval == STOP) /* test for stop here */ {txtptr = s; /* set text pointer */ return MSGAP; } else if (t == txtend) /* test for end of text */ return MSGEOT; s = t; /* update pointer */ lines -= n; /* decrement count */ } return 0; } /* */ /* wrtout : write n lines to output file, then delete */ /* the lines from the buffer */ /* */ wrtout(lines) int lines; {char *tp; int err; if (!outfd) /* test for no output file */ return ERNOF; if (lines <= 0) /* test for invalid count */ return ERILCT; tp = movptr(txtptr,lines); /* move n lines forward */ if (err = wrtbuf(txtptr,tp-txtptr)) /* write the buffer */ return err; kill(txtptr,lines); /* delete the written lines */ return 0; } /* */  /* wrtbuf : write specified buffer to output */ /* */ wrtbuf(p,len) char *p; unsigned len; {unsigned wlen; if (len) {dispmsg(MSGWRT); /* display write message */ wlen = write(outfd,p,len); /* write to output file */ dispmsg(MSGNUL); /* clear write message */ if (len != wlen) /* test for error */ return ERWRIT; } return 0; /* good write */ } /* */ /* Keyboard input processing */ /* */ /* */ /* Handles processing of keypad input while in 'screen' */ /* mode; its duties are to maintain the screen buffer and */ /* the display screen so that the contents match at all */ /* times; this involves looking at each character input to */ /* determine whether it can simply be echoed or must be */ /* modified in some way */ /* */ /* Screen loop */ /* */ scrnlp() {char ichar; int chtype,v,i,sval; scrptr = scrbuf+srow*scrcol+scol; insflg = 0; /* cancel insert mode */ while (1) /* loop until exit character */ {ichar = getch(DR); /* get next input character */ chtype = fndchr(ichar); /* find the character type */ switch (chtype) /* execute on character type */ {case NORML: /* normal printing character */ outnorm(ichar); break; case DELBACK: /* delete a character (with bsp) */ movcur(0,-1); /* backspace before deleting */ case DELETE: /* delete a character */ delchar(); break; case NEWLINE: /* carriage return */  if (rowflg[srow] < 0) /* test for empty line */ {rowflg[srow] = scol; for (i = 1; i < srow; i++) /* create lines above */ {if (rowflg[i] < 0) rowflg[i] = 0; } } srow++; /* bump line counter */ scol = lftcol; /* left margin */ movcur(0,0); break; case HOME: /* home */ srow = 0; scol = lftcol+HDRLEN; movcur(0,0); break; case BOTTOM: /* go to bottom */ srow = scrlin-1; scol = lftcol; movcur(0,0); break; case RTARW: /* move cursor right */ movcur(0,1); break; case LFTARW: /* move cursor left */ movcur(0,-1); break; case DNARW: /* move cursor down */ movcur(1,0); break; case UPARW: /* move cursor up */ movcur(-1,0); break; case RTARWM: /* move cursor right multiple */ movcur(0,8); break; case LFTARWM: /* move cursor left multiple */ movcur(0,-8); break; case LDEL: /* delete rest of line */ linedel(1); break; case LERASE: /* erase rest of line */ linerase(); break; case INSTOG: /* toggle insert mode */ if (insflg = !insflg) /* complement insert mode */ dispmsg(MSGINS); /* on now */ else dispmsg(MSGNUL); /* off now */ break; case STATUS: /* display space */ dispstat(); /* display status */ break; case PAGEDN: /* scroll forward one page */ scroll(scrlin-1); /* scroll forward one page */  movcur(0,0); break; case PAGEUP: /* scroll backward one page */ scroll(-scrlin+1); movcur(0,0); break; case LINEDN: /* scroll down one line */ scroll(1); movcur(0,0); break; case LINEUP: /* scroll up one line */ scroll(-1); movcur(0,0); break; case LKILL: /* delete lines */ linedel(escval); break; case LINS: /* insert lines */ lineins(escval); break; case LPAGE: /* scroll to cursor */ if (srow) /* no op if command line */ {scroll(srow-1); movcur(0,0); } break; case LQUIT: /* cancel changes */ return ESCQUIT; case LDET: /* detach from console */ if (term.mpm) /* MP/M systems only */ {if (sval = scrtotxt(1,scrlin-1)) /* update text buf */ {dispmsg(sval); /* text buffer full */ break; /* don't exit */ } else return ESCDTCH; } else break; case LESC: /* process screen buffer */ if (sval = scrtotxt(1,scrlin-1)) /* update text buff */ {dispmsg(sval); break; } else return ESCESC; /* process command line */ } } } /* */ /* process a normal, printing character */ /* (includes tab) */ /* */ outnorm(keych) char keych; {int acol,bcol,i; if (rowflg[srow] < 0) /* test for nonexistent line */ {for (i = 1; i < srow; i++) /* create all empty lines above */ {if (rowflg[i] < 0) rowflg[i] = 0; } } if (rowflg[srow] <= scol) /* set rowflag if necessary */ rowflg[srow] = scol+1; if (insflg) /* test for insert */ {linbuf[0] = keych; /* put character in line buffer */ acol = scrtolin(scrptr,scol,1); /* copy remainder of line */ bcol = lintoscr(scrptr,scol); /* copy back to screen buffer */ echoline(scrptr,scol,acol,bcol); /* rewrite remndr of line */ } else if ((keych != '\t')&&(*scrptr != '\t')) {echo(keych); /* display the character */ *scrptr = keych; /* store char in buffer */ } else if (*scrptr == '\t') /* test for buffer char tab */ {if (keych != '\t') /* test for both tab */ {if ((!*(scrptr+1))&&(scol-lftcol < dspcol-1)) *(scrptr+1) = '\t'; /* move the tab */ *scrptr = keych; /* store the character */ echo(keych); } } else {*scrptr = keych; /* copy new character to buffer */ acol = scrtolin(scrptr,scol,0); /* copy to line buffer */ bcol = lintoscr(scrptr,scol); /* copy back to screen buffer */ echoline(scrptr,scol,acol,bcol); /* rewrite remndr of line */ } scrptr++; /* bump pointer */ scol++; /* bump column count */ if ((srow >= scrlin-1)&&((scol-lftcol) >= dspcol)) /* test for end */ scroll(1); movcur(0,0); /* position the cursor */ return 0; } /* */ /* Delete a character from the screen buffer */ /* */ delchar() {int acol,bcol; if (scol > rowflg[srow]) /* test for nonexistent char */ return; acol = scrtolin(scrptr+1,scol+1,0); /* copy rest of line to buffer */ bcol = lintoscr(scrptr,scol); /* copy back to screen buffer */ echoline(scrptr,scol,acol,bcol); /* rewrite remainder of line */ cursor(srow,scol-lftcol); /* position cursor */ } /* */ /* linedel : delete a line */ /* NOTE : the command line cannot be deleted */ /* this version deletes the line from the text and screen */ /* buffers, and shifts the entire display up one line */ /* */ linedel(n) int n; {if (srow) /* test for command line */ {movcur(0,-scol+lftcol); /* cursor to beg of line */ shiftscr(srow,n); kill(rowptr[srow],n); /* delete lines from text buffer */ buildrp(srow,rowptr[srow]); /* build row pointer array */ if (srow+n >= scrlin) /* test for delete past end */ n = scrlin-srow; /* rebuild bottom of screen */ build(scrlin-n,n); /* build part of screen buffer */ deldlin(srow,n); /* delete n lines from display */ } else  {movcur(0,-scol+lftcol+HDRLEN); /* command line : erase it */ linerase(); } movcur(0,0); /* restore cursor */ return 0; } /* */ /* linerase : erase remainder of line (do not delete) */ /* */ linerase() {char *sp; int col; sp = scrptr; for (col = scol; col < scrcol; col++) /* erase to space */ *sp++ = ' '; if (rowflg[srow] > scol) /* set rowflag if necessary */ rowflg[srow] = scol; erasline(srow,scol-lftcol); /* erase the screen line */ return 0; } /* */ /* lineins : insert a line */ /* */ lineins(n) int n; {int i,lval; if (srow) {movcur(0,-scol+lftcol); /* set cursor to beg of line */ i = n; if (srow+n >= scrlin) i = scrlin-srow; if (rowptr[scrlin-1] >= txtend) /* test for scroll out end */ {lval = scrtotxt(1,scrlin-1); /* save entire screen buffer */ buildrp(1,rowptr[1]); /* build row pointer array */ } else lval = scrtotxt(scrlin-i,i); /* just save scrolled out lines */ if (!lval) /* insert if no error */ lval = insert(rowptr[srow],n); /* insert the lines */ if (lval) {dispmsg(lval); /* can't store buffer */ return 0; } shiftscr(srow,-n); /* shift the screen buffer */ buildrp(srow,rowptr[srow]); /* build row pointer array */ build(srow,i); /* build part of screen buffer */ insdlin(srow,i); /* insert n display lines */ } movcur(0,0); /* position the cursor */ return 0; } /* */ /* command line processing utilities */ /* * /* */ /* getcmd : get command line from screen buffer : just */ /* strips nulls from command line */ /* */ getcmd() {char *dp,*sp; int col,dcol; sp = dp = scrbuf; dcol = 0; for (col = 0; col < scrcol; col++) /* move line to command buffer */ {if (*dp = *sp++) /* strip nulls */ {dp++; dcol++; } } *dp = '\0'; /* set last byte to null */ } /* */ /* fndcmd : find command type */ /*  */ fndcmd() {int c; c = toupper(*cmdptr++); /* get command character */ switch (c) {case 'A': return APPEND; case 'B': return BEGIN; case 'C': return CHANGE; case 'D': return DELCHR; case 'E': return EXIT; case 'F': return FIND; case 'H': return HDCPY; case 'I': return INSERT; case 'J': return JUMP; case 'K': return KILL; case 'L': return LINES; case 'M': return MARGIN; case 'P':  return PAGE; case 'Q': return QUIT; case 'R': return RETRIEV; case 'S': return SAVE; case 'T': return TYPE; case 'W': return WRITE; case 'Z': return END; case '(': return LPAREN; case ')': return RPAREN; default: {cmdptr--; return NOCMD; } } } /* */ /* movptr : move text ptr n lines forward or backward */ /* note : the global variable linctr records the number */ /* of lines actually traversed */ /* */ char *movptr(tp,lines) char *tp; int lines; {linctr = lines; if (lines > 0) {while ((lines > 0)&&(tp < txtend)) /* skip forward in buffer */ {if (*tp++ == '\n') /* test for newline */ lines--; } lines = 0; /* force lines to zero */ } else {lines--; /* skip backward in buffer */ while ((lines < 0)&&(--tp >= txtbuf)) {if (*tp == '\n') lines++; } tp++; /* advance to beg of line */ if (lines) /* test for count exhausted */ lines++; linctr -= lines; } return tp; } /* */ /* shift : shift text buffer up or down */ /* */ shift(tp,ldif) char *tp; int ldif; {if (!ldif) /* test for data to move */ return 0; /* no data */ if (txtend+ldif > txtbufe) /* test for enough room */ return ERTBF; /* text buffer full */ movmem(tp,tp+ldif,txtend-tp); /* shift the buffer */ txtend += ldif; /* set new end of text buffer */ return 0; } /* */ /* substit : substitute one string for another */ /* */ char *substit(dp,sp,dlen,slen) char *dp,*sp; int dlen,slen; {if (shift(dp+dlen,slen-dlen)) /* shift buffer */ return NULL; /* no room in text buffer */ while (*sp) /* transfer replacement string */ *dp++ = *sp++; return dp; /* return new pointer */ } /* */ /* getstr : get string from command line */ /* */ getstr(str) char *str; {char tchar,*cp; blanks(); /* skip leading blanks */ if (!(tchar = *cmdptr)) /* set start character */ return 0; /* premature end of line */ if ((tchar != '\'')&&(tchar != '\"')) /* must be ' or " */ return 0; for (cp =cmdptr+1; *cp != tchar; cp++) {if (!*cp) /* test for eol */ return 0; /* bad string */ if (*cp == '\^') /* convert circumflex to newline */ *str++ = '\n'; else *str++ = *cp; /* otherwise store character */ } *str = '\0'; /* terminate string */ cmdptr = cp; /* set command ptr to terminator */ return 1; } /* */ /* fndstr : find string in buffer */ /* */ char *fndstr(str,slen) char *str; int slen; {char *tp; if (!slen) /* test for null string */ return txtptr; /* right here is fine */ for (tp = txtptr; tp+slen < txtend; tp++) /* search buffer */ if ((*str == *tp)&&(strcom(str,tp) == 0)) /* search, compare */ return tp; return NULL; /* string not found */ } /* */ /* blanks : skip leading blanks/tabs in command line */ /* */ blanks() {while (*cmdptr == ' ' || *cmdptr == '\t') cmdptr++; } /* */ /* screen loop processing utilities */ /* */ /* */ /* movcur : move the cursor the specified amount */ /* */ movcur(drow,dcol) int drow,dcol; {int row,col; if (!srow) /* don't move if command line */ drow = 0; row = srow+drow; /* compute new row */ col = scol+dcol; /* compute new column */ if (col >= rtcol) /* test for window overflow */ {col = lftcol; /* return to left column */ if (srow) /* if not command line, */ row++; /* wrap to next line */ } else if (col < lftcol) /* test for window underflow */ {col = rtcol-1; /* go to right column */ if (srow) /* if not command line, */ row--; /* wrap to previous line */ } if (row >= scrlin) /* test for row overflow */ {scroll(1); /* scroll forward a line */ row = scrlin-1; } else if (srow&&(row < 1)) /* test for row underflow */ {scroll(-1); /* scroll back a line */ row = 1; } scrptr = scrbuf+row*scrcol+col; /* compute screen buffer ptr */ loadkb(); /* buffer input */ if (drow||(dcol >= 0)) /* get direction of move */ {while (!*scrptr) /* fwd : skip tab regions */ {scrptr++; /* bump ptr */ if (++col >= rtcol) /* test for wraparound */ {scrptr += scrcol-dspcol; /* reset screen pointer */ col = lftcol; /* wrap to beg of line */ if (srow&&(++row >= scrlin)) {scroll(1); /* scroll forward one line */ row = scrlin-1; scrptr = scrbuf+row*scrcol+lftcol; } } } } else {while (!*scrptr) /* backward : skip tabs */ {scrptr--; /* decrement ptr */ if (--col < lftcol) /* test for wraparound */ {scrptr -= scrcol+dspcol; /* reset screen pointer */ col = rtcol-1; if (srow&&(--row < 1)) {scroll(-1); /* scroll backward one line */ row = 1; scrptr = scrbuf+scrcol+rtcol-1; } } }  } srow = row; scol = col; cursor(srow,scol-lftcol); /* position the cursor */ } /* */ /* scroll : scroll the screen up or down */ /* updates the text buffer with lines scrolled out */ /* if n > 0, scroll forward in file; if n < 0, scroll */ /* backward in file */ /* */ scroll(n) int n; {int i,sval; movptr(txtptr,n); /* count # of lines available */ n = linctr; if (!n) /* test for null scroll */ return 0; if (n > 0) /* test for scroll forward */ {if ((i = n) >= scrlin-1) /* test for full page or more */ i = scrlin-1; if (sval = scrtotxt(1,i)) /* scroll out the screen lines */ {dispmsg(sval); return 0; } txtptr = movptr(txtptr,n); /* move the text pointer */ shiftscr(1,i); /* shift the screen buffer */ buildrp(1,txtptr); /* build the row pointer array */ build(scrlin-i,i); /* build the screen buffer */ deldlin(1,n); /* delete n screen lines */ } else {if ((i = n) <= -scrlin+1) /* test for full page or more */ i = -scrlin+1; if (rowptr[scrlin-1] >= txtend) /* test for end of buffer */ sval = scrtotxt(1,scrlin-1); /* save entire buffer */ else sval = scrtotxt(scrlin+n,-n); if (sval) {dispmsg(sval); return 0; } txtptr = movptr(txtptr,n); /* move the text pointer */ shiftscr(1,i); /* shift the screen buffer */ buildrp(1,txtptr); /* build row pointer array */ build(1,-i); /* build part of screen buffer */ insdlin(1,-i); /* insert n lines */ } if (srow&&(srow-n > 0)&&(srow-n < scrlin)) srow -= n; /* cursor still on screen */ return 0; } /* */ /* shiftscr : shift screen buffer up or down */ /* */ shiftscr(row,n) int row,n; {char *s; int i; if ((!n)||(row+n >= scrlin)||(row-n >= scrlin)) return 0; s = scrbuf+row*scrcol; if (n > 0) {movmem(scrbuf+(row+n)*scrcol,s,(scrlin-row-n)*scrcol); for ( ; row+n < scrlin; row++) /* shift row flags */  rowflg[row] = rowflg[row+n]; } else {movmem(s,scrbuf+(row-n)*scrcol,(scrlin-row+n)*scrcol); for (i = scrlin-n-1; i >= row; i--) /* shift row flags */ rowflg[i] = rowflg[i+n]; } return 0; } /* */ /* deldlin : delete n lines from the display */ /* if display allows direct delete, it is performed; */ /* if not, the screen below the delete is redisplayed */ /* */ deldlin(row,n) int row,n; {if ((row+n < scrlin)&&(n <= term.mld)) /* test for too many */ {if (term.dcl[0] >= 0) /* test for line delete */ {cursor(row,0); /* delete n lines */ dellin(row,n); } else dispscr(row,scrlin-row-n); /* display a block */ dispscr(scrlin-n,n); /* display bottom lines */ } else dispscr(row,scrlin-row); /* redisplay everything */ } /* */ /* insdlin : insert n blank lines into the display */ /* */ insdlin(row,n) int row,n; {if ((row+n < scrlin)&&(n <= term.mld)) /* test for too many */  {if (term.icl[0] >= 0) /* test for insert available */ {cursor(row,0); /* insert n lines */ inslin(row,n); } else dispscr(row+n,scrlin-row-n); /* display bottom of screen */ dispscr(row,n); /* display inserted lines */ } else dispscr(row,scrlin-row); /* display all below */ } /* */ /* scrtotxt : update text buffer with n lines of screen */ /* buffer */ /* */ scrtotxt(row,n) int row,n; {int slen; slen = scrcnt(row,n); /* count the screen lines */ return (store(row,n,slen)); /* store the data */ } /* */ /* save remainder of line in line buffer */ /* returns column number of last printing character */ /* in the line */ /* */ scrtolin(ptr,col,lcol) char *ptr; int col,lcol; {char *lptr; int rcol,ecol; ecol = rowflg[srow]; /* set last column value */ lptr = linbuf+lcol; /* set line buffer ptr */ rcol = col; loadkb(); /* read character if available */ for ( ;col < ecol; col++, ptr++) /* write remainder of screen line */ {if (*lptr = *ptr) /* transfer char */ {lptr++; /* don't count nulls */ if ((*ptr != '\t') && (*ptr != ' ')) rcol = col; } } loadkb(); /* read character if avail */ *lptr = '\0'; /* mark the end of the line */ return rcol; } /* */ /* copy line buffer into screen buffer */ /* */ lintoscr(ptr,col) char *ptr; int col; {char *lptr; int tcol,rcol; lptr = linbuf; /* set ptr to beg of line buffer */ rcol = col; loadkb(); /* read keyboard */ while (*lptr&&(col < scrcol)) {col++; if ((*ptr++ = *lptr) == '\t') /* test for tab */ {tcol = fndtab(col); /* get next tab stop */ while (col < tcol) /* fill with nulls */ {col++; *ptr++ = '\0'; } } else if (*lptr != ' ') /* if not space, log as print char */ rcol = col-1; lptr++; } loadkb(); /* read keyboard */ rowflg[srow] = col; /* set last column */ while (col++ < scrcol) /* fill to end of line with space */ *ptr++ = ' '; return rcol; } /* */ /* dispstat : display editor status */ /* current version displays only space information, */ /* but it is possible to display input and output files, */ /* current line number, etc. */ /* */ dispstat() {cursor(0,msgcol); /* position cursor */ erasline(0,msgcol); /* erase any message in area */ putcrt('U'); /* display space used */ putval(txtend-txtbuf); putcrt('/'); putcrt('T'); /* display total space available */ putval(txtbufl); putcrt('/'); putcrt('C'); /* display current text position */ putval(txtptr-txtbuf); cursor(srow,scol-lftcol); /* reset cursor */ } /* */ /* putval : display an integer value */ /* */ putval(val) unsigned val; {int digit,dflg,*d; static int dectab[] = {10000, 1000, 100, 10, 1, 0}; for (d = dectab, dflg = 0; *d; d++) /* do all digits */ {if ((digit = val/(*d))||(dflg)) /* print if nonzero */ {putcrt('0'+digit); /* output the digit */ dflg = 1; /* set digit flag */ } val = val%(*d); /* get next value */ } if (!dflg) /* must display at least one 0 */ putcrt('0'); } /* */ /* fndtab : find next tab stop */ /* */ fndtab(col) int col; {int *t; for (t = tabstop; *t < col; t++) ; if (*t < scrcol) /* test for right edge of line */ return *t; /* return tab stop */ else return scrcol; /* return end of line */ } /* */  /* echo remainder of line to screen */ /* checks to see whether line is blank, doesn't write if */ /* if it is */ echoline(ptr,col,acol,bcol) char *ptr; int col,acol,bcol; {if (acol < bcol) /* just rewrite as necessary */ acol = bcol; if (acol >= rtcol) /* limit to visible region */ acol = rtcol-1; for ( ; col <= acol; col++) /* display to last nonblank */ echo(*ptr++); /* display a character */ } /* */ /* Miscellaneous utility functions */ /*  */ /* */ /* strcom : string compare (first string is terminated by */ /* \0, second need not be) */ /* */ strcom(s,t) char *s,*t; {int d; while (*s) /* till end of string */ {if (d = (*s++)-(*t++)) /* test for equality */ return d; } return 0; } /* */ /* ucstrcom : upper-case string compare */ /* (upper-case version of strcom) */ /* */ ucstrcom(s,t) char *s,*t; {int d; while (*s) /* till end of string */ {if (d = toupper(*s++)-toupper(*t++)) /* test for equality */ return d; } return 0; } /* */ /* ucstrcmp : upper case string compare (strings must be */ /* same length to compare as equal) */ ucstrcmp(s,t) char *s,*t; {int d; while (*s) /* test for end of string */ {if (d = toupper(*s++)-toupper(*t++)) /* test for equality */ return d; } return (*s-*t); /* maybe equal */ } /* */ /* getval : get value from command line */ /* */  getval() {int val,sign,digit; val = 0; /* clear initial value */ sign = 1; /* initial sign is plus */ blanks(); /* skip leading blanks */ if (!*cmdptr) /* test for eol */ return 0; if (*cmdptr == '-') /* test for negative */ {sign = -1; cmdptr++; } else if (*cmdptr == '+') /* test for plus */ cmdptr++; if (!*cmdptr) /* test for end of line */ return sign; if (*cmdptr == '#') /* test for large number */ {cmdptr++; /* bump past character */ return sign*LRGVAL; /* return large value */ } if (!isdigit(*cmdptr)) /* test for digit */ return sign; /* default value is one */ while (*cmdptr && isdigit(digit = *cmdptr)) {val = val*10+(digit-'0'); /* combine new digit */ cmdptr++; } return sign*val; /* return computed value */ } /* */ /* Echo a character */ /* */ echo(ochar) char ochar; {if ((!ochar) || (ochar == '\t')) /* convert null and tab to space */ putcrt(' '); else if (ochar == '\f') /* test for form feed */ putcrt(HAT); /* echo as ^ */ else putcrt(ochar); } /* */ /* putstr : output a string to the display */ /* */ putstr(s) char *s; {while (*s) /* do till end of string */ putcrt(*s++); } /* */ /* clrsbuf : clear screen buffer to spaces */ /* */ clrsbuf(row,n) int row,n; {char *s; int i,j; s = scrbuf+row*scrcol; while (n--) for (j = 0; j < scrcol; j++) *s+t process */ } trmct = write(trmfd,term[trmno-1],sizeof (struct trmtyp)); close(trmfd); /* close the file */ if (trmct != sizeof (struct trmtyp)) /* test for error */ {unlink("cse.$$$"); /* error : delete the file */ putstr("bad write on temporary file\n"); exit(0); } unlink("cse.trm"); /* delete existing CSE.TRM */ if (rename("cse.$$$","cse.trm")) /* rename CSE.$$$ to CSE.TRM */ {unlink("cse.$$$"); /* can't rename temp file */ putstr("can't rename temporary file\n"); exit(0); } putstr("\nSuccessful installation, process complete\n"); exit(0); } /* */ /* count : count number of terminals */ /* */ count() {int i; for (i = 0; term[i]; i++) ; return i; } /* */ /* select : select a terminal from the list */ /* */ select() {char c; int i,tval; while (1) {putstr("\n Terminal Choices\n\n"); for (i = 0; i < (nterm+1)/2; i++) /* display terminal names */  {dspnam(i); /* display two names */ putcrt('\n'); /* issue newline */ } putstr("\nSelect terminal type by number : "); tval = getval(); /* get response */ if (tval < 0) /* test for abort */ return 0; if ((tval > 0)&&(tval <= nterm)) /* test for valid number */ {putstr("\nYou have selected "); /* echo name of selection */ putstr(term[tval-1]->trmname); if (confirm()) /* confirm choice */ return tval; } else putstr("\nInvalid terminal selection\n"); } } it(0); } putstr("\nSuccessful installation, process complete\n"); exit(0); } /* + = ' '; } /* */ /* clrrbuf : clear rowflag buffer to -1 (all empty lines) */ /* */ clrrbuf(row,n) int row,n; {while (n--) rowflg[row++] = -1; } git(digit = *cmdptr)) {val = val*10+(digit-'0'); /* combine new d/* */ /* CSEIN : Terminal Installation Program for CSE */ /* */ /* copyright (c) 1982,83 Northwest Microsystem Design */ /* created 12/8/82, 1445 hrs */ /* version 1.3b */ /* last modified 3/14/83, 2145 hrs */ /* */ /* This program performs two functions : */ /* (1) it configures CSE for a specific terminal */ /* type */ /* (2) it configures CSE for a specific set of */ /* control keys */ /* (1) Specification of the terminal configuration can be */ /* in any of four ways */ /* (a) Selection of a terminal type from a set */ /* of standard types */ /* (b) Modification of a standard terminal type */ /* (c) Modification of an existing configuration */ /* file */ /* (d) Creation of a new terminal type using the */ /* custom terminal installation feature */ /* (2) Specification of CSE control keys */ /* (a) Use of the default set of control keys */ /* as specified in the manual */ /* (b) Modification of any of the control key */ /* sequences using the control key specifica- */ /* tion feature */ #include "stdio.h" #include "csedef.c" /* miscellaneous variables */ int mpmflg,nterm; /* backspace/delete message */ char bsdel[] = {BS,' ',BS,'\0'}; /* BS/SPACE/BS */ /* */ /* long messages */ /* */ /* ismsg : installation startup message */ char *ismsg[] = {"\nCSE v1.3 Terminal Installation Program\n", "copyright (c) 1982,83 NW Microsystem Design\n", "\nInstalling for an MP/M system? ", "" }; /* ctmsg : custom terminal message */ char *ctmsg[] = {"\nCustom Terminal Installation\n", "First, specify the size of the terminal.\n", "" }; /* ckmsg : cursor key message */ char *ckmsg[] = {"\n\nNext, you must specify the cursor keys for\n", " the terminal. Each key will be specified by\n", " the number of characters in the string, followed\n", " by the characters themselves. For singext,\n", " and whether it is in binary or ASCII format. The\n", " choices are :\n", " r : binary row\n", " c : binary column\n", " R : ASCII row\n", " C : ASCII column\n", /* translate table of strings for nonprinting characters */ char *xltab[] = {"NUL", "SOH", "STX", "ETX", "EOT", "ENQ", "ACK", "BELL", "BS", "TAB", "LF", "VT", "FF", "CR", "SO", "SI", "DLE", "DC1", "DC2", "DC3", "DC4", "NAK", "SYN", "ETB", "CAN", "EM", "SUB", "ESC", "FS", "GS", "RS", "US", "SPACE" }; /* */ /* trmtyp : structure defining terminal characteristics */ /* */ struct trmtyp {int mpm; /* MP/M indicator */ char trmname[16]; /* terminal name */ int trmrow,trmcol; /* # of rows,columns displayed */ char ccup[8], /* up arrow cursor string */ ccdn[8], /* down arrow cursor string */ cclft[8], /* left arrow cursor string */ ccrt[8], /* right arrow cursor string */ cchom[8]; /* home cursor string */ char cplead[8], /* cursor leadin string */ cpsep[4], /* separator */ cptrm[4]; /* terminator */ char cp1st, /* binary row */ cp2nd; /* binary column */ int rofs, /* row offset */ cofs; /* column offset */ int cpdly; /* delay */ char erline[8]; /* erase to end of line */ int eldly; /* delay */ char erscrn[8]; /* erase to end of screen */ int esdly; /* delay */ }; struct trmtyp tvi920 = {0, /* MP/M */ "TVI 912/920 ", /* Televideo 912 or 920 */ 24,80, /* 24 rows, 80 columns */ CTRLK,-1,0,0,0,0,0,0, /* up cursor */ CTRLJ,-1,0,0,0,0,0,0, /* down cursor */ CTRLH,-1,0,0,0,0,0,0, /* left cursor */ CTRLL,-1,0,0,0,0,0,0, /* right cursor */ CTRLHAT,-1,0,0,0,0,0,0, /* home cursor */ ESC,'=',-1,0,0,0,0,0, /* cursor leadin string */ -1,0,0,0, /* separator */ -1,0,0,0, /* terminator */ 'r', /* binary row */ 'c', /* binary column */ 32, /* row offset */ 32, /* column offset */ 0, /* cursor delay */ ESC,'T',-1,0,0,0,0,0, /* erase to end of line */ 0, /* erase line delay */ ESC,'Y',-1,0,0,0,0,0, /* erase rest of screen */ 0 /* erase screen delay */ }; struct trmtyp tvi925 = {0, /* MP/M */ "TVI 925/950 ", /* Televideo 925 or 950 */ 24,80, /* 24 rows, 80 columns */ CTRLK,-1,0,0,0,0,0,0, /* up cursor */ CTRLV,-1,0,0,0,0,0,0, /* down cursor */ CTRLH,-1,0,0,0,0,0,0, /* left cursor */ CTRLL,-1,0,0,0,0,0,0, /* right cursor */ CTRLHAT,-1,0,0,0,0,0,0, /* home cursor */ ESC,'=',-1,0,0,0,0,0, /* cursor leadin string */ -1,0,0,0, /* separator */ -1,0,0,0, /* terminator */ 'r', /* binary row */ 'c', /* binary column */ 32, /* row offset */ 32, /* column offset */ 0, /* cursor delay */ ESC,'T',-1,0,0,0,0,0, /* erase to end of line */ 0, /* erase line delay */ ESC,'Y',-1,0,0,0,0,0, /* erase rest of screen */ 0 /* erase screen delay */ }; /* */ /* main : dialog with operator */ /* */ main() {char c,*p,*custom(); int trmno,trmfd; unsigned trmct; putlmsg(ismsg); mpmflg = 0; /* assume not MP/M */ c = getcrt(); /* get response */ if (c == CTRLC) /* test for abort */ exit(0); putcrt(c); /* echo the character */ if ((c == 'y') || (c == 'Y')) /* test for y or Y */ {putstr("\nMP/M system\n\n"); mpmflg = 1; } else putstr("\nNot MP/M system\n\n"); /* otherwise, no */ nterm = count(); /* count terminals */ trmno = select(); /* get terminal type */ if (!trmno) /* check for abort */ exit(0); if (trmno == nterm) /* test for custom install */ {if (p = custom()) /* do custom installation */ {putstr(p); /* error in installation */ exit(0); } } term[trmno-1]->mpm = mpmflg; /* set MP/M flag */ trmfd = creat("cse.$$$",BWRITE); /* open temp file CSE.$$$ */ if (trmfd < 0) /* test for good open */ {putstr("can't create temporary file\n"); /* can't open */ exit(0); /* abor le-character\n", " strings, simply press the cursor key itself. For\n", " multicharacter strings, enter each character in the\n", " string individually; otherwise, some characters in\n", " in the string may be missed. For example, if the\n", " up arrow key sends the string ESC [ A, enter the string\n", " by typing ESC, then [, then A, not by pressing the up\n", " arrow key. A WARNING : on many systems, multicharacter\n", " cursor strings may not work, due to lost characters.\n",  " In such a case (due to inability of CSE and the BDOS to\n", " read input characters that quickly), you will have to\n", " use the CONTROL/E-S-D-X-T keys for cursor control.\n", " If your terminal has no key for the specified\n", " function, enter 0 as the number of characters\n", "" }; /* cpmsg : cursor positioning message */ char *cpmsg[] = {"\n\nNow, you must specify the cursor positioning format.\n", " The general cursor positioning format consists of a\n", " leadin string, the row or column, a separator string,\n", " the column or row, and a terminator string. In\n", " addition, row and column may be in either binary or\n", " ASCII format, there may be row and column offsets, and\n", " there may be a delay after the string is issued.\n", "" }; /* rcmsg : row/column selection message */ char *rcmsg[] = {"\n\nSpecify whether row or column is specified next,\n", " and whether it is in binary or ASCII format. The\n", " choices are :\n", " r : binary row\n", " c : binary column\n", " R : ASCII row\n", " C : ASCII column\n", "Type (", "" }; /* rcomsg : row/column offset message */ char *rcomsg[] = {"\n\nFor most terminals, an offset must be added to the\n", "row and column address. For example, the Televideo\n", "terminals require an offset of 32\n", "" }; /* dlymsg : delay message */ char *dlymsg[] = {"\nSome terminals require a delay following this\n", " operation. It is specified in terms of null char-\n", " acters issued after the operation. Most terminals do\n", " not require a delay, so if you are unsure, try 0 for\n", " now.\n", "" }; /* modmsg : editor control modify message */ char *modmsg[] = {"\nCSE allows user-definition of almost all command\n", " control sequences. For example, if you wish, you may\n", " redefine the 'page forward' key from the default (CTRL/P)\n", " to the key of your choice (such as one of the function\n", " keys on your terminal). In this way, you can define the\n", " CSE command structure as you wish. Do you want to modify\n", " any of the editor control sequences? ", "" }; /* eckmsg : editor control key message */ char *eckmsg[] = {"\nYou will be asked whether you wish to modify each\n", " modifiable editor command sequence. The default string\n", " is enclosed in parentheses. If you wish to modify the\n", " string, type 'Y' or 'y'; if you do not wish to modify the\n",  " string, type anything else, and the string will be left\n", " unchanged.\n", "" }; /* translate tables of strings for nonprinting characters */ char *xltab[] = {"NUL", "SOH", "STX", "ETX", "EOT", "ENQ", "ACK", "BELL", "BS", "TAB", "LF", "VT", "FF", "CR", "SO", "SI", "DLE", "DC1", "DC2", "DC3", "DC4", "NAK", "SYN", "ETB", "CAN", "EM", "SUB", "ESC", "FS", "GS", "RS", "US", "SPACE" }; char *xltab1[] = {"CTRL/@'", "CTRL/A", "CTRL/B", "CTRL/C", "CTRL/D", "CTRL/E", "CTRL/F", "CTRL/G", "CTRL/H", "TAB", "LF", "CTRL/K", "CTRL/L", "CR", "CTRL/N", "CTRL/O", "CTRL/P", "CTRL/Q", "CTRL/R", "CTRL/S", "CTRL/T", "CTRL/U", "CTRL/V", "CTRL/W", "CTRL/X", "CTRL/Y", "CTRL/Z", "ESC", "CTRL/\\", "CTRL/]", "CTRL/^", "CTRL/_", "SPACE" }; /* */ /* spstr : structure defining special control strings */ /* */ struct spstr {char sdelb[8], /* backspace/delete */ sd hom[8], /* alternate home cursor */ bot[8], /* bottom of screen */ fsm[8], /* forward space multiple */ bsm[8], /* back space multiple */ ldel[8], /* delete line */ lers[8], /* erase line */ ins[8], /* toggle insert mode */ gst[8], /* get status */ ldn[8], /* line down */ pdn[8], /* page down */ lpag[8], /* page to current cursor */ lup[8], /* line up */ pup[8], /* page up */ lkil[8], /* delete a line */ lins[8], /* insert a line */ lesc[8], /* process screen buffer */ ldet[8], /* detach from console */ lcan[8], /* cancel changes */ abrt[8], /* abort process */ stop[8], /* terminate process */ lisp[8], /* initiate special processing */ nlkil[8], /* delete lines */ nlins[8]; /* insert lines */ }; rt */ char delb[8], /* backspace/delete */ del[8], /* delete in place */ upa[8], /* alternate up ar/* */ /* CSEIN : Terminal Installation Program for CSE */ /* */ /* copyright (c) 1982, Northwest Microsystem Design */ /* created 12/8/82, 1445 hrs */ /* version 1.2 */ /* last modified 12/29/82, 2300 hrs */ /* */ /* This program allows selection of a terminal type */ /* from a selection of standard types; in addition, */ /* it allows the user to specify a custom terminal */ /* configuration if necessary */ /* */ #include "stdio.h" /* terminal control character equates */ #define CTRLC 3 #define CTRLF 6 #define CTRLH 8 #define BS 8 #define LF 10 #define CTRLJ 10 #define CTRLK 11 #define CTRLL 12 #define CR 13 #define CTRLU 21 #define CTRLV 22 #define CTRLZ 26 #define ESC 27 #define CTRLHAT 30 #define SPACE 32 #define DEL 127 /* miscellaneous variables */ int mpmflg,nterm; /* backspace/delete message */ char bsdel[] = {BS,SPACE,BS,'\0'}; /* BS/SPACE/BS */ /* */ /* long messages */ /*  */ /* ismsg : installation startup message */ char *ismsg[] = {"\nCSE v1.2 Terminal Installation Program\n", "copyright (c) 1982, NW Microsystem Design\n", "\nInstalling for an MP/M system? ", "" }; /* ctmsg : custom terminal message */ char *ctmsg[] = {"\nCustom Terminal Installation\n", "First, specify the size of the terminal.\n", "\nNumber of rows : ", "" }; /* ckmsg : cursor key message */ char *cpmsg[] = {"\n\nNow, you must specify the cursor positioning format.\n", " The general cursor positioning format consists of a\n", " leadin string, the row or column, a separator string,\n", " the column or row, and a terminator string. In\n", " addition, row and column may be in either binary or\n", " ASCII format, there may be row and column offsets, and\n", " there may be a delay after the string is issued.\n", "" }; /* rcmsg : row/column selection message */ char *rcmsg[] = {"\n\nSpecify whether row or column is specified n!el[8], /* delete in place */ supa[8], /* alternate up arrow */ sdna[8], /* alternate down arrow */ sbsp[8], /* alternate left arrow */ sfsp[8], /* alternate right arrow */ shom[8], /* alternate home cursor */ sbot[8], /* bottom of screen */ sfsm[8], /* right arrow multiple */ sbsm[8], /* left arrow multiple */ sldel[8], /* delete line */ slers[8], /* erase line */ sins[8], /* toggle insert mode */ sgst[8], /* get status */ sldn[8], /* line down */ spdn[8], /* page down */ slpag[8], /* page to cursor line */ slup[8], /* line up */ spup[8], /* page up */ slkil[8], /* kill cursor line */ slins[8], /* insert at cursor line */ slesc[8], /* process screen buffer */ sldet[8], /* detach from console */ slcan[8], /* cancel changes */ sabrt[8], /* abort process */ sstop[8], /* terminate process */ slisp[8], /* initiate special processing */ snlkil[8], /* kill next n lines */ snlins[8]; /* insert n lines at cursor */ }; /* default special character strings */ struct spstr spdef = {DEL,-1,0,0,0,0,0,0, /* backspace/delete */ CTRLG,-1,0,0,0,0,0,0, /* delete in place */ CTRLE,-1,0,0,0,0,0,0, /* alternate up arrow */ CTRLX,-1,0,0,0,0,0,0, /* alternate down arrow */ CTRLS,-1,0,0,0,0,0,0, /* alternate left arrow */ CTRLD,-1,0,0,0,0,0,0, /* alternate right arrow */ CTRLT,-1,0,0,0,0,0,0, /* alternate home cursor */ CTRLB,-1,0,0,0,0,0,0, /* bottom of screen */ CTRLF,-1,0,0,0,0,0,0, /* right arrow multiple */ CTRLA,-1,0,0,0,0,0,0, /* left arrow multiple */ CTRLY,-1,0,0,0,0,0,0, /* delete line */ CTRLR,-1,0,0,0,0,0,0, /* erase line */ CTRLN,-1,0,0,0,0,0,0, /* toggle insert mode */ CTRLU,-1,0,0,0,0,0,0, /* get status */ CTRLZ,-1,0,0,0,0,0,0, /* line forward */ CTRLP,-1,0,0,0,0,0,0, /* page forward */ ESC,'P',-1,0,0,0,0,0, /* page to cursor line */ CTRLW,-1,0,0,0,0,0,0, /* line backward */ CTRLO,-1,0,0,0,0,0,0, /* page backward */ ESC,'K',-1,0,0,0,0,0, /* kill cursor line */ ESC,'I',-1,0,0,0,0,0, /* insert line at cursor */ ESC,ESC,-1,0,0,0,0,0, /* process screen buffer */ ESC,'S',-1,0,0,0,0,0, /* detach from console */ ESC,'Q',-1,0,0,0,0,0, /* cancel unlogged changes */ CTRLQ,-1,0,0,0,0,0,0, /* abort process */ CTRLC,-1,0,0,0,0,0,0, /* terminate process */ ESC,-1,0,0,0,0,0,0, /* initiate special processing */ 'K',-1,0,0,0,0,0,0, /* kill next n lines */ 'I',-1,0,0,0,0,0,0 /* insert n lines at cursor */ }; /* */ /* trmtyp : structure defining terminal characteristics */ /*  */ struct trmtyp {int mpm; /* MP/M indicator */ char trmname[16]; /* terminal name */ int trmrow,trmcol; /* # of rows,columns displayed */ char ccup[8], /* up arrow cursor string */ ccdn[8], /* down arrow cursor string */ cclft[8], /* left arrow cursor string */ ccrt[8], /* right arrow cursor string */ cchom[8]; /* home cursor string */ char cplead[8], /* cursor leadin string */ cpsep[4], /* separator */ cptrm[4]; /* terminator */ char cp1st, /* binary row */ cp2nd; /* binary column */ int rofs, /* row offset */ cofs; /* column offset */ int cpdly; /* delay */ char reset[8]; /* terminal reset string */ int rsdly; /* delay */ char erseol[8]; /* erase to end of line */ int eldly; /* delay */ char erseos[8]; /* erase to end of screen */ int esdly; /* delay */ char ersall[8]; /* erase entire screen */ int eadly; /* delay */ char dcl[8]; /* delete current line */ int dldly; /* delay */ int mld; /* maximum lines to delete */ char icl[8]; /* insert at current line */ int ildly; /* delay */ int mli; /* maximum lines to insert */ }; struct trmtyp tvi910 = {0, /* MP/M */ "TVI 910 ", /* Televideo 910 */ 24,80, /* 24 rows, 80 columns */ CTRLK,-1,0,0,0,0,0,0, /* up cursor */ CTRLJ,-1,0,0,0,0,0,0, /* down cursor */ CTRLH,-1,0,0,0,0,0,0, /* left cursor */ CTRLL,-1,0,0,0,0,0,0, /* right cursor */ CTRLHAT,-1,0,0,0,0,0,0, /* home cursor */ ESC,'=',-1,0,0,0,0,0, /* curs!/* */ /* csedef.c : common definition file */ /* */ /* copyright (c) 1982,83 Northwest Microsystem Design */ /* by Ken Smolek */ /* created 1/20/83, 1530 hrs */ /* version 1.3b */ /* last modified 3/14/83, 2145 hrs */ /* character definitions */ #define CTRLA 1 #define CTRLB 2 #define CTRLC 3 #define CTRLD 4 #define CTRLE 5 #define CTRLF 6 #define CTRLG 7 #define BS 8 #define CTRLH 8 #define CTRLJ 10 #define CTRLK 11 #define CTRLL 12 #define CTRLN 14 #define CTRLO 15 #define CTRLP 16 #define CTRLQ 17 #define CTRLR 18 #define CTRLS 19 #define CTRLT 20 #define CTRLU 21 #define CTRLV 22 #define CTRLW 23 #define CTRLX 24 #define CTRLY 25 #define CTRLZ 26 #define ESC 27 #define CTRLHAT 30 #define HAT 94 #define DEL 127 /* character types : used by screen loop processor */ #define IGNORE 0 #define NORML 1 #define DELBACK 2 #define DELETE 3 #define NEWLINE 4 #define HOME 5 #define BOTTOM 6 #define RTARW 7 #define LFTARW 8 #define UPARW 9 #define DNARW 10 #define RTARWM 11 #define LFTARWM 12 #define LDEL 13 #define LERASE 14 #define INSTOG 15 #define STATUS 16 #define PAGEDN 17 #define PAGEUP 18 #define LINEUP 19 #define LINEDN 20 #define CANCEL 21 #define LKILL 22 #define LINS 23 #define LPAGE 24 #define LQUIT 25 #define LDET 26 #define LESC 27 /* return values used by tststop */ #define ABORT 1 /* abort process */ #define STOP 2 /* stop process */ /* buffered input definitions */ #define NR 0 /* nondestructive read character */ #define DR 1 /* destructive read character */ #define RPLP 0 /* set read ptr to lookahead ptr */ #define LPRP 1 /* set lookahead ptr to read ptr */ /* MP/M BDOS function call definitions */ #define ACON 146 /* attach console */ #define DCON 147 /* detach console */ #define DLST 159 /* detach list */ #define CALST 161 /* conditional attach list */ /* miscellaneous definitions */ #define HDRLEN 10 /* length of header message */ #define MSGLEN 20 /* message length */ #define MINROW 2 /* minimum # of screen rows */ #define MAXROW 66 /* maximum number of screen rows */ #define MINCOL 40 /* minimum number of screen columns */ #define MAXCOL 256 /* maximum number of screen columns */ #define LRGVAL 25000 /* large integer value */ #define MAXPAGE 400 /* maximum page scroll */ /* */ /* regs : structure for use in system interrupt (sysint) */ /* function calls, in which the registers must be set up */ /* */  struct regs {int ax,bx,cx,dx,si,di,ds,es; }; /* */ /* config : structure defining terminal characteristics */ /* and special control strings */ /* */ struct config {int mpm; /* MP/M indicator */ char trmname[16]; /* terminal type */ int trmrow,trmcol; /* # of rows,columns displayed */ char ccup[8], /* up arrow cursor string */ ccdn[8], /* down arrow cursor string */ cclft[8], /* left arrow cursor string */ ccrt[8], /* right arrow cursor string */ cchom[8]; /* home cursor string */ char cplead[8], /* cursor leadin string */ cpsep[4], /* separator */ cptrm[4]; /* terminator */ char cp1st, /* binary row */ cp2nd; /* binary column */ int rofs, /* row offset */ cofs; /* column offset */ int cpdly; /* delay */ char reset[8]; /* terminal reset string */ int rsdly; /* delay */ char erseol[8]; /* erase to end of line */ int eldly; /* delay */ char erseos[8]; /* erase to end of screen */ int esdly; /* delay */ char ersall[8]; /* erase entire screen */ int eadly; /* delay */ char dcl[8]; /* delete current line */ int dldly; /* delay */ int mld; /* maximum lines to delete */ char icl[8]; /* insert at current line */ int ildly; /* delay */ int mli; /* maximum lines to insert */ char delb[8], /* backspace/delete */ del[8], /* delete in place */ upa[8], /* alternate up arrow */ dna[8], /* alternate down arrow */ bsp[8], /* alternate left arrow */ fsp[8], /* alternate right arrow */ "or leadin string */ -1,0,0,0, /* separator */ -1,0,0,0, /* terminator */ 'r', /* binary row */ 'c', /* binary column */ 32, /* row offset */ 32, /* column offset */ 0, /* cursor delay */ ESC,'C',ESC,'+',-1,0,0,0, /* reset terminal */ 0, /* reset delay */ ESC,'T',-1,0,0,0,0,0, /* erase to end of line */ 0, /* erase line delay */ ESC,'Y',-1,0,0,0,0,0, /* erase to end of screen */ 0, /* erase screen delay */ ESC,'+',-1,0,0,0,0,0, /* erase all */ 0,  /* erase all delay */ ESC,'R',-1,0,0,0,0,0, /* delete line */ 0, /* delete line delay */ 12, /* max # to delete */ ESC,'E',-1,0,0,0,0,0, /* insert line */ 0, /* insert line delay */ 12 /* max # to insert */ }; struct trmtyp tvi920 = {0, /* MP/M */ "TVI 912/920 ", /* Televideo 912 or 920 */ 24,80, /* 24 rows, 80 columns */ CTRLK,-1,0,0,0,0,0,0, /* up cursor */ CTRLJ,-1,0,0,0,0,0,0, /* down cursor */ CTRLH,-1,0,0,0,0,0,0, /* left cursor */ CTRLL,-1,0,0,0,0,0,0, /* right cursor */ CTRLHAT,-1,0,0,0,0,0,0, /* home cursor */ ESC,'=',-1,0,0,0,0,0, /* cursor leadin string */ -1,0,0,0, /* separator */ -1,0,0,0, /* terminator */ 'r', /* binary row */ 'c', /* binary column */ 32, /* row offset */ 32, /* column offset */ 0, /* cursor delay */ ESC,'C',ESC,'+',-1,0,0,0, /* reset terminal */ 0, /* delay */ ESC,'T',-1,0,0,0,0,0, /* erase to end of line */ 0, /* erase line delay */ ESC,'Y',-1,0,0,0,0,0, /* erase rest of screen */ 0, /* erase screen delay */ ESC,'+',-1,0,0,0,0,0, /* erase all */ 0, ESC,'R',-1,0,0,0,0,0, 100, 8, ESC,'E',-1,0,0,0,0,0, 100, 8 }; struct trmtyp tvi925 = {0, /* MP/M */ "TVI 925/950 ", /* Televideo 925 or 950 */ 24,80, /* 24 rows, 80 columns */ CTRLK,-1,0,0,0,0,0,0, /* up cursor */ CTRLV,-1,0,0,0,0,0,0, /* down cursor */ CTRLH,-1,0,0,0,0,0,0, /* left cursor */ CTRLL,-1,0,0,0,0,0,0, /* right cursor */ CTRLHAT,-1,0,0,0,0,0,0, /* home cursor */ ESC,'=',-1,0,0,0,0,0, /* cursor leadin string */ -1,0,0,0, /* separator */ -1,0,0,0, /* terminator */ 'r', /* binary row */ 'c', /* binary column */ 32, /* row offset */ 32, /* column offset */ 0, /* cursor delay */ ESC,'C',ESC,'+',-1,0,0,0, /* reset terminal */ 0, /* delay */ ESC,'T',-1,0,0,0,0,0, /* erase to end of line */ 0, /* erase line delay */ ESC,'Y',-1,0,0,0,0,0, /* erase rest of screen */ 0, ESC,'+',-1,0,0,0,0,0, /* erase entire screen */ 0, ESC,'R',-1,0,0,0,0,0, /* delete a line */ 0, 12, ESC,'E',-1,0,0,0,0,0, /* insert a line */ 0, 12 }; struct trmtyp adm3a = {0, /* MP/M */ "ADM-3A ", /* LS ADM-3A */ 24,80, /* 24 rows, 80 columns */ CTRLK,-1,0,0,0,0,0,0, /* up cursor */ CTRLJ,-1,0,0,0,0,0,0, /* down cursor */ CTRLH,-1,0,0,0,0,0,0, /* left cursor */ CTRLL,-1,0,0,0,0,0,0, /* right cursor */ CTRLHAT,-1,0,0,0,0,0,0, /* home cursor */ ESC,'=',-1,0,0,0,0,0, /* cursor leadin string */ -1,0,0,0, /* separator */ -1,0,0,0, /* terminator */ 'r', /* binary row */ 'c', /* binary column */ 32, /* row offset */ 32, /* column offset */ 0, /* cursor delay */ -1,0,0,0,0,0,0,0, /* reset string */ 0, -1,0,0,0,0,0,0,0, /* erase to end of line */ 0, /* erase line delay */ -1,0,0,0,0,0,0,0, /* erase rest of screen */ 0, CTRLZ,-1,0,0,0,0,0,0, /* erase entire screen */ 0, -1,0,0,0,0,0,0,0, /* delete line */ 0, 0, -1,0,0,0,0,0,0,0, /* insert line */ 0, 0 /* erase screen delay */ }; struct trmtyp adm5 = {0, /* MP/M */ "ADM-5 ", /* LS ADM-5 */ 24,80, /* 24 rows, 80 columns */ CTRLK,-1,0,0,0,0,0,0, /* up cursor */ CTRLJ,-1,0,0,0,0,0,0, /* down cursor */ CTRLH,-1,0,0,0,0,0,0, /* left cursor */ CTRLL,-1,0,0,0,0,0,0, /* right cursor */ CTRLHAT,-1,0,0,0,0,0,0, /* home cursor */ ESC,'=',-1,0,0,0,0,0, " forms the physical read of the keyboard */ loadkb() {char c,*tp; tp = stpt; /* set temp ptr */ if (++tp >= inbufe) /* test for wraparound */ tp = inbuf; /* wrap to beginning */ if (tp != rdpt) /* test for space available */ {if (c = testcrt()) /* test for char available */ {stpt = tp; /* set storage ptr */ *stpt = c; /* read and store the character */ } } } /* */ /* setkbp : set keyboard buffer ptr */ /* */ /* two read pointers are used in keyboard input : a */ /* "current character ptr" (rdptr), which points to the */ /* next character to be read, and a "lookahead pointer" */ /* (laptr), which is used to scan ahead of the next */ /* character. The second ptr is required for processing */ /* of special multicharacter keys (cursor or function */ /* keys on many terminals), where all characters must */ /* be read before the key type has been determined */ setkbp(typ) int typ; {if (typ) lapt = rdpt; /* set lookahead ptr */ else rdpt = lapt; /* read ptr */ } /* */ /* testch : test for keyboard character available */ /* does not return the character */ /* */ testch() {return (rdpt-stpt); /* return diff of ptrs */ } /* */ /* getch : return the next character from the keyboard */ /* buffer; wait if none is available */ /* */ /* has two call types : destructive read and nondestruc- */ /* tive read. Both return the next character in the */ /* buffer, but the destructive read increments the read */ /* pointer, while the nondestructive read does not */ /* */ getch(typ) int typ; {char *tp; loadkb(); /* buffer input */ while (rdpt == stpt) /* wait if no character */ loadkb(); tp = rdpt; /* set temp ptr */ if (++tp >= inbufe) /* test for wraparound */ tp = inbuf; if (typ == DR) /* advance ptr if dest read */ rdpt = tp; return (*tp); /* return the character */ } /* */ /* getnch : return the next character from the keyboard */ /* buffer using the lookahead ptr; wait if no character */ /* is available. The lookahead ptr is incremented to the */ /* next character; does not affect the read pointer */ getnch() {loadkb(); /* buffer input */ while (lapt == stpt) /* wait if no character */ loadkb(); if (++lapt >= inbufe) /* test for wraparound */ lapt = inbuf; return (*lapt); /* return the character */ } /* */ /* print : print a character on the print device */ /* */ print(ochar) char ochar; {loadkb(); /* buffer input */ if ((!ochar)||(ochar == '\t')) /* convert null and tab to space */ ochar = ' '; bdos(5,ochar); /* output the character */ } /* */ /* direct console character I/O */ /* */ /* testcrt : test for console input character */ /* returns char if available, 0 if not */ testcrt() {return (bdos(6,-1)&0X7F); /* return input status */ } /* getcrt : get console input character */ getcrt() {char c; while (!(c = bdos(6,-1)&0X7F)) /* wait for character */ ; return c; /* return it */ } /* putcrt : output a character to the console */ putcrt(c) char c; {loadkb(); /* buffer input */ bdos(6,c); /* output the character */ } /* */ /* attcon : attach console if MP/M system */ /* */ attcon() {bdos(ACON,0); /* attach console, wait */ } /* */ /* detcon : detach console if MP/M system */ /* */ detcon() {if (term.mpm) /* test for MP/M system */ bdos(DCON,0); /* detach the console */ } /* */ /* attlst : attach list device if MP/M system */ /* */ attlst() {return (term.mpm && bdos(CALST,0)); /* if MP/M, conditional attach */ } /* */ /* detlst : detach list device if MP/M system */ /* */ detlst() {if (term.mpm) /* test for MP/M system */ bdos(DLST,0); /* detach list */ } s */ } /* getcrt : get console input character # /* cursor leadin string */ -1,0,0,0, /* separator */ -1,0,0,0, /* terminator */ 'r', /* binary row */ 'c', /* binary column */ 32, /* row offset */ 32, /* column offset */ 0, /* cursor delay */ -1,0,0,0,0,0,0,0, /* reset terminal */ 0, ESC,'T',-1,0,0,0,0,0, /* erase to end of line */ 10, /* erase line delay */ ESC,'Y',-1,0,0,0,0,0, /* erase rest of screen */ 20, /* erase screen delay */ CTRLZ,-1,0,0,0,0,0,0, /* erase entire screen */ 0, /* delay */ ESC,'R',-1,0,0,0,0,0, /* delete screen line */ 0, /* delay */ 12, ESC,'E',-1,0,0,0,0,0, /* insert screen line */ 0, 12 }; struct trmtyp adm31 = {0, /* MP/M */ "ADM-31/32 ", /* LS ADM-31/32 */ 24,80, /* 24 rows, 80 columns */ CTRLK,-1,0,0,0,0,0,0, /* up cursor */ CTRLJ,-1,0,0,0,0,0,0, /* down cursor */ CTRLH,-1,0,0,0,0,0,0, /* left cursor */ CTRLL,-1,0,0,0,0,0,0, /* right cursor */ CTRLHAT,-1,0,0,0,0,0,0, /* home cursor */ ESC,'=',-1,0,0,0,0,0, /* cursor leadin string */ -1,0,0,0, /* separator */ -1,0,0,0, /* terminator */ 'r', /* binary row */ 'c', /* binary column */ 32, /* row offset */ 32, /* column offset */ 0, /* cursor delay */ -1,0,0,0,0,0,0,0, /* terminal reset */ 0, ESC,'T',-1,0,0,0,0,0, /* erase to end of line */ 10, /* erase line delay */ ESC,'Y',-1,0,0,0,0,0, /* erase rest of screen */ 20, /* erase screen delay */ CTRLHAT,ESC,'Y',-1,0,0,0,0, /* erase entire screen */ 20,  ESC,'R',-1,0,0,0,0,0, /* delete screen line */ 20, 8, ESC,'E',-1,0,0,0,0,0, /* insert screen line */ 20, 8 }; struct trmtyp adm42 = {0, /* MP/M */ "ADM-42 ", /* ADM-42 */ 24,80, /* 24 rows, 80 columns */ CTRLK,-1,0,0,0,0,0,0, /* up cursor */ CTRLJ,-1,0,0,0,0,0,0, /* down cursor */ CTRLH,-1,0,0,0,0,0,0, /* left cursor */ CTRLL,-1,0,0,0,0,0,0, /* right cursor */ CTRLHAT,-1,0,0,0,0,0,0, /* home cursor */ ESC,'=',-1,0,0,0,0,0, /* cursor leadin string */  -1,0,0,0, /* separator */ -1,0,0,0, /* terminator */ 'r', /* binary row */ 'c', /* binary column */ 32, /* row offset */ 32, /* column offset */ 0, /* cursor delay */ -1,0,0,0,0,0,0,0, /* terminal reset */ 0, ESC,'T',-1,0,0,0,0,0, /* erase to end of line */ 10, /* erase line delay */ ESC,'Y',-1,0,0,0,0,0, /* erase rest of screen */ 20, /* erase screen delay */ CTRLHAT,ESC,'Y',-1,0,0,0,0, /* erase entire screen */ 20, ESC,'R',-1,0,0,0,0,0, /* delete screen line */ 20, 8, ESC,'E',-1,0,0,0,0,0, /* insert screen line */ 20, 8 }; struct trmtyp iq120 = {0, /* MP/M */ "Soroc IQ120/140", /* Soroc IQ-120 */ 24,80, /* 24 rows, 80 columns */ CTRLK,-1,0,0,0,0,0,0, /* up cursor */ CTRLJ,-1,0,0,0,0,0,0, /* down cursor */ CTRLH,-1,0,0,0,0,0,0, /* left cursor */ CTRLL,-1,0,0,0,0,0,0, /* right cursor */ CTRLHAT,-1,0,0,0,0,0,0, /* home cursor */ ESC,'=',-1,0,0,0,0,0, /* cursor leadin string */ -1,0,0,0, /* separator */ -1,0,0,0, /* terminator */ 'r', /* binary row */ 'c', /* binary column */ 32, /* row offset */ 32, /* column offset */ 0, /* cursor delay */ -1,0,0,0,0,0,0,0, /* terminal reset */ 0, ESC,'T',-1,0,0,0,0,0, /* erase to end of line */ 10, /* erase line delay */ ESC,'Y',-1,0,0,0,0,0, /* erase rest of screen */ 20, /* erase screen delay */ -1,0,0,0,0,0,0,0, /* erase entire screen */ 0, -1,0,0,0,0,0,0,0, /* delete screen line */ 0, 0, -1,0,0,0,0,0,0,0, /* insert screen line */ 0, 0 }; struct trmtyp zenh19 = {0, /* MP/M */ "Zenith H-19 ", /* Zenith H-19/H-89 */ 24,80, /* 24 rows, 80 columns */ ESC,'A',-1,0,0,0,0,0, /* up cursor */ ESC,'B',-1,0,0,0,0,0, /* down cursor */ ESC,'D',-1,0,0,0,0,0, /* left cursor */ ESC,'C',-1,0,0,0,0,0, /* right cursor */ ESC,'H',-1,0,0,0,0,0, /* home cursor */ ESC,'Y',-1,0,0,0,0,0, /* cursor leadin string */ -1,0,0,0, /* separator */ -1,0,0,0, /* terminator */ 'r', #lay(term.eldly); /* delay if necessary */ } else {for (ecol = col; ecol < dspcol; ecol++) /* issue spaces */ putcrt(' '); cursor(row,col); /* reset the cursor */ } } /* */ /* Move the cursor to specified position */ /* */ cursor(row,col) int row,col; {char *p; p = term.cplead; /* issue leadin string */ while (*p >= 0) putcrt(*p++); putrc(term.cp1st,row,col); /* issue first position */ p = term.cpsep; /* issue separator string */  while (*p >= 0) putcrt(*p++); putrc(term.cp2nd,row,col); /* issue second position */ p = term.cptrm; /* issue terminator string */ while (*p >= 0) putcrt(*p++); delay(term.cpdly); /* delay if necessary */ } /* */ /* putrc : output row or column in proper format */ /* */ putrc(type,row,col) char type; int row,col; {switch (type) /* switch on type */ {case 'r': /* binary row */ putcrt(row+term.rofs); break; case 'c': /* binary column */ putcrt(col+term.cofs); break; case 'R': /* ASCII row */ putval(row+term.rofs); break; case 'C': /* ASCII column */ putval(col+term.cofs); break; default: /* illegal code */ putstr("\nIllegal cursor position code"); exit(0); /* terminate */ } } /* */ /* dellin : delete n lines at the current cursor */ /* */ dellin(row,n) int row,n; {char *p; while (n--) {p = term.dcl; while (*p >= 0) putcrt(*p++);  delay(term.dldly); } } /* */ /* inslin : insert n lines at the current cursor */ /* */ inslin(row,n) int row,n; {char *p; while (n--) {p = term.icl; while (*p >= 0) putcrt(*p++); delay(term.ildly); } } /* delay : delay the specified time */ /* note : delay is measured in characters : the specified */ /* number of null (0) characters is output */ /* */ delay(dly) int dly; {while (dly--) /* output null characters */ putcrt('\0'); } /* */ /* dispscr : display part or all of screen buffer */ /* */ dispscr(row,n) int row,n; {char *sptr; int col,lcol,eflag; eflag = 0; cursor(row,0); /* position the cursor */ if (!row) /* test for erase command line */ {if (row+n >= scrlin) /* test for erase all */ {erase(0,0); eflag = 1; /* set erase flag */ } else erasline(0,0); /* just erase command line */ row++; /* don't display it */ n--; } else if ((row+n >= scrlin)&&(term.erseos[0] >= 0)) {erase(row,0); /* erase bottom of screen */ eflag = 1; } while (n--) /* display n lines */ {if (((lcol = rowflg[row]) < 0)&&(row+n < scrlin)) {cursor(row,0); /* erase remainder of screen */ if (!eflag) /* test for already erased */ erase(row,0); return; } if (lcol > rtcol) /* set right margin */ lcol = rtcol; cursor(row,0); /* redisplay entire line */ sptr = scrbuf+row*scrcol+lftcol; /* set buffer ptr */ for (col = lftcol; col < lcol; col++) /* redisplay visible */ echo(*sptr++); /* display a character */ if (!eflag) /* test for erased */ erasline(row,col-lftcol); /* erase remainder of line */ row++; /* bump row */ } } /* */ /* buffered keyboard input routines */ /* only input is buffered, since there is no way of */ /* determining whether output is ready */ /* */ /* note : a simple circular buffer scheme is used */ /* */ static char inbuf[INBLEN]; static char *rdpt,*stpt,*lapt,*inbufe; /* */ /* initkb : initialize keyboard buffer by setting the */ /* pointers to initial position */ /* */ initkb() {inbufe = inbuf+INBLEN; /* set end of buffer */ rdpt = stpt = inbuf; /* initialize pointers */ } /* */ /* loadkb : if a character has been typed, read it and */ /* store it in the keyboard buffer. This function per- */ /*$ /* binary row */ 'c', /* binary column */ 32, /* row offset */ 32, /* column offset */ 0, /* cursor delay */ -1,0,0,0,0,0,0,0, /* terminal reset */ 0, ESC,'K',-1,0,0,0,0,0, /* erase to end of line */ 0, /* erase line delay */ ESC,'J',-1,0,0,0,0,0, /* erase rest of screen */ 0, /* erase screen delay */ ESC,'E',-1,0,0,0,0,0, /* erase entire screen */ 0, ESC,'M',-1,0,0,0,0,0, /* delete screen line */ 0, 12, ESC,'L',-1,0,0,0,0,0, /* insert screen line */ 0, 12 }; struct trmtyp decv52 = {0, /* MP/M */ "DEC VT-52 ", /* DEC VT-52 */ 24,80, /* 24 rows, 80 columns */ ESC,'A',-1,0,0,0,0,0, /* up cursor */ ESC,'B',-1,0,0,0,0,0, /* down cursor */ ESC,'D',-1,0,0,0,0,0, /* left cursor */ ESC,'C',-1,0,0,0,0,0, /* right cursor */ ESC,'H',-1,0,0,0,0,0, /* home cursor */ ESC,'Y',-1,0,0,0,0,0, /* cursor leadin string */ -1,0,0,0, /* separator */ -1,0,0,0, /* terminator */ 'r', /* binary row */ 'c', /* binary column */ 32, /* row offset */ 32, /* column offset */ 0, /* cursor delay */ -1,0,0,0,0,0,0,0, /* terminal reset */ 0, ESC,'K',-1,0,0,0,0,0, /* erase to end of line */ 10, /* erase line delay */ ESC,'J',-1,0,0,0,0,0, /* erase rest of screen */ 20, /* erase screen delay */ ESC,'H',ESC,'J',-1,0,0,0, /* erase entire screen */ 20, ESC,'M',-1,0,0,0,0,0, /* delete line */ 20, 8, ESC,'L',-1,0,0,0,0,0, /* insert line */ 20, 8 }; struct trmtyp vis200 = {0, /* MP/M */ "Visual 200 ", /* Visual 200 */ 24,80, /* 24 rows, 80 columns */ ESC,'A',-1,0,0,0,0,0, /* up cursor */ ESC,'B',-1,0,0,0,0,0, /* down cursor */ ESC,'D',-1,0,0,0,0,0, /* left cursor */ ESC,'C',-1,0,0,0,0,0, /* right cursor */ ESC,'H',-1,0,0,0,0,0, /* home cursor */ ESC,'Y',-1,0,0,0,0,0, /* cursor leadin string */ -1,0,0,0, /* separator */ -1,0,0,0, /* terminator */ 'r', /* binary row */ 'c', /* binary column */ 32, /* row offset */ 32,  /* column offset */ 0, /* cursor delay */ -1,0,0,0,0,0,0,0, /* terminal reset */ 0, ESC,'X',-1,0,0,0,0,0, /* erase to end of line */ 0, /* erase line delay */ ESC,'J',-1,0,0,0,0,0, /* erase rest of screen */ 20, /* erase screen delay */ ESC,'H',ESC,'J',-1,0,0,0, /* erase entire screen */ 20, -1,0,0,0,0,0,0,0, /* delete screen line */ 0, 0, -1,0,0,0,0,0,0,0, /* insert screen line */ 0, 0 }; struct trmtyp addsvp = {0, /* MP/M */ "ADDS Viewpoint ", /* ADDS Viewpoint */ 24,80, /* 24 rows, 80 columns */ CTRLZ,-1,0,0,0,0,0,0, /* up cursor */ CTRLJ,-1,0,0,0,0,0,0, /* down cursor */ CTRLU,-1,0,0,0,0,0,0, /* left cursor */ CTRLF,-1,0,0,0,0,0,0, /* right cursor */ CTRLHAT,-1,0,0,0,0,0,0, /* home cursor */ ESC,'=',-1,0,0,0,0,0, /* cursor leadin string */ -1,0,0,0, /* separator */ -1,0,0,0, /* terminator */ 'r', /* binary row */ 'c', /* binary column */ 32, /* row offset */ 32, /* column offset */ 0, /* cursor delay */ -1,0,0,0,0,0,0,0, /* terminal reset */ 0, ESC,'K',-1,0,0,0,0,0, /* erase to end of line */ 10, /* erase line delay */ CTRLK,-1,0,0,0,0,0,0, /* erase rest of screen */ 20, /* erase screen delay */ -1,0,0,0,0,0,0,0, /* erase entire screen */ 0, -1,0,0,0,0,0,0,0, /* delete screen line */ 0, 0, -1,0,0,0,0,0,0,0, /* insert screen line */ 0, 0 }; struct trmtyp addsreg = {0, /* MP/M */ "ADDS Reg. 40/65", /* ADDS Viewpoint */ 24,80, /* 24 rows, 80 columns */ CTRLZ,-1,0,0,0,0,0,0, /* up cursor */ CTRLJ,-1,0,0,0,0,0,0, /* down cursor */ CTRLU,-1,0,0,0,0,0,0, /* left cursor */ CTRLF,-1,0,0,0,0,0,0, /* right cursor */ CTRLHAT,-1,0,0,0,0,0,0, /* home cursor */ ESC,'=',-1,0,0,0,0,0, /* cursor leadin string */ -1,0,0,0, /* separator */ -1,0,0,0, /* terminator */ 'r', /* binary row */ 'c', /* binary column */ 32, /* row offset */ 32, /* column offset */ 0, /* cursor delay */ -1,0,0,0,0,0,0,0, /* term$ers)) /* test for erase line */ return LERASE; if (match(c,term.ins)) /* test for toggle insert */ return INSTOG; if (match(c,term.gst)) /* test for get status */ return STATUS; if (match(c,term.pdn)) /* test for page down */ return PAGEDN; if (match(c,term.pup)) /* test for page up */ return PAGEUP; if (match(c,term.ldn)) /* test for line down */ return LINEDN; if (match(c,term.lup)) /* test for line up */ return LINEUP; if (match(c,term.lkil)) /* test for delete one line */ {escval = 1; return LKILL; } if (match(c,term.lins)) /* test for insert one line */ {escval = 1; return LINS; } if (match(c,term.lpag)) /* test for page to cursor */ return LPAGE; if (match(c,term.lcan)) /* test for cancel changes */ return LQUIT; if (match(c,term.ldet)) /* test for detach */ return LDET; if (match(c,term.lesc)) /* test for process changes */ return LESC; if (match(c,term.lisp)) /* test for special processing */ {c = geteval(); /* get value */ if (match(c,term.nlkil)) /* test for delete lines */ return LKILL; if (match(c,term.nlins)) /* test for insert lines */ return LINS; } return 0; } /* */ /* geteval : get escape value */ /* */ geteval() {char c; escval = 1; /* default is 1 */ c = getch(DR); /* get next character */ if (isdigit(c)) /* test for digit */ {escval = 0; /* clear forming value */ while (isdigit(c)) /* process all digits */ {escval = escval*10+(c&15); /* add to forming value */ c = getch(DR); /* get next character */ } } return c; /* return first non-digit */ } /* */ /* match : test the input string for match with the */ /* special key string; the input string is converted to */ /* upper case before matching; the key string is assumed */ /* to be upper case already */ /* */ match(c,p) char c,*p; {if (toupper(c) == *p++) /* must match first char */ {setkbp(LPRP); /* set lookahead ptr */ while (*p >= 0) /* compare entire string */ {if (*p++ != toupper(getnch())) /* test for no match */ return 0; } setkbp(RPLP); /* set read ptr (skip string) */ return 1; /* got a match */ } return 0; /* no match */ } /* */ /* CRT dependent routines */ /* */ /* */ /* initcrt : initialize the CRT */ /* */ initcrt() {char *p; p = term.reset; while (*p >= 0) putcrt(*p++); delay(term.rsdly); /* delay if necessary */ } /* */ /* Erase the remainder of the screen */ /* note : if the terminal has no erase string, clear by */ /* issuing spaces */ /* */ erase(row,col) int row,col; {char *p; int erow,ecol,dly; if ((!row)&&(!col)) /* test for erase entire screen */ {p = term.ersall; /* use erase all string */ dly = term.eadly; } else {p = term.erseos; /* use erase to EOS string */ dly = term.esdly; } if (*p >= 0) /* test for erase string */ {while (*p >= 0) /* test for erase string */ putcrt(*p++); /* issue the string */ delay(dly); /* delay if necessary */ } else {ecol = col; /* set initial erase column */ for (erow = row; erow < scrlin; erow++) /* erase each line */ {cursor(erow,ecol); /* set cursor */ erasline(erow,ecol); /* erase the line */ ecol = 0; /* beg of each following line */ } cursor(row,col); /* reset cursor */ } } /* */ /* erasline : erase the current line */ /* note : if the terminal does not support erase to */ /* EOL, it is simulated by issuing spaces */ /* */ erasline(row,col) int row,col; {char *p; int ecol; p = term.erseol; /* set ptr to erase string */ if (*p >= 0) /* test for erase EOL string */ {while (*p >= 0) /* issue the string */ putcrt(*p++); de%inal reset */ 0, ESC,'K',-1,0,0,0,0,0, /* erase to end of line */ 10, /* erase line delay */ CTRLK,-1,0,0,0,0,0,0, /* erase rest of screen */ 20, /* erase screen delay */ -1,0,0,0,0,0,0, /* erase entire screen */ 0, ESC,'l',-1,0,0,0,0,0, /* delete screen line */ 20, 8, ESC,'M',-1,0,0,0,0,0, /* insert screen line */ 20, 8 }; struct trmtyp decv100 = {0, /* MP/M */ "DEC VT-100 ", /* DEC VT-100 */ 24,132, /* 24 rows, 132 columns */ ESC,'[','A',-1,0,0,0,0, /* up cursor */ ESC,'[','B',-1,0,0,0,0, /* down cursor */ ESC,'[','D',-1,0,0,0,0, /* left cursor */ ESC,'[','C',-1,0,0,0,0, /* right cursor */ ESC,'[','H',-1,0,0,0,0, /* home cursor */ ESC,'[',-1,0,0,0,0,0, /* cursor leadin string */ ';',-1,0,0, /* separator */ 'H',-1,0,0, /* terminator */ 'R', /* ASCII row */ 'C', /* ASCII column */ 1, /* row offset */ 1, /* column offset */ 0, /* cursor delay */ ESC,'[','H',ESC,'[','0','m',-1, /* terminal reset */  0, ESC,'[','0','K',-1,0,0,0, /* erase to end of line */ 0, /* erase line delay */ ESC,'[','0','J',-1,0,0,0, /* erase rest of screen */ 0, /* erase screen delay */ ESC,'[','2','J',-1,0,0,0, /* erase entire screen */ 0, ESC,'[','1','M',-1,0,0,0, /* delete screen line */ 0, 12, ESC,'[','1','L',-1,0,0,0, /* insert screen line */ 0, 12 }; struct trmtyp ansi = {0, /* MP/M */ "ANSI Standard ", /* ANSI Standard */ 24,132, /* 24 rows, 132 columns */ ESC,'[','A',-1,0,0,0,0, /* up cursor */ ESC,'[','B',-1,0,0,0,0, /* down cursor */ ESC,'[','D',-1,0,0,0,0, /* left cursor */ ESC,'[','C',-1,0,0,0,0, /* right cursor */ ESC,'[','H',-1,0,0,0,0, /* home cursor */ ESC,'[',-1,0,0,0,0,0, /* cursor leadin string */ ';',-1,0,0, /* separator */ 'H',-1,0,0, /* terminator */ 'R', /* ASCII row */ 'C', /* ASCII column */ 1, /* row offset */ 1, /* column offset */ 0, /* cursor delay */ ESC,'[','H',ESC,'[','0','m',-1, /* terminal reset */ 0, ESC,'[','0','K',-1,0,0,0, /* erase to end of line */ 0, /* erase line delay */ ESC,'[','0','J',-1,0,0,0, /* erase rest of screen */ 0, /* erase screen delay */ -1,0,0,0,0,0,0,0, /* erase entire screen */ 0, ESC,'[','1','M',-1,0,0,0, /* delete screen line */ 0, 12, ESC,'[','1','L',-1,0,0,0, /* insert screen line */ 0, 12 }; struct trmtyp hzltn = {1, /* MP/M */ "Hazltn 14/1500 ", /* Hazeltine 1400 */ 24,80, /* 24 rows, 80 columns */ ESC,CTRLL,-1,0,0,0,0,0, /* up cursor */ ESC,CTRLK,-1,0,0,0,0,0, /* down cursor */ CTRLH,-1,0,0,0,0,0,0, /* left cursor */ -1,0,0,0,0,0,0,0, /* right cursor */ ESC,CTRLR,-1,0,0,0,0,0, /* home cursor */ ESC,CTRLQ,-1,0,0,0,0,0, /* cursor leadin string */ -1,0,0,0, /* separator */ -1,0,0,0, /* terminator */ 'c', /* binary column */ 'r', /* binary row */ 0, /* row offset */ 0, /* column offset */ 0, /* cursor delay */ -1,0,0,0,0,0,0,0, /* terminal reset */ 0, ESC,CTRLO,-1,0,0,0,0,0, /* erase to end of line */ 20, /* erase line delay */ ESC,CTRLX,-1,0,0,0,0,0, /* erase rest of screen */ 30, /* erase screen delay */ ESC,'\\',-1,0,0,0,0,0, /* erase entire screen */ 30, ESC,CTRLS,-1,0,0,0,0,0, /* delete screen line */ 100, 8, ESC,CTRLZ,-1,0,0,0,0,0, /* insert screen line */ 100, 8 }; struct trmtyp custrm = {0, "Custom Terminal", 24,80, -1,0,0,0,0,0,0,0, -1,0,0,0,0,0,0,0, -1,0,0,0,0,0,0,0, -1,0,0,0,0,0,0,0, -1,0,0,0,0,0,0,0,  -1,0,0,0,0,0,0,0, -1,0,0,0, -1,0,0,0, 'r', 'c', 0, 0, 0, -1,0,0,0,0,0,0,0, 0, -1,0,0,0,0,0,0,0, 0, -1,0,0,0,0,0,0,0, 0, -1,0,0,0,0,0,0,0, 0, -1,0,0,0,0,0,0,0, 0, 0, -1,0,0,0,0,0,0,0, 0, 0 }; /* */ /* table of pointers to terminal structures */ /* */ struct trmtyp *term[] = {&tvi910, &tvi920, &tvi925, &adm3a, &adm5, &adm31, &adm42, &iq120, &zenh19, &decv52, &vis200, &addsvp, &decv100, &ansi, &hzltn, &cus%sinit() {char *alloc(); int i; unsigned totmem,ovrhead,coreleft(); if (!scrlin) /* test for lines defined */ scrlin = term.trmrow; /* initialize limits */ if (!dspcol) /* test for columns defined */ dspcol = term.trmcol-1; if (!scrcol) /* test for buffer columns defined */ scrcol = dspcol+16; else if (scrcol < dspcol) /* test for too few columns */ return("buffer columns less than screen columns"); msgcol = dspcol-MSGLEN; /* set message column */ scrbufl = scrlin*scrcol; /* set length of screen buffer */ rdbufl = BLKLEN; /* get read buffer length */ ovrhead = scrbufl+3*scrcol+1+rdbufl; /* get total overhead */ totmem = coreleft()-MINSAV; /* get total memory available */ if (totmem < ovrhead+MINTBL) /* test for space available */ return ("insufficient memory"); /* not enough space */ scrbuf = alloc(totmem); /* allocate screen buffer */ linbuf = scrbuf+scrbufl; /* allocate line buffer */ str1 = linbuf+scrcol+1; /* allocate string 1 buffer */ str2 = str1+scrcol; /* allocate string 2 buffer */ rdbuf = str2+scrcol; /* allocate read buffer */ txtbuf = rdbuf+rdbufl; /* allocate text buffer */ txtbufl = totmem-ovrhead; /* set text buffer length */ txtbufe = txtbuf+txtbufl; /* compute end of text buffer */ txtmaxl = txtbufl-1000; /* maximum length for reads */ return NULL; } /* */ /* rdblk: read a block of data into memory from a file */ /* */ /* returns -1 if error in read, number of bytes actually */ /* read if no error, 0 if EOF. Does multiple reads if */ /* necessary to fill the buffer */ /* */ rdblk(fd,rbuf,rlen) int fd; char *rbuf; unsigned rlen; {unsigned rcnt,len; len = 0; while (1) {rcnt = read(fd,rbuf+len,rlen-len); if (rcnt == -1) /* test for error */ return -1; len += rcnt; if ((rcnt == 0)||(len == rlen)) /* test for eof, done */ return len; } } /* */ /* buildfn : build a filename */ /* */ buildfn(fn,fe) char *fn,*fe; {while (*fn && (*fn != '.')) /* read til end or '.' */ fn++; *fn++ = '.'; /* insert '.' */ strcpy(fn,fe); /* append the extension */ } /* */ /* tststop : test for abort character string typed */ /* (called by append, hdcpy, and type) */ /* */ tststop() {char c; c = getch(DR); /* read next char */ if (match(c,term.abrt)) /* test for abort string */ return ABORT; if (match(c,term.stop)) /* test for stop string */ return STOP;  return 0; /* not abort or stop */ } /* */ /* Find character type in table */ /* */ fndchr(c) char c; {int fval; if ((c >= ' ')&&(c < DEL)) /* test for printing character */ return NORML; if (c == '\t') /* test for tab */ return NORML; if (c == '\r') /* test for return */ return NEWLINE; if (match(c,term.delb)) /* test for backspace/delete */ return DELBACK; if (match(c,term.del)) /* test for delete in place */ return DELETE; if (match(c,term.cclft)) /* test for left arrow */ return LFTARW; if (match(c,term.ccrt)) /* test for right arrow */ return RTARW; if (match(c,term.ccup)) /* test for up arrow */ return UPARW; if (match(c,term.ccdn)) /* test for down arrow */ return DNARW; if (match(c,term.cchom)) /* test for home */ return HOME; if (match(c,term.hom)) /* test for home */ return HOME; if (match(c,term.bot)) /* test for bottom */ return BOTTOM; if (match(c,term.fsp)) /* test for right arrow */ return RTARW; if (match(c,term.bsp)) /* test for left arrow */ return LFTARW; if (match(c,term.dna)) /* test for down arrow */ return DNARW; if (match(c,term.upa)) /* test for up arrow */ return UPARW; if (match(c,term.fsm)) /* test for right multiple */ return RTARWM; if (match(c,term.bsm)) /* test for left multiple */ return LFTARWM; if (match(c,term.ldel)) /* test for delete line */ return LDEL; if (match(c,term.l&trm, /* allow user definitions */ NULL }; /* */ /* main : dialog with operator */ /* */ main() {char c,*p,*custom(),*modkeys(); int trmno,trmfd; unsigned trmct,spct; while (1) {putlmsg(ismsg); mpmflg = 0; /* assume not MP/M */ c = getcrt(); /* get response */ if (c == CTRLC) /* test for abort */ exit(0); putcrt(c); /* echo the character */ if ((c == 'y') || (c == 'Y')) /* test for y or Y */ {putstr("\nMP/M system\n\n"); mpmflg = 1; } else putstr("\nNot an MP/M system\n"); /* otherwise, no */ nterm = count(); /* get # of terminal types */ putstr("\nDo want to modify an existing configuration file? "); if (confirm(0)) /* get response */ {trmfd = open("cse.trm",BREAD); /* read the existing file */ if (trmfd < 0) /* test for error */ {putstr("\nCSE.TRM not found on default drive"); exit(0); } trmct = read(trmfd,&custrm,sizeof tvi910); spct = read(trmfd,&spdef,sizeof spdef); if ((trmct != sizeof tvi910)||(spct != sizeof spdef)) {putstr("\nCan't read CSE.TRM"); exit(0); } trmno = nterm; /* use custom terminal */ } else {trmno = select(); /* get terminal type */ if (!trmno) /* check for abort */ exit(0); p = NULL; } if (trmno == nterm) /* test for custom install */ p = custom(term[nterm-1]); /* do custom installation */ else {putstr("\nDo you want to modify the"); putstr(" terminal characteristics? "); if (confirm(0)) /* get response */ p = custom(term[trmno-1]); /* modify characteristics */ } if (p) {putstr(p); /* error in installation */ exit(0); } if (p = modkeys()) /* modify editor keys if desired */ {putstr(p); exit(0); } putstr("\nAre you ready to create the terminal file? "); if (confirm(0)) /* get response */ break; /* go write the terminal file */ putstr("\nDo you want to make more changes (otherwise, abort)? "); if (!confirm(0)) /* test for further changes */ {putstr("\naborting installation"); exit(0); } } term[trmno-1]->mpm = mpmflg; /* set MP/M flag */ trmfd = creat("cse.$$$",BWRITE); /* open temp file CSE.$$$ */ if (trmfd < 0) /* test for good open */ {putstr("can't create temporary file\n"); /* can't open */ exit(0); /* abort process */ } trmct = write(trmfd,term[trmno-1],sizeof (struct trmtyp)); spct = write(trmfd,&spdef,sizeof (struct spstr)); close(trmfd); /* close the file */ if ((trmct != sizeof (struct trmtyp))||(spct != sizeof (struct spstr))) {unlink("cse.$$$"); /* error : delete the file */ putstr("bad write on temporary file\n"); exit(0); } unlink("cse.trm"); /* delete existing CSE.TRM */ if (rename("cse.$$$","cse.trm")) /* rename CSE.$$$ to CSE.TRM */ {unlink("cse.$$$"); /* can't rename temp file */ putstr("can't rename temporary file\n"); exit(0); } putstr("\nSuccessful installation, process complete\n"); exit(0); } /* */ /* count : count number of terminals */ /* */ count() {int i; for (i = 0; term[i]; i++) ; return i; } /* */ /* select : select a terminal from the list */ /* */ select() {char c; int i,tval; while (1) {putstr("\n Terminal Choices\n\n"); for (i = 0; i < (nterm+1)/2; i++) /* display terminal names */ {dspnam(i); /* display two names */ putcrt('\n'); /* issue newline */ } putstr("\nSelect terminal type by number : "); tval = getval(); /* get response */ if (tval < 0) /* test for abort */ return 0; if ((tval > 0)&&(tval <= nterm)) /* test for valid number */ {putstr("\nYou have selected "); /* echo name of selection */ putstr(term[tval-1]->trmname); if (confirm(1)) /* confirm choice */ return tval; } else putstr("\nInvalid terminal selection\n"); } } /* */ /* dspnam : dis& long message */ /* */ putlmsg(msg) char *msg[]; {char *s; int i; i = 0; while (1) {s = msg[i++]; /* get ptr to next string */ if (*s) /* test for null string */ putstr(s); else return; } } /* */ /* putdefn : print default integer value */ /* */ putdefn(n) int n; {putstr(" ("); putnum(n,0); putstr(") "); } /* */ /* putnum : display 3-digit number in decimal */ /* */ putnum(val,lsp) int val,lsp; {int digit1,digit2; digit1 = val/100; /* get first digit */ val = val%100; /* strip first digit */ if (digit1) /* print if not zero */ putcrt('0'+digit1); else if (lsp) putcrt(' '); /* else print space */ digit2 = val/10; /* get second digit */ val = val%10; /* strip second digit */ if (digit1||digit2) /* print if not zero */ putcrt('0'+digit2); else if (lsp) putcrt(' '); putcrt('0'+val); /* print right */ } /* */ /* putdef : print the default string */ /* */ putdef(p) char *p; {putstr(" ("); /* print left paren */ while (*p >= 0) /* print entire string */ {xlat(*p++); if (*p >= 0) putcrt(' '); } putstr(") "); /* print right paren */ } /* */ /* xlat : translate character and print it */ /* */ xlat(c) char c; {if ((c > ' ')&&(c <= '~')) /* test for printing char */ putcrt(c); /* just echo */ else if (c == DEL) /* test for delete */ putstr("DEL"); /* print DEL */ else putstr(xltab[c]); } /* */ /* terminal I/O functions */ /* */ getcrt() {char c; while (1) {c = bdos(6,-1)&0X7F; /* get char, strip parity */ if (c) return c; } } putcrt(c) char c; {if (c == '\n') /* test for newline */ bdos(6,'\r'); /* issue CR first */ bdos(6,c); } putstr(s) char *s; {while (*s) /* print entire string */ putcrt(*s++); } /* */ /* putdef : pr/* */ /* CSE : C Screen Editor */ /* */ /* copyright (c) 1982,83 Northwest Microsystem Design */ /* created 4/11/82, 1130 hrs */ /* version 1.3b */ /* last modified 1/26/84, 1800 hrs */ /* */ /* */ /* Operating system/CRT - dependent code */ /* these must be modified for use with other operating */ /* systems, compilers, and display screens */ /* */ #include "stdio.h" #include "csedef.c" /* miscellaneous definitions */ #define NAMLEN 16 /* filename length */ #define BLKLEN 2048 /* read buffer length */ #define INBLEN 16 /* input buffer size */ #define MINTBL 3000 /* minimum text buffer length */ #define MINSAV 3000 /* minimum memory saved for allocation */ /* screen buffer storage */ char *scrbuf; /* screen buffer ptrs */ int scrlin,scrcol, /* buffer size in lines, columns */ scrbufl, /* physical length of screen buffer */ dspcol, /* # of columns screen can display */ msgcol; /* start column for messages */ /* text buffer storage */ char *txtbuf,*txtbufe; /* limits of text buffer */ unsigned txtbufl,txtmaxl; /* actual, maximum length */ /* read buffer storage */ char *rdbuf; /* start of read buffer */ unsigned rdbufl; /* read buffer length */ /* arrays */ char infn[NAMLEN], /* input filename */ outfn[NAMLEN], /* output filename */ wrkfn[NAMLEN], /* work filename */ savfn[NAMLEN], /* save filename */ bakfn[NAMLEN], /* backup filename */  msgbuf[MSGLEN]; /* screen message buffer */ char *linbuf, /* line buffer */ *str1, /* string 1 buffer */ *str2, /* string 2 buffer */ *rowptr[MAXROW]; /* row pointer array */ int rowflg[MAXROW], tabstop[] = {0, 8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 96, 104, 112, 120, 128, MAXCOL-1}; /* external definitions */ extern int lftcol,rtcol,escval; extern struct config term; /* */ /* sysinit : perform memory initialization */ /* */ char *sy'play two terminal names on a line */ /* */ dspnam(i) int i; {char *p; int col; col = 0; if (term[i] == 0) /* test for end of list */ return; p = term[i]->trmname; /* get ptr to name string */ putnum(i+1,1); /* print terminal number */ putcrt(' '); while (*p) /* display left side */ {col++; /* bump column count */ putcrt(*p++); /* display character */ } i += nterm/2; /* get right side index */ if (term[i] == 0) /* test for end of list */ return; p = term[i]->trmname; /* get ptr to name string */ while (col++ < 30) /* space to right side */ putcrt(' '); putnum(i+1,1); /* display terminal number */ putcrt(' '); while (*p) /* display right side */ putcrt(*p++); return; } /* */ /* custom : custom terminal installation program */ /* */ char *custom(trm) struct trmtyp *trm; {int n; putlmsg(ctmsg); getint("\nNumber of rows",&trm->trmrow); /* get # of rows */ getint("\nNumber of columns",&trm->trmcol); /* get # of columns */ putlmsg(ckmsg); getstr("\nUp arrow",trm->ccup,8); getstr("\nDown arrow",trm->ccdn,8); getstr("\nLeft arrow",trm->cclft,8); getstr("\nRight arrow",trm->ccrt,8); getstr("\nHome",trm->cchom,8); putlmsg(cpmsg); getstr("\nCursor positioning leadin",trm->cplead,4); getstr("\nRow/column separator",trm->cpsep,4); getstr("\nCursor positioning terminator",trm->cptrm,4); getrc(&trm->cp1st); /* get first spec */ getrc(&trm->cp2nd); /* get second spec */ putlmsg(rcomsg); /* get row, column offsets */ getint("\nOffset for row",&trm->rofs); /* get row offset */ getint("\nOffset for column",&trm->cofs); /* get column offset */ putlmsg(dlymsg); /* get delay */ getint("\nDelay",&trm->cpdly); putstr("\n\nNow, special terminal control strings\n"); getstr("\nInitialization string (executed at startup)",trm->reset,8); putlmsg(dlymsg); getint("\Delay",&trm->rsdly); /* get terminal init delay */ putstr("\n\nNow, the strings which clear parts of the screen\n"); getstr("\nErase from cursor to end of line",trm->erseol,8); putlmsg(dlymsg); getint("\nDelay",&trm->eldly); /* get erase EOL delay */ getstr("\n\nErase from cursor to end of screen",trm->erseos,8); putlmsg(dlymsg); getint("\nDelay",&trm->esdly); /* get erase EOS delay */ getstr("\n\nErase entire screen",trm->ersall,8); putlmsg(dlymsg); getint("\nDelay",&trm->eadly); /* get erase all delay */ putstr("\n\nNow, terminal editing function strings\n"); getstr("\nDelete current line",trm->dcl,8); putlmsg(dlymsg); getint("\nDelay",&trm->dldly); /* get delete line delay */ getint("\nMax # of lines to delete without redisplay",&trm->mld); getstr("\n\nInsert line at cursor",trm->icl,8); putlmsg(dlymsg); getint("\nDelay",&trm->ildly); /* get insert line delay */ getint("\nMax # of lines to insert without redisplay",&trm->mli); return NULL; } /* */ /* modkeys : modify editor function key assignments */ /* */ char *modkeys() {putlmsg(modmsg); if (!confirm(0)) /* test response */ return NULL; putlmsg(eckmsg); askmod("backspace, then delete",spdef.sdelb,8); askmod("delete in place",spdef.sdel,8); askmod("alternate up cursor",spdef.supa,8); askmod("alternate down arrow",spdef.sdna,8); askmod("alternate left arrow",spdef.sbsp,8); askmod("alternate right arrow",spdef.sfsp,8); askmod("alternate home cursor",spdef.shom,8); askmod("goto bottom of screen",spdef.sbot,8); askmod("right multiple",spdef.sfsm,8); askmod("left multiple",spdef.sbsm,8); askmod("delete current line",spdef.sldel,8); askmod("erase to end of current line",spdef.slers,8); askmod("turn insert mode on/off",spdef.sins,8); askmod("display buffer space",spdef.sgst,8); askmod("scroll forward one line",spdef.sldn,8); askmod("scroll forward one page",spdef.spdn,8); askmod("scroll forward to cursor line",spdef.slpag,8); askmod("scroll backward one line",spdef.slup,8); askmod("scroll backward one page",spdef.spup,8); askmod("'kill current line",spdef.slkil,8); askmod("insert a line at cursor line",spdef.slins,8); askmod("process screen buffer",spdef.slesc,8); askmod("detach from console [MP/M only]",spdef.sldet,8); askmod("cancel unlogged changes",spdef.slcan,8); askmod("abort process",spdef.sabrt,8); askmod("terminate process",spdef.sstop,8); askmod("initiate special processing",spdef.slisp,8); askmod("kill next n lines",spdef.snlkil,8); askmod("insert n lines at cursor line",spdef.snlins,8); return NULL;  } /* */ /* askmod : ask whether operator wants to modify the */ /* specified string */ /* */ askmod(s,p,len) char *s,*p; int len; {char c; putstr("\nModify string for "); putstr(s); putdef(p); /* print the default string */ putstr("? "); if (!confirm(0)) /* test response */ return; getstr(s,p,len); /* get the new string */ } /* */ /* getstr : get a control string */ /* */ getstr(s,p,len) char *s,*p; int len; {char c,*t; int num; while (1) {t = p; /* set ptr to string */ while (1) {putcrt('\n'); /* print newline */ putstr(s); /* print string */ putdef(p); /* print the default string */ putstr("\nNumber of characters in string : "); num = getval(); if (num == -1) /* test for abort */ exit(0); if (num == -2) /* test for use default */ return; if (num < len) /* test for too long */ break; } while (num--) /* get all characters */ {putstr("\nChar : "); *t = getcrt(); xlat(*t++); /* print translated char */ } *t = -1; /* mark end of string */ if (confirm(1)) /* confirm the choice */ return; } } /* */ /* getrc : get row or column in cursor pos string */ /* */ getrc(p) char *p; {char c; while (1) {putlmsg(rcmsg); /* display message */ putcrt(*p); /* display default */ putstr("): "); c = getcrt(); /* get response */ putcrt(c); /* print char */  switch (c) /* test good */ {case 'r': /* binary row */ case 'c': /* binary column */ case 'R': /* ASCII row */ case 'C': /* ASCII column */ *p = c; /* store the choice */ case '\r': /* test for CR */ if (confirm(1)) /* confirm the choice */ return; break; default: /* invalid choice */ putstr("\nInvalid choice\n"); } } } /* */ /* getint : get integer value */ /* */ getint(p,n) char *p; int *n; {char *s; int val; while (1) /* get good response */ {s = p; /* print leadin string */ putstr(s); putdefn(*n); val = getval(); /* get value */ if (confirm(1)) /* confirm response */ {if (val == -1) /* test for abort */ exit(0); else if (val != -2) /* check for default */ *n = val; return val; } } } /* */ /* getval : get a numerical value */ /* */ getval() {char c; int val,dflg; val = dflg = 0; /* default is zero */ while (1) /* do all digits */ {c = getcrt(); /* get next character */ if (isdigit(c)) /* test for digit */ {putcrt(c); /* display digit */ val = val*10+(c&15); /* add to forming value */ dflg++; /* log digit input */ } else if (c == BS || c == DEL) /* test for delete */ {val = val/10; /* strip last digit */ putstr(bsdel); /* erase it */ if (dflg > 0) dflg--; /* subtract the digit */ } else if (c == CTRLC) /* test for abort */ return -1; else if (c == '\r') /* test for return */ {if (!dflg) /* if just CR */ return -2; /* return default */ break; /* done */ } } return val; /* return value */ } /* */ /* confirm : confirm the choice */ /* */ confirm(n) int n; {char c; if (n) putstr("\nIs this correct? "); c = getcrt(); putcrt(c); putcrt('\n'); if ((c == 'y')||(c == 'Y')) return 1; else return 0; } /* */ /* putlmsg : display a