BSAVEASM 
;********** PROGRAMM BSAVE *************
;				       *
;Abspeichern von BASIC-Programmen auf  *
;MC-Ebene mit AUTO-Start auf Diskette  *
;oder Kassette.			       *
;Es wird automatisch der Dateityp .KCB *
;vergeben, um die Files von reinen     *
;MC-Programmen unterscheiden zu k|nnen.*
;				       *
;Test, ob BASIC initialisiert wurde.   *
;				       *
;BASIC-Programmspeicher kann auf 7FFFH *
;begrenzt werden, um Programme kompa-  *
;tibel zum KC85/3 zu machen.	       *
;				       *
;			` ml 26.01.93  *
;***************************************
BUF	EQU	0B700H
ARGN	EQU	0B781H
ARG1	EQU	0B782H
ARG2	EQU	0B784H
ARG3	EQU	0B786H
NUMNX	EQU	0B796H
NUMVX	EQU	0B787H
WINON	EQU	0B79CH
WINLG	EQU	0B79EH
CURSO	EQU	0B7A0H
COLOR	EQU	0B7A3H
CCTL0	EQU	0B7A6H
CCTL1	EQU	0B7A8H
PV1	EQU	0F003H
CRT	EQU	00H
LF	EQU 0AH
CLS	EQU 0CH
CR	EQU 0DH
KBD	EQU	04H
WAIT	EQU	14H
ERRM	EQU	19H
HLHX	EQU	1AH
HLDE	EQU	1BH
AHEX	EQU	1CH
OSTR	EQU	23H
OCHR	EQU	24H
CRLF	EQU	2CH
DABR	EQU	32H
SAVE	EQU	36H
;------------------
	ORG	0BA00H
;BASIC-Autostart:
;
BSTART:	IN	A,(88H)
	OR	80H	;BASIC-ROM on
	AND	0FBH	;IRM off
	OUT	(88H),A
	LD	A,(IX+4)
	OR	60H	;BASIC-Ebene
	OUT	(86H),A
	LD	(IX+4),A
	LD	A,89H	;RUN
	LD	(362H),A
	JP	0C41FH
;-----------------------
STARTE:	DW	7F7FH
	DB	'BSAVE'
	DB	1
;
;Test, ob BASIC initialisiert wurde:
;START:
	LD	A,(0300H)
	CP	0C3H
	JR	NZ,NBAS
	LD	A,(0303H)
	CP	0C3H
	JR	NZ,NBAS
	LD	HL,035FH
	LD	E,(HL)
	INC	HL
	LD	D,(HL)
	LD	HL,0400H
	SBC	HL,DE
	JR	C,AANZ
NBAS:	CALL	PV1
	DB	OSTR
	DB	'BASIC nicht '
	DB	'initialisiert!'
	DB	7,CR,LF
	NOP
	RET
;
;Adressen anzeigen:
;
AANZ:	CALL	INIT
	CALL	PV1
	DB	OSTR
	DB	CLS,LF
	DB	' BASIC-Programm als '
	DB	'MC-File abspeichern'
	DB	LF,LF
	NOP
	LD	A,19
	LD	(CURSO),A
	CALL	PV1
	DB	OSTR
	DB	'<V1.3>  ` ML-Soft'
	DB	27H,'93',CR,LF
	NOP
	LD	A,'_'
	LD	B,40
UNST:	CALL	PV1
	DB	CRT
	DJNZ	UNST
	CALL	PV1
	DB	OSTR
	DB	CR,LF
	DB	'Anfangsadresse: 0300H'
	DB	CR,LF
	DB	'Endadresse    : '
	NOP
	LD	HL,(03D7H)
	CALL	PV1
	DB	HLHX
	CALL	PV1
	DB	OSTR
	DB	8,'H',CR,LF
	NOP
	LD	A,H
	AND	80H
	JR	Z,EOK
	CALL	PV1
	DB	OSTR
	DB	CR,LF
	DB	'--> Programm zu gro~!'
	DB	7,CR,LF
	NOP
	RET
EOK:	CALL	PV1
	DB	OSTR
	DB	'Startadresse  : 0370H'
	DB	CR,LF
	DB	'BASIC-RAM-Ende: '
	NOP
	LD	HL,(03B0H)
	CALL	PV1
	DB	HLHX
	CALL	PV1
	DB	OSTR
	DB	8,'H',CR,LF,LF
	NOP
	LD	A,H
	AND	80H
	JR	Z,RAOK
	LD	DE,(0356H)
	SBC	HL,DE	;HL=0100H
	EX	DE,HL
	LD	HL,7FFFH
	SBC	HL,DE	;HL=7EFFH
	PUSH	HL
	LD	HL,(03D7H)
	LD	DE,100H
	ADD	HL,DE
	POP	DE	;DE=7EFFH
	SBC	HL,DE
	JR	NC,RAOK	;Begr. n. m|gl.
	CALL	PV1
	DB	OSTR
	DB	'RAM auf 7FFFH '
	DB	'begrenzen (y/n) ? '
	NOP
YN:	CALL	PV1
	DB	KBD
	CP	3
	JP	Z,BRK
	AND	0DFH
	CP	'N'
	JR	Z,RAOK
	CP	'Y'
	JR	NZ,YN
;
;RAM begrenzen:
;
	LD	A,10H
	LD	(CURSO),A
	CALL	PV1
	DB	OSTR
	DB	0BH,0BH
	DB	'7FFFH'
	DB	CR,LF,LF
	NOP
	EX	DE,HL
	LD	(0356H),HL
	LD	HL,7FFFH
	LD	(03B0H),HL
	LD	(03C4H),HL
	LD	HL,(03D7H)
	LD	(03D9H),HL
	LD	(03DBH),HL
;
;Startprogramm eintragen:
;
RAOK:	LD	HL,BSTART
	LD	DE,0370H
	LD	BC,STARTE-BSTART
	LDIR
	LD	C,0EH
	CALL	NAME
	RET	C	;BRK
	PUSH	HL	;Name
	LD	HL,BUF
	LD	B,128
CLR:	LD	M,0
	INC	HL
	DJNZ	CLR
	LD	HL,(3D7H);END-Adr.
	LD	(BUF+19),HL
	EX	DE,HL
	LD	HL,300H	;ANF-Adr.
	LD	(BUF+17),HL
	LD	HL,370H	;START-Adr.
	LD	(BUF+21),HL
	CALL	PV1
	DB	CRLF
	LD	A,3
	LD	(BUF+16),A
	POP	HL
	PUSH	HL
	LD	DE,BUF
	LD	BC,8
	LDIR		;Dateiname
	INC	HL
	LDI
	LDI		;..typ
	LDI
	LD	BC,0FC80H
	IN	A,(C)
	CP	0A7H	;Floppy?
	JR	NZ,KASS
	CALL	PV1
	DB	OSTR
	DB	2,LF,2
	DB	'<K>assette oder '
	DB	'<D>iskette ? '
	NOP
INKEY:	CALL	PV1
	DB	KBD
	CP	3
	JP	Z,BRK
	AND	0DFH
	CP	'D'
	JR	Z,ANZK
	CP	'K'
	JR	NZ,INKEY
ANZK:	CALL	PV1
	DB	CRT
	CP	'D'
	JR	Z,DISK
	CALL	PV1
	DB	CRLF
KASS:	LD	DE,ARGN
	LD	HL,BUF+16
	LD	BC,7
	LDIR
	POP	HL	;Name
	CALL	PV1
	DB	SAVE
	RET
DISK:	POP	HL
	CALL	PV1
	DB	CRLF
	LD	HL,BUF
	LD	DE,0B80H;Anzahl(E)
	LD	BC,81F2H;Portadr.
ADR:	OUTI
	INC	B
	INC	B
	DEC	E
	JR	NZ,ADR
	LD	A,D
	CALL	STEUER
	JR	Z,NERR
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',CR,LF,7
	NOP
	RET
ERRTX:	LD	A,2	;CLLN
	CALL	PV1
	DB	CRT
	LD	BC,00F1H;Fehlertext
ERRT1:	IN	A,(C)
	INC	B
	AND	A
	RET	Z	;00=Ende
	CALL	PV1
	DB	OCHR
	JR	ERRT1
NERR:	LD	BC,81F2H
	BIT	3,D	;open?
	JR	Z,L02	;nein
	LD	HL,(BUF+17);Anf.-Adr.
L02:	PUSH	HL
	LD	DE,(BUF+19);End-Adr.
	AND	A
	SBC	HL,DE	;fertig?
	POP	HL
	LD	BC,81F2H
	LD	DE,0380H
	JR	C,ADR	;nein
	LD	A,43H	;write-close
	CALL	STEUER
	JR	NZ,ERROR
	RET
;-------
;FLOAD mit Adressanzeige
;
;---------------
	DW	7F7FH
	DB	'BLOAD'
	DB	1
	CALL	INIT
	CALL	NAME12
	RET	C
	LD	A,9	;Lesen open
	CALL	STEUER
	JP	NZ,ERROR
	LD	BC,90F2H
	IN	A,(C)	;ARGN
	LD	(NUMNX),A
	CP	2
	JR	C,FE3	;wenn<2
	CP	4
	JR	C,BLOC	;wenn<4
FE3:	CALL	PV1
	DB	OSTR
	DB	'Keine CAOS-Datei !'
	DB	7,CR,LF
	NOP
	RET
BLOC:	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'
	CALL	PV1
	DB	HLDE	;Aadr, Eadr
	EX	AF,AF'
	JR	C,NST4	;keine Startadr
	EX	(SP),HL
	LD	(NUMVX),HL
	CALL	PV1
	DB	HLHX	;Sadr
	POP	HL
NST4:	CALL	PV1
	DB	CRLF
LST:	LD	A,1	;Lesen normal
	CALL	STEUER
	JP	NZ,ERROR
	DEC	C
LOA:	INI		;Daten -> (HL)
	INC	B
	INC	B
	PUSH	HL
	SBC	HL,DE	;fertig?
	POP	HL
	JR	NC,LOST	;ja
	LD	A,B
	AND	A	;neuer Block?
	JR	NZ,LOA	;nein
	JR	LST	;ja
LOST:	LD	A,(NUMNX)
	CP	3
	RET	C	;kein Start
	CALL	PV1
	DB	OSTR
	DB	'Programm starten? '
	DB	'(y/n): '
	NOP
	CALL	PV1
	DB	KBD	;Taste?
	PUSH	AF
	CALL	PV1
	DB	OCHR	;anzeigen
	CALL	PV1
	DB	CRLF
	POP	AF
	CP	'Y'
	JR	Z,ST
	CP	'y'
	RET	NZ
ST:	LD	HL,(NUMVX)
	JP	(HL)	;Start Programm
;-------
	DW	7F7FH
	DB	'DIR'
	DB	1
	CALL	INIT
	LD	A,CLS
	CALL	PV1
	DB	CRT
	LD	A,0DH	;Directory open
WDI:	CALL	STEUER
	JP	NZ,ERROR
	BIT	2,A	;Ende
	JR	NZ,STAT
	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
	LD	A,' '
	CALL	PV1
	DB	OCHR
	INC	B
	DEC	D
	JR	NZ,NA3
	LD	E,2
	CALL	ANZ
	LD	A,5	;Dir weiter
	JR	WDI
;-------
	DW	7F7FH
	DB	'STAT'
	DB	1
	LD	BC,83F1H
	IN	A,(C)
	CP	20H	;DEP ab 2.0?
	JR	C,STAT	;nein
	LD	A,1DH	;Status open
	CALL	STEUER
	JP	NZ,ERROR
	LD	E,20
	LD	B,82H
	CALL	ANZ	;Disk-total
STAT:	LD	A,15H	;Status normal
	CALL	STEUER
	JP	NZ,ERROR
	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	7F7FH
	DB	'REN'
	DB	1
	CALL	NAME12
	RET	C
	LD	A,29H	;Ren old
	CALL	STEUER
	CALL	NAME12
	RET	C
	LD	A,21H	;Ren new
OUT:	CALL	STEUER
	JP	NZ,ERROR
	RET
;-------
	DW	7F7FH
	DB	'ERA'
	DB	1
	CALL	NAME12
	RET	C
	LD	A,11H	;Era
	JR	OUT
;-------
	DW	7F7FH
	DB	'SETRO'
	DB	1
	CALL	NAME12
	RET	C
	LD	A,25H	;Setro
	JR	OUT
;-------
	DW	7F7FH
	DB	'SETWR'
	DB	1
	CALL	NAME12
	RET	C
	LD	A,31H	;Setwr
	JR	OUT
;
;--- Unterprogramme ---
;
INIT:	LD	HL,0
	LD	(WINON),HL
	LD	HL,2028H
	LD	(WINLG),HL
	LD	A,29H
	LD	(COLOR),A
	LD	HL,0EE00H
	LD	(CCTL0),HL
	LD	HL,0FE00H
	LD	(CCTL1),HL
	RET
;-------
;
;Name eingeben:
;
NAME12:	LD	C,12H
NAME:	CALL	PV1
	DB	OSTR
	DB	2,'Name :        .KCB'
	NOP
	LD	A,6
	LD	(CURSO),A
NAM1:	LD	HL,(CURSO)
NAM:	CALL	PV1
	DB	KBD
	CP	3
	JP	Z,BRK
END:	CP	8
	JR	C,NAM	; < 8
	CP	LF
	JR	C,ASC	; < 10 (CUU,CUD)
	CP	CR
	JR	Z,ENTER
	CP	20H
	JR	C,NAM	; < 20H
ASC:	CALL	PV1
	DB	CRT
	LD	A,(CURSO)
	CP	6
	JR	C,MA2
	CP	C
	JR	C,NAM1
MA2:	LD	(CURSO),HL
	JR	NAM
ENTER:	CALL	PV1
	DB	CRLF
	LD	DE,(CURSO)
	DEC	D
	LD	E,6
	CALL	PV1
	DB	DABR
	PUSH	HL
	LD	E,12
	LD	BC,82F3H
NAM2:	LD	A,M
	OUT	(C),A	;Name ausgeben
	INC	HL
	INC	B
	DEC	E
	JR	NZ,NAM2
	POP	HL
	RET
;-------
;Steuerbyte ausgeben:
;
STEUER:	LD	BC,80F3H
	OUT	(C),A	;Steuerbyte
NRDY:	PUSH	BC
	LD	A,1
	CALL	PV1
	DB	WAIT
	POP	BC
	IN	A,(C)
	BIT	0,A
	JR	NZ,NRDY
	BIT	7,A	;Fehler?
	RET
;-------
	DW	7F7FH
	DB	'LW'
	DB	1
LW:	LD	BC,83F1H
	IN	A,(C)
	CP	20H	;DEP ab 2.0?
	JR	NC,LW1	;ja
	CALL	PV1
	DB	OSTR
	DB	'DEP.COM ab Version '
	DB	'2.0 erforderlich !'
	DB	7,CR,LF
	NOP
	RET
LW1:	CALL	PV1
	DB	OSTR
	DB	2,'>'	;Eingabesymbol
	NOP
LKBD:	CALL	PV1
	DB	KBD	;Taste abwarten
	LD	D,1
	CP	CR
	JR	Z,LANZ	;nur anzeigen
	CP	3
	JR	Z,BRK
	BIT	5,A
	JR	Z,LW2
	SUB	20H	;klein->gro~
LW2:	CALL	PV1
	DB	OCHR
	LD	BC,81F1H
	OUT	(C),A
	CALL	PV1
	DB	CRLF
	LD	D,3	;Anforderung
LANZ:	LD	BC,80F1H
	OUT	(C),D
SCHL1:	IN	A,(C)
	BIT	0,A	;R}ckmeldung?
	JR	NZ,SCHL1;nein
	BIT	7,A	;Fehler?
	JP	NZ,ERROR;ja
	LD	BC,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
BRK:	CALL	PV1
	DB	CRLF
	SCF		;BRK-Flag!
	RET
;-------
	DS	0C000H-$
À@Àt(Àp6ÀnTop of Text: End of Text: Start of MC: ASM-Offset : õÛˆB	CRLF
	SCF		;BRK-Flag!
	RET
;-------
	DS	0C000H-$
À@Àt(Àp6ÀnTop of Text: End of Text: Start of MC: ASM-Offset : õÛˆ