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