5 'save "SSB80B
10 '***************************************************************************
20 '*                 ΐή²Ώ³Ά² 88  Ver8.0B  for PC-8801 Series                 *
30 '*        Programmed by Mizno MWE / KKKKK    with PC-8801MC & mkII         *
40 '***************************************************************************
50 'ε Initialize δ
60 WIDTH 80,25:CONSOLE 0,25,0,1:COLOR 7,0:CLS 3
70 DEFINT A-Z:DIM MP(26,13),MC(25,12),B(15),TI(15,10),N$(15,10)
80 DIM CHN(15),SRV(15),AVT#(15):BCLR=&H35D9
90 COLOR=(1,2):COLOR=(2,1):IF (INP(&H32) AND &H20)=0 THEN 110
100 OUT &H59,6:OUT &H59,67:OUT &H5B,6:OUT &H5B,66:AD=4:GOTO 120 'Analog
110 COLOR=(5,5):COLOR=(7,5):AD=2 'Digital
120 ON ERROR GOTO *CHKMUS:STOP ON:ON STOP GOSUB *STP:STOP STOP
130 CMD STOP(7):GOSUB *CHKMOD
140 IF (INP(9) AND &H80)=0 THEN *MKFILE
150 OPEN "SSB80.DAT" FOR INPUT AS #1
160 FOR L=0 TO 15
170  INPUT #1,CHN(L),SRV(L),AVT#(L)
180  FOR R=1 TO 10:INPUT #1,TI(L,R),N$(L,R):NEXT R
190 NEXT L
200 CLOSE #1
210 RESTORE *BOMB.DAT:FOR L=0 TO 15:READ B(L):NEXT L
220 D$="Level  Bombs   Top/ Av.    Survival":L=0:G=255:GOSUB *SETTONE
230 *START
240 A=VAL(LEFT$(TIME$,2))*VAL(MID$(TIME$,4,2))*VAL(RIGHT$(TIME$,2))/1.3-30793
250 RANDOMIZE A:GOSUB *LEVEL
260 'ε Make Screen δ
270 STOP STOP:GOSUB *PREP:GOSUB *MAIN.M:CLS 3
280 FOR X=1 TO 25:FOR Y=1 TO 12
290  LINE(X*24-18,Y*16-3)-(X*24,Y*16+9),7,BF
300 NEXT Y:NEXT X
310 LINE(601,199)-(639,199),6:LINE(609,0)-(632,198),4,BF
320 LINE(609,199-TI(L,1))-(632,198),6,BF
330 X=1:Y=1:MN=0:MKP=0:TM=200
340 PRINT USING "Level !    Bomb  ###    ";HEX$(L);B(L);:IF L=15 THEN 360
350 PRINT USING "Mark ###";MN;:IF L>7 THEN PRINT USING "(### point)";MKP
360 LOCATE 47,0:PRINT USING "Last ###";PN
370 LOCATE 75,0:PRINT "Time":COLOR 6:LOCATE 75,1:PRINT TM
380 COLOR 1:LOCATE 76,24:PRINT USING "###";TI(L,1);
390 COLOR 7:TI$=TIME$:ON S.SOUND GOTO 410,420
400 BEEP:BEEP:BEEP:GOTO 440
410 CMD PLAY(1,2,3,7,8,9):GOTO 440
420 CMD PLAY()
430 'ε Main Routine δ
440 LINE(X*24-19,Y*16-4)-(X*24+1,Y*16+10),6,B
450 VX=((INP(0) AND &H40)=0)*(X<25)-((INP(0) AND &H10)=0)*(X>1)
460 VY=((INP(0) AND    4)=0)*(Y<12)-((INP(1) AND    1)=0)*(Y>1)
470 LINE(X*24-19,Y*16-4)-(X*24+1,Y*16+10),0,B:X=X+VX:Y=Y+VY
480 ON ((INP(0) AND &H20)=0 AND MC(X,Y)<1)+1 GOTO 510:'Put Mark
490 ON -(MC(X,Y)<0 AND L<8 OR MC(X,Y)=-9 OR L=15) GOTO 510
500 MKP=MKP-(MC(X,Y)= 0):MN=MN+1:MC(X,Y)=MC(X,Y)-1:GOSUB *ST:GOTO 530
510 ON ((INP(1) AND &H80)=0 AND MC(X,Y)<0)+1 GOTO 570:'Remove Mark
520 MKP=MKP+(MC(X,Y)=-1):MN=MN-1:MC(X,Y)=MC(X,Y)+1:GOSUB *ST
530 LOCATE X*3-2,Y*2:COLOR 6:ON -MC(X,Y)*(1-(L>7))+1 GOTO 560,550
540 PRINT -MC(X,Y);:GOTO 620
550 PRINT     "@~";:GOTO 620
560 PRINT     "  ";:GOTO 620
570 ON ((INP(0) AND 1)=0 AND MC(X,Y)=0)+1 GOTO 620:'SSB
580 MC(X,Y)=1:LINE(X*24-18,Y*16-3)-(X*24,Y*16+9),5,BF
590 ON -(MP(X,Y)<0) GOTO *OV:PN=PN-1
600 PUT@(X*24-8,Y*16),KANJI(304+MP(X,Y)),PSET,-(MP(X,Y)=0)*AD,5
610 BEEP 1:BEEP 0:GOSUB *ST:ON -(PN=0) GOTO *TRI
620 IF TI$<>TIME$ THEN TM=TM-1:TI$=TIME$:GOSUB *TI:ON TM+1 GOTO *TOV
630 COLOR 7:FOR P=0 TO W/2:NEXT P:GOTO 440
640 'ε Indicate Status δ
650 *ST
660 LOCATE 52,0:PRINT USING "###";PN :ON -(L=15) GOTO 690
670 LOCATE 29,0:PRINT USING "###";MN;:ON -(L< 8) GOTO 690
680 PRINT USING "(###";MKP
690 RETURN
700 'ε Indicate Time δ
710 *TI
720 COLOR 6:LOCATE 76,1:PRINT USING "###";TM
730 LINE(609,199-TM)-(632,199-TM),1:'<--- V2..."5,BF,XOR"
740 IF TM=TI(L,1) AND TM>0 THEN FOR I=1 TO 64:BEEP 1:BEEP 0:NEXT I
750 RETURN
760 'ε Explode ! δ
770 *OV
780 IF L>7 AND L<15 THEN 810
790 PUT@(X*24-16,Y*16),KANJI(320),PSET,1,5
800 PUT@(X*24- 8,Y*16),KANJI(382),PSET,1,5:GOTO 830
810 PUT@(X*24- 8,Y*16),KANJI(304-MP(X,Y)),PSET,1,5
820 *TOV
830 IF S.SOUND=0 THEN FOR P=0 TO 1023:BEEP 1:BEEP 0:NEXT P:GOTO 880
840 CMD INIT():CMD 7,"P2W31S0M8801C1^1":CMD PLAY():FOR P=0 TO (W+10)*80:NEXT P
850 GOSUB *OP.M:ON S.SOUND+1 GOTO 880,870
860 CMD PLAY():GOTO 880
870 CMD PLAY(1,2,3,7,8,9)
880 GOSUB *OPALL:CMD STOP(15):G=255:GOSUB *SCLST:GOTO *START
890 'ε Triumph δ
900 *TRI
910 IF S.SOUND=0 THEN BEEP 1:FOR P=0 TO W*32:NEXT P:BEEP 0:GOTO 960
920 CMD INIT():CMD 7,"P1V13[4C64,8C]":CMD PLAY():FOR P=0 TO (W+10)*80:NEXT P
930 GOSUB *MY.M:ON S.SOUND+1 GOTO 960,950
940 CMD PLAY():GOTO 960
950 CMD PLAY(1,2,3,7,8,9)
960 GOSUB *OPALL:CLS 3:R=0:AVT#(L)=AVT#(L)+TM:SRV(L)=SRV(L)+1
970 FOR I=1 TO 10
980  IF TM>TI(L,I) THEN R=I:I=10
990 NEXT I:IF R=0 THEN 1100
1000 IF R=10 THEN 1040
1010 FOR I=9 TO R STEP -1
1020  SWAP TI(L,I),TI(L,I+1):SWAP N$(L,I),N$(L,I+1)
1030 NEXT I
1040 TI(L,R)=TM:G=L*10+R:LOCATE 16,12
1050 PRINT USING "Your time ### is Rank ## at Level !.";TI(L,R);R;HEX$(L)
1060 LOCATE 54,13:PRINT STRING$(16,"_"):LOCATE 54,14:PRINT SPC(17):CALL BCLR
1070 LOCATE 20,14:LINE INPUT "Enter your name(Limit 16 letters):",N$
1080 IF N$="" THEN N$=STRING$(16,"*"):LOCATE 54,14:PRINT N$
1090 IF LEN(N$)>16 THEN 1060 ELSE N$(L,R)=N$
1100 CMD STOP(15):GOSUB *SCLST:L=L+1 AND 15:GOTO *START
1110 'ε Open All δ
1120 *OPALL
1130 FOR Y=1 TO 12:FOR X=1 TO 25:A=MP(X,Y):IF MC(X,Y)=1 THEN 1180
1140  IF MP(X,Y)<0 AND (L<8 OR L=15) THEN 1160
1150   PUT@(X*24-8,Y*16),KANJI(304+ABS(A)),PSET,-(A=0)*AD-(A<0)*1,7:GOTO 1180
1160  PUT@(X*24-16,Y*16),KANJI(320),PSET,1,7
1170  PUT@(X*24- 8,Y*16),KANJI(382),PSET,1,7
1180 NEXT X:LOCATE 0,Y*2:PRINT SPC(76);:NEXT Y
1190 LOCATE 58,0:COLOR 2:PRINT "Hit '0' key.":COLOR 7
1200 IF (INP(0) AND 1)=0 THEN RETURN ELSE 1200
1210 'ε Select Level δ
1220 *LEVEL
1230 CLS 3:STOP ON:GOSUB *TITLE.M:ON S.SOUND+1 GOTO 1260,1240,1250
1240 CMD PLAY(1,2,3,7,8,9):GOTO 1260
1250 CMD PLAY()
1260 PUT@(263,0),KANJI(&H4267),,1,0:PUT@(279,0),KANJI(&H415D),,1,0
1270 PUT@(295,0),KANJI(&H3324),,1,0:PUT@(311,0),KANJI(&H2338),,1,0
1280 PUT@(327,0),KANJI(&H2338),,1,0:COLOR 7:LOCATE 45,1:PRINT "Version 8.0B"
1290 LOCATE 1,4:PRINT D$;SPC(5);D$
1300 FOR I=0 TO 15
1310  IF SRV(I)=0 THEN A!=0 ELSE A!=AVT#(I)/SRV(I)
1320  IF CHN(I)=0 THEN B!=0 ELSE B!=SRV(I)/CHN(I)*100
1330  LOCATE 3+(I AND 8)*5,6+(I AND 7):PRINT HEX$(I);SPC(5);
1340  PRINT USING "###    ###/###.##  ###.## %";B(I);TI(I,1);A!;B!
1350 NEXT I
1360 FOR I=0 TO 9
1370  LOCATE 39,4+I:PRINT "":LOCATE 52,4+I:PRINT MID$("o",(I>1 AND I<9)+2)
1380 NEXT I
1390 LOCATE 20,17:PRINT "Sound Mode :   BEEP   ";
1400 COLOR -(SOUND>0)*6+1:PRINT "YM-2203  ";
1410 COLOR -(SOUND>1)*6+1:PRINT "YM-2608":COLOR 7
1420 LOCATE 52,14:PRINT "overlap":LOCATE 34,20:PRINT "Select level"
1430 LOCATE 68,24:PRINT "Wait =";W;
1440 LX=-(L>7)*320:LY=(L AND 7)*8+48:LINE(LX,LY)-(LX+319,LY+8),3,B
1450 LINE(264+S.SOUND*72-8*SGN(S.SOUND),136)-(264+S.SOUND*72+63,143),3,B
1460 A=INP(0):B=INP(1)
1470 IF (A AND &H75)=&H75 AND (B AND &H81)=&H81 THEN 1460
1480 IF (B AND &H80)=0 THEN GOSUB *SCLST:CLS 3:GOTO 1260
1490 IF (A AND 1)=0 THEN LINE(LX,LY)-(LX+319,LY+8),1,BF:CMD STOP(15):RETURN
1500 IF (A AND &H20)<>0 OR SOUND=0 THEN 1570 'Change Sound Mode
1510 LINE(264+S.SOUND*72-8*SGN(S.SOUND),136)-(264+S.SOUND*72+63,143),0,B
1520 S.SOUND=S.SOUND+1:IF S.SOUND>SOUND THEN S.SOUND=0
1530 CMD STOP(7):ON S.SOUND+1 GOTO 1560,1550
1540 CMD PLAY():GOTO 1560
1550 CMD PLAY(1,2,3,7,8,9)
1560 IF (A AND &H55)=&H55 AND (B AND &H1)=&H1 THEN 1610
1570 LINE(LX,LY)-(LX+319,LY+8),0,B 'Move Cursor
1580 IF (A AND 4)=0 THEN L=L+1 AND 15
1590 IF (A AND &H10)=0 OR (A AND &H40)=0 THEN L=L XOR  8
1600 IF (B AND 1)=0 THEN L=L-1 AND 15
1610 BEEP 1:BEEP 0:FOR P=0 TO (W+1)*1.7*BM:NEXT P:GOTO 1440
1620 'ε Prepare δ
1630 *PREP
1640 GOSUB *MY.M:CLS 3:ON S.SOUND+1 GOTO 1670,1650,1660
1650 CMD PLAY(1,2,3,7,8,9):GOTO 1670
1660 CMD PLAY()
1670 LOCATE 29,12:PRINT "Now preparing Lv.";HEX$(L);"...":PL=1
1680 CHN(L)=CHN(L)+1:R=0
1690 FOR I=0 TO 10
1700  LINE(I*20+220,105)-(I*20+220,109),6
1710  PSET(220,104),6:PSET(320,104),6:PSET(420,104),6
1720 NEXT I:A=FRE(0):'Garbage collection
1730 FOR X=0 TO 26:FOR Y=0 TO 13:MP(X,Y)=0:NEXT Y,X
1740 FOR X=1 TO 25:FOR Y=1 TO 12:MC(X,Y)=0:NEXT Y,X
1750 IF L=15 THEN 1930 ELSE PN=300
1760 FOR I=1 TO B(L)
1770  X=INT(RND*25)+1:Y=INT(RND*12)+1
1780  IF (X=1 OR X=25) AND (Y=1 OR Y=12) OR MP(X,Y)<0 AND L<8 THEN 1770
1790  C=0
1800  FOR MX=X-1 TO X+1:FOR MY=Y-1 TO Y+1
1810   C=C-(MP(MX,MY)=9)
1820  NEXT MY:NEXT MX
1830  IF C<>0 THEN 1770
1840  MP(X,Y)=-1-MP(X,Y)*(MP(X,Y)<0)
1850  FOR MX=X-1 TO X+1:FOR MY=Y-1 TO Y+1
1860   MP(MX,MY)=MP(MX,MY)-(MP(MX,MY)>=0)
1870  NEXT MY:NEXT MX
1880  PN=PN+(MP(X,Y)=-1)
1890  LINE(220,110)-(200/B(L)*I+220,117),4,BF
1900 NEXT I
1910 GOTO 2000
1920 'Level F
1930 FOR X=1 TO 25:FOR Y=1 TO 12
1940  MP(X,Y)=-1:LINE(220,110)-(2/3*((X-1)*12+Y)+220,117),4,BF
1950 NEXT Y:NEXT X
1960 X=INT(RND*25)+1:Y=INT(RND*12)+1:MP(X,Y)=0
1970 FOR MX=X-1 TO X+1:FOR MY=Y-1 TO Y+1
1980  MP(X,Y)=MP(X,Y)-(MP(MX,MY)<0)
1990 NEXT MY:NEXT MX:PN=1
2000 CMD STOP(15):RETURN
2010 'ε Excellents List δ
2020 *SCLST
2030 CLS 3:LOCATE 25,3:PRINT "EXCELLENT PLAYERS  (LEVEL ";HEX$(L);")"
2040 LOCATE 22,5:PRINT "Rank     Time     Name"
2050 FOR R=1 TO 10:COLOR 7+5*(L*10+R=G):LOCATE 23,6+R
2060  PRINT USING "##  ...  ### ... @";R;TI(L,R);N$(L,R)
2070 NEXT R:COLOR 7
2080 LOCATE 22,17:PRINT STRING$(34,"-")
2090 IF SRV(L)=0 THEN A!=0 ELSE A!=AVT#(L)/SRV(L)
2100 IF CHN(L)=0 THEN B!=0 ELSE B!=SRV(L)/CHN(L)*100
2110 LOCATE 22,18:PRINT USING "Average = ###.##";A!
2120 LOCATE  8,20:PRINT USING "Charangers = ####   ";CHN(L);
2130              PRINT USING "Survivors = ####   ";SRV(L);
2140              PRINT USING "Survival Percentage = ###.##%";B!
2150 IF G=0 THEN 2180
2160 LOCATE 34,23:PRINT "Hit Any Key.":CALL BCLR
2170 IF INKEY$="" THEN 2170
2180 RETURN
2190 'ε Check Playing Mode δ
2200 *CHKMOD
2210 A=PEEK(&H79D7)-48:B=(INP(&H31) AND &HC0)/64:C=(INP(&H6E) AND &H80)/128
2220 PRINT "PC-8801";
2230 ON A-2 GOTO 2250,2260,2270,2270,2270,2280,2290
2240 PRINT:GOTO 2300
2250 PRINT "mkII":GOTO 2300
2260 PRINT "mkIISR":GOTO 2300
2270 PRINT "mkIITR/FR/MR":GOTO 2300
2280 PRINT "FH/MH":GOTO 2300
2290 PRINT "FA/MA/FE/MA2/FE2/MC"
2300 IF A>7 AND C=0 THEN PRINT "8MHz-"; ELSE PRINT "4MHz":W=0:GOTO 2320
2310  IF (INP(&HD) AND 4)=0 THEN PRINT "H":W=50 ELSE PRINT "S":W=9
2320 IF A>3 AND B<2 THEN PRINT "V2-MODE"         :BM=1:GOTO 2350
2330 IF A>3 AND B=3 THEN PRINT "V1H-MODE":W=W/1.4:BM=0:GOTO 2350
2340                     PRINT "V1S-MODE":W=0    :BM=0
2350 B=&H44-(A<8)*100:OUT B,&HFF:C=INP(B+1)
2360 IF C<>1 AND A<4 THEN PRINT "BEEP"   :SOUND=0:S.SOUND=0:GOTO 2390
2370 IF C<>1         THEN PRINT "YM-2203":SOUND=1:S.SOUND=1:GOTO 2390
2380                      PRINT "YM-2608":SOUND=2:S.SOUND=2
2390 CMD STOP:PRINT "with";
2400 PRINT " Sound Driver":RETURN
2410 'ε Create Data-File δ
2420 *MKFILE
2430 FOR L=0 TO 15
2440  CHN(L)=0:SRV(L)=0:AVT#(L)=0
2450  FOR R=1 TO 10:TI(L,R)=0:N$(L,R)=STRING$(16,"*"):NEXT R
2460 NEXT L
2470 GOTO 2510
2480 'ε STOP Routine (Save Data) δ
2490 *STP
2500 STOP STOP:CMD STOP(15):G=0:IF PL=0 OR (INP(9) AND &H80)=0 THEN 2570
2510 OPEN "SSB80.DAT" FOR OUTPUT AS #1
2520 FOR L=0 TO 15:GOSUB *SCLST
2530  PRINT #1,CHN(L),SRV(L),AVT#(L)
2540  FOR R=1 TO 10:PRINT #1,TI(L,R),N$(L,R):NEXT R
2550 NEXT L
2560 CLOSE #1
2570 STOP OFF:CLS 3
2580 END
2590 'ε Error Routine (Check Sound Driver) δ
2600 *CHKMUS
2610 IF ERR<>33 THEN ON ERROR GOTO 0
2620 IF ERL=2390 THEN PRINT "without";:SOUND=0:S.SOUND=0:RESUME 2400
2630 IF ERL>2999 THEN RESUME *RET ELSE RESUME NEXT
2640 'ε Data δ
2650 *BOMB.DAT
2660 DATA  16, 24, 32, 40, 46, 52, 56, 60, 32, 38, 44, 48, 52, 58, 64,299
3000 'ε MML Area (Pickel-kun) δ
3010 *SETTONE
3020 *MAIN.M
3030 *OP.M
3040 *MY.M
3050 *TITLE.M
3060 CMD INIT()
60000 *RET
60010 RETURN
