100 '*********************************************
110 '*
120 '* R9211 FLOPPY data reading program
130 '*
140 '* for VIEW FILE data
150 '*
160 '*
REV 1.00
170 '*
180 '***********************************************
190 OPTION BASE 1
'最小下标 1
200 '
'定义数组
210 DIM D(13000),SCL#(3),DATAX(3),PNT(3),DTYP(3)
'定义数组
220 '
230 CLS 3
'清屏
240 '
250 ' input read file name.
260 'FL$ = "c:vfe__001.vfe":GOTO
1240
270 INPUT "CURRENT DRIVE ?",DRIVE$
'提示,并要求输入一个字符串
280 INPUT "FILE FUNCTION ?",FUNC$
'提示,并要求输入一个字符串
290 INPUT "FILE NUMBER
?",FILENM$
'提示,并要求输入一个字符串
300 IF LEN(FILENM$) = 0 THEN FILENM$ = "000"
'如果输入为空,则生成默认值
310 IF LEN(FILENM$) = 1 THEN FILENM$ = "00"+FILENM$
320 IF LEN(FILENM$) = 2 THEN FILENM$ = "0"+FILENM$
330 FL$ = DRIVE$+":vf"+FUNC$+"__"+FILENM$+".vf"+FUNC$
'字符串连接
340 PRINT "input file name is ",FL$
'显示内容
350 '
360 '*************************************************
370 ' read data from floppy.
380 '
390 'GOSUB 2000
'read floppy data
400 '
410 '************************************************
420 'set control flag
430 '
440
GOSUB 510
'调用 510 行开始的子程序
450 '
460 '=================data display =====================
470 GOSUB 1130
'调用 1130 开始的子程序
480 '
490 END
'程序结束
500 '***************************************************
510 '***********************************************
'子程序入口,注释
520 ' set control flag
530 '
540 AOF = 513
550 '
560 '=======top of X axis data array ==
570 '
580 P= 145
590 GOSUB
1680
' 32bit ineger
'调用 1680行的子程序
600 XTOP = INTX*256 +1
610 '
620 '===size of array ==
630 P = 149
640 GOSUB 1680
'32 bit integer
'调用 1680行的子程序
650 DATAN = INTX/4
660 '
670 '=== X axis scale and offset value ==
680 N = 153
690 GOSUB 1420
'IEEE float format
'调用 1420 行的子程序
700 XSCALE# = A#
710 '
720 N =157
730 GOSUB 1420
' IEEE float format -- float data
'调用 1420 行的子程序
740 XOFSET# = A#
750 '
760 '=== top of Y axis data array ==
770 P= 161
780 GOSUB 1680
'32
bit integer
'调用 1680行的子程序
790 YTOP = INTX*256 +1
800 '
810 '=== Y axis scale and offset value ==
820 N =169
830 GOSUB 1420 ' IEEE floating format
'调用 1420 行的子程序
840 YSCALE# =A#
850 '
860 N = 173
870 GOSUB 1550 ' IEEE float format
'调用 1550 行的子程序
880 YOFSET# =A#
890 '
900 '======display scale ===========
910 AOF = 513
920 VM = AOF +D(AOF)*256+D(AOF+1)+ 768 +112
'VIEW INFORMATION
930 '
940 N = VW+60
950 GOSUB
1550
'IEEE 64 bit floating format
'调用 1550 行的子程序
960 XMAX = ID#
970 '
980 N = VW +68
990 GOSUB 1550
'调用 1550 行的子程序
1000 XMIN =ID#
1010 '
1020 N = VW + 76
1030 GOSUB
1550
'IEEE 64 bit floating format
'调用 1550 行的子程序
1040 YMAX = ID#
1050 '
1060 N = VW + 84
1070 GOSUB 1550
' IEEE 64 bit floating format
'调用 1550 行的子程序
1080 YMIN =ID#
1090 '
1100 RETURN
'子程序结束,返回调用
1110 '**********************************************
1120 'display view file data
1130 '
1140 CLS:CLS 2:SCREEN 2,0,0
'graphics mode ON
'清屏,清屏,设置屏幕为 2 号类型。2号类型要去查表,此命令 VB不支持,可以查 QB
1150 GOSUB 1730
'调用 1730 行的子程序
1160 DMAX = -YMAX:DMIN = YMAX
1170 STPN = 4
1180 XN = XTOP : YN =YTOP
1190 N =XN
1200 GOSUB 1420
'IEEE floating format
'调用 1420 的子程序
1210 NX = A#*YSCALE# + XOFSET#
1220 '
1230 N=YN
1240 GOSUB 1420
'IEEE floating format
'调用 1420 的子程序
1250 NY = A#*YSCALE# -YOFSET#
1260 '
1270 FOR I=1 TO DATAN-1
'循环
1280 N= XN + I*SPTN
1290 GOSUB 1420
'IEEE format --> 32 bit floating data.
'调用 1420 的子程序
1300 XP = A# *XSCALE# + XOFSET#
1310 '
1320 N =YN +I*STPN
1330 GOSUB 1420
'IEEE format --> 32 bit floating data.
'调用 1420 的子程序
1340 YP = A# *YSCALE# - YOFSET#
1350 '
1360 LINE (XP,YP)-(NX,NY),2
'画线
1370 NX = XP : NY = YP
1380 NEXT I
1390 '
1400 RETURN
1410 '******************************************************
1420 ' IEEE 32 bit floating format --> floating data
1430 '
1440 X1 = D(N) : X2 = D(N+1) :X3 = D(N+2) :X4 =D(N+3)
1450 IF (X1=0) AND (X2=0) AND (X3=0) AND (X4=0) THEN 1460 ELSE 1480
'这句没看懂。感觉少了 goto 命令,没用过这种的用法,也许是可以省略goto 命令。用作分支选择。
1460
A# = 0!
1470 GOTO 1530
'跳转到 1530 行执行
1480 SIGN =(-1)^((X1 AND 128)/128)
1490 EXP1 =((X1 AND 127)%2 + (X2 AND 128)/128)127
1500 EXPO#= 2^EXP1
1510 FRAC#= ((X2 OR 128)+(X3 +X4/256)/256)/128
1520 A# = SIGN*EXPO#*FRAC#
1530 RETURN
'子程序结束,返回调用
1540 '******************************************************
1550 'IEEE 64 bit floating format --> double data
1560 X1 = D(N) : X2 = D(N+1) :X3 = D(N+2) :X4 =D(N+3)
1570 X5 = D(N+4) : X6 = D(N+5) :X7 = D(N+6) :X8 =D(N+7)
1580 IF (X1=0) AND (X2=0) AND (X3=0) AND (X4=0) AND (X5=0) AND (X6=0)
AND (X7=0) AND (X8=0) THEN 1590 ELSE 1610
'同样,goto 分支选择
1590 ID# = 0!
1600 GOTO 1660
1610 SIGN =(-1) ^((X1 AND 128)/128)
1620 EXP1 =((X1 AND 127)%16 + (X2 AND 240)/16)-1023
1630 EXPO#= 2^EXP1
1640 FRAC#=(((((((X8/256)+X7)/256+X6)/256+X5)/256)+X4)/256+X3)/256+((X2 AND 15) OR 16)/16
1650 ID# = SIGN*EXPO#*FRAC#
1660 RETURN
'子程序结束,返回调用
1670 '*******************************************************
1680 '32 bit integer data
'1680 调用的子程序
1690 '
1700 INTX = ((D(P)*256)+D(P+1))*256 + D(P+2))*256+ D(P+3)
1710 RETURN
'子程序结束,返回调用
1720 '
1730 '********************************************************
1740 ' view scale
1750 WINDOW (XMIN,YMIN)-(XMAX,YMAX)
'设置更新区域??这条命令不清楚
1760 VIEW (50,40)-(600,160),,1
'设置显示区域??这条命令不清楚,TB 好像才支持这条命令
1770 LINE (XMIN,YMIN)-(XMAX,YMIN)
'画线
1780 LINE (XMAX,YMIN)-(XMAX,YMAX)
1790 LINE (XMAX,YMAX)-(XMIN,YMAX)
1800 LINE (XMIN,YMAX)-(XMIN,YMIN)
1810 FOR X=XMIN TO XMAX STEP(XMAX-XMIN)/10
1820 LINE (X,YMIN)-(X,YMAX)
1830 NEXT X
1840 FOR Y=YMIN TO YAMX STEP (YMAX-YMIN)/10
1850 LINE (XMIN,Y)-(XMAX,Y)
1860 NEXT Y
1870 '
1880 '----------SCALE-----------
1890 LOCATE 6,2
'屏幕定位到第6行,第2列
1900 PRINT YMAX
'显示内容
1910 LOCATE 20,2
'定位
1920 PRINT YMIN
'显示内容
1930 LOCATE 5,2
1940 PRINT XMIN
1950 LOCATE 5,60
1960 PRINT XMAX
1970 LOCATE 1,1
1980 RETURN
'子程序结束,返回调用
1900 '***************************************************
2000 'data read from floppy
2010 OPEN "RB",#1,FL$
'打开文件
2020 FIELD #1,64 AS X$,64 AS Y$
'设置文件结构,我没用过这种的写法
2030 '
2040 GET #1
'读数据
2050 GET #1
2060 FOR N=1 TO 64
2070 D(N+128)=ASC(MID$(X$,N,1))
'TRANSFER BIN
TO VALUE
'解出每个字符为 BYTE
2080 NEXT N
2090 FOR N= 1 TO 64
2100 M=N+64
2110 D(N+128)=ASC(MID$(Y$,N,1))
'TRANSEFER BIN TO VALUE
2120 NEXT N
2130 '
2140 ' check data size
2150 P=177
2160 GOSUB 1680
'调用 1680行的子程序
2170 MAXBUF =INTX*2
2180 '
2190 FOR L=3 TO MAXBUF
2200 GET #1
'读数据
2210 FOR N=1 TO 64
2220 M=128*(L-1)+N+64
2230 D(M)=ASC(MID$(X$,N,1))
2240 NEXT N
2250 FOR N=1 TO 64
2260 M=128*(L-1)+N+64
2270 D(M)=ASC(MID$(Y$,N,1))
'TRANSFER
2280 NEXT N
2290 NEXT L
2300 GOTO 2400
'跳转到 2400 行执行
2310 FOR I=1 TO 2048 STEP 24
2320 'IF(I>1) AND (((I-1) MOD 512)=0) THEN INPUT DMY
2330 ANS$=""
2340 FOR J=0 TO 23
2350 AD$=HEX$(D(I+J)):IF LEN(AD$)=1 THEN AD$="0"+AD$
2360 ANS$ =ANS$+AD$
2370 NEXT J
2380 PRINT HEX$(I-1),ANS$
2390 NEXT I
2400 RETURN