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 / CPMUG036.ARK / POW.ASM < prev    next >
Assembly Source File  |  1985-02-10  |  24KB  |  1,576 lines

  1. ;
  2. ;POW FROM DR. DOBBS JOURNAL NO. 29, PAGE 20
  3. ;
  4. ;....POW....
  5. ;30 JULY 79....MODS FOR CP/M
  6. ;BY BOTTER REEVES...LOY NAVA CO. LTD.
  7. ;1229/27 NEW ROAD, BANGKOK 5, THAILAND
  8. ;233-4193
  9.  
  10.  
  11. ;DEC 16-30,  1977 :
  12. ;MODIIED FOR FDOS JUN 3,1978
  13. ;SELECTRIC MODS JUNE 15,1978
  14. ;TOTAL JUSTIFICATION FIXED JULY 20, 1978
  15. ;
  16. ;
  17. ;BY HERMAN WATSON
  18. ;P.O. BOX 341401
  19. ;CORAL GABLES, FLA 33134
  20. ;
  21. ;
  22. ;
  23. ;THE FOLLOWING IS THE JAZZED UP VERSION FOR FDOS
  24. ;WITH INSTRUCTION PRINTOUT AT THE BEGINNING
  25. ;
  26.     ORG    100H    ;START LOC FOR COM FILE
  27. START    LXI    SP,STACK
  28.     LXI    H,STMSG
  29.     CALL    TXTYP
  30.     JMP    MAIN
  31.  
  32.  
  33. STMSG    DB    '...PROCESSOR OF WORDS FOR 8080',0DH,0AH
  34.     DB    'THE COMMANDS ARE AS FOLLOWS',0DH,0AH
  35.     DB    '  "P" = PRINT',0DH,0AH
  36.     DB    '  "L" = LOAD',0DH,0AH
  37.     DB    '  "Q" = QUIT',0DH,0AH
  38.     DB    '  CTRL C WILL ABORT',0DH,0AH
  39.     DB    'ENTER COMMAND $'
  40.  
  41.  
  42. ;UTILITY ROUTINES
  43.  
  44. ;ADD A TO HL
  45.  
  46. ADAH    ADD    L
  47.     MOV    L,A
  48.     RNC
  49.     INR    H
  50.     RET
  51.  
  52. ;TEST DE .EQ. HL
  53. ;RETURN ZERO IF SO
  54.  
  55. TDHE    MOV    A,D
  56.     CMP    H
  57.     RNZ
  58.     MOV    A,E
  59.     CMP    L
  60.     RET
  61.  
  62.  
  63. ;GENERATE PSEUDORANDOM NUMBER 0-15
  64.  
  65. RAND    LXI    H,RNDV
  66. RND1    MOV    A,M
  67.     RLC
  68.     INR    A
  69.     RLC
  70.     RLC
  71.     XRA    M
  72.     MOV    M,A
  73.     ANI    0FH
  74.     RET
  75.  
  76.  
  77. ;CONVERT TABS TO CORRECT POSITION
  78.  
  79. TBST    LDA    LPOS
  80.     MOV    C,A
  81.     LXI    D,TTAB
  82. ;SEARCH TTAB FOR NEXT GREATEST LOCATION
  83. TBLP    LDAX    D
  84.     INX    D
  85.     CMP    C
  86.     JZ    TBLP
  87.     JNC    GOTB
  88.     CPI    0
  89.     JNZ    TBLP
  90. ;NO MORE TABS IN TABLE
  91.     JMP    CLOS
  92. ;GOT GOOD TAB, UPDATE POINTERS
  93. GOTB    LXI    H,RMAR
  94.     CMP    M
  95.     JNC    CLOS
  96. PUTB    STA    LPOS
  97.     LXI    H,OBUF
  98.     CALL    ADAH
  99.     SHLD    LADR
  100.     RET
  101.  
  102.  
  103. ;CONVERT ASCII NUMBER TO BINARY
  104. ;ADDRESS IN HL ON ENTRY, SAVED IN APNT ON EXIT
  105. ;RETURN WITH VALUE IN HL
  106.  
  107. ADEC    PUSH    H
  108.     POP    B
  109.     LXI    H,0
  110. ADE1    LDAX    B
  111.     CALL    NMCK    ;CHECK FOR DECIMAL NUMBER
  112.     JC    ADE2
  113.     INX    B
  114.     MOV    D,H
  115.     MOV    E,L
  116.     DAD    H
  117.     DAD    H
  118.     DAD    D
  119.     DAD    H
  120.     SUI    48
  121.     MOV    E,A
  122.     MVI    D,0
  123.     DAD    D
  124.     JMP    ADE1
  125.     ADE2    PUSH    B
  126.     XTHL
  127.     SHLD    APNT
  128.     POP    H
  129.     RET
  130.  
  131.  
  132. ;CHECK FOR DECIMAL NUMBER IN ASCII
  133.  
  134. NMCK    CPI    '0'
  135.     RC
  136.     CPI    '9'+1
  137.     CMC
  138.     RET
  139.  
  140.  
  141.  
  142. ;INITIALIZE OBUF FOR NEW FORMATTED LINE
  143.  
  144. NEWL    LXI    H,OBUF    ;FILL WITH SPACES
  145.     LDA    MAXL
  146.     MOV    C,A
  147.     MVI    A,' '
  148. NEWA    MOV    M,A
  149.     INX    H
  150.     DCR    C
  151.     JNZ    NEWA
  152.     LXI    H,OBUF    ;COMPUTE LEFT MARGIN ADDR
  153.     LDA    LMAR
  154.     CALL    ADAH
  155.     SHLD    LADR
  156.     LDA    LMAR    ;SET POSITION COUNTER
  157.     STA    LPOS
  158.     LXI    H,OBUF    ;COMPUTE RIGHT MARGIN ADDR
  159.     LDA    RMAR
  160.     CALL    ADAH
  161.     SHLD    LEND
  162.     MVI    M,CR    ;EOL AT RIGHT
  163.     RET
  164.  
  165.  
  166. ;FORMATTED OUTPUT
  167. ;CALL WITH LETTER IN A
  168. ;HANDLES LEFT OR TOTAL JUSTIFICATION
  169.  
  170. FMAT    CPI    9    ;TEST TAB
  171.     JZ    TBST
  172.     CPI    CR    ;TEST CARG RETRN
  173.     JNZ    LFTS
  174.     MVI    A,' '    ;REPLACE CR WITH SPACE
  175. LFTS    CPI    LF    ;IGNORE LINE FEEDS
  176.     RZ
  177.     CPI    ' '
  178.     JNZ    RFMT
  179.  
  180. ;IF HERE, EITHER LEFT OR TOTAL JUST. SO ALLOW
  181. ;NO SPACES AT THE LEFT OF THE LINE
  182.     LXI    H,LMAR
  183.     LDA    LPOS
  184.     CMP    M
  185.     RZ        ;AT START, SO STAY THERE
  186.     MVI    A,' '    ;OK TO KEEP SPACE
  187. RFMT    LHLD    LADR    ;NOW PLACE LETTER IN OBUF
  188.     MOV    M,A
  189.     INX    H
  190.     SHLD    LADR
  191.     LXI    H,RMAR    ;CHECK IF OBU FULL
  192.     LDA    LPOS
  193.     INR    A
  194.     STA    LPOS
  195.     CMP    M
  196.     RC
  197.  
  198.  
  199. ;OBUF FULL. ASSUME LEFT JUST.
  200. ;BACK UP TO SPACE AND SAVE OVERFLOW
  201. ;DE=TEMP ADDRESS
  202. ;C=CHAR COUNT
  203. ;HL=OBUF ADDRESS
  204.  
  205.     MVI    B,30    ;MAX AMOUNT TEML CAN HOLD
  206.     MVI    C,0    ;TEML CHAR COUNT
  207.     LXI    D,TEML
  208.     LHLD    LADR
  209.     MVI    M,CR    ;EOL IN CASE NOT POSSIBLE
  210. ;LOOP BACK TO FIRST SPACE (WITHIN 30 LETTERS
  211. ;AND WITHOUT HITTING LEFT MARGIN)
  212.  
  213. LJBU    DCX    H
  214.     MOV    A,M
  215.     CPI    ' '
  216.     JZ    LJFN
  217. LJRT    STAX    D
  218.     INX    D
  219.     INR    C
  220.     DCR    B
  221.     JZ    OUTL
  222.     JMP    LJBU
  223. LJFN    DCX    H
  224.     MOV    A,M
  225.     INX    H
  226.     CPI    ' '
  227.     JZ    LJRT
  228.     MOV    A,C
  229.     STA    TCNT    ;SAVE CHAR COUNT
  230.     LDA    LPOS    ;BACK UP LPOS
  231.     SUB    C
  232.     STA    LPOS
  233.     MOV    C,A    ;DON'T GO PAST NEW PARA TAB
  234.     LDA    BRTB    ;FOR UNMODIFIED INDENTION
  235.     SUB    C    ;TO THAT TAB POSITION
  236.     JNC    OUTL    ;TERMS NOT MET
  237.     SHLD    LADR
  238.     MVI    M,CR    ;NEW EOL
  239.  
  240.  
  241. ;TEST HERE IF LEFT JUST. OR TOTAL JUST.
  242. ;0=NO JUST.
  243. ;1=LEFT ONLY
  244. ;2=TOTAL JUST.
  245. ;BY THE WAY, AT THIS POINT LEFT JUST.
  246. ;IS COMPLETE ALREADY
  247.  
  248.     LDA    JFLG
  249.     CPI    1
  250.     JZ    OUTL
  251.     CPI    2
  252.     JNZ    OUTL
  253.  
  254. ;TOTAL JUST. AT THIS POINT
  255. ;MOVE LINE TO RIGHT, AND PAD
  256. ;IF LMAR REACHED, PUSH LINE LEFT AND
  257. ;PAD AGAIN UNTIL DONE
  258. ;(HL) .GE. (DE), SO DE IS RIGHT OF HL, AND WHEN
  259. ;DE .EQ. HL, THE PADDING IS DONE
  260.  
  261. ;BEGIN AT LAST CHAR AND SHOVE RIGHT
  262. ;START PADDING AT THE SFLP SPACE
  263. ;(SFLP IS RANDOM) AND CONTINUE
  264. ;PADDING EACH OCCURRANCE OF A GROUP
  265. ;OF SPACES UNTIL THE TWO POINTERS ARE EQUAL
  266. ;TO EACH OTHER
  267.  
  268.  
  269. TOTL    CALL    RAND    ;INIT SFLP
  270.     STA    SFLP
  271.     LHLD    LEND
  272.     XCHG
  273.     LHLD    LADR
  274.     LDA    LPOS
  275.     MOV    C,A
  276.     MVI    B,0    ;MAKE SURE SP IS FOUND
  277. ;DE .EQ. HL MEANS PAD DONE
  278.  
  279.  
  280.     CALL    TDHE
  281.     JZ    OUTL
  282.  
  283. ;RIGHT AND PAD
  284.  
  285. RITE    MOV    A,M    ;PICK UP FROM LEFT
  286.     STAX    D    ;STORE AT RIGHT
  287.     CPI    ' '    ;TEST PICKED UP CHAR
  288.     JNZ    WORD
  289.     MVI    B,1    ;NOTE THAT SP WAS FOUND
  290.     LDA    SFLP    ;TST IF WE CAN INSERT YET
  291.     ORA    A    ;TEST FOR ZERO
  292.     JZ    PADD    ;CAN'T INSERT YET
  293.     DCR    A
  294.     STA    SFLP
  295.     JMP    WORD    ;NOT YET
  296. PADD    LDA    LCHR    ;CHECK IF GROUP OF SPACES
  297.     CPI    ' '    ;DON'T ALLOW THIS COND.
  298.     JZ    WRD1
  299.     MVI    A,' '    ;PADDING DONE HERE
  300.     DCX    D
  301.     STAX    D
  302.     CALL    TDHE
  303.     JZ    OUTL
  304. WORD    MOV    A,M
  305.     STA    LCHR
  306. WRD1    DCX    D    ;REST OF RIGHT AND PAD LOOP
  307.     DCX    H
  308.     DCR    C
  309.     LDA    BRTB    ;ALLOWS INDENTION
  310.     CMP    C
  311.     JZ    LEFT    ;HIT INDENTATION
  312.     LDA    LMAR    ;OR LEFT MARGIN
  313.     CMP    C
  314.     JNZ    RITE    ;CAN STILL PROCEED
  315.  
  316. ;PUSH LEFT AND TRY AGAIN
  317.  
  318. LEFT    INX    D
  319.     INX    H
  320.     INR    C
  321.     LDAX    D
  322.     MOV    M,A
  323.     CPI    CR
  324.     JNZ    LEFT
  325.     XRA    A    ;TEST IF ONE SP FOUND
  326.     ORA    B
  327.     JZ    OUTL    ;NOPE, NOT ONE SP FOUND
  328.     JMP    RITE
  329.  
  330. ;OUTPUT A COMPLETE FORMATTED LINE FROM OBUF
  331.  
  332. OUTL    LXI    H,OBUF    ;OUT TO CR
  333. OUTM    MOV    A,M
  334.     INX    H
  335.     CPI    CR
  336.     JZ    EOL
  337.     CALL    OUTC
  338.     JMP    OUTM
  339. EOL    CALL    NEWL    ;CLEAN OBUF
  340.     LDA    SPAS    ;PROCESS SPACING
  341.     MOV    C,A
  342. EOLP    CALL    CRLF
  343.     LDA    PPOS    ;UPDATE TEXT PAGE POSITION
  344.     INR    A
  345.     STA    PPOS
  346.     LXI    H,PLEN
  347.     CMP    M
  348.     JNC    EOXP
  349.     DCR    C
  350.     JNZ    EOLP
  351.     JMP    RSTR
  352. EOXP    CALL    NEXP    ;NEED A NEW PAGE!
  353.  
  354. ;RESTORE OVERFLOW FROM TEML
  355. ;INTO OBUF STARTING AT LMAR
  356. RSTR    LXI    D,TCNT
  357.     LDAX    D
  358.     ORA    A
  359.     RZ
  360.     LXI    H,TEML-1
  361.     MOV    C,A
  362.     DCR    C
  363.     CALL    ADAH
  364.     MOV    A,M
  365.     CPI    ' '    ;PREVENT FIRST BEING SPACE
  366.     MOV    A,C
  367.     STAX    D
  368.     JZ    RSTR
  369.  
  370. ;FIRST NOT SPACE
  371.  
  372.     INR    C
  373.     LDA    LMAR
  374.     ADD    C
  375.     STA    LPOS
  376.     XCHG
  377.     LHLD    LADR
  378. RSTL    LDAX    D
  379.     MOV    M,A
  380.     DCX    D
  381.     INX    H
  382.     DCR    C
  383.     JNZ    RSTL
  384.     SHLD    LADR
  385.     XRA    A
  386.     STA    TCNT
  387.     RET
  388.  
  389.  
  390. ;UNFORMATTED OUTPUT ROUTINE
  391. ;EQUIVALENT TO FMAT, BUT NO JUSTIFICATION
  392. ;IF TEXT EXCEEDS RMAR, THEN A CR IS FORCED AND A
  393. ;NEW LINE IS STARTED
  394.  
  395. UFMT    CPI    9    ;TEST TAB
  396.     JZ    TBST
  397.     CPI    LF    ;IGNORE LINE FEEDS
  398.     RZ
  399.     CPI    CR    ;TEST CARG RETURN
  400.     LHLD    LADR
  401.     MOV    M,A    ;INSERT AS EOL
  402.     JZ    OUTL
  403.     INX    H
  404.     SHLD    LADR
  405.     LXI    H,RMAR    ;TEST IF FULL
  406.     LDA    LPOS
  407.     INR    A
  408.     STA    LPOS
  409.     DCR    A
  410.     CMP    M
  411.     RC
  412.  
  413.  
  414. ;HERE, OBUF IS FULL SO FORCE CR AND CONTINUE
  415.  
  416.     LHLD    LADR
  417.     MVI    M,CR
  418.     JMP    OUTL
  419.  
  420.  
  421. ;OUTPUT OBUF IF ANYTHING IN IT
  422.  
  423. CLOS    LXI    H,LMAR
  424.     LDA    LPOS
  425.     CMP    M
  426.     RZ
  427.     RC
  428.     LHLD    LADR
  429.     MVI    M,CR
  430.     JMP    OUTL
  431.  
  432. ;OUTPUT BOTTOM OF PAGE, THE DIVIDER, AND
  433. ;THE TOP OF THE NEXT PAGE
  434.  
  435. NEXP    LDA    BLEN    ;GET BOTTOM LENGTH
  436.     ORA    A
  437.     JZ    DVDR    ;NO BOTTOM PLEASE
  438.     MOV    C,A
  439. NPBL    LDA    BOTN    ;CHECK IF AT LINE FOR MSG OUT
  440.     CMP    C
  441.     CZ    BMSG    ;YES, OUTPUT IT
  442.     CALL    CRLF
  443.     DCR    C
  444. JNZ    NPBL
  445.  
  446. ;DETERMINE IF LAST PAGE IN FILE
  447.  
  448.     LDA    EOT
  449.     ORA    A
  450.     RZ        ;ZERO SAYS EOF ENCOUNTERED
  451.  
  452. ;START A NEW PAGE NOW
  453.  
  454. ;OUTPUT WARNING TO CONSOLE AND WAIT FOR "GO"
  455.  
  456. DVDR    LXI    H,PAGMS
  457.     CALL    TXTYP
  458.     CALL    ECHO1
  459.     CALL    CI
  460.     LXI    H,PAGN
  461.     INR    M
  462. NEWP    LDA    TLEN    ;GET TOP LENGTH
  463.     ORA    A
  464.     JZ    NPXT    ;NO TOP PLEASE
  465.     MOV    C,A
  466. NPTL    LDA    TOPN    ;EQUAL LINE FOR MSG OUTPUT?
  467.     CMP    C
  468.     CZ    TMSG    ;YES, PRINT IT
  469.     CALL    CRLF
  470.     DCR    C
  471.     JNZ    NPTL
  472. NPXT    XRA    A
  473.     STA    PPOS
  474.     RET
  475. BMSG    LDA    PAGN    ;NO MSG ON FIRST PAGE
  476.     CPI    2
  477.     RC
  478.     MOV    A,C
  479.     STA    TSTG    ;SAVE PRESENT LINE COUNT
  480.     LHLD    BOTA    ;GET BOTM MSG ADDRESS
  481.     LDA    BOTT    ;AND TAB POSITION
  482.  
  483. ;DIRECTLY OUTPUT MESSAGE LINE TO PRINTER
  484. ;DOES NOT USE OR DESTROY OBUF AND ITS CONTENTS
  485.  
  486. TNTR    MOV    C,A
  487.     LDA    CASE
  488.     PUSH    PSW
  489. BMAL    MVI    A,' '    ;SPACE OVER TO TAB
  490.     CALL    OUTC
  491.     DCR    C
  492.     JNZ    BMAL
  493. BMSL    MOV    A,M    ;OUTPUT THE MESSAGE
  494.     INX    H
  495.     CALL    CAPR    ;DO CASE PROCESSING
  496.     JC    BMSL    ;IGNORE LAST CHAR
  497.     CPI    ':'    ;SUBSTITUTE THE PAGE NUMBER
  498.     CZ    BIND    ;AT OCCURANCE OF COLON
  499.     CPI    CR
  500.     JZ    BMXT
  501.     CALL    OUTC
  502.     JMP    BMSL
  503. BMXT    STA    PPOS
  504.     POP    PSW
  505.     STA    CASE
  506.     LDA    TSTG    ;RESTORE LINE COUNT
  507.     MOV    C,A
  508.     RET
  509.  
  510.  
  511. ;OUTPUT TOP OF PAGE MESSAGE (SEE BMSG)
  512.  
  513. TMSG    LDA    PAGN
  514.     CPI    2
  515.     RC
  516.     MOV    A,C
  517.     STA    TSTG
  518.     LHLD    TOPA
  519.     LDA    TOPT
  520.     JMP    TNTR
  521.  
  522. ;BINARY TO DECIMAL CONVERT CONTNTS OF A REG
  523. ;DIRECT OUTPUT TO PRINTER,COMPLETE WITH ZERO
  524. ;SUPPRESSION
  525.  
  526. BIND    MVI    E,0
  527.     LDA    PAGN
  528.     MVI    C,100
  529.     CALL    BIDA
  530.     MVI    C,10
  531.     CALL    BIDA
  532.     ADI    '0'
  533.     RET
  534. BIDA    MVI    B,'0'-1
  535.     INR    B
  536.     SUB    C
  537.     JNC    BIDA+2
  538.     ADD    C
  539.     MOV    D,A
  540.     MOV    A,B
  541.     CPI    '0'
  542.     JNZ    BINZ
  543.     MOV    A,E
  544.     ORA    A
  545.     MOV    A,D
  546.     RZ
  547. BINZ    INR    E
  548.     MOV    A,B
  549.     CALL    OUTC
  550.     MOV    A,D
  551.     RET
  552.  
  553. ;COMMAND DECODER AND PRINT LOOP
  554. ;THIS IS THE MAIN TEXT AND WORD PROCESSING LOOP
  555. ;HERE, WE GET THE NEXT CHAR FROM TEXT AND SEE
  556. ;IF A COMMAND, OR PROCESSED TEXT
  557.  
  558. PRIN    LHLD    APNT    ;SOURCE TEXT POINTER
  559. PRLP    MOV    A,M
  560.     INX    H
  561.     CPI    3
  562.     JC    EOF
  563.     CPI    ':'    ;COLON=BEGINNING OF COMMAND
  564.     JZ    CMND
  565.     CALL    CAPR    ;DO CASE PROCESSING
  566.     JC    PRLP    ;LETTER WAS TO BE IGNORED
  567.     MOV    B,A
  568.  
  569. ;TEST IF DIRECT OUTPUT OF NEXT CHAR
  570.  
  571.     CPI    5BH    ;CONTROL K?
  572.     JNZ    PROC    ;NO
  573.     MOV    B,M    ;OUTPUT WITHOUT QUESTION
  574.     INX    H
  575. PROC    LDA    JFLG    ;PROCESS A LETTER
  576.     ORA    A
  577.     MOV    A,B
  578.     SHLD    APNT
  579.     JZ    NOFM
  580.     CALL    FMAT    ;EITHER LEFT OR TOTAL JUST.
  581.     JMP    PRIN
  582. NOFM    CALL    UFMT    ;NO JUSTIFICATION
  583.     JMP    PRIN
  584. EOF    CALL    CLOS    ;CLOSE PENDING LINE
  585.     XRA    A
  586.     STA    EOT
  587.     CALL    NPAG
  588.     MVI    A,0FFH
  589.     STA    EOT
  590.     JMP    MAIN
  591.  
  592. ;CASE PROCESSING SUBROUTINE
  593. ;RETURN WITH CARRY SET IF CHAR IS TO BE
  594. ;IGNORED. (IE WAS A SHIFT COMMAND)
  595.  
  596. ;CHECK IF SHIFT OR UNSHIFT COMMAND
  597.  
  598. CAPR    CPI    5EH    ;CONTROL N
  599.     JZ    UCAS
  600.     CPI    5CH    ;CONTROL L
  601.     JZ    LCAS
  602.  
  603. ;CHECK AND PROCESS UPPER AND LOWER CASE
  604.  
  605.     MOV    B,A
  606.     LDA    CASE
  607.     CPI    3
  608.     JZ    CASX    ;ZERO    SAYS SHIFT LOCKED UP
  609.  
  610. ;LAND HERE, EITHER SINGLE SHIFT OR LOWER CASE
  611. ;TEST FOR SINGLE SHIFT
  612.  
  613.     CPI    1    ;1=SINGLE SHIFT
  614.     MVI    A,0    ;Z FLAG STILL PRESERVED
  615.     STA    CASE    ;CLEAR IT ANYWAY
  616.     JZ    CASX    ;ZERO SAYS SINGLE SHIFT
  617.  
  618. ;LAND HERE, LOWER CASE COND
  619. ;TEST IF IT IS ALPHA
  620.  
  621.     MOV    A,B
  622.     CPI    'A'
  623.     JC    CASX    ;NOT ALPHA
  624.     CPI    'Z'+1
  625.     JNC    CASX    ;NOT ALPHA
  626.  
  627. ;LAND HERE, CONVERT TO LOWER CASE
  628.     MVI    A,20H
  629.     ORA    B
  630.     MOV    B,A
  631.  
  632. ;EXIT WITH CARRY BIT CLEAR
  633.  
  634. CASX    ORA    A
  635.     MOV    A,B
  636.     RET
  637. ;PROCESS UNSHIFT OR LOWER CASE MODE
  638.  
  639. LCAS    XRA    A
  640.     JMP    NOLCK 
  641.  
  642. ;PROCESS SHIFT (EITHER SINGLE OR SHIFT LOCK)
  643.  
  644. UCAS    LDA    CASE
  645.     CPI    1
  646.     JZ    LOCK
  647.     MVI    A,1    ;SINGLE SHIFT
  648.     JMP    NOLCK
  649. LOCK    MVI    A,3
  650. NOLCK    STA    CASE
  651.     STC        ;SET CARRY, IGNORE LETTER
  652.     RET
  653.  
  654.  
  655.  
  656. ;COLON WAS ENCOUNTERED IN TEXT
  657. ;THIS TESTS NEXT TWO CHARACTERS
  658. ;AGAINST ALL COMMANDS TO FIND COMMAND
  659. ;AND CALL IT
  660.  
  661. CMND    MOV    B,M
  662.     INX    H
  663.     MOV    C,M
  664.     INX    H
  665.     SHLD    CEPT    ;POINTS TO DELIMITER
  666.     LXI    H,CTAB
  667.  
  668. ;LOOP TO FIND MATCH
  669.  
  670. CLOP    MOV    A,M
  671.     INX    H
  672.     ORA    A
  673.     JZ    CRTN
  674.     CMP    B
  675.     JZ    ONEM
  676. ;HERE FIRST LETTER FAIL
  677.     INX    H
  678.     INX    H
  679.     INX    H
  680.     JMP    CLOP
  681. ;HERE FIRST LETTER MATCH
  682. ONEM    MOV    A,M
  683.     INX    H
  684.     CMP    C
  685.     JZ    TWOM
  686. ;HERE SECOND LETTER FAIL
  687.     INX    H
  688.     INX    H
  689.     JMP    CLOP
  690. ;COMMAND MATCH
  691.  
  692. TWOM    MOV    E,M    ;LOAD ADDR
  693.     INX    H
  694.     MOV    D,M
  695.     LHLD    CEPT
  696.     SHLD    APNT    ;POINTING AT DELIMITER
  697.     LXI    H,PRIN    ;SET UP RETURN
  698.     PUSH    H
  699.     XCHG
  700.     PCHL        ;GO TO COMMAND ROUTINE
  701.  
  702.  
  703. ;FAILED TO MATCH A COMMAND, SO PRINT TEXT
  704.  
  705. CRTN    LHLD    APNT
  706.     MOV    B,M
  707.     INX    H
  708.     JMP    PROC
  709.  
  710. ;TAPE INPUT ROUTINE
  711.  
  712. FDIN    CALL    INIR
  713.     LXI    H,TEXT
  714. TPLP    CALL    GBYT
  715.     MOV    M,A
  716.     INX    H
  717.     JNC    TPLP    ;NO EOF FOR FDOS
  718.  
  719. ;FOR TAPE, I WOULD CHECK FOR VALUE LESS THAN 3
  720. ;IE BINARY 1=EOF FOR TAPE
  721. ;AND CARRY SET = EOF FROM FDOS
  722.  
  723.     DCX    H
  724.     MVI    M,1
  725.     JMP    MAIN
  726.  
  727.  
  728. ;THIS IS THE INTERACTIVE PORTION OTHER THAN DIALOG
  729. ;ADDED FOR FDOS. ALLOWS 'L' OR 'P' OR 'Q' ONLY
  730. ;LOAD OR PRINT OR QUIT
  731.  
  732. MAIN    CALL    ECHO1
  733.     LXI    H,PROMPT
  734.     CALL    TXTYP
  735.     CALL    CI    ;GET CHAR FROM CONSOLE
  736.     MOV    C,A
  737.     CALL    ECHO1
  738.     MOV    A,C
  739.     CPI    'L'
  740.     JNZ    MAIF
  741.  
  742. ;LOAD FROM DISC OR TAPE
  743.  
  744.     JMP    FDIN
  745.  
  746. PROMPT    DB    '...$'
  747.  
  748. MAIF    CPI    'P'
  749.     JNZ    MAIQ
  750.  
  751. ;PROCESS TEXT AND EMBEDDED COMMANDS
  752.  
  753.     LXI    H,TEXT
  754.     SHLD    APNT
  755.     CALL    CLOS
  756.     CALL    NEWL
  757.     JMP    PRIN
  758.  
  759. MAIQ    CPI    'Q'
  760.     JNZ    MAIN    ;IF NOT L,P,OR Q LOOP
  761.  
  762. ;RETURN TO MONITOR
  763.  
  764.     JMP    RESTRT
  765.  
  766. ;ECHOS ON CONSOLE AND OUTS CRLF
  767.  
  768. ECHO    CALL    CO
  769. ECHO1    PUSH    B
  770.     MVI    C,CR
  771.     CALL    CO
  772.     MVI    C,LF
  773.     CALL    CO
  774.     POP    B
  775.     RET
  776.  
  777. ;OUTPUT CARG RTRN AND LINE FEED TO PRINTER
  778. ;RETURNS WITH CR IN A
  779.  
  780. CRLF    MVI    A,CR
  781.     CALL    OUTW
  782.     MVI    A,LF
  783.     CALL    OUTW
  784.     MVI    A,CR
  785.     RET
  786.  
  787. ;THE COMMAND TABLE IN SYS-8 FORMAT
  788. ;IE TEXT LETTERS HAVE REVERSED ORDER
  789.  
  790. CTAB    DW    'DM'
  791.     DW    DMAR
  792.     DW    'DT'
  793.     DW    DTAB
  794.     DW    'PL'
  795.     DW    DPAG
  796.     DW    'JT'
  797.     DW    TOTJ
  798.     DW    'JE'
  799.     DW    ENDJ
  800.     DW    'JL'
  801.     DW    LEFJ
  802.     DW    'CT'
  803.     DW    CENT
  804.     DW    'LF'
  805.     DW    LNFD
  806.     DW    'DB'
  807.     DW    DBRK
  808.     DW    'BP'
  809.     DW    BRKP
  810.     DW    'NP'
  811.     DW    NPAG
  812.     DW    'CM'
  813.     DW    MIDC
  814.     DW    'PN'
  815.     DW    SETP
  816.     DW    'SP'
  817.     DW    SPAZ
  818.     DW    'PT'
  819.     DW    PGTP
  820.     DW    'PB'
  821.     DW    PGBT
  822.     DW    'TM'
  823.     DW    TMES
  824.     DW    'BM'
  825.     DW    BMES
  826.     DW    'PG'
  827.     DW    FPAG
  828.     DW    'CC'
  829.     DW    CEND
  830.     DW    'OF'
  831.     DW    OPOF
  832.     DW    'ON'
  833.     DW    OPON
  834.     DB    0
  835.  
  836. ;TERMINATE A COMMAND
  837. ;CR,COMMA,SPACE, OR NOTHING ARE OK
  838.  
  839. CTRM    LHLD    APNT
  840.     MOV    A,M
  841.     INX    H
  842.     SHLD    APNT
  843.     CPI    CR
  844.     RZ
  845.     CPI    ' '
  846.     RZ
  847.     CPI    ','
  848.     RZ
  849.     DCX    H
  850.     SHLD    APNT
  851.     RET
  852.  
  853. ;FIND DELIMITER WITHIN A COMMAND
  854. ;SPACE AND COMMA ARE ACCEPTED
  855.  
  856. CDEL    LHLD    APNT
  857.     MOV    A,M
  858.     INX    H
  859.     CPI    ','
  860.     RZ
  861.     CPI    ' '
  862.     RZ
  863.     DCX    H
  864.     RET
  865.  
  866. ;CLOSE OR END CENTER TAB COMMAND
  867.  
  868. CEND    CALL    OUTL
  869.     JMP    CTRM
  870.  
  871. ;IMMEDIATELY FORCE A PAGE START
  872.  
  873. FPAG    CALL    DVDR
  874.     JMP    CTRM
  875.  
  876. ;DEFINE MARGINS. LEFT, RIGHT
  877.  
  878. DMAR    CALL    GARG
  879.     STA    LMAR
  880.     STA    BRTB    ;SET THAT TOO
  881.         CALL    GARG
  882.     STA    RMAR
  883.     CALL    CLOS
  884.     CALL    NEWL
  885.     JMP    CTRM
  886.  
  887. ;DEFINE TABS. TAB1,TAB2,TAB3, ETC. TO 14
  888.  
  889. DTAB    LXI    H,TTAB
  890.     SHLD    TBAD
  891. DTBL    CALL    CDEL
  892.     JNZ    DTBX
  893.     CALL    ADEC
  894.     MOV    A,L
  895.     LHLD    TBAD
  896.     MOV    M,A
  897.     INX    H
  898.     SHLD    TBAD
  899.     JMP    DTBL
  900. DTBX    LHLD    TBAD
  901.     MVI    M,0
  902.     JMP    CTRM
  903.  
  904. ;SET TOTAL JUSTIFICATION MODE
  905.  
  906. TOTJ    MVI    A,2
  907.     STA    JFLG
  908.     JMP    CTRM
  909.  
  910. ;SET LEFT JUSTIFICATION MODE
  911.  
  912. LEFJ    MVI    A,1
  913.     STA    JFLG
  914.     JMP    CTRM
  915.  
  916. ;CLOSE PRESENT LINE AND SET TO NO JUST. MODE
  917.  
  918. ENDJ    XRA    A
  919.     STA    JFLG
  920.     CALL    CLOS
  921.     JMP    CTRM
  922.  
  923. ;CENTER TAB, TAB, MESSAGE TO BE CENTERED
  924.  
  925. CENT    CALL    GARG    ;GET TAB
  926. CENA    STA    CETM
  927.     CALL    CDEL
  928.     JNZ    CTRM
  929.     SHLD    CEPT
  930.     CALL    CLOS
  931. CENP    MVI    C,0
  932.     LHLD    CEPT
  933.  
  934. ;COUNT CHARS IN MESSAGE
  935.  
  936. CECC    MOV    A,M
  937.     INX    H
  938.     CALL    CAPR    ;DO CASE PROCESSING
  939.     JC    CECC    ;LETTER IS TO BE IGNORED
  940.     INR    C
  941.     CPI    CR
  942.     JNZ    CECC
  943.  
  944. ;COMPUTE POSN OF FIRST LETTER OF MESSAGE
  945.  
  946.     MOV    A,C
  947.     ORA    A
  948.     RAR
  949.     MOV    C,A
  950.     LDA    CETM
  951.     SUB    C
  952.  
  953.     SHLD    APNT    ;POINTS PAST MESSAGE
  954. MOVL    LXI    H,OBUF    ;COMPUTE LADR FOR MESSAGE
  955.     CALL    ADAH
  956.     XCHG
  957.     LHLD    CEPT    ;START OF MESSAGE ADDRESS
  958. CEMV    MOV    A,M    ;MOVE IT TO OBUF
  959.     INX    H
  960.     CALL    CAPR    ;DO CASE PROCESSING AGAIN
  961.     JC    CEMV    ;LETTER TO BE IGNORED
  962.     CPI    CR
  963.     RZ
  964.     STAX    D
  965.     INX    D
  966.     JMP    CEMV
  967.  
  968. ;DEFINE PAGE LENGTH
  969.  
  970. DPAG    CALL    GARG
  971.     STA    PLEN
  972.     JMP    CTRM
  973.  
  974. ;LINE FEED COMMAND (IGNORE ZERO LF'S)
  975.  
  976. LNFD    CALL    GARG
  977.     STA    CETM
  978.     CALL    LFDO
  979.     JMP    CTRM
  980.  
  981. ;DO LINE FEEDS AND KEEP TRACK OF POSITION ON PAGE.
  982. ;IF NEW PAGE, REST OF LF COMMAND IS FORGOTTEN
  983.  
  984. LFDO    CALL    CLOS
  985.     LDA    CETM
  986.     ORA    A
  987.     RZ
  988.     MOV    C,A
  989. LFLP    CALL    CRLF
  990.     LDA    PPOS
  991.     INR    A
  992.     STA    PPOS
  993.     LXI    H,PLEN
  994.     CMP    M
  995.     JNC    NEXP
  996.     DCR    C
  997.     RZ
  998.     JMP    LFLP
  999.  
  1000. ;DEFINE A PARAGRAPH BREAK.  LF'S, TAB
  1001.  
  1002. DBRK    CALL    GARG
  1003.     STA    BRLF
  1004.     CALL    GARG
  1005.     STA    BRTB
  1006.     JMP    CTRM
  1007.  
  1008. ;BREAK FOR A NEW PARAGRAPH
  1009.  
  1010. BRKP    CALL    CLOS    ;CLEAR LINE
  1011.     LDA    PPOS    ;GET PAGE POSITION
  1012.     ORA    A
  1013.     JZ    BRKT    ;NO LF AT TOP OF PAGE
  1014.     LDA    BRLF
  1015.     STA    CETM
  1016.     CALL    LFDO
  1017. BRKT    LDA    BRTB
  1018.     CALL    PUTB
  1019.     JMP    CTRM
  1020.  
  1021. ;FORCE BOTTOM PRESENT PAGE AND START NEW ONE
  1022.  
  1023. NPAG    LDA    PAGN
  1024.     ORA    A
  1025.     JZ    DVDR
  1026.     CALL    CLOS
  1027.     CALL    NEWL
  1028.     LDA    PLEN
  1029.     STA    CETM
  1030.     CALL    LFDO
  1031.     JMP    CTRM
  1032.  
  1033. ;CENTER MIDDLE (BETWEEN MARGINS), MESSAGE
  1034.  
  1035. MIDC    LDA    RMAR
  1036.     LXI    H,LMAR
  1037.     SUB    M
  1038.     RAR        ;DIVIDE BY TWO
  1039.     ADD    M
  1040.     CALL    CENA
  1041.     STAX    D
  1042.     JMP    OUTL
  1043.  
  1044. ;PAGE NUMBER
  1045.  
  1046. SETP    CALL    GARG
  1047.     STA    PAGN
  1048.     JMP    CTRM
  1049.  
  1050. ;SET SPACING
  1051.  
  1052. SPAZ    CALL    GARG
  1053.     STA    SPAS
  1054.     JMP    CTRM
  1055.  
  1056. ;DEFINE TOP OF PAGE LENGTH AND ITS LINE OF OCCUPANCE
  1057.  
  1058. PGTP    CALL    GARG
  1059.     STA    TLEN
  1060.     CALL    GARG
  1061.     STA    TOPN
  1062.     JMP    CTRM
  1063.  
  1064. ;DEFINE BOTTOM SAME AS ABOVE
  1065.  
  1066. PGBT    CALL    GARG
  1067.     STA    BLEN
  1068.     CALL    GARG
  1069.     STA    BOTN
  1070.     JMP    CTRM
  1071.  
  1072. ;SET TOP MESSAGE ADDRESS AND THE MESSAGE TAB
  1073.  
  1074. TMES    CALL    GARG
  1075.     STA    TOPT
  1076.     CALL    CDEL
  1077.     JNZ    CTRM
  1078.     SHLD    TOPA
  1079. TMLP    MOV    A,M
  1080.     INX    H
  1081.     CPI    CR
  1082.     JNZ    TMLP
  1083.     SHLD    APNT
  1084.     RET
  1085.  
  1086.  
  1087. ;SET BOTTOM MSG ADDRESS AND MESSAGE TAB
  1088.  
  1089. BMES    CALL    GARG
  1090.     STA    BOTT
  1091.     CALL    CDEL
  1092.     JNZ    CTRM
  1093.     SHLD    BOTA
  1094.     JMP    TMLP
  1095.  
  1096. ;TURN OFF PRINTER OUTPUT
  1097.  
  1098. OPOF    XRA    A    ;ZERO TURNS OFF OUTPUT
  1099.     STA    OPST    ;MARK AT OUTPUT SYATUS
  1100.     JMP    CTRM
  1101.  
  1102. ;TURN ON PRINTER
  1103.  
  1104. OPON    MVI    A,0FFH    ;NON-ZERO MEANS ON
  1105.     STA    OPST    ;MARK AT STATUS
  1106.     JMP    CTRM
  1107.  
  1108. ;GET THE NEXT ARGUMENT
  1109.  
  1110. GARG    CALL    CDEL
  1111.     JNZ    GARE
  1112.     CALL    ADEC
  1113.     MOV    A,H
  1114.     ORA    A
  1115.     MOV    A,L
  1116.     RZ
  1117. GARE    POP    H
  1118.     JMP    CTRM
  1119.  
  1120. ;
  1121. ;I/O ROUTINES
  1122.  
  1123. ;CONSOLE INPUT OF CHARACTER (ECHOS TOO)
  1124.  
  1125. CO    PUSH H! PUSH D! PUSH    B
  1126.     MOV    E,C
  1127.     MVI    C,2
  1128.     CALL    BDOS
  1129.     POP B! POP D! POP H
  1130.     RET
  1131.  
  1132. ;SEND A CHARACTER TO THE PRINTER
  1133.  
  1134. PO    PUSH H! PUSH D! PUSH B
  1135.     MOV    E,C
  1136.     MVI    C,5    ;LIST OUT FUNCTION
  1137.     CALL    BDOS
  1138.     POP B! POP D! POP H
  1139.     RET
  1140.  
  1141. ;GET CHAR FROM CONSOLE
  1142.  
  1143. CI    PUSH H! PUSH D! PUSH B
  1144.  
  1145.     MVI    C,1
  1146.     CALL    BDOS
  1147.     POP B! POP D! POP H
  1148.     RET
  1149.  
  1150. ;TYPE A LINE OF TEXT ON CONSOLE
  1151.  
  1152. TXTYP    PUSH H! PUSH D! PUSH B
  1153.     XCHG
  1154.     MVI    C,9
  1155.     CALL    BDOS
  1156.     POP    B
  1157.     POP    D
  1158.     POP    H
  1159.     RET
  1160.  
  1161. ;INPUT A LINE OF TEXT FROM CONSOLE
  1162.  
  1163. TXTIN    PUSH H! PUSH D! PUSH B
  1164.     LXI    D,CONBUF+65
  1165.     MVI    C,65    ;CLEAR BUFFER TO SPACES
  1166.     MVI    A,' '
  1167. TXTN1    STAX    D
  1168.     DCX    D
  1169.     DCR    C
  1170.     JNZ    TXTN1
  1171.     MVI    C,10
  1172.     CALL    BDOS
  1173.     POP B! POP D! POP H
  1174.     RET
  1175.  
  1176. ;OPEN FILE
  1177.  
  1178. OPENF    LXI    D,INFCB
  1179.     MVI    C,15    ;CPM FUNCTION FOR OPEN
  1180.     CALL    BDOS
  1181.     CPI    255    ;FAILED TO OPEN IF = 255
  1182.     CMC
  1183.     RNZ
  1184.     LXI    H,NOFMS    ;FILE NOT FOUND MSG
  1185.     CALL    TXTYP
  1186.     STC
  1187.     RET
  1188.  
  1189. NOFMS    DB    'FILE NOT FOUND$'
  1190.  
  1191. ;GET A CHARACTER FROM DISK FILE
  1192.  
  1193. GBYT    PUSH    H
  1194.     CALL    DISKIN    ;LIB ROUTINE TO GET BYTE
  1195.     POP    H    ;   FROM DISK FILE
  1196.     RET
  1197.  
  1198. ;INITIALIZE TO READ DISK FILE
  1199.  
  1200. INIR    CALL    ECHO1    ;CRLF TO CONSOLE
  1201.     LXI    H,GREET
  1202.     CALL    TXTYP
  1203.     CALL    TXTIN
  1204.     CALL    ECHO1    ;CRLF TO CONSOLE
  1205.     LXI    H,CONBUF+2    ;+2 FOR COUNTS
  1206.     LXI    D,INFCB        ;  A LA CP/M FORMAT
  1207.     CALL    MTFCB    ;LIB ROUTINE TO MAKE FCB
  1208.     JC    INIR    ;ERROR, TRY AGAIN
  1209.     CALL    OPENF    ;FCB OK, OPEN IT
  1210.     JC    INIR    ;ERROR, TRY AGAIN
  1211.     LXI    H,INBUF+128    ;INIT. FOR DISKIN
  1212.     SHLD    INPTR
  1213.     RET
  1214.  
  1215. GREET    DB    'ENTER FILE NAME  ',0DH,0AH,'$'
  1216.  
  1217.  
  1218. ;PRINTER OUTPUT
  1219.  
  1220. OUTC    CPI    CR
  1221.     JZ    CRLF
  1222. OUTW    PUSH    B
  1223.     ANI    7FH
  1224.     MOV    C,A
  1225.     LDA    OPST    ;TEST IF OUTPUT ON
  1226.     ORA    A
  1227.     CNZ    PO    ;ON IF NON-ZERO
  1228.     CALL    CSTS
  1229.     ORA    A
  1230.     CNZ    ABTST    ;KEY PRESSED ON CONSOLE
  1231.     MOV    A,C
  1232.     POP    B
  1233.     RET
  1234.  
  1235. ;TEST FOR ABORT (CNTRL C)
  1236.  
  1237. ABTST    CALL    CI
  1238.     CPI    3
  1239.     RNZ        ;NOPE
  1240.     JMP    RESTRT    ;RETURN TO CP/M
  1241.  
  1242. ;CONSOLE STATUS CHECK...RETURNS A NON-ZERO
  1243. ;   IF KEY PRESSED AT CONSOLE
  1244.  
  1245. CSTS    PUSH H! PUSH D! PUSH B
  1246.     MVI    C,11
  1247.     CALL    BDOS
  1248.     POP B! POP D! POP H
  1249.     RET
  1250. ;++++++++++++++++++++++++++++++++++++++++++++++
  1251. ;
  1252. ; MAKE CP/M FILE CONTROL BLOCK
  1253. ;
  1254. ; MAKEFCB.LIB  -  VERSION 0.2  -  28 OCT 77
  1255. ;
  1256. ; JEFFREY W. SHOOK
  1257. ; P.O. BOX 185
  1258. ; ROCKY POINT, NEW YORK 11778
  1259. ; (516) 744 7133
  1260. ;
  1261. ;++++++++++++++++++++++++++++++++++++++++++++++
  1262.  
  1263.  
  1264. ; CREATE A CP/M FILE CONTROL BLOCK  FROM
  1265. ; A COMMAND STRING AT THE ADDRESS IN HL
  1266. ; AND PLACE IT AT THE ADDRESS IN DE.  RETURN
  1267. ; WITH THE CARRY SET IF AN ERROR OCCURS.
  1268.  
  1269.  
  1270. ; DEFINITIONS
  1271.  
  1272. FCBSIZ:    EQU    33
  1273. FNMLEN:    EQU    11    ; FILE NAME LENGTH
  1274.  
  1275.  
  1276. MTFCB:    PUSH    H    ; SAVE CMD STRING PTR
  1277.     PUSH    D    ; SAVE FCB ADDRESS
  1278.     
  1279.     LXI    B,FCBSIZ; CLEAR ENTIRE FCB AREA
  1280.     MVI    A,0    ;
  1281.     CALL    FILLB    ;
  1282.  
  1283.     POP    D    ; FILL FILE NAME WITH SPACES
  1284.     PUSH    D    ;
  1285.     INX    D    ;
  1286.     LXI    B,FNMLEN;
  1287.     MVI    A,' '    ;
  1288.     CALL    FILLB    ;
  1289.  
  1290.     POP    D    ; RESTORE POINTERS
  1291.     POP    H    ;
  1292.  
  1293.     CALL    SKIPS    ; SKIP LEADING SPACES
  1294.  
  1295.     INX    H    ; CHECK FOR DISK CODE
  1296.     MOV    A,M    ;
  1297.     DCX    H    ;
  1298.     CPI    ':'    ;
  1299.     JNZ    MTFCB1    ; JUMP ON NO CODE
  1300.  
  1301.     MOV    A,M    ; TEST IF DISK CODE GOOD
  1302.     INX    H    ;
  1303.     INX    H    ;
  1304.     SBI    '@'    ;
  1305.     RC        ; MAKE ERROR RETURN IF BAD
  1306.     CPI    'Z'+1    ;
  1307.     CMC        ;
  1308.     RC        ;
  1309.  
  1310.     STAX    D    ; STORE DISK CODE AT FCB + 0
  1311. MTFCB1:    INX    D    ;
  1312.  
  1313.     MVI    C,8    ; PROCESS FILE NAME FIELD
  1314.     CALL    GETNAM    ;
  1315.  
  1316.     MOV    A,M    ; TEST FOR FILE TYPE SEPARATOR
  1317.     INX    H    ;
  1318.     CPI    '.'    ;
  1319.     JNZ    MTFCB2    ;
  1320.  
  1321.     MVI    C,3    ; PROCESS FILE TYPE FIELD
  1322.     CALL    GETNAM    ;
  1323.     MOV    A,M    ;
  1324.     INX    H    ;
  1325.  
  1326. MTFCB2:    CALL    TERMT    ; TEST FOR CORECT TERMINATOR
  1327.  
  1328.     RET
  1329.  
  1330.  
  1331. ; PROCESS NAME FIELD
  1332.  
  1333. GETNAM:    MOV    A,M    ; GET CHAR FROM CMD STR
  1334.     INX    H    ;
  1335.  
  1336.     CPI    '?'    ; ALLOW AMBIG REFERENCE CHAR
  1337.     JZ    GETNA1    ;
  1338.  
  1339.     CPI    '*'    ; FILL REST WITH ?
  1340.     JZ    GETNA2    ;
  1341.  
  1342.     CALL    VALCHR    ; TEST FOR ALLOWED CHAR IN NAME
  1343.     JC    GETNA3    ;
  1344.  
  1345. GETNA1:    STAX    D    ; STORE CHAR IN TFCB
  1346.     INX    D    ;
  1347.  
  1348.     DCR    C    ; CHECK NAME SIZE
  1349.     JNZ    GETNAM    ;
  1350.     RET        ;
  1351.  
  1352.  
  1353. GETNA2:    MVI    A,'?'    ; FILL REST OF FIELD WITH ?
  1354.     MVI    B,0    ;
  1355.     JMP    FILLB    ;
  1356.  
  1357. GETNA3:    INX    D    ; MOVE FCB PTR TO END OF FIELD
  1358.     DCR    C    ;
  1359.     JNZ    GETNA3    ;
  1360.     DCX    H    ;
  1361.     RET        ;
  1362.  
  1363.  
  1364. ; TEST FOR VALID CHAR IN  NAME FIELD
  1365. ; RETURN WITH CARRY SET IF INVALID.
  1366.  
  1367. VALCHR:    CPI    '*'
  1368.     CMC
  1369.     RZ
  1370.  
  1371.     CPI    ','
  1372.     CMC
  1373.     RZ
  1374.  
  1375.     CPI    '.'
  1376.     CMC
  1377.     RZ
  1378.  
  1379.     CPI    ' '
  1380.     RC
  1381.  
  1382.     CPI    '^'+1
  1383.     CMC
  1384.     RC
  1385.  
  1386.     CPI    ':'
  1387.     CMC
  1388.     RNC
  1389.  
  1390.     CPI    '@'
  1391.     RET
  1392.  
  1393.  
  1394. ; TEST FOR VALID FILENAME TERMINATOR CHAR
  1395. ; RETURN WITH CARRY SET IF INVALID.
  1396.  
  1397. TERMT:    CPI    ' '
  1398.     RZ
  1399.  
  1400.     CPI    ','
  1401.     RZ
  1402.  
  1403.     CPI    CR
  1404.     RZ
  1405.  
  1406.     CPI    ';'
  1407.     RZ
  1408.  
  1409.     STC
  1410.     RET
  1411.  
  1412.  
  1413. ; SKIP SPACES IN CMD STRING
  1414.  
  1415. SKIPS:    MVI    A,' '
  1416. SKIPS1:    CMP    M
  1417.     RNZ
  1418.     INX    H
  1419.     JMP    SKIPS1
  1420.  
  1421.  
  1422. ; FILL BLOCK WITH VALUE
  1423.  
  1424. ; ENTER WITH:
  1425. ; A  = VALUE FOR FILL
  1426. ; DE = START OF BLOCK
  1427. ; BC = LENGTH OF BLOCK
  1428.  
  1429. CLRB:    MVI    A,0
  1430.  
  1431. FILLB:    INR    B
  1432.     DCR    B
  1433.     JNZ    FILLB1
  1434.     INR    C
  1435.     DCR    C
  1436.     RZ
  1437.  
  1438. FILLB1:    STAX    D
  1439.  
  1440.     INX    D
  1441.     DCX    B
  1442.     JMP    FILLB
  1443.  
  1444.  
  1445.  
  1446. ;++++++++++++++++++++++++++++++++++++++++++++++
  1447. ;
  1448. ; SEQUENTIAL DISK CHARACTER INPUT
  1449. ;
  1450. ; DISKIN.LIB  -  VERSION 1.0  -  18 SEP 77
  1451. ;
  1452. ; J.W. SHOOK, P.O. BOX 185, ROCKY POINT, NY 11778
  1453. ;
  1454. ;++++++++++++++++++++++++++++++++++++++++++++++
  1455.  
  1456. ; BEFORE READING A FILE SEQUENTIALLY 
  1457. ; THE FOLLOWING INITIAL CONDITIONS
  1458. ; MUST BE ESTABLISHED.
  1459.  
  1460. ;    1) A CP/M FILE CONTROL BLOCK
  1461. ;       CONTAINING THE FILE NAME MUST
  1462. ;       START AT LOCATION INFCB.
  1463. ;    2) A 128 BYTE BUFFER AREA MUST
  1464. ;       START AT LOCATION INBUF.
  1465. ;    3) THE FILE MUST BE SUCCESSFULLY
  1466. ;       OPENED.
  1467. ;    4) THE NEXT RECORD POINTER IN
  1468. ;       THE FILE CONTROL BLOCK MUST BE
  1469. ;       SET TO ZERO.
  1470. ;    5) THE WORD AT LOCATION INPTR
  1471. ;       MUST BE SET TO INBUF+128 TO
  1472. ;       MARK THE BUFFER AS EMPTY.
  1473. ;    6) TO READ A FILE AGAIN, JUST SET
  1474. ;       NEXT RECORD TO ZERO, AND
  1475. ;       RESET INPTR.
  1476.  
  1477. ; READ CHARACTER FROM FILE
  1478.  
  1479. DISKIN:    LHLD    INPTR    ; TEST BUFFER POINTER
  1480.     LXI    D,-(INBUF+128)
  1481.     DAD    D
  1482.     MOV    A,H
  1483.     ORA    L
  1484.     CZ    RDREC    ; IF EMPTY, READ NEXT RECORD
  1485.     RC        ; RETURN ON BAD READ
  1486.     LHLD    INPTR    ; GET CHAR FROM BUFFER
  1487.     MOV    A,M
  1488.     INX    H    ; MOVE BUFFER POINTER
  1489.     SHLD    INPTR
  1490.     RET
  1491.  
  1492.  
  1493. ; REFILL DISK INPUT BUFFER
  1494.  
  1495. RDREC:    LXI    D,INBUF    ; SET DMA ADDRESS
  1496.     MVI    C,SDMA
  1497.     CALL    BDOS
  1498.     LXI    D,INFCB    ; READ A RECORD
  1499.     MVI    C,READ
  1500.     CALL    BDOS
  1501.     RAR        ; SET CARRY ON BAD READ
  1502.     LXI    H,INBUF    ; SET POINTER TO BUFFER START
  1503.     SHLD    INPTR
  1504.     RET
  1505.  
  1506. ;MESSAGE FOR TELLING OPERATOR ABOUT NEW PAGE
  1507.  
  1508. PAGMS    DB    'PRESS ANY KEY WHEN READY FOR NEW PAGE$'
  1509.  
  1510. ;DEFINE VARIABLES
  1511.  
  1512. RESTRT    EQU    0    ;CPM REBOOT
  1513. BDOS    EQU    5    ;CP/M ENTRY FOR I/O
  1514. READ    EQU    20    ;CP/M READ NEXT RECORD FUNCTION
  1515. SDMA    EQU    26    ;CP/M SET DMA ADDRESS FUNCTION
  1516. CR    EQU    13
  1517. LF    EQU    10
  1518. EOT    DB    0FFH    ;LAST PAGE PRINTED IF ZERO
  1519. OPST    DB    0FFH    ;OUTPUT ON OR OFF STATUS
  1520. TSTG    DB    0    ;TEMP STORAGE FOR BMSG
  1521. CASE    DB    3    ;UPPER CASE LOCK INITIALLY
  1522. SFLP    DB    0    ;FLOP FOR EVERY RND SPACE
  1523. RNDV    DB    5AH    ;SEED FOR RANDOM NUMBER
  1524. LCHR    DB    0    ;LAST CHAR FOR TOTAL JUST.
  1525. CETM    DS    1    ;CENTR TAB OR CHAR COUNT
  1526. CEPT    DS    2    ;CENTR TEXT POINTER
  1527. LMAR    DB    10    ;LEFT MARGIN
  1528. RMAR    DB    70    ;RIGHT MARGIN
  1529. TTAB    DB    15    ;TAB TABLE
  1530.     DB    22
  1531.     DB    30
  1532.     DB    45
  1533.     DB    0
  1534.     DS    10    ;UP TO 15 TABS
  1535. TBAD    DS    2    ;TAB TABLE POINTER
  1536. SPAS    DB    1    ;SPACING
  1537. PLEN    DB    45    ;PAGE LENGTH
  1538. BRLF    DB    1    ;NEW PARAGRAPH LF'S
  1539. BRTB    DB    15    ;NEW PARAGRAPH TAB
  1540. TLEN    DB    10    ;TOP LENGTH
  1541. PAGN    DB    0    ;PAGE NUMBER
  1542. TOPN    DB    0    ;MSG LINE NUMBER
  1543. BOTN    DB    0    ;MESSAGE LINE NUMBE
  1544. TOPA    DS    2    ;MSG ADDR
  1545. BOTA    DS    2    ;MSG ADDR
  1546. TOPT    DB    10    ;TOP TAB
  1547. BOTT    DB    10    ;BOTTOM TAB
  1548. BLEN    DB    10    ;BOTTOM LENGTH
  1549. LPOS    DB    1    ;LINE POSITION
  1550. PPOS    DB    1    ;PAGE POSITION
  1551. JFLG    DB    0    ;NO JUST. INITIALLY
  1552. LADR    DS    2    ;LPOS ADDR
  1553. LEND    DS    2    ;RIGHT MARGIN ADDRESS
  1554. APNT    DS    2    ;INPUT POINTER
  1555. MAXL    DB    135    ;MAXIMUM LINE LENGTH
  1556. TCNT    DB    0    ;OVERFLOW CHAR COUNT
  1557. TEML    DS    30    ;OVERFLOW BUFFER
  1558. OBUF    DS    136    ;OUTPUT BUFFER
  1559. INBUF    DS    128    ;DISK FILE INPUT BUFFER
  1560. INFCB    DS    33    ;FILE CONTROL BLOCK
  1561. CONBUF    DB    64    ;CONSOLE INPUT BUFFER
  1562.     DB    0
  1563.     DS    64
  1564. INPTR    DS    2    ;POINTER FOR DISKIN0V
  1565.     DS    32
  1566. STACK
  1567. TEXT    END        ;TEXT BUFFER STARTS HERE
  1568.  
  1569. MOV    C,A
  1570.     LDA    CASE
  1571.     PUSH    PSW
  1572. BMAL    MVI    A,' '    ;SPACE OVER TO TAB
  1573.     CALL    OUTC
  1574.     DCR    C
  1575.     JNZ    BMAL
  1576. BMSL    MOV    A,M    ;OUTPUT THE MESSAG