ti-83 +汇编像素移动程序无法正常工作

时间:2016-04-17 16:59:43

标签: assembly texas-instruments z80

我制作了此代码,使用箭头键和输入按钮在屏幕区域中移动像素以停止程序。到目前为止,它似乎对所有建议都有效,但它的像素位置混乱了。

#include    "ti83plus.inc"
.org $9D95
  ld a,$2D ;9D95,9D96
  ld ($9872),a ;9D98,9D99,9D9A
  ld a,$1F ;9D97,9D98
  ld ($9873),a ;9D9B,9D9C,9D9D
  jp main
main:
  call clrScreen
  bcall(_getKey)
  ld ($987D),a
  cp $03
  call z,decY
  ld a,($987D)
  cp $04
  call z,incY
  ld a,($987D)
  cp $01
  call z,incX
  ld a,($987D)
  cp $02
  call z,decX
  ld a,($987D)
  cp $05
  ret z
  call dot
  call BTN ;byte to 9874 and 9875
  ld hl,($9874)
  ld (hl),e
  bcall(_GrBufCpy)
  jp main
BTN:
  call BTM
  ld b, 0
  ld a, ($9873);a=y
  ld c,a;c=y
  sll c;leftshift with a 1 added
  rl b;leftshift for 0?
  sll c
  rl b
  sll c
  rl b
  ld h, 0
  ld a, ($9872);a=x
  ld l,a;l=a
  srl l; l/8
  srl l
  srl l
  add hl, bc
  ld bc, $9340
  add hl, bc
  ld ($9874), hl
  ret
srt:
  call HTBC
  djnz srt
  ret
BTM:
  dec l
  ld a,l
  cp $00
  ld e,$80
  ret z
  dec l
  ld a,l
  cp $00
  ld e,$40
  ret z
  dec l
  ld a,l
  cp $00
  ld e,$20
  ret z
  dec l
  ld a,l
  cp $00
  ld e,$10
  ret z
  dec l
  ld a,l
  cp $00
  ld e,$08
  ret z
  dec l
  ld a,l
  cp $00
  ld e,$04
  ret z
  dec l
  ld a,l
  cp $00
  ld e,$02
  ret z
  dec l
  ld a,l
  cp $00
  ld e,$01
  ret z
  jp BTM
HTBC:
  inc bc
  inc bc
  inc bc
  inc bc
  inc bc
  inc bc
  inc bc
  inc bc
  inc bc
  inc bc
  inc bc
  inc bc
  inc bc
  inc bc
  inc bc
  inc bc
  inc bc
  inc bc
  inc bc
  inc bc
  inc bc
  inc bc
  inc bc
  inc bc
  inc bc
  inc bc
  inc bc
  inc bc
  inc bc
  inc bc
  inc bc
  inc bc
  ret
dot:
  ld hl,$0000
  ld a,($9873)
  ld b,a
  cp $00
  ld a,($9872)
  ld l,a
  ret z
  inc b
  call mult
  ret
mult:
  inc hl
  inc hl
  inc hl
  inc hl
  inc hl
  inc hl
  inc hl
  inc hl
  inc hl
  inc hl
  inc hl
  inc hl
  djnz mult
  ret
incX:
  ld a,($9872)
  inc a
  cp $95
  ret z
  ld ($9872),a
  ret
decX:
  ld a,($9872)
  dec a
  cp $FF
  ret z
  ld ($9872),a
  ret
incY:
  ld a,($9873)
  inc a
  cp $63
  ret z
  ld ($9873),a
  ret
decY:
  ld a,($9873)
  dec a
  cp $FF
  ret z
  ld ($9873),a
  ret
clrScreen:
  ld hl,$9340
  ld b,$00
  call clrloop
  ld hl,$9343
  call clrloop
  call clrloop
  call clrloop
  ret
clrloop:
  inc hl
  ld (hl),$00
  djnz clrloop
  ret

如果您说哪个代码块需要替换以及使用什么代码块,对我来说最简单。

2 个答案:

答案 0 :(得分:0)

此:

cp $03
call nz,decY

...如果decY完全没有a之外的任何值,则说3。在上下文中,您可能希望call z - 恰好在a具有值3时调用。在cp之后,对所有其他国旗查询重复相同的观察。

编辑: 所以我认为放置像素的调用过程是:

致电dot。这将加载hl,目标地址计算为:

hl = ($9872) + ($9873) * 12

因此,假设($ 9872)存储您的x坐标和($ 9873)存储您的y,它会计算帧缓冲区内的目标偏移量,假设每行12个字节。维基百科称该设备每行96像素,听起来合理。

致电BTN。加载bc的价格是$ 9340,你的帧缓冲区的地址然后抛出b而不是h。所以净效应是:

($9874) = bc = hl + h*32

调用BTM,选择一个字节掩码并将其放入e。我认为你可以通过循环移位或查找简化它,但无论如何。我没有认真检查它;如果e不为零,您应该看到一些输出。

然后将e存储到($9874)

假设其他一切都正确,包括缓冲区副本,我想可能BTN有错。你真正想做的可能是:

hl = (($9872) / 8) + ($9873) * 12
$9874 = hl + $9340
($9874) = e

因此,将输入x除以8,因为每个字节有8个像素。然后只需添加帧缓冲区的开头。例如。 (即席,未经测试):

ld b, 0
ld c, ($9873)
sll c
rl b
sll c
rl b
sll c
rl b

ld h, 0
ld l, ($9872)
srl l
srl l
srl l

add hl, bc
ld bc, $9340
add hl, bc
ld ($9874), hl

我不能立即确定BTN打算做什么。 dot几乎计算输出地址(不是将x除以8),BTM选择一个掩码,但BTN似乎只是为了破坏你的地址。

当然,我可能正在遭受理解的失败。

答案 1 :(得分:0)

我在您的代码中看到了几个问题,包括您称之为“主要”的问题,在完成后会继续进入“主要”状态。有时这是一个方便的技巧,但在这种情况下不是。 您有四个选项,最简单的方法是删除呼叫。或者您可以在之后放置'ret',或使用'jp main'或'jr main'。

#include    "ti83plus.inc"
.org $9D95
  ld a,$2D ;9D95,9D96
  ld ($9872),a ;9D98,9D99,9D9A
  ld a,$1F ;9D97,9D98
  ld ($9873),a ;9D9B,9D9C,9D9D
;  call main

另一个评论指出的下一个问题是,当你想要'调用z'时,你正在使用'call nz',

main:
  call clrScreen
  bcall(_getKey)
  ld ($987D),a
  cp $03
  call z,decY
  ld a,($987D)
  cp $04
  call z,incY
  ld a,($987D)
  cp $01
  call z,incX
  ld a,($987D)
  cp $02
  call z,decX

最后,据我所知,你从未真正绘制过一个像素。 我想如果我给你一个像素绘图例程,你就拥有完成代码所需的所有信息。 如果你想按照我的方式完成整个程序,请告诉我。

pxlInv:
;b=x, c=y
    call getPixelLoc
    xor (hl)
    ld (hl),a
    ret
pxlOn:
;b=x, c=y
    call getPixelLoc
    or (hl)
    ld (hl),a
    ret
pxlOff:
;b=x, c=y
    call getPixelLoc
    cpl
    and (hl)
    ld (hl),a
    ret
pxlTst:
;b=x, c=y
;returns z flag if pixel is off, nz if on.
    getPixelLoc
    and (hl)
    ret
getPixelLoc:
;b=x, c=y
    ld a,c  ; |Make sure the Y coordinate is in bounds
    cp 64   ; |
    ret nc  ;/
    ld a,b  ; |Make sure the X coordinate is in bounds while saving 'x' in A
    cp 96   ; |
    ret nc  ;/
    ld b,0      ;\
    ld h,b      ; |
    ld l,c      ; |
    add hl,hl   ; |Multiply C (the y-coordinate) by 12
    add hl,hl   ; |
    add hl,bc   ; |
    add hl,hl   ;/
    ld c,a      ; |
    srl c       ; |Divide the X coordinate by 2, three times (so ne effect of divide by 8
    srl c       ; |
    srl c       ;/
    add hl,bc   ;Add this to our offset
    ld hl,plotSScreen
    add hl,bc
    and 7       ; |get our pixel mask for the byte
    ld b,a      ; |
    ld a,80h    ; |
    ret z       ; |
    rrca        ; |
    djnz $-1    ;/
    ret