RS232 interrupt programming in protected mode go32v2

Notify me of responses

Hi. Can anyone help me on programming rs232 serial port in go32v2
protected mode. I use example found in help file for interrupt
functions. It works for keyboard (INT $9) but whatever I do it doesnt
work for COM port interrupt (INT $B). Where is the mistake?

I configured rs232 port to send interrupt on data receive. So this
program should beep every time when COM port receives byte.

This is my source code:

----------------------------------------------

program kbd;

{$ASMMODE ATT}
{$MODE FPC}
uses
        crt,

        go32,ports;
const

        kbdint = $B;

var

        oldint9_handler : tseginfo;

        newint9_handler : tseginfo;

        clickproc : pointer;

        backupDS : Word; external name '___v2prt0_ds_alias';

procedure int9_handler; assembler;

asm

        cli

        pushl %ds

        pushl %es

        pushl %fs

        pushl %gs

        pushal

        movw %cs:backupDS, %ax

        movw %ax, %ds

        movw %ax, %es

        movw dosmemselector, %ax

        movw %ax, %fs

        call *clickproc

        popal

        popl %gs

        popl %fs

        popl %es

        popl %ds

        ljmp %cs:oldint9_handler

end;

procedure int9_dummy; begin end;

procedure clicker;

begin

        sound(500); delay(10); nosound;

end;

procedure clicker_dummy; begin end;

procedure install_click;

begin

        clickproc := @clicker;

        lock_data(clickproc, sizeof(clickproc));

        lock_data(dosmemselector, sizeof(dosmemselector));

        lock_code(@clicker,

                longint(@clicker_dummy) - longint(@clicker));

        lock_code(@int9_handler,

                longint(@int9_dummy)-longint(@int9_handler));

        newint9_handler.offset := @int9_handler;

        newint9_handler.segment := get_cs;

        get_pm_interrupt(kbdint, oldint9_handler);

        set_pm_interrupt(kbdint, newint9_handler);

end;

procedure remove_click;

begin

        set_pm_interrupt(kbdint, oldint9_handler);

        unlock_data(dosmemselector, sizeof(dosmemselector));

        unlock_data(clickproc, sizeof(clickproc));

        unlock_code(@clicker,

                longint(@clicker_dummy)-longint(@clicker));

        unlock_code(@int9_handler,

                longint(@int9_dummy)-longint(@int9_handler));

end;

var

        ch : char;



intmask: byte;



Const

  IO_Reg  = 0;

  Lo_Div  = 0;

  Hi_Div  = 1;

  Int_Reg = 1;

  Int_Id  = 2;

  Control = 3;

  Modem  = 4;

  Status  = 5;

  MStatus = 6;

  Base=$2F8;



begin

        outportb($2f8+1,0); //disable interrupt

        install_click;

        outportb($2f8+3,$80);//dlab
        outportb($2f8+0,$0C);//9600bps
        outportb($2f8+1,$00);
        outportb($2f8+3,$03);//dlab off
        outportb($2f8+2,$C1);//FIFO

        outportb($21,inportb($21) and $F7); //PIC interrupt mask

        outportb($2f8+1,$1);


        WriteLn(inportb($21));
        Writeln('Enter any message. Press return when finished');
        while (ch <> #13) do begin
                ch := readkey; write(ch);
        end;
        remove_click;
end.

------------------------------

Thanks.

-- Alex Novikov, June 19, 2002 05:14 PM (email)