|
|
|
@ -3,24 +3,31 @@ |
|
|
|
; SYSTEM TIMER BASED CLOCK DRIVER |
|
|
|
;================================================================================================== |
|
|
|
; |
|
|
|
TIMRTC_BUFSIZ .EQU 6 ; SIX BYTE BUFFER (YYMMDDHHMMSS) |
|
|
|
INTRTC_BUFSIZ .EQU 6 ; SIX BYTE BUFFER (YYMMDDHHMMSS) |
|
|
|
; |
|
|
|
; RTC DEVICE INITIALIZATION ENTRY |
|
|
|
; |
|
|
|
TIMRTC_INIT: |
|
|
|
INTRTC_INIT: |
|
|
|
LD A,(RTC_DISPACT) ; RTC DISPATCHER ALREADY SET? |
|
|
|
OR A ; SET FLAGS |
|
|
|
RET NZ ; IF ALREADY ACTIVE, ABORT |
|
|
|
; |
|
|
|
CALL NEWLINE ; FORMATTING |
|
|
|
PRTS("TIMRTC: $") |
|
|
|
PRTS("INTRTC: $") |
|
|
|
; |
|
|
|
; HOOK THE HBIOS SECONDS VECTOR |
|
|
|
LD HL,(VEC_SECOND+1) ; GET CUR SECONDS VECTOR |
|
|
|
LD (TIMRTC_VEC),HL ; SAVE IT INTERNALLY |
|
|
|
LD HL,TIMRTC_INT ; OUR SECONDS INT ENTRY |
|
|
|
LD (INTRTC_VEC),HL ; SAVE IT INTERNALLY |
|
|
|
LD HL,INTRTC_INT ; OUR SECONDS INT ENTRY |
|
|
|
LD (VEC_SECOND+1),HL ; REPLACE IT |
|
|
|
; |
|
|
|
; DISPLAY CURRENT TIME |
|
|
|
CALL TIMRTC_GETTIM0 |
|
|
|
LD HL,TIMRTC_BCDBUF ; POINT TO BCD BUF |
|
|
|
CALL INTRTC_GETTIM0 |
|
|
|
LD HL,INTRTC_BCDBUF ; POINT TO BCD BUF |
|
|
|
CALL PRTDT |
|
|
|
; |
|
|
|
LD BC,INTRTC_DISPATCH |
|
|
|
CALL RTC_SETDISP |
|
|
|
; |
|
|
|
XOR A ; SIGNAL SUCCESS |
|
|
|
RET |
|
|
|
@ -29,28 +36,28 @@ TIMRTC_INIT: |
|
|
|
; A: RESULT (OUT), 0=OK, Z=OK, NZ=ERR |
|
|
|
; B: FUNCTION (IN) |
|
|
|
; |
|
|
|
TIMRTC_DISPATCH: |
|
|
|
INTRTC_DISPATCH: |
|
|
|
LD A,B ; GET REQUESTED FUNCTION |
|
|
|
AND $0F ; ISOLATE SUB-FUNCTION |
|
|
|
JP Z,TIMRTC_GETTIM ; GET TIME |
|
|
|
JP Z,INTRTC_GETTIM ; GET TIME |
|
|
|
DEC A |
|
|
|
JP Z,TIMRTC_SETTIM ; SET TIME |
|
|
|
JP Z,INTRTC_SETTIM ; SET TIME |
|
|
|
DEC A |
|
|
|
JP Z,TIMRTC_GETBYT ; GET NVRAM BYTE VALUE |
|
|
|
JP Z,INTRTC_GETBYT ; GET NVRAM BYTE VALUE |
|
|
|
DEC A |
|
|
|
JP Z,TIMRTC_SETBYT ; SET NVRAM BYTE VALUE |
|
|
|
JP Z,INTRTC_SETBYT ; SET NVRAM BYTE VALUE |
|
|
|
DEC A |
|
|
|
JP Z,TIMRTC_GETBLK ; GET NVRAM DATA BLOCK VALUES |
|
|
|
JP Z,INTRTC_GETBLK ; GET NVRAM DATA BLOCK VALUES |
|
|
|
DEC A |
|
|
|
JP Z,TIMRTC_SETBLK ; SET NVRAM DATA BLOCK VALUES |
|
|
|
JP Z,INTRTC_SETBLK ; SET NVRAM DATA BLOCK VALUES |
|
|
|
CALL PANIC |
|
|
|
; |
|
|
|
; NVRAM FUNCTIONS ARE NOT AVAILABLE IN SIMULATOR |
|
|
|
; |
|
|
|
TIMRTC_GETBYT: |
|
|
|
TIMRTC_SETBYT: |
|
|
|
TIMRTC_GETBLK: |
|
|
|
TIMRTC_SETBLK: |
|
|
|
INTRTC_GETBYT: |
|
|
|
INTRTC_SETBYT: |
|
|
|
INTRTC_GETBLK: |
|
|
|
INTRTC_SETBLK: |
|
|
|
CALL PANIC |
|
|
|
; |
|
|
|
; RTC GET TIME |
|
|
|
@ -59,19 +66,19 @@ TIMRTC_SETBLK: |
|
|
|
; BUFFER FORMAT IS BCD: YYMMDDHHMMSS |
|
|
|
; 24 HOUR TIME FORMAT IS ASSUMED |
|
|
|
; |
|
|
|
TIMRTC_GETTIM: |
|
|
|
INTRTC_GETTIM: |
|
|
|
; GET THE TIME INTO TEMP BUF |
|
|
|
PUSH HL ; SAVE PTR TO CALLERS BUFFER |
|
|
|
CALL TIMRTC_GETTIM0 ; GET TIME TO WORK BUFFER |
|
|
|
CALL INTRTC_GETTIM0 ; GET TIME TO WORK BUFFER |
|
|
|
; |
|
|
|
; NOW COPY TO REAL DESTINATION (INTERBANK SAFE) |
|
|
|
LD A,BID_BIOS ; COPY FROM BIOS BANK |
|
|
|
LD (HB_SRCBNK),A ; SET IT |
|
|
|
LD A,(HB_INVBNK) ; COPY TO CURRENT USER BANK |
|
|
|
LD (HB_DSTBNK),A ; SET IT |
|
|
|
LD HL,TIMRTC_BCDBUF ; SOURCE ADR |
|
|
|
LD HL,INTRTC_BCDBUF ; SOURCE ADR |
|
|
|
POP DE ; DEST ADR |
|
|
|
LD BC,TIMRTC_BUFSIZ ; LENGTH |
|
|
|
LD BC,INTRTC_BUFSIZ ; LENGTH |
|
|
|
CALL HB_BNKCPY ; COPY THE CLOCK DATA |
|
|
|
; |
|
|
|
LD DE,60 ; DELAY 60 * 16US = ~1MS |
|
|
|
@ -79,11 +86,11 @@ TIMRTC_GETTIM: |
|
|
|
XOR A ; SIGNAL SUCCESS |
|
|
|
RET ; AND RETURN |
|
|
|
; |
|
|
|
TIMRTC_GETTIM0: |
|
|
|
LD HL,TIMRTC_BINBUF ; FROM BINARY BUFFER |
|
|
|
LD DE,TIMRTC_BCDBUF ; TO BCD BUFFER |
|
|
|
INTRTC_GETTIM0: |
|
|
|
LD HL,INTRTC_BINBUF ; FROM BINARY BUFFER |
|
|
|
LD DE,INTRTC_BCDBUF ; TO BCD BUFFER |
|
|
|
HB_DI |
|
|
|
CALL TIMRTC_BIN2BCD ; COPY AND CONVERT |
|
|
|
CALL INTRTC_BIN2BCD ; COPY AND CONVERT |
|
|
|
HB_EI |
|
|
|
RET |
|
|
|
; |
|
|
|
@ -93,20 +100,20 @@ TIMRTC_GETTIM0: |
|
|
|
; BUFFER FORMAT IS BCD: YYMMDDHHMMSSWW |
|
|
|
; 24 HOUR TIME FORMAT IS ASSUMED |
|
|
|
; |
|
|
|
TIMRTC_SETTIM: |
|
|
|
INTRTC_SETTIM: |
|
|
|
; COPY TO BCD BUF |
|
|
|
LD A,(HB_INVBNK) ; COPY FROM CURRENT USER BANK |
|
|
|
LD (HB_SRCBNK),A ; SET IT |
|
|
|
LD A,BID_BIOS ; COPY TO BIOS BANK |
|
|
|
LD (HB_DSTBNK),A ; SET IT |
|
|
|
LD DE,TIMRTC_BCDBUF ; DEST ADR |
|
|
|
LD BC,TIMRTC_BUFSIZ ; LENGTH |
|
|
|
LD DE,INTRTC_BCDBUF ; DEST ADR |
|
|
|
LD BC,INTRTC_BUFSIZ ; LENGTH |
|
|
|
CALL HB_BNKCPY ; COPY THE CLOCK DATA |
|
|
|
; |
|
|
|
LD HL,TIMRTC_BCDBUF ; FROM BCD BUF |
|
|
|
LD DE,TIMRTC_BINBUF ; TO BIN BUF |
|
|
|
LD HL,INTRTC_BCDBUF ; FROM BCD BUF |
|
|
|
LD DE,INTRTC_BINBUF ; TO BIN BUF |
|
|
|
HB_DI |
|
|
|
CALL TIMRTC_BCD2BIN ; COPY AND CONVERT |
|
|
|
CALL INTRTC_BCD2BIN ; COPY AND CONVERT |
|
|
|
HB_EI |
|
|
|
; |
|
|
|
XOR A ; SIGNAL SUCCESS |
|
|
|
@ -114,108 +121,108 @@ TIMRTC_SETTIM: |
|
|
|
; |
|
|
|
; HANDLER FOR TIMER SECONDS INTERRUPT |
|
|
|
; |
|
|
|
TIMRTC_INT: |
|
|
|
LD HL,TIMRTC_BINBUF + TIMRTC_BUFSIZ - 1 |
|
|
|
INTRTC_INT: |
|
|
|
LD HL,INTRTC_BINBUF + INTRTC_BUFSIZ - 1 |
|
|
|
INC (HL) ; INC SECONDS |
|
|
|
LD A,59 ; MAX VALUE |
|
|
|
CP (HL) ; OVERFLOW? |
|
|
|
JR NC,TIMRTC_INTX ; NOPE, DONE |
|
|
|
JR NC,INTRTC_INTX ; NOPE, DONE |
|
|
|
LD (HL),0 ; BACK TO ZERO |
|
|
|
|
|
|
|
DEC HL ; POINT TO MINUTES |
|
|
|
INC (HL) ; INCREMENT MINUTE |
|
|
|
CP (HL) ; OVERFLOW? |
|
|
|
JR NC,TIMRTC_INTX ; NOPE, DONE |
|
|
|
JR NC,INTRTC_INTX ; NOPE, DONE |
|
|
|
LD (HL),0 ; BACK TO ZERO |
|
|
|
|
|
|
|
DEC HL ; POINT TO HOURS |
|
|
|
INC (HL) ; INCREMENT HOURS |
|
|
|
LD A,23 ; MAX VALUE |
|
|
|
CP (HL) ; OVERFLOW? |
|
|
|
JR NC,TIMRTC_INTX ; NOPE, DONE |
|
|
|
JR NC,INTRTC_INTX ; NOPE, DONE |
|
|
|
LD (HL),0 ; BACK TO ZERO |
|
|
|
|
|
|
|
DEC HL ; POINT TO DATE |
|
|
|
LD A,(TIMRTC_MO) ; GET CURRENT MONTH |
|
|
|
LD A,(INTRTC_MO) ; GET CURRENT MONTH |
|
|
|
DEC A ; ZERO OFFSET |
|
|
|
LD DE,TIMRTC_MONTBL ; POINT TO DAYS IN MON TBL |
|
|
|
LD DE,INTRTC_MONTBL ; POINT TO DAYS IN MON TBL |
|
|
|
ADD A,E ; ADD OFFSET |
|
|
|
LD E,A ; BACK TO E |
|
|
|
JR NC,TIMRTC_INT1 ; NO CARRY, SKIP |
|
|
|
JR NC,INTRTC_INT1 ; NO CARRY, SKIP |
|
|
|
INC D ; HANDLE CARRY |
|
|
|
TIMRTC_INT1: |
|
|
|
INTRTC_INT1: |
|
|
|
LD A,(DE) ; A := DAYS IN MONTH |
|
|
|
LD C,A ; COPY TO C FOR LATER |
|
|
|
LD A,(TIMRTC_MO) ; GET CURRENT MONTH |
|
|
|
LD A,(INTRTC_MO) ; GET CURRENT MONTH |
|
|
|
CP 2 ; FEBRUARY? |
|
|
|
JR NZ,TIMRTC_INT2 ; IF NOT, NOT LEAY, SKIP |
|
|
|
LD A,(TIMRTC_YR) ; GET CURRENT YEAR |
|
|
|
JR NZ,INTRTC_INT2 ; IF NOT, NOT LEAY, SKIP |
|
|
|
LD A,(INTRTC_YR) ; GET CURRENT YEAR |
|
|
|
AND $03 ; CHECK FOR LEAP |
|
|
|
JR NZ,TIMRTC_INT2 ; IF NOT LEAP, SKIP AHEAD |
|
|
|
JR NZ,INTRTC_INT2 ; IF NOT LEAP, SKIP AHEAD |
|
|
|
INC C ; BUMP DAYS IN FEB FOR LEAP |
|
|
|
TIMRTC_INT2: |
|
|
|
INTRTC_INT2: |
|
|
|
INC (HL) ; INCREMENT DATE |
|
|
|
LD A,C ; A := TRUE DAYS IN MONTH + 1 |
|
|
|
CP (HL) ; OVERFLOW? |
|
|
|
JR NZ,TIMRTC_INTX ; NOPE, DONE |
|
|
|
JR NZ,INTRTC_INTX ; NOPE, DONE |
|
|
|
LD (HL),1 ; BACK TO DAY ONE |
|
|
|
|
|
|
|
DEC HL ; POINT TO MONTH |
|
|
|
INC (HL) ; INCREMENT MONTH |
|
|
|
LD A,13 ; PAST MAX? |
|
|
|
CP (HL) ; OVERFLOW? |
|
|
|
JR NZ,TIMRTC_INTX ; NOPE, DONE |
|
|
|
JR NZ,INTRTC_INTX ; NOPE, DONE |
|
|
|
LD (HL),1 ; BACK TO MONTH ONE |
|
|
|
|
|
|
|
DEC HL ; POINT TO YEAR |
|
|
|
INC (HL) ; INCREMENT YEAR |
|
|
|
LD A,100 ; PAST MAX? |
|
|
|
CP (HL) ; OVERFLOW? |
|
|
|
JR NZ,TIMRTC_INTX ; NOPE, DONE |
|
|
|
JR NZ,INTRTC_INTX ; NOPE, DONE |
|
|
|
LD (HL),0 ; BACK TO YEAR ZERO |
|
|
|
TIMRTC_INTX: |
|
|
|
INTRTC_INTX: |
|
|
|
JP PANIC |
|
|
|
TIMRTC_VEC .EQU $-2 |
|
|
|
INTRTC_VEC .EQU $-2 |
|
|
|
; |
|
|
|
; CONVERT FROM BINARY BUF (HL) TO BCD BUF (DE) |
|
|
|
; |
|
|
|
TIMRTC_BIN2BCD: |
|
|
|
LD B,TIMRTC_BUFSIZ |
|
|
|
TIMRTC_BIN2BCD1: |
|
|
|
INTRTC_BIN2BCD: |
|
|
|
LD B,INTRTC_BUFSIZ |
|
|
|
INTRTC_BIN2BCD1: |
|
|
|
LD A,(HL) |
|
|
|
CALL BYTE2BCD |
|
|
|
LD (DE),A |
|
|
|
INC HL |
|
|
|
INC DE |
|
|
|
DJNZ TIMRTC_BIN2BCD1 |
|
|
|
DJNZ INTRTC_BIN2BCD1 |
|
|
|
RET |
|
|
|
; |
|
|
|
; CONVERT FROM BCD BUF (HL) TO BINARY BUF (DE) |
|
|
|
; |
|
|
|
TIMRTC_BCD2BIN |
|
|
|
LD B,TIMRTC_BUFSIZ |
|
|
|
TIMRTC_BCD2BIN1: |
|
|
|
INTRTC_BCD2BIN |
|
|
|
LD B,INTRTC_BUFSIZ |
|
|
|
INTRTC_BCD2BIN1: |
|
|
|
LD A,(HL) |
|
|
|
CALL BCD2BYTE |
|
|
|
LD (DE),A |
|
|
|
INC HL |
|
|
|
INC DE |
|
|
|
DJNZ TIMRTC_BCD2BIN1 |
|
|
|
DJNZ INTRTC_BCD2BIN1 |
|
|
|
RET |
|
|
|
; |
|
|
|
; WORKING VARIABLES |
|
|
|
; |
|
|
|
TIMRTC_BINBUF: ; ALL IN BINARY |
|
|
|
TIMRTC_YR .DB 20 |
|
|
|
TIMRTC_MO .DB 01 |
|
|
|
TIMRTC_DT .DB 01 |
|
|
|
TIMRTC_HH .DB 00 |
|
|
|
TIMRTC_MM .DB 00 |
|
|
|
TIMRTC_SS .DB 00 |
|
|
|
INTRTC_BINBUF: ; ALL IN BINARY |
|
|
|
INTRTC_YR .DB 20 |
|
|
|
INTRTC_MO .DB 01 |
|
|
|
INTRTC_DT .DB 01 |
|
|
|
INTRTC_HH .DB 00 |
|
|
|
INTRTC_MM .DB 00 |
|
|
|
INTRTC_SS .DB 00 |
|
|
|
; |
|
|
|
TIMRTC_BCDBUF .FILL TIMRTC_BUFSIZ |
|
|
|
INTRTC_BCDBUF .FILL INTRTC_BUFSIZ |
|
|
|
; |
|
|
|
TIMRTC_MONTBL: ; DAYS IN MONTH + 1 |
|
|
|
INTRTC_MONTBL: ; DAYS IN MONTH + 1 |
|
|
|
.DB 32 ; JANUARY |
|
|
|
.DB 29 ; FEBRUARY (NON-LEAP) |
|
|
|
.DB 32 ; MARCH |