0000 ; 16:57:59 THURSDAY AUG 09 2001 0010 ; CLOCK / CALENDAR DRIVER PROGRAM 0020 ; for OKI MSM5832 MICROPROCESSOR 0030 ; Real-Time Clock / Calendar 0040 0050 ; The clock/calander is driven by a VIA. 0060 ; The port assignments are as follows: 0070 0080 ; PORT A PORT B 0090 ; 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0 0100 ;------------------------------------- 0110 ; D D D D A A A A T A R W H 0120 ; 3 2 1 0 3 2 1 0 E D E R O 0130 ; S J A I L 0140 ; T D T D 0150 ; E 0160 0170 ; The Registers are: 0180 0190 ; REGISTERS: 1M 10M 1H 10H W D1 D10 M1 M10 Y1 Y10 0200 0210 ; $62 $23 $94 $85 $26 $57 $08 $09 $1A $2B $8C 0220 0230 ; This example would be: "09:26:00 TUESDAY OCT 05 1982" 0240 0250 ; Bit 7 of 10H is set (high) for 24 hour format 0260 ; If you want a 12 hour format, other parts of this 0270 ; program will need to be changed, don't change 0280 ; this only! 0290 0300 ;TO USE THIS PROGRAM: 0310 ; To SET the time, run SET - 0320 ; (Use .G from the monitor, 0330 ; or T=USR(&"SET",0) from BASIC) 0340 0350 ; The program will respond with: 0360 ; Set time: 0370 0380 ; Y10 ? ;Here enter 10's digit of year (ex. '8' for '82) 0390 ; Y01 ? ;Here enter 1's digit of year (ex. '2' for '82) 0400 ; M10 ? ;Enter 10's digit of month (0 for JAN - 1 for OCT) 0410 ; M01 ? ; 1's digit of month (1 for JAN - 0 for OCT) 0420 ; D10 ? ; 10's digit of day (ex. '1' for the 15th) 0430 ; D01 ? ; 1's digit of day (ex. '5' for the 15th) 0440 ; DAY ? ;0 for SUNDAY, 2 for TUESDAY, 6 for SATURDAY 0450 ; 10H ? ; 10's digit of hour - REMEMBER 24hr format! 0460 ; 01H ? ; 1's digit of hour 0470 ; 10M ? ; 10's digit of minute 0480 ; 01M ? ; 1's digit of minute - 0490 ; Clock is set as soon as you enter last digit! 0500 ; If you make a mistake, type a 0510 ; and run SET again! 0520 0530 ; To GET the time, run TIME - 0540 0550 ; NOTE: The following is for my current SYM 0560 ; with MON1.1 at location $E000 and a 6532 0570 ; I added at location $FD00 connecting the RTC. 0580 0590 ; Monitor Locations 0600 0610 CRLF .DE $E34D 0620 OUTCHR .DE $EA47 0630 INCHR .DE $EA1B 0640 0650 ; 6532 Locations 0660 0670 ORA .DE $FD00 ;VIA #0 Output reg A 0680 DDRA .DE $FD01 ;VIA #0 Data dir reg A 0690 ORB .DE $FD02 ;V1A #0 Output reg B 0700 DDRB .DE $FD03 ;VIA #0 Data dir reg B 0710 0720 ; NOTE: If connecting to a 6522, use the "no 0730 ; handshake" for register A 0740 ; EXAMPLE: 0750 ; $A001 in SYM is U-25 I/O register A (controls handshake) 0760 ; $A00F in SYM is U-25 output register A (no handshake) 0770 0780 .BA $7000 ; Or wherever 0785 .OS 0790 0800 7000- 08 0810 SET PHP Save all regs, calling 7001- 48 0820 PHA program may need them 7002- 8A 0830 TXA 7003- 48 0840 PHA 7004- 98 0850 TYA 7005- 48 0860 PHA 7006- 20 4D E3 0870 JSR CRLF 7009- A0 FF 0880 LDY #$FF 700B- C8 0890 SM INY 700C- B9 79 71 0900 LDA SMSG,Y Print message 700F- 20 47 EA 0910 JSR OUTCHR 7012- 10 F7 0920 BPL SM 0930 7014- A2 0C 0940 LDX #$0C X is index into Regs 7016- A0 FF 0950 LDY #$FF Y is index into msgs 7018- C8 0960 MES.OUT INY 7019- B9 85 71 0970 LDA SET.MSG,Y Output msgs to set time 701C- C9 FF 0980 CMP #$FF Last char? 701E- F0 2F 0990 BEQ INIT Yes, set time 7020- 20 47 EA 1000 JSR OUTCHR No, process and get next 7023- 10 F3 1010 BPL MES.OUT 7025- 20 6E 71 1020 JSR OUTQM 1030 7028- 20 1B EA 1040 GET.SET JSR INCHR Get a char 702B- C9 0D 1050 CMP #$0D CR terminates 702D- F0 5A 1060 BEQ TMIN 702F- C9 30 1070 CMP #'0 Test for valid digit 7031- 90 EF 1080 BCC GET.SET-6 7033- C9 3A 1090 CMP #': 7035- B0 EB 1100 BCS GET.SET-6 7037- 20 4D E3 1110 JSR CRLF 703A- 38 1120 SEC Set carry 703B- E9 30 1130 SBC #$30 Convert to hex 703D- 0A 1140 ASL A Shift to upper nibbl 703E- 0A 1150 ASL A 703F- 0A 1160 ASL A 7040- 0A 1170 ASL A 7041- 9D 19 72 1180 STA SET.TABL-2,X Store in proper loc. 7044- 8A 1190 TXA Use X for Reg, also 7045- 18 1200 CLC 7046- 7D 19 72 1210 ADC SET.TABL-2,X Add Reg in Lo-nibbl 7049- 9D 19 72 1220 STA SET.TABL-2,X 704C- CA 1230 DEX 704D- D0 C9 1240 BNE MES.OUT Always 1250 704F- AD 1E 72 1260 INIT LDA SET.TABL+3 7052- 09 80 1270 ORA #$80 Set bit 7 in 10H Reg 7054- 8D 1E 72 1280 STA SET.TABL+3 7057- A9 FF 1290 LDA #$FF 7059- 8D 03 FD 1300 STA DDRB Make ORB all outputs 705C- 8D 01 FD 1310 STA DDRA Make ORA all outputs 705F- A9 01 1320 LDA #1 Set HOLD high 7061- 8D 02 FD 1330 STA ORB 7064- A0 1E 1340 LDY #$1E Wait for 150 us 7066- 88 1350 LOOP DEY for counters to settle 7067- D0 FD 1360 BNE LOOP 7069- A0 02 1370 LDY #2 Register (for reference only) 1380 706B- B9 19 72 1390 SET.REG LDA SET.TABL-2,Y Get data for registers 706E- 20 60 71 1400 JSR SET.DATA 7071- C8 1410 INY 7072- C0 0D 1420 CPY #$0D Done yet? 7074- D0 F5 1430 BNE SET.REG 7076- A9 01 1440 LDA #1 7078- 20 60 71 1450 JSR SET.DATA Reset 10S to zero 707B- A9 00 1460 LDA #0 707D- 20 60 71 1470 JSR SET.DATA Reset 01S to zero 7080- 4C 89 70 1480 JMP TMIN 1490 7083- 08 1500 TIME PHP 7084- 48 1510 PHA 7085- 8A 1520 TXA 7086- 48 1530 PHA 7087- 98 1540 TYA 7088- 48 1550 PHA 7089- 20 4D E3 1560 TMIN JSR CRLF 708C- A9 FF 1570 LDA #$FF 708E- 8D 03 FD 1580 STA DDRB Make ORB all outputs 7091- A9 0F 1590 LDA #$0F Make Hi-nibbl ORA inputs 7093- 8D 01 FD 1600 STA DDRA and Lo-nibbl ORA outputs 7096- A9 01 1610 LDA #1 Set HOLD high 7098- 8D 02 FD 1620 STA ORB 1630 709B- A0 06 1640 LDY #6 Start with H10 709D- 88 1650 ADD.TIME DEY 709E- 8C 00 FD 1660 STY ORA 70A1- C0 03 1670 CPY #3 Finished hours? 70A3- D0 05 1680 BNE =+6 70A5- A9 3A 1690 LDA #': 70A7- 20 47 EA 1700 JSR OUTCHR 70AA- C0 01 1710 CPY #1 Finished minutes? 70AC- D0 05 1720 BNE =+6 70AE- A9 3A 1730 LDA #': 70B0- 20 47 EA 1740 JSR OUTCHR 70B3- 20 3D 71 1750 JSR READ 70B6- C0 00 1760 CPY #0 70B8- D0 E3 1770 BNE ADD.TIME 70BA- 20 73 71 1780 JSR SPACE 1790 70BD- A0 06 1800 ADD.DAY LDY #6 70BF- 8C 00 FD 1810 STY ORA 70C2- AD 00 FD 1820 LDA ORA 70C5- 29 F0 1830 AND #$F0 Clear Lo-nibbl 70C7- 4A 1840 LSR A Divide by 2 70C8- A8 1850 TAY and use for index 70C9- C0 1E 1860 CPY #30 If past WEDNESDAY, 70CB- B0 01 1870 BCS =+2 we have an extra char - 70CD- 88 1880 DEY so add 1. 70CE- C8 1890 OUTDAY INY 70CF- B9 B2 71 1900 LDA DAY.TABL,Y 70D2- 20 47 EA 1910 JSR OUTCHR 70D5- 10 F7 1920 BPL OUTDAY 70D7- 20 73 71 1930 JSR SPACE 1940 70DA- A2 0A 1950 ADD.MONTH LDX #$A Start with 10M 70DC- 8E 00 FD 1960 STX ORA 70DF- AD 00 FD 1970 LDA ORA Get 10M 70E2- 29 F0 1980 AND #$F0 Clear Lo-nibbl 70E4- A8 1990 TAY If ORA < $10 then Y=0 70E5- C0 10 2000 CPY #$10 70E7- D0 02 2010 BNE =+3 70E9- A0 28 2020 LDY #40 If ORA = $10 then Y=40 70EB- CA 2030 DEX 70EC- 8E 00 FD 2040 STX ORA 70EF- AD 00 FD 2050 LDA ORA Get 1M 70F2- 29 F0 2060 AND #$F0 Clear Lo-nibbl 70F4- 4A 2070 LSR A Divide by 4 70F5- 4A 2080 LSR A 70F6- AA 2090 TAX If 1M = 0, no need to add to 10M 70F7- F0 04 2100 BEQ OUTMONTH-1 70F9- C8 2110 LP.INDX INY Incr index = to 1M 70FA- CA 2120 DEX Decr remaindr by same amnt 70FB- D0 FC 2130 BNE LP.INDX 2140 70FD- 88 2150 DEY 70FE- C8 2160 OUTMONTH INY 70FF- B9 E7 71 2170 LDA MONTH.TABL-4,Y 7102- 20 47 EA 2180 JSR OUTCHR 7105- 10 F7 2190 BPL OUTMONTH 2200 7107- A0 09 2210 LDY #9 7109- 88 2220 ADD.DATE DEY Start with D10 710A- 8C 00 FD 2230 STY ORA 710D- 20 3D 71 2240 JSR READ 7110- C0 07 2250 CPY #7 7112- D0 F5 2260 BNE ADD.DATE 7114- 20 73 71 2270 JSR SPACE 2280 7117- A9 32 2290 PRE.YEAR LDA #'2 Print "20xx" 7119- 20 47 EA 2300 JSR OUTCHR 711C- A9 30 2310 LDA #'0 711E- 20 47 EA 2320 JSR OUTCHR 7121- A0 0D 2330 LDY #$D 7123- 88 2340 ADD.YEAR DEY Start with Y10 7124- 8C 00 FD 2350 STY ORA 7127- 20 3D 71 2360 JSR READ 712A- C0 0B 2370 CPY #$B 712C- D0 F5 2380 BNE ADD.YEAR 712E- 20 4D E3 2390 JSR CRLF 7131- A9 00 2400 LDA #0 Reset HOLD low 7133- 8D 02 FD 2410 STA ORB 7136- 68 2420 PLA Restore registers 7137- A8 2430 TAY 7138- 68 2440 PLA 7139- AA 2450 TAX 713A- 68 2460 PLA 713B- 28 2470 PLP 713C- 60 2480 RTS 2490 713D- A9 05 2500 READ LDA #5 Set for read mode 713F- 8D 02 FD 2510 STA ORB 7142- AD 00 FD 2520 LDA ORA 7145- C0 05 2530 CPY #5 10H has bit 7 &/or 6 set 7147- D0 02 2540 BNE =+3 7149- 29 3F 2550 AND #$3F Clear bits 7 & 6 714B- C0 08 2560 CPY #8 D10 has bit 6 set 714D- D0 02 2570 BNE =+3 714F- 29 3F 2580 AND #$3F 7151- 20 55 71 2590 JSR OUTDIG 7154- 60 2600 RTS 2610 7155- 4A 2620 OUTDIG LSR A 7156- 4A 2630 LSR A 7157- 4A 2640 LSR A 7158- 4A 2650 LSR A 7159- 18 2660 CLC 715A- 69 30 2670 ADC #$30 715C- 20 47 EA 2680 JSR OUTCHR 715F- 60 2690 RTS 2700 7160- 8D 00 FD 2710 SET.DATA STA ORA 7163- A9 03 2720 LDA #3 Set write mode 7165- 8D 02 FD 2730 STA ORB 7168- A9 01 2740 LDA #1 Set write low 716A- 8D 02 FD 2750 STA ORB 716D- 60 2760 RTS 2770 716E- A9 3F 2780 OUTQM LDA #'? 7170- 20 47 EA 2790 JSR OUTCHR 7173- A9 20 2800 SPACE LDA #' 7175- 20 47 EA 2810 JSR OUTCHR 7178- 60 2820 RTS 2830 7179- 53 65 74 2840 SMSG .BY 'Set time:' $D $A $8A 717C- 20 74 69 717F- 6D 65 3A 7182- 0D 0A 8A 2850 7185- 59 31 30 2860 SET.MSG .BY 'Y10' $A0 'Y01' $A0 'M10' $A0 'M01' $A0 7188- A0 59 30 718B- 31 A0 4D 718E- 31 30 A0 7191- 4D 30 31 7194- A0 7195- 44 31 30 2870 .BY 'D10' $A0 'D01' $A0 'DAY' $A0 7198- A0 44 30 719B- 31 A0 44 719E- 41 59 A0 71A1- 31 30 48 2880 .BY '10H' $A0 '01H' $A0 '10M' $A0 '01M' $A0 71A4- A0 30 31 71A7- 48 A0 31 71AA- 30 4D A0 71AD- 30 31 4D 71B0- A0 71B1- FF 2890 .BY $FF 2900 71B2- 53 55 4E 2910 DAY.TABL .BY 'SUNDAY' $80 $80 71B5- 44 41 59 71B8- 80 80 71BA- 4D 4F 4E 2920 .BY 'MONDAY' $80 $80 71BD- 44 41 59 71C0- 80 80 71C2- 54 55 45 2930 .BY 'TUESDAY' $80 71C5- 53 44 41 71C8- 59 80 71CA- 57 45 44 2940 .BY 'WEDNESDA' $D9 71CD- 4E 45 53 71D0- 44 41 D9 71D3- 54 48 55 2950 .BY 'THURSDA' $D9 71D6- 52 53 44 71D9- 41 D9 71DB- 46 52 49 2960 .BY 'FRIDAY' $80 $80 71DE- 44 41 59 71E1- 80 80 71E3- 53 41 54 2970 .BY 'SATURDA' $D9 71E6- 55 52 44 71E9- 41 D9 2980 71EB- 4A 41 4E 2990 MONTH.TABL .BY 'JAN' $A0 71EE- A0 71EF- 46 45 42 3000 .BY 'FEB' $A0 71F2- A0 71F3- 4D 41 52 3010 .BY 'MAR' $A0 71F6- A0 71F7- 41 50 52 3020 .BY 'APR' $A0 71FA- A0 71FB- 4D 41 59 3030 .BY 'MAY' $A0 71FE- A0 71FF- 4A 55 4E 3040 .BY 'JUN' $A0 7202- A0 7203- 4A 55 4C 3050 .BY 'JUL' $A0 7206- A0 7207- 41 55 47 3060 .BY 'AUG' $A0 720A- A0 720B- 53 45 50 3070 .BY 'SEP' $A0 720E- A0 720F- 4F 43 54 3080 .BY 'OCT' $A0 7212- A0 7213- 4E 4F 56 3090 .BY 'NOV' $A0 7216- A0 7217- 44 45 43 3100 .BY 'DEC' $A0 721A- A0 3110 721B- 3120 SET.TABL .DS 11 3130 3140 .EN 0000,7226,7226 >