*
*  HC11 - Serial Equates
*
SPCR  	EQU	$1028			; SPI Control Register
SPSR		EQU	$1029	
SPDR		EQU	$102A			; SCI Data Register
BAUD		EQU	$102B			; SCI Baud Rate Control Register
SCCR1		EQU	$102C			; SCI Control Register 1
SCCR2		EQU	$102D			; SCI Control Register 2
SCSR		EQU	$102E			; SCI Status Register
SCDR		EQU	$102F			; SCI Data 
TDRE		EQU	$80			; Transmit Data Register Empty
TRENA		EQU	$0C			; Transmit, Receive ENAble
RDRF		EQU	$20			; Receive Data Register Full
PD_WOM	EQU	$20	
B9600		EQU	$B0
*
*  HC11 - PORT Equates
*
PORTA		EQU	$00			; Port A data register
PORTB		EQU	$04			; Port B data register
PORTC		EQU	$03			; Port C latched data register
PORTD		EQU	$08			; Port D data register
PORTE		EQU	$0A			; Port E data register
DDRC		EQU	$07			; Data Direction register for port C
HPRIO		EQU	$3C			; Highest Priority Interrupt and misc.
*
*  HC11 - Timer / Speaker Equates
*
BASE		EQU	$1000			; Port A data register
TCNT		EQU	$100E			; Actual free running timer count
TOC5		EQU	$101E			; OC5 timer compare value
TCTL1		EQU	$1020			; Timer count control
TFLG1		EQU	$1023			; Timer compare flag
PERIOD	EQU	$3000			; half period for 10mS (100Hz)
TIME		EQU	$0012			; counter to set duration correct
FCM		EQU	%00001000 		; OC1 flag set & clear mask
PA3_M		EQU	%11110111		; mask for PA3 in Port A
SET_T		EQU	%11111100		; mask to make lower 2 bits zero
*
*  HC11 - A/D Converter Equates
*
ADCTL 	EQU 	$30
ADR4  	EQU 	$34
OPT		EQU 	$39
*
*  HC11 - Interrupt Equates
*
IRQ		EQU	$FFF2
XIRQ		EQU	$FFF4
SWI		EQU	$FFF6
ILOP		EQU	$FFF8
COPF		EQU	$FFFA
COPC		EQU	$FFFC
*
*  HB_Buffalo Display Equates
*
LCDtmpX	EQU	$0D
LCDtmpA	EQU	$0F
LCDrout	EQU	$10
PROCHR	EQU	'>'
* ________________________________________________________________________________
*
*  Stack Pointer Location
*
SPLOC		EQU	$BFEF
* ________________________________________________________________________________
*
*  Monitor JSR Locations 
*
PROMPT	EQU	$C050
GET		EQU	$C053
PUT		EQU	$C056
CLRDISP	EQU	$C059
SENDCH	EQU	$C05C
SENDSTR	EQU	$C05F
DISNUM	EQU	$C062
SOUND		EQU	$C065
RD_KNB	EQU	$C068
PWR_AD	EQU	$C06B
READ_AD	EQU	$C06E
*
*  Monitor BUFFERS Locations 
*
DISBUF	EQU	$C000		; $C000 - $C01F
KEY		EQU	$C030
DUR		EQU	$C031
FREQ		EQU	$C032
KNB_POS	EQU	$C033
AD_POS	EQU	$C035
*
* ________________________________________________________________________________
*
		ORG	$BFFE			; Reset Vector
		FDB	$C050			; org start of Monitor
* ________________________________________________________________________________
*
* DISPLAY BUFFER
*
		ORG	$C000        
*
Line1		FCC	'################'
Line2		FCC	'################'
Lend		FCB	$00
* ________________________________________________________________________________
*
*  BUFFER TABLE
*
		ORG	$C030
		FCB	$00			; KEY location - $C030
		FCB	$0A			; DUR location - $C031
		FCB	$0A			; FREQ location - $C032
		FCB	$00			; KNB_POS location - $C033
		FCB	$00			; blank
		FCB	$00			; AD_POS location - $C035
* ________________________________________________________________________________
*
*  JUMP TABLE
*
		ORG	$C050
		JMP	Start			; PROMPT location - $C050
		JMP	Getky			; GET location - $C053
		JMP	WrtDis		; PUT location - $C056
		JMP	ClrDis		; CLRDISP location - $C059	
		JMP	putch			; SENDCH location - $C05C
		JMP	OutStrg		; SENDSTR loaction - $C05F
		JMP	PNum			; DISNUM location - $C062
		JMP	MNoise		; SOUND location - $C065
		JMP	KNB_IN		; RD_KNB location - $C068
		JMP	POWER			; PWR_AD location - $C06B
		JMP	AD_INP		; READ_AD location - $C06E
* ________________________________________________________________________________
*
*  Start of Prog - PROMPT
*
Start		LDS	#SPLOC		; Set Stack Pointer
		LDX	#Start		; Set up Interruputs to Prompt
		STX	IRQ
		STX	XIRQ
		STX	SWI
		STX	ILOP
		STX	COPF
		STX	COPC
*
		LDX	#$1000		; Set up Serial for 9600 Baud transmission
		BCLR	SPCR,X PD_WOM
		LDAA	#B9600
		STAA	BAUD,X
		LDAA	#TRENA
		STAA	SCCR2,X
*
		JSR	PWR_AD			; Power AD Converters -Wasteful if on Battery
* ________________________________________________________________________________
*
*  Set up Display
*
		JSR	CPYprt		; Copy Display routine to Zero Page
*
		LDAA	#$00			
		LDAB	#$0C			; Display On /  Cursor Off / Flash Off
		JSR	LCDrout
*	
		LDAA	#$00			
		LDAB	#$38			; Two Line Display
		JSR	LCDrout
*	
		LDAA	#$00			
		LDAB	#$03			; Home and Clear Display
		JSR	LCDrout
*	
* ________________________________________________________________________________
*
		LDAA	#00			; Turn off Motor Outputs
		STAA	$7000
* ________________________________________________________________________________
*
* Copy HB_Buffalo Version to Buffer and Display
*	
Versn		LDX	#Line1
		LDY	#Verson
CpyV		LDAA	0,Y
		STAA	0,X
		INY
		INX
		CPX	#Lend
		BNE	CpyV
* ________________________________________________________________________________
*
*  Display Version message to Terminal
*
		JSR	WrtDis
		LDX	#Line1		; buffalo message
		JSR	OutStrg
		JSR	OutCRLF
* ________________________________________________________________________________
*	
*  Input User Commands from Serial Line  ######### MAIN LOOP ############
*
MAIN		LDS	#SPLOC		; Initialize SP every time
		JSR	OutCRLF
		LDAA	#PROCHR		; prompt user '>'
		JSR	putch
		JSR	ClrDis
		CLRB
MAIN1		PSHB 
		JSR	getch			; Read terminal
		JSR	putch
		CMPA	#$08
		BNE	MAIN2			; jump if not bckspc
		LDX	#Line1

*  NEED CLEAR BUFFER ON BACKSPACE

		PULB
		ABX				; pointer into buffer
		LDAA	#' '
		STAA	0,X
		TSTB
		BEQ	MAIN			; jump if buffer empty
		DECB
		BRA	MAIN1
MAIN2		CMPA	#$0D
		BEQ	COMDO			; jump if Return
		LDX	#Line1
		PULB
		ABX				; pointer into buffer
		STAA	0,X
		INCB
		CMPB	#32
		BNE	MAIN1			; jump if not long
		LDX	#LngMSG		; Print Long Message
		JSR	OutStrg
		BRA	MAIN
* ________________________________________________________________________________
*	
* Do Command
*	
CmdNm		FCB	0			; Num Commands
CmdWd		FCC	'XX'			; Word
CmdA1		FCC	'00'			; Add1
CmdA2		FCC	'00' 			; Add2 or Data
CmdD		FCC	'00'			; Data
CmdAd		FCC	'00'			; Address Store
*
COMDO		JSR	OutCRLF
		LDX	#Line1		; Convert commands to UpperCase
UpCas		LDAA	0,X
		CMPA	#'a'
		BLT	UpCas1		; jump if < a
		CMPA	#'z'
		BGT	UpCas1		; jump if > z
		SUBA	#$20
		STAA	0,X
UpCas1	INX
		CPX	#Lend
		BNE	UpCas
*
		JSR	WrtDis		; Print command to Display
*	
		CLR	CmdNm			; State No Commands (yet)
		LDX	#Line1		; Parse Command
		JSR	SkipB			
		STAA	CmdWd			; Store Cmd Char1
		LDAA	1,X	
		STAA	CmdWd+1		; Store Cmd Char1
		INC	CmdNm			; Got First Command So Num Commands =1
		INX
		INX
		JSR	SkipW
		JSR	GetNum		; Get First Addess
		LDD	CmdAd
		STD	CmdA1
		INC	CmdNm			; Got First Command So Num Commands =2
		JSR	SkipB
		JSR	GetNum
		LDD	CmdAd
		STD	CmdA2
		INC	CmdNm			; Got Second Command So Num Commands =3
		JSR	SkipB
		JSR	GetNum
		LDD	CmdAd
		STD	CmdD
		INC	CmdNm			; Got Third Command So Num Commands =4
		JMP	DetCom
*	
SkipW		LDAA	0,X			; Skip Remaining Words then WhiteSpace
		CMPA	#$2C			; comma
		BEQ	SkipB
		CMPA	#$20			; space
		BEQ	SkipB
		CMPA	#$09			; tab
		BEQ	SkipB
		INX
		CPX	#Lend
		BNE	SkipW
		JMP	DetCom
SkipB		LDAA	0,X			; Skip White Space
		CMPA	#$2C			; comma
		BEQ	NeCh
		CMPA	#$20			; space
		BEQ	NeCh
		CMPA	#$09			; tab
		BEQ	NeCh
		RTS
NeCh		INX
		CPX	#Lend
		BNE	SkipB
		JMP	DetCom
*	
GetNum	CLRB
		CLR	CmdAd
		CLR	CmdAd+1
GetA		LDAA	0,X
		CMPA	#'0'
		BLT	EGet			; jump if < 0
		CMPA	#'9'
		BGT	Get1			; jump if > 9
		INCB				; Is Num INC digits
		SUBA	#'0'
		BRA	Addit
Get1		CMPA	#'A'			; jump if < A
		BLT	EGet
		CMPA	#'F'	
		BGT	EGet
		SUBA	#55
		INCB				; Is Num INC digits
Addit		ASL	CmdAd+1
		ROL	CmdAd
		ASL	CmdAd+1
		ROL	CmdAd
		ASL	CmdAd+1
		ROL	CmdAd
		ASL	CmdAd+1
		ROL	CmdAd
		ADDA	CmdAd+1
		STAA	CmdAd+1
		INX
		BRA	GetA
EGet		CMPB	#04
		BGT	DetCom	
		TSTB
		BEQ	DetCom
		RTS
*	
DetCom	LDAA	CmdNm			; Check that more than Zero Commands
		BEQ	GVers
		LDAA	CmdWd			; Check If Load
		CMPA	#'L'
		BNE	Next1
		LDAA	CmdWd+1
		CMPA	#'O'
		BNE	Next1
		JSR	LOAD
		JMP	MAIN
Next1		LDAA	CmdWd			; Check If BFILL
		CMPA	#'B'
		BNE	Next2
		LDAA	CmdWd+1
		CMPA	#'F'
		BNE	Next2
		JSR	BFILL
		JMP	MAIN
Next2		LDAA	CmdWd			; Check If CALL
		CMPA	#'C'
		BNE	Next3
		LDAA	CmdWd+1
		CMPA	#'A'
		BNE	Next3
		JSR	CALL
		JMP	MAIN
Next3		LDAA	CmdWd			; Check If GO
		CMPA	#'G'
		BNE	Next4
		LDAA	CmdWd+1
		CMPA	#'O'
		BNE	Next4
		JSR	GO
		JMP	MAIN
Next4		LDAA	CmdWd			; Check If Move / MD / MM
		CMPA	#'M'
		BNE	HlpEd
		LDAA	CmdWd+1
		CMPA	#'O'			; Check If MO
		BNE	Next5
		JSR	MOVE
		JMP	MAIN
Next5		CMPA	#'D'			; Check If MD
		BNE	Next6
		JSR	MEMD
		JMP	MAIN
Next6		CMPA	#'M'			; Check If MM
		BNE	HlpEd
		JSR	MMOD
		JMP	MAIN
HlpEd		JSR	HELP
		JMP	MAIN 
GVers		JMP	Versn
* ________________________________________________________________________________
*	
* Do Help Command
*	
HDm		FCC	'UNKNOWN COMMAND '
HDm1		FCC	' DISPLAYING HELP'
HELP 		LDX	#HDm
		LDY	#Line1
HLP1		LDAA	0,X
		STAA	0,Y
		INX
		INY
		CPY	#Lend
		BNE	HLP1	
		JSR	WrtDis
		LDX	#HELPMSG
		JSR	OutStrg      		; print help screen to Terminal
		RTS
*	
HELPMSG	FCC	'HANDYBOARD BUFFALO'
		FCB	$0D
		FCB	$0A
		FCC	'  LOAD                          = Load S-records.'
		FCB	$0D
		FCB	$0A
		FCC	'  BF <addr1> <addr2> [<data>]   = Block fill.'
		FCB	$0D
		FCB	$0A
		FCC	'  MOVE <Sadr1> <Dadr2> [<num>]  = Block move.'
		FCB	$0D
		FCB	$0A
		FCC	'  MD <addr1> [<addr2>]          = Memory dump.'
		FCB	$0D
		FCB	$0A
		FCC	'  MM <addr> <data>              = Memory modify.'
		FCB	$0D
		FCB	$0A
		FCC	'  CALL <addr>                   = Call user subroutine.'
		FCB	$0D
		FCB	$0A
		FCC	'  GO <addr>                     = Execute user code.'
		FCB	$0D
		FCB	$0A
		FCB	00
* ________________________________________________________________________________
*	
* Do Load Command
*
MSG12		FCC	'Checksum error'
		FCB	0
MSG14		FCC	'Receiver error'
		FCB	0
MSG11		FCC	'Completed Load'
		FCB	0
*
SHFTREG	RMB	2		input shift register
AUTOLF	RMB	1		auto lf flag for i/o
TMP1 		FCB	0		main,hexbin,buffarg,termarg
TMP2		FCB	0
TMP3		FCB	0
TMP4		FCB	0
PTR3		RMB	2
*	
LOAD		CLR  	TMP2            	; 0=load
		CLR  	TMP3        	; clear error flag
LOAD10	JSR	getch			; Read terminal
		CMPA 	#'S'
		BNE  	LOAD10      	; jump if not S
		JSR	OutCRLF
		LDAA	#'S'
		JSR	putch
LOAD12	JSR	getch			; Read terminal
		CMPA 	#'9'
		BEQ  	LOAD90      	; jump if S9 record
		CMPA 	#'1'
		BNE  	LOAD10      	; jump if not S1
		JSR	putch
		CLR  	TMP4        	; clear checksum
		JSR  	BYTE
		LDAB 	SHFTREG+1
		SUBB 	#$2         	; b = byte count
		JSR  	BYTE
		JSR  	BYTE
		LDX  	SHFTREG     	; x = base address
		DEX
LOAD20	JSR  	BYTE        	; get next byte
		INX
		DECB             		; check byte count
		BEQ  	LOAD30      	; of b=0, go do checksum
		TST  	TMP3
		BNE  	LOAD10      	; jump if error flagged
		TST  	TMP2
		BNE  	LOAD21      	; jump if verify
		LDAA 	SHFTREG+1
		STAA 	0,X 
LOAD21	CMPA 	0,X         	; verify ram location
		BEQ  	LOAD20      	; jump if ram ok
		LDAA 	#$02
		STAA 	TMP3        	; indicate rom error
		STX  	PTR3        	; save error address
		BRA 	LOAD20      	; finish download
* calculate checksum
LOAD30	TST  	TMP3
		BNE  	LOAD10      	; jump if error already
		LDAA 	TMP4
		INCA             		; do checksum
		BEQ  	LOAD10      	; jump if s1 record okay
		LDAA 	#$03	
		STAA 	TMP3        	; indicate checksum error
		BRA  	LOAD10
LOAD90	JSR	putch
		JSR  	BYTE
		LDAB 	SHFTREG+1 		; b = byte count
LOAD91	JSR  	BYTE
		DECB
		BNE	LOAD91      	; loop until end of record
		INC	AUTOLF      	; turn on autolf
		LDX	#MSG11      	; "done" default msg
		LDAA	TMP3
		CMPA	#$02
		BNE	LOAD92      	; jump not rom error
		LDX  	#PTR3
		JSR  	OUT2BSP     	; address of rom error
		BRA	LOAD95
LOAD92	CMPA	#$01
		BNE	LOAD93     		; jump not rcv error
		LDX	#MSG14      	; "rcv error"
		BRA	LOAD94
LOAD93	CMPA	#$03
		BNE	LOAD94      	; jump not checksum error
		LDX	#MSG12      	; "checksum error"
LOAD94	JSR	OutStrg
		JSR	OutCRLF
LOAD95	RTS
**********
BYTE		PSHB
		PSHX
BYTE0		JSR	getch			; Read terminal
		JSR	putch
		JSR  	HEXBIN
BYTE1		JSR	getch			; Read terminal
		JSR	putch
		JSR  	HEXBIN
		LDAA 	SHFTREG+1
		ADDA 	TMP4
		STAA 	TMP4        	; add to checksum
		PULX
		PULB
		RTS
*****************
HEXBIN	PSHA
		PSHB
		PSHX
		CMPA	#'a'
		BLT	UpCas2			; jump if < a
		CMPA	#'z'
		BGT	UpCas2			; jump if > z
		SUBA	#$20
UpCas2	CMPA 	#'0'
		BLT  	HEXNOT       		; jump if a < $30
		CMPA 	#'9'
		BLE  	HEXNMB       		; jump if 0-9
		CMPA 	#'A'	
		BLT  	HEXNOT       		; jump if $39> a <$41
		CMPA 	#'F'
		BGT  	HEXNOT       		; jump if a > $46
		ADDA 	#$9 				; convert $A-$F
HEXNMB	ANDA 	#$0F         		; convert to binary
		LDX  	#SHFTREG
		LDAB 	#4
HEXSHFT	ASL  	1,X  				; 2 byte shift through
		ROL  	0,X        			; carry bit
		DECB
		BGT  	HEXSHFT      		; shift 4 times
		ORAA 	1,X
		STAA 	1,X
		BRA  	HEXRTS
HEXNOT	INC  	TMP1         		; indicate not hex
HEXRTS	PULX
		PULB
		PULA
		RTS
* ________________________________________________________________________________
*
* Do BF Command
*
LdMs1		FCC	'Missing or Incorect Addresses for Block Fill'
		FCB	0
BFILL		LDAA	CmdNm
		CMPA	#03
		BGE	BFO1
 		LDX	#LdMs1
		JSR	OutStrg;		; Print Error Message
		RTS
BFO1		LDAB	#00
		CMPA	#04
		BNE	BFO3
		LDAB	CmdD+1
BFO3		LDX	CmdA1
BFO2		STAB	0,X
		INX
		CPX	CmdA2
		BNE	BFO2	
		RTS
* ________________________________________________________________________________
*
* Do MOVE Command
*
ErrMM		FCC	'Missing or Incorect Addresses for Memory Move'
		FCB	0
MOVE 		LDAA	CmdNm
		CMPA	#03
		BGE	MMO1
 		LDX	#ErrMM
		JSR	OutStrg;		; Print Error Message
		RTS
MMO1		LDAB	#01
		CMPA	#04
		BNE	MMO3
		LDAB	CmdD+1
MMO3		LDX	CmdA1
		LDY	CmdA2
MMO2		LDAA	0,X
		STAA	0,Y
		INX
		INY
		DECB
		BNE	MMO2	
		RTS
* ________________________________________________________________________________
*
* Do MemDump Command
*
StM		FCC	'00'
StE		FCC	'00'
ErrMD		FCC	'Missing or Incorect Address for Memory Dump'
		FCB	0
MEMD 		LDX	CmdA1
		STX	StM
		LDAA	CmdNm
		CMPA	#01
		BNE	MEM1
 		LDX	#ErrMD
		JSR	OutStrg;		; Print Error Message
		RTS
MEM1		CMPA	#02
		BNE	MEM2
		LDY	CmdA1
		LDAB	#$0F
		ABY
		STY	StE
		BRA	GoPM
MEM2		LDX	CmdA2
		STX	StE
GoPM		LDX	#StM
		JSR	OUT2BSP
		LDAA	#'-'
		JSR	putch
		LDAA	#' '
		JSR	putch
		LDX	StM
		LDY	#$10
AgPM		JSR	OUT1BSP
		DEY
		BNE	AgPM
		JSR	OutCRLF
		LDD	StM
		ADDD	#16
		STD	StM
		CPD	StE
		BLE	GoPM
		RTS
* ________________________________________________________________________________
*
* Do MemModify Command
*
LdMs4		FCC	'Missing or Incorect Address / Data for Memory Modify'
		FCB	0
MMOD 		LDAA	CmdNm
		CMPA	#03
		BEQ	MM1
 		LDX	#LdMs4
		JSR	OutStrg;		; Print Error Message
		RTS
MM1		LDX	#CmdA1
		JSR	OUT2BSP
		LDAA	#':'
		JSR	putch
		LDAA	#' '
		JSR	putch
		LDX	CmdA1
		JSR	OUT1BSP
		LDAA	#'-'
		JSR	putch
		LDAA	#'>'
		JSR	putch
		LDAA	#' '
		JSR	putch
		LDAA	CmdA2+1
		LDX	CmdA1
		STAA	0,X
		JSR	OUT1BSP
		JSR	OutCRLF
		RTS
* ________________________________________________________________________________
*
* Do CALL Command
*
LdMs5		FCC	'Missing or Incorect Address for CALL'
		FCB	0
CALL		LDAA	CmdNm
		CMPA	#02
		BGE	COO1
 		LDX	#LdMs5
		JSR	OutStrg			; Print Error Message
		RTS
COO1		LDX	CmdA1
		JSR	0,X	
		RTS
* ________________________________________________________________________________
*
* Do GO Command
*
LdMs6		FCC	'Missing or Incorect Address for GO'
		FCB	0
GO		LDAA	CmdNm
		CMPA	#02
		BGE	GOO1
 		LDX	#LdMs6
		JSR	OutStrg			; Print Error Message
		RTS
GOO1		LDS	#$BFEF			; Initialize SP every time
		LDX	CmdA1
		JMP	0,X	
* ________________________________________________________________________________
*
* Get and Put Character [with wait] (AccA) to/from Serial Line
*
getch		LDAA	SCSR
		ANDA	#RDRF
		BEQ	getch
		LDAA	SCDR
		RTS
*	
putch		LDAB	SCSR
		ANDB	#TDRE
		BEQ	putch
		STAA	SCDR
		RTS
*	
Getky		LDX	#DPrt			; Anounce to terminal
		JSR	OutStrg
wtky		LDAA	SCSR			; Get Character
		ANDA	#RDRF
		BEQ	wtky
		LDAA	SCDR
		STAA	KEY
		JSR	putch			; Write Character back to terminal
		CMPA	#'0'			; Check if 0 - 9
		BLT	STR0
		CMPA	#'9'
		BGT	HexU
		SUBA	#48
		RTS
HexU		CMPA	#'A'			; Check if A - F
		BLT	STR0
		CMPA	#'F'
		BGT	HexL
		SUBA	#55
		RTS
HexL		CMPA	#'a'			; Check if a - f
		BLT	STR0
		CMPA	#'f'
		BGT	STR0
		SUBA	#87
		RTS
STR0		LDAA	#$00
		RTS
DPrt		FCC	'Data = '
EDP		FCB	$00
*
OutStrg	JSR	OutCRLF
OUTS0		LDAA	0,X			; read char into acc A
		BEQ	OUTS3       	; jump if End
		JSR	putch			; output character
		INX
		BRA	OUTS0			; jump if no input
OUTS3		RTS
*
OutCRLF	LDAA	#$0D        	; Carriage Return
		JSR	putch			; output acc A
		LDAA	#$0A
		JSR	putch			; output Line Feed
		RTS
OUTLHLF	LSRA				; shift data to right
		LSRA
		LSRA
		LSRA
OUTRHLF	ANDA	#$0F			; mask top half
		ADDA	#$30			; convert to ascii
		CMPA	#$39
		BLE	OUTA         	; jump if 0-9
		ADDA	#$07         	; convert to hex A-F
OUTA		JSR	putch			; output character
		RTS
OUT1BYT	PSHA
		LDAA 	0,X          	; get data in a
		PSHA    	          	; save copy
		BSR  	OUTLHLF 	     	; output left half
		PULA              	; retrieve copy
		BSR	OUTRHLF      	; output right half
		PULA
		INX
		RTS
OUT2BSP	JSR	OUT1BYT         	; do first byte
OUT1BSP	JSR  	OUT1BYT         	; do next byte
OUTSPAC	LDAA 	#$20            	; output a space
		JSR	putch
		RTS
* ________________________________________________________________________________
*
*  Write the Byte value in AccA to the buffer (by X Reg) as two letters ie '0C'
*
StAv		FCB	0
PNum		STAA	StAv			; High Nibble
		RORA
		RORA
		RORA
		RORA
		ANDA	#$0F
		CMPA	#09
		BLE	NoAd1
		ADDA	#07
NoAd1		ADDA	#48
		STAA	$00,X
		LDAA	StAv			; Low Nibble
		ANDA	#$0F
		CMPA	#09
		BLE	NoAd2
		ADDA	#07
NoAd2		ADDA	#48
		STAA	$01,X
		RTS
* ________________________________________________________________________________
*
* Sound Speaker at tone FREQ for length DUR
*
MNoise	LDD	DUR
		PSHA				; preserve these values
		PSHB
		MUL
		XGDY				; duration counter now in index Y
		LDAB	FREQ
		BNE	OKAY
		LDAB	#$01
OKAY		CLRA
		XGDX				; freq now in index X
		LDD	#PERIOD
		IDIV				; index X contains delay for correct frequency
		STX	DUR
*
		LDAA	BASE			; initiliase timer
		ANDA	#PA3_M		; make PA3 not under OC1 control
		STAA	BASE	
		LDAA	TCTL1
		ANDA	#SET_T
		INCA				; bit0 =1 , bit1 =0: toggle mode for PA3
		STAA	TCTL1
*
		LDAA	#FCM			; clear OC5 flag
		STAA	TFLG1
*
		LDD	TCNT			; set current count+period in output compare reg
		ADDD	DUR
		STD	TOC5
*						; wait until count is reached
AGAIN		LDX	#TIME
LP20		LDAA	TFLG1			; read flags
		ANDA	#FCM			; isolate OC5 flag
		BEQ	LP20			; if not set then wait
*
		LDAA	#FCM			; if flag set then ...............
		STAA	TFLG1			; clear OC5 flag
		LDD	TOC5
		ADDD	DUR			; update OC5 register
		STD	TOC5
		DEX
		BNE	LP20			; go again for 10 cycle loop
		DEY
		BNE	AGAIN
*
		LDAA	TCTL1			; turn buzzer off
		ANDA	#SET_T
		STAA	TCTL1
		PULB				; restore settings
		PULA
		STD	DUR
		RTS		
* ________________________________________________________________________________
*
* POWER UP and READ A/D CONVERTERS ROUTINES
*
POWER		PSHX				;Preserve IX
		LDX	#BASE			;Points to register
		BSET	OPT,X $80		;ADPU = 1 to power up.
		BCLR	OPT,X $40		;CSEL = 0 to select E clock. need to wait for 100 us for A/D to warm up	(but not done here).
		PULX				;restore IX	
		RTS
*						;Analog port should be in ACCB.
AD_INP	SEI				;Turn off System interrupts
		PSHX				;Preserve IX
		LDX	#BASE			;Points to register
		ANDB	#%00000111		;Set SCAN =0 & MULI = 0, ANx in low 3 bits(CC CB CA).
		STAB	ADCTL,X		;Store port select value
		BRCLR	ADCTL,X $80	*	;Wait for conversion to finish (i.e. CCF = 1)
		LDAB	ADR4,X      	;Load result
		CLI				;Enable other interrupts
		PULX				;Restore IX
		STAB	AD_POS		;Store value in buffer
		RTS
*
*  READ FROB KNOB VALUE AND STORE TO BUFFER KNB_POS
*
KNB_IN	LDAB	#$07			; Frob knob is at AD num 7
		JSR	AD_INP
		STAB	KNB_POS
		RTS
* ________________________________________________________________________________
*
* Write Display Buffer to Screen
*
WrtDis	LDAA	#$00			
		LDAB	#$03			; Home and Clear Display
		JSR	LCDrout
		LDX	#Line1
PL1		LDAA	#$02			; Tell to Print
		LDAB	$00,X
		JSR	LCDrout
		INX
		CPX	#Line2
		BNE	PL1
*	
		LDX	#24
NewL		LDAA	#$02			; Tell to Get to Next Line
		LDAB	#40
		JSR	LCDrout
		DEX
		BNE	NewL
*	
		LDX	#Line2
PL2		LDAA	#$02			; Tell to Print
		LDAB	$00,X
		JSR	LCDrout
		INX
		CPX	#Lend
		BNE	PL2
		RTS
* ________________________________________________________________________________
*
* Clear Display Buffer
*	
ClrDis	LDAA	#32
		LDX	#Line1
Clr1		STAA	0,X
		INX
		CPX	#Lend
		BNE	Clr1
		RTS
* ________________________________________________________________________________
*
* Reserve Data for Display Buffer
*
Verson	FCC	'HandyBoard      Buffalo     V2.1'
LngMSG	FCC	'Line is to Long!'
Mend		FCB	$00
* ________________________________________________________________________________
*
*  Copy print routine to Zero Page
*
CPYprt	LDX	#SCRbeg
		LDY	#LCDrout
LCDloop	LDAA	0,X
		STAA	0,Y
		INX
		INY
		CPX	#SCRend
		BNE	LCDloop
		RTS
* ________________________________________________________________________________
*
*   Print Routine:  A - Command, B - Data
*     Copied to Zero Page memory and Run there
*
SCRbeg	SEI				; disable interrupts
		STX	LCDtmpX
		LDX	#$1000
		BCLR	HPRIO,X %00100000	; put into single chip mode
		BCLR	PORTA,X %00010000	; turn off LCD E line
		STAA	LCDtmpA		; Temp A store
		CLR	DDRC,X		; make port C input
LCDBsy	LDAA	#1
		STAA	PORTB,X		; read operation from LCD (AKF-added ',X')
		BSET	PORTA,X %00010000	; frob LCD on
		LDAA	PORTC,X		; get status
		BCLR	PORTA,X %00010000	; frob LCD off
		ANDA	#$80			; bit 7 is busy flag
		BNE	LCDBsy
		LDAA	#$FF
		STAA	DDRC,X		; make port C output
		LDAA	LCDtmpA		; Temp A store
		STAA	PORTB,X		; high byte is control
		STAB	PORTC,X		; low byte is data
		BSET	PORTA,X %00010000
		BCLR	PORTA,X %00010000	; frob LCD
		BSET	HPRIO,X %00100000	; put into expanded chip mode
		LDX	LCDtmpX
		CLI				; enable interrupts
		RTS				; return to monitor command loop
SCRend	FCB	00
*
