home *** CD-ROM | disk | FTP | other *** search
/ Crawly Crypt Collection 2 / crawlyvol2.bin / apps / dtp / pgsmodst / atariprt / smm804.s < prev    next >
Text File  |  1991-05-23  |  6KB  |  328 lines

  1.  include "prtequ.h"
  2.  
  3. *
  4. * SMM804 print driver
  5. *
  6. CR    equ    $d
  7. LF    equ    $a
  8. FF    equ    $c
  9. ESC    equ    $1b
  10.  
  11.  SECTION printer,CODE,PUBLIC
  12. ***************************************************************
  13. ***************************************************************
  14. ***************************************************************
  15. dumbentry:
  16.     clr.l    d0
  17.     rts
  18.  
  19.     dc.l    "PRNT"
  20.     dc.w    200
  21.  
  22. *
  23. * distribute the calls to the appropriate routines
  24. *
  25. smm804:    move.l    a0,table
  26.     lsl.w    #2,d0
  27.     lea    prntbl,a1
  28.     move.l    0(a1,d0.w),a1
  29.     jmp    (a1)
  30.  
  31. *
  32. * identify who I am, and set up who I like to speak to.
  33. *
  34. p_ident:
  35.     move.l    #driver,pdrvrnm(a0)    ;pointer to string for driver name
  36.     move.w    #PARALLEL+ASCENDING,device(a0)
  37. prtok:    moveq    #1,d0
  38.     rts
  39.  
  40. *
  41. * initialize the table of printer specific routines
  42. *
  43. p_init:    clr.b    pdl(a0)            ;no page description language
  44.     clr.b    pmult(a0)        ;automatically print mulitiple copies?
  45.     clr.b    pman(a0)        ;handle manual feed?
  46.     move.b    #PRT_BW,ptype(a0)    ;printer type?
  47. *
  48.  
  49.     move.l    sendout(a0),send+2    ;self-modifing code, tisk, tisk!
  50.  
  51. *
  52. * pminlft and pmaxw must be evenly divisible by 16
  53. * this is the part that should be worked out
  54. *
  55.  
  56.     move.w    pdensity(a0),d0
  57.     cmp.w    #7,d0
  58.     bcs    pint1
  59.     moveq    #6,d0
  60. pint1:    lsl.w    #1,d0
  61.  
  62.     lea    xdpi_tbl,a1
  63.     move.w    0(a1,d0.w),pxdpi(a0)    ;x resolution
  64.     lea    ydpi_tbl,a1
  65.     move.w    0(a1,d0.w),pydpi(a0)    ;y resolution
  66.     lea    minl_tbl,a1
  67.     move.w    0(a1,d0.w),pminlft(a0)    ;pixels from the left
  68.     lea    minr_tbl,a1
  69.     move.w    0(a1,d0.w),pminrht(a0)    ;pixels from the right
  70.     lea    mint_tbl,a1
  71.     move.w    0(a1,d0.w),pmintop(a0)    ;pixels down from top
  72.     lea    minb_tbl,a1
  73.     move.w    0(a1,d0.w),pminbot(a0)    ;pixels up from bottom
  74.     lea    xover_tbl,a1
  75.     move.w    0(a1,d0.w),pxover(a0)    ;percentage of x overlap of dots
  76.     lea    yover_tbl,a1
  77.     move.w    0(a1,d0.w),pyover(a0)    ;percentage of y overlap of dots
  78.     lea    rowht_tbl,a1
  79.     move.w    0(a1,d0.w),prowht(a0)    ;rows height modula
  80.  
  81.     move.w    0(a1,d0.w),rowht
  82.     lea    rows_tbl,a1
  83.     move.w    0(a1,d0.w),rows
  84.     lea    grmode_tbl,a1
  85.     move.w    0(a1,d0.w),grmode
  86.  
  87.     lsl.w    #1,d0
  88.     lea    maxw_tbl,a1
  89.     move.w    0(a1,d0.w),pmaxw(a0)    ;maximum # pixels across
  90.     lea    maxh_tbl,a1
  91.     move.w    0(a1,d0.w),pmaxh(a0)    ;maximum # pixels down
  92.     bra    prtok
  93.  
  94. *
  95. * going to begin printing a document
  96. *
  97. p_bgndoc:
  98.     move.b    #ESC,d0
  99.     bsr    send
  100.     move.b    #"U",d0
  101.     bsr    send
  102.     move.b    #1,d0
  103.     bra    send
  104.  
  105.  
  106. *
  107. * about to start printing of a page
  108. *
  109. p_bgnpage:
  110.     bra    prtok
  111.  
  112. *
  113. * about to print a new tile for the page
  114. *
  115. p_bgntile:
  116.     bra    prtok
  117.  
  118. *
  119. * print a block to the printer
  120. *
  121. p_block:
  122.     move.l    table,a0
  123.     move.l    pblockw(a0),d0
  124.     move.w    d0,width
  125.     move.l    pblockptr(a0),a1
  126.     move.l    (a1),a1
  127.     add.l    pblockoff(a0),a1
  128.     move.l    a1,v_base
  129. *
  130. *
  131.     move.w    rows,count
  132. pblck2:    move.l    v_base,lineptr
  133.     bsr    putline
  134.     moveq    #0,d0
  135.     move.w    width,d0
  136.     add.l    d0,v_base
  137.     subq.w    #1,count
  138.     bne    pblck2
  139. *
  140.     move.b    #ESC,d0            ;already moved 1/144" down
  141.     bsr    send
  142.     move.b    #"J",d0
  143.     bsr    send
  144.     move.w    rowht,d0
  145.     sub.w    rows,d0
  146.     bra    send
  147.  
  148. **************************************
  149.  
  150. putline:
  151.     move.l    lineptr,a0
  152.     move.w    #0,twidth
  153.     move.w    #7,d1
  154. print0:    move.w    width,d0
  155. print1:    tst.b    -1(a0,d0.w)
  156.     bne    print2
  157.     subq.w    #1,d0
  158.     bne    print1
  159. print2:    cmp.w    twidth,d0
  160.     blt    print3
  161.     move.w    d0,twidth
  162. print3:    move.w    rows,d3
  163. pri1:    add.w    width,a0
  164.     sub.w    #1,d3
  165.     bgt    pri1
  166.     dbf    d1,print0
  167. *
  168.     tst.w    twidth
  169.     beq    endline
  170.  
  171.     move.b    #ESC,d0
  172.     bsr    send
  173.     move.w    grmode,d0
  174.     bsr    send
  175.  
  176.     move.w    twidth,d0        ;send number of graphic bytes to follow
  177.     lsl.w    #3,d0
  178.     bsr    send
  179.     move.w    twidth,d0    
  180.     lsr.w    #5,d0
  181.     bsr    send
  182.  
  183.     move.w    twidth,d2                 ;length of the data in byte
  184. print4:    move.w    d2,-(sp)
  185.     moveq    #7,d4
  186. print6:    move.w    d4,pixel
  187.     moveq    #7,d1
  188.     moveq    #0,d0
  189.     move.l    lineptr,a0
  190. s1:    btst    d4,(a0)
  191.     beq     s2
  192.     bset    d1,d0
  193. s2:
  194.     move.w    rows,d3
  195. pri2:    add.w    width,a0
  196.     sub.w    #1,d3
  197.     bgt    pri2
  198.  
  199.     dbf    d1,s1
  200.  
  201.     bsr    send
  202. *
  203.     move.w    pixel,d4
  204.     dbf    d4,print6
  205.  
  206.     add.l    #1,lineptr
  207.     move.w    (sp)+,d2
  208.     subq.w    #1,d2
  209.     bgt    print4
  210.  
  211. endline:
  212.     move.b    #ESC,d0            ;one-time paper feed of 1/216"
  213.     bsr    send
  214.     move.b    #"J",d0
  215.     bsr    send
  216.     move.b    #1,d0
  217.     bsr    send
  218.  
  219.     move.w    #CR,d0
  220.     bra    send
  221.  
  222. ************************************
  223. *
  224. * just finished describing current tile
  225. *
  226. p_endtile:
  227.     move.l    table,a0
  228.     move.l    pblockh(a0),d0
  229.     mulu    #144,d0
  230.     divu    pydpi(a0),d0
  231.     move.w    d0,scroll
  232. pend1:    tst.b    scroll
  233.     beq    pend2
  234.     move.b    #ESC,d0
  235.     bsr    send
  236.     move.b    #"J",d0
  237.     bsr    send
  238.     move.b    #255,d0
  239.     bsr    send
  240.     sub.w    #255,scroll
  241.     bra    pend1
  242. pend2:    tst.w    scroll
  243.     beq    prtok
  244.     move.b    #ESC,d0
  245.     bsr    send
  246.     move.b    #"J",d0
  247.     bsr    send
  248.     move.w    scroll,d0
  249.     bra    send
  250.     
  251. *
  252. * just finished describing all tiles for this page
  253. *
  254. p_endpage:
  255.     bra    prtok
  256.  
  257. *
  258. * finished printing the document
  259. *
  260. p_enddoc:
  261.     bra    prtok
  262.  
  263. *
  264. * user requested stop
  265. *
  266. p_break:
  267.     bra    p_endtile
  268.  
  269. ***************************************************
  270. ***    these are the send routines for the    ***
  271. ***    dot matrix driver.            ***
  272. ***************************************************
  273. sendline:
  274.     move.b    (a0)+,d0
  275.     beq    prtok
  276.     move.l    a0,-(sp)
  277.     bsr    send
  278.     move.l    (sp)+,a0
  279.     bra    sendline
  280.  
  281. send:    jmp    $ffffff
  282.  
  283. ***********************************
  284. ***                ***
  285. ***********************************
  286.  SECTION printer,DATA,PUBLIC
  287.  
  288. prntbl:    dc.l    prtok,prtok,prtok,prtok,p_init
  289.     dc.l    p_bgndoc,p_bgnpage,p_bgntile
  290.     dc.l    p_block
  291.     dc.l    p_endtile,p_endpage,p_enddoc
  292.     dc.l    p_break,p_ident
  293.  
  294. * esc Y lsb msb -160dpi
  295. * esc L lsb msb -120dpi
  296. * esc K lsb msb -60dpi
  297. * esc J n (1/144" increments)
  298.  
  299. xdpi_tbl:    dc.w    60,60,120,120,180,180,180
  300. ydpi_tbl:    dc.w    72,144,72,144,72,144,144
  301. minl_tbl:    dc.w    16,16,32,32,48,48,48
  302. minr_tbl:    dc.w    16,16,32,32,48,48,48
  303. mint_tbl:    dc.w    0,0,0,0,0,0,0
  304. minb_tbl:    dc.w    0,0,0,0,0,0,0
  305. maxw_tbl:    dc.l    480,480,960,960,1280,1280,1280
  306. maxh_tbl:    dc.l    0,0,0,0,0,0,0
  307. xover_tbl:    dc.w    0,0,30,30,70,70,70
  308. yover_tbl:    dc.w    0,50,0,50,0,50,50
  309. rowht_tbl:    dc.w    8,16,8,16,8,16,16
  310. rows_tbl:    dc.w    1,2,1,2,1,2,2
  311. grmode_tbl:    dc.w    "K","K","L","L","Y","Y","Y"
  312.  
  313.  
  314. driver:        dc.b    "Atari SMM804 v2.0",0
  315.  
  316.  SECTION printer,BSS,PUBLIC
  317. table:        ds.l    1
  318. twidth:        ds.w    1
  319. pixel:        ds.w    1
  320. v_base:        ds.l    1
  321. lineptr:    ds.l    1
  322. width:        ds.w    1
  323. count:        ds.w    1
  324. grmode:        ds.w    1
  325. rows:        ds.w    1
  326. rowht:        ds.w    1
  327. scroll:        ds.w    1
  328.