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 / BEEHIVE / OS / P2DOSV3.ARC / DATE.MAC < prev    next >
Text File  |  1991-08-11  |  9KB  |  750 lines

  1.     .Z80
  2. ;
  3. ; EQUATES
  4. ;
  5. CR    EQU    0DH
  6. LF    EQU    0AH
  7. ;
  8. ; CALCULATE DAYS AND YEAR,MONTH,DAYS
  9. ;
  10. START:    LD    (SPSAVE),SP
  11.     LD    SP,STACK
  12.     LD    A,(00080H)
  13.     ADD    A,81H
  14.     LD    H,0
  15.     LD    L,A
  16.     LD    (HL),0
  17.     LD    HL,00081H
  18.     CALL    BLANK
  19.     CP    '/'
  20.     JP    NZ,START0
  21.     LD    DE,EXPLA
  22.     LD    C,9
  23.     CALL    5
  24.     JP    EXIT
  25. ;
  26. EXPLA:    DEFM    'DATE. Date 03-01-86. Version 5.0'
  27.     DEFB    CR,LF,CR,LF
  28.     DEFM    'With this program you can get and set the current date and time'
  29.     DEFB    CR,LF,CR,LF
  30.     DEFM    'usage :  ''DATE''                   gives current date and time'
  31.     DEFB    CR,LF
  32.     DEFM    '         ''DATE dd/mm/yy hh:mm:ss'' sets current date and time'
  33.     DEFB    CR,LF
  34.     DEFM    '         ''DATE s[et]''             sets current date and time in dialog mode'
  35.     DEFB    CR,LF
  36.     DEFM    '         ''DATE c[ontinuous]''      display date and time continuous'
  37.     DEFB    CR,LF
  38.     DEFM    '         ''DATE //''                display this help info'
  39.     DEFB    '$'
  40.  
  41. START0:    CP    0
  42.     JP    Z,GET
  43.     CP    'C'
  44.     JP    Z,CONT
  45.     CP    'c'
  46.     JP    Z,CONT
  47.     CP    'S'
  48.     JP    Z,SET
  49.     CP    's'
  50.     JP    Z,SET
  51.     PUSH    HL
  52.     LD    DE,TIMEDT
  53.     LD    C,200
  54.     CALL    5
  55.     POP    HL
  56.     CALL    GETDAT
  57.     JP    C,ERROR
  58.     PUSH    HL
  59.     LD    L,E            ; YEAR
  60.     LD    H,019H
  61.     LD    E,B            ; MONTH
  62.     CALL    CONHEX
  63.     CALL    CHKDAT
  64.     JP    C,ERROR
  65.     CALL    DAYS
  66.     LD    (TIMEDT),BC
  67.     POP    HL
  68.     CALL    BLANK
  69.     CP    0
  70.     JR    Z,START1
  71.     CALL    GETTIM
  72.     JP    C,ERROR
  73.     CALL    BLANK
  74.     CP    0
  75.     JP    NZ,ERROR
  76.     CALL    CHKTIM
  77.     JP    C,ERROR
  78.     LD    A,B            ; HOUR
  79.     LD    (HOUR),A
  80.     LD    A,C            ; MINUTE
  81.     LD    (MINUTE),A
  82.     LD    A,E            ; SECOND
  83.     LD    (SECOND),A    
  84. START1:    LD    DE,PRESS
  85.     LD    C,9
  86.     CALL    5
  87.     LD    C,1
  88.     CALL    5
  89.     LD    DE,TIMEDT
  90.     LD    C,201
  91.     CALL    5
  92.     LD    A,CR
  93.     CALL    OUTCH
  94.     LD    A,LF
  95.     CALL    OUTCH
  96. ;    
  97. GET:    LD    DE,TIMEDT
  98.     LD    C,200
  99.     CALL    5
  100.     LD    BC,(TIMEDT)
  101.     CALL    DMJ
  102.     CALL    PRDMJ
  103.     JP    EXIT
  104. ;
  105. CONT:    LD    DE,TIMEDT
  106.     LD    C,200
  107.     CALL    5
  108.     LD    BC,(TIMEDT)
  109.     CALL    DMJ
  110.     CALL    PRDMJ
  111. CONT0:    LD    C,11
  112.     CALL    5
  113.     OR    A
  114.     JR    NZ,CONT1
  115.     LD    A,(SECOND)
  116.     PUSH    AF
  117.     LD    DE,TIMEDT
  118.     LD    C,200
  119.     CALL    5
  120.     POP    AF
  121.     LD    B,A
  122.     LD    A,(SECOND)
  123.     CP    B
  124.     JR    Z,CONT0
  125.     LD    A,CR
  126.     CALL    OUTCH
  127.     JR    CONT
  128. CONT1:    LD    C,1
  129.     CALL    5
  130.     JP    EXIT
  131. ;
  132. SET:    LD    DE,DATMSG
  133.     LD    C,9
  134.     CALL    5
  135.     LD    DE,00080H
  136.     LD    A,126
  137.     LD    (00080H),A
  138.     LD    C,10
  139.     CALL    5
  140.     LD    A,LF
  141.     CALL    OUTCH
  142.     LD    DE,DATE
  143.     LD    C,200
  144.     CALL    5
  145.     LD    HL,(DATE)
  146.     LD    (TIMEDT),HL
  147.     LD    A,(00081H)
  148.     ADD    A,82H
  149.     LD    H,0
  150.     LD    L,A
  151.     LD    (HL),0
  152.     LD    HL,00082H
  153.     CALL    BLANK
  154.     CP    0
  155.     JR    Z,SET0
  156.     CALL    GETDAT
  157.     JP    C,ERROR
  158.     CALL    BLANK
  159.     CP    0
  160.     JP    NZ,ERROR
  161.     LD    L,E            ; YEAR
  162.     LD    H,019H
  163.     LD    E,B            ; MONTH
  164.     CALL    CONHEX
  165.     CALL    CHKDAT
  166.     JP    C,ERROR
  167.     CALL    DAYS
  168.     LD    (TIMEDT),BC
  169. SET0:    LD    A,0FFH
  170.     LD    (TDFLAG),A
  171.     LD    DE,TIMMSG
  172.     LD    C,9
  173.     CALL    5
  174.     LD    DE,00080H
  175.     LD    A,126
  176.     LD    (00080H),A
  177.     LD    C,10
  178.     CALL    5
  179.     LD    A,LF
  180.     CALL    OUTCH
  181.     LD    DE,DATE
  182.     LD    C,200
  183.     CALL    5
  184.     LD    HL,DATE+2
  185.     LD    DE,HOUR
  186.     LD    BC,3
  187.     LDIR
  188.     LD    A,(00081H)
  189.     ADD    A,82H
  190.     LD    H,0
  191.     LD    L,A
  192.     LD    (HL),0
  193.     LD    HL,00082H
  194.     CALL    BLANK
  195.     CP    0
  196.     JP    Z,SET1
  197.     CALL    GETTIM
  198.     JP    C,ERROR
  199.     CALL    BLANK
  200.     CP    0
  201.     JP    NZ,ERROR
  202.     CALL    CHKTIM
  203.     JP    C,ERROR
  204.     LD    A,B            ; HOUR
  205.     LD    (HOUR),A
  206.     LD    A,C            ; MINUTE
  207.     LD    (MINUTE),A
  208.     LD    A,E            ; SECOND
  209.     LD    (SECOND),A    
  210. SET1:    LD    DE,TIMEDT
  211.     LD    C,201
  212.     CALL    5
  213.     JP    GET
  214. ;
  215. ERROR:    LD    DE,ERRMSG
  216.     LD    C,9
  217.     CALL    5
  218.     LD    A,(TDFLAG)
  219.     OR    A
  220.     JP    Z,SET
  221.     JP    SET0
  222. ;
  223. EXIT:    LD    SP,(SPSAVE)
  224.     RET    
  225. ;
  226. ERRMSG:    DEFM    'Error in data input'
  227.     DEFB    CR,LF,'$'
  228. ;
  229. DATMSG:    DEFM    'Enter today''s date (DD/MM/YY): $'
  230. ;
  231. TIMMSG:    DEFM    'Enter the time (HH:MM:SS): $'
  232. ;
  233. PRESS:    DEFM    'Press any key to set time $'
  234. ;
  235. ; GET DATE
  236. ;
  237. GETDAT:    LD    A,(HL)
  238.     INC    HL
  239.     OR    A
  240.     SCF
  241.     RET    Z
  242.     CALL    DIGIT
  243.     JR    C,GETDAT
  244.     DEC    HL
  245.     CALL    NUMBER
  246.     RET    C
  247.     LD    C,E            ; DAY
  248. GETDT0:    LD    A,(HL)
  249.     INC    HL
  250.     OR    A
  251.     SCF
  252.     RET    Z
  253.     CALL    DIGIT
  254.     JR    C,GETDT0
  255.     DEC    HL
  256.     CALL    NUMBER
  257.     RET    C
  258.     LD    B,E            ; MONTH
  259. GETDT1:    LD    A,(HL)
  260.     INC    HL
  261.     OR    A
  262.     SCF
  263.     RET    Z
  264.     CALL    DIGIT
  265.     JR    C,GETDT1
  266.     DEC    HL
  267.     CALL    NUMBER            ; YEAR
  268.     RET    
  269. ;
  270. ; GET TIME
  271. ;
  272. GETTIM:    LD    A,(HL)
  273.     INC    HL
  274.     OR    A
  275.     SCF
  276.     RET    Z
  277.     CALL    DIGIT
  278.     JR    C,GETTIM
  279.     DEC    HL
  280.     CALL    NUMBER
  281.     RET    C
  282.     LD    B,E            ; HOUR
  283. GETT0:    LD    A,(HL)
  284.     INC    HL
  285.     OR    A
  286.     SCF
  287.     RET    Z
  288.     CALL    DIGIT
  289.     JR    C,GETT0
  290.     DEC    HL
  291.     CALL    NUMBER
  292.     RET    C
  293.     LD    C,E            ; MINUTE
  294.     LD    E,0
  295. GETT1:    LD    A,(HL)
  296.     OR    A
  297.     RET    Z
  298.     INC    HL
  299.     CALL    DIGIT
  300.     JR    C,GETT1
  301.     DEC    HL
  302.     CALL    NUMBER            ; SECOND
  303.     RET
  304. ;
  305. ; CHECK DATE
  306. ;
  307. CHKDAT:    LD    A,E
  308.     OR    A
  309.     SCF
  310.     RET    Z
  311.     CP    12+1
  312.     CCF
  313.     RET    C
  314.     PUSH    HL
  315.     LD    D,0
  316.     LD    HL,DM-1
  317.     ADD    HL,DE
  318.     LD    B,(HL)            ; DAYS IN MONTH
  319.     POP    HL
  320.     CP    2
  321.     JR    NZ,CHKDT0
  322.     CALL    LEAPYR
  323.     JR    NZ,CHKDT0
  324.     INC    B
  325. CHKDT0:    LD    A,C
  326.     OR    A
  327.     SCF
  328.     RET    Z
  329.     CP    B
  330.     RET    Z
  331.     CCF
  332.     RET
  333. ;
  334. ; CHECK TIME
  335. ;
  336. CHKTIM:    LD    A,B
  337.     CP    24H
  338.     CCF
  339.     RET    C
  340.     LD    A,C
  341.     CP    60H
  342.     CCF
  343.     RET    C
  344.     LD    A,E
  345.     CP    60H
  346.     CCF
  347.     RET
  348. ;
  349. ; CALCULATE DAYS
  350. ;  ENTRY : HL=YEAR (1978..2157)
  351. ;          E =MONTH (1..12)
  352. ;          C =DAYS (1..31)
  353. ;  EXIT  : BC=DAYS
  354. ;             FIRST DAY (00001) : SU 01-01-1978
  355. ;             LAST  DAY (65535) : SU 05-06-2157
  356. ;
  357. DAYS:    LD    B,0
  358.     PUSH    DE
  359.     LD    DE,1978
  360. DAYS0:    OR    A
  361.     SBC    HL,DE
  362.     ADD    HL,DE
  363.     JR    Z,DAYS1
  364.     PUSH    HL
  365.     LD    HL,365
  366.     ADD    HL,BC
  367.     LD    B,H
  368.     LD    C,L
  369.     POP    HL
  370.     EX    DE,HL
  371.     CALL    LEAPYR
  372.     EX    DE,HL
  373.     INC    DE
  374.     JR    NZ,DAYS0
  375.     INC    BC
  376.     JR    DAYS0
  377. DAYS1:    POP    DE
  378.     PUSH    HL
  379.     LD    HL,DM
  380.     LD    D,1
  381. DAYS2:    LD    A,E
  382.     CP    D
  383.     JR    Z,DAYS4
  384.     LD    A,C
  385.     ADD    A,(HL)
  386.     LD    C,A
  387.     JR    NC,DAYS3
  388.     INC    B
  389. DAYS3:    INC    HL
  390.     LD    A,D
  391.     INC    D
  392.     CP    2
  393.     JR    NZ,DAYS2
  394.     EX    (SP),HL
  395.     CALL    LEAPYR
  396.     EX    (SP),HL
  397.     JR    NZ,DAYS2
  398.     INC    BC
  399.     JR    DAYS2
  400. DAYS4:    POP    HL
  401.     RET
  402. ;
  403. ; CALCULATE YEAR,MONTH,DAY
  404. ;  ENTRY : BC=DAYS
  405. ;             FIRST DAY (00001) : SU 01-01-1978
  406. ;             LAST  DAY (65535) : SU 05-06-2157
  407. ;  EXIT  : HL=YEAR (1978..2157)
  408. ;          D =DAYS IN LAST MONTH (1..31)
  409. ;          E =MONTH (1..12)
  410. ;          B =DAY OF WEEK (1..7, 1=SUNDAY)
  411. ;          C =DAYS (1..31)
  412. ;
  413. DMJ:    PUSH    BC
  414.     LD    HL,1978
  415. DMJ0:    LD    DE,365
  416.     CALL    LEAPYR
  417.     JR    NZ,DMJ1
  418.     INC    DE
  419. DMJ1:    LD    A,E
  420.     SUB    C
  421.     LD    A,D
  422.     SBC    A,B
  423.     JR    NC,DMJ2
  424.     LD    A,C
  425.     SUB    E
  426.     LD    C,A
  427.     LD    A,B
  428.     SBC    A,D
  429.     LD    B,A
  430.     INC    HL
  431.     JR    DMJ0
  432. DMJ2:    LD    E,1
  433.     PUSH    HL
  434.     LD    HL,DM
  435. DMJ3:    LD    D,(HL)
  436.     LD    A,E
  437.     CP    2
  438.     JR    NZ,DMJ4
  439.     EX    (SP),HL
  440.     CALL    LEAPYR
  441.     EX    (SP),HL
  442.     JR    NZ,DMJ4
  443.     INC    D
  444. DMJ4:    LD    A,D
  445.     SUB    C
  446.     LD    A,0
  447.     SBC    A,B
  448.     JR    NC,DMJ5
  449.     LD    A,C
  450.     SUB    D
  451.     LD    C,A
  452.     LD    A,B
  453.     SBC    A,0
  454.     LD    B,A
  455.     INC    HL
  456.     INC    E
  457.     JR    DMJ3
  458. DMJ5:    POP    HL
  459.     EX    (SP),HL
  460.     PUSH    BC
  461.     DEC    HL
  462.     LD    BC,16*256+7
  463.     XOR    A
  464. DMJ6:    RL    L
  465.     RL    H
  466.     RLA
  467.     CP    C
  468.     JR    C,DMJ7
  469.     SUB    C
  470. DMJ7:    DJNZ    DMJ6    
  471.     INC    A
  472.     POP    BC
  473.     LD    B,A
  474.     POP    HL
  475.     RET
  476. ;
  477. ; CALCULATE LEAP YEAR CORRECTION
  478. ;  ENTRY : HL = YEAR
  479. ;  EXIT  : Z  = 1 CORRECTION NECCESARRY
  480. ;          Z  = 0 NO CORRECTION NEEDED
  481. ;
  482. LEAPYR:    LD    A,L
  483.     AND    3
  484.     RET    NZ
  485.     PUSH    HL
  486.     PUSH    DE
  487.     LD    A,-1
  488.     LD    DE,100
  489.     OR    A
  490. LEAPY0:    INC    A
  491.     SBC    HL,DE
  492.     JR    NC,LEAPY0
  493.     ADD    HL,DE
  494.     LD    H,A
  495.     LD    A,L
  496.     OR    A
  497.     JR    NZ,LEAPY1
  498.     LD    A,H
  499.     AND    3
  500.     JR    LEAPY2
  501. LEAPY1:    XOR    A
  502. LEAPY2:    POP    DE
  503.     POP    HL
  504.     RET
  505. ;
  506. ; DAYS/MONTH
  507. ;
  508. DM:    DEFB    31,28,31,30,31,30,31,31,30,31,30,31
  509. ;
  510. ; CONVERT DAYS,MONTH,YEAR TO HEX
  511. ;
  512. CONHEX:    LD    A,C
  513.     CALL    BCDHEX
  514.     LD    C,A
  515.     LD    A,E
  516.     CALL    BCDHEX
  517.     LD    E,A
  518.     PUSH    DE
  519.     LD    DE,100
  520.     LD    A,L
  521.     CALL    BCDHEX
  522.     LD    L,A
  523.     LD    A,H
  524.     CALL    BCDHEX
  525.     LD    H,0
  526.     OR    A
  527.     JR    Z,CONHX1
  528. CONHX0:    ADD    HL,DE
  529.     DEC    A
  530.     JR    NZ,CONHX0
  531. CONHX1:    LD    DE,1978
  532.     OR    A
  533.     SBC    HL,DE
  534.     ADD    HL,DE
  535.     JR    NC,CONHX2
  536.     LD    DE,100
  537.     ADD    HL,DE
  538. CONHX2:    POP    DE
  539.     RET
  540. ;
  541. ; PRINT: DAY IN WEEK,DAYS,MONTH,YEAR
  542. ;
  543. PRDMJ:    PUSH    HL
  544.     PUSH    BC
  545.     LD    HL,DAYSWK-3
  546.     LD    C,B
  547.     LD    B,0
  548.     ADD    HL,BC
  549.     ADD    HL,BC
  550.     ADD    HL,BC
  551.     LD    A,(HL)
  552.     INC    HL
  553.     CALL    OUTCH
  554.     LD    A,(HL)
  555.     INC    HL
  556.     CALL    OUTCH
  557.     LD    A,(HL)
  558.     CALL    OUTCH
  559.     POP    BC
  560.     POP    HL
  561.     LD    A,' '
  562.     CALL    OUTCH
  563.     LD    A,C
  564.     CALL    HEXBCD
  565.     CALL    OUTBCD
  566.     LD    A,'-'
  567.     CALL    OUTCH
  568.     PUSH    HL
  569.     PUSH    DE
  570.     LD    D,0
  571.     LD    HL,MONTHS-3
  572.     ADD    HL,DE
  573.     ADD    HL,DE
  574.     ADD    HL,DE
  575.     LD    A,(HL)
  576.     INC    HL
  577.     CALL    OUTCH
  578.     LD    A,(HL)
  579.     INC    HL
  580.     CALL    OUTCH
  581.     LD    A,(HL)
  582.     CALL    OUTCH
  583.     POP    DE
  584.     POP    HL
  585.     LD    A,'-'
  586.     CALL    OUTCH
  587.     LD    A,E
  588.     CALL    HEXBCD
  589.     LD    E,A
  590.     PUSH    DE
  591.     LD    A,-1
  592.     LD    DE,100
  593.     OR    A
  594. PRDMJ0:    INC    A
  595.     SBC    HL,DE
  596.     JR    NC,PRDMJ0
  597.     ADD    HL,DE
  598.     CALL    HEXBCD
  599.     LD    H,A
  600.     LD    A,L
  601.     CALL    HEXBCD
  602.     LD    L,A
  603.     POP    DE
  604.     LD    A,H
  605.     CALL    OUTBCD
  606.     LD    A,L
  607.     CALL    OUTBCD
  608.     LD    A,' '
  609.     CALL    OUTCH
  610.     LD    A,(HOUR)
  611.     CALL    OUTBCD
  612.     LD    A,':'
  613.     CALL    OUTCH
  614.     LD    A,(MINUTE)
  615.     CALL    OUTBCD
  616.     LD    A,':'
  617.     CALL    OUTCH
  618.     LD    A,(SECOND)
  619.     CALL    OUTBCD
  620.     RET
  621. ;
  622. ; DAYS IN WEEK
  623. ;
  624. MONTHS:    DEFM    'JanFebMarAprMayJunJulAugSepOctNovDec'
  625. ;
  626. DAYSWK:    DEFM    'SunMonTueWedThuFriSat'
  627. ;
  628. ; CONVERT HEX TO BCD
  629. ;
  630. HEXBCD:    OR    A
  631.     RET    Z
  632.     PUSH    BC
  633.     LD    B,A
  634.     XOR    A
  635. HXBCD0:    ADD    A,1
  636.     DAA
  637.     DJNZ    HXBCD0
  638.     POP    BC
  639.     RET
  640. ;
  641. ; CONVERT BCD TO HEX
  642. ;
  643. BCDHEX:    OR    A
  644.     RET    Z
  645.     PUSH    BC
  646.     LD    B,0
  647. BCDHX0:    INC    B
  648.     SUB    1
  649.     DAA
  650.     JR    NZ,BCDHX0
  651.     LD    A,B
  652.     POP    BC
  653.     RET
  654. ;
  655. ; OUTPUT BCD CHAR
  656. ;
  657. OUTBCD:    PUSH    AF
  658.     RRCA
  659.     RRCA
  660.     RRCA
  661.     RRCA
  662.     AND    0FH
  663.     ADD    A,'0'
  664.     CALL    OUTCH
  665.     POP    AF
  666.     PUSH    AF
  667.     AND    0FH
  668.     ADD    A,'0'
  669.     CALL    OUTCH
  670.     POP    AF
  671.     RET
  672. ;
  673. ; OUTPUT CHAR
  674. ;
  675. OUTCH:    PUSH    AF
  676.     PUSH    BC
  677.     PUSH    DE
  678.     PUSH    HL
  679.     LD    E,A
  680.     LD    C,2
  681.     CALL    5
  682.     POP    HL
  683.     POP    DE
  684.     POP    BC
  685.     POP    AF
  686.     RET
  687. ;
  688. ; INPUT NUMBER
  689. ;
  690. NUMBER:    CALL    BLANK
  691.     LD    A,(HL)
  692.     CALL    DIGIT
  693.     RET    C
  694.     AND    0FH
  695.     LD    E,A
  696.     LD    D,0
  697. NUMB0:    INC    HL
  698.     LD    A,(HL)
  699.     CALL    DIGIT
  700.     CCF
  701.     RET    NC
  702.     EX    DE,HL
  703.     ADD    HL,HL
  704.     ADD    HL,HL
  705.     ADD    HL,HL
  706.     ADD    HL,HL
  707.     AND    0FH
  708.     ADD    A,L
  709.     LD    L,A
  710.     EX    DE,HL
  711.     LD    A,D
  712.     OR    A
  713.     SCF
  714.     RET    NZ
  715.     JR    NUMB0
  716. ;
  717. ; BLANK INPUT
  718. ;
  719. BLANK:    LD    A,(HL)
  720.     CP    ' '
  721.     JR    Z,BLANK0
  722.     CP    09H
  723.     RET    NZ
  724. BLANK0:    INC    HL
  725.     JR    BLANK
  726. ;
  727. ; TEST DIGIT
  728. ;
  729. DIGIT:    CP    '0'
  730.     RET    C
  731.     CP    '9'+1
  732.     CCF
  733.     RET
  734. ;
  735. TDFLAG:    DEFB    0
  736. ;
  737. TIMEDT:    DEFW    0
  738. HOUR:    DEFB    0
  739. MINUTE:    DEFB    0
  740. SECOND:    DEFB    0
  741. ;
  742. DATE:    DEFW    0
  743.     DEFS    3
  744. ;
  745. SPSAVE:    DEFS    2
  746.     DEFS    64
  747. STACK:
  748. ;
  749.     END
  750.