From 1bb6ced04c424874e078097b4d125a93c2e01504 Mon Sep 17 00:00:00 2001 From: Adam Sampson Date: Mon, 23 Apr 2018 16:41:34 +0100 Subject: [PATCH] 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. --- src/mudsys/midas.324 | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/mudsys/midas.324 b/src/mudsys/midas.324 index fe652f92..7f80ec74 100644 --- a/src/mudsys/midas.324 +++ b/src/mudsys/midas.324 @@ -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.