Help: ZX81 'BASIC' Peek function [duplicat

2019-06-16 15:35发布

This question already has an answer here:

I need a way to find if the character ('<') has hit a wall (Black pixel Graphic)

-On a ZX81 game.

I'm been looking at another game... which uses code

if peek(peek 16398 +256*peek 16399) = code "blackpixel graphic" then ...

Which seems to work for them...

Is this correct code?

I'm not really knowledgable with addresses and getting memory and stuff.

Please help me...

-If you know a better way. Please answer :) -Someone mentioned 'cursor position' what the hell is that on a ZX81? Thanks,

标签: peek zx81
2条回答
等我变得足够好
2楼-- · 2019-06-16 16:17

PEEK(PEEK 16398+256*PEEK 16399) is an idiom meaning “get the character number at the current PRINT position”. This works because the two-byte word at 16398 is used by the ZX81 BASIC/ROM to store a pointer to the memory location in the screen data block corresponding to the PRINT position.

So to do collision detection, you'd first have to set:

PRINT AT X,Y;

co-ordinates to where the > is about to move, then read

LET C= PEEK(PEEK 16398+256*PEEK 16399)

then you can print the > on-screen (overwriting the previous character whose code is now in C) if you want to before doing the check:

IF C=128 THEN ...

(I'm guessing the character you want is the all-black character 128, █.)

Oh boy, do I feel old.

查看更多
成全新的幸福
3楼-- · 2019-06-16 16:20

Wow does this go back. I haven't used a ZX81, but I did write some games on a TRS-80 way back in the day.

The inner part:

(peek 16398 +256*peek 16399)

is pretty much taking the value of two memory locations (8 bit) and creating a 16 bit

number from them, which is then used as the address of the outer peek; you might rewrite this as:

addrToCheck = (peek 16398 +256*peek 16399)

pixelValue = peek(addrToCheck)

if pixelValue = code "blackpixel graphic" then...

I'm guessing that the 'addrToCheck' value is actually the character position in the game, expressed as an address on the screen. So if the value is not a wall, then you would update the values in address 16398 and 16399 with a new character position (using a 'poke', no doubt).

Hope this helps

查看更多
登录 后发表回答