1000 '************************************************************************* 1010 '* 「必殺仕事人」作成プログラム Version 1.01 2000.03.03. * 1020 '* Copyright (C) Takashi Utsunomiya 作成開始 1999.01.10. * 1030 '************************************************************************* 1040 : 1050 SCREEN 3,0,0,1:WIDTH 80,25:CONSOLE 0,25,0,1,0:COLOR 7,0,0,7,2:CLS 3 1060 DEFINT A-Z 1070 : 1080 DIM LN$[999] ' 行番号 1090 DIM LB$[999] ' ラベル名 1100 DIM LBLN$[999] ' ラベル名に対応した行番号 1110 DIM TEJUN$[9,3] ' 操作手順,コマンド 1120 DIM MES$[2] ' メッセージ 1130 DQ$=CHR$(&H22) ' ダブルクォーテーション 1140 MKHSN$="MKHSN" ' このプログラムのファイル名(大文字) 1150 TEMP$="mkhsn.tmp" ' 作業用ファイル 1160 : 1170 GOSUB *TEMP.LOAD:IF FILE$="" THEN GOSUB *SELECT 1180 : 1190 FOR I=0 TO 4:READ TEJUN$[I,0]:NEXT 1200 DATA "対象ファイル を変更する。" 1210 DATA "行番号1000から始まるようにし、a.bas という名で アスキー・セーブ する。" 1220 DATA "a.bas 中で使用されている総てのラベル名を行番号に置き換える。" 1230 DATA "a.bas を バイナリ・セーブ する。" 1240 DATA "必殺仕事人ファイル(.hsn) に変換する。" 1250 TEJUN$[1,1]="load"+DQ$+FILE$+DQ$ 1260 TEJUN$[1,2]="renum 1000" 1270 TEJUN$[1,3]="save"+DQ$+"a"+DQ$+",a:run"+DQ$+MKHSN$ 1280 TEJUN$[3,1]="load"+DQ$+"a"+DQ$ 1290 TEJUN$[3,2]="save"+DQ$+"a"+DQ$+":run"+DQ$+MKHSN$ 1300 'FOR I=0 TO 4:FOR J=0 TO 3:PRINT TEJUN$[I,J]:NEXT J,I:END 1310 : 1320 FOR I=0 TO 2:READ MES$[I]:NEXT 1330 DATA 無事終わりました。起動は「必殺仕事人」に任してください。 1340 DATA 行番号は4桁にしてください。 1350 DATA "ON STOP,ON ERROR 命令があるので「必殺仕事人」で実行できません。" 1360 *START '-------------- 直前処理 1370 GOSUB *SCR 1380 *MAIN '============== 主動部 1390 LOCATE 3,15:PRINT"処理を選んでください( [0] 〜 [4] or [Enter] ) ";: 1400 A$="":WHILE (A$<"0" OR A$>"4") AND A$<>CHR$(&HD):A$=INPUT$(1):WEND 1410 IF A$<>CHR$(&HD) THEN MENU=VAL(A$) 1420 IF MENU<4 THEN MENU=MENU+1:GOSUB *TEMP.SAVE:MENU=MENU-1 1430 ON MENU+1 GOSUB *CHANGE,*SHUDOU,*CNV,*SHUDOU,*CNV1 1440 : 1450 IF MENU=4 THEN KILL TEMP$:A=0:GOSUB *MES :CLS 3:FILES:END 1460 RUN 1470 *SCR '============== 画面描画 1480 RESTORE *SCR.DATA:A$="":LINE(0,0)-(639,399),15,BF 1490 WHILE A$<>"*" 1500 READ A$:IF A$="*" THEN 1520 1510 X1=VAL(A$):READ Y1,X2,Y2,A:GOSUB *BOX 1520 WEND:CLS:COLOR 4 1530 LOCATE 5, 2:PRINT"「必殺仕事人」作成プログラム";:COLOR 7 1540 FOR I=0 TO 4 1550 LOCATE 3,4+I*2:PRINT "("+HEX$(I)+") "+TEJUN$[I,0]; 1560 NEXT 1570 *SCR1 '-------------- 1580 LOCATE 54, 2:PRINT"対象ファイル : "+FILE$; 1590 FOR I=0 TO 4 1600 LOCATE 0,4+I*2:PRINT MID$(" >>",-(MENU=I)*2+1,2); 1610 NEXT :RETURN 1620 *MES '-------------- 1630 LOCATE 3,15:PRINT LEFT$(MES$[A]+SPACE$(74),74);:A$=INPUT$(1) :RETURN 1640 *SELECT '============== 対象ファイル選択 1650 FILES"*.bas" 1660 PRINT:PRINT"目的のファイル : ";:X=POS(0):Y=CSRLIN:PRINT FILE$; 1670 LOCATE X,Y:INPUT"",A$:IF A$<>"" THEN FILE$=A$ 1680 IF FILE$="" THEN 1660 1690 IF INSTR(A$,".")=0 THEN FILE$=FILE$+".bas" 1700 : 1710 MENU=1:GOSUB *TEMP.SAVE :RETURN 1720 *CHANGE '-------------- 対象ファイル変更 1730 KILL TEMP$ :RUN 1740 *TEMP.LOAD '============== 作業用ファイルの読み書き 1750 ON ERROR GOTO 1770:OPEN TEMP$ FOR INPUT AS#1:INPUT#1,FILE$,MENU:CLOSE#1 1760 ON ERROR GOTO 0 :RETURN 1770 OPEN TEMP$ FOR OUTPUT AS#1:PRINT#1,",";0:CLOSE#1:RESUME 1780 *TEMP.SAVE '-------------- 1790 OPEN TEMP$ FOR OUTPUT AS#1:PRINT#1,FILE$;",";MENU:CLOSE#1 :RETURN 1800 *SHUDOU '============== 手動コマンド 1810 CLS 3 1820 FOR I=1 TO 3 1830 PRINT:PRINT TEJUN$[MENU,I] 1840 NEXT:LOCATE 0,0 :END 1850 *CNV '============== 変換 1860 OPEN "a.bas" FOR INPUT AS#1:A$=INPUT$(4,#1):CLOSE#1 1870 IF VAL(A$)<1000 THEN A=0:GOSUB *MES:MENU=1 :RETURN 1880 : 1890 OPEN "a.bas" FOR INPUT AS#1 1900 OPEN "a.tmp" FOR OUTPUT AS#2 1910 : 1920 LN=0 ' リスト読み込み 1930 WHILE EOF(#1)<>-1 1940 LINE INPUT#1,LN$[LN]:LN=LN+1 1950 WEND:MAX=LN-1 1960 : 1970 FOR LN=0 TO MAX ' ラベル名取得 1980 LN$=LN$[LN] 1990 : 2000 A=INSTR(LN$,"'"):B=0 ' コメント文除去 2010 FOR I=6 TO A:B=B-(MID$(LN$,I,1)=DQ$):NEXT 2020 IF A>0 AND B MOD 2=0 THEN LN$=MID$(LN$,1,A-1):LN$[LN]=LN$ 2030 : 2040 A=INSTR(LN$,"ON ERROR"):A=A OR INSTR(LN$,"ON STOP") 2050 IF A THEN CLOSE:MENU=0:GOSUB *TEMP.SAVE:A=2:GOSUB *MES :RETURN 2060 A=INSTR(LN$," ") 2070 IF A<>5 THEN CLOSE:MENU=1:GOSUB *TEMP.SAVE:A=1:GOSUB *MES :RETURN 2080 WHILE MID$(LN$,A+1,1)=" ":A=A+1:WEND:A=A+1 2090 IF MID$(LN$,A,1)<>"*" THEN 2190 2100 : 2110 A$="" 2120 WHILE INSTR(" :",MID$(LN$,A+1,1))=0 2130 A=A+1:A$=A$+MID$(LN$,A,1) 2140 WEND 2150 LB$[LBLN]="*"+A$ 2160 LBLN$[LBLN]=MID$(LN$[LN],1,4) 2170 LBLN=LBLN+1 2180 LN$[LN]=MID$(LN$,1,5)+":"+MID$(LN$,A+1) 2190 NEXT 2200 : 2210 FOR LN=0 TO LBLN -2 ' ラベル名ソート 2220 FOR I=LN+1 TO LBLN-1 2230 ON -(LEN(LB$[LN])>=LEN(LB$[I])) GOTO 2250 2240 SWAP LB$[LN],LB$[I]:SWAP LBLN$[LN],LBLN$[I] 2250 NEXT 2260 NEXT 2270 : 2280 FOR LN=0 TO MAX ' ラベル置き換え & 書き込み 2290 LN$=LN$[LN] 2300 : 2310 FOR I=0 TO LBLN-1 2320 IN=INSTR(LN$,LB$[I]):ON -(IN=0 OR LB$[I]="") GOTO 2350 2330 LN$[LN]=MID$(LN$,1,IN-1)+LBLN$[I]+MID$(LN$,IN+LEN(LB$[I])) 2340 LN$=LN$[LN]:GOTO 2320 2350 NEXT 2360 : 2370 A=1:FOR I=6 TO LEN(LN$):A=A AND (MID$(LN$,I,1)=" "):NEXT 2380 IF A OR LEN(LN$)<7 THEN LN$=LEFT$(LN$,5)+":" 2390 IF LN=MAX THEN LN$=LN$+":end" 2400 PRINT#2,LN$ 2410 NEXT:CLOSE#1,#2 2420 : 2430 KILL "a.bas" 2440 NAME "a.tmp" AS "a.bas" :RETURN 2450 *CNV1 '============== 変換1 2460 OPEN "a.bas" FOR INPUT AS#1:A$=INPUT$(1,#1):IF A$<>CHR$(&HFE) THEN STOP 2470 OPEN "a.$$$" FOR OUTPUT AS#2 2480 : 2490 A=7 2500 WHILE EOF(#1)<>-1 2510 A=(A+1) MOD 15 2520 PRINT#2,CHR$(ASC(INPUT$(1,#1)) XOR (A+1)*17); 2530 WEND:CLOSE#1,#2 2540 : 2550 KILL "a.bas" 2560 A$=MID$(FILE$,1,INSTR(FILE$,".")-1)+".hsn" 2570 OPEN A$ AS#1:CLOSE#1:KILL A$ 2580 NAME "a.$$$" AS A$ :RETURN 2590 *BOX '============== ボックス描画 2600 X1=X1*8-1:Y1=Y1*16-1:X2=X2*8:Y2=Y2*16 2610 LINE(X1,Y2)-(X2,Y1),7,BF,8:LINE-(X1,Y1),0:LINE-(X1,Y2),0 :RETURN 2620 *SCR.DATA '============== 画面データ 2630 DATA 53, 2,78, 3, 1 , 2, 4,78, 5, 1 , 2, 6,78, 7, 1 , 2, 8,78, 9, 1 2640 DATA 2,10,78,11, 1 , 2,12,78,13, 1 , 2,15,78,24, 1 ,*