Trailing-Edge
-
PDP-10 Archives
-
scratch
-
10,7/unscsp/sos/soslin.mac
There are 3 other files named soslin.mac in the archive. Click here to see a list.
TITLE SOSLIN - The I, M, R, D, K And N Commands
; ---------------------------------------
;
; This file contains the code for the following commands:
; 1. Insert (I)
; 2. Insert page mark (M)
; 3. Replace (R)
; 4. Delete (D)
; 5. Delete a page mark (K)
; 6. Renumber (N)
;
SEARCH SOSTCS
$INIT
; Flag definitions for this module
DELFPG==PDFL1 ; We must delete the last page
RPLFLG==PDFL2 ; We are doing a replace
YESFLG==PDFL3 ; He used the Y switch
PGDLF==PDFL4
SUBTTL THE INSERT COMMAND
; Insert a line
CRTINS::OCRLF
MOVEI T1,1 ; Start inserting at line 100 page 1
MOVEM T1,HIPG
MOVEM T1,CPGL ; And set up current page number
MOVE T1,INCR ; No, start insertion at INCR
MOVEM T1,HILN
SETZM ERSW## ; In case just came in from an ER
JRST INSGO ; And away we go
INSERT::PUSHJ P,GET2SD## ; Get line number, accept null for .
TRNN FL,LINSN ;Was a line number seen
JRST INSMK ;YES--INSERT ON NEW PAGE
DMOVE T1,HILN ; Get high limit
CAMN T1,LOLN ; Low and high must be the same
CAME T2,LOPG ; both pages and lines
NERROR ILC
TRNE FL,CNTF ; Did he type !
JRST NOINC ; No increment can be specified
CAIN C,";" ; Check for temp incr
JRST [MOVE T1,INCR ; Yes: save old
MOVEM T1,TEMINC
JRST GETINC]
CAIE C,"," ; If a comma, set increment
JRST NOINC ; No, go look for a terminator
GETINC: PUSHJ P,SCAN## ; Get the number
TRNE FL,NUMF ; Was it a number?
CAMN T1,LNZERO## ; Do not permit 0 incr
NERROR ILC ; He was confused
MOVEM T1,INCR ; No, set increment
PUSHJ P,SCAN## ; Scan past it
NOINC: PUSHJ P,CKTRMF## ; Make sure that command terminates
SETZM ALTSN ; Clear altmode flag
INSGO:: PUSHJ P,FINDHI## ; Go get um
MOVE T2,CPG ; Demand correct page match
CAME T2,HIPG
NERROR NSP
TRNN FL,CNTF ; ! type increment specification?
JRST INSTRY ; No, go start the insert
MOVE T2,INCR ; Save increment
MOVEM T2,TEMINC ; For later restoration
MOVE T2,HILN ; Get limit
MOVE T3,SVCNT ; And number of lines to insert
PUSHJ P,GETDIF## ; Compute increment
NERROR ILR ; None exists
MOVEM T1,HILN ; Save next line
MOVEM T2,INCR ; and computed increment
JRST SINSLP ; Start the insert
INSTRY: MOVE T2,LNZERO## ; Set to compare
CAME T2,HILN ; Are they matching?
JRST INSTR1 ; If not zero
MOVE T1,LNZERO ; Fetch a zero as target line
JRST INSTR2 ; And join processing
INSTR1: CAME T1,HILN ; Specified line was zero?
JRST SINSLP ; No, go start the insert
INSTR2: MOVE T2,INCR ; Specified increment
PUSHJ P,FIXLIN## ; Get a usable one
EXP HILN ; Points to high limit
NERROR ILR ; No increment will do
MOVEM T2,HILN ; Save first number in HILN
SINSLP: MOVE T1,HILN
MOVEM T1,CLN
INSLP: SETZM OCNT
TLO FL2,INSF ; Post that we are doing an insert
IFN %UAHPQ,<
PUSHJ P,HPQON## ; Use HPQ for fast response
>
SKIPE ALTSN ; Altmode seen?
JRST LVINS ; Yes: done
MOVE T1,HILN ; Tell him the line he is inserting
MOVEM T1,LIBUF ; And put it in the buffer
SKIPN COMFLF ; Ignore seq # if in command file
PUSHJ P,OUTSN## ; Put it out
PUSHJ P,RDLIN## ; Read a line
JRST LVINS ; Yes, get out of insert mode>
IFN CKPSW,<
PUSHJ P,WRTBLK## ; Write checkpoint file now
>
MOVEM T1,NCNT ; Here is the count of the new one
PUSHJ P,INSED## ; Go insert
TRZN FL2,ENTALT ; Alter this one?
JRST NOIALT ; Don't do alter
SKIPL AUTALT ; Old style?
JRST IALT1 ; No, do special DPY mode alter
OCRLF ; Give a CRLF
MOVEI T5,CPOPJ## ; No implied first command
JRST IALT2 ; Do the alter
IALT1: SETOM SUPSNF ; Suppress sequence number
TRO FL2,SUPN ; And tab-over typeout
MOVEI T5,[PUSHJ P,ALTTAB## ; Tab over internally
PUSHJ P,SETPVS## ; Setup previous size
MOVEI C,33 ; Character needing erasure
PUSHJ P,RUBAK## ; Back over it
PJRST TYPSTR##] ; and erase it
IALT2: PUSHJ P,ALTLIN## ; Now go do an alter
JRST ALVINS
PUSHJ P,INSED ; Re-insert the line
NOIALT: SOSN ISAVEN ; Time to save?
PUSHJ P,ASVCOD## ; Yes: go do it
PUSHJ P,FINDN## ; Move up a line
SKIPE FFFLAG ; Did he type formfeed?
JRST INSFF ; Yes, go insert a new page
INSRTX::MOVE T1,CPG ; Set current line and page to last
MOVEM T1,CPGL ; One really inserted
MOVEM T1,CURINP ; Save current page
MOVE T1,HILN ; Get next line to insert
MOVEM T1,CLN ; Save as current
MOVEM T1,CURINS ; and as last line inserted
MOVE T2,INCR ; Get next line to insert
PUSHJ P,ASCIAD##
CAMG T1,INCR ; Have we wrapped around
JRST LVINS0 ; Yes, stop
ENTIN0: MOVEM T1,HILN ; Store for reference
ENTINS: PUSHJ P,FINDN1## ; Point to current line
JUMPE T1,INSLP ; Always insert at end of file
CAME T1,PGMK ; Or at end of page
CAMLE T1,HILN ; Found a match or passed over a line?
JRST INSLP ; No, insert
JRST LVINS0 ; Return to command
; Here if he quits with "Q" command in alter mode
ALVINS: MOVE T1,HILN ; Get last one inserted
MOVEM T1,CLN ; Make that current
SETOM ALTSN ; Flag that we saw an altmode
;
LVINS: SKIPE FFFLAG ; FF typed?
JRST INSFF ; Yes, go add a page mark
MOVE T1,HILN
MOVE T1,CPG
LVINS0: SKIPE ALTSN ; No <CR><LF> when no <altmode> seen
SKIPE COMFLF ; In a command file?
JRST LVINS1 ; Yes skip cr
LEVINS::OCRLF
LVINS1: SETZM ALTSN ; Clear altmode flag
TLZ FL2,INSF ; No longer doing an insert
JRST COMND##
; Here when a Form Feed is typed on input
INSFF: PUSHJ P,NOTBSC ; Illegal in BASIC mode
PUSHJ P,INSPAG ; Insert the page mark
MOVE T2,CPG ; Fetch the page number
MOVEM T2,DPG ; Set up so can re-find line later
SKIPN COMFLF ; Suppress if reading a command file
PUSHJ P,PGPRN ; And type it so he knows what happened
MOVE T1,INCR ; Current increment becomes next line
JRST ENTIN0 ; Continue the insertion on next page
INSMK: PUSHJ P,CKTRMF## ;CKECK TERMINATOR
SETZM ALTSN ;NO ESC SEEN YET
MOVE T1,[<ASCII /9999:/>!1];
MOVEM T1,HILN ;ONE PAST END OF WORLD
TLO FL,L1.MCM ;TURN ON TO FAKE MARK0
PUSHJ P,MARK0 ;INSERT PAGE-MARK
MOVE T2,TECFST ; GET /START:
MOVEM T2,LOLN ;
MOVEM T2,HILN ;
MOVE T2,CPG ;AND CURRENT PAGE
MOVEM T2,LOPG ;
MOVEM T2,HIPG ;SET UP FOR INSERT
PUSHJ P,PGPRN## ;TELL THE NEW PAGE
JRST INSGO ;GO
SUBTTL THE M COMMAND
; Insert a page mark at designated line
MARK:: PUSHJ P,NOTBSC## ; Illegal in basic mode
TLO FL,L1.MCM ;FLAG IN MARK COMMAND FOR GET1SD
PUSHJ P,GET1SD## ; Get one line/page number
PUSHJ P,MARK0 ;MARK THE PAGE
JRST COMND ;ALL DONE
MARK0: PUSHJ P,CKTRMF## ;Make sure it terminates
PUSHJ P,FINDHI## ; Get it
TLZN FL,L1.MCM ;SEE IF GET1SD SAW PAST TOP OF PAGE
PUSHJ P,FINDN## ; Go one higher
MOVE T1,CPG
CAME T1,HIPG ; Page must match
NERROR NSP ; Must match
MARK1:: ;
PUSHJ P,INSPAG## ; Insert the new page mark
AOS LSLOPG ; Now one higher
POPJ P, ;ALL DONE
SUBTTL THE REPLACE COMMAND
REPLAC::TRO FL2,RPLFLG ; We are doing a replace
PUSHJ P,GET2DL ; What do we want to replace?
CAIN C,";" ; Check temp
JRST [MOVE T1,INCR
MOVEM T1,TEMINC
JRST RPGINC]
CAIE C,"," ; He can specify increment too
JRST RPTERM ; But he didn't, look for terminator
RPGINC: PUSHJ P,SCAN## ; Get incr
TRNN FL,NUMF ; Which must be a number
JRST RPTRM1 ; Might be ,Y switch
CAMN T1,LNZERO## ; Not 0 for incr
NERROR ILC
MOVEM T1,INCR
PUSHJ P,SCAN## ; Scan past
;
RPTERM: PUSH P,LOPG ; Save start page
SKIPN T1,LOLN ; Fetch LOLN if not zero
MOVE T1,INCR ; Else use his increment
PUSH P,T1 ; Save it
;
PUSHJ P,DELT1 ; Do the delete
;
RPDONE: POP P,HILN ; Restore starting point
POP P,HIPG ; and page
TRZ FL,CNTF ; Make sure this is clear
JRST INSGO ; And do the insert
; Here if we found a switch and no number. Assume it is a ,Y switch
RPTRM1: PUSH P,LOPG ; Save start page
SKIPN T1,LOLN ; Fetch LOLN if non-zero
MOVE T1,INCR ; Else use increment
PUSH P,T1
;
PUSHJ P,DELT1A ; Do the delete
JRST RPDONE ; And go on to insert
SUBTTL THE DELETE COMMAND
; Delete a line or a number of lines
DELET:: PUSHJ P,GET2DL ; Get line range for deletion
PUSHJ P,DELT1 ; Do the deletion
JRST COMND ; and get next command
; Subroutine to delete line of text
; Called by the D and R commands
DELT1: CAIE C,"," ; Check switch
JRST DELT0
PUSHJ P,SCAN##
;
; Enter here if switch has been scanned
DELT1A: MOVS T1,ACCUM
TRNE FL,IDF
CAIE T1,(<SIXBIT /Y />)
NERROR ILC
TRO FL2,YESFLG ; Don't ask
PUSHJ P,SCAN##
DELT0: PUSHJ P,CKTRMF## ; Must terminate correctly
SETZM FDELLN ; No lines deleted yet
SETZM LDELLN
SKIPN EXPFLG ; Experts can delete anything
TRNE FL2,YESFLG ; He'll delete anything
JRST DELT3 ; Skip the check
TRNN FL,PGSN ; Second page specification given
TRNN FL,LINSN ; or no line number specified
CAIA
JRST DELT3 ; No, simple deletion
OUTSTR [ASCIZ /Massive delete OK? /]
PUSHJ P,CONFRM##
JRST COMND ; No:
CONT.
DELT3: TRZN FL,LINSN ; Line number seen?
TRO FL2,DELFPG ; Delete page that follows
TRZE FL2,RPLFLG ; Doing a replace
TRZ FL2,DELFPG ; If yes, never take PGMK that follows
PUSHJ P,FINDLO## ; Find first line in range
JUMPE T1,DELEND ; If no line to delete
MOVE T2,CPG ; Get current page
MOVEM T2,FDELPG ; Remember it as first
MOVEM T2,PGDELS ; Last one deleted also
;
DELT2: PUSHJ P,ONMOV## ; No, check for range
JRST DELEND
DELT5: TRZN FL2,PGDLF ; First line on this page
JRST DELT7
AOS PGDELS ; These are on another page
SETZM LDELLN ; Clear last line
DELT7: CAME T1,PGMK ; Is this a page mark?
JRST DELT4
SOS HIPG ; Decrement high since one is going away
SOS BGPG ; And this since now one less
SKIPN FDELLN ; First line set
MOVEM T1,FDELLN ; No, set it
TRO FL2,PGDLF ; We deleted another page
MOVE T1,LNZERO## ; Reset CLN to line zero
JRST DELT6
DELT4: AOS DELCNT ; Deleted one more line
SKIPN FDELLN ; This set yet?
MOVEM T1,FDELLN ; No remember this
MOVEM T1,LDELLN ; and this as last
DELT6: MOVEM T1,CLN ; Update this
TRO FL,LINSN ; Note that we did something
PUSHJ P,DODEL ; Delete a line
PUSHJ P,FINDN1## ; Find the next
JUMPN T1,DELT2 ; If a next line found
;
DELEND: TRNN FL,LINSN ; Did we see anything?
NERROR NLN ; No, give error
TRZE FL2,DELFPG ; Delete page mark that follows?
JUMPN T1,DELT5 ; Go do it
MOVE T1,CPG ; Yes, set current page
MOVEM T1,CPGL
PUSHJ P,ORDCHK ; Check order
SKIPN INFFLG ; Only if desired
POPJ P, ; Done--return
CONT.
; Here to print the 'lines deleted message'
;
MOVE T2,DELCNT ; Count of lines deleted
PUSHJ P,DPRNT ; Print # of lines deleted
OUTSTR [ASCIZ / line/]
SOSE T1,DELCNT ; Count - one
OUTCHR ["s"] ; type "s" if plural
OUTSTR [ASCIZ / (/]
SKIPE T1,FDELLN ; Fetch first line. Not set yet?
CAMN T1,PGMK ; or set to a page mark?
MOVE T1,[ASCIZ "/"] ; Yes, use a "/"
MOVEM T1,LINOUT ; Print it
OUTSTR LINOUT
MOVE T2,FDELPG
PUSHJ P,DPRNT ; And page #
MOVE T1,LDELLN ; Last line deleted
MOVE T2,PGDELS ; Last page of deleted range
CAMN T2,FDELPG ; Is it different than the first
SKIPLE DELCNT ; If less than 2 lines deleted
PUSHJ P,[OUTCHR [":"] ; No: print it also
SETZI T2,
OUTSTR T1
MOVE T2,PGDELS
CAMN T2,FDELPG
POPJ P,
OUTCHR ["/"]
PJRST DPRNT##]
OUTSTR [ASCIZ /) deleted
/]
POPJ P, ; Now return
SUBTTL Support Routines for Delete and Replace
; Subroutine to delete a line
DODEL:: PUSHJ P,GETLTH## ; Length of current line
PJRST DLTLIN## ; Delete that many words
; Subroutine to check for a null line range
; Returns if there is a next token or user has /EXPERT set
GET2DL: PUSHJ P,SCAN## ; Look at next
SKIPN EXPFLG ; Expert
TRNN FL,TERMF ; Null line range?
PJRST GET2D## ; Else get it and fill in defaults
NERROR ILC ; Null line range is an error
SUBTTL THE K COMMAND
; Delete a page mark
KILL:: PUSHJ P,GET2S##
TRZN FL,LINSN ; Line number is illegal
TRNN FL,TERMF ; as is junk at end of line
NERROR ILC ; Must be just /n
TRNN FL,CNTF ; Must not be /p!n
SKIPE LOLN ; No line number may be given
NERROR ILC ; Else command is considered bad
DELPG: MOVE T1,LOPG ; Get the desired page to delete
MOVEM T1,DPG ; Set it
SOJLE T1,DELER ; Do not try page 1
MOVEI SINDEX,0 ; Find line immediately after page mark
PUSHJ P,FIND## ; Get it
MOVE T2,CPG ; Check for match
CAME T2,LOPG
DELER: NERROR NSP ; No such page
PUSHJ P,FINDB## ; Go back one
CAME T1,PGMK ; Is it a page mark?
ERROR ICN ; Confused, give fatel error
PUSHJ P,DLTPAG## ; Delete that many
PUSHJ P,FINDN1## ; Load next line
SOS BGPG ; Max page is now 1 lower
MOVE T2,CPG ; Fetch current physical page
MOVEM T2,CPGL ; Call that the current logical page
MOVEM T2,LSLOPG ; Save updated page part of #
PUSHJ P,ORDCHK ; Check order
MOVEM T1,CLN ; Setup the current line
MOVEM T1,LSLOLN ; Setup the line part of #
SOS T1,HIPG ; Decrement limit page
CAML T1,LOPG ; Have we done all specified pages?
JRST DELPG ; No, go get the next one
JRST COMND ; Get next command
; Subroutine to check line order for the current line
; Call with
; PUSHJ P,ORDCHK
; <always returns here>
ORDCHK: PUSHJ P,FINDB## ; Back up
JUMPE T1,CPOPJ## ; If hit front of file
PJRST FINDN## ; Check next
SUBTTL THE RENUMBER COMMAND
; Renumber selected lines
NAFLG==PDFL1 ; On if NA command
NPFLG==PDFL2 ; On if NP command
CLNSNF==PDFL3 ; On if current line was renumbered
NFFLG==PDFL4
ORDF==PDFL5 ; Order error has been detected
NUMBER::PUSHJ P,NOTBSC## ; Illegal in basic mode
PUSHJ P,GNCH## ; Peek at next input character
MOVEM C,SAVC ; Save it, may need it later
TRZ C,40 ; In case it was lower case
CAIN C,"A" ; A switch
TRO FL2,NAFLG ; Yes, so indicate
CAIN C,"P" ; P switch
TRO FL2,NPFLG ; So indicate
CAIN C,"F" ; F switch (Full File)
TRO FL2,NFFLG ; F switch
TRNE FL2,NFFLG!NAFLG!NPFLG ; Find a switch?
SETZM SAVC ; Yes, character already used
SKIPN NEWCMD ;IN COMPATIBILITY MODE?
TRNE FL2,NFFLG!NAFLG!NPFLG;YES--NOT FIND A SWITCH?
SKIPA ;NO
TRO FL2,NFFLG ;YES--MAKE NF FOR COMPATIBILITY
PUSHJ P,FINDCL## ; Find current logical line
TRNN FL2,NAFLG ; Never move if NA type renumber
CAMN SINDEX,LNZERO## ; Pointing to the top?
JRST NUMLNB ; Yes, leave CLN alone
CAME T1,PGMK ; Is it a page mark?
JRST NUMLN1 ; No
PUSHJ P,FINDB ; Find previous
CAIE T1,0 ; Beginning of file
CAMN T1,PGMK ; or page mark?
MOVE T1,LNZERO## ; Null page
NUMLN1: MOVEM T1,CLN ; Setup current line to a real line
NUMLNB: MOVE T1,INCR ; If no incr is seen
MOVEM T1,REINC ; We will use the current increment
MOVEM T1,INCST ; Provisional starting increment
PUSHJ P,SCAN## ; Get the renumber increment
TRNN FL,NUMF ; Was it a number
JRST NUMBB ; No number, check for comma
MOVEM T1,REINC ; The increment to use
MOVEM T1,INCST ; Line to start with
PUSHJ P,SCAN## ; Scan past number
NUMBB: TRNN FL2,NAFLG ; Special A-type renumber?
JRST NUMBC ; No, continue
PUSHJ P,FINDN1## ; Point to current line
CAMN T1,SINDEX ; Same as current logical?
PUSHJ P,FINDN## ; Yes, find next
CAME T1,PGMK## ; Page mark?
CAIN T1,0 ; Or end of file?
NERROR NLN ; No lines to renumber
MOVE T2,CPG ; T1 is first line, current page to T2
DMOVEM T1,LOLN ; Save as start of range
MOVE T1,[<ASCII/99999/>!1] ; A very high line
DMOVEM T1,HILN ; Save as end of range
MOVE T1,CLN ; Current line number
MOVE T2,REINC ; Chosen increment
PUSHJ P,ASCIAD## ; Add them
MOVEM T1,INCST ; Number to start with
MOVE T1,INCR ; Increment
MOVEM T1,REINC ; Set it up
TRZ FL,CNTF
CAIE C,"," ; Did he give a second increment
JRST NUMBL ; Guess not
PUSHJ P,SCAN## ; Get it
TRNN FL,NUMF ; Must be a number
NERROR ILC
MOVEM T1,REINC ; Use his value as increment
JRST NUMBLS ; Join processing
NUMBC: CAIN C,"," ; And check for comma
JRST NUMB1 ; Get a range
MOVEI T1,0 ; First line
MOVE T2,CPGL ; No range, do this page only unless
TRNE FL2,NPFLG!NFFLG ; number across pages which
MOVEI T2,1 ; changes default range to whole file.
DMOVEM T1,LOLN ; Setup low page limit
MOVE T1,[<ASCII/99999/>!1]
TRNE FL2,NPFLG!NFFLG ; NF or NP type re-number?
MOVSI T2,1 ; Make for very large page
DMOVEM T1,HILN
TRZ FL,CNTF ; Make sure this is off
JRST NUMBL ; and check for terminator
NUMB1: TRNE FL2,NFFLG ; Whole File?
JRST [MOVEI T1,0 ; Yes, set up the range
MOVEI T2,1
DMOVEM T1,LOLN
MOVE T1,[<ASCII/99999/>!1]
MOVSI T2,1
DMOVEM T1,HILN
TRZ FL,CNTF
JRST .+2]
PUSHJ P,GET2SD## ; No, get a range
SKIPE T1,LOLN ; First number in range
MOVEM T1,INCST ; Start reseqence with first
CAIE C,"," ; See if there is a fourth argument
JRST NUMBL ; No
PUSHJ P,SCAN## ; Yes, get it
TRNN FL,NUMF ; Is it a number?
NERROR ILC ; If not it's an error
MOVEM T1,INCST ; Use as starting number
NUMBLS: PUSHJ P,SCAN## ; Scan past it
NUMBL: PUSHJ P,CKTRMF ; Make sure it terminates correctly
TRNN FL2,NAFLG ; NA mode?
JRST NUMBL1 ; No
MOVE T1,REINC ; Numbering increment
MOVE T2,INCST ; Starting
PUSHJ P,ASCIAD ; Make room for one more line
MOVEM T1,INCST ; Set it up
NUMBL1: MOVE T1,REINC ; Get start increment
MOVE T2,INCST ; First number to use
CAME T2,LNZERO## ; Is either one zero?
CAMN T1,LNZERO## ; Make sure non-zero
NERROR ILC ; Yes, ask him to try again
TLO FL2,NORENT ; Don't allow wild reentering
PUSHJ P,FINDLO## ; Get first line of range
TRZ FL,LINSN ; Set to none seen and no order error
PUSHJ P,FINDB ; Back up and see how order looks
JUMPE T1,NUMB5 ; Start of file it must be ok
CAME T1,PGMK ; Also if a page mark
CAMGE T1,INCST ; Or if in correct order
SKIPA
TRO FL2,ORDF ; Wrong set flag
NUMB5: PUSHJ P,FIND## ; Get the correct line back
NUMB2: PUSHJ P,ONMOV## ; Check range
JRST NUMB3
AOS CHGCNT ; We changed the file
CAMN T1,PGMK ; Page mark?
JRST NUMB4 ; Special treatment
MOVE T1,INCST ; Get starting number
MOVE T2,REINC ; And increment
TRON FL,LINSN ; Was a line seen?
JRST FSTLIN ; No, first one is special
PUSHJ P,ASCIAD ; Skip this the ffrst time
CAML T1,REINC ; Have we wraped
JRST SETINC ; No, set increment
RERROR WAR ; Tell him he lost
MOVE T2,CPG ; Print the page
PUSHJ P,PGPRN##
JRST SETINC ; And set increment
FSTLIN: MOVEM T1,LSLOLN ; Save new name for LOLN
SETINC: MOVEM T1,INCST ; Save for next line
MOVE T2,0(PNTR) ; Old name for current line
CAME T2,CURINS ; Could it be the current insertion?
JRST NOTINS ; No, it doesn't match
MOVE T2,CPG ; Page must match also
CAMN T2,CURINP ; Does it?
MOVEM T1,CURINS ; Save new name for CURINS
NOTINS: MOVE T2,CPG ; Current page
TRNN FL2,CLNSNF ; Have we seen current logical line?
CAME T2,CPGL ; or on the wrong page?
JRST FSTLN1 ; Yes, no update to do
MOVE T2,(PNTR) ; Get line that we're pointing to
CAME T2,CLN ; Is this the logically current line?
JRST FSTLN1 ; No, nothing to do
TRO FL2,CLNSNF ; We've seen it
MOVEM T1,CLN ; Remember the new number
FSTLN1: MOVEM T1,(PNTR) ; Put it in
PUSHJ P,FINDN ; Get next
JRST NUMB2 ; And go range check
NUMB3: TRNN FL,LINSN ; Done, was there something there?
NERROR NLN ; No, null range error
DMOVE T2,LOLN ; Get bottom of the range
IFE KIONLY,< ; Ka-10?
TRNE FL2,CLNSNF!NAFLG; Current line was seen?
JRST .+3 ; Yes, don't change CLN/CPGL
>
IFN KIONLY,< ; KI/KL -10's have DMOVEM instruction
TRNN FL2,CLNSNF!NAFLG
>
DMOVEM T2,CLN ; Save current line
TRNE FL2,ORDF ; Was there an order error?
NERROR ORDER ; Yes, flag it
JUMPE T1,COMND ; Check to see if losage now
CAME T1,PGMK
CAMLE T1,INCST
JRST COMND
NERROR ORDER
NUMB4: ; Page mark
TRO FL,LINSN ; We saw one
TRNN FL2,NPFLG ; If continuous numbering
SETZM INCST ; Start over on numbers
PUSHJ P,FINDN ; Now get next line
JRST NUMB2
END