10 'PROGRAM TO SET TIME ON REAL TIME CLOCK INSTALLED IN 20 'MORROW REV. 2 BOARD I/O EXPANSION SLOT. 30 ' MIKE ALLEN 8/11/86 40 ' 50 'N ARRAY HOLDS DATA FROM MSM5832 CHIP. 60 ' 70 DIM N(12) 80 ' 90 'CLEAR SCREEN [^Z] 100 ' 110 PRINT CHR$(&H1A); 120 ' 130 'IDENTIFY I/O PORTS FOR 8255 140 ' PA=PORT A - DATA TO/FROM MSM5832 150 ' PB=PORT B - ADDRESS TO MSM5832 160 ' PC=PORT C - CONTROL TO MSM5832 170 ' BIT 4=HOLD 180 ' BIT 5=READ 190 ' BIT 6=WRITE 200 ' BIT 7=CHIP-SELECT-NOT (0 SELECTS MSM5832) 210 ' 220 PA=&H30:PB=&H31:PC=&H32:CTRL=&H33 230 ' 240 'TELL 8255 TO OPERATE IN MODE 0 (SIMPLEST) 250 ' PORT A IS INPUT 260 ' PORTS B & C ARE OUTPUT 270 ' 280 OUT CTRL,&H90 290 ' 300 'SET READ LINE TO MSM5832 TRUE 310 ' (ALSO SETS CHIP-SELECT-NOT TO 0 TO ENABLE MSM5832) 320 ' 330 OUT PC,&H20 340 FOR A=2 TO 12 350 ' 360 'ADDRESS THE TOP 11 REGISTERS IN THE MSM5832 370 'READ THE DATA FROM EACH REGISTER INTO N ARRAY 380 ' 390 OUT PB,A:N(A)=INP(PA) 400 NEXT A 410 ' 420 'TURN OFF THE READ LINE TO THE MSM5832 430 ' 440 OUT PC,&H0 450 ' 460 'FORCE ENTRY TO WHILE LOOP 470 ' 480 NEWIN = -1 490 ' 500 'KEEP LOOPING UNTIL INPUT IS VALID 510 ' 520 WHILE (NEWIN<0 OR NEWIN>99) 530 ' 540 'COMPUTE PRESENT YEAR VALUE 550 ' 560 NEWIN = 10*N(12)+N(11) 570 ' 580 'DISPLAY IT 590 ' 600 PRINT "Year? <";NEWIN;"> "; 610 ' 620 'ENTER NEW VALUE AS STRING 630 ' 640 INPUT "",D$ 650 ' 660 'IF SOMETHING WAS ENTERED, CONVERT IT; IF NOT WE KEEP OLD VALUE OF NEWIN 670 ' 680 IF LEN(D$) THEN NEWIN = VAL(D$) 690 ' 700 'END OF WHILE LOOP 710 ' 720 WEND 730 ' 740 'SET UP FOR MSM5832 REGISTERS 750 ' 760 N(12)=NEWIN\10 770 N(11)=NEWIN MOD 10 780 ' 790 'SINCE MOST OF THE FOLLOWING ENTRY LOOPS ARE MUCH LIKE THE PREVIOUS 800 'YEAR ENTRY LOOP, ONLY MAJOR DIFFERENCES WILL BE COMMENTED. 810 ' 820 LY = -1 830 WHILE(LY<0 OR LY>1) 840 ' 850 'GET BIT 2 OF N(8) - INDICATES A LEAP YEAR 860 ' 870 LY = N(8)\4 880 PRINT "Leap year? [1=yes] <";LY;"> "; 890 INPUT"",D$ 900 IF LEN(D$) THEN LY=VAL(D$) 910 WEND 920 NEWIN=-1 930 WHILE(NEWIN<1 OR NEWIN >12) 940 NEWIN=10*N(10)+N(9) 950 PRINT "Month? <";NEWIN;"> "; 960 INPUT "",D$ 970 IF LEN(D$) THEN NEWIN=VAL(D$) 980 WEND 990 N(10)=NEWIN\10 1000 N(9)=NEWIN MOD 10 1010 NEWIN=-1 1020 WHILE(NEWIN<1 OR NEWIN>31) 1030 NEWIN=10*(N(8) AND &H3)+N(7) 1040 PRINT "Day? <";NEWIN;"> "; 1050 INPUT "",D$ 1060 IF LEN(D$) THEN NEWIN=VAL(D$) 1070 WEND 1080 ' 1090 'DON'T FORGET THE LEAP YEAR FLAG 1100 ' 1110 N(8)=(NEWIN\10)+(4*LY) 1120 N(7)=NEWIN MOD 10 1130 NEWIN=-1 1140 WHILE(NEWIN<0 OR NEWIN>6) 1150 NEWIN=N(6) 1160 PRINT "Day of the week? [0=Sunday, 6=Saturday] <";NEWIN;"> "; 1170 INPUT "",D$ 1180 IF LEN(D$) THEN NEWIN=VAL(D$) 1190 WEND 1200 N(6)=NEWIN 1210 ' 1220 'DEFAULT FOR CIVIL TIME IS AM 1230 ' 1240 CT=1 1250 ' 1260 'N(5) > 3 MEANS EITHER PM OR 24 HR TIME 1270 ' 1280 IF N(5)>3 THEN CT=2 1290 ' 1300 'N(5) > 7 MEANS 24 HR TIME 1310 ' 1320 IF N(5)>7 THEN CT=0 1330 ' 1340 'STRIP 24HR AND PM BITS FROM N(5) 1350 ' 1360 N(5)=N(5) AND &H3 1370 NEWIN=-1 1380 WHILE(NEWIN<0 OR NEWIN>2) 1390 NEWIN=CT 1400 PRINT "24 hr[0], AM[1] or PM[2]? <";NEWIN;"> "; 1410 INPUT "",D$ 1420 IF LEN(D$) THEN NEWIN=VAL(D$) 1430 WEND 1440 CT=NEWIN 1450 ' 1460 'GOTO A DIFFERENT INPUT LOOP FOR 24 HR TIME 1470 ' 1480 IF CT=0 THEN GOTO 1710 1490 ' 1500 'MAKE SURE DEFAULT HOURS ARE CONSISTANT WITH 12 HOUR TIME 1510 ' 1520 NEWIN=10*N(5)+N(4) 1530 IF NEWIN>12 THEN NEWIN=NEWIN-12 1540 IF NEWIN=0 THEN NEWIN=12 1550 N(5)=NEWIN\10 1560 N(4)=NEWIN MOD 10 1570 ' 1580 '12 HOUR INPUT LOOP 1590 ' 1600 NEWIN=-1 1610 WHILE(NEWIN<1 OR NEWIN>12) 1620 NEWIN=10*N(5)+N(4) 1630 PRINT "Hours? <";NEWIN;"> "; 1640 INPUT "",D$ 1650 IF LEN(D$) THEN NEWIN=VAL(D$) 1660 WEND 1670 GOTO 1810 1680 ' 1690 '24 HOUR INPUT LOOP 1700 ' 1710 NEWIN=-1 1720 WHILE(NEWIN<0 OR NEWIN>23) 1730 NEWIN=10*N(5)+N(4) 1740 PRINT "Hours? <";NEWIN;"> "; 1750 INPUT "",D$ 1760 IF LEN(D$) THEN NEWIN=VAL(D$) 1770 WEND 1780 ' 1790 'BOTH HOUR INPUT LOOPS COME TOGETHER HERE 1800 ' 1810 N(5)=NEWIN\10 1820 N(4)=NEWIN MOD 10 1830 ' 1840 'DON'T FORGET THE 24HR OR PM FLAGS 1850 ' 1860 IF CT=0 THEN N(5)=N(5) OR &H8 1870 IF CT=2 THEN N(5)=N(5) OR &H4 1880 NEWIN=-1 1890 WHILE(NEWIN<0 OR NEWIN>59) 1900 NEWIN=10*N(3)+N(2) 1910 PRINT "Minutes? <";NEWIN;"> "; 1920 INPUT "",D$ 1930 IF LEN(D$) THEN NEWIN=VAL(D$) 1940 WEND 1950 N(3)=NEWIN\10 1960 N(2)=NEWIN MOD 10 1970 INPUT "Press RETURN to start clock on the minute",D$ 1980 ' 1990 'SET ALL 3 8255 PORTS AS OUTPUT 2000 ' 2010 OUT CTRL,&H80 2020 ' 2030 'TURN ON HOLD 2040 ' 2050 OUT PC,&H10 2060 ' 2070 'NO NEED TO WAIT - BASIC IS PLENTY SLOW 2080 ' 2090 'WRITE ALL REGISTERS SO SECONDS WILL BE RESET 2100 ' 2110 FOR I=0 TO 12 2120 OUT PB,I 2130 OUT PA,(N(I) AND &HF) 2140 ' 2150 'STROBE THE WRITE LINE 2160 ' 2170 OUT PC,&H50 2180 OUT PC,&H10 2190 NEXT I 2200 ' 2210 'TURN OFF THE HOLD' 2220 ' 2230 OUT PC,&H0 2240 ' 2250 'SET THE 8255 FOR READING THE CLOCK 2260 ' 2270 OUT CTRL,&H90 2280 ' 2290 'EXIT TO CP/M 2300 ' 2310 SYSTEM 2320 END