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

  1.  
  2.     include    BDS.LIB
  3.     include    EPDATA
  4.  
  5.     .request EPEXEC
  6.  
  7.     .comment    `
  8. functions EPSINIT, EPERROR, LOADFT
  9.  
  10.  
  11. /************************************************/
  12. /*    Initialization of Epson & other things    */
  13. /************************************************/
  14. epsinit()
  15. {    int i;
  16.  
  17.     loadi(0); /* initialize values using 'ep.ini';
  18.             sets mode and tabwid */
  19.     emode = tallflag = 0;
  20.     pn = 1;
  21.  
  22.     outbuf = xoutbuf;
  23.     attrbuf = xattrbuf;
  24.     widbuf = xwidbuf;
  25.  
  26.     newinline();
  27.     newoutline();
  28.  
  29.     spdots = skdots = 0;
  30.     vposition = tm;
  31.  
  32.     brccount = brcpt[0] = 0;
  33.  
  34.     PTESCCH('@');        /* Epson master reset        */
  35.     unidir = FALSE;
  36.  
  37.  
  38. /* This was for broken 8th bit on Sluder
  39.     PTESCCH('=');
  40. */
  41.  
  42.     mreset(mode);
  43.  
  44.     newfonts();
  45. }
  46.  
  47.             `
  48.  
  49. epsinit::
  50.  
  51. ;    loadi(0); /* initialize values using 'ep.ini';
  52. ;            sets mode and tabwid */
  53.  
  54.     lxi    h,0
  55.     push    h
  56.     call    loadi##
  57.     pop    d
  58. ;    emode = tallflag = 0;
  59.     xra    a
  60.     sta    tallflag
  61.     lxi    h,0
  62.     shld    emode    ;done by mreset(0) below?
  63. ;    pn = 1;
  64.     inx    h
  65.     shld    pn
  66. ;
  67. ;    outbuf = xoutbuf;
  68. ;    attrbuf = xattrbuf;
  69. ;    widbuf = xwidbuf;
  70.  
  71.     lxi    h,xoutbuf
  72.     shld    outbuf
  73.     lxi    h,xattrbuf
  74.     shld    attrbuf
  75.     lxi    h,xwidbuf
  76.     shld    widbuf
  77. ;
  78. ;    newinline();
  79. ;    newoutline();
  80.     call    newinline##
  81.     call    newoutline##
  82. ;
  83. ;    spdots = skdots = 0;
  84.     lxi    h,0
  85.     shld    skdots
  86. ;??    shld    spdots (not currently used)
  87.  
  88. ;    vposition = tm;
  89. ;;; - hm
  90. ;
  91. ;    lhld    tm
  92. ;    xchg
  93. ;    lhld    hm
  94. ;    call    cmh
  95. ;    dad    d
  96.     lxi    h,-1    ;HM now 0 -- paperup will init this
  97.     shld    vposition
  98.  
  99. ;    brccount = brcpt[0] = 0;
  100.     lxi    h,0
  101.     shld    brcpt
  102.     shld    brccount
  103. ;
  104. ;    PTESCCH('@');        /* Epson master reset        */
  105.  
  106. ;call mreset first to init bios vector in presc routine
  107.     lxi    h,0
  108.     push    h
  109.     call    mreset##
  110.     pop    d
  111.  
  112.     mvi    a,'@'
  113.     call    presc1##
  114.  
  115. ;    unidir = FALSE;
  116.     mvi    a,0
  117.     sta    unidir
  118. ;
  119. ;    mreset(mode);
  120.     lhld    mode
  121.     push    h
  122.     call    mreset##
  123.     pop    d
  124. ;
  125. ;    newfonts();
  126. ;}
  127.     jmp    newfonts##
  128.  
  129.     .comment    `
  130.  
  131. eperror(errn)
  132. int errn;
  133. {    errcode = errn;
  134.     exec("EPERROR");
  135.     puts("\n\nERROR\n");
  136.     exit(ERROR);
  137. }
  138.  
  139.             `
  140.  
  141. eperror::
  142.     pop    d
  143.     pop    h
  144.     shld    errcode
  145.  
  146. ;    lxi    h,$errprog
  147. ;    push    h
  148. ;    call    exec##
  149.     call    epexec##
  150.  
  151.     lxi    h,$errmsg
  152. ;    push    h
  153.     call    puts##
  154.  
  155.     lxi    h,-1
  156.     push    h
  157. ;    call    exit##    ;or call exit ??
  158.     call    .exit
  159.  
  160. ;$errprog:
  161. ;    db    'EPERROR',0
  162. $errmsg:
  163.     db    0AH,0AH,'ERROR',0AH,0
  164.  
  165.  
  166.  
  167.     .comment    `
  168.  
  169. /************************************************/
  170. /* Load in from disk one font of graphics data    */
  171. /************************************************/
  172. loadft(fntreq)
  173. int fntreq;
  174. {
  175.     int fdft, i, k, ftrecs;
  176.     char fullname[17];
  177.  
  178.     /* if no more room, load over last font        */
  179.     if (fntreq == NUMFTS)
  180.     {    fntreq--;
  181.         free(ftp[fntreq]);
  182.         ftp[fntreq] = 0;
  183.     }
  184.  
  185.     /* maybe already loaded?            */
  186.     if (ftp[fntreq]) return(0);
  187.  
  188.     errtype = fntreq;
  189.     fprefix(fullname);
  190.  
  191.     strcat(fullname,ftname[fntreq]);
  192.     strcat(fullname,".FN2");
  193.  
  194.     if ((fdft = open(fullname,0)) == ERROR)
  195.         {puts("\nno font\n"); eperror(120+fntreq);}
  196.  
  197.     /* read the index to where data for each char is    */
  198.     if (read(fdft, fix[fntreq], 2) != 2)
  199.         {puts("\nbad font\n"); eperror(130+fntreq);}
  200.  
  201.     /* only read enough of the font to get info for char's
  202.         up to ascii nul (which is not used)        */
  203.     ftrecs = (fix[fntreq][127]+127)/128;
  204.  
  205.     /* get memory space -- overwrite old fonts, if necessary    */
  206.     k = nextft - 1;
  207.     while
  208.     (    !(ftp[fntreq] = alloc(ftrecs * 128))
  209.         && k > 0
  210.     )
  211.     {    if (k == fntreq) { k--; continue; }
  212.         if (ftp[k]) free(ftp[k]);
  213.         ftp[k] = 0;
  214.         k--;
  215.     }
  216.  
  217.     /* this should never happen                */
  218.     if (!ftp[fntreq]) eperror(111);
  219.  
  220.     if (read(fdft, ftp[fntreq], ftrecs) != ftrecs)
  221.         eperror(130+fntreq);
  222.  
  223.     fabort(fdft);
  224.  
  225.     /* calculate widths of characters for later reference    */
  226.     ftlen[fntreq][0] = 0;
  227.     for (i = 1; i < 127; i++)
  228.         ftlen[fntreq][i] = (fix[fntreq][i+1] - fix[fntreq][i])/3;
  229.  
  230.     return(0);
  231. }
  232.  
  233.             `
  234.  
  235.  
  236. loadft::
  237.     pop    d
  238.     pop    h
  239.     push    h
  240.     push    d
  241.  
  242.     push    b
  243. ;B = fntreq
  244.     mov    b,l
  245.  
  246. ;    /* if no more room, load over last font        */
  247. ;    if (fntreq == NUMFTS)
  248.  
  249.     mov    a,b
  250.     cpi    NUMFTS
  251.     jnz    .ldf1
  252.  
  253. ;    {    fntreq--;
  254.  
  255.     dcr    b
  256.     dcr    l
  257.  
  258. ;        free(ftp[fntreq]);
  259.  
  260. ;HL still = fntreq
  261.     dad    h
  262.     lxi    d,ftp
  263.     dad    d
  264.     push    h    ;for next stmt
  265.  
  266.     mov    e,m
  267.     inx    h
  268.     mov    d,m
  269. ;check if allocated?
  270. ;    push    d
  271.     xchg
  272.     call    free##
  273. ;    pop    d
  274.  
  275. ;        ftp[fntreq] = 0;
  276. ;    }
  277.     pop    h
  278.     xra    a
  279.     mov    m,a
  280.     inx    h
  281.     mov    m,a
  282. ;
  283. ;    /* maybe already loaded?            */
  284. ;    if (ftp[fntreq]) return(0);
  285.  
  286. .ldf1:
  287.     mov    l,b
  288.     mvi    h,0
  289.     dad    h
  290.     lxi    d,ftp
  291.     dad    d
  292.     mov    a,m
  293.     inx    h
  294.     ora    m
  295.     jz    .ldf2
  296.     lxi    h,0
  297.     pop    b
  298.     ret
  299.  
  300. ;
  301. ;    errtype = fntreq;
  302. .ldf2:
  303.     mov    l,b
  304.     mvi    h,0
  305.     shld    errtype
  306.  
  307. ;if drive prefix was stored with name, don't add another
  308.     call    getftn##
  309. ;(2 copies for later)
  310.     push    h
  311.     push    h
  312.     inx    h
  313.     mov    a,m
  314.     cpi    ':'
  315.  
  316.  
  317. ;    fprefix(fullname);
  318.     lxi    h,fullname
  319. ;nul in case go directly to strcat
  320.     mvi    m,0
  321. ;well, was it a colon? then don't get def. prefix
  322.     jz    .ldf2a
  323.     push    h
  324.     call    fprefix##
  325.     pop    d
  326. .ldf2a:
  327. ;first copy ftname ptr (one still on stack)
  328.     pop    h
  329. ;
  330. ;    strcat(fullname,ftname[fntreq]);
  331. ;    call    getftn##
  332. ;    push    h
  333.  
  334.     mov    a,m
  335.     ani    80h
  336.     sta    itsagf
  337.     mov    a,m
  338.     push    psw
  339.     ani    7fh
  340.     mov    m,a
  341.  
  342.     xchg
  343.     lxi    h,fullname
  344.     
  345.     call    strcat##
  346.  
  347.     pop    psw
  348. ;use 2nd copy of ftname ptr to restore 1st char as was
  349.     pop    h
  350.     mov    m,a
  351.  
  352. ;    strcat(fullname,".FN2");
  353.  
  354.     lxi    d,$xtbtp
  355. ;    lda    itsagf
  356. ;    ora    a
  357.     ani    80h
  358.     jnz    $+6
  359.     lxi    d,$xtfn2
  360.  
  361.     lxi    h,fullname
  362.     call    strcat##
  363.  
  364. ;
  365. ;    if ((fdft = open(fullname,0)) == ERROR)
  366.     lxi    h,0
  367.     push    h
  368.     lxi    h,fullname
  369.     push    h
  370.     call    open##
  371.     pop    d
  372.     pop    d
  373.     shld    fdft
  374.     inx    h
  375.     mov    a,h
  376.     ora    l
  377.     jnz    .ldf3
  378. ;        {puts("\nno font\n"); eperror(120+fntreq);}
  379.     lxi    h,$no_font
  380.     call    puts##
  381.     lxi    d,120
  382. .ldf2b:    mov    l,b
  383.     mvi    h,0
  384.     dad    d
  385.     push    h
  386.     call    eperror
  387.  
  388. ;
  389. ;    /* read the index to where data for each char is    */
  390. ;    if (read(fdft, fix[fntreq], 2) != 2)
  391. .ldf3:
  392.     lxi    h,2
  393.     push    h
  394.  
  395.     mov    h,b
  396.     mvi    l,0    ;fntreq*100h
  397.     lxi    d,fix
  398.     dad    d
  399.  
  400.     lda    itsagf
  401.     ora    a
  402.     jz    .ldf3a
  403.     pop    d    ;discard 2 (rec count)
  404.     call    fixfake
  405.     jmp    .ldf4
  406. .ldf3a:
  407.     push    h
  408.  
  409.     lhld    fdft
  410.     push    h
  411.     call    read##
  412.     pop    d
  413.     pop    d
  414.     pop    d
  415.  
  416.     dcx    h
  417.     dcx    h
  418.     mov    a,h
  419.     ora    l
  420.     jz    .ldf4
  421. ;        {puts("\nbad font\n"); eperror(130+fntreq);}
  422.     lxi    h,$bad_font
  423. ;    push    h
  424.     call    puts##
  425. ;    pop    d
  426.     lxi    d,130
  427.     jmp    .ldf2b
  428.  
  429. ;
  430. ;    /* only read enough of the font to get info for char's
  431. ;        up to ascii nul (which is not used)        */
  432. ;    ftrecs = (fix[fntreq][127]+127)/128;
  433. .ldf4:
  434.     mov    h,b
  435.     mvi    l,0
  436.     lxi    d,fix + 127*2
  437.     dad    d
  438.  
  439.     mov    e,m
  440.     inx    h
  441.     mov    d,m
  442.  
  443.     lxi    h,127
  444.     dad    d
  445.     push    h
  446.     xchg
  447.     lxi    h,128
  448.     call    usdiv
  449.  
  450.     shld    ftrecs
  451.     pop    h
  452.     mvi    a,80h
  453.     ana    l
  454.     mov    l,a
  455.     shld    ftbytes
  456. ;
  457. ;    /* get memory space -- overwrite old fonts, if necessary    */
  458. ;    k = nextft - 1;
  459. ;C = k
  460.     lda    nextft
  461.     dcr    a
  462.     mov    c,a
  463.  
  464. ;    while
  465. ;    (    !(ftp[fntreq] = alloc(ftrecs * 128))
  466. ;        && k > 0
  467. ;    )
  468. .ldf5:
  469.     mov    l,b
  470.     mvi    h,0
  471.     dad    h
  472.     lxi    d,ftp
  473.     dad    d
  474.     push    h
  475.  
  476.     lhld    ftbytes
  477. ;    push    h
  478.     call    alloc##
  479. ;    pop    d
  480.  
  481.     xchg
  482.     pop    h
  483.     mov    m,e
  484.     inx    h
  485.     mov    m,d
  486.  
  487.     mov    a,d
  488.     ora    e
  489.     jnz    .ldf8a
  490.  
  491.     mov    a,c
  492.     ora    a
  493.     jz    .ldf8
  494.  
  495. ;    {    if (k == fntreq) { k--; continue; }
  496.  
  497.     cmp    b
  498.     jnz    .ldf6
  499.     dcr    c
  500.     jmp    .ldf5
  501.  
  502. ;        if (ftp[k]) free(ftp[k]);
  503. .ldf6:
  504.     mov    l,c
  505.     mvi    h,0
  506.     dad    h
  507.     lxi    d,ftp
  508.     dad    d
  509.     push    h    ;for next stmt
  510.     mov    e,m
  511.     inx    h
  512.     mov    d,m
  513.     mov    a,d
  514.     ora    e
  515.  
  516. ;    push    d
  517.     xchg
  518.     cnz    free##
  519. ;    pop    d
  520. ;        ftp[k] = 0;
  521. .ldf7:
  522.     pop    h
  523.     xra    a
  524.     mov    m,a
  525.     inx    h
  526.     mov    m,a
  527. ;        k--;
  528. ;    }
  529.  
  530.     dcr    c
  531.     jmp    .ldf5
  532. ;
  533. ;    /* this should never happen                */
  534. ;    if (!ftp[fntreq]) eperror(111);
  535. .ldf8:
  536. ;to here from above only if nothing allocated, and k = 0
  537.     lxi    h,111
  538.     push    h
  539.     call    eperror
  540.  
  541. .ldf8a:
  542. ;
  543. ;    if (read(fdft, ftp[fntreq], ftrecs) != ftrecs)
  544. ;        eperror(130+fntreq);
  545. .ldf9:
  546.     lhld    ftrecs
  547.     push    h
  548.  
  549.     mov    l,b
  550.     mvi    h,0
  551.     dad    h
  552.     lxi    d,ftp
  553.     dad    d
  554.     mov    e,m
  555.     inx    h
  556.     mov    d,m
  557.     push    d
  558.  
  559.     lhld    fdft
  560.     push    h
  561.     call    read##
  562.     pop    d
  563.     pop    d
  564.     pop    d
  565.  
  566.     xchg
  567.     lhld    ftrecs
  568.     call    eqwel
  569.     jz    .ldf10
  570.  
  571.     mov    l,b
  572.     mvi    h,0
  573.     lxi    d,130
  574.     dad    d
  575.     push    h
  576.     call    eperror
  577.  
  578. ;
  579. ;    fabort(fdft);
  580. .ldf10:
  581. ;    lhld    fdft
  582. ;    push    h
  583.     lda    fdft
  584.     call    fabort##
  585. ;    pop    d
  586. ;
  587. ;    /* calculate widths of characters for later reference    */
  588. ;    ftlen[fntreq][0] = 0;
  589.  
  590.     mov    l,b
  591.     mvi    h,0
  592. ;    lxi    d,128
  593. ;    call    usmul
  594.     dad    h
  595.     dad    h
  596.     dad    h
  597.     dad    h
  598.     dad    h
  599.     dad    h
  600.     dad    h
  601.  
  602.     lxi    d,ftlen
  603.     dad    d
  604.     mvi    m,0
  605.     lda    itsagf
  606.     ora    a
  607.     jnz    lenfake
  608.  
  609. ;    for (i = 1; i < 127; i++)
  610. ;C = i
  611.     mvi    c,1
  612.  
  613. .ldf11:
  614.     mov    a,c
  615.     cpi    127
  616.     jnc    .ldf12
  617.  
  618. ;        ftlen[fntreq][i] = (fix[fntreq][i+1] - fix[fntreq][i])/3;
  619.  
  620. ;    mov    l,b
  621. ;    mvi    h,0
  622. ;    lxi    d,128
  623. ;    call    usmul
  624. ;    lxi    d,ftlen
  625. ;    dad    d
  626.  
  627.     inx    h
  628.     push    h
  629.  
  630.     mov    h,b
  631.     mvi    l,0
  632.     lxi    d,fix
  633.     dad    d
  634.     xchg
  635.  
  636. ;i
  637.     mov    l,c
  638.     mvi    h,0
  639. ;word array
  640.     dad    h
  641.  
  642.     dad    d
  643.     mov    e,m
  644.     inx    h
  645.     mov    d,m
  646. ;DE = fix[fntreq][i]
  647.  
  648.     push    d
  649.     inx    h
  650.     mov    e,m
  651.     inx    h
  652.     mov    d,m
  653.     xchg
  654. ;HL = fix[fntreq][i+1]
  655.  
  656.     pop    d
  657. ;- fix[fntreq][i]
  658.     call    cmd
  659.     dad    d
  660.  
  661.     lxi    d,3
  662.     xchg
  663.     call    usdiv
  664.  
  665.     xchg
  666.     pop    h
  667.     mov    m,e
  668.  
  669.     inr c
  670.     jmp    .ldf11
  671.  
  672. ;
  673. ;    return(0);
  674. ;}
  675. .ldf12:    lxi    h,0
  676. .ldf13:
  677.     pop    b
  678.     ret
  679.  
  680. ;make up char lens for graphics font -- each is 0ffh
  681. ;HL points to the ftlen for this font on entry
  682. lenfake:
  683.     xra    a
  684.     mvi    c,0ffh
  685.     mov    b,a
  686. .lfak1: mov    m,b
  687.     cpi    '@'
  688.     jc    .lfak2
  689.     cpi    '@'+40
  690.     jnc    .lfak2
  691.     mov    m,c
  692. .lfak2:
  693.     inx    h
  694.     inr    a
  695.     cpi    128
  696.     jnz    .lfak1
  697.     jmp    .ldf12
  698.  
  699. ;make up a directory for graphics font
  700. ;HL points to the fix for this font on entry
  701. fixfake:
  702.     push    b
  703.     xra    a
  704.     lxi    d,0
  705.     lxi    b,450
  706. .ffak1:    mov    m,e
  707.     inx    h
  708.     mov    m,d
  709.     inx    h
  710.     cpi    '@'
  711.     jc    .ffak2
  712.     cpi    '@'+40
  713.     jnc    .ffak2
  714.     xchg        ;if char in range, len was 450
  715.     dad    b
  716.     xchg
  717. .ffak2:
  718.     inr    a
  719.     cpi    128
  720.     jnz    .ffak1
  721.     pop    b
  722.     ret
  723.  
  724. $xtfn2:        db    '.FN2',0
  725. $xtbtp:        db    '.BTP',0
  726. itsagf:        db    0
  727. $no_font:    db    0AH,'no font',0AH,0
  728. $bad_font:    db    0AH,'bad font',0AH,0
  729.  
  730. ftrecs:        dw    0
  731. ftbytes:    dw    0
  732. fdft:        dw    0
  733. ;fullname:    ds    17
  734.  
  735.     end
  736.