njtu_shiyl
驱动牛犊
驱动牛犊
  • 注册日期2002-03-23
  • 最后登录2002-08-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1388回复:2

用最少的时钟周期,实现for循环

楼主#
更多 发布于:2002-08-05 03:35
在下有一段z80的程序,由于以前没有学过,时间又不够,相烦哪位老兄看一下,可不可以用?(实际上是一个for循环,要求用最少的时钟周期)
#define MAX_SCAN_NUM 6
main(){
char i;
char nIOReg;
char AnIOBuf[6];
while(1){

#asm
push af
push hl
LoopFor:
ld hl, (i)
ex de, hl
ld hl, AnIOBuf
add hl, de

ioi ld a, (nIOReg)
ioi ld (hl), a

ld hl, MAX_SCAN_NUM
ex de, hl
ld hl, (i)
inc hl ; increment counter
ld (i), hl
sbc hl, de
jp nz, LoopFor
ExitFor:
pop hl
pop af
#endasm
printf(\"AnIOBuf[%d] is %d\", i, AnIOBuf);
}
}
 :D
玉晶
njtu_shiyl
驱动牛犊
驱动牛犊
  • 注册日期2002-03-23
  • 最后登录2002-08-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-08-05 03:37
更正:
#define MAX_SCAN_NUM 6
main(){
char i;
char nIOReg;
char AnIOBuf[6];

i = 0;
while(1){

#asm
push af
push hl
LoopFor:
ld hl, (i)
ex de, hl
ld hl, AnIOBuf
add hl, de

ioi ld a, (nIOReg)
ioi ld (hl), a

ld hl, MAX_SCAN_NUM
ex de, hl
ld hl, (i)
inc hl ; increment counter
ld (i), hl
sbc hl, de
jp nz, LoopFor
ExitFor:
pop hl
pop af
#endasm
printf(\"AnIOBuf[%d] is %d\", i, AnIOBuf);
}
}
 
玉晶
njtu_shiyl
驱动牛犊
驱动牛犊
  • 注册日期2002-03-23
  • 最后登录2002-08-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-08-07 00:51
各位大虾,我准备这样写了:
; nIOReg - IO 口的地址
; AnIOBuf- 缓存数组
; nScanCount- 单位时间内的扫描数
; MS_TIMER- 系统维护的定时器
; nEndMs- 结束时间

#asm
push af
push hl
push de
LoopFor:
ioi  ld a, (nIOReg) ;11
ld hl, AnIOBuf ; 6
ld de, (nScanCount) ;13
add hl, de ; 2
ld (hl), a ; 6

ld  a, (nScanCount) ; 9
inc  a ; 2
ld  (nScanCount), a ;10

ld  a, (MS_TIMER) ; 9
ld  h, a ; 2
ld  a, (nEndMs) ; 9
sub  h ; 2
jp  nz, LoopFor ; 7 // total 88 cycles
ExitFor:
pop de
pop hl
pop af
#endasm*
玉晶
游客

返回顶部