`
javatar
  • 浏览: 1681501 次
  • 性别: Icon_minigender_1
  • 来自: 杭州699号
社区版块
存档分类
最新评论

批量法作图(速度奇迹)

阅读更多
批量法作图(速度奇迹)
余海林的创始原帖:  
批量发送字节法:

先要了解字串变量在BASIC助手中的存放方式:
   一旦程序中出现A$="XXX"之类的字串赋值语句时,在内存中用A$代表的字串
"XXX"就会被保存在内存中(内存是RAM,不要理解成闪存).并且保存的地址也
会记录在内存中,在使用A$时BASIC平台就会按记录的地址去取出"XXX".
总之,一旦出现类似A$='XXX"的语句时,BASIC助手会完成两件事:
①把"XXX"存放起来;②把"XXX"存放的地址登记下来.

对于第2步,"存放地址登记",在内存中格式是这样的
(第一个是地址,后面是该地址的值):
7659-64(表示这个变量的类型是字串)
7660-65(字符"A"的ASCII码值)
7661-3 (A$的长度,因为"XXX"长度为3)
7662-254(低位地址)
7663-63 (高位地址)

"高位"、"低位"是什么意思?由于1字节能表示的数值只有0-255,所以用1字节
来记录地址是不够的,所以用了2字节。将 "低位"+"高位"*256 所得的结
果就是存放实际地址。可以用以下方法取得:(BASIC助手运行)
]10 A$="XXX"
]20 ADD=PEEK(7662)+PEEK(7663)*256
]30 PRINT ADD

PRINT出来的数字就是"XXX"的存放地址,如果不相信,再接下去:
]40 PRINT PEEK(ADD),PEEK(ADD+1),PEEK(ADD+2)
运行结果显示:
88
88
88

查ASCII码表,X的ASCII值果然是88。

下面是具体方法:
我们对"XXX"存放在哪不感兴趣,我们的兴趣在于怎样控制内存中的某一端数
据。

第一步:报名。在程序第一句中出现X$="X"之类语句,让BASIC助手记录下字串
X$的存放地址。

第二步:修改记录地址。只要X$是第一个被赋值的字串,它的地址必定为7662和
7663,只要按高低位的方法用POKE改了它的记录地址,BASIC助手就会把修改的
地址当作X$的记录地址。这样,用X$就可以调用指定地址的字串,用LSET X$=" "
就可以修改那段地址的谌?/TD> 

网友改善1:

作者: 立天
更简单批量法 FOR PC1010 NC2000 NC2600
在程序中用到批量法的时候,是否感到这个变动的批量法地址有点麻烦呢?
虽然这个地址可以很方便的求出来,但在每次修改完程序都要到资源管理器
去看一下程序大小,最终还是麻烦。现在,我可以在程序中极快的把它算出
来:它等于PEEK(A)+PEEK(A+1)*256(A=47302或47304或47757)
现在,我们用47302这个地址做一个实验吧!
10 A$="":B$=""
20 A=47302:D=PEEK(A)+PEEK(A+1)*256
30 POKE D+2,100:POKE D+3,0:POKE D+4,64
40 POKE D+7,100:POKE D+8,192:POKE D+9,2
50 LSET B$=A$:PRINT
可以看到,我们已成功把地址16384--16483这一百个地址的内容发送到了
地址704--803.
是不是方便很多呢?
以上程序在PC1010 NC 2000 NC2600 上通过测试,估计同样适用于PC2000.

网友改善2:

作者:SHEN(YUE)
首先来说说在NC2000A上使用批量法与其他型号的区别:

要想使用批量法,首先得知道存放“变量存放的高、低位地址”的地址在哪。
这就是NC2000A的特殊之处了。
NC2000A存放“变量类型,变量名,变量长度与变量存放的高、低位地址”的地址并不是一个固定的地址,它是一个不固定的,动态的地址。它存放在GVBASIC程序执行时在内存中的存放地址之后。所以在执行不同的GVBASIC程序的时,存放“变量类型,变量名,变量长度与变量存放的高、低位地址”的地址一般不同。

下面我将教大家找出这个动态的地址:(如果看不懂,文章最后还有修改实例)

把下面的语句加入要使用批量法的程序中:

0 9979

这里写要使用批量法的程序,程序中改存放“变量长度与变量存放的高、低位地址”的POKE语句还不知道具体地址,先用一个任意五位数(如:00000)代替。

9979 FOR A=8192 TO 65535:IF PEEK(A) THEN B=0 ELSE B=B+1:IF B=3 THEN PRINT A-69,A+1:END

9989 NEXT

然后运行程序得到两个数字
这两个数字都是存放程序中第一个变量的第一个数据(变量类型)的地址(一会儿再说这两个数的区别),通过它,往后顺延就可以知道每个变量的每个数据(变量类型,变量名,变量长度与变量存放的高、低位地址)的存放位置了。

下面说这两个数的区别:
第一个数是程序还在调试,没有最后完成时使用的。在用这个数时不必把加入程序的,找地址的语句(就是0 9979 , 9979 FOR A=8192 TO 65535:IF PEEK(A) THEN B=0 ELSE B=B+1:IF B=3 THEN PRINT A-69,A+1:END , 9989 NEXT)删掉,把行号0的语句改为:0 GOTO 你程序的第一行,注意要用四位数写。(比如你程序的第一行行号为10,那么就改为0 GOTO 0010)然后就可以执行你的程序了(别忘了把刚才得到的地址改入程序,注意要用五位数写)。

第二个数是程序制作完毕时使用的,用这个数时需把找地址的语句(就是0 9979 , 9979 FOR A=8192 TO 65535:IF PEEK(A) THEN B=0 ELSE B=B+1:IF B=3 THEN PRINT A-69,A+1:END , 9989 NEXT)删掉,其他的跟第一个数一样,只是不用把行号0的语句改为“0 GOTO 你程序的第一行”了(因为已经删了)。

注意:
1.在找地址时你的程序必须和使用这个地址时的程序必须一样!因为这两个地址都是动态的。(有一些可以改:比如改数字,只要位数不变,就可以。)
2.我写的程序要原样照抄,还是“动态”的缘故。

下面举一个例子方便理解:

我举的这个例子是把A$的存放地址改到NC2000A的存放秒的位置上,也就是地址1017,并显示不断变化的A$。

第一步:写程序
10 A$="A":POKE 00000,249:POKE 00000,3
20 PRINT A$:GOTO 20

第二步:把找地址的语句加入程序,变成

0 9979
10 A$="A":POKE 00000,249:POKE 00000,3
20 PRINT A$:GOTO 20
9979 FOR A=8192 TO 65535:IF PEEK(A) THEN B=0 ELSE B=B+1:IF B=3 THEN PRINT A-69,A+1:END
9989 NEXT

第三步:执行程序

显示出两个数
8238
8308

第四步:修改程序,这是我们使用第二个数,不删把找地址的语句。
通过知道存放程序中第一个变量的第一个数据(变量类型)的地址8308,就可以知道8309是变量名,8310是变量长,8311和8312就是我们要改的存放“变量存放的高、低位地址”的这个地址,把这两个地址代入程序,注意如果不够五位要在前面加“0”补位。然后把行号0的语句改为:0 GOTO 你程序的第一行(也就是行号为10的那行),并用“0”补齐4位。
把程序改为:
0 GOTO 0010
10 A$="A":POKE 08311,249:POKE 08312,3
20 PRINT A$:GOTO 20
9979 FOR A=8192 TO 65535:IF PEEK(A) THEN B=0 ELSE B=B+1:IF B=3 THEN PRINT A-69,A+1:END
9989 NEXT

第五步:试运行程序
发现程序按我所想象的那样显示不断变化的A$。

在程序全部完成并试运行正确的情况下,执行第六步

第六步:修改程序,把找地址的语句删除,并通过第一个数算出存放程序中存放“变量存放的高、低位地址”的这个两地址(8241和8242),并代入程序。
10 A$="A":POKE 08241,249:POKE 08242,3
20 PRINT A$:GOTO 20

这样程序就完成了,执行效果和第五步试运行时一样。
完成后,就不要做什么改动了,如果要改,那么就得从第一步开始算出新的地址。

最后献上用这个方法制作的NC2000A的速度检测程序,数越大,越快。
0 GRAPH:A$="A":POKE 8289,249:POKE 8290,3
1 B$=CHR$(PEEK(1017)):FOR A=0 TO 999:IF A$<>B$ GOTO 3
2 NEXT
3 LOCATE 1,1:PRINT A:GOTO 1
我的NC2000A是832,记得我以前的NC1020是772




批量法再提速--作者: 116205035

此法用于2000 ,2600 可能有用

结合批量法的使用:
POKE 34731,9

这样改了后呢,就可以用 BOX XX,YY,XX1,YY1,1,0

帖图了!

152,153 是图片数据的地址。

比批量法快 N 多。

一秒大概 10 多张图吧。

(我玩星星较晚,若先前有人发现过这样的做法,请谅解)

比如你有一张 16*16 的图片,它有 32 字节的数据对吧。

要你将它在屏幕上显示,怎么做呢?一般的话BAS 做这样的工作是很慢的。一张 16*16 的图也要 1 秒。

只需这样做: POKE 34731,9

这是第一步。

2。将图片数据 POKE 到内存。该地址为 :XX+YY*265

3。 POKE 152,XX:POKE 153:YY

4。 调用画矩形的函数:BOX XX,YY,XX+15,YY+15,1,0

如此即可将该 16*16 的图片显示到 以 (XX,YY) 为左上角的矩形上。

速度比一般的快的多啦!

附:结合批量法后即可方便地进行帖图了,可大大提高BAS 程序的画面质量,特别是游戏!

如需再画矩形则 POKE 34731,10。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics