易码技术论坛

 找回密码
 加入易码
搜索
查看: 381984|回复: 20

[原创]无题

[复制链接]
发表于 2005-7-28 20:40:00 | 显示全部楼层
JIPU_PHIL,你说这几天快累死了,想必你一定很努力吧,希望你为这个版做多点贡献,真的要是死了,恐怕我也没有时间为你默哀了!!!!
我曾用VC6.0将6502SIM v1.2.5的源码编译,但是编译不过去,XU大哥也说编译不过去,不知道你那边如何!那个源码应该吓死过不少人吧,我是没本事看懂它了!下面就我以前看过的一点点,记下来,或许对你有用:

第一:是BUG!它不是有个.IF编译指令么,对表达试的语义分析的其中一对,就是“==”和“<>”完全颠倒过来了!你可以看看下面的代码,至少是跟我的意思完全相反!你怎么认为我就不清楚了!试一下吧!
A=$40
.ORG 40
.IF A==0
LDA #$40
.ELSE
LDA #$50
.ENDIF
第二:应该算致命的BUG,但是难以察觉,一般我们很难是它暴露出来!.INCLUDE编译指令所包含的文件最后一行指令是宏指令的话,那么必须在空开一行,否则程序崩溃(也不算崩溃吧,如果你不理那个出错窗口)!如下!
----------MAIN.ASM内容----------
.ORG $4000
JSR _Shf
RTS
.INCLUDE ".\Shf.ASM"
----------Shf.ASM内容----------
;模拟C的Return语句
Return .MACRO result
LDA #result
.ENDM
_Shf:
LDA #$00
STA $00
Return 1       ----不加注释或不另加一个空白行就会出错!
当然这个你也可以完全不用管它!
第三:是不足之处(至少我这样认为)!就是宏参数是地址还是立即数不能由宏外部决定,而只能由内部决定!
例如这样是不允许的:
DrawCircle #$40,#$10,$05
或许你认为每必要但是,如果能这样的话,我认为跟面向对象编程的函数重载是一样方便的!具体我就不举例了!
好象还有一些被茶水泡掉了,反正模糊,就撕掉了,能帮你的就这么多了!
你说NAND,多向QIQI请教一下吧!如果要文件操作的一些函数,我记下了一些,有空抄上来吧!跟QIQI的那些差不多,只不过我记下了参数而已!当时很辛苦呀,不过现在没时间反一些函数了,你应该有这方面的激情!恩,皮球踢给你了!ATHLON不久就会杀了我的!我有预感!
最后是关于BIN加密解密的问题,你说TC跟NC不一样,实际是一样的,不但形式一样,GGV连那个密表都没改变!硬要说出差别,就是TC1000的陈列名加密前必须向后偏移两个BYTE!加解密主要部分确实是互逆运算,以前我好象说过不是,这里修正一下!因为这方面是最后打包BIN的步骤,所以你不用愁啦,先做好前面的所有工作吧!或许到时候我会为你做个命令行供你调用(可能我也很多地方要用到),或是需要源码整合到你的代码里面我也可以给你,不过不是现在,我喜欢用PASCAL语言,所以你要的话就要做好翻译的心理准备!总之,祝你成功!不管你作什么,应该是这个版的福分吧,我是真心想这个版块火起来的!
20:15 2005-7-28 kong!
发表于 2005-7-28 21:15:00 | 显示全部楼层
6502sim代码可以编译 我试过 但是代码我没有尝试读 很多类 如果面向对象就是这么烦人 我宁愿回到朴素的c时代
 楼主| 发表于 2005-7-28 21:38:00 | 显示全部楼层
是呀,作者强得可怕!最令我佩服的是他竟然不会头痛!老S,你竟然可以编译得过!我拜一下你!你能否把宏参部分给揪出来?
发表于 2005-7-29 14:51:00 | 显示全部楼层
我好像也是编译不过 但是我根据错误提示改了改就可以了 至于宏的部分 作者写的程序我认为有点混乱(可能是他头痛时写的 嘿嘿,当然也有可能是我不理解)
发表于 2005-7-29 15:14:00 | 显示全部楼层
建议空小子看看这几个类
CMacroDef,CAsm6502,CIdent 感觉这个实现并不好 作者是用记录宏开始和结束的位置(文件名,行号)来完成宏这个功能的。
发表于 2005-8-1 11:53:00 | 显示全部楼层
原作者的代码不好懂,是因为代码并不精简,也并不是一个专为windows编程的作者的常规思路。因为源代码并不高效,况且与windows的兼容性并不是太好,毕竟我们要的是易用性和平台的完美结合。
空小子,先前告诉你的使用源代码,也只是参考其功能,代码我是要全部重写的,毕竟是wqx的专用编写器,我不打算用6502sim中使用的水晶代码书写程式,我正在写用兼容“写字板”的格式,可以用写字板打开又不失去原有颜色信息(并可以保存生成带有格式信息的网页格式,方便在网上传播),不过编译时还是会自动转换成文本后在编译。此部分较简单。
编译部分,我打算采用原创代码(有些头绪了……),我在8月底将把它,分离出来并加上详细的说明文档在我的博客贴出来,支持高度的定制(.ini),分离主编写程序支持全文本编译。(代码在我的博客上部分公开!!)
告诉大家一个不好的消息:程序肯定比6502sim要大的多。光一个wqx模拟器都够大的了(:
 楼主| 发表于 2005-8-1 17:28:00 | 显示全部楼层
谢谢大家的回贴!吉普,你的计划很不错,需要我帮忙的地方(除了编码)你说话!
6502sim代码问题就让它过去吧,我从没有在它那花时间,知道看了也白看!但最好的汇编器(相信很快就有许多选择了)出现之前我还会用它来写引擎!
 楼主| 发表于 2005-8-1 17:32:00 | 显示全部楼层
对了,我这边还有个转.65H为BIN的工具,可以使6502写BIN的步骤简化到两步,但还没有深入测试,所以暂时不公布,需要的朋友可以MAIL ME~由于时间问题过几天我一起抄送,只发一次!
发表于 2005-8-1 18:14:00 | 显示全部楼层
对,主要是模拟器,否则没法调试。定义缓存这一项是一定要的。。。
 楼主| 发表于 2005-8-1 19:00:00 | 显示全部楼层
模拟器啊?提到这个我就会想很多很多~至今还没交到能写模拟器的朋友啊。能交一个这样强的朋友就满足了,一个就够了!希望会出现!(今晚不要梦见死去的模拟大师啊,我会尿床的~)
发表于 2005-8-1 21:25:00 | 显示全部楼层
以下是引用空小子在2005-8-1 17:32:47的发言:[BR]对了,我这边还有个转.65H为BIN的工具,可以使6502写BIN的步骤简化到两步

是XU写的那个新的吧,在文件开始要加上 JMP MAIN 的那个?
原来XU的网站上可以下到的。
发表于 2005-8-1 21:44:00 | 显示全部楼层
顺便问一下,你们有谁在做 WQX 端的编译器吗?
 楼主| 发表于 2005-8-1 22:21:00 | 显示全部楼层
不是XU大哥的,他有是么!哦~~我的是直接转化为WQX可以执行的BIN!

你是说WQX汇编器,还是其他编译器!WQX端汇编器我写过一点点就没写下去了,因为只能做到固定格式,词法分析你无法得到太多信息,而且致命的一点就是表达式递归方面的问题,我我现在就分析给你看,看看下面的代码
a=$40
b=$50
.org $4000
LDA #a
STA B
RTS
恩,这样在WQX上编译是没有什么难度的!看看下面这段代码吧!
a=$40
b=$50+a*a+c
c=b+a
  .org $4000
   LDA #>a
   STA >c-5+4*a
   RTS
注:小于号取低位,大于号取高位,还有更多的操作符号如或,异或等等
代码虽然夸张了点,但是对于宏来说,它算小CASE了,不用到递归好象没有更好的办法处理表达式,但是谈到递归我就想到WQX的栈,那么一点栈,递归几次就死了!但是这些在PC上处理起来就是轻而易举的事情!
如果你不怕功能限制,写出只适应第一段代码格式,也不是不可能的!这个点可以讨论!
发表于 2005-8-1 23:50:00 | 显示全部楼层
以下是引用空小子在2005-8-1 22:21:21的发言:<br>不是XU大哥的,他有是么!哦~~我的是直接转化为WQX可以执行的BIN!

处理表达式,但是谈到递归我就想到WQX的栈,那么一点栈,递归几次就死了!

我用的也是直接转BIN的,好象确实是XU 的,可能和你的不同。

关于WQX的栈,对递归确实不够用,可不可以做一些技术上的处理用自建栈。 呵呵,随便说的,没仔细考虑过。
恩,应该可以的,处理表达式可以不用递归啊,用到栈就可以了(也许我的理解有误)。用逆波兰式解析表达式就没用递归啊。
有空我用6502写个计算表达式值的代码试试
发表于 2005-8-2 02:46:00 | 显示全部楼层
是要完全按6502sim那样做还是要有自己的修改,如果自己修改,我就说说我的想法。

1.宏传参数一定要可以传进字符串,并支持字符串连接,举个例子:
  test macro reg,x
    ld&reg x ;& 这里意思是字符串连接
       endm
  test a,#1
  实际编译出来最好是lda #1这样的个人认为很方便

2.关于宏内部的一些运算的函数能弄多少就弄多少,最好还可以扩充(做梦ing...)
  例如:
   test2 macro x  ;x is a string
     .if .strlen(x) > 1000
        error "String tooooooo long !"
     .endif
     db x,0
      endm

3.最好像masm一样也支持一些类c的操作
   x db 0
   .if [x]==0
    .assign x=11
   .endif
   编译出来希望是
   lda x
   bne +
    lda #11
    sta x
   +

4.说起上边这个来 我又想起一个,就是上边的那个+
  +-可以用来表示临时label(知道我说什么就不要看下边了,直接看下一条)
  例如:
   x equ 0a0H
   x2 db 0
     ldx x
     bne +
   -  dex
     bne -
     lda x2
     bmi ++
   +
     stx x2
   + sta x  ;估计容易理解就不写注释了,其实什么也没做,就是一个demo
   ;++就是向前两个,最多支持几个就随一个,3个差不多够了

   还有一种风格是masm的
   @@: lda x
       bne @b
       bmi @f
       ldx #0
   @@:

5.我一直在设想一种比macro更强大的描述数据的方法,就是说有一种编译器可以识别的脚本是可以嵌入代码中的,这种代码可以完全控制编译器的行为。它可以实现什么功能呢,演示一下:
   xx  coder str
      .if .leftspace(this_bank)<len(str)
         .switch_progbank $+1
      .endif
      db str,0
      endcoder

   .org $fffe  ;假设bank 到$FFFF
   xx "nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn"
   编译器会把"nnnnnnnnnnnnnnnnnnnnnnnnnnnn"这个字串放在下一个bank里边
   
发表于 2005-8-2 02:49:00 | 显示全部楼层
6.加一些align之类的 directive 方便写程序(没有例子)
...这些是一点我的意见 好像有一些的确不好实现,仅作参考即可~~~
 楼主| 发表于 2005-8-2 08:25:00 | 显示全部楼层
ES,WINIDE就是自建一个软栈的!表达式的有空你可以试一下,这里都不一定要做出什么成果来的,练习对你我都有帮助!
 楼主| 发表于 2005-8-2 08:29:00 | 显示全部楼层
老S,你的第四点我认为有LACOTE LABLE不就行了么,它这么有用呀!
发表于 2005-8-2 21:26:00 | 显示全部楼层
LACOTE LABLE是什么啊?
 楼主| 发表于 2005-8-2 22:16:00 | 显示全部楼层
单词写错了!^^b
您需要登录后才可以回帖 登录 | 加入易码

本版积分规则

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

GMT+8, 2024-4-19 01:48 , Processed in 0.013752 second(s), 16 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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