home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / sigm / vols000 / vol096 / clock.a86 < prev    next >
Text File  |  1984-04-29  |  11KB  |  432 lines

  1.  
  2. M    EQU    Byte Ptr 0[BX]
  3. ;********************************************************
  4. ;*                            *
  5. ;*    TEST ROUTINES FOR THE COMPPRO SYSTEM        *
  6. ;*      SUPPORT 1  BOARD REAL TIME CLOCK        *
  7. ;*                            *
  8. ;********************************************************
  9. ;
  10. ;    Verion 1.0    From System Support manual
  11. ;    8/1/82        Keyed in by Bill Bolton.
  12. ;
  13. ;    Version 1.10    Modified for Australian date
  14. ;    8/1/82        format by Bill Bolton.
  15. ;
  16. ;    Version 1.11    Placed version number in signon
  17. ;    11/1/82        and added version number equates
  18. ;            Bill Bolton
  19. ;
  20. ;    Version 1.12    XLT86 translation to CP/M-86
  21. ;            Bill Bolton
  22. ;
  23. BASE    EQU    50H            ;BASE PORT ADDRESS
  24. CLKCMD    EQU    BASE+10            ;CLOCK COMMAND PORT
  25. CLKDATA    EQU    BASE+11            ;CLOCK DATA PORT
  26. WBOOT    EQU    0            ;BIOS WBOOT ENTRY
  27. BDOS    EQU    00005H            ;BDOS ENTRY POINT
  28. READ    EQU    10H            ;READ BIT PATTERN
  29. WRITE    EQU    20H            ;WRITE BIT PATTERN
  30. HOLD    EQU    40H            ;HOLD BIT PATTERN
  31. ALF    EQU    0AH            ;ASCII LINE FEED
  32. ACR    EQU    0DH            ;ASCII CARRIAGE RETURN
  33. ;
  34. VERS    EQU    1            ;MAJOR VERSION NUMBER
  35. REV    EQU    12            ;MINOR REVISION NUMBER
  36. ;
  37.     ORG    100H
  38. ;
  39. ;********************************************************
  40. ;*    THIS IS THE MAIN LOOP THAT PRINTS THE        *
  41. ;*    SIGNON MESSAGE, DECIDES WHAT COMMAND        *
  42. ;*    HAS BEEN ENTERED AND EXECUTES THAT ROUTINE    *
  43. ;********************************************************
  44.  
  45. START:
  46.     MOV    DX,(Offset SIGNON)    ;INITIAL SIGNON MESSAGE
  47.     CALL    PMSG            ;DISPLAY IT
  48.     CALL    GETCHAR            ;GET COMMAND CHARACTER
  49.     CMP    AL,'X'            ;EXIT TO CP/M ?
  50.     JNZ    L_1    
  51.     MOV    CL,0            ;YES
  52.     MOV    DL,0
  53.     INT    224
  54. L_1:
  55.     CMP    AL,'S'            ;SET TIME ?
  56.     JZ    SETTIME            ;YES
  57.     CMP    AL,'D'            ;DISPLAY TIME ?
  58.     JNZ    L_2    
  59.     JMP    PTIME            ;YES
  60. L_2:
  61.     CMP    AL,'C'            ;CONTIUOUS DISPLAY ?
  62.     JNZ    L_3    
  63.     JMP    FOREVER            ;YES
  64. L_3:
  65.     MOV    DX,(Offset ERROR)    ;CANT RECOGNIZE COMMAND
  66.     CALL    PMSG            ;SO COMPLAIN ABOUT IT
  67.     JMPS    START            ;TRY AGAIN
  68. ;
  69. ;********************************************************
  70. ;*    THIS ROUTINE SETS UP HL TO POINT TO A TABLE    *
  71. ;*    TO RECEIVE THE DIGITS TO BE WRITTEN TO THE CLOCK*
  72. ;*    DE CONTAINS THE POINTER TO THE TABLE OF ADDRESS    *
  73. ;*    VALUES THAT CORRESPOND TO THE DESIRED DIGIT.    *
  74. ;*    THE TABLE IS ORGANISED IN THE PROPER ORDER FOR    *
  75. ;*    READING AND WRITING. THE ROUTINE GETS THE    *
  76. ;*    DIGITS FROM THE CONSOLE AND PUTS THEM INTO    *
  77. ;*    MEMORY AND THEN WRITES THEM TO THE CLOCK.    *
  78. ;********************************************************
  79. SETTIME:
  80.     CALL    GETTIME            ;GET THE DATE AND TIME DATA
  81.     MOV    BX,(Offset DTABLE)    ;HL <---- DIGIT TABLE ADDRESS
  82.     MOV    DX,(Offset ATABLE)    ;DE <---- ADDRESS TABLE
  83.     MOV    CH,13            ;NUMBER OF DIGITS TO WRITE +1
  84.     MOV    AL,HOLD            ;SET HOLD BIT
  85.     OUT    CLKCMD,AL        ;SEND COMMAND
  86. SET1:
  87.     DEC    CH            ;DONE LAST DIGIT ?
  88.     JNZ    HERE            ;NO
  89.     MOV    AL,0            ;YES, CLEAR HOLD BIT
  90.     OUT    CLKCMD,AL        ;SEND COMMAND
  91.     MOV    DX,(Offset TIMEIS)    ;"TIME IS" MESSAGE
  92.     CALL    PMSG
  93.     CALL    CLKPRNT            ;DISPLAY THE TIME
  94.     JMPS    START            ;NEXT COMMAND
  95. ;
  96. HERE:
  97.     MOV    AL,M            ;A <---- DIGIT
  98.     MOV    CL,AL            ;C <---- DIGIT
  99.     MOV    SI,DX            ;A <---- COMMAND
  100.     MOV    AL,[SI]
  101.     CALL    WRTDGT            ;WRITE THE DIGIT
  102.     LAHF                ;BUMP POINTERS
  103.     INC    BX
  104.     SAHF
  105.     LAHF
  106.     INC    DX
  107.     SAHF
  108.     JMPS    SET1            ;NEXT DIGIT
  109.  
  110. ;********************************************************
  111. ;*    THIS ROUTINE GETS THE DIGITS FROM THE CONSOLE    *
  112. ;*    AND STORES THEM INTO MEMORY AT THE ADDRESS    *
  113. ;*    POINTED TO BY HL.                *
  114. ;********************************************************
  115.  
  116. GETTIME:
  117.     MOV    DX,(Offset ASKTIME)    ;PROMPT FOR TIME INPUT
  118.     CALL    PMSG
  119.     MOV    BX,(Offset DTABLE)    ;HL <---- ADDRESS TO PUT DIGITS
  120. GET1:
  121.     CALL    GETNUMB            ;GET A DIGIT
  122.     CMP    AL,ACR            ;FINISHED TIME ?
  123.     JZ    GETDATE            ;YES
  124.     AND    AL,0FH            ;NO, CONVERT TO BCD FORMAT
  125.     MOV    M,AL            ;PUT DIGIT INTO MEMORY
  126.     INC    BX            ;POINT TO NEXT TABLE ADDRESS
  127.     JMPS    GET1
  128. ;
  129. GETDATE:
  130.     MOV    DX,(Offset ASKDATE)    ;PROMPT FOR TIME INPUT
  131.     CALL    PMSG
  132. GET2:
  133.     CALL    GETNUMB            ;GET A DIGIT
  134.     CMP    AL,ACR            ;FINISHED DATE ?
  135.     JNZ    L_4    
  136.     RET                ;YES
  137. L_4:
  138.     AND    AL,0FH            ;NO, CONVERT TO BCD
  139.     MOV    M,AL            ;PUT DIGIT INTO MEMORY
  140.     INC    BX            ;POINT TO NEXT TABLE ADDRESS
  141.     JMPS    GET2
  142.  
  143. ;********************************************************
  144. ;*    THIS ROUTINE GETS A CHARACTER FROM THE CONSOLE    *
  145. ;*    AND CHECKS THE INPUT FOR EITHER A CARRIAGE    *
  146. ;*    RETURN OR A VALID DIGIT BETWEEN 0-9 WILL NOT    *
  147. ;*    RETURN UNTIL A CR OR VALID DIGIT IS TYPED    *
  148. ;********************************************************
  149.  
  150. GETNUMB:
  151.     CALL    GETCHAR
  152.     CMP    AL,ACR            ;CARRIAGE RETURN ?
  153.     JNZ    L_5    
  154.     RET                ;YES
  155. L_5:
  156.     CMP    AL,'0'
  157.     JB    GETNUMB
  158.     CMP    AL,'9'+1
  159.     JNB    GETNUMB
  160.     RET
  161.  
  162. ;********************************************************
  163. ;*    THIS ROUTINE WRITES THE DIGIT TO THE CLOCK    *
  164. ;*    AND CHECKS TO SEE IF THE HOURS OR DAYS 10    *
  165. ;*    DIGIT AND SETS THE 24 HOUR AND LEAP YEAR BITS    *
  166. ;*    ACCORDINGLY. THIS ROUTINE IS CALEED WITH DIGIT    *
  167. ;*    ADDRESS IN A AND THE DIGIT TO BE WRITTEN IN C.    *
  168. ;********************************************************
  169.  
  170. WRTDGT:
  171.     LAHF                ;SAVE THE COMMAND
  172.     XCHG    AL,AH
  173.     PUSH    AX
  174.     XCHG    AL,AH
  175.     ADD    AL,HOLD            ;ADD IN THE HOLD BIT
  176.     OUT    CLKCMD,AL        ;SEND COMMAND
  177.     CMP    AL,HOLD+5        ;HOURS TEN DIGIT ?
  178.     JNZ    WRT1            ;NO
  179.     MOV    AL,CL            ;YES, GET DIGIT
  180.     ADD    AL,08H            ;SET 24 HOUR MODE
  181.     JMPS    WRT3
  182. ;
  183. WRT1:
  184.     CMP    AL,8+HOLD        ;DAYS 10 DIGIT ?
  185.     JNZ    WRT2            ;NO
  186.     MOV    AL,CL            ;YES, GET THE DIGIT
  187.     AND    AL,03H            ;SET NON-LEAP YEAR MODE
  188.     JMPS    WRT3
  189. ;
  190. WRT2:
  191.     MOV    AL,CL            ;A <---- DIGIT
  192. WRT3:
  193.     OUT    CLKDATA,AL        ;SEND DIGIT
  194.     POP    AX            ;GET COMMAND BACK
  195.     XCHG    AL,AH
  196.     ADD    AL,WRITE+HOLD        ;ADD THE WRITE + HOLD BITS
  197.     OUT    CLKCMD,AL        ;SEND COMMAND
  198.     SUB    AL,WRITE        ;CLEAR THE WRITE BIT
  199.     OUT    CLKCMD,AL        ;SEND COMMAND
  200.     RET
  201.  
  202. ;********************************************************
  203. ;*    THIS ROUTINE READS A DIGIT FROM THE CLOCK AND    *
  204. ;*    MASKS THE LEAP YEAR AND AND AM/PM/24 HOUR MODE    *
  205. ;*    BITS. THIS ROUTINE IS CALLED  WITH THE DIGIT    *
  206. ;*    ADDRESS IN A AND RTURNS WITH THE DIGIT VALUE    *
  207. ;*    IN A.                        *
  208. ;********************************************************
  209.  
  210. RDDGT:
  211.     ADD    AL,READ            ;ADD IN THE READ BIT
  212.     OUT    CLKCMD,AL        ;SEND COMMAND
  213.     CMP    AL,5+READ        ;TENS HOURS DIGIT ?
  214.     IN    AL,CLKDATA        ;GET THE DIGIT
  215.     JZ    L_6    
  216.     RET                ;NO, FINISHED
  217. L_6:
  218.     SUB    AL,08H            ;YES, TURN OFF 24 HOUR BIT
  219.     RET
  220.  
  221. ;********************************************************
  222. ;*    THIS ROUTINE PRINTS THE CURRENT TIME AND DATE    *
  223. ;*    ONCE , COMPLETE WITH COLONS AND SLASHES        *
  224. ;********************************************************
  225.  
  226. CLKPRNT:
  227.     MOV    BX,(Offset ATABLE)    ;HL <---- TABLE ADDRESS
  228.     CALL    PRINTWO            ;DISPLAY THE FIRST TWO DIGITS
  229.     MOV    AL,':'
  230.     CALL    PCHAR            ;DISPLAY THE SEPERATOR
  231.     CALL    PRINTWO            ;DISPLAY THE NEXT TWO DIGITS
  232.     MOV    AL,':'
  233.     CALL    PCHAR            ;DISPLAY THE SEPERATOR
  234.     CALL    PRINTWO            ;DISPLAY THE NEXT TWO DIGITS
  235.     MOV    AL,' '
  236.     CALL    PCHAR
  237.     MOV    AL,' '            ;TWO SPACES
  238.     CALL    PCHAR
  239.     CALL    PRINTWO            ;TWO MORE DIGITS
  240.     MOV    AL,'/'            ;DISPLAY A SLASH
  241.     CALL    PCHAR
  242.     CALL    PRINTWO
  243.     MOV    AL,'/'
  244.     CALL    PCHAR
  245.     CALL    PRINTWO            ;PRINT LAST TWO DIGITS
  246.     RET
  247.  
  248. ;********************************************************
  249. ;*    THIS ROUTINE PRINTS TWO DIGITS FROM THE CLOCK.    *
  250. ;*    IT IS CALLED WITH THE DIGIT ADDRESS OF THE    *
  251. ;*    DIGIT IN HL. EXITS WITH HL POINTING TO THE    *
  252. ;*    ADDRESS OF THE NEXT TWO DIGITS.            *
  253. ;********************************************************
  254.  
  255. PRINTWO:
  256.     MOV    AL,M            ;A <---- ADDRESS (FROM TABLE)
  257.     CALL    RDDGT            ;READ THE DIGIT
  258.     ADD    AL,30H            ;CONVERT TO ASCII
  259.     CALL    PCHAR            ;DISPLAY IT
  260.     INC    BX            ;ADJUST POINTER
  261.     MOV    AL,M            ;A <---- ADDRESS
  262.     CALL    RDDGT
  263.     ADD    AL,30H
  264.     CALL    PCHAR
  265.     LAHF
  266.     INC    BX
  267.     SAHF
  268.     RET
  269.  
  270. ;********************************************************
  271. ;*    THIS ROUTINE DISPLAYS THE TIME ONCE AND JUMPS    *
  272. ;*    BACK TO THE MAIN LOOP                *
  273. ;********************************************************
  274.  
  275. PTIME:
  276.     MOV    DX,(Offset TIMEIS)
  277.     CALL    PMSG
  278.     CALL    CLKPRNT
  279.     JMP    START
  280.  
  281. ;********************************************************
  282. ;*    THIS ROUTINE DISPLAYS THE TIME CONTINUOUSLY    *
  283. ;*    UNTIL A CONTROL C IS TYPED. IT CONTINUALLY    *
  284. ;*    READS THE SECONDS 1 DIGIT AND WAITS FOR IT TO    *
  285. ;*    CHANGE BEFORE DISPLAYING THE TIME.        *
  286. ;********************************************************
  287.  
  288. FOREVER:
  289.     MOV    AL,ALF            ;LINE FEED
  290.     CALL    PCHAR
  291. FOR1:
  292.     MOV    AL,ACR            ;CR
  293.     CALL    PCHAR
  294.     CALL    CLKPRNT            ;DISPLAY THE TIME
  295.     MOV    AL,0            ;ADDRESS OF SECONDS DIGIT
  296.     CALL    RDDGT            ;READ DIGIT
  297.     MOV    CH,AL            ;B <---- DIGIT
  298. FOR2:
  299.     MOV    AL,0
  300.     CALL    RDDGT            ;READ IT AGAIN
  301.     CMP    AL,CH            ;CHANGED ?
  302.     JZ    FOR2            ;NO
  303.     JMPS    FOREVER            ;YES
  304.  
  305. ;********************************************************
  306. ;*         CP/M CALLS AND UTILITY ROUTINES        *
  307. ;*                            *
  308. ;*    THIS ROUTINE GETS A CHARACTER FORM THE CONSOLE    *
  309. ;*    AND CONVERTS IT TO UPPERCASE, STRIPS OF PARITY    *
  310. ;*    AND CHECKS FOR CONTROL C.            *
  311. ;********************************************************
  312.  
  313. GETCHAR:
  314.     PUSH    BX
  315.     MOV    CL,1            ;BDOS CONSOLE IN
  316.     INT    224
  317.     POP    BX
  318.     CMP    AL,'a'            ;RANGE CHECK FOR UPPER CASE
  319.     JB    SKIP
  320.     CMP    AL,'z'+1        ;DITTO
  321.     JNB    SKIP
  322.     AND    AL,5FH            ;CONVERT TO UPPER CASE
  323. SKIP:
  324.     AND    AL,7FH            ;STRIP PARITY BIT
  325.     CMP    AL,03H            ;CONTROL C ?
  326.     JNZ    L_7    
  327.     MOV    CL,0            ;YES, EXIT TO CP/M
  328.     MOV    DL,0
  329.     INT    224
  330. L_7:
  331.     RET                ;NO
  332.  
  333. ;********************************************************
  334. ;*    THIS ROUTINE PRINTS A CHARACTER ON THE CONSOLE    *
  335. ;*    AND CHECKS TO SEE IF ANY WERE ENTERED WHILE    *
  336. ;*    PRINTING.                    *
  337. ;********************************************************
  338.  
  339. PCHAR:
  340.     PUSH    DX
  341.     MOV    DL,AL            ;E <---- CHARCATER
  342.     MOV    CL,2            ;BDOS CONSOLE OUT
  343.     PUSH    BX
  344.     INT    224
  345.     MOV    CL,0BH            ;BDOS CONSOLE STATUS CHECK
  346.     INT    224
  347.     POP    BX
  348.     POP    DX
  349.     OR    AL,AL            ;CHARACTER READY ?
  350.     JZ    L_8    
  351.     CALL    GETCHAR            ;YES, GET IT
  352. L_8:
  353.     RET                ;NO
  354.  
  355. ;********************************************************
  356. ;*    THIS ROUTINE DISPLAYS THE STRING POINTED TO    *
  357. ;*    BY DE UNTIL $ IS FOUND.                *
  358. ;********************************************************
  359.  
  360. PMSG:
  361.     PUSH    BX
  362.     MOV    CL,9            ;BDOS DISPLAY STRING
  363.     INT    224
  364.     POP    BX
  365.     RET
  366. L_9    EQU    $
  367. ;
  368.     DSEG
  369. ;
  370.     ORG    Offset L_9
  371.  
  372. ;********************************************************
  373. ;*            MESSAGES            *
  374. ;********************************************************
  375.  
  376. SIGNON    RS    0
  377.     DB    ACR,ALF,ACR,ALF
  378.     DB    'Time and Date Test Routines for System Support 1'
  379.     DB    ACR,ALF
  380.     DB    'Version ',VERS + '0','.',REV/10 + '0',REV mod 10 +'0'
  381.     DB    ACR,ALF,ACR,ALF
  382.     DB    'Please type one of the following Commands:'
  383.     DB    ACR,ALF
  384.     DB    'S - Set the Time and Date',ACR,ALF
  385.     DB    'D - Display the Time and Date Once',ACR,ALF
  386.     DB    'C - Continuously Display the Time and Date'
  387.     DB    ACR,ALF
  388.     DB    'X - Exit to Operating System'
  389.     DB    ACR,ALF,ACR,ALF
  390.     DB    'Command: $'
  391. ;
  392. ERROR    RS    0
  393.     DB    ACR,ALF
  394.     DB    'That was not one of the above commands'
  395.     DB    ACR,ALF
  396.     DB    'Please try again.$'
  397. ;
  398. ASKTIME    RS    0
  399.     DB    ACR,ALF
  400.     DB    'What is the time? (24 hour format - HH:MM:SS) $'
  401. ;
  402. ASKDATE    RS    0
  403.     DB    ACR,ALF
  404.     DB    'What is the date? (DD/MM/YY) $'
  405. ;
  406. TIMEIS    RS    0
  407.     DB    ACR,ALF
  408.     DB    'The Time and Date are: $'
  409.  
  410. ;********************************************************
  411. ;*            TABLES                *
  412. ;*                            *
  413. ;*    THIS TABLE CONTAINS THE 'ADDRESS' VALUES    *
  414. ;*    THAT ARE SENT IN THE COMMAND BYTE IN THE    *
  415. ;*    FOLLOWING ORDER - HOURS 10, HOURS 1, MIN 10    *
  416. ;*    MIN 1, SEC 10, SEC 1, DAYS 10, DAYS 1        *
  417. ;*    MONTHS 10, MONTHS 1, YEARS 10, YEARS 1.        *
  418. ;********************************************************
  419.  
  420. ATABLE    RS    0
  421.     DB    5,4,3,2,1,0,8,7,0AH,9,0CH,0BH
  422.  
  423. ;********************************************************
  424. ;*    THIS IS THE AREA WHICH GETS THE DIGITS AS THEY    *
  425. ;*    ARE ENTERED FROM THE CONSOLE.            *
  426. ;********************************************************
  427.  
  428. DTABLE    RS    0
  429.     DB    0,0,0,0,0,0,0,0,0,0,0,0
  430. ;
  431.     END
  432.