RS232 interrupt programming in protected mode go32v2
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)
