2

我编写了这段代码,使用箭头键和输入按钮在屏幕区域中移动一个像素来停止程序。到目前为止,它似乎确实与所有建议一起工作得更好,但是它的像素位置搞砸了。

#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

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

4

2 回答 2

0

这个:

cp $03
call nz,decY

...说调用decYifa绝对有任何价值 then 3。在上下文中,看起来您可能想要call z— 准确地调用 when ahas value 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似乎只是破坏您的地址。

当然,这可能是我的理解失败。

于 2016-04-17T22:05:32.950 回答
0

我在您的代码中看到了几个问题,包括您“调用 main”,完成后继续进入“main”。有时这是一个方便的技巧,但在这种情况下并非如此。您有四个选项,最有效的是简单地删除呼叫。或者你可以在之后放置一个'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”时,您正在使用“呼叫 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
于 2016-04-18T14:45:07.543 回答