我制作了此代码,使用箭头键和输入按钮在屏幕区域中移动像素以停止程序。到目前为止,它似乎对所有建议都有效,但它的像素位置混乱了。
#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
如果您说哪个代码块需要替换以及使用什么代码块,对我来说最简单。
答案 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