Trailing-Edge
-
PDP-10 Archives
-
steco_19840320_1er_E35
-
10,5676/teco/newsrc/techea.mac
There are 3 other files named techea.mac in the archive. Click here to see a list.
SUBTTL Introduction
; Copyright (c) 1980 Stevens Institute of Technology, Hoboken, New Jersey
; 07030.
; This software may be used and copied provided that this copyright notice
;is included, and provided that copies of all modifications are sent to:
;
; TECO Project
; Computer Center
; Stevens Institute of Technology
; Castle Point Station
; Hoboken, New Jersey 07030
;
;
; The information in this software is subject to change without notice
; and should not be construed as a commitment by Stevens Institute of
; Technology.
; Search needed universals
SEARCH TECUNV ; TECO universal file
; Generate the prologue
TECVER==200 ; Major version number
TECMIN==1 ; Minor version number
TECEDT==1136 ; Edit level
TECWHO==0 ; Last editor
PROLOGUE(HEA,<TECO Heathkit terminal support routines>) ; Generate the TITLE and other stuff
$CODE ; Put into code PSECT
SUBTTL Table of Contents
;+
;.pag.lit
; Table of Contents for TECHEA - Heathkit terminal support
;
;
; Section Page
; 1. Introduction . . . . . . . . . . . . . . . . . . . . . 1
; 2. Table of Contents. . . . . . . . . . . . . . . . . . . 2
; 3. Revision History . . . . . . . . . . . . . . . . . . . 3
; 4. Macro definitions. . . . . . . . . . . . . . . . . . . 4
; 5. Tables
; 5.1. H19 . . . . . . . . . . . . . . . . . . . . . 5
; 5.2. H19A. . . . . . . . . . . . . . . . . . . . . 6
; 6. Support routines
; 6.1. H19
; 6.1.1. Initialization routine . . . . . . . 7
; 6.1.2. Reset terminal . . . . . . . . . . . 8
; 6.1.3. XY positioning . . . . . . . . . . . 9
; 6.1.4. Delete a line feed . . . . . . . . . 10
; 6.1.5. Delete a vertical tab. . . . . . . . 11
; 6.1.6. Delete a form feed . . . . . . . . . 12
; 6.1.7. Control-U. . . . . . . . . . . . . . 13
; 6.1.8. Insert character . . . . . . . . . . 14
; 6.1.9. Type a character . . . . . . . . . . 15
; 6.1.10. Delete N lines . . . . . . . . . . . 16
; 6.1.11. Insert N lines . . . . . . . . . . . 17
; 6.1.12. Delete a character . . . . . . . . . 18
; 6.1.13. Cost initialization routine. . . . . 19
; 6.1.14. Replacement cost calculation . . . . 20
; 6.1.15. Insert cost calculation. . . . . . . 21
; 6.1.16. Delete cost calculation. . . . . . . 22
; 6.1.17. Move cost calculation. . . . . . . . 23
; 6.1.18. Delete to End of line. . . . . . . . 24
; 6.2. H19A
; 6.2.1. Delete the end of line . . . . . . . 25
; 6.2.2. Initialization routine . . . . . . . 26
; 6.2.3. Reset terminal . . . . . . . . . . . 27
; 6.2.4. XY positioning . . . . . . . . . . . 28
; 6.2.5. Delete a line feed . . . . . . . . . 29
; 6.2.6. Delete a vertical tab. . . . . . . . 30
; 6.2.7. Delete a form feed . . . . . . . . . 31
; 6.2.8. Control-U. . . . . . . . . . . . . . 32
; 6.2.9. Insert character . . . . . . . . . . 33
; 6.3. H1A
; 6.3.1. Type a character . . . . . . . . . . 34
; 6.4. H19A
; 6.4.1. Delete N lines . . . . . . . . . . . 35
; 6.4.2. Insert N lines . . . . . . . . . . . 36
; 6.4.3. Delete a character . . . . . . . . . 37
; 6.4.4. Cost initialization routine. . . . . 38
; 6.4.5. Replacement cost calculation . . . . 39
; 6.4.6. Insert cost calculation. . . . . . . 40
; 6.4.7. Delete cost calculation. . . . . . . 41
; 6.4.8. Insert line cost calculation . . . . 42
; 6.4.9. Delete line cost calculation . . . . 43
; 6.4.10. Move cost calculation. . . . . . . . 44
; 7. Low segment for TECHEA . . . . . . . . . . . . . . . . 45
; 8. End of TECHEA. . . . . . . . . . . . . . . . . . . . . 46
;.end lit.pag
;-
SUBTTL Revision History
COMMENT |
1000 Start of this version
1011 By: Nick Bush On: 6-August-1980
Fix the positioning cost routine to include the use of a tab for
the forward movement.
Modules: TECHEA
1067 By: Robert McQueen/Nick Bush On: 6-January-1981
The cost algorithms where wrong for a few cases (ANSII mode positioning
only). Fix them.
Modules: TECDEC,TECHEA,TECTEK
Start of Version 200A(1126)
1136 By: Nick Bush On: 1-January-1982
Don't use a tab to address past column 72 on H-19's. They only move one
space per tab at that point.
Modules: TECHEA
|
SUBTTL Macro definitions
; Macro to define a word of five characters
DEFINE TB(A<.CHNUL>,B<.CHNUL>,C<.CHNUL>,D<.CHNUL>,E<.CHNUL>)
< BYTE (7)A,B,C,D,E>
SUBTTL Tables -- H19
; Heathkit H19 (CHEAP) terminal (VT52 compat mode)
CRTINI VH19
CRTENT INT,<PUSHJ P,H19INT> ; Initialize the terminal handling
CRTENT WID,^D79 ; 80 by
CRTENT LIN,^D24 ; 25 lines
CRTENT CIN,<PUSHJ P,H19CIN> ; Cost initialization
CRTENT CRP,<PUSHJ P,H19CRP> ; Cost of replace character
CRTENT CIC,<PUSHJ P,H19CIC> ; Cost of insert character
CRTENT CDC,<PUSHJ P,H19CDC> ; Cost of delete character
CRTENT CIL,<MOVX T1,<<INSVL.($OPICH,CS$OPR)>!<INSVL.(2,CS$CST)>>> ; Cost of insert line
CRTENT CDL,<MOVX T1,<<INSVL.($OPDCH,CS$OPR)>!<INSVL.(2,CS$CST)>>> ; Cost of delete line
CRTENT CPP,<PUSHJ P,H19CPP> ; Cost of point to point move
CRTENT BCK,<TB(.CHCNH)>
CRTENT SPC,<TB(.CHESC,"C")>
CRTENT DBS,<TB(" ",.CHCNH)>
CRTENT DLF,<PUSHJ P,H19DLF> ; Delete a line feed
CRTENT DVT,<PUSHJ P,H19DVT> ; Delete a vertical tab
CRTENT DFF,<PUSHJ P,H19DFF> ; Delete a form feed
CRTENT CRB,<TB(.CHCNH)>
CRTENT CTU,<PUSHJ P,H19CTU> ; Routine to do control U processing
CRTENT FIN,<PUSHJ P,H19FIN>
CRTENT ERS,<TB(.CHESC,"E")>
CRTENT DEL,<PUSHJ P,H19DEL> ; Routine to delete to the end of a line
CRTENT DSP,.CHSPC
CRTENT INL,<PUSHJ P,H19INL> ; Routine to insert lines
CRTENT DLL,<PUSHJ P,H19DLL> ; Routine to delete lines
CRTENT TCH,<PUSHJ P,H19TCH> ; Type a character
CRTENT DCH,<PUSHJ P,H19DCH> ; Routine to delete a character
CRTENT ICH,<PUSHJ P,H19ICH> ; Routine to insert a character
CRTENT XYP,<PUSHJ P,H19XY> ; Routine to do XY positioning
CRTENT CDE,<MOVEI T1,2> ; Cost of 2
CRTEND
SUBTTL Tables -- H19A
; H19 - ANSI mode
CRTINI VH19A
CRTENT INT,<PUSHJ P,H1AINT> ; Initialize the terminal handling
CRTENT WID,^D79 ; 80 wide by
CRTENT LIN,^D24 ; 25 lines long (H-19)
CRTENT BCK,<TB(.CHCNH)> ; Back cursor (non-destructive)
CRTENT CIN,<PUSHJ P,H1ACIN> ; Cost initialization
CRTENT CRP,<PUSHJ P,H1ACRP> ; Cost of replace character
CRTENT CIC,<PUSHJ P,H1ACIC> ; Cost of insert character
CRTENT CDC,<PUSHJ P,H1ACDC> ; Cost of delete character
CRTENT CIL,<PUSHJ P,H1ACIL> ; Cost of insert line
CRTENT CDL,<PUSHJ P,H1ACDL> ; Cost of delete line
CRTENT CPP,<PUSHJ P,H1ACPP> ; Cost of point to point move
CRTENT SPC,<TB(.CHESC,"[","C")> ; Forward cursor (non-destructive)
CRTENT DBS,<TB(" ",.CHCNH)> ; String to delete a character
CRTENT DLF,<PUSHJ P,H1ADLF> ; Routine to delete a line feed
CRTENT DVT,<PUSHJ P,H1ADVT> ; Routine to delete a veritcal tab
CRTENT DFF,<PUSHJ P,H1ADFF> ; Routine to delete a form feed
CRTENT CRB,<TB(.CHCNH)> ; String to cancel effect of rubout
CRTENT CTU,<PUSHJ P,H1ACTU> ; String to delete entire line
CRTENT FIN,<PUSHJ P,H1AFIN> ; String to put cursor home
CRTENT ERS,<TB(.CHESC,"[","2","J")> ; String to home and erase screen
CRTENT DEL,<PUSHJ P,H1ADEL> ; String to delete to end of line
CRTENT DSP,.CHSPC ; Destructive forward space
CRTENT INL,<PUSHJ P,H1AINL> ; Routine to insert lines
CRTENT DLL,<PUSHJ P,H1ADLL> ; Routine to delete lines
CRTENT DCH,<PUSHJ P,H1ADCH> ; Routine to delete a character
CRTENT ICH,<PUSHJ P,H1AICH> ; Routine to insert a character
CRTENT TCH,<PUSHJ P,H1ATCH> ; Routine to type a character
CRTENT XYP,<PUSHJ P,H1AXY> ; XY positioning instruction
CRTENT CDE,<MOVEI T1,3> ; Cost of 3
CRTEND
SUBTTL Support routines -- H19 -- Initialization routine
;+
;.HL1 H19INT
;This routine will initialize the terminal handling routines for the
;specific terminal. It will also initialize the H19 terminal
;.literal
;
; Usage:
; MOVEI CRT,CRT.block.address
; XCT $CRINT(CRT)
; (Return)
;
;.end literal
;-
H19INT: SETZM INSFLG ; Flag not in insert mode
MOVEI T1,[$STRING(<^A[?2hOx1>)] ; Get the string to put terminal
; in VT-52 mode, not insert
PJRST SC$STR ; And output it
SUBTTL Support routines -- H19 -- Reset terminal
;+
;.HL1 H19FIN
;This routine will reset the terminal to set up for exiting from
;TECO.
;.literal
;
; Usage:
; MOVEI CRT,CRT.block.address
; XCT $CRFIN(CRT)
; (Return)
;
;.end literal
;-
H19FIN: SKIPN INSFLG ; In insert mode?
POPJ P, ; No, just return
SETZM INSFLG ; Flag not in insert mode
MOVX T1,<BYTE(7).CHESC,"O"> ; Get string to take out of insert mode
PJRST SC$STR ; And output it
SUBTTL Support routines -- H19 -- XY positioning
;+
;.HL H19XY
;This routine will do the positioning for the Heathkit H19 terminal.
;.literal
;
; Usage:
; MOVE X,X.postion
; MOVE Y,Y.postion
; MOVE CRT,CRT.block.index
; PUSHJ P,@$CRXYP(CRT)
; (Return)
;
;.end literal
;-
H19XY: $SAVE <X,Y> ; Save the args
DMOVE T1,CURPOS ; Get the current position
DMOVEM X,CURPOS ; Save the current position
SUB T1+$OFSX,X ; Determine if it is an up/down/right/left by one
SUB T1+$OFSY,Y ; movement
SKIPE T1+$OFSX ; Is the X zero ?
SKIPN T1+$OFSY ; Or the Y ?
SKIPA ; Yes - Handle differently
JRST H19XYA ; No - Handle normally
SKIPN T1+$OFSY ; No change in the Y offset ?
JUMPE X,H19XYC ; Yes - Only need a CR
MOVM T3,T1+$OFSX ; Get the X offset
SOJE T3,H19XYX ; Just X by one
MOVM T3,T1+$OFSY ; Get the Y offset
SOJE T3,H19XYY ; Just the Y by one
JUMPE T1+$OFSX,H19XYA ; If X change is zero, must do full address
TXNE X,7 ; Heading for a tab stop?
JRST H19XYA ; No, must do full address
JUMPG T1,H19XYA ; Going forward?
CAXG X,^D72 ; Can't use tabs past column 72
CAXGE T1,-^D8 ; Yes, is it the next tab stop?
JRST H19XYA ; No, do the full address
$SAVE <CH> ; Yes, save CH
MOVX CH,.CHTAB ; Get a tab
PJRST SC$IMG ; And type it
H19XYA: SKIPN X ; Is this non-zero ?
JUMPE Y,H19XYH ; Just home it
ADDX X," " ; Convert to a position
ADDX Y," " ; Convert to a position
MOVEI T1,[$STRING(<Y^8/Y/^8/X/>)]
PJRST SC$STR ; Output the string
; Here to just home the cursor
H19XYH: MOVX T1,<BYTE (7).CHESC,"H"> ; Get the home string
PJRST SC$STR ; Send it
; Here to just output a CR
H19XYC: $SAVE <CH> ; Save current character
MOVX CH,.CHCRT ; Just output a CR
PJRST SC$IMG ; . . .
; Here to move in the X direction by one
H19XYX: SKIPGE T1+$OFSX ; Is this negative ?
SKIPA T1,[BYTE (7).CHESC,"C"] ; No - To the right
MOVX T1,<BYTE(7).CHCNH> ; Yes, use a backspace
PJRST SC$STR ; Output the string
; Here to move in the Y direction by one
H19XYY: CAXN Y,^D25-1 ; Going to the 25th line?
JRST H19XYA ; Yes, have to use the direct addressing
SKIPL T1+$OFSY ; Is this negative ?
SKIPA T1,[BYTE (7).CHESC,"A"] ; No - Move up
MOVX T1,<BYTE(7).CHLFD> ; Yes, move down with a line feed
PJRST SC$STR ; Output the string
SUBTTL Support routines -- H19 -- Delete a line feed
;+
;.HL1 H19DLF
;This routine will send the character string to delete a line feed.
;.literal
;
; Usage:
; MOVE CRT,CRT.block.address
; PUSHJ P,@$CRDLF(CRT)
; (Return)
;.end literal
;-
H19DLF: MOVX T1,<BYTE (7).CHESC,"A"> ; Get the string
PJRST SC$STR ; And output it
SUBTTL Support routines -- H19 -- Delete a vertical tab
;+
;.HL1 H19DVT
;This routine will send the character string to delete a vertical tab.
;.literal
;
; Usage:
; MOVE CRT,CRT.block.address
; PUSHJ P,@$CRDVT(CRT)
; (Return)
;
;.end literal
;-
H19DVT: $SAVE <P1> ; Save P1
MOVX P1,4 ; Get the number of times to repeat
H19CMN: MOVX T1,<BYTE (7).CHESC,"A"> ; Get the string
PUSHJ P,SC$STR ; Output the string
SOJG P1,H19CMN ; Loop until done
POPJ P, ; Return to the caller
SUBTTL Support routines -- H19 -- Delete a form feed
;+
;.HL1 H19DFF
;This routine will send the character string to delete a form feed.
;.literal
;
; Usage:
; MOVE CRT,CRT.block.address
; PUSHJ P,$CRDFF(CRT)
; (Return)
;
;.end literal
;-
H19DFF: $SAVE <P1> ; Save P1
MOVX P1,10 ; Get the number of times to repeat
PJRST H19CMN ; Go to the common routine
SUBTTL Support routines -- H19 -- Control-U
;+
;.HL1 H19CTU
;This routine will process the control U in the command parser. It
;may be called without CRT being set up.
;.literal
;
; Usage:
; MOVE CRT,CRT.block.address
; PUSHJ P,@$CRCTU(CRT)
; (Return)
;
;.end literal
;-
H19CTU: MOVX T1,<BYTE(7).CHESC,"l"> ; Get the characters
; Here from either H19CTU or H1ACTU with string in T1
CTUFIN: PUSHJ P,SC$STR ; Output them
MOVX CH,.CHCRT ; And the free carriage return
PJRST T$OCHR ; Output it
SUBTTL Support routines -- H19 -- Insert character
;+
;.HL H19ICH
;This routine will cause a character to be inserted. It is called
;with the character. It is assumed that the positioning has been done
;before this routine is called.
;.literal
;
; Usage:
; MOVX CH,Character
; MOVEI CRT,CRT.block.address
; XCT $CRICH(CRT)
;
;.end literal
;-
H19ICH: SKIPE INSFLG ; In insert mode ?
PJRST SC$CHR ; Yes, then just type it
PUSH P,T1 ; Save T1
MOVX T1,<BYTE (7).CHESC,"@"> ; Enter insert mode string
PUSHJ P,SC$STR ; Type the string
POP P,T1 ; Restore T1
SETOM INSFLG ; Flag we are now in insert mode
PJRST SC$CHR ; Type the character
SUBTTL Support routines -- H19 -- Type a character
;+
;.HL1 H19TCH
;This routine will type a character on the terminal. It will first check
;to see if the terminal is in insert character mode and take it out if it
;is in insert character mode.
;.literal
;
; Usage:
; MOVX CH,Character
; MOVEI CRT,CRT.block.address
; XCT $CRTCH(CRT)
; (Return)
;
;.end literal
;-
H19TCH: SKIPN INSFLG ; In insert character mode ?
PJRST SC$CHR ; No - Type the character
PUSH P,T1 ; Save T1
MOVX T1,<BYTE (7).CHESC,"O"> ; Get the string
PUSHJ P,SC$STR ; Type the string
POP P,T1 ; And return
SETZM INSFLG ; Not in insert mode now
PJRST SC$CHR ; Type the character
SUBTTL Support routines -- H19 -- Delete N lines
;+
;.HL1 H19DLL
;This routine will cause N lines to be deleted from the screen. It is
;called with a repeat count.
;.literal
;
; Usage:
; MOVEI T1,Repeat.count
; MOVEI CRT,CRT.block.address
; XCT $CRDLL(CRT)
; (Return)
;
;.end literal
;-
H19DLL: $SAVE <P1> ; Save P1
MOVE P1,T1 ; Copy the repeat count
H19DL0: MOVX T1,<BYTE (7).CHESC,"M"> ; Get the text to send
PUSHJ P,SC$STR ; Output the string
SOJG P1,H19DL0 ; Loop for all the lines
POPJ P, ; Return
SUBTTL Support routines -- H19 -- Insert N lines
;+
;.HL1 H19INL
;This routine will cause N lines to be inserted on the screen. It is
;called with a repeat count.
;.literal
;
; Usage:
; MOVEI T1,Repeat.count
; MOVEI CRT,CRT.block.address
; XCT $CRINL(CRT)
; (Return)
;
;.end literal
;-
H19INL: $SAVE <P1> ; Save P1
MOVE P1,T1 ; Copy the count
H19IN0: MOVX T1,<BYTE (7).CHESC,"L"> ; Get the text to send
PUSHJ P,SC$STR ; Output the string
SOJG P1,H19IN0 ; Loop for all the lines
POPJ P, ; Return to the caller
SUBTTL Support routines -- H19 -- Delete a character
;+
;.HL1 H19DCH
;This routine will cause n characters to be deleted from the screen.
;It is assumed that all cursor positioning has been done before this
;routine is called.
;.literal
;
; Usage:
; MOVX T1,Number.of.character.to.delete
; MOVEI CRT,CRT.block.address
; XCT $CRDCH(CRT)
; (Return)
;
;.end literal
;-
H19DCH: $SAVE <P1> ; Save P1
MOVE P1,T1 ; Copy the value
H19CI0: MOVX T1,<BYTE (7).CHESC,"N"> ; Get the string to delete a char
PUSHJ P,SC$STR ; Type it
SOJG P1,H19CI0 ; Loop back
POPJ P, ; Return to the caller
SUBTTL Support routines -- H19 -- Cost initialization routine
;+
;.hl 1 H19CIN
; This routine will return the initial cost word for the character
;by character comparison of a line.
;.b.lit
;
; Usage:
; MOVE CRT,CRTTYP
; PUSHJ P,@$CRCIN(CRT) or XCT $CRCIN(CRT)
; (return, first array element in T1)
;
;.end literal
;-
CS$INS==1 ; Term dependent info - terminal in insert mode
H19CIN: MOVX T1,<INSVL.(0,CS$DEP)>!<INSVL.($OPACH,CS$OPR)>
SKIPE INSFLG ; In insert mode?
MOVX T1,<INSVL.(CS$INS,CS$DEP)>!<INSVL.($OPACH,CS$OPR)>
POPJ P, ; Return the cost word
SUBTTL Support routines -- H19 -- Replacement cost calculation
;+
;.hl 1 H19CRP
; This routine will return the cost of replacing a character in the
;line.
;.b.lit
;
; Usage:
; MOVE T1,CST entry
; MOVE X,[-n,,Column]
; MOVE Y,[-n,,Row]
; MOVE CRT,CRTTYP
; XCT $CRCRP(CRT)
; (return, T1=CST entry
;
;.end literal
;-
H19CRP: MOVE T2,T1 ; Copy the old word
MOVX T1,<<INSVL.($OPRCH,CS$OPR)>!<INSVL.(1,CS$CST)>> ; Get the operation
TXNN T2,<INSVL.(CS$INS,CS$DEP)> ; Check if in insert mode
POPJ P, ; No, return now
STORI. 3,T2,CSTCST,+T1 ; Store the cost if we are coming from insert mode
POPJ P, ; And return
SUBTTL Support routines -- H19 -- Insert cost calculation
;+
;.hl 1 H19CIC
; This routine will return the cost of inserting a character in the
;line.
;.b.lit
;
; Usage:
; MOVE T1,CST entry
; MOVE X,[-n,,Column]
; MOVE Y,[-n,,Row]
; MOVE CRT,CRTTYP
; XCT $CRCIC(CRT)
; (return, T1=CST entry
;
;.end literal
;-
H19CIC: MOVE T2,T1 ; Get a copy of the old entry
MOVX T1,<<INSVL.(CS$INS,CS$DEP)>!<INSVL.($OPICH,CS$OPR)>!<INSVL.(1,CS$CST)>>
TXNE T2,<INSVL.(CS$INS,CS$DEP)> ; Already in insert mode?
POPJ P, ; Yes, return
STORI. 3,T2,CSTCST,+T1 ; Store the cost if we must put into insert mode
POPJ P, ; And return
SUBTTL Support routines -- H19 -- Delete cost calculation
;+
;.hl 1 H19CDC
; This routine will return the cost of deleting a character in the
;line.
;.b.lit
;
; Usage:
; MOVE T1,CST entry
; MOVE X,[-n,,Column]
; MOVE Y,[-n,,Row]
; MOVE CRT,CRTTYP
; XCT $CRCDC(CRT)
; (return, T1=CST entry
;
;.end literal
;-
H19CDC: ANDX T1,CS$DEP ; Keep only the dependant portion
TXO T1,<<INSVL.($OPDCH,CS$OPR)>!<INSVL.(2,CS$CST)>> ; Store the operation
POPJ P, ; And return
SUBTTL Support routines -- H19 -- Move cost calculation
;+
;.hl 1 H19CPP
; This routine will return the cost of moving the cursor from
;one point to another.
;.b.lit
;
; Usage:
; MOVE T1,[XWD X pos,Y pos] ; Source position
; MOVE X,[-n,,Column]
; MOVE Y,[-n,,Row]
; MOVE CRT,CRTTYP
; XCT $CRCPP(CRT)
; (return, T1= cost in characters)
;
;.end literal
;-
H19CPP: MOVE T3,T2 ; Get a copy of where we are moving to
XOR T3,T1 ; Xor together
JUMPE T3,.RET0 ; Return a zero if not moving
TXNN T3,LH.ALF ; Same X position line ?
JRST H19CPY ; Yes - Check more
TXNN T3,RH.ALF ; Same Y position ?
JRST H19CPX ; Yes - Check more
JUMPE T2,.RET2 ; If moving home return cost of two
H19CPA: MOVX T1,4 ; Have to type four characters
POPJ P, ; Return
; Here if possible same column movement
H19CPY: MOVEI T2,(T2) ; Get just the Y position
SUBI T2,(T1) ; Determine if just one line movement
MOVM T1,T2 ; . . .
SOJG T1,H19CPA ; Go return the full position cost
JUMPL T2,.RET2 ; If less than zero return two
JRST .RET1 ; Else return one
; Here if possible same line movement
H19CPX: HLRZ T2,T2 ; Get just the X position
JUMPE T2,.RET1 ; If moving to the beginning of the line
; then return one
HLRZ T1,T1 ; See if moving only one position
SUBI T1,(T2) ; . . .
MOVM T3,T1 ; Get the magntude
JUMPG T1,H19CPZ ; Moving forward?
CAXL T1,-^D8 ; Less than a tab stop?
TXNE T2,7 ; And ending on a tab stop?
JRST H19CPZ ; No, check other posibilities
PJRST .RET1 ; Yes, return a one
H19CPZ: SOJG T3,H19CPA ; If more than one - return four
JUMPL T1,.RET1 ; If backing up then only one
JRST .RET2 ; Else return two
SUBTTL Support routines -- H19 -- Delete to End of line
;+
;.hl1 H19DEL
;This routine will delete to the end of the line.
;.literal
;
; Usage:
; MOVEI T1,# of characters to delete
; XCT $CRDEL(CRT)
;
;.end literal
;-
H19DEL: MOVX T1,<BYTE (7) .CHESC,"K">
PJRST SC$STR ; Print out the string
SUBTTL Support routines -- H19A -- Delete the end of line
;+
;.hl1 H1ADEL
;This routine will delete to the end of the line.
;.literal
;
; Usage:
; MOVEI T1,# of characters to delete
; XCT $CRDEL(CRT)
;
;.end literal
;-
H1ADEL: MOVX T1,<BYTE (7).CHESC,"[","K">
PJRST SC$STR ; Print it out
SUBTTL Support routines -- H19A -- Initialization routine
;+
;.HL1 H1AINT
;This routine will initialize the terminal handling routines for the
;specific terminal. It will also initialize the H19A terminal
;.literal
;
; Usage:
; MOVEI CRT,CRT.block.address
; XCT $CRINT(CRT)
; (Return)
;
;.end literal
;-
H1AINT: SETZM INSFLG ; Flag not in insert mode
MOVEI T1,[$STRING(<^A[4l[^R1h>)] ; Put in ANSI mode, not insert
PJRST SC$STR ; Output the string
SUBTTL Support routines -- H19A -- Reset terminal
;+
;.HL1 H1AFIN
;This routine will reset the terminal to set up for exiting from
;TECO.
;.literal
;
; Usage:
; MOVEI CRT,CRT.block.address
; XCT $CRFIN(CRT)
; (Return)
;
;.end literal
;-
H1AFIN: SKIPN INSFLG ; In insert mode?
POPJ P, ; No, just return
SETZM INSFLG ; Flag not in insert mode
MOVX T1,<BYTE(7).CHESC,"[","4","l"> ; Get string to take out of insert mode
PJRST SC$STR ; And output it
SUBTTL Support routines -- H19A -- XY positioning
;+
;.hl1 H19XY
;This routine will do the positioning for the Heathkit H19 (ANSI mode) terminal.
;.literal
;
; Usage:
; MOVE X,X.postion
; MOVE Y,Y.postion
; MOVE CRT,CRT.block.index
; XCT $CRXYP(CRT)
; (Return)
;
;.end literal
;-
H1AXY: ; H19 in ANSI mode
$SAVE <X,Y> ; Save X and Y
DMOVE T1,CURPOS ; Get the current position
DMOVEM X,CURPOS ; Save the current position
SUB T1+$OFSX,X ; Determine if it is an up/down/right/left by one
SUB T1+$OFSY,Y ; movement
SKIPE T1+$OFSX ; Is the X zero ?
SKIPN T1+$OFSY ; Or the Y ?
SKIPA ; Yes - Handle differently
JRST H1AXYA ; No - Handle normally
JUMPN T1+$OFSX,H1AXYX ; Just moving in the X direction
JUMPN T1+$OFSY,H1AXYY ; Just moving in the Y direction
POPJ P, ; If we get here, we don't have to move at all
; Here to do a full address
H1AXYA: SKIPN X ; Going home?
JUMPE Y,H1AXYH ; . . .
ADDI X,1 ; Bump both of the coordinates so home is 1,1
ADDI Y,1 ; . . .
MOVEI T1,[$STRING(<[^D/Y/;^D/X/H>)] ; Get the string address
PJRST SC$STR ; And go position the cursor
; Here if we are just going to home the cursor
H1AXYH: MOVX T1,<BYTE (7).CHESC,"[","H"> ; Get the string
PJRST SC$STR ; Type the string
; Here to move only in the X direction
H1AXYX: TXNE X,7 ; Heading for a tab stop?
JRST HAXY.9 ; No, do normal movement
JUMPG T1,HAXY.9 ; Going forward?
CAXG X,^D72 ; Tabs don't work past column 72
CAXGE T1,-^D8 ; Yes, is it the next tab stop?
JRST HAXY.9 ; No, do the full address
$SAVE <CH> ; Yes, save CH
MOVX CH,.CHTAB ; Get a tab
PJRST SC$IMG ; And type it
; Here if we are not going to a tab stop
HAXY.9: MOVM X,T1 ; Get the number of spaces to move
CAXN X,1 ; Only one space?
JRST H1AX.1 ; Yes, go handle it
SKIPL T1+$OFSX ; Load the offset and check the string
SKIPA T1,[[$STRING(<[^D/X/D>)]] ; Get the string to type
MOVEI T1,[$STRING(<[^D/X/C>)] ; Get the other way
PJRST SC$STR ; Output the string
; Here to move in the X direction one position
H1AX.1: SKIPG T1 ; Backwards
SKIPA T1,[BYTE(7).CHESC,"[","C"] ; Go forward one
MOVX T1,<BYTE(7).CHCNH> ; Go backwards one
PJRST SC$STR ; Go output the string
; Here to move only in the Y direction
H1AXYY: CAXN Y,^D25-1 ; Going to the extra line?
JRST H1AXYA ; Yes, use direct addressing
MOVM Y,T1+$OFSY ; Get the number to move
CAXN Y,1 ; Only one line?
JRST H1AY.1 ; Yes, go handle it
SKIPL Y,T1+$OFSY ; Is this negative ?
SKIPA T1,[[$STRING(<[^D/Y/A>)]] ; No - Move up
MOVEI T1,[$STRING(<[^D/Y/B>)] ; Yes - Move down
MOVMS Y ; Make this positive
PJRST SC$STR ; Output the string
; Here to move one position in the Y direction
H1AY.1: SKIPL T2 ; Up or down?
SKIPA T1,[BYTE(7).CHESC,"[","A"] ; Up, use escape seqeunce
MOVX T1,<BYTE(7).CHLFD> ; Down, use a line feed
PJRST SC$STR ; All done
SUBTTL Support routines -- H19A -- Delete a line feed
;+
;.HL1 H1ADLF
;This routine will send the character string to delete a line feed.
;.literal
;
; Usage:
; MOVE CRT,CRT.block.address
; XCT $CRDLF(CRT)
; (Return)
;.end literal
;-
H1ADLF: MOVX T1,<BYTE (7).CHESC,"[","A">
PJRST SC$STR ; Output the string
SUBTTL Support routines -- H19A -- Delete a vertical tab
;+
;.HL1 H1ADVT
;This routine will send the character string to delete a vertical tab.
;.literal
;
; Usage:
; MOVE CRT,CRT.block.address
; XCT $CRDVT(CRT)
; (Return)
;
;.end literal
;-
H1ADVT: MOVX T1,<BYTE (7).CHESC,"[","4","A">
PJRST SC$STR ; Output the string
SUBTTL Support routines -- H19A -- Delete a form feed
;+
;.HL1 H1ADFF
;This routine will send the character string to delete a form feed.
;.literal
;
; Usage:
; MOVE CRT,CRT.block.address
; PUSHJ P,$CRDFF(CRT)
; (Return)
;
;.end literal
;-
H1ADFF: MOVX T1,<BYTE (7).CHESC,"[","8","A">
PJRST SC$STR ; Output the string
SUBTTL Support routines -- H19A -- Control-U
;+
;.HL1 H1ACTU
;This routine will process the control U in the command parser. It
;may be called without CRT being set up.
;.literal
;
; Usage:
; MOVE CRT,CRT.block.address
; XCT $CRCTU(CRT)
; (Return)
;
;.end literal
;-
H1ACTU: MOVX T1,<BYTE(7).CHESC,"[","2","K"> ; Get the string
PJRST CTUFIN ; And go finish it up
SUBTTL Support routines -- H19A -- Insert character
;+
;.HL H1AICH
;This routine will cause a character to be inserted. It is called
;with the character. It is assumed that the positioning has been done
;before this routine is called.
;.literal
;
; Usage:
; MOVX CH,Character
; MOVEI CRT,CRT.block.address
; XCT $CRICH(CRT)
;
;.end literal
;-
H1AICH: SKIPE INSFLG ; In insert mode ?
PJRST SC$CHR ; Yes, Just type the character
PUSH P,T1 ; Save T1
MOVX T1,<BYTE (7).CHESC,"[","4","h"> ; Get the string to enter insert mode
PUSHJ P,SC$STR ; Type the string
POP P,T1 ; Restore T1
SETOM INSFLG ; Flag in insert mode now
PJRST SC$CHR ; Type it
SUBTTL Support routines -- H1A -- Type a character
;+
;.HL1 H1ATCH
;This routine will type a character on the terminal. It will first check
;to see if the terminal is in insert character mode and take it out if it
;is in insert character mode.
;.literal
;
; Usage:
; MOVX CH,Character
; MOVEI CRT,CRT.block.address
; XCT $CRTCH(CRT)
; (Return)
;
;.end literal
;-
H1ATCH: SKIPN INSFLG ; In insert character mode ?
PJRST SC$CHR ; No - Type the character
PUSH P,T1 ; Save T1
MOVX T1,<BYTE (7).CHESC,"[","4","l"> ; Get the string
PUSHJ P,SC$STR ; Type the string
POP P,T1 ; Restore T1
SETZM INSFLG ; Not in insert mode now
PJRST SC$CHR ; Type the character
SUBTTL Support routines -- H19A -- Delete N lines
;+
;.HL1 H1ADLL
;This routine will cause N lines to be deleted from the screen. It is
;called with a repeat count.
;.literal
;
; Usage:
; MOVEI T1,Repeat.count
; MOVEI CRT,CRT.block.address
; XCT $CRDLL(CRT)
; (Return)
;
;.end literal
;-
H1ADLL: $SAVE <P1> ; Save the repeat count
MOVE P1,T1 ; Copy the number of times
CAXE P1,1 ; Is this only one ?
SKIPA T1,[[$STRING(<[^D/P1/M>)]] ; Get the text
MOVX T1,<BYTE (7).CHESC,"[","M"> ; Get the other text
PUSHJ P,SC$STR ; Output the text
SETZ X, ; At right margin now
DMOVEM X,CURPOS ; Remember where we are
POPJ P, ; Return
SUBTTL Support routines -- H19A -- Insert N lines
;+
;.HL1 H1AINL
;This routine will cause N lines to be inserted on the screen. It is
;called with a repeat count.
;.literal
;
; Usage:
; MOVEI T1,Repeat.count
; MOVEI CRT,CRT.block.address
; XCT $CRINL(CRT)
; (Return)
;
;.end literal
;-
H1AINL: $SAVE <P1> ; Save P1
MOVE P1,T1 ; Copy the repeat count
CAXE P1,1 ; Is there only one item ?
SKIPA T1,[[$STRING(<[^D/P1/L>)]] ; Get the string
MOVX T1,<BYTE (7).CHESC,"[","L"> ; Or the shorter string
PUSHJ P,SC$STR ; Output the string and return
SETZ X, ; At right column now
DMOVEM X,CURPOS ; Remember it
POPJ P, ; And return
SUBTTL Support routines -- H19A -- Delete a character
;+
;.HL1 H1ADCH
;This routine will cause n characters to be deleted from the screen.
;It is assumed that all cursor positioning has been done before this
;routine is called.
;.literal
;
; Usage:
; MOVX T1,Number.of.character.to.delete
; MOVEI CRT,CRT.block.address
; XCT $CRDCH(CRT)
; (Return)
;
;.end literal
;-
H1ADCH: $SAVE <P1> ; Save P1
MOVE P1,T1 ; Copy the number
CAXN P1,1 ; Only one character?
SKIPA T1,[BYTE(7).CHESC,"[","P"] ; Get the string for one character
MOVEI T1,[$STRING(<[^D/P1/P>)] ; Get the string to send
PJRST SC$STR ; Send the string
SUBTTL Support routines -- H19A -- Cost initialization routine
;+
;.hl 1 H1ACIN
; This routine will return the initial cost word for the character
;by character comparison of a line.
;.b.lit
;
; Usage:
; MOVE CRT,CRTTYP
; XCT $CRCIN(CRT)
; (return, first array element in T1)
;
;.end literal
;-
H1ACIN==H19CIN ; Same as VT52 mode
SUBTTL Support routines -- H19A -- Replacement cost calculation
;+
;.hl 1 H1ACRP
; This routine will return the cost of replacing a character in the
;line.
;.b.lit
;
; Usage:
; MOVE T1,CST entry
; MOVX X,[XWD -n,Column]
; MOVE Y,[XWD -n,Row]
; MOVE CRT,CRTTYP
; XCT $CRCRP(CRT)
; (return, T1=CST entry
;
;.end literal
;-
H1ACRP: MOVE T2,T1 ; Get the old word
MOVX T1,<<INSVL.($OPRCH,CS$OPR)>!<INSVL.(1,CS$CST)>> ; Get the basic cost
TXNN T2,<INSVL.(CS$INS,CS$DEP)> ; Check if in insert mode
POPJ P, ; No, just return
STORI. 5,T2,CSTCST,+T1 ; Yes, taking out takes 4 chars
POPJ P, ; Return the cost
SUBTTL Support routines -- H19A -- Insert cost calculation
;+
;.hl 1 H1ACIC
; This routine will return the cost of inserting a character in the
;line.
;.b.lit
;
; Usage:
; MOVE T1,CST entry
; MOVX X,[XWD -n,Column]
; MOVE Y,[XWD -n,Row]
; MOVE CRT,CRTTYP
; XCT $CRCIC(CRT)
; (return, T1=CST entry
;
;.end literal
;-
H1ACIC: MOVE T2,T1 ; Get the old word
MOVX T1,<INSVL.(CS$INS,CS$DEP)>!<INSVL.($OPICH,CS$OPR)>!<INSVL.(1,CS$CST)>
TXNE T2,<INSVL.(CS$INS,CS$DEP)> ; Already in insert mode?
POPJ P, ; Yes, just return
STORI. 5,T2,CSTCST,+T1 ; No, must put in insert mode first
POPJ P, ; Return the cost
SUBTTL Support routines -- H19A -- Delete cost calculation
;+
;.hl 1 H1ACDC
; This routine will return the cost of deleting a character in the
;line.
;.b.lit
;
; Usage:
; MOVE T1,CST entry
; MOVX X,[XWD -n,Column]
; MOVE Y,[XWD -n,Row]
; MOVE CRT,CRTTYP
; XCT $CRCDC(CRT)
; (return, T1=CST entry
;
;.end literal
;-
H1ACDC: $SAVE <P1,P2,P3> ; Save some room
LOAD. P1,CSTOPR,+T1 ; Get the last operation
LOAD. P2,CSTRPT,+T1 ; And the repeat count
MOVEI P3,1 ; Get the basic cost
ANDX T1,CS$DEP ; Keep only dependant portion
TXO T1,<INSVL.($OPDCH,CS$OPR)>!<INSVL.(3,CS$CST)> ; Store the operation
CAXE P1,$OPDCH ; Was the last operation the same?
POPJ P, ; No, return now
AOJ P2, ; Add one to the repeat count
CAXN P2,2 ; Is this the second delete?
AOJ P3, ; Yes, bump the cost
CAXN P2,^D10 ; Is it the first that requires two digits?
AOJ P3, ; Yes, bump the cost
STOR. P3,CSTCST,+T1 ; Store the cost
POPJ P, ; And return
SUBTTL Support routines -- H19A -- Insert line cost calculation
;+
;.hl 1 H1ACIL
; This routine will return the cost of inserting a line in the
;screen.
;.b.lit
;
; Usage:
; MOVE T1,CST entry
; MOVX X,[XWD -n,Column]
; MOVE Y,[XWD -n,Row]
; MOVE CRT,CRTTYP
; XCT $CRCIL(CRT)
; (return, T1=CST entry
;
;.end literal
;-
H1ACIL: LOAD. T2,CSTOPR,+T1 ; Get the previous operation
CAXE T2,$OPICH ; Already inserting?
JRST [MOVX T1,<<INSVL.($OPICH,CS$OPR)>!<INSVL.(3,CS$CST)>>
POPJ P,] ; Return a three for the initial cost
H1ACID: LOAD. T2,CSTRPT,+T1 ; Get the number of inserts already done
ANDX T1,CS$OPR ; Keep only the operation
SETZ T3, ; Clear basic cost
CAIN T2,1 ; Going to first insert that needs a digit?
AOJ T3, ; Yes, count the first digit
CAIN T2,^D9 ; First that requires two digits?
AOJ T3, ; Yes, count that
STOR. T3,CSTCST,+T1 ; Store the cost
POPJ P, ; And return
SUBTTL Support routines -- H19A -- Delete line cost calculation
;+
;.hl 1 H1ACDL
; This routine will return the cost of deleting a line in the
;screen.
;.b.lit
;
; Usage:
; MOVE T1,CST entry
; MOVX X,[XWD -n,Column]
; MOVE Y,[XWD -n,Row]
; MOVE CRT,CRTTYP
; XCT $CRCDL(CRT)
; (return, T1=CST entry
;
;.end literal
;-
H1ACDL: CFXN. T2,CSTOPR,+T1,$OPDCH ; Last operation a delete?
JRST H1ACID ; Yes, go calculate any extra cost
MOVX T1,<<INSVL.($OPDCH,CS$OPR)>!<INSVL.(3,CS$CST)>> ; Get the initial cost
POPJ P, ; And return it
SUBTTL Support routines -- H19A -- Move cost calculation
;+
;.hl 1 H1ACPP
; This routine will return the cost of moving the cursor from
;one point to another.
;.b.lit
;
; Usage:
; MOVE T1,[XWD X pos,Y pos] ; Source position
; MOVE T2,[XWD X pos,Y pos]
; MOVE CRT,CRTTYP
; XCT $CRCPP(CRT)
; (return, T1= cost in characters)
;
;.end literal
;-
H1ACPP: CAMN T1,T2 ; Really moving somewhere?
PJRST .RET0 ; No, return a zero
HRRZ T3,T1 ; Get the X positions
HRRZ T4,T2 ; Of both
HLRZ T1,T1 ; Keep only the Y positions
HLRZ T2,T2 ; . . .
CAIE T3,(T4) ; Same line?
JRST HACP.1 ; No, go check for same column
JUMPE T2,.RET1 ; Going to column 0 takes only 1 char
MOVE T3,T2 ; Get the destination column
SUB T2,T1 ; Get the dest-source positions
MOVE T4,T1 ; Get the destination column
MOVM T1,T2 ; Get the magnitude
JUMPL T2,HACP.3 ; Skip if going backwards
; Check if we can use a tab
TXNN T3,7 ; Going to a tab stop?
CAXLE T1,^D8 ; Yes, is it the next one?
JRST HACP.4 ; No, figure out how many chars it will take
PJRST .RET1 ; Yes, return a one
; Here for either a forward cursor or an up cursor
HACP.4: MOVEI T1,3 ; Assume simple case of one char
CAIE T2,1 ; Is it?
AOJ T1, ; No, need at least one more
HACP.0: CAIL T2,^D10 ; Need two digits
AOJ T1, ; Yes, count the second
POPJ P, ; And return
; Here if position is on the same line before current position
; or is in the same column, but below the current line
HACP.3: MOVE T2,T1 ; Get the number of columns to move
MOVEI T1,1 ; Assume one
CAIE T2,1 ; Is it?
ADDI T1,3 ; No, need the relative movement
JRST HACP.0 ; Go count the digits we need
; Here if new position is on a different line.
HACP.1: CAIE T1,(T2) ; Same column?
JRST HACP.2 ; No, try for home
SUB T4,T3 ; Yes, get the number to move
MOVM T1,T4 ; And the magnitude
JUMPGE T4,HACP.3 ; Going down?
JRST HACP.4 ; No, go handle like forward cursor
; Here if not the same column or line
HACP.2: SKIPN T1 ; Is the destination home?
SKIPE T3 ; . . .
JRST HACP.5 ; No, go handle it
MOVEI T1,3 ; Yes, only takes two chars
POPJ P, ; All done
; Here if we must do the cursor position
HACP.5: MOVE T2,T1 ; Get the destination column
MOVEI T1,4 ; Get the basic cost
CAIL T3,^D9 ; Before line 10?
AOJ T1, ; No, takes another digit
CAIL T2,^D9 ; Before column 10
AOJ T1, ; No, another digit
POPJ P, ; All done
SUBTTL Low segment for TECHEA
$IMPURE
HEABEG:!
INSFLG: BLOCK 1 ; Flag whether we are in insert mode (0 if not)
LOWVER(HEA,<.-HEABEG>) ; Define the version number
SUBTTL End of TECHEA
END ; End of TECHEA