00000 ; SOURCE 00100 ;******************************************************** 00110 ;* Setclk routine for U-bus RTCC * 00120 ;* Written by F.J. Kraan 5 mei 1989 * 00130 ;* Latest update 12 december 1989 * 00140 ;******************************************************** 00150 ORG 05200H ; Default start point 00160 SETCLK JP START 00170 DAT EQU 132D ; Port A data address 00180 ADR EQU 133D ; Port B address address 00190 CON EQU 134D ; Port C r/w cntl.address 00200 PCTL EQU 135D ; Pia control word addres 00210 HOUR EQU 16451D ; Dos hour byte 00220 MINIT EQU 16450D ; Dos minit byte address 00230 SECON EQU 16449D ; Dos seconds byte addres 00240 DOS EQU 402DH ; Dos reentry 00250 YEAR EQU 16452D ; Dos year byte address 00260 MONTH EQU 16554D ; Dos month byte address 00270 DAY EQU 16553D ; Dos day byte address 00280 DOSDISP EQU 4467H ; Dos' display routine 00290 CWR EQU 128D ; Cntl.word write port A 00300 CRD EQU 144D ; Cntl.word read port A 00310 00320 MOFF EQU 0 ; RTC any mode off 00330 HOLD EQU 16D ; RTC hold 00340 READ EQU 48D ; RTC hold + read 00350 WRITE EQU 80D ; RTC hold + write 00360 LPTIM EQU 46D ; Wait const 150uS @4MHz 00370 SLEAP EQU 1D ; Leap year flag set 00380 RLEAP EQU 0D ; Leap year flag reset 00390 MASK EQU 011B ; used for H10 and D10 00400 SEC1 EQU 0 ; Rtc single seconds 00410 SEC10 EQU 1 ; Rtc decade seconds 00420 MIN1 EQU 2 ; Rtc single minutes 00430 MIN10 EQU 3 ; RTC decade minutes 00440 HOUR1 EQU 4 ; Rtc single hours 00450 HOUR10 EQU 5 ; Rtc decade hours+flags 00460 DOW EQU 6 ; Rtc day of week 00470 DAY1 EQU 7 ; Rtc single day 00480 DAY10 EQU 8 ; Rtc decade day 00490 MNTH1 EQU 9 ; Rtc single month 00500 MNTH10 EQU 10D ; Rtc decade month+flags 00510 YEAR1 EQU 11D ; Rtc single years 00520 YEAR10 EQU 12D ; RTC decade years 00530 S1 DEFB 'x' 00540 S10 DEFB 'x' 00550 MI1 DEFB 'x' 00560 MI10 DEFB 'x' 00570 H1 DEFB 'x' 00580 H10 DEFB 'x' 00590 W DEFB 'x' 00600 D1 DEFB 'x' 00610 D10 DEFB 'x' 00620 MO1 DEFB 'x' 00630 MO10 DEFB 'x' 00640 Y1 DEFB 'x' 00650 Y10 DEFB 'x' 00660 TSECON DEFB 'x' 00670 TMINIT DEFB 'x' 00680 THOUR DEFB 'x' 00690 TYEAR DEFB 'x' 00700 TDAY DEFB 'x' 00710 TMONTH DEFB 'x' 00720 MES1 DEFM 'Electrickery Utilities (c) 1989' 00730 DEFB 0DH 00740 MES2 DEFM 'Dos Clock is set.' 00750 DEFB 0DH 00760 PPINIT LD A,CRD 00770 LD B,0 00780 LD C,PCTL 00790 OUT (C),A 00800 LD A,MOFF 00810 LD C,CON 00820 OUT (C),A 00830 RET 00840 SETHOLD LD A,HOLD 00850 LD C,CON 00860 OUT (C),A 00870 RET 00880 00890 RSTHOLD LD A,MOFF 00900 LD C,CON 00910 OUT (C),A 00920 RET 00930 00940 RDRTC LD A,READ 00950 LD C,CON 00960 OUT (C),A 00970 00980 LD HL,S1 00990 LD E,0 01000 LD C,ADR 01010 LOOP OUT (C),E 01020 NOP 01030 NOP 01040 IN A,(DAT) 01050 LD (HL),A 01060 INC HL 01070 INC E 01080 LD A,E 01090 CP 13D 01100 JP NZ,LOOP 01110 RET 01120 CONVNB NOP 01130 ; This routine makesd two BCD nibbles to a single 01140 ; byte. At entry MSN is in B, LSN is in C. At exit 01150 ; the byte is in A. 01160 SLA B 01170 LD A,B 01180 SLA B 01190 SLA B 01200 ADD A,B 01210 ADD A,C 01220 RET 01230 SETTIME EQU $ 01240 LD A,(S1) 01250 LD C,A 01260 LD A,(S10) 01270 LD B,A 01280 CALL CONVNB 01290 LD (TSECON),A 01300 LD A,(MI1) 01310 LD C,A 01320 LD A,(MI10) 01330 LD B,A 01340 CALL CONVNB 01350 LD (TMINIT),A 01360 LD A,(H1) 01370 LD C,A 01380 LD A,(H10) 01390 AND MASK 01400 LD B,A 01410 CALL CONVNB 01420 LD (THOUR),A 01430 RET 01440 SETDATE EQU $ 01450 LD A,(D1) 01460 LD C,A 01470 LD A,(D10) 01480 AND MASK 01490 LD B,A 01500 CALL CONVNB 01510 LD (TDAY),A 01520 LD A,(MO1) 01530 LD C,A 01540 LD A,(MO10) 01550 LD B,A 01560 CALL CONVNB 01570 LD (TMONTH),A 01580 LD A,(Y1) 01590 LD C,A 01600 LD A,(Y10) 01610 LD B,A 01620 CALL CONVNB 01630 LD (TYEAR),A 01640 RET 01650 SETDOS NOP 01660 LD HL,TSECON 01670 LD DE,SECON 01680 LD B,0 01690 LD C,6 01700 DI 01710 LDIR 01720 EI 01730 RET 01740 MESSAG EQU $ 01750 LD HL,MES1 01760 CALL DOSDISP 01770 LD HL,MES2 01780 CALL DOSDISP 01790 RET 01800 W150US NOP ; Keep 1st byte free 01810 ; This is a 150uS wait routine at the cpu clock speed 01820 ; of 4 MHz. At this speed the DJNZ instruction takes 01830 ; about 3.25 uS, so 46 should be enough. 01840 PUSH BC ; Save B register 01850 LD B,46 ; Init wait loop 01860 WAIT DJNZ WAIT ; Wait 01870 POP BC ; Retreive B register 01880 RET ; Back 01890 START CALL PPINIT 01900 CALL SETHOLD 01910 CALL W150US 01920 CALL RDRTC 01930 CALL RSTHOLD 01940 CALL SETTIME 01950 CALL SETDATE 01960 CALL SETDOS 01970 CALL MESSAG 01980 JP DOS