10'Maze War Dungeon Roamer (final, compressed), N.Landsteiner 01/2016 20DEFSNGA:DEFINTB-Z:SCREEN0,0:CLS:?"Setting up...":GOTO200 35'== time critical subroutines == 30'viewport draw commands 31OUTPC,VK(K+C1):RETURN 32B=VK(K+C2):FORJ=C0TOVK(K+C1):OUTPD,B:NEXT:RETURN 33FORJ=VK(K+C1)TOVK(K+C2):OUTPD,BL(J):NEXT:RETURN 34IFVETHENOUTPD,VK(K+C1)ELSEOUTPD,VK(K+C2) 35RETURN 36FORJ=C0TOVK(K+C1):OUTPD,C0:NEXT:RETURN 37FORJ=VK(K+C1)TOVK(K+C2):OUTPD,C0:NEXT:RETURN 39'subroutine: render-viewport 40ONGGOSUB910,920,930,930,940 42OUTPB,C0 44OUTPA,PL:OUTPC,PU:OUTPA,PR:OUTPC,PQ 46FORI=C0TOC7 48IFW0=ITHENGOSUB100:I=C7:GOTO76 50IFW1=ITHENGOSUB90 52IFVL(I)=HL(I)THEN64 54VM=VL(I)ANDC1:VE=VL(I)ANDC2 56FORVS=C0TOC1:OUTPA,PV(VS) 58FORK=VI(VS,I,VM,C0)TOVI(VS,I,VM,C1)STEPC3 60ONVK(K)GOSUB31,32,33,34 62NEXT:NEXT 64IFVR(I)=HR(I)THEN76 66VM=VR(I)ANDC1:VE=VR(I)ANDC2 68FORVS=C2TOC3:OUTPA,PV(VS) 70FORK=VI(VS,I,VM,C0)TOVI(VS,I,VM,C1)STEPC3 72ONVK(K)GOSUB31,32,33,34 74NEXT:NEXT 76NEXT 78FORI=C0TOC7:HL(I)=VL(I):HR(I)=VR(I):NEXT:W1=W0 80OUTPA,PR:OUTPC,PU 82ONGGOSUB960,970,980,980,990 84RETURN 89'erase a wall 90IFW1=C7THENRETURN 92FORVS=C0TOC3:OUTPA,PV(VS):K=VI(VS,W1,C2,C0):OUTPC,VK(K+C1) 94FORJ=C0TOVK(K+C4):OUTPD,C0:NEXT 96NEXT:RETURN 98'draw blocking wall; handle left side 100IFVL(W0)=C4THEN112 102VM=VL(W0)ANDC1:VE=VL(W0)ANDC2 104FORVS=C0TOC1:OUTPA,PV(VS) 106FORK=VI(VS,W0,VM,C0)TOVI(VS,W0,VM,C1)STEPC3 108ONVK(K)GOSUB31,32,33,34 110NEXT:NEXT:GOTO124 112VE=C1:'passage to the left and ahead 114FORVS=C0TOC1:OUTPA,PV(VS) 116FORK=VI(VS,W0,C1,C0)TOVI(VS,W0,C1,C1)STEPC3 118ONVK(K)GOSUB31,36,37,34 120NEXT:NEXT 122'handle right side 124IFVR(W0)=C4THEN136 126VM=VR(W0)ANDC1:VE=VL(W0)ANDC2 128FORVS=C2TOC3:OUTPA,PV(VS) 130FORK=VI(VS,W0,VM,C0)TOVI(VS,W0,VM,C1)STEPC3 132ONVK(K)GOSUB31,32,33,34 134NEXT:NEXT:GOTO148 136VE=C1:'passage to the right and ahead 138FORVS=C2TOC3:OUTPA,PV(VS) 140FORK=VI(VS,W0,C1,C0)TOVI(VS,W0,C1,C1)STEPC3 142ONVK(K)GOSUB31,36,37,34 144NEXT:NEXT 146'finally draw the wall 148IFW0=C7THENRETURN 150FORVS=C0TOC3:OUTPA,PV(VS) 152FORK=VI(VS,W0,C2,C0)TOVI(VS,W0,C2,C1)STEPC3 154ONVK(K)GOSUB31,32,33,34 156NEXT:NEXT 158RETURN 160'== setup, execution starts here == 195'G: 1=PC-8201A, 2=M10 (w/o modem), 3=Model 100, 4=Model 102, 5=KC85 200B=PEEK(1):G=-(B=148)-(B=35)*2-(B=51)*3-(B=167)*4-(B=225)*5 205IFG=0THENSCREEN0,1:?"Sorry, model not supported. Gestalt:";B:END 210IFG=1THENAK=65128!ELSEIFG=2THENAK=65389!ELSEIFG=5THENAK=65387!ELSEAK=65450! 215C0=0:C1=1:C2=2:C3=3:C4=4:C5=5:C6=6:C7=7:C8=8:C9=9 220CA=10:CC=12:CE=14:CN=49:CL=50:CP=64:CM=-1 225UC=223:LC=97:CK=27:ES=27:EB=32:E8=17 230PA=185:PB=186:PC=254:PD=255:DIMSA(9),SB(9):SG=-1:SH=0 235FORI=C0TOC9:READB1,B2:SA(I)=B1:SB(I)=B2:NEXT 240DX=0:DY=0:DIMDX(3),DY(3):FORI=C0TOC3:READB1,B2:DX(I)=B1:DY(I)=B2:NEXT 245DL=0:DR=0:DIMDL(3),DR(3) 250FORI=C0TOC3:READB:DL(I)=B:NEXT 255FORI=C0TOC3:READB:DR(I)=B:NEXT 260DIMDD(3):FORI=C0TOC3:READB:DD(I)=B:NEXT 269'setup the maze 270DIMSM(3,3,2):FORI=C0TOC3:FORY=C0TOC3:READB1,B2:SM(I,Y,C1)=B1:SM(I,Y,C0)=B2:NEXT:NEXT 275DIMST(3,1,1):FORI=C0TOC3:FORY=C0TOC1:READB1,B2:ST(I,Y,C1)=B1:ST(I,Y,C0)=B2:NEXT:NEXT 280MW=31:MH=15:ML=132:MT=5:DIMM(MH,MW),BM(C9) 285FORY=C0TOC9:READB:BM(Y)=B:NEXT 290FORY=C0TOMH:FORX=C0TOMW:READB:M(Y,X)=B:NEXT:NEXT 295GOSUB1010:GOSUB1110:'setup viewport 299'== main == 300CLS:GOSUB700:MX=11:MY=7:MD=0:DX=DX(MD):DY=DY(MD):DL=DL(MD):DR=DR(MD) 310?CHR$(ES);"Y";CHR$(EB+C7);CHR$(EB+22);"Crsr,IJKL,Q:quit"; 315GOSUB460:GOSUB1770:GOSUB1510:GOSUB40 319'main loop 320B=PEEK(AK):IFB=C0THEN320 330K=PEEK(AK+B):POKEAK,C0:IFK>CKTHENONK-CKGOTO500,520,540,560 340IFK>=LCTHENK=KANDUC 350ONINSTR("JLKI Q",CHR$(K))GOTO520,500,560,540,580,590 360GOTO320 398'== subroutines == 399'segement/pos select 400SH=SG:SG=SX\CL:IFSY>C3THENSG=SG+C5 410IF(SG<>SH)THENOUTPA,SA(SG):OUTPB,SB(SG) 420OUTPC,(SYMODC4)*CPORSXMODCL:RETURN 449'clear/draw marker 450X=ML+MX*C3:Y=MT+MY*C3:FORI=C0TOC3:PRESET(X+SM(MD,I,C0),Y+SM(MD,I,C1)):NEXT:RETURN 460X=ML+MX*C3:Y=MT+MY*C3:FORI=C0TOC3:PSET(X+SM(MD,I,C0),Y+SM(MD,I,C1)):NEXT:RETURN 470X=ML+MX*C3:Y=MT+MY*C3:PRESET(X+ST(MD,T0,C0),Y+ST(MD,T0,C1)):PSET(X+ST(MD,T1,C0),Y+ST(MD,T1,C1)):RETURN 499'key handling (right, left, bkwd, fwd, fire, quit) 500T0=C1:T1=C0:GOSUB470:MD=DR:DX=DX(MD):DY=DY(MD):DL=DL(MD):DR=DR(MD):GOTO610 520MD=DL:T0=C0:T1=C1:GOSUB470:DX=DX(MD):DY=DY(MD):DL=DL(MD):DR=DR(MD):GOTO610 540GOSUB450:MX=MX+DX:MY=MY+DY:IFM(MY,MX)=C0THENMX=MX-DX:MY=MY-DY:GOSUB460:GOTO320 550GOSUB460:GOTO610 560GOSUB450:MX=MX-DX:MY=MY-DY:IFM(MY,MX)=C0THENMX=MX+DX:MY=MY+DY:GOSUB460:GOTO320 570GOSUB460:GOTO610 580GOTO320:'shoot 590SCREEN0,1:CLS:?"- Bye -":END 600'view port: get path and display it 610GOSUB1510:GOSUB40:GOTO320 699'maze display 700SY=MT\C8:Y0=0:D=MTMODC8+C2:ONGGOSUB910,920,930,930,940 710Y1=Y0+C1:Y2=Y0+C2:Y3=Y0+C3:B0=BM(D) 720IF(Y1<=MH)AND(DMHTHEN840 830D=(D+C1)MODC3:SY=SY+C1:GOTO710 840ONGGOSUB960,970,980,980,990:RETURN 900'disable interrupts 910EXEC30437:RETURN 920CALL29558:RETURN 930CALL30300:RETURN 940CALL29450:RETURN 950'enable interrupts 960EXEC29888:RETURN 970CALL28998:RETURN 980CALL29756:RETURN 990CALL28906:RETURN 1000'setup viewport 1010PL=33:PR=66:'LCD blocks 0+5, 1+6 1020PU=59:PQ=58:'LCD counter setting increment/decrement 1030DIMPV(3):FORI=0TO3:READB:PV(I)=B:NEXT 1040DIMBL(29):FORI=0TO29:READB:BL(I)=B:NEXT 1050DIMBP(33):FORI=0TO33:READB:BP(I)=B:NEXT 1060DIMVL(7),VR(7),HL(7),HR(7) 1070DIMVI(3,7,2,1):'segment,level,mode,idx-from/idx-to 1080DIMVK(1392) 1090RETURN 1100'compile-viewport-instr 1110I4=C0 1120READB:IFBVL(I-C1)THENVL(I-C1)=VL(I-C1)ORC2 1560IFVR(I)<>VR(I-C1)THENVR(I-C1)=VR(I-C1)ORC2 1570IFBANDVFTHEN1610 1580IFVL(I)=C0THENVL(I)=C2ELSEIFM(Y+DY(DL),X+DX(DL))ANDVFTHENVL(I)=C4ELSEVL(I)=C1 1590IFVR(I)=C0THENVR(I)=C2ELSEIFM(Y+DY(DR),X+DX(DR))ANDVFTHENVR(I)=C4ELSEVR(I)=C1 1600W0=I:FW=I+C1:I=C7:GOTO1620 1610X=X+DX:Y=Y+DY 1620NEXT 1630IFW0=W1THENW1=CM 1640IF(FW)AND(FW