GRWINOW ASM;*******ھ*********************ھ********
;******[[[[[[[[[[[[[[[[[[[[[[[[[[******
;******[			[******
;******[      Window Tool	[******
;******[			[******
;******[    `arsten Wegener     [******
;******[			[******
;******[ 	Stand 19.02.91	[******
;******[[[[[[[[[[[[[[[[[[[[[[[[[[******
;******[  produced by GallWare  [******
;******[[[[[[[[[[[[[[[[[[[[[[[[[[******
;**************************************
;**************************************
 
	ORG	0
 
SUB	EQU	0F003H
Buffer	EQU	0B700H
Ground	EQU 	0FFFFH
HEAP	   DEFW Ground
UsrTabAdr  DEFW
HeapTabAdr DEFW
Offset	   DEI;ppک€€ٍOدد™ک€pp‡€پˆٍOدد™ک€pp‍ˆژˆrOدد™ک€ppک‰‍	„ٍOدد™ک€ppٍ‡د‘ژ	ˆًpٍ‡دگ€ppٍ‡د€ˆ‰‚پˆppٍ‡د„„ˆppٍ‡د„ˆژƒ€‰€ppٍ‡د„ˆ€ˆژƒ€‰€ppدًpٍکگOب„€	€	دŒ‚Oکپ€ˆHppٍکگOبO‚دئBBFOبppہ‰€€ˆ	ˆ€ppدًpٍکOہااا“ًpدًpہژ	ˆدˆˆOگ€O€€دگette
;Eingangsparameter
;  AF :=Adr.d.Dateinamen
;  HL :=Obere Datenadr. f}r Men}s
;  DE :=Untere Sperradr. f}r Men}daten
;  BC :=Adr. f}r eine Pointertabbelle
;	2 Byte je Men},die bei MenuA
;	verwendet werden
;R}ckgabewerte
;  HL :=Untere Adr. des Datenfeldes
;  A  :=Fehlernr.
;  CY --> Fehler
;  BC :=Tabbellenende
;  DE :=Tabbellenl{nge
 
Laden	CALL Lade ;Kassette->Speicher
	RET  C		;Abbruch BRK
 
	PUSH BC	;Adr.f.PtrTab
 
	LD   D,B
	LD   E,C
 
	LD   HL,(Anfang);Anf.der Daten
	INC  HL		;von der Kass.
 
Julia	LD   C,(HL)	;Gr.des letzten
	INC  HL		;Men}s
	LD   B,(HL)
 
	EX   DE,HL
	DEC  DE
	DEC  DE
	LD   (HL),E	;Eintrag in Tab
	INC  HL
	LD   (HL),D
	INC  HL
	INC  DE
	INC  DE
	EX   DE,HL
 
	ADD  HL,BC	;vorhergehendes
	PUSH HL		;Men}
 
	DEC  HL		;Schon alle Men}
	LD   C,L	;erfa~t ?
	LD   B,H
	LD   HL,(EndAdr)
	OR   A
	SBC  HL,BC
	POP  HL
 
	JR   NC,Julia
 
;Vertauschen aller Eintr{ge in der Tab.
 
	LD   H,D
	LD   L,E
	POP  DE		;Tabellenanf.
	PUSH HL		;TabEnde+1
	LD   B,H
	LD   C,L
	OR   A
	SBC  HL,DE
	PUSH HL		;TabL{nge
	LD   A,L
	SRL  A		;/2
	SRL  A
	LD   H,B	;HL:=TabEnde+1
	LD   L,C
	LD   B,A	;Zahl der Ver-
			;tauschungen
;Vertauschen zweier Worte
MARK	DEC  HL
	LD   A,M
	EX   AF
	INC  DE
	LD   A,(DE)
	LD   M,A
	EX   AF
	LD   (DE),A
 
	DEC  HL
	DEC  DE
	LD   A,M
	EX   AF
	LD   A,(DE)
	LD   M,A
	EX   AF
	LD   (DE),A
 
	INC  DE
	INC  DE
 
	DJNZ MARK
;Vertauschen beendet
	POP  DE
	POP  BC
	LD   HL,(Anfang)
	DEC  HL
	XOR  A
	RET
 
 
Lade	PUSH BC	;Retten der Register
	PUSH DE
	PUSH HL
	PUSH AF
 
	LD   HL,Buffer
	LD   (IX+05H),L
	LD   (IX+06H),H
	CALL SUB	;Warte auf
	DEFB 0AH	;ersten Block
	XOR  A
 
WaitForNextFileName
	LD   A,001H
	CALL BlockLesen
	POP  HL	;--> Dateiname
	JP   C,Break
	PUSH HL
	LD   DE,Buffer
	LD   BC,00B01H;B=Vergleichsl{nge
 
NextChar
	LD   A,(DE)
	OR   A		;Dummy-Test
	JR   NZ,NoSpace
	LD   A,020H
NoSpace	CP   (HL)
	JR   Z,NextCharAdr
	ADD  (HL)	;Dummy=Space
	CP   020H
	JR   Z,NextCharAdr
	SUB  (HL)
	INC  C	;falscher Buchstabe
NextCharAdr
	INC  DE
	INC  HL
 
	CALL 0F003H
	DEFB 024H	;OCHR
	DJNZ NextChar
 
	CALL 0F003H
	DEFB 02CH	;CR/LF
 
	DEC  C		;C=1 wenn ohne
			;Fehler !
	JR   NZ,WaitForNextFileName
 
	LD   A,(0B710H)	;ARGN
	CP   02
	JR   NZ,WaitForNextFileName
 
	POP  HL;--> Dateiname
	LD   HL,(0B713H)
	LD   DE,(0B711H)
	OR   A
	SBC  HL,DE
	LD   B,H
	LD   C,L ;BC:=Dateigr|~e
 
	POP  HL
	POP  DE
	PUSH DE
	PUSH HL
 
	OR   A
	SBC  HL,DE;Platz f}r HEAP
 
	OR   A
	SBC  HL,BC;Test HEAP>DATEI
	JR   C,NoMemory
 
	POP  HL
	PUSH HL
 
	LD   (EndAdr),HL
	SBC  HL,BC;Adr.f.Dateianfang
	INC  HL
	LD   (Anfang),HL
 
	LD   D,H
	LD   E,L
	LD   A,01
 
NextBlock
	CALL OutBlNr
 
	LD   A,(IX+2)
	INC  A
	JR   Z,EOF
 
	PUSH DE
	CALL BlockLesen
	POP  DE
	JR   C,Break
 
	LD   BC,80H
	LD   HL,(EndAdr)
	OR   A
	SBC  HL,DE
	SBC  HL,BC
	JR   C,LetzterBlock
	LD   HL,Buffer
	LDIR
 
	JR   NextBlock
 
LetzterBlock
	ADD  HL,BC	;Negat.d.SBC
	LD   C,L
	LD   HL,Buffer
	LDIR
 
EOF	CALL SUB
	DEFB 0BH
	XOR  A		;alles O.K.
	JR   POP3+1
 
Break	CALL SUB
	DEFB 0BH	;CLOSE
	LD   A,3	;Fehlernr.
POP3	SCF
	POP  HL
	POP  DE
	POP  BC
	RET
NoMemory
	CALL SUB
	DEFB 0BH	;CLOSE
	LD   A,2	;zu wenig Spei.
	JR   POP3
 
OutBlNr
	PUSH AF
	LD A,25
	CALL SUB
	DEFB 24H	;OCHR
	POP AF
 
	CALL 0F003H
	DEFB 01CH	;AHEX
 
	LD A,'>'
	CALL 0F003H
	DEFB 024H
	RET
BlockLesen
	LD   H,A
	JR   Z,SchonGelesen
NochmalLesen
	CALL 0F003H;BRK-Test
	DEFB 02AH
	RET  C
	CALL 0F003H;MBI
	DEFB 005H
SchonGelesen
	LD   A,(IX+02H)
	JR   NC,ReadingOK
BadBlock
	CALL 0F003H
	DEFB 01CH	;AHEX
	CALL 0F003H
	DEFB 023H
	DEFM '*'
	DEFB 8
	defb 8
	defb 8
	DEFB 000H
	LD   A,H
	DEC  A
	JR   NZ,NochmalLesen
	CALL 0F003H;CR/LF
	DEFB 02CH
	JR   NochmalLesen
ReadingOK
	CP   H
	RET  Z
	CP   0FFH
	JR   NZ,BadBlock
	LD   L,H
	DEC  L
	JR   Z,BadBlock
	RET
 
;___________________End_of_Load_________
 
;Verwaltung der SystemEPROMs
;Achtung:Es wird bis FFFF RAM angenommen
 
SYSon	PUSH AF
	IN   A,(88H)
	OR   1
	OUT  (88H),A
	POP  AF
	RET
 
SYSoff	PUSH AF
	IN   A,(88H)
	AND  0FEH
	OUT  (88H),A
	POP  AF
	RET
;_________________
 
Verdichte	;Verdichten eines Spei-
	SET 7,H
	LD   A,M;cherbereiches der L{nge
	DEC  A	;von B Byte und der An-
	LD   C,A;fangsadr. HL. DE zeigt
 		;wo das Ergebnis abge-
		;legt werden soll (DE
		;wird decrementiert !).
Compress
	LD   A,(HL)
	CP   C	;? (HL-1)=(HL)
 
	LD   (DE),A
	LD   C,A;f}r n{chsten Zyklus
 
	INC  HL
	DEC  DE
 
	JR   Z,Susi;(HL-1)=(HL)
 
	DJNZ Compress
	RET
 
Susi	PUSH DE
	LD   DE,0;Z{hler f.Wiederholung
		;des Byte A
	LD   C,B;BC:=B
	LD   B,0
 
Weiter	CPI
	INC  DE
 
	JR   NZ,Michaela
 
	JP   PE,Weiter	;BC>0,A=(HL)
 
	INC  DE
	INC  HL
Michaela
	DEC  HL
	DEC  DE
 
	LD   B,C;B:=BC
 
	LD   C,E;Z{hlerstand
	POP  DE	;HEAP-Adr.
	LD   A,C;Wiederholungszahl
	LD   (DE),A;sichern
	DEC  DE
 
	XOR  A	;B=0 ?	--> RET
	CP   B
	JR   NZ,Verdichte
;Achtung:Es wird bis FFFF RAM angenommen
 
SYSon	PUSH AF
	IN   A,(88H)
	OR   1
	OUT  (88H),A
	POP  AF
	RET
 
SYSoff	PUSH AF
	IN   A,(88H)
	AND  0FEH
	OUT  (88H),A
	POP  AF
	RET
;_________________
 
Verdichte	;Verdichten eines Spei-
	SET 7,H
	LD   A,M;cherbereiches der L{nge
	DEC  A	;von B Byte und der An-
	LD   C,A;fangsadr. HL. DE zeigt
 		;wo das Ergebnis abge-
		;legt werden soll (DE
		;wird decrementiert !).
Compress
	LD   A,(HL)
	CP   C	;? (HL-1)=(HL)
 
	LD   (DE),A
	LD   C,A;f}r n{chsten Zyklus
 
	INC  HL
	DEC  DE
 
	JR   Z,Susi;(HL-1)=(HL)
 
	DJNZ Compress
	RET
 
Susi	PUSH DE
	LD   DE,0;Z{hler f.Wiederholung
		;des Byte A
	LD   C,B;BC:=B
	LD   B,0
 
Weiter	CPI
	INC  DE
 
	JR   NZ,Michaela
 
	JP   PE,Weiter	;BC>0,A=(HL)
 
	INC  DE
	INC  HL
Michaela
	DEC  HL
	DEC  DE
 
	LD   B,C;B:=BC
 
	LD   C,E;Z{hlerstand
	POP  DE	;HEAP-Adr.
	LD   A,C;Wiederholungszahl
	LD   (DE),A;sichern
	DEC  DE
 
	XOR  A	;B=0 ?	--> RET
	CP   B
	JR   NZ,Verdichte
;Achtung:Es wird bis FFFF RAM angenommen
 
SYSon	PUSH AF
	IN   A,(88H)
	OR   1
	OUT  (88H),A
	POP  AF
	RET
 
SYSoff	PUSH AF
	IN   A,(88H)
	AND  0FEH
	OUT  (88H),A
	POP  AF
	RET
;_________________
 
Verdichte	;Verdichten eines Spei-
	SET 7,H
	LD   A,M;cherbereiches der L{nge
	DEC  A	;von B Byte und der An-
	LD   C,A;fangsadr. HL. DE zeigt
 		;wo das Ergebnis abge-
		;legt werden soll (DE
		;wird decrementiert !).
Compress
	LD   A,(HL)
	CP   C	;? (HL-1)=(HL)
 
	LD   (DE),A
	LD   C,A;f}r n{chsten Zyklus
 
	INC  HL
	DEC  DE
 
	JR   Z,Susi;(HL-1)=(HL)
 
	DJNZ Compress
	RET
 
Susi	PUSH DE
	LD   DE,0;Z{hler f.Wiederholung
		;des Byte A
	LD   C,B;BC:=B
	LD   B,0
 
Weiter	CPI
	INC  DE
 
	JR   NZ,Michaela
 
	JP   PE,Weiter	;BC>0,A=(HL)
 
	INC  DE
	INC  HL
Michaela
	DEC  HL
	DEC  DE
 
	LD   B,C;B:=BC
 
	LD   C,E;Z{hlerstand
	POP  DE	;HEAP-Adr.
	LD   A,C;Wiederholungszahl
	LD   (DE),A;sichern
	DEC  DE
 
	XOR  A	;B=0 ?	--> RET
	CP   B
	JR   NZ,Verdichte