home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / sigm / vol131 / clock.src < prev    next >
Text File  |  1984-04-29  |  10KB  |  390 lines

  1.                     NAME CLOCK
  2.                     ENTRY CLOCK
  3.  
  4.  
  5. CLKBAS EQU 50H        = CLOCK PORT BASE ADDRESS
  6. CLKCMD EQU CLKBAS+10  =   "   COMMAND PORT ADDRESS
  7. CLKDTA EQU CLKBAS+11  =   "   DATA     "      "
  8. BIOS EQU 5
  9. TO_CPM EQU 0
  10. NO_OP EQU 00H
  11. RDFREE EQU 10H
  12. WRFREE EQU 20H
  13. HOLD EQU 40H
  14. RDHELD EQU 50H
  15. WRHELD EQU 60H
  16. SECS01 EQU 00H
  17. SECS10 EQU 01H
  18. MINS01 EQU 02H
  19. MINS10 EQU 03H
  20. HRS01 EQU 04H
  21. HRS10 EQU 05H
  22. AM_PM EQU 05H
  23. WKDAY EQU 06H
  24. DAYS01 EQU 07H
  25. DAYS10 EQU 08H
  26. LEAPYR EQU 08H
  27. MTHS01 EQU 09H
  28. MTHS10 EQU 0AH
  29. YRS01 EQU 0BH
  30. YRS10 EQU 0CH
  31. ROW EQU 01
  32. COLM EQU 55
  33.  
  34.                     **********************
  35.                     *                    *
  36.                     *        MACROS      *
  37.                     *                    *
  38.                     **********************
  39.  
  40. TYPE:   MACRO MSG
  41.         LXI D,MSG
  42.         CALL TYPIST
  43.         ENDMAC
  44.  
  45.  
  46. PRNT1:  MACRO
  47.         MOV A,M
  48.         CALL RDDGT
  49.         ADI 30H
  50.         CALL PRNTCHAR
  51.         ENDMAC
  52.        
  53.                    *****************************
  54.                    *                           *
  55.                    *         MAIN LOOP         *
  56.                    *                           *
  57.                    *****************************
  58.  
  59.  
  60. CLOCK:   LXI SP,STACK    SETUP LOCAL STACK
  61. CLKBGN:  CALL CLRHOM
  62.          CALL BEEP
  63. CLKRPT:  TYPE SIGNON
  64.          CALL RESPONSE
  65.          CPI 'X'
  66.          JZ TO_CPM
  67.          CPI 'S'
  68.          JZ SETTIME
  69.          CPI 'P'
  70.          JZ PRNTTIME
  71.          CPI 'C'
  72.          JZ FOREVER
  73.          TYPE BOOBOO
  74.          JMP CLKBGN
  75.  
  76.  
  77.                   ******************************
  78.                   *                            *
  79.                   *        SUBROUTINES         *
  80.                   *                            *
  81.                   ******************************
  82.  
  83. * CLEAR THE SCREEN AND HOME THE CURSOR :
  84.  
  85. clrhom:  TYPE CLEAR
  86.          RET
  87. clear:   db 1Ah,1Eh,24h ;1A=ASCII for clear screen
  88.                         ;1E   "    "  home cursor
  89.                         ;24   "    "  end/TEXT
  90.  
  91.                   *********************
  92.  
  93. * RING CURSOR BELL :
  94.  
  95. BEEP:   TYPE DING
  96.         RET
  97. ding:   DB 07h,24h     ;07=ASCII for bell,24=end/TEXT
  98.  
  99.                   *********************
  100.  
  101. * MASTER ROUTINE FOR GETTING TIME AND DATE INPUT FROM USER.
  102. * POINTS HL AND DE TO BUFFER AND COMMAND TABLE RESPECTIVELY.
  103. * BUFFER IS FILLED AND THEN DIGITS WRITTEN FROM BUFFER TO CLOCK.
  104.  
  105. SETTIME: CALL GETTIME    FILL THE TIME/DATE DIGIT BUFFER
  106.          LXI H,DTABLE    POINT HL TO BUFFER
  107.          LXI D,ATABLE    POINT DE TO COMMAND TABLE
  108.          MVI B,14        SETUP B AS COUNTER
  109.          MVI A,HOLD      STOP THE CLOCK
  110.          OUT CLKCMD
  111. SET1:    DCR B
  112.          JZ SET2        IF ALL DONE THEN ------.
  113.          MOV A,M        ELSE:GET DIGIT > A     |
  114.          MOV C,A        & MOVE IT > C,         |
  115.          LDAX D         GET COMMAND > A &      |
  116.          CALL WRTDGT    WRITE DIGIT > CLOCK.   |
  117.          INX H          BUMP                   |
  118.          INX D          POINTERS               |
  119.          JMP SET1       & LOOP.                |
  120. SET2:    MVI A,NO_OP    CLEAR CMND PORT,  <----'
  121.          OUT CLKCMD     
  122.          CALL CLKPRNT
  123.          JMP CLKBGN     & EXIT SUBROUTINE.
  124.  
  125.                    ****************
  126.  
  127. * NEXT S/R GETS DIGITS FROM CONSOLE INTO THE
  128. * BUFFER POINTED TO BY HL.
  129.  
  130. GETTIME: TYPE ASKTIME
  131.          LXI H,DTABLE
  132. GET1:    CALL GETNUMB
  133.          CPI 0DH
  134.          JZ GETDATE
  135.          ANI 0FH
  136.          MOV M,A
  137.          INX H
  138.          JMP GET1
  139. GETDATE: TYPE ASKDATE
  140. GET2:    CALL GETNUMB
  141.          CPI 0DH
  142.          JZ GETDAY
  143.          ANI 0FH
  144.          MOV M,A
  145.          INX H
  146.          JMP GET2
  147. GETDAY:  TYPE ASKDAY
  148. GET3:    CALL GETNUMB
  149.          CPI 0DH
  150.          RZ
  151.          ANI 0FH
  152.          MOV M,A
  153.          INX H
  154.          JMP GET3
  155.  
  156.                     ******************
  157.  
  158. * NEXT S/R GETS A CHARACTER FROM CONSOLE :
  159. *        :RETURNS ONLY 'LEGAL' CHARACTERS
  160. *        :(i.e. A  C/R OR A NUMERAL)
  161.  
  162. GETNUMB: CALL RESPONSE
  163.          CPI 0DH
  164.          RZ
  165.          CPI '0'
  166.          JC GETNUMB
  167.          CPI '9'+1
  168.          JNC GETNUMB
  169.          RET
  170.  
  171.                     ******************
  172.  
  173. * WRITE A DIGIT TO THE CLOCK :
  174. * SET THE 24hr & LEAPYEAR BITS :
  175. * ON CALL DIGIT COMMAND IS IN A :
  176. *  "  "     "   IS IN C :
  177.  
  178. WRTDGT: PUSH PSW           SAVE THE COMMAND
  179.         ADI HOLD           ADD HOLD COMMAND
  180.         OUT CLKCMD         INSTRUCT CLOCK
  181.         CPI AM_PM+HOLD     24 HR BYTE ?
  182.         JNZ WRT1
  183.         MOV A,C            IF SO :
  184.         ADI 08H            SET 24 HR BIT.
  185.         JMP WRT3
  186. WRT1:   CPI LEAPYR+HOLD    LEAP YEAR BYTE ?
  187.         JNZ WRT2
  188.         MOV A,C            IF SO :
  189.         ANI 03H            SET LEAPYEAR BIT.
  190.         JMP WRT3
  191. WRT2:   MOV A,C            DIGIT > A
  192. WRT3:   OUT CLKDTA         DIGIT > CLOCK
  193.         POP PSW            COMMAND > A
  194.         ADI WRHELD         ADD WRITE & HOLD COMMANDS
  195.         OUT CLKCMD
  196.         SUI WRFREE         REMOVE 'WRITE' FROM COMMAND
  197.         OUT CLKCMD         SEND LAST COMMAND OF SEQUENCE
  198.         RET
  199.  
  200.                  *************************
  201.  
  202. * THE NEXT S/R READS A DIGIT FROM THE CLOCK : 
  203. *             :THE LEAPYEAR AND 24hr MODE BITS ARE MASKED.
  204. *             :ON CALL THE DIGIT COMMAND MUST BE IN A.
  205. *             :ON RETURN THE DIGIT VALUE IS IN A.
  206.  
  207. RDDGT: ADI RDFREE          ADD 'READ' TO COMMAND.
  208.        OUT CLKCMD
  209.        CPI RDFREE+AM_PM   WILL IT CONTAIN 24hr BIT?
  210.        IN CLKDTA          GET DIGIT
  211.        RNZ
  212.        SUI 8              KILL 24hr BIT
  213.        RET
  214.  
  215.                 ***************************
  216.  
  217. * MOVE CURSOR TO PREDEFINED ROW/COLUMN LOCATION
  218.  
  219. CRSR:    PUSH H       ;
  220.          PUSH D
  221.          PUSH B
  222.          MVI E,1BH    ;ESC
  223.          MVI C,2
  224.          CALL 5
  225.          MVI E,3DH    ;=
  226.          MVI C,2
  227.          CALL 5
  228.          MVI E,ROW+31 ;ROW OUT
  229.          MVI C,2
  230.          CALL 5
  231.          MVI E,COLM+31;COLUMN OUT
  232.          MVI C,2
  233.          CALL 5
  234.          POP B
  235.          POP D
  236.          POP H         
  237.          RET
  238.  
  239.                 *************************
  240.  
  241. * NEXT S/R PRINTS THE CURRENT TIME AND DATE ONCE,COMPLETE
  242. * WITH COLONS AND SLASHES,THEN RETURNS.
  243.  
  244. CLKPRNT: CALL CRSR
  245.          LXI H,ATABLE      POINT HL TO TABLE OF COMMANDS
  246.          CALL PRINT2       PRINT 1ST 2 DIGITS
  247.          MVI A,':'
  248.          CALL PRNTCHAR
  249.          CALL PRINT2       PRINT NEXT 2 DIGITS
  250.          MVI A,':'
  251.          CALL PRNTCHAR
  252.          CALL PRINT2       & NEXT 2
  253.          MVI A,' '
  254.          CALL PRNTCHAR
  255.          MVI A,' '         & 2 SPACES
  256.          CALL PRNTCHAR
  257.          CALL PRINT2       & 2 MORE DIGITS
  258.          MVI A,'/'
  259.          CALL PRNTCHAR
  260.          CALL PRINT2       & 2 MORE
  261.          MVI A,'/'
  262.          CALL PRNTCHAR
  263.          CALL PRINT2       & LAST 2
  264.          RET
  265.  
  266.                  **********************
  267.  
  268. PRINT2:  PRNT1
  269.          INX H
  270.          PRNT1
  271.          INX H
  272.          RET
  273.  
  274.                ***********************
  275.  
  276. PRNTTIME: CALL CLRHOM
  277.           CALL CLKPRNT
  278.           JMP CLKRPT
  279.  
  280.                ************************
  281.  
  282. * NEXT S/R PRINTS THE TIME, UPDATES IT ONCE EVERY SECOND,
  283. * AND CONTINUES DOING SO UNTIL A ^C IS TYPED.
  284.  
  285. FOREVER: CALL CLRHOM
  286.          MVI A,0AH
  287.          CALL PRNTCHAR
  288. FOR1:    MVI A,0DH
  289.          CALL PRNTCHAR
  290.          CALL CLKPRNT
  291.          MVI A,SECS01
  292.          CALL RDDGT
  293.          MOV B,A
  294. FOR2:    MVI A,SECS01
  295.          CALL RDDGT
  296.          CMP B
  297.          JZ FOR2
  298.          JMP FOR1
  299.  
  300.                    ***********************
  301.  
  302. RESPONSE: PUSH H
  303.           MVI C,01    BIOS CHAR/IN
  304.           CALL BIOS
  305.           POP H
  306.           CPI 'a'    RANGE CHECK UPPER CASE
  307.           JC SKIP
  308.           ANI 5FH    CONVERT TO UPPER CASE
  309. SKIP:     ANI 7FH    STRIP OFF PARITY
  310.           CPI 03H    CHECK FOR ^C
  311.           JZ TO_CPM
  312.           RET
  313.  
  314.                    ************************
  315.  
  316. * NEXT S/R PRINTS A CHARACTER ON THE SCREEN :
  317. *   (ALSO WATCHES FOR ^C INPUT FROM CONSOLE).
  318.  
  319. PRNTCHAR: PUSH D      -.
  320.           MOV E,A      |
  321.           MVI C,2      | = PRINT CHARACTER
  322.           PUSH H       |
  323.           CALL BIOS   _|
  324.  
  325.           MVI C,0BH   -.
  326.                *       | = CHECK CONSOLE
  327.           CALL BIOS   _|
  328.  
  329.           POP H
  330.           POP D
  331.  
  332.           ORA A        -.   IF A KEY WAS STRUCK
  333.           CNZ RESPONSE  |   THEN GET CHARACTER 
  334.                *        |   & CHECK FOR ^C.
  335.                *       _|
  336.           RET
  337.  
  338.                  **********************
  339.  
  340. TYPIST: PUSH H
  341.         MVI C,09H
  342.         CALL BIOS
  343.         POP H
  344.         RET
  345.  
  346.                      ************************
  347.                      *                      *
  348.                      *     MESSAGES,etc.    *
  349.                      *                      *
  350.                      ************************
  351.  
  352. SIGNON: DB 0DH,0AH,'                 CALENDER-CLOCK MASTER PROGRAM'
  353.         DB 0DH,0AH,0DH,0AH
  354.         DB 'TO SELECT A FUNCTION PLEASE HIT CORRESPONDING COMMAND KEY'
  355.         DB 0DH,0AH,0DH,0AH
  356.         DB '            FUNCTION                      COMMAND KEY',0DH,0AH
  357.         DB ' SET THE TIME , DATE & WEEKDAY      =         S',0DH,0AH
  358.         DB ' PRINT THE TIME & DATE (ONCE)       =         P',0DH,0AH
  359.         DB ' PRINT THE TIME & DATE CONTINUOUSLY =         C',0DH,0AH
  360.         DB ' EXIT TO OPERATING SYSTEM           =         X',0DH,0AH
  361.         DB 0DH,0AH,'COMMAND = ?',08H,'$'
  362.  
  363.  
  364. BOOBOO: DB 0DH,0AH,'SORRY,I DID NOT RECOGNIZE THAT COMMAND.'
  365.         DB 0DH,0AH,'PLEASE TRY AGAIN.$'
  366.  
  367.  
  368. ASKTIME: DB 0DH,0AH,'WHAT IS THE TIME (24hr FORMAT - HH:MM:SS)?'
  369.          DB 0DH,0AH,'$'
  370.  
  371.  
  372. ASKDATE: DB 0DH,0AH,'WHAT IS THE DATE (MM/DD/YY)?',0DH,0AH,'$'
  373.  
  374. ASKDAY:  DB 0DH,0AH,'WHAT IS THE WEEKDAY (SUNDAY = 0) ?',0DH,0AH,'$'
  375.  
  376. * DIGIT ADDRESS TABLE :
  377. ATABLE: DB HRS10,HRS01,MINS10,MINS01,SECS10,SECS01,MTHS10,MTHS01
  378.         DB DAYS10,DAYS01,YRS10,YRS01,WKDAY
  379.  
  380. * DIGIT INPUT BUFFER :
  381. DTABLE: DS 13
  382.  
  383. * LOCAL STACK AREA :
  384.         DS 32  16 LEVEL STACK
  385. STACK:         * N.B.: STACKS GROW INTO LOW MEMORY!
  386.  
  387.  
  388.                     *********************
  389.  
  390.                           END CLOCK