Trailing-Edge
-
PDP-10 Archives
-
steco_19840320_1er_E35
-
10,5676/teco/source/techzl.mac
There are 3 other files named techzl.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==1126 ; Edit level
TECWHO==0 ; Last editor
PROLOGUE(HZL,<TECO Hazeltine terminal support>) ; Generate the TITLE and other stuff
$CODE ; Put into code PSECT
SUBTTL Table of Contents
;+
;.pag.lit
; Table of Contents for TECHZL - Hazeltine terminal support
;
;
; Section Page
; 1. Introduction . . . . . . . . . . . . . . . . . . . . . 1
; 2. Table of Contents. . . . . . . . . . . . . . . . . . . 2
; 3. Revision History . . . . . . . . . . . . . . . . . . . 3
; 4. Tables
; 4.1. H-1200. . . . . . . . . . . . . . . . . . . . 5
; 4.2. H-1500. . . . . . . . . . . . . . . . . . . . 6
; 4.3. H-2000. . . . . . . . . . . . . . . . . . . . 7
; 4.4. Hazeltine MOD-1 . . . . . . . . . . . . . . . 8
; 5. Support routines
; 5.1. Hazeltine MOD-1
; 5.1.1. XY positioning . . . . . . . . . . . 9
; 5.1.2. Delete a line feed . . . . . . . . . 10
; 5.1.3. Delete N lines . . . . . . . . . . . 11
; 5.1.4. Insert N lines . . . . . . . . . . . 12
; 5.1.5. Move cost calculation. . . . . . . . 13
; 5.2. H-1200
; 5.2.1. Delete a line feed . . . . . . . . . 14
; 5.3. H1500
; 5.3.1. XY positioning . . . . . . . . . . . 15
; 5.3.2. Control U. . . . . . . . . . . . . . 16
; 5.3.3. Delete a line feed . . . . . . . . . 17
; 5.3.4. Delete a vertical tab. . . . . . . . 18
; 5.3.5. Delete a form feed . . . . . . . . . 19
; 5.4. H2000
; 5.4.1. XY positioning . . . . . . . . . . . 20
; 5.4.2. Control U. . . . . . . . . . . . . . 21
; 5.5. MOD-1
; 5.5.1. XY positioning . . . . . . . . . . . 22
; 5.5.2. Control U. . . . . . . . . . . . . . 23
; 6. Low segment. . . . . . . . . . . . . . . . . . . . . . 24
; 7. End of TECHZL. . . . . . . . . . . . . . . . . . . . . 25
;.end lit.pag
;-
SUBTTL Revision History
COMMENT |
1000 Start of this version
1046 By: Nick Bush On: 16-October-1980
Add support for Hazeltine 1420 terminal.
Modules: TECHZL,TECTBL
1051 By: Robert McQueen On: 12-November-1980
1420 support needed the delete to end of line routine and the control
U processing.
Modules: TECHZL
1056 By: Nick Bush On: 21-November-1980
Add routines for Tektronix 4025.
Also fix an off by one case with Hazeltine 1420's.
Modules: TECHZL,TECTEK,TECDUM
Start of Version 200A(1126)
|
; 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 -- H-1200
CRTINI VHZL1
CRTENT BCK,<TB(.CHCNH)>
CRTENT DBS,<TB(.CHCNP,.CHCNH)>
CRTENT DLF,<PUSHJ P,H12DLF>
CRTENT DVT,<PUSHJ P,H12DLF>
CRTENT DFF,<PUSHJ P,H12DLF>
CRTENT CRB,<TB(.CHCNH)>
CRTEND
SUBTTL Tables -- Hazeltine 1420
CRTINI VHZ14
CRTENT WID,^D79 ; Number characters wide
CRTENT LIN,^D24 ; Number of lines long
CRTENT BCK,<TB(.CHBS)>
CRTENT SPC,<TB(.CHDLE)> ; Move one space
CRTENT DBS,<TB(" ",.CHBS)> ; Destructive backspace
CRTENT DLF,<PUSHJ P,H14DLF> ; Routine to delete a line feed
CRTENT CRB,<TB(.CHBS)> ; Cancel a rubout
CRTENT DEL,<PUSHJ P,H14DEL> ; Delete to end of line
CRTENT CTU,<PUSHJ P,H14CTU> ; Control U processing
CRTENT ERS,<TB(.CHESC,.CHFS)> ; Erase the screen
CRTENT DLL,<PUSHJ P,H14DLL> ; Routine to delete n lines
CRTENT INL,<PUSHJ P,H14INL> ; Routine to insert n lines
CRTENT XYP,<PUSHJ P,H14XY> ; Do XY positioning
CRTENT CIL,<MOVX T1,<INSVL.(2,CS$CST)>!<INSVL.($OPICH,CS$OPR)>> ; Cost to insert a line
CRTENT CDL,<MOVX T1,<INSVL.(2,CS$CST)>!<INSVL.($OPDCH,CS$OPR)>> ; Cost to delete a line
CRTENT CPP,<PUSHJ P,H14CPP> ; Cost to move from point A to B
CRTEND
SUBTTL Tables -- H-1500
CRTINI VHZL5
CRTENT BCK,<TB(.CHCNH)>
CRTENT SPC,<TB(" ")>
CRTENT DBS,<TB(" ",.CHCNH)>
CRTENT DLF,<PUSHJ P,H15DLF>
CRTENT DVT,<PUSHJ P,H15DVT>
CRTENT DFF,<PUSHJ P,H15DFF>
CRTENT CRB,<TB(.CHCNH)>
CRTENT CTU,<PUSHJ P,H15CTU>
CRTEND
SUBTTL Tables -- H-2000
CRTINI VHZL2
CRTENT BCK,<TB(.CHCNH)>
CRTENT SPC,<TB(" ")>
CRTENT DBS,<TB(" ",.CHCNH)>
CRTENT CRB,<TB(.CHCNH)>
CRTENT CTU,<PUSHJ P,H20CTU>
CRTEND
SUBTTL Tables -- Hazeltine MOD-1
CRTINI VHM1
CRTENT WID,^D79 ; Number characters wide
CRTENT LIN,^D24 ; Number of lines long
CRTENT BCK,<TB(.CHCNH)>
CRTENT SPC,<TB(.CHCNP)> ; Move one space
CRTENT DBS,<TB(" ",.CHCNH)> ; Destructive backspace
CRTENT DLF,<PUSHJ P,HM1DLF> ; Routine to delete a line feed
CRTENT CRB,<TB(.CHCNH)> ; Cancel a rubout
CRTENT ERS,<TB("~",.CHCBS)> ; Erase the screen
CRTENT DLL,<PUSHJ P,HM1DLL> ; Routine to delete n lines
CRTENT INL,<PUSHJ P,HM1INL> ; Routine to insert n lines
CRTENT XYP,<PUSHJ P,HM1XY> ; Do XY positioning
CRTENT CIL,<MOVX T1,<INSVL.(2,CS$CST)>!<INSVL.($OPICH,CS$OPR)>> ; Cost to insert a line
CRTENT CDL,<MOVX T1,<INSVL.(2,CS$CST)>!<INSVL.($OPDCH,CS$OPR)>> ; Cost to delete a line
CRTENT CPP,<PUSHJ P,HM1CPP> ; Cost to move from point A to B
CRTEND
SUBTTL Support routines -- Hazeltine MOD-1 -- XY positioning
;+
;.HL HM1XY
;This routine will do the positioning for the Hazeltine MOD-1 terminal.
;.literal
;
; Usage:
; MOVE X,X.postion
; MOVE Y,Y.postion
; MOVE CRT,CRT.block.index
; PUSHJ P,@$CRXYP(CRT)
; (Return)
;
;.end literal
;-
HM1XY: 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 HM1XYA ; No - Handle normally
SKIPN T1+$OFSY ; No change in the Y offset ?
JUMPE X,HM1XYC ; Yes - Only need a CR
MOVM T3,T1+$OFSX ; Get the X offset
SOJE T3,HM1XYX ; Just X by one
MOVM T3,T1+$OFSY ; Get the Y offset
SOJE T3,HM1XYY ; Just the Y by one
HM1XYA: SKIPN X ; Is this non-zero ?
JUMPE Y,HM1XYH ; Just home it
ADDX X," " ; Convert to a position
ADDX Y," " ; Convert to a position
MOVEI T1,[$STRING(<~_Q^8/Y/^8/X/>)]
PJRST SC$STR ; Output the string
; Here to just home the cursor
HM1XYH: MOVX T1,<BYTE(7)"~",.CHCNR> ; Get the home string
PJRST SC$STR ; And output it
; Here to just output a CR
HM1XYC: $SAVE <CH> ; Save the current character
MOVX CH,.CHCRT ; Just output a CR
PJRST SC$IMG ; . . .
; Here to move in the X direction by one
HM1XYX: $SAVE <CH> ; Save Ch
SKIPG T1+$OFSX ; Is this negative ?
SKIPA CH,[EXP .CHCNP] ; No - To the right
MOVX CH,.CHCNH ; Yes, To the left
PJRST SC$IMG ; Output the string
; Here to move in the Y direction by one
HM1XYY: SKIPL T1+$OFSY ; Is this negative ?
SKIPA T1,[BYTE(7)"~",.CHFFD] ; No - Move up
MOVX T1,<BYTE(7).CHLFD> ; Yes, move down
PJRST SC$STR ; Output the string
SUBTTL Support routines --Hazeltine MOD-1 -- Delete a line feed
;+
;.HL1 HM1DLF
;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
;-
HM1DLF: MOVX T1,<BYTE(7)"~",.CHFFD> ; Get the string
PJRST SC$STR ; Output the string
SUBTTL Support routines -- Hazeltine MOD-1 -- Delete N lines
;+
;.HL1 HM1DLL
;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
;-
HM1DLL: $SAVE <P1> ; Save a register
MOVE P1,T1 ; Copy the repeat count
HM1DL0: MOVX T1,<BYTE (7)"~",.CHCNS> ; Get the string to send
PUSHJ P,SC$STR ; Output the string
SOJG P1,HM1DL0 ; Loop for all lines
POPJ P, ; Return to the caller
SUBTTL Support routines --Hazeltine MOD-1 -- Insert N lines
;+
;.HL1 HM1INL
;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
;-
HM1INL: $SAVE <P1> ; Save a register
MOVE P1,T1 ; Copy the repeat count into the register
HM1IN0: MOVX T1,<BYTE (7)"~",.CHCNZ> ; Get the string for insert line
PUSHJ P,SC$STR ; Output the string
SOJG P1,HM1IN0 ; Loop
POPJ P, ; Return
SUBTTL Support routines -- Hazeltine MOD-1 -- Move cost calculation
;+
;.hl 1 HM1CPP
; 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
;-
HM1CPP: MOVE T3,T2 ; Get a copy of where we are moving to
XOR T3,T1 ; Xor together
JUMPE T3,.RET0 ; Zero if no movement
TXNN T3,LH.ALF ; Same X position line ?
JRST HM1CPY ; Yes - Check more
TXNN T3,RH.ALF ; Same Y position ?
JRST HM1CPX ; Yes - Check more
JUMPE T1,.RET2 ; If moving home return cost of one
HM1CPA: MOVX T1,4 ; Have to type four characters
POPJ P, ; Return
; Here if possible same column movement
HM1CPY: MOVEI T2,(T2) ; Get just the Y position
SUBI T2,(T1) ; Determine if just one line movement
MOVM T1,T2 ; . . .
SOJG T1,HM1CPA ; More than one - use four
JUMPL T2,.RET2 ; Upwards costs two chars
JRST .RET1 ; Else return one
; Here if possible same line movement
HM1CPX: 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 T2,T1 ; Get the magntude
SOJG T2,HM1CPA ; If more than one - return four
JRST .RET1 ; Else return one
SUBTTL Support routines -- Hazeltine 1420 -- XY positioning
;+
;.HL H14XY
;This routine will do the positioning for the Hazeltine 1420 terminal.
;.literal
;
; Usage:
; MOVE X,X.postion
; MOVE Y,Y.postion
; MOVE CRT,CRT.block.index
; PUSHJ P,@$CRXYP(CRT)
; (Return)
;
;.end literal
;-
H14XY: 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 H14XYA ; No - Handle normally
SKIPN T1+$OFSY ; No change in the Y offset ?
JUMPE X,H14XYC ; Yes - Only need a CR
MOVM T3,T1+$OFSX ; Get the X offset
SOJE T3,H14XYX ; Just X by one
MOVM T3,T1+$OFSY ; Get the Y offset
SOJE T3,H14XYY ; Just the Y by one
H14XYA: SKIPN X ; Is this non-zero ?
JUMPE Y,H14XYH ; Just home it
ADDX X,"`" ; Convert to a position
CAXL X,.CHDEL ; Did it overflow the character set?
SUBI X,<.CHDEL-" ">+1 ; Yes, get it back into the correct range
ADDX Y," " ; Convert to a position
MOVEI T1,[$STRING(<_Q^8/X/^8/Y/>)]
PJRST SC$STR ; Output the string
; Here to just home the cursor
H14XYH: MOVX T1,<BYTE(7).CHESC,.CHDC2> ; Get the home string
PJRST SC$STR ; And output it
; Here to just output a CR
H14XYC: $SAVE <CH> ; Save the current character
MOVX CH,.CHCRT ; Just output a CR
PJRST SC$IMG ; . . .
; Here to move in the X direction by one
H14XYX: $SAVE <CH> ; Save Ch
SKIPG T1+$OFSX ; Is this negative ?
SKIPA CH,[EXP .CHDLE] ; No - To the right
MOVX CH,.CHBS ; Yes, To the left
PJRST SC$IMG ; Output the string
; Here to move in the Y direction by one
H14XYY: SKIPL T1+$OFSY ; Is this negative ?
SKIPA T1,[BYTE(7).CHESC,.CHFF] ; No - Move up
MOVX T1,<BYTE(7).CHLFD> ; Yes, move down
PJRST SC$STR ; Output the string
SUBTTL Support routines -- Hazeltine 1420 -- Control U processing
;+
;.hl1 H14CTU
;This routine will process the control U. It will send the escape followed
;by a control O(.CHCNO)
;.literal
;
; Usage:
; MOVE CRT,CRT.block.address
; XCT $CRCTU(CRT)
; (return)
;
;.end literal
;-
H14CTU: MOVX T1,<BYTE(7).CHCRT,.CHESC,.CHCNO> ; Get the string to output
PUSHJ P,SC$STR ; Output the string
MOVEI CH,.CHCRT ; Output the cr
PJRST T$OCHR ; Output it
SUBTTL Support routines -- Hazeltine 1420 -- Delete to end of line
;+
;.hl1 H14DEL
;This routine will delete to the end of line.
;.literal
;
; MOVE CRT,CRT.block.address
; XCT $CRDEL(CRT)
; (Return)
;
;.end literal
;-
H14DEL: MOVX T1,<BYTE (7).CHESC,.CHCNO> ; Get the string
PJRST SC$STR ; Output the string
SUBTTL Support routines --Hazeltine 1420 -- Delete a line feed
;+
;.HL1 H14DLF
;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
;-
H14DLF: MOVX T1,<BYTE(7).CHESC,.CHFF> ; Get the string
PJRST SC$STR ; Output the string
SUBTTL Support routines -- Hazeltine 1420 -- Delete N lines
;+
;.HL1 H14DLL
;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
;-
H14DLL: $SAVE <P1> ; Save a register
MOVE P1,T1 ; Copy the repeat count
H14DL0: MOVX T1,<BYTE (7).CHESC,.CHDC3> ; Get the string to send
PUSHJ P,SC$STR ; Output the string
SOJG P1,H14DL0 ; Loop for all lines
POPJ P, ; Return to the caller
SUBTTL Support routines -- Hazeltine 1420 -- Insert N lines
;+
;.HL1 H14INL
;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
;-
H14INL: $SAVE <P1> ; Save a register
MOVE P1,T1 ; Copy the repeat count into the register
H14IN0: MOVX T1,<BYTE (7).CHESC,.CHSUB> ; Get the string for insert line
PUSHJ P,SC$STR ; Output the string
SOJG P1,H14IN0 ; Loop
POPJ P, ; Return
SUBTTL Support routines -- Hazeltine 1420 -- Move cost calculation
;+
;.hl 1 H14CPP
; 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
;-
H14CPP==HM1CPP ; Use same routine as MOD-1
SUBTTL Support routines -- H-1200 -- Delete a line feed
;+
;.HL1 H12DLF
;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
;-
H12DLF: MOVX CH,.CHLFD ; Get a line feed
PJRST T$OCHR ; And output it
SUBTTL Support routines -- H1500 -- XY positioning
;+
;.HL H15XY
;This routine will do the positioning for the H-1500 terminal.
;.literal
;
; Usage:
; MOVE X,X.postion
; MOVE Y,Y.postion
; MOVE CRT,CRT.block.index
; PUSHJ P,@$CRXYP(CRT)
; (Return)
;
;.end literal
;-
SUBTTL Support routines -- H1500 -- Control U
;+
;.HL1 H15CTU
;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
;-
H15CTU: MOVX T1,<BYTE (7).CHCRT,.CHAL2,.CHCNO> ; Get the string
PUSHJ P,SC$STR ; Output the string
MOVX CH,.CHCRT ; Get the ending character
PJRST T$OCHR ; Output the last character
SUBTTL Support routines -- H1500 -- Delete a line feed
;+
;.HL1 H15DLF
;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
;-
H15DLF: MOVX T1,<BYTE(7).CHAL2,.CHFFD> ; Get the string to do the delete
PJRST SC$STR ; And output it
SUBTTL Support routines -- H1500 -- Delete a vertical tab
;+
;.HL1 H15DVT
;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
;-
H15DVT: $SAVE <P1> ; Save P1
MOVX P1,4 ; Get the repeat count
H15D.0: PUSHJ P,H15DLF ; Delete the line feed
SOJG P1,H15D.0 ; Loop until done
POPJ P, ; And return
SUBTTL Support routines -- H1500 -- Delete a form feed
;+
;.HL1 H15DFF
;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
;-
H15DFF: $SAVE <P1> ; Save P1
MOVX P1,^D8 ; Get the repeat count
PJRST H15D.0 ; And delete the line feeds
SUBTTL Support routines -- H2000 -- XY positioning
;+
;.HL H20XY
;This routine will do the positioning for the H-2000 terminal.
;.literal
;
; Usage:
; MOVE X,X.postion
; MOVE Y,Y.postion
; MOVE CRT,CRT.block.index
; PUSHJ P,@$CRXYP(CRT)
; (Return)
;
;.end literal
;-
SUBTTL Support routines -- H2000 -- Control U
;+
;.HL1 H20CTU
;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
;-
H20CTU: MOVX T1,<BYTE (7),.CHAL2,.CHCNS,.CHDEL>
PUSHJ P,SC$STR ; Output the string
MOVX T1,.CHCRT ; Output the CR
PJRST T$OCHR ; Output the last character
SUBTTL Support routines -- MOD-1 -- XY positioning
;+
;.HL MD1XY
;This routine will do the positioning for the MOD-1 terminal.
;.literal
;
; Usage:
; MOVE X,X.postion
; MOVE Y,Y.postion
; MOVE CRT,CRT.block.index
; PUSHJ P,@$CRXYP(CRT)
; (Return)
;
;.end literal
;-
MD1XY: POPJ P, ; Return
SUBTTL Support routines -- MOD-1 -- Control U
;+
;.HL1 MD1CTU
;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
;-
MD1CTU: POPJ P, ; Reurn
SUBTTL Low segment
$IMPURE ; Put in correct place
HZLBEG:!
LOWVER(HZL,<.-HZLBEG>); Define the version number
SUBTTL End of TECHZL
END ; End of TECHZL