;------------------------------------------------------------------------
;     Split Screen - Macros                                   release 1.0
;     Copyright (c) Ingo Eickmann, 1989                          06/14/89
;------------------------------------------------------------------------

IRP com,<push,pop>                    ; Macros zum push-en und pop-en von
   REG_&com macro paras               ; Registern
      IRP n,<paras>
         &com &n
      endm
   endm
endm

Vertical_retrace macro n              ; Vertical Retrace (Bit 3) im Input
local Loco                            ; Status Register 1 abfragen und
Loco: in al,dx                        ; auf 0 bzw. 1 warten
      test al,00001000b
      j&n Loco
endm

Split_Screen macro Start,Line         ; Teilung des Bildschirms:
  local LC1,LC2                       ; Start: Bildschirmspeicheroffset
     mov  ax,40h                      ;        fr oberen Bildschirmteil
     mov  es,ax                       ; Line: letzte Scan Line fr oberen Teil
     mov  dx,es:[63h]                 ; dx: CRTC address port (3B4h oder 3D4h)
     add  dx,6                        ; dx: CRT Status port (3BAh oder 3DAh)
     Vertical_retrace z               ; Warten, bis Vertical Retrace aktiv
     Vertical_retrace nz              ; Marten, bis Vert. Retrace nicht aktiv
     cli
     sub  dl,6
     mov  ax,Start                    ; Startadresse fr oberen Bildteil
     shr  ax,1
     mov  bl,al
     mov  al,0Ch
     out  dx,ax                       ; MSB in CRTC - Register 0Ch
     inc  al
     mov  ah,bl
     out  dx,ax                       ; LSB in CRTC - Register 0Dh
     sti
     Vertical_retrace z               ; Warten, bis Vertical Retrace aktiv
     cli
     mov  ax,Line                     ; letzte Scan Line fr oberen Bildteil
     mov  bh,ah
     mov  bl,ah
     and  bx,0201h                    ; Bit 8 und 9 trennen und aufbereiten
     mov  cl,4
     shl  bx,cl
     shl  bh,1
     mov  ah,18h
     xchg ah,al
     out  dx,ax                       ; Bits 7-0 ins Line Compare Register
     mov  al,7                        ; schreiben
     out  dx,al                       ; Overflow - Register adressieren
     inc  dx
     in   al,dx                       ; ! EGA (350 Zeilen-Mode): mov al,1Fh !
                                      ; ! EGA (200 Zeilen-Mode): mov al,11h !
     and  al,11101111b                ; Bit 8 des Line Compare Wertes in
     or   al,bl                       ; Bit 4 des Overflow - Registers
     out  dx,al                       ; schreiben
     dec  dx

     mov  al,9                        ; ! entf„llt fr EGA:                 !
     out  dx,al                       ; !                                   !
     inc  dx                          ; ! Bit 9 des Line Compare Wertes     !
     in   al,dx                       ; ! in Bit 6 des Max Scan Line        !
     and  al,10111111b                ; ! Registers schreiben               !
     or   al,bh                       ; !                                   !
     out  dx,ax                       ; ! bis hier entf„llt es fr die EGA  !
     sti
endm
