Difference between revisions of "Saynum16.asm"
(→Notes) |
|||
| Line 14: | Line 14: | ||
= Notes = | = Notes = | ||
| − | This function requires the Intellivoice driver in [[ivoice.asm]]. | + | 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.) | There's an alternate version of this code that speaks numbers using the SP0256-AL2 allophones. (Link to be added.) | ||
Revision as of 19:52, 13 September 2008
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 ;;
;; ======================================================================== ;;