;*********************************************************
; NAMN		:	STARTUP
; PROGRAMMERARE	:	L-O/IND
; DATUM		:	86-10-14
; MODIFIERAD	:	
;*********************************************************
;
; SYFTE		: Initiera RAM, CTC, SIO och stackpekare
;
; ANROPAS FR]N	: - (wdogtest, resettest)
;
; SUBRUTINER
;    INTERNA	: LDCW	   Initierar SIO
;		  INIRAM   Initierar RAM
;
;    EXTERNA	: PUTCHR   L{gger tkn i tx-buffert
;
;*********************************************************
;
	FORMLN	42
	NAME	STARTUP

	INCLUDE	TMC.H
;
; VARIABLER:
;
	EXTERN	RXBUFF, RXHEDP, RXTALP, NCHRRX, RXSTAT
	EXTERN	TXIRQS, XONFLG, XOFFLG
	EXTERN	TXBUFF, TXHEDP, TXTALP, NCHRTX, TXSTAT
	EXTERN	PARAM, PARAMP, STXFLG, STKTOP
	EXTERN	TSTFLG, STATUS
	EXTERN	EIRETI			; mice-special exekverbar kod i RAM !!
;
; LABLAR:
;
	EXTERN	MAIN
	EXTERN	PUTCHR
	EXTERN	RECIRQ,TRMIRQ
;
	INTERN	INIRAM, WA, RE, EX, CHKSUM
;
	PAGE
;*********************************************************
;
; S{tt upp stackpekare
; Initiera RAM
; S{tt upp CTC
; Initiera SIO
; Skicka testsvar WHEN startup efter Watchdog- eller Reset-test
; Hopp till mainloop
;
;*********************************************************
;
	RSECT	PROM
;
	JP	INISTK
;
	REPT	13
	DEFB	0FFH		; Fyll ut till 16
	ENDR
;				; STARTUP m}ste l{nkas f|rst
IRQTAB:
	DEFW	DUMIRQ
	DEFW	DUMIRQ
	DEFW	DUMIRQ
	DEFW	BSPCRXIRQ	; Ch B Special Receive Condition
	DEFW	TRMIRQ		; Ch A Transmit Buffer Empty
	DEFW	DUMIRQ
	DEFW	RECIRQ		; Ch A Recieve Character Available
	DEFW	ASPCRXIRQ	; Ch A Special Receive Condition
IRQEND:

CHKSUM:	DEFW	0		; Promchecksumman m}ste l{ggas p} j{mn adress

WA:	DEFM	'WA'		; Watchdog-test
RE:	DEFM	'RE'		; Reset-test
EX:	DEFM	'EX'		; Executing
;
	REPT	10H		;
	DEFB	0FFH		; Fyll ut till 38
	ENDR
RST38:				; Om instruktionen FF exekverats

INISTK:
	LD	SP,STKTOP
;
	CALL	INIRAM		; Initiera RAM
;
	LD	HL,IRQTAB	; 
	LD	A,H		; MSByte av IRQTAB
	LD	I,A		; l{ggs i interrupt-vektor
INICTC:
	LD	A,47H		; Mode 9600 baud
	OUT	(CTC0),A
	OUT	(CTC1),A
	OUT	(CTC2),A
	LD	A,8		; Counter
	OUT	(CTC0),A
	OUT	(CTC1),A
	SRL	A
	OUT	(CTC2),A
INISIO:
	IM	2
	LD	HL,SIOACW
	CALL	LDCW
	LD	HL,SIOBCW
	CALL	LDCW
;
	PAGE
;*********************************************************
;
; Skicka testsvar WHEN startup efter Watchdog- eller Reset-test
; -------------------------------------------------------------
;
; CASE "Status"
;     WHEN status = "WA"
;         "PUTCHAR" 'STX'
;         "PUTCHAR" 'K'
;     WHEN status = "RE"
;         "PUTCHAR" 'STX'
;         "PUTCHAR" 'L'
; END "Status"
; Status = 'EX'
;
;*********************************************************
;
TESTQ:
	LD	HL,(WA)		;
	LD	BC,(STATUS)	;
	SCF			; Startup efter
	CCF			; Watchdogtest?
	SBC	HL,BC		; 
	JP	NZ,RESETQ	; Nej
;
	LD	A,STX		; Ja
	CALL	PUTCHR		; Skicka STX
;
	LD	A,'K'
	CALL	PUTCHR		; Skicka kommandot
	JP	CHSTAT
RESETQ:
	LD	HL,(RE)		;
	SCF			;
	CCF			; Startup efter Reset?
	SBC	HL,BC		; 
	JP	NZ,CHSTAT	; Nej
;
	LD	A,STX		; Ja
	CALL	PUTCHR		; Skicka STX
;
	LD	A,'L'
	CALL	PUTCHR		; Skicka kommandot
CHSTAT:
	LD	HL,(EX)		; 
	LD	(STATUS),HL	; Status = executing
;
	JP	MAIN
;
;*********************************************************
;
SIOACW:
	DEFB	SIOAC
	DEFB	9		; Ant byte
	DEFB	00011000B	; Reset
	DEFB	4		; Reg 4
	DEFB	01000101B	; Div 16, 1 stop, odd parity
	DEFB	3
	DEFB	01000001B	; 7 bitar, RX enable
	DEFB	5
	DEFB	00101000B	; DTR off, TX 7, TX ena, RTS off
	DEFB	1
	DEFB	00010100B	; Rec irq enable, stat aff vector,
;				; txirq dis, external stat irq disable
SIOBCW:
	DEFB	SIOBC
	DEFB	11		; Ant byte
	DEFB	00011000B	; Reset channel B
	DEFB	4		; Reg 4
	DEFB	01000101B	; Div 16, 1 stop, odd parity
	DEFB	3
	DEFB	01000001B	; 7 bitar, RX enable
	DEFB	5
	DEFB	00101000B	; DTR off, TX 7, TX ena, RTS off
	DEFB	1
	DEFB	00000100B	; Stat aff vector
	DEFB	2
	DEFB	IRQTAB & 0FFH	; LSByte av IRQTAB (alt DEFB 16)
;
;*********************************************************
;
INIRAM:
;
	LD	HL,RXBUFF
	LD	(RXHEDP),HL
	LD	(RXTALP),HL
	LD	HL,NCHRRX
	LD	(HL),0
;
	LD	HL,TXBUFF
	LD	(TXHEDP),HL
	LD	(TXTALP),HL
	LD	HL,NCHRTX
	LD	(HL),0
;
	LD	A,XON
	LD	(RXSTAT),A
	LD	(TXSTAT),A
;
	LD	A,DISABL
	LD	(TXIRQS),A
;
	LD	A,FALSE
	LD	(XONFLG),A
	LD	(XOFFLG),A
	LD	(STXFLG),A
	LD	(TSTFLG),A
;
	LD	HL,PARAM
	LD	(PARAMP),HL
;
;	fixa till s} att insruktionerna EI och RETI inte beh|ver exekveras
;	i MICEN's RAM (mice gillar inte det)

	LD	IX,EIRETI
	LD	A,0FBH		;instruktionen EI
	LD	B,0EDH		;instruktionen RETI 1:a halvan
	LD	C,04DH		;instruktionen RETI 2:a halvan
	LD	(IX+0),A
	LD	(IX+1),B
	LD	(IX+2),C

	RET
;
;*********************************************************
;
LDCW:
	LD	C,(HL)
	INC	HL
	LD	B,(HL)
	INC	HL
	OTIR
	RET;
;*********************************************************
;
ASPCRXIRQ:

	PUSH	AF
	LD	A,30H		; error reset
	OUT	(SIOAC),A
	IN	A,(SIOAD)
	POP	AF

	JP	EIRETI		; mice-special

;	EI
;	RETI
;
;*********************************************************
;
BSPCRXIRQ:

	PUSH	AF
	LD	A,30H		; error reset
	OUT	(SIOBC),A
	IN	A,(SIOBD)
	POP	AF

	JP	EIRETI		; mice-special

;	EI
;	RETI
;
;*********************************************************
;
DUMIRQ:

	JP	EIRETI		; mice-special

;	EI
;	RETI
;
;*********************************************************
;
	END
