易码技术论坛

 找回密码
 加入易码
搜索
查看: 266599|回复: 6

[原创]将思维定向宏!

[复制链接]
发表于 2005-8-18 11:01:00 | 显示全部楼层
先mark一下 回来看
这个东西其实不是那么好用的,弄一堆宏出来过几天自己都不知道怎么用了,而且写起代码也时常想不起来用。(可能是我的思维过于陈腐所致)

有个这样的想法,知道c语言吧? 嗯,wqx中比较不好做的就是分配栈,如果用软的效率似乎不是很好,也不方便。满天的间接寻址我是会晕的...

如果把c剥离开栈是什么样子呢?
所有的变量变成静态的了,看来递归会出现一些问题,但是也总比写汇编的强。
例如
int a:0x20=1;
char b:0x22=1;
char fo0x23(int x:0x24,int y:0x26)
{
  return x-y;
}
void main:0()
{
  char c:0x60;
  c=foo(a,b);
  
}

这样虽然效率比asm要低一点,其它方面还是很不错的
发表于 2005-8-18 11:03:00 | 显示全部楼层
说明一下 :是表明给这个变量分配地址
 楼主| 发表于 2005-8-18 13:11:00 | 显示全部楼层
老S说的没错,不管怎样汇编都没有C方便,但正是很多人喜欢6502,而且还有人在不断学,正如还有很多人喜欢用BAS一样,我才做一些工作的,毕竟相对来说(在使用汇编的范围内)宏是好的!
说实在的我还对WQX感兴趣是因为我手上还有WQX,或许有一天她们报废了(当然我会好好爱惜,不让这种事发生),我就只学习电脑编码了,离开星界也说不定呢。你不也说过么,不要单单限在WQX里,没错,电脑才能够为我们提供更多的空间!不过不管怎样都会好的!
 楼主| 发表于 2005-8-18 13:15:00 | 显示全部楼层
听说***在写C编译器,我还真是蛮期待的!哈哈~
发表于 2005-8-18 18:54:00 | 显示全部楼层
到底什么是宏啊,近来学C看到的宏和汇编的不一样,哪个是正版的宏呢?[em06][em06][em06][em06][em06]
发表于 2005-8-18 19:30:00 | 显示全部楼层
大概的将他看做是“函数”就可以了,字面理解是宏观控制,就是不需要再考虑细节,因为细节部分已经写好了。
 楼主| 发表于 2005-8-17 17:17:59 | 显示全部楼层 |阅读模式
如果你看上这篇文章,转载,转载,帮我转载!呵呵~可要注明:WWW.EMSKY.NET
宏,今天就来说宏!它是很漂亮的东西,很多朋友都喜欢它!
但是一些初学的朋友还不习惯使用它,如果你属于这部分朋友,那趁早将你将你的思维定向宏这个东西,它会让你轻松起来!讲的东西有些都可以在6502SIM实现,但我并不按照6502SIM的语法编写~~
第一步修炼:在反汇编中定向
是的,你会反汇编,嗯! 如果你是个爱学习的人,那么网友发布了一软件,你就会去跟踪他们的软件,于是学到了很多知识,付出的是很大的精神(而我比较在乎眼睛)代价!网友写的可能少用到宏,所以更要费心思去看。常常我们也跟踪官方的一些例程,这样的话就可以稍微轻松一些。因为我们都能想到官方是有固定的宏的,WINIDE就有,从LEE前辈公布的一些代码大家也可以知道!这样我们可一抓住一个面。我先来模拟一下官方写代码的小过程,或许被官方的一些人看到,他们会笑我。嗯!
注:官方的汇编器M6502.EXE可以在WINIDE目录中获得,但是CC800的那个有BUG!
我不用官方的(说白了就是我不太会用),但现在也不用6502SIM,它不能满足我说下面的例子!
这个例子很有代表性,对文件系统有研究的人一下就知道这段代码是干什么的,是从哪里来的!一些初哥可能不太理解,不过你可以暂时不用管,为什么?因为我今天讲的主题是宏!跳过你看不懂的,争取看完全文!

JEQ .MACRO
BNE .L
JMP ?1
.L
.ENDM
;助记:
;"L"oad
;"M":Memory
;"N":Number(addr or imm)
;例: LM $40,[#]$20
LMN .MACRO
LDA ?2
STA ?1
.ENDM
;助记:
;"L"oad
;"M":Memory
;"N":Number(addr or imm)
;"2":16bit
;例: LM $40,[#]$2000
LMN2 .MACRO
.IF ??2 0>1
LDA #<??2 2
STA ?1
LDA #>??2 2
STA ?1+1
.ENDIF
.IF ??2 0==1
LDA ?2
STA ?1
LDA ?2+1
STA ?1+1
.ENDIF
.ENDM
;助记
;"L"oad
;"M":Memory
;"2":16bit
;"MX":Memory with X index
;例:LM2MX $40,$2000
LM2MX .MACRO
LDA ?2,X
STA ?1
LDA ?2+1,X
STA ?1+1
.ENDM
;助记
;"L":Load
;"M":Memory
;"2":16bit
;"MY":Memory with Y index
;例:LM2MY $40,$20
LM2MY .MACRO
LDA (?2),Y
STA ?1
INY
LDA (?2),Y
STA ?1+1
.ENDM
;助记
;"CP":ComPare
;"2":16bit
;例:CP2 [#]$40,[#]$2000
CP2 .MACRO
.IF ??1 0==1
LDA ?1+1
.ENDIF
.IF ??1 0>1
LDA #>??1 2
.ENDIF
.IF ??2 0==1
CMP ?2+1
.ENDIF
.IF ??2 0>1
CMP #>??2 2
.ENDIF
BNE .L
.IF ??1 0==1
LDA ?1
.ENDIF
.IF ??1 0>1
LDA #<??1 2
.ENDIF
.IF ??2 0==1
CMP ?2
.ENDIF
.IF ??2 0>1
CMP #<??2 2
.ENDIF
.L
.ENDM
;助记
;"AD":ADd
;"2":16bit
;例:AD2 $40,[#]$2000
AD2 .MACRO
CLC
LDA ?1
.IF ??2 0==1
ADC ?2
.ENDIF
.IF ??2 0>1
ADC #<??2 2
.ENDIF
STA ?1
.IF ??2 0==1
LDA ?1+1
ADC ?2+1
STA ?1+1
.ENDIF
.IF ??2 0>1
  .IF ??2 2<256
  BCC .L
  INC ?1+1
.L
  .ENDIF
  .IF ??2 2>255
  LDA ?1+1
  ADC #>??2 2
  STA ?1+1
  .ENDIF
.ENDIF
.ENDM
_Main:
LMN2 FileCount,#0;出始化文件个数
LMN2 InodeID,CurDirID;当前文件号送到_GetInodeSlot的其中一个参数InodeID
LMN  FileState,#$C0;文件的状态送到_GetInodeSlot的另一个参数FileState
INT _GetInodeSlot
INT _GetInode;读出
LDX #$12
LM2MX SectSlot,InodeBuf
LMN2 SectOffset,#0
.next
JSR _Sub1 ;逐项读出并判断
BCS .exit
AD2 SectOffset,#$200 ;加上#$200
CP2 SectOffset,#$4000 ;是否达到#$4000
BCC .next
.exit
RTS
_Sub1:
LMN2 $EA,#$C856
LMN2 PRBufHead,#$C856
INT _NDReadPage
CP2 SectOffset,#0
JEQ .offset
.next
LMN $03F7,#0
LMN $0402,#0
JSR _Sub2 ;进入_Sub2判断
BCS .offset
CMP #$FF
BEQ .exit
IN2 FileCount
.offset
LMN $03F7,#0
LMN $0402,#0
AD2 PRBufHead,#DIRITEMSIZE
CP2 PRBufHead,#$56CA
BCC .next
CLC
RTS
.exit
SEC
RTS
_Sub2:
LDY #$00
LM2MY InodeID,PRBufHead
CP2 InodeID,#$FFFF
JEQ .L3
INT $0520
BCS .L1
LMN FileState,#$C0
INT _GetInodeSlot
INT _GetInode
LDX #$02
LDA InodeBuf,X
AND #$01
BEQ .L1
LDA InodeBuf,X
AND #$10
BNE .L2
LDA InodeBuf,X
AND #$20
BEQ .L1
.L2
LDA #$00
CLC
RTS
.L1
LDA #$00
SEC
RTS
.L3
LDA #$FF
CLC
RTS

只注释了一些,其实不注释就可以通过变量来判断了,当然由于我从来没有接受过标准的编程理论,所以为变量命名的能力一直都很弱,可能有些很难看,勉勉强强吧!我说完这段话后有些很牛的朋友应该看完上面的代码了吧,
来看看人工编译(人工??骗人!)后的结果;
.ORG $6C8F
LDA #$00
STA $145F
LDA #$00
STA $1460
LDA $0867
STA $088B
LDA $0868
STA $088C
LDA #$C0
STA $0895
INT $051A
INT $051B
LDX #$12
LDA $0869,X
STA $088D
LDA $086A,X
STA $088E
LDA #$00
STA $08AD
LDA #$00
STA $08AE
JSR $6CED
BCS $6CEC
CLC
LDA $08AD
ADC #$00
STA $08AD
LDA $08AE
ADC #$02
STA $08AE
LDA $08AE
CMP #$40
BNE $6CEA
LDA $08AD
CMP #$00
BCC $6CC8
RTS
LDA #$56
STA $EA
LDA #$C8
STA $EB
LDA #$56
STA $E2
LDA #$C8
STA $E3
INT $0506
LDA $08AE
CMP #$00
BNE $6D0C
LDA $08AD
CMP #$00
BNE $6D11
JMP $6D2A
LDA #$00
STA $03F7
STA $0402
JSR $6D4D
BCS $6D2A
CMP #$FF
BEQ $6D4B
INC $145F
BNE $6D2A
INC $1460
LDA #$00
STA $03F7
STA $0402
CLC
LDA $E2
ADC #$10
STA $E2
BCC $6D3D
INC $E3
LDA $E3
CMP #$56
BNE $6D47
LDA $E2
CMP #$CA
BCC $6D11
CLC
RTS
SEC
RTS
LDY #$00
LDA ($E2),Y
STA $088B
INY
LDA ($E2),Y
STA $088C
LDA $088C
CMP #$FF
BNE $6D66
LDA $088B
CMP #$FF
BNE $6D6B
JMP $6D9A
INT $0520
BCS $6D96
LDA #$C0
STA $0895
INT $051A
INT $051B
LDX #$02
LDA $0869,X
AND #$01
BEQ $6D96
LDA $0869,X
AND #$10
BNE $6D92
LDA $0869,X
AND #$20
BEQ $6D96
LDA #$00
CLC
RTS
LDA #$00
SEC
RTS
LDA #$FF
CLC
RTS
哈哈,把它放在WQX屏幕中你会笑起来,没错,就是你以前跟踪过的“读某个目录里文件个数”的代码,没看过的可以用ASMFUN反$03页的$6C8F。一样吧!可能有微妙的差别,那是我为了讲解方便!很多人宁愿自己写陈列文件代码也不用中断的原因就是嫌这短代码效率不高是么?也许吧!我到现在没有写过跟文件有关的软件,不过如果需要用的话,我可能还是会用它,毕竟方便,怎么慢都慢都慢不过BAS,我认为除了游戏软件需要强优化外,其它的软件能用中断还是用吧!当然我并不反对自己写!有宏的话,写起来也不会很麻烦!
喂喂喂~~小明!睡醒了,赶快把鼻涕擦干净,到了思想升华部分了!
对,正如你看到的,WQX中反官方的代码,不要一行一行的看,要一大段一大段的看!
就那上面编译后的代码来说,看到这个:
CLC
LDA $08AD
ADC #$00
STA $08AD
LDA $08AE
ADC #$02
STA $08AE
马上将思维定向到AD2十六位加法!
再如:
LDA $08AE
CMP #$00
BNE $6D0C
LDA $08AD
CMP #$00
BNE $6D11
JMP $6D2A
马上将思维定向到CP2跟JEQ。
还有更多更多!如果你有耐心,将内核的全部代码翻译出来都可以!
最后一步修炼:让自己的宏更强
什么??第一步修炼刚结束就到了最后一步,对,主要目的是省我的口水!
到底有多强,我也不知道!但是看到上面代码,似乎可以使用更强的宏来编写!
根据它们我们可以定制很多。看下面:
ReadInode .MACRO
  LMN2 InodeID,?1  ;InodeID参数
  LMN  FileState,?2 ;FileState参数
  INT _GetInodeSlot
  INT _GetInode  ;读出
  .ENDM
这个就非常酷,只要我一使用,一下就知道什么意思:ReadInode CurDirID,#$C0
如果我们的想象能力在丰富些,再加上使用的工具能够满足我们,那我们还可以定制出语句来,来看看下面:
RETURN .MACRO
LDA ?1
RTS
.ENDM
使用:RETURN 1
IF .MACRO
LDA ??1 1
CMP ??1 3
.IF ??1 2=='=='
BEQ ?1 5
.ENDIF
.IF ??1 2=='<>'
BNE ?1 5
.ENDIF
....
.ENDM
使用:IF var<>#$50 THEN _exit;哈哈,有点象BAS了!
下载这个文件吧,里面就是常用的,并且加强的,只一部分先发出来:

对照着这个文件我们好象可以这样使用:
    LMN $40,$50,$51,$1000,#$48
    MemMove Src,Dst,count
    ....
你说什么?我列出来的东西没有一样能编译?哦~~我打一开始就没有说它们能编译呀,只是为了讲解而已!啊~~~准备要砍我么,ZORO,给我挡~我撤~~88~
                              17:06 2005-8-17
您需要登录后才可以回帖 登录 | 加入易码

本版积分规则

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

GMT+8, 2024-4-19 14:22 , Processed in 0.012579 second(s), 19 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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