.8080
	TITLE	'MTEST1'

;	maclib	z80
.XLIST
INCLUDE Z80.LIB
.LIST

;**************************************************************
; Vereinbarungen
;**************************************************************

cpuad	equ	00h
dmawr	equ	01h
dmard	equ	02h

ucs1	equ	06h
ucs2	equ	01h
ucs3	equ	05h
ucs4	equ	03h

stfrei	equ	06h
reszve2	equ	04h

;dma	equ	04-07h
;ctc1	equ	08-0bh
;sio1	equ	50-53h
;ctc2	equ	58-5bh
;sio2	equ	5c-5fh

bspioad	equ	54h
bspioac	equ	55h
bspiobd	equ	56h
bspiobc	equ	57h

csfab	equ	40h
csraf	equ	41h
csctr	equ	42h
;cs3bse	equ	43h

fcpioad	equ	10h
fcpioac	equ	11h
fcpiobd	equ	12h
fcpiobc	equ	13h

fdpioad	equ	14h
fdpioac	equ	15h
fdpiobd	equ	16h
fdpiobc	equ	17h

fdsel	equ	18h

;**************************************************************
; Programm
;**************************************************************

aseg
	org	0

M0000:	di
M0001:	xra	a
	out	reszve2

; Ruecksetzen der Hoeherwertigen Adressbits

	out	cpuad
	out	dmard
	out	dmawr

; An dieser Stelle spaeter den DMA-Schaltkreis ruecksetzen

; Freigabe der Adresssteuerung

	out	stfrei

; Ruecksetzen des Bildschirms

	out	csraf
	out	csctr
	mvi	a,2
	out	csfab

; Programm in Rambereich uebertragen

	lxi	b,800h
	mov	d,c
	mov	e,c
	mov	h,c
	mov	l,c
	ldir

; Verschieben des Programmsegmentes in den Arbeitsbereich

	lxi	b,puend-puanf
	lxi	h,puanfe
	lxi	d,puanf
	ldir

; Initialisieren der BS-Pio und Ausschalten des LD-ROM

	mvi	a,4fh		; erst Eingabemode
	out	bspioac
	out	bspiobc
	mvi	a,0bfh		; LD-Rom aus , kein CPU2-Wait
	out	bspioad
	mvi	a,80h		; ab 8000h nur Speicherseite 0
	out	bspiobd
	mvi	a,0fh
	out	bspiobc		; Port B Ausgabemode (Adresssel.)
	mvi	a,0cfh
	out	bspioac		; Port A Bitmode
	mvi	a,3fh
	out	bspioac		; aaee eeee (Bitmaske)

	jmp	puanf1

puanfe:

.PHASE	0c000h

; Nachfolgendes Programm wird ab 0F000H abgearbeitet
 
puanf:

M00BA:	DW	M01C7

puanf1:
	LXI	SP,stacke
	IM2
	MVI	A,high(M00BA)
	STAI
	lxi	d,loetex
	call	crtout
	lxi	d,catex
	call	crtout

; Hier spaeter den Speichertest einfuegen

M00BC:	di
	MVI	A,0FFH		; Bitmode
	OUT	fcpiobc
	EI
	MVI	A,0F3H		; eeee aaee
	OUT	fcpiobc
	MVI	A,7FH		; Eingabemode
	OUT	fcpiobd
	OUT	fcpioac
	MVI	A,0A9H		; Stop CPU2
	OUT	fcpioad
	MVI	A,3FH		; Ausgabemode
	OUT	fcpioac
	OUT	fdpioac
	MVI	A,low(M00BA)	; Interruptvektor
	OUT	fcpioac
	MVI	A,04H		; Letzter zu lesender Sektor
	STA	M07F2
	MVI	A,0C3H		; Vorbereiten Start CPU2
	STA	0
	LXI	H,M01DD
	SHLD	1
	MVI	A,0EEH
M0101:	STA	M03FC		; akt. Laufwerk
	OUT	FDSEL
	LXI	H,M0400		; Ladeadresse 'SYL'
	MOV	B,L
	SHLD	M03F0
	LXI	D,5006H
M0110:	IN	fcpiobd
	RLC
	JRNC	M0128		; Spur 0 gefunden
	DCR	D
	JRZ	M0140
	MVI	A,09H		; Positionieren zur Spur 0
	MOV	B,A
	OUT	fcpioad
	MVI	A,89H
	OUT	fcpioad
M0121:	DCR	C		; Zeitschleife
	JRNZ	M0121
	DJNZ	M0121
	JR	M0110
M0128:	LXI	H,M03F7
	MVI	M,04H		; Indexinterruptzaehler
	MVI	A,97H		; Interruptfreigabe /ASTB
	OUT	fcpioac
	MVI	A,0FFH		; Anhaengige Int. Loeschen
	OUT	fcpioac
M0135:	MOV	A,M
	ORA	A
	MVI	A,87H
	JRZ	M0153
	DCR	C
	JRNZ	M0135
	DJNZ	M0135
M0140:	LDA	M03FC
	CPI	77H
;	JZ	M00BC		; Keine Disk --> Weiter mit Lw 0
	RLC
	JR	M0101
M014B:	DCR	E
	JRZ	M0140
	LDA	M03FD
	XRI	02H
M0153:	STA	M03FD
	LXI	H,8001H
	SHLD	M07F0
	MVI	H,00H
	SHLD	M03F5
	MOV	L,H
	SHLD	M03F3
	CALL	M0194
M0168:	MOV	A,M		; Warten auf Int.
	ORA	A
	JRZ	M0168
	DCR	A
	JRZ	M014B
	CALL	M01B6		; Test auf 'SYL'
	JRNZ	M0140
	CALL	M0437		; Uebergang in Systemlader

; ERRORRETURN aus Systemlader

	lxi	d,tersys
	call	crtout
m1:	jr	m1

tersys:	db	'Error encountered in systemloader',0
	db	'Return from this Error only by Reset'
loetex:	db	0,0
catex:	db	'Laderom MARC V 1.0  K 5122',0,0

M0194:	LXI	H,M03F7
	MVI	M,10H		; 16 Indexinterrupts
	OUT	fdpioad
	OUT	reszve2
	MVI	A,0FFH
	OUT	fdpiobc
	OUT	fdpiobc
	MVI	A,0A5H
	OUT	fcpioad
	MVI	A,7FH
	OUT	fdpiobc
	IN	fdpiobd
	LDA	M03FD
	OUT	fcpioad
	inx	h
	MVI	M,00H
	RET

; Test auf 'SYL'

M01B6:	LHLD	M0400
	LXI	B,'YS'
	dsbc	bc
	rnz
	LXI	H,M0400+2
	MVI	A,'L'
	CMP	M
	rnz
	RET

; Indexinterrupt

M01C7:	EI
	push	psw
	push	h
	LXI	H,M03F7		; Reihenfolge M03F7 / M03F8
	DCR	M
	JRZ	M01D4
M01D0:	pop	h
	pop	psw
	RETI
M01D4:	MVI	A,0BDH
	OUT	fcpioad
	INX	H
	MVI	M,01H
	JR	M01D0

; Start CPU2

M01DD:	lhld	M03F0		; Ladebereichanfang
	LDA	M07F1		; 01
	MOV	B,A
	LXI	D,M0700		; CRC-Bereich
	mvi	c,fdpiobd
	EXX
	LXI	B,0FEA1H
	lded	M03F3		; 0000
	lhld	M03F5		; 0001
	MVI	A,0BDH
	OUT	fcpioad
M01F8:	MVI	A,0B5H
	OUT	fcpioad
	JR	M025A
M01FE:	MOV	H,A		; neuer Sektorlaengencode
	XRA	A
	EXX
	MOV	B,A
	EXX
	JR	M0273
M0205:	IN	fdpiobd		; 3 * A1
	IN	fdpiobd
	IN	fdpiobd
M020B:	IN	fdpiobd		; 1 * FE
	CMP	B
	JRNZ	M01F8
	IN	fdpiobd
	CMP	E		; Spur
	JRNZ	M01F8
	IN	fdpiobd
	CMP	D		; Side
	JRNZ	M01F8
	IN	fdpiobd
	CMP	L		; Sector
	JRNZ	M01F8
	IN	fdpiobd
	CMP	H		; Sectorlaengencode
	JRNZ	M01FE
	MVI	A,0B5H
	OUT	fcpioad
	LDA	M03FD
	BIT	1,A
	OUT	fcpioad
	IN	fdpiobd
	JRNZ	M0239
	IN	fdpiobd		; 3 * A1
	IN	fdpiobd
	IN	fdpiobd
M0239:	IN	fdpiobd		; 1 * FB
	EXX
	INI			; Sector lesen
	INI
	INI
	INIR
	xchg
	INI			; CRC lesen
	INI
	MVI	A,0B5H
	OUT	fcpioad
	xchg
	LDA	M07F1
	MOV	B,A
	EXX
	LDA	M07F2
	CMP	L
	JRZ	M0267
	inr	l
M025A:	LDA	M03FD
	BIT	1,A
	OUT	fcpioad
	IN	fdpiobd
	JRZ	M0205
M0265:	JR	M020B

M0267:	MVI	A,03H		; Ende der CPU2-Routine
	OUT	fcpioac
	sta	M03F8
	JR	M0265
	LXI	B,1EDAH
M0273:	sta	M07F1		; 00
	MVI	A,02H
	sta	M07F2		; 2 Sectoren
	JP	M01F8

M027E:	MVI	A,0FFH		; Keine Disk
	OUT	FDSEL
m2:	jr	m2	

; Bildschirmausgabe

crtout:
	di
	mvi	a,0ch
	out	cpuad
	lxi	h,0
	lxi	b,800h
crtou1:	mvi	m,' '
	inx	h
	dcx	b
	mov	a,b
	ora	c
	jrnz	crtou1
	xchg
	lxi	d,0
	call	crtou2
	lxi	d,0a0h
	call	crtou2
	xra	a
	out	cpuad
	ei
	ret
crtou2:
	mov	a,m
	inx	h
	ora	a
	rz
	stax	d
	inx	d
	jr	crtou2	

stack:	ds	32
stacke:

puend:

.DEPHASE

M03F0	equ	03F0H
M03F3	equ	03F3H
M03F5	equ	03F5H
M03F7	equ	03f7h
M03F8	equ	03F8H
M03FA	equ	03FAH
M03FC	equ	03FCH
M03FD	equ	03FDH
M0400	equ	0400H
M0437	equ	0437H
M0460	equ	0460H
M0462	equ	0462H
M0464	equ	0464H
M046C	equ	046CH
M0700	equ	0700h
M07F0	equ	07F0H
M07F1	equ	07F1H
M07F2	equ	07F2H

	end
