10000 '********************************************************** 10010 ' 10020 'VERTEX STANDARD VX-7 10030 'クローンデータ書き込みプログラム Ver1.00 (Sep 22 2002) 10040 ' 10050 'Copyright by Heian Software Engineering 10060 '(C)2002 H.S.E. Allrights reserved. 10070 ' 10080 '********************************************************** 10090 ' 10100 ' 10110 ' 10120 *START 10130 CLEAR 10140 DEFINT A-Z 10150 WIDTH 80,25:CONSOLE 0,25,1,1:COLOR 7,0,0,7,2:CLS 2 10160 ' 10170 RX.BUFF.SIZE=32000:'受信バッファサイズ 10180 TX.BUFF.SIZE=32000:'送信バッファサイズ 10190 ' 10200 COMPORT.NAME$="COM1:N81NN":'通信ポートファイルディスクリプタ 10210 COMPORT.SPEED=8:'通信速度 8:19200,0:SPEEDコマンドによる 10220 G.SEND.DATA.TO.TRX.W=1000:'送信時間調整 10230 ' 10240 GOTO *MAIN 10250 ' 10260 'HEX.CHR$ 10270 *READ.HEX.CHR 10280 DIM HEX.CHR$(255) 10290 RESTORE *READ.HEX.CHR 10300 FOR READ.HEX.CHR.W=0 TO 255:READ HEX.CHR$(READ.HEX.CHR.W):NEXT 10310 DATA 00,01,02,03,04,05,06,07,08,09,0A,0B,0C,0D,0E,0F 10320 DATA 10,11,12,13,14,15,16,17,18,19,1A,1B,1C,1D,1E,1F 10330 DATA 20,21,22,23,24,25,26,27,28,29,2A,2B,2C,2D,2E,2F 10340 DATA 30,31,32,33,34,35,36,37,38,39,3A,3B,3C,3D,3E,3F 10350 DATA 40,41,42,43,44,45,46,47,48,49,4A,4B,4C,4D,4E,4F 10360 DATA 50,51,52,53,54,55,56,57,58,59,5A,5B,5C,5D,5E,5F 10370 DATA 60,61,62,63,64,65,66,67,68,69,6A,6B,6C,6D,6E,6F 10380 DATA 70,71,72,73,74,75,76,77,78,79,7A,7B,7C,7D,7E,7F 10390 DATA 80,81,82,83,84,85,86,87,88,89,8A,8B,8C,8D,8E,8F 10400 DATA 90,91,92,93,94,95,96,97,98,99,9A,9B,9C,9D,9E,9F 10410 DATA A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE,AF 10420 DATA B0,B1,B2,B3,B4,B5,B6,B7,B8,B9,BA,BB,BC,BD,BE,BF 10430 DATA C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,CA,CB,CC,CD,CE,CF 10440 DATA D0,D1,D2,D3,D4,D5,D6,D7,D8,D9,DA,DB,DC,DD,DE,DF 10450 DATA E0,E1,E2,E3,E4,E5,E6,E7,E8,E9,EA,EB,EC,ED,EE,EF 10460 DATA F0,F1,F2,F3,F4,F5,F6,F7,F8,F9,FA,FB,FC,FD,FE,FF 10470 RETURN 10480 ' 10490 *RX.BUFF.INIT 10500 DIM RX.BUFF(RX.BUFF.SIZE-1) 10510 GOSUB *RX.BUFF.CLEAR 10520 RETURN 10530 ' 10540 *RX.BUFF.CLEAR 10550 G.RX.BUFF.RP=0:'読み出しポインタ 10560 G.RX.BUFF.WP=0:'書き込みポインタ 10570 G.RX.BUFF.N=0 :'バッファ内データ数 10580 G.RX.BUFF.OV=0:'バッファオーバーフロー 10590 G.RX.BUFF.EM=0:'バッファ内エンプティ 10600 RETURN 10610 ' 10620 *RX.BUFF.WRITE 10630 IF G.RX.BUFF.N>=RX.BUFF.SIZE THEN G.RX.BUFF.OV=-1:RETURN 10640 RX.BUFF(G.RX.BUFF.WP)=G.RX.WRITE.DATA 10650 G.RX.BUFF.WP=(G.RX.BUFF.WP+1) MOD RX.BUFF.SIZE 10660 G.RX.BUFF.N=G.RX.BUFF.N+1 10670 G.RX.BUFF.OV=0 10680 RETURN 10690 ' 10700 *RX.BUFF.READ 10710 IF G.RX.BUFF.N=0 THEN G.RX.BUFF.EM=-1:RETURN 10720 G.RX.READ.DATA=RX.BUFF(G.RX.BUFF.RP) 10730 G.RX.BUFF.RP=(G.RX.BUFF.RP+1) MOD RX.BUFF.SIZE 10740 G.RX.BUFF.N=G.RX.BUFF.N-1 10750 G.RX.BUFF.EM=0 10760 RETURN 10770 ' 10780 ' 10790 *TX.BUFF.INIT 10800 DIM TX.BUFF(TX.BUFF.SIZE-1) 10810 GOSUB *TX.BUFF.CLEAR 10820 RETURN 10830 ' 10840 *TX.BUFF.CLEAR 10850 G.TX.BUFF.RP=0:'読み出しポインタ 10860 G.TX.BUFF.WP=0:'書き込みポインタ 10870 G.TX.BUFF.N=0 :'バッファ内データ数 10880 G.TX.BUFF.OV=0:'バッファオーバーフロー 10890 G.TX.BUFF.EM=0:'バッファ内エンプティ 10900 RETURN 10910 ' 10920 *TX.BUFF.WRITE 10930 IF G.TX.BUFF.N>=TX.BUFF.SIZE THEN G.TX.BUFF.OV=-1:RETURN 10940 TX.BUFF(G.TX.BUFF.WP)=G.TX.WRITE.DATA 10950 G.TX.BUFF.WP=(G.TX.BUFF.WP+1) MOD TX.BUFF.SIZE 10960 G.TX.BUFF.N=G.TX.BUFF.N+1 10970 G.TX.BUFF.OV=0 10980 RETURN 10990 ' 11000 *TX.BUFF.READ 11010 IF G.TX.BUFF.N=0 THEN G.TX.BUFF.EM=-1:RETURN 11020 G.TX.READ.DATA=TX.BUFF(G.TX.BUFF.RP) 11030 G.TX.BUFF.RP=(G.TX.BUFF.RP+1) MOD TX.BUFF.SIZE 11040 G.TX.BUFF.N=G.TX.BUFF.N-1 11050 G.TX.BUFF.EM=0 11060 RETURN 11070 ' 11080 ' 11090 *COMPORT.INIT 11100 OPEN COMPORT.NAME$ AS #1 11110 IF COMPORT.SPEED=0 THEN GOTO *COMPORT.INIT.1000 11120 OUT &H75,COMPORT.SPEED MOD 256 11130 OUT &H75,COMPORT.SPEED \ 256 11140 *COMPORT.INIT.1000 11150 G.COMPORT.ERROR=0 11160 ON COM GOSUB *COMPORT.INT 11170 RETURN 11180 ' 11190 *COMPORT.INT 11200 *COMPORT.INT.1000 11210 IF LOC(1)=0 THEN RETURN 11220 G.RX.WRITE.DATA=ASC(INPUT$(1,1)) 11230 GOSUB *RX.BUFF.WRITE 11240 IF G.COMPORT.ERROR=0 THEN G.COMPORT.ERROR=G.RX.BUFF.OV 11250 GOTO *COMPORT.INT.1000 11260 ' 11270 ' 11280 *SEND.DATA.TO.TRX 11290 PRINT #1,CHR$(G.SEND.DATA.TO.TRX); 11300 FOR SEND.DATA.TO.TRX.W=0 TO G.SEND.DATA.TO.TRX.W:NEXT 11310 RETURN 11320 ' 11330 ' 11340 *STOP.INT 11350 *FINISH 11360 IF G.COMPORT.ERROR<>0 THEN PRINT #2,"*****ERROR*****" 11370 COM OFF 11380 CLOSE 11390 COLOR 7 11400 END 11410 ' 11420 ' 11430 *MAIN 11440 INPUT "入力(データ)ファイル名:",IN.FILE.NAME$ 11450 INPUT "出力(ログ)ファイル名:",OUT.FILE.NAME$ 11460 GOSUB *READ.HEX.CHR 11470 GOSUB *RX.BUFF.INIT 11480 GOSUB *TX.BUFF.INIT 11490 GOSUB *COMPORT.INIT 11500 ON STOP GOSUB *STOP.INT 11510 STOP ON:COM ON 11520 ' 11530 *MAIN.1000 11540 CLOSE 2 11550 OPEN OUT.FILE.NAME$ FOR OUTPUT AS #2 11560 CLOSE 3 11570 OPEN IN.FILE.NAME$ FOR INPUT AS #3 11580 OFFSET.ADRS=0 11590 ' 11600 '送信データ準備 11610 *MAIN.1300 11620 COLOR 4 11630 IF EOF(3) THEN GOTO *MAIN.1400 11640 INPUT #3,INPUT.LINE$ 11650 'PRINT INPUT.LINE$ 11660 IF INPUT.LINE$="" THEN GOTO *MAIN.1300 11670 IF LEFT$(INPUT.LINE$,1)="'" THEN GOTO *MAIN.1300 11680 IF LEN(INPUT.LINE$)<>9 GOTO *MAIN.1380 11690 INPUT.DATA$=MID$(INPUT.LINE$,8,2) 11700 IF HEX.CHR$(VAL("&H"+INPUT.DATA$))<>INPUT.DATA$ THEN GOTO *MAIN.1380 11710 G.TX.WRITE.DATA=VAL("&H"+INPUT.DATA$) 11720 GOSUB *TX.BUFF.WRITE 11730 IF G.TX.BUFF.OV<>0 THEN PRINT:PRINT "**入力(データ)ファイルが大きすぎます**":GOTO *FINISH 11740 GOTO *MAIN.1300 11750 ' 11760 '送信データエラー 11770 *MAIN.1380 11780 PRINT:PRINT "**入力(データ)ファイルに誤りがあります**":GOTO *FINISH 11790 *MAIN.1400 11800 PRINT "--データの準備ができました。スペースバーを押してください--" 11810 *MAIN.1410 11820 K$=INKEY$:IF K$<>" " THEN GOTO *MAIN.1410 11830 GOSUB *RX.BUFF.CLEAR 11840 COLOR 7 11850 G.SEND.BLOCK.N=10:G.SEND.BLOCK.ACK=6:GOSUB *SEND.BLOCK 11860 IF SEND.BLOCK.ERROR=-1 THEN PRINT SEND.BLOCK.ERROR.MES$:GOTO *FINISH 11870 G.SEND.BLOCK.N=8:G.SEND.BLOCK.ACK=6:GOSUB *SEND.BLOCK 11880 IF SEND.BLOCK.ERROR=-1 THEN PRINT SEND.BLOCK.ERROR.MES$:GOTO *FINISH 11890 G.SEND.BLOCK.N=30000:G.SEND.BLOCK.ACK=6:GOSUB *SEND.BLOCK 11900 *MAIN.1450 11910 PRINT:PRINT "--書込み終了--" 11920 GOTO *STOP.INT 11930 ' 11940 ' 11950 'ブロック送信 11960 *SEND.BLOCK 11970 SEND.BLOCK.ERROR=-1 11980 SEND.BLOCK.ERROR.MES$="" 11990 SEND.BLOCK.N=G.SEND.BLOCK.N 12000 ' 12010 'データ送信動作 12020 *SEND.BLOCK.0500 12030 IF SEND.BLOCK.N=0 THEN GOTO *SEND.BLOCK.1000 12040 GOSUB *TX.BUFF.READ 12050 IF G.TX.BUFF.EM=-1 THEN SEND.BLOCK.ERROR.MES$="**入力(データ)ファイルが不足しています**":RETURN 12060 'PRINT #1,CHR$(G.TX.READ.DATA); 12070 G.SEND.DATA.TO.TRX=G.TX.READ.DATA:GOSUB *SEND.DATA.TO.TRX 12080 *SEND.BLOCK.0550 12090 COM STOP:GOSUB *RX.BUFF.READ:COM ON 12100 IF G.RX.BUFF.EM=-1 THEN GOTO *SEND.BLOCK.0550 12110 OUTPUT.STR$= HEX.CHR$(OFFSET.ADRS \ 256)+HEX.CHR$(OFFSET.ADRS MOD 256)+" : "+HEX.CHR$(G.RX.READ.DATA) 12120 PRINT #2,OUTPUT.STR$ 12130 PRINT OUTPUT.STR$ 12140 OFFSET.ADRS=OFFSET.ADRS+1 12150 SEND.BLOCK.N=SEND.BLOCK.N-1 12160 GOTO *SEND.BLOCK.0500 12170 *SEND.BLOCK.1000 12180 GOSUB *TX.BUFF.READ 12190 IF G.TX.BUFF.EM=-1 THEN SEND.BLOCK.ERROR.MES$="**入力(データ)ファイルが不足しています**":RETURN 12200 *SEND.BLOCK.1050 12210 COM STOP:GOSUB *RX.BUFF.READ:COM ON 12220 IF G.RX.BUFF.EM=-1 THEN GOTO *SEND.BLOCK.1050 12230 OUTPUT.STR$= HEX.CHR$(OFFSET.ADRS \ 256)+HEX.CHR$(OFFSET.ADRS MOD 256)+" : "+HEX.CHR$(G.RX.READ.DATA) 12240 PRINT #2,OUTPUT.STR$ 12250 PRINT OUTPUT.STR$ 12260 OFFSET.ADRS=OFFSET.ADRS+1 12270 IF G.RX.READ.DATA<>G.SEND.BLOCK.ACK THEN SEND.BLOCK.ERROR.MES$="**不正なACKです**":RETURN 12280 SEND.BLOCK.ERROR=0 12290 ' 12300 PRINT:PRINT "--ブロック送信完了--" 12310 RETURN