2013.4.11
前へ
次へ
ホームページトップへ戻る

復活!CP/M ワンボードマイコンでCP/Mを!
CP/MがTK−80互換のワンボードマイコンの上で復活します
ND80ZVとMYCPU80の上でCP/Mが走ります

[第367回]


●STARTREK for ZB3BASIC

今回から、このところ苦闘しておりましたことの顛末を書く予定だったのでありますが、急遽予定変更になってしまいました。
毎度のことで申し訳有りません。

前回も書きましたとおりCP/M互換DOSの上でMBASICを走らせて、そこでSTARTREKのプログラムをロードしてRUNさせることができました。
ところが今朝になりまして、突然思いついてしまったのでありますね。
ええ。
いつものことで、悪魔のささやきであります。

Y様からいただいたSTARTREKプログラムは前回も書きましたように、MBASIC用のプログラムです。
BASICといえば、MBASICではなくとも、おお。わがZB3BASICがあるじゃありませんか。
そりゃあもちろん、MBASICとZB3BASICとでは文法に相違がありますから、そのままでは走らせることはできません。
しかしそこのところはZB3BASICに合うように書き直せば、ひょっとしたら走ってくれるのでは?
これを悪魔のささやきといわずしてなんといたしましょう。
思いついたらやってみなくては済まない性分でありますから、さっそくにとりかかったのでありますが。

ええ。
思ったよりもホネでありまして、たっぷりと丸1日をつぶしてしまいました。
やっと、つい先ほどになって、なんとか動くようになりました。

中日電工製のBASICはハンパなもんじゃありませんよー、というところをお見せいたします。

こちらがZB3BASIC用に改造しましたSTARTREKプログラムです。

10 'need this line
200 FOR XX=1 TO 6:PRINT:NEXT XX:'**
205 PRINT SPACE$(20);"THE USS ENTERPRISE --- NCC-1701"
210 PRINT:FOR YY=1 TO 40 STEP 2:'**
221 PRINT SPACE$(YY);"                  ,------*------,"
222 PRINT SPACE$(YY);"  ,-------------   '---  ------'"
223 PRINT SPACE$(YY);"   '-------- --'      / /"
224 PRINT SPACE$(YY);"       ,---' '-------/ /--,"
225 PRINT SPACE$(YY);"        '----------------'":PRINT:PRINT
230 NEXT YY
240 PRINT:PRINT:PRINT:PRINT:PRINT
260 CLEAR
270 Z$="                         "
330 DIM G(8,8),C(9,2),K(3,3),N(3),Z(8,8),D(8)
370 GOSUB *RND:T=INT(RD*20+20)*100:T0=T
380 GOSUB *RND:T9=25+INT(RD*10):D0=0:E=3000:E0=E
440 P=10:P0=P:S9=200:S=0:B9=0:K9=0:X$=" ":X0$=" IS "
470 DEF FND(DD)=SQR((K(I,1)-S1)^2+(K(I,2)-S2)^2)
490 GOSUB *RFNC:Q1=A%
500 GOSUB *RFNC:Q2=A%
510 GOSUB *RFNC:S1=A%
520 GOSUB *RFNC:S2=A%
530 FOR I=1 TO 9:C(I,1)=0:C(I,2)=0:NEXT I
540 C(3,1)=-1:C(2,1)=-1:C(4,1)=-1:C(4,2)=-1:C(5,2)=-1:C(6,2)=-1
550'dummy
600 C(1,2)=1:C(2,2)=1:C(6,1)=1:C(7,1)=1:C(8,1)=1:C(8,2)=1:C(9,2)=1
670 FOR I=1 TO 8:D(I)=0:NEXT I
710 A1$="NAVSRSLRSPHATORSHEDAMCOMXXX"
820 FOR I=1 TO 8:FOR J=1 TO 8:K3=0:Z(I,J)=0
830 GOSUB *RND:R1=RD
850 IF R1>0.98 THEN K3=3:K9=K9+3:GOTO 980
860 IF R1>0.95 THEN K3=2:K9=K9+2:GOTO 980
870 IF R1>0.8 THEN K3=1:K9=K9+1
980 GOSUB *RND:B3=0:IF RD>0.96 THEN B3=1:B9=B9+1
1040 GOSUB *RFNC:G(I,J)=K3*100+B3*10+A%
1050 NEXT J
1060 NEXT I
1070 IF K9>T9 THEN T9=K9+1
1100 IF B9<>0 THEN GOTO 1200
1150 IF G(Q1,Q2)<200 THEN G(Q1,Q2)=G(Q1,Q2)+100:K9=K9+1
1160 B9=1:G(Q1,Q2)=G(Q1,Q2)+10
1170 GOSUB *RFNC:Q1=A%
1180 GOSUB *RFNC:Q2=A%
1200 K7=K9:IF B9<>1 THEN X$="S":X0$=" ARE "
1230 PRINT"YOUR ORDERS ARE AS FOLLOWS:"
1235 PRINT "--------------------------"
1240 PRINT"   DESTROY THE ";K9;" KLINGON WARSHIPS WHICH HAVE INVADED"
1250 PRINT"   THE GALAXY BEFORE THEY CAN ATTACK ";
1255 PRINT "FEDERATION HEADQUARTERS."
1260 PRINT "THIS GIVES YOU ";T9;" DAYS. THERE ";X0$:'***
1270 PRINT"  ";B9;" STARBASE";X$;" IN THE GALAXY ";
1275 PRINT "FOR RESUPPLYING YOUR SHIP."
1280 PRINT:PRINT "ARE YOU READY TO ACCEPT COMMAND ";
1285 PRINT "('N' FOR INSTRUCTIONS)";
1300 INPUT "?"I5$
1305 IF (LEFT$(I5$,1)="Y")+(LEFT$(I5$,1)="y") THEN GOTO 1310 ELSE 1280:'**
1310 '
1320 Z4=Q1:Z5=Q2:K3=0:B3=0:S3=0:G5=0
1330 GOSUB *RND:D4=0.5*RD:Z(Q1,Q2)=G(Q1,Q2)
1390 IF (Q1<1)+(Q1>8)+(Q2<1)+(Q2>8) THEN GOTO 1600
1430 GOSUB 9030:PRINT:IF T0<>T THEN GOTO 1490
1460 PRINT"YOUR MISSION BEGINS WITH ";
1465 PRINT "YOUR STARSHIP LOCATED"
1470 PRINT"IN THE GALACTIC QUADRANT, '";G2$;"'.":GOTO 1500
1490 PRINT"NOW ENTERING ";G2$;" QUADRANT . . ."
1500 PRINT:K3=INT(G(Q1,Q2)*0.01):B3=INT(G(Q1,Q2)*0.1)-10*K3
1540 S3=G(Q1,Q2)-100*K3-10*B3:IF K3=0 THEN GOTO 1590
1560 PRINT SPACE$(3);"  COMBAT AREA      CONDITION RED  "
1570 IF S>200 THEN PRINT:GOTO 1590
1580 PRINT SPACE$(3);"      SHIELDS DANGEROUSLY LOW     "
1585 PRINT
1590 FOR I=1 TO 3:K(I,1)=0:K(I,2)=0:NEXT I
1600 FOR I=1 TO 3:K(I,3)=0:NEXT I
1610 '
1620 USR($8007):'clr Q$
1680 A$="<E>":Z1=S1:Z2=S2:GOSUB 8670:IF K3<1 THEN GOTO 1820
1720 FOR I=1 TO K3:GOSUB 8590:A$="+K+":Z1=R1:Z2=R2
1780 GOSUB 8670:K(I,1)=R1:K(I,2)=R2
1790 GOSUB *RND:K(I,3)=S9*(0.5+RD):NEXT I
1820 IF B3<1 THEN GOTO 1910
1880 GOSUB 8590:A$=">B<":Z1=R1:B4=R1:Z2=R2:B5=R2:GOSUB 8670
1910 FOR I=1 TO S3:GOSUB 8590:A$=" * ":Z1=R1:Z2=R2:GOSUB 8670:NEXT I
1980 GOSUB 6430
1990 IF (S+E>10)*((E>10)+(D(7)=0)) THEN GOTO 2060
2020 PRINT:PRINT SPACE$(10);"** FATAL ERROR **"
2025 PRINT"YOU'VE JUST STRANDED YOUR SHIP IN SPACE.":'*******
2030 PRINT"YOU HAVE INSUFFICIENT MANEUVERING ENERGY,"
2040 PRINT"AND SHIELD CONTROL IS PRESENTLY INCAPABLE OF "
2050 PRINT"CROSS-CIRCUITING TO ENGINE ROOM!!":PRINT:GOTO 6220
2060 PRINT:INPUT"COMMAND?"A$:PRINT
2080 I=1
2090 IF LEFT$(A$,3)<>MID$(A1$,3*I-2,3)THEN GOTO 2160
2140 ON I GOTO 2300,1980,4000,4260,4700,5530,5690,7290,6270
2160 I=I+1:IF I<=9 GOTO 2090
2165 PRINT"ENTER ONE OF THE FOLLOWING:"
2170 PRINT "--------------------------"
2180 PRINT"  NAV  (TO SET COURSE)"
2190 PRINT"  SRS  (FOR SHORT RANGE SENSOR SCAN)"
2200 PRINT"  LRS  (FOR LONG RANGE SENSOR SCAN)"
2210 PRINT"  PHA  (TO FIRE PHASERS)"
2220 PRINT"  TOR  (TO FIRE PHOTON TORPEDOES)"
2230 PRINT"  SHE  (TO RAISE OR LOWER SHIELDS)"
2240 PRINT"  DAM  (FOR DAMAGE CONTROL REPORTS)"
2250 PRINT"  COM  (TO CALL ON LIBRARY-COMPUTER)"
2260 PRINT"  XXX  (TO RESIGN YOUR COMMAND)":PRINT:GOTO 1990
2300 INPUT"COURSE (0-9)?"C1:IF C1=9 THEN C1=1
2310 IF (C1>=1)*(C1<9) THEN GOTO 2350
2330 PRINT"   LT. SULU: 'INCORRECT COURSE";
2340 PRINT" DATA, SIR!'":GOTO 1990
2350 X$="8":IF D(1)<0 THEN X$="0.2"
2360 PRINT"WARP FACTOR (0-";X$;")";
2370 INPUT "?"W1:PRINT:IF (D(1)<0)*(W1>0.2) THEN GOTO 2470
2380 IF (W1>0)*(W1<=8) THEN GOTO 2490
2390 IF W1=0 THEN GOTO 1990
2420 PRINT"   CHIEF ENGINEER SCOTT: 'THE ENGINES WON'T TAKE";
2430 PRINT" WARP?"W1;"!'":GOTO 1990
2470 PRINT"WARP ENGINES ARE DAMAGED.";
2475 PRINT"  MAXIUM SPEED = WARP 0.2":'***
2480 GOTO 1990
2490 NN=INT(W1*8+0.5)
2495 IF (E-NN)>=0 THEN GOTO 2590
2500 PRINT"ENGINEERING:  'INSUFFICIENT ENERGY AVAILABLE"
2530 IF (S<NN-E)+(D(7)<0) THEN GOTO 1990
2550 PRINT"DEFLECTOR CONTROL ROOM:  ";S;" UNITS OF ENERGY"
2560 PRINT"                          PRESENTLY DEPLOYED TO SHIELDS."
2570 GOTO 1990
2590 FOR I=1 TO K3:IF K(I,3)=0 THEN GOTO 2700
2610 A$="   ":Z1=K(I,1):Z2=K(I,2):GOSUB 8670:GOSUB 8590
2660 K(I,1)=Z1:K(I,2)=Z2:A$="+K+":GOSUB 8670
2700 NEXT I
2710 GOSUB 6000:D1=0:D6=W1:IF W1>=1 THEN D6=1
2770 FOR I=1 TO 8:IF D(I)>=0 THEN GOTO 2880
2790 D(I)=D(I)+D6:IF (D(I)>-0.1)*(D(I)<0) THEN D(I)=-0.1:GOTO 2880
2800 IF D(I)<0 THEN GOTO 2880
2810 IF D1<>1 THEN D1=1:PRINT"DAMAGE CONTROL REPORT:  ";
2840 PRINT SPACE$(8);:R1=I:GOSUB 8790:PRINT G2$;" REPAIR COMPLETED."
2880 NEXT I
2890 GOSUB*RND:IF RD>0.2 THEN GOTO 3070
2910 GOSUB *RFNC:R1=A%
2920 GOSUB *RND:IF RD>=0.6 THEN GOTO 3000
2930 GOSUB *RND:D(R1)=D(R1)-(RD*5+1)
2940 PRINT"DAMAGE CONTROL REPORT:  ";:'***
2960 GOSUB 8790:PRINT G2$;" DAMAGED":PRINT:GOTO 3070
3000 GOSUB *RND:D(R1)=D(R1)+RD*3+1:PRINT"DAMAGE CONTROL REPORT:  ";
3030 GOSUB 8790:PRINT G2$;" STATE OF REPAIR IMPROVED":PRINT
3070 A$="   ":Z1=INT(S1):Z2=INT(S2):GOSUB 8670
3110 X1=C(C1,1)+(C(C1+1,1)-C(C1,1))*(C1-INT(C1)):X=S1:Y=S2
3140 X2=C(C1,2)+(C(C1+1,2)-C(C1,2))*(C1-INT(C1)):Q4=Q1:Q5=Q2
3170 I=1
3175 S1=S1+X1:S2=S2+X2
3180 IF (S1<1)+(S1>=9)+(S2<1)+(S2>=9) THEN I=NN+1:SW=1:GOTO 3500
3240 '
3250 S8=INT(S1)*24+INT(S2)*3-26
3260 A%=S8:USR($800A):IF LEFT$(B$,2)="  "THEN GOTO 3360:'***
3320 S1=INT(S1-X1):S2=INT(S2-X2):PRINT"WARP ENGINES SHUT DOWN AT ";
3350 PRINT"SECTOR";S1;",";S2;" DUE TO BAD NAVAGATION":GOTO 3370:'***
3360 I=I+1:IF I<=NN THEN GOTO 3175
3365 S1=INT(S1):S2=INT(S2)
3370 A$="<E>":Z1=INT(S1):Z2=INT(S2):GOSUB 8670:GOSUB 3910:T8=1:'***
3430 IF W1<1 THEN T8=0.1*INT(10*W1)
3450 T=T+T8:IF T>T0+T9 THEN GOTO 6220
3480 GOTO 1980
3500 X=8*Q1+X+NN*X1:Y=8*Q2+Y+NN*X2:Q1=INT(X/8):Q2=INT(Y/8):S1=INT(X-Q1*8)
3550 S2=INT(Y-Q2*8):IF S1=0 THEN Q1=Q1-1:S1=8
3590 IF S2=0 THEN Q2=Q2-1:S2=8
3620 X5=0:IF Q1<1 THEN X5=1:Q1=1:S1=1
3670 IF Q1>8 THEN X5=1:Q1=8:S1=8
3710 IF Q2<1 THEN X5=1:Q2=1:S2=1
3750 IF Q2>8 THEN X5=1:Q2=8:S2=8
3790 IF X5=0 THEN GOTO 3860
3800 PRINT"LT. UHURA: MESSAGE FROM ";
3805 PRINT "STARFLEET COMMAND --"
3810 PRINT"  'PERMISSION TO ATTEMPT CROSSING";
3815 PRINT " OF GALACTIC PERIMETER"
3820 PRINT"  IS HEREBY *DENIED*.  SHUT";
3825 PRINT" DOWN YOUR ENGINES.'"
3830 PRINT"CHIEF ENGINEER SCOTT:  'WARP ENGINES SHUT DOWN"
3840 PRINT"  AT SECTOR";S1;",";S2;"OF QUADRANT";
3845 PRINT Q1;",";Q2;".'":'***********
3850 IF T>T0+T9 THEN GOTO 6220
3860 IF (8*Q1+Q2)=(8*Q4+Q5) THEN GOTO 3370
3870 T=T+1:GOSUB 3910:GOTO 1320
3910 E=E-NN-10
3920 IF E>=0 THEN RETURN
3930 PRINT"SHIELD CONTROL SUPPLIES ENERGY TO COMPLETE THE MANEUVER."
3940 S=S+E:E=0:IF S<=0 THEN S=0
3980 RETURN
4000 IF D(3)<0 THEN PRINT"LONG RANGE SENSORS ARE INOPERABLE.":GOTO 1990
4030 PRINT"LONG RANGE SCAN FOR QUADRANT ";Q1;",";Q2:PRINT
4040 O1$="-------------------":PRINT O1$
4060 FOR I=Q1-1 TO Q1+1:N(1)=-1:N(2)=-2:N(3)=-3:FOR J=Q2-1 TO Q2+1
4120 IF (I>0)*(I<9)*(J>0)*(J<9) THEN N(J-Q2+2)=G(I,J):Z(I,J)=G(I,J)
4180 NEXT J
4190 FOR L=1 TO 3:PRINT"| ";:IF N(L)<0 THEN PRINT"*** ";:GOTO 4230
4210 PRINT RIGHT$(STR$(N(L)+1000),3);" ";
4230 NEXT L
4240 PRINT"|":PRINT O1$
4250 NEXT I
4255 GOTO 1990
4260 IF D(4)<0 THEN PRINT"PHASERS INOPERATIVE.":GOTO 1990
4265 IF K3>0 THEN GOTO 4330
4270 PRINT"SCIENCE OFFICER SPOCK:  '";
4275 PRINT "SENSORS SHOW NO ENEMY SHIPS"
4280 PRINT"                         ";
4285 PRINT"IN THIS QUADRANT'":GOTO 1990
4330 IF D(8)<0 THEN PRINT"COMPUTER FAILURE HAMPERS ACCURACY."
4350 PRINT"PHASERS LOCKED ON TARGET;  ";
4360 PRINT"ENERGY AVAILABLE =";E;"UNITS"
4370 INPUT"NUMBER OF UNITS TO FIRE?"X:IF X<=0 THEN GOTO 1990
4400 IF (E-X)<0 THEN GOTO 4360
4410 GOSUB *RND:E=E-X:IF D(7)<0 THEN X=X*RD
4450 H1=INT(X/K3)
4460 I=1
4470 IF K(I,3)<=0 THEN GOTO 4670
4480 GOSUB *RND:H=INT((H1/FND(0))*(RD+2))
4485 IF H>(0.15*K(I,3)) THEN GOTO 4530
4500 PRINT"SENSORS SHOW NO DAMAGE TO ENEMY AT ";K(I,1);",";
4510 PRINT K(I,2);".":GOTO 4670:'*********
4530 K(I,3)=K(I,3)-H:PRINT H;"UNIT HIT ON KLINGON AT SECTOR";
4540 PRINT K(I,1);",";:'**********
4550 PRINT K(I,2);".":IF K(I,3)<=0 THEN PRINT
4555 PRINT "*** KLINGON DESTROYED ***":PRINT:GOTO 4580:'**
4560 PRINT" (SENSORS SHOW";K(I,3);"UNITS REMAINING)":GOTO 4670:'***
4580 K3=K3-1:K9=K9-1:Z1=K(I,1):Z2=K(I,2):A$="   ":GOSUB 8670
4650 K(I,3)=0:G(Q1,Q2)=G(Q1,Q2)-100:Z(Q1,Q2)=G(Q1,Q2):IF K9<=0 THEN GOTO 6370
4670 I=I+1:IF I<=3 GOTO 4470
4680 GOSUB 6000:GOTO 1990
4700 IF P<=0 THEN PRINT"ALL PHOTON TORPEDOES EXPENDED.":GOTO 1990
4730 IF D(5)<0 THEN PRINT"PHOTON TUBES ARE NOT OPERATIONAL.":GOTO 1990
4760 INPUT"PHOTON TORPEDO COURSE (1-9)?"C1:IF C1=9 THEN C1=1
4780 IF (C1>=1)*(C1<9) THEN GOTO 4850
4790 PRINT"ENSIGN CHEKOV:  'INCORRECT COURSE DATA, SIR!'"
4800 GOTO 1990
4850 X1=C(C1,1)+(C(C1+1,1)-C(C1,1))*(C1-INT(C1)):E=E-2:P=P-1
4860 X2=C(C1,2)+(C(C1+1,2)-C(C1,2))*(C1-INT(C1)):X=S1:Y=S2
4910 PRINT"TORPEDO TRACK:"
4920 X=X+X1:Y=Y+X2:X3=INT(X+0.5):Y3=INT(Y+0.5)
4960 IF (X3<1)+(X3>8)+(Y3<1)+(Y3>8) THEN GOTO 5490
5000 PRINT"               ";X3;",";Y3:A$="   ":Z1=X:Z2=Y:GOSUB 8830
5050 IF Z3<>0 THEN GOTO 4920
5060 A$="+K+":Z1=X:Z2=Y:GOSUB 8830:IF Z3=0 THEN GOTO 5210
5110 PRINT:PRINT "*** KLINGON DESTROYED ***":PRINT
5115 K3=K3-1:K9=K9-1:IF K9<=0 THEN GOTO 6370:'***********
5150 I=1
5160 IF (X3=K(I,1))*(Y3=K(I,2))THEN GOTO 5190
5180 I=I+1:IF I<=3 GOTO 5160
5185 I=3
5190 K(I,3)=0:GOTO 5430
5210 A$=" * ":Z1=X:Z2=Y:GOSUB 8830:IF Z3=0 THEN GOTO 5280
5260 PRINT"STAR AT";X3;",";Y3;" ABSORBED TORPEDO ENERGY.":GOSUB 6000:GOTO 1990
5280 A$=">!<":Z1=X:Z2=Y:GOSUB 8830:IF Z3=0 THEN GOTO 4760
5330 PRINT "*** STARBASE DESTROYED ***":B3=B3-1:B9=B9-1
5360 IF (B9>0)+(K9>T-T0-T9) THEN GOTO 5400
5370 PRINT"THAT DOES IT, CAPTAIN!!  YOU ARE HEREBY RELIEVED OF COMMAND"
5380 PRINT"AND SENTENCED TO 99 STARDATES AT HARD LABOR ON CYGNUS 12!!"
5390 GOTO 6270
5400 PRINT"STARFLEET COMMAND REVIEWING YOUR RECORD TO CONSIDER"
5410 PRINT"COURT MARTIAL!":D0=0
5430 Z1=X:Z2=Y:A$="   ":GOSUB 8670
5470 G(Q1,Q2)=K3*100+B3*10+S3:Z(Q1,Q2)=G(Q1,Q2):GOSUB 6000:GOTO 1990
5490 PRINT"TORPEDO MISSED.":PRINT:GOSUB 6000:GOTO 1990
5530 IF D(7)<0 THEN PRINT"SHIELD CONTROL INOPERABLE.":GOTO 1990
5560 PRINT"ENERGY AVAILABLE =";E+S;:INPUT"NUMBER OF UNITS TO SHIELDS?"X
5580 IF (X<0)+(S=X) THEN PRINT"<SHIELDS UNCHANGED>":GOTO 1990
5590 IF X<=(E+S) THEN GOTO 5630
5600 PRINT"SHIELD CONTROL:  'THIS IS NOT THE FEDERATION TREASURY.'" 
5610 PRINT"<SHIELDS UNCHANGED>":GOTO 1990
5630 E=E+S-X:S=X:PRINT"DEFLECTOR CONTROL ROOM:"
5660 PRINT"  'SHIELDS NOW AT";INT(S);"UNITS PER YOUR COMMAND.'":GOTO 1990
5690 IF D(6)>=0 THEN GOTO 5910
5700 PRINT"DAMAGE CONTROL REPORT NOT AVAILABLE.":IF D0=0 THEN GOTO 1990
5720 D3=0:FOR I=1 TO 8:IF D(I)<0 THEN D3=D3+0.1
5760 NEXT I
5770 IF D3=0 THEN GOTO 1990
5780 PRINT:D3=D3+D4:IF D3>=1 THEN D3=0.9
5810 PRINT"TECHNICIANS STANDING BY TO EFFECT REPAIRS TO YOUR SHIP;"
5820 PRINT"ESTIMATED TIME TO REPAIR:";0.01*INT(100*D3);"STARDATES."
5840 INPUT"WILL YOU AUTHORIZE THE REPAIR ORDER (Y/N)?"A$
5860 IF A$<>"Y"THEN GOTO 1990
5870 FOR I=1 TO 8:IF D(I)<0 THEN D(I)=0
5890 NEXT I
5900 T=T+D3+0.1
5910 PRINT:PRINT"DEVICE             STATE OF REPAIR"
5915 PRINT"------             ---------------":FOR R1=1 TO 8:'*******
5920 GOSUB 8790:PRINT G2$;LEFT$(Z$,25-LEN(G2$));INT(D(R1)*100)*0.01
5950 NEXT R1
5960 PRINT:IF D0<>0 THEN GOTO 5720
5980 GOTO 1990
6000 IF K3<=0 THEN RETURN
6010 IF D0<>0 THEN PRINT"STARBASE SHIELDS PROTECT THE ENTERPRISE.":RETURN
6040 I=1
6050 IF K(I,3)<=0 THEN GOTO 6200
6060 GOSUB *RND:H=INT((K(I,3)/FND(1))*(2+RD))
6070 GOSUB *RND:S=S-H:K(I,3)=K(I,3)/(3+RD)
6080 PRINT:PRINT H;"UNIT HIT ON ENTERPRISE FROM SECTOR";K(I,1);
6085 PRINT ",";K(I,2);".":'**********
6090 IF S<=0 THEN GOTO 6240
6100 PRINT"      <SHIELDS DOWN TO";S;"UNITS>":IF H<20 THEN GOTO 6200
6120 GOSUB *RND:IF (RD>0.6)+(H/S<=0.02) THEN GOTO 6200
6140 GOSUB *RFNC:R1=A%
6150 GOSUB *RND:D(R1)=D(R1)-H/S-0.5*RD:GOSUB 8790
6170 PRINT"DAMAGE CONTROL: '";G2$;" DAMAGED BY THE HIT'"
6200 I=I+1:IF I<=0 GOTO 6050
6210 RETURN
6220 PRINT:PRINT"IT IS STARDATE";T;".":PRINT:GOTO 6270:'***
6240 PRINT:PRINT"THE ENTERPRISE HAS BEEN DESTROYED.";
6245 PRINT "  THE FEDERATION ";
6250 PRINT"WILL BE CONQUERED.":GOTO 6220
6270 PRINT"THERE WERE ";K9;" KLINGON BATTLE CRUISERS LEFT AT"
6280 PRINT"THE END OF YOUR MISSION."
6290 PRINT:PRINT:IF B9=0 THEN GOTO 6360
6310 PRINT"THE FEDERATION IS IN NEED";
6315 PRINT " OF A NEW STARSHIP COMMANDER"
6320 PRINT"FOR A SIMILAR MISSION -- ";
6325 PRINT "IF THERE IS A VOLUNTEER,"
6330 INPUT"LET HIM STEP FORWARD AND ENTER 'AYE'?"A$:IF A$="AYE"THEN GOTO 10
6360 'RUN "MENU"
6370 PRINT"CONGRATULATIONS, CAPTAIN!";
6375 PRINT "  THE LAST KLINGON BATTLE CRUISER"
6380 PRINT"MENACING THE FEDERATION ";
6390 PRINT "HAS BEEN DESTROYED.":PRINT
6400 PRINT"YOUR EFFICIENCY RATING IS ";
6405 IF T=T0 THEN PRINT 0 ELSE PRINT 1000*(K7/(T-T0))^2
6410 GOTO 6290
6430 FOR I=S1-1 TO S1+1:FOR J=S2-1 TO S2+1
6450 IF (INT(I+0.5)<1)+(INT(I+0.5)>8)+(INT(J+0.5)<1)+(INT(J+0.5)>8) GOTO 6540
6490 A$=">B<":Z1=I:Z2=J:GOSUB 8830:IF Z3=1 THEN I=10:J=10:GOTO 6540
6540 NEXT J
6550 NEXT I
6555 IF Z3=1 THEN GOTO 6580
6560 D0=0:GOTO 6650
6580 D0=1:C$="DOCKED":E=E0:P=P0
6620 PRINT"SHIELDS DROPPED FOR DOCKING PURPOSES.":S=0:GOTO 6720
6650 IF K3>0 THEN C$="*RED*":GOTO 6720
6660 C$="GREEN":IF E<(E0*0.1) THEN C$="YELLOW"
6720 IF D(2)>=0 THEN GOTO 6770
6730 PRINT:PRINT"*** SHORT RANGE SENSORS ARE OUT ***":PRINT:RETURN
6770 O1$="   +--1---2---3---4---5---6---7---8-+":PRINT O1$
6780 I=1
6790 PRINT " ";I;" |";
6820 '
6821 FOR J=(I-1)*24+1 TO(I-1)*24+23 STEP 3
6826 A%=J:USR($800A):PRINT" ";B$;
6827 NEXT J
6828 PRINT"| ";I;:'***********
6830 ON I GOTO 6850,6900,6960,7020,7070,7120,7180,7240
6850 '
6855 PRINT"        STARDATE          ";
6856 PRINT \4;INT(T);".";\1;INT((T-INT(T)+0.1)*10)
6860 GOTO 7260:'*******
6900 PRINT"        CONDITION          ";
6910 IF C$="*RED*" THEN GOTO 6950:'******
6920 IF C$="DOCKED" THEN PRINT "DOCKED" ELSE PRINT C$:'***
6930 GOTO 7260:'*****
6950 PRINT "*RED*":GOTO 7260:'********
6960 '
6965 PRINT"        QUADRANT           ";Q1;",";Q2:GOTO 7260
7020 '
7025 PRINT"        SECTOR             ";S1;",";S2:GOTO 7260
7070 PRINT"        PHOTON TORPEDOES  ";:PRINT \5;INT(P):GOTO 7260
7120 PRINT"        TOTAL ENERGY      ";:PRINT \5;INT(E+S):GOTO 7260
7180 PRINT"        SHIELDS           ";:PRINT \5;INT(S):GOTO 7260
7240 PRINT"        KLINGONS REMAINING";:PRINT \5;INT(K9)
7260 I=I+1:IF I<=8 GOTO 6790
7270 PRINT O1$:RETURN
7290 IF D(8)<0 THEN PRINT"COMPUTER DISABLED.":GOTO 1990
7320 INPUT"COMPUTER ACTIVE AND AWAITING COMMAND?"A:IF A<0 THEN GOTO 1990
7350 PRINT:H8=1:ON A+1 GOTO 7540,7900,8070,8500,8150,7400
7360 PRINT"FUNCTIONS AVAILABLE FROM";
7361 PRINT" LIBRARY-COMPUTER:"
7365 PRINT "-------------------------------";
7366 PRINT "----------":PRINT
7370 PRINT"   0 = CUMULATIVE GALTIC RECORD"
7372 PRINT"   1 = STATUS REPORT"
7374 PRINT"   2 = PHOTON TORPEDO DATA"
7376 PRINT"   3 = STARBASE NAV DATA"
7378 PRINT"   4 = DIRECTION/DISTANCE CALCULATOR"
7380 PRINT"   5 = GALAXY 'REGION NAME' MAP":PRINT:GOTO 7320
7400 H8=0:G5=1:PRINT"                        THE GALAXY":GOTO 7550
7540 REM
7542 REM
7543 PRINT:PRINT"       ";
7544 PRINT"COMPUTER RECORD OF GALAXY FOR QUADRANT";Q1;",";Q2
7546 PRINT
7550 PRINT"     1     2     3     4 ";
7555 PRINT"    5     6     7     8":'***
7560 O1$="  +-----+-----+-----+-----+"
7565 O2$="-----+-----+-----+-----+"
7570 PRINT O1$;O2$:I=1
7580 PRINT I;" ";:IF H8=0 THEN GOTO 7740
7630 FOR J=1 TO 8:PRINT"| ";:IF Z(I,J)=0 THEN PRINT"*** ";:GOTO 7720
7700 PRINT RIGHT$(STR$(Z(I,J)+1000),3);" ";
7720 IF J=8 THEN PRINT "|"
7721 NEXT J
7730 GOTO 7850
7740 Z4=I:Z5=1:GOSUB 9030:J0=INT(15-0.5*LEN(G2$)):PRINT SPACE$(J0);G2$;
7750 J2=LEN(G2$)
7800 Z5=5:GOSUB 9030:J0=INT(39-0.5*LEN(G2$))-J0-J2
7810 PRINT SPACE$(J0);G2$
7850 PRINT O1$;O2$
7860 I=I+1:IF I<=8 GOTO 7580
7870 PRINT:GOTO 1990
7900 PRINT "   STATUS REPORT:":PRINT "   -------------"
7910 X$=" ":IF K9>1 THEN X$="S"
7940 PRINT K9;"KLINGON";X$;" LEFT.":'************
7960 PRINT" MISSION MUST BE COMPLETED IN";0.1*INT((T0+T9-T)*10);"STARDATES."
7970 X$="S":IF B9<2 THEN X$=" ":IF B9<1 THEN GOTO 8010
7980 PRINT" THE FEDERATION IS MAINTAINING";B9;"STARBASE";X$;" IN THE GALAXY."
7990 GOTO 5690
8010 PRINT"YOUR STUPIDITY HAS LEFT YOU ON YOUR OWN IN"
8020 PRINT"  THE GALAXY -- YOU HAVE NO STARBASES LEFT!":GOTO 5690
8070 IF K3<=0 THEN GOTO 4270
8080 X$=" ":IF K3>1 THEN X$="S"
8090 PRINT"FROM ENTERPRISE TO KLINGON";
8095 PRINT " BATTLE CRUSER";X$
8100 H8=0:I=1
8105 IF K(I,3)<=0 THEN GOTO 8480
8110 W1=K(I,1):X=K(I,2)
8120 C1=S1:A=S2:GOTO 8220
8150 PRINT"DIRECTION/DISTANCE CALCULATOR:"
8160 PRINT"YOU ARE AT QUADRANT ";Q1;",";Q2;
8165 PRINT " SECTOR ";S1;",";S2;".":'**********
8170 PRINT"PLEASE ENTER INITIAL COORDINATES (X,Y)"
8180 INPUT"X?"C1
8190 INPUT"Y?"A
8200 PRINT"FINAL COORDINATES (X,Y)"
8210 INPUT "X?"W1
8215 INPUT "Y?"X
8220 X=X-A:A=C1-W1:IF X<0 THEN GOTO 8350
8250 IF A<0 THEN GOTO 8410
8260 IF X>0 THEN GOTO 8280
8270 IF A=0 THEN C1=5:GOTO 8290
8280 C1=1
8290 IF ABS(A)<=ABS(X)THEN GOTO 8330
8310 PRINT"DIRECTION =";C1+(((ABS(A)-ABS(X))+ABS(A))/ABS(A)):GOTO 8460
8330 PRINT"DIRECTION =";C1+(ABS(A)/ABS(X)):GOTO 8460
8350 IF A>0 THEN C1=3:GOTO 8420
8360 IF X<>0 THEN C1=5:GOTO 8290
8410 C1=7
8420 IF ABS(A)>=ABS(X)THEN GOTO 8450
8430 PRINT"DIRECTION =";C1+(((ABS(X)-ABS(A))+ABS(X))/ABS(X)):GOTO 8460
8450 PRINT"DIRECTION =";C1+(ABS(X)/ABS(A))
8460 PRINT"DISTANCE =";SQR(X^2+A^2):IF H8=1 THEN GOTO 1990
8480 I=I+1:IF I<=3 GOTO 8105
8490 GOTO 1990
8500 IF B3<>0 THEN PRINT"FROM ENTERPRISE TO STARBASE:":W1=B4:X=B5:GOTO 8120
8510 PRINT"MR. SPOCK:  'SENSORS SHOW NO STARBASES";
8515 PRINT " IN THIS QUADRANT.'";
8520 GOTO 1990
8590 GOSUB *RFNC:R1=A%
8591 GOSUB *RFNC:R2=A%:A$="   ":Z1=R1:Z2=R2
8595 GOSUB 8830:IF Z3=0 THEN GOTO 8590
8600 RETURN
8670 S8=INT(Z2-0.5)*3+INT(Z1-0.5)*24+1
8675 IF LEN(A$)<>3 THEN PRINT"ERROR":STOP
8710 A%=S8:USR($800D):RETURN
8790 ON R1 GOTO 8792,8794,8796,8798,8800,8802,8804,8806
8792 G2$="WARP ENGINES":RETURN
8794 G2$="SHORT RANGE SENSORS":RETURN
8796 G2$="LONG RANGE SENSORS":RETURN
8798 G2$="PHASER CONTROL":RETURN
8800 G2$="PHOTON TUBES":RETURN
8802 G2$="DAMAGE CONTROL":RETURN
8804 G2$="SHIELD CONTROL":RETURN
8806 G2$="LIBRARY-COMPUTER":RETURN
8830 Z1=INT(Z1+0.5):Z2=INT(Z2+0.5):S8=(Z2-1)*3+(Z1-1)*24+1:Z3=0
8890 '
8895 A%=S8:USR($800A):IF B$<>A$THEN RETURN
8900 Z3=1:RETURN
9030 IF Z5<=4 THEN ON Z4 GOTO 9040,9050,9060,9070,9080,9090,9100,9110
9035 GOTO 9120
9040 G2$="ANTARES":GOTO 9210
9050 G2$="RIGEL":GOTO 9210
9060 G2$="PROCYON":GOTO 9210
9070 G2$="VEGA":GOTO 9210
9080 G2$="CANOPUS":GOTO 9210
9090 G2$="ALTAIR":GOTO 9210
9100 G2$="SAGITTARIUS":GOTO 9210
9110 G2$="POLLUX":GOTO 9210
9120 ON Z4 GOTO 9130,9140,9150,9160,9170,9180,9190,9200
9130 G2$="SIRIUS":GOTO 9210
9140 G2$="DENEB":GOTO 9210
9150 G2$="CAPELLA":GOTO 9210
9160 G2$="BETELGEUSE":GOTO 9210
9170 G2$="ALDEBARAN":GOTO 9210
9180 G2$="REGULUS":GOTO 9210
9190 G2$="ARCTURUS":GOTO 9210
9200 G2$="SPICA"
9210 IF G5<>1 THEN ON Z5 GOTO 9230,9240,9250,9260,9230,9240,9250,9260
9220 RETURN
9230 G2$=G2$+" I":RETURN
9240 G2$=G2$+" II":RETURN
9250 G2$=G2$+" III":RETURN
9260 G2$=G2$+" IV":RETURN
9300 *RND:USR($8004):RD=A%/33000:RETURN:'=RND()
9310 *RFNC:USR($8004):'=FNR()
9315 RD=A%/33000*7.98+1.01:A%=RD
9320 RETURN
9999 'END

[2013.4.12注記]
上記のプログラムにバグがみつかりましたので修正いたしました。
上のリストは修正済みのものに差し替え済みです。
詳細は[第368回]をご参照ください。[注記ここまで]
[2013.4.13注記]
上のプログラムを再修正しました。
上のリストは差し替え済みです。
また下のマシン語のプログラムサブルーチンも修正しましたので、リストを差し替えました。
マシン語のサブルーチンのサイズが少し大きくなってしまいましたので、下の方でSTRTRK.TXTをロードするアドレスを、当初8060番地からとしていたのを、8100番地からに変更しました。
ですのでその作業をしているところの画像も差し替えました。
詳細は[第369回]をご参照ください。[注記ここまで]
[2013.4.15注記]
上のプログラムを再修正しました。
上のリストは差し替え済みです。
詳細は[第370回]をご参照ください。[注記ここまで]
[2013.4.16注記]
上のプログラムを再修正しました。
上のリストは差し替え済みです。
詳細は[第371回]をご参照ください。[注記ここまで]
[2013.4.20注記]
上のプログラムを再修正しました。
上のリストは差し替え済みです。
詳細は[第375回]をご参照ください。[注記ここまで]
[2013.5.6注記]
上のプログラムを再修正しました。
上のリストは差し替え済みです。
詳細は[第389回]をご参照ください。[注記ここまで]

上のプログラムはND80ZV(ND80Z3.5)に付属のZB3BASICで実行できますから、ND80ZV(ND80Z3.5)をすでにご購入いただいております方は、上のリストをコピーしてメモ帳などに貼り付けたうえで、ND80Z3フォルダにSTRTRK.TXTという名前で保存してください。
なおこのプログラム単体では動作しません。
別にマシン語のサブルーチンを用意します。

●STARTREK用マシン語サブルーチン

ZB3BASICはN88BASICに近いものとして開発したのですが、それでもSTARTREKのような長いゲームプログラムになりますと、かなり相違するところがでてきます。
BASICだけでその相違を吸収するにはちょっと苦しいところもでてきましたので、そういうところについてはマシン語のサブルーチンを作成しました。
そのひとつは乱数関数RND()です。
ZB3BASICにはRND()はありません。
もうひとつZB3BASICでは文字列は最大39バイトに制限しています。
ところがSTARTRECでは192バイトの文字変数を使って、そこに乱数によって決定した位置にエンタープライズ号やクリンゴン戦艦や星を示す記号を埋め込むという大変な使い方をしています。
その扱いはZB3BASICではちょっと苦しいので、それもマシン語サブルーチンで実現しました。

こちらがソースプログラムです。

;subroutine of STARTREK
;rnd & Q$ subroutine
;13/4/11
        ORG $8004
;
        PA=$F440
        AD=$F300
        BD=$F328
        R=$E000
        QD=$E002
;
        JP RND
        JP CLRQD
        JP MID;B$=MID$(Q$,A%,3)
        JP QDAD;set A$ to Q$,position by A%
RND:LD HL,(R)
        LD D,H
        LD E,L
        ADD HL,HL
        ADD HL,HL
        ADD HL,DE
        INC HL
        LD D,H
        LD E,L
        LD B,04
RND2:XOR A
        RR H
        RR L
        DJNZ RND2
        LD B,H
        LD C,L
        ADD HL,HL
        ADD HL,HL
        ADD HL,BC
        EX DE,HL
        SBC HL,DE
        RES 7,H
        LD (R),HL
        LD (PA),HL
        RET
;clear Q$
CLRQD:LD HL,QD
        LD B,C3
        LD A,20
CLRQD2:LD (HL),A
        INC HL
        DEC B
        JP NZ,CLRQD2
        RET
;B$=MID$(Q$,A%,3)
MID:LD HL,(PA)
        LD DE,QD
        ADD HL,DE
        LD DE,BD
        LD A,03
        LD (DE),A
        INC DE
        LD B,A
MID2:LD A,(HL)
        LD (DE),A
        INC HL
        INC DE
        DEC B
        JP NZ,MID2
        RET
;set A$ to Q$,position by A%
QDAD:LD HL,(PA)
        LD DE,QD
        ADD HL,DE
        LD DE,AD
        INC DE
        EX DE,HL
        LD B,03
        JP MID2
;

このリストも先ほどのSTRTRK.TXTと同じように、コピーしてメモ帳などに貼り付けたうえで、ND80Z3フォルダにSTRTRKSB.TXTという名前で保存してください。
このあと、ND80ZV(ND80Z3.5)に付属のアセンブラZASM.COMでSTRTRKSB.TXTをアセンブルして、マシン語のバイナリファイルSTRTRKSB.BINを作成します。

参考までに。こちらがZASM.COMでアセンブルしたアセンブルリストです。

2013/4/13  21:3  strtrksb.txt
END=806B
              ;subroutine of STARTREK
              ;rnd & Q$ subroutine
              ;13/4/11
                ORG $8004
              ;
                PA=$F440
                AD=$F300
                BD=$F328
                R=$E000
                QD=$E002
              ;
8004 C31080     JP RND
8007 C33580     JP CLRQD
800A C34380     JP MID;B$=MID$(Q$,A%,3)
800D C35B80     JP QDAD;set A$ to Q$,position by A%
8010 2A00E0   RND:LD HL,(R)
8013 54         LD D,H
8014 5D         LD E,L
8015 29         ADD HL,HL
8016 29         ADD HL,HL
8017 19         ADD HL,DE
8018 23         INC HL
8019 54         LD D,H
801A 5D         LD E,L
801B 0604       LD B,04
801D AF       RND2:XOR A
801E CB1C       RR H
8020 CB1D       RR L
8022 10F9       DJNZ RND2
8024 44         LD B,H
8025 4D         LD C,L
8026 29         ADD HL,HL
8027 29         ADD HL,HL
8028 09         ADD HL,BC
8029 EB         EX DE,HL
802A ED52       SBC HL,DE
802C CBBC       RES 7,H
802E 2200E0     LD (R),HL
8031 2240F4     LD (PA),HL
8034 C9         RET
              ;clear Q$
8035 2102E0   CLRQD:LD HL,QD
8038 06C3       LD B,C3
803A 3E20       LD A,20
803C 77       CLRQD2:LD (HL),A
803D 23         INC HL
803E 05         DEC B
803F C23C80     JP NZ,CLRQD2
8042 C9         RET
              ;B$=MID$(Q$,A%,3)
8043 2A40F4   MID:LD HL,(PA)
8046 1102E0     LD DE,QD
8049 19         ADD HL,DE
804A 1128F3     LD DE,BD
804D 3E03       LD A,03
804F 12         LD (DE),A
8050 13         INC DE
8051 47         LD B,A
8052 7E       MID2:LD A,(HL)
8053 12         LD (DE),A
8054 23         INC HL
8055 13         INC DE
8056 05         DEC B
8057 C25280     JP NZ,MID2
805A C9         RET
              ;set A$ to Q$,position by A%
805B 2A40F4   QDAD:LD HL,(PA)
805E 1102E0     LD DE,QD
8061 19         ADD HL,DE
8062 1100F3     LD DE,AD
8065 13         INC DE
8066 EB         EX DE,HL
8067 0603       LD B,03
8069 C35280     JP MID2
              ;
AD           =F300  BD           =F328  CLRQD        =8035  
CLRQD2       =803C  MID          =8043  MID2         =8052  
PA           =F440  QD           =E002  QDAD         =805B  
R            =E000  RND          =8010  RND2         =801D  

●STRTRKSB.TXTのアセンブル

まずはじめにSTRTRKSB.TXTをアセンブルします。
コマンドプロンプトを開きます。
今回は久しぶりにWindows7で作業してみました。

ZASM STRTRKSB.TXT[Enter]
と入力します。
アセンブル作業は瞬時に完了して下の画面のように表示されます。

これで準備完了です。


ND80ZV(ND80Z3.5)をUSB接続して電源を入れてください。
ZB3[Enter]
と入力して
ND80ZVに接続しました
の表示のあと、ND80ZV(ND80Z3.5)のキーを
[(I/O)][8]
と操作すると、
0001 0000 −
と表示されますから、

と入力します。

●STRTRKSB.BINとSTTRTRK.TXTのロード

ZB3BASICが起動しました。

最初にまず、STRTRKSB.BINをロードします。
/ld strtrksb.bin,8004[Enter]
です(,8004を忘れないようにしてください)。
次にSTRTRK.TXTをロードします。
/load strtrk.txt,8100[Enter]
です(こちらも,8100を忘れないようにしてください)。

STRTRK.TXTプログラムのロードには少し時間がかかります。

ロードが完了したらいよいよ実行です。
run[Enter]
の入力でSTARTREKの実行が開始されます。

●STARTREKの実行

エンタープライズ号がスクロール表示されます。
MBASICではかなり遅かったのですが、こちらは非常に速く表示されます。

しかしエンタープライズ号が停止してから、YOUR ORDERS…が表示されるまでは5〜6秒待たされます。
表示の最後の?には何か1文字(N以外)を入力して[Enter]を押します。

すると指令が表示されます。

おお。
クリンゴンが現れました(+K+)。
<E>がエンタープライズ号でしょう。
ここでCOMMANDを入力します。
適当な文字を入力すると、コマンドの一覧が表示されます。

ここではCOM[Enter]と入力しました。
続いて
2[Enter]と入力すると、敵までの方向と距離を報告してくれます。

次のCOMMAND?には
TOR[Enter]
と入力し、続いて
2.75[Enter]
と入力しました。
今のところこれしか他に方法を知らないものですから。

うう。
エンタープライズ号が破壊されてしまいました。

ゲームオーバーです。
もう一回挑戦するには
AYE[Enter]
と入力します。
終わるなら
[Ctrl][B]
を入力します。

こちらはクリンゴンをやっつけたときの画面です。
こちらはWindows98SEです。

とりあえずは敵をやっつけたのですがエンタープライズ号も破壊されてしまいました。
むむ。
なかなかに…。

前回も書きましたように、私はどうもケームは苦手ですので、なかなかあれこれ続けることができません。
おそらくまだあちこちにバグがあると思います。
大抵はエラー番号とともに、そのエラーが発生した行を表示してブレークします。
できればそのときのログファイルを添付してメールをいただければ幸いです。
>が表示されているときに、
/exit[Enter]
で終了するとログファイルが完全な形で保存されます。
もしくは/close[Enter]
と入力していただきますと、今開いているログファイルを閉じて、新しいログファイルがオープンします。
皆様方のご協力をお願いいたします。

ワンボードマイコンでCP/Mを![第367回]
2013.4.11upload
2013.4.12注記
2013.4.13注記
2013.4.15注記
2013.4.16注記
2013.4.20注記
2013.5.6注記

前へ
次へ
ホームページトップへ戻る