home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / sigm / vols000 / vol009 / nlist.asm < prev    next >
Assembly Source File  |  1984-04-29  |  14KB  |  662 lines

  1.     TITLE    'GENERAL FILE LISTER PROGRAM'
  2. ;LIST.ASM  VERSION 2.2L 800819 A. I. LARKY
  3. ;LIST.ASM  VERSION 2.1L 800329 A.I.LARKY
  4. ;LIST.ASM  VERSION 2.0L 790723 A.I.LARKY
  5. ;LIST.ASM  VERSION 2.0 11/29/77
  6. ;LIST.ASM  VERSION 1.9  11/21/77 JRB
  7. ;
  8. ; LISTS DISK FILE ON "LST:" DEVICE
  9. ; FILE FCB MUST BE SET UP BEFORE ENTRY,
  10. ; AS FROM CCP "LIST NAME.TYP" COMMAND
  11. ; OR DDT "INAME.TYP" COMMAND.
  12. ; OUTPUT DEVICE IS CHANGEABLE BY MANIPULATING
  13. ; IO STATUS BYTE.
  14. ; LISTING CAN BE ABORTED BY TYPING ANYTHING.
  15. ; OUTPUT DEVICE IS ASSUMED TO HAVE 'PGSIZ' (66)
  16. ;LINES PER PAGE.
  17. ;  MODIFIED BY A. I. LARKY
  18. ;    TO ASK FOR STARTING PAGE NUMBER
  19. ;    IF TITLE IS #T, DON'T PRINT A TITLE
  20. ;    IF TITLE IS #P, DON'T PRINT PAGE NUMBER
  21. ;    IF TITLE IS #B, OMIT BOTH TITLE AND PAGE NUMBER
  22. ;    IF NUMERIC AFTER #, #B, #P, #T : START PRINTING
  23. ;        AT THAT PAGE NUMBER.
  24. ;    TO USE A 1K (OR LARGER) TEXT BUFFER
  25. ;
  26.  
  27. PGSIZ    EQU    66    ;NUMBER OF LINES PER PAGE
  28. PRINTPERPAGE EQU 60    ;NUMBER OF LINES TO PRINT/PAGE
  29. PAGNUMCOL EQU    70    ;COLUMN FOR WORD "PAGE" AND NO.
  30. BUFSIZE    EQU    64    ;# OF SECTORS IN BUFFER
  31. UOPT    EQU    0    ;UPPER CASE ONLY PRINTER (=1)
  32. BDOS    EQU    5    ;SYSTEM CALL ENTRY POINT
  33. ;SYSTEM CALL FUNCTION NUMBERS
  34. CONIN    EQU    1    ;CONSOLE INPUT CHAR
  35. CONOUT    EQU    2    ;CONSOLE OUTPUT CHAR (E)
  36. CONRDY    EQU    11    ;CONSOLE CHARACTER READY TEST
  37. PRINT    EQU    9    ;PRINT STRING (DE) TO $
  38. READCN    EQU    10    ;READ CONSOLE BUFFER
  39. LIST    EQU    5    ;OUT CHAR (E) TO LST: DEVICE
  40. OPEN    EQU    15    ;OPEN FILE CONTROL BLOCK
  41. READ    EQU    20    ;READ NEXT SEQUENTIAL RECORD
  42. SETDMA    EQU    26    ;SET BUFFER ADDRESS FOR R/W
  43.  
  44. FCB    EQU    5CH    ;DEFAULT FILE CONTROL BLOCK
  45. FLAGS    EQU    FCB+17    ;LOCATION OF FLAG INFO
  46. NR    EQU    FCB+32    ;NEXT RECORD TO READ
  47. TBUFF    EQU    80H    ;WHERE CCP PUTS COMMAND LINE
  48. TBASE    EQU    100H    ;TRANSIENT PROGRAM BASE
  49.  
  50. ;EQUATES FOR ASCII CONTROL CHARACTERS
  51. TAB    EQU    9    ;^I. TAB.
  52. LF    EQU    0AH    ;LINE FEED
  53. FF    EQU    0CH    ;FORM FEED
  54. ALTFF    EQU    0BH    ;ALSO USE VT (^K) AS FORM FEED
  55. SPCHR    EQU    "#"    ;LEADIN FOR OPTIONS
  56. CR    EQU    0DH    ;CARRIAGE RETURN
  57. CTRLZ    EQU    1AH    ;CONTROL Z. EOF.
  58. POFF    EQU    82H    ;CHARACTER TO TURN LINE PRINTER OFF
  59. ;
  60.     ORG    TBASE
  61. ;
  62. ; ENTRY POINTS
  63. ;
  64. LISTER:    JMP    LISTGO    ;NORMAL ENTRY
  65.     LXI    SP,DSTACK    ;DDT DEBUGGING ENTRY
  66.     CALL    LISTGO    ;USE "I" COMMAND TO SET FILE NAME
  67.     RST    7    ;RETURN TO DDT
  68.  
  69. ;
  70. ;FORMAT CONTROL FLAGS. YOU CAN CHANGE THESE WITH     
  71. ;DDT OR BY EDIT-ASSEMBLE.
  72. ;
  73. TITLFLAG: DB    0FFH    ;MAKE 0 TO SUPPRESS TITLE
  74. TITLLEN    EQU    PAGNUMCOL-2 ;MAX TITLE SIZE
  75. PGNMFL:    DB    0FFH    ;MAKE 0 TO SUPPRESS PAGE NUMBERS
  76.  
  77. ;POINTER TO TITLE BUFFER. YOU CAN CHANGE THIS
  78. ;TO POINT AT TEXT ASSEMBLED ELSEWHERE IN PRO-
  79. ;GRAM, OR ADD CUSTOM TEXT AT REGULAR BUFFER.
  80. ;SEE COMMENTS AT TITLBUF (AT END).
  81. ;
  82. TITLPOINT: DW    TITLBUF
  83. STARTPAG:  DW   0    ;SET TO STARTING PAGE NUMBER
  84. NOPRINT:   DB   0    ; 0 = OK TO PRINT
  85.  
  86.  
  87. ; ***********************************************************
  88. ;
  89. ; MAIN PROGRAM BEGINS HERE
  90. ;
  91. LISTGO:    LXI    H,0
  92.     DAD    SP
  93.     SHLD    CALLERSP
  94.     LXI    SP,STACK
  95. ;
  96. ; SIGN-ON MESSAGE
  97. ;
  98.     CALL    INLMSG
  99.     DB    'LIST VERS 2.2L - 800819',CR,LF,'$'
  100. ;
  101. ;
  102. ;CLEAR INPUT BUFFER SO DOUBLE-ENTERED CR AFTER
  103. ;COMMAND WON'T ABORT LIST
  104.     MVI    C,CONRDY
  105.     CALL    BDOS
  106.     RAR
  107.     JNC    CIB9    ;IF NO CHARACTER
  108.     MVI    C,CONIN
  109.     CALL    BDOS    ;GET (AND IGNORE) CHARACTER
  110. ;
  111. ; SET UP TITL: DEFAULT TO WHAT WAS TYPED AFTER "LIST".
  112. ;
  113. ;TITL CONSISTS OF FILE NAME AND ANYTHING USER TYPES AFTER IT
  114. CIB9:    LXI    H,FLAGS    ;SEE IF SPECIAL FLAGS
  115.     MOV    A,M
  116.     CPI    SPCHR
  117.     JNZ    NOFLAG    ;NOTHING SPECIAL
  118. ; NOW THAT WE FOUND THE SPCHR, FIND IT IN OTHER BUFFER
  119.     LXI    H,TBUFF
  120. FINDIT:    INX    H
  121.     MOV    A,M
  122.     CPI    SPCHR
  123.     JNZ    FINDIT    ;NOT THERE YET
  124.     MVI    M,' '    ;WIPE IT OUT
  125.     INX    H
  126.     MOV    A,M    ;GET FLAG
  127.     SUI    'B'
  128.     STA    PGNMFL    ;TURN OFF PAGE NUMBER (IF 0)
  129.     STA    TITLFLAG  ;THIS TURNS OFF TITLE (IF 0)
  130.     JZ    NUMS    ;FOUND PROPER FLAG, SO DONE
  131.     SUI    'T'-'B'
  132.     STA    TITLFLAG ;TURN OFF TITLE ONLY (IF 0)
  133.     JZ    NUMS    ;DONE NOW
  134.     ADI    'T'-'P'
  135.     STA    PGNMFL    ;TURN OFF PAGE NUMBER (IF 0)
  136.     JZ    NUMS    ;ON TO CHECK PAGE NUMBER
  137.     DCX    H    ;NO CODE, SO LOOK BACK
  138. ; SEE IF STARTING PAGE NUMBER FOLLOWS
  139. ;    CAN FOLLOW THE # OR THE #B, #T, #P.
  140. NUMS:    MVI    M,' '    ;WIPE THE CODE CHARACTER
  141.     MVI    C,0    ;DIGIT COUNT
  142.     LXI    D,BUFFER-1    ; DIGIT SAVE LOCATION
  143.     PUSH    D    ;SAVE START
  144. NUMS1:    INX    D
  145.     INX    H    ;TO NEXT DIGIT
  146.     MOV    A,M    ;GET ONE CHARACTER
  147.     CPI    '0'
  148.     JC    NUMS2    ;NOT A DIGIT
  149.     CPI    '9'+1
  150.     JNC    NUMS2    ;NOT A DIGIT
  151.     STAX    D    ;SAVE THE DIGIT
  152.     MVI    M,' '    ;WIPE IT OUT
  153.     INR    C    ;COUNT DIGITS
  154.     JMP    NUMS1
  155. ;
  156. NUMS2:    MVI    A,' '
  157.     STAX    D    ;TRAILING BLANK FOR STOPPER
  158.     POP    D    ;START OF DIGITS
  159.     XRA    A
  160.     ADD    C
  161.     JZ    NOFLAG    ;NO DIGITS HERE
  162.     LXI    H,0    ;INITIALIZE PAGE NUMBER
  163.     CALL    WHERE2    ;GET PAGE NUMBER
  164. NOFLAG:    LHLD    TITLPOINT
  165.     XCHG        ;WHERE TO PUT TEXT
  166.     LXI    H,TBUFF    ;WHERE CCP LEFT TEXT
  167.     MOV    C,M    ;NUMBER OF CHARS IN TBUFF
  168.     MVI    B,TITLLEN  ;MAX # CHARS TO USE
  169.     LDAX    D
  170.     ORA    A
  171.     JNZ    TITL9  ;IF OTHER TEXT IS THERE, LEAVE IT
  172.     ;ABOVE IS A PROVISION FOR USER MODIFICATION
  173. ;COPY TEXT
  174. TITLUP:    DCR    C
  175.     JM    TITL2    ;STOP IF INPUT USED UP
  176.     INX    H 
  177.     MOV    A,M
  178.     STAX    D
  179.     INX    D    ;MOVE 1 CHARACTER
  180.     DCR    B
  181.     JNZ    TITLUP    ;STOP AT MAX # CHARS
  182. ;TERMINATE WITH 0
  183. TITL2:    XRA    A
  184.     STAX    D
  185. ;
  186. ;INIT INPUT
  187. ;
  188. ; MAKE SURE NO ?'S IN FILE NAME: 
  189. ;    IF AFN IS GIVEN, DIRECTORY ENTRIES GET CHANGED
  190. ;    TO ?'S ON AUTOMATIC CLOSES ON GOING TO
  191. ;    NEXT EXTENT, AND SUCCESSIVE EXTENTS
  192. ;    ARE NOT NECESSARILY OF THE SAME FILE.
  193. ;    CCP TRANLATES *'S TO MULTIPLE ?'S.
  194. ;
  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.     STA    ICOUNT+1
  215.     LDA    STARTPAG
  216.     ANA    A
  217.     JNZ    INIT2    ;PAGE NUMBER KNOWN ALREADY
  218. ;
  219. ; FIND OUT WHERE TO START
  220. ;
  221.     CALL    INLMSG
  222.     DB    'ENTER STARTING PAGE NUMBER - ',CR,LF,'$'
  223.     MVI    C,READCN
  224.     LXI    H,BUFFER
  225.     MVI    M,5    ;NO OF CHARS TO READ
  226.     XCHG
  227.     CALL    BDOS    ;READ CONSOLE BUFFER
  228.     LXI    H,0    ;CLEAR NUMBER AREA
  229.     LXI    D,BUFFER+1 ;CHARACTER COUNT WORD
  230.     LDAX    D
  231.     MOV    C,A    ;SAVE CHARACTER COUNT
  232.     CALL    WHERE2    ;GET DIGITS BINARIZED
  233. ;
  234. ; INIT OUTPUT
  235. ;
  236. INIT2:    XRA    A
  237.     STA    COL
  238.     STA    LINE    ;INIT CURSOR POSITION
  239.     STA    PAGEN+1
  240.     INR    A
  241.     STA    PAGEN    ;.. PAGE STARTS AT DW 1
  242.     LHLD    PAGEN    ;GET PAGE FOR CHECK
  243.     STA    NOPRINT    ;START WITH PRINT OFF
  244.     CALL    PCHECK    ;CHECK PRINT/NOPRINT FLAG
  245. ; PRINT TITL FOR FIRST PAGE
  246.     CALL    PTITL
  247. ; PASS ANY CR'S, LF'S, FORM FEEDS, ETC AT BEGINNING OF FILE
  248.     CALL    IGNORE    ;PASS FF'S ETC, GET CHAR IN A
  249.     JMP    CLOOP1    ;ENTER CHARACTER LOOP
  250. ;
  251. ; LIST RECORD -- OUTPUT CHARACTER LOOP
  252. ;
  253. CLOOP:    CALL    INCH        ;GET CHARACTER
  254. CLOOP1:    PUSH    B
  255.     PUSH    H
  256.     CALL    LSTCH        ;PROCESS  & LIST 1 CHAR
  257. ;  CHECK CONSOLE STATUS, ABORT IF CHAR TYPED
  258.     MVI    C,CONRDY
  259.     CALL    BDOS
  260.     RAR            ;TEST LSB
  261.     JC    EOF
  262.     POP    H
  263.     POP    B
  264.     JMP    CLOOP
  265. ;
  266. ;  PAGE NUMBER BINARIZATION
  267. ;
  268. WHERE2:    INX    D
  269.     LDAX    D    ;GET THE CHARACTER
  270.     CPI    ' '
  271.     JZ    WHERE4    ;SPACES STOP IT
  272.     PUSH    D        ;START TO DECIMALIZE
  273.     MOV    E,L    ;GET COPY OF CURRENT NUMBER
  274.     MOV    D,H
  275.     DAD    H    ;2*N
  276.     DAD    H    ;4*N
  277.     DAD    D    ;5*N
  278.     DAD    H    ;10*N
  279.     POP    D    ;BUFFER ADDRESS
  280.     CPI    CR
  281.     JZ    WHERE4    ;CR IS END OF LIST
  282.     SUI    '0'    ;DE-ASCII-IZE
  283.     ADD    L    ;INSERT NEW DIGIT
  284.     MOV    L,A
  285.     MOV    A,H
  286.     ACI    0    ;CARRY CORRECTION
  287.     MOV    H,A
  288.     DCR    C
  289.     JNZ    WHERE2
  290. WHERE4: SHLD    STARTPAG
  291.     RET
  292. ;
  293. ; END OF FILE.  FORM FEED AND EXIT.
  294.  
  295. EOF:    CALL    LISFFSUB ;OUTPUT FF W/O TITLE AND WO INF LOOPS
  296. ;TURN LPT MOTOR OFF. SHOULDN'T BOTHER OTHER DEVICES.
  297.     MVI    A,POFF
  298.     CALL    LOCH
  299. ;EXIT ROUTINE
  300. EXIT:    MVI    C,SETDMA
  301.     LXI    D,TBUFF
  302.     CALL    BDOS    ;RESET CP/M DEFAULT BUFFER
  303.     LHLD    CALLERSP
  304.     SPHL        ;RESET SP FOR CCP
  305.     RET
  306. ;
  307. ; ERROR STUFF
  308. ;
  309. NSERR:    LXI    D,MERR    ;MISCELLANEOUS ERRORS
  310. TERM:    ;COME HERE W/ DE POINTING TO TEXT
  311.     MVI    C,PRINT
  312.     CALL    BDOS
  313.     JMP    EXIT
  314. ;
  315. MERR:    DB    CR,LF,'SOME KIND OF ERROR',CR,LF,'$'
  316. EMFNF:    DB    LF,'FILE NOT FOUND',CR,LF,'$'
  317. EMQUES:    DB    LF,'NO *''S OR ?''S PLEASE!',CR,LF,'$'
  318.  
  319. ;
  320. ; ******************************
  321. ;
  322. ; INPUT CHARACTER TO ACC
  323. ;
  324. NEWREC: MVI     C,BUFSIZE    ;# OF SECTORS TO READ
  325.     XRA    A
  326.     STA    ICOUNT
  327.     STA    ICOUNT+1
  328.     LXI    H,BUFFER
  329.     SHLD    IPOINT
  330. NEWR2:    PUSH    B
  331.     XCHG
  332.     MVI    C,SETDMA
  333.     CALL    BDOS
  334.     MVI    C,READ    ;READ ANOTHER SECTOR
  335.     LXI    D,FCB
  336.     CALL    BDOS    ;READ RECORD
  337.     CPI    1
  338.     POP    B
  339.     JZ    NEWR3    ;IF END OF FILE
  340.     ORA    A
  341.     JNZ    NSERR    ;CHECK FOR GOOD RETURN FROM BDOS
  342.     LXI    D,128
  343.     LHLD    ICOUNT
  344.     DAD    D
  345.     SHLD    ICOUNT
  346.     LHLD    IPOINT
  347.     DAD    D    ;NEXT 128 FOR BUFFER
  348.     SHLD    IPOINT
  349.     DCR    C    ;COUNT SECTORS
  350.     JNZ    NEWR2    ;MORE
  351. NEWR3:    LHLD    IPOINT
  352.     MVI    M,CTRLZ    ;CRTL-Z AT END OF BUFFER
  353.     LXI    H,BUFFER
  354.     SHLD    IPOINT        ;INIT BUFFFER POINTER
  355.     POP    H
  356. ;ENTRY POINT:
  357. INCH:    PUSH    H 
  358.     LXI    D,-1
  359.     LHLD    ICOUNT
  360.     DAD    D    ;COUNT CHARS USED FROM RECORD
  361.     MOV    A,H
  362.     ANA    A
  363.     JM    NEWREC    ;IF RECORD USED UP, GET ANOTHER
  364.     SHLD    ICOUNT
  365.     LHLD    IPOINT    ;GET BUFFER POINTER
  366.     MOV    A,M        ;FETCH CHARACTER
  367.     CPI    CTRLZ
  368.     JZ    EOF    ;ON EOF GO DIRECT TO EOF ROUTINE
  369.     INX    H 
  370.     SHLD    IPOINT        ;POINT NEXT
  371.     POP    H 
  372.     RET
  373.  
  374. ;
  375. ; ***********************************
  376. ;
  377. ; LIST CHAR IN A WITH PROCESSING OF SPECIAL CHARS
  378. ;
  379. ;  KEEPS TRACK OF COLUMN, LINE, PAGE.
  380. ;  EXPANDS TABS WITH STOPS EVERY 8 COLUMNS
  381. ;  SIMULATES FORM FEEDS WITH LINE FEEDS.
  382. ;
  383. LSTCH:
  384. ;INCREMENT COLUMN COUNTER
  385.     LXI    H,COL
  386.     INR    M
  387. ;IGNORE PARITY BIT IN CHARS FFROM  FILE
  388. ;(NOTE: ELSE CERTAIN CHARS CAN PRODUCE INFINITE LOOP OF ^'S.
  389. ; ONLY CHANGE FOR VERSION 1.3)
  390.     ANI    7FH
  391. ;SPACE OR GREATER ASCII CODE JUST GETS PRINTED
  392.     CPI    ' '
  393.     JP    LOCH    ;GO PRINT IT
  394.     DCR    M        ;ELSE RESTORE COLUMN COUNTER
  395. ;PROCESS SPECIALS
  396.     PUSH    PSW
  397. ;
  398.     CPI    CR
  399.     JNZ    LSC2
  400.     XRA    A
  401.     STA    COL
  402.     POP    PSW    ;GET CHAR BACK
  403.     JMP    LOCH    ;GO LIST IT
  404. ;
  405. LSC2:    CPI    LF
  406.     JNZ    LSC3
  407.     LDA    LINE
  408.     CPI    PRINTPERPAGE-1
  409.     JP    LISFF    ;PAGE FULL, MAKE LIKE FORM FEED
  410.     POP    PSW    ;NORMAL CASE:CLEAR STACK AND...
  411.  
  412. ;PROCESS AND PRINT LINE FEED
  413. LISLF:    PUSH    PSW
  414.     MVI    A,LF
  415.     CALL    LOCH    ;OUTPUT LINE FEED
  416.     LDA    LINE
  417.     INR    A    ;LINE+1
  418.     CPI    PGSIZ
  419.     JM    LSC2A    ;BUT IF BOTTOM OF PAGE, MAKE IT...
  420.     LHLD    PAGEN
  421.     INX    H 
  422.     SHLD    PAGEN    ;...TOP OF NEXT PAGE
  423.     CALL    PCHECK
  424.     XRA    A    ;PRINT CHECKl LINE NUMBER RESET
  425. LSC2A:    STA    LINE
  426.     POP    PSW
  427.     RET
  428. ;
  429. LSC3:    CPI    ALTFF
  430.     JZ    LISFF    ;ALTERNATE FORM FEED
  431.     CPI    FF
  432.     JNZ    LSC4
  433. ;PRINT CR, LF'S TILL LINE=0
  434. LISFF:    CALL    LISFFSUB        ;SIMULATE FFORM FEED
  435. ;NEED A TITLE AT TOP OF NEXT PAGE, BUT FIRST SEE IF ANY MORE
  436. ;NON-CR, NON-LF, NON-FF CHARACTERS IN FILE.
  437. ;THIS IT AVOIDS BLANK SPACE AT TOP OF PAGE.
  438.     CALL    IGNORE    ;PASS CR, FF, ETC, GET NEXT CHAR IN A
  439. ;IF HERE, NOT AT EOFF AND NEXT CHAR IS IN A
  440.     CALL    PTITL        ;PRINT TITLE
  441.     POP    H 
  442.     JMP    LSTCH    ;CLEAR STACK, GO LIST CHAR
  443. ;
  444. LSC4:    CPI    TAB
  445.     JNZ    LSC5
  446. ;PRINT SPACES TILL LO 3 BITS OF COL = 0
  447. LSC4A:    MVI    A,' '
  448.     CALL    LSTCH
  449.     LDA    COL
  450.     ANI    7
  451.     JNZ    LSC4A
  452.     POP    PSW
  453.     RET
  454. ;
  455. LSC5:    ;ADD CHARACTERS HERE
  456. ;
  457. ;MISCELLANEOUS CHARACTERS, PRINT ^ AND LETTER
  458.     MVI    A,'^'
  459.     CALL    LSTCH
  460.     POP    PSW
  461.     ORI    40
  462.     JMP    LSTCH
  463. ;
  464. ; PROCESS AND OUTPUT (SIMULATED) FORM FEED
  465. LISFFSUB:
  466.     MVI    A,CR
  467.     CALL    LSTCH
  468. LSFF2:    LDA    LINE
  469.     ORA    A
  470.     CNZ    LISLF
  471.     JNZ    LSFF2
  472.     RET
  473.  
  474.  
  475. ;SUBROUTINE TO IGNORE CR'S, LF'S, FORM FEEDS. CALLED AT TOP
  476. ;OF EACH PAGE. RETURNS NEXT NON-IGNOORED CHARACTER IN A.
  477. ;TERMINATES LIST IF EOF ENCOUNTERED.
  478. IGNORE: CALL    INCH    ;INPUT CHARACTER OF SOURCE FILE TO A
  479.     CPI    CR
  480.     JZ    IGNORE
  481.     CPI    LF
  482.     JZ    IGNORE
  483.     CPI    FF
  484.     JZ    IGNORE
  485.     CPI    ALTFF
  486.     JZ    IGNORE
  487.     RET            ;CHARACTER IS IN A
  488.  
  489. ; CHECK FOR AT OR PAST STARTING PAGE
  490. PCHECK:    XCHG
  491.     LHLD    STARTPAG
  492.     MOV    A,D
  493.     SUB    H
  494.     RNZ        ;NOT THE SAME
  495.     MOV    A,E
  496.     SUB    L
  497.     RC        ;NOT .GE.
  498. ;PAGE MATCHES, SO SET TO PRINT
  499.     XRA    A
  500.     STA    NOPRINT
  501.     RET
  502. ;
  503.  
  504. ;
  505. ;LIST OUTPUT CHAR IN A, WITHOUT PROCESSING
  506. ;
  507. LOCH:    IF    UOPT    
  508. ;  COPE WITH UPPER-CASE ONLY PRINTERS
  509.     CPI    'a'
  510.     JC    NUPC
  511.     CPI    'z'+1
  512.     JNC    NUPC
  513.     ANI    5FH    ;SHIFT TO UPPER CASE
  514.     ENDIF
  515. ;
  516. NUPC:    MOV    E,A
  517.     LDA    NOPRINT
  518.     ORA    A
  519.     RNZ          ;NOT ALLOWED TO PRINT THIS
  520.     MVI    C,LIST
  521.     JMP    BDOS
  522.  
  523. ;
  524. ; SUBROUTINE TO PRINT PAGE TITL
  525. ;
  526. PTITL:    PUSH    PSW
  527.     PUSH    H
  528.  
  529. ;TITLE TEXT
  530.     LDA    TITLFLAG
  531.     ORA    A
  532.     JZ    NOTITL
  533.     LHLD    TITLPOINT
  534.     CALL    LSTRING
  535. NOTITL:
  536. ;PAGE NUMBER
  537.     LDA    PGNMFL
  538.     ORA    A
  539.     JZ    NOPAGNUM
  540.     ;SPACE TO COLUMN
  541. PAGN1:    MVI    A,' '
  542.     CALL    LSTCH        ;MINIMUM ONE SPACE
  543.     LDA    COL
  544.     SBI    PAGNUMCOL
  545.     JM    PAGN1
  546.     ;"PAGE" TEXT
  547.     LXI    H,PAGETXT
  548.     CALL    LSTRING
  549.     ;NUMBER
  550.     LHLD    PAGEN
  551.     CALL    DECPR
  552. NOPAGNUM:
  553. ;TEST IF EITHER OF ABOVE WAS PRINTED
  554.     LHLD    TITLFLAG
  555.     LDA    PGNMFL
  556.     ORA    L
  557.     JZ    PTITLEX        ;NO, NEED NO CRLF'S
  558. ;CR AND 2 LF'S
  559.     MVI    A,CR
  560.     CALL    LSTCH
  561.     MVI    A,LF
  562.     CALL    LSTCH
  563.     MVI    A,LF
  564.     CALL    LSTCH
  565. PTITLEX: POP    H 
  566.     POP    PSW
  567.     RET
  568. ;
  569. PAGETXT: DB    'PAGE ',0
  570.  
  571. ;SUBR TO LIST STRING (HL) TO NULL
  572. LSTRING: MOV    A,M
  573.     ORA    A
  574.     RZ
  575.     INX    H
  576.     PUSH    H 
  577.     CALL    LSTCH
  578.     POP     H 
  579.     JMP    LSTRING
  580.  
  581.  
  582. ;
  583. ; DECIMAL PRINT HL, UNSIGNED
  584. ;
  585. DECPR:    PUSH    B
  586.     PUSH    D
  587.     PUSH    H
  588.     LXI    B,-10    ;MINUS RADIX
  589.     LXI    D,-1    ;BECOMES NUMBER DIVIDED BY RADIX
  590. DECPR1:    DAD    B
  591.     INX    D
  592.     JC    DECPR1    ;SUBTRACT TILL NEGATIVE
  593.     LXI    B,10
  594.     DAD    B    ;ADD RADIX BACK ONCE
  595.     XCHG        ;HAVE N/10 IN HL, REMAINDER IN DE
  596.     MOV    A,H
  597.     ORA    L
  598.     CNZ    DECPR    ;PRINT DIGITS LEFT OF THIS IF ANY
  599.     MOV    A,E
  600.     ADI    '0'
  601.     CALL    LOCH   ;PRINT THIS DIGIT
  602.     POP    H 
  603.     POP    D
  604.     POP    B
  605.     RET
  606.  
  607. ;
  608. ; OUTPUT IN-LINE MESSAGE TO CONSOLE
  609. INLMSG:    XTHL        ;SAVE H, GET TEXT LOCATION
  610.     PUSH    PSW
  611.     MOV    A,M
  612. INLML:    CALL    CONO
  613.     INX    H
  614.     MOV    A,M
  615.     CPI    '$'
  616.     JNZ    INLML   ;$ ENDS TEXT
  617.     INX    H
  618.     POP    PSW
  619.     XTHL
  620.     RET    ;RETURN AFTER TEXT
  621. ;
  622. ;OUTPUT CHAR FROM A
  623. CONO:    PUSH    PSW
  624.     PUSH    B
  625.     PUSH    D
  626.     PUSH    H
  627.     MOV    E,A
  628.     MVI    C,CONOUT
  629.     CALL    BDOS
  630.     POP    H
  631.     POP    D
  632.     POP    B
  633.     POP    PSW
  634.     RET
  635.  
  636.  
  637.  
  638. ;
  639. ;IF YOU WANT A SPECIAL TITLE, PATCH OR ASSEMBLE TEXT IN HERE
  640. ;TERMINATE WITH 0.
  641. ;IF BUFFER BEGINS WITH 0, INIT CODE COPIES OPERATOR'S TITLE IN.
  642. TITLBUF: DB     0    ;SAYS NO TITLE HERE YET
  643.     DS    TITLLEN ;REST OF TITLE BUFFFER
  644. ;
  645. IPOINT:    DS    2    ;INPUT BUFFER POINTER
  646. ICOUNT:    DS    2    ;INPUT BUFFER DOWN-COUNTER
  647. ;
  648. COL:    DS    1
  649. LINE:    DS    1
  650. PAGEN:    DS    2
  651.  
  652. CALLERSP: DS    2    ;CALLER'S STACK POINTER
  653. ;
  654. ;
  655.     DS    84    ;STACK ROOM
  656. STACK:    EQU    $
  657. DSTACK:    DS    2
  658. ;
  659. BUFFER    DS    1+BUFSIZE*128
  660. ;
  661.     END    LISTER
  662.