Saynum16.asm
Functions Provided
Entry point | Function provided | Notes |
---|---|---|
SAYNUM16 | Speak a 16-bit decimal number via the Intellivoice | Queues the number fragments using IV_PLAYW. The call will block if the voice queue lacks enough room to queue the number. Uses RESROM samples to say the number. |
See source code below for calling convention.
Examples
(todo... please contribute!)
Notes
This function requires the Intellivoice driver in ivoice.asm, and the symbols defined in resrom.asm.
There's an alternate version of this code that speaks numbers using the SP0256-AL2 allophones. (Link to be added.)
Source Code
;* ======================================================================== *; ;* These routines are placed into the public domain by their author. All *; ;* copyright rights are hereby relinquished on the routines and data in *; ;* this file. -- Joseph Zbiciak, 2008 *; ;* ======================================================================== *; ;; ======================================================================== ;; ;; NAME ;; ;; IV_SAYNUM16 Say a 16-bit unsigned number using RESROM digits ;; ;; ;; ;; AUTHOR ;; ;; Joseph Zbiciak <intvnut AT gmail.com> ;; ;; ;; ;; REVISION HISTORY ;; ;; 16-Sep-2002 Initial revision . . . . . . . . . . . J. Zbiciak ;; ;; ;; ;; INPUTS for IV_INIT ;; ;; R0 Number to "speak" ;; ;; R5 Return address ;; ;; ;; ;; OUTPUTS ;; ;; ;; ;; DESCRIPTION ;; ;; "Says" a 16-bit number using IV_PLAYW to queue up the phrase. ;; ;; Because the number may be built from several segments, it could ;; ;; easily eat up the queue. I believe the longest number will take ;; ;; 7 queue entries -- that is, fill the queue. Thus, this code ;; ;; could block, waiting for slots in the queue. ;; ;; ======================================================================== ;; IV_SAYNUM16 PROC PSHR R5 TSTR R0 BEQ @@zero ; Special case: Just say "zero" ;; ------------------------------------------------------------ ;; ;; First, try to pull off 'thousands'. We call ourselves ;; ;; recursively to play the the number of thousands. ;; ;; ------------------------------------------------------------ ;; CLRR R1 @@thloop: INCR R1 SUBI #1000, R0 BC @@thloop ADDI #1000, R0 PSHR R0 DECR R1 BEQ @@no_thousand CALL IV_SAYNUM16.recurse CALL IV_PLAYW DECLE RESROM.thousand @@no_thousand PULR R1 ;; ------------------------------------------------------------ ;; ;; Now try to play hundreds. ;; ;; ------------------------------------------------------------ ;; MVII #RESROM.zero-1, R0 CMPI #100, R1 BNC @@no_hundred @@hloop: INCR R0 SUBI #100, R1 BC @@hloop ADDI #100, R1 PSHR R1 CALL IV_PLAYW.1 CALL IV_PLAYW DECLE RESROM.hundred PULR R1 B @@notrecurse ; skip "PSHR R5" @@recurse: PSHR R5 ; recursive entry point for 'thousand' @@no_hundred: @@notrecurse: MOVR R1, R0 BEQ @@leave SUBI #20, R1 BNC @@teens MVII #RESROM.twenty-1, R0 @@tyloop INCR R0 SUBI #10, R1 BC @@tyloop ADDI #10, R1 PSHR R1 CALL IV_PLAYW.1 PULR R0 TSTR R0 BEQ @@leave @@teens: @@zero: ADDI #RESROM.zero, R0 CALL IV_PLAYW.1 @@leave PULR PC ENDP ;; ======================================================================== ;; ;; End of File: saynum16.asm ;; ;; ======================================================================== ;;