#include <asm/z80/features.h>
#include <stdlib.h>
#include <stdio.h>
#include <math.h>

/*
	Externe Hardware am Demuxer A5,A6,A7
	
	Mux 0 : 	STI Multi I/O Chip
	Mux 1 : 	8255 
	Mux 2 :		ADC 0804 
	Mux 3 :		7 Segment 

	I/O Map 	0x20..0x2F - STI 	
	
	0x20		IDR 	Indirect Data Register
	0x21        GPIP 	Purpose lnterrupt
	0x22		IPRB 	lnterrupt Pending Register B
 	0x23		IPRA 	Interrupt Pending Register A .
	0x24		ISRB 	Interrupitn -ServiceR egisteBr
	0x25 		ISRA 	Interrupt in-Service Register A
	0x26		IMRB 	lnterrupt Mask Register B
	0x27		IMRA 	Interrupt Mask Register A
	0x28		PVR 	Pointer,/Vector Register
	0x29		TABCR 	Timers A and B Control Register
	0x2A 		TBDR 	Timer B Data Register
	0x2B 		TADR 	Timer A Data Register
	0x2C 		UCR 	USART Control Register
	0x2D 		RSR 	ReceiveSr tatusR egister
	0x2E 		TSR		Transmitter Status Register
	0x2F 		UDR 	USART Data Register	
	
	I/O Map 	0x40..0x43 - 8255 	
	0x40		PORTA	
	0x41		PORTB
	0x42		PORTC
	0x43		8255_CNTRL
	
	I/O Map 	0x60 - ADC 0804
	0x60		ADC0804_READ
	
	I/O Map 	0x80 - 7_Segment Anzeige
	0x80		SEG7	
	
	
*/

// Prototypen
void cv_vint(void);
void stop_cpu();

const char copyright[]="Z80 Monitor (C) 2014 by Christian Julius";

#define MAX_RAM	  0xffff-0x2000-0x100
unsigned char ram[MAX_RAM];
unsigned int k;

// PIO 8255 Special I/O
__sfr __at 0x40 PIO8255_PORT_A;
__sfr __at 0x41 PIO8255_PORTB_B;
__sfr __at 0x42 PIO8255_PORTB_C;
__sfr __at 0x43 PIO8255_CNTRL;

// ADC 0804
__sfr __at 0x60 ADC0804_READ;

// 7b Segment
__sfr __at 0x80 SEG7;


int main()
{
	while (1) {
	
		// aa einschreiben
		for (k=0;k<MAX_RAM;k++) 
			ram[k] = 0xaa;		

		for (k=0;k<MAX_RAM;k++) 
			if (ram[k]!=0xaa)
				stop_cpu();
				
		// 55 einschreiben	
		for (k=0;k<MAX_RAM;k++) 
			ram[k] = 0x55;	
			
		for (k=0;k<MAX_RAM;k++) 
			if (ram[k]!=0x55)
				stop_cpu();
	
	}
 
}

// NMI Interrupt Handler
void cv_vint(void)
{
	ram[20000] = 0x34; 
  
}

// Halte CPU an und lasse LED leuchten
void stop_cpu()
{
	__asm
		 halt
	__endasm ; 
}


