; ; 1 ; ********************************* ; * SSB-MPF CLOCK_ENGLISH.S * ; ********************************* ; ;COPYRIGHT, MULTITECH INDUSTRIAL CORP. 1982. ;Written by Yung Jui Chen, R&D department. ;ROUTINE address is 5000H ;Demo program SSB-MPF. Takling clock in English. ;This program is to tell you the current time. ;Before you run this program, set the time buffer ;including SECOND, MINUTE, HOUR and AM PM flag. ;For example: buffer adds time indicate ; SECOND 1A00H 58 ; MINUTE 1A01H 55 ; HOUR 1A02H 10 ; AM/PM 1A11H BIT0 * ;If bit 0 is 0 them AM, otherwise is PM. ; SCAN1 EQU 0624H ; Utility Subroutine of MPF-1 PORT EQU 0FEH ; I/O port of SSB-MPF HEX7SG EQU 066DH ; Utilitty Subroutine of MPF-1 ORG 5000H DI ; Disable interrupt,which affects ;timing LD IX,OUTBF ; ;ONESEC loop takes one second to execute,including ;three Subroutine and one deley loop2 for addition ;process. ; ONESEC LD B,100 LOOP1 CALL SCAN1 ; SCAN1 total execution time ; is about 9.95 ms DJNZ LOOP1 CALL TMUPDT CALL BFUPDT ; ;LOOP2 is as additional delay. ; LOOP2 NOP DJNZ LOOP2 JR ONESEC ; ;TMUPDT is time-buffer updata ;routine. ; TMUPDT LD HL,MAXTAB LD DE,SEC LD B,3 SCF ; set carry flag, to ; force add 1 ; ;TMINC compare with data in MAX-TABLE if result ;is less than the following loop is null. ; TMINC LD A,(DE) ADC A,0 DAA ; 2 LD (DE),A SUB (HL) ; compare with max_table JR C,COMPL LD (DE),A COMPL CCF ; complement carry flag INC HL INC DE DJNZ TMINC LD A,(HOUR) AND A JR NZ,CONT ; if reach max force ; add 1 ; if not reach count ; continue INC A LD (HOUR),A LD A,(APMFLG) XOR 01H LD (APMFLG),A CONT LD A,(SEC) ; One minute is up? AND A CALL Z,SPEAK RET ; ;SPEAK routine is executed when every minute ;is reach. It include many subroutines as the ;following: ; 1. APMDEC- AM or PM decision ; 2. CHANGE- AM or PM status ; exchange each other ; 3. CHKOCK- check the o'clock ; time ; 4. SETPM - set PM flag ; 5. SPKPM - speak PM and save ; the speech address ; 6. GO* - tell time routine ; 7. CNTMIN- check and count the ; updated time ; ; SPEAK EX AF,AF' EXX LD A,2 LD (SEC),A ; compensate timing ; loose during the ; speech routine LD HL,HOUR_MIN LD A,(HOUR) ADD A,A LD E,A LD D,0 ADD HL,DE LD (TLKHOR1),HL APMDEC ; this routine decide AM ; or PM LD A,(APMFLG) ; define bit0=0,AM ; bit1-1,PM ; 3 BIT 0,A JR NZ,SETPM ; set PM LD HL,AM_ PUSH HL LD IY,PM JP CHANGE ; change AM to PM ; or PM to AM SETPM LD HL,PM_ PUSH HL LD IY,AM_ CHANGE EX (SP),IY POP HL LD A,(IY) BIT 0,A JR NZ,SPKPM ; PM is speaking LD HL,(AMADDS) LD (APMTLK),HL ; APMTLK choice talk JP CHKOCK SPKPM LD HL,(PMADDS) LD {APMTLK),HL CHKOCK LD A,(MIN) ; check the o'clock CP 0 ; time JR NZ,CNTMIN ; if minute is not ; zero check the ; actual minute no. ; ;GO routine is to tell o*clock time ;include AM,PM ;GO* routine save all the update time ;HOUR and MINUTE. Speech routine is ;called now. ; GO LD HL,IT CALL START ; speak "it" LD HL,IS CALL START ; speak "is" LD HL,TLKHOR1) CALL START LD HL,JUST CALL START ; speak "o*clock" LD HL,APMTLK CALL START ; speak AM or PM EXX EX AF,AF' RET ; ;CNTMIN routine to count the updata minutes ;for the GO routine to tell actual time reach ;include hour and minutes. ; CNTMIN LD A,(MIN) CP 10H JR C,CNTMN2 CP 20H JR C,CNTMN1 ; 4 CNTMN3 LD A,(MIN) AND OFH LD HL,HOUR_MIN ADD A,A ADD A,L LD L,A LD (TLKMIN2),HL LD A,(MIN) RRCA RRCA RRCA RRCA AND OFH LD HL,TXBLE_MIN ADD A,A ADD A,L LD L,A LD (TLKMINI),HL ; ;GO3 routine is to tell minute time ; above 20. ; GO3 LD HL,(TLKHOR1) CALL START LD HL,(TLKMIN1) CALL START LD HL,(TKMIN2) CALL START EXX EX AF,AF' RET CNTMN2 LD A,(MIN) AND OFH LD HL,HOUR_MIN ADD A,A ADD A,L LD L,A LD (TKMIN2),HL ; ;GO2 routine is to tell time ;range from 01 to 09 minutes. ; GO2 LD HL,(TLKHOR1) CALL START ; speak HOUR LD HL,OH ; speak word "OH" CALL START LD HL,(TKMIN2) CALL START ; speak minute EXX EX AF,AF' RET CNTMN1 LD A,(MIN) LD HL,HOUR_MIN ADD A,A ADD A,L LD L,A LD (TKMIN2),HL ; ; 5 ;GO1 routine is to tell minute time ;range between 10 and 19 ; GO1 LD HL,(TLKHOR1) CALL START LD HL,(TKMIN2) CALL START EXX EX AF,AF' RET ; ;BUFPDT--- display time buffer is updated here ;It takes 914 cycles. ; BFUPDT LD HL,OUTBF LD DE,SEC LD B,3 PUTBF LD A,(DE) CALL HEX7SG INC DE DJNZ PUTBF DEC HL DEC HL SET 6,(HL) ; set decimal point of ; hour DEC HL DEC HL SET 6,(HL) ; set decimal point of ; minute RET ; return when B=0 ; ;START is speech routine of TMS 5200 ; START: LD C,(HL) INC HL LD B,(HL) PUSH BC POP HL LD B,10H RESET LD A,0FFH ; reset TMS 5200 OUT (PORT),A CALL DELY DJNZ RESET LD A,60H ; activate TMS 5200 OUT (PORT),A CALL DELY SEND1 LD A,(HL) ; send the speech data OUT (PORT),A CALL DELY INC HL IN A,(PORT) BIT 7,A ; check the status of ; TMS 5200 JR Z,SEND1 SEND2 LD A,(HL) OUT (PORT),A ; continue to send ; speech data CALL DELY ; 6 INC HL IN A,(PORT) BIT 7,A JR NZ,SEND2 RET DELY PUSH BC ; delay loop for ; speech routine. LD B,0FFH DJNZ $ POP BC RET MAXTAB DEFB 60H DEFB 60H DEFB 13H HOUR_MIN ; table used in both ; HOUR and MINUTE DEFW 5FB0H ; PAUSE DEFW 5400H ; ONE DEFW 5458H ; TWO DEFW 54E8H ; THREE DEFW 5498H ; FOUR DEFW 5528H ; FIVE DEFW 55E8H ; SIX DEFW 55A0H ; SEVEN DEFW 55F0H ; EIGHT DEFW 5620H ; NINE DEFW 5FB8H ; NULL (A) DEFW 5FB8H ; NULL (B) DEFW 5FB8H ; NULL (C) DEFW 5FB8H ; NULL (D) DEFW 5FB8H ; NULL (E) DEFW 5FB8H ; NULL (F) DEFW 56A0H ; TEN DEFW 58B8H ; ELEVEN DEFW 5868H ; TWELVE DEFW 5738H ; THIRTEEN DEFW 5918H ; FOURTEEN DEFW 59B8H ; FIFTEEN DEFW 5C20H ; SIXTEEN DEFW 5B88H ; SEVENTEEN DEFW 5B20H ; EIGHTEEN DEFW 5AA8H ; NINETEEN TXBLE_MIN DEFW 5FB8H ; NULL DEFW 56A0H ; TEN DEFW 5810H ; TWENTY DEFW 57D0H ; THIRTY DEFW 5A18H ; FORTY DEFW 5A60H ; FIFTY IT ; word "it" address DEFW 5E10H IS ; word "is" address DEFW 5E48H AMADDS ; 7 DEFW 5CA8H ; AM data address PMADDS DEFW 5CF8H ; PM data address JUST DEFW 5D60H ; o'clock data AM_ DEFB 0 PM_ DEFB 1 OH ; speech data "OH" DEFW 5DE0H ; ;RAM Buffer starting address ; ORG 1A00H TWBF ; Time Buffer for HOUR, ; MINUTE and SECOND. SEC DEFS 1 MIN DEFS 1 HOUR DEFS 1 OUTBF DEFS 6 TLKHOR1 DEFS 2 TLKMIN1 DEFS 2 TKMIN2 DEFS 2 APMTLK DEFS 2 APMFLG DEFS 1 END