;*************************************************************************
;*
;* Dieses Programm ist Public Domain und wurde mit dem Profimat-Assembler
;* von Data Becker erstellt. Das Kopieren für den privaten
;* Gebrauch ist erlaubt. Sollen das Programm oder Teile daraus für
;* kommerzielle Zwecke verwendet werden, bitte ich darum, sich mit
;* mir in Verbindung zu setzen.
;*
;* © 1988 Richard Englert, Flößaustraße 160, 8510 Fürth, Tel.:0911/708255
;*
;* letzte Änderung: 04-08-1988
;*
;* Programme für NTSC-Amigas nutzen nur 200 (bzw. 400) Zeilen und nicht
;* die bei PAL-Amigas üblichen 256 (bzw. 512)  Zeilen.
;* PALPatchII verändert beim ersten Aufruf die Intuition-Library. Die
;* Funktionen OpenWindow und OpenScreen werden umgeleitet und bei jedem
;* Benutzen einer der beiden Funktionen wird überprüft, ob das Window
;* oder der Screen, der geöffnet werden soll, 200 (bzw. 400) Zeilen hoch
;* ist. Wenn ja, wird die Anzahl der Zeilen von 200 auf 256 (bzw. von
;* 400 auf 512) geändert und die normale OpenWindow- oder OpenScreen-
;* Funktion aufgerufen.
;* Dieser kleine Eingriff hat jedoch nicht bei allen Programmen Sinn,
;* da viele eben nur mit 200 (bzw. 400) Zeilen rechnen und den
;* zusätzlichen Raum nicht nutzen. Bei solchen Programmen hat PALPatchII
;* dann natürlich keinen Sinn. Im Gegenteil, es wird das immer zu knappe
;* Chip-RAM verschwendet. Aus diesem Grund kann man PALPatchII ganz
;* einfach wieder ausschalten, indem man es ein zweites Mal aufruft.
;*
;* Eine mögliche Erweiterung wäre die Nutzbarmachung des Overscan-
;* Bereiches.
;*
;*************************************************************************

 INCLUDE 'ram:Amiga.ASM'

_LVOOpenLibrary   EQU -552
_LVOCloseLibrary  EQU -414
_LVOSetFunction   EQU -420
_LVOWait          EQU -318
_LVODelay         EQU -198
_LVOAllocSignal   EQU -330
_LVOSignal        EQU -324

;*************************************************************************
;Hauptprogramm:
;*************************************************************************

 INIT_AMIGA

 LEA PPName,A1                 ;sind wir schon als Task
 CALLSYS FindTask              ;vorhanden ?
 TST.L D0
 BEQ Install                   ;nein, dann installieren
 MOVE.L D0,TaskStruct

 ADD.L #$16,D0                 ;herausfinden, auf welches
 MOVE.L D0,A0                  ;Signal gewartet wird.
 MOVE.L (A0),D0                ;Signal -> D0
 MOVE.L TaskStruct,A1          ;Taskstruktur-Pointer -> A1
 LINKSYS Signal,ExecBase       ;Signal geben und Ende

 BRA EXIT

Install:                       ;PALPatch installieren
 SUB.L A1,A1                   ;eigene Taskstruktur
 CALLSYS FindTask              ;finden
 ADD.L #10,D0                  ;und Taskname auf
 MOVE.L D0,A0                  ;PALPatchII.4 ändern
 MOVE.L #PPName,(A0)

 MOVEQ #-1,D0
 LINKSYS AllocSignal,ExecBase    ;neues Signal finden
 TST.L D0

 BEQ EXIT

 MOVEQ #1,D1
 LSL.L D0,D1                   ;und in sig zwischenspeichern
 MOVE.L D1,sig

 LEA IntuitionName,A1          ;Intuition Library öffnen
 MOVEQ #0,D0
 CALLSYS OpenLibrary
 MOVE.L D0,IntuitionBase
 BEQ EXIT

 LEA DosName,A1                ;Dos Library öffnen
 MOVEQ #0,D0
 CALLSYS OpenLibrary
 MOVE.L D0,DosBase
 BEQ EXIT

 MOVE.L IntuitionBase,A1       ;OpenScreen-Funktion umleiten
 MOVE.L #-$00c6,A0             ;-$00c6 = Offset
 MOVE.L #Sneu,D0
 LINKSYS SetFunction,ExecBase
 MOVE.L D0,Sneu+38             ;alte Adresse als Sprungadresse für JMP

 MOVE.L IntuitionBase,A1       ;OpenWindow-Funktion umleiten
 MOVE.L #-$00cc,A0             ;-$00cc = Offset
 MOVE.L #Wneu,D0
 LINKSYS SetFunction,ExecBase
 MOVE.L D0,Wneu+38             ;alte Adresse als Sprungadresse für JMP

 MOVE.L sig,D0                 ;auf sig warten
 LINKSYS Wait,ExecBase

 MOVE.L IntuitionBase,A1       ;wenn Signal erhalten, umgeleitete
 MOVE.L #-$00c6,A0             ;OpenScreen-Funktion wieder
 MOVE.L Sneu+38,D0             ;auf normale Adresse biegen
 LINKSYS SetFunction,ExecBase

 MOVE.L IntuitionBase,A1
 MOVE.L #-$00cc,A0             ;umgeleitete OpenWindow-Funktion
 MOVE.L Wneu+38,D0             ;wieder auf normale Adresse biegen
 LINKSYS SetFunction,ExecBase

 BRA EXIT


Sneu:                          ;Umleitung für OpenScreen
 CMP.W #200,6(A0)              ;Screenhöhe = 200 ?
 BEQ S1                        ;ja, dann S1
 CMP.W #400,6(A0)              ;Screenhöhe = 400 ?
 BNE OS                        ;nein, dann OS
 MOVE.W #512,6(A0)             ;ja, neue Screenhöhe = 512
 BRA OS
S1:
 MOVE.W #256,6(A0)             ;neue Screenhöhe = 256 (alt = 200)
OS:
 JMP $0000000.L                ;Einsprung in OpenScreen


Wneu:                          ;Umleitung für OpenWindow
 CMP.W #200,6(A0)              ;Windowhöhe = 200 ?
 BEQ W1                        ;ja, dann W1
 CMP.W #400,6(A0)              ;Windowhöhe = 400 ?
 BNE OW                        ;nein, dann OW
 MOVE.W #512,6(A0)             ;ja, neue Windowhöhe = 512
 BRA OW
W1:
 MOVE.W #256,6(A0)             ;neue Windowhöhe = 256
OW:
 JMP $0000000.L                ;Einsprung für OpenWindow


EXIT:                          ;Programm beenden

 MOVE.L IntuitionBase,D0       ;Intuition Library schließen
 BEQ.S No_Lib
 MOVE.L D0,A1
 CALLSYS CloseLibrary
 MOVE.L DosBase,D0             ;Dos Library schließen
 BEQ.S No_Lib
 MOVE.L D0,A1
 CALLSYS CloseLibrary
No_Lib:
 EXIT_AMIGA

 ALIGN
 DATA
IntuitionName:       DC.B 'intuition.library',0
DosName:             DC.B 'dos.library',0

 ALIGN
PPName:              DC.B 'PP_II.4',0


 ALIGN

 BSS
IntuitionBase:       DS.L 1
DosBase:             DS.L 1
TaskStruct:          DS.L 1
sig:                 DS.L 1

 END
