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 / ENTERPRS / CPM / UTILS / S / TURBOPAT.ARC / TURBOPAT.Z80 < prev   
Text File  |  1989-09-27  |  13KB  |  534 lines

  1. ;*****************************************************************************
  2. ;*****************************************************************************
  3. ;*                                         *
  4. ;*             TURBOPAT.Z80 VERSION 1.1    (1/85)                 *
  5. ;*                                         *
  6. ;*    TURBOPAT is a public-domain patch to version 2.00A of the         *
  7. ;*    Z-80 CP/M version of TURBO PASCAL released by Borland             *
  8. ;*    International.    It is meant to be assembled by CROWECPM             *
  9. ;*    or an equivalent Z-80 assembler, and installed in TURBO             *
  10. ;*    as a straightforward overlay.  The installation    may be             *
  11. ;*    accomplished with DDT or MLOAD.                         *
  12. ;*        When installed,    TURBOPAT improves TURBO's                    *
  13. ;*    file-handling capability by adding optional entabbing and automatic  *
  14. ;*    detabbing of workfiles,    and by adding 'reName' and 'Update'          *
  15. ;*    commands to the    main menu.  It also modifies the TURBO editor's      *
  16. ;*    'tab' command (i.e. ^I).  TURBO's tab command moves the cursor       *
  17. ;*    to the location    immediately under the next word, but TURBOPAT's      *
  18. ;*    tabs are simply    set every eight    spaces.     See the accompanying         *
  19. ;*    .DOC file for additional information.                     *
  20. ;*        Space is created for TURBOPAT within TURBO by deleting         *
  21. ;*    the little-used    directory command.  The    'X' command may still        *
  22. ;*    be used    to run an external directory program, of course.         *
  23. ;*        It is hoped that TURBOPAT will be of particular    value         *
  24. ;*    to those who wish to use the TURBO editor to write assembly         *
  25. ;*    language programs, which require tabs as field delimiters.         *
  26. ;*    Send comments to the author,                         *
  27. ;*                                         *
  28. ;*            Robert S. Maier                         *
  29. ;*            3607 Greystone Dr. #2222                 *
  30. ;*            Austin,    TX  78731                     *
  31. ;*                                         *
  32. ;*****************************************************************************
  33. ;*****************************************************************************
  34. ;
  35. BLREAD    EQU    247BH
  36. BLOMAX    EQU    7A6DH
  37. PBDOJP    EQU    25DBH
  38. DSKFER    EQU    2606H
  39. DMABUF    EQU    77D8H
  40. MENU    EQU    2177H
  41. POSCUR    EQU    4333H
  42. BEGLIN    EQU    79EEH
  43. RTCHCK    EQU    3AFBH
  44. CHRMOV    EQU    389EH
  45. LINDWN    EQU    36C0H
  46. REPOSI    EQU    3EF2H
  47. TYPE    EQU    225H
  48. COLONI    EQU    215EH
  49. LOFNFT    EQU    2C4BH
  50. FCB0    EQU    4400H
  51. CPMFCB    EQU    5CH
  52. CHGDRV    EQU    2BEFH
  53. RUNFIL    EQU    29B1H
  54. RUNEXT    EQU    2A4EH
  55. OPTION    EQU    2281H
  56. COMPIL    EQU    2730H
  57. SAVFIL    EQU    2541H
  58. EDTFIL    EQU    2A12H
  59. QUIT    EQU    2A3EH
  60. MEMORY    EQU    2648H
  61. COMFIL    EQU    264CH
  62. STARTA    EQU    2658H
  63. ENDADD    EQU    2676H
  64. CHNFIL    EQU    2650H
  65. FNDRTE    EQU    26A4H
  66. CRFFLG    EQU    4401H
  67. SAVACT    EQU    2593H
  68. TOPOFF    EQU    2CB0H
  69. TOPOFG    EQU    2CC0H
  70. MFDRIV    EQU    43DDH
  71. MFLFCB    EQU    43DCH
  72. NFILOP    EQU    24C4H
  73. JMPOFD    EQU    24A6H
  74. OUSTOF    EQU    2509H
  75. WORKFN    EQU    4401H
  76. PROMPT    EQU    2138H
  77. ;
  78. ;
  79. ;MODIFY    THE MENU TO INCORPORATE    NEW COMMANDS
  80. ;
  81.     ORG    2154H
  82.     DEFW    MENUST        ;change    loc of list of menu subroutines
  83. ;
  84.     ORG    2157H
  85.     DEFB    0DH        ;13 commands on    the new    main menu
  86. ;
  87.     ORG    21C5H        ;visibly modify    the menu
  88.     DEFB    8DH
  89.     DEFB    8AH
  90.     DEFB    8AH
  91.     DEFB    'E'+80H
  92.     DEFM    'dit'
  93.     DEFB    9
  94.     DEFB    ' '
  95.     DEFB    'S'+80H
  96.     DEFM    'ave'
  97.     DEFB    9
  98.     DEFB    8
  99.     DEFB    'U'+80H
  100.     DEFM    'pdate'
  101.     DEFB    9
  102.     DEFM    're'
  103.     DEFB    'N'+80H
  104.     DEFM    'ame'
  105.     DEFB    9
  106.     DEFB    'T'+80H
  107.     DEFM    'abs o'
  108. MENUB1:    DEFB    'f'
  109. MENUB2:    DEFB    'f'
  110.     DEFB    0DH
  111.     DEFB    0AH
  112.     DEFB    0AH
  113.     DEFB    'C'+80H
  114.     DEFM    'ompile'
  115.     DEFB    9
  116.     DEFB    ' '
  117.     DEFB    'R'+80H
  118.     DEFM    'un'
  119.     DEFB    9
  120.     DEFB    8
  121.     DEFB    'O'+80H
  122.     DEFM    'ptions'
  123.     DEFB    9
  124.     DEFB    'Q'+80H
  125.     DEFM    'uit'
  126.     DEFB    9
  127.     DEFB    'e'
  128.     DEFB    'X'+80H
  129.     DEFM    'ecute'
  130. ;
  131.     ORG    234BH
  132.     LD    HL,MENUCP    ;change    loc of list of options menu commands
  133.     LD    DE,MENUSU    ;and corresponding subroutines
  134. ;
  135.     ORG    2368H
  136. MENUCO:    DEFM    'ULWRXTON'       ;main menu commands
  137. MENUCP:    DEFM    'MCSEQ'         ;main and options menu commands
  138.     DEFM    'HF'            ;options menu commands
  139. ;
  140. MENUST:    DEFW    UPDATE        ;following sbrtns are for main menu
  141.     DEFW    CHGDRV
  142.     DEFW    LOADF
  143.     DEFW    RUNFIL
  144.     DEFW    RUNEXT
  145.     DEFW    TOGTAB
  146.     DEFW    OPTION
  147.     DEFW    RENAME
  148.     DEFW    MAINFL
  149.     DEFW    COMPIL
  150.     DEFW    SAVER
  151.     DEFW    EDTFIL
  152.     DEFW    QUIT
  153. MENUSU:    DEFW    MEMORY        ;following sbrtns are for options menu
  154.     DEFW    COMFIL
  155.     DEFW    STARTA
  156.     DEFW    ENDADD
  157.     DEFW    QUITME
  158.     DEFW    CHNFIL
  159.     DEFW    FNDRTE
  160.  
  161. QUITME:    POP    HL            ;foll. routines    are unchanged from
  162.     JP    MENU            ;TURBO,    but are    shifted    by one byte
  163.                     ;as the    above tables are too long
  164. MAINFL:    CALL    TYPE
  165.     DEFB    0DH
  166.     DEFB    0AH
  167.     DEFM    'Main file name'
  168.     DEFB    0
  169.     CALL    TOPOFG
  170.     CALL    COLONI
  171.     LD    A,0
  172.     LD    (MFDRIV),A
  173.     RET    Z
  174.     CALL    LOFNFT
  175.     LD    DE,MFLFCB
  176.     LD    HL,CPMFCB
  177.     LD    BC,24H
  178.     LDIR
  179.     RET
  180.  
  181. LOADF:    LD    HL,NFILOP
  182.     LD    (JMPOFD),HL
  183.     CALL    OUSTOF
  184.     CALL    TYPE
  185.     DEFB    0DH
  186.     DEFB    0AH
  187.     DEFM    'Work file name'
  188.     DEFB    0
  189.     CALL    COLONI
  190.     LD    A,0
  191.     LD    (WORKFN),A
  192.     CALL    Z,TOPOFF    ;slight    mod here which saves
  193.     JP    Z,PROMPT    ;abovementioned    byte
  194.     NOP
  195. ;
  196. ;
  197.     ORG    234CH
  198.     DEFW    MENUCP        ;modify    loc of the list    of optionsmenu subs
  199. ;
  200. ;
  201. ;PATCH IN THE INITIALIZATION ROUTINE FOR THE READ SUBROUTINE
  202.     ORG    2477H
  203.     JR    PTCHER           ;input to init req'd for read patch
  204.     NOP
  205. PTCINO:    NOP               ;output from init req'd for read patch
  206. ;
  207. ;PATCH IN THE NEW READ SUBROUTINE ITSELF
  208.     ORG    2495H
  209.     JP    INPTCH
  210. ;
  211. PTCHER:                  ;init patch for read sbrtn
  212.     LD    (BLOMAX),BC
  213.     EXX
  214.     LD    L,7          ;set L'=00000111b as tabs every 8 spaces
  215.     LD    DE,0          ;reset col counter (D') and quote    flag
  216.     EXX
  217.     JR    PTCINO+1
  218. ;
  219. ;PATCH TO THE SAVE SUBROUTINE
  220.     ORG    SAVACT+4
  221.     JP    SAVPAT
  222. ;
  223. ;PATCH IN THE NEW WRITE    SUBROUTINE
  224.     ORG    25B3H
  225.     JP    INITI
  226. PWRIC:    JP    WRIC        ;target    of jp is mod by    T command
  227. TABFLG:    DEFB    0FFH        ;tab flag shows    whether    tabbing    enabled
  228. DSKOT:    PUSH    BC        ;foll. subrtn taken from TURBO
  229.     PUSH    HL
  230.     LD    C,15H
  231.     CALL    PBDOJP
  232.     POP    HL
  233.     POP    BC
  234.     OR    A
  235.     JR    NZ,DSKFER
  236.     LD    DE,DMABUF
  237.     LD    A,B
  238.     LD    B,80H
  239.     CP    1AH
  240.     JP    NZ,WRIA
  241. EOF:    LD    A,B
  242.     SUB    80H
  243.     LD    A,1AH
  244.     JR    NZ,PWRIC
  245.     NOP
  246. ;
  247. ;The foll. subroutines are placed where    TURBO located its directory
  248. ;subroutine, i.e. the subroutine handling the 'D' command.
  249. ;
  250. ;
  251.     ORG    2AB4H
  252.  
  253. ;START OF ENTAB    ON/OFF TOGGLE SUBROUTINE
  254. ;
  255. TOGTAB:    LD    BC,TABFLG       ;check whether entabbing on
  256.     LD    A,(BC)
  257.     OR    A
  258.     JR    Z,TURNON
  259.     LD    DE,OFFVAL       ;if on, get loc of table of substitutes
  260.     JR    CONTIN
  261. TURNON:    LD    DE,ONVAL       ;if off, get    (different) values for same
  262. CONTIN:    CPL
  263.     LD    (BC),A
  264.     LD    HL,BYTESL       ;get    loc of table of    bytes to change
  265.     LD    B,5           ;5 bytes to be modified
  266. MOVBYT:    LD    A,(DE)           ;get    new value for byte
  267.     INC    DE           ;move to next in table
  268.     PUSH    BC
  269.     LD    C,(HL)
  270.     INC    HL
  271.     LD    B,(HL)
  272.     INC    HL
  273.     LD    (BC),A           ;load new value into    spec byte
  274.     POP    BC
  275.     DJNZ    MOVBYT           ;repeat
  276.     JP    MENU           ;when fin, jp to menu
  277.  
  278. BYTESL:    DEFW    MENUB1
  279.     DEFW    MENUB2
  280.     DEFW    PWRIC+1
  281.     DEFW    PWRIC+2
  282.     DEFW    JUMPER+1
  283.  
  284. OFFVAL:    DEFM    'n '
  285.     DEFW    OWRIC
  286.     DEFB    69H        ;this is OWRIC-JUMPER-2
  287.  
  288. ONVAL:    DEFM    'ff'
  289.     DEFW    WRIC
  290.     DEFB    0
  291.  
  292. ;START OF NEW WRITE SUBROUTINE
  293. ;
  294. INITI:
  295.     LD    B,80H        ;reset relative    location in write buffer
  296.     EXX
  297.     LD    DE,0        ;reset blank and column    counters
  298.     LD    HL,0107H    ;set ' flag and    set columns every 8 spaces
  299.     EXX
  300.  
  301. WRIA:
  302.     LD    A,(HL)        ;store file char in A
  303.     INC    HL        ;bump position in file
  304. JUMPER:    JR    NEXINS        ;jump to next instr unless ENTAB disabled
  305. NEXINS:    PUSH    BC        ;Save current rel loc (unprimed    B)
  306.     EXX
  307.     BIT    0,H        ;test bit 0 of H', i.e.
  308.                 ;test whether quoteflag    set
  309.     JR    NZ,QUOTAT    ;IF ' FLAG SET,    DON'T tabify
  310.     CP    ' '             ;20H
  311.     JR    Z,BLANKS    ;if flag not set and char=blank, jp to sbrtn
  312. QUOTAT:    CP    ' '
  313.     JR    C,NOPRNT    ;if char nonprintable, jump to subroutine
  314.     CP    27H        ;if char is a quotation    mark,
  315.     JR    NZ,NOQUOT
  316.     LD    H,1        ;set ' flag (H')
  317. NOQUOT:    INC    E        ;bump col counter (E')
  318.     JR    CHRSO        ;jump to 'characters out' subrtn
  319.  
  320. NOPRNT:    CP    0DH
  321.     JR    Z,CARRE        ;if char is <cr> then jump to appr subrtn
  322.  
  323. CHRSO:    LD    C,A        ;OUTPUT    CHARACTERS SUBROUTINE
  324.     LD    A,D        ;test blank counter (D')
  325.     OR    A
  326.     JR    NZ,BLASTR    ;if string blanks stored, output them instead
  327.     LD    A,C
  328.  
  329. CHRSP:    POP    BC        ;clean up stack
  330.     EXX            ;otherwise
  331.     LD    (DE),A        ;load char immy    into write buffer and
  332.     INC    DE        ;bump position in write    buffer
  333.     JR    PREOT1        ;and jump to pre-output    (of patch) sbrtn
  334.  
  335. CARRE:                ;<cr> output sbrtn
  336.     LD    DE,0        ;RESET COLUMN, BLANK COUNTERS
  337.     LD    H,0        ;RESET ' FLAG
  338.     JR    CHRSP
  339.  
  340. BLANKS:
  341.     INC    D        ;bump blank counter  (D')
  342.     INC    E        ;bump column counter (E')
  343.     LD    A,E
  344.     AND    L        ;AND the column    (E') with 07h (i.e. L')
  345.                 ;i.e. test whether column=0 (mod 8)
  346.     JR    NZ,NOCTLI    ;if so,    subst. TAB for the blanks
  347.     LD    D,0        ;reset blanks counter (D')
  348.     LD    A,9        ;use TAB as the    char to    be written to file
  349.     JR    CHRSP        ;write it
  350.  
  351. NOCTLI:    POP    BC        ;clean up stack
  352.     EXX
  353.     JR    WRIA        ;blank not output, so get another char
  354.  
  355. BLASTR:
  356.     POP    BC        ;pop (from BC) into BC' e.g. the rel buf loc.
  357.     LD    A,B        ;from the rel loc in write buffer
  358.     SUB    D        ;subtract the contents of blank-counter    (D')
  359.     LD    C,D        ;if they'll all fit into write buffer use
  360.     JR    NC,ALLFIT    ;D' as the no. of blanks.
  361.     LD    C,B        ;Otherwise use the no. of bytes    left in    buffer
  362. ALLFIT:    LD    A,B        ;Begin the blank-string    subrtn proper.
  363.     SUB    C        ;Subtr from B' the no. of blnks    to be output
  364.     LD    B,A        ;compute new buffer rel    loc, place in B'
  365.     LD    A,D
  366.     SUB    C
  367.     LD    D,A        ;reset the blank-counter D' (poss not to 0)
  368.     DEC    E        ;dec column counter as file char isn't written
  369.     PUSH    BC        ;save the new buffer rel loc from B'
  370.     EXX
  371.     POP    BC        ;and pop it back into unprimed B, and C' to C
  372.     DEC    HL        ;decrement HL to consider the filechar again
  373.     LD    A,' '   ;20H
  374.  
  375. BLALOO:                   ;output the string of blanks to write buffer
  376.     LD    (DE),A
  377.     INC    DE
  378.     DEC    C           ;C' was used to specify the no. to be output
  379.     JR    NZ,BLALOO
  380.  
  381. PREOT:    INC    B           ;inc b as it was    decremented by 1 too much
  382. PREOT1:    DJNZ    CLZTST           ;if write buffer    full,write it to disk
  383.     LD    B,A
  384.     JP    DSKOT
  385.  
  386. CLZTST:    CP    1AH           ;otherwise check    whether    filechar was ^Z
  387.     JR    NZ,WRIA           ;if no EOF char,    get next char and repeat
  388.     JP    EOF           ;if filechar was    EOF then jp to appr sbrtn
  389. ;
  390. ;
  391. WRIC:    PUSH    BC           ;Save current rel loc in    buffer
  392.     EXX
  393.     JR    CHRSO
  394. ;
  395. OWRIC:    LD    (DE),A           ;this sbrtn substs for WRIC if ENTAB
  396.     INC    DE           ;is not enabled.     I.e. it is what orig.
  397.     JR    PREOT1           ;appeared in TURBO.
  398. ;
  399. ;
  400. ;
  401. ;START OF NEW READ SUBROUTINE
  402. ;
  403. INPTCH:                   ;B is no. of chars in read buffer
  404.     LD    A,(DE)           ;get char fr read buffer
  405.     AND    7FH           ;strip bit 7
  406.     CP    ' '     ;20H
  407.     JR    C,NOTPRN       ;if not printable, jp
  408.     EXX
  409.     CP    27H
  410.     JR    NZ,BMPLOD      ;if char    is not ', bump the col counter
  411.     LD    A,E           ;i.e. D' and load it into the file in
  412.     CPL               ;memory.     If it is ',
  413.     LD    E,A           ;complement the quoteflag (E')
  414.     LD    A,27H
  415.     JR    BMPLOD
  416.  
  417. NOTPRN:    CP    0DH           ;<CR>?
  418.     JR    NZ,NOTCR       ;if so,
  419.     EXX
  420.     LD    DE,0           ;reset column counter (D') and quoteflag (E')
  421.     JR    EXLOAD
  422.  
  423. NOTCR:    CP    1AH
  424.     RET    Z           ;if eof reached,    ret immy
  425.     EXX
  426.     BIT    0,E           ;test whether quote flag    is set
  427.     JR    NZ,EXLOAD      ;if quote flag set, don't expand tabs
  428.     CP    9           ;if a tab, expand it
  429.     JR    NZ,EXLOAD
  430.  
  431. EXPTAB:                  ;EXPAND TAB INTO SPACES
  432.     LD    A,D
  433.     CPL              ;Compute no. of spaces
  434.     AND    L          ;L' contains 07h permanently
  435.     LD    B,A          ;and place in B'
  436.     LD    A,' '   ;20H
  437.     JR    Z,BMPLOD
  438.  
  439. TABLP:                  ;tab loop    sbrtn; outputs the spaces
  440.     EXX
  441.     LD    (HL),A
  442.     INC    HL          ;bump position in    file in    memory
  443.     EXX
  444.     INC    D          ;bump col    counter
  445.     DJNZ    TABLP          ;B' contained no. of spaces to be    output
  446.  
  447. BMPLOD:    INC    D          ;bump col    counter    (I.e. D')
  448. EXLOAD:
  449.     EXX
  450.     LD    (HL),A          ;load char fr. buffer to file
  451.     INC    HL
  452.     INC    DE
  453.     DJNZ    INPTCH          ;dec b (orig.80H)    and repeat
  454.     JP    BLREAD          ;when finished w/    buffer,    read next blk
  455. ;
  456. ;START OF THE NEW RENAME COMMAND SUBROUTINE
  457. ;
  458. RENAME:    LD    A,(CRFFLG)    ;if 'current wfile flag' not set,
  459.     OR    A        ;then no current wfile
  460.     JR    Z,PMENU        ;so jump back to menu
  461.     CALL    TYPE
  462.     DEFB    0DH
  463.     DEFB    0AH
  464.     DEFM    'New name'
  465.     DEFB    0
  466.     CALL    COLONI        ;call colon + input sbrtn
  467.     CALL    LOFNFT        ;load new fn.ft
  468.     JR    Z,PMENU
  469.     LD    DE,FCB0        ;move new fn.ft    from FCB to TURBO's storage
  470.     LD    HL,CPMFCB
  471.     LD    BC,24H
  472.     LDIR
  473. PMENU:    JP    MENU        ;jp back to TURBO main menu
  474.  
  475. ;START OF THE NEW UPDATE COMMAND
  476. ;
  477. UPDATE:    LD    A,13H
  478.     LD    (SAVACT),A    ;delete    file, not rename
  479. SAVER:    LD    A,(CRFFLG)    ;test whether a    current    workfile
  480.     OR    A
  481.     JR    Z,PMENU        ;if not    return to menu
  482.     JP    SAVFIL        ;otherwise save/update the file
  483. ;
  484. ;START OF THE PATCH TO SAVE ROUTINE
  485. ;
  486. SAVPAT:    LD    HL,(4427H)
  487.     PUSH    AF
  488.     LD    A,17H
  489.     LD    (SAVACT),A    ;restore rename, not delete
  490.     POP    AF
  491.     JP    SAVACT+7
  492. ;
  493. ;
  494. ;A PATCH WHICH ADJUSTS FOR THE NEW LOCATION OF THE 'LOADF' SUBRTN
  495. ;
  496.     ORG    2C7BH
  497.     CALL    LOADF
  498. ;
  499. ;START OF THE PATCH TO THE TAB EDIT COMMAND
  500. ;
  501.     ORG    3985H
  502. TABCO:    LD    HL,(POSCUR)    ;get curr cursor    pos in linbuf
  503.     LD    DE,BEGLIN      ;get beginning of linbuf
  504.     OR    A           ;reset C    flag
  505.     SBC    HL,DE
  506.     LD    A,L           ;calc rel pos in    linbuf
  507.     LD    H,11111000B    ;mask off first 5 bits
  508.     AND    H
  509.     LD    H,7
  510.     DEFB    84H           ;this is    'ADD H' instruction
  511.     LD    H,0
  512.     LD    L,A
  513.     ADD    HL,DE           ;compute    new pos    in linbuf
  514.     CALL    RTCHCK           ;add 1 and check    whether    at rt end
  515.     RET    NC           ;if so ret immy
  516.     JP    CHRMOV           ;if otherwise, implement    shift
  517. ;
  518. ;a slight mod to the <CR> edit command follows.     This will cause
  519. ;the auto-indent feature to work correctly.
  520. ;
  521.     ORG    381DH
  522.     JP    TABCO
  523. ;
  524. ;Initialise the    auto-indent flag to 'off' instead of 'on',
  525. ;as TURBO originally had it.  (This is a matter    of personal
  526. ;preference!)
  527.     ORG    435AH
  528.     DEFB    1
  529.     END
  530.  
  531.  
  532.  
  533.  
  534.