A92: Hi, I have a question too.
[Prev][Next][Index][Thread]
A92: Hi, I have a question too.
I am learning assembly for the 68K. I have been working on writing a
library for reading keypresses. It is capable of checking a specified key
to see if it is held down or not. It returns 1 if the key is held down, and
0 if not. I am accomplishing this by writing the row mask of the key to be
checked to [600018].w pausing briefly (using about 6 NOP instructions) and
then reading [60001B].b and checking the bit coresponding to the column of
the key being read. (see LowLevel.txt) I used the same format as is used by
"Fernando3" for reading the keys. My program works fine except for one
little bug. When any key in the same column is pressed (rows 0-6 only) the
function thinks that the key specified is also pressed. I have been working
on this for 3 days now, and have now gathered more info. It seems that once
out of every 2 times that [600018] is written and then [60001B] is read it
returns the correct result (a byte containing the state of columns 0-7 in
the row specified by the mask)
However every 2nd time the port is written and then read it returns a byte
coresponding to to a seemingly random row between 0 and 6 (Hence the problem
mentioned earlier). The program that is calling this function is just an
infinite loop with the key check inside, and a conditional jump out of the
loop (when the key specified is pressed). it looks something like this:
main_loop:
move.l <key code>,d0
jsr check_key
tst.b d0
beq exit
bra main_loop
exit:
rts
<key code> is a value between 0 and 80 in the format of
bit 7 6 5 4 3 2 1 0
X X X X X X X X
|-----| <- 3 bits (0-7) coresponding to column of key
|-------| <- 4 bits coresponding to row of key (0-9)
and the check_key function looks something like this
movem.l d1-d3,-(a7) ; save registers
move.l d0,d1
andi.l #7,d1 ; finds column
move.w #$FFFF,d2 ; used for row mask
lsr.b #3,d0 ; finds row
bclr.w d0,d2 ; sets row mask
move.w d2,$600018 ; write row mask to I/O
nop ; \
nop ; \
nop ; \ wait for I/O
nop ; / to recover
nop ; /
nop ; /
move.b $60001B,d3 ; read I/O
not.b d3 ; invert d3
btst.b d1,d3 ; test column
beq key_not_pressed
movem.l (a7)+,d1-d3 ; restore registers
move.l #1,d0 ; return 1 if key is pressed
rts
key_not_pressed:
movem.l (a7)+,d1-d3 ; restore registers
move.l #0,d0 ; return 0 if key not pressed
rts
It is pretty simple code, yet it is giving me a huge headache. I have found
that by repeating the Write and Read section of the code and then doing a
logical AND on the 2 results, I can get an accurate read on the key
specified (hence the conclusion that at least 1 out of 2 reads is accurate)
but doing so takes extra processor time, and is inconvenient. If any of you
have any ideas on how I can solve this please let me know.
Thanks
Kebes
______________________________________________________
Get Your Private, Free Email at http://www.hotmail.com
Follow-Ups: