1
0
mirror of https://github.com/PDP-10/its.git synced 2026-01-15 08:03:19 +00:00

Don't split two-word directives across blocks.

When:

- MIDAS is writing a "standard data" block to a REL file;
- it wants to write a 76 (local-to-global/rename/expunge) directive,
  which needs two words of data;
- and there's only one word of space left in the block;

it wrote the first one to the current block, and the second word to the
start of the next block. STINK 1/201 doesn't understand this, and treats
the second word as codebits for the next block, misinterpreting the
directives for that block; this results in missing symbols or junk being
loaded into memory.

For other two-word directives, MIDAS sets the IRCONT flag for all words
except the last one, to prevent the block from being flushed until the
directive is complete. Do the same for 76 directives.

Also fix CNSTA, which unset IRCONT *after* its last word; this was
probably harmless because it will be the first directive in a block so
can't be split.
This commit is contained in:
Adam Sampson 2018-04-23 16:41:34 +01:00 committed by Adam Sampson
parent c17ee29314
commit 1bb6ced04c

View File

@ -2998,12 +2998,14 @@ OUTDE1: TLNE FF,FLPPSS
PLOGLO: SKIPGE CONTRL
RET
PUSH P,A
TRO I,IRCONT ;Don't end block between the two words
PUSHJ P,PBITS7
MOVEI A,CLGLO
PUSHJ P,PBITS
TLO SYM,400000 ;SAY THIS IS NEW STYLE RQ,
PUSHJ P,OUTSM0 ;PUNCH "OLD NAME" = SYMTAB IDX,
TLC SYM,440000 ;SAY MAKE GLOBAL, OUTPUT ACTUAL NAME OF SYM.
TRZ I,IRCONT
PUSHJ P,OUTSM
JRST POPAJ
@ -3936,8 +3938,8 @@ CNSTA: HRRZ T,PBCON
TLO A,100000 ;RELOCATE
PUSHJ P,$OUTPT
HRRZ A,1(T)
PUSHJ P,$OUTPT ;OUTPUT VALUE, FIRST LOCATION IN AREA
TRZ I,IRCONT
PUSHJ P,$OUTPT ;OUTPUT VALUE, FIRST LOCATION IN AREA
CNSTDA: MOVSI A,CTDEF
IORM A,2(T) ;CALL IT DEFINED
CNSTD: TRNE FF,FRPSS2
@ -6266,12 +6268,14 @@ IFN CREFSW,XCT CRFDEF
SKIPL CONTRL ;IF RELOCATABLE ANDLOCAL SYMBOL,
CAIL A,DEFGVR_-33.
RET
TRO I,IRCONT ;Don't end block between the two words
PUSHJ P,PBITS7 ;TELL STINK TO EXPUNGE SYM.
MOVEI A,CLGLO
PUSHJ P,PBITS
TLO SYM,400000 ;SAY IS NEW TYPE RQ,
PUSHJ P,OUTSM0
MOVSI A,400000 ;NEW NAME NULL => DELETE.
TRZ I,IRCONT
JRST $OUTPT
;EQUAL SYM1,SYM2 ;DEFINE SYM1 SAME AS SYM2.