	PAGE 85
	.Z80

; XMPATCH.MAC
; enthaelt Patches fuer XMODEM.COM.

; XMPATCH.MAC dient nur zur Dokumentation. 
; Die Patches wurden mit ZSID in den File XM.COM eingebaut. 
; Es wurde ueber Stellen gepatcht, die offensichtlich nur 
; in der Version fuer ein "PMMI-Modem" benoetigt werden.

; A.Herrmann	24.03.85
;------------------------------------------------------------------

; ELZET PORTS

PIOBD	EQU 1		;PIO-B DATA PORT
PIOBC	EQU 3		;PIO-B CONTROL PORT
PIOB0	EQU 1		;FUER SIO GRUNDFREQUENZ = 19200

SIOAD	EQU 4		;SIO-A DATA
SIOAC	EQU 6		;SIO-A CONTROL
SIOBC	EQU 7		;SIO-B CONTROL (FUER INTERRUPT VEKTOR)

; XMODEM ADRESSEN UND -KONSTANTEN

XBAUD	EQU 0201H	;ADR.DER BAUDRATE
XB300	EQU 05		;300 BD WERT
XB1200	EQU 07		;1200 BD WERT
X125	EQU 0125H	;READ SIO-A READ REG.
X128	EQU 0128H	;WRITE SIO-A DATA
X12B	EQU 012BH	;READ SIO-A DATA

X1B0	EQU 01B0H	;ZIELADR. VON "UMLEITUNGEN"
X373	EQU 0373H
XD2D	EQU 0D2DH	;CALL-ADRESSE CHAR AVAILABLE
XD96	EQU 0D96H	;CALL-ADRESSE READ CHAR
XBUFF	EQU 3E0DH	;BUFFER ANFANG

; PATCH ADRESSEN UND -KONSTANTEN

INTVEC	EQU 00D0H	;INTERRUPT VECTOR LOW BYTE
INTADR	EQU 0FFD0H	;INTERRUPT ADRESSE IM BIOS

;------------------------------------------------------------------
	ASEG
	ORG 177H

	JP X1B0		;VORANGEHENDES SEGMENT UMLEITEN

; Interrupt Service: Zeichen einlesen und in Buffer schreiben
; Die Startadresse diese Routine wird bei der Initialisierung der SIO
; (Routine SIOINI, s.u.) in den Interrupt-Vektor-Bereich des BIOS 
; (ab FF00H) gepatcht.

INTSVC:	DI
	PUSH AF
	LD A,(COUNT)	;ZAEHLER INKREMENTIEREN
	INC A
	LD (COUNT),A
	PUSH HL
	LD HL,XBUFF	;POINTER BERECHNEN
	OR A
	ADD A,L
	JR NC,INTSV1
	INC H
INTSV1:	LD L,A
	IN A,(SIOAD)	;CHAR EINLESEN
	LD (HL),A	;UND ABSPEICHERN
	POP HL
	POP AF
	EI
	RETI

;--------------------------------------------------------------
	ORG 1D3H

	JP SIOINI	;CALL FUER SIO-INIT. UMLEITEN

; Test, ob Zeichen im Buffer
; Die Startadresse dieser Routine wird bei SIOINI nach 0D2DH gepatcht,
; wo sie die CALL-Adresse 0125H ersetzt.

AVAIL:	LD A,(COUNT)	;IST =0, FALLS KEIN ZEICHEN IM BUFFER,
	OR A		;SONST =1
	RET Z
	LD A,1
	RET
COUNT:	DB 0		;ZAEHLER FUER MAX. 256 ZEICHEN

; Lesen eines Zeichens aus dem Buffer
; Die Startadresse dieser Routine wird bei SIOINI nach 0D96H gepatcht,
; wo sie die CALL-Adresse 012BH ersetzt.

READ:	DI
	PUSH BC
	PUSH HL
	LD A,(COUNT)	;ZAEHLER DEKREMENTIEREN
	DEC A
	LD (COUNT),A
	LD B,0
	LD C,A		;ANZAHL RETTEN
	OR A
	LD HL,XBUFF+1
	LD A,(HL)	;ZEICHEN LESEN
	JR Z,READEX
	PUSH DE		;RESTLICHE ZEICHEN
	LD D,H		;NACH VORNE SCHIEBEN
	LD E,L
	INC HL
	LDIR
	POP DE
READEX:	POP HL
	POP BC
	EI
	RETI

;--------------------------------------------------------------
	ORG 29AH

; Von 29AH bis 5E1H scheint alles zur "PMMI-Version"
; zu gehoeren. Deshalb wurde hier hineingepatcht.

; Initialisierung der SIO:
; bei 300 Bd ohne Interrupt, bei 1200 Bd mit Interrupt

SIOINI:	PUSH BC
	PUSH HL
	LD A,(XBAUD)
	CP XB1200
	JR Z,BD1200

BD300:	LD HL,SIOWR4	;300 BAUD
	SET 7,(HL)	;x64 CLOCK
	XOR A
	LD (SIOWR1),A	;NO INTERRUPTS
	LD HL,X125	;RESTORE ORIGINAL CALLS
	LD (XD2D),HL	;FOR SIO READ REG.
	LD HL,X12B	;AND
	LD (XD96),HL	;FOR READ SIO-A DATA
	JP SETSIO

BD1200:	LD HL,SIOWR4	;1200 BAUD
	RES 7,(HL)	;x16 CLOCK
	LD A,00011000B	;INTERRUPT ON ALL Rx CHAR
	LD (SIOWR1),A
	LD A,INTVEC	;INTERRUPT VECTOR
	LD (SIOWR2),A
	LD HL,INTSVC	;ADR.DER SERVICE ROUTINE
	LD (INTADR),HL	;ABSPEICHERN
	XOR A		;BUFFER CHAR COUNT INIT.
	LD (COUNT),A
	LD HL,AVAIL	;PATCH CALLS
	LD (XD2D),HL	;FOR SIO READ REG.
	LD HL,READ	;AND
	LD (XD96),HL	;FOR READ SIO-A DATA

SETSIO:	LD A,0FH	;PIO-B ALS OUTPUT DEF.
	OUT (PIOBC),A
	LD A,PIOB0	;PIO-B0 = 1
	OUT (PIOBD),A
	LD C,SIOAC	;SIO-A WR's LADEN
	LD B,SIOLEN
	LD HL,SIOAWR
	OTIR
	LD C,SIOBC	;SIO-B WR2 LADEN
	LD B,2
	LD HL,SIOBWR
	OTIR
	POP HL
	POP BC
	RET

SIOAWR:	DB 11011000B	;RESET CHANNEL A
	DB 4
SIOWR4:	DB 11000100B	;x64 CLOCK, 1 STOP BIT, NO PARITY
	DB 1
SIOWR1: DB 00000000B	;NO INTERRUPTS
	DB 3
SIOWR3:	DB 11000001B	;Rx 8 BIT/CHAR 
	DB 5
SIOWR5:	DB 01101000B	;Tx 8 BIT/CHAR 
SIOLEN	EQU $-SIOAWR

SIOBWR: DB 2
SIOWR2:	DB 0		;INTERRUPT VECTOR LOW BYTE

;--------------------------------------------------------------
	ORG 310H
; Hier beginnt der Patch fuer die Interpretation von VT100-
; Kontrollsequenzen. Siehe Datei VTPATCH.MAC.
;--------------------------------------------------------------
	ORG 5C5H

; Unterdrueckung von LF direkt nach CR bei Ausgabe einer Datei.
; CALL NOLF wird nach 1131H gepatcht, wo er CALL 0128H ersetzt.

NOLF:	PUSH AF
	CP 0AH
	JR NZ,NOLF1
	LD A,(CRFLAG)	;LF HINTER CR?
	OR A
	JR NZ,NOLF2
NOLF1:	CALL X128	;ZEICHEN SENDEN
	CP 0DH
	JR NZ,NOLF2
	LD A,0FFH	;NACH CR FLAG SETZEN
	JR NOLF3
NOLF2:	XOR A		;SONST FLAG LOESCHEN
NOLF3:	LD (CRFLAG),A
	POP AF
	RET
;--------------------------------------------------------------
	END
