TITLE TURBODOS REAL-TIME CLOCK DRIVER NAME ('RTCDRV') ; ; 10/19/84 RDL ADDED 4 MS SUB-POLL ; 11/19/84 RDL FIXED BUG W/ 4 MS SUB-POLL ; 11/24/84 RDL ADDED 4 MS COUNT @ 0008H ; ; ENTRY RTCNIT,RTCISR,RTCCNT,LNKLCP EXTRN INTSP,INTSTK,DLYTIC,RTCSEC,ISRXIT,LNKBEG EXTRN SECS,MINS,HOURS,JDATE,CMOTOR ; ; .Z80 ; DSEG CNT05: DB 5 ; 5 4MS TICKS IN 20MS RTCCNT: DB 50 ;50 20MS TICKS IN ONE SECOND ; LCPPTR: DW LCPHED ;POINTER TO NODE OF LAST XEQ'D LCP ROUTINE ; LCPHED: DW LCPHED ;LIST HEAD FOR LOCAL POLL LIST DW LCPHED ; COMMON /?INIT?/ RTCNIT: ; ; INIT RTC CIRCUIT TO INTERRUPT EVERY 4 MS ; RET ; $EJECT ; COMMON /?BANK?/ ; ; ; INCREMENT THE 4 MS COUNT IN THE USER BANK ; INCBNK: LD (INCSTK),SP ;NEED A LOCAL STACK IN COMMON BANK LD SP,INCSTK ; LD A,1 ;SELECT USER BANK CALL SELBNK DI ; LD HL,(8) ;INCR THE COUNT INC HL LD (8),HL ; XOR A ;SWITCH BACK TO OPSYS BANK CALL SELBNK DI ; LD SP,(INCSTK) ;RESTORE STACK RET ; DS 10H INCSTK: DS 2 ; CSEG ; RTCISR: ;REAL-TIME CLOCK INTERRUPT SERVICE ROUTINE LD (INTSP),SP ;SAVE USER'S STACK POINTER LD SP,INTSTK ;SET UP AUXILLIARY STACK PUSH AF ;SAVE ALL REGISTERS PUSH BC PUSH DE PUSH HL ; CALL INCBNK ;INCR THE USER BANK'S 4 MS COUNT ; LD HL,(8) ;INCR THE OPSYS BANK'S 4 MS COUNT INC HL LD (8),HL ; $EJECT ; ; ; LOCAL POLL ROUTINE -- PROVIDES 4MS POLLING FOR LINKED ROUTINES ; ; ROUTINES POLLED BY LCLPOL ** MUST NOT ** ENABLE INTERRUPTS ; OR CALL SIGNAL ; .8080 LCLPOL: LHLD LCPPTR ;GET PREVIOUS (OR HEAD) NODE MOV E,M ;GET NEXT NODE INX H MOV D,M ; LXI H,LCPHED ;CHECK IF NEXT NODE IS HEAD ORA A .Z80 SBC HL,DE .8080 XCHG SHLD LCPPTR .Z80 JR Z,ENDLCP .8080 ; LXI D,4 ;INCREMENT THE POINTER PAST THE LINKAGE DAD D CALL XPCHL ;CALL THE ROUTINE .Z80 JR LCLPOL .8080 ; XPCHL: PCHL ; ENDLCP: ; $EJECT ; ; ; CONTINUE WITH A MOSTLY STANDARD TURBODOS RTC HANDLER ; LXI H,CNT05 ;FIVE COUNTS = 20MS DCR M ;IF NOT 20MS .Z80 JR NZ,RTCINT2 ; WE'LL RETURN W/O DOING ANYTHING ELSE .8080 MVI M,5 ;ELSE RESET THE COUNT ; CALL DLYTIC ;SIGNAL ONE TICK TO DISPATCHER ; LXI H,RTCCNT ;CHECK IF ONE SECOND DCR M .Z80 JR NZ,RTCINT1 .8080 MVI M,50 CALL RTCSEC ;IF SO, SIGNAL ONE SECOND TO TIMEKEEPER ; RTCINT1: POP H ;RESTORE REGISTERS POP D POP B POP PSW ; .Z80 LD SP,(INTSP) ;RESTORE STACK .8080 ; JMP ISRXIT ;GO TO DISPATCHER TIME SLICER ENTRY ; RTCINT2: POP H ;RESTORE REGISTERS POP D POP B POP PSW ; .Z80 LD SP,(INTSP) ;RESTORE STACK EI RETI ;RETURN WITH NO TIME SLICE .8080 ; ; ; GLOBAL ROUTINE TO LINK A NODE INTO THE LOCAL POLL LIST ; LNKLCP: LXI H,LCPHED JMP LNKBEG ; END