home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / 1987 / 07 / rs232 / rs232spl.asm next >
Encoding:
Assembly Source File  |  1987-04-28  |  4.1 KB  |  156 lines

  1. page ,132
  2. ;
  3. ; Residente RS 232 Spooler Routine.   Autor: K. Feller 12/3/87
  4. ;
  5. code       segment
  6.            assume  cs:code,ds:code,es:nothing,ss:nothing
  7. ;
  8. rs232_data equ  03f8h               ; Datenport der Schnittstelle
  9. intr_frei  equ  20h                 ; Interrupt Kontroler Freigabe
  10. buffersize equ  10000               ; Ringbuffergroesse
  11. msdos      equ  21h                 ; MSDOS Interrupt
  12. terminate  equ  20h                 ; Terminiere Programm
  13. stay       equ  27h                 ; Stay resident
  14. ;
  15.            org     100H
  16. start:     jmp    begin
  17. ;
  18. in_pointer dw     0                 ; Empfangs Zaehler
  19. buffer_ofs dw     0                 ; Ringbuffer Offset an PASCAL
  20. anzahl_ch  dw     0                 ; Anzahl der Zeichen im Buffer an PASCAL
  21. ot_pointer dw     0                 ; Ausgabe Zaehler an PASCAL
  22. range      dw     buffersize        ; Ringbuffergroesse an PASCAL
  23. ueberlauf  db     0ffh              ; Kein Ueberlauf an PASCAL
  24. ;
  25. ; Interrupt Procedure
  26. ;
  27. ; Rette alle benutzen Register
  28. ;
  29. intr:      push   ds
  30.            push   ax
  31.            push   bx
  32.            push   cx
  33.            push   dx
  34.            push   di
  35. ;
  36. ; Ringbuffer Hauptprogramm
  37. ;
  38. ; Hole Zeichen von Schnittstelle
  39. ;
  40.            mov    dx,rs232_data
  41.            in     al,dx
  42. ;
  43. ; Lade DI-Register mit dem Zeiger auf einen freien Ringbuffer Platz
  44. ;
  45.            mov    di,offset buffer
  46.            mov    cx,word ptr cs:in_pointer
  47.            add    di,cx
  48.            mov    byte ptr cs:[di],al
  49. ;
  50. ; Erhoehe Zeiger um 1 : Falls Ueberlauf fange bei 0 wieder an.
  51. ;
  52.            inc    cx
  53.            cmp    cx,word ptr cs:[range]
  54.            jle    alles_ok
  55.            xor    cx,cx
  56. alles_ok:  mov    word ptr cs:in_pointer,cx
  57.            mov    ax,word ptr cs:anzahl_ch
  58.            inc    ax
  59.            cmp    ax,word ptr cs:[range]
  60.            jng    kein_ul
  61. ;
  62. ; Setze Ueberlauf Flag
  63. ;
  64.            xor    al,al
  65.            mov    byte ptr cs:[ueberlauf],al
  66.            jmp    weiter
  67. ;
  68. ; Kein Ueberlauf
  69. ;
  70. kein_ul:   mov    word ptr cs:anzahl_ch,ax
  71. ;
  72. ; Ende der Ringbuffer Routine und Freigabe des Schnittstellenbausteins
  73. ;
  74. weiter:    cli
  75.            mov    dx,intr_frei
  76.            mov    ax,dx
  77.            out    dx,al
  78. ;
  79. ; Wieder herstellen der Registerinhalte
  80. ;
  81.            pop    di
  82.            pop    dx
  83.            pop    cx
  84.            pop    bx
  85.            pop    ax
  86.            pop    ds
  87. eint:      iret
  88. ;
  89. buffer     db     buffersize dup (' ')
  90. ;
  91. ; Interrupt Routine geht bis hier.
  92. ;
  93. ;=============================================
  94. ;
  95. ; Kleines Programm zum initialisieren der Interrupt Routine
  96. ;
  97. ; Programm Meldungen
  98. ;
  99. okmsg      db 10,13
  100.            db 10,13
  101.            db "RS 232 C - Spooler installiert...",10,13
  102.            db 10,13
  103.            db "Copyright 1987 by Klaus Feller, PASCAL Int.",10,13
  104.            db 10,13,"$"
  105. errmsg     db 10,13
  106.            db 10,13
  107.            db "RS 232 C - Spooler schon aktiv...",10,13
  108.            db 10,13,"$"
  109. ;
  110. ; Beginn des Initialisierungsprogrammes
  111. ;
  112. ; Holen des Interruptvektors 0ch (RS 232 Interrupt)
  113. ;
  114. begin:     push   es
  115.            mov    ax,350ch
  116.            int    msdos
  117.            mov    cx,offset intr
  118. ;
  119. ; Spooler schon aktiv ?
  120. ;
  121.            cmp    bx,cx
  122.            je     err
  123.            pop    es
  124. ;
  125. ; Nein: Dann weiter mit initialisieren
  126. ;
  127.            mov    ax,250ch
  128.            mov    dx,offset intr
  129.            int    msdos
  130.            jmp    short okend
  131. ;
  132. ; Ja: Gebe Fehlermeldung aus
  133. ;
  134. err:       mov    dx,offset errmsg
  135.            mov    ah,09h
  136.            int    msdos
  137.            int    terminate
  138. ;
  139. ; Beende Programm erfolgreich
  140. ;
  141. okend:     mov    dx,offset okmsg
  142.            mov    ah,09h
  143.            int    msdos
  144.            mov    ax,offset buffer
  145.            mov    word ptr cs:buffer_ofs,ax
  146.            xor    ax,ax
  147.            mov    word ptr cs:in_pointer,ax
  148.            mov    word ptr cs:anzahl_ch,ax
  149.            mov    word ptr cs:ot_pointer,ax
  150. ;
  151. ; Beende Programm und gebe Speicher nur ab Bufferende frei
  152. return:    mov    dx,offset okmsg
  153.            int    stay
  154. code       ends
  155.            end     start
  156.