home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / CPM / PROGRAMS / CLOCKK / MDCLCK13.LBR / SETTIME.AZM / SETTIME.ASM
Assembly Source File  |  2000-06-30  |  10KB  |  471 lines

  1. ;    Program in 8080 assembly language to read real-time-clock located
  2. ;    at ports 30h through 33h in Morrow MD 2/3 rev. 2 main board
  3. ;        Mike Allen 8/16/86
  4. ;
  5. CLS    EQU    'Z'-40H    ;^Z TO CLEAR SCREEN
  6. CONBUF    EQU    80H
  7. PA    EQU    30H    ;REAL-TIME-CLOCK PORT A
  8. PB    EQU    31H    ;REAL-TIME-CLOCK PORT B
  9. PC    EQU    32H    ;REAL-TIME-CLOCK PORT C
  10. CNTRL    EQU    33H    ;REAL-TIME-CLOCK CONTROL PORT
  11. BDOS    EQU    5    ;BDOS CALL VECTOR
  12. WBOOT    EQU    0    ;BDOS WARM BOOT CODE
  13. CONOUT    EQU    2    ;BDOS CONSOLE CHARACTER OUT CODE
  14. PRTSTR    EQU    9    ;BDOS CONSOLE STRING OUT CODE
  15. RCONBF:    EQU    0AH    ;BDOS READ CONSOLE BUFFER CODE
  16. CONSTAT    EQU    0BH    ;BDOS CONSOLE STATUS CODE
  17.  
  18.     ORG    100H
  19.  
  20.     MVI    E,CLS        ;CLEAR THE SCREEN
  21.     MVI    C,CONOUT
  22.     CALL    BDOS
  23.     MVI    A,090H        ;SET UP 8255
  24.     OUT    CNTRL
  25.     MVI    A,020H        ;PUT MSM5832 IN READ MODE
  26.     OUT    PC
  27. LOOP:    LXI    D,RTC        ;START OF REAL-TIME-CLOCK BUFFER
  28.     MVI    A,0        ;FIRST MSM5832 ADDRESS
  29. LOOP1:    MOV    B,A        ;SAVE CURRENT ADDRESS
  30.     OUT    PB        ;SEND ADDRESS TO MSM5832
  31.     NOP            ;WAIT A WHILE
  32.     NOP
  33.     NOP
  34.     NOP
  35.     IN    PA        ;GET DATA FROM MSM5832
  36.     ANI    0FH        ;MASK OFF 4 MSB
  37.     STAX    D        ;SAVE IT IN BUFFER
  38.     INX    D        ;INCREMENT BUFFER POINTER
  39.     MOV    A,B        ;GET LATEST ADDRESS
  40.     INR    A        ;INCREMENT IT
  41.     CPI    13        ;GOT ALL THE DATA?
  42.     JNZ    LOOP1        ;NOPE, SO REPEAT IT
  43.     MVI    A,0H        ;DONE - TURN OFF THE MSM5832 READ
  44.     OUT    PC
  45.     LDA    RTC+5        ;CHECK FOR 24HR, AM OR PM
  46.     MVI    B,0
  47.     CPI    8        ;CHECK FOR 24HR
  48.     JP    SETFLG        ;YEP, FINISH IT
  49.     INR    B
  50.     CPI    4        ;CHECK FOR PM
  51.     JM    SETFLG        ;NOPE, IS AM
  52.     INR    B        ;YEP, IT IS PM
  53. SETFLG:    ANI    3        ;STRIP OFF 24HR AND PM BITS
  54.     STA    RTC+5        ;SAVE IT
  55.     MOV    A,B        ;GET FLAG
  56.     STA    FLAG        ;SAVE IT
  57.  
  58. YRIN:    LXI    D,YRMSG        ;PRINT THE YEAR PROMPT
  59.     CALL    MSGOUT
  60.     LDA    RTC+12        ;AND PRESENT VALUE
  61.     CALL    PRTNUM
  62.     LDA    RTC+11
  63.     CALL    PRTNUM
  64.     CALL    FINLN        ;FINISH THE PROMPT LINE
  65.     LDA    RTC+12        ;MAKE YEARS A BCD NUMBER
  66.     RLC
  67.     RLC
  68.     RLC
  69.     RLC
  70.     ANI    0F0H
  71.     MOV    B,A
  72.     LDA    RTC+11
  73.     ORA    B
  74.     CALL    RDNUM        ;GET THE NEW VALUE
  75.     INR    A        ;CHECK ERROR FLAG
  76.     ORA    A
  77.     JZ    YRIN
  78.     DCR    A
  79.     PUSH    PSW        ;SAVE RETURN VALUE
  80.     RRC
  81.     RRC
  82.     RRC
  83.     RRC
  84.     ANI    0FH        ;GET 10S OF YEARS
  85.     STA    RTC+12        ;SAVE IT
  86.     POP    PSW        ;RECOVER VALUE
  87.     ANI    0FH        ;GET 1S OF YEARS
  88.     STA    RTC+11        ;SAVE THEM TOO.
  89.  
  90. LYIN:    LXI    D,LYMSG        ;SEND LEAP YEAR PROMPT
  91.     CALL    MSGOUT
  92.     LDA    RTC+8
  93.     RRC
  94.     RRC
  95.     ANI    0FH
  96.     STA    LYFLAG        ;SAVE CURRENT VALUE
  97.     CALL    PRTNUM        ;SHOW CURRENT VALUE
  98.     CALL    FINLN        ;FINISH PROMPT
  99.     LDA    LYFLAG        ;GET PRESENT VALUE FOR DEFAULT
  100.     CALL    RDNUM        ;GET NEW VALUE
  101.     INR    A        ;CHECK FOR ERROR
  102.     JZ    LYIN
  103.     DCR    A
  104.     CPI    0        ;CANNOT BE LESS THAN ZERO
  105.     JM    LYIN
  106.     CPI    2        ;NOR GREATER THAN 1
  107.     JP    LYIN
  108.     RLC
  109.     RLC
  110.     ANI    4        ;PUT IN PROPER BIT LOCATION
  111.     STA    LYFLAG        ;SAVE IT FOR LATER
  112.  
  113. MOIN:    LXI    D,MOMSG        ;SEND OUT MONTH PROMPT
  114.     CALL    MSGOUT
  115.     LDA    RTC+10        ;SHOW PRESENT VALUE
  116.     CALL    PNZNUM
  117.     LDA    RTC+9
  118.     CALL    PRTNUM
  119.     CALL    FINLN        ;FINISH THE PROMPT
  120.     LDA    RTC+10        ;MAKE BCD VALUE OF MONTHS FOR DEFAULT
  121.     RLC
  122.     RLC
  123.     RLC
  124.     RLC
  125.     ANI    0F0H
  126.     MOV    B,A
  127.     LDA    RTC+9
  128.     ORA    B
  129.     CALL    RDNUM        ;GET NEW VALUE
  130.     INR    A        ;CHECK FOR ERROR
  131.     JZ    MOIN
  132.     DCR    A
  133.     CPI    1        ;CANNOT BE LESS THAN 1
  134.     JM    MOIN
  135.     CPI    13H        ;OR MORE THAN 12
  136.     JP    MOIN
  137.     PUSH    PSW
  138.     RRC
  139.     RRC
  140.     RRC
  141.     RRC
  142.     ANI    0FH
  143.     STA    RTC+10        ;SAVE 10S OF MONTHS
  144.     POP    PSW
  145.     AIN    0FH
  146.     STA    RTC+9        ;SAVE 1S OF MONTHS
  147.  
  148. DAYIN:    LXI    D,DAYMSG    ;SEND DAY PROMPT
  149.     CALL    MSGOUT
  150.     LDA    RTC+8        ;SEND CURRENT VALUE
  151.     ANI    3
  152.     CALL    PNZNUM
  153.     LDA    RTC+7
  154.     CALL    PRTNUM
  155.     CALL    FINLN        ;FINISH PROMPT
  156.     LDA    RTC+8        ;MAKE BCD DAYS FOR PROMPT
  157.     RLC
  158.     RLC
  159.     RLC
  160.     RLC
  161.     ANI    30H
  162.     MOV    B,A
  163.     LDA    RTC+7
  164.     ORA    B
  165.     CALL    RDNUM        ;GET NEW NUMBER
  166.     INR    A        ;CHECK FOR ERROR
  167.     JZ    DAYIN
  168.     DCR    A
  169.     CPI    1        ;NOT LESS THAN 1
  170.     JM    DAYIN
  171.     CPI    32H        ;NO MORE THAN 31
  172.     JP    DAYIN
  173.     PUSH    PSW        ;SAVE WORD
  174.     RRC
  175.     RRC
  176.     RRC
  177.     RRC
  178.     ANI    3        ;MAKE DAYS X10
  179.     MOV    B,A
  180.     LDA    LYFLAG        ;GET LEAP YEAR
  181.     ORA    B        ;OR IN 10S OF DAYS
  182.     STA    RTC+8        ;SAVE WHOLE THING
  183.     POP    PSW        ;RECOVER WORD
  184.     ANI    0FH        ;GET 1S OF DAYS
  185.     STA    RTC+7        ;SAVE 1S OF DAYS
  186.  
  187. DOWIN:    LXI    D,DOWMSG    ;SEND DAY-OF-WEEK PROMPT
  188.     CALL    MSGOUT
  189.     LDA    RTC+6        ;SHOW CURRENT VALUE
  190.     CALL    PRTNUM
  191.     CALL    FINLN        ;FINISH PROPMT
  192.     LDA    RTC+6        ;GET FOR DEFAULT
  193.     CALL    RDNUM        ;GET NEW VALUE
  194.     INR    A        ;CHECK FOR ERROR
  195.     JZ    DOWIN
  196.     DCR    A
  197.     CPI    0        ;NOT LESDS THAN ZER0
  198.     JM    DOWIN
  199.     CPI    7        ;OR GREATER THAN 6
  200.     JP    DOWIN
  201.     STA    RTC+6        ;SAVE DAY OF WEEK
  202.  
  203. CTIN:    LXI    D,CTMSG        ;SEND CIVIL TIME PROMPT
  204.     CALL    MSGOUT
  205.     LDA    FLAG        ;SHOW PRESENT VALUE
  206.     CALL    PRTNUM
  207.     CALL    FINLN        ;FINISH PROMPT
  208.     LDA     FLAG        ;GET OLD VALUE FOR DEFAULT
  209.     CALL    RDNUM        ;GET NEW VALUE
  210.     INR    A        ;CHECK FOR ERROR
  211.     JZ    CTIN
  212.     DCR    A
  213.     CPI    0        ;NOT LESS THAN ZERO
  214.     JM    CTIN
  215.     CPI    3        ;NOR GREATER THAN 2
  216.     JP    CTIN
  217.     STA    FLAG
  218.     ORA    A
  219.     JZ    HRIN        ;IF 24 HR TIME, NO NEED TO ADJUST HRS
  220.     LDA    RTC+5        ;GET HRS X10
  221.     ADD    A        ;X2
  222.     MOV    B,A        ;SAVE X2 FOR LATER
  223.     ADD    A        ;X4
  224.     ADD    A        ;X8
  225.     ADD    B        ;X10
  226.     MOV    B,A        ;SAVE IT
  227.     LDA    RTC+4        ;GET HRS X1
  228.     ADD    B        ;TOTAL HRS IN BINARY!
  229.     JNZ    HICHCK        ;WELL, IT'S NOT ZERO
  230.     MVI    A,1
  231.     STA    RTC+5
  232.     MVI    A,2
  233.     STA    RTC+4        ;ZERO HOURS IS 12 HRS IN CIVILIAN TIME
  234.     JMP    HRIN
  235. HICHCK:    CPI    13        ;13 O'CLOCK IS A NONO IN CIVILIAN TIME
  236.     JM    HRIN
  237.     SUI    12        ;MAKE IT LEGAL
  238.     MVI    B,0        ;INITIALIZE 10S COUNTER
  239. DVLOOP:    INR    B
  240.     SUI    10
  241.     JP    DVLOOP
  242.     DCR    B
  243.     ADI    10
  244.     STA    RTC+4        ;A HAS 1S OF HOURS
  245.     MOV    A,B
  246.     STA    RTC+5        ;B HAS 10S OF HOURS
  247.  
  248. HRIN:    LXI    D,HRMSG        ;SEND HR PROMPT
  249.     CALL    MSGOUT
  250.     LDA    RTC+5        ;SHOW CURRENT VALUE
  251.     CALL    PNZNUM
  252.     LDA    RTC+4
  253.     CALL    PRTNUM
  254.     CALL    FINLN        ;FINISH PROMPT
  255.     LDA    RTC+5        ;SAVE HOURS FOR DEFAULT
  256.     RLC
  257.     RLC
  258.     RLC
  259.     RLC
  260.     ANI    0F0H
  261.     MOV    B,A
  262.     LDA    RTC+4
  263.     ORA    B
  264.     CALL    RDNUM        ;GET NEW VALUE
  265.     CPI    0        ;LESS THAN ZERO IS ALWAYS BAD
  266.     JM    HRIN
  267.     CPI    24H        ;24 OR MORE IS ALWAYS BAD
  268.     JP    HRIN
  269.     PUSH    PSW        ;SAVE ENTERED VALUE
  270.     LDA    FLAG        ;CHECK FOR 24HR TIME
  271.     ORA    A
  272.     JZ    HROUT
  273.     POP    PSW        ;12 HR TIME, CHECK AGAIN
  274.     CPI    1        ;NOTHING LESS THAN 1
  275.     JM    HRIN
  276.     CPI    13H        ;NOR MORE THAN 12
  277.     JP    HRIN
  278.     PUSH    PSW
  279. HROUT:    POP    PSW        ;GET WORD BACK
  280.     MOV    B,A        ;SAVE IT
  281.     ANI    0FH
  282.     STA    RTC+4        ;SAVE HRS X1
  283.     MOV    A,B
  284.     RRC
  285.     RRC
  286.     RRC
  287.     RRC
  288.     ANI    3        ;GET HRS X10
  289.     PUSH    PSW        ;SAVE IT FOR LATER
  290.     MVI    A,2        ;START FLAG AT 24HR
  291.     MOV    B,A
  292.     LDA    FLAG        ;CHECK FOR 24 HR
  293.     ORA    A
  294.     JZ    NEWFLG
  295.     DCR    B        ;FLAG AT PM
  296.     CPI    2        ;CHECK FOR PM
  297.     JZ    NEWFLG
  298.     DCR    B        ;MUST BE AM
  299. NEWFLG:    MOV    A,B        ;PUT FLAG BITS IN PROPER LOCATION
  300.     RLC
  301.     RLC
  302.     ANI    0CH
  303.     MOV    B,A
  304.     POP    PSW        ;RECOVER HRS X10
  305.     ORA    B        ;PUT IN THE FLAG BITS
  306.     STA    RTC+5        ;SAVE HRS X10 AND FLAGS
  307.  
  308. MININ:    LXI    D,MINMSG    ;SEND OUT MINUTES PROMPT
  309.     CALL    MSGOUT
  310.     LDA    RTC+3        ;AND CURRENT VALUE
  311.     CALL    PNZNUM
  312.     LDA    RTC+2
  313.     CALL    PRTNUM
  314.     CALL    FINLN        ;FINISH THE PROMPT
  315.     LDA    RTC+3        ;MADE BCD MINUTES FOR DEFAULT
  316.     RLC
  317.     RLC
  318.     RLC
  319.     RLC
  320.     ANI    0F0H
  321.     MOV    B,A
  322.     LDA    RTC+2
  323.     ORA    B
  324.     CALL    RDNUM        ;GET NEW VALUE
  325.     INR    A
  326.     JZ    MININ        ;ERROR?
  327.     DCR    A
  328.     CPI    0
  329.     JM    MININ        ;NOT LESS THAN 0
  330.     CPI    60H
  331.     JP    MININ        ;NOR MORE THAN 59
  332.     PUSH    PSW        ;SAVE NEW VALUE
  333.     RRC
  334.     RRC
  335.     RRC
  336.     RRC
  337.     ANI    0FH        ;GET MIN X10
  338.     STA    RTC+3        ;SAVE IT
  339.     POP    PSW
  340.     ANI    0FH        ;GEN MIN X1
  341.     STA    RTC+2        ;SAVE IT TOO
  342.  
  343.     LXI    D,GOPRMT
  344.     CALL    MSGOUT
  345. GOLOOP:    MVI    C,CONSTAT
  346.     CALL    BDOS
  347.     ORA    A
  348.     JZ    GOLOOP
  349.  
  350.     MVI    A,080H        ;SET UP 8255
  351.     OUT    CNTRL
  352.     MVI    A,010H        ;TURN ON HOLD
  353.     OUT    PC
  354.     MVI    A,50        ;WAIT A LONG TIME
  355. WLOOP:    DCR    A
  356.     JNZ    WLOOP
  357.     LXI    D,RTC        ;START OF REAL-TIME-CLOCK BUFFER
  358.     MVI    A,0        ;FIRST MSM5832 ADDRESS
  359. OLOOP1:    MOV    B,A        ;SAVE CURRENT ADDRESS
  360.     OUT    PB        ;SEND ADDRESS TO MSM5832
  361.     NOP            ;WAIT A WHILE
  362.     NOP
  363.     NOP
  364.     NOP
  365.     LDAX    D        ;GET DATA FROM BUFFER
  366.     ANI    0FH        ;MASK OFF 4 MSB
  367.     OUT    PA        ;SEND DATA TO MSM5832
  368.     MVI    A,50H        ;STROBE THE WRITE LINE
  369.     OUT    PC
  370.     MVI    A,10H
  371.     OUT    PC
  372.     INX    D        ;INCREMENT BUFFER POINTER
  373.     MOV    A,B        ;GET LATEST ADDRESS
  374.     INR    A        ;INCREMENT IT
  375.     CPI    13        ;SENT ALL THE DATA?
  376.     JNZ    OLOOP1        ;NOPE, SO REPEAT IT
  377.     MVI    A,0H        ;DONE - TURN OFF THE MSM5832 READ
  378.     OUT    PC
  379.     MVI    A,90H        ;RESTORE THE 8255
  380.     OUT    CNTRL
  381.     MVI    C,WBOOT        ;WARM BOOT
  382.     CALL    BDOS
  383.  
  384. PNZNUM:    ORA    A
  385.     RZ            ;DON'T PRINT A '0'
  386. PRTNUM:    ADI    '0'        ;MAKE NUMER ASCII
  387.     MOV    E,A        ;GET READY TO PRINT
  388.     MVI    C,CONOUT
  389.     JMP    BDOS        ;LET BDOS SUPPLY THE 'RET'
  390.  
  391. FINLN:    LXI    D,ENDMSG
  392. MSGOUT:    MVI    C,PRTSTR
  393.     JMP    BDOS
  394.  
  395. RDNUM:    STA    BCDNUM        ;SAVE DEFAULT
  396.     MVI    A,80
  397.     STA    CONBUF
  398.     LXI    D,CONBUF    ;READ THE CONSOLE BUFFER
  399.     MVI    C,RCONBF
  400.     CALL    BDOS
  401.     LDA    CONBUF+1    ;CHECK STRING LENGTH
  402.     ORA    A
  403.     JNZ    BIGCHK        ;SOMETHING THERE, SEE IF TOO LONG
  404.     LDA    BCDNUM        ;NOTHING THERE, RETURN DEFAULT
  405.     JMP    INDONE
  406. BIGCHK:    CPI    3        ;NO MORE THAN 2 CHARACTERS ALLOWED
  407.     JP    INERR
  408.     LDA    CONBUF+2    ;GET THE 1ST CHARACTER
  409.     CPI    '0'        ;LESS THAN '0' IS AN ERROR
  410.     JM    INERR
  411.     CPI    '9'+1        ;GREATER THAN '9' IS AN ERROR
  412.     JP    INERR
  413.     SUI    30H        ;REAL ASCII NUMBER, MAKE INTO INTEGER
  414.     STA    NEWIN        ;SAVE IT FOR LATER
  415.     LDA    CONBUF+1    ;IS THERE A SECOND CHARACTER?
  416.     CPI    2
  417.     JZ    TWOIN        ;GO GET IT
  418.     LDA    NEWIN        ;ONLY ONE CHARACTER - RETURN IT
  419.     JMP    INDONE
  420. TWOIN:    LDA    CONBUF+3    ;GET THE 2ND CHARACTER
  421.     CPI    '0'        ;LESS THAN '0' IS AN ERROR
  422.     JM    INERR
  423.     CPI    '9'+1        ;GREATER THAN '9' IS AN ERROR
  424.     JP    INERR
  425.     SUI    30H        ;REAL ASCII NUMBER, MAKE INTO INTEGER
  426.     MOV    B,A        ;SAVE IT
  427.     LDA    NEWIN
  428.     RLC
  429.     RLC
  430.     RLC
  431.     RLC            ;PUT IN TOP 4 BITS
  432.     ANI    0F0H        ;MAKE SURE BOTTOM IS CLEAR
  433.     ORA    B        ;BRING BACK ONES DIGIT
  434.     JMP    INDONE        ;DONE
  435. INERR:    MVI    A,0FFH        ;ERROR FLAG
  436. INDONE:    PUSH    PSW
  437.     LXI    D,LF
  438.     CALL    MSGOUT
  439.     POP    PSW
  440.     RET
  441.  
  442.  
  443. YRMSG:    DB    'Year? <$'
  444. LYMSG:    DB    'Leap Year? [1=yes] <$'
  445. MOMSG:    DB    'Month? <$'
  446. DAYMSG:    DB    'Day? <$'
  447. DOWMSG:    DB    'Day of the week? [0=Sunday, 6=Saturday] <$'
  448. CTMSG:    DB    '24 hr[0], AM[1] or PM[2]? <$'
  449. HRMSG:    DB    'Hours? <$'
  450. MINMSG:    DB    'Minutes? <$'
  451. GOPRMT:    DB    'Press RETURN to start clock on the minute$'
  452.  
  453. ENDMSG:    DB    '> $'
  454. CRLF:    DB    0DH
  455. LF:    DB    0AH,'$'
  456. BCDNUM:    DS    1
  457. NEWIN:    DS    1
  458. FLAG:    DS    1
  459. LYFLAG:    DS    1
  460. RTC:    DS    13
  461.     END
  462. te$'
  463.  
  464. ENDMSG:    DB    '> $'
  465. CRLF:    DB    0DH
  466. LF:    DB    0AH,'$'
  467. BCDNUM:    DS    1
  468. NEWIN:    DS    1
  469. FLAG:    DS    1
  470. LYFLAG:    DS    1
  471. RTC: