LS-DOS 6.3.1 - LOWCORE Assembly Listing (HTML format version)

[Copyright 1999,2002 Frank Durda IV, All Rights Reserved.
Mirroring of any material on this page in any form is expressly prohibited.
The official web site for this material is:  http://nemesis.lonestar.org
Contact this address for use clearances: clearance at nemesis.lonestar.org
Comments and queries to this address: web_software_2011 at nemesis.lonestar.org]
MISOSYS EDAS-4.3 04/19/99 00:05:55 DATE/TIME - LS-DOS 6.3       Page 00001 

              00001 ;LBDATE/ASM - Date/Time Commands
              00003 ;
0000          00004 *GET    BUILDVER/ASM:3
              00005 ;
              00006 ;       Buildver/asm is a bit of a kludge since not all utilities can load
              00007 ;       equates from LDOS60 and still compile.  LOWCORE and everybody else
              00008 ;       relies on this setting, and it eventually ends up in LDOS60/EQU
              00009 ;       for programs that can use that.
              00010 ;
FFFF          00011 @BLD631         EQU     -1      ;<631>Build 631 distribution (LEVEL 1B)
              00012 ;       These switches activate patches made since the 1B release.
              00013 ;       It is important that all earlier patches be enabled when a higher
              00014 ;       patch is enabled.
              00015 ;       Patches C thru F were published in TMQ IV.iv, page 32 (NOTE: the
              00016 ;       patch addresses listed for SPOOL in SPOOL1/FIX are 19H high.)
FFFF          00017 @BLD631C        EQU     -1      ;<631>Apply 1C patches (SETKI)
FFFF          00018 @BLD631D        EQU     -1      ;<631>Apply 1D patches (DIR)
FFFF          00019 @BLD631E        EQU     -1      ;<631>Apply 1E patches (DIR & MEMDISK/DCT)
FFFF          00020 @BLD631F        EQU     -1      ;<631>Apply 1F patches (SPOOL)
              00021 ;       Patches G and H were published in TMQ V.i, pages 10 and 18/19.
FFFF          00022 @BLD631G        EQU     -1      ;<631>Apply 1G patches (//KEYIN,DIR,DO *)
FFFF          00023 @BLD631H        EQU     -1      ;<631>Apply 1H patches (MEMORY)
              00024 ;
              00025 ;End of BUILDVER/ASM
0000          00026 *GET    SVCMAC:3                ;SVC Macro equivalents
              00027 ;SVCMAC/ASM - LS-DOS Version VI
              00028 *LIST   OFF
              00420 *LIST   ON
              00422 *LIST OFF                       ;Get LDOS60/EQU
              00560 *LIST ON
              00561 ;
000D          00562 CR      EQU     13
001D          00563 @ADTSK  EQU     29              ;Add Task SVC #
001E          00564 @RMTSK  EQU     30              ;Remove Task SVC #
0005          00565 CLK_SLT EQU     5               ;Clock Task Slot #
              00566 ;
              00567 ;
              00568 ;       DATE$ Storage
              00569 ;
              00570 ; DATE$+0   Year (80-87)
              00571 ; DATE$+1   Day of the month (1-31)
              00572 ; DATE$+2   Month (1-12)
              00573 ; DATE$+3   Bits 0-7 of Day of Year
              00574 ; Date$+4   Bit 0 = bit 8 of Day of Year
              00575 ;           Bits 1-3 contain Day of Week
              00576 ;           Bit 7 set if a leap year
              00577 ;
              00578 ;       TIME$ Storage
              00579 ;
              00580 ; TIME$+0   Seconds (0-59)
              00581 ; TIME$+1   Minutes (0-59)
              00582 ; TIME$+2   Hours (0-23)
              00583 ;
              00584 ;
              00585 ;
2400          00586         ORG     2400H
              00587 ;
              00588 ;       Branch to TIME entry point
              00589 ;
2400 C31825   00590         JP      TIME            ;Time entry point
              00591 ;
              00593 ;
2403          00594 DATE    @@CKBRKC                ;Break key down?
2403+3E6A     00595         LD      A,106
2405+EF       00596         RST     40
2406 2804     00597         JR      Z,BEGINA        ;Ok if not
2408 21FFFF   00598         LD      HL,-1           ;  else abort
240B C9       00599         RET
              00600 ;
              00601 ;       DATE - Pick up DATE$+0 pointer & stuff in IY
              00602 ;
240C E5       00603 BEGINA  PUSH    HL              ;Save command ptr
240D 218E27   00604         LD      HL,DUMBUF       ;HL => Dummy Buffer
2410          00605         @@DATE                  ;DE <= DATE$+0
2410+3E12     00606         LD      A,18
2412+EF       00607         RST     40
2413 E1       00608         POP     HL              ;Recover command ptr
2414 D5       00609         PUSH    DE              ;Xfer ptr to IY
2415 FDE1     00610         POP     IY
              00611 ;
              00612 ;       Was a Date entered on the command line ?
              00613 ;
2417 7E       00614         LD      A,(HL)          ;P/u character
2418 FE0E     00615         CP      CR+1            ;Date entry ?
241A DA6224   00616         JP      C,DSPDATE       ;No - display date
              00617 ;
              00618 ;       Date entered - check if legal format
              00619 ;
241D 0E30     00620         LD      C,'0'           ;Init separator
241F CDB525   00621         CALL    PARSDAT         ;Parse entry
2422 C21125   00622         JP      NZ,BADFMT       ;Bad entry - abort
              00623 ;
              00624 ;       Legal Date - If Intl date - swap DTBUF+1 & 2
              00625 ;
              00626         IF      @INTL
              00627         INC     DE              ;DE => DTBUF+1
              00628         LD      H,D             ;HL => DTBUF+1
              00629         LD      L,E
              00630         LD      C,(HL)          ;C = Intl MONTH
              00631         INC     HL              ;HL => DTBUF+2
              00632         LD      A,(HL)          ;A = Intl DAY
              00633         LD      (DE),A          ;Set DTBUF+1 = DAY
              00634         LD      (HL),C          ;Set DTBUF+2 = MONTH
              00635         DEC     DE              ;DE => DTBUF+0
              00636         ELSE
2425 00       00637         DC      9,0             ;Pad US ver to match Intl
     00 00 00 00 00 00 00 00
              00638         ENDIF
              00639 ;
              00640 ;       Is the year legal ?
              00641 ;
242E 1A       00642         LD      A,(DE)          ;P/u year entry
              00643         IF      @BLD631
242F FE0C     00644         CP      0CH             ;<631>
2431 3003     00645         JR      NC,L2436        ;<631>
2433 C664     00646         ADD     A,64H           ;<631>
2435 12       00647         LD      (DE),A          ;<631>
              00648 L2436:
              00649         ENDIF
2436 D650     00650         SUB     80              ;Accept only 80-87
2438 DA1125   00651         JP      C,BADFMT        ;Less than 80 - bad
              00652         IF      @BLD631
243B FE20     00653         CP      20H             ;<631>
              00654         ELSE
              00655         CP      20              ;Greater than 99 ?
              00656         ENDIF
243D 3018     00657         JR      NC,BADFMT2      ;Yes - bad
              00658 ;
              00659 ;       If Year is 1980 or 84 then set FEB = 29 days
              00660 ;
243F E603     00661         AND     3               ;0 or 4 ?
2441 214D27   00662         LD      HL,MAXDAYS+2    ;Set Feb to have 29 days
2444 2001     00663         JR      NZ,NOTLEAP      ;No - don't inc
2446 34       00664         INC     (HL)            ;Leap year - inc max days
              00665 ;
              00666 ;       Check Range of month - must be 1 - 12
              00667 ;
2447 3A8D27   00668 NOTLEAP LD      A,(DTBUF+2)     ;P/u month
244A 3D       00669         DEC     A               ;Set month = 0-11
244B FE0C     00670         CP      12              ;Valid Month ?
244D 3008     00671         JR      NC,BADFMT2      ;Abort if 0 or >12
              00672 ;
              00673 ;       Valid month - point HL to max days/month
              00674 ;
244F 2B       00675         DEC     HL              ;HL => Max day table
2450 85       00676         ADD     A,L             ;Add month # to start
2451 6F       00677         LD      L,A             ;HL => Max days for month
              00678 ;
              00679 ;       Check for Day entry is valid
              00680 ;
2452 3A8C27   00681         LD      A,(DTBUF+1)     ;P/u day entry
2455 3D       00682         DEC     A               ;Reduce for test (0->FF)
2456 BE       00683         CP      (HL)            ;More than max days ?
2457 D21125   00684 BADFMT2 JP      NC,BADFMT       ;Go if too large (or 0)
              00685 ;
              00686 ;       Transfer Date into buffer
              00687 ;
245A EB       00688         EX      DE,HL           ;Point HL to DTBUF
245B FDE5     00689         PUSH    IY              ;Point DE = DATE$
245D D1       00690         POP     DE
245E 0E03     00691         LD      C,3             ;BC = 3 chars to xfer
2460 EDB0     00692         LDIR                    ;Xfer 3 chars
              00693 ;
              00694 ;       Display "No Date in System" if illegal Date
              00695 ;
2462 FD7E02   00696 DSPDATE LD      A,(IY+2)        ;P/u month
2465 215827   00697         LD      HL,NODATE$      ;"No Date in system"
2468 B7       00698         OR      A               ;Better not be zero
2469 CA1425   00699         JP      Z,LOGABRT       ;Log & abort
246C 47       00700 GOTDATE LD      B,A             ;Xfer month to B
246D 214D27   00701         LD      HL,MAXDAYS+2    ;Adjust February if
2470 7E       00702         LD      A,(HL)          ;  year is leap year
2471 D61D     00703         SUB     29              ;  & not already adjusted
2473 2808     00704         JR      Z,PUDAY         ;  in parsing date entry
              00705 ;
              00706 ;       Pick up Year & increment max days if leap yr
              00707 ;
2475 FD7E00   00708         LD      A,(IY)          ;P/u year
2478 E603     00709         AND     3               ;1980 and 1984 are lp yrs
247A 2001     00710         JR      NZ,PUDAY        ;Not leap year - fine
247C 34       00711         INC     (HL)            ;Bump to 29
              00712 ;
              00713 ;       Set HL = day # this month, DE => Max table
              00714 ;
247D FD6E01   00715 PUDAY   LD      L,(IY+1)        ;P/u day # this month
2480 2600     00716         LD      H,0             ;  in HL
2482 114B27   00717         LD      DE,MAXDAYS      ;DE => Max day table
              00718 ;
              00719 ;       Loop to Count up total # of days up to now
              00720 ;
2485 1A       00721 DAYLP   LD      A,(DE)          ;P/u max day
2486 85       00722         ADD     A,L             ;Add to HL
2487 6F       00723         LD      L,A
2488 8C       00724         ADC     A,H
2489 95       00725         SUB     L
248A 67       00726         LD      H,A
248B 13       00727         INC     DE              ;Bump days ptr
248C 10F7     00728         DJNZ    DAYLP           ;B months of max days
              00729 ;
              00730 ;       Stuff days (9 bits) into DATE$
              00731 ;
248E FD7503   00732         LD      (IY+3),L        ;Stuff in lsb
2491 7C       00733         LD      A,H             ;Get bit "8"
2492 FDB604   00734         OR      (IY+4)          ;  and OR it in
2495 FD7704   00735         LD      (IY+4),A        ;Then put it back
              00736 ;
              00737 ;       Pick up year in E (0-7)
              00738 ;
2498 FD7E00   00739         LD      A,(IY)          ;P/u year
249B D650     00740         SUB     80              ;Offset from 80
249D 5F       00741         LD      E,A             ;Put 0-7 in E
249E C603     00742         ADD     A,3             ;Ck for year >= 84
24A0 0F       00743         RRCA
24A1 0F       00744         RRCA
              00745         IF      @BLD631
24A2 E60F     00746         AND     0FH             ;<631>Keep bits 3-0
              00747         ELSE
              00748         AND     7               ;Keep bits 0,1,2
              00749         ENDIF
24A4 83       00750         ADD     A,E             ;Add back to year
24A5 5F       00751         LD      E,A             ;  & save in DE
24A6 1600     00752         LD      D,0
24A8 19       00753         ADD     HL,DE           ;Add to days in year
24A9 23       00754         INC     HL              ;To start in right place
              00755 ;
              00756 ;       HL = desired number to divide by seven
              00757 ;
24AA 010700   00758         LD      BC,7            ;Now divide by 7
24AD AF       00759         XOR     A
24AE ED42     00760 DIV7    SBC     HL,BC           ;Subtract weeks (7-days)
24B0 30FC     00761         JR      NC,DIV7         ;  until under flow
              00762 ;
              00763 ;       Correct # for division, & put in bits 1-3
              00764 ;
24B2 7D       00765         LD      A,L
24B3 C608     00766         ADD     A,8             ;Add back to get 1-7
24B5 47       00767         LD      B,A             ;Save day of week
24B6 07       00768         RLCA                    ;Shift to bits 1-3
24B7 4F       00769         LD      C,A             ;  to store in DATE$
              00770 ;
              00771 ;       Merge day of week with bit 9 of day of year
              00772 ;
24B8 FD7E04   00773         LD      A,(IY+4)        ;P/u DATE$ + 4
24BB E6F1     00774         AND     0F1H            ;Keep lp yr bit & bit 0
24BD B1       00775         OR      C               ;Merge day of week
24BE FD7704   00776         LD      (IY+4),A        ;Stuff back in
              00777 ;
              00778 ;       Transfer Day string into display buffer
              00779 ;
24C1 210027   00780         LD      HL,DAYTBL       ;HL => Day string table
24C4 113927   00781         LD      DE,DATEBUF      ;Date display buffer
24C7 D5       00782         PUSH    DE              ;Save start
24C8 CDA625   00783         CALL    DSPMDY          ;Write out the day
              00784 ;
              00785 ;       Position DE to month destination in buffer
              00786 ;
24CB 13       00787         INC     DE              ;Bump
24CC 13       00788         INC     DE
              00789 ;
              00790 ;       Pick up month, & stuff string into buffer
              00791 ;
24CD FD7E02   00792         LD      A,(IY+2)        ;P/u month number
24D0 47       00793         LD      B,A             ;Stuff in B
24D1 211527   00794         LD      HL,MONTBL       ;HL => Month string table
24D4 CDA625   00795         CALL    DSPMDY          ;Write out the month name
              00796 ;
              00797 ;       P/u day of the month & convert to ASCII
              00798 ;
24D7 13       00799         INC     DE              ;DE => Day destination
24D8 FD7E01   00800         LD      A,(IY+1)        ;P/u day
24DB 06FF     00801         LD      B,-1            ;Init # of tens to -1
              00802 ;
              00803 ;       Divide day of the month by 10
              00804 ;
24DD 04       00805 DIV10   INC     B               ;Divide by 10
24DE D60A     00806         SUB     10              ;  with quotient in B
24E0 30FB     00807         JR      NC,DIV10        ;Subtract until carry
              00808 ;
              00809 ;       Convert to tens digit to ASCII
              00810 ;
24E2 F5       00811         PUSH    AF              ;Save (10-remainder)
24E3 78       00812         LD      A,B             ;P/u quotient
24E4 C630     00813         ADD     A,'0'           ;Change to ASCII
              00814 ;
              00815 ;       Change to a space if it's a leading zero
              00816 ;
24E6 FE30     00817         CP      '0'             ;Zero?
24E8 2002     00818         JR      NZ,NOTLD0       ;No - use it
24EA 3E20     00819         LD      A,' '           ;Change leading 0 to ' '
24EC 12       00820 NOTLD0  LD      (DE),A          ;Stuff in buffer
              00821 ;
              00822 ;       Convert remainder to ASCII & stuff in buffer
              00823 ;
24ED 13       00824         INC     DE              ;DE => ones destination
24EE F1       00825         POP     AF              ;Get back remainder
24EF C63A     00826         ADD     A,3AH           ;Change to ASCII
24F1 12       00827         LD      (DE),A          ;Stuff in buffer
              00828 ;
              00829 ;       P/u year & stuff lower digit + "0" in buffer
              00830 ;
24F2 FD7E00   00831         LD      A,(IY)          ;Form last year digit
              00832         IF      @BLD631
24F5 216C07   00833         LD      HL,1900         ;<631>
24F8 85       00834         ADD     A,L             ;<631>
24F9 6F       00835         LD      L,A             ;<631>
24FA 8C       00836         ADC     A,H             ;<631>
24FB 95       00837         SUB     L               ;<631>
24FC 67       00838         LD      H,A             ;<631>
24FD 114527   00839         LD      DE,YRBUF        ;<631>
2500          00840         @@HEXDEC                ;<631>
2500+3E61     00841         LD      A,97
2502+EF       00842         RST     40
              00843         ELSE
              00844         SUB     80              ;A = 0-19
              00845         CP      10              ;In 1980's?
              00846         JR      C,WAS80
              00847         LD      B,A
              00848         LD      A,'9'           ;Nope, 1990's
              00849         LD      (DATEBUF+15),A
              00850         LD      A,B             ;Get back year offset
              00851         SUB     10              ;Sub off decade
              00852 WAS80   ADD     A,'0'           ;Make ascii
              00853         LD      (DATEBUF+16),A  ;Stuff year
              00854         ENDIF
              00855 ;
              00856 ;       Set B = 0 (Normal Exit)
              00857 ;
2503 0600     00858 LOGDT   LD      B,0             ;B = 0 (normal exit)
2505 E1       00859         POP     HL              ;HL => Date/Time string
              00860 ;
              00861 ;       Display Date or Time String
              00862 ;
2506 C5       00863 LOGMSG  PUSH    BC              ;Save Error #, B (exit)
2507          00864         @@LOGOT                 ;Log message
              00865         IFEQ    00H,1
              00866         LD      HL,
              00867         ENDIF
2507+3E0C     00868         LD      A,12
2509+EF       00869         RST     40
250A C1       00870         POP     BC              ;B = exit condition
              00871 ;
              00872 ;       If B = 0 then exit HL = 0, otherwise HL = -1
              00873 ;
250B 60       00874         LD      H,B             ;Set HL = -1 or 0
250C 68       00875         LD      L,B             ;
250D          00876         @@CKBRKC                ;Clear any break
250D+3E6A     00877         LD      A,106
250F+EF       00878         RST     40
2510 C9       00879         RET                     ;RETurn with condition
              00880 ;
              00881 ;       Bad Format - display error & abort
              00882 ;
2511 216B27   00883 BADFMT  LD      HL,BADDAT$      ;Illegal Date/Time
2514 06FF     00884 LOGABRT LD      B,-1            ;Abort Condition
2516 18EE     00885         JR      LOGMSG          ;Log Message
              00886 ;
              00889 ;
2518          00890 TIME    @@CKBRKC                ;Break key down?
2518+3E6A     00891         LD      A,106
251A+EF       00892         RST     40
251B 2804     00893         JR      Z,BEGINB        ;Ok if not
251D 21FFFF   00894         LD      HL,-1           ;  else abort
2520 C9       00895         RET
              00896 ;
              00897 ;       TIME entry point - Any Parms entered ?
              00898 ;
2521 E5       00899 BEGINB  PUSH    HL              ;Save pointer
2522 7E       00900 TLOOP   LD      A,(HL)          ;P/u character
2523 FE28     00901         CP      '('             ;Any parameters ?
2525 2807     00902         JR      Z,GETPRMS       ;Yes - get 'em
2527 FE0D     00903         CP      CR              ;End of line ?
2529 2809     00904         JR      Z,CLRSTK        ;Yes - go check time
252B 23       00905         INC     HL              ;Bump ptr
252C 18F4     00906         JR      TLOOP           ;Do til terminator
              00907 ;
              00908 ;       Process any Parameters
              00909 ;
252E 11F825   00910 GETPRMS LD      DE,PRMTBL$      ;DE => Parameter Table
2531          00911         @@PARAM                 ;Get parameters
2531+3E11     00912         LD      A,17
2533+EF       00913         RST     40
              00914 ;
              00915 ;       Stuff "Illegal Time" Mess in error routine
              00916 ;
2534 217B27   00917 CLRSTK  LD      HL,BADTIM$      ;Chg "Bad date format"
2537 221225   00918         LD      (BADFMT+1),HL   ;  to "Bad time...
253A E1       00919         POP     HL              ;Recover command ptr
253B 280A     00920         JR      Z,GDPARMS       ;Z - ok to continue
              00921 ;
              00922 ;       Parameter Error - Display & abort
              00923 ;
253D 6F       00924 IOERR   LD      L,A             ;Xfer errcod to HL
253E 2600     00925         LD      H,0
2540 F6C0     00926         OR      0C0H            ;Short error
2542 4F       00927         LD      C,A             ;Xfer to C
2543          00928         @@ERROR                 ;Log error
2543+3E1A     00929         LD      A,26
2545+EF       00930         RST     40
2546 C9       00931         RET
              00932 ;
              00933 ;       Was there a TIME string entered ?
              00934 ;
2547 7E       00935 GDPARMS LD      A,(HL)          ;P/u char
2548 FE28     00936         CP      '('             ;Parms only?
254A CA9925   00937         JP      Z,DSPTIME       ;Display old time
254D FE0D     00938         CP      CR              ;End of line?
254F CA9925   00939         JP      Z,DSPTIME       ;Display old time
              00940 ;
              00941 ;       Requested time set - Check if legal format
              00942 ;
2552 AF       00943         XOR     A
2553 32D225   00944         LD      (ISTIM),A       ;Show doint time
2556 328B27   00945         LD      (DTBUF),A       ;Init seconds to 0
2559 0E30     00946         LD      C,'0'           ;Init separator
255B CDB525   00947         CALL    PARSDAT         ;Parse entry
255E 20B1     00948         JR      NZ,BADFMT       ;Bad - abort
              00949 ;
              00950 ;       Legal Format - Check if Hours are legal
              00951 ;
2560 218D27   00952         LD      HL,DTBUF+2      ;HL => Hours byte
2563 3E17     00953         LD      A,23            ;Greater than 23 ?
2565 BE       00954         CP      (HL)
2566 38A9     00955         JR      C,BADFMT        ;Yes - bad format
              00956 ;
              00957 ;       Hours legal - Check if minutes legal
              00958 ;
2568 2B       00959         DEC     HL              ;HL => Minutes
2569 3E3B     00960         LD      A,59            ;Greater than 59 ?
256B BE       00961         CP      (HL)
256C 38A3     00962         JR      C,BADFMT        ;Yes - bad format
              00963 ;
              00964 ;       Minutes legal - Check if seconds legal
              00965 ;
256E 2B       00966         DEC     HL              ;HL => Seconds
256F BE       00967         CP      (HL)            ;Greater than 59 ?
2570 389F     00968         JR      C,BADFMT        ;Yes - bad format
              00969 ;
              00970 ;       Legal input - transfer to TIME$ storage area
              00971 ;
2572 E5       00972         PUSH    HL              ;Save TIME buffer ptr
2573 218E27   00973         LD      HL,DUMBUF       ;HL => dummy buffer
2576          00974         @@TIME                  ;DE <= TIME$+0
2576+3E13     00975         LD      A,19
2578+EF       00976         RST     40
2579 E1       00977         POP     HL              ;Recover TIME buffer ptr
257A 010300   00978         LD      BC,3            ;3 bytes to xfer
257D EDB0     00979         LDIR                    ;Xfer
              00980 ;
              00981 ;       Was the CLOCK (C) parameter entered ?
              00982 ;
257F 210000   00983 DOCLOCK LD      HL,0            ;HL = 0 (Normal Exit)
2582 3AFF25   00984         LD      A,(CRESP)       ;P/u response
2585 B7       00985         OR      A
2586 C8       00986         RET     Z               ;RETurn if no response
              00987 ;
              00988 ;       CLOCK (C) parameter entered - ON or OFF ?
              00989 ;
2587 110000   00990 CLOCK   LD      DE,$-$          ;P/u parm = FFFF or 0000
258A          00991         @@FLAGS                 ;IY => System Flags
258A+3E65     00992         LD      A,101
258C+EF       00993         RST     40
              00994 ;
              00995 ;       Just Set/Reset CLOCK bit if Model IV version
              00996 ;
              00997         IF      @MOD4
258D FDCB15E6 00998         SET     4,(IY+'V'-'A')  ;Set Clock bit
2591 1C       00999         INC     E               ;Return if CLOCK = YES
2592 C8       01000         RET     Z               ;
2593 FDCB15A6 01001         RES     4,(IY+'V'-'A')  ;Otherwise Reset bit
2597 1D       01002         DEC     E               ;Set Z flag
2598 C9       01003         RET                     ;Done - RETurn
              01004         ENDIF
              01005 ;
              01006 ;       Also Add or Remove Task if Model II Version
              01007 ;
              01008         IF      @MOD2
              01009         RES     4,(IY+'V'-'A')  ;Reset clock bit
              01010         LD      C,CLK_SLT       ;Set C = Clock Slot #
              01011         LD      A,@RMTSK        ;A = Remove Task SVC #
              01012         INC     E               ;Clock Off ?
              01013         JR      NZ,CLOFF        ;Yes - remove task
              01014 CLON    LD      DE,DO_CLOCK     ;Clock on - DE => Address
              01015         SET     4,(IY+'V'-'A')  ;Set clock bit
              01016         LD      A,@ADTSK        ;A = Add Task SVC #
              01017 CLOFF   RST     40              ;Issue SVC
              01018         XOR     A               ;Set Z for no error
              01019         LD      H,A             ;Pass to HL
              01020         LD      L,A             ;For normal exit
              01021         RET
              01022         ENDIF
              01023 ;
              01024 ;       Display the Time
              01025 ;
2599 214227   01026 DSPTIME LD      HL,DATEBUF+9    ;Pt to space for time str
259C E5       01027         PUSH    HL              ;Save pointer
259D          01028         @@TIME                  ;Xfer time into buffer
259D+3E13     01029         LD      A,19
259F+EF       01030         RST     40
25A0 CD7F25   01031         CALL    DOCLOCK         ;Set/Reset Clock bit
25A3 C30325   01032         JP      LOGDT           ;Log it & exit
              01035 ;
              01036 ;       DSPMDY - Xfer 3 char string from table to buffer
              01037 ;
              01038 ;       B  => Entry # in table to display
              01039 ;       HL => Table to fetch data from
              01040 ;       DE => Buffer to receive string
              01041 ;
25A6 05       01042 DSPMDY  DEC     B               ;B = entry, 0-6
25A7 7D       01043         LD      A,L             ;P/u lsb of table start
25A8 80       01044         ADD     A,B
25A9 80       01045         ADD     A,B             ;Entries 3 bytes long
25AA 80       01046         ADD     A,B
25AB 6F       01047         LD      L,A             ;HL => Table entry
              01048 ;
              01049 ;       Transfer string into buffer
              01050 ;
25AC 0603     01051         LD      B,3             ;Three chars to xfer
25AE 7E       01052 DSPM1   LD      A,(HL)          ;P/u char from table
25AF 12       01053         LD      (DE),A          ;Stuff into buffer
25B0 23       01054         INC     HL              ;Bump
25B1 13       01055         INC     DE
25B2 10FA     01056         DJNZ    DSPM1           ;Three chars to xfer
25B4 C9       01057         RET                     ;Done - RETurn
              01058 ;
              01059 ;       PARSDAT - Parse TIME/DATE string entry
              01060 ;
              01061 ;       HL => Buffer containing string to parse
              01062 ;       C  => Delimiter (<"0" = DATE, <"0"or=":" = TIME)
              01063 ;
              01064 ;       DTBUF-DTBUF+2 <= Data in compressed format
              01065 ;       Z  - Set if successful
              01066 ;
25B5 118D27   01067 PARSDAT LD      DE,DTBUF+2      ;Point to buf end
25B8 0603     01068         LD      B,3             ;Process 3 fields
              01069 ;
              01070 ;       Parse a field - Return NZ if bad
              01071 ;
25BA D5       01072 PRS1    PUSH    DE              ;Save pointer
25BB CDDB25   01073         CALL    PRS2            ;Get a digit pair
25BE D1       01074         POP     DE              ;Recover pointer
25BF C0       01075         RET     NZ              ;Ret if bad digit pair
              01076 ;
              01077 ;       Good field - Stuff in buff, dec ptr, & count
              01078 ;
25C0 12       01079         LD      (DE),A          ;  else stuff the value
25C1 05       01080         DEC     B               ;Loop countdown
25C2 C8       01081         RET     Z               ;Do for 3 fields
25C3 1B       01082         DEC     DE              ;Backup the pointer
              01083 ;
              01084 ;       Parsed a field - is the separator valid ?
              01085 ;
25C4 7E       01086         LD      A,(HL)          ;P/u separator
25C5 23       01087         INC     HL              ;Bump pointer
25C6 FE3A     01088         CP      ':'             ;Check for ':'
25C8 28F0     01089         JR      Z,PRS1          ;  loop if so
25CA B9       01090         CP      C               ;Correct ?
25CB 300C     01091         JR      NC,PRSRET       ;NC = bad
25CD FE0D     01092         CP      CR              ;If end of line, ck for time
25CF 20E9     01093         JR      NZ,PRS1
25D1 3EFF     01094         LD      A,-1
25D2          01095 ISTIM   EQU     $-1             ;Set zero by time
25D3 B7       01096         OR      A
25D4 2003     01097         JR      NZ,PRSRET       ;Bad if date
25D6 78       01098         LD      A,B
25D7 3D       01099         DEC     A               ;If B was one, done
25D8 C8       01100         RET     Z
              01101 ;
25D9 B7       01102 PRSRET  OR      A               ;Set NZ
25DA C9       01103         RET                     ;Return bad entry
              01104 ;
              01105 ;       PRS2 - Parse a digit pair at HL
              01106 ;
25DB CDF125   01107 PRS2    CALL    PRS4            ;Get a digit
25DE 300F     01108         JR      NC,PRS3         ;Illegal - return
              01109 ;
              01110 ;       Legal Digit - Multiply by 10
              01111 ;
25E0 5F       01112         LD      E,A             ;Multiply by ten
25E1 07       01113         RLCA                    ;X 2
25E2 07       01114         RLCA                    ;X 4
25E3 83       01115         ADD     A,E             ;X 5
25E4 07       01116         RLCA                    ;X 10
25E5 5F       01117         LD      E,A             ;Stuff in E
              01118 ;
              01119 ;       Get another digit
              01120 ;
25E6 CDF125   01121         CALL    PRS4            ;Get ones digit
25E9 3004     01122         JR      NC,PRS3         ;Bad - return NZ
              01123 ;
              01124 ;       Legal digit - Add to tens digit & set Z flag
              01125 ;
25EB 83       01126         ADD     A,E             ;Accumulate new digit
25EC 5F       01127         LD      E,A             ;Save 2-digit value
25ED BF       01128         CP      A               ;Clear flags
25EE C9       01129         RET                     ;Return Z
              01130 ;
              01131 ;       Force NZ & Return
              01132 ;
25EF B7       01133 PRS3    OR      A               ;Set NZ
25F0 C9       01134         RET                     ;RETurn
              01135 ;
              01136 ;       Pick up a digit and convert to binary
              01137 ;
25F1 7E       01138 PRS4    LD      A,(HL)          ;P/u a digit &
25F2 23       01139         INC     HL              ;  bump ptr
25F3 D630     01140         SUB     '0'             ;Convert to binary
25F5 FE0A     01141         CP      10              ;Legal ?
25F7 C9       01142         RET                     ;C - legal, NC - illegal
              01143 ;
              01144 ;       Parameter table
              01145 ;
0080          01146 NUM     EQU     80H
0040          01147 FLAG    EQU     40H
0020          01148 STR     EQU     20H
0010          01149 ABB     EQU     10H
              01150 ;
25F8 80       01151 PRMTBL$ DB      80H             ;6.x Parameter Table
              01152 ;
25F9 55       01153         DB      FLAG!ABB!5
25FA 43       01154         DB      'CLOCK'
     4C 4F 43 4B 
25FF 00       01155 CRESP   DB      0
2600 8825     01156         DW      CLOCK+1
2602 00       01157         DB      0
              01158 ;
2700          01159         ORG     $<-8+1<+8
              01160 ;
2700 53       01161 DAYTBL  DB      'SunMonTueWedThuFriSat'
     75 6E 4D 6F 6E 54 75 65
     57 65 64 54 68 75 46 72
     69 53 61 74 
2715 4A       01162 MONTBL  DB      'JanFebMarAprMayJunJulAugSepOctNovDec'
     61 6E 46 65 62 4D 61 72
     41 70 72 4D 61 79 4A 75
     6E 4A 75 6C 41 75 67 53
     65 70 4F 63 74 4E 6F 76
     44 65 63 
              01163         IF      @BLD631
2739 44       01164 DATEBUF:DB      'Day, Mon xx,'  ;<631>
     61 79 2C 20 4D 6F 6E 20
     78 78 2C 
2745 20       01165 YRBUF:  DB      ' 198x',CR      ;<631>
     31 39 38 78 0D 
              01166         ELSE
              01167 DATEBUF DB      'Day, Mon xx, 198x',CR
              01168         ENDIF
274B 00       01169 MAXDAYS DB      0,31,28,31,30,31,30,31,31,30,31,30,31
     1F 1C 1F 1E 1F 1E 1F 1F
     1E 1F 1E 1F 
2758 44       01170 NODATE$ DB      'Date not in system',CR
     61 74 65 20 6E 6F 74 20
     69 6E 20 73 79 73 74 65
     6D 0D 
276B 42       01171 BADDAT$ DB      'Bad Date format',CR
     61 64 20 44 61 74 65 20
     66 6F 72 6D 61 74 0D 
277B 42       01172 BADTIM$ DB      'Bad Time format',CR
     61 64 20 54 69 6D 65 20
     66 6F 72 6D 61 74 0D 
              01173 ;
              01174 ;
278B          01175 DTBUF   EQU     $
278E          01176 DUMBUF  EQU     $+3
              01177 ;
2403          01178         END     DATE
2403 is the transfer address
00000 Total errors


[Copyright 1999,2002 Frank Durda IV, All Rights Reserved.
Mirroring of any material on this page in any form is expressly prohibited.
The official web site for this material is:  http://nemesis.lonestar.org
Contact this address for use clearances: clearance at nemesis.lonestar.org
Comments and queries to this address: web_software_2011 at nemesis.lonestar.org]

Valid HTML 4.01!