DIENSX  ASM;*************************************
;***				   ***
;***  SERVICE-CAOS-DIENSTPROGRAMM  ***
;***				   ***
;***  -f}r DEP.COM ab Version 2.0  ***
;***  -Laufwerk- und USER-Wechsel  ***
;***  -Fehlertexte aus Koppel-RAM  ***
;***  -MC und BASIC-Schnittstelle  ***
;***				   ***
;***  DIENST.ASM    ` ml 08.08.93  ***
;*************************************
;
;bei Aenderungen darauf achten, da~
;JUMP auf Adresse BE00H bleibt!
;-------------------------------------
;Schnittstellenbeschreibung:
;
;Name	Nr.	Adresse	Infos
;
;FLOAD	 0	00D8	Name ab Adr. 0
;FSAVE	 1	00DB	Name ab Adr. 0
;DIR	 2	00DE
;STAT	 3	00E1
;REN	 4	00E4	Namen eingeben
;SETRO	 5	00E7	Name eingeben
;SETWR	 6	00EA	Name eingeben
;ERA	 7	00ED	Name eingeben
;
;DRIVE	 8	00F0	LW eingeben
;USER	 9	00F3	User eingeben
;TYPTX	10	00F6	Name eingeben
;TYPTP	11	00F9	Name eingeben
;DUMP	12	00FC	Name eingeben
;----------------------------
ARGN	EQU	0B781H
ARG1	EQU	ARGN+1
ARG2	EQU	ARG1+2
NUMNX	EQU	0B796H
NUMVX	EQU	0B797H
WINON	EQU	0B79CH
WINLG	EQU	0B79EH
CURSO	EQU	0B7A0H
PV1	EQU	0F003H
CRT	EQU	00H
LF	EQU 0AH
CLS	EQU 0CH
CR	EQU 0DH
ESC	EQU	1BH
KBD	EQU	04H
WAIT	EQU	14H
LARG	EQU	15H
INLIN	EQU	17H
ERRM	EQU	19H
HLHX	EQU	1AH
HLDE	EQU	1BH
AHEX	EQU	1CH
ZSUCH	EQU	1DH
GARG	EQU	22H
OSTR	EQU	23H
OCHR	EQU	24H
BRKT	EQU	2AH
SPACE	EQU	2BH
CRLF	EQU	2CH
CSTB	EQU	42H
IRMON	EQU	0F018H
IRMOF	EQU	0F01BH
;---------------
	ORG	0BA00H
 
START:	LD	HL,BAS
	LD	DE,00D8H
	LD	BC,TOP-BAS
	LDIR		;BASIC-Treiber
	RET		;kopieren
;-------
;BASIC-Schnittstelle:
;--------------------
BAS:	LD A,0	;CALL*D8
	DB 1
	LD A,1	;CALL*DB
	DB 1
	LD A,2	;CALL*DE
	DB 1
	LD A,3	;CALL*E1
	DB 1
	LD A,4	;CALL*E4
	DB 1
	LD A,5	;CALL*E7
	DB 1
	LD A,6	;CALL*EA
	DB 1
	LD A,7	;CALL*ED
;neu:
	DB 1
	LD A,8	;CALL*F0
	DB 1
	LD A,9	;CALL*F3
	DB 1
	LD A,10	;CALL*F6
	DB 1
	LD A,11	;CALL*F9
	DB 1
	LD A,12	;CALL*FC
;
	CALL	IRMON
	CALL	JUMP
	CALL	IRMOF
	RET
;---------------
;Men}aufbau:
;
TOP:	DW	7F7FH
	DB	'DIENST'
	DB	1
	AND	A	;Argument?
	JP	NZ,DJUMP;ja
	LD	HL,0
	LD	(WINON),HL
	LD	HL,2028H
	LD	(WINLG),HL
	LD	(IX+9),0B0H
	JR	MEN
 
	DW	0B0B0H
	DB	'QUIT'
	DB	1
	POP	HL	;Stack clear
	LD	(IX+9),7FH
	RET
 
	DW	0B0B0H
	DB	'MENU'
	DB	1
	POP	HL	;Stack clear
MEN:	CALL	PV1
	DB	OSTR
	DB	CLS,LF
	DB	'>>> CAOS-Disketten-'
	DB	'Dienstprogramme <<<'
	DB	CR,LF,LF,0
	LD	HL,TOP	;Suchbeginn
	LD	BC,BOT-TOP;Suchl{nge
MEN1:	CALL	PROMPT
	CALL	PV1
	DB	BRKT	;BRK?
	JR	C,MEN8
	LD	A,(IX+9);Prolog
MEN2:	CPIR
	JP	PO,MEN8	;fertig?
	CPI
	JR	NZ,MEN2	;2mal?
MEN3:	LD	A,M
	CP	2	;Epilog?
	JR	C,MEN4
	CP	30H
	JR	C,MEN1	;< '0'
	CP	5FH
	JR	NC,MEN1	;> 'Z'
	CALL	PV1
	DB	OCHR	;Men}wort
	INC	HL	;anzeigen
	DEC	BC
	JR	MEN3
MEN4:	CALL	LFCR
	JR	MEN1	;weitersuchen
;
MEN5:	POP	HL
MEN6:	CALL	PV1
	DB	ERRM	;Error
LOOP:	CALL	PROM2	;ohne CLL
MEN8:	CALL	PV1
	DB	INLIN	;Eingabe
	INC	DE
	INC	DE
	INC	DE
	LD	A,(DE)
	CP	20H
	JR	Z,LOOP	;Leerzeichen
	AND	A
	JR	Z,LOOP	;nichts
	LD	A,(IX+9)
	LD	HL,TOP
	LD	BC,BOT-TOP
	CALL	PV1
	DB	ZSUCH	;Men}wort such.
	JR	NC,MEN6	;nicht vorhand.
	PUSH	HL
	CALL	PV1
	DB	GARG	;Argumente
	JR	C,MEN5	;Fehler
	LD	HL,LOOP	;RET-Adr
	EX	(SP),HL
	INC	HL
	PUSH	HL
	CALL	PV1
	DB	LARG
	RET		;Ansprung
;-------
;Laufwerksprompt anzeigen:
;
PROMPT:	LD	A,2
	CALL	PV1
	DB	CRT
PROM2:	LD	BC,83F1H
	IN	A,(C)
	CP	20H	;DEP ab 2.0?
	JR	C,STERN	;nein
	DEC	B
	DEC	B	;81F1H
	IN	A,(C)
	CALL	PV1
	DB	OCHR	;Laufwerk
	INC	B
	IN	A,(C)	;akt. User
	AND	0FH
	ADD	90H
	DAA		;Hex-Umrechn.
	ADC	40H
	DAA
	CALL	PV1
	DB	OCHR	;Userbereich
	JR	PEND
STERN:	CALL	PV1
	DB	OSTR
	DB	'**',0	;bei alter Vers.
PEND:	LD	A,'>'
	CALL	PV1
	DB	OCHR
	RET
;---------------
	DW	0B0B0H
	DB	'TYPTX'
	DB	1
TYPTX:	CALL	NAME
	CALL	OPEN	;read-open
	RET	C	;Fehler
TYPX1:	LD	A,1	;read
	CALL	STEUER
	RET	C	;Fehler
	DEC	C
TYPX2:	IN	A,(C)
	CP	3	;CAOS-Ende?
	JR	Z,LFCR
	LD	E,0FFH
	CALL	TYPOUT	;anzeigen
	JR	C,LFCR	;BRK
	INC	B
	JR	NZ,TYPX2;weiter
	JR	TYPX1	;neuen Block
;---------------
	DW	0B0B0H
	DB	'TYPTP'
	DB	1
TYPTP:	CALL	NAME
	CALL	OPEN	;read-open
	RET	C	;Fehler
	JR	TYPT2
TYPT1:	LD	A,1
	CALL	STEUER
	RET	C	;Fehler
TYPT2:	DEC	C
TYPT3:	IN	A,(C)
	CP	1AH	;TP-Ende?
	JR	Z,LFCR
	LD	E,7FH
	CALL	TYPOUT	;anzeigen
	JR	C,LFCR	;BRK
	INC	B
	JR	NZ,TYPT3;weiter
	JR	TYPT1	;neuen Block
LFCR:	CALL	PV1
	DB	CRLF
	RET
;---------------
	DW	0B0B0H
	DB	'DUMP'
	DB	1
DUMP:	CALL	NAME
	CALL	OPEN	;read-open
	RET	C	;Fehler
	LD	BC,90F2H
	IN	A,(C)	;ARGN
	CP	2
	JR	C,CPM	;wenn<2
	CP	10
	JR	C,CAOS	;wenn<10
CPM:	LD	HL,100H
	JR	DUM1
CAOS:	INC	B
	IN	L,(C)
	INC	B
	IN	H,(C)	;HL=Ladeadr
	LD	DE,7FH
	SBC	HL,DE	;Vorblock!
DUM1:	LD	B,80H
	JR	DUM4
DUM2:	LD	A,1	;read
	CALL	STEUER
	RET	C	;Fehler
DUM3:	DEC	C
DUM4:	CALL	DUMOUT
	RET	C	;BRK
	LD	A,B
	AND	A
	JR	NZ,DUM4
	JR	DUM2
;---------------
	DW	0B0B0H
	DB	'DRIVE'
	DB	1
DRIVE:	LD	BC,83F1H
	IN	A,(C)
	CP	20H	;DEP ab 2.0?
	JR	C,FE1	;nein
	CALL	PV1
	DB	OSTR
	DB	'Laufwerk:',0
LKBD:	CALL	PV1
	DB	KBD	;Taste abwarten
	LD	D,1
	CP	CR
	JR	Z,LANZ	;nur anzeigen
	CP	3
	JR	Z,LFCR
	LD	D,3	;LW anfordern
	BIT	5,A
	JR	Z,LW1
	SUB	20H	;klein->gro~
LW1:	CALL	PV1
	DB	OCHR
	LD	B,81H
LW2:	OUT	(C),A
LANZ:	CALL	LFCR
	LD	B,80H
	OUT	(C),D
SCHL1:	IN	A,(C)
	BIT	0,A	;R}ckmeldung?
	JR	NZ,SCHL1;nein
	RLCA		;Fehler?
	JP	C,ERROR	;ja
	RET
;---------------
	DW	0B0B0H
	DB	'USER'
	DB	1
USER:	LD	BC,83F1H
	IN	A,(C)
	CP	20H	;DEP ab 2.0?
	JR	NC,US1
FE1:	CALL	PV1
	DB	OSTR
	DB	'DEP.COM ab Version '
	DB	'2.0 erforderlich !'
	DB	7,CR,LF,0
	RET
US1:	CALL	PV1
	DB	OSTR
	DB	'User:',0
	CALL	PV1
	DB	KBD	;Eingabe
	LD	D,1
	CP	CR
	JR	Z,LANZ	;nur anzeigen
	CP	20H
	JP	C,LFCR	;Steuerzeichen
	CALL	PV1
	DB	OCHR	;anzeigen
	SUB	'0'
	CP	10
	JR	C,US2
	SUB	7
US2:	LD	B,82H
	LD	D,5	;USER anfordern
	JR	LW2
;---------------
	DW	0B0B0H
	DB	'FLOAD'
	DB	1
	CALL	NAME
FLOAD:	LD	A,9	;Lesen open
	CALL	STEUER
	RET	C	;Fehler
	LD	BC,90F2H
	IN	A,(C)	;ARGN
	LD	(NUMNX),A
	CP	2
	JR	C,FE3	;wenn<2
	CP	10
	JR	C,FLOC	;wenn<10
FE3:	CALL	PV1
	DB	OSTR
	DB	'Keine CAOS-Datei !'
	DB	7,CR,LF,0
	RET
FLOC:	INC	B
	IN	L,(C)
	INC	B
	IN	H,(C)	;HL=Ladeadr
	INC	B
	IN	E,(C)
	INC	B
	IN	D,(C)	;DE=Endadr
	CP	3
	JR	C,NST1	;keine Startadr
	PUSH	HL
	INC	B
	IN	L,(C)
	INC	B
	IN	H,(C)	;Startadr
	EX	(SP),HL
NST1:	EX	AF,AF'
	LD	A,(ARGN)
	AND	A
	JR	Z,NST3	;ohne Offset
	LD	BC,(ARG1);Offset
	ADD	HL,BC
	EX	DE,HL
	ADD	HL,BC
	EX	DE,HL
	EX	AF,AF'
	JR	C,NST2	;keine Startadr
	EX	(SP),HL
	ADD	HL,BC
	EX	(SP),HL
NST2:	EX	AF,AF'
NST3:	CALL	PV1
	DB	HLDE
	EX	AF,AF'
	JR	C,NST4	;keine Startadr
	EX	(SP),HL
	LD	(NUMVX),HL
	CALL	PV1
	DB	HLHX
	POP	HL
NST4:	CALL	LFCR
LST:	LD	A,1	;Lesen normal
	CALL	STEUER
	RET	C	;Fehler
	DEC	C
LOA:	INI		;Daten -> (HL)
	AND	A
	SBC	HL,DE
	ADD	HL,DE
	JR	Z,LOST	;Lade-Ende
	INC	B
	INC	B
	JR	NZ,LOA
	JR	LST	;neuen Block
LOST:	LD	A,(NUMNX)
	CP	3
	RET	C	;kein Start
	CALL	PV1
	DB	OSTR
	DB	'Programm starten? '
	DB	'(j/n): ',0
	CALL	PV1
	DB	KBD	;Taste?
	PUSH	AF
	CALL	PV1
	DB	OCHR	;anzeigen
	CALL	LFCR
	POP	AF
	CP	'J'
	JR	Z,ST
	CP	'j'
	RET	NZ
ST:	LD	HL,(NUMVX)
	JP	(HL)	;Start!
;-------
;read-open:
OPEN:	LD	A,9
	CALL	STEUER
	RET	C	;Fehler!
	JP	CCLS
;---------------
FSAVE:	LD	A,(ARGN)
	CP	2	;2 Argumente?
	JR	C,FE2	;nein
	JR	FSAB
;-------
	DW	0B0B0H
	DB	'FSAVE'
	DB	1
	CP	2	;2 Argumente?
	JR	NC,FSA	;ja
FE2:	CALL	PV1
	DB	OSTR
	DB	'zu wenig Argumente !'
	DB	7,CR,LF,0
	RET
FSA:	CALL	NAME
FSAB:	LD	HL,ARGN
	LD	DE,0B0BH;Schreib open
	LD	BC,91F2H
SAVE:	OUTI
	INC	B
	INC	B
	DEC	E
	JR	NZ,SAVE
	LD	A,D
	CALL	STEUER
	RET	C	;Fehler
	LD	A,0
	LD	(ARGN),A
	LD	BC,81F2H
	BIT	3,D
	JR	Z,SOPE	;wenn open
	LD	HL,(ARG1)
SOPE:	PUSH	HL
	LD	DE,(ARG2)
	AND	A
	SBC	HL,DE
	POP	HL
	LD	BC,81F2H
	LD	DE,0380H;Schreib normal
	JR	NC,SCLO
	JR	SAVE
SCLO:	LD	A,43H	;Schreib close
	JP	STEUER
;---------------
;Sprungtabelle:
TAB:	DW	FLOAD
	DW	FSAVE
	DW	DIR
	DW	STAT
	DW	REN
	DW	SETRO
	DW	SETWR
	DW	ERA
	DW	DRIVE
	DW	USER
	DW	TYPTX
	DW	TYPTP
	DW	DUMP
;---------------
DJUMP:	LD	A,L	;Nummer
	LD	DE,ARG1
	LD	HL,ARG2
	LD	BC,18
	LDIR		;Argumente
;	JR	JUMP	;verschieben
;Sprungverteiler:
JUMP:	CP	13	;Anzahl Routinen
	RET	NC	;zu gro~!
	PUSH	AF
	LD	HL,11
	CALL	NAMOUT	;Name ausgeben
	LD	HL,TAB
	POP	AF
	ADD	A
	LD	D,0
	LD	E,A
	ADD	HL,DE
	LD	A,M	;Tab. lesen
	INC	HL
	LD	H,M
	LD	L,A
	JP	(HL)	;Ansprung
;-------
STEUER:	LD	BC,80F3H
	OUT	(C),A	;Steuerbyte 1
STEU:	PUSH	BC
	LD	A,1
	CALL	PV1
	DB	WAIT
	POP	BC
	IN	A,(C)
	BIT	0,A
	JR	NZ,STEU	;fertig ?
	RLCA		;Fehler ?
	RET	NC
ERROR:	LD	BC,83F1H
	IN	A,(C)
	CP	20H	;DEP ab 2.0?
	JR	NC,ERRTX;ja
	LD	BC,81F3H
	IN	A,(C)	;Fehlernummer
	CALL	PV1
	DB	AHEX
	CALL	PV1
	DB	OSTR
	DB	'-Error',7,CR,LF,0
	SCF		;Fehler-Flag
	RET
ERRTX:	LD	B,0	;Fehlertext
ERRT1:	IN	A,(C)
	SCF		;Fehler-Flag
	RET	Z	;00=Ende
	INC	B
	CALL	PV1
	DB	OCHR
	JR	ERRT1
;---------------
	DW	0B0B0H
	DB	'DIR'
	DB	1
DIR:	LD	A,0DH	;Directory open
WDI:	CALL	STEUER
	RET	C	;Fehler
	BIT	3,A	;Ende?
	LD	A,15H
	JR	NZ,STAT1
	LD	D,3	;3 Namen
	LD	B,82H
NA3:	LD	E,9	;Name
	CALL	ANZ
	PUSH	AF
	LD	E,2	;Typ
	CALL	ANZ
	POP	AF
	BIT	7,A
	LD	A,' '	;WR
	JR	Z,WR
	LD	A,'*'	;RO
WR:	CALL	PV1
	DB	OCHR
	CALL	PV1
	DB	SPACE
	INC	B
	DEC	D
	JR	NZ,NA3
	LD	E,2
	CALL	ANZ
	LD	A,5	;Dir weiter
	JR	WDI
;---------------
	DW	0B0B0H
	DB	'STAT'
	DB	1
STAT:	LD	A,1DH	;Status+open!
STAT1:	CALL	STEUER
	RET	C	;Fehler
	LD	E,20
	LD	B,82H
ANZ:	IN	A,(C)
	PUSH	AF
	AND	7FH
	INC	B
	PUSH	DE
	PUSH	BC
	CALL	PV1
	DB	OCHR
	POP	BC
	POP	DE
	POP	AF
	DEC	E
	JR	NZ,ANZ
	RET
;---------------
	DW	0B0B0H
	DB	'REN'
	DB	1
REN:	CALL	NAME
	LD	A,29H	;Ren old
	CALL	STEUER
	RET	C	;Fehler
	CALL	NAME
	LD	A,21H	;Ren new
OUT:	JP	STEUER
;---------------
	DW	0B0B0H
	DB	'ERA'
	DB	1
ERA:	CALL	NAME
	LD	A,11H	;Era
	JR	OUT
;---------------
	DW	0B0B0H
	DB	'SETRO'
	DB	1
SETRO:	CALL	NAME
	LD	A,25H	;Setro
	JR	OUT
;---------------
	DW	0B0B0H
	DB	'SETWR'
	DB	1
SETWR:	CALL	NAME
	LD	A,31H	;Setwr
	JR	OUT
;-------
NAME:	CALL	PV1
	DB	OSTR
	DB	'Name :'
	DB	0
	CALL	PV1
	DB	INLIN
	LD	HL,17	;Ende Name
	ADD	HL,DE
NAMOUT:	LD	E,12
	LD	BC,8EF3H
NAM:	OUTD		;Name ausgeben
	DEC	E
	JR	NZ,NAM
	LD	B,80H
	RET
;-------
TYPOUT:	AND	E	;Maske!
	CP	20H
	JR	NC,ASCII;>1FH
	CP	LF
	JR	Z,ASCII
	CP	CR
	JR	Z,ASCII
	CP	9
	JR	Z,TABU
	BIT	7,E
	JR	NZ,POINT;CAOS-Datei
	ADD	A,40H
	CP	'_'
	JR	Z,ASCII	;Trennstrich
	LD	D,A
	LD	A,'^'
	CALL	ASCII
	RET	C	;BRK
	LD	A,D
	JR	ASCII
TABU:	CALL	PV1
	DB	SPACE
	LD	A,(CURSO)
	AND	7
	JR	NZ,TABU
	JR	ASCI2
POINT:	LD	A,'.'
ASCII:	CALL	PV1
	DB	OCHR
ASCI2:	LD	A,(CURSO+1)
	INC	A
	LD	HL,WINLG+1
	CP	(HL)	;Seite voll?
	JR	NZ,GO
	CALL	PV1	;warten auf
	DB	KBD	;Taste
	CP	3	;BRK?
	SCF
	RET	Z
	CALL	CCLS
GO:	AND	A	;CY=0
	RET
;-------
DUMOUT:	PUSH	BC
	CALL	PV1
	DB	HLHX	;Adresse
DUMO1:	IN	A,(C)
	CALL	PV1
	DB	AHEX
	CALL	PV1
	DB	SPACE
	INC	B
	LD	A,7
	AND	B	;8*Hexwert
	JR	NZ,DUMO1
	CALL	PV1
	DB	SPACE
	POP	BC
DUMO2:	IN	A,(C)
	CALL	PV1
	DB	CSTB
	INC	B
	INC	HL
	LD	A,7
	AND	B	;8*ASCII
	JR	NZ,DUMO2
	CALL	LFCR
	LD	DE,(WINLG)
	LD	A,(CURSO+1)
	INC	A
	CP	D	;BS voll?
	CCF
	RET	NZ
	CALL	PV1
	DB	KBD
	CP	3	;BRK?
	SCF
	RET	Z	;ja
;-------
;neue BS-Seite einstellen:
CCLS:	LD	A,CLS
	CALL	PV1
	DB	CRT
	LD	A,LF
	CALL	PV1
	DB	CRT
	AND	A	;CY=0
	RET
;-------
BOT:	DS	0C000H-$
 
	END
À@Àt(Àp6ÀnTop of
	CALL	PV1
	DB	CRT
	LD	A,LF
	CALL	PV1
	DB	CRT
	AND	A	;CY=0
	RET
;-------
BOT:	DS	0C000H-$
 
	END
À@Àt(Àp6ÀnTop of