home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / mbug / mbug039.arc / CPMMAC.LIB < prev    next >
Text File  |  1979-12-31  |  13KB  |  1,115 lines

  1. ;;Macro Library for CP/M system routines
  2. ;;(11th June, 1985)
  3. ;;
  4. ;;Macros in this library:
  5. ;;
  6. ;
  7. ;
  8. EOF    EQU    1AH
  9. ESC    EQU    1BH
  10. CR    EQU    13
  11. LF    EQU    10
  12. TAB    EQU    9
  13. BLANK    EQU    32
  14. PERIOD    EQU    46
  15. COMMA    EQU    44
  16. ;
  17. VERSN    MACRO    NUM
  18. ;;
  19.     LOCAL    AROUND
  20.     JMP    AROUND
  21.     DB    'Ver',NUM
  22. AROUND:
  23.     ENDM
  24. ;
  25. ENTER    MACRO
  26.     LXI    H,0
  27.     DAD    SP
  28.     SHLD    OLDSTK
  29.     LXI    SP,STACK
  30.     ENDM
  31. ;
  32. EXIT    MACRO    WHERE?,SPACE?
  33.     LHLD    OLDSTK
  34.     SPHL
  35.     IF    NUL WHERE?
  36.     RET
  37.     ELSE
  38.     JMP    WHERE?
  39.     ENDIF
  40. ;
  41. OLDSTK:    DS    2
  42.     IF    NUL SPACE?
  43.     DS    34
  44.     ELSE
  45.     DS    SPACE?
  46.     ENDIF
  47. STACK:
  48.     ENDM
  49. ;
  50. UCASE    MACRO    REG
  51.     LOCAL    NOTUP?
  52.     IF    NOT NUL REG
  53.     PUSH    PSW
  54.     MOV    A,REG
  55.     ENDIF
  56.     CPI    'Z'+7
  57.     JC    NOTUP?
  58.     ANI    5FH
  59. NOTUP?:
  60.     IF    NOT NUL REG
  61.     MOV    REG,A
  62.     POP    PSW
  63.     ENDIF
  64.     ENDM
  65. ;
  66. READCH    MACRO    REG
  67.     LOCAL    AROUND
  68.     CALL    RDCH?
  69.     IF    NOT NUL REG
  70.     MOV    REG,A
  71.     ENDIF
  72.     IF    NOT CIFLAG
  73.     JMP    AROUND
  74. RDCH?:    SYSF    1
  75. CIFLAG    SET    TRUE
  76.     ENDIF
  77. AROUND:
  78.     ENDM
  79. ;
  80. FILL    MACRO    ADDR,BYTES,CHAR
  81.     LOCAL    AROUND
  82.     PUSH    H
  83.     PUSH    B
  84.     IF    NOT NUL ADDR
  85.     LXI    H,ADDR
  86.     ENDIF
  87.     MVI    C,BYTES
  88.     MVI    A,CHAR
  89.     CALL    FILL2?
  90.     POP    B
  91.     POP    H
  92.     IF    NOT FLFLAG
  93.     JMP    AROUND
  94. FILL2?:
  95.     MOV    M,A
  96.     INX    H
  97.     DCR    C
  98.     JNZ    FILL2?
  99.     RET
  100. FLFLAG    SET    TRUE
  101.     ENDIF
  102. AROUND:
  103.     ENDM
  104. ;
  105. COMPAR    MACRO    FIRST,SECOND,BYTES
  106. ;
  107.     LOCAL    MESG,AROUND
  108.     PUSH    H
  109.     PUSH    D
  110.     PUSH    B
  111.     IF    NUL BYTES
  112.     LXI    H,MESG
  113.     MVI    C,AROUND-MESG
  114.     ELSE
  115.     IF    NOT NUL FIRST
  116.     LXI    H,FIRST
  117.     ENDIF
  118.     IF    NOT NUL BYTES
  119.     MVI    C,BYTES
  120.     ENDIF
  121.     ENDIF
  122.     IF    NOT NUL SECOND
  123.     LXI    D,SECOND
  124.     ENDIF
  125.     CALL    COMP2?
  126.     POP    B
  127.     POP    D
  128.     POP    H
  129.     IF    NOT CMFLAG OR NUL BYTES
  130.     JMP    AROUND
  131.     ENDIF
  132.     IF    NOT CMFLAG
  133. COMP2?:
  134.     LDAX    D
  135.     CMP    M
  136.     RNZ
  137.     INX    H
  138.     INX    D
  139.     DCR    C
  140.     JNZ    COMP2?
  141.     RET
  142. CMFLAG    SET    TRUE
  143.     ENDIF
  144.     IF    NUL BYTES
  145. MESG:    DB    FIRST
  146.     ENDIF
  147. AROUND:
  148.     ENDM
  149. ;
  150. COMPRA    MACRO    FIRST,SECOND,BYTES
  151. ;
  152.     LOCAL    MESG,AROUND
  153.     PUSH    H
  154.     PUSH    D
  155.     PUSH    B
  156.     IF    NUL BYTES
  157.     LXI    H,MESG
  158.     MVI    C,AROUND-MESG
  159.     ELSE
  160.     IF    NOT NUL FIRST
  161.     LXI    H,FIRST
  162.     ENDIF
  163.     IF    NOT NUL C
  164.     MVI    C,BYTES
  165.     ENDIF
  166.     ENDIF
  167.     IF    NOT NUL SECOND
  168.     LXI    D,SECOND
  169.     ENDIF
  170.     CALL    COMP2?
  171.     POP    B
  172.     POP    D
  173.     POP    H
  174.     IF    NOT CMFLAG OR NUL BYTES
  175.     JMP    AROUND
  176.     ENDIF
  177.     IF    NOT CMFLAG
  178. COMP2?:
  179.     LDAX    D
  180.     ANI    7FH
  181.     PUSH    B
  182.     MOV    C,A
  183.     MOV    A,M
  184.     ANI    7FH
  185.     CMP    C
  186.     POP    B
  187.     RNZ
  188.     INX    H
  189.     INX    D
  190.     DCR    C
  191.     JNZ    COMP2?
  192.     RET
  193. CMFLAG    SET    TRUE
  194.     ENDIF
  195.     IF    NUL BYTES
  196. MESG:    DB    FIRST
  197.     ENDIF
  198. AROUND:
  199.     ENDM
  200. ;
  201. AMBIG    MACRO    OLD,NEW
  202.     PUSH    H
  203.     PUSH    D
  204.     PUSH    B
  205.     LXI    H,NEW+1
  206.     LXI    D,OLD+1
  207.     MVI    C,11
  208. AMB2?:
  209.     MVI    A,'?'
  210.     CMP    M
  211.     JNZ    AMB3?
  212.     LDAX    D
  213.     MOV    M,A
  214. AMB3?:
  215.     INX    H
  216.     INX    D
  217.     DCR    C
  218.     JNZ    AMB2?
  219.     POP    B
  220.     POP    D
  221.     POP    H
  222.     ENDM
  223. ;
  224. UPPER    MACRO    REG
  225.     IF    NOT NUL REG
  226.     PUSH    PSW
  227.     MOV    A,REG
  228.     ENDIF
  229.     RAR
  230.     RAR
  231.     RAR
  232.     RAR
  233.     ANI    0FH
  234.     IF    NOT NUL REG
  235.     MOV    REG,A
  236.     POP    PSW
  237.     ENDIF
  238.     ENDM
  239. ;
  240. SBC    MACRO
  241.     SBC    HL,DE
  242.     MOV    A,L
  243.     SUB    E
  244.     MOV    L,A
  245.     MOV    A,H
  246.     SBB    D
  247.     MOV    H,A
  248.     ENDM
  249. ;
  250. SYSF    MACRO    FUNC,AE
  251.     PUSH    H
  252.     PUSH    D
  253.     PUSH    B
  254.     MVI    C,FUNC
  255.     IF    NOT NUL AE
  256.     MOV    E,A
  257.     PUSH    PSW
  258.     CALL    BDOS
  259.     POP    PSW
  260.     ELSE
  261.     CALL    BDOS
  262.     ENDIF
  263.     POP    B
  264.     POP    D
  265.     POP    H
  266.     RET
  267.     ENDM
  268. ;
  269. PCHAR    MACRO    PAR
  270.     LOCAL    AROUND
  271.     IF    NOT NUL PAR
  272.     MVI    A,PAR
  273.     ENDIF
  274.     CALL    PCH2?
  275.     IF    NOT COFLAG
  276.     JMP    AROUND
  277. PCH2?:    SYSF    2,AE
  278. COFLAG    SET    TRUE
  279.     ENDIF
  280. AROUND:
  281.     ENDM
  282. ;
  283. CRLF    MACRO
  284.     LOCAL    AROUND
  285.     CALL    CRLF2?
  286.     IF    NOT CRFLAG
  287.     JMP    AROUND
  288. CRLF2?:
  289.     PUSH    PSW
  290.     PCHAR    CR
  291.     PCHAR    LF
  292.     POP    PSW
  293.     RET
  294. CRFLAG    SET    TRUE
  295.     ENDIF
  296. AROUND:
  297.     ENDM
  298. ;
  299. PRINT    MACRO    TEXT,BYTES
  300.     LOCAL    AROUND,MESG
  301.     PUSH    H
  302.     PUSH    B
  303.     IF    NUL BYTES
  304.     LXI    H,MESG
  305.     MVI    B,AROUND-MESG
  306.     ELSE
  307.     IF    NOT NUL TEXT
  308.     LXI    H,TEXT
  309.     ENDIF
  310.     MVI    B,BYTES
  311.     ENDIF
  312.     CALL    PBUF?
  313.     POP    B
  314.     POP    H
  315.     IF    NOT PRFLAG OR NUL BYTES
  316.     JMP    AROUND
  317.     ENDIF
  318.     IF    NOT PRFLAG
  319. PBUF?:    MOV    A,M
  320.     PCHAR
  321.     INX    H
  322.     DCR    B
  323.     JNZ    PBUF?
  324.     RET
  325. PRFLAG    SET    TRUE
  326.     ENDIF
  327.     IF    NUL BYTES
  328. MESG:    DB    TEXT
  329.     ENDIF
  330. AROUND:
  331.     ENDM
  332. ;
  333. OUTHEX    MACRO    REG
  334.     LOCAL    AROUND,HEX1?,HEX2?
  335.     IF    NOT NUL REG
  336.     MOV    A,REG
  337.     ENDIF
  338.     CALL    OUTHX?
  339.     IF    NOT CXFLAG
  340.     JMP    AROUND
  341. OUTHX?:    PUSH    B
  342.     MOV    C,A
  343.     RAR
  344.     RAR
  345.     RAR
  346.     RAR
  347.     CALL    HEX1?
  348.     MOV    A,C
  349.     CALL    HEX1?
  350.     MOV    A,C
  351.     POP    B
  352.     RET
  353. HEX1?:    ANI    0FH
  354.     ADI    '0'
  355.     CPI    '9'+1
  356.     JC    HEX2?
  357.     ADI    'A'-'9'-1
  358. HEX2?:
  359.     PCHAR
  360.     RET
  361. CXFLAG    SET    TRUE
  362.     ENDIF
  363. AROUND:
  364.     ENDM
  365. ;
  366. CPMVER    MACRO
  367.     PUSH    H
  368.     PUSH    D
  369.     PUSH    B
  370.     MVI    C,12
  371.     CALL    BDOS
  372.     MOV    A,L
  373.     POP    B
  374.     POP    D
  375.     POP    H
  376.     ENDM
  377. ;
  378. READB    MACRO
  379.     LOCAL    AROUND,RBUFM,RBUF,RBUFC,RBUFE
  380.     CALL    RDB2?
  381.     IF    NOT RCFLAG
  382.     JMP    AROUND
  383. RDB2?:
  384.     PUSH    H
  385.     PUSH    D
  386.     PUSH    B
  387.     LXI    D,RBUFM
  388.     MVI    C,10
  389.     CALL    BDOS
  390.     LXI    H,RBUFM+2
  391.     SHLD    RBUFM-2
  392.     POP    B
  393.     POP    D
  394.     POP    H
  395.     RET
  396. GETCH:
  397.     LDA    RBUFC
  398.     SUI    1
  399.     RC
  400.     STA    RBUFC
  401.     PUSH    H
  402.     LHLD    RBUFP
  403.     MOV    A,M
  404.     INX    H
  405.     SHLD    RBUFP
  406.     POP    H
  407.     RET
  408. RCFLAG    SET    TRUE
  409. RBUFP:    DW    RBUF
  410. RBUFM:    DB    RBUFE-RBUF
  411. RBUFC:    DS    1
  412. RBUF:    DS    16
  413. RBUFE:
  414.     ENDIF
  415. AROUND:
  416.     ENDM
  417. ;
  418. HEXHL    MACRO
  419.     LOCAL    AROUND,RDHL2,NIB?
  420.     CALL    RDHL?
  421.     IF    NOT HXFLAG
  422.     JMP    AROUND
  423. RDHL?:
  424.     LXI    H,0
  425. RDHL2:
  426.     CALL    GETCH
  427.     CMC
  428.     RNC
  429.     UCASE
  430.     CALL    NIB?
  431.     RC
  432.     DAD    H
  433.     DAD    H
  434.     DAD    H
  435.     DAD    H
  436.     ORA    L
  437.     MOV    L,A
  438.     JMP    RDHL2
  439. NIB?:    SUI    '0'
  440.     RC
  441.     CPI    'F'-'0'+1
  442.     CMC
  443.     RC
  444.     CPI    10
  445.     CMC
  446.     RNC
  447.     SUI    'A'-'9'-1
  448.     CPI    10
  449.     RET
  450. HXFLAG    SET    TRUE
  451.     ENDIF
  452. AROUND:
  453.     ENDM
  454. ;
  455. LCHAR    MACRO    PAR
  456.     LOCAL    AROUND
  457.     IF    NOT NUL PAR
  458.     MVI    A,PAR
  459.     ENDIF
  460.     CALL    LCH2?
  461.     IF    NOT LOFLAG
  462.     JMP    AROUND
  463. LCH2?:    SYSF    5,AE
  464. LOFLAG    SET    TRUE
  465.     ENDIF
  466. AROUND:
  467.     ENDM
  468. ;
  469. ERRORM    MACRO    TEXT,WHERE
  470.     CRLF
  471.     PRINT    <TEXT>
  472.     IF    NUL WHERE
  473.     JMP    BOOT
  474.     ELSE
  475.     JMP    WHERE
  476.     ENDIF
  477.     ENDM
  478. ;
  479. OPEN    MACRO    POINTR,WHERE
  480.     LOCAL    AROUND
  481.     LXI    D,POINTR
  482.     XRA    A
  483.     STA    POINTR+12
  484.     STA    POINTR+32
  485.     CALL    OPEN2?
  486.     INR    A
  487.     JNZ    AROUND
  488.     IF    NUL WHERE
  489.     ERRORM    'No SOURCE file',DONE
  490.     ELSE
  491.     JMP    WHERE
  492.     ENDIF
  493.     IF    NOT OPFLAG
  494. OPEN2?:    SYSF    15
  495. OPFLAG    SET    TRUE
  496.     ENDIF
  497. AROUND:
  498.     ENDM
  499. ;
  500. SETDMA    MACRO    POINTR
  501.     LOCAL    AROUND
  502.     IF    NOT NUL POINTR
  503.     LXI    D,POINTR
  504.     ENDIF
  505.     CALL    DMA2?
  506.     IF    NOT DMFLAG
  507.     JMP    AROUND
  508. DMA2?:
  509.     SYSF    26
  510. DMFLAG    SET    TRUE
  511.     ENDIF
  512. AROUND:
  513.     ENDM
  514. ;
  515. READS    MACRO    POINTR,STAR
  516.     LOCAL    AROUND
  517.     IF    NOT NUL STAR
  518.     PCHAR    STAR
  519.     ENDIF
  520.     IF    NOT NUL POINTR
  521.     LXI    D,POINTR
  522.     ENDIF
  523.     CALL    READ2?
  524.     ORA    A
  525.     IF    NOT RDFLAG
  526.     JMP    AROUND
  527. READ2?:    SYSF    20
  528. RDFLAG    SET    TRUE
  529.     ENDIF
  530. AROUND:
  531.     ENDM
  532. ;
  533. GFNAME    MACRO    FCB
  534.     LOCAL    AROUND,PNAME,ENAME,EXTEN,GNAM2
  535.     PUSH    H
  536.     PUSH    D
  537.     PUSH    B
  538.     LXI    H,FCB
  539.     SHLD    FCBS?
  540.     CALL    GNAM?
  541.     POP    B
  542.     POP    D
  543.     POP    H
  544.     IF    NOT FNFLAG
  545.     JMP    AROUND
  546. FCBS?:    DS    2
  547. GNAM?:
  548.     CRLF
  549. GNAM2:
  550.     PRINT    <'                                ',CR>
  551.     PRINT    'Enter File Name:'
  552.     LHLD    FCBS?
  553.     XRA    A
  554.     MOV    M,A
  555.     INX    H
  556.     FILL    ,11,BLANK
  557.     XCHG
  558.     READB
  559.     CALL    GETCH
  560.     JC    GNAM2
  561.     CPI    BLANK
  562.     JZ    GNAM2
  563.     UCASE
  564.     STAX    D
  565.     CALL    GETCH
  566.     RC
  567.     CPI    BLANK
  568.     RZ
  569.     MVI    B,7
  570.     UCASE
  571.     CPI    PERIOD
  572.     JZ    ENAME
  573.     CPI    ':'
  574.     JNZ    PNAME
  575.     LDAX    D
  576.     SUI    'A'-1
  577.     STAX    D
  578.     CALL    GETCH
  579.     JC    GNAM2
  580.     UCASE
  581.     INR    B
  582.     DCX    D
  583. PNAME:
  584.     INX    D
  585.     STAX    D
  586.     CALL    GETCH
  587.     RC
  588.     CPI    BLANK
  589.     RZ
  590.     UCASE
  591.     CPI    PERIOD
  592.     JZ    ENAME
  593.     DCR    B
  594.     JNZ    PNAME
  595.     JMP    GNAM2
  596. ENAME:
  597.     LHLD    FCBS?
  598.     LXI    D,9
  599.     DAD    D
  600.     XCHG
  601.     MVI    B,3
  602. EXTEN:
  603.     CALL    GETCH
  604.     RC
  605.     CPI    BLANK
  606.     RZ
  607.     UCASE
  608.     STAX    D
  609.     INX    D
  610.     DCR    B
  611.     JNZ    EXTEN
  612.     RET
  613. ;
  614. FNFLAG    SET    TRUE
  615.     ENDIF
  616. AROUND:
  617.     ENDM
  618. ;
  619. ABORT    MACRO    CHAR
  620.     LOCAL    AROUND
  621.     PUSH    H
  622.     PUSH    D
  623.     PUSH    B
  624.     MVI    C,11
  625.     CALL    BDOS
  626.     POP    B
  627.     POP    D
  628.     POP    H
  629.     RRC
  630.     JNC    AROUND
  631.     READCH
  632.     IF    NUL CHAR
  633.     JMP    DONE
  634.     ELSE
  635.     CPI    CHAR
  636.     JZ    DONE
  637.     ENDIF
  638. AROUND:
  639.     ENDM
  640. ;
  641. MAKE    MACRO    POINTR
  642.     LOCAL    AROUND
  643.     LXI    D,POINTR
  644.     XRA    A
  645.     STA    POINTR+12
  646.     STA    POINTR+32
  647.     CALL    MAKE2?
  648.     INR    A
  649.     JNZ    AROUND
  650.     ERRORM    'No Directory Space',DONE
  651.     IF    NOT MKFLAG
  652. MAKE2?:    SYSF    22
  653. MKFLAG    SET    TRUE
  654.     ENDIF
  655. AROUND:
  656.     ENDM
  657. ;
  658. UNPROT    MACRO    POINTR
  659.     LOCAL    AROUND
  660.     LXI    D,POINTR
  661.     LDA    POINTR+9
  662.     ANI    7FH
  663.     STA    POINTR+9
  664.     CALL    UNPR2?
  665.     IF    NOT UNFLAG
  666.     JMP    AROUND
  667. UNPR2?:
  668.     SYSF    30
  669. UNFLAG    SET    TRUE
  670.     ENDIF
  671. AROUND:
  672.     ENDM
  673. ;
  674. PFNAME    MACRO    FCB
  675.     LOCAL    PFNA2?,PFNA3?
  676.     PUSH    H
  677.     PUSH    B
  678.     MVI    B,8
  679.     LXI    H,FCB+1
  680. PFNA3?:
  681.     MOV    A,M
  682.     CPI    BLANK
  683.     JZ    PFNA2?
  684.     PCHAR
  685.     INX    H
  686.     DCR    B
  687.     JNC    PFNA3?
  688. PFNA2?:
  689.     POP    B
  690.     POP    H
  691.     PCHAR    '.'
  692.     PRINT    FCB+9,3
  693.     ENDM
  694. ;
  695. DELETE    MACRO    POINTR,WHERE
  696.     LOCAL    AROUND,DEL3?
  697.     LXI    D,POINTR
  698.     LDA    POINTR+9
  699.     ANI    80H
  700.     JZ    DEL3?
  701.     CRLF
  702.     PFNAME    POINTR
  703.     PRINT    'Is READ ONLY.Delete?'
  704.     READCH
  705.     UCASE
  706.     CPI    'Y'
  707.     IF    NOT NUL WHERE
  708.     JNZ    WHERE
  709.     ELSE
  710.     JNZ    DONE
  711.     ENDIF
  712.     UNPROT    POINTR
  713. DEL3?:
  714.     CALL    DEL2?
  715.     IF    NOT DEFLAG
  716.     JMP    AROUND
  717. DEL2?:
  718.     SYSF    19
  719. DEFLAG    SET    TRUE
  720.     ENDIF
  721. AROUND:
  722.     ENDM
  723. ;
  724. SETUP2    MACRO
  725.     LOCAL    AROUND,SET2?,SET3?,SET4?
  726. S2FLAG    SET    TRUE
  727.     LDA    FCB2+1
  728.     CPI    BLANK
  729.     JNZ    SET4?
  730.     MOVE    FCB1+1,FCB2+1,11
  731. SET4?:
  732.     AMBIG    FCB1,FCB2
  733.     COMPAR    FCB1,FCB2,12
  734.     JZ    DUPNM?
  735. SET2?:
  736.     MOVE    FCB2,DFCB,16
  737.     OPEN    FCB1
  738.     OPEN    DFCB,SET3?
  739. SET3?:
  740.     DELETE    DFCB
  741.     MAKE    DFCB
  742.     JMP    AROUND
  743. DUPNM?:
  744.     MVI    A,TRUE
  745.     STA    DUPL
  746.     MOVE    '$$$',FCB2+9
  747.     JMP    SET2?
  748. DUPL:    DB    FALSE
  749. DFCB:    DS    33
  750. AROUND:
  751.     ENDM
  752. ;
  753. RENAME    MACRO    POINTR
  754.     LOCAL    AROUND,REN2?
  755.     LXI    D,POINTR
  756.     LDA    POINTR+9
  757.     ORI    80H
  758.     JZ    REN2?
  759.     UNPROT    POINTR
  760. REN2?:
  761.     CALL    RENAM?
  762.     CRLF
  763.     PRINT    POINTR+1,11
  764.     PRINT    '-->'
  765.     PRINT    POINTR+11H,11
  766.     IF    NOT RNFLAG
  767.     JMP    AROUND
  768. RENAM?:    SYSF    23
  769. RNFLAG    SET    TRUE
  770.     ENDIF
  771. AROUND:
  772.     ENDM
  773. ;
  774. WRITES    MACRO    POINTR,STAR
  775.     LOCAL    AROUND
  776.     IF    NOT NUL STAR
  777.     PCHAR    STAR
  778.     ENDIF
  779.     IF    NOT NUL POINTR
  780.     LXI    D,POINTR
  781.     ENDIF
  782.     CALL    WRIT2?
  783.     ORA    A
  784.     IF    WRFLAG
  785.     JNZ    NROOM?
  786.     ELSE
  787.     JZ    AROUND
  788. NROOM?:
  789.     ERRORM    'No Disk Space',DONE
  790. WRIT2?:    SYSF    21
  791. WRFLAG    SET    TRUE
  792.     ENDIF
  793. AROUND:
  794.     ENDM
  795. ;
  796. CLOSE    MACRO    POINTR
  797.     LOCAL    AROUND,CLOSE3
  798.     IF    NOT NUL POINTR
  799.     LXI    D,POINTR
  800.     ENDIF
  801.     CALL    CLOS2?
  802.     INR    A
  803.     IF    NOT S2FLAG
  804.     JNZ    AROUND
  805.     ELSE
  806.     JZ    CLOS3?
  807.     LDA    DUPL
  808.     ORA    A
  809.     JZ    AROUND
  810.     MOVE    'BAK',FCB1+10H+9
  811.     MOVE    FCB1+9,DFCB+10H+9,3
  812.     MOVE    FCB1,FCB1+10H,9
  813.     MOVE    DFCB,DFCB+10H,9
  814.     DELETE    FCB1+10H
  815.     RENAME    FCB1
  816.     RENAME    DFCB
  817.     MOVE    'BAK',FCB1+9
  818.     OPEN    FCB1
  819.     JMP    AROUND
  820.     ENDIF
  821.     IF    NOT CLFLAG
  822. CLOS3?:    ERRORM    '?File Not Found?',DONE
  823. CLOS2?:    SYSF    16
  824. CLFLAG    SET    TRUE
  825.     ENDIF
  826. AROUND:
  827.     ENDM
  828. ;
  829. WRFILE    MACRO    FCB,POINTR,STAR
  830.     LOCAL    WRFIL?,EVEN?
  831.     LHLD    POINTR
  832.     XCHG
  833.     LXI    H,POINTR+2
  834.     SHLD    POINTR
  835.     XCHG
  836.     SBC    HL,DE
  837.     MOV    A,L
  838.     MOV    L,H
  839.     MVI    H,0
  840.     DAD    H
  841.     ORA    A
  842.     JZ    EVEN?
  843.     INX    H
  844. EVEN?:
  845.     PUSH    B
  846.     MOV    B,H
  847.     MOV    C,L
  848. WRFIL?:
  849.     LHLD    POINTR
  850.     XCHG
  851.     SETDMA
  852.     WRITES    FCB,STAR
  853.     LHLD    POINTR
  854.     LXI    D,80H
  855.     DAD    D
  856.     SHLD    POINTR
  857.     DCX    B
  858.     MOV    A,C
  859.     ORA    B
  860.     JNZ    WRFIL?
  861.     POP    B
  862.     ENDM
  863. ;
  864. PROTEC    MACRO    POINTR
  865.     LOCAL    AROUND,PROT2?
  866.     LXI    D,POINTR
  867.     LDA    POINTR+9
  868.     ORI    80H
  869.     STA    POINTR+9
  870.     CALL    PROT2?
  871.     JMP    AROUND
  872. PROT2?:
  873.     SYSF    30
  874. AROUND:
  875.     ENDM
  876. ;
  877. BINBIN    MACRO
  878.     LOCAL    BIT2,AROUND
  879.     CALL    BINB2?
  880.     IF    NOT BNFLAG
  881.     JMP    AROUND
  882. BINB2?:
  883.     PUSH    B
  884.     MOV    C,A
  885.     MVI    B,8
  886. BIT2:
  887.     MOV    A,C
  888.     ADD    A
  889.     MOV    C,A
  890.     MVI    A,'0'/2
  891.     ADC    A
  892.     PCHAR
  893.     DCR    B
  894.     JNZ    BIT2
  895.     POP    H
  896.     RET
  897. BNFLAG    SET    TRUE
  898.     ENDIF
  899. AROUND:
  900.     ENDM
  901. ;
  902. HLDEC    MACRO
  903.     LOCAL    AROUND,SUBTR,SUBT2,NZERO
  904.     CALL    HLDC2?
  905.     IF    NOT DEFLAG
  906.     JMP    AROUND
  907. HLDC2?:
  908.     PUSH    H
  909.     PUSH    D
  910.     PUSH    B
  911.     MVI    B,0
  912.     LXI    D,-10000
  913.     CALL    SUBTR
  914.     LXI    D,-1000
  915.     CALL    SUBTR
  916.     LXI    D,-100
  917.     CALL    SUBTR
  918.     LXI    D,-10
  919.     CALL    SUBTR
  920.     MOV    A,L
  921.     ADI    '0'
  922.     PCHAR
  923.     POP    B
  924.     POP    D
  925.     POP    H
  926.     RET
  927. SUBTR:    MVI    C,'0'-1
  928. SUBT2:    INR    C
  929.     DAD    D
  930.     JC    SUBT2
  931.     SBC    HL,DE
  932.     MOV    A,C
  933.     CPI    '1'
  934.     JNZ    NZERO
  935.     MOV    A,B
  936.     ORA    A
  937.     MOV    A,C
  938.     RZ
  939.     PCHAR
  940.     RET
  941. NZERO:
  942.     MVI    B,0FFH
  943.     PCHAR
  944.     RET
  945. DEFLAG    SET    TRUE
  946.     ENDIF
  947. AROUND:
  948.     ENDM
  949. ;
  950. OUTHL    MACRO
  951.     LOCAL    OVER
  952.     MOV    A,H
  953.     ORA    A
  954.     JZ    OVER
  955.     OUTHEX    H
  956. OVER:
  957.     OUTHEX    L
  958.     ENDM
  959. ;
  960. MULT    MACRO    TIMES
  961.     LOCAL    LOOP,AROUND,NOTZ
  962.     PUSH    B
  963.     IF    NUL TIMES
  964.     MOV    B,A
  965.     ELSE
  966.     MVI    B,TIMES
  967.     ENDIF
  968.     CALL    MULT2?
  969.     POP    B
  970.     IF    NOT MLFLAG
  971.     JMP    AROUND
  972. MULT2?:
  973.     MOV    A,B
  974.     ORA    A
  975.     JNZ    NOTZ
  976.     MOV    L,A
  977.     MOV    H,A
  978.     RET
  979. NOTZ:
  980.     RAR
  981.     RC
  982.     MOV    B,A
  983. LOOP:
  984.     DAD    H
  985.     MOV    A,B
  986.     RAR
  987.     MOV    B,A
  988.     JNC    LOOP
  989.     RET
  990. MLFLAG    SET    TRUE
  991.     ENDIF
  992. AROUND:
  993.     ENDM
  994. ;
  995. DIVIDE    MACRO    DENOM
  996.     LOCAL    AROUND,SHFTR?,DIV3?
  997.     PUSH    B
  998.     IF    NUL DENOM
  999.     MVI    B,2
  1000.     ELSE
  1001.     MVI    B,DENOM
  1002.     ENDIF
  1003.     CALL    DIV2?
  1004.     POP    B
  1005.     IF    NOT DVFLAG
  1006.     JMP    AROUND
  1007. DIV2?:
  1008.     MOV    A,B
  1009.     ORA    A
  1010.     RZ
  1011.     RAR
  1012.     RC
  1013.     MOV    B,A
  1014. DIV3?:
  1015.     CALL    SHFTR?
  1016.     MOV    A,B
  1017.     RAR
  1018.     MOV    B,A
  1019.     JNC    DIV3?
  1020.     RET
  1021. SHFTR?:
  1022.     XRA    A
  1023.     MOV    A,H
  1024.     RAR
  1025.     MOV    H,A
  1026.     MOV    A,L
  1027.     RAR
  1028.     MOV    L,A
  1029.     RET
  1030. DVFLAG    SET    TRUE
  1031.     ENDIF
  1032. AROUND:
  1033.     ENDM
  1034. ;
  1035. FILLD    MACRO    ADDR,BYTES,CHAR
  1036.     LOCAL    AROUND,FILL3?
  1037.     PUSH    H
  1038.     PUSH    B
  1039.     IF    NOT NUL ADDR
  1040.     LXI    H,ADDR
  1041.     ENDIF
  1042.     IF    NOT NUL BYTES
  1043.     LXI    B,BYTES
  1044.     ENDIF
  1045.     MVI    A,CHAR
  1046.     CALL    FILL2?
  1047.     POP    B
  1048.     POP    H
  1049.     IF    NOT FLFLAG
  1050.     JMP    AROUND
  1051. FILL2?:
  1052.     PUSH    D
  1053.     MOV    D,A
  1054. FILL3?:
  1055.     MOV    M,D
  1056.     INX    H
  1057.     DCX    B
  1058.     MOV    A,C
  1059.     ORA    B
  1060.     JNZ    FILL3?
  1061.     POP    D
  1062.     RET
  1063. FLFLAG    SET    TRUE
  1064.     ENDIF
  1065. AROUND:
  1066.     ENDM
  1067. ;
  1068. ; THAT IS THE LAST OF THOSE 'ORRIBLE MACRO'S THAT
  1069. ; I GREW VERY WEARY OF TYPING.  YEEEAAAAHHHH!
  1070. MOVE    MACRO    FROM,TO,BYTES
  1071.     LOCAL    AROUND,MESG
  1072.     PUSH    H
  1073.     PUSH    D
  1074.     PUSH    B
  1075.     IF    NOT NUL TO
  1076.     LXI    D,TO
  1077.     ENDIF
  1078.     IF    NUL BYTES
  1079.     LXI    H,MESG
  1080.     LXI    B,AROUND-MESG
  1081.     ELSE
  1082.     IF    NOT NUL FROM
  1083.     LXI    H,FROM
  1084.     ENDIF
  1085.     LXI    B,BYTES
  1086.     ENDIF
  1087.     CALL    MOVE2?
  1088.     POP    B
  1089.     POP    D
  1090.     POP    H
  1091.     IF    NOT MVFLAG OR NUL BYTES
  1092.     JMP    AROUND
  1093.     ENDIF
  1094.     IF    NOT MVFLAG
  1095. MOVE2?:
  1096.     MOV    A,M
  1097.     STAX    D
  1098.     INX    H
  1099.     INX    D
  1100.     DCX    B
  1101.     MOV    A,C
  1102.     ORA    B
  1103.     JNZ    MOVE2?
  1104.     RET
  1105. MVFLAG    SET    TRUE
  1106.     ENDIF
  1107.     IF    NUL BYTES
  1108. MESG:
  1109.     DB    FROM
  1110.     ENDIF
  1111. AROUND:
  1112.     ENDM
  1113. ;
  1114. ; END OF TEXT
  1115.