home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gold Fish 1
/
GoldFishApril1994_CD1.img
/
d2xx
/
d203
/
examples
/
speechtoy
/
speechtoy.asm
< prev
next >
Wrap
Assembly Source File
|
1989-04-29
|
48KB
|
1,776 lines
XREF _LVOAllocMem,_LVOFreeMem
XREF _LVOFreeSignal,_LVOAllocSignal
XREF _LVOOffGadget,_LVOOnGadget,_LVOAddGadget,_LVORemoveGadget
XREF _LVOTranslate
XREF _LVOAbortIO,_LVOSendIO,_LVODoIO
XREF _LVOAutoRequest
XREF _LVOWaitBOVP
XREF _LVODisplayBeep
XREF _LVOReplyMsg,_LVOGetMsg,_LVOPutMsg,_LVOWait
XREF _LVOSetMenuStrip
XREF _LVORefreshGadgets
XREF _LVORectFill,_LVOMove,_LVODraw,_LVOText
XREF _LVOSetAPen
XREF _LVOOpenWindow,_LVOCloseWindow
XREF _LVOFindTask
XREF _LVOOpenDevice,_LVOCloseDevice
XREF _LVOOpenLibrary,_LVOCloseLibrary
XREF _SysBase,_DOSBase,_exit ;from StartUp.o
; This program is probably copyright Commodore-Amiga. It was mailed
; to me directly by Bruce Barrett at Commodore-Amiga in response to a
; to a question about a previous version's copyright status. I
; therefore assume that it is Commodore-Amiga's intention that this
; program be freely redistributable. Fred Fish, 3-Jan-86.
;
; This program was written to show the use of gadgets in a
; window. Thus one menu, one auto requester, but lots of gadget types.
; For the sake of example, two mutual exclude gadgets
; (female/male) are shown that perform a function that might
; be better implemented as a toggle image, in a manner similar
; to that shown in the inflection Mode gadget.
; Again for the sake of example, the proportional gadgets
; are generated dynamicly (that is, copied from a template and
; filled in), whereas most gadgets are declared staticly in
; the struct declaration, which saves the initialization code space.
; Lastly, for the sake of example, this program is extremely
; verbose in the way of comments. Hope you don't mind.
;
; Written by David M Lucas.
; Pen numbers to draw gadget borders/images/text with
;REDP equ 3 ; color in register 3 once was red
;BLKP equ 2 ; color in register 2 was black
;WHTP equ 1 ; color in register 1 was white
;BLUP equ 0 ; color in register 0 was blue
XDEF open_libs
open_libs:
movea.l _SysBase,a6
;-------Open Intuition--------
moveq #33,d0 ;VERSION #33
lea IntuitionTitle,a1
jsr _LVOOpenLibrary(a6)
move.l d0,_IntuitionBase
beq.s errLib
;----Open Graphics--------
moveq #33,d0 ;VERSION #33
lea GraphicsTitle,a1
jsr _LVOOpenLibrary(a6)
move.l d0,_GfxBase
beq.s errLib
;----Open Graphics--------
moveq #33,d0 ;VERSION #33
lea TranslatorTitle,a1
jsr _LVOOpenLibrary(a6)
move.l d0,_TranslatorBase
errLib rts
XDEF _main
_main:
link a5,#-14
;=======Open those libraries that the program uses directly======
bsr.s open_libs
bne.s OP
.7 bsr exit_program ;never returns
;=======Open the Narrator Device========
OP lea VoiceIOB,a1
movea.l a1,a2
moveq #0,d0
moveq #0,d1
lea Narrator,a0
jsr _LVOOpenDevice(a6)
move.b d0,_NarratorOpenError
bne.s .7
;=====Copy the VoiceIOB defaults to MouthIO, and initialize a few fields=====
lea MouthIO,a0
movea.l a0,a1
moveq #17-1,d0
cpy move.l (a2)+,(a0)+
Dbra d0,cpy
move.w (a2),(a0)
;----Store the address of ReadPort
move.l #ReadPort,14(a1)
;----Change the Command to CMD_READ (instead of CMD_WRITE)
move.w #2,28(a1)
;======Now allocate memory accessable by the chips for images======
bsr get_chip_mem
beq.s .7
;=======Allocate signals/setup Talk and Read ports=========
moveq #-1,d0
movea.l _SysBase,a6
jsr _LVOAllocSignal(a6)
move.b d0,TalkPort+15
bmi.s .7
suba.l a1,a1
jsr _LVOFindTask(a6)
move.l d0,TalkPort+16
move.l d0,ReadPort+16
moveq #-1,d0
jsr _LVOAllocSignal(a6)
move.b d0,ReadPort+15
bmi.s .7
;========Open the ControlWindow===========
movea.l _IntuitionBase,a6
move.l _FaceWindow,d0
bne.s .49
;----------Open the Window----------------
lea _NewControlWindow,a0
jsr _LVOOpenWindow(a6)
move.l d0,_ControlWindow
beq .7
movea.l d0,a0
move.l 50(a0),RastPort
;-----Attach Menu Strip to window---------
;WindowPtr in a0
lea Menu0,a1
jsr _LVOSetMenuStrip(a6)
;=======fill background of window=========
.49 moveq #2,d0
movea.l RastPort,a1
movea.l _GfxBase,a6
jsr _LVOSetAPen(a6)
movea.l _ControlWindow,a0
moveq #0,d3
move.w 114(a0),d3
moveq #0,d2
move.w 112(a0),d2
moveq #0,d1
moveq #0,d0
movea.l 50(a0),a1
jsr _LVORectFill(a6)
;----RefreshGadgets
suba.l a2,a2
movea.l _ControlWindow,a1
lea PropGadget3,a0
movea.l _IntuitionBase,a6
jsr _LVORefreshGadgets(a6)
;====================IDCMP MAIN LOOP==============================
;---Wait for a message sent to ControlWindow's, FaceWindow's, VoiceIOB's
; (TalkPort), or MouthIO's (ReadPort) message port
.53 move.l _ControlWindow,a0
move.l 86(a0),a1
moveq #0,d0
move.b 15(a1),d1
Bset.l d1,d0
move.l _FaceWindow,a0
move.l 86(a0),a1
move.b 15(a1),d1
Bset.l d1,d0
movea.l VoiceIOB+14,a0
move.b 15(a0),d1
Bset.l d1,d0
movea.l MouthIO+14,a0
move.b 15(a0),d1
Bset.l d1,d0
movea.l _SysBase,a6
jsr _LVOWait(a6)
move.l d0,-4(a5)
;================now check to see to what we owe the intrusion========
;---Check for message from ControlWindow
move.l _ControlWindow,a0
move.l 86(a0),a1
move.b 15(a1),d1
Bclr.l d1,d0
beq .54
;----Get the message
.55 movea.l _ControlWindow,a1
movea.l 86(a1),a0
movea.l _SysBase,a6
jsr _LVOGetMsg(a6)
move.l d0,_MyIntuiMessage
beq.s .54
;-----Get all the needed info and give message back
movea.l d0,a1
move.l 20(a1),-(sp) ;Class
move.w 24(a1),-10(a5) ;Code
move.l 28(a1),-14(a5) ;IAddress
jsr _LVOReplyMsg(a6)
move.l (sp)+,d0
sub.l #64,d0
beq.s .60
sub.l #192,d0
beq.s .59
sub.l #256,d0
bne.s .64
;================case CLOSEWINDOW:================
;---Empty the window's message port
.61 movea.l _SysBase,a6
.LL movea.l _ControlWindow,a1
movea.l 86(a1),a0
jsr _LVOGetMsg(a6)
move.l d0,d1
beq .7
move.l d0,a1
jsr _LVOReplyMsg(a6)
bra.s .LL
;===============case MENUPICK:===================
.59 movea.l _ControlWindow,a0
move.w -10(a5),d0
bsr handle_menu
bra.s .55
;==============case GADGETUP: reply, then process==========
.60 movea.l -14(a5),a1
bsr handle_up
bra .55
;=================default:==================
.64 bra .55
;=======Check for activity in FaceWindow=============
.54 movea.l _FaceWindow,a0
movea.l 86(a0),a1
move.b 15(a1),d1
move.l -4(a5),d0
Bclr.l d1,d0
beq.s .65
.66 movea.l _FaceWindow,a1
movea.l 86(a1),a0
movea.l _SysBase,a6
jsr _LVOGetMsg(a6)
move.l d0,_MyIntuiMessage
beq.s .65
move.l d0,a1
move.l 20(a1),d0
subq.l #1,d0
beq.s .70
subq.l #1,d0
beq.s .72
sub.l #254,d0
bne.s .73
;===============case MENUPICK:================
.71 movea.l _FaceWindow,a0
move.w 24(a1),d0
bsr handle_menu
; bra.s .70
;===============case SIZEVERIFY:==============
.70:
;===============DEFAULT:=====================
.73 movea.l _MyIntuiMessage,a1
movea.l _SysBase,a6
jsr _LVOReplyMsg(a6)
bra.s .66
;==============case NEWSIZE: Don't reply until processed=======
.72 bsr draw_face
bra.s .70
;=============A voice SendIO (Write) has completed============
.65 movea.l _IntuitionBase,a6
move.l VoiceIOB+14,a0
move.b 15(a0),d1
move.l -4(a5),d0
Bclr.l d1,d0
beq .74
;======Was it Sucessful? filter out the abort error======
cmpi.b #-2,VoiceIOB+31
bne.s .75
clr.b VoiceIOB+31
;----Check for error
.75 move.b VoiceIOB+31,d0
beq .76
;-----flash this screen, if error
movea.l _ControlWindow,a1
movea.l 46(a1),a0
jsr _LVODisplayBeep(a6)
;=====let user see where phoneme string was bad.
;------Remove PhonStrGadget
lea _PhonStrGadget,a1
movea.l _ControlWindow,a0
jsr _LVORemoveGadget(a6)
move.w d0,_i
;move the cursor to the error char
;PhonInfo.BufferPos = VoiceIOB's message.io_Actual -1
move.l VoiceIOB+32,d0
subq.l #1,d0
move.w d0,_PhonInfo+8
; assure cursor (error point) is shown in gad.
; within 29 (number of chars shown) of front
;if (VoiceIOB's message.io_Actual < 29)
;PhonInfo.DispPos = 0
;within 29 of end
cmpi.l #29,VoiceIOB+32
bcc.s .77
clr.w _PhonInfo+12
bra.s .78
;else if ((VoiceIOB's message.io_Length -
;VoiceIOB's message.io_Actual) < 29)
;PhonInfo.DispPos = VoiceIOB's message.io_Length
.77 move.l VoiceIOB+36,d0
move.l d0,d1
sub.l VoiceIOB+32,d0
cmpi.l #29,d0
bcc.s .79
subi.l #29,d1
move.w d1,_PhonInfo+12
bra.s .78
;PhonInfo.DispPos = VoiceIOB's message.io_Actual - 15
.79 move.l VoiceIOB+32,d0
subi.l #15,d0
move.w d0,_PhonInfo+12
;------Add PhonStrGadget
.78 moveq #0,d0
move.w _i,d0
lea _PhonStrGadget,a1
move.l _ControlWindow,a0
jsr _LVOAddGadget(a6)
;------Refresh PhonStrGadget
suba.l a2,a2
movea.l _ControlWindow,a1
lea _PhonStrGadget,a0
jsr _LVORefreshGadgets(a6)
;----VoiceIOB's message.io_Error = 0
clr.b VoiceIOB+31
;----Turn on SpeakGadget
.76 suba.l a2,a2
movea.l _ControlWindow,a1
lea _SpeakGadget,a0
jsr _LVOOnGadget(a6)
;----Turn on FaceGadget
suba.l a2,a2
movea.l _ControlWindow,a1
lea _FaceGadget,a0
jsr _LVOOnGadget(a6)
;==============A mouth DoIO (Read) has completed=============
.74 movea.l MouthIO+14,a0
move.l -4(a5),d0
move.b 15(a0),d1
Bclr.l d1,d0
beq .53
;
movea.l _GfxBase,a6
movea.l _FaceWindow,a0
move.l 46(a0),a1 ;face window's screen
lea 44(a1),a0 ;screen's viewport
jsr _LVOWaitBOVP(a6)
;----Set ForePen to white
movea.l _FaceWindow,a0
movea.l 50(a0),a1
moveq #1,d0
jsr _LVOSetAPen(a6)
;RectFill(FaceWindow->RPort, 0, EyesBottom,
;Window's GZZWidth, Window's GZZHeight)
movea.l _FaceWindow,a0
moveq #0,d3
move.w 114(a0),d3
moveq #0,d2
move.w 112(a0),d2
moveq #0,d1
move.w _EyesBottom,d1
moveq #0,d0
movea.l 50(a0),a1
jsr _LVORectFill(a6)
;if (MouthWMult == 0)
;LipWidth = mouth_io.width >> 1
move.w _MouthWMult,d1
bne.s .82
moveq #0,d0
move.b MouthIO+70,d0
lsr.b #1,d0
move.w d0,_LipWidth
bra.s .83
;LipWidth = mouth_io.width * MouthWMult
.82 moveq #0,d0
move.b MouthIO+70,d0
mulu d1,d0
move.w d0,_LipWidth
;if (MouthHMult == 0)
;LipHeight = mouth_io.height >> 1
.83 move.w _MouthHMult,d1
bne.s .84
moveq #0,d0
move.b MouthIO+71,d0
lsr.b #1,d0
move.w d0,_LipHeight
bra.s .85
;LipHeight = mouth_io.height * (MouthHMult)
.84 moveq #0,d0
move.b MouthIO+71,d0
mulu d1,d0
move.w d0,_LipHeight
;----Set ForePen to Red
.85 movea.l _FaceWindow,a0
movea.l 50(a0),a1
moveq #3,d0
jsr _LVOSetAPen(a6)
;----Move to one corner of the mouth
moveq #0,d1
move.w _YMouthCenter,d1
moveq #0,d0
move.w _XMouthCenter,d0
sub.w _LipWidth,d0
movea.l _FaceWindow,a0
movea.l 50(a0),a1
jsr _LVOMove(a6)
;======DRAW THE 4 LINE SEGMENTS THAT COMPRISE THE (OPEN) MOUTH=======
moveq #0,d1
move.w _YMouthCenter,d1
sub.w _LipHeight,d1
moveq #0,d0
move.w _XMouthCenter,d0
movea.l _FaceWindow,a0
movea.l 50(a0),a1
jsr _LVODraw(a6)
moveq #0,d1
move.w _YMouthCenter,d1
moveq #0,d0
move.w _XMouthCenter,d0
add.w _LipWidth,d0
movea.l _FaceWindow,a0
movea.l 50(a0),a1
jsr _LVODraw(a6)
moveq #0,d1
move.w _YMouthCenter,d1
add.w _LipHeight,d1
moveq #0,d0
move.w _XMouthCenter,d0
movea.l _FaceWindow,a0
movea.l 50(a0),a1
jsr _LVODraw(a6)
moveq #0,d1
move.w _YMouthCenter,d1
moveq #0,d0
move.w _XMouthCenter,d0
sub.w _LipWidth,d0
movea.l _FaceWindow,a0
movea.l 50(a0),a1
jsr _LVODraw(a6)
;the narrator will give an error when the write has completed and I've tried
;to read. I stop trying when that happens.
lea MouthIO,a1
move.b 31(a1),d0 ;check io_Error
bne .53
movea.l _SysBase,a6
jsr _LVOSendIO(a6)
bra .53
;======================================================
; This handles the MENUpick. Since only 1 menu/subitem, make sure that
; menu # and item # are 0.
;
;handle_menu(code, w)
; d0 a0
XDEF handle_menu
handle_menu:
move.w d0,d1
andi.w #$1F,d0
bne.s .92
movem.l d2/d3/a2/a3,-(sp)
lsr.w #5,d1
andi.w #$3F,d1
bne.s .92
moveq #47,d3
moveq #0,d2
move.b #280,d2
moveq #0,d1
moveq #0,d0
lea _OKIText,a3
suba.l a2,a2
lea _ReqText3,a1
movea.l _IntuitionBase,a6
jsr _LVOAutoRequest(a6)
movem.l (sp)+,d2/d3/a2/a3
.92 rts
;====================================================
; Handles a GADGETUP message.
;
;gadgetmessage(IAddress)
; a1
XDEF handle_up
handle_up:
;==========DECODE WHICH GADGET WAS SELECTED========
lea _FaceGadget,a0
cmpa.l a0,a1
beq FACE
lea _StopGadget,a0
cmpa.l a0,a1
beq STOP
lea _FemaleGadget,a0
cmpa.l a0,a1
beq FMG
lea _MaleGadget,a0
cmpa.l a0,a1
beq MG
lea _TranslateGadget,a0
cmpa.l a0,a1
beq TRAN
lea _SpeakGadget,a0
cmpa.l a0,a1
beq SPK
lea PropGadget0,a0
cmpa.l a0,a1
beq PRP0
lea PropGadget1,a0
cmpa.l a0,a1
beq PRP1
lea PropGadget2,a0
cmpa.l a0,a1
beq PRP2
lea PropGadget3,a0
cmpa.l a0,a1
beq PRP3
lea _ModeGadget,a0
cmpa.l a0,a1
bne .137
;ignore the _EnglStrGadget and _PhonStrGadget
;==============ModeGadget===================
;----if ModeGadget's Flags = SELECTED, then voiceIOB's mode = ROBOTIC0
moveq #1,d1
move.b 13(a0),d0
bmi.s .101
;----Otherwise, mode = NATURALF0
moveq #0,d1
.101 move.w d1,VoiceIOB+52
rts
;=============FaceGadget===============
;----if FaceGadget's Flags = SELECTED, then open it. Otherwise, close it.
FACE movea.l _IntuitionBase,a6
move.b 13(a0),d0
bpl.s .105
;---VoiceIOB's mouths = 1
move.b #1,VoiceIOB+66 ;indicate that reads will be forthcoming
;----Open the FaceWindow
lea _NewFaceWindow,a0
jsr _LVOOpenWindow(a6)
move.l d0,_FaceWindow
bne.s .106
bsr exit_program
;----Attach the menu to the FaceWindow
.106 lea Menu0,a1
movea.l d0,a0
jsr _LVOSetMenuStrip(a6)
;----Draw the face in the opened FaceWindow
bsr draw_face
rts
;----FaceGadget was DESELECTED, so it must now be closed.
;-----VoiceIOB's mouths = 0
.105 clr.b VoiceIOB+66
;---Store last Left, Top, Width, and Height for next open
move.l _FaceWindow,a0
lea _NewFaceWindow,a1
move.w 4(a0),(a1)
move.w 6(a0),2(a1)
move.w 8(a0),4(a1)
move.w 10(a0),6(a1)
jsr _LVOCloseWindow(a6)
clr.l _FaceWindow
rts
;==========StopGadget==============
;----Abort the IO
STOP lea VoiceIOB,a1
movea.l _SysBase,a6
jsr _LVOAbortIO(a6)
;----reset VoiceIOB's message.io_Error
clr.b VoiceIOB+31
;----reset mouth_io.voice.message.io_Error
clr.b MouthIO+31
rts
;=========FemaleGadget===============
; Since this program changes a flag that intuition expects
; only the user to change (SELECTED bit), this program has
; to remove, then change, then add this gadget. Then by
; passing the address of this gadget to RefreshGadgets(),
; only the gadgets from here to the start of the list will
; be refreshed, which minimizes the visible flash that
; RefreshGadgets() can introduce.
; If one of the two gadgets (female/male) is hit, toggle
; the selection of the other gadget (since the gadget hit
; was toggled by intuition when it was hit).
;----if FemaleGadget's Flags = SELECTED, then VoiceIOB's sex = FEMALE
FMG movea.l _IntuitionBase,a6
moveq #1,d1
move.b 13(a0),d0
bmi.s .112
;---Otherwise VoiceIOB's sex = MALE
moveq #0,d1
.112 move.w d1,VoiceIOB+54
;----Remove the MaleGadget
lea _MaleGadget,a1
move.l _ControlWindow,a0
jsr _LVORemoveGadget(a6)
;----MaleGadget's Flags = SELECTED
Bchg.b #7,_MaleGadget+13
;-----Add the MaleGadget
lea _MaleGadget,a1
move.l _ControlWindow,a0
jsr _LVOAddGadget(a6)
;-----Refresh the MaleGadget
REF suba.l a2,a2
movea.l _ControlWindow,a1
lea _MaleGadget,a0
jsr _LVORefreshGadgets(a6)
rts
;===============MaleGadget=============
;----if MaleGadget's Flags = SELECTED, then VoiceIOB's sex = MALE
MG movea.l _IntuitionBase,a6
moveq #0,d1
move.b 13(a0),d0
bmi.s .116
;-----Otherwise, VoiceIOB's sex = FEMALE
moveq #1,d1
.116 move.w d1,VoiceIOB+54
;-----Remove the FemaleGadget
lea _FemaleGadget,a1
move.l _ControlWindow,a0
jsr _LVORemoveGadget(a6)
;----FemaleGadget's Flags = SELECTED
Bchg.b #7,_FemaleGadget+13
;----Add the FemaleGadget
lea _FemaleGadget,a1
move.l _ControlWindow,a0
jsr _LVOAddGadget(a6)
;---Refresh MaleGadget
bra.s REF
;===========Check for TranslateGadget==============
; Since the program changes the contents of the string
; gadgets' buffer and it's size, which is something else
; intuition doesn't expect a program (as opposed to the
; user) to do. The program must remove, then change, then
; add this gadget, and then by passing the address of this
; gadget to RefreshGadgets(), only the gadgets from here
; to the start of the list will be refreshed, which
; minimizes the visible flash that RefreshGadgets() can introduce.
;RemoveGadget the PhonStrGadget
TRAN lea _PhonStrGadget,a1
move.l _ControlWindow,a0
movea.l _IntuitionBase,a6
jsr _LVORemoveGadget(a6)
move.w d0,-(sp)
move.l a6,-(sp)
;---Translate the EnglBuffer and put it into the PhonBuffer
moveq #0,d1
move.w _PhonInfo+10,d1
lea _PhonBuffer,a1
moveq #0,d0
move.w _EnglInfo+16,d0
lea _EnglBuffer,a0
movea.l _TranslatorBase,a6
jsr _LVOTranslate(a6)
movea.l (sp)+,a6
move.b d0,_TranslatorError
beq.s .120
;----flash this screen if an error in translating
movea.l _ControlWindow,a1
movea.l 46(a1),a0
jsr _LVODisplayBeep(a6)
; Hey! NumChars includes the terminating NULL.
;/* This must be done. */
;PhonInfo.NumChars = VoiceIOB's message.io_Length + 1
.120 lea VoiceIOB,a0
lea _PhonInfo,a1
move.l 36(a0),d0
addq.l #1,d0
move.w d0,16(a1)
;if (PhonInfo.DispPos > VoiceIOB's message.io_Length)
;PhonInfo.DispPos = VoiceIOB's message.io_Length
move.w 12(a1),d0
sub.w 36(a0),d0
bls.s .121
move.w 38(a0),12(a1)
;AddGadget(ControlWindow, &PhonStrGadget, i)
.121 moveq #0,d0
move.w (sp)+,d0
lea _PhonStrGadget,a1
move.l _ControlWindow,a0
jsr _LVOAddGadget(a6)
;----Refresh PhonStrGadget
suba.l a2,a2
movea.l _ControlWindow,a1
lea _PhonStrGadget,a0
jsr _LVORefreshGadgets(a6)
rts
;=================SpeakGadget=================
;----Turn off the SpeakGadget
SPK movea.l _IntuitionBase,a6
suba.l a2,a2
movea.l _ControlWindow,a1
lea _SpeakGadget,a0
jsr _LVOOffGadget(a6)
;----Turn off the FaceGadget
suba.l a2,a2
movea.l _ControlWindow,a1
lea _FaceGadget,a0
jsr _LVOOffGadget(a6)
;VoiceIOB's message.io_Length = # of chars in PhonBuffer
lea _PhonBuffer,a0
move.l a0,d0
len move.b (a0)+,d1
bne.s len
subq.l #1,a0
suba.l d0,a0
lea VoiceIOB,a1
move.l a0,36(a1)
;----Send the IO
movea.l _SysBase,a6
jsr _LVOSendIO(a6)
;----if VoiceIOB's mouths = 1
cmpi.b #1,VoiceIOB+66
bne.s .137
;mouth_io's voice.message.io_Error = 0
lea MouthIO,a1
clr.b 31(a1)
;----Send the mouth IO
jsr _LVOSendIO(a6)
rts
;===============Props[0]==============
;-----PropRange = RNGFREQ
PRP0 move.w #23001,d1
;VoiceIOB's sampfreq = (( (PropInfo[0].HorizPot >> 1)
;* PropRange) >> 15) + MINFREQ
move.w PropInfo0+2,d0
lsr.w #1,d0
mulu d1,d0
moveq #15,d1
lsr.l d1,d0
addi.w #5000,d0
move.w d0,VoiceIOB+64
rts
;==================Props[1]============
;-----PropRange = RNGRATE
;VoiceIOB's rate = (((PropInfo[1].HorizPot >> 1)
;* PropRange) >> 15) + MINRATE
PRP1 move.w PropInfo1+2,d0
lsr.w #1,d0
mulu #361,d0
moveq #15,d1
lsr.l d1,d0
addi.w #40,d0
move.w d0,VoiceIOB+48
rts
;================Props[2]================
;-----PropRange = RNGPITCH
;VoiceIOB's pitch = (((PropInfo[2].HorizPot >> 1)
;* PropRange) >> 15) + MINPITCH
PRP2 move.w PropInfo2+2,d0
lsr.w #1,d0
mulu #256,d0
moveq #15,d1
lsr.l d1,d0
addi.w #65,d0
move.w d0,VoiceIOB+50
rts
;================Props[3]================
;----PropRange = RNGVOL
;VoiceIOB's volume = (((PropInfo[3].HorizPot >> 1)
;* PropRange) >> 15) + MINVOL
PRP3 moveq #65,d1
move.w PropInfo3+2,d0
lsr.w #1,d0
mulu d1,d0
moveq #15,d1
lsr.l d1,d0
move.w d0,VoiceIOB+62
.137 rts
;=============================================================
; This calculates variables used to draw the mouth and eyes, as well as
; redrawing the face. Proportionality makes it very wierd, but it's
; wierder if you don't use a GimmeZeroZero window and GZZWidth/GZZHeight.
XDEF draw_face
draw_face:
movea.l _FaceWindow,a0
;----set mouth center position based on size of window
move.w 112(a0),d0 ;Window's current width
lsr.w #1,d0 ;divide by 2
move.w d0,_XMouthCenter
;----set left edge position of left eye based on size of window
lsr.w #1,d0
move.w d0,_EyesLeft ;width/4
;----multiplier for mouth width
; MouthWMult = GZZWidth/16
lsr.w #4,d0
move.w d0,_MouthWMult
;EyesTop = GZZHeight/4 - GZZHeight/16
move.w 114(a0),d0 ;Window's current height
lsr.w #2,d0 ;divide by 4
move.w d0,d1
lsr.w #2,d1 ;divide by 16
sub.w d1,d0
move.w d0,_EyesTop
;EyesBottom = EyesTop + (GZZHeight/8) + 1
move.w 114(a0),d0
move.w d0,d1
lsr.w #3,d0
add.w _EyesTop,d0
addq.w #1,d0
move.w d0,_EyesBottom
;yaw = GZZHeight - EyesBottom
sub.w _EyesBottom,d1
move.w d1,_yaw
move.w d1,d0
;YMouthCenter = (yaw/2) + EyesBottom
lsr.w #1,d1
add.w _EyesBottom,d1
move.w d1,_YMouthCenter
;MouthHMult = yaw/32
lsr.w #5,d0
move.w d0,_MouthHMult
;==========Set ForePen to White=============
movea.l _FaceWindow,a0
movea.l 50(a0),a1
movea.l _GfxBase,a6
moveq #1,d0
jsr _LVOSetAPen(a6)
;---Fill the FaceWindow's background
movea.l _FaceWindow,a0
moveq #0,d3
move.w 114(a0),d3
moveq #0,d2
move.w 112(a0),d2
moveq #0,d1
moveq #0,d0
movea.l 50(a0),a1
jsr _LVORectFill(a6)
;=============Set ForePen to Blue============
movea.l _FaceWindow,a0
movea.l 50(a0),a1
moveq #0,d0
jsr _LVOSetAPen(a6)
;----Fill in the eyes
movea.l _FaceWindow,a0
moveq #0,d3
move.w 114(a0),d3
lsr.w #3,d3
add.w _EyesTop,d3
moveq #0,d2
move.w 112(a0),d2
lsr.w #3,d2
add.w _EyesLeft,d2
moveq #0,d1
move.w _EyesTop,d1
moveq #0,d0
move.w _EyesLeft,d0
movea.l 50(a0),a1
jsr _LVORectFill(a6)
movea.l _FaceWindow,a0
moveq #0,d2
move.w 112(a0),d2
lsr.w #1,d2
move.l d2,d0
move.w d2,d1
lsr.w #2,d1
add.w d1,d2
add.w d1,d2
add.w d1,d0
moveq #0,d1
move.w _EyesTop,d1
moveq #0,d3
move.w 114(a0),d3
lsr.w #3,d3
add.w d1,d3
movea.l 50(a0),a1
jsr _LVORectFill(a6)
;----Set ForePen to Red
movea.l _FaceWindow,a0
movea.l 50(a0),a1
moveq #3,d0
jsr _LVOSetAPen(a6)
;---draw the mouth (as a straight line - mouth not open)
moveq #0,d0
move.w _XMouthCenter,d0
movea.l _FaceWindow,a0
move.w 112(a0),d1
lsr.w #3,d1
sub.w d1,d0
moveq #0,d1
move.w _YMouthCenter,d1
movea.l 50(a0),a1
jsr _LVOMove(a6)
moveq #0,d0
move.w _XMouthCenter,d0
movea.l _FaceWindow,a0
move.w 112(a0),d1
lsr.w #3,d1
add.w d1,d0
moveq #0,d1
move.w _YMouthCenter,d1
movea.l 50(a0),a1
jsr _LVODraw(a6)
rts
;============================================================
; Deallocate any memory, and close all of the windows/screens/devices/
; libraries in reverse order to make things work smoothly. And be sure to
; check that the open/allocation was successful before closing/deallocating.
XDEF exit_program
exit_program:
movea.l _SysBase,a6
;----Free the read_port signal
moveq #0,d0
move.b ReadPort+15,d0
bmi.s .143
jsr _LVOFreeSignal(a6)
;-----Free the talk_port signal
.143 moveq #0,d0
move.b TalkPort+15,d0
bmi.s .144
jsr _LVOFreeSignal(a6)
;----Close the FaceWindow
.144 movea.l _IntuitionBase,a6
move.l _FaceWindow,d0
beq.s .145
movea.l d0,a0
jsr _LVOCloseWindow(a6)
.145 move.l _ControlWindow,d0
beq.s .146
movea.l d0,a0
jsr _LVOCloseWindow(a6)
;-------freeimages makes sure image allocation was successful
.146 bsr free_chip_mem
;----Close the narrator device
move.b _NarratorOpenError,d0
bne.s .147
lea VoiceIOB,a1
jsr _LVOCloseDevice(a6)
;---Close Whichever Libs are Open
.147 move.l _TranslatorBase,d0
beq.s .148
movea.l d0,a1
jsr _LVOCloseLibrary(a6)
.148 move.l _GfxBase,d0
beq.s .149
movea.l d0,a1
jsr _LVOCloseLibrary(a6)
.149 move.l _IntuitionBase,d0
beq.s .150
movea.l d0,a1
jsr _LVOCloseLibrary(a6)
.150 clr.l -(sp)
jsr _exit ;exits
;=====================================================================
; Allocate chip memory for gadget images, and set the
; pointers in the corresponding image structures to point
; to these images. This must be done because the program
; could be loaded into expansion memory (off the side of
; the box), which the custom chips cannot access.
; And images must be in chip ram (that's memory that the
; custom chips can access, the internal 512K).
; Allocate them all, stop and return false on failure.
XDEF get_chip_mem
get_chip_mem:
;----Allocate chip mem to copy FemaleData
moveq #2,d1 ;MEMF_CHIP
moveq #40,d0 ;# of Bytes
movea.l _SysBase,a6
jsr _LVOAllocMem(a6)
move.l d0,_FemaleImage+10
beq .155
;----Copy initialized FemaleIData to chip mem block
lea _FemaleIData,a0
movea.l d0,a1
moveq #20-1,d0
.163 move.w (a0)+,(a1)+
Dbra d0,.163
;----Allocate chip mem to copy MaleData
moveq #2,d1 ;MEMF_CHIP
moveq #40,d0 ;# of Bytes
jsr _LVOAllocMem(a6)
move.l d0,_MaleImage+10
beq.s .155
;----Copy initialized MaleIData to chip mem block
lea _MaleIData,a0
movea.l d0,a1
moveq #20-1,d0
.164 move.w (a0)+,(a1)+
Dbra d0,.164
;----Allocate chip mem to copy HumanData
moveq #2,d1
moveq #120,d0
jsr _LVOAllocMem(a6)
move.l d0,_HumanImage+10
beq.s .155
;----Copy initialized HumanIData to chip mem block
lea _HumanIData,a0
movea.l d0,a1
moveq #60-1,d0
.169 move.w (a0)+,(a1)+
Dbra d0,.169
;----Allocate chip mem to copy RobotData
moveq #2,d1
moveq #120,d0
jsr _LVOAllocMem(a6)
move.l d0,_RobotImage+10
beq.s .155
;----Copy initialized RobotIData to chip mem block
lea _RobotIData,a0
movea.l d0,a1
moveq #60-1,d0
.168 move.w (a0)+,(a1)+
Dbra d0,.168
;----Allocate (Zeroed) chip mem for FaceData
move.l #$10002,d1
moveq #60,d0
jsr _LVOAllocMem(a6)
move.l d0,_FaceImage+10
beq.s .155
;----Allocate (ZEROED) chip mem for StopData
move.l #$10002,d1
moveq #60,d0
jsr _LVOAllocMem(a6)
move.l d0,_StopImage+10
beq.s .155
moveq #1,d0
.155 rts
;========================================================
; Deallocate the memory that was used for images, if pointers are not 0.
XDEF free_chip_mem
free_chip_mem:
movea.l _SysBase,a6
move.l _RobotImage+10,d1
beq.s .181
moveq #120,d0
movea.l d1,a1
jsr _LVOFreeMem(a6)
.181 move.l _HumanImage+10,d1
beq.s .182
moveq #120,d0
movea.l d1,a1
jsr _LVOFreeMem(a6)
.182 move.l _MaleImage+10,d1
beq.s .183
moveq #40,d0
movea.l d1,a1
jsr _LVOFreeMem(a6)
.183 move.l _FemaleImage+10,d1
beq.s .184
moveq #40,d0
movea.l d1,a1
jsr _LVOFreeMem(a6)
.184 move.l _FaceImage+10,d1
beq.s .185
moveq #60,d0
movea.l d1,a1
jsr _LVOFreeMem(a6)
.185 move.l _StopImage+10,d1
beq.s .186
moveq #60,d0
movea.l d1,a1
jsr _LVOFreeMem(a6)
.186 rts
XDEF TextAttr
TextAttr:
dc.l TopazName
dc.w 8 ;TOPAZ_EIGHTY
dc.b 0,0
XDEF _audio_chan
_audio_chan: dc.b 3,5,10,12 ;Which audio channels to use
TalkPort:
dc.l 0,0
dc.b 4,0
dc.l 0
dc.b 0,-1 ;PA_SIGNAL,MP_SIGBIT
dc.l 0
PortList1 dc.l PortList2
PortList2 dc.l 0
PortList3 dc.l PortList1
dc.w 0
ReadPort:
dc.l 0,0
dc.b 4,0
dc.l 0
dc.b 0,-1 ;PA_SIGNAL,MP_SIGBIT
dc.l 0
portList1 dc.l portList2
portList2 dc.l 0
portList3 dc.l portList1
dc.w 0
;===========Narrator Write Request block=============
VoiceIOB:
;---Embedded Message Structure
dc.l 0,0
dc.b 0,0
dc.l 0
dc.l TalkPort ;mn_ReplyPort 14(BASE)
dc.w 70 ;mn_Length 18(BASE)
;---Embedded Expanded IORequest Structure
dev dc.l 0 ;io_Device 20(BASE)
dc.l 0 ;io_Unit 24(BASE)
dc.w 3 ;io_Command 28(BASE)
dc.b 0 ;io_Flags 30(BASE)
dc.b 0 ;io_Error 31(BASE) SIGNED
dc.l 0 ;io_Actual 32(BASE)
dc.l 0 ;io_Length 36(BASE)
dc.l _PhonBuffer ;io_Data 40(BASE)
dc.l 0 ;io_Offset 44(BASE)
;---Narrator device additional fields
dc.w 0 ;rb_rate 48(BASE)
dc.w 0 ;rb_pitch 50(BASE)
dc.w 0 ;rb_mode 52(BASE)
dc.w 0 ;rb_pitch 54(BASE)
dc.l _audio_chan ;rb_ch_masks 56(BASE)
dc.w 4 ;rb_mn_masks 60(BASE)
dc.w 0 ;rb_volume 62(BASE)
dc.w 0 ;rb_sampfreq 64(BASE)
dc.b 0 ;rb_mouths 66(BASE)
dc.b 0 ;rb_chanmask 67(BASE) internal use
dc.b 0 ;rb_numchan 68(BASE) internal use
dc.b 0 ;Pad 69(BASE)
;========Narrator Read Request block (used for the mouth)===========
; The Read Request to the narrator has 4 additional bytes beyond the end
; of the Write Request. They are:
; dc.b 0 ;rb_width 70(BASE)
; dc.b 0 ;rb_height 71(BASE)
; dc.b 0 ;rb_shape 72(BASE) internal use
; dc.b 0 ;Pad 73(BASE)
MouthIO: ds.b 74
XDEF _NarratorOpenError,_TranslatorError
_NarratorOpenError: dc.b -1 ;Narrator not yet opened (Flag)
_TranslatorError: dc.b 0
_i dc.w 0
;These are used to draw the eyes and mouth size relative
_MouthWMult dc.w 0
_EyesLeft dc.w 0
_MouthHMult dc.w 0
_EyesTop dc.w 0
_EyesBottom dc.w 0
_YMouthCenter dc.w 0 ;Pixels from top edge
_XMouthCenter dc.w 0 ;Pixels from left edge
_yaw dc.w 0
_LipWidth dc.w 0
_LipHeight dc.w 0
;/* String Gadgets *********************************************
;
;First the string gadgets.
; 1) because the Phonetic string is refreshed programaticly
; (that is, deleted and added again) quite often, and doing
; this requires the use of RefreshGadgets(), and this causes
; gadgets that are closer to the beginning of the list than
; the gadget given to RefreshGadgets() to flicker.
; 2) because they don't flicker when OTHER gadgets
; (ie female/male, coming up) are deleted and added.
;
; These'll be used to put a nice double line border around
; each of the two string gadgets.
; y,x pairs drawn as a connected line. Be sure to have an even
; number of arguments (ie complete pairs).
XDEF _StrVectors
_StrVectors:
dc.w 0,0,297,0,297,14,0,14,0,1,296,1,296,13,1,13,1,1
XDEF _StrBorder
_StrBorder:
dc.w -4,-3 ;initial offsets, gadget relative
dc.b 1,0 ;ForePen = 1, BackPen = 0
dc.b 0 ;JAM1
dc.b 9 ;number of vectors
dc.l _StrVectors ;pointer to the actual array of vectors
dc.l 0 ;no Next Border
; The same undo buffer is used for both string gadgets,
; this is sized to largest so that largest fits.
_UndoBuffer ds.b 768
; English String Gadget is where the user types in English
XDEF _EnglBuffer
_EnglBuffer:
dc.b 'This is amiga speaking.',0
ds.b 488
XDEF _EnglInfo
_EnglInfo:
;pointer to I/O buffer
dc.l _EnglBuffer
;pointer to undo buffer
dc.l _UndoBuffer
;buffer position
dc.w 0
;max number of chars, including NULL
dc.w 512
;first char in display, undo positions
dc.w 0
dc.w 0
;number of chars (currently) in the buffer
dc.w 24
;position variables calculated by Intuition
dc.w 0,0,0
;no pointer to RastPort
dc.l 0
;not a LongInt string gadget
dc.l 0
;no pointer to alternate keymap
dc.l 0
XDEF _EnglText
_EnglText:
;FrontPen, BackPen
dc.b 1,0
;DrawMode = JAM1, Pad
dc.b 0,0
;LeftEdge, TopEdge (relative to gadget)
dc.w 0,-13
;pointer to TextFont
dc.l TextAttr
;pointer to Text
dc.l English
;no pointer to NextText
dc.l 0
XDEF _EnglStrGadget
_EnglStrGadget:
;pointer to Next Gadget
dc.l 0
;(Left Top Width Height) Hit Box
dc.w 11,63,290,10
; GADGHCOMP, /* Flags */
dc.w 0
; RELVERIFY, /* Activation flags */
dc.w 1
; STRGADGET, /* Type */
dc.w 4
;pointer to Border Image
dc.l _StrBorder
;no pointer to SelectRender
dc.l 0
;pointer to Gadget IntuiText
dc.l _EnglText
;no MutualExclude
dc.l 0
;pointer to SpecialInfo
dc.l _EnglInfo
;no ID
dc.w 0
;no pointer to special data
dc.l 0
; Phonetic string gadget is where the program puts the
; translated string, necessating a call to RefreshGadgets(),
; and is where the user can type in Phonemes.
XDEF _PhonBuffer
_PhonBuffer:
dc.b 'DHIHS IHZ AHMIY3GAH SPIY4KIHNX.',0
ds.b 736
XDEF _PhonInfo
_PhonInfo:
dc.l _PhonBuffer
dc.l _UndoBuffer
dc.w 0,768,0,0,32,0,0,0
dc.l 0
;not a LongInt string gadget
dc.l 0
dc.l 0
XDEF _PhonText
_PhonText:
dc.b 1,0,0,0
dc.w 0,-13
dc.l TextAttr
dc.l Phonetic
dc.l 0
XDEF _PhonStrGadget
_PhonStrGadget:
dc.l _EnglStrGadget
dc.w 11,94,290,10,0,1,4
dc.l _StrBorder
dc.l 0
dc.l _PhonText
dc.l 0
dc.l _PhonInfo
dc.w 0
dc.l 0
; Now come the Boolean Gadgets.
; The female/male pair shows the simplest implementation I
; could think of to show how you can do mutual-exclude type
; things yourself. They are two toggle gadgets that use
; highlight image. The program starts with one selected, and
; then if either of them are hit, both toggle. Gadgets must
; be deleted and added whenever you want to change structure
; member values that intuition expects to be coming from the
; user, not a program (like the SELECTED bit in flags). Note
; that certain structure values CAN be changed programaticly
; without all this broohaha. Haha. Consult the intuition manual.
; Female Toggle (Highlight Image)
; (Quasi mutual exclude with Male Toggle)
XDEF _FemaleImage
_FemaleImage:
dc.w 0,0 ;Left,Top
dc.w 20,10,1 ;Width, Height, Depth
dc.l $0000 ;ImageData (must be chip. Will be allocated)
dc.b 1 ;PlanePick
dc.b 0 ;PlaneOnOff
dc.b 0,0,0,0
XDEF _FemaleGadget
_FemaleGadget:
dc.l _PhonStrGadget
dc.w 134,34,20,10
;GADGIMAGE|GADGHCOMP
dc.w 4
;Activation flags = RELVERIFY | GADGIMMEDIATE | TOGGLESELECT
dc.w 259
dc.w 1 ;Type = BOOLGADGET
dc.l _FemaleImage
dc.l 0
dc.l 0
dc.l 0
dc.l 0
dc.w 0
dc.l 0
;Male Toggle (Highlight Image)
;(Quasi mutual Exclude with above)
XDEF _MaleImage
_MaleImage:
dc.w 0,0 ;Left,Top
dc.w 20,10,1 ;Width, Height, Depth
dc.l $0000 ;ImageData
dc.b 1 ;PlanePick
dc.b 0 ;PlaneOnOff
dc.b 0,0,0,0
XDEF _MaleGadget
_MaleGadget:
dc.l _FemaleGadget
dc.w 154,34,20,10
;GADGIMAGE|GADGHCOMP|SELECTED
dc.w 132
;Activation = RELVERIFY | GADGIMMEDIATE | TOGGLESELECT | ACTIVATE
dc.w 4355
dc.w 1
dc.l _MaleImage
dc.l 0
dc.l 0
dc.l 0
dc.l 0
dc.w 0
dc.l 0
; This boolean toggle gadget has an
; alternate image that indicates
; selection. The image stays flipped
; until it gets another hit. (it toggles)
; Inflection Mode Toggle (AltImage)
XDEF _HumanImage
_HumanImage:
dc.w 0,0,40,20,1
dc.l 0
dc.b 1,0,0,0,0,0
XDEF _RobotImage
_RobotImage:
dc.w 0,0,40,20,1
dc.l 0
dc.b 1,0,0,0,0,0
XDEF _ModeGadget
_ModeGadget:
dc.l _MaleGadget
dc.w 134,2,40,20
; GADGIMAGE | GADGHIMAGE, /* Flags */
dc.w 6
; /* Activation flags */
; RELVERIFY | GADGIMMEDIATE | TOGGLESELECT,
dc.w 259
dc.w 1
dc.l _HumanImage
dc.l _RobotImage
dc.l 0
dc.l 0
dc.l 0
dc.w 0
dc.l 0
;Face Toggle (image and text)
XDEF _FaceIText
_FaceIText:
dc.b 1,0,1,0
dc.w 4,1
dc.l TextAttr
dc.l Face
dc.l 0
XDEF _FaceImage
_FaceImage:
dc.w 0,0,40,10,1
dc.l 0
dc.b 1,0,0,0,0,0
XDEF _FaceGadget
_FaceGadget:
dc.l _ModeGadget
dc.w 134,23,40,10
; GADGIMAGE | GADGHCOMP, /* Flags */
dc.w 4
; /* Activation flags */
; RELVERIFY | GADGIMMEDIATE | TOGGLESELECT,
dc.w 259
dc.w 1
dc.l _FaceImage
dc.l 0
dc.l _FaceIText
dc.l 0
dc.l 0
dc.w 0
dc.l 0
;/* Stop Hit (image and text) ******************************/
XDEF _StopIText
_StopIText:
dc.b 1,0,1,0
dc.w 4,1
dc.l TextAttr
dc.l Stop
dc.l 0
XDEF _StopImage
_StopImage:
dc.w 0,0,40,10,1
dc.l 0
dc.b 1,0,0,0,0,0
XDEF _StopGadget
_StopGadget:
dc.l _FaceGadget
dc.w 134,45,40,10
; GADGIMAGE | GADGHCOMP, /* Flags */
dc.w 4
; RELVERIFY | GADGIMMEDIATE, /* Activation flags */
dc.w 3
dc.w 1
dc.l _StopImage
dc.l 0
dc.l _StopIText
dc.l 0
dc.l 0
dc.w 0
dc.l 0
; This is a hit (as opposed to toggle)
; gadget that starts the translation.
; Translate Hit (Highlight image)
XDEF _TransVectors
_TransVectors:
dc.w 0,0,79,0,79,13,0,13,0,1,78,1,78,12,1,12,1,1
XDEF _TransBorder
_TransBorder:
dc.w -4,-3
dc.b 1,0,0,9
dc.l _TransVectors
dc.l 0
XDEF _TranslateIText
_TranslateIText:
dc.b 1,0,1,0
dc.w 0,0
dc.l TextAttr
dc.l Translate
dc.l 0
XDEF _TranslateGadget
_TranslateGadget:
dc.l _StopGadget
dc.w 229,48,71,8
dc.w 0,3,1
dc.l _TransBorder
dc.l 0
dc.l _TranslateIText
dc.l 0
dc.l 0
dc.w 0
dc.l 0
;/* This is a hit (as opposed to toggle) Starts the narration */
;/* Speak Hit (Highlight Image) *******************************/
XDEF _SpeakVectors
_SpeakVectors:
dc.w 0,0,47,0,47,13,0,13,0,1,46,1,46,12,1,12,1,1
XDEF _SpeakBorder
_SpeakBorder:
dc.w -4,-3
dc.b 1,0,0,9
dc.l _SpeakVectors
dc.l 0
XDEF _SpeakIText
_SpeakIText:
dc.b 1,0,1,0
dc.w 0,0
dc.l TextAttr
dc.l Speak
dc.l 0
XDEF _SpeakGadget
_SpeakGadget:
dc.l _TranslateGadget
dc.w 261,79,40,8,0,3,1
dc.l _SpeakBorder
dc.l 0
dc.l _SpeakIText
dc.l 0
dc.l 0
dc.w 0
dc.l 0
;==============PROPORTIONAL GADGETS==================
;dummy AUTOKNOB Images are required
;Image structures for 4 gadgets
PropImage0:
dc.w 0,0,0,0,0
dc.l 0
dc.b 0,0,0,0,0,0
PropImage1:
dc.w 0,0,0,0,0
dc.l 0
dc.b 0,0,0,0,0,0
PropImage2:
dc.w 0,0,0,0,0
dc.l 0
dc.b 0,0,0,0,0,0
PropImage3:
dc.w 0,0,0,0,0
dc.l 0
dc.b 0,0,0,0,0,0
PropImage19:
dc.w 0,0,0,0,0
dc.l 0
dc.b 0,0,0,0,0,0
XDEF PropText0
PropText0:
dc.b 1,0,0,0
dc.w 0,-10
dc.l TextAttr
dc.l Sample
dc.l 0
PropText1:
dc.b 1,0,0,0
dc.w 0,-10
dc.l TextAttr
dc.l Rate
dc.l 0
PropText2:
dc.b 1,0,0,0
dc.w 0,-10
dc.l TextAttr
dc.l Pitch
dc.l 0
PropText3:
dc.b 1,0,0,0
dc.w 0,-10
dc.l TextAttr
dc.l Volume
dc.l 0
XDEF PropInfo0
PropInfo0:
dc.w 3 ;AUTOKNOB|FREEHORIZ
dc.w 49009,0
;Bodies: Horiz is 1/8, Vert is 1/8
dc.w $1FFF
dc.w $1FFF
dc.w 0,0,0,0,0,0
PropInfo1:
dc.w 3,20024,0,$1FFF,$1FFF,0,0,0,0,0,0
PropInfo2:
dc.w 3,11565,0,$1FFF,$1FFF,0,0,0,0,0,0
PropInfo3:
dc.w 3,65535,0,$1FFF,$1FFF,0,0,0,0,0,0
XDEF PropGadget0
PropGadget0:
dc.l _SpeakGadget
dc.w 7,12,115,10
dc.w 4 ;GADGHCOMP|GADGIMAGE
dc.w 3 ;GADGIMMEDIATE|RELVERIFY
dc.w 3 ;PROPGADGET
dc.l PropImage0,0,PropText0,0,PropInfo0
dc.w 0
dc.l 0
PropGadget1:
dc.l PropGadget0
dc.w 7,34,115,10,4,3,3
dc.l PropImage1,0,PropText1,0,PropInfo1
dc.w 0
dc.l 0
PropGadget2:
dc.l PropGadget1
dc.w 190,12,115,10,4,3,3
dc.l PropImage2,0,PropText2,0,PropInfo2
dc.w 0
dc.l 0
PropGadget3:
dc.l PropGadget2
dc.w 190,34,115,10,4,3,3
dc.l PropImage3,0,PropText3,0,PropInfo3
dc.w 0
dc.l 0
XDEF _IntuitionBase,_GfxBase,_TranslatorBase
_IntuitionBase: dc.l 0
_GfxBase: dc.l 0
_TranslatorBase: dc.l 0
;==========Only one menu. (Goes on both Control and Face Windows)===========
XDEF MenuIntuiText
MenuIntuiText:
dc.b 0,1,1,0
dc.w 0,0
dc.l TextAttr,About,0
XDEF MenuItem0
MenuItem0:
dc.l 0
dc.w 0,0,150,8
dc.w $52 ;ITEMTEXT|ITEMENABLED|HIGHCOMP
dc.l 0
dc.l MenuIntuiText
dc.l 0
dc.b 0,0
dc.l 0
dc.w -1 ;NextSelect = MENUNULL
XDEF Menu0
Menu0:
dc.l 0
dc.w 0,0,150,0
dc.w 1 ;MENUENABLED
dc.l SMenu
dc.l MenuItem0,0,0
XDEF _ReqText1
_ReqText1:
dc.b 0,1,1,0
dc.w 5,23
dc.l TextAttr
dc.l Version
dc.l 0
XDEF _ReqText2
_ReqText2:
dc.b 0,1,1,0
dc.w 5,13
dc.l TextAttr
dc.l Free
dc.l _ReqText1
XDEF _ReqText3
_ReqText3:
dc.b 0,1,1,0
dc.w 5,3
dc.l TextAttr
dc.l Author
dc.l _ReqText2
XDEF _OKIText
_OKIText:
dc.b 0,1,1,0
dc.w 6,3
dc.l TextAttr
dc.l OK
dc.l 0
XDEF _ControlWindow,_FaceWindow,RastPort
_ControlWindow: dc.l 0
_FaceWindow: dc.l 0
RastPort dc.l 0
_MyIntuiMessage dc.l 0
XDEF _NewControlWindow
_NewControlWindow:
dc.w 0,11,321,123
dc.b -1,-1
dc.l $340 ;IDCMP = GADGETUP|CLOSEWINDOW|MENUPICK
;WindowFlags = WINDOWDRAG|WINDOWDEPTH|WINDOWCLOSE|GIMMEZEROZERO|ACTIVATE
dc.l $140e
dc.l PropGadget3
dc.l 0
dc.l ST
dc.l 0
dc.l 0
dc.w 20,20,321,123
dc.w 1
XDEF _NewFaceWindow
_NewFaceWindow:
dc.w 321,11,64,44
dc.b -1,-1
dc.l $103 ;IDCMP = SIZEVERIFY|NEWSIZE|MENUPICK
; WINDOWDRAG|WINDOWDEPTH|WINDOWSIZING|SIZEBBOTTOM|GIMMEZEROZERO|ACTIVATE
dc.l $1427
dc.l 0
dc.l 0
dc.l Face
dc.l 0
dc.l 0
dc.w 32,44,640,200
dc.w 1
XDEF _FemaleIData
_FemaleIData:
; ---- - These nibbles matter to image.
dc.w 0,0,$F0,0,$198,0,$30C,0,$198,0,$F0,0,$60,0,$1F8,0,$60,0,0,0
XDEF _MaleIData
_MaleIData:
dc.w 0,0,$3E,0,$E,0,$36,0,$1E0,0,$330,0,$618,0,$330,0,$1E0,0,0,0
XDEF _HumanIData
_HumanIData:
; ---- ---- -- These nibbles matter to image.
dc.w 0,0,0,0,0,0,0,0,0,0,0,0,7,$9E00,0,1,$8600,0,0,0,0,0,0,0
dc.w 0,$2000,0,0,$1000,0,0,$800,0,0,$7C00,0,0,0,0,0,0,0,0,0,0
dc.w 0,$7800,0,0,0,0,0,0,0,0,0,0,0,0,0
XDEF _RobotIData
_RobotIData:
; ---- ---- -- These nibbles matter to image.
dc.w 0,0,0,0,0,0,0,0,0,0,0,0,7,$9E00,0,4,$9200,0,7,$9E00,0,0,0,0
dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,$F800,0,1,$800,0,1,$F800,0
dc.w 0,0,0,0,0,0,0,0,0,0,0,0
English dc.b 'English:',0
Phonetic dc.b 'Phonetics:',0
Version dc.b 'Version 1.1 21 Dec, 1985',0
Free dc.b 'Freeware - Public Domain ',0
Author dc.b 'Written by David M Lucas ',0
OK dc.b 'OK',0
ST dc.b 'SpeechToy',0
SMenu dc.b 'SpeechToy Menu',0
About dc.b 'About SpeechToy...',0
Speak dc.b 'Speak',0
Translate dc.b 'Translate',0
Stop dc.b 'Stop',0
Face dc.b 'Face',0
Volume dc.b 'Volume:',0
Pitch dc.b 'Pitch:',0
Rate dc.b 'Rate:',0
Sample dc.b 'Sample Freq:',0
TopazName dc.b 'topaz.font',0
IntuitionTitle dc.b 'intuition.library',0
GraphicsTitle dc.b 'graphics.library',0
TranslatorTitle dc.b 'translator.library',0
Narrator dc.b 'narrator.device',0
END