易码技术论坛

 找回密码
 加入易码
搜索
查看: 2390|回复: 8

[归档] 求助!关于WQX文件

[复制链接]
发表于 2008-1-17 13:38:54 | 显示全部楼层 |阅读模式
WQX自带的文件(如hero,change等)他们存在那里啊
我用tool-2600搜索00-FF的0000-FFFF都没有?难道它们没有存在WQX这不可能吧?
那么他们究竟在那里那?怎么找到他们?
还有一个问题就是FFFF*FF大概等于16MB的样子
而WQX应该有32左右的内存,那其他的数据在那里?
发表于 2008-1-17 18:54:49 | 显示全部楼层
从2000开始的机器,文件数据开始用nand-flash储存,而不是nor-flash,所以这么查是查不到的.....
2600的话,系统文件夹为 <sysdir>,中断 050d 切目录,0514、0515读文件,0516关闭.....
具体你在论坛里找找吧.......
发表于 2008-1-17 19:01:46 | 显示全部楼层
以前玩wqx时的一些资料:

(1)int$c719
刷新字符缓存

可以将当前在文字缓存的内容显示到屏幕
文字缓存从地址$02c0开始,具体大小由当前字体决定

相关参数0392/$0393:/$03af/$03b0:切换4种字体
wqx一共可以切换出4种不同的字体,分别是:
a.当$0392=0,$0393=1,$03af=ff,$03b0=ff时,显示正常的8*16字体
b.当$0392=1,$0393=0,$03af=ff,$03b0=ff时,显示如wqxhexnc那样的6*12小字体

c.当$0392=0,$0393=1,$03af=$03b0=0时,显示如英汉字典,debug那样的8*8小字

d.当$0392=1,$0393=0,$03af=$03b0=0时,显示如文书浏览的纯英文模式那样的6*6小字

在c,d字体下,将无法正常显示中文或特殊字符
另外,$03b1和$03b2,是设定刷新行的,比如令$03b2=f7,可以单刷新最下面一行的内容而不破坏别处的内容

(2)int$c737
刷新屏幕
这是单纯的刷新屏幕的中断,可以将屏幕上的内容清去而不会破坏文字缓存的内容
在小字状态下刷新屏幕应加上该中断,否则在屏幕左边会出现乱纹

(3)int$c733
转数字为ascll码
入口$80,$81
$80,$81放要转换的数字,结果会在$82-$85,
此函数的作用在于将数据转换为可显示的字符
(4)int$c72a
刷新屏幕及文字缓存
在清空屏幕内容的同时,此函数会将文字缓存中的内容一并清除,小字状态下应和int$c737一同使用

(5)int$ca12
信息框
参数:x,y:参数表地址
a:类型
参数表格式:80(固定)xx yy (yyxx为文字所在地址,文字以00结尾或换行) aa bb
(aa,bb信息框所在位置的x,y轴) cc (文字长度,最大#$10) dd
(行数,dd=02,一行,=04,二行...最大4行) ee (文字状态,=02 8*16字正常,=04 8*8字正常 =82
8*16字反显 =84 8*8字反显) mm nn(nnmm为ee所在地址)
a=00正常
a=02是否选择框,图标为?
a=03是否选择框,图标为!
a=01菜单选择框

当a=1 or
2时,int$ca12后用户选择在a中,若a=#$79说明选了"是",不等于说明选了"否"


(6)int$cb03
系统菜单
x,y为参数表位置
参数表:xx
(xx=09时为竖向菜单,如"版本信息"的那种,xx=02时为横向菜单,如systools) xx1 yy1(选择第一个菜单项后运行的地址) yy1
xx1(第一个菜单项的帮助信息所在地址,以00 00结尾) xx2 yy2 yy2 xx2.... ss1
(第一个菜单项的文字信息) ff (文字间用ff隔开) ss2 ff ss3..... ff (最后以ff结尾)


(7)int$014a
打开联机通讯i/o
(相关设置0f00-$0f04)
0f00-0f04=b0 f0 11 00 00:打开红外i/o
0f00-0f04=10 f0 11 12 00:打开串口i/o

(8)int$0306
写入密码

将$0b00-$0b32的密文覆盖当前密文,当0b00-0b32皆为00时可起到清除密码的作用

(9)int$050d
进入目录
目录名08d6开始,00结尾
若进入失败则c=1否则c=0

(10)int$0522
退回根目录


(11)int$050b
创建目录
参数:$0912<>02:无法创建
创建后c=1说明不成功,否则c=0

(12)int$0514
打开文件
打开方式:$0912
#$70:新建
#$81:追加
#$80:打开
成功则c=0,or c=1

(13)int$0515
读文件
dd,de:开始地址
090f,0910:大小
成功则c=0,or c=1

(14)int$0517
写文件
$dd,$de:数据地址
$090f,$0910:大小
成功c=0,or c=1

(15)int$0516
关闭文件

(16)int$051b
空间整理(图形)

(17)int$051c
空间整理(实质)

(18)int$0505
读nand扇区
$08ae,$08af:扇区号
$0a1b,$0a1c:大小
$dd,$de:开始地址

(19)int$000c
将所有版本信息读入$0b00-$0b20

(20)int$c024
读取隐藏的nor flash
相关设定:
$57:页
$5a,$59:地址
$5b,$5c:大小
其它$57-$5d应设为00

(21)int$cb07
输入法
x,y:参数表
$0448:中文输入法提示类型
$0391:光标类型,一般设为01
参数表:xx (光标位置,00-3a) yy (最大可输入字符数) zz (类型,20:正常
10:只可输入数字 b0:只可输入中文 c0:只可输入英文) aa bb (帮助信息所在地址)

(22)int$c00a
按键停顿
按键值在a中

(23)int$ca03
乘法
参数:x,a:2欲相乘数
80-81:结果

(24)int$ca14
等级棒
x,y:参数表
0x(级别个数) ....(第一级别文字,长度#$10,不足用20补) xx xx(第一级入口)
....第二级...

(25)int$ca0e



(26)int$ca0f
椭圆

(27)int$ca0a
方块

(28)int$ca0b
直线

(29)int$ca10
填充圆

(30)int$ca0c
填充方块

(31)int$ca11
填充椭圆

(32)int$cb01
系统debug

(33)int$0604
系统密码
输入正确或无密码则c=1

(34)int$0518
追加读写(修改读写指针位置)
$0916-$091a:追加位置

(35)int$0310
返回上级中断

(36)jsr$e030
延时
时间=X

(37)jsr$e081
load hot key
如要加载/sysdir/hero
将/sysdir/hero+00
送至08d6开始的地址后运行jmp$e081即可

(38)int$c001
重启或重开机
03f4=a5:重开机 or 重新启动

(39)int$ca17
正在查找

(40)int$ca18
没有找到

(41)int$0524/int$0525
文件快速读取
dd=25,de=06,0915=0
int$0524:进目录
dd,de:开始地址,090f,0910:大小
int$0525:读取文件

(42)int$014c
进度条
$88,89:总长度
$86,87:当前长度
$83:=0:百分比显示,=1:数字显示

(43)jsr$ea35
读nor flash
c8,c9:地址
$061f:页
用前先:ldy#$00

(44)jsr$e015
"哔"的一声

(45)int$c72d
左上液晶数字

$80,$81:数值

(46)int$c71d
设光标位置
x,y:位置

(47)int$050e
删除文件或目录
名称放$08d6开始,只能删除空目录

(48)int$0506
读目录中文件列表

(49)int$c72c
左边滚动条
$80,81:总长
$82,83:当前长

(50)int$0718
读取nand version

NC2600文件系统中断

0501:测试超级块
0502:更新物理区/逻辑区映射表
0503:读取一页nand(物理,不做ecc)
0504:读取一页nand(物理,做ecc)
0505:读取nand(逻辑)
0506:读取一页nand(逻辑)
0507:读取1字节nor
0508:读取多字节nor
0509:根据指定的inode号找出对应的目录名(INODE:$091B,$091c NAME:$08d6)
050a:测试目录是否可列出
050b:创建目录
050c:读取目录
050d:切换工作目录(NAME=$08d6)
050e:删除文件(NAME:$08d6)
050f:删除目录(NAME:$08d6)
0510:重命名文件(SOURCE NAME:$08d6,NEW NAME:$0961)
0511:修改指定文件属性1(参数:$0948,永久)
0512:修改当前文件属性1(暂时)
0513:测试文件属性1
0514:打开或创建文件
0515:读文件
0516:关闭文件
0517:写文件
0518:更改文件读写指针位置
0519:读inode
051a:读一个inode
051b:空间整理_释放已删除空间
051c:空间整理_删除无用的分配表信息
051d:重启时空间整理1
051e:重启时空间整理2
051f:检测已创建而未关闭的文件
0520:处理已创建而未关闭的文件
0521:无用中断,原为永久修改指定文件属性2,可能出于安全考虑,入口被注
0522:关闭所有文件
0523:格式化闪存用户区并重置文件系统
0524:打开文件
0525:读取文件
0526:更改文件读写指针
0527:资源管理器1
0528:快速读NAND,逻辑读取,08d1,08d2:块,08d3,08d4,偏移,ed,ee地址,0a1B:大小,最多只能读255B
0529:获得及检测NAND厂商和设备号
052a:处理物理区/逻辑区映射表
052b:同上
052c:同上
052d:若指定文件>64kb,则读出其所占的块到$c000
052e:获取文件长度
0601:计算ECC
0602:比校ECC

NC2600BIOS调用

E006 bin2digit ;转1BYTE数据为字符模式
E009 enter_sleep ;进入休眠
E00C enter_sleepz  
E00F start_4ch
E012 stop_4ch
E015 bell ;响铃
E018 key_click_bell ;按键音
E01B mspeed4 ;延时
E01E speed5 ;关timer1
E021 speed5 ;关timer1
E024 cspeed
E027 mspeed
E02a delay_time ;延时
E02D delay_time1 ;延时
E030 wait_1_sec ;等待1秒
E033 wait_160_ms ;等待160毫秒
E036 isdigit ;判断是否为数字
E039 enable_dac_out
E03C disable_dac_out  
E03F start_sound  ;打开声音
E042 stop_sound  ;关闭声音
E045 out_celp_data
E048 TTS_Sleep
E04B TTS_Wakeup
E04E TTS_Reset
e051 Adj_Volume  ;增加音量
E054 wait_dsp1_ready  ;等待DSP1准备
e057 move_to_ram ;复制子程序至RAM
E05A get_8x8_font ;获取8x8大小字体至$0280开始的地址
E05D ProcKey ;按键选择
E060 Proc_Key ;按键选择2
E063 case ;选择
E066 TwoHz ;读系统时间入时间映射地址
E069 gysdata ;跨页读取数据
E06C playdt ;pc喇叭播放音乐
E06F set_alarm_on ;设置闹铃开
E072 get_next_data ;no use
E075 getunicode ;获取UNICODE码(nand)
E078 log_to_ph
E07B oldmon ;系统debug
E07E ChargeManager ;电源管理
E081 spe_exe_file ;执行热键文件
E084 move_rbuf_databuf ;移动读nand缓冲入数据缓冲
E087 move_databuf_wbuf ;移动数据缓冲入写nand缓冲
E08A phyWrite_512B ;写入512B nand
E08D phyWrite_16B ;写入16B nand
E090 phyRead_16B ;读取16B nand
E093 phyRead_512B ;读取512B nand
E096 phyRead_byte ;读取1B nand
E099 NgffsMoveData
E09C disp_icon ;显示符号
E09F downexec 执行bin file
E0A2 proc_menuI  ;图形化菜单程序
发表于 2008-1-17 19:03:22 | 显示全部楼层
键盘io操作

testa:测试参数
testb:返回

lda #$00
sta $15
lda #$00
sta $08
lda #$f0
sta $0f
lda testa
sta $08
lda $09
sta testb
lda #$00
sta $0f
rts
瞬间检测
按键对应关系

  testa=01h 测试开关键,若该键被按下,返回1

  testa=02h 测试以下键(热键名以nc2600为例):
时间、行程、名片、英汉、剑桥、计算、网络 依次返回:01h,02h,04h,08h,10h,20h,40h

  testa=04h 测试以下键: f1,f2,f3,f4,复读,发音
(若上面的键被按下,则依次返回01h,02h,04h,08h,10h,20h)

  testa=08h 测试: o,l,方向上,方向下,p,输入,翻页下,方向右
返回:01h,02h,04h,08h,10h,20h,40h,80h

  testa=10h 测试: q,w,e,r,t,y,u,i 返回:
01h,02h,04h,08h,10h,20h,40h,80h

  testa=20h 测试: a,s,d,f,g,h,j,k 返回;
01h,02h,04h,08h,10h,20h,40h,80h

  testa=40h 测试:z,x,c,v,b,n,m,翻页上 返回:
01h,02h,04h,08h,10h,20h,40h,80h

  testa=80h 测试:求助,中英数,输入法,跳出,符号,.,空格,方向左 返回:
01h,02h,04h,08h,10h,20h,40h,80h

这样,就可以完全通过io来读取键盘输入了!

NANDFLASH的擦除:

入口参数:A00,A01 :虚拟块地址。

ldx #$07
jsr $e024//cspeed
lda #$00
sta $08ac
lda #$00
sta $08ad
lda $0a00
sta $08ae
lda $0a01
sta $08af
lsr $08af
ror $08ae
ror $08ad
lsr $08af
ror $08ae
ror $08ad
lsr $08af
ror $08ae
ror
$08ad//经过一系列的位移运算,我们得出了实际上的FLASH地址,即乘于了32,再减去32(因为要避开0000扇区,擦写那是危险的,所以加上一个16K,从此得出,我们用WQXHEX读出的0000
不是真的0000)
php
sei //设置禁止中断,硬件操作时用来防止外界的干扰。
lda $0435
and #$bc
ora #$09
sta $18 //打开端口
lda #$60
sta $29
lda $0435
and #$bc
ora #$0a
sta $18 //发送准备檫写的命令,是直接的硬件口位操作,不必深究。
lda $08ad
sta $29
lda $08ae
sta $29
lda $08af
sta $29 //定位NAND
lda $0435
and #$bc
ora #$09
sta $18
lda #$d0
sta $29 //檫!
lda #$00
sta $08f7
lda #$0f
sta $08f8 //檫的数量,这里连续擦了32块512B的FLASH。
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop//10个
ldy #$00
ldx #$ff
bb:
lda $18
and #$20 //擦完就跳转
bne aa
dex
bne bb
dey
bne bb //执行中
aa:
lda $0435
and #$bc
ora #$01
sta $18
lda #$70 //read flash id
sta $29
lda $0435
and #$bc
sta $18
ee:
lda $29
sta $08bd
and #$40
bne cc
lda $08f7
bne l1
dec $08b8
l1:
dec $08f7
ora $08f8
bne ee
cc:
lda $08b0
and #$01
bne dd  //成功了,挑到 DD 去关端口
lda $0435 //失败,关掉IO
and #$bc
ora #$01
sta $18
lda #$ff
sta $29
lda $0435
and #$94
ora #$40
sta $18
sta $0435 //关闭
plp
clc //失败的标志
rts
dd:
lda $0435 //成功,关掉IO
and #$bc
ora #$01
sta $18
lda #$ff
sta $29
lda $0435
and #$94
ora #$40
sta $18
sta $0435 //关闭
plp
sec //成功的标志
rts

写NAND FLASH

入口参数:

0a00,0a01: 扇区的虚拟地址,指向开头处
0a02:这是要写如数据的FLASH 块,因为虚拟的地址,所以我们通常说的一扇区是
16K。但 NAND 一次只能写 512B 的东西,16K
有20个512B。0a02指的就是第几个512B,即实际块。
比如要写第一个 512B ,就将 0a02置00

ldx #$07
jsr $e024//cspeed
lda #$00
sta $08ac
lda #$00
sta $08ad
lda $0a00
sta $08ae
lda $0a01
sta $08af
lsr $08af
ror $08ae
ror $08ad
lsr $08af
ror $08ae
ror $08ad
lsr $08af
ror $08ae
ror
$08ad//经过一系列的位移运算,我们得出了实际上的FLASH地址,即乘于了32,再减去32(因为要避开0000扇区,擦写那是危险的,所以加上一个16K,从此得出,我们用WQXHEX读出的0000
不是真的0000)
lda $0a02
and #$1f
sta $08ad //0---1f 是32 个数,就是那 32
块。不能超过,不然就写到下一个扇区了,这里用 and 运算置零某些位。
php
sei //设置禁止中断,硬件操作时用来防止外界的干扰。
lda $0435
adn #$bc
sta $0435
lda $0435
and #$bc
ora #$09
sta $18 //打开端口
lda #$00
sta $29 //注意:这里要LDA #00
lda $0435
and #$bc
ora #$09
sta $18
lda #$80
sta $29 //发送准备写的命令
lda $0435
and #$bc
ora #$0a
sta $18
lda $08ac
sta $29
lda $08ad
sta $29
lda $08ae
sta $29
lda $08af
sta $29 //定位NAND
lda $0435
and #$bc
ora #$08
sta $18
-------------
******************************************
这里要自己写程序,将要写数据依次发送到$29.
******************************************
最多 512 B
-------------
lda $0435
and #$bc
ora #$09
sta $18
lda #$10
sta $29 //命令,开始写!~
nop
nop
nop
nop
nop //给出时间让芯片写数据
ldy #$00
ldx #$ff
bb:
lda $18
and #$20
bne aa
dex
bne bb
dey
bne bb //执行中
aa:
lda $0435
and #$bc
ora #$01
sta $18
lda #$70
sta $29 //read flash id
cc:
lda $0435
and #$bc
sta $18
lda $29
sta $08bd
and #$40
beq cc //一大段的验证程序
lda $08b0
and #$01
bne dd
lda $0435
and #$bc
ora #$01
sta $18
lda #$ff
sta $29
lda $0435
and #$94
ora #$40
sta $18
sta $0435
plp
clc
rts //失败了,关掉 IO 口
dd:
lda $0435
and #$bc
ora #$01
sta $18
lda #$ff
sta $29
lda $0435
and #$94
ora #$40
sta $18
sta $0435
plp
sec
rts //成功了,关掉 IO 口

注:要16K的话就要循环写 32 次了。

任意位置(精确到象素)任意大小图片显示子程序

  混乱羽翼

入参:$80,81图片数据开始地址
   $82图片宽度以byte为单位
   $83图片高度以象素为单位
   $84,85图片显示位置以最左上点为0,0长高都以象素为单位
出参:无

CODE $2010
2010- LDA #$C0
2012- STA $7E
2014- LDA #$19(如为1020则把此处改为LDA #$09)
2016- STA $7F
2018- LDY $85
201A- BEQ $202A
201C- CLC
201D- LDA $7E
201F- ADC #$14
2021- STA $7E
2023- BCC $2027
2025- INC $7F
2027- DEY
2028- BNE $201C
202A- LDA $84
202C- LSR
202D- LSR
202E- LSR
202F- CLC
2030- ADC $7E
2032- STA $7E
2034- BCC $2038
2036- INC $7F
2038- LDA $84
203A- LDX #$03
203C- LSR
203D- BCS $2069
203F- DEX
2040- BNE $203C
2042- LDX $83
2044- LDY #$00
2046- LDA ($80),Y
2048- STA ($7E),Y
204A- INY
204B- CPY $82
204D- BNE $2046
204F- CLC
2050- LDA $7E
2052- ADC #$14
2054- STA $7E
2056- BCC $205A
2058- INC $7F
205A- CLC
205B- LDA $80
205D- ADC $82
205F- STA $80
2061- BCC $2065
2063- INC $81
2065- DEX
2066- BNE $2044
2068- RTS
2069- LDA $84
206B- LSR
206C- LSR
206D- LSR
206E- ASL
206F- ASL
2070- ASL
2071- STA $3000
2074- LDA $84
2076- SEC
2077- SBC $3000
207A- STA $3000
207D- LDA $83
207F- STA $86
2081- LDY #$14
2083- LDA #$00
2085- STA $3000,Y
2088- DEY
2089- BNE $2085
208B- LDY #$00
208D- LDA ($80),Y
208F- STA $3001,Y
2092- INY
2093- CPY $82
2095- BNE $208D
2097- LDX $3000
209A- LDY #$00
209C- CLC
209D- LDA $3001,Y
20A0- ROR
20A1- STA $3001,Y
20A4- PHP
20A5- INY
20A6- CPY $82
20A8- BEQ $20AF
20AA- PLP
20AB- LDA #$00
20AD- BEQ $209D
20AF- PLP
20B0- LDA $3001,Y
20B3- ROR
20B4- STA $3001,Y
20B7- DEX
20B8- BNE $209A
20BA- LDY $82
20BC- LDA $3001,Y
20BF- ORA ($7E),Y
20C1- STA ($7E),Y
20C3- DEY
20C4- BPL $20BC
20C6- CLC
20C7- LDA $7E
20C9- ADC #$14
20CB- STA $7E
20CD- BCC $20D1
20CF- INC $7F
20D1- CLC
20D2- LDA $80
20D4- ADC $82
20D6- STA $80
20D8- BCC $20DC
20DA- INC $81
20DC- DEC $86
20DE- BNE $2081
20E0- RTS

sun:

  多看多写点程序, 有助增进编程技巧! 楼主这段程序我只看了一点,
没真正去了解其运作, 有以下几点建议由于没有试过,可能会有点错误)

在2018有程序中若改为:
2018 LDY $85
201A BEQ $202A
201C LDA $7E
201E CLC
201F ADC #$14
2021 BCC $2025
2023 INC $7F
2025 DEY
2026 BNE $201E
2028 STA $7E

亦可改为
2018 LDY $85
201A LDA $7E
201C CLC
201D DEY
201E BMI $2028
2020 ADC #$14
2022 BCC $201D
2024 INC $7F
2026 BCS $201C
2028 STA $7E

在206B中的
LSR
LSR
LSR
ASL
ASL
ASL (按思考应可以用一个AND #$F8来取代)

208B中 由于$82基本上值是由$0-$13,因此可用
208B LDY $82
208D LDA ($80),Y
208F STA $3001,Y
2092 DEY
2093 BPL $208D (省了CPY $82 ,而CPY $82每次执行时间为3个cycle,
虽是作用不大)

最后是2097, 可改为
2097 LDY $3000
209A LDA $82
209C STA $87
209E LDX #$00
20A0 CLC
20A1 ROR $3001,X
20A4 INX
20A5 DEC $87
20A7 BNE $20A1
20A9 ROR $3001,X
20AC DEY
20AD BNE $209C (php/plp每次一入一出, 用了7个cycle,
因此在循环执行多次的程序中, 如非必要就最好不要使用,
不过当不是要求以最佳速度地方使用也亦可, 若要再加快速度, 可考虑用零页地址[ZEROPAGE]取代$30xx作有关数据存放)
发表于 2008-1-17 19:04:14 | 显示全部楼层
任意范围(宽精确到byte)四方向滚屏子程序

 混乱羽翼

入参:$7E滚屏类型 0为水平 非0为竖直
   $7F滚屏方向 0为逆向既向左或向上 1为正向既向右或向下
   $84,85滚屏开始位置 长以byte为单位 高以象素为单位
   $86,87滚屏范围便宜 宽以byte为单位 高以象素为单位
出参:无

CODE $2300
2300- LDA #$C0
2302- STA $80
2304- LDA #$19(如为1020则将此处改为LDA #$09)
2306- STA $81
2308- CLC
2309- LDA $80
230B- ADC $84
230D- STA $80
230F- BCC $2313
2311- INC $81
2313- LDY $85
2315- BEQ $231D
2317- JSR $23B0(如将程序移往别处则所有的JSR都需要修改为相应地址)
231A- DEY
231B- BNE $2317
231D- LDA $7E
231F- BNE $2360
2321- LDA $7F
2323- BNE $2343
2325- LDX $87
2327- LDY $86
2329- CLC
232A- DEY
232B- BEQ $2335
232D- LDA ($80),Y
232F- ROL
2330- STA ($80),Y
2332- DEY
2333- BNE $232D
2335- LDA ($80),Y
2337- ROL
2338- AND #$7F
233A- STA ($80),Y
233C- JSR $23B0
233F- DEX
2340- BNE $2327
2342- RTS
2343- LDX $87
2345- LDY #$00
2347- CLC
2348- LDA ($80),Y
234A- ROR
234B- STA ($80),Y
234D- PHP
234E- INY
234F- CPY $86
2351- BEQ $2358
2353- PLP
2354- LDA #$00
2356- BEQ $2348
2358- PLP
2359- JSR $23B0
235C- DEX
235D- BNE $2345
235F- RTS
2360- LDA $7F
2362- BNE $2386
2364- LDA $80
2366- STA $82
2368- LDA $81
236A- STA $83
236C- JSR $23BC
236F- LDX $87
2371- LDY #$00
2373- LDA ($82),Y
2375- STA ($80),Y
2377- INY
2378- CPY $86
237A- BNE $2373
237C- JSR $23B0
237F- JSR $23BC
2382- DEX
2383- BNE $2371
2385- RTS
2386- LDX $87
2388- JSR $23B0
238B- DEX
238C- BNE $2388
238E- LDA $80
2390- STA $82
2392- LDA $81
2394- STA $83
2396- JSR $23D4
2399- LDX $87
239B- LDY #$00
239D- LDA ($82),Y
239F- STA ($80),Y
23A1- INY
23A2- CPY $86
23A4- BNE $239D
23A6- JSR $23C8
23A9- JSR $23D4
23AC- DEX
23AD- BNE $239B
23AF- RTS
23B0- CLC
23B1- LDA $80
23B3- ADC #$14
23B5- STA $80
23B7- BCC $23BB
23B9- INC $81
23BB- RTS
23BC- CLC
23BD- LDA $82
23BF- ADC #$14
23C1- STA $82
23C3- BCC $23C7
23C5- INC $83
23C7- RTS
23C8- SEC
23C9- LDA $80
23CB- SBC #$14
23CD- STA $80
23CF- BCS $22FB
23D1- DEC $81
23D3- RTS
23D4- SEC
23D5- LDA $82
23D7- SBC #$14
23D9- STA $82
23DB- BCS $22FB
23DD- DEC $83
23DF- RTS

NC2600C、NC2000C\A的红外使用经验
    谷虫

  首先 调用红外要先想$f00 写入b0 f0 11 00 00 在运行中断INT $014A

  数据出入的端口:3A 状态的端口:3B

  使用方法:

10 S$=""OKE 199,0RINT "红外聊天室","(用于无笔纸情况下)","<Y>发话
<Q>退出"
20 INPUT "名字:";NAME$:GRAPH
30 POKE 6160,0OKE 6161,74:POKE 6162,1:POKE 6163,96
40 DATA 176,240,17,0,0
50 FOR I=3840 TO 3844:READ A:POKE I,A:NEXT
60 CALL 6160:S=0:S$=""
65 IF PEEK(199)=249 THEN POKE 199,0:GOSUB 130
66 IF PEEK(199)=128+ASC ("q") THEN POKE 199,0:TEXT :PRINT "JD
SOFT!":END
70 IF PEEK(59)=97 THEN GOTO 71 ELSE GOTO 65
71 IF PEEK(58)=255 THEN GOTO 72 ELSE GOTO 65
72 IF PEEK(59)=97THEN L=PEEK(58):I=0:S$="":GOTO 90
80 GOTO 65
90 IF PEEK(59)=97 THEN S$=S$+CHR$(PEEK(58)):I=I+1 ?ELSE D=D+1
100 IF D=5 THEN PRINT "连接失败!":GOTO 65
110 IF I=L THEN PRINT S$:GOTO 65
120 GOTO 90
130 PRINT "消息(小于";20-LEN(NAME$);"字节)":INPUT "";T$
:S$=NAME$+":"+T$
131 IF LEN(S$)=0 OR LEN(S$)>20 THEN GOTO 130
140 POKE 58,255:POKE 58,LEN(S$)
150 FOR I=1 TO LEN(S$):POKE 58,ASC (MID$(S$,I,1))
155 NEXT
160 RETURN

  2台机器,当红外端口刚刚打开时,会发出信号 #$55(85) 在空闲状态下
$A4(59)的值为$60(96)

  如何发送数据呢:

  A机器与B机器(红外都已打开)

  A机器像A3写入255,此时
A4值从$60变成了$61,表示有数据(原因是WQX的IrDa是2个,一输入一输出,在机器上挨的近,在数据发送出去的同时,也接受到自己发送的数据)

  B机器的A3变成了255,A4变成了$61,但此处指的255意思是CPU从地址A3读出的值为255,A3并不是普通的内存,是IO端口,硬件的设置就这样,CPU从A3读出值后,A3的值就变化了,CPU不访问A3的话A3的值就不变

  如果A机器向A3写入了01在写02
在写03,那么,B机器读取第1次值为01,第2次为02,第3次为03,而后A4的值变回$60,表示"红外缓存"已经没有数据了(但似乎缓存有限,好象也有时间限制)

  如希望将$0a $0b $0c $0d $0e $0f
发送到B机器上,那么在确认A机器与B机器红外连接完好的情况下,A发送$0a到B,B在确定$A4值变为$61时,读取A3的值,同时A4自动变回了$60

  B机器在发送一具有特殊代表的数据到$A3,A机器接受到,确认数据已经传送,继续传送下一个

  由于红外有类似缓存的东西,所以传输起来非常快,不必像写nand那样需要delay时间,基本上数据就是这样传输的。

  虽然知道"打开红外"的中断,但却怎么也不知道"关闭红外"的中断,晕!!!

  此中断与io端口通用与NC2000A/C
NC2600C 不能使用于除此3型号外任何型号

  BASIC代码是个简单的红外聊天程序,可以n台机器以上聊,由于不想做的太复杂和提高速度,有传输字节最高20的限制并且2人以上聊天的话,万一2人同时在传输数据可能将2人的数据都掺在了一起再成A说AAAAA B说BBBBB显示出来的确是ABABA

  经过测试2机器摆在一起程90度仍可以传输,并且用放小镜子(反光的凹面镜将15Cm到了45CM(差不多)),可以考虑使用光纤作为红外传输媒体(配合球面镜),本人并没实验过双机线,不知串口如何使用

  未来BASIC游戏必将是非常侧重与汇编、批量法、多人游戏、型号通用的。所以......大家应该多研究这些对BASIC有很大用途的东西,不要只弄BASIC,也学点汇编,了解些系统中断与工作原理(至少我不精通)

  PS:红外传输时没有特定对象,比如说3台机器,1台机器的红外对着另两台发,那么那两台会同时受到信息
发表于 2008-1-17 19:04:30 | 显示全部楼层
WQX端灰度图片反显与转换
41824984
16 级灰度 160*80 GBK 、 HGP 、 bmp 的格式:
GBK:
前 16 个字节为文件头 , 像册张数属性在 0x04,
HEX:0x10 开始为像册第一张图片, HEX:0x10+0x1900 为第二张图片,第三张
HEX 为 0x10+0x1900*2=0x3210 , 依次类推 。
HEX 显示 :0xF 为第 16 级灰度, 0xE 第 15 级灰度, 0xD 第 14
级灰度,依次类推 。
一张图片数据为 6400 个字节。
16 级灰度 160*80 bmp 格式 :
到 HEX:75 为止为文件头, HEX:76
开始为图片数据起始地址,一张图片数据也为 6400 B。
HEX 显示 :0 为第 16 级灰度, 2 第 15 级灰度, 3 第 14
级灰度,依次类推。
所以它的数据与 GBK 每张图片数据是相反的 。
HGP 文件格式:
文件头为 HEX:[0348475000100955XX00]
XX 为图片文件的张数, HEX:A 为第一张图片数据,每张图片数据 6400
字节,然后以 HEX:06 结尾。
DOC: 第 n 张的开始字节为 { ( n-1 ) *6401+10}
每张图片数据: HEX 显示 :0xF 为第 16 级灰度, 0xE 第 15 级灰度, 0xD 第
14 级灰度,依次类推。
与 16 级灰度 160*80bmp 数据完全相同。

正题 : GBK 文件转化反显效果 HGP
在 BASIC 中建立一个空文件,
10 OPEN "A.hgp" FOR RANDOM AS #1 LEN=128:FIELD #1 ,128 AS A$
20 FOR I=1 TO 8 UT #1 ,I:NEXT
30 CLOSE #1
编者按:在pacmgr中打开一个hgp文件,然后直接使用F4键另存为即可创建一个新文件。选择适合的长度,直接得到文件头。
将其移动到“灰度图片”目录,然后用 Pacmgr.lav 的编辑器打开,按“ L
”载入 HGP 文件头,然后第一张从 HEX:A ,开始载入,, GBK
文件中的图片数据第一张起始字节为 16 ,第二张为 6416
第三张为 12816 ……
每张载入后都要以 HERX:06 结尾
完成后修改文件头的张数属性后,保存退出。
同理也可以 HGP 反显 GBK
GBK 分离反显 16 级 160*80 bmp
16 级 160*80 bmp 文件 HEX:76 开始载入数据,载入一张后退出保存就 OK
了,不过 16 级图片的浏览就需要 TC800 或者 PC 了,不过是反显的。
同理怎样分离 HGP 文件到 16 级 bmp ,星迷们自己心理也有数了把,由于单张
HGP 文件与 16 级 bmp
数据是相同的,所以转出的文件灰度效果是一样的,不反显

BAS 文件结构

SAILOR-HB
原来程序
10 FOR A=1 TO 100
20 PRINT A
30 NEXT A
.BAS 文件内容列表
$0000: 00 ; 档案开始符号
$0001: 0E 01 ; 行号 10 的 (a) , 行号 20 的起始位子 + 100H
$0003: 0A 00 ; 行号 10 的 (b) , 说明本行为行号 10
$0005: 81 ;"FOR" 的保留字码
$0006: 41 ;"A" 的 ASCII 码
$0007: D1 ;"=" 的保留字码
$0008: 31 ;"1" 的 ASCII 码
$0009: C1 ;"TO" 的保留字码
$000A: 31 30 30 ;"100" 的 ASCII 码
$000D: 00 ; 行号 10 结束符号
$000E: 15 01 ; 行号 20 的 (a) , 行号 30 的起始位子 + 100H
$0010: 14 00 ; 行号 20 的 (b) , 说明本行为行号 20
$0012: 98 ;"PRINT" 的保留字码
$0013: 41 ;"A" 的 ASCII 码
$0014: 00 ; 行号 20 结束符号
$0015: 1C 01 ; 行号 30 的 (a) , 档案结束符号位子 + 100H
$0017: 1E 00 ; 行号 30 的 (b) , 说明本行为行号 30
$0019: 82 ;"NEXT" 的保留字码
$001A: 41 ;"A" 的 ASCII 码
$001B: 00 ; 行号 30 结束符号
$001C: 00 00 ; 档案结束符号
额外说明
(1) BASIC 程序储存方式和 APPLESOFT BASIC 非常类似
(2) 资料 > 80H 为保留字
(3) 字串中有汉字的储存方法
例 : " 文曲星 "
$0000: 22 ; " 的 ASCII 码
$0001: 1F ; 指示下 2 BYTES 为汉字
$0002: A5 78 ;" 文 " 的 BIG 5 码
$0004: 1F ; 指示下 2 BYTES 为汉字
$0005: C6 57 ;" 曲 " 的 BIG 5 码
$0007: 1F ; 指示下 2 BYTES 为汉字
$0008: B0 EA ;" 星 " 的 BIG 5 码
$ 000A : 22 ; " 的 ASCII 码
(4) 保留字码
$80: END
$81: FOR
$82: NEXT
$83: DATA
$84: INPUT
$85: DEL
$86: DIM
$87: READ
$88: SWAP
$89: TRACE
$8A: NOTRACE
$8B: POP
$8C: LET
$8D: GOTO
$8E: RUN
$8F: IF
$90: RESTORE
$91: GOSUB
$92: RETURN
$93: REM
$94: STOP
$95: ON
$96: DEF
$97: POKE
$98: PRINT
$99: CONT
$9A: LIST
$9B: CLEAR
$9C: NEW
$9D: TEXT
$9E: GRAPH
$9F: SYSTEM
$A0: NORMAL
$A1: INVERSE
$A2: FLASH
$A3: PLAY
$A4: BEEP
$A5: INKEY$
$A6: LOAD
$A7: SAVE
$A8: KILL
$A9: FILES
$AA: OPEN
$AB: CLOSE
$AC: WRITE
$AD: FIELD
$AE: GET
$AF: PUT
$B0: LSET
$B1: RSET
$B2: AUTO
$B3: LOCATE
$B4: DRAW
$B5: LINE
$B6: BOX
$B7: CIRCLE
$B8: ELLIPSE
$B9: CLS
$BA: EDIT
$BB: WHILE
$BC: WEND
$BD: CALL
$BE: RENAME
$BF: COPY
$C0: TAB
$C1: TO
$C2: FN
$C3: SPC
$C4: THEN
$C5: ELSE
$C6: AT
$C7: NOT
$C8: STEP
$C9: +
$CA: -
$CB: *
$CC: /
$CD: ^
$CE: AND
$CF: OR
$D0: >
$D1: =
$D2: <
$D3: SGN
$D4: INT
$D5: ABS
$D6: POS
$D7: SQR
$D8: RND
$D9: LOG
$DA: EXP
$DB: COS
$DC: SIN
$DD: TAN
$DE: ATN
$DF: PEEK
$E0: LEN
$E1: STR$
$E2: VAL
$E3: ASC
$E4: MKS$
$E5: MKI$
$E6: CVS$
$E7: CVI$
$E8: LOF
$E9: EOF
$EA: CHR$
$EB: LEFT$
$EC: RIGHT$
$ED: MID$

编者按:有些保留字为早期GVBasic命令行中的内容,由于Basic助手的普遍使用,这些保留字也仅仅是“保留”了。
 楼主| 发表于 2008-1-18 12:57:09 | 显示全部楼层
这个??扯远了吧?
我是问怎么在TOOL-2600中看啊
发表于 2008-1-18 14:36:26 | 显示全部楼层
nand 分扇区,每个目录下的文件信息都由一个扇区(16384byte)储存,
系统文件在 sysdir 目录下,读出文件信息需调用文件系统中断,以下为2600的中断及入口参数:
$050d 切换目录,参数 $08d6(目录名+00);
$0514 打开/创建 文件,参数 $0912(#$70:创建;#$80:打开), $08d6(文件名+00);
$0515 读取文件, 参数 $08d6(文件名+00),$dd $de: 文件读出地址(RAM),$090f $0910: 读出文件大小
$0516 关闭文件,$08d6(文件名+00)

一般的,读出的文件都从XRAM的$4000开始,欲察看XRAM,需将 $00,$0a最高位置1...
具体代码你自己写吧,写完之后运行就能看到你想看的东西了...
 楼主| 发表于 2008-1-19 08:22:43 | 显示全部楼层
谢谢LS啊,虽然不是很清楚
您需要登录后才可以回帖 登录 | 加入易码

本版积分规则

Archiver|手机版|小黑屋|EMAX Studio

GMT+8, 2024-4-20 02:45 , Processed in 0.015222 second(s), 18 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表