home *** CD-ROM | disk | FTP | other *** search
- ;-----------------------------------------------------------------------------
- ; Split_Screen - SnapShot release 1.0
- ; Copyright (c) Ingo Eickmann, 1989 06/14/89
- ; Verbessert Norbert Raum-Deinzer 25/03/90
- ;-----------------------------------------------------------------------------
-
- PAGE 65,80
- TITLE Split_Screen
-
- ALT_U equ 1600h ; Scan-Code von <ALT-U>
- ALT_D equ 2000h ; Scan-Code von <ALT-D>
- ALT_S equ 1F00h ; Scan-Code von <ALT-S>
- Snap_Buffer equ 1000h ; Offset der 2. Bildschirmseite
- max_Lines equ 400 ; für VGA-Textmode, EGA-Textmode: 350
-
- if1
- include split.mac
- endif
- ;-----------------------------------------------------------------------------
- KBDSEG segment at 40h ; Einträge im System-Segment
- org 1Ah
- HEAD dw ? ; Vektor auf ältesten Eintrag im Buffer
- TAIL dw ? ; Vektor auf freien Platz im Buffer
- Buffer dw 16 dup(?) ; Tastatur-Buffer
- org 80h
- Buffer_Start dw ? ; erste Speicherstelle des Buffers
- Buffer_End dw ? ; letzte Speicherstelle+1
- KBDSEG ends
- ;-----------------------------------------------------------------------------
- code segment
- assume cs:code, ds:code, es:KBDSEG
- org 100h ; Startadresse für .com-File
- start: jmp Install
- ;-----------------------------------------------------------------------------
- oldint09h dd 0 ; Vektor auf alte Interruptroutine 09h
- oldint1Ch dd 0 ; Vektor auf alte Interruptroutine 1Ch
- Line_Compare dw -1 ; Wert für Line_Compare_Register
- Add_Word dw 0
- ;-----------------------------------------------------------------------------
- INT09h proc near ; Erweiterung für Tastaturinterrupt
- pushf ; retten aller Register und Flags
- REG_PUSH <ax,bx,cx,dx,di,si,ds,es>
- pushf ; Aufruf der alten ISR 09h
- call dword ptr cs:[oldint09h]
- cli
- push cs ; Vorbelegung der Segment-Register
- pop ds
- mov ax,KBDSEG
- mov es,ax
- cmp byte ptr es:[49h],3 ; Text-Mode 80x25 Color?
- jne Raus
- mov si,[Tail] ; Vektor auf letzten Eintrag im
- cmp si,[Head] ; Tastatur-Buffer
- jz Raus
- cmp si,[Buffer_Start]
- jg ok2
- mov si,[Buffer_End]
- ok2: sub si,2 ; Scan-Code entnehmen
- mov ax,es:[si] ; und in ax speichern
- cmp ax,ALT_U ; Ist Scan-Code ALT-U?
- jne ok3
- sub Add_word,1 ; Ja: nach oben beschleunigen
- jmp Ende
- ok3: cmp ax,ALT_D ; Ist Scan-Code ALT-S?
- jne ok4
- add Add_word,1 ; Ja: nach unten beschleunigen
- jmp Ende
- ok4: cmp ax,ALT_S ; Ist Scan-Code ALT_S?
- jne Raus
- REG_PUSH <si,ds,es> ; Ja: Register speichern
- mov ax,0B800h ; Video-Segment laden
- mov ds,ax
- mov es,ax
- mov si,0 ; Offset der 1.Bildschirmseite
- mov di,Snap_Buffer ; Offset des Zwischenspeichers
- mov cx,1000h shr 1 ; Zähler auf 1000h Bytes
- cld
- repnz movsw ; Bildschirmseite kopieren
- REG_POP <es,ds,si> ; Register wiederherstellen
- Ende: mov [TAIL],si ; Vektor auf nächsten Eintrag zurück-
- Raus: REG_POP <es,ds,si,di,dx,cx,bx,ax> ; schreiben
- popf ; alle Register wiederherstellen
- iret ; Rücksprung aus der ISR
- INT09h endp
- ;-----------------------------------------------------------------------------
- INT1Ch proc near ; Erweiterung des Zeitgeber-Interrupts
- sti
- pushf ; register retten
- REG_PUSH <ax,bx,cx,dx,ds,es,cs>
- pop ds ; Segmentrgister vorbelegen
- mov ax,Add_word
- or ax,ax ; ist Verschiebung notwendig?
- jnz pt0
- jmp no_mov ; NEIN: => Raus
- pt0: add ax,Line_Compare ; Neuen Wert für Line_Compare berechnen
- cmp ax,-1 ; oberste Zeile erreicht?
- jg pt1
- mov Add_word,0 ; JA: Verschiebung zurücksetzen
- mov ax,-1
- pt1: cmp ax,max_Lines ; unterste Zeile erreicht?
- jl pt2
- mov Add_word,0 ; JA: zurücksetzen
- mov ax,max_Lines
- pt2: mov cx,Snap_Buffer ; Offset für Start_Address_Register
- push ax
- cmp ax,-1 ; oberste Zeile?
- jg pt3
- mov ax,3FFh ; JA: default für Line_Compare
- mov cx,0 ; Offset für 1. Bildschirmseite
- pt3: mov Line_Compare,ax
- Split_Screen cx,Line_Compare ; s. Listing der Macros (Bild2)
- pop ax
- mov Line_Compare,ax ; aktuellen Line_Compare speichern
- no_mov: REG_POP <es,ds,dx,cx,bx,ax> ; Register wiederherstellen
- popf
- jmp dword ptr cs:[oldint1CH] ; Sprung in die alte ISR
- INT1Ch endp
- ;-----------------------------------------------------------------------------
- Install: push cs ; ds-Segment vorbelegen
- pop ds
- IRP n,<09h,1Ch> ; Macro für Interrupts 09h und 1Ch
- mov ax,35&n
- int 21h ; alte ISR-Vektoren retten
- mov word ptr oldint&n,bx
- mov word ptr oldint&n+2,es
- mov ax,25&n ; neue ISR-Vektoren setzen
- mov dx,offset Int&n
- int 21h
- endm
- lea dx,InstMSG ; Meldung ausgeben
- mov ah,9
- int 21h
- mov ax,3100h ; resident beenden
- mov dx,offset Install
- mov cl,4
- shr dx,cl
- inc dx
- int 21h
- InstMSG db '▐▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀'
- db '▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▌',0Ah,0Dh
- db '▐ Split_Screen - SnapShot '
- db ' release 1.0 ▌',0Ah,0Dh
- db '▐ Copyright (c) I.Eickmann, 1989 '
- db ' 06/14/89 ▌',0Ah,0Dh
- db '▐ Überarbeitet N.Raum-Deinzer, 1990 '
- db ' 25/03/90 ▌',0Ah,0Dh
- db '▐ Press <ALT-U> to accelerate up <ALT-D'
- db '> to acc. down, <ALT-S> for SnapShot ▌',0Ah,0Dh
- db '▐▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄'
- db '▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▌$'
- code ENDS
- END start
- accelerate up <ALT-D'
- db '> to acc. down, <ALT-S> fo