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 / SIMTEL / CPMUG / CPMUG042.ARK / XT.ASM < prev    next >
Assembly Source File  |  1984-04-29  |  25KB  |  648 lines

  1.                              ; CP/M FILE LISTING FACILITY, INCUDING
  2.                              ; AUTOMATIC PRINTING OF TIME AND DATE
  3.                              ; USING COMPU/TIME T-102 CLOCK BOARD
  4.                              ;
  5.                              ; ver. 1.1.A  12/02/79 - HARRY KAEMMERER
  6.                              ; TEL. NY TIME 201-221-2297
  7.                              ;
  8.                              ; BASED ON VER. 1.1 4/17/79 BY DENNIS THOVSON
  9.                              ;
  10.                              ; Based on ver. 2.0 of IMSAI's IMDOS 
  11.                              ; File List Facility
  12.                              ;
  13.                              ; FCB FOR FILE MUST BE SET UP BEFORE ENTRY
  14.                              ; i.e. "TLIST FILENAME.TYP" Command
  15.                              ; DO NOT ENTER AMBIGUOUS (? or *) FILENAME
  16.                              ; OR TYPE
  17.                              ;
  18.                              ; Default Title is FILENAME.TYP +
  19.                              ; any additional information (up to 48
  20.                              ; characters) appended to the entry command.
  21.                              ;
  22.                              ; Optional Title and Subtitle may be
  23.                              ; entered after Entry Command is executed.
  24.                              ;
  25. PGSIZ    EQU   65             ;NO. OF LINES PER PAGE
  26. PPPAGE    EQU   60             ;NO. OF LINES TO PRINT PER PAGE
  27. PNOCOL    EQU   64             ;COLUMN "PAGE" AND NUMBER
  28. RESET    EQU   0CH            ;FF CLEARS SCREEN ON MY CONSOLE
  29.                              ;SYSTEM CALL FUNCTION NUMBERS
  30. CLK     EQU   0C0H           ;MY CLOCK BOARD ADDRESS PORT
  31. CONIN    EQU   1              ;CONSOLE INPUT CHAR
  32. CONOUT    EQU   2              ;CONSOLE OUTPUT CHAR (E)
  33. CONRDY    EQU   11             ;CONSOLE CHARACTER READY TEST
  34. BUFFRD    EQU   10             ;BUFFERED READ COMMAND
  35. PRINT    EQU   9              ;PRINT STRING (DE) TO $
  36. LIST    EQU   5              ;OUT CHAR (E) TO LST: DEVICE
  37. OPEN    EQU   15             ;OPEN FILE CONTROL BLOCK
  38. READ    EQU   20             ;READ NEXT SEQUENTIAL RECORD
  39. BDOS    EQU   05H            ;SYSTEM CALL ENTRY POINT
  40. FCB    EQU   5CH            ;DEFAULT FILE CONTROL BLOCK
  41. NR    EQU   FCB+32         ;NEXT RECORD TO READ
  42. TBUFF    EQU   80H            ;WHERE CCP PUTS COMMAND LINE
  43. DEFBUF    EQU   80H            ;WHERE SECTORS ARE READ
  44. TBASE    EQU   100H           ;TRANSIENT PROGRAM BASE
  45.                              ;EQUATES FOR ASCII CONTROL CHARACTERS
  46. TAB    EQU   9              ;CONTROL I (HT) TAB.
  47. LF    EQU   0AH            ;LINE FEED
  48. FF    EQU   0CH            ;FORM FEED
  49. ALTFF    EQU   0BH            ;CONTROL K (VT) ALSO CAUSES FF
  50. CR    EQU   0DH            ;CARRIAGE RETURN
  51. CTRLZ    EQU   1AH            ;CONTROL Z. EOF.
  52.                              ;
  53.                              ;
  54.     ORG   TBASE          ;ENTRY POINT 
  55.                              ;
  56. TLIST:    JMP   LISTGO         ;NORMAL ENTRY
  57.     LXI   SP,DSTACK      ;DDT DEBUGGING ENTRY
  58.     CALL  LISTGO         ;USE "I" COM'D TO SET FILE NAME
  59.     RST   7              ;RETURN TO DDT
  60.                              ;
  61.                              ;MAIN PROGRAM BEGINS HERE
  62. LISTGO:    LXI   H,0            ;
  63.     DAD   SP             ;
  64.     SHLD  CALRSP         ;
  65.     LXI   SP,STACK       ;
  66.                              ;
  67.                              ;SIGN-ON MESSAGES
  68.                              ;
  69.     LXI   D,CMSG1        ;MESSAGE 1 TO CONSLOLE
  70.     CALL  PCOMSG         ;
  71.                              ;PRINT DEFAULT TITLE ON CONSOLE
  72.     LXI   H,TBUFF        ;GET DEFAULT TITLE
  73.     MOV   B,M            ;HOW MANY CHARACTERS
  74. TLTOUT:    DCR   B              ;    
  75.     JM    TLTEND         ;
  76.     INX   H              ;
  77.     MOV   A,M            ;
  78.     CALL  CONO           ;PRINT TITLE ON CONSOLE
  79.     JNZ   TLTOUT         ;DO IT ALL
  80. TLTEND: LXI   D,CMSG2        ;CONSOLE MESSAGE 2
  81.     CALL  PCOMSG         ;
  82.     MVI   C,CONIN        ;GET CHAR. FROM CONSOLE
  83.     CALL  BDOS           ;
  84.     CPI   CR             ;IS IT A CR ?
  85.     JNZ   LTE1           ;
  86.     CALL  TITL1          ;DEFAULT TITLE
  87.     JMP   NSTEND         ;
  88. LTE1:    CPI   'Y'            ;IS IT A YES ?
  89.     JNZ   TLTEND         ;ASK AGAIN IF NOT
  90.     LXI   D,CMSG4        ;CONSOLE MESSAGE 4
  91.     CALL  PCOMSG         ;
  92.                              ;GET NEW TITLE
  93.     LXI   D,RDBUFF       ;
  94.     MVI   A,60           ;LENGTH OF TITLE
  95.     STAX  D              ;
  96.     MVI   C,BUFFRD       ;
  97.     CALL  BDOS           ;GET NEW TITLE
  98.     LXI   H,RDBUFF+1     ;SEE IF ANY CHARS.
  99.     MOV   A,M            ;
  100.     CPI   0              ;
  101.     JNZ   NBE1           ;
  102.     CALL  TITL1          ;DEFAULT TITLE
  103.     JMP   NTEND          ;
  104. NBE1:    LXI   D,TTLBUF       ;MOVE NEW TITLE TO
  105.     MOV   C,A            ;BUFFER
  106.     MVI   B,60           ;
  107.     CALL  TITLUP         ;DO IT
  108. NTEND:                       ;
  109. NSTBEG:    LXI   D,CMSG6        ;CONSOLE MESSAGE 6
  110.     CALL  PCOMSG         ;
  111.     LXI   H,STLBUF       ;SUBTITLE OUTPUT BUFFER POINTER
  112.     SHLD  SBTPNT         ;
  113.     XRA   A              ;
  114.     STA   SUBTF          ;SET SUBTITLE FLAG TO 0
  115. GSBTL:    LXI   D,RDBUFF       ;BUFFERED READ THRU CP/M
  116.     MVI   A,80           ;
  117.     STAX  D              ;
  118.     MVI   C,BUFFRD       ;
  119.     CALL  BDOS           ;
  120.     LXI   H,RDBUFF       ;
  121.     LDA   RDBUFF+1       ;NO. OF CHARS. THIS LINE
  122.     CPI   0                 ;SEE IF ANY CHARS.
  123.     JZ    NSTEND         ;NO, IGNORE SUBTITLE
  124.     INR   A              ;
  125.     MVI   D,0            ;
  126.     MOV   E,A            ;
  127.     DAD   D                 ;ADDRESS OF LAST CHAR.
  128.     MOV   A,M            ;
  129.     CPI   1AH            ;IS IT A CONTROL Z ?
  130.     JZ    GSB1           ;YES, MORE TO DO
  131.     INX   H                 ;ADD 0 TO END
  132.     MVI   M,0            ;END OF SUBTITLE
  133.     CALL  SASBTL         ;PUT LINE IN BUFFER
  134.     MVI   A,0FFH         ;
  135.     STA   SUBTF          ;SET FLAG
  136.     JMP   NSTEND         ;ALL DONE
  137. GSB1:    MVI   M,0DH          ;CR, OVERWRITE CONTROL Z
  138.     INX   H              ;
  139.     MVI   M,0AH          ;LF
  140.     CALL  SASBTL         ;PUT LINE IN BUFFER
  141.     MVI   A,LF           ;
  142.     CALL  CONO           ;SEND A LF TO CONSOLE
  143.     JMP   GSBTL          ;GET NEXT LINE
  144. SASBTL:    LHLD  SBTPNT         ;WHERE SUBTITLE GOES
  145.     XCHG                 ;
  146.     LXI   H,RDBUFF+1     ;NO. OF CHARS IN LINE
  147.     MOV   B,M            ;
  148.     INR   B                 ;ADD 1 FOR LF OR 0
  149. SAS1:    INX   H                 ;MOVE LINE TO BUFFER
  150.     MOV   A,M            ;
  151.     STAX  D              ;
  152.     INX   D              ;
  153.     DCR   B              ;
  154.     JNZ   SAS1           ;
  155.     XCHG                 ;
  156.     SHLD  SBTPNT         ;SAVE SUBTITLE BUFF. PTR.
  157.     RET                  ;
  158.                              ;
  159. NSTEND:    LXI   D,CMSG7        ;CONSOLE MESSAGE 7
  160.     CALL  PCOMSG         ;
  161.     MVI   C,CONIN        ;
  162.     CALL  BDOS           ;
  163.     CPI   CR             ;
  164.     JNZ   NSTEND         ;
  165.     JMP   TITL9          ;
  166.                              ;SET UP DEFAULT TITLE.  TITLE CONSISTS OF FILE
  167.                              ;NAME AND ANYTHING USER TYPES AFTER IT.
  168. TITL1:    LXI   H,TTLBUF       ;WHERE TO PUT TEXT
  169.     XCHG                 ;
  170.     LXI   H,TBUFF        ;WHERE CCP LEFT TEXT
  171.     MOV   C,M            ;NUMBER OF CHARS IN TBUFF
  172.     INX   H                 ;DISCARD LEADING ' '
  173.     DCR   C              ;
  174.     MVI   B,60           ;MAX # CHARS TO USE
  175.     CALL  TITLUP         ;
  176.     RET                  ;
  177.                              ;COPY TEXT
  178. TITLUP:    DCR   C              ;
  179.     JM    TITL2          ;STOP IF INPUT USED UP
  180.     INX   H              ;
  181.     MOV   A,M            ;
  182.     STAX  D              ;
  183.     INX   D                 ;MOVE 1 CHARACTER
  184.     DCR   B              ;
  185.     JNZ   TITLUP         ;STOP AT MAX # CHARS
  186.                              ;TERMINATE WITH 0
  187. TITL2:    XRA   A              ;
  188.     STAX  D              ;
  189.     RET                  ;
  190.                              ;MAKE SURE NO ?'S IN FILE NAME: IF AFN IS GIVEN
  191.                              ;DIRECTORY ENTRIES GET CHANGED TO ?'S ON AUTOMATIC
  192.                              ;CLOSES ON GOING TO NEXT EXTENT, AND SUCCESSIVE
  193.                              ;EXTENTS ARE NOT NECESSARILY OF THE SAME FILE.
  194.                              ;CCP TRANSLATES *'S TO MULTIPLE ?'S.
  195. TITL9:    LXI   H,FCB          ;WHERE NAME IS
  196.     MVI   C,11           ;NUMBER OF CHARS
  197.     LXI   D,EMQUES       ;MESSAGE TO USE IF ? FOUND
  198. QLUP:    INX   H                 ;POINT NEXT CHARACTER
  199.     MOV   A,M            ;GET CHARACTER
  200.     CPI   '?'            ;
  201.     JZ    TERM           ;JMP IF ?
  202.     DCR   C                 ;COUNT CHARACTERS TO TEST
  203.     JNZ   QLUP           ;LOOP BACK UNLESS DONE
  204.                              ;OPEN FILE
  205.     MVI   C,OPEN         ;
  206.     LXI   D,FCB          ;
  207.     CALL  BDOS           ;CALL SYSTEM
  208.     CPI   255            ;
  209.     LXI   D,EMFNF        ;MESSAGE IF ERROR
  210.     JZ    TERM           ;IF NOT FOUND, ERROR EXIT
  211.     XRA   A              ;
  212.     STA   NR             ;SAY START AT RECORD 0
  213.     STA   ICOUNT         ;SAY EMPTY INPUT BUFFER
  214.                              ;INITIALIZE OUTPUT
  215.     XRA   A              ;
  216.     STA   COL            ;
  217.     STA   LINE           ;INIT CURSOR POSITION
  218.     STA   PAGE+1         ;
  219.     INR   A              ;
  220.     STA   PAGE           ;.. PAGE STARTS AT DW 1
  221.                              ;POSTION PAPER TO FIRST LINE BEFORE CALLING
  222.                              ;LIST. THE NEXT PROGRAM SEGMENT WILL SPACE
  223.                              ;DOWN TO THE 4th LINE AND PRINT TITLE
  224.                              ;(SUBTITLE) INFORMATION.
  225.     MVI   B,3            ;SEND 3 LINE FEEDS
  226. TOPPAG:    PUSH  B              ;
  227.     MVI   A,LF           ;
  228.     CALL  LOCH           ;
  229.     POP   B              ;
  230.     DCR   B              ;
  231.     XRA   A              ;
  232.     CMP   B              ;
  233.     JNZ   TOPPAG         ;
  234.                              ;PRINT TITLE AND SUBTITLE FOR FIRST PAGE
  235.     CALL  PTITL          ;
  236.                              ;IGNORE ANY CR'S, LF'S, FORM FEEDS, ECT.
  237.                              ;AT BEGINNING OF FILE.
  238.     CALL  IGNORE         ;IGNORE FF'S ETC.
  239.     JMP   CLOOP1         ;ENTER CHARACTER LOOP
  240.                              ;MAIN PROGRAM CONTROL LOOP STARTS HERE
  241. CLOOP:    CALL  INCH           ;GET CHARACTER
  242. CLOOP1:    PUSH  B              ;
  243.     PUSH  H              ;
  244.     CALL  LSTCH          ;PROCESS  & LIST 1 CHAR
  245.                              ;CHECK CONSOLE STATUS
  246.     MVI   C,CONRDY       ;
  247.     CALL  BDOS           ;
  248.     RAR                  ;TEST LSB
  249.     CC    CHKCON         ;SEE WHAT CONSOLE WANTS
  250.     POP   H              ;
  251.     POP   B              ;
  252.     JMP   CLOOP          ;
  253.                              ;CONSOLE CONTROL ROUTINE
  254. CHKCON:    MVI   C,CONIN        ;
  255.     CALL  BDOS           ;GET CHARACTER
  256.     CPI   15H            ;IS IT A CONTROL U ?
  257.     JZ    EOF            ;
  258.     CPI   13H            ;IS IT A CONTROL S ?
  259.     RNZ                  ;RETURN IF NOT
  260. CON1:    MVI   C,CONRDY       ;
  261.     CALL  BDOS           ;
  262.     RAR                  ;
  263.     JNC   CON1           ;WAIT FOR CONSOLE
  264.     MVI   C,CONIN        ;
  265.     CALL  BDOS           ;WHAT IS IT ?
  266.     CPI   13H            ;
  267.     RZ                   ;START LIST AGAIN
  268.     CPI   15H            ;WANT TO ABORT ?
  269.     JZ    EOF            ;ABORT
  270.     JMP   CON1           ;WAIT FOR ANOTHER CHAR
  271.                              ;END OF FILE.  FORM FEED AND EXIT.
  272.                              ;OUTPUT FF WITHOUT TITLE
  273. EOF:    CALL  LFFSUB         ;
  274.                              ;EXIT ROUTINE
  275. EXIT:    LHLD  CALRSP         ;ENTRY STACK POINTER
  276.     SPHL                 ;RESET SP FOR CCP
  277.     MVI   A,0            ;SAY NO ERROR
  278.     RET                  ;
  279.                              ;ERROR STUFF
  280. NSERR:    LXI   D,MERR         ;MISCELLANEOUS ERRORS
  281.                              ;COME HERE WITH DE POINTING TO TEXT
  282. TERM:    MVI   C,PRINT        ;
  283.     CALL  BDOS           ;
  284.     JMP   EXIT           ;
  285.                              ;READ NEW RECORD FROM OPEN FILE
  286. NEWREC:    MVI   C,READ         ;
  287.     LXI   D,FCB          ;
  288.     CALL  BDOS           ;READ RECORD
  289.     CPI   1              ;
  290.     JZ    EOF            ;IF END OF FILE
  291.     ORA   A              ;
  292.     JNZ   NSERR          ;GOOD RETURN FROM BDOS ?
  293.     LXI   H,ICOUNT       ;
  294.     MVI   M,128          ;INIT BUFFER COUNTER
  295.     LXI   H,DEFBUF       ;
  296.     SHLD  IPOINT         ;INIT BUFFFER POINTER
  297.     POP   H              ;
  298.                              ;ENTRY POINT
  299. INCH:    PUSH  H              ;
  300.     LXI   H,ICOUNT       ;
  301.     DCR   M                 ;COUNT CHARS USED FROM RECORD
  302.     JM    NEWREC         ;NEED ANOTHER RECORD
  303.     LHLD  IPOINT         ;GET BUFFER POINTER
  304.     MOV   A,M            ;FETCH CHARACTER
  305.     CPI   CTRLZ          ;
  306.     JZ    EOF            ;GO DIRECT TO EOF ROUTINE
  307.     INX   H              ;
  308.     SHLD  IPOINT         ;POINT NEXT
  309.     POP   H              ;
  310.     RET                  ;
  311.                              ;LIST CHAR IN A WITH PROCESSING OF SPECIAL CHARS
  312.                              ;KEEPS TRACK OF COLUMN, LINE, PAGE.
  313.                              ;EXPANDS TABS WITH STOPS EVERY 8 COLUMNS
  314.                              ;SIMULATES FORM FEEDS WITH LINE FEEDS.
  315. LSTCH:    LXI   H,COL          ;INCREMENT COLUMN COUNTER
  316.     INR   M              ;
  317.                              ;KILL PARITY BIT IN CHARS. FROM  FILE.
  318.                              ;(NOTE: ELSE CERTAIN CHARS CAN PRODUCE
  319.                              ;INFINITE LOOP OF ^'S.)
  320.     ANI   7FH            ;
  321.                              ;SPACE OR GREATER ASCII CODE JUST GETS PRINTED
  322.     CPI   ' '            ;
  323.     JP    LOCH           ;GO PRINT IT
  324.     DCR   M                 ;ELSE RESTORE COLUMN COUNTER
  325.                              ;PROCESS SPECIALS
  326.     PUSH  PSW            ;
  327.     CPI   CR             ;
  328.     JNZ   LSC2           ;
  329.     XRA   A              ;
  330.     STA   COL            ;
  331. POPLOC:    POP   PSW            ;GET CHAR BACK
  332.     JMP   LOCH           ;GO LIST IT
  333. LSC2:    CPI   LF             ;
  334.     JNZ   LSC3           ;
  335.     LDA   LINE           ;
  336.     CPI   PPPAGE-1       ;
  337.     JP    LISFF          ;PAGE FULL, MAKE LIKE FF
  338.     POP   PSW            ;CLEAR STACK AND PROCEED
  339.                              ;PROCESS AND PRINT LINE FEED
  340. LISLF:    PUSH  PSW            ;
  341.     MVI   A,LF           ;
  342.     CALL  LOCH           ;OUTPUT LINE FEED
  343.     LDA   LINE           ;
  344.     INR   A                 ;LINE+1
  345.     CPI   PGSIZ          ;
  346.     JM    LSC2A          ;IF BOTTOM OF PAGE, MAKE IT..
  347.     XRA   A                 ;..TOP OF NEXT PAGE.
  348.     LHLD  PAGE           ;
  349.     INX   H              ;
  350.     SHLD  PAGE           ;
  351. LSC2A:    STA   LINE           ;
  352.     POP   PSW            ;
  353.     RET                  ;
  354.                              ;
  355. LSC3:    CPI   ALTFF          ;
  356.     JZ    LISFF          ;ALTERNATE FORM FEED
  357.     CPI   FF             ;
  358.     JNZ   LSC4           ;
  359.                              ;PRINT CR, LF'S TILL LINE=0
  360. LISFF:    CALL  LFFSUB         ;SIMULATE FORM FEED
  361.                              ;NEED A TITLE AT TOP OF NEXT PAGE, BUT FIRST SEE
  362.                              ;IF ANY MORE NON-CR, LF, FF CHARACTERS IN FILE.
  363.                              ;THUS IT AVOIDS BLANK SPACE AT TOP OF PAGE.
  364.     CALL  IGNORE         ;PASS CR, FF, ETC
  365.                              ;IF HERE, NOT AT EOF AND NEXT CHAR IS IN A REG.
  366.     CALL  PTITL          ;PRINT TITLE
  367.     POP   H              ;
  368.     JMP   LSTCH          ;CLEAR STACK, GO LIST CHAR
  369. LSC4:    CPI   TAB            ;
  370.     JNZ   LSC5           ;
  371.                              ;PRINT SPACES TILL LO 3 BITS OF COL = 0
  372. LSC4A:    MVI   A,' '          ;
  373.     CALL  LSTCH          ;
  374.     LDA   COL            ;
  375.     ANI   7              ;
  376.     JNZ   LSC4A          ;
  377. LPOPX:    POP   PSW            ;
  378.     RET                  ;
  379.                              ;ADD MISCELLANEOUS CHARACTERS HERE.
  380.                              ;PRINT ^ AND LETTER
  381. LSC5:    MVI   A,'^'          ;
  382.     CALL  LSTCH          ;
  383.     POP   PSW            ;
  384.     ORI   40H            ;
  385.     JMP   LSTCH          ;
  386.                              ;PROCESS AND OUTPUT (SIMULATED) FORM FEED
  387. LFFSUB:    MVI   A,CR           ;
  388.     CALL  LSTCH          ;
  389. LSFF2:    LDA   LINE           ;
  390.     ORA   A              ;
  391.     CNZ   LISLF          ;
  392.     JNZ   LSFF2          ;
  393.     RET                  ;
  394.                              ;SUBROUTINE TO IGNORE CR'S, LF'S, FORM FEEDS.
  395.                              ;CALLED AT TOP OF EACH PAGE. RETURNS NEXT NON-
  396.                              ;IGNORED CHAR. IN A. QUIT 'LIST' IF EOF FOUND.
  397. IGNORE: CALL  INCH           ;GET SOURCE FILE CHAR. IN A
  398.     CPI   CR             ;
  399.     JZ    IGNORE         ;
  400.     CPI   LF             ;
  401.     JZ    IGNORE         ;
  402.     CPI   FF             ;
  403.     JZ    IGNORE         ;
  404.     CPI   ALTFF          ;
  405.     JZ    IGNORE         ;
  406.     RET                  ;CHARACTER IS IN A
  407.                              ;LIST OUTPUT CHAR IN A, WITHOUT PROCESSING
  408. LOCH:    MOV   E,A            ;
  409.     MVI   C,LIST         ;
  410.         JMP   BDOS           ;
  411.                              ;SUBROUTINE TO PRINT PAGE TITLE
  412. PTITL:  CALL  CLOCK          ;*** READ CLOCK AND PRINT IT ON TOP OF PAGE  ***
  413.           PUSH  PSW            ;
  414.     PUSH  H              ;
  415.                              ;TITLE TEXT
  416.     LDA   TFLAG          ;
  417.     ORA   A              ;
  418.     JZ    NOTITL         ;
  419.     LXI   H,TTLBUF       ;
  420.     CALL  LSTRNG         ;
  421.                              ;PAGE NUMBER
  422. NOTITL:    LDA   PNFLAG         ;
  423.     ORA   A              ;
  424.     JZ    NOPGNO         ;
  425.                              ;SPACE TO COLUMN
  426. PAGN1:    MVI   A,' '          ;
  427.     CALL  LSTCH          ;MINIMUM ONE SPACE
  428.     LDA   COL            ;
  429.     SBI   PNOCOL         ;
  430.     JM    PAGN1          ;
  431.                              ;"PAGE" TEXT
  432.     LXI   H,PGETXT       ;
  433.     CALL  LSTRNG         ;
  434.                              ;NUMBER
  435.     LHLD  PAGE           ;
  436.     CALL  DECPR          ;
  437.                              ;PRINT SUBTITLE IF ANY
  438.     LDA   STFLAG         ;
  439.     ORA   A              ;
  440.     JZ    NOPGNO         ;
  441.     LDA   SUBTF          ;
  442.     ORA   A              ;
  443.     JZ    NOPGNO         ;
  444.     MVI   A,CR           ;
  445.     CALL  LSTCH          ;
  446.     MVI   A,LF           ;
  447.     CALL  LSTCH          ;
  448.     LXI   H,STLBUF       ;
  449.     CALL  LSTRNG         ;
  450.                              ;TEST IF EITHER OF ABOVE WAS PRINTED
  451. NOPGNO:    LHLD  TFLAG          ;
  452.     LDA   PNFLAG         ;
  453.     ORA   L              ;
  454.     JZ    PTTLEX         ;NO, NEED NO CRLF'S
  455.                              ;CR AND 2 LF'S
  456.     MVI   A,CR           ;
  457.     CALL  LSTCH          ;
  458.     MVI   A,LF           ;
  459.     CALL  LSTCH          ;
  460.     MVI   A,LF           ;
  461.     CALL  LSTCH          ;
  462. PTTLEX:    POP   H              ;
  463.     POP   PSW            ;
  464.     RET                  ;
  465.                              ;SUBR TO LIST STRING (HL) TO NULL
  466. LSTRNG:    MOV   A,M            ;
  467.     ORA   A              ;
  468.     RZ                   ;
  469.     INX   H              ;
  470.     PUSH  H              ;
  471.     CALL  LSTCH          ;
  472.     POP   H              ;
  473.     JMP   LSTRNG         ;
  474.                              ;DECIMAL PRINT HL, UNSIGNED
  475. DECPR:    PUSH  B              ;
  476.     PUSH  D              ;
  477.     PUSH  H              ;
  478.     LXI   B,-10          ;MINUS RADIX
  479.     LXI   D,-1           ;BECOMES NUMBER/RADIX
  480. DECPR1:    DAD   B              ;
  481.     INX   D              ;
  482.     JC    DECPR1         ;SUBTRACT TILL NEGATIVE
  483.     LXI   B,10           ;
  484.     DAD   B              ;AD RADIX BACK ONCE
  485.     XCHG                 ;HAVE N/10 IN HL, REM. IN DE
  486.     MOV   A,H            ;
  487.     ORA   L              ;
  488.     CNZ   DECPR          ;GET REMAINING DIGITS, IF ANY
  489.     MOV   A,E            ;
  490.     ADI   '0'            ;
  491.     CALL  LOCH           ;PRINT THIS DIGIT
  492.     POP   H              ;
  493.     POP   D              ;
  494.     POP   B              ;
  495.     RET                  ;
  496.                              ;OUTPUT MESSAGE TO CONSOLE
  497. PCOMSG:    MVI   C,PRINT        ;MSG POINTER IN DE
  498.     CALL  BDOS           ;
  499.     RET                  ;
  500.                              ;OUTPUT CHAR IN A REG.
  501. CONO:    PUSH  PSW            ;
  502.     PUSH  B              ;
  503.     PUSH  D              ;
  504.     PUSH  H              ;
  505.     MOV   E,A            ;
  506.     MVI   C,CONOUT       ;
  507. CALLEN: CALL  BDOS           ;
  508.     POP   H              ;
  509.     POP   D              ;
  510.     POP   B              ;
  511.     POP   PSW            ;
  512.     RET                  ;
  513.                              ;
  514. CLOCK:  PUSH  PSW            ;*** SAVE ALL REGISTERS ***
  515.         PUSH  B              ;
  516.         PUSH  D              ;
  517.         PUSH  H              ;
  518.                              ;
  519.         LXI   H,TIME+4       ;SET MEM. POINTER TO START OF TIME SLOT
  520.         MVI   A,0            ;HR. TENS ADDRESS
  521.         CALL  GETDIG         ;GET IT
  522.         MVI   A,1            ;HR. UNITS
  523.         CALL  GETDIG         ;GET IT
  524.         INX   H              ;SKIP ":"
  525.         MVI   A,2            ;MIN. TENS
  526.         CALL  GETDIG         ;GET IT
  527.         MVI   A,3            ;MIN. UNITS
  528.         CALL  GETDIG         ;GET IT
  529.         INX   H              ;SKIP ":"
  530.         MVI   A,4            ;SEC. TENS
  531.         CALL  GETDIG         ;GET IT
  532.         MVI   A,5            ;SEC. UNITS
  533.         CALL  GETDIG         ;GET IT
  534.         LXI   H,TIME+19      ;SET DATE ADDRESS
  535.         MVI   A,8            ;MONTH TENS
  536.         OUT   CLK            ;SEND TO CLOCK PORT
  537.         CALL  DELAY          ;WAIST SOME TIME
  538.         IN    CLK            ;READ PORT
  539.         ANI   0FH            ;CLEAR SOME BITS
  540.         ADI   48             ;MAKE IT ASCII
  541.         CPI   63             ;TEST FOR "15"
  542.         CZ    SET1           ;IF SO THEN SET TO BLANK
  543.         MOV   M,A            ;PUT IN MEM.
  544.         MVI   A,9            ;MONTH UNITS
  545.         CALL  GETDIG         ;GET IT
  546.         INX   H              ;SKIP "/"
  547.         MVI   A,10           ;DAY TENS
  548.         CALL  GETDIG         ;GET IT
  549.         MVI   A,11           ;DAY UNITS
  550.         CALL  GETDIG         ;GET IT
  551.         LXI   H,TIME         ;RESET INDEX REGISTER TO START OF TIME MESS.
  552. YY1     MOV   A,M            ;SEND IT TO THE PRINTER
  553.         CPI   '$'            ;CHECK FOR END OF MESS.
  554.         JZ    ZZ1            ;IF SO JUMP TO RETURN SECTION     
  555.         PUSH  H              ;
  556.         CALL  LOCH           ;
  557.         POP   H              ;
  558.         INX   H              ;
  559.         JMP   YY1            ;DO IT AGAIN
  560.                              ;
  561. ZZ1     POP   H              ;RESTORE ALL REGISTERS AND RETURN
  562.         POP   D              ;
  563.         POP   B              ;
  564.         POP   PSW            ;
  565.         RET                  ;
  566.                              ;
  567. SET1:   MVI   A,20H          ;
  568.         RET                  ;
  569.                              ;
  570. GETDIG: OUT   CLK            ;SEND CHAR. IN REG. A TO PORT
  571.         CALL  DELAY          ;
  572.         IN    CLK            ;READ PORT
  573.         ANI   0FH            ;
  574.         ADI   48             ;MAKE IT ASCII
  575.         INX   H              ;POINT TO NEXT SLOT IN MEM.
  576.         MOV   M,A            ;PUT IT THERE
  577.         RET                  ;RETURN
  578.                              ;
  579. DELAY:  LXI   D,02FFH        ;WAIST SOME TIME
  580. WAIT1:  DCR   E              ;CPU TOO FAST FOR CLOCK
  581.         JNZ   WAIT1          ;
  582.         DCR   D              ;
  583.         JNZ   WAIT1          ;
  584.         RET                  ;
  585.                              ;
  586. CMSG1:    DB    RESET
  587.     DB    '* * * XT VER. 1.1.A * * *'
  588.     DB    CR,LF,LF
  589.     DB    'LISTING CONTROL CONSOLE COMMANDS:'
  590.     DB    CR,LF,LF
  591.     DB    'Control U aborts listing'
  592.     DB    CR,LF
  593.     DB    'Control S stops-restarts listing'
  594.     DB    CR,LF,LF
  595.     DB    'The default Title Line is:'
  596.     DB    CR,LF,LF,24H
  597. CMSG2:    DB    CR,LF,LF
  598.     DB    'Do you want to enter a new TITLE or '
  599.     DB    'SUBTITLE',CR,LF
  600.     DB    'YES - enter Y',CR,LF
  601.     DB    'NO  - enter CR  ??$'
  602. CMSG4:    DB    CR,LF,LF
  603.     DB    'Enter New Title (enter a CR to '
  604.     DB    'retain Default Title)',CR,LF
  605.     DB    'Title can be one line only - '
  606.     DB    '60 characters maximum - '
  607.     DB    'End with a CR',CR,LF,'$'
  608. CMSG6:    DB    CR,LF,LF
  609.     DB    'Enter Subtitle (a CR skips subtitle)'
  610.     DB    CR,LF
  611.     DB    'SUBTITLE can be multiple lines. '
  612.     DB    'If you want to enter additional lines '
  613.     DB    CR,LF
  614.     DB    'end preceeding lines with a control Z.  '
  615.     DB    'End Subtitle input with a CR.'
  616.     DB    CR,LF,24H
  617. CMSG7:    DB    CR,LF,LF
  618.     DB    '* * * POSITION PAPER TO TOP LINE * * *'
  619.     DB    CR,LF,LF
  620.     DB    'Enter CR when ready',CR,LF,'$'
  621. MERR:    DB    CR,LF,'SOME KIND OF ERROR'
  622.     DB    CR,LF,24H
  623. EMFNF:    DB    LF,'FILE NOT FOUND',CR,LF,'$'
  624. TIME:   DB    'TIME HH:MM:SS DATE MM/DD/1979',CR,LF,'$'
  625. EMQUES:    DB    LF,'NO *.S OR ?.S PLEASE!'
  626.     DB    CR,LF,24H
  627. PGETXT: DB    'PAGE '
  628.         DB    0
  629. TFLAG:    DB    0FFH           ;MAKE 0 TO SUPPRESS TITLE
  630. PNFLAG:    DB    0FFH           ;MAKE 0 TO SUPPRESS PAGE NOS.
  631. STFLAG:    DB    0FFH           ;MAKE 0 TO SUPPRESS SUBTITLE
  632.         DS    1
  633. SUBTF:    DS    1                 ;SUBTITLE PRESENT FLAG
  634. SBTPNT:    DS    2                 ;SUBTITLE BUFFER POINTER
  635. IPOINT:    DS    2                 ;INPUT BUFFER POINTER
  636. ICOUNT:    DS    1                 ;INPUT BUFFER DOWN-COUNTER
  637. COL:    DS    1
  638. LINE:    DS    1
  639. PAGE:    DS    2
  640. CALRSP:    DS    2                 ;CALLER'S STACK POINTER
  641. RDBUFF:    DS    84             ;SPACE FOR CP/M BUFFERED READ
  642. TTLBUF:    DS    80             ;SPACE FOR TITLE
  643. STLBUF:    DS    100H           ;SPACE FOR SUBTITLE
  644.         DS    80
  645. TIMESP: DS    29
  646. STACK:    DS    4
  647. DSTACK:    DS    2
  648.