home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / cpm / list / ep-src.ark / GOTOCOL.MAC < prev    next >
Encoding:
Text File  |  1988-05-21  |  6.4 KB  |  503 lines

  1.  
  2. ;functions GOTOCOL, HZSPACE, DOTAB
  3.  
  4.     include    BDSYM.EQU
  5.     include    EPDATA
  6.  
  7.  
  8.     .comment    `
  9.  
  10. /************************************************/
  11. /************************************************/
  12. gotocol(n)
  13. int n;
  14. {
  15.  
  16.             `
  17.  
  18.  
  19. gotocol::
  20.     pop    d
  21.     pop    h
  22.     push    h
  23.     push    d
  24.  
  25.     push    b
  26. ;outpoint kept in BC
  27.     shld    _gtc_n
  28.  
  29. ;    /* back over any preceding spaces        */
  30. ;    while (outpoint && outbuf[outpoint-1] == ' ')
  31.  
  32.  
  33.     lhld    outpoint
  34.     mov    b,h
  35.     mov    c,l    
  36. .gtc1:
  37.     mov    h,b
  38.     mov    l,c
  39.  
  40.     mov    a,h
  41.     ora    l
  42.     jz    .gtc2
  43.  
  44.     lhld    outbuf
  45.     dad    b
  46.     dcx    h
  47.     mov    a,m
  48.  
  49.     cpi    ' '
  50.     jz    .gtc1.1
  51.     cpi    SPFLAG
  52.     jnz    .gtc2
  53.  
  54. ;    {    outpoint--;
  55. .gtc1.1:
  56.     dcx    b
  57.  
  58. ;        glen -= widbuf[outpoint];
  59. ;    }
  60.     lhld    widbuf
  61.     dad    b
  62.     dad    b
  63.     mov    e,m
  64.     inx    h
  65.     mov    d,m
  66.     call    cmd
  67.  
  68.     lhld    glen
  69.     dad    d
  70.     shld    glen
  71.     jmp    .gtc1
  72. ;
  73. ;    /* and also, if no previous characters, reset lindent */
  74. ;    if (!outpoint /* && cc < 2 */) lindent[cc] = 0;
  75. .gtc2:
  76.     mov    a,b
  77.     ora    c
  78.     jnz    .gtc3
  79.  
  80.     lda    cc
  81.     cpi    2
  82.     jnc    .gtc3    ;??
  83.  
  84. ;    lhld    cc
  85. ;    dad    h
  86. ;    lxi    d,lindent
  87. ;    dad    d
  88.     call    getlindent##
  89.  
  90.     xra    a
  91.     mov    m,a
  92. ;    inx    h
  93.     dcx    h
  94.     mov    m,a
  95. ;
  96. ;    /* store a SP flag with the appropriate width    */
  97. ;    outbuf[outpoint] = SPFLAG;
  98.  
  99. .gtc3:
  100. ;check frplace, and if had one, put it there
  101.     lhld    frplace
  102.     mov    a,h
  103.     ora    a
  104.     jm    .gtc3a
  105.     mov    b,h
  106.     mov    c,l
  107. .gtc3a:
  108.     lhld    outbuf
  109.     dad    b
  110.     mvi    m,SPFLAG
  111.  
  112. ;    attrbuf[outpoint] = 0; /* was 'mode', but should stop ul */
  113.     lhld    attrbuf
  114.     dad    b
  115.     dad    b
  116.  
  117.     xra    a
  118.     mov    m,a
  119.     inx    h
  120.     mov    m,a
  121. ;
  122. ;    n -= lindent[cc];
  123.  
  124. ;(don't subtract the indent at the beginning of a late col.
  125. ; in mc mode, because we're being called to do this indent, hopefully)
  126.  
  127.  
  128.     call    getlindent##
  129.     call    cmd
  130.  
  131.     lhld    _gtc_n
  132.     lda    cc
  133.     cpi    2
  134.     jc    .gtc3s
  135.     mov    a,b
  136.     ora    c
  137.     jz    $+4
  138. .gtc3s:
  139.     dad    d
  140.     shld    _gtc_n
  141.  
  142. ;    if (n > glen)
  143.     xchg
  144.     lhld    glen
  145.     call    agbs
  146.     jnc    .gtc4
  147.  
  148. ;    {    widbuf[outpoint++] = n - glen;
  149.  
  150.  
  151.     lhld    glen
  152.     call    cmh
  153.     xchg
  154.     lhld    _gtc_n
  155.     dad    d
  156.     xchg
  157.  
  158.     lhld    widbuf
  159.     dad    b
  160.     dad    b
  161.     inx    b
  162.  
  163.     lda    frplace+1
  164.     ora    a
  165.     jm    .gtc3b
  166. ;fix right end of rule 1
  167.     push    h
  168.     lhld    rulist+6
  169.     mov    a,h
  170.     ora    l
  171.     jz    .gtcRUx
  172.     lhld    rulist+4
  173.     dad    d
  174.     shld    rulist+6
  175. .gtcRUx:
  176.     pop    h
  177.  
  178.     push    h
  179.     push    d
  180.     mov    e,m
  181.     inx    h
  182.     mov    d,m
  183.     pop    h
  184.     dad    d
  185.     xchg
  186.     pop    h
  187. .gtc3b:
  188.     mov    m,e
  189.     inx    h
  190.     mov    m,d
  191. ;        glen = n;
  192. ;    }
  193.  
  194.     lhld    _gtc_n
  195.     shld    glen
  196.  
  197. ;
  198. ;    scrncol = ((glen+lindent[cc]) / PICA) +1;
  199. ;}
  200. .gtc4:
  201. ;    lhld    cc
  202. ;    dad    h
  203. ;    lxi    d,lindent
  204. ;    dad    d
  205. ;    mov    e,m
  206. ;    inx    h
  207. ;    mov    d,m
  208.     call    getlindent##
  209.  
  210.     lhld    glen
  211.     dad    d
  212.  
  213.     lxi    d,pica
  214.     xchg
  215.     call    usdiv
  216.  
  217.     inx    h
  218.  
  219.     mov    a,l
  220.     sta    scrncol
  221.  
  222. ;if was put at frplace, don't advance, and unmark frplace
  223.     lxi    h,frplace+1
  224.     mov    a,m
  225.     ora    a
  226.     jm    .tspxt
  227.     mvi    m,0ffh
  228.     jmp    .tsp2
  229. .tspxt:
  230.     mov    h,b
  231.     mov    l,c
  232.     shld    outpoint
  233. .tsp2:
  234.     mvi    a,' '
  235.     call    termput##
  236.  
  237.     pop    b
  238.     ret
  239.  
  240. _gtc_n:    dw    0
  241.  
  242.  
  243.     .comment    `
  244.  
  245. /************************************************/
  246. /************************************************/
  247. hzspace(n)
  248. int n;
  249. {
  250.  
  251.     /* store a SP flag with the appropriate width    */
  252.     outbuf[outpoint] = HSFLAG;
  253.     attrbuf[outpoint] = mode;
  254.     widbuf[outpoint++] = n;
  255.     glen += n;
  256.  
  257. }
  258.  
  259.             `
  260.  
  261. hzspace::
  262.     pop    d
  263.     pop    h
  264.     push    h
  265.     push    d
  266.  
  267.     push    h    ;n -- for later
  268.  
  269.     lhld    outbuf
  270.     xchg
  271.     lhld    outpoint
  272.     inx    h
  273.     shld    outpoint    ;outpoint++
  274.     dcx    h
  275.     push    h    ;for later
  276.     dad    d
  277.     mvi    m,HSFLAG
  278.  
  279.  
  280.     lhld    attrbuf
  281.     xchg
  282.  
  283.     pop    h    ;outpoint
  284.     dad    h    ;word index
  285.     push    h    ;for later
  286.     dad    d
  287.  
  288.     xchg
  289.     lhld    mode
  290.     xchg
  291.     mov    m,e
  292.     inx    h
  293.     mov    m,d
  294.  
  295.     lhld    widbuf
  296.  
  297.     pop    d    ;2*outpoint
  298.     dad    d
  299.  
  300.     pop    d    ;n
  301.     mov    m,e
  302.     inx    h
  303.     mov    m,d
  304.  
  305.     lhld    glen
  306.     dad    d    ;still n
  307.     shld    glen
  308.  
  309.     ret
  310.  
  311.  
  312.     .comment    `
  313.  
  314. /************************************************/
  315. /* Tab for embedded tab char in text        */
  316. /************************************************/
  317. dotab()
  318. {    int dstcol;
  319.  
  320.     /* nominal char width is set when first tab is encountered */
  321.     if (!val['T'-'@']['W'-'@'])
  322.         if (mode & 0x700) val['T'-'@']['W'-'@'] = PICA;
  323.         else val['T'-'@']['W'-'@'] = modelen[mode & 61];
  324.  
  325.  
  326.     while (scrncol % 8) scrncol++;
  327.     dstcol = scrncol * val['T'-'@']['W'-'@'] - lindent[cc];
  328.  
  329.     if (dstcol - glen <= 0) return;
  330.  
  331.     /* store a SP flag with the appropriate width, which is (we say),
  332.        enough to line up next char with its screen position */
  333.     outbuf[outpoint] = SPFLAG;
  334.     attrbuf[outpoint] = mode;
  335.  
  336.     widbuf[outpoint++] = dstcol - glen;
  337.     glen = dstcol;
  338. }
  339.  
  340.             `
  341.  
  342.  
  343. dotab::
  344.     push    b
  345.  
  346.     lhld    outpoint
  347.     mov    b,h
  348.     mov    c,l
  349.  
  350. ;    /* nominal char width is set when first tab is encountered */
  351. ;    if (!val['T'-'@']['W'-'@'])
  352.     lhld    val + 54*('T'-'@') + 2*('W'-'@')    ;606c
  353.     mov    a,h
  354.     ora    l
  355.     jnz    .dtb3
  356. ;        if (mode & 0x700) val['T'-'@']['W'-'@'] = PICA;
  357.     lda    mode+1
  358.     ani    7
  359.     jz    .dtb1
  360.  
  361.     lxi    h,pica
  362.     jmp    .dtb2
  363. ;        else val['T'-'@']['W'-'@'] = modelen[mode & 61];
  364. .dtb1:    lda    mode
  365.     ani    61
  366.     mov    l,a
  367.     mvi    h,0
  368.     lxi    d,modelen
  369.     dad    d
  370.     mov    l,m
  371.     mvi    h,0
  372. .dtb2:    shld    val + 54*('T'-'@') + 2*('W'-'@')
  373. ;
  374. ;
  375. ;    while (scrncol % 8) scrncol++;
  376. .dtb3:
  377.     lxi    h,scrncol
  378. .dtb4:
  379.     mov    a,m
  380.     ani    7
  381.     jz    .dtb5
  382.  
  383.     inr    m
  384.     jmp    .dtb4
  385.  
  386. ;    dstcol = scrncol * val['T'-'@']['W'-'@'] - lindent[cc];
  387. .dtb5:
  388. ;    lhld    scrncol
  389. ;    xchg
  390.     mov    e,m
  391.  
  392.     lhld    cw
  393.     mov    a,l
  394.     ora    a
  395.     jnz    $+6
  396.  
  397.     lhld    val + 54*('T'-'@') + 2*('W'-'@')
  398.     mvi    d,0
  399.     call    smul
  400.     push    h
  401.  
  402.     call    getlindent##
  403.     call    cmd
  404.  
  405.     pop    h
  406.     dad    d
  407.  
  408. .dtb5.1:
  409.     push    h
  410.     call    inbch##
  411.     cpi    ' '
  412.     jnz    .dtb5.2
  413.     call    nxspnt##
  414.     lxi    d,PICA
  415.     lda    val + 54*('C'-'@') + 2*('W'-'@')
  416.     ora    a
  417.     jz    $+4
  418.     mov    e,a
  419.     pop    h
  420.     dad    d
  421.     jmp    .dtb5.1
  422. .dtb5.2:
  423.     pop    h
  424.     shld    dstcol
  425. ;
  426. ;    if (dstcol - glen <= 0) return;
  427.  
  428.     xchg
  429.     lhld    glen
  430.     call    cmh
  431.     dad    d
  432.  
  433.     lxi    d,-1
  434.     dad    d
  435.     mov    a,h
  436.     ral
  437. ;    jnc    .dtb6
  438.     jc    .dtb7
  439. ;
  440. ;    /* store a SP flag with the appropriate width, which is (we say),
  441. ;       enough to line up next char with its screen position */
  442. ;    outbuf[outpoint] = SPFLAG;
  443.  
  444. .dtb6:    lhld    outbuf
  445.     dad    b
  446.     mvi    m,SPFLAG
  447.  
  448. ;    attrbuf[outpoint] = mode;
  449. ;(should have been ... = 0)
  450.  
  451. ;;    lhld    mode
  452. ;;    xchg
  453.  
  454.     lhld    attrbuf
  455.     dad    b
  456.     dad    b
  457.  
  458. ;;    mov    m,e
  459. ;;    inx    h
  460. ;;    mov    m,d
  461.     xra    a
  462.     mov    m,a
  463.     inx    h
  464.     mov    m,a
  465.  
  466. ;
  467. ;    widbuf[outpoint++] = dstcol - glen;
  468.  
  469.     lhld    dstcol
  470.     xchg
  471.     lhld    glen
  472.     call    cmh
  473.     dad    d
  474.     xchg
  475.  
  476.     lhld    widbuf
  477.     dad    b
  478.     dad    b
  479.     inx    b
  480.     mov    m,e
  481.     inx    h
  482.     mov    m,d
  483.  
  484. ;    glen = dstcol;
  485.  
  486.     lhld    dstcol
  487.     shld    glen
  488. ;}
  489.  
  490. .dtb7:
  491.     jmp    .tspxt
  492.  
  493. ;-    mov    h,b
  494. ;-    mov    l,c
  495. ;-    shld    outpoint
  496.  
  497. ;-    pop    b
  498. ;-    ret
  499.  
  500. dstcol:    dw    0
  501.  
  502.     end
  503.