;Name:	Derek Marston and Kristin Kelly
;Date:  11/19/02
;Description:  This program will run an ethernet
;		network

Monitor 	EQU	0FF7Ch
CmdReg		EQU	8800h
PortA		EQU	1000h
StatusReg	EQU	8800h
DataReg		EQU	8000h
SCIStatusReg	EQU	102Eh
SCIDataReg	EQU	102Fh
CharOut		EQU	0FFB8h
StrOut		EQU	0FFC7h
LineFeed	EQU	0FFC4h
BaseReg		EQU	1000h
TOC5		EQU	1Eh
TFlag1		EQU	23h
TCount		EQU	0Eh

US		EQU	'3'  ;Our node address
BROADCAST	EQU	'0'  ;Broadcast address
			     ;for change order #2

;Subroutines in EEPROM:
Config8251A             EQU	0B600h
InitializeVars	        EQU	0B603h
InstallInterruptVector  EQU    	0B606h
TransmitA	        EQU	0B609h
Receive		        EQU	0B60Ch
dspData		        EQU	0B60Fh
ProcessKey		EQU	0B612h
CopyBuff		EQU	0B615h
SendFree		EQU	0B618h
IntrRoutine		EQU	0B61Bh
CollectToken		EQU	0B61Eh
sendBusy		EQU	0B621h
ProcessFreeToken	EQU	0B624h

;put flags early in memory so they can
;be used with the direct address mode
	org	00h
RecFlag:	DS 	1t;	Define flag
dspFlag:	DS	1t;	Define flag
Data2SendFlag:	DS	1t;	Define flag
KBFlag:		DS	1t;	Define flag
Collisions:	DS	1t;	Define number of collisions

	org	100h
	bra	main

RecBuff:	DS	19t; Define space for largest token+2
dspBuff:	DS	19t;	Define space for data
KBBuff:		DS	19t;	Define space for data
KBPtr:		DS	2t;


main:
	jsr	Config8251A;	Configure USART
	jsr	InstallInterruptVector;
	jsr	InitializeVars;
	clr	Collisions
	
WaitLoop:
	;TOKEN
	brset	RecFlag,0Fh,ProcessToken;token to get
			;just checking last nybble
	;KEYBOARD
	jsr	ProcessKey
	brset	Data2SendFlag,0FFh,SendData

	;DISPLAY
	brclr	dspFlag,0FFh,Waitloop

	jsr	dspData
	bra	Waitloop

SendData:
	jsr	SendPacket
	clr	Data2SendFlag
	bra	Waitloop

ProcessToken:
	ldaa	RecFlag
	cmpa	#0BFh		;see if token is busy
	beq	tokenisbusy
				;otherwise assume free
	jsr	ProcessFreeToken
	bra	WaitLoop
tokenisbusy:
	jsr	ProcessBusyToken
	bra	WaitLoop

;Name:		ProcessBusyToken
;Input:		None
;Output:	None
;Destroys:	A, X, Flags
;Desc:		Determines action when a busy token
;		arrives

ProcessBusyToken:
	clr	RecFlag		;token received
	ldx	#RecBuff
	ldaa	2,x		;load destination address

	cmpa	#BROADCAST	;see if message is broadcast
	beq	ToUs		;(change order)

	cmpa	#US		;see if message is TO us
	bne	NotToUs
ToUs:
	ldy	#dspBuff	;copy busy token to display
	jsr	CopyBuff
	jsr	dspData		;display the message

NotToUS:
	rts;

;Name:		SendPacket
;Input:		None
;Output:	None
;Destroys:	A, B, X, Y, Flags
;Desc:		Sends the message in the Tx/Rec buffer
;		on an ethernet bus
SendPacket:
	sei

	;enable the transmitter
	ldaa	#00100000q 	;Sets pin 5 high
	staa	PortA		;to enable transmitter		

prepBusy:
	ldx	#KBBuff
	ldy	#RecBuff	;actually, this is the 
				;Tx Buffer now.  HAHAHA

	ldaa	#0BBh		;append leading BB to token
	staa	0,y
	iny

	ldaa	#US		;put our node address into 
	staa	0,y		;the source byte of token
	iny

	jsr	CopyBuff	;copy busy token
				;into Tx/Rx buffer

	jsr	SendBusy


	ldd	#2560t		;wait two byte frames
	jsr	Wait
	ldaa	DataReg

	;disable the transmitter
	ldaa	#00h		;Sets pin 5 low
	staa	PortA		;to disable transmitter		

	cli
	rts

;Name:		Wait
;Input:		D = delay time (in E-clock periods)
;Output:	None
;Destroys:	X, D, Flags
;Desc:		Waits for # periods in D
Wait:
	ldx	#BaseReg

	bclr	TFlag1,X,11110111q	;clear OC5 flag

	addd	TCount,X
	std	TOC5,X

Wait4OC5:
	brclr	TFlag1,X,00001000q,Wait4OC5

	bclr	TFLag1,X,11110111q	;clear OC5 flag

	rts

;Name:		CountCol
;Input:		none
;Output:	none
;Destroys:	Flags
;Desc:		Counts number of collisions and puts
;		number in a spot of memory
CountCol:
	inc	Collisions;
