Trailing-Edge
-
PDP-10 Archives
-
BB-H580C-SB_1981
-
bisgen.mac
There are 7 other files named bisgen.mac in the archive. Click here to see a list.
; UPD ID= 1206 on 8/30/78 at 1:15 PM
TITLE BISGEN FOR COBOL VERSION V12B
SUBTTL D.B.TOLMAN
;THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USED
; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.
;
;COPYRIGHT (C) 1975, 1981 BY DIGITAL EQUIPMENT CORPORATION
SEARCH P,CHREQV
%%P==:%%P
BIS==:BIS
;EDITS
;V10*****************
;NAME DATE COMMENTS
;********************
; THIS MODULE CONTAINS A SERIES OF ROUTINES
; WHICH ARE CALLED BY THE EDIT GENERATION SECTIONS OF MOVGEN.MAC,
; AND WHICH WILL PRODUCE THE APPROPRIATE PATTERN STRING AND
; IN-LINE CODE TO USE THE EDIT INSTRUCTION OF THE BIS.
; SET UP CODE USES THREE BLOCKS OF STORAGE IN THE LOWSEG
; OF THE GENERATED CODE AS THE EFFECTIVE ADDRESS OF THE
; EDIT INSTRUCTION. THEY ARE SET UP BY LIBOL AT INITIALIZATION
; TIME AND ONLY REQUIRE CORRECTIONS FOR CORRECT TRANSLATION TABLE
; AND CORRECT FILL AND FLOAT CHARACTERS.
; AS THE EDIT INSTRUCTION IS NOT GENERAL ENOUGH TO HANDLE
; SOME OF THE CONSTRUCTIONS REQUIRED, THE EDIT INSTRUCTION
; IS SOMETIMES FOLLOWED BY CODE WHICH TESTS THE FLAG BITS
; IN THE PATTERN AC TO SEE IF MORE WORK NEEDS TO BE DONE.
TWOSEG
SALL
RELOC 400000
ENTRY BISINI,BSTRAN,BISCAL,BSEND
IFE BIS,<
BISINI: BSTRAN: BISCAL: BSEND:
OUTSTR [ASCIZ /
?Internal compiler error - BISGEN was called.
/]
JRST KILL##
END
>
SUBTTL DEFINITIONS
; REFER TO THE KL-10 EXTENDED INSTRUCTION SET DOCUMENTATION
; FOR THE COMPLETE SPECIFICATION OF THE EDIT INSTRUCTION FORMAT
; PATTERN CODES
B.STOP=0 ;STOP EDIT
B.SEL=1 ;SELECT NEXT INPUT CHARACTER
B.SIG=2 ;SET SIGNIFICANCE ON ( STORE CURRENT
; POINTER IN MARK )
B.SEP=3 ;FIELD SEPARATOR - CLEAR ALL FLAGS
B.EXCH=4 ;EXCHANGE MARK AND DESTINATION POINTERS
B.MSG=100 ;MESSAGE CHARACTER
B.SKPM=500 ;SKIP IF M FLAG SET(NEGATIVE NUMBER)
B.SKPN=600 ;SKIP IF N FLAG SET(NON-ZERO NUMBER)
B.SKPA=700 ;SKIP ALWAYS
; FLAGS IN THE FIRST AC OF THE EDIT BLOCK
S.BIT=400000 ;SIGNIFICANCE FLAG
N.BIT=200000 ;NEGATIVE FLAG
M.BIT=100000 ;MINUS FLAG
; MESSAGE CHARACTER CODES OR INDICES
BM.FIL=0 ;FILL CHARACTER
BM.FLT=1 ;FLOAT CHARACTER
BM.$=2 ;DOLLAR SIGN
BM.COM=3 ;COMMA
BM..=4 ;PERIOD
BM.BL=5 ;BLANK
BM.0=6 ;ZERO
BM.PL=7 ;PLUS
BM.MI=10 ;MINUS
BM.C=11 ;"C"
BM.R=12 ;"R"
BM.D=13 ;"D"
BM.B=14 ;"B"
BM.SL==15 ;SLASH
; A FEW MASK CODES
CODEBL==5 ;BLANK
CODEP==11 ;"."
;EBCDIC CHARACTER CODES OF INTEREST
AST.9==AE%52 ;ASTERISK
PL.9==AE%53 ;PLUS
MI.9==AE%55 ;MINUS
DL.9==AE%44 ;DOLLAR SIGN
BL.9==AE%40 ;BLANK
;SPECIAL FILL AND FLOAT CODES
DOLLAR==400000 ;"$" - EDITB REPLACES BY CORRECT CHAR
BL.6==10000 ;SIXBIT BLANK - SO THAT IT APPEARS TO BE
; SOMETHING NON-ZERO
; THE EDIT INSTR IGNORES FLOAT CHAR IF
; THE RESPECTIVE WORD IS ZERO, SO WE NEED
; TO PUT A CODE THERE THAT IS NON ZERO BUT
; IS STILL A SIXBIT BLANK. USE 10000 SINCE
; IT IS STILL SMALLER THAN ANY OF THE
; AS.* GUYS, SO COBOLG WONT GET CONFUSED
; POINTERS TO FLOAT AND SIGN CHARACTERS AS SET UP BY PSCAN.MAC
; THEY ARE IN SIXBIT AND 0 IMPLIES "+" OR BLANK
EXTERNAL EDITW1,EDITW2,EDITW3
DEFINE FLTCHR = <[POINT 6,EDITW1,17]> ;FLOAT CHR
DEFINE SGNCHR = <[POINT 6,EDITW1,11]> ;SIGN CHARACTER
; STORAGE LOCATIONS USED IN THE GENERATION PROCESS
;BISMIN MINUS SIGN FLAG. SET TO -1 WHEN LEADING MINUS CODE
; NEEDS TO BE ADDED AFTER THE EDIT INSTRUCTION.
;
;BISBW0 BLANK WHEN ZERO. CONTAINS NUMBER OF ADDITIONAL CHARACTERS
; THAT NEED TO BE BLANKED WHEN THERE IS A BLANK WHEN ZERO
; CLAUSE ON THE FIELD, AND THE EDIT INSTR COULDNT HANDLE
; ALL THE SPACES NECESSARY.
;
;BISDST DESTINATION BYTE POINTER. CONTAINS THE ADDRESS OF THE
; DESTINATION BYTE POINTER AFTER CALCULATION. SAVES A
; RECALCULATION OF SUBSCRIPT IN THAT CASE. NORMALLY ZERO,
; BUT WILL CONTAIN EITHER A LITERAL, OR A TEMP ADDRESS.
;
;BISCNT CURRENT CHARACTER COUNTER
;
;BISBFS NUMBER OF CHARACTERS BEFORE SIGNIFICANCE WAS TURNED OFF.
; THIS IS NEEDED FOR BWZ.
;
;BISASS NUMBER OF CHARACTERS AFTER SIGNIFICANCE
; IS TURNED ON BUT BEFORE DECIMAL POINT. ALSO NEEDED
; FOR BWZ.
;
;BISDOT SET TO 1 IF AN EXPLICIT DECIMAL POINT IS
; ENCOUNTERED AND A SIGSET WAS ISSUED. MOST OF THESE
; SPECIAL COUNTERS ARE NEEDED TO REMEMBER THE LOCATION
; OF THE DECIMAL POINT FOR BWZ "*".
;
;BISFLT FLOAT CHARACTER IN ASCII 0R 0.
;
;BISFIL SET TO "*" IF * SUPPRESSION AND 0 OTHERWISE
;
;BISGOT SET TO -1 AFTER 1ST PLACE HOLDER IN OUTPUT FIELD
; HAS BEEN ENCOUNTERED.
; USED TO DETECT LEADING OR TRAILING SIGNS
;
;BISSGN INSERT SIGN CODE: 0=NONE, +1=LEADING, OR -1=TRAILING
;
;BISSIG -1=SIGNIFICANCE ON BUT NO SIGSET YET, 0=OFF, AND
; 1=ON AGAIN AFTER SIGSET
;
;BISALP 0=ALPHABETIC/ALPHANUMERIC EDIT, -1=NUMERIC
; NOTE THAT BWZ FOR A NON-EDITED FIELD IS
; DONE AS AN ALPHANUMERIC EDIT SO THAT NONE
; OF THE OVERPUNCH SIGNS GET CONVERTED
EXTERNAL BISBW0,BISDST,BISMIN
EXTERNAL BISCNT,BISBFS,BISASS,BISDOT,BISFLT
EXTERNAL BISFIL,BISGOT,BISSGN,BISSIG,BISALP
EXTERNAL BISZRF,BISZRL ;FIRST AND LAST LOCS TO ZERO
;AT BEGINNING OF EACH EDIT
EXTERNAL PUTASY,PUTASN,LNKSET,PUT.EX,EMODEA,EMODEB
EXTERNAL DCPNT.,BMSK2B,ETABLB,LNKCOD,TB.DAT,MOVEI.,PUSHJ.
EXTERNAL D6MODE,D7MODE,D9MODE,TB.DAT
EXTERNAL AS.EXT,AS.LIT,AS.XWD,AS.MSC,AS.CNB
EXTERNAL MOV,DMOVM.,MOVEM.,DPB.,IDPB.,HRRM.,JRST.,SETZB.,TLNN.,TLNE.
EXTERNAL OCTLIT,BYTLIT,XWDLIT,XTNLIT,AS.DOT
EXTERNAL IBPFLG,ELITPC,PLITPC
EXTERNAL POOL,POOLIT,MBYTPB,PUT.LD,PUT.EX,PUTASA,STASHP,STASHQ
EXTERNAL GETEMP
SUBTTL MASK TO PATTERN TRANSLATION/DISPATCH TABLE
; THE FOLLOWING TABLE IS USED TO TRANSLATE FROM THE MASKS
; CURRENTLY GENERATED BY MOVGEN FOR EDIT.U/S TO THE
; PATTERN STRINGS NEEDED FOR THE KL-10 EXTENDED EDIT INSTRUCTION
; ROUTINE EDIT.B
; THE LEFT HALF OF EACH ENTRY CONTAINS THE BIS PATTERN CODE
; (SUBJECT TO THE DISPATCH ROUTINE) AND BITS INDICATING WHETHER
; SIGNIFICANCE IS TO BE TURNED ON, OFF, OR LEFT ALONE.
; THE RIGHT SIDE IS THE DISPATCH ADDRESS.
; THE TABLE IS INDEXED BY MASK CODE
SON=400000 ;TURN SIGNIFICANCE ON
SOFF=20000 ;TURN SIGNIFICANCE OFF
BISTAB:
XWD SON!B.SEL, BSTR00 ;0 - ALPHA
XWD SON!B.SEL, BSTR00 ;1 - NUMERIC
XWD SOFF!B.SEL, BSTR00 ;2 - SUPPRESS "*"/"Z"
XWD SOFF!B.SEL, BSTR20 ;3 - FLOAT "$"/"+"/"-"
XWD B.MSG!BM.COM, BSTR30 ;4 - COMMA
XWD B.MSG!BM.BL, BSTR00 ;5 - B
XWD B.MSG!BM.0, BSTR00 ;6 - 0
XWD B.MSG!BM.$, BSTR00 ;7 - $
XWD B.MSG!BM.PL, BSTR40 ;10 - INSERT SIGN
XWD B.MSG!BM.., BSTR50 ;11 - DECIMAL POINT
XWD B.MSG!BM.R, BSTR60 ;12 - CR
XWD B.MSG!BM.B, BSTR70 ;13 - DB
XWD 0, BSTR80 ;14 - V
IFN ANS74,<
XWD B.MSG!BM.SL, BSTR00 ;15 - SLASH
>
; THE REMAINING CODES NEVER REACH THE POINT OF TRANSLATION
SUBTTL INITIALIZATION
; THIS ROUTINE INITIALIZES THE LOCATIONS APPROPRIATELY AT
; THE BEGINNING OF EVERY EDIT GENERATION
BISINI::
SETZM BISZRF ;CLEAR FIRST LOCATION IN BLOCK TO 0
MOVE TB,[BISZRF,,BISZRF+1] ;SET UP ZEROING BLT
BLT TB,BISZRL ;CLEAR
SETOM BISSIG ;INIT SIGNIFICANCE INDICATOR TO -1
TSWF FBNUM ;IS THIS A NUMERIC EDIT?
SETOM BISALP ;YES, REMEMBER THAT.
;SET UP FILL CHARACTER
LDB TB,FLTCHR
CAIE TB,"*"-40 ;IS IT * FILL?
TDZA TB,TB ;NO, SET TO ZERO OTHERWISE
MOVEI TB,"*" ;YES
MOVEM TB,BISFIL ;AND STORE
MOVE TB,[POINT 9,TA] ;INITIALIZE LITTAB BUFFER REGISTER POINTER
POPJ PP, ; AND RETURN
SUBTTL TRANSLATE MASK TO PATTERN
; ROUTINE BSTRAN IS CALLED FOR EACH CHARACTER OF THE
; MASK.
;
; CALL: PUSHJ PP,BSTRAN ;MASK CODE IS IN TE
; RETURN+1 ;PATTERN CODE IS IN TE AND
; ;SHOULD BE STORED
; RETURN+2 ;DO NOT STORE A CHARACTER
; ; IN THE PATTERN
;
; ALL OF THESE ROUTINES EXPECT THAT THE PATTERN POINTER IS IN
; TB POINTING TO TA, AND THAT THE REPEAT COUNT FOR THE MASK
; CHARACTER IS IN TD (<=0 IMPLIES 1).
BSTRAN::
PUSH PP,TC ;SAVE TEMPORARY
HRRZ TC,BISTAB(TE) ;GET DISPATCH ADDRESS
JRST (TC) ;GO
; SIMPLE TRANSLATION FROM TABLE
BSTR00:
HLRZ TE,BISTAB(TE) ;GET TRANSLATION CODE
BSTR01:
TRZE TE,SON ;TURN SIGNIFICANCE ON??
PUSHJ PP,SIGON ;YES
TRZE TE,SOFF ;TURN SIGNIFICANCE OFF??
PUSHJ PP,SIGOFF ;YES
BSTR02:
CAIG TD,0 ;IS REPEAT COUNT >= 1
MOVEI TD,1 ;NO - SET TO ONE
ADDM TD,BISCNT ;ADD TO COUNTER
SETOM BISGOT ;NOTE THAT WE HAVE SEEN SOMETHING
POPTC: POP PP,TC ;RESTORE
POPJ PP, ;AND RETURN
SUBTTL DISPATCH ROUTINES FOR MASK TO PATTERN CONVERSION
BSTR20: ;FLOATING CODE: +/-/$
SKIPE BISFLT ;HAVE WE BEEN HERE BEFORE?
JRST BSTR00 ;YES - RETURN
;DECIDE WHICH SIGN IT IS THAT WE ARE DEALING WITH AND SET UP
; FLOAT CHARACTER
LDB TC,FLTCHR ;GET CHARACTER
ADDI TC,40 ;CONVERT TO ASCII
CAIN TC,"$" ;DOLLAR SIGN?
MOVEI TC,DOLLAR ;YES USE SPECIAL CODE
MOVEM TC,BISFLT ;SAVE IT AWAY
JRST BSTR00 ;RETURN
BSTR30: ;COMMA
;DETERMINE WHETHER A "," OR "." IS SUPPOSED TO BE USED
MOVE TC,DCPNT. ;CODE TO BE USED FOR "."
CAIE TC,"." ;IS IT REALLY "."?
MOVEI TE,CODEP ;THEY WERE SWITCHED - USE "."
JRST BSTR00 ;RETURN
BSTR40: ; INSERT SIGN CODE
; IS IT LEADING OR TRAILING?
SKIPE BISGOT ;HAVE WE SEEN CHARACTERS BEFORE THIS ONE
JRST BSTR41 ;YES - MUST BE TRAILING
;LEADING SIGN INSERT
AOS BISSGN ;NOTE LEADING
LDB TC,SGNCHR ;WHAT SIGN IS IT?
SKIPN TC ;IS IT ZERO?
MOVEI TE,CODEBL ;YES - MINUS SO USE BLANK
JRST BSTR00 ;RETURN
BSTR41: ;TRAILING INSERT SIGN
SETOM BISSGN ;NOTE TRAILING
TSWT FASIGN ;IS A SIGNED?
JRST BSTR42 ;NO - SO NO CHECKING NEEDED
;BOTH A AND B ARE SIGNED
;PUT OUT FOLLOWING PATTERN: SKPM+1,"+"/" ",SKPA,"-"
MOVEI TC,B.SKPM+1 ;SKIP TO "-" IF NUMBER IS NEGATIVE
PUSHJ PP,BISSTO ;STORE IN PATTERN
LDB TC,SGNCHR ;WHAT SIGN IS IT?
SKIPN TC ;0?
SKIPA TC,[B.MSG!BM.BL];YES - MINUS USE BLANK
MOVEI TC,B.MSG!BM.PL ;YES - ITS +
PUSHJ PP,BISSTO ;STORE IN PATTERN
MOVEI TC,B.SKPA ;SKIP
PUSHJ PP,BISSTO ;STORE IT
MOVEI TE,B.MSG!BM.MI ;MINUS
JRST BSTR02 ;RETURN AND HAVE TE STORED
BSTR42: ; UNSIGNED SENDER
; JUST PUT IN + OR BLANK
LDB TC,SGNCHR ;WHAT SIGN?
SKIPN TC
SKIPA TE,[B.MSG!BM.BL];USE BLANK FOR MINUS
MOVEI TE,B.MSG!BM.PL ;OR "+" FOR "+"
JRST BSTR02 ;RETURN TO STORE CODE
BSTR50: ;EXPLICIT DECIMAL POINT
SETOM BISGOT ;NOTE THAT A CODE HAS BEEN SEEN
;BECAUSE WE POPJ BACK SOMETIMES
;RATHER THAN RETURNING TO BSTRAN
PUSHJ PP,SIGON ;TURN SIGNIFICANCE ON IF NECESSARY
;CHECK TO SEE IF THERE WAS A SIGSET ISSUED IN THE PATTERN
; THIS IS IMPORTANT BECAUSE IF NOT THERE IS NO MARK POINTER
; TO GO BACK TO FOR BWZ
SKIPG BISSIG ;?
JRST BSTR51 ;NONE ISSUED
;A SIGSET WAS ISSUED SOME TIME OR OTHER
MOVEI TC,0
EXCH TC,BISCNT ;GET BISCNT AND CLEAR IT
MOVEM TC,BISASS ;SAVE FOR BWZ - THIS IS THE NUMBER OF
;CHARACTERS BEFORE THE DECIMAL
;POINT THAT WOULD HAVE TO BE BLANKED
;OR "*"ED
AOS BISDOT ;COUNT THE DECIMAL POINT
PUSHJ PP,BISGT. ;GET ACTUAL CODE FOR DECIMAL POINT ./,
;RETURN WITH IT IN TE TO BE STORED
JRST POPTC ;RESTORE TC AND RETURN
BSTR51: ; SIGSET WAS NEVER EXPLICITLY ISSUED, IE. SIGNIFICANCE WAS NEVER
; TURNED OFF. WE ARE OK UNLESS ITS A BWZ"*", IN WHICH CASE
; WE MUST BE ABLE TO GET BACK TO DECIMAL POINT.
;SPECIFICALLY THE CASE OF [+/-][$].*[*...]
SKIPE BISFLT ;IS IT * SUPPRESSION?
PUSHJ PP,BISBWZ ;YES - CHECK FOR BWZ REQUEST AND SKIP IF
JRST BSTR52 ;NOT * OR NOT BWZ - NO PROBLEMS
;THE CASE HAS BEEN ENCOUNTERED
;SO ISSUES A SIGSET JUST AFTER THE DECIMAL POINT IN ORDER
;TO GET THE MARK POINTER SAVED SO THAT WE CAN COME BACK WITH
;"*"'S AND NOT DESTROY THE DECIMAL POINT. ANYTHING BEFORE
;THE DECIMAL POINT WILL BE HANDLED BY THE AFTBWZ CODE.
PUSHJ PP,BISGT. ;GET CODE FOR DECIMAL POINT
MOVE TC,TE ;MOVE CODE TO TC
PUSHJ PP,BISSTO ; STORE IT
SKIPE TC,BISCNT ;GET CURRENT COUNT
SETZM BISCNT ;CLEAR IT
MOVEM TC,BISBFS ;SAVE THIS COUNT FOR POSSIBLE AFTBWZ
;NOTE THAT COUNT DOES NOT INCLUDE THE
;DECIMAL POINT SO THE INSTRUCTION WILL
;GO BACK AND HANDLE AFTER THE POINT
;AND AFTBWZ WILL DO BEFORE THE POINT
SETZM BISSIG ;CLEAR
AOS BISSIG ;AND NOTE THAT SIGSET WAS DONE
MOVEI TE,B.SIG ;LEAVE WITH SIGSET CODE TO BE STORED
JRST POPTC ;RESTORE TC AND RETURN
BSTR52: ;OTHERWISE JUST PUT THE POINT IN
PUSHJ PP,BISGT. ;GET CODE FOR POINT
JRST BSTR02 ;RETURN NORMALLY AND COUNT IT
BSTR60: ;"CR"
PUSH PP,TE ;SAVE "R" CODE
MOVEI TE,B.MSG!BM.C ;"C" CODE
JRST BSTR71
BSTR70: ;"DB"
PUSH PP,TE ;SAVE "B" CODE
MOVEI TE,B.MSG!BM.D ;"D" CODE
BSTR71: ;HANDLE "CR" OR "DB"
AOS BISCNT ;ONE FOR EXTRA CHARACTER
TSWT FASIGN ; IS A SIGNED
JRST BSTR72 ;NO
;BOTH A AND B ARE SIGNED SO GENERATE THE FOLLOWING PATTERN:
; SKPM+2," "," ",SKPA+1,"C"/"D","R"/"B"
MOVEI TC,B.SKPM+2 ;SKIP IF NEGATIVE
PUSHJ PP,BISSTO ;STORE IT
MOVEI TC,B.MSG!BM.BL ;BLANK
PUSHJ PP,BISSTO
PUSHJ PP,BISSTO ;STORE
MOVEI TC,B.SKPA+1 ;SKIP OVER CR/DB
PUSHJ PP,BISSTO ;STORE IT
MOVE TC,TE ;GET C/D
PUSHJ PP,BISSTO ;STORE
POP PP,TE ;RESTORE R/B MASK CODE
JRST BSTR00 ;RETURN WITH TE CONTAINING MASK CODE
BSTR72: ; A IS UNSIGNED SO JUST PUT IN BLANKS
POP PP,TE ;FORGET SAVED TE
MOVEI TC,B.MSG!BM.BL ;BLANK
PUSHJ PP,BISSTO ;STORE IT
MOVE TE,TC ;RETURN WITH ANOTHER BLANK IN TE TO BE STORED
JRST BSTR02
BSTR80: ; "V"
; JUST TURN SIGNIFICANCE ON AND IGNORE THE "V"
PUSHJ PP,SIGON ;SIGNIFICANCE ON
POP PP,TC ;RESTORE TC
AOS (PP) ;SKIP RETURN TO AVOID STORING A CHARATER
POPJ PP,
SUBTTL END OF PATTERN PROCESSING
BSEND: ; PATTERN IS DONE
; CHECK FOR BWZ AND LEADING SIGN AND THEN STOP AND
; GENERATE AFTER CODE
PUSH PP,TC ;SAVE A REGISTER
PUSHJ PP,BISBWZ ;BLANK WHEN ZERO REQUEST?
JRST BSEN20 ;NO
;BLANK WHEN ZERO
; FIRST SEE IF THERE WAS A SIGSET BECAUSE IF NOT THEN EDIT
; INSTRUCTION IS NO HELP
SKIPG BISSIG ;?
JRST BSEN0A ;NONE ISSUED
;OK - HOW MANY CHARACTERS CAN EDIT INST HANDLE
MOVE TC,BISASS ;CHARS BEFORE POINT
ADD TC,BISDOT ;POINT
ADD TC,BISCNT ;CHARS AFTER POINT
JUMPE TC,BSEN00 ;IF NONE FORGET IT
;OK PUT OUT THE FOLLOWING PATTERN STRING:
; SKPN+N,EXCHMD,FILL,...,("."/FILL),FILL,...,STOP
; THIS WILL GO BACK TO WHERE SIGNIFICANCE STARTED AND
; OVERWRITE IT IF THE VALUE OF THE STRING IS ZERO
ADDI TC,B.SKPN ;SKPN
ADDI TC,1 ;FOR EXCHMD,STOP
PUSHJ PP,BISSTO ;STORE SKIP
;NOW THE EXCHANGE
MOVEI TC,B.EXCH
PUSHJ PP,BISSTO ;STORE IT
;NOW THE CHARACTERS BEFORE THE DECIMAL POINT
MOVEI TC,B.MSG!BM.FIL ;FILL CHARACTER
SKIPE TE,BISASS ;GET COUNT
PUSHJ PP,BISSTO ;STORE CODE
SOJG TE,.-1 ;LOOP
;NOW THE DECIMAL POINT
PUSHJ PP,BISGT. ;GET CODE FOR DECMAL POINT
SKIPE BISFIL ;* OR Z ?
SKIPA TC,TE ;* - PUT DECIMAL POINT IN
MOVEI TC,B.MSG!BM.FIL ;Z - USE FILL CHARACTER
SKIPE BISDOT ;DO WE HAVE A DECIMAL POINT
PUSHJ PP,BISSTO ;YES STORE IT
;AFTER THE POINT
MOVEI TC,B.MSG!BM.FIL ;FILL CHARACTER
SKIPE TE,BISCNT ;GET NUMBER
PUSHJ PP,BISSTO ;STORE
SOJG TE,.-1 ;LOOP
;NOW GENERATE STOP FOR THE FILLING
MOVEI TC,B.STOP
PUSHJ PP,BISSTO
MOVE TE,BISBFS ;AMOUNT LEFT TO BWZ
JRST BSEN01
BSEN0A: SKIPE BISFIL ;IS IT * FILL CHAR?
JRST BSEN20 ;YES, PATTERN DONE, AND NO END CODE
SKIPN BISFLT ;NON-SPACE FOR FLOAT CHAR?
JRST BSEN00 ;NO, NORMAL PROCESSING
; BWZ PATTERN THAT DIDN'T GET FINAL CHAR. (E.G., PIC +++)
MOVEI TC,B.SKPN
PUSHJ PP,BISSTO
MOVEI TC,B.MSG!BM.FIL ;IF N FLAG OFF (IT MOVED 0) STORE THE FILL CHAR
PUSHJ PP,BISSTO
BSEN00: ;BWZ BUT NO SIGSET WAS EVER ISSUED
MOVE TE,BISCNT ;USE BISCNT
SKIPL BISSIG ;UNLESS SIGNIFICANCE WAS TURNED OFF
;THEN USE BISBFS
MOVE TE,BISBFS ;COUNT BEFORE SIGNIFICANCE WAS TURNED OFF
BSEN01: ;BWZ THAT EDIT INSTRUCTION CANNOT HANDLE
;GENERATE THE BWZ AFTER CODE IF NECESSARY
MOVEM TE,BISBW0 ;STORE NUMBER OF CHARS THAT EDIT INSTR
; COULD NOT BLANK FOR AFTER EDIT INSTR
; EXECUTION.
; FALL INTO BSEN20
BSEN20: ;NOW CHECK FOR LEADING SIGNS
SKIPLE BISSGN ;LEADING
TSWT FASIGN ;YES - BUT DO WE CARE
JRST BSEN21 ;FORGET IT
SETOM BISMIN ;REMEMBER TO GENERATE CODE FOR LEADING SIGN
JRST BSEN22
BSEN21: SKIPE TC,BISFLT ;IF THERE IS NO FLOAT CHAR
CAIN TC,DOLLAR ; AND IT IS A DOLLAR SIGN,
JRST BSEN22 ; GO ON.
;FLOATING SIGN.
TSWT FASIGN ;DO WE CARE?
JRST BSEN22 ;NO.
;PUT OUT EXTRA PROGRAM TO INSERT FLOATING SIGN IF M.BIT SAYS SO
MOVE TE,[POINT 9,[BYTE (9)B.SKPM,B.STOP,B.EXCH,B.MSG!BM.MI]]
ILDB TC,TE
PUSHJ PP,BISSTO
CAIE TC,B.MSG!BM.MI
JRST .-3
BSEN22: ;DON'T WORRY ABOUT SIGNS
MOVEI TC,B.STOP ;STOP
PUSHJ PP,BISSTO ;STORE IT
JRST POPTC ;RESTORE TC AND RETURN
SUBTTL PATTERN GENERATION SUBROUTINES
SIGON: ;TURN SIGNIFICANCE ON IF NOT ALREADY ON
SKIPE BISSIG ;IS IT ON?
POPJ PP, ;YES - RETURN
PUSH PP,TC ;SAVE REGISTER
AOS BISSIG ;NO - SET ON FLAG
SETZM BISCNT ;DON'T CARE ABOUT NUMBER OF FLOATING
;PLACES
MOVEI TC,B.SIG ;SIGNIFICANCE ON PATTERN CODE
PUSHJ PP,BISSTO ;STORE IT
SKIPE BISFLT ;IS THERE A FLOAT CHARACTER?
AOS BISCNT ;YES- COUNT IT
JRST POPTC ;RESTORE TC AND RETURN
SIGOFF: ;TURN SIGNIFICANCE OFF IF NOT ALREADY OFF
SKIPN BISSIG ;IS IT OFF
POPJ PP, ;YES - RETURN
PUSH PP,TC ;NO - SAVE REGISTER
SETZB TC,BISSIG ;TURN OFF FLAG
EXCH TC,BISCNT ;GET COUNT BEFORE TURNING IT OFF AND
;CLEAR COUNTER
MOVEM TC,BISBFS ;SAVE INCASE OF BWZ
MOVEI TC,B.SEP ;SIGNIFICANCE OFF PATTERN CODE
PUSHJ PP,BISSTO ;STORE IT
JRST POPTC ;RESTORE TC AND RETURN
BISSTO: ; STORE TC IN PATTERN LITERAL
IDPB TC,TB ;STORE IN BUFFER REGISTER
TLNN TB,770000 ;IS IT FILLED?
PJRST BMSK2B ;YES - SEND IT TO LITERAL TABLE
POPJ PP, ;NO RETURN
BISGT.: ; RETURN THE CODE FOR THE DECIMAL POINT (IE. ","/".")
PUSH PP,TC ;SAVE
MOVEI TC,"." ;ARE WE REPRESENTING DECIMAL POINTS
CAMN TC,DCPNT. ;BY "." OR "," TODAY
SKIPA TE,[B.MSG!BM..] ; "."
MOVEI TE,B.MSG!BM.COM ; ","
JRST POPTC ;RESTORE TC AND RETURN
BISBWZ: ; DETERMINE IF B HAS REQUESTED BWZ
; AND SKIP RETURN IF SO
PUSH PP,TA ;SAVE REGS
PUSH PP,TB
MOVE TA,ETABLB ;GET B TABLE POINTER
LDB TB,LNKCOD ;GET TABLE TYPE
CAIE TB,TB.DAT ;DATTAB??
JRST BISBZ1 ;NO - FORGET IT
PUSHJ PP,LNKSET ;GET ENTRY ADDRESS
LDB TB,DA.BWZ## ;GET FLAG
SKIPE TB ;BWZ SET??
AOS -2(PP) ;YES, SKIP RETURN
BISBZ1: POP PP,TB ;RESTORE
POP PP,TA
POPJ PP, ;AND RETURN
;TABLES AND CODE PICTURE FOR DOING EDIT INSTR IN LINE
;
;
; CODE LOOKS LIKE:
;
; MOVE 5, [SOURCE BYTE-POINTER]
; MOVE 10, [DEST BYTE-POINTER]
; MOVE 4, [S.BIT,,PATTERN-ADDRESS]
; MOVEI 6, FILL-CHAR
; MOVEI 7, FLOAT-CHAR
; DMOVEM 6, E0+1 ;SET UP SPECIAL MESSAGE CHARS
; MOVEI 6, TRANSLATION TABLE ADDRESS
; HRRM 6, E0 ;SET UP TTA IN E0
; MOVEI 7, 6 ;REGISTER 6 IS THE MARK POINTER
; EXTEND 4, E0 ;DO THE EXTEND
; PUSHJ 17, XTND.E ;ERROR DURING EXTEND OPERATION
; PUSHJ 17, EDIT.B ;TO CHECK FOR EXTRA STUFF (TEMP)
;
;
; CODE THAT GETS GENERATED VARIES IF WE KNOW THAT IT IS
; SUBSCRIPTED, AND THERE IS BWZ OR LEADING SIGN.
; IN THOSE CASES, WE NEED THE BYTE POINTER TO THE BEGINNING
; OF B, AND WE DONT NEED (WANT) TO RECALCULATE IT. SO IF THE
; DESTINATION BYTE POINTER IS NOT A CONSTANT (IS SUBSCRIPTED)
; AC10 GETS SAVED IN A TEMPORARY:
; MOVE AC10, %TEMP ;SAVE BYTE POINTER FOR LATER
; TABLES NEEDED ARE FOR SPACES, DOLLAR SIGNS, ASTERISKS,
; PLUS SIGNS, MINUS SIGNS, AND SPACES FOR ALL THE MODES
; USE HALF WORD TABLES INDEXED BY MODE OF DEST OPERAND.
; ALSO NEED TABLE FOR TRANSLATION TABLES AND E0'S FOR
; THE DIFFERENT MODES. CODE FOR THE LARGE TABLE LOOKUP
; IS DERIVED BY USE OF FOLLOWING FORMULAE:
; CODE = <DEST-MODE> + <SRC-MODE>*3 + <EDIT-TYPE>*9
BISTB0: ;TRANSLATION TABLE ADDRESS IN LEFT HALF
;EFFECTIVE ADDRESS IN RIGHT HALF
;INDEXED BY CODE AS DEFINED ABOVE
XWD ALP.66##, E0.6##
XWD ALP.67##, E0.7##
XWD ALP.69##, E0.9##
XWD ALP.76##, E0.6##
XWD ALP.77##, E0.7##
XWD ALP.79##, E0.9##
XWD ALP.96##, E0.6##
XWD ALP.97##, E0.7##
XWD ALP.99##, E0.9##
XWD NUM.66##, E0.6##
XWD NUM.67##, E0.7##
XWD NUM.69##, E0.9##
XWD NUM.76##, E0.6##
XWD NUM.77##, E0.7##
XWD NUM.79##, E0.9##
XWD NUM.96##, E0.6##
XWD NUM.97##, E0.7##
XWD NUM.99##, E0.9##
BISTB1: ;DOLLAR SIGN IN LEFT HALF
;ASTERISK IN RIGHT HALF
;INDEXED BY MODE OF DEST OPERAND
XWD "$"-40, "*"-40 ;SIXBIT
XWD "$", "*" ;ASCII
XWD DL.9, AST.9 ;EBCDIC
BISTB2: ;PLUS SIGN IN LEFT HALF
;MINUS SIGN IN RIGHT HALF
;INDEXED BY MODE OF DEST OPERAND
XWD "+"-40, "-"-40 ;SIXBIT
XWD "+", "-" ;ASCII
XWD PL.9, MI.9 ;EBCDIC
;GARBAGE IN LEFT HALF
;SPACE IN RIGHT HALF
;INDEXED BY MODE OF DEST OPERAND
EXTERN IFSPCS ;SPACE TABLE IN IFGEN WE SHARE
BISTB3=IFSPCS
BISTB4: ;INSTRUCTION EFFECTIVE ADDRESS
;SAME AS BISTB1 EXCEPT ADDRESS IS GLOBAL+1
;REQUIRED FOR SEGMENTED PROGRAMS AS ADDITIVE GLOBALS WON'T WORK
DMOVM.+AC6,,E0.6.1##
DMOVM.+AC6,,E0.7.1##
DMOVM.+AC6,,E0.9.1##
;GENERATE CODE TO DO THE EDIT IN LINE
; WE KNOW THAT THERE IS INFORMATION IN SOME GLOBALS OF INTEREST
; EDITW2 CONTAINS ADDRESS OF PATTERN LITERAL IN LEFT HALF
; BISFLT CONTAINS ASCII OF THE FLOAT CHARACTER
; BISFIL CONTAINS ASTERISK OR ZERO (ASTERISK FILL OR NOT)
; BISALP CONTAINS 0 IF ALPHABETIC MOVE, 1 IF NUMERIC
BISCAL:
;FIRST CALL ROUTINE TO SET UP ACS 5 AND 10 WITH
; BYTE POINTERS TO THE OPERANDS. WE KNOW THAT
; THE ROUTINE WE ARE CALLING TAKES CARE OF ALL
; THE NASTY SUBSCRIPTING STUFF.
SETOM IBPFLG ;WE WANT INCREMENT BYTE POINTERS
PUSHJ PP, NB2PAR## ;NEW BUILD TWO PARAMETERS
;IF THE DESTINATION OPERAND IS SUBSCRIPTED, PRESERVE
; THE CALCULATED BYTE POINTER TO SAVE US GRIEF.
TSWT FBSUB ;IS B SUBSCRIPTED
JRST DONTSV ;NOPE, SKIP CODE TO SAVE AC
;WE ONLY NEED TO SAVE THE SUBSCRIPTED BYTE POINTER IF
; WE NEED TO DO FIX-UPS AFTER THE INSTRUCTION
; SO IF WE DONT BLANK WITH ZERO, AND WE DONT HAVE TO
; FIX LEADING MINUS, WE DONT SAVE THE AC
SKIPN BISBW0 ;DO WE BLANK WITH ZERO?
SKIPE BISMIN ;DO WE NEED LEADING MINUS
SKIPA ;EITHER WE BWZ OR WE NEED LEADING MINUS
JRST DONTSV ;NO NEED TO SAVE AC10
MOVE CH, [MOVEM.+AC10+ASINC,,AS.MSC] ;
PUSHJ PP, PUTASY ;
MOVEI TE, 1 ;ONLY ONE TEMP NEEDED
PUSHJ PP, GETEMP ;GET THE TEMP INTO EACC
HRRZM EACC, BISDST ;SAVE TEMP ADDR IN DEST
HRRZ CH, EACC ;
PUSHJ PP, PUTASN ;
DONTSV:
;NOW GENERATE THE LITERAL FOR AC4, AND A MOVE TO AC4
MOVE TA, [XWDLIT,,2] ;
PUSHJ PP, STASHP ;IN POOLED AREA
MOVE TA, [S.BIT,,AS.CNB] ;SPECIFY OCTAL CONSTANT
PUSHJ PP, STASHQ ;
MOVE TA, EDITW2 ;GET LIT ADDR OF PATTERN
PUSHJ PP, POOLIT ;
MOVSI CH, MOV+AC4 ;GET INSTRUCTION
PUSHJ PP, PUT.LD ;OUTPUT USING LATEST LITERAL
SKIPN PLITPC ;BUMP LITERAL COUNT IF NECESSARY
AOS ELITPC ;
;NOW SET UP FILL CHARACTER IN AC6. WE NEED TO TO TABLE
; LOOKUP FOR THE PROPER VALUE (MODE OF DEST OPERAND)
HRRZ TA, EMODEB ;GET DEST MODE IN AN AC
SKIPN BISFIL ;SKIP IF NOT BLANK FILL
SKIPA CH, BISTB3(TA) ;GET SPACE IN RH OF CH AND SKIP
HRRZ CH, BISTB1(TA) ;GET ASTERSISK INTO RH OF CH
HRRZ CH, CH ;JUST SAVE RH
CAIN CH, 0 ;IS IT A SIXBIT SPACE?
MOVEI CH, BL.6 ;YES, GET SPECIAL CODE THAT LOOKS
; LIKE NON-ZERO
HRLI CH, MOVEI.+AC6 ;GET INSTR IN LH OF CH
PUSHJ PP, PUTASY ;GENERATE INSTR
;NOW GET THE FLOAT CHARACTER INTO AC7.
; ASSUME TA HAS EMODEB
SKIPN CH, BISFLT ;FIRST, IS THERE A FLOAT CHAR?
JRST FLTCOM ;NO, USE ZERO (GO TO COMMON)
CAIN CH, DOLLAR ;IS THE FLOAT A DOLLAR SIGN?
JRST FLTDOL ;YEP, TABLE LOOK UP AND REJOIN COMMON
;GOT A FLOAT CHARACTER THAT IS NOT DOLLAR SIGN
CAIN TA, D6MODE ;SKIP IF NOT SIXBIT
SUBI CH, 40 ;IF SIXBIT CONVERT ASCII TO SIXBIT
CAIN CH, 0 ;IF ITS SIXBIT SPACE, WE NEED TO
MOVEI CH, BL.6 ; PUT SPECIAL CODE SO EDIT WILL WORK
CAIE TA, D9MODE ;SKIP IF EBCDIC, FOR MORE MODS
JRST FLTCOM ; ITS SIXBIT OR ASCII, GO TO COMMON
CAIE CH, "+" ;YES, EBCDIC, CONVERT IT FROM ASCII
SKIPA CH, [BL.9] ;GET NINE-BIT SPACE
MOVEI CH, PL.9 ;GET NINE-BIT PLUSS
SKIPA ;SKIP AROUND DOLLAR LOOKUP
FLTDOL: HLRZ CH, BISTB1(TA) ;GET THE CORRECT DOLLAR SIGN
FLTCOM: HRLI CH, MOVEI.+AC7 ;SET UP LH OF CH
PUSHJ PP, PUTASY ;GENERATE INSTRUCTION
;WE ARE DONE WITH ALL THE STUFF THAT ONLY NEEDS THE
; DESTINATION MODE. WE NOW NEED TO GENERATE INSTRUCTIONS
; THAT DEPEND UPON THE MODE OF BOTH OPERANDS.
; SO WE CALCULATE INTO TA THE INDEX INTO THE TABLE (BISTB0)
HRRZ TB, EMODEA ;GET SRC MODE
IMULI TB, 3 ;MULTIPLY BY THREE
ADD TA, TB ;ADD TO DEST MODE
SKIPE BISALP ;SKIP IF ALPHABETIC
ADDI TA, ^D9 ;ADD NINE TO GET TO SECOND HALF
;NOW MOVE THE TWO ACS 6 AND 7 TO THEIR DESTINATION.
; THE DEST IS E0+1 AND E0+2, AS THEY ARE MESSAGE CHARS.
PUSHJ PP, PUTASA ;SECOND OP CODE SET
TSWF FAS3 ;IN NON-RES SECTION?
JRST [MOVE CH,EMODEB ;YES, GET DESTINATION MODE
MOVE CH,BISTB4(CH) ;CANNOT USE ADDITIVE GLOBALS
PUSHJ PP,PUT.EX ;GENERATE LESS OBVIOUS EXTERNAL
JRST SETE0]
MOVSI CH, DMOVM.+AC6+ASINC ;
HRR CH, BISTB0(TA) ;GET ADDR OF E0 INTO RH OF CH
PUSHJ PP, PUT.EX ;GENERATE INSTR FOR EXTERNAL
MOVEI CH, 1 ;NOW WE GENERATE THE PLUS 1
PUSHJ PP, PUTASN ;
;WE ONLY HAVE TO MOVE THE TRANSLATION TABLE ADDRESS TO
; THE PROPER E0, SO GET THAT ADDRESS INTO AC6
SETE0:
IFE TOPS20,<
TSWT FREENT ;NO INDIRECT IF /R
>
IFN TOPS20,<
SKIPN RENSW## ;NO INDIRECT IF /R
>
SKIPA CH, [MOV+AC6,,0] ;GET THE OTS ADDRESS
MOVSI CH, MOVEI.+AC6 ;SET UP INSTR PART OF CODE
HLR CH, BISTB0(TA) ;SET UP ADDR PART
PUSHJ PP, PUT.EX ;GENERATE INSTRUCTION
;NOW MOVE AC6 TO E0.
PUSHJ PP, PUTASA ;SECOND OP CODE SET FOR HRRM
HRRZ CH, BISTB0(TA) ;GET E0 ADDRESS
HRLI CH, HRRM.+AC6 ;SET UP INSTR PART
PUSHJ PP, PUT.EX ;GENERATE INSTRUCTION
REPEAT 0,<
;NOW MOVE THE EDIT INSTR INTO REGISTER 6
; WE HAVE TO GENERATE IT FIRST
MOVE TA, [XTNLIT,,1] ;INSTRUCTION LITERAL
PUSHJ PP, STASHP ;
HRRZ TA, EMODEB ;GET BACK THE MODE
HLRZ TA, BISTB0(TA) ;SET UP ADDR
HRLI TA, (EDIT @) ;SET UP THE INSTRUCTION
PUSHJ PP, POOLIT ;NOT PUT IT IN LITERAL TABLE
HRRZ TA, EMODEB ;RESTORE TA
;NOW MOVE THE LITERAL INTO AC6
MOVSI CH, MOV+AC6 ;PUT INSTR IN LH
PUSHJ PP, PUT.LD ;GENERATE INSTR USING LATEST LITERAL
SKIPN PLITPC ;BUMP LIT COUNT IF NECESSARY
AOS ELITPC ;
;NOW MOVE AC6 TO E0.
HRRZ CH, BISTB0(TA) ;GET E0 ADDRESS
HRLI CH, MOVEM.+AC6 ;SET UP INSTR PART
PUSHJ PP, PUT.EX ;GENERATE INSTRUCTION
>
;NOW SET UP AC7 WITH ADDRESS OF MARK POINTER.
; IN THIS CASE THE MARK POINTER WILL BE AC6
MOVE CH, [MOVEI.+AC7,,6]
PUSHJ PP, PUTASY ;GENERATE INSTRUCTION
;NOW THE EXTEND (OF E0)
PUSHJ PP, PUTASA ;SECOND OP CODE SET
MOVSI CH, XTND.##+AC4 ;GET INSTR
HRR CH, BISTB0(TA) ;GET E0 ADDR
PUSHJ PP, PUT.EX ;GENERATE INSTR
;NOW THE ERROR CALL TO LIBOL IF EXTEND FAILS
PUSHJ PP, PUTASA
MOVE CH, [ERROR.##+AC17,,XTND.E##]
PUSHJ PP, PUT.EX ;
;NOW LOOK AT FLAGS TO SEE IF ANY CLEAN-UP IS NECESSARY AFTER
; THIS EDIT INSTRUCTION.
SKIPN BISBW0 ;SEE IF WE NEED ZERO TEST FOR BLANKING
JRST CHKMIN ;NOPE, CHECK FOR INSERT LEADING MINUS
;FALL THRU TO CODE TO GENERATE BLANK WITH ZERO
; THAT COULD NOT BE HANDLED BY THE EDIT INSTR
;GENERATE CODE TO LOOK AT THE N.BIT OF THE FLAG AC.
; WE KNOW THAT THE DESTINATION OPERAND WANTS TO BE BLANK
; WHEN ZERO, AND THAT THE EDIT INSTRUCTION WAS NOT ABLE TO
; ASSURE THAT ALL THE FIELD WAS BLANKED OUT (IF THE OPERAND
; WAS ZERO). SO WE GENERATE CODE TO CHECK THE FLAG AND
; TO FILL IN THE DESTINATION STRING.
; WE KNOW THAT THE LEADING CHARACTERS (THE ONES WE WANT TO
; OVERWRITE) ARE ALL ASTERISKS OR ZEROS. THERE WAS A CHECK EARLIER
; (SEE BSEN01:) TO PROVE THAT.
; IF THE DESTINATION ITEM WAS SUBSCRIPTED, BISDST CONTAINS
; THE TEMP ADDRESS IN THE GENERATED CODE THAT CONTAINS THE
; BYTE POINTER TO THE DESTINATION ARGUMENT. BISBW0 CONTAINS
; THE NUMBER OF CHARACTERS TO FILL IN FROM THE BEGINNING.
; WE SPECIAL CASE THE ONE AND TWO CHARACTER FILLS, SINCE THE
; CODE IS BETTER USING IDPB'S INSTEAD OF MOVSLJ.
;
; CODE GENERATED IF THERE ARE MORE THAN TWO CHARS:
; TLNE AC4, N.BIT ;TEST FOR NON ZERO
; JRST .+6 ;NON-ZERO, SKIP CODE
; SETZB AC4, AC5 ;ZERO THE SOURCE
; MOVEI AC7, NCHARS ;SET UP THE COUNT OF CHARS
; MOVE AC10, LIT/TEMP ;GET BEGINNING OF DST STR
; EXTEND AC4, [MOVSLJ
; FILL-CHAR] ;DO EXTEND, FILLING
; PUSHJ PP, XTND.E ;ERROR CALL
;
; CODE GENERATED IF THE DESTINATION IS SUBSCRIPTED:
; TLNE AC4, N.BIT ;TEST FOR NON ZERO
; JRST .+2+BISBW0 ;SKIP THE BLANKING CODE
; MOVEI AC4, FILL-CHAR ;SET UP FILL, ZERO AC4 LH
; IDPB AC4, %TEMP ;DEPOSIT THE CHARS
; <OPTIONAL SECOND IDPB>
;
; CODE GENERATED IF THE DEST STRING IS NOT SUBSCRIPTED AND
; THERE IS ONLY ONE CHAR:
; TLNE AC4, N.BIT ;TEST FOR NON-ZERO
; JRST .+3 ;SKIP BLANKING CODE
; MOVEI AC4, FILL-CHAR ;SET UP FILL, ZERO LH OF AC4
; DPB AC4, LIT ;FILL THE DEST
;
; CODE GENERATED IF DEST STR NOT SUB AND 2 CHARS:
; TLNE AC4, N.BIT ;TEST FOR NON-ZERO
; JRST .+5 ;SKIP BLANKING CODE
; MOVEI AC4, FILL-CHAR ;SET UP FILL, ZERO LH OF AC4
; MOVE AC5, LIT ;GET DEST BYTE POINTER
; IDPB AC4, AC5 ;STORE FIRST BLANK
; IDPB AC4, AC5 ;STORE SECOND
;GENERATE THE TEST INSTRUCTION OF THE N.BIT
MOVE CH, [TLNE.+AC4+ASINC,,AS.CNB] ;SET UP INSTR
PUSHJ PP, PUTASY ;
MOVEI CH, N.BIT ;SET UP RH OF INSTR
PUSHJ PP, PUTASN ;
;GENERATE THE JRST AROUND THE MOVSLJ
MOVE CH, [JRST.+ASINC,,AS.MSC] ;
PUSHJ PP, PUTASY ;
;TEST THE SIZE TO DETERMINE HOW MUCH TO JRST
MOVE CH, BISBW0 ;GET SIZE INTO REGISTER
CAIGE CH, 3 ;FOR THREE AND MORE, NORMAL
JRST ONETWO ;SPECIAL CASE FOR ONE OR TWO BYTES
MOVEI CH, AS.DOT+6 ;WE WANT JRST .+6
PUSHJ PP, PUTASN ;
;ZERO THE SOURCE
MOVE CH, [SETZB.+AC4,,5] ;
PUSHJ PP, PUTASY ;
;SET UP COUNT OF DEST
MOVSI CH, MOVEI.+AC7 ;SET UP INSTR AND AC
HRR CH, BISBW0 ;GET THE COUNT OF CHARS
PUSHJ PP, PUTASY ;GENERATE INSTRUCTION
;GET THE BYTE POINTER INTO AC10
; TEST TO SEE IF ITS SUBSCRIPTED. IF NOT, USE POOLED
; LITERAL ALREADY GENERATED, ELSE USE TEMP.
TSWF FBSUB ;TEST TO SEE IF B SUBSCRIPTED
JRST YESSUB ;YEP, GO GET OTHER CODE
;GENERATE LITERAL (ALREADY MADE, BUT NO HANDLE. SHOULD USE
; POOLED LITERAL)
MOVE TA, [BYTLIT,,2] ;GENERATE BYTEPOINTER TO A
PUSHJ PP, STASHP ; IN POOLED AREA (FIND IT AGAIN)
PUSHJ PP, MBYTPB ;USE COMMON CODE TO DO WORK
PUSHJ PP, POOL ;CAUSE POOLING ACTION
MOVSI CH, MOV+AC10 ;MOVE TO AC10
PUSHJ PP, PUT.LD ;LAST LITERAL
SKIPN PLITPC ;CHECK THAT IT WAS POOLED
PUSHJ PP, KILL## ; IF NOT WE ARE IN TROUBLE
JRST ONWARD ;SKIP OTHER CODE, GET TO COMMON STUFF
;B IS SUBSCRIPTED, USE THE TEMP.
YESSUB: MOVE CH, [MOV+AC10+ASINC,,AS.MSC] ;
PUSHJ PP, PUTASY ;
MOVE CH, BISDST ;GET THE PLACE IT IS STORED
PUSHJ PP, PUTASN ;
ONWARD:
;NOW THAT THE ACS ARE SET UP, GENERATE THE EXTEND
; FIRST GENERATE THE LITERAL FOR THE EXTEND
MOVE TA, [XTNLIT,,1]
PUSHJ PP, STASHP ;IN THE POOLED LITERAL AREA
MOVSI TA, (MOVSLJ) ;NOW GET THE EXTEND INSTR ITSELF
PUSHJ PP, STASHQ ; INTO THE POOLED AREA
MOVE TA, [OCTLIT,,1] ;NOW OCTAL FOR THE FILL CHAR
PUSHJ PP, STASHP ;
HRRZ TA, EMODEB ;GET DEST MODE
SKIPN BISFIL ;SKIP IF NOT BLANK FILL
SKIPA TA, BISTB3(TA) ;GET SPACE OF DEST OPERAND (AND SKIP)
MOVE TA, BISTB1(TA) ;GET ASTERISK OF DEST OPERAND
HRRZ TA, TA ;CLEAR UP TA
PUSHJ PP, POOLIT ;GENERATE LITERAL
PUSHJ PP, PUTASA ;EXTEND IS IN SECOND OP CODE SET
MOVSI CH, XTND.+AC4 ;NOW THE ACTUAL INSTR
PUSHJ PP, PUT.LD ;USE LAST LITERAL
MOVE TA, ELITPC ;INCREMENT THE LIT COUNT
ADDI TA, 2 ;TWO WORD LITERAL GENERATED
SKIPN PLITPC ; ONLY IF NECESSARY
MOVEM TA, ELITPC ;
;NOW GENERATE THE CALL TO ERROR ROUTINE FOR FAILURES
PUSHJ PP, PUTASA
MOVE CH, [ERROR.+AC17,,XTND.E] ;
PUSHJ PP, PUT.EX ;
;NOW GO TO THE CHECK FOR LEADING MINUS CODE
JRST CHKMIN ;
;SPECIAL CASE ROUTINE FOR GENERATING MOVEI AC4, FILL-CHAR
; ONLY INCLUDED SINCE IT IS USED IN THREE SEPARATE PLACES,
; AND MIGHT AS WELL BE POOLED.
MVI4FL: HRRZ CH, EMODEB ;SET UP DEST MODE FOR TABLE LOOK-UP
SKIPN BISFIL ;SKIP IF NOT BLANK FILL
SKIPA CH, BISTB3(CH) ;GET SPACE OF DEST OPERAND (AND SKIP)
MOVE CH, BISTB1(CH) ;GET ASTERISK OF DEST OPERAND
HRLI CH, MOVEI.+AC4 ;SET UP LH OF CH WITH INSTR
PJRST PUTASY ;GENERATE THE INSTRUCTION
;SPECIAL CASE BLANKING OF LEADING SPACES THAT THE EDIT INSTR COULD
; NOT HANDLE. SEE PREVIOUS PAGES FOR CODE PICTURES.
; WE BELIEVE THAT "CH" CONTAINS NUMBER OF CHARS, AND THAT THE
; JRST HALF OF THE INSTR HAS BEEN GENERATED. WE MERELY NEED TO
; GENERATE AN AS.DOT+N TO PUTASN.
ONETWO: TSWT FBSUB ;CHECK FOR SUBSCRIPTED ITEM
JRST ONE2NS ;ONE-TWO, NOT SUBSCRIPTED
;CH HAS NUMBER OF CHARS, GENERATE THE RH OF THE JRST
ADDI CH, AS.DOT+2 ;ADD FLAGS FIELD AND EXTRA INSTRS
PUSHJ PP, PUTASN ;JRST .+N COMPLETE.
;NOW GENERATE THE MOVE TO AC4 OF THE FILL CHAR.
; REMEMBER THAT WE USE AC4 TO CLEAR OLD FLAG BITS
; SO THAT LEADING MINUS WONT POSSIBLY BE SET
HRRZ CH, EMODEB ;GET DEST MODE
PUSHJ PP, MVI4FL ;GENERATE MOVEI AC4, FILL-CHAR
;NOW GENERATE THE CORRECT NUMBER OF IDPB'S
MOVE TA, BISBW0 ;GET NUMBER OF TIMES TO IDPB
MOVE CH, [IDPB.+AC4+ASINC,,AS.MSC] ;
PUSHJ PP, PUTASY ;
MOVE CH, BISDST ;GET THE TEMP ADDRESS
PUSHJ PP, PUTASN ;
SOJG TA, .-4 ;LOOP FOR SECOND IDPB
;NOW JOIN COMMON CODE LOOKING FOR LEADING MINUS PROBLEMS
JRST CHKMIN
;CODE TO HANDLE NON-SUBSCRIPTED CASE. TWO DIFFERENT CODE
; PICTURES. ONE FOR ONE CHAR, THE OTHER FOR TWO CHARS.
ONE2NS: CAIE CH, 1 ;TEST FOR ONE CHAR CASE
JRST ONE2N2 ;ONETWO NOT SUBSCRIPTED, TWO CHARS
;ONE CHAR. WE NEED TO MERELY GENERATE DPB
; FIRST REMEMBER TO COMPLETE THE JRST .+N
MOVEI CH, AS.DOT+3 ;WE WANT TO SKIP THREE CHARS
PUSHJ PP, PUTASN ;ALL DONE WITH THE JRST
;NOW GET THE FILL CHAR
PUSHJ PP, MVI4FL ;GENERATE MOVEI AC4, FILL-CHAR
;NOW GENERATE LITERAL TO FIRST CHAR OF THE STRING
; IN THE POOLED LITERALS AREA OF GENERATED CODE.
; THEN A DEPOSITE BYTE OF AC4 TO THAT LITERAL.
PUSHJ PP, DPB4LT ;USE POOLED CODE FROM CHKMIN
;NOW GO TO THE CODE TO CHECK ON LEADING MINUS
JRST CHKMIN
;THIS CODE GENERATES NON-SUBSCRIPTED CASE, TWO CHARS
ONE2N2: CAIE CH, 2 ;SPECIAL CASE CHECK
PUSHJ PP, KILL## ; SO WE DONT GET LOST
;FIRST FINISH THE JRST OF .+N FOR THE RIGHT AMOUNT
MOVEI CH, AS.DOT+5 ;WE WANT .+5
PUSHJ PP, PUTASN ;FINISH THE JRST
;NOW GENERATE THE MOVE TO AC4 OF THE FILL CHAR
PUSHJ PP, MVI4FL ;USE COMMON CODE
;NOW GENERATE BYTE POINTER TO BEGINNING OF DEST,
; COMPLAIN IF NOT POOLED (IT BETTER BE)
; AND THEN MOVE IT INTO AC5 (ANY AC WILL DO).
MOVE TA, [BYTLIT,,2] ;GENERATE BYTEPOINTER TO A
PUSHJ PP, STASHP ; IN POOLED AREA (FIND IT AGAIN)
PUSHJ PP, MBYTPB ;USE COMMON CODE TO DO WORK
PUSHJ PP, POOL ;CAUSE POOLING ACTION
MOVSI CH, MOV+AC5 ;MOVE TO AC5
PUSHJ PP, PUT.LD ; USINGLAST LITERAL
SKIPN PLITPC ;CHECK THAT IT WAS POOLED
PUSHJ PP, KILL## ; IF NOT WE ARE IN TROUBLE
;NOW GENERATE THE ILDB'S UP TO TWO.
MOVE TA, BISBW0 ;GET THE COUNT
MOVE CH, [IDPB.+AC4,,5] ;GET THE INSTR
PUSHJ PP, PUTASY ;GENERATE THE INSTRUCTION
SOJG TA, .-1 ;GO BACK FOR SECOND ONE
;NOW FALL THRU THE CHKMIN TO LOOK FOR LEADING MINUS SIGNS
;CODE TO PUT A LEADING MINUS SIGN ON THE DESTINATION OPERAND
; IF IT IS NEGATIVE. WE DETERMINE IF IT WAS NEGATIVE BY LOOKING
; AT THE M.BIT IN THE FLAG AC. IF IT WAS NEGATIVE, WE GENERATE A
; DEPOSIT BYTE TO PLACE THE MINUS SIGN THERE. NOTE THAT
; THE BLANK WITH ZERO IS DONE FIRST AND LEAVES AC4 (IN THE
; GENERATED CODE) ZERO. THUS THE TEST WILL FAIL AND NO
; LEADING SIGN WILL BE REPLACED.
; CODE GENERATED:
; TLNN AC4, M.BIT ;SKIP IF MINUS
; JRST .+3 ;SKIP OVER CODE
; MOVEI AC4, MINUS-SIGN ;GET THE CHARACTER
; DPB AC4, LIT ;PUT CHAR AWAY
;
; THE LAST INSTRUCTION WILL BE DIFFERENT IF THE DESTINATION
; OPERAND WAS SUBSCRIPTED, AS THE SET-UP CODE FOR THE EDIT
; WILL HAVE SAVED THE DESTINATION BYTE POINTER IN A TEMP
; THIS SAVES A SECOND SUBSCRIPT CALCULATION.
; THE CODE WILL LOOK LIKE:
; TLNN AC4, M.BIT ;SKIP IF MINUS
; JRST .+3 ;SKIP OVER CODE
; MOVEI AC4, MINUS-SIGN ;GET THE CHARACTER IN AN AC
; IDPB AC4, TEMP ;STORE MINUS SIGN
CHKMIN: SKIPN BISMIN ;ONLY DO THIS IF NECESSARY
POPJ PP, ;NOT NECESSARY. GO BACK TO CALLER
;GENERATE THE BIT TEST
MOVE CH, [TLNN.+AC4+ASINC,,AS.CNB] ;GET INSTR
PUSHJ PP, PUTASY ;
MOVEI CH, M.BIT ;NOW GET BIT INTO RH OF INSTR
PUSHJ PP, PUTASN ;
;NOW GENERATE THE JRST AROUND THE MINUS-SETTING CODE
MOVE CH, [JRST.+ASINC,,AS.MSC] ;THE INSTR HALF
PUSHJ PP, PUTASY ;
MOVEI CH, AS.DOT+3 ;THE PLACE TO GO IF NO MINUS SIGN
PUSHJ PP, PUTASN ;
;NOW GET THE CHARACTER INTO AC4
MOVSI CH, MOVEI.+AC4 ;SET UP LEFT HALF OF CODE
HRRZ TA, EMODEB ;GET MODE OF DESTINATION
HRR CH, BISTB2(TA) ;GET CORRECT MINUS SIGN
PUSHJ PP, PUTASY ;GENERATE INSTRUCTION
;BEGIN BRANCHING FOR SEPARATE GENERATED CODE DEPENDING
; WHETHER THE SECOND OPERAND WAS SUBSCRIPTED. EITHER
; USE THE TEMP OR GENERATE A LITERAL TO MAKE BETTER CODE.
TSWF FBSUB ;SKIP IF NOT SUBSCRIPTED
JRST BSMNSB ;BIS MINUS SUBSCRIPT SPECIAL CASE
;NORMAL CASE
; THERE IS A LABEL HERE SINCE WE USE THIS EXACT CODE ELSEWHERE
; THE ONLY RESTRICTION IS THAT IT BE DPB AC4, DEST, INTO THE
; FIRST BYTE OF DEST (DPB BYTE POINTER, NOT IDPB)
DPB4LT: MOVE TA, [BYTLIT,,2] ;GENERATE BYTE POINTER TO B IN LITTAB
PUSHJ PP, STASHP ; IN THE POOLED AREA
SETOM MAKBPB## ;WE WANT LDB BYTE POINTER
PUSHJ PP, MBYTPB ;USE COMMON CODE
PUSHJ PP, POOL ;CAUSE POOLING ACTION
MOVSI CH, DPB.+AC4 ;SET UP LH OF INSTR
PUSHJ PP, PUT.LD ;GENERATE INSTR USING LATEST LITERAL
SKIPN PLITPC
AOS ELITPC ;BUMP LITERAL COUNT OF NECESSARY
POPJ PP, ;RETURN TO CALLER (DOBISM)
BSMNSB: ;BIS MINUS SUBSCRIPT SPECIAL CASE
; GENERATE INSTR TO USE TEMP. DONT WORRY ABOUT SAVING IT.
; WE DONT USE IT AGAIN.
MOVE CH, [IDPB.+AC4+ASINC,,AS.MSC] ;SET UP INSTR
PUSHJ PP, PUTASY ;
MOVE CH, BISDST ;CONTAINS TEMP ADDR OF DST BYT PTR
PJRST PUTASN ;
;THATS ALL FOLKS-- NO START ADDRESS
END ;BISGEN.MAC