1
0
mirror of https://github.com/PDP-10/its.git synced 2026-02-28 17:29:10 +00:00
Files
PDP-10.its/src/draw/move.310
2018-05-05 19:19:09 +02:00

823 lines
16 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
;<DRAW>MOVE.FAI.43, 18-NOV-75 11:42:05, EDIT BY HELLIWELL
VERSION(MOVE,2)
;START MOVING
PBMOV: TRZA TFLG
PGRAB: TRO TFLG
TRNE INMOV
JRST PERRET
TRZ MD,<LMOVE!>TMOVE
MOVE T,MODE
HRRZ T,STRTMV(T)
JRST (T)
TXTMOV: TRNE INMOV
JRST PERRET
MD,< TRZ LMOVE >
TRO TMOVE
MOVE T,MODE
HLRZ T,STRTMV(T)
JRST (T)
STRTMV: PERRET,,SMOVE ;SET MODE
MD,< BMOVET,,BMOVE ;BODY MODE >
MPC,< PERRET,,BMOVE ;BODY MODE >
PMOVET,,PMOVE ;POINT MODE
PERRET,,PERRET ;LINE MODE
PMOVET,,PMOVE ;TEXT MODE
PERRET,,PERRET ;ALTER MODE
PERRET,,PERRET ;MACRO ALTER MODE
PERRET,,PERRET ;SPECIAL POINTER MODE
MD,< ETMOVT,,ETMOVE ;BODY TEXT MODE
PERRET,,PERRET ;BODY TEXT ALTER MODE
EMOVET,,EDINS2 ;EDIT MODE (MAKE IT SAME AS <BETA>I)
PERRET,,PERRET ;EDIT INSERT MODE
ETMOVT,,ETMOVE ;EDIT TEXT MODE
PERRET,,EPMOVE ;EDIT PIN MODE
PERRET,,PERRET ;EDIT GET MODE
PERRET,,PERRET ;EDIT ALTER MODE
>;MD
REPEAT NUMODES-(STRTMV-.),<PERRET,,PERRET>
DOMOVE: TRZ TFLG
DOMOVG: MOVEM TT,MDISP
TRO INMOV
TRNN TFLG ;DON'T MOVE CURSOR IN GRAB MODE
PUSHJ P,SETPOS
MOVEI T,BIGPG
JRST HYDPOG
;MOVE POINT
MPC,<
DOPMOV: MOVE A,CLOSES ;CALLED FROM $B TO MOVE MIDPOINT
TRZ MD,<LMOVE!>TMOVE!TFLG!INMOV
JRST PMOVE1
>;MPC
PMOVE: PUSHJ P,GETCLS
JRST PERRET
PMOVE1: FETCH(T,A,PXY)
FETCHL(TT,A,PBIT)
TLNE TT,MPC,<CPIN!>ISPIN
JRST [ TRNN TFLG ;IF NOT GRAB MODE,
JRST SETPOS ;JUST MOVE CURSOR
POPJ P,] ;ELSE DO NOTHING
JSP TT,DOMOVG
;MOVE SUBR
MOVE A,CLOSES ;GET POINT POINTER
MOVE T,CURSE ;GET CURSOR POSITION
CAMN T,ADDR(A,PXY)
POPJ P,
ROUTE,<MPC,<TLZ M,%ROUTE>>;MAKE HIM ROUTE AGAIN
MPC,< STORE(T,A,PXY)
FETCH(B,A,PFEED) ;GET FEED THROUGH POINTER(IF ANY)
FETCHL(TT,A,PBIT)
TLNE TT,FEEDTH
STORE(T,B,PXY) ;STORE ALSO IN FEEDTHROUGH
TRO MCHG
POPJ P,
>;MPC
MD,< TRO MCHG
;MOVE POINT AND FRIENDS
;A = POINT
;T = X,Y
PMOVIT: FETCHL(TT,A,PBIT)
TLNE TT,ISPIN ;BODY PIN?
POPJ P, ;YES, DOESN'T MOVE
PMOVRL: MOVE TT,T ;HOLD X,Y
XOR T,1(A) ;COMPARE WITH OLD X,Y
JUMPE T,CPOPJ ;LEAVE IF NO CHANGE AT ALL
MOVEM TT,1(A) ;STORE NEW X,Y
TRNE T,-1 ;DID Y CHANGE?
PUSHJ P,PMOVY ;YES
TLNE T,-1 ;DID X CHANGE?
PUSHJ P,PMOVX ;YES
;Here we check to see if a segment leaving this point needs
; to change sense (HORZ to VERT or VERT to HORZ).
MOVEI F,3 ;4 CASES (F IS TABLE INDEX)
PUSH P,A ;SAVE OUR POINT
HVFLP1: XCT SEGTAB(F) ;GET THE POINTER FOR SEGMENT WE WANT TO CHECK
JUMPE T,HVFLP2 ;SKIP IT IF NONE
FETCHL(TT,T,PBIT)
TLNN TT,ISPIN ;PINS ONLY
JRST HVFLP2
FETCH(TT,T,PXY)
MOVE TTT,(P)
FETCH(TTT,TTT,PXY) ;GET ORIGINAL POINT'S X,Y
ADJUST(SUB,TT,TTT) ;GET DELTAS
PUSH P,TT ;SAVE THEM
HLRE TTT,TT ;SEPERATE X AND Y
HRRE TT,TT
MOVM TTT,TTT ;GET MAGNITUDES ONLY
MOVM TT,TT
XCT HVMAG(F) ;SEE IF PAST DIAGONAL
JRST HVFLP3 ;NO
POP P,TT ;GET BACK SIGNED DELTAS
TRNE F,1 ;DO WE WANT X OR Y DELTA
MOVS TT,TT ;WE WANT Y DELTA
SETCM TTT,F ;COMPLEMENT LOW ORDER BIT (CHANGE HORZ TO VERT)
ANDI TTT,1 ;ASSUME POSITIVE
JUMPGE TT,.+2
TRO TTT,2 ;WELL IT WAS NEGATIVE
PUSH P,T ;SAVE THIS POINT ALSO
XCT HVNEWT(TTT) ;GET POINTER WE WANT TO USE
JUMPN TT,HVFLP3 ;SKIP IF ALREADY IN USE
XCT HVNEWA(TTT) ;CHECK BOTH ENDS
JUMPN TT,HVFLP3 ;MUST BOTH BE FREE
MOVE TT,-1(P) ;GET ORIGINAL POINT
XCT HVSTOT(TTT) ;STORE IT IN NEW POSITION
MOVE TT,(P) ;GET OTHER POINT
XCT HVSTOA(TTT) ;STORE IT ALSO
XCT HVCLRA(F) ;CLEAR OLD POINTER
XCT HVCLRT(F) ;AT BOTH ENDS
HVFLP3: POP P,(P) ;FIX STACK
HVFLP2: SOJGE F,HVFLP1
POP P,A ;FIX STACK
POPJ P,
SEGTAB: FETCH(T,A,PNU)
FETCH(T,A,PNR)
FETCH(T,A,PND)
FETCH(T,A,PNL)
HVMAG: CAMG TTT,TT
CAMG TT,TTT
CAMG TTT,TT
CAMG TT,TTT
HVNEWT: FETCH(TT,T,PND)
FETCH(TT,T,PNL)
FETCH(TT,T,PNU)
FETCH(TT,T,PNR)
HVNEWA: FETCH(TT,A,PNU)
FETCH(TT,A,PNR)
FETCH(TT,A,PND)
FETCH(TT,A,PNL)
HVSTOT: STORE(TT,T,PND)
STORE(TT,T,PNL)
STORE(TT,T,PNU)
STORE(TT,T,PNR)
HVSTOA: STORE(TT,A,PNU)
STORE(TT,A,PNR)
STORE(TT,A,PND)
STORE(TT,A,PNL)
HVCLRT: CLEAR(T,PND)
CLEAR(T,PNL)
CLEAR(T,PNU)
CLEAR(T,PNR)
HVCLRA: CLEAR(A,PNU)
CLEAR(A,PNR)
CLEAR(A,PND)
CLEAR(A,PNL)
;PMOVX, PMOVY
;MOVE POINT, AND CHECK FOR LINE FLIPPING OVER
;Written from viewpoint of moving in Y
;A = POINT MOVED
;TT = NEW X,Y
DEFINE FOO $ (HINST,LOCHW,PND,PNU,PNL,PNR)
< TRO NEEDCL ;MOVING, MAY NEED NEW CLOSEST
PUSH P,A
PUSH P,T
PUSH P,TT
FETCH(A,A,PNR) ;MOVE RIGHT POINT UP/DOWN
MOVE T,TT ;GET NEW Y
HINST T,1(A) ;OLD X,,NEW Y
JUMPE A,.+2
PUSHJ P,PMOVIT ;MOVE THE POINT & FRIENDS
MOVE A,-2(P)
FETCH(A,A,PNL) ;MOVE LEFT POINT UP/DOWN
MOVE T,(P) ;GET NEW Y
HINST T,1(A) ;OLD X,,NEW Y
JUMPE A,.+2
PUSHJ P,PMOVIT ;MOVE THE POINT & FRIENDS
;Now check for line flipping over
MOV$LOCHW$0:
MOVE A,-2(P)
H$LOCHW$RE T,1(A) ;MY Y
FETCH(F,A,PNU) ;THE POINT ABOVE
JUMPE F,MOV$LOCHW$1
H$LOCHW$RE TT,1(F) ;HIS Y
CAMG T,TT ;ARE WE NOW ABOVE HIM?
JRST MOV$LOCHW$1
FETCH(TT,A,PND) ;TT = THE POINT BELOW US
FETCH(TTT,F,PNU) ;TTT = THE POINT ABOVE US
STORE(A,F,PNU) ;WE ARE ABOVE HIM
STORE(F,A,PND)
STORE(TT,F,PND) ;HE GETS THE BELOW POINT
SKIPE TT
STORE(F,TT,PNU) ;FIXUP REVERSE POINTER
STORE(TTT,A,PNU) ;WE GET ABOVE POINT
SKIPE TTT
STORE(A,TTT,PND)
JRST MOV$LOCHW$0 ;SEE IF WE'RE ABOVE THE UPPERMOST POINT TOO
;Did we move below the point below us
MOV$LOCHW$1:
FETCH(F,A,PND)
JUMPE F,MOV$LOCHW$2
H$LOCHW$RE TT,1(F) ;HIS Y
CAML T,TT ;ARE WE BELOW HIM?
JRST MOV$LOCHW$2
FETCH(TT,A,PNU) ;TT = THE POINT ABOVE US
FETCH(TTT,F,PND) ;TTT = THE POINT BELOW US
STORE(A,F,PND) ;WE ARE BELOW HIM
STORE(F,A,PNU)
STORE(TT,F,PNU) ;HE GETS THE ABOVE POINT
SKIPE TT
STORE(F,TT,PND) ;FIXUP REVERSE POINTER
STORE(TTT,A,PND) ;WE GET BELOW POINT
SKIPE TTT
STORE(A,TTT,PNU)
JRST MOV$LOCHW$0 ;SEE IF WE'RE BELOW THE LOWERMOST POINT TOO
MOV$LOCHW$2:
POP P,TT
POP P,T
POP P,A
POPJ P,
>
PMOVY: FOO (HLL,R,PND,PNU,PNL,PNR)
PMOVX: FOO (HRR,L,PNL,PNR,PND,PNU)
>;MD
;MOVE TEXT OFFSET, CPIN OFFSET
MD,<
PMOVEL: TRNE INMOV
JRST PERRET
TRO LMOVE ;MOVE CPIN OFFSET
TRZ TMOVE
>;MD
PMOVET: PUSHJ P,GETCLS
JRST PERRET
FETCH(T,A,PXY)
MD,< TRNN LMOVE
JRST PMOVT1
FETCHL(TT,A,PBIT)
TLNN TT,CPIN
JRST PERRET
TLZ TT,FIXCON ;TURN OFF FIXCON WHEN HE MOVES IT
STOREL(TT,A,PBIT)
FETCH(A,A,PLOC)
JRST PMOVL1
PMOVT1: CLRBIT(FIXTXT!FIXRHT,TT,A,PBIT) ;TURN THESE OFF WHEN HE MOVES TEXT OFFSET
FETCH(A,A,PTXT)
JUMPE A,PERRET
PMOVL1: PUSHJ P,TOFSET
>;MD
MPC,< FETCH(A,A,PTXT)
JUMPE A,PERRET
ADJUST(ADD,T,<1(A)>)
>;MPC
JSP TT,DOMOVE
MOVE A,CLOSES
FETCH(TT,A,PXY)
MD,< TRNE LMOVE
JRST [ FETCH(A,A,PLOC) ;USE CPIN POINTER IF LMOVE
JRST TOFMOV]
FETCH(A,A,PTXT)
PUSHJ P,TOFMOV
CAMN T,1(A)
POPJ P,
MOVE A,CLOSES
JRST OFFCON ;FIX CON (NOT IF NO MOVE)
>;MD
MPC,< FETCH(A,A,PTXT) >
TOFMOV: MOVE T,CURSE
TLO T,1
SUB T,TT
TLZ T,1
MD,< HLRE TT,T
HRRE T,T
SCALE T
SCALE TT
HRL T,TT
>;MD
CAMN T,1(A)
POPJ P,
EXCH T,1(A)
TRO MCHG
POPJ P,
MD,<
TOFSET: HLRE TT,1(A) ;CONSTANT OFFSET
UNSCAL TT
MOVE TTT,TT
HRRE TT,1(A)
UNSCAL TT
HRL TT,TTT ;UNSCALED OFFSET
TLZ TT,1
ADD T,TT ;CURSOR POS
TDZ T,[1,,1]
POPJ P,
>;MD
;MOVE BODY AND BODY LOC
BMOVE: PUSHJ P,GETCLS
JRST PERRET
BMOVEP: FETCH(T,A,BXY)
JSP TT,DOMOVG
;MOVE SUBR
MOVE A,CLOSES ;GET POINTER TO CLOSEST BODY
MOVE T,CURSE ;GET CURRENT CURSOR POSITION
CAMN T,1(A)
POPJ P,
ROUTE,<MPC,<TLZ M,%ROUTE>>;MAKE HIM ROUTE AGAIN
MOVEM T,1(A) ;SET BODY POS
TRO MCHG
JRST BODFIX ;AND FIX PINS
MD,<
BMOVEL: TRNN INMOV
PUSHJ P,GETCLS
JRST PERRET
FETCH(T,A,BXY)
CLRBIT(FIXLOC,TTT,A,BBIT) ;TURN OFF AUTO POSITION BIT
FETCH(TT,A,BLOC)
JUMPE TT,PERRET
ADJUST(ADD,T,<ADDR(A,BLXY)>)
PUSH P,T
MOVE T,A
PUSHJ P,OFFBLO ;IN CASE CHANGED FIXLOC
POP P,T
TLNE M,BLOCS
TRO MCHG ;REDISPLAY IN CASE WE TURNED THIS LOC ON
TRO LMOVE
TRZ TMOVE
JSP TT,DOMOVE
;MOVE SUBR
MOVE A,CLOSES
MOVE T,CURSE
ADJUST(SUB,T,<ADDR(A,BXY)>) ;CALC OFFSET FROM BODY
CAMN T,ADDR(A,BLXY)
POPJ P,
STORE(T,A,BLXY)
TRO MCHG
POPJ P,
BMOVET: TRNN INMOV
PUSHJ P,GETCLS
JRST PERRET
FETCH(T,A,BXY)
CLRBIT(FIXBLO,TT,A,BBIT)
FETCH(TT,A,BLOC)
JUMPE TT,PERRET
ADJUST(ADD,T,<ADDR(A,BLXY)>)
TLNE M,BLOCS
TRO MCHG
TRZ LMOVE
TRO TMOVE
MOVEI A,-1+ADDR(A,BLO)
PUSHJ P,TOFSET
JSP TT,DOMOVE
;MOVE SUBR
MOVE A,CLOSES
FETCH(TT,A,BXY)
ADJUST(ADD,TT,<ADDR(A,BLXY)>)
MOVEI A,-1+ADDR(A,BLO)
JRST TOFMOV
>;MD
;EDIT MOVES
MD,<
EPMOVE: PUSHJ P,GETCLS
JRST PERRET
FETCH(T,A,TPXY)
JSP TT,DOMOVG
;MOVE SUBR
MOVE A,CLOSES ;GET POINTER TO CLOSEST PIN
MOVE T,CURSE ;GET CURRENT CURSOR POSITION
CAMN T,ADDR(A,TPXY)
POPJ P,
STORE(T,A,TPXY)
TRO MCHG
SKIPN A,PONPNT
POPJ P,
EDPFIX: FETCHL (T,A,PBIT)
TLNN T,ISPIN
JRST NOFIX
FETCH(B,A,BPLOC)
CAME B,CLOSES ;IS THIS ONE OF OUR PINS
JRST NOFIX ;NO
FETCH(E,A,BBODY)
FETCH(F,E,BORI)
FETCH(T,B,TPXY)
PUSHJ P,ORIENT ;ORIENT IT
ADJUST(ADD,T,<ADDR(E,BXY)>)
PUSHJ P,PMOVRL ;AND MOVE IT
NOFIX: FETCH(A,A,PNXT)
JUMPN A,EDPFIX ;NEXT
POPJ P,
ETMOVE: PUSHJ P,GETCLS
JRST PERRET
FETCH(T,A,TXXY)
MOVE TT,MODE
CAIE TT,BTXTM
JRST NBTXT0
MOVE TT,BTBODY
PUSH P,F
FETCH(F,TT,BORI)
PUSHJ P,ORIENT
POP P,F
ADJUST(ADD,T,<ADDR(TT,BXY)>)
NBTXT0: JSP TT,DOMOVG
;MOVE SUBR
MOVE A,CLOSES ;GET POINTER TO CLOSEST TEXT
MOVE T,CURSE ;GET CURSOR POSITION
MOVE TT,MODE
CAIE TT,BTXTM ;BODY TEXT MODE?
JRST NBTXT1
MOVE TT,BTBODY
ADJUST(SUB,T,<ADDR(TT,BXY)>)
PUSH P,F
FETCH(F,TT,BORI)
MOVE F,UNROT(F)
PUSHJ P,ORIENT
POP P,F
NBTXT1: FETCH(TT,A,TXXY)
TDZ TT,[1,,1]
TDZ T,[1,,1]
CAMN T,TT
POPJ P,
XOR TT,ADDR(A,TXXY) ;GET STATE OF AUTO OFFSET BIT AND MARK BIT
IOR T,TT ;AND MOVE TO NEW X,Y
STORE(T,A,TXXY)
TRO MCHG
POPJ P,
ETMOVT: PUSHJ P,GETCLS
JRST PERRET
FETCH(T,A,TXXY)
TRZ T,1
STORE(T,A,TXXY) ;CLEAR AUTO OFFSET BIT
TLZ T,1 ;AND MARK BIT
MOVE TT,MODE
CAIE TT,BTXTM
JRST NBTXT2
MOVE TT,BTBODY
PUSH P,F
FETCH(F,TT,BORI)
PUSHJ P,ORIENT
POP P,F
ADJUST(ADD,T,<ADDR(TT,BXY)>)
NBTXT2: MOVEI A,-1+ADDR(A,TXOFF)
PUSHJ P,TOFSET
JSP TT,DOMOVE
;MOVE SUBR
MOVE A,CLOSES
FETCH(TT,A,TXXY)
TDZ TT,[1,,1]
MOVEI A,-1+ADDR(A,TXOFF)
MOVE T,MODE
CAIE T,BTXTM
JRST TOFMOV
MOVE TTT,BTBODY
MOVE T,TT
PUSH P,F
FETCH(F,TTT,BORI)
PUSHJ P,ORIENT
POP P,F
ADJUST(ADD,T,<ADDR(TTT,BXY)>)
MOVE TT,T
JRST TOFMOV
EMOVEL: TRNE INMOV
JRST PERRET
MOVE A,CURBOD
FETCH(T,A,TXY) ;DEFAULT OFFSET
TRO LMOVE
TRZ TMOVE
;MOVE SUBR
JSP TT,DOMOVE
MOVE A,CURBOD
MOVE T,CURSE
CAMN T,ADDR(A,TXY)
POPJ P,
STORE(T,A,TXY) ;NEW DEF OFFSET
TRO MCHG
JRST UPLOFF ;UPDATE OFFSET FOR ALL INSTANCES WITH FIXLOC ON
EMOVET: TRNE INMOV
JRST PERRET
MOVE A,CURBOD
FETCH(TT,A,TYP3) ;ANY CHAR OFFSET?
JUMPN A,EMOVT1
MOVEI TT,-1+ADDR(A,TOXY)
STORE(TT,A,TYP3) ;SETUP DUMMY POINTER (USED AS FLAG)
EMOVT1: FETCH(T,A,TXY)
MOVEI A,-1+ADDR(A,TOXY)
PUSHJ P,TOFSET
JSP TT,DOMOVE
;MOVE SUBR
MOVE A,CURBOD
FETCH(TT,A,TXY)
MOVEI A,-1+ADDR(A,TOXY)
PUSHJ P,TOFMOV
CAMN T,1(A)
POPJ P,
JRST UPLOFF
>;MD
;MOVE SET
DOSMOV: MOVE A,CLOSES
TRZ MD,<LMOVE!>TMOVE!TFLG!INMOV
JRST SMOVE1
SMOVE: TRNN STBOX ;ARE WE MOVING ALREADY OR DRAWING A BOX
PUSHJ P,GETCLS ;CURRENT SET
JRST PERRET ;NONE
SMOVE1: MOVE T,1(A) ;LOC OF CENTER
JSP TT,DOMOVG
;MOVE SUBR
MOVE A,CLOSES ;CURRENT SET
ROUTE,<MPC,<TLZ M,%ROUTE>> ;MAKE HIM ROUTE AGAIN
MOVE T,CURSE ;CURRENT CURSOR POSITION
ADJUST(SUB,T,<1(A)>) ;GET DIFFERENCE
JUMPE T,CPOPJ ;RETURN IF HE DIDN'T MOVE
MOVE TT,CURSE
MOVEM TT,1(A) ;NEW SET LOC.
HLRZ A,(A) ;POINT TO FIRSTSET MEMBERS
JUMPE A,CPOPJ
TRO MCHG ;PIC WILL CHANGE
MMSET1: HRRZ B,1(A) ;POINT
JUMPE B,NOPNTM ;NO POINT HERE
MOVE TT,T
ADJUST(ADD,TT,<1(B)>) ;NEW LOC
MOVEM TT,1(B) ;SAVE
NOPNTM: HLRZ B,1(A) ;BODY
JUMPE B,NOBODM ;NO BODY HERE
MOVE TT,T
ADJUST(ADD,TT,<1(B)>) ;NEW LOC
MOVEM TT,1(B) ;SAVE
PUSH P,A
MOVE A,B
PUSH P,T
PUSHJ P,BODFIX
POP P,T
POP P,A
NOBODM: HRRZ A,(A) ;NEXT MEMBERS
JUMPN A,MMSET1
MPC,< MOVE A,CLOSES ;FIX FEED THROUGHS
JRST FEDFIX
>;MPC
MD,< MOVE G,CLOSES
HLRZ G,(G)
FIXPNT: HRRZ A,1(G) ;GET A POINT POINTER
JUMPE A,FXNOPT ;NO POINT HERE
MOVE TT,1(A) ;X,Y
PUSHJ P,PMOVY ;MOVE VERTICAL ONES
PUSHJ P,PMOVX ;MOVE HORIZONTAL ONES
FXNOPT: HLRZ A,1(G) ;BODY IN SET
JUMPE A,FXNPNS ;NO BODY
JRST FIXPN1
FIXPIN: PUSH P,A
MOVE TT,1(A)
PUSHJ P,PMOVX
PUSHJ P,PMOVY
POP P,A
FIXPN1: FETCH(A,A,BPLNK)
JUMPN A,FIXPIN
FXNPNS: HRRZ G,(G) ;NEXT SET MEMBERS
JUMPN G,FIXPNT ;AND LOOP
POPJ P,
>;MD
;MICRO MOVEMENT COMMANDS
MD,<
LOCTM: MOVEI T,1
LSH T,@MODE
TDNN T,[1TXTM!1PNTM!1EDTTM!1BTXTM]
JRST PERRET
TDNN T,[1EDTTM!1BTXTM]
JRST LOCTM1
PUSHJ P,GETCLS
JRST PERRET
MOVEI T,1
ANDCAM T,ADDR(A,TXXY)
MOVEI B,-1+ADDR(A,TXOFF)
TRO TMOVE ;MOVE T OFFSET
JRST LOCMTY
LOCTM1: PUSHJ P,GETCLS
JRST PERRET
CLRBIT(FIXTXT!FIXRHT,TTT,A,PBIT)
FETCH(B,A,PLOC)
JUMPE B,PERRET
TRO TMOVE
JRST LOCMTY
BLCLM: PUSHJ P,GETCLS
JRST PERRET
FETCH(B,A,BLOC)
JUMPE B,PERRET
CLRBIT(FIXBLO,T,A,BBIT)
MOVEI B,-1+ADDR(A,BLO)
JRST LOCMTY
ELCLM: MOVE A,CURBOD
FETCH(B,A,TYP3)
TRZ TMOVE
JUMPN B,LOCMTY
MOVEI B,-1+ADDR(A,TOXY)
STORE(B,A,TYP3)
JRST LOCMTY
LOCLM: MOVEI T,1 ;MICRO-MOVE TEXT
LSH T,@MODE
TDNE T,[1EDTM]
JRST ELCLM
TDNE T,[1BODM]
JRST BLCLM
TDNN T,[1TXTM!1PNTM]
JRST PERRET
PUSHJ P,GETCLS
JRST PERRET
FETCHL(TTT,A,PBIT)
TLNN TTT,CPIN
JRST PERRET
TLZ TTT,FIXCON
STOREL(TTT,A,PBIT)
FETCH(B,A,PLOC)
TRZ TMOVE
;MICRO MOVE TEXT OFFSET
;B = POINTER TO OFFSET BLOCK (LIKE TEXCOF)
LOCMTY: TRZ INLIN
TLNN M,DSKACT!MACACT
OUTSTR[ASCIZ/USE CURSOR MOVE COMMANDS TO MOVE OFFSET.
/]
TRO INMOV ;TURN ON MOVING SO BIG LETTERS GO AWAY
LOCM: PUSHJ P,GETCHR
LDB D,[POINT 2,C,28]
ANDI C,177
MOVSI TTT,-MICLEN
LOCM1: CAME C,MICCHR(TTT)
AOBJN TTT,.-1
SETZB T,TT
XCT MICTAB(TTT)
ASH T,(D) ;SHIFT BY BITS BEING HELD DOWN
ASH TT,(D)
HRRE TTT,1(B)
ADD TT,TTT
HLRE TTT,1(B)
ADD T,TTT
HRL TT,T
CAMN TT,1(B)
JRST LOCM
MOVEM TT,1(B) ;STO Y
TRO MCHG ;CHANGES PIC
JRST LOCM
LOCMDN: TRZ INMOV ;DONE, TURN OFF MOVING
POPJ P, ;AND LEAVE
NOSKEY,<
MICCHR: ")" ;RIGHT SMALL
"(" ;LEFT SMALL
"/" ;UP SMALL
"\" ;DOWN SMALL
"]" ;RIGHT BIG
"[" ;LEFT BIG
"" ;UP BIG
"" ;DOWN BIG
12 ;NOOP
ALTMOD ;LEAVE
40 ;LEAVE
MICLEN__.-MICCHR
>;NOSKEY
SKEY,<
MICCHR: "9" ;RS
"8" ;LS
"6" ;US
"7" ;DS
")" ;RB
"(" ;LB
"&" ;UB
"'" ;DB
12 ;NOOP
ALTMOD ;LEAVE
40 ;LEAVE
MICLEN__.-MICCHR
>;SKEY
MICTAB: MOVEI T,1 ;RS
MOVNI T,1 ;LS
MOVEI TT,1 ;US
MOVNI TT,1 ;DS
MOVEI T,20 ;RB
MOVNI T,20 ;LB
MOVEI TT,20 ;UB
MOVNI TT,20 ;DB
JRST LOCM ;NOOP
JRST LOCMDN ;LEAVE
JRST LOCMDN ;LEAVE
JRST MICERR ;UNKNOWN COMMAND
MICERR: PUSHJ P,PERRET
JRST LOCM
>;MD
;MOVE ALONG LINES
LINUP: MOVEI TTT,2
JRST DOMLIN
LINDWN: MOVEI TTT,3
JRST DOMLIN
LINRT: TDZA TTT,TTT
LINLFT: MOVEI TTT,1
DOMLIN: TRNE INMOV
JRST [ SKIPN A,CLOSES
JRST PERRET
JRST LINMOV]
PUSHJ P,GETCLS
JRST PERRET
LINMOV:
MD,< XCT PERTAB(TTT)
JUMPN H,LINMV4 ;PERFECT MATCH?
XCT LASTAB(TTT)
JUMPE H,PERRET ;ANY SECONDARY CHOICE?
TLNN H,-1
JRST LINMV4
MOVS H,H
TLNE H,-1
JRST PERRET
>;MD
MPC,<
SETZB H,G ;NO CHOICE YET, MAX SLOPE =0 SO FAR
SETZ F, ;ALSO LAST DITCH CHOICE
FETCH(B,A,PNEB)
JUMPE B,PERRET ;LOSE IF NO NEIGHBORS
LINMV1: MOVEI C,2
LINMV2: XCT (C)[HLRZ D,(B)
HRRZ D,1(B)
HLRZ D,1(B)]
JUMPE D,LINMV3
MOVE T,1(D)
ADJUST(SUB,T,<1(A)>)
HRRE TT,T ;Y TO TT
HLRE T,T ;X TO T
XCT LASTAB(TTT) ;IS IT A SECONDARY CHOICE??
XCT SIDTAB(TTT) ;IS IT EVEN A CHOICE?
XCT PERTAB(TTT) ;IS IT A PERFECT LINE?
TRNE TTT,2 ;IF VERT
EXCH T,TT ;INTERCHANGE X AND Y
IDIV T,TT ;X/Y (OR Y/X FOR VERT)
MOVM T,T
CAMG T,G ;BIGGER?
JRST LINMV3 ;NO
MOVE H,D
MOVE G,T
LINMV3: SOJGE C,LINMV2
HRRZ B,(B)
JUMPN B,LINMV1
JUMPN H,LINMV4 ;ERROR IF NO GOOD ONE FOUND
JUMPLE F,PERRET ;IF NONE, OR TOO MANY, LOSE
MOVE H,F
JRST LINMV4
LINMV6: JUMPE F,.+2
HRRO D,D ;FLAG TOO MANY
MOVE F,D
JRST LINMV3
LINMV5: MOVE H,D
>;MPC
LINMV4: FETCHL(T,H,PBIT)
TRNN MD,<LMOVE!>TMOVE ;IF WERE MOVING OFFSETS
TLNE T,MPC,<CPIN!>ISPIN ;OR THIS PIN
TRZN INMOV ;STOP MOVING
CAIA
TRO NEEDCL
MOVE T,H
JRST SCLOSP
MD,<
PERTAB: FETCH(H,A,PNR)
FETCH(H,A,PNL)
FETCH(H,A,PNU)
FETCH(H,A,PND)
LASTAB: MOVE H,ADDR(A,PND) ;UD
MOVE H,ADDR(A,PND) ;UD
MOVE H,ADDR(A,PNL) ;LR
MOVE H,ADDR(A,PNL) ;LR
>;MD
MPC,<
LASTAB: JUMPE T,LINMV6 ;R
JUMPE T,LINMV6 ;L
JUMPE TT,LINMV6 ;U
JUMPE TT,LINMV6 ;D
SIDTAB: JUMPLE T,LINMV3 ;R NEG X IS WRONG
JUMPGE T,LINMV3 ;L POS X IS WRONG
JUMPLE TT,LINMV3 ;U NEG Y IS WRONG
JUMPGE TT,LINMV3 ;D POS Y IS WRONG
PERTAB: JUMPE TT,LINMV5 ;R
JUMPE TT,LINMV5 ;L
JUMPE T,LINMV5 ;U
JUMPE T,LINMV5 ;D
>;MPC