home *** CD-ROM | disk | FTP | other *** search
/ Creative Computers / CreativeComputers.iso / shareware / text / dvi_3.62 / source / dvisrc.lha / dvipkch.s < prev    next >
Text File  |  1993-07-09  |  9KB  |  452 lines

  1.  
  2. ; Datei: DVIPKCH.S
  3. ; Autor: Ingo Eichenseher
  4. ; Letzte Aenderung: 09.04.1991 07:29
  5.  
  6.  
  7. nyb_ptr        equ        a6
  8. nyb_sub        equ        a5
  9. addr        equ        a4
  10. laddr        equ        a3
  11. lmask        equ        a2
  12. base        equ        a1
  13.  
  14. r            equ        d0
  15. count        equ        d1
  16. count1        equ        d2
  17. dyn_f        equ        d3
  18. xx            equ        d4
  19. state        equ        d5
  20. mask        equ        d6
  21. ww            equ        d7
  22.  
  23. paddr        equ        nyb_ptr
  24. pmask        equ        dyn_f
  25. yy            equ        xx
  26.  
  27. c_dyn_f        equ        4
  28. c_state        equ        6
  29. c_w            equ        28
  30. c_h            equ        32
  31. c_hoff        equ        36
  32. c_voff        equ        40
  33. c_data        equ        44
  34.  
  35.  
  36.             import        frame_buffer
  37.             import        frame_width
  38.             import        frame_height
  39.             import        frame_size
  40.             
  41.             export        draw_char
  42.             export        draw_rule
  43.             export        ldraw_char
  44.             
  45.             code
  46.  
  47. get_hnyb:    move.b    (nyb_ptr),d0
  48.             lea.l    get_lnyb(pc),nyb_sub
  49.             lsr.b    #4,d0
  50.             rts
  51. get_lnyb:    move.b    (nyb_ptr)+,d0
  52.             lea.l    get_hnyb(pc),nyb_sub
  53.             and.b    #$0f,d0
  54.             rts
  55.  
  56. pk_pnum:    clr.w    d0
  57.             jsr        (nyb_sub)
  58.             bne.b    pk_pnz
  59.             moveq    #-1,count
  60. pk_pzlop:    addq    #1,count
  61.             jsr        (nyb_sub)
  62.             beq.b    pk_pzlop
  63.             clr.w    count1
  64.             move.b    d0,count1
  65. pk_pzlop1:    jsr        (nyb_sub)
  66.             lsl.w    #4,count1
  67.             or.b    d0,count1
  68.             dbra    count,pk_pzlop1
  69.             sub.w    #15,count1
  70.             add.w    dyn_f,count1
  71.             move.w    #13,d0
  72.             sub.w    dyn_f,d0
  73.             lsl.w    #4,d0
  74.             add.w    count1,d0            
  75.             bra.b    pk_end
  76.  
  77. pk_pnz:        cmp.b    dyn_f,d0
  78.             ble.b    pk_end
  79.  
  80. pk_pod:        cmp.b    #14,d0
  81.             blt.b    pk_plt14
  82.             
  83.             bne.b    pk_peq15
  84.             bsr.b    pk_pnum
  85.             move.w    d0,rep_cnt(base)
  86.             bra.b    pk_pnum
  87.             
  88. pk_peq15:    move    #1,rep_cnt(base)
  89.             bra.b    pk_pnum
  90.  
  91. pk_plt14:    subq.w    #1,d0
  92.             sub.w    dyn_f,d0
  93.             lsl        #4,d0
  94.             move.w    d0,d1
  95.             jsr        (nyb_sub)
  96.             or.b    d1,d0
  97.             add.w    dyn_f,d0
  98.             addq.w    #1,d0
  99. pk_end:        rts
  100.  
  101.  
  102. ; void draw_char(pk_char *c, int x, int y)
  103.  
  104. draw_char:    movem.l    d2-d7/a1-a6,-(sp)
  105.             lea.l    base_addr,base
  106.             sub.w    c_hoff+2(a0),d0
  107.             sub.w    c_voff+2(a0),d1
  108.             move.w    c_dyn_f(a0),dyn_f        ; set dyn_f register
  109.  
  110. macro        calc_laddr    draw_end
  111.             local    draw_px,draw_nx,draw_l3
  112.             move.w    d1,y(base)
  113.             cmp.w    frame_height,d1
  114.             bge        draw_end
  115.             muls    frame_width,d1            ; length * y
  116.             ext.l    d0
  117.             bpl.b    draw_px
  118.  
  119.             subq    #7,d0                    ; x-7
  120.             divs    #8,d0                    ; (x-7)/8
  121.             swap    d0
  122.             addq.w    #7,d0                    ; (x-7)%8+7
  123.             swap    d0
  124.             bra.b    draw_nx
  125.             
  126. draw_px:    divs    #8,d0                    ; x / 8
  127. draw_nx:    move.w    d0,x(base)
  128.             move.l    frame_buffer,laddr        ; laddr = frame_buffer
  129.             adda.l    d1,laddr                ; laddr += length * 8
  130.             adda.w    d0,laddr                ; laddr += x/8
  131.             swap    d0
  132.             tst.w    d0                        ; x % 8
  133.             bne.b    draw_l3
  134.             subq.l    #1,laddr
  135.             subq.w    #1,x(base)
  136. draw_l3:    moveq    #1,mask
  137.             ror.b    d0,mask
  138.             move.w    mask,lmask
  139.  
  140. endm
  141.             calc_laddr draw_end
  142.             move.w    c_w+2(a0),w(base)
  143.             subq.w    #1,w(base)
  144.             bmi        draw_end
  145.             move.w    c_h+2(a0),h(base)
  146.             
  147.             cmp.w    #14,dyn_f
  148.             bne.b    draw_packd
  149.  
  150.             lea        c_data(a0),paddr
  151.             moveq    #7,pmask
  152. draw_p1:    subq.w    #1,h(base)
  153.             bmi        draw_end
  154.             move.w    w(base),ww
  155.             move.w    x(base),xx
  156.             move.l    laddr,addr
  157.             move.w    lmask,mask
  158. draw_p2:    ror.b    #1,mask
  159.             bcc.b    draw_p3
  160.             addq    #1,addr
  161.             addq.w    #1,xx
  162. draw_p3:    btst.b    pmask,(paddr)
  163.             beq.b    draw_p4
  164.             tst.w    y(base)
  165.             bmi.b    draw_p4
  166.             tst.w    xx
  167.             bmi.b    draw_p4
  168.             cmp.w    frame_width,xx
  169.             bge.b    draw_p4
  170.             or.b    mask,(addr)
  171. draw_p4:    subq    #1,pmask
  172.             bpl.b    draw_p5
  173.             moveq    #7,pmask
  174.             addq    #1,paddr
  175. draw_p5:    dbra    ww,draw_p2
  176.             adda.w    frame_width,laddr
  177.             addq.w    #1,y(base)
  178.             move.w    y(base),xx
  179.             cmp.w    frame_height,xx
  180.             bge        draw_end
  181.             bra.b    draw_p1
  182.  
  183.  
  184. draw_packd:    lea        c_data(a0),nyb_ptr        ; nyb_ptr = data
  185.             lea.l    get_hnyb(pc),nyb_sub    ; Get hi-nyble next
  186.             moveq    #-1,state
  187.             tst.w    c_state(a0)                ; Get state
  188.             bne.b    draw_l4
  189.             neg.w    state
  190. draw_l4:    clr.w    rep_mode(base)
  191.             clr.w    rep_cnt(base)
  192.             clr.w    r
  193.  
  194. draw_lop1:    tst.w    h(base)
  195.             ble        draw_end
  196.             clr.w    rep_cnt(base)
  197.             move.w    lmask,mask
  198.             move.l    laddr,addr
  199.             move.w    w(base),ww
  200.             move.w    x(base),xx
  201.             movem.w    state/r,(base)
  202.             movem.l    nyb_sub/nyb_ptr,save2(base)
  203.             
  204.             tst.w    state
  205.             bmi.b    draw_w1
  206.             bra.b    draw_b1
  207.                         
  208. draw_bw:    bsr        pk_pnum
  209.             neg.w    state
  210.             bmi.b    draw_w1
  211.             
  212. draw_b1:    subq.w    #1,r
  213.             bmi.b    draw_bw
  214.             ror.b    #1,mask
  215.             bcc.b    draw_b2
  216.             addq    #1,addr
  217.             addq.w    #1,xx
  218. draw_b2:    tst.w    y(base)
  219.             bmi.b    draw_b2a
  220.             tst.w    xx
  221.             bmi.b    draw_b2a
  222.             cmp.w    frame_width,xx
  223.             bge.b    draw_b2a
  224.             or.b    mask,(addr)
  225. draw_b2a:    dbra    ww,draw_b1
  226.             bra.b    draw_lend
  227.             
  228. draw_w1:    subq    #1,r
  229.             bmi.b    draw_bw
  230.             ror.b    #1,mask
  231.             bcc.b    draw_w2
  232.             addq    #1,addr
  233.             addq.w    #1,xx
  234. draw_w2:    dbra    ww,draw_w1
  235.  
  236. draw_lend:    adda.w    frame_width,laddr
  237.             addq.w    #1,y(base)
  238.             move.w    y(base),xx
  239.             cmp.w    frame_height,xx
  240.             bge        draw_end
  241.             subq.w    #1,h(base)
  242.             tst.w    rep_mode(base)
  243.             bne.b    draw_l1
  244.             tst.w    rep_cnt(base)
  245.             beq        draw_lop1
  246.             move.w    rep_cnt(base),rep_mode(base)
  247.             addq.w    #1,rep_mode(base)
  248. draw_l1:    subq.w    #1,rep_mode(base)
  249.             beq        draw_lop1
  250.             movem.w    (base),state/r
  251.             movem.l    save2(base),nyb_sub/nyb_ptr
  252.             bra        draw_lop1
  253.             
  254. draw_end:    movem.l    (sp)+,d2-d7/a1-a6
  255.             rts    
  256.  
  257. ; void draw_rule(int x, int y, int w, int h)
  258.  
  259. h_off        equ        52
  260.  
  261. draw_rule:    movem.l d2-d7/a1-a6,-(sp)
  262.             lea.l    base_addr,base
  263.             subq.w    #1,d2
  264.             move.w    h_off(sp),h(base)
  265.             move.w    d2,w(base)
  266.             calc_laddr draw_rend
  267.  
  268. draw_r1:    subq.w    #1,h(base)
  269.             bmi        draw_rend
  270.             move.w    w(base),ww
  271.             move.w    x(base),xx
  272.             move.l    laddr,addr
  273.             move.w    lmask,mask
  274. draw_r2:    ror.b    #1,mask
  275.             bcc.b    draw_r3
  276.             addq    #1,addr
  277.             addq.w    #1,xx
  278. draw_r3:    tst.w    y(base)
  279.             bmi.b    draw_r4
  280.             tst.w    xx
  281.             bmi.b    draw_r4
  282.             cmp.w    frame_width,xx
  283.             bge.b    draw_r4
  284.             or.b    mask,(addr)
  285. draw_r4:    dbra    ww,draw_r2
  286.             adda.w    frame_width,laddr
  287.             addq.w    #1,y(base)
  288.             move.w    y(base),xx
  289.             cmp.w    frame_height,xx
  290.             blt.b    draw_r1
  291.             
  292. draw_rend:    movem.l    (sp)+,d2-d7/a1-a6
  293.             rts    
  294.  
  295. ldraw_char:    movem.l    d2-d7/a1-a6,-(sp)
  296.             lea.l    base_addr,base
  297.             add.w    c_voff+2(a0),d0
  298.             sub.w    c_hoff+2(a0),d1
  299.             move.w    c_dyn_f(a0),dyn_f        ; set dyn_f register
  300.  
  301.             move.w    d1,y(base)
  302.             cmp.w    frame_height,d1
  303.             bge        ldraw_end
  304.             muls    frame_width,d1            ; length * y
  305.             ext.l    d0
  306.             bpl.b    ldraw_px
  307.  
  308.             subq    #7,d0                    ; x-7
  309.             divs    #8,d0                    ; (x-7)/8
  310.             swap    d0
  311.             addq.w    #7,d0                    ; (x-7)%8+7
  312.             swap    d0
  313.             bra.b    ldraw_nx
  314.             
  315. ldraw_px:    divs    #8,d0                    ; x / 8
  316. ldraw_nx:    move.w    d0,x(base)
  317.             bmi        ldraw_end
  318.             move.l    frame_buffer,laddr        ; laddr = frame_buffer
  319.             adda.l    d1,laddr                ; laddr += length * 8
  320.             adda.w    d0,laddr                ; laddr += x/8
  321.             swap    d0
  322.             tst.w    d0                        ; x % 8
  323.             move.b    #128,mask
  324.             ror.b    d0,mask
  325.             move.w    mask,lmask
  326.  
  327.             move.w    c_w+2(a0),w(base)
  328.             subq.w    #1,w(base)
  329.             bmi        ldraw_end
  330.             move.w    c_h+2(a0),h(base)
  331.             
  332.             cmp.w    #14,dyn_f
  333.             bne.b    ldraw_packd
  334.  
  335.             lea        c_data(a0),paddr
  336.             moveq    #7,pmask
  337. ldraw_p1:    subq.w    #1,h(base)
  338.             bmi        ldraw_end
  339.             move.w    w(base),ww
  340.             move.l    laddr,addr
  341.             move.w    y(base),yy
  342. ldraw_p2:    btst.b    pmask,(paddr)
  343.             beq.b    ldraw_p4
  344.             tst.w    yy
  345.             bmi.b    ldraw_p4
  346.             cmp.w    frame_height,yy
  347.             bge.b    ldraw_p4
  348.             move.w    x(base),count
  349.             cmp.w    frame_width,count
  350.             bge.b    ldraw_p4
  351.             or.b    mask,(addr)
  352. ldraw_p4:    subq    #1,pmask
  353.             bpl.b    ldraw_p5
  354.             moveq    #7,pmask
  355.             addq    #1,paddr
  356. ldraw_p5:    adda.w    frame_width,addr
  357.             addq    #1,yy
  358.             dbra    ww,ldraw_p2
  359.             rol.b    #1,mask
  360.             bcc.b    ldraw_p1
  361.             subq    #1,laddr
  362.             subq    #1,x(base)
  363.             bpl.b    ldraw_p1
  364.             bra        ldraw_end
  365.             
  366. ldraw_packd:lea        c_data(a0),nyb_ptr        ; nyb_ptr = data
  367.             lea.l    get_hnyb(pc),nyb_sub    ; Get hi-nyble next
  368.             moveq    #-1,state
  369.             tst.w    c_state(a0)                ; Get state
  370.             bne.b    ldraw_l4
  371.             neg.w    state
  372. ldraw_l4:    clr.w    rep_mode(base)
  373.             clr.w    rep_cnt(base)
  374.             clr.w    r
  375.  
  376. ldraw_lop1:    tst.w    h(base)
  377.             ble        ldraw_end
  378.             clr.w    rep_cnt(base)
  379.             move.l    laddr,addr
  380.             move.w    w(base),ww
  381.             move.w    y(base),yy
  382.             movem.w    state/r,(base)
  383.             movem.l    nyb_sub/nyb_ptr,save2(base)
  384.             
  385.             tst.w    state
  386.             bmi.b    ldraw_w1
  387.             bra.b    ldraw_b1
  388.             
  389. ldraw_bw:    bsr        pk_pnum
  390.             neg.w    state
  391.             bmi.b    ldraw_w1
  392.             
  393. ldraw_b1:    subq.w    #1,r
  394.             bmi.b    ldraw_bw
  395.             tst.w    yy
  396.             bmi.b    ldraw_b2a
  397.             cmp.w    frame_height,yy
  398.             bge.b    ldraw_b2a
  399.             move.w    x(base),count
  400.             cmp.w    frame_width,count
  401.             bge.b    ldraw_b2a
  402.             or.b    mask,(addr)
  403. ldraw_b2a:    adda.w    frame_width,addr
  404.             addq    #1,yy
  405.             dbra    ww,ldraw_b1
  406.             bra.b    ldraw_lend
  407.  
  408. ldraw_w1:    subq.w    #1,r
  409.             bmi.b    ldraw_bw
  410.             adda.w    frame_width,addr
  411.             addq    #1,yy
  412.             dbra    ww,ldraw_w1
  413.  
  414. ldraw_lend:    rol.b    #1,mask
  415.             bcc.b   ldraw_l2
  416.             subq    #1,laddr
  417.             subq.w    #1,x(base)
  418.             bmi.b    ldraw_end
  419. ldraw_l2:    subq.w    #1,h(base)
  420.             tst.w    rep_mode(base)
  421.             bne.b    ldraw_l1
  422.             tst.w    rep_cnt(base)
  423.             beq        ldraw_lop1
  424.             move.w    rep_cnt(base),rep_mode(base)
  425.             addq.w    #1,rep_mode(base)
  426. ldraw_l1:    subq.w    #1,rep_mode(base)
  427.             beq        ldraw_lop1
  428.             movem.w    (base),state/r
  429.             movem.l    save2(base),nyb_sub/nyb_ptr
  430.             bra        ldraw_lop1
  431.             
  432. ldraw_end:    movem.l    (sp)+,d2-d7/a1-a6
  433.             rts    
  434.  
  435.             offset
  436.  
  437. save1:        ds.w    2
  438. save2:        ds.l    2
  439. rep_mode:    ds.w    1
  440. rep_cnt:    ds.w    1
  441. w:            ds.w    1
  442. h:            ds.w    1
  443. x:            ds.w    1
  444. y:            ds.w    1
  445. size:        ds.w    0
  446.  
  447.             bss
  448.  
  449. base_addr:    ds.w    size/2
  450.  
  451.             end
  452.