	opt c+,d+
	
; speech output

openlib	= -30-378
closelib 	= -414
execbase	= 4

; calls to amiga dos

open	= -30
close	= -30-6
opendevice	= -444
closedev	= -450
addport	= -354
remport	= -360
doio	= -456
sendio	= -462
abortio	= -480
read	= -30-12
write	= -30-18
myinput	= -30-24
output	= -30-30
currdir	= -30-96
exit	= -30-114
waitforch	= -30-174
findtask	= -294
translate	= -30
mode_old	= 1005
mode_new	= 1006
alloc_abs	= -$cc
freemem	= -$d2

; !!! when >500kb !!! or place in chip memory
; org $40000
; load $40000
; !!!!!!!!!!!!!!


run:
	bsr init	; initialisation
	bra test	; system-test
	
init:		; system initialisation and open
	move.l execbase,a6 ; pointer to exec library
	move.l dosname(pc),a1 ; pointer to dosname
	moveq #0,d0	; version: not important
	jsr openlib(a6)	; open dos library
	move.l d0,dosbase ; save handle
	beq error	; error routine
	
; open translator library

	move.l execbase,a6 ; pointer to exec library
	move.l transname,a1 ; pointer to translator name
	clr.l d0	
	jsr openlib(a6)	; open translator
	move.l d0,tranbase ; save handle
	beq error	; error routine
	
; set-up

	sub.l a1,a1
	move.l execbase,a6
	jsr findtask(a6) ; find task
	move.l d0,nwrrep+2
	
	lea nwrrep,a1
	jsr addport(a6)	; add port

; open narrator device

	lea talkio,a1	; pointer to i/o area in a1
	move.l #nwrrep,14(a1) ; enter port address
	clr.l d0	; number 0
	clr.l d1	; no flags
	lea nardevice,a0 ; pointer to device name
	jsr opendevice(a6) ; open narrator.device
	tst.l d0	; error?
	bne error	; yes
	
; set-up for narrator device

bp:	
	lea talkio,a1	; pointer to i/o in a1
	move.l #nwrrep,14(a1) ; enter port address
	move.l #amaps,48+8(a1) ; pointer to audio mask
	move #4,48+12(a1) ; size of mask
	
	lea consolname(pc),a1 ; console definition
	move.l #mode_old,d0 
	bsr openfile	; console open
	beq error
	move.l d0,conhandle
	
	rts
	
test:
	move.l #mytext,d0
	bsr pmsg	; text text output
	bsr sayit	; say text
	bsr readin	; input
	move #10,d0	
	bsr pchar	; lf output
	move.l #inline+2,d0
	bsr pmsg
	bsr pcrlf
	bra qu
	
error:
	move.l #-1,d7	; flag
qu:	
	move.l execbase,a6
	lea talkio,a1
	jsr abortio(a6)
	
	move.l conhandle,d1 ; window close
	move.l dosbase,a6
	jsr close(a6)
	
	move.l dosbase,a1 ; dos library close
	move.l execbase,a6
	jsr closelib(a6)
	
	lea nwrrep,a1	; remove port
	jsr remport(a6)
	lea talkio,a1
	jsr closedev(a6) ; close narrator device
	move.l tranbase,a1
	jsr closelib(a6) ; close translator library
	rts
	
openfile:		; open file 
	move.l a1,d1	; pointer to i/o definition text
	move.l d0,d2	
	move.l dosbase,a6
	jsr open(a6)
	tst.l d0
	rts
	
pmsg:		; print message (d0)
	movem.l d0-d7/a0-a6,-(sp)
	move.l d0,a0
	move.l a0,d2
	clr.l d3
mess1:
	tst.b (a0)+
	beq mess2
	addq.l #1,d3
	bra mess1	; length calculate
mess2:
	move.l conhandle,d1
	move.l dosbase,a6
	jsr write(a6)
	movem.l (sp)+,d0-d7/a0-a6
	rts
pcrlf:	
	move #10,d0
	bsr pchar
	move #13,d0
	
pchar:		; output character in d0
	movem.l d0-d7/a0-a6,-(sp) ; save all
	move.l conhandle,d1
pch1:
	lea chbuff,a1
	move.b d0,(a1)
	move.l a1,d2
	move.l #1,d3	; 1 letter
	move.l dosbase,a6
	jsr write(a6)
	movem.l (sp)+,d0-d7/a0-a6
	rts
	
scankey:		; test key
	move.l conhandle,d1
	move.l #500,d2	; wait value
	move.l dosbase,a6
	jsr waitforch(a6)
	tst.l d0
	rts
	
readin:		; input from keyboard
	movem.l d0-d7/a0-a6,-(sp) ; save registers
	lea inline+2,a2 ; pointer to input buffer
	clr.l (a2)
inplop:	
	bsr getchr
	cmp.b #8,d0
	beq backspace
	cmp.b #127,d0	; delete?
	beq backspace
	bsr pchar	; character output
	cmp.b #13,d0
	beq inputx
	move.b d0,(a2)+
	bra inplop
inputx:
	clr.b (a2)+
	sub.l #inline,a2
	move a2,inline	; length is inline+1
	movem.l (sp)+,d0-d7/a0-a6
	rts

backspace:
	cmp.l #inline,a2 ; at the beginning?
	beq inplop	; yes
	move.b #8,d0
	bsr pchar
	move #32,d0
	bsr pchar
	move #8,d0
	bsr pchar
	clr.b (a2)
	subq.l #1,a2
	bra inplop

getchr:		; get one character from the keyboard
	move.l #1,d3	; one character
	move.l conhandle,d1
	lea inbuff,a1	; buffer address
	move.l a1,d2
	move.l dosbase,a6
	jsr read(a6)
	clr.l d0
	move.b inbuff,d0
	rts
	
sayit:
	lea intext,a0
	move.l #outtext-intext,d0
	lea outtext,a1
	move.l #512,d1
	move.l tranbase,a6
	jsr translate(a6)
	
p:
	lea talkio,a1
	move #3,28(a1)	;??
	move.l #512,36(a1)
	move.l outtext,40(a1)
	move.l execbase,a6
	jsr sendio(a6)
	rts
	
mytext:	dc.b 'this is our test-text',10,13,10,13,0,0
	even
dosname:	dc.b 'dos.library',0,0
	even
transname:	dc.b 'translator.library',0
	even
dosbase:	dc.l 0
	even
tranbase:	dc.l 0
	even
consolname:	dc.b 'CON:0/100/640/100/* SPEECH TEST *',0
	even
nardevice:	dc.b 'narrator.device',0
	even
amaps:	dc.b 3,5,10,12,0,0
	even
conhandle:	dc.l 0

inbuff:	ds.b 8

inline:	ds.b 180
	dc.b 0
chbuff:	ds.b 82
	dc.b 0
narread:	ds.l 20
	dc.l 0
talkio:	ds.l 20
	dc.l 0
nwrrep:	ds.l 8
	dc.l 0
intext:	dc.b 'hello, i am the amiga computer',0
	even
outtext:	ds.l 128
	dc.l 0
	
