Re: A89: Re: Difficulty inserting assembly into C code


[Prev][Next][Index][Thread]

Re: A89: Re: Difficulty inserting assembly into C code





Read the Keypad tutorial at http://ti89.acz.org =)
It tells you about it =P

-'FuZeD

On Sun, 8 Aug 1999 TurboSoft@aol.com wrote:

> 
> is there a way someone can help me out?  l know l'm sending a lot of messages 
> to the list and l don't want to ask too much.  l also know that it's not cool 
> to give someone a huge chunk of code and ask them to fix it...but l need a 
> little help.  l've found that there isn't any getkey() function in any 
> libraries, which would just return 0 if no key is pressed (and not "idle").  
> what l'm trying to do is take the idle_loop() code out of userlib.asm and 
> strip all the pausing and apd stuff, so that it just checks for a key press 
> and returns a value (regardless of if a key was pressed or not).  In the 
> first asm("  ") construct is the whole code, as it was.  ln the second is my 
> code, after l've taken out what l think needs to be taken out (more or less). 
>  l guess maybe if someone can tell me if the bottom code will work?  Sorry 
> for the length of this mail, thanks though!
> 
> 
> 
> get_key()
> {
> asm("
>     movem.l a0-a6/d1-d7,-(a7)
> \idle_start
>     move.l  APD_INIT,APD_TIMER   ; reset APD timer
>     clr.w   APD_FLAG        ; reset APD flag
> \wait_idle
>     tst.w   APD_FLAG        ; time for APD?
>     beq \no_apd         ; no -- do not shut down
> \do_apd
>     trap    #4
>     bra \idle_start
> \no_apd
>     tst.w   (doorsos::kb_vars+$1C)     ; has a key been pressed?
>     beq \wait_idle
>     move.l  APD_INIT,APD_TIMER   ; reset APD timer (1)
>     move.w  (doorsos::MaxHandles+$1E),d0
>     clr.w   (doorsos::kb_vars+$1C)     ; clear key buffer
> \try_key_off
>     cmp.w   #KEY_DIAMOND+$10B,d0        ;press of diamond+On
>     beq \do_apd         ;->off
> \not_key_off
>     movem.l (a7)+,a0-a6/d1-d7
>     rts
>      ");
> };
> 
> 
> HERE'S MY NEW CODE?
> 
> get_key()
> {
> asm("
>     movem.l %a0-%a6/%d1-%d7,-(%a7)
>     tst.w   (doorsos::kb_vars+$1C)     ; has a key been pressed?
>     move.w  (doorsos::MaxHandles+$1E),d0
>     clr.w   (doorsos::kb_vars+$1C)     ; clear key buffer
>     movem.l (%a7)+,%a0-%a6/%d1-%d7
>      ");
> };
> 



References: