A little update and I have now covered Levels 4 & 5 now.
Level 4 like Level 3 hasn't required any changes necessary to run correctly on all, but in the spirit of turning into a single game, here it is:
8 ENV 1,5,3,5:ENV 2,15,-1,4:ENT 1,15,-1,4
9 GOSUB 9200
1005 FOR f=1 TO 3500:NEXT f
1010 CLS:INK 0,2:INK 1,26:BORDER 2:MODE 1
1018 cv=2
1020 FOR f=1 TO 40:FOR q=1 TO cv:LOCATE f,q:PAPER 1:PRINT" ":GOSUB 1021:NEXT q:LOCATE f,q:PAPER 0:PRINT CHR$(132):NEXT f:GOTO 1025
1021 cv=cv+INT(RND*3)-1:IF cv>3 THEN cv=3
1022 IF cv<1 THEN cv=1
1023 RETURN
1025 INK 2,14
1030 FOR f=1 TO 40:LOCATE f,20:PEN 0:PAPER 1:PRINT CHR$(132):NEXT f:PEN 1:PAPER 0
1035 WINDOW #1,1,40,21,25:PAPER #1,2:CLS#1
1040 rea=INT(RND*15)+3:LOCATE rea,19:PEN 2:PRINT CHR$(137):PRINT CHR$(22)CHR$(1):LOCATE rea,19:PEN 3:PRINT CHR$(134):INK 3,0,26:PEN 3:LOCATE rea,19:PRINT CHR$(141):PRINT CHR$(22)CHR$(0):PEN 1
1050 x=39:bo=0
1060 LOCATE x,5:PEN 1:PRINT CHR$(129)CHR$(130):a=x
1065 IF INKEY(9)=0 AND bo=0 THEN bo=1:fa=6
1070 IF bo=1 THEN LOCATE x,fa:PRINT CHR$(136):SOUND 4,10+(fa*2),1,5
1075 SOUND 1,1500,1,5,0,0,10
1080 x=x-1:IF x=0 THEN END
1085 LOCATE a,5:PRINT" ":IF bo=1 THEN LOCATE a,fa:PRINT" "
1090 IF bo=1 THEN fa=fa+1:IF fa=19 THEN 1100
1095 GOTO 1060
1100 IF x=rea THEN INK 9,5:INK 10,23:PEN#1,9:PAPER#1,10:FOR d=1 TO 8:SOUND 4,106,-1,0,1,1,15:NEXT:CLS#1:LOCATE#1,6,1:PRINT#1," W E L L D O N E ! ":LOCATE #1,1,3:PRINT#1," P h a s e > 4 < C o m p l e t e d . ":END
1110 END
9200 SYMBOL AFTER 129
9210 RESTORE 9220:FOR q=0 TO 19:READ a,b,c,d,e,f,g,h:SYMBOL 129+q,a,b,c,d,e,f,g,h:NEXT q:RETURN
9220 DATA 170,8,62,79,127,63,146,127,130,13,14,251,244,192,0,128,255,254,250,248,248,240,208,128,255,158,12,8,8,0,0,0,255,127,95,31,31,15,11,1,0,0,36,0,36,0,0,0,254,254,254,0,191,191,191,0,126,24,44,94,191,191,223,126,60,126,255,126,255,126,255,255
9230 DATA 60,102,223,191,191,255,126,60,28,56,28,56,28,56,28,56,24,12,6,6,6,70,126,0,0,0,129,0,129,0,0,0,0,0,0,24,36,36,24,189,171,213,171,213,171,213,171,213,60,36,24,126,24,60,36,102,24,36,36,24,189,126,36,102,170,255,255,136,85,34,85,136
9240 DATA 12,240,14,129,255,255,255,255,0,0,0,192,248,255,255,255
Level 5 however returns to the problematic TXT RD CHAR which only works properly on the 464, here's the original code:
8 ENV 1,5,3,5:ENV 2,15,-1,4:ENT 1,15,-1,4
9 GOSUB 9200:GOSUB 9000:GOTO 1300
250 IF x>=20 THEN RETURN
251 LOCATE x+2,y:CALL &A000:IF CHR$(PEEK(&A007))<>" " THEN RETURN
260 x=x+1:RETURN
300 IF y=1 THEN RETURN
310 LOCATE x,y-1:CALL &A000:IF CHR$(PEEK(&A007))<>" " THEN RETURN
320 IF fs=0 THEN LOCATE x+1,y-1:CALL &A000:IF CHR$(PEEK(&A007))<>" " THEN RETURN
330 y=y-1:RETURN
350 IF y=20 THEN RETURN
360 LOCATE x,y+1:CALL &A000:IF CHR$(PEEK(&A007))<>" " THEN RETURN
370 IF fs=0 THEN LOCATE x+1,y+1:CALL &A000:IF CHR$(PEEK(&A007))<>" " THEN RETURN
380 y=y+1:RETURN
400 IF x<=1 THEN RETURN
401 LOCATE x-1,y:CALL &A000:IF CHR$(PEEK(&A007))<>" " THEN RETURN
410 x=x-1:RETURN
450 REM
455 LOCATE x,y+1:CALL &A000:a$=CHR$(PEEK(&A007))
460 PAPER 0:PEN 8:LOCATE x,y+1:PRINT a$:FOR f=26 TO 0 STEP -1:INK 8,f:SOUND 1,930,4,4,0,0,4:FOR q=1 TO 11:NEXT q:NEXT f
470 LOCATE x,y+1:PRINT" ":PEN 1:RETURN
1300 fs=1:FOR f=1 TO 3500:NEXT f
1301 pu=0
1305 BORDER 3:INK 0,3:INK 1,26:PEN 1:PAPER 0:CLS:MODE 0
1307 WINDOW#1,1,20,21,25:INK 9,5:INK 10,23:PEN #1,9:PAPER #1,10:CLS#1
1310 INK 2,15:INK 3,5
1315 PEN 2:PAPER 3:FOR f=15 TO 20:FOR q=1 TO 6:LOCATE q,f:PRINT CHR$(135):NEXT q:FOR q=15 TO 20:LOCATE q,f:PRINT CHR$(135):NEXT q:NEXT f:PEN 1:PAPER 0
1320 FOR f=2 TO 10 STEP 2:FOR q=1 TO 20:LOCATE q,f:INK 4,14:PEN 4:PAPER 0:PRINT CHR$(132):NEXT q:FOR o=1 TO 2:PEN 1:LOCATE INT(RND*18)+2,f:PRINT" ":NEXT o:NEXT f
1321 INK 6,2:FOR f=1 TO 10:PEN 4:PAPER 6:LOCATE 1,f:PRINT CHR$(143):LOCATE 20,f:PRINT CHR$(143):NEXT f
1330 PEN 5:PAPER 0:INK 5,26:LOCATE 7,15:PRINT CHR$(146)
1337 mo=1
1340 br=8:x=20:y=14
1345 xc=INT(RND*18)+2:yc=INT((RND*5)+1)*2:LOCATE x,y:CALL &A000:IF PEEK(&A007)=132 THEN GOTO 1345
1346 LOCATE xc,yc:PEN 5:PAPER 0:PRINT CHR$(146)
1350 LOCATE x,y:PEN 4:PRINT CHR$(144):PEN 1:a=x:b=y
1351 LOCATE mo,14:INK 7,20:PEN 7:PRINT CHR$(145):mox=mo
1352 IF INKEY(9)=0 THEN GOSUB 300:GOTO 1355
1353 GOSUB 350
1354 mo=mo+(1/18)
1355 IF INKEY(63)=0 THEN x=x-1:GOSUB 250:x=x+1
1360 IF INKEY(71)=0 THEN GOSUB 400
1365 LOCATE a,b:PEN 1:PAPER 0:PRINT" "
1366 LOCATE mox,14:PEN 1:PRINT" "
1370 IF pu=0 AND x=xc AND y=yc-1 THEN pu=1:LOCATE xc,yc:PRINT" ":sc=sc+5
1371 IF br=15 THEN CLS#1:LOCATE#1,6,1:PRINT#1,"WELL DONE!":LOCATE #1,1,3:PRINT#1,"Phase >5< Completed.":FOR d=1 TO 8:SOUND 4,106,-1,0,1,1,15:NEXT:FOR f=1 TO 3500:NEXT f:END
1372 IF INT(mo)=br THEN FOR f=15 TO 20:LOCATE br,f:PRINT CHR$(144):SOUND 1,f*3,1,7:FOR d=1 TO 5:NEXT d:LOCATE br,f:PRINT" ":NEXT f:END
1375 IF pu=1 AND x=br AND y=14 THEN LOCATE br,15:PEN 5:PAPER 0:PRINT CHR$(146):pu=0:br=br+1:sc=sc+5:GOTO 1345
1380 GOTO 1350
9000 RESTORE 9010:FOR f=0 TO 6:READ a$:POKE &A000+f,VAL("&"+a$):NEXT:RETURN
9010 DATA cd,60,bb,32,07,a0,c9
9200 SYMBOL AFTER 129
9210 RESTORE 9220:FOR q=0 TO 19:READ a,b,c,d,e,f,g,h:SYMBOL 129+q,a,b,c,d,e,f,g,h:NEXT q:RETURN
9220 DATA 170,8,62,79,127,63,146,127,130,13,14,251,244,192,0,128,255,254,250,248,248,240,208,128,255,158,12,8,8,0,0,0,255,127,95,31,31,15,11,1,0,0,36,0,36,0,0,0,254,254,254,0,191,191,191,0,126,24,44,94,191,191,223,126,60,126,255,126,255,126,255,255
9230 DATA 60,102,223,191,191,255,126,60,28,56,28,56,28,56,28,56,24,12,6,6,6,70,126,0,0,0,129,0,129,0,0,0,0,0,0,24,36,36,24,189,171,213,171,213,171,213,171,213,60,36,24,126,24,60,36,102,24,36,36,24,189,126,36,102,170,255,255,136,85,34,85,136
9240 DATA 12,240,14,129,255,255,255,255,0,0,0,192,248,255,255,255
Actually I made one modification from the original, which is on line 1354. The original had something like:
1354 mo=mo+(1/12)
which controls how quickly the Alien moves. Altering the fraction to 1/18 has made this level a lot fairer, true I've probably made the level a lot easier, though with 8 stages to get to the 5th and bomb out from a seemly impossible level would be very frustrating.
You may notice that this level also returns to the TXT RD CHAR code which is used for the 1st Level. In my revised version for this level, no alterations were necessary, however you may note I have removed the LOCATE statements from lines 251,310,360,401, these were simply not necessary to have as they are checks from within the Array, the result is another level working on all CPCs.
8 ENV 1,5,3,5:ENV 2,15,-1,4:ENT 1,15,-1,4
9 GOSUB 9200:GOTO 1300
250 IF x>=20 THEN RETURN
251 IF sc$(x+2,y)<>"" THEN RETURN
260 x=x+1:RETURN
300 IF y=1 THEN RETURN
310 IF sc$(x,y-1)<>"" THEN RETURN
320 IF fs=0 THEN IF sc$(x+1,y-1)<>"" THEN RETURN
330 y=y-1:RETURN
350 IF y=20 THEN RETURN
360 IF sc$(x,y+1)<>"" THEN RETURN
370 IF fs=0 THEN IF sc$(x+1,y+1)<>"" THEN RETURN
380 y=y+1:RETURN
400 IF x<=1 THEN RETURN
401 IF sc$(x-1,y)<>"" THEN RETURN
410 x=x-1:RETURN
450 REM
455 LOCATE x,y+1:a$=sc$(x,y+1)
460 PAPER 0:PEN 8:LOCATE x,y+1:PRINT a$:FOR f=26 TO 0 STEP -1:INK 8,f:SOUND 1,930,4,4,0,0,4:FOR q=1 TO 11:NEXT q:NEXT f
470 LOCATE x,y+1:PRINT" ":sc$(x,y+1)="":PEN 1:RETURN
1300 DIM sc$(20,20):fs=1:FOR f=1 TO 3500:NEXT f
1301 pu=0
1305 BORDER 3:INK 0,3:INK 1,26:PEN 1:PAPER 0:CLS:MODE 0
1307 WINDOW#1,1,20,21,25:INK 9,5:INK 10,23:PEN #1,9:PAPER #1,10:CLS#1
1310 INK 2,15:INK 3,5
1315 PEN 2:PAPER 3:FOR f=15 TO 20:FOR q=1 TO 6:LOCATE q,f:PRINT CHR$(135):sc$(q,f)=CHR$(135):NEXT q:FOR q=15 TO 20:LOCATE q,f:PRINT CHR$(135):sc$(q,f)=CHR$(135):NEXT q:NEXT f:PEN 1:PAPER 0
1320 FOR f=2 TO 10 STEP 2:FOR q=1 TO 20:LOCATE q,f:INK 4,14:PEN 4:PAPER 0:PRINT CHR$(132):sc$(q,f)=CHR$(132):NEXT q:FOR o=1 TO 2:PEN 1:s1=INT(RND*18)+2:LOCATE s1,f:PRINT" ":sc$(s1,f)="":NEXT o:NEXT f
1321 INK 6,2:FOR f=1 TO 10:PEN 4:PAPER 6:LOCATE 1,f:PRINT CHR$(143):sc$(1,f)=CHR$(143):LOCATE 20,f:PRINT CHR$(143):sc$(20,f)=CHR$(143):NEXT f
1330 PEN 5:PAPER 0:INK 5,26:LOCATE 7,15:PRINT CHR$(146):sc$(7,15)=CHR$(146)
1337 mo=1
1340 br=8:x=20:y=14
1345 xc=INT(RND*18)+2:yc=INT((RND*5)+1)*2:IF sc$(x,y)=CHR$(132) THEN GOTO 1345
1346 LOCATE xc,yc:PEN 5:PAPER 0:PRINT CHR$(146):sc$(xc,yc)=CHR$(146)
1350 LOCATE x,y:PEN 4:PRINT CHR$(144):sc$(x,y)=CHR$(144):PEN 1:a=x:b=y
1351 LOCATE mo,14:INK 7,20:PEN 7:PRINT CHR$(145):sc$(mo,14)=CHR$(145):mox=mo
1352 IF INKEY(0)=0 THEN GOSUB 300:GOTO 1355
1353 GOSUB 350
1354 mo=mo+(1/18)
1355 IF INKEY(1)=0 THEN x=x-1:GOSUB 250:x=x+1
1360 IF INKEY(8)=0 THEN GOSUB 400
1365 LOCATE a,b:PEN 1:PAPER 0:PRINT" ":sc$(a,b)=""
1366 LOCATE mox,14:PEN 1:PRINT" ":sc$(mox,14)=""
1370 IF pu=0 AND x=xc AND y=yc-1 THEN pu=1:LOCATE xc,yc:PRINT" ":sc$(xc,yc)="":sc=sc+5
1371 IF br=15 THEN CLS#1:LOCATE#1,6,1:PRINT#1,"WELL DONE!":LOCATE #1,1,3:PRINT#1,"Phase >5< Completed.":FOR d=1 TO 8:SOUND 4,106,-1,0,1,1,15:NEXT:FOR f=1 TO 3500:NEXT f:ERASE sc$:END
1372 IF INT(mo)=br THEN FOR f=15 TO 20:LOCATE br,f:PRINT CHR$(144):sc$(br,f)=CHR$(144):SOUND 1,f*3,1,7:FOR d=1 TO 5:NEXT d:LOCATE br,f:PRINT" ":sc$(br,f)="":NEXT f:END
1375 IF pu=1 AND x=br AND y=14 THEN LOCATE br,15:PEN 5:PAPER 0:PRINT CHR$(146):sc$(br,15)=CHR$(146):pu=0:br=br+1:sc=sc+5:GOTO 1345
1380 GOTO 1350
9200 SYMBOL AFTER 129
9210 RESTORE 9220:FOR q=0 TO 19:READ a,b,c,d,e,f,g,h:SYMBOL 129+q,a,b,c,d,e,f,g,h:NEXT q:RETURN
9220 DATA 170,8,62,79,127,63,146,127,130,13,14,251,244,192,0,128,255,254,250,248,248,240,208,128,255,158,12,8,8,0,0,0,255,127,95,31,31,15,11,1,0,0,36,0,36,0,0,0,254,254,254,0,191,191,191,0,126,24,44,94,191,191,223,126,60,126,255,126,255,126,255,255
9230 DATA 60,102,223,191,191,255,126,60,28,56,28,56,28,56,28,56,24,12,6,6,6,70,126,0,0,0,129,0,129,0,0,0,0,0,0,24,36,36,24,189,171,213,171,213,171,213,171,213,60,36,24,126,24,60,36,102,24,36,36,24,189,126,36,102,170,255,255,136,85,34,85,136
9240 DATA 12,240,14,129,255,255,255,255,0,0,0,192,248,255,255,255
Please note I also made some changes to the Keys, so Z,X & Copy have been remapped to Left, Right & Up Cursor Keys.