@ColinD, you and me both.

Rich is a long-suffering code guru, who has put up with my feeble CE hacking attempts many times over the years. It's his own fault for writing such a cracking extra colours patch five years ago ... which I've been building on like a house of cards ever since!
Your method looks good, but I have to resort to hacking on what's there. As Rich says, ideally one day someone will take the disassemblies we have of the game and take the next step to create a modern assembler source file which can be modified at will. Until then, my mission is to hack away on the original and bring it as many new features as possible. Unfortunately, the game was never designed with joystick support in mind, so inadvertantly causes problems on the Electron by overwriting the workspace used by the Plus 1 to provide joystick functionality. Hence, my attempts to move things out of the way.
OK,
So here's what I've come up with. Hopefully Rich and/or Martin can sanity check this for me.
This is my pseudocode ...
Code:
IF !(pointerstable[X+1]) > &D69 THEN &D69=&BB
IF !(pointerstable[X+1]) > &D6A THEN &D6A=&80
IF !(pointerstable[X+1]) > &D6B THEN &D6B=&00
IF !(pointerstable[X+1]) > &D6C THEN &D6C=&90
IF !(pointerstable[X+1]) > &D6D THEN &D6D=&01
IF !(pointerstable[X+1]) > &D6E THEN &D6E=&D6
IF !(pointerstable[X+1]) > &D6F THEN &D6F=&F1
Which is meant to say: if the start address of the level /above/ the one we've moved out of the way, is above each value of the rest of the plus 1's workspace that I'm interested in (&0D68-&0D6F), then reset that value. If the next level starts on top of one of those values, then leave them as they are.
So I've come up with the following assembler. Does it look anywhere close?
And, judging from the size of this routine, is there any neater way of doing it that I'm missing?
Hmmm ... hang on ... I've just compared this routine with the test in Rich's original routine, and it seems identical ... so maybe mine isn't doing greater than (>) like it should. Maybe it's doing <= like Rich's ... errr ...
Sam.
Code:
LDA #&69
CMP pointerstable+2,X MOD 256
LDA #&0D
SBC pointerstable+3,X DIV 256
BCC resetnine
.checka
LDA #&6A
CMP pointerstable+2,X MOD 256
LDA #&0D
SBC pointerstable+3,X DIV 256
BCC reseta
.checkb
LDA #&6B
CMP pointerstable+2,X MOD 256
LDA #&0D
SBC pointerstable+3,X DIV 256
BCC resetb
.checkc
LDA #&6C
CMP pointerstable+2,X MOD 256
LDA #&0D
SBC pointerstable+3,X DIV 256
BCC resetc
.checkd
LDA #&6D
CMP pointerstable+2,X MOD 256
LDA #&0D
SBC pointerstable+3,X DIV 256
BCC resetd
.checke
LDA #&6E
CMP pointerstable+2,X MOD 256
LDA #&0D
SBC pointerstable+3,X DIV 256
BCC resete
.checkf
LDA #&6F
CMP pointerstable+2,X MOD 256
LDA #&0D
SBC pointerstable+3,X DIV 256
BCC resetf
.finish
JMP <backtoCE>
.resetnine
LDA #&BB
STA &0D69
JMP checka
.reseta
LDA #&80
STA &0D6A
JMP checkb
.resetb
LDA #&00
STA &0D6B
JMP checkc
.resetc
LDA #&90
STA &0D6C
JMP checkd
.resetd
LDA #&01
STA &0D6D
JMP checke
.resete
LDA #&D6
STA &0D6E
JMP checkf
.resetf
LDA #&F1
STA &0D6F
JMP finish