home *** CD-ROM | disk | FTP | other *** search
/ Collection of Hack-Phreak Scene Programs / cleanhpvac.zip / cleanhpvac / TEXTBALL.ZIP / PUTDOT2.ASM < prev    next >
Assembly Source File  |  1993-06-13  |  6KB  |  284 lines

  1.     DOSSEG
  2.     .MODEL SMALL
  3.     .STACK 200h
  4.     .CODE
  5.     .386
  6.     Ideal
  7. ────────────────────────────────────────────────────────────────────────────
  8. CharSeg     dw  0b800h
  9.  
  10. Msg     db  "here's the test >ÇÇ<  blah..$"
  11.  
  12. MinX    =   1   *8
  13. MaxX    =   78  *8
  14. MinY    =   1   *8
  15. MaxY    =   41  *8
  16.  
  17. BlockChr    dw  0,0,0,0,0,0,0,0
  18.             dw  0001100000000000b
  19.             dw  0111111000000000b 
  20.             dw  0111111000000000b
  21.             dw  1111111100000000b
  22.             dw  1111111100000000b
  23.             dw  0111111000000000b
  24.             dw  0111111000000000b
  25.             dw  0001100000000000b
  26.             dw  0,0,0,0,0,0,0,0
  27. ────────────────────────────────────────────────────────────────────────────
  28. MACRO @vidmemm0                    ; Vidmem mode 0 (character bitmap dat)
  29.         mov dx,3c4h
  30.         mov ax,00402h
  31.         out dx,ax
  32.         mov ax,00604h
  33.         out dx,ax
  34.         ──
  35.         mov dx,3ceh
  36.         mov ax,00005h
  37.         out dx,ax
  38.         mov ax,00c06h
  39.         out dx,ax
  40.         mov ax,00204h
  41.         out dx,ax
  42. ENDM
  43.  
  44. MACRO @vidmemm1                       ; Vidmem mode 1 (screen character dat)
  45.         mov dx,3c4h
  46.         mov ax,00302h
  47.         out dx,ax
  48.         mov ax,00204h
  49.         out dx,ax
  50.         ──
  51.         mov dx,3ceh
  52.         mov ax,01005h
  53.         out dx,ax
  54.         mov ax,00e06h
  55.         out dx,ax
  56.         mov ax,00004h
  57.         out dx,ax
  58. ENDM
  59.  
  60. MACRO @FullVertWait
  61.  LOCAL @@Vr, @@Nvr
  62.     mov     dx,3dah
  63. @@Vr:
  64.     in      al,dx
  65.     test    al,8
  66.     jz      @@Vr                    ;wait until Verticle Retrace starts
  67. @@Nvr:
  68.     in      al,dx
  69.     test    al,8
  70.     jnz     @@Nvr                   ;wait until Verticle Retrace Ends
  71. ENDM @FullVertWait
  72.  
  73.     ;this only sets 80x43... does ANYONE know how to set 80x50
  74.     ; with a character width of 8 NOT 9???
  75. PROC Set80x50 NEAR
  76.     mov     ax,1201h        ;set 350 scan lines
  77.     mov     bl,30h
  78.     int     10h
  79.  
  80.     mov     ax,0003h
  81.     int     10h
  82.  
  83. ;    mov     ax,1202h        ;set 400 scan lines
  84. ;    mov     bl,30h
  85. ;    int     10h
  86.  
  87.     mov     dx,3cch
  88.     in      al,dx
  89.     mov     dx,3c2h
  90.     and     al,00111111b
  91.     or      al,01000000b
  92.     out     dx,al
  93.     
  94.     mov     ax,1112h
  95.     mov     bl,0
  96.     int     10h             ;load 8x8 bios font
  97.  
  98.     mov     dx,3cch         ;set 400 scan lines
  99.     in      al,dx
  100.     mov     dx,3c2h
  101.     and     al,00111111b
  102.     or      al,01000000b
  103.     out     dx,al
  104.  
  105.     mov     dx,3d4h         ;set char height to 8
  106.     mov     al,9
  107.     out     dx,al
  108.     inc     dx
  109.     in      al,dx
  110.     and     al,11100000b
  111.     or      al,7
  112.     out     dx,al
  113.  
  114.     ret
  115. ENDP Set80x50
  116.  
  117. PROC FillScreen
  118.     pusha
  119.     push    ds es
  120.     mov     ax,cs
  121.     mov     ds,ax
  122.     mov     es,[CharSeg]
  123.  
  124.     mov     di,0
  125.     mov     ax,180h
  126.     shl     eax,16
  127.     mov     ax,181h
  128.     mov     bx,182h
  129.     shl     ebx,16
  130.     mov     bx,183h
  131.     mov     dx,50
  132. @@TopLoop:
  133.     mov     cx,40
  134. @@MidLoop:
  135.     mov     [es:di],eax
  136.     mov     [es:di+160],ebx
  137.     add     di,4
  138.     dec     cx
  139.     jne     @@MidLoop
  140.     add     di,160
  141.     dec     dx
  142.     jne     @@TopLoop
  143.  
  144.     pop     es ds
  145.     popa
  146.     ret
  147. ENDP FillScreen
  148. ────────────────────────────────────────────────────────────────────────────
  149.  
  150. OldDotdi    dw  0
  151. DotXpos     dw  0
  152. DotYpos     dw  0
  153. DotXvel     dw  3
  154. DotYvel     dw  2
  155.  
  156. PROC PlaceDot
  157.     pusha
  158.     push    es ds
  159.     mov     bx,cs
  160.     mov     ds,bx
  161.     mov     es,[CharSeg]
  162.  
  163.     mov     ax,[DotYpos]
  164.     mov     cx,[DotXpos]
  165.  
  166.     cmp     cx,80*8     ;make sure the dot is in range..
  167.     jb      @@Xok
  168.     mov     cx,80*8-1
  169. @@Xok:
  170.     cmp     ax,50*8
  171.     jb      @@Yok
  172.     mov     ax,50*8-1
  173. @@Yok:
  174.     mov     di,ax
  175.     shr     di,3
  176.     imul    di,80
  177.     mov     bx,cx
  178.     shr     bx,3
  179.     add     di,bx   
  180.     add     di,di       ;di = dest for object
  181.     
  182.     xchg    [OldDotDi],di
  183.     or      di,di
  184.     je      @@NoErase
  185.     xor     ebx,ebx
  186.     mov     [es:di],ebx
  187.     mov     [es:di+160],ebx     ;erase old block
  188. @@NoErase:
  189.     and     ax,111b         ;make both range 0-8
  190.     xor     ax,111b        ;because -y is up
  191.     and     cx,111b
  192.  
  193.     mov     di,[OldDotDi]
  194.     mov     [DWORD es:di],01800181h     
  195.     mov     [DWORD es:di+160],01820183h ;write new block
  196.     
  197.     push    ax
  198.     @VidMemM0
  199.     pop     ax
  200.  
  201.     add     ax,ax
  202.  
  203.     mov     di,128*32
  204.     mov     si,offset BlockChr
  205.     add     si,ax
  206.     mov     bp,8
  207.     cld
  208. @@TheLoop:
  209.     lodsw
  210.     ror     ax,cl
  211.     mov     [es:di],al
  212.     mov     [es:di+32],ah
  213.     inc     di
  214.     dec     bp
  215.     jne     @@TheLoop
  216.  
  217.     mov     di,130*32
  218.     mov     bp,8
  219. @@TheLoop2:
  220.     lodsw
  221.     ror     ax,cl
  222.     mov     [es:di],al
  223.     mov     [es:di+32],ah
  224.     inc     di
  225.     dec     bp
  226.     jne     @@TheLoop2
  227.  
  228.     @VidMemM1
  229.  
  230.     pop     ds es
  231.     popa
  232.     ret
  233. ENDP PlaceDot
  234.  
  235. ────────────────────────────────────────────────────────────────────────────
  236. START:
  237.     mov     ax,cs
  238.     mov     ds,ax
  239.  
  240.     call    Set80x50
  241.     call    FillScreen
  242.     
  243. @@MainLoop:
  244.     call    PlaceDot
  245.     
  246.     mov     ax,[DotXvel]
  247.     add     [DotXpos],ax
  248.     cmp     [DotXpos],MinX
  249.     jge     @@DXminok
  250.     neg     [DotXvel]
  251.     mov     [DotXpos],MinX
  252. @@DXminok:
  253.     cmp     [DotXpos],MaxX
  254.     jl      @@DXmaxok
  255.     neg     [DotXvel]
  256.     mov     [DotXpos],MaxX-1
  257. @@DXmaxOK:
  258.     
  259.     mov     ax,[DotYvel]
  260.     add     [DotYpos],ax
  261.     cmp     [DotYpos],MinY
  262.     jge     @@DYminok
  263.     neg     [DotYvel]
  264.     mov     [DotYpos],MinY
  265. @@DYminok:
  266.     cmp     [DotYpos],MaxY
  267.     jl      @@DYmaxok
  268.     neg     [DotYvel]
  269.     mov     [DotYpos],MaxY-1
  270. @@DYmaxOK:
  271.  
  272.     @FullVertWait
  273.     mov     ah,1
  274.     int     16h
  275.     jz      @@MainLoop
  276.     
  277.     mov     ah,0
  278.     int     16h
  279.     mov     ax,3
  280.     int     10h
  281.     mov     ax,4c00h
  282.     int     21h
  283. END START
  284.