3001 7708 0000 Q ... BIOS12V16
[035a6c5ffee24b723fadca3b502f5e64]
PN	BIOS-Disk     
;****************************************
;CPM-BIOS fuer Z1013 nach "Kramer+Brosig"
;            
;VERS. 1.16 "ROM-Version 64 ZEICHEN"
;
;  CBIOS FUER DC-MONITOR-Zimmermann
;                       
;****************************************
;
;
;       DEFINITION VON KONSTANTEN
;
;
;
AKTLW:	EQU	4
SOIL:	EQU	00016H	;START OF INPUT LINE
CURSR:	EQU	0002BH
BWSA:	EQU	0EC00H	;BILDW.-SP.-ANF.
BWSE:	EQU	0EFFFH	;ENDE
MON:	EQU	0F000H	;MONITOR-RET
BOS:	EQU	0D006H
BEEP:	EQU	0FFDCH
DRAKK:	EQU	0FFE8H
CZSP:	EQU	1FH	;CURSOR-ZWISCHEN-SP.
SPALT:	EQU	64	;BS-SPALTENZAHL
ZL:	EQU	SPALT	;ZEILENLAENGE
BSTAB:	EQU	47H
;
;
CFDC:	EQU	7CH	;STEURRUNG FDC
DFDC:	EQU	7DH	;DATEN FDC
TC:	EQU	78H	;TERMINAL COUNT
;                       ; (ENDE-IMPULS)
NDISK:	EQU	2	;ANZAHL LAUFWERKE
;                       ; 1 IM RAM SIMUL.
LF:	EQU	0AH
ROM:	EQU 	0DE00H
BDOS:	EQU	0D006H
CCP:	EQU	0C800H
RDSK:	EQU     7000H	;IM RAM SIMU-
;                       LIERTE FLOPPY
;****************************************
;
	ORG	0DE00H
;
BIOS:	JMP	BOOT
WBOTE:	JMP	WBOOT
	JMP	CONST    ;TASTSTAT.
;                       ; MCSTS   
	JMP	CONIN   ;TASTABFRAGE
;                       ;CIO
	JMP	COOUT   ;ZEICHENAUSGABE
;                       ;MCO
	JMP	LIST    ;DRUCK
	JMP	PUNCH   ;MWO
	JMP	READR   ;MRI
	JMP	HOME
	JMP	SDISK
	JMP	STRCK
	JMP	SSEC
	JMP	SDMA
	JMP	READ
	JMP	WRITE
	JMP	LSTS	;LISTER STATUS
	JMP 	STRAN	;SECTOR TRANSFOR-
;                       ;MATION
;	  
;****************************************	   
;    
;KOPF AUF SPUR NULL EINSTELLEN
;
;****************************************
;
HOME:	LD	BC,0
	JR	STRCK-#
;
;LAUFWERK AUSWAEHLEN
;IN: C LAUFWERK (A ODER B)
;OUT: HL DPH- VEKTOR
;
SDISK:	LD	HL,0	;FEHLER
	PUSH	BC
	LD	B,0
	LD	A,C
	CMP	NDISK  
DISKS:	EQU	#-1
	JRNC	FEHL-#	;FEHLER-AUSGABE
	LD	L,C
	LD	H,B
	ADD	HL,HL
	ADD	HL,HL
	ADD	HL,HL
	ADD	HL,HL	;*16
	LD	DE,DPBAS;DPH-VEKTOR 1.LW
	ADD	HL,DE
	LD	(AKTLW),A;  (04)	 
NVORH:	POP	BC
	RET
FEHL:	CALL	RESTR
	JR	NVORH-#
;
STRAN:	EQU	#	;SECTOR TRANSFOR.
;
;IN:BC LOG. SECTOR
;   DE TABELLE
;
	LD	B,0
	LD 	A,D	;DE=0 KEINE TRANS-
;                       ;FORMATION
	OR	A
	JRNZ	STRN1-#
	LD	H,B
	LD	L,C
	INC	HL	
	RET
STRN1:	EX	DE,HL
	ADD	HL,BC
	LD	A,(HL)	;NEUE NR.
	LD	(SEC1),A
	LD	L,A
	RET
;
;SECTOR EINSTELLEN
;IN: C SECTOR
;OUT: (SEC1)=C
;
SSEC:	EQU	#
	LD	HL,SEC1
 	LD	M,C
	RET
;
;SPUR ANWAEHLEN
;IN: C SPUR
;OUT (TRACK)=C
;
STRCK:	EQU	#
	LD	HL,TRACK
	LD	M,C
	RET
;
; DMA SETZEN
;IN: BC DMA
;
SDMA:	LD	(DMA),BC
	RET
;
;
;
MT1:	DB	0CH,0DH,0AH,0AH
	DB	' CP/M 2.2 Z1013-ZI./DC '       
	DB	0DH,0AH
	DB	' mit 1.2 Disk.-Laufwerk '
	DB	0DH,0AH
	DB	' CCP wird von Disk geladen '
        DB      0DH,0AH,0AH
	DB	' Ramdisk ? (Y/N) : ',0 
MT2:	DB	0DH,0AH,0AH
	DB	' weiter mit CP/M ? (Enter) '     
    	DB	0DH,0AH
	DB	' (N) Nein '                     
	DB	0DH,0AH
	DB	' (n) Neustart ? : ',0 ',0
MT3:	DB	0DH,0AH,0AH
	DB	' Error '         
	DB	0DH,0AH,0AH,0
MT4:	DB	0DH,0AH,0AH
	DB	' Ramdisk loeschen ? (Y/N) : ',0
;
;
;****************************************
;CCP UND BDOS VON DER ERSTEN SPUR DER
;            DISKETTE LADEN 
;****************************************
;
;
BOOT:	LD	HL,AN1	;COPY SCHREIBEN
	LD	DE,0E800H
	LD	BC,80 	;UND LESEN !!
	LDIR
	LD	HL,AN2	;COPY ARBEITS-
	LD	DE,0E900H
	LD	BC,250H	;ZELLEN
	LDIR
     	CALL    INIT
	LD	A,0C3H
	LD	(0),A
	LD	HL,WBOTE
	LD	(1),HL
	LD	(5),A
	LD	HL,BDOS
	LD	(6),HL
	LD	(38H),A	;HALTEPKT.
;			;VORBEREITEN
	LD	HL,RESTR
	LD	(39H),HL
	LD	DE,MT1
	CALL	OUT$
BO1:	CALL	CONIN
	CMP	'Y'
	JRZ	IRDSA-#
	CMP	'N'
	JRZ	BO3-#
	JRNZ	BO1-#
BO3:	XOR	A
	LD	(3),A	;IO BYTE
	LD	(4),A
	JR	WBOO1-#
;
;
WBOOT:  EQU	#	;LESEN DER SYSTEM-
;                       ;SEKTOREN
	LD	DE,MT2
	CALL	OUT$
WBO1:	CALL	CONIN
	CMP	0DH 
	JPZ	GOCPM   
	CMP	'N'
	JPZ	MON   
	CMP	'n'     ;NEUSTART
	JRZ	BOOT-#
	JRNZ	WBO1-#
WBOO1:	LD	SP,80H
	CALL	INIFD	;INIT. FLOPPY CON-
;			;TROLLER
	LD	C,0	;LAUFWERK
	CALL	SDISK
	LD	B,2CH	;SEKTORZAEHLER
	LD	C,0	;SPUR-NR.
	CALL	STRCK
	LD	D,1	;SEKTOR 
	LD	HL,CCP	;LADEZIEL
LOAD1:	PUSH	BC	;NAECHSTEN SEKT.
	PUSH	DE
	PUSH	HL
	LD	C,D
	CALL	SSEC	;NEUEN SEKTOR-
;                       ;ANWAEHLEN
	POP	BC	;BC LADEADRESSE
	PUSH	BC	;LADEADR.RETTEN
	CALL	SDMA
	CALL	RFLOP	;SYSTEM RAUF-
;                       ;SCHREIBEN:WFLOP
;			;EINSETZEN
	CMP	0	;FEHLER ?
	CANZ	RESTR	;JA
	POP	HL
	LD	DE,128
	ADD	HL,DE	;LADEADR. ER-
;			;HOEHEN
	POP	DE
	POP     BC
	DEC	B	;SEKTORZAHL-1
	JRZ	GOCPM-#
	INC	D	;NAECHSTEN SEK-
;			;TOR
	LD	A,D
	CMP	21H	;LETZTER ?
	JRC	LOAD1-#
	LD	D,1	;1.SEKTOR NAECHST
;			;SPUR
	INC	C
	PUSH    BC
	PUSH	DE
	PUSH    HL
	CALL	STRCK
	POP	HL
	POP	DE
	POP	BC
	JR	LOAD1-#
IRDSA:	CALL	RFDEL	;RAMDISK LOESCHEN
      	CALL	IRDSK
	JMP	BO3	
;
;****************************************
;
IRDSK:  LD	HL,0DE00H;RAMDISK
;		       	;INITIALISIEREN
	LD	DE,RDSK	;RAM_DISK
	LD	BC,51
	LDIR
	LD	HL,7003H;SPRRUNG ZUM CCP
	LD	(1),HL
	LD	A,2
	LD	(DISKS),A
	LD	HL,6206H;BDOS_SPRUNG
	LD	(6),HL
	LD	A,0C3H
	LD	M,A
	LD	HL,BDOS
	LD	(6207H),HL
	RET
;
;****************************************
;RAMDISK LOESCHEN
;****************************************
;
RFDEL:	LD      DE,MT4
        CALL	OUT$
RF1:    CALL	CONIN
	CMP     'Y'
	JRZ     RF2-#
	CMP     'N'
	RZ        
	JRNZ    RF1-#
RF2:    LD 	A,0E5H
	LD	HL,7000H
	LD	M,A     
	LD      DE,7001H
        LD	BC,57F0H
	LDIR
	RET
;
;****************************************
;
GOCPM:	LD	BC,80H
	CALL	SDMA
	LD	A,(AKTLW)
	LD	C,A
	JMP	CCP
;
;****************************************
;
WRITE:	LD	A,(4)
	OR	A
	JRZ	WFLOP-#
	CALL	WRDSK
	RET
READ:	LD	A,(4)
	OR	A
	JRZ	RFLOP-#
	CALL	RRDSK	;RAM_DISK
	RET
;
;****************************************
;
;FLOPPY LESEN MIT SEKTORAUFLOESUNG
;IN: SEC1, TRACK, DMA V. BDOS
;OUT: DMA/BDOS=1/2ZDMA/FLOPPY
;
RFLOP:	PUSH	HL
	PUSH	DE
	PUSH	BC
;
;VERGLEICH OB AUS PUFFER GELESEN WERDEN
;KANN
;
	LD	A,46H	;LETZTE OPERATION
;			;LESEN ?
	LD	HL,CTAB
	CMP	M
	JRNZ	RFLP-#
	INC	HL
	LD	DE,RESLT;GLEICHES LAUF-
;			;WERK
	LD	A,(DE)
	AND	3
	CMP	M
	JRNZ	RFLP-#
	INC	HL	;GLEICHE SPUR ?
	INC	DE
	INC	DE
	INC	DE
	LD	A,(DE)
	CMP	M
	JRNZ	RFLP-#
	INC	HL	;KOPF?
	INC	DE
	LD	A,(DE)
	CMP	M
	JRNZ	RFLP-#
	INC	HL
	LD	A,(SEC1);HOSTSECTOR=BDOS/3
	RRA
	JRC	RFLP-#	;UNGRADE
	CMP	M
	JRNZ	RFLP-#
;
;GLEICH,ALSO PUFFER LESEN,NICHT LAUFWERK
;
	LD	HL,FDMA+80H;QUELLE
	LD	DE,(DMA);   ZIEL
	LD	BC,80H  ;   ANZAHL BYTES
	LDIR		;   UEBERTRAGEN
	POP	BC
	POP	DE
	POP	HL
	XOR	A
	RET
RFLP:	CALL	TRANS	;SEKTOR LESEN
;			;+ UMRECHNEN
	PUSH	AF	;FEHLER R8272
	LD	HL,FDMA
	BIT	1,B
	JRNZ	B2-#
	LD	HL,FDMA+80H; QUELLE
B2:	LD	DE,(DMA)   ; ZIEL 	
	LD	BC,80H
	LDIR
	POP	AF
	POP	BC
	POP	DE
	POP	HL
	RET
;
;*****************************************
;
;FLOPPY SCHREIBEN MIT SEKTOR EINFUEGEN
;
WFLOP:	PUSH	HL
	PUSH	DE
	PUSH	BC
	CALL	TRANS
	OR	A	;LESEFEHLER?
	JRNZ	B4-#
	LD	DE,FDMA
	BIT	1,B
	JRNZ	B3-#
	LD	DE,FDMA+80H
B3:	LD	HL,(DMA)
	LD	BC,80H
	LDIR
	CALL	W8272
B4:	POP	BC
	POP	DE
	POP	HL
	RET
;
;*****************************************
;
;SEKTORUMRECHNUNG
;IN: BDOS-SEKTOR-NR IN SEC1
;OUT: FLOPPY-SEKTOR-NR IN SECTR 
;     B=0 WENN VORDERER TEIL SONST
;     HINTEREN AUSWERTEN
;     GELESENER FLOPPY-SECTOR IN BIOS-
;     PUFFER FDMA
;
TRANS:	EQU	#
	LD	B,0
	LD	A,(SEC1);BDOS-SEKTOR
	OR	A
	RRA		;UNGERADE?,/2
	JRNC	B1-#	;NEIN
	ADD	1
	CAC	RESTR	;FEHLER
	LD	B,0FFH	;KENNZEICHEN
B1:	PUSH	BC
	LD	(SECTR),A
	CALL	R8272
	POP	BC	;FLAG F,UNGERADE
	RET
;
;*****************************************
;TREIBER MIT U 8272
;*****************************************
;
INIFD:	LD	B,0	;INIT.8272
	DJNZ	INIFD+2-#
	IN	CFDC
	CMP	80H
	JRZ	SPEZI-#
	IN	DFDC
	JR	INIFD-#
SPEZI:	LD	HL,STAB-1;PARAMETER LADEN
	LD      BC,0303H;SPEZIFY-COMM
;			; 3BYTES
	CALL	WCOM1	;SCHREIBEN COMM
RECAL:	LD	BC,0207H;SPUR 0 EINSTELLEN
	CALL	RDY	;DRIVE REAY ?
;
;*****************************************
;
SENSE:	LD	BC,0108H;PRUEFE INTERRUPT
;			;STATUS
	CALL	WCOM
	CALL	RBYTE	;RESULT REG 0:IC1,
;			;IC2,SE,EC,NR,HD,
;			;US1,US2
	LD	B,A
	CMP	80H
	CANZ	RBYTE	;PCN HOLEN
	BIT	5,B
	JRZ	SENSE-#
	RET
STAB:	DB	1FH	;XXXX=SRT,XXXX=HUT
	DB	33H	;XXXXXXX=HLT,X=ND
;
;*****************************************
;
AN1:	EQU	#
	BER	80 
;
;*****************************************
;
	ORG	0E800H
;
;*****************************************
;
;SEKTOR SCHREIBEN/LESEN IN BETRIEBSART
;OHNE DMA-SCHALTKREIS
;SEKTOR IN (SECTR)
;SPUR IN (TRACK)
;AKTLW IN (UNIT)
;ZIEL-/QUELLADRESSE=FDMA
;KILL:A B DE HL
;
W8272:	DB	11H	;CODE LD DE,... 
	OUTI		;WRITE DATA
	LD	A,45H	;SCHREIBKOMMANDO
	JR	RWIT-#
;
;*****************************************
;
R8272:	DB	11H	;CODE LD DE,...
	INI
	LD	A,46H	;LESEKOMMANDO
RWIT:	LD	(CTAB),A
	LD	(MODE),DE;EINTRAGEN INI/
;			;OUTI-OP-CODE
	CALL	SEEK
RWLOP:	LD	B,10	;ANZAHL VERSUCHE
RWOP:	PUSH	BC
	DI
	LD	B,9	;9 COMMANDOBYTES
	LD	A,(CTAB)
	LD	C,A
	CALL	RDY	;AUSGABE KOMMANDO
	LD	HL,FDMA
	LD	C,DFDC
	CALL	RW
	OUT	TC	;ENDE-IMPULS
	CALL	RRSLT
	POP	BC
	RZ		;STO=0=KEINE
;			;FEHLER
	DJNZ	RWOP-#
ERR:	LD	A,1
	RET		;ERROR
;
;*****************************************
;
;SCHREIBEN ODER LESEN 256 BYTES
;IN: HL QUELLE ODER ZIEL
;C: DATENPORT
;
RW:	EQU	#
	LD	B,0	;256 BYTES
RW1:	IN	CFDC
	RLCA		;RQM-TEST
	JRNC	RW1-#
	RLCA		;DIO
	RLCA		;NON-DMA
	RNC		;FERTIG ?
MODE:	INI		;INI BEI READ DATA
;			;SONST OUTI
	JRNZ	RW1-#
	RET
;
;*****************************************
;
;*****************************************
;
;
	ORG	AN1+80 
;
;
;
SDS:	LD	BC,0204H;PRUEFE LAUFWERK
;			;STATUS
	CALL	WCOM	
	CALL	RBYTE	;STATUS REG3:
;			;FAULT,WP,RDY,TO
;		 	;TO,TS,HD,US1,U
	RET
;
;*****************************************
;
SEEK:	LD	BC,030FH;COMM SPUR EINSTEL-
;			;LEN
	CALL	RDY
	CALL	SENSE
SKBSY:	IN	CFDC
	AND	0FH
	JRNZ	SKBSY-#
	RET
;
;*****************************************
;
RDY:	PUSH	BC	;LAUFWERK BETRIEBS-
;			;FAEHIG ?
	CALL	SDS
	POP	BC
	BIT	5,A	;READY-BIT IN STA-
;			;TUSREG.3
        CALL	DELAY   ;VERZOEGRUNG
	CAZ	RESTR	;FEHLER
;
;*****************************************
;
WCOM:	LD      HL,CTAB	;COMM IN
;			;FDC SCHREIBEN
;
;IN: B ANZAHL D. BYTES, C COMM
;
WCOM1:	CALL	DELAY
	IN	CFDC
	AND	0C0H
	CMP	80H	;RQM,DIO=OUT    
	JRNZ	WCOM1-#
	LD	A,C
	OUT	DFDC
	INC	HL
	LD	C,M
	DJNZ	WCOM1-#
	RET
;
;*****************************************
;
DELAY:	PUSH	BC	;VERZOEGERUNG F.
;			;STATUSFLAG 8272
	LD	B,11H   ;SONST 0FH
DEL1:	DJNZ	DEL1-#
	POP	BC
	RET
;
;*****************************************
;
RBYTE:	CALL	DELAY	;1 BYTE LESEN
	CALL	IRDY
	IN	DFDC
	RET
;
;*****************************************
;
RRSLT:	LD	B,6	;LESE 7 RESULT
;		        ;BYTES
	CALL	RBYTE
	LD	HL,RESLT
	LD	M,A
	AND	0C0H	;ERROR ?
	LD	C,A
RESL1:	CALL	RBYTE
	INC	HL
	LD	M,A
	DJNZ	RESL1-#
	LD	A,C	;FEHLERMELDUNG
;			;STATUS REG 0
	OR	A
	RET
;
;*****************************************
;
IRDY:	IN	CFDC	;BEREIT F.DATEN-
;			;EINGABE ?
	RLCA
	JRNC	IRDY-#
	AND	80H
	RLCA
	RC
;
;*****************************************
;
;FEHLERBEHANDLUNG
;
ERM:	DB	0FFH	;SPRUNG IN MONITOR
;
RESTR:	EQU	#
	LD	DE,MT3
	CALL	OUT$
	CALL	BEEP
	CALL	CONIN
	CMP	03H
	JPZ	WBOOT
	JMP	GOCPM
;
;*****************************************
;
;RAM-DISK
;SCHREIBEN
;*********
WRDSK:	CALL	RADR	;SEKTORADR BERECH-
;			;NEN
	JRC	BDERR-# ;BEREICH UEBER-
;			;SCHRITTEN
	EX	DE,HL	;ZIEL-/QUELLADR.
;			;RAM-DISK
	LD	HL,(DMA);ZIEL-/QUELLADR.
;			;BDOS
RDSK1:	LD	BC,80H	;=1 SEKTOR
	LDIR
	XOR	A
	RET
;
;LESEN
;*****
RRDSK:	CALL	RADR
	JRC	BDERR-#	;FEHLER
	LD	DE,(DMA)
	JR	RDSK1-#
BDERR:	LD	A,1	;BDOS-ERROR
	RET
;
;
;SEKTORADR. IM RAM BERECHNEN DE AKT. SPUR
;C AKT. SEKTOR  B MAX. SEKTORANZAHL/DISK
;
;
RADR:	LD	D,0
	LD	A,(TRACK)
	LD	E,A
	LD	A,(SEC1)
	LD	C,A
	LD	HL,0
	LD	B,26
RADR1:	ADD	HL,DE	;UMWANDLUNG SPUREN
;			;IN SEKTOREN
	DJNZ	RADR1-#
	ADD	HL,BC	;AKT.SEKT.DAZU
	ADD	HL,HL	;WANDLUNG SEKTOR
;			;IN BYTES
	ADD	HL,HL
	ADD	HL,HL
	ADD	HL,HL
	ADD	HL,HL
	ADD	HL,HL
	ADD	HL,HL
	LD	BC,RDSK	;RAM-DISK-
;			;ANFANG
	ADD	HL,BC
	LD	A,0BFH	;HIGH-ADR RAM-
;			;DISK
	CMP	H
	RET
;
;*****************************************
;
INIT:	LD	A,0C3H
	LD	(0),A
	LD	(5),A
	LD	(0C7FDH),A
	LD	HL,WBOTE
	LD	(1),HL
	LD	HL,0C7FDH
CHTP:	LD	(6),HL
	LD	HL,BOS
	LD	(0C7FEH),HL	
	LD	A,(AKTLW)
	LD	(TAPUF),A
	LD	A,0
	LD	(AKTLW),A
	RET
;
;*****************************************
;*****************************************
;*****************************************
;
OUT$:	LD	A,(DE)
	OR	A
	RZ	
	LD	C,A
	CALL	COOUT
	INC	DE
	JR	OUT$-#
;
;*****************************************
;
;ZEICHEN VON TASTATUR <A>
;*****************************************
;
CONIN:	CALL	CHIT
	RST	20H
	DB	1	;ZEICHENEINGABE
	PUSH	AF
	CALL	CHTI
	POP	AF
	RET
;
;*****************************************
;ZEICHEN AUF BILDSCHIRM <C>
;*****************************************
;
COOUT:	PUSH	AF
	PUSH	HL
	PUSH	BC
	PUSH	DE
	CALL	ZAG
	POP	DE
	POP	BC
	POP	HL
	POP	AF
	RET
;
ZAG:	LD	A,(MLZBS)	;MERKE LETZTES
;                                   ZEICHEN
	CMP	1BH
	JPZ	ANKXY
	LD	A,1BH
	CMP	C
	JPZ	MESC
	LD	A,C
	OR	A
	RZ
	LD	HL,KTAB
	LD	BC,LKTAB
	CPIR
	JRNZ	ZAG1-#
	DEC	HL
	LD	BC,KTAB
	SBC	HL,BC
	SLA	L
	LD	BC,FTAB
	ADD	HL,BC
	LD	C,M
	INC	HL
	LD	H,M
	LD	L,C
	JMP	M

KTAB:	DB	8	;BACKSTEP
	DB	9	;CURSOR RECHTS
	DB	0CH	;CLS
	DB	16H	;LOESCHEN
;                         ZEILENREST
	DB	18H	;LOESCHEN
;                         ZEILE,CURSOR ANF.Z.
	DB	1AH	;CURSOR NACH OBEN
	DB	14H	;LOESCHEN
;                        BILDSCHIRMREST
	DB	82H	;KURSOR EIN
	DB	83H	;KURSOR AUS
	DB	0DH	;CR
	DB	0AH	;LF
	DB	1	;CURSOR LINKS OBEN
	DB	7	;BEEP
	DB	15H	;CURSOR RECHTS
	DB	84H	;ZEICHEN NORMAL
	DB	85H	;ZEICHEN INVERS
	DB	86H	;ZEICHEN INTENSIV
	DB	87H	;ZEICHEN
;                        INTENSIV INVERS
LKTAB:	EQU	#-KTAB
FTAB:	DA	BSTP
	DA	CURR
	DA	CLS
	DA	DELLN
	DA	INSLN
	DA	ZRET
	DA	CLCU
	DA	CZSET
	DA	PUABL
	DA	CR
	DA	OUTLF
	DA	CHOME
	DA	BEEPA
	DA	CURR
	DA	NORM
	DA	INV
	DA	ND
	DA	ND	
;AUSGABE ZEICHEN <> STEUERZEICHEN
ZAG1:	AND	7FH
	LD	HL,(CURSR)
	PUSH	AF
	LD	A,(MINV)
	LD	B,A
	POP	AF
	OR	B	;INVERS, WENN 80H
	LD	M,A
	INC	HL
	EX	DE,HL
	LD	HL,BWSE+1
	XOR	A
	SBC	HL,DE
	EX	DE,HL
	JRNZ	ZAG2-#
ZAG3:	LD	DE,BWSA
	LD	HL,BWSA+SPALT
	LD	BC,BWSE-BWSA+1-SPALT
	LDIR
	PUSH	DE
	POP	HL
	PUSH	HL
	INC	DE
	LD	M,' '
	LD	BC,SPALT-1
	LDIR
	LD	HL,(SOIL)
	LD	DE,SPALT
	XOR	A
	SBC	HL,DE
	LD	(SOIL),HL
	POP	HL
ZAG2:	LD	A,M
	LD	(CZSP),A
	LD	M,0FFH
	LD	(CURSR),HL
ND:	RET

;BACKSTEP
BSTP:	CALL	PUABL
	DEC	HL
	JR	ZAG2-#
;CURSOR RECHTS
CURR:	CALL	PUABL
	INC	HL
	LD	DE,BWSE
	EX	DE,HL
	OR	A
	SBC	HL,DE
	EX	DE,HL
	LD	A,' '
	JPC	ZAG1
	JR	ZAG2-#	
;BS-LOESCHEN
CLS:	LD	HL,BWSA
	LD	M,' ' 
	LD	BC,BWSE-BWSA
	LD	DE,BWSA+1
	LDIR
	LD	A,' '
	LD	(CZSP),A
	JMP	CHOME	
;
CR:	LD	HL,(CURSR)
	LD	A,SPALT-1
	CPL
	AND	L
	LD	L,A
	JMP	SETCU
;
BEEPA:	EQU	#                   
	CALL	BEEP
	RET
;
OUTLF:	LD	DE,BWSE
	LD	HL,(CURSR)
	LD	BC,SPALT
	ADD	HL,BC
	EX	DE,HL
	SBC	HL,DE	;ENDE-NEUE
	EX	DE,HL
	JPNC	SETCU
	CALL	PUABL	;PUFFER AUFBLENDEN
	CALL	ZAG3
	RET
;
CHOME:	LD	DE,BWSA
	LD	HL,(CURSR)
	OR	A
	SBC	HL,DE
	RZ
	EX	DE,HL
	JMP	SETCU
;
;LOESCHEN BS AB CURSOR
;
CLCU:	LD	BC,(CURSR)
	LD	HL,BWSE
	SBC	HL,BC	;HL:=ANZ.ZEICH
;                        .BIS BWS-ENDE
MDFAA:	LD	DE,1
	LD	A,' '
	LD	BC,(CURSR)
MDFB3:	LD	(BC),A
	INC	BC
	SBC	HL,DE
	JPNZ	MDFB3
MDFBA:	LD	HL,(CURSR)
	LD	M,0FFH	;CURSOR
	RET
;
DELLN:	LD	HL,(CURSR)
	LD	A,L
	AND	SPALT-1	;A=SPALTENPOS.
	LD	B,A
	LD	A,SPALT-1
	SUB	B
	RZ
	LD	B,A	;ANZ.BIS ENDE ZEILE	
	LD	A,' '
	LD	(CZSP),A
DELL1:	INC	HL
	LD	M,' '
	DJNZ	DELL1-#
	RET
;
INSLN:	CALL	CR
	LD	A,(CZSP)
	LD	M,A
	LD	D,H
	LD	E,L
	INC	DE
	LD	BC,SPALT-1
	LDIR
	LD	HL,(CURSR)
	LD	M,0FFH
	LD	A,' '
	LD	(CZSP),A
	RET
;
ZRET:	LD	B,SPALT
ZR1:	PUSH	BC
	CALL	BSTP
	POP	BC
	DJNZ	ZR1-#
	RET
;
CZSET:	LD	A,0FFH
CZS1:	LD	HL,(CURSR)
	LD	M,A
	RET
;
PUABL:	LD	A,(CZSP)
	JR	CZS1-#
;
;
INV:	LD	A,80H
INV1:	LD	(MINV),A
	RET
;
NORM:	XOR	A
	JR	INV1-#
;	
MESC:	LD	A,C
	LD	(MLZBS),A
	RET
;
ANKXY:	LD	A,(MSEQU)
	CMP	0FFH
	JPZ	SETXY
	LD	A,0FFH
	LD	(MSEQU),A
	LD	A,C
	AND	5FH
	LD	(MZEIP),A
	RET
;
SETXY:	LD	A,C
	CMP	3DH	;ADM3A-TERMINAL
	RZ
	CMP	59H
	RZ
	AND	7FH	
	LD	(MSPAP),A
	LD	C,A
	XOR	A
	LD	(MLZBS),A
	LD	(MSEQU),A
	LD	HL,BWSA
	LD	B,0
	ADD	HL,BC
	LD	A,(MZEIP)
	OR	A	;ZEILE 0?
	JPZ	SETCU
	LD	C,0
	LD	B,A
	LD	D,0
	LD	E,SPALT	;SPALTENZAHL
ZINC:	ADD	HL,DE
	DJNZ	ZINC-#
SETCU:	PUSH	HL
	LD	DE,BWSE
	SCF
	SBC	HL,DE
	POP	HL
	JRC	SETC1-#
	EX	DE,HL
SETC1:	LD	DE,(CURSR)
	LD	A,(CZSP)
	LD	(DE),A
	LD	A,M	;VERDECKTES ZEICHEN
	LD	(CZSP),A
	LD	M,0FFH	;NEUER CURSOR
	LD	(CURSR),HL
	RET
;
;
;
CONST:	CALL	CONS1
	OR	A
	RZ
	LD	A,0FFH
	RET
;
CONS1:	CALL	CHIT
	PUSH	HL
	PUSH	DE
	PUSH	BC
	RST	20H
	DB	12H	;ACHTUNG !!! SONST
;			;INKEY 04 EINSETZEN!!
	POP	BC
	POP	DE
	POP	HL
	PUSH	AF
	XOR	A
	LD	(TAPUF),A
	LD	A,(IOBPF)
	LD	(AKTLW),A
	POP	AF
	RET
;
;*****************************************
;
LIST:	LD	A,C
	CALL	DRAKK
	RET
;
LSTS:	LD	A,0FFH	;DRUCKER
;                                STATUS
	RET
	NOP
;
PUNCH:	RET
	NOP
	NOP
	NOP
;
READR:	RET
	NOP
	NOP
	NOP
;
;*****************************************;
;
CHIT:	LD	A,(AKTLW)
	LD	(IOBPF),A
	LD	A,(TAPUF)
CHRET:	LD	(AKTLW),A
	RET
;
CHTI:	LD	A,(AKTLW)
	LD	(TAPUF),A
	LD	A,(IOBPF)
	JR	CHRET-#
;
;*****************************************
;
	DB	7FH,7FH,'CPM',88H             
	JMP	BIOS
	DB	7FH,7FH,'CPM64',88H
	IN	4
	SET	7,A
	OUT	4
	XOR	A
	JMP	BIOS
;
;
;*****************************************
;
AN2:	EQU	#
	BER	592 
;
;*****************************************
	ORG	0E900H
;
;
MLZBS:	DB	0	;MERKE LETZTES
;                         ZEICH.-BS
MSEQU:	DB	0	;MERKE SEQUENZ
MZEIP:	DB	0	;MERKE ZEILEN-
;                        POSITION
MSPAP:	DB	0	;MERKE SPALTEN-
;                        POSITION
;*****************************************
;
DPBAS:	EQU	#
DPHA:	DA	0
	DA	0
	DA	0
	DA	0
	DA	DIRBF
	DA	DPBF
	DA	CHKO
	DA	ALLO
DPHR:	DA	0
	DA	0
	DA	0
	DA	0
	DA	DIRBF
	DA	DPBR	;GERAETEBESCHREI-
;			;BUNG
	DA	CHK1	;DIRECTORY-KONTROLLE
	DA	ALL1	;BELEGUNG DISKETTE
;
;DISK-PARAMETER-BLOCK RAM DISK
;
DPBR:	DA	26	;SEKTOREN
	DB	3	;BLOCKGROESSE 1K
	DB	7	;(SEKTOREN/BLOCK)-1
	DB	00	;NICHT BENUTZT
	DA	20	;(BLOECKE/DISK)-1
	DA	31	;32 DIREKTORY-ENTR.
	DB	080H	;1 BELEGTER BLOCK
;			;DURCH DIR
	DB	0
	DA	16	;DIR/4
	DA	0	;0 SPUREN DURCH
;			;SYSTEM BELEGT+
;
;DISK-PARAMETER-BLOCK FLOPPY 5,25 ZOLL
;
DPBF:	DA	20H	;20 LOGISCHE=10H=16
;			;PHYSISCHE SEK-
;			;TOREN/SPUR
	DB	4	;2K-BLOECKE
	DB	15
	DB	1
	DA	73
	DA	63
	DB	80H
	DB	0
	DA	16
	DA	3	;SYSTEMSPUREN
;
;*****************************************
;
;
IOBPF:	DA	0	;PUFFER I/O BYTE
TAPUF:	DA	0
MINV:	DB	0
MKOM:	DB	0
CTAB:	DB	46H
UNIT:	DB	0
TRACK:	DB	0
HEAD:	DB	0
SECTR:	DB	1
N:	DB	1
EOT:	DB	16
GPL:	DB	1BH
DTL:	DB	0FFH
RESLT:	BER	7
DZEIL:	DB	30
MERK:	DB	0
SEC1:	DB	1
DMA:	DA	80H
DIRBF:	BER	128
ALLO:	BER	31
CHKO:	BER	16
ALL1:	BER	31
CHK1:	BER	16
FDMA:	BER	256
;
;
;
	END	;