home *** CD-ROM | disk | FTP | other *** search
- ; B5C-MTN2.INS - Clock routine for Mountain Hardware 100,000 day clock
- ; Dennis Recla 9/15/85
- ;
- ; This version does not take into account the number of days
- ; since some far off starting point (Jan 1, 1978), but begins
- ; from January 1 of the current year. This way only a running
- ; count of days since the beginning of the year needed to be
- ; calculated. When you set the days on the clock be sure you
- ; use the Julian day for the current year.
- ;
- ; Remember to set CLOCK, BCD2BIN, and BIN2BCD to YES.
- ;
- ; Real - Time clock buffer is organized as HH:MM:SS YYY/MM/DD
- ;
- ; RTCBUF:
- ; DB 99H,99H,99H ;HH:MM:SS (BCD 24 Hr Time)
- ; DB 19H,85H,01H,31H ;YYYY/MM/DD (BCD ISO Date)
- ;
- ;
- ;-------------------------------------------------------------------------
- ;
- ;
- CENTURY:EQU 019H ;Current century (19xx) in BCD
- ;
- CLKADR: EQU 0E0H ;Starting address of Clock board
- CLKMSK: EQU 0FH ;Mask for high nibble
- CYEAR: EQU 085H ;Update this once a year (Current Year)
- ;
- ;
- ;
- TIME: IN CLKADR+8 ;Read in the hour value
- ANI CLKMSK ;Remove the high nibble status
- MOV B,A ;Put the value in B to hold
- IN CLKADR+9 ;Read in the 10's of hours
- ANI CLKMSK ;Remove the high nibble status
- CALL ROTADD ;Combine the two values
- STA RTCBUF ;Put the hours value in
- CALL BCDBIN ;Convert the value to binary
- STA CCHOUR ;Store it in the hour value
- ;
- IN CLKADR+6 ;Read in the Minute value
- ANI CLKMSK ;Remove the high nibble status
- MOV B,A ;Put the value in B to hold
- IN CLKADR+7 ;Read in the 10's of Minutes
- ANI CLKMSK ;Remove the high nibble status
- CALL ROTADD ;Combine the two values
- STA RTCBUF+1 ;Put the minutes value in
- CALL BCDBIN ;Convert the value to binary
- STA CCMIN ;Store it in the Minutes value
- ;
- IN CLKADR+4 ;Read in the Seconds value
- ANI CLKMSK ;Remove the high nibble status
- MOV B,A ;Put the value in B to hold
- IN CLKADR+5 ;Read in the 10's of Seconds
- ANI CLKMSK ;Remove the high nibble status
- CALL ROTADD ;Combine the two values
- STA RTCBUF+2 ;Put the seconds value in
- ;
- ; Put Century in the right place
- ;
- MVI A,CENTURY ;Put Century value in A
- STA RTCBUF+3
- ;
- MVI A,CYEAR ;Put Years value in A
- STA RTCBUF+4
- ;
- ; Now to calculate the month and days since Jan 1st
- ;
- IN CLKADR+10 ;Get the days digit
- ANI CLKMSK ;Remove the high nibble status
- MOV B,A ;Store the value in B
- IN CLKADR+11 ;Get the 10's days digit
- ANI CLKMSK ;Remove the high nibble status
- CALL ROTADD ;Rotate and Add the values
- CALL BCDBIN ;Convert the value to Binary
- MOV E,A ;Store it in E
- MVI D,0 ;Clear out the D register
- ;I'll use it later
- ;
- IN CLKADR+12 ;Get the 100's days digit
- ANI CLKMSK ;Remove the high nibble status
- MOV C,A ;Store the value in C
- RLC ; X2
- RLC ; X4
- RLC ; X8
- MOV B,A ; Store the X8 value in B
- RLC ; X16
- ADD B ; Add the X16 and the X8
- ADD C ; Add the X1 value
- ; This is a total of X25
- ;
- LXI H,00 ; Clear the H register
- RLC ; X2
- ORA A ; Clear the Carry
- RAL ; X4 with carry
- JNC LOADHL ; If no carry jump
- MVI H,1 ; Put a 1 in H register
- LOADHL: MOV L,A ; Put a value in the low byte
- DAD D ; Add H&L to D&E
- SHLD TIMEPB ; Store the number of days here
- ;
- MVI A,CYEAR ; Put the Years value in A
- CALL CKLEAP ; Check if leap year
- MVI A,-28
- JNZ FEBNO ; February not 29 days
- MVI A,-29 ; Leap year
- ;
- FEBNO: STA FEB ; Set february
- LHLD TIMEPB ; Get days count
- LXI D,MTABLE ; Point to months table
- MVI B,0FFH ; Set up 'B' for subtract
- MVI A,0 ; Set a for # of months
- ;
- MLOOP: PUSH PSW
- LDAX D ; Get month
- MOV C,A ; Put in 'C' for subtract
- POP PSW
- SHLD TIMEPB ; Save days count
- DAD B ; Subtract
- INX D ; Increment months counter
- INR A
- JC MLOOP ; Loop for next month
- ;
- ;
- ; The months are finished, days count is on stack. First, calculate
- ; month.
- ;
- MDONE: MOV B,A ; Save months
- LHLD TIMEPB
- MOV A,H
- ORA L
- JNZ NZD
- DCX D
- DCX D
- LDAX D
- CMA
- INR A
- MOV L,A
- DCR B
- ;
- NZD: MOV A,B ; Retrieve the binary month
- CALL BINBCD ; Convert binary month to BCD
- STA RTCBUF+5 ; Store BCD month in RTCBUF
- MOV A,L ; Retrieve binary day of month
- CALL BINBCD ; Convert to BCD
- STA RTCBUF+6 ; Store BCD day of month in RTCBUF
- ;
- RET
- ;.....
- ;
- ;
- ; This routine checks for leap years.
- ;
- CKLEAP: MOV B,A
- ANI 0FCH
- CMP B
- RET
- ;.....
- ;
- ; ;Rotate left and Add the B register
- ROTADD: RLC ;Shift the BCD value from low nibble
- RLC ;to the high nibble
- RLC
- RLC ;done shifted it 4 bits left
- ANI 0F0H ;Mask off the high nibble
- ORA B ;add the low nibble and high nibble
- RET
- ;
- ;
- ;
- ; This is the month's table
- ;
- MTABLE: DB -31 ;January
- FEB: DB -28 ;February
- DB -31,-30,-31,-30 ;Mar-Jun
- DB -31,-31,-30 ;Jul-Sep
- DB -31,-30,-31 ;Oct-Dec
- ;
- TIMEPB: DW 0 ; Temporary storage
- ;