[comp.sys.amiga.tech] Comments wanted on some Asm68k code dealing w/ the Console..

rickf@pnet02.cts.com (Rick Flower) (03/28/89)

I'm attempting to open the console port on a standard window using a regular
CUSTOMSCREEN type window.. Anyway, I would like to receive input from the 
window using the console device, and not the RAWKEY function of Intuition.
So, I've been able to open the console for writing to my window, that works
without any problems.. Except, now that I'm trying to open the console for
reading from the keyboard via my window, as soon as I generate a mask for
it from the signal bit it is using, it NEVER returns saying that a key was
pressed at all!  I've been putzing around with my code for the last week and
haven't found ANYTHING that will make it work ok.. So, I've included some of
my initialization code and whatnot to take a look at.. Perhaps some of you
Asm68k guru's out there could tell me if anything looks wrong [ probably 
does! (:->) ], or perhaps give me a direction to head myself..?  The 
routines that I've included below are :

   OpenRdConsole : Opens the read console, ONLY after opening the write
                   console first (it does the OpenDevice call).

   StartConsoleIO: This starts the console looking for characters (maybe?)

   WaitForIDCMP  : This will supposedly "wait" until a key is pressed..


If you have any suggestions, PLEEZE let me know via either e-mail or here 
in the form of another message... Thanks MUCHO in advance..

=============================================================================
                             CODE SNIPPET BELOW
=============================================================================

;----------------------------------------------------------------------------
;-      Open a Console Port for Reading from the Main Window's Keyboard
;----------------------------------------------------------------------------
OpenRdConsole:
        move.l  _SysBase,a6             ; Get the base address of Exec..
        move.l  #-1,d0
        jsr     Exec_AllocSignal(a6)    ; Attempt to allocate a signal!
        cmp.l   #-1,d0                  ; Did it fail??
        bne     ORC_0                   ; If not, continue..

;-----------------------------------------------------------------
;- If it couldn't get a signal, return with pointer to msg in D0
;-----------------------------------------------------------------
        move.l  #ConsFail2Msg,d2        ; Get the Fail Msg addr
        move.l  #ConsFail2MsgE,d3
        rts

;-----------------------------------------------
;- Create a Message Port for the Console Device
;-----------------------------------------------
ORC_0:  move.b  d0,ConRdSignal          ; Save the Signal #
        lea     ConReadPort,a1          ; Load addr of MsgPort structure
        move.l  #ConReadName,LN_NAME(a1)
        move.b  #NT_MESSAGE,LN_TYPE(a1) ; Make it a Message Port
        move.b  #0,LN_PRI(a1)           ; Make it a Medium Priority
        move.l  OurTask,MP_SIGTASK(a1)  ; Get our task pointer
        move.b  #PA_SIGNAL,MP_FLAGS(a1) ; Setup the Signal Pointer info
        move.b  ConRdSignal,MP_SIGBIT(a1)
        jsr     Exec_AddPort(a6)        ; Add the Port!

;----------------------------------------------------------
;- Initialize the Console Read Data Structure (IOStdReq)
;----------------------------------------------------------
        lea     ConsoleName,a0          ; Load the addr of Console Name
        lea     ConsoleReadReq,a1       ; Load StdIOReq structure addr
        move.l  #ConReadPort,MN_REPLYPORT(a1)
        move.l  MainWindow,IO_DATA(a1)
        lea     ConsoleWriteReq,a2      ; Load StdIOReq structure Write addr
        move.l  IO_DEVICE(a2),IO_DEVICE(a1)
        move.l  IO_UNIT(a2),IO_UNIT(a1)
        move.l  #0,d2                   ; set to OK status..
        rts

;------------------------------------------------------------------------
;- Start the Console Device Looking for Characters from the Keyboard..
;------------------------------------------------------------------------
StartConsoleIO:
        movem.l a0-a7/d0-d7,-(sp)
        lea     ConsoleReadReq,a1
        move.l  #ConReadBuff,IO_DATA(a1)
        move.l  #1,IO_LENGTH(a1)
        move.w  #CMD_READ,IO_COMMAND(a1)
        move.l  _SysBase,a6
        jsr     Exec_SendIO(a6)
        movem.l (sp)+,a0-a7/d0-d7
        rts

;----------------------------------------------------------------------------
;- This Routine Will Generate a Correct IDCMP "Wait" Mask and Wait Until
;- Exec Say's that there is an Event to Process!  At that Point, it will
;- Return to the Caller for Processing which event happened (in Reg. D0!)
;----------------------------------------------------------------------------
WaitForIDCMP:
        movem.l d1-d7/a0-a6,-(sp)       ; Save ALL Registers!
        clr.l   d0                      ; Clear out for shifting..
        move.l  ConReadPort,a0          ; Get the Console Read Port..
        move.b  MP_SIGBIT(a0),d0        ; Get the Signal Bit for this Port!
        moveq.l #1,d1                   ; Set a "1" in first bit position
        lsl.l   d0,d1                   ; Shift it left "MP_SIGBIT" times..
        move.l  d1,SigBit_Console       ; Save the Signal Bit Indicator
;--------------------------------------------------------------------------
        move.l  SigBit_Console,d0       ; Get the Console Signal Bit Pos.
        move.l  _SysBase,a6             ; Get the base address of Exec..
        jsr     Exec_Wait(a6)           ; Wait for a Signal from the either!
        movem.l (sp)+,d1-d7/a0-a6       ; Restore ALL Registers!
        rts

;---------------------------------------------------------------------------
;-                           Global Data Area
;---------------------------------------------------------------------------
                SECTION regdata,DATA

ConReadName     dc.b    'Term87 - Con:R',0

                SECTION bssdata,BSS

SigBit_Console  ds.l    $1      ; Signal Bit Position for Console Read Port
ConReadPort     ds.b    $22     ; Bytes for Console Read Port
ConsoleReadReq  ds.b    $30     ; Bytes for Console Read Struct (IOStdReq)
ConRdSignal     ds.b    $1      ; Signal Number for Console Read Port
                cnop    0,2
ConReadBuff     ds.w    $1      ; Console Read Channel Key Buffer
                end

===============================================================================
                                I Thought So...

UUCP: {ames!elroy, <backbone>}!gryphon!pnet02!rickf
INET: rickf@pnet02.cts.com
===============================================================================