home *** CD-ROM | disk | FTP | other *** search
/ Assembly 1994 - The 3rd Phase / ASMROM94.mdf / fc / utils / stmik / grap.asm < prev    next >
Assembly Source File  |  1991-07-03  |  8KB  |  535 lines

  1. ; Tweaked mode graphic routines
  2.  
  3. gcurc    db    0
  4.  
  5. psetc    PROC    NEAR
  6.     push    ax
  7.     push    bx
  8.     push    cx
  9.     push    dx
  10.     mov    al,cs:gcurc
  11.     call    pset
  12.     pop    dx
  13.     pop    cx
  14.     pop    bx
  15.     pop    ax
  16.     ret
  17. psetc    ENDP
  18.  
  19. pset    PROC    NEAR
  20.     ;(dx,bx)=al, es must be 0a000h
  21.     ;uses/changes ax,bx,cx,dx
  22.     mov    ch,al
  23.     mov    cl,dl
  24.     shl    bx,1
  25.     mov    bx,cs:rows[bx]
  26.     sar    dx,1
  27.     sar    dx,1
  28.     add    bx,dx
  29.     and    cl,3
  30.     mov    ax,102h
  31.     mov    dx,03c4h
  32.     shl    ah,cl
  33.     out    dx,ax
  34.     mov    es:[bx],ch
  35.     ret
  36. pset    ENDP
  37.  
  38. pget    PROC    NEAR
  39.     ;al=(dx,bx), es must be 0a000h
  40.     ;uses/changes ax,bx,cx,dx
  41.     mov    cl,dl
  42.     shl    bx,1
  43.     mov    bx,cs:rows[bx]
  44.     sar    dx,1
  45.     sar    dx,1
  46.     add    bx,dx
  47.     and    cl,3
  48.     mov    ah,cl
  49.     mov    al,4h
  50.     mov    dx,03ceh
  51.     out    dx,ax
  52.     mov    al,es:[bx]
  53.     ret
  54. pget    ENDP
  55.  
  56. ;special plotters for starfield
  57.  
  58. smacro    MACRO    routine,xpos
  59.     local    l1
  60.     cmp    bx,64
  61.     jnb    l1
  62.     add    bx,136
  63.     add    dx,xpos
  64.     jmp    routine
  65. l1:    sub    bx,64
  66.     jmp    routine
  67.     ENDM
  68.     
  69. spset    PROC    NEAR
  70.     smacro    pset,ds:winxpos
  71. spset    ENDP
  72.  
  73. spget    PROC    NEAR
  74.     smacro    pget,ds:winxpos
  75. spget    ENDP
  76.  
  77. ospset    PROC    NEAR
  78.     smacro    pset,ds:owinxpos
  79. ospset    ENDP
  80.  
  81. ospget    PROC    NEAR
  82.     smacro    pget,ds:owinxpos
  83. ospget    ENDP
  84.  
  85. ;line variables
  86. xdif    dw    0
  87. ydif    dw    0
  88. xabs    dw    0
  89. yabs    dw    0
  90. xsgn    dw    0
  91. ysgn    dw    0
  92. xtmp    dw    0
  93. ytmp    dw    0
  94. gcurx    dw    0
  95. gcury    dw    0
  96.  
  97. line    PROC    NEAR
  98.     ;draw line from (ax,cx) to (dx,bx) with color (color)
  99.     mov    es,cs:vram
  100.     mov    cs:gcurx,ax
  101.     mov    cs:gcury,cx
  102.     mov    ax,cs
  103.     mov    ds,ax
  104.     jmp    lineto
  105. line    ENDP
  106.  
  107. lineto    PROC    NEAR
  108.     ;draw line from (gcurx,gcury) to (dx,bx) with color (color)
  109.     ;requires ds=cs, es=vram, changes: ax
  110.     push    cx
  111.     push    si
  112.     push    di
  113.     push    bp
  114.     push    dx
  115.     push    bx
  116.  
  117.     jmp    lt5
  118.     ;set insider point as begin of line
  119. ;    cmp    dx,vxnum1
  120. ;    ja    lt4
  121. ;    cmp    bx,vynum1
  122. ;    ja    lt4
  123. ;    jmp    lt5 ;dx,bx is inside, no changes
  124. ;lt4:    ;dx,bx outside, swap
  125. ;    xchg    bx,ds:gcury
  126. ;    xchg    dx,ds:gcurx
  127. ;    ;check with new bx,dx
  128. ;    cmp    dx,vxnum1
  129. ;    ja    lt6
  130. ;    cmp    bx,vynum1
  131. ;    ja    lt6
  132. ;    jmp    lt5 ;dx,bx is inside
  133. ;
  134. ;lt6:    ;both ends outside! Cut 'em here, not ready yet
  135.  
  136. lt5:    mov    ds:xtmp,dx
  137.     mov    ds:ytmp,bx
  138.     ;calc differencies xdif,ydif (+-) & abs difs, xabs,yabs (+)
  139.     ;and signs xsgn,ysgn (-1/0/1)
  140.     xor    cx,cx
  141.     mov    ax,ds:gcurx
  142.     sub    ax,dx
  143.     mov    ds:xdif,ax
  144.     or    ax,ax
  145.     je    lt1
  146.     inc    cx
  147.     test    ax,32768
  148.     jz    lt1
  149.     neg    ax
  150.     dec    cx
  151.     dec    cx
  152. lt1:    mov    ds:xabs,ax
  153.     mov    ds:xsgn,cx
  154.  
  155.     xor    cx,cx
  156.     mov    ax,ds:gcury
  157.     sub    ax,bx
  158.     mov    ds:ydif,ax
  159.     or    ax,ax
  160.     je    lt2
  161.     inc    cx
  162.     test    ax,32768
  163.     jz    lt2
  164.     neg    ax
  165.     dec    cx
  166.     dec    cx
  167. lt2:    mov    ds:yabs,ax
  168.     mov    ds:ysgn,cx
  169.  
  170.     ;which is bigger?
  171.     cmp    ax,ds:xabs
  172.     ja    lt3
  173.  
  174.     ;xbigger
  175.  
  176.     ;calc addl/h (si,di)
  177.     jne    lt9
  178.     ;1/1 addition, 45 degree curve
  179.     cmp    ax,0
  180.     jne    lt15
  181.     mov    dx,cs:gcurx
  182.     mov    bx,ds:gcury
  183.     call    psetc
  184.     jmp    lt10
  185. lt15:    mov    di,ds:ysgn
  186.     mov    si,65535
  187.     jmp    lt10
  188. lt9:    mov    dx,ax ;dx=yabs
  189.     xor    ax,ax
  190.     div    ds:xabs ;ax=lowadd
  191.     mov    si,ax
  192.     mov    di,ds:ysgn
  193.  
  194. lt10:    mov    ax,32767
  195.     mov    bp,ds:xsgn
  196.     mov    cx,ds:xabs
  197.     inc    cx
  198.     mov    dx,ds:xtmp
  199.     mov    bx,ds:ytmp
  200. lt7:    call    psetc
  201.     add    dx,bp ;xsgn
  202.     add    ax,si ;yaddl
  203.     jnc    lt8
  204.     add    bx,di ;ysgn
  205. lt8:    loop    lt7
  206.  
  207.     jmp    lt0
  208.  
  209.  
  210. lt3:    ;ybigger
  211.  
  212.     mov    dx,ds:xabs
  213.     xor    ax,ax
  214.     div    ds:yabs ;ax=lowadd
  215.     mov    si,ax
  216.     mov    di,ds:xsgn
  217.  
  218. lt12:    mov    ax,32767
  219.     mov    bp,ds:ysgn
  220.     mov    cx,ds:yabs
  221.     inc    cx
  222.     mov    dx,ds:xtmp
  223.     mov    bx,ds:ytmp
  224. lt13:    call    psetc
  225.     add    bx,bp ;ysgn
  226.     add    ax,si ;xaddl
  227.     jnc    lt14
  228.     add    dx,di ;xsgn
  229. lt14:    loop    lt13
  230.     
  231. lt0:    pop    bx
  232.     pop    dx
  233.     mov    ds:gcurx,dx
  234.     mov    ds:gcury,bx
  235.     pop    bp
  236.     pop    di
  237.     pop    si
  238.     pop    cx
  239.     ret
  240. lineto    ENDP
  241.  
  242. ; UFF font routines
  243.  
  244. printc2    PROC    NEAR
  245.     ;prints a letter to DX,BX from cs:demoseg;AL=letter,cs:printcadd=coladd
  246.     push    bx
  247.     push    dx
  248.     mov    es,cs:vram
  249.     mov    ds,cs:fontseg
  250.     mov    cx,ds:[12]
  251.     mov    bl,al
  252.     xor    bh,bh
  253.     mov    bp,ds:[bx+16+512]
  254.     and    bp,255
  255.     shl    bx,1
  256.     mov    ax,ds
  257.     cmp    word ptr ds:[bx+16],0
  258.     jne    prc4
  259.     pop    dx
  260.     pop    bx
  261.     jmp    prc5
  262. prc4:    add    ax,ds:[bx+16]
  263.     mov    ds,ax
  264.     xor    si,si
  265.     pop    dx
  266.     pop    bx
  267. prc1:    push    dx
  268.     push    bx
  269.     push    cx
  270.     shl    bx,1
  271.     mov    bx,cs:rows[bx]
  272.     mov    cx,bp
  273.     mov    al,dl
  274.     sar    dx,1
  275.     sar    dx,1
  276.     add    bx,dx
  277.     and    al,3
  278.     cmp    al,1
  279.     je    prc21
  280.     cmp    al,2
  281.     je    prc22
  282.     cmp    al,3
  283.     je    prc23
  284. prc2:    mov    ax,102h
  285.     mov    dx,03c4h
  286.     out    dx,ax
  287.     lodsb
  288.     cmp    al,255
  289.     je    prc201
  290.     mov    es:[bx],al
  291. prc201:    dec    cx
  292.     jz    prc3
  293. prc21:    mov    ax,202h
  294.     mov    dx,03c4h
  295.     out    dx,ax
  296.     lodsb
  297.     cmp    al,255
  298.     je    prc211
  299.     mov    es:[bx],al
  300. prc211:    dec    cx
  301.     jz    prc3
  302. prc22:    mov    ax,402h
  303.     mov    dx,03c4h
  304.     out    dx,ax
  305.     lodsb
  306.     cmp    al,255
  307.     je    prc221
  308.     mov    es:[bx],al
  309. prc221:    dec    cx
  310.     jz    prc3
  311. prc23:    mov    ax,802h
  312.     mov    dx,03c4h
  313.     out    dx,ax
  314.     lodsb
  315.     cmp    al,255
  316.     je    prc231
  317.     mov    es:[bx],al
  318. prc231:    inc    bx
  319.     dec    cx
  320.     jz    prc3
  321.     jmp    prc2
  322. prc3:    pop    cx
  323.     pop    bx
  324.     pop    dx
  325.     inc    bx
  326.     loop    prc1x
  327. prc5:    add    dx,bp
  328. prc91:    ret
  329. prc1x:    jmp    prc1
  330. printc2    ENDP
  331.  
  332. printc    PROC    NEAR
  333.     ;prints a letter to DX,BX from cs:demoseg;AL=letter,cs:printcadd=coladd
  334.     push    bx
  335.     push    dx
  336.     mov    es,cs:vram
  337.     mov    ds,cs:fontseg
  338.     mov    cx,ds:[12]
  339.     mov    bl,al
  340.     xor    bh,bh
  341.     mov    bp,ds:[bx+16+512]
  342.     and    bp,255
  343.     shl    bx,1
  344.     mov    ax,ds
  345.     cmp    word ptr ds:[bx+16],0
  346.     jne    prd4
  347.     pop    dx
  348.     pop    bx
  349.     jmp    prd5
  350. prd4:    add    ax,ds:[bx+16]
  351.     mov    ds,ax
  352.     xor    si,si
  353.     pop    dx
  354.     pop    bx
  355. prd1:    push    dx
  356.     push    bx
  357.     push    cx
  358.     shl    bx,1
  359.     mov    bx,cs:rows[bx]
  360.     mov    cx,bp
  361.     mov    al,dl
  362.     sar    dx,1
  363.     sar    dx,1
  364.     add    bx,dx
  365.     and    al,3
  366.     cmp    al,1
  367.     je    prd21
  368.     cmp    al,2
  369.     je    prd22
  370.     cmp    al,3
  371.     je    prd23
  372. prd2:    mov    ax,102h
  373.     mov    dx,03c4h
  374.     out    dx,ax
  375.     lodsb
  376.     cmp    al,255
  377.     je    prd201
  378.     add    al,cs:printcadd
  379.     and    al,63+128
  380.     mov    es:[bx],al
  381. prd201:    dec    cx
  382.     jz    prd3
  383. prd21:    mov    ax,202h
  384.     mov    dx,03c4h
  385.     out    dx,ax
  386.     lodsb
  387.     cmp    al,255
  388.     je    prd211
  389.     add    al,cs:printcadd
  390.     and    al,63+128
  391.     mov    es:[bx],al
  392. prd211:    dec    cx
  393.     jz    prd3
  394. prd22:    mov    ax,402h
  395.     mov    dx,03c4h
  396.     out    dx,ax
  397.     lodsb
  398.     cmp    al,255
  399.     je    prd221
  400.     add    al,cs:printcadd
  401.     and    al,63+128
  402.     mov    es:[bx],al
  403. prd221:    dec    cx
  404.     jz    prd3
  405. prd23:    mov    ax,802h
  406.     mov    dx,03c4h
  407.     out    dx,ax
  408.     lodsb
  409.     cmp    al,255
  410.     je    prd231
  411.     add    al,cs:printcadd
  412.     and    al,63+128
  413.     mov    es:[bx],al
  414. prd231:    inc    bx
  415.     dec    cx
  416.     jz    prd3
  417.     jmp    prd2
  418. prd3:    pop    cx
  419.     pop    bx
  420.     pop    dx
  421.     inc    bx
  422.     loop    prd1x
  423. prd5:    add    dx,bp
  424.     inc    dx
  425. prd91:    ret
  426. prd1x:    jmp    prd1
  427. printc    ENDP
  428.  
  429. printclr PROC    NEAR
  430.     ;clears a letter to DX,BX from cs:demoseg;AL=letter,cs:printcadd=coladd
  431.     push    bx
  432.     push    dx
  433.     mov    es,cs:vram
  434.     mov    ds,cs:fontseg
  435.     mov    cx,ds:[12]
  436.     mov    bl,al
  437.     xor    bh,bh
  438.     mov    bp,ds:[bx+16+512]
  439.     and    bp,255
  440.     shl    bx,1
  441.     mov    ax,ds
  442.     cmp    word ptr ds:[bx+16],0
  443.     jne    prdl4
  444.     pop    dx
  445.     pop    bx
  446.     jmp    prdl5
  447. prdl4:    add    ax,ds:[bx+16]
  448.     mov    ds,ax
  449.     xor    si,si
  450.     pop    dx
  451.     pop    bx
  452. prdl1:    push    dx
  453.     push    bx
  454.     push    cx
  455.     shl    bx,1
  456.     mov    bx,cs:rows[bx]
  457.     mov    cx,bp
  458.     mov    al,dl
  459.     sar    dx,1
  460.     sar    dx,1
  461.     add    bx,dx
  462.     and    al,3
  463.     cmp    al,1
  464.     je    prdl21
  465.     cmp    al,2
  466.     je    prdl22
  467.     cmp    al,3
  468.     je    prdl23
  469. prdl2:    mov    ax,102h
  470.     mov    dx,03c4h
  471.     out    dx,ax
  472.     lodsb
  473.     cmp    al,255
  474.     je    prdl201
  475.     xor    al,al
  476.     mov    es:[bx],al
  477. prdl201:    dec    cx
  478.     jz    prdl3
  479. prdl21:    mov    ax,202h
  480.     mov    dx,03c4h
  481.     out    dx,ax
  482.     lodsb
  483.     cmp    al,255
  484.     je    prdl211
  485.     xor    al,al
  486.     mov    es:[bx],al
  487. prdl211:    dec    cx
  488.     jz    prdl3
  489. prdl22:    mov    ax,402h
  490.     mov    dx,03c4h
  491.     out    dx,ax
  492.     lodsb
  493.     cmp    al,255
  494.     je    prdl221
  495.     xor    al,al
  496.     mov    es:[bx],al
  497. prdl221:    dec    cx
  498.     jz    prdl3
  499. prdl23:    mov    ax,802h
  500.     mov    dx,03c4h
  501.     out    dx,ax
  502.     lodsb
  503.     cmp    al,255
  504.     je    prdl231
  505.     xor    al,al
  506.     mov    es:[bx],al
  507. prdl231:    inc    bx
  508.     dec    cx
  509.     jz    prdl3
  510.     jmp    prdl2
  511. prdl3:    pop    cx
  512.     pop    bx
  513.     pop    dx
  514.     inc    bx
  515.     loop    prdl1
  516. prdl5:    add    dx,bp
  517.     inc    dx
  518.     ret
  519. printclr ENDP
  520.  
  521. getfontwidth PROC NEAR
  522.     ;clears a letter to DX,BX from cs:demoseg;AL=letter,cs:printcadd=coladd
  523.     push    ds
  524.     push    bx
  525.     mov    ds,cs:fontseg
  526.     mov    bl,al
  527.     xor    bh,bh
  528.     mov    al,ds:[bx+16+512]
  529.     xor    ah,ah
  530.     pop    bx
  531.     pop    ds
  532.     ret
  533. getfontwidth ENDP
  534.  
  535.