; SIODEMO.ASM
; READ ANALOG INPUT AI0 OF INDUSTROLOGIC SIO-1000 AND DISPLAY AS DECIMAL

TEMPH	EQU	34H		;TEMPORARY STORAGE
TEMPL	EQU	35H
TEMPBCD	EQU	0C000H		;DISPLAY BUFFER IN USER RAM

	ORG	8000H		;MUST ALWAYS BE ORG'ED AT 8000H FOR SBC-1

SIODEMO:CLR	C		;(C3 HEX) NEEDED ONLY IF USING AUTOBOOT

REPEAT:	MOV	A,#2		;PORT 2
	CALL	51H		;SELECT SERIAL PORT ROUTINE IN JUMP TABLE
	MOV	A,#6		;9600 BAUD
	CALL	4EH		;SELECT BAUD RATE ROUTINE IN JUMP TABLE

	MOV	A,#1BH		;ESCAPE (TO CLEAR SIO-1000)
	CALL	3CH		;SERIAL CHARACTER OUT ROUTINE IN JUMP TABLE
	MOV	A,#'A'		;SIO-1000 COMMAND TO READ A/D CHANNEL 0
	CALL	3CH		;SERIAL CHARACTER OUT ROUTINE IN JUMP TABLE
	MOV	A,#0DH		;CARRIAGE RETURN
	CALL	3CH		;SERIAL CHARACTER OUT ROUTINE IN JUMP TABLE

	MOV	A,#100		;DELAY IN MILLISECONDS
	CALL	45H		;DELAY IN MILLISECONDS ROUTINE IN JUMP TABLE

	MOV	A,#1		;PORT 1
	CALL	51H		;SELECT SERIAL PORT ROUTINE IN JUMP TABLE
	MOV	A,#6		;9600 BAUD
	CALL	4EH		;SELECT BAUD RATE ROUTINE IN JUMP TABLE

	CALL	39H		;SERIAL IN STATUS ROUTINE IN JUMP TABLE
	JC	REPEAT		;SEND ANOTHER REQUEST IF NO MORE CHARACTERS
	CALL	33H		;SERIAL IN ROUTINE IN JUMP TABLE (A)
	CALL	33H		;SERIAL IN ROUTINE IN JUMP TABLE (HIGH NIBBLE)
	CALL	HEX2BIN		;CONVERT HEX ASCII CHARACTER INTO BINARY
	MOV	TEMPH,A		;SAVE UPPER NIBBLE
	CALL	33H		;SERIAL IN ROUTINE IN JUMP TABLE (MIDDLE NIBBLE)
	CALL	HEX2BIN		;CONVERT HEX ASCII CHARACTER INTO BINARY
	SWAP	A		;PUT IN HIGH NIBBLE
	MOV	TEMPL,A		;SAVE MIDDLE NIBBLE
	CALL	33H		;SERIAL IN ROUTINE IN JUMP TABLE (LOW NIBBLE)
	CALL	HEX2BIN		;CONVERT HEX ASCII CHARACTER INTO BINARY
	ORL	A,TEMPL		;ADD LOWER NIBBLE
	MOV	TEMPL,A		;SAVE IT BACK
	CALL	33H		;SERIAL IN ROUTINE IN JUMP TABLE (CR)
	CALL	33H		;SERIAL IN ROUTINE IN JUMP TABLE (LF)

	CALL	HEX2BCD		;CONVERT 12 BIT VALUE TO 4 DIGIT BCD
	MOV	DPTR,#TEMPBCD	;POINT TO BCD VALUE
	CALL	3FH		;SERIAL STRING OUT ROUTINE IN JUMP TABLE
	CALL	42H		;CR/LF OUT ROUTINE IN JUMP TABLE
	JMP	REPEAT		;SEND ANOTHER REQUEST	



; CONVERT HEX ASCII CHARACTER IN ACC TO BINARY IN ACC
HEX2BIN:CLR	C		;NEEDED FOR SUBTRACTION
	SUBB	A,#30H		;CONVERT 0-9 TO BINARY
	CJNE	A,#11H,H2B	;SEE IF IT WAS A-F
H2B:	JC	H2B1		;NO, CONTINUE
	CLR	C		;NEEDED FOR SUBTRACTION
	SUBB	A,#7		;NEED TO SUBTRACT MORE FOR A-F
H2B1:	RET


; CONVERT 12 BIT VALUE IN TEMPH:TEMPL TO 4 DIGIT BCD IN TEMPBCD
HEX2BCD:MOV	DPTR,#TEMPBCD	;POINT TO STORAGE
	MOV	R2,#0		;CLEAR THOUSANDS COUNT
B12:	MOV	A,TEMPL		;GET LOW BYTE OF A/D VALUE
	CLR	C		;NEEDED FOR SUBTRACTION
	SUBB	A,#0E8H		;LOWER BYTE OF 1000D
	MOV	R4,A		;TEMPORARY SAVE
	MOV	A,TEMPH		;GET HIGH BYTE OF A/D VALUE
	SUBB	A,#03H		;UPPER BYTE OF 1000D
	MOV	R3,A		;TEMPORARY SAVE
	JC	B13		;SUBTRACTED TOO MUCH, CONTINUE TO 100D
	MOV	TEMPL,R4	;NO ROLL UNDER, SAVE SUBTRACTED A/D VALUE
	MOV	TEMPH,R3
	INC	R2		;INDICATE ONE MORE 1000
	JMP	B12

B13:	MOV	A,R2		;GET 1000 DIGIT
	ADD	A,#30H		;CONVERT TO ASCII
	MOVX	@DPTR,A		;SAVE 1000 DIGIT
	INC	DPTR		;POINT TO NEXT LOCATION

	MOV	R2,#0		;CLEAR HUNDREDS COUNT
B14:	MOV	A,TEMPL		;GET LOW BYTE OF A/D VALUE
	CLR	C		;NEEDED FOR SUBTRACTION
	SUBB	A,#64H		;LOWER BYTE OF 100D
	MOV	R4,A		;TEMPRARY SAVE
	MOV	A,TEMPH		;GET HIGH BYTE OF A/D VALUE
	SUBB	A,#0		;UPPER BYTE OF 100D
	MOV	R3,A		;TEMPORARY SAVE
	JC	B15		;SUBTRACTED TOO MUCH, CONTINUE TO 10D
	MOV	TEMPL,R4	;NO ROLL UNDER, SAVE SUBTRACTED A/D VALUE
	MOV	TEMPH,R3
	INC	R2		;INDICATE ONE MORE 100
	JMP	B14

B15:	MOV	A,R2		;GET 100 DIGIT
	ADD	A,#30H		;CONVERT TO ASCII
	MOVX	@DPTR,A		;SAVE 100 DIGIT
	INC	DPTR		;POINT TO NEXT LOCATION

	MOV	A,TEMPL		;GET LOW BYTE OF A/D VALUE
	MOV	B,#10		;DIVIDE BY 10
	DIV	AB
	ADD	A,#30H		;CONVERT TO ASCII
	MOVX	@DPTR,A		;SAVE TENS DIGIT
	INC	DPTR		;POINT TO NEXT LOCATION
	MOV	A,B		;GET ONES DIGIT
	ADD	A,#30H		;CONVERT TO ASCII
	MOVX	@DPTR,A		;SAVE ONES DIGIT
	INC	DPTR		;POINT TO NEXT LOCATION
	MOV	A,#0
	MOVX	@DPTR,A		;TERMINATE WITH A ZERO
	RET

	END			;NEEDED BY MANY ASSEMBLER PROGRAMS
