home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / assemblr / library / screen / split / split.asm < prev    next >
Assembly Source File  |  1990-03-25  |  6KB  |  154 lines

  1. ;-----------------------------------------------------------------------------
  2. ;      Split_Screen - SnapShot                       release 1.0
  3. ;      Copyright (c) Ingo Eickmann, 1989                    06/14/89
  4. ;      Verbessert Norbert Raum-Deinzer                                25/03/90
  5. ;-----------------------------------------------------------------------------
  6.  
  7.     PAGE 65,80
  8.     TITLE Split_Screen
  9.  
  10. ALT_U        equ 1600h        ; Scan-Code von <ALT-U>
  11. ALT_D        equ 2000h        ; Scan-Code von <ALT-D>
  12. ALT_S       equ 1F00h        ; Scan-Code von <ALT-S>
  13. Snap_Buffer    equ 1000h        ; Offset der 2. Bildschirmseite
  14. max_Lines    equ 400            ; für VGA-Textmode, EGA-Textmode: 350
  15.  
  16. if1
  17.     include split.mac
  18. endif
  19. ;-----------------------------------------------------------------------------
  20. KBDSEG segment at 40h            ; Einträge im System-Segment
  21.    org 1Ah
  22.     HEAD     dw ?            ; Vektor auf ältesten Eintrag im Buffer
  23.     TAIL    dw ?            ; Vektor auf freien Platz im Buffer
  24.     Buffer    dw 16 dup(?)        ; Tastatur-Buffer
  25.    org 80h
  26.     Buffer_Start    dw ?        ; erste Speicherstelle des Buffers
  27.     Buffer_End    dw ?        ; letzte Speicherstelle+1
  28. KBDSEG ends
  29. ;-----------------------------------------------------------------------------
  30. code segment
  31.     assume cs:code, ds:code, es:KBDSEG
  32.     org 100h            ; Startadresse für .com-File
  33. start:    jmp Install
  34. ;-----------------------------------------------------------------------------
  35. oldint09h    dd 0            ; Vektor auf alte Interruptroutine 09h
  36. oldint1Ch    dd 0            ; Vektor auf alte Interruptroutine 1Ch
  37. Line_Compare    dw -1            ; Wert für Line_Compare_Register
  38. Add_Word    dw 0
  39. ;-----------------------------------------------------------------------------
  40. INT09h proc near            ; Erweiterung für Tastaturinterrupt
  41.     pushf                ; retten aller Register und Flags
  42.     REG_PUSH <ax,bx,cx,dx,di,si,ds,es> 
  43.     pushf                ; Aufruf der alten ISR 09h
  44.     call dword ptr cs:[oldint09h]
  45.     cli
  46.     push cs                ; Vorbelegung der Segment-Register
  47.     pop ds
  48.     mov ax,KBDSEG
  49.     mov es,ax
  50.     cmp byte ptr es:[49h],3        ; Text-Mode 80x25 Color?
  51.     jne Raus
  52.     mov si,[Tail]            ; Vektor auf letzten Eintrag im
  53.     cmp si,[Head]            ;   Tastatur-Buffer    
  54.     jz Raus                
  55.     cmp si,[Buffer_Start]
  56.     jg ok2
  57.     mov si,[Buffer_End]
  58. ok2:    sub si,2            ; Scan-Code entnehmen        
  59.      mov ax,es:[si]            ;   und in ax speichern
  60.     cmp ax,ALT_U            ; Ist Scan-Code ALT-U?
  61.     jne ok3
  62.     sub Add_word,1            ; Ja: nach oben beschleunigen
  63.     jmp Ende
  64. ok3:    cmp ax,ALT_D            ; Ist Scan-Code ALT-S?
  65.     jne ok4
  66.     add Add_word,1            ; Ja: nach unten beschleunigen
  67.     jmp Ende
  68. ok4:    cmp ax,ALT_S            ; Ist Scan-Code ALT_S?
  69.     jne Raus
  70.     REG_PUSH <si,ds,es>        ;  Ja: Register speichern
  71.     mov ax,0B800h            ;      Video-Segment laden
  72.     mov ds,ax
  73.     mov es,ax
  74.     mov si,0            ;  Offset der 1.Bildschirmseite
  75.     mov di,Snap_Buffer        ;  Offset des Zwischenspeichers
  76.     mov cx,1000h shr 1        ;  Zähler auf 1000h Bytes
  77.     cld
  78.     repnz movsw            ;  Bildschirmseite kopieren
  79.     REG_POP <es,ds,si>        ;  Register wiederherstellen
  80. Ende:   mov [TAIL],si            ; Vektor auf nächsten Eintrag zurück-
  81. Raus:   REG_POP <es,ds,si,di,dx,cx,bx,ax>        ; schreiben
  82.     popf                ; alle Register wiederherstellen
  83.     iret                ; Rücksprung aus der ISR
  84. INT09h endp
  85. ;-----------------------------------------------------------------------------
  86. INT1Ch proc near            ; Erweiterung des Zeitgeber-Interrupts
  87.     sti
  88.     pushf                ; register retten
  89.     REG_PUSH <ax,bx,cx,dx,ds,es,cs>
  90.     pop ds                ; Segmentrgister vorbelegen
  91.     mov ax,Add_word
  92.     or ax,ax            ; ist Verschiebung notwendig?
  93.     jnz pt0
  94.     jmp no_mov            ;    NEIN: => Raus
  95. pt0:    add ax,Line_Compare        ; Neuen Wert für Line_Compare berechnen
  96.     cmp ax,-1            ; oberste Zeile erreicht?
  97.     jg pt1
  98.     mov Add_word,0            ; JA: Verschiebung zurücksetzen
  99.     mov ax,-1
  100. pt1:    cmp ax,max_Lines        ; unterste Zeile erreicht?
  101.     jl pt2
  102.     mov Add_word,0            ; JA: zurücksetzen
  103.     mov ax,max_Lines
  104. pt2:    mov cx,Snap_Buffer        ; Offset für Start_Address_Register
  105.     push ax
  106.     cmp ax,-1            ; oberste Zeile?
  107.     jg pt3
  108.     mov ax,3FFh            ;   JA: default für Line_Compare
  109.     mov cx,0            ;       Offset für 1. Bildschirmseite
  110. pt3:    mov Line_Compare,ax
  111.     Split_Screen cx,Line_Compare    ; s. Listing der Macros (Bild2)
  112.     pop ax
  113.     mov Line_Compare,ax        ; aktuellen Line_Compare speichern
  114. no_mov:    REG_POP <es,ds,dx,cx,bx,ax>    ; Register wiederherstellen
  115.     popf
  116.     jmp dword ptr cs:[oldint1CH]    ; Sprung in die    alte ISR
  117. INT1Ch endp
  118. ;-----------------------------------------------------------------------------
  119. Install: push cs            ; ds-Segment vorbelegen
  120.     pop ds
  121.     IRP n,<09h,1Ch>            ; Macro für Interrupts 09h und 1Ch
  122.         mov ax,35&n
  123.         int 21h            ; alte ISR-Vektoren retten
  124.         mov word ptr oldint&n,bx
  125.         mov word ptr oldint&n+2,es
  126.         mov ax,25&n        ; neue ISR-Vektoren setzen
  127.         mov dx,offset Int&n
  128.         int 21h
  129.     endm
  130.     lea dx,InstMSG        ; Meldung ausgeben
  131.     mov ah,9
  132.     int 21h
  133.     mov ax,3100h            ; resident beenden
  134.     mov dx,offset Install
  135.     mov cl,4
  136.     shr dx,cl
  137.     inc dx
  138.     int 21h
  139. InstMSG    db '▐▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀'
  140.     db '▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▌',0Ah,0Dh
  141.      db '▐ Split_Screen - SnapShot              '
  142.     db '                          release 1.0 ▌',0Ah,0Dh
  143.     db '▐ Copyright (c) I.Eickmann, 1989       '
  144.     db '                             06/14/89 ▌',0Ah,0Dh
  145.     db '▐ Überarbeitet  N.Raum-Deinzer, 1990   '
  146.     db '                             25/03/90 ▌',0Ah,0Dh
  147.     db '▐ Press <ALT-U> to accelerate up <ALT-D'
  148.     db '> to acc. down, <ALT-S> for SnapShot  ▌',0Ah,0Dh
  149.     db '▐▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄'
  150.     db '▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▌$'
  151. code    ENDS
  152. END   start
  153.                      accelerate up <ALT-D'
  154.     db '> to acc. down, <ALT-S> fo