TIP: Click on subject to list as thread! ANSI
echo: pascal
to: ALL
from: STEVE JOHNSON
date: 1998-05-11 22:28:00
subject: Async ISR

  Hello, all!
  Previously I posted my whole Async unit because it wasn't working.  Well
it doesn't crash anymore :) but I'm not sure about my ISR here.  If
anyone knows anything about assembly and asynchronous interfaces, please
help!
  I think I tried writing a plain Pascal Interrupt procedure, but my
object wouldn't allow it inside.  I'm not sure about that, I remember
getting the error, perhaps I'll try again, though.
  However, I would still like the ISR in assembly, because it has to be
fairly fast for a high speed modem.
Procedure TAsync.ISR; Assembler;
Asm
{   POP BP                   { COMPILER INSERTS PUSH BP }
{   PUSHA                    { PUSH ALL GENERAL REGISTERS }
   ; I'm not sure about the above two lines and the POPA I commented out
   ; below..
   STI                      { DISABLE INTERRUPTS }
   MOV DX, APort            { GET THE PORT NUMBER }
   ADD DX, IIR              { CHOOSE THE IIR PORT }
   IN  AL, DX               { READ BYTE FROM THE IIR }
   AND AL, $06
   CMP AL, $04              { IF AL IS $04 THEN A CHAR WAS RECEIVED }
   JNE @NoChar              { IF NOT A CHAR, THEN IT WAS AN ERROR }
   MOV AX, Head
   CMP AX, Tail             { IF HEAD = TAIL, THEN THERE IS NO BUFFER ROOM }
   JE  @NoRoom
   LEA BX, Buffer           { LOAD UP THE BUFFER }
   ADD BX, Tail             { HEAD TO THE TAIL OF THE BUFFER }
   SUB DX, IIR              { WE WANT THE THR REGISTER }
   IN  AL, DX               { GET THE BYTE }
   MOV [BX], AL             { PUT IT IN THE BUFFER }
   INC Tail                 { INCREMENT THE TAIL OF THE BUFFER }
   CMP Tail, 8192           { IF TAIL >= 8192 THEN TAIL = 0 }
   JNE @NoZero
   MOV Tail, 0
@NoZero:
   JMP @AlmostDone          { WE'RE ALMOST DONE }
@NoRoom:
   SUB DX, IIR              { SET UP TO GET THE BYTE }
   IN  AL, DX               { THROW AWAY THE BYTE (OVERRUNS) }
   JMP @AlmostDone
@NoChar:
   CMP AL, $06              { SEE IF THERE IS AN ERROR }
   JNE @AlmostDone
   SUB DX, IIR
   IN  AL, DX               { CLEAR RDR }
@AlmostDone:
   CLI                      { ENABLE INTERRUPTS }
   MOV AL, $20
   OUT $20, AL              { RESET THE PIC }
{   POPA                     { RESTORE THE REGISTERS }
   IRET                     { INTERRUPT RETURN }
End;
Thanks in advance,
Steve
---
 € QMPro 1.53 € Programming is like sex, one mistake and you support it!
--- What a Rush!
---------------
* Origin: Space Dock,The Galactic Meeting Place(519)893-1153 (1:221/201)

SOURCE: echomail via exec-pc

Email questions or comments to sysop@ipingthereforeiam.com
All parts of this website painstakingly hand-crafted in the U.S.A.!
IPTIA BBS/MUD/Terminal/Game Server List, © 2025 IPTIA Consulting™.