[Coco] PIA keyboard input?
Robert Gault
robert.gault at worldnet.att.net
Mon Dec 8 03:16:00 EST 2003
James Dessart wrote:
>
> On 7-Dec-03, at 10:02 PM, Robert Gault wrote:
>
>> That's easy to do if you use the correct algorithm. What is equivalent
>> to rolling a bit? A power of 2 change is the same thing. So, if you
>> want a zero bit, the loop would be (in Basic)
>> for i =1 to 8
>> poke pia, 255-2^(i-1)
>> next i
>> The above is going to give you 255-1=254=%11111110,
>> 255-2=253=%11111101, 255-4=251=%11111011, 255-8=247=%11110111, etc.
>
>
> Which is what I had tried. However, it seems the store instruction
> isn't triggering the PIA in MESS. The ROL does, so I'm guessing it's
> something related to emulation or timing or something of the like...
> from what I've heard, it's probably not the emulation... here's the code
> that reads the row:
>
> clra
> std -21,u ;movhi: R:d -> -21,u
> ldd #1 ;movhi: #1 -> R:d
> ldx -21,u ;movhi: -21,u -> R:x
> ;ashlhi: d by x
> leax -1,x ;decr shift count
> bmi .+6
> aslb
> rola
> bra .-6 ;loop
> comb ;comqi: R:b
> stb -254 ;movqi: R:b -> -254
> ldb -18,u ;zero_extendqihi: -18,u -> R:d
> clra
> leax d,u ;addhi: R:x = R:u + R:d
> ldb -256 ;movqi: -256 -> R:b
>
> It's taken directly from gcc's output, but should be pretty much the
> following in C:
>
> *((unsigned char *)0xFF02) = ~(1<<i);
> columns[i] = *((unsigned char *)0xFF00);
>
> where i is my loop variable, columns is the array of columns. However,
> if I do the following:
>
> asm( "rol 0xFF02" );
> columns[i] = *((unsigned char *)0xFF00);
>
> and a ROL instruction is generated, it works... kinda stumped. I
> haven't had a chance to test it with a real CoCo, though, only MESS.
>
> I've found gcc does seem to generate a lot of code... my little app to
> scan the keyboard and print out the matrix of rows and columns takes up
> about 2-3k. If I rewrote it in assembly, I could probably halve or even
> quarter that... but in gcc's defence, it does a lot to make sure it
> keeps variables in check with registers... if I rewrote the function,
> I'd probably skip a lot of that.
>
> James
>
>
Your code does not seem right to me. The logic should be similar to
lda #%11111110
ldx #$FF02
ldy #$FF00
A@ sta ,x
ldb ,y
orb #%10000000
eorb #%11111111 active bits now are the keys pressed
bsr test of regB
orcc #1 set carry
rola update mask
bcs A@ loop until all columns strobed
I don't see how your C code could generate -21,u -18,u or d,u since it
does not seem possible that any of these would be $FF00 or $FF02.
In any case, you certainly should not try to rotate the registers
directly as that is meaningless. You have to store and read from the
registers.
More information about the Coco
mailing list