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)
|