home *** CD-ROM | disk | FTP | other *** search
- page ,132
- ;
- ; Residente RS 232 Spooler Routine. Autor: K. Feller 12/3/87
- ;
- code segment
- assume cs:code,ds:code,es:nothing,ss:nothing
- ;
- rs232_data equ 03f8h ; Datenport der Schnittstelle
- intr_frei equ 20h ; Interrupt Kontroler Freigabe
- buffersize equ 10000 ; Ringbuffergroesse
- msdos equ 21h ; MSDOS Interrupt
- terminate equ 20h ; Terminiere Programm
- stay equ 27h ; Stay resident
- ;
- org 100H
- start: jmp begin
- ;
- in_pointer dw 0 ; Empfangs Zaehler
- buffer_ofs dw 0 ; Ringbuffer Offset an PASCAL
- anzahl_ch dw 0 ; Anzahl der Zeichen im Buffer an PASCAL
- ot_pointer dw 0 ; Ausgabe Zaehler an PASCAL
- range dw buffersize ; Ringbuffergroesse an PASCAL
- ueberlauf db 0ffh ; Kein Ueberlauf an PASCAL
- ;
- ; Interrupt Procedure
- ;
- ; Rette alle benutzen Register
- ;
- intr: push ds
- push ax
- push bx
- push cx
- push dx
- push di
- ;
- ; Ringbuffer Hauptprogramm
- ;
- ; Hole Zeichen von Schnittstelle
- ;
- mov dx,rs232_data
- in al,dx
- ;
- ; Lade DI-Register mit dem Zeiger auf einen freien Ringbuffer Platz
- ;
- mov di,offset buffer
- mov cx,word ptr cs:in_pointer
- add di,cx
- mov byte ptr cs:[di],al
- ;
- ; Erhoehe Zeiger um 1 : Falls Ueberlauf fange bei 0 wieder an.
- ;
- inc cx
- cmp cx,word ptr cs:[range]
- jle alles_ok
- xor cx,cx
- alles_ok: mov word ptr cs:in_pointer,cx
- mov ax,word ptr cs:anzahl_ch
- inc ax
- cmp ax,word ptr cs:[range]
- jng kein_ul
- ;
- ; Setze Ueberlauf Flag
- ;
- xor al,al
- mov byte ptr cs:[ueberlauf],al
- jmp weiter
- ;
- ; Kein Ueberlauf
- ;
- kein_ul: mov word ptr cs:anzahl_ch,ax
- ;
- ; Ende der Ringbuffer Routine und Freigabe des Schnittstellenbausteins
- ;
- weiter: cli
- mov dx,intr_frei
- mov ax,dx
- out dx,al
- ;
- ; Wieder herstellen der Registerinhalte
- ;
- pop di
- pop dx
- pop cx
- pop bx
- pop ax
- pop ds
- eint: iret
- ;
- buffer db buffersize dup (' ')
- ;
- ; Interrupt Routine geht bis hier.
- ;
- ;=============================================
- ;
- ; Kleines Programm zum initialisieren der Interrupt Routine
- ;
- ; Programm Meldungen
- ;
- okmsg db 10,13
- db 10,13
- db "RS 232 C - Spooler installiert...",10,13
- db 10,13
- db "Copyright 1987 by Klaus Feller, PASCAL Int.",10,13
- db 10,13,"$"
- errmsg db 10,13
- db 10,13
- db "RS 232 C - Spooler schon aktiv...",10,13
- db 10,13,"$"
- ;
- ; Beginn des Initialisierungsprogrammes
- ;
- ; Holen des Interruptvektors 0ch (RS 232 Interrupt)
- ;
- begin: push es
- mov ax,350ch
- int msdos
- mov cx,offset intr
- ;
- ; Spooler schon aktiv ?
- ;
- cmp bx,cx
- je err
- pop es
- ;
- ; Nein: Dann weiter mit initialisieren
- ;
- mov ax,250ch
- mov dx,offset intr
- int msdos
- jmp short okend
- ;
- ; Ja: Gebe Fehlermeldung aus
- ;
- err: mov dx,offset errmsg
- mov ah,09h
- int msdos
- int terminate
- ;
- ; Beende Programm erfolgreich
- ;
- okend: mov dx,offset okmsg
- mov ah,09h
- int msdos
- mov ax,offset buffer
- mov word ptr cs:buffer_ofs,ax
- xor ax,ax
- mov word ptr cs:in_pointer,ax
- mov word ptr cs:anzahl_ch,ax
- mov word ptr cs:ot_pointer,ax
- ;
- ; Beende Programm und gebe Speicher nur ab Bufferende frei
- return: mov dx,offset okmsg
- int stay
- code ends
- end start