The QBasic Forum      Other Subforums, Links and Downloads     Search

tasm + vodka =

by moi (no login)

;Compile with TASM 3.1
;MOVE THE MOUSE

.model huge
.486
.stack 200h
.data

vscreen_buffer db 64000 dup(0)

msg1 db "Move the mouse$"
first_frame db 1

err1 db "Reallocation failed.$"
err2 db "Buffer allocation failed.$"

;buffer dw 0A000h
buffer dw 0A000h
buffer_off dw 0
mouse_x dw 0
mouse_y dw 0
NUM_POINTS equ 63
points dw NUM_POINTS*2 dup(-1)
row_offset dw 0, 320, 640, 960, 1280, 1600, 1920, 2240, 2560, 2880, 3200, 3520, 3840, 4160
dw 4480, 4800, 5120, 5440, 5760, 6080, 6400, 6720, 7040, 7360, 7680, 8000, 8320
dw 8640, 8960, 9280, 9600, 9920, 10240, 10560, 10880, 11200, 11520, 11840, 12160
dw 12480, 12800, 13120, 13440, 13760, 14080, 14400, 14720, 15040, 15360, 15680
dw 16000, 16320, 16640, 16960, 17280, 17600, 17920, 18240, 18560, 18880, 19200
dw 19520, 19840, 20160, 20480, 20800, 21120, 21440, 21760, 22080, 22400, 22720
dw 23040, 23360, 23680, 24000, 24320, 24640, 24960, 25280, 25600, 25920, 26240
dw 26560, 26880, 27200, 27520, 27840, 28160, 28480, 28800, 29120, 29440, 29760
dw 30080, 30400, 30720, 31040, 31360, 31680, 32000, 32320, 32640, 32960, 33280
dw 33600, 33920, 34240, 34560, 34880, 35200, 35520, 35840, 36160, 36480, 36800
dw 37120, 37440, 37760, 38080, 38400, 38720, 39040, 39360, 39680, 40000, 40320
dw 40640, 40960, 41280, 41600, 41920, 42240, 42560, 42880, 43200, 43520, 43840
dw 44160, 44480, 44800, 45120, 45440, 45760, 46080, 46400, 46720, 47040, 47360
dw 47680, 48000, 48320, 48640, 48960, 49280, 49600, 49920, 50240, 50560, 50880
dw 51200, 51520, 51840, 52160, 52480, 52800, 53120, 53440, 53760, 54080, 54400
dw 54720, 55040, 55360, 55680, 56000, 56320, 56640, 56960, 57280, 57600, 57920
dw 58240, 58560, 58880, 59200, 59520, 59840, 60160, 60480, 60800, 61120, 61440
dw 61760, 62080, 62400, 62720, 63040, 63360, 63680
ldx dw ?
ldy dw ?
lcx dw ?
lcy dw ?
lsx dw ?
lsy dw ?
lax dw ?
lay dw ?
ldx2 dw ?
ldy2 dw ?
ldymdx2 dw ?
ldxmdy2 dw ?
sign dw 0FFFFh, 0, 1
abs_xor dw 0FFFFh, 0, 0
abs_add dw 1, 0, 0

.code

set_screen proc ;dw mode
push bp
mov bp,sp
mov ax,word ptr [bp+06]
pop bp
int 10h
ret 2
set_screen endp

init_mouse proc
xor ax,ax
int 33h
ret
init_mouse endp

show_mouse proc
mov ax,1
int 33h
ret
show_mouse endp

hide_mouse proc
mov ax,2
int 33h
ret
hide_mouse endp

get_mouse proc
mov ax,3
int 33h
ret
get_mouse endp

getch proc
xor ah,ah
int 16h
ret
getch endp

quit proc
mov ax,4C00h
int 21h
quit endp

bcls proc
mov ax,buffer
mov es,ax
xor di,di
cld
mov cx,16000
xor eax,eax
rep stosd
ret
bcls endp

bpset proc ;dw x, dw y, dw c
push bp
mov bp,sp
mov bx,word ptr [bp+08]
mov dx,bx
shl dx,6
shl bx,8
add bx,dx
add bx,word ptr [bp+10]
mov al,byte ptr [bp+06]
mov cx,buffer
mov es,cx
mov byte ptr es:[bx],al
pop bp
ret 06
bpset endp

bcopy proc
push ds
mov ax,buffer
mov ds,ax
mov bx,0A000h
mov es,bx
xor si,si
xor di,di
mov cx,16000
cld
rep movsd
pop ds
ret
bcopy endp

print proc ;dw buf
push bp
mov bp,sp
mov ah,9
mov dx,word ptr [bp+06]
int 21h
pop bp
ret 02
print endp

init_gfx_buffer proc
mov buffer,seg vscreen_buffer
mov buffer_off,offset vscreen_buffer
ret
mov ah,62h
int 21h
mov es,bx
mov ax,4Ah
mov bx,1000
int 21h
jc init_gfx_buffer__error_1
mov ah,48h
mov bx,4000
int 21h
jc init_gfx_buffer__error_2
mov buffer,ax
ret
init_gfx_buffer__error_1:
push 3
call set_screen
mov ax,offset err1
push ax
call print
call getch
call quit
init_gfx_buffer__error_2:
push 3
call set_screen
mov ax,offset err2
push ax
call print
call getch
call quit
init_gfx_buffer endp

vsync proc
mov dx,3DAh
vsync_1:
in al,dx
and al,8
jz vsync_1
vsync_2:
in al,dx
and al,8
jnz vsync_2
ret
vsync endp

add_point proc ;dw x, dw y
push bp
mov bp,sp
mov di,NUM_POINTS*4
;add_point__1:
;sub di,4
;push dword ptr points[di-04]
;pop dword ptr points[di]
;cmp di,4
;ja add_point__1
mov ax,word ptr [bp+08]
mov bx,word ptr [bp+06]
mov word ptr points[0],ax
mov word ptr points[2],bx
pop bp
ret 04
add_point endp

set_pal proc ;dw c, dw r, dw g, dw b
push bp
mov bp,sp
mov dx,3C8h
mov al,byte ptr [bp+12]
out dx,al
inc dx
mov al,byte ptr [bp+10]
out dx,al
mov al,byte ptr [bp+08]
out dx,al
mov al,byte ptr [bp+06]
out dx,al
pop bp
ret 08
set_pal endp

make_pal_gradient proc
xor cx,cx
make_pal_gradient__1:
push cx
push cx
push cx
push cx
call set_pal
inc cx
cmp cx,64
jb make_pal_gradient__1
ret
make_pal_gradient endp

bline PROC ;dw x1, dw y1, dw x2, dw y2, dw c
push bp
mov bp,sp
mov ax,buffer
mov es,ax
mov ax,word ptr [bp+10]
sub ax,word ptr [bp+14]
mov ldx,ax ;ldx = x2 - x1
mov ax,word ptr [bp+08]
sub ax,word ptr [bp+12]
mov ldy,ax ;ldy = y2 - y1
mov si,word ptr [bp+14]
mov di,word ptr [bp+12]
mov bx,di ;lay = y1
add bx,bx
mov bx,word ptr row_offset[bx]
add bx,si
mov al,byte ptr [bp+06]
mov byte ptr es:[bx],al ;pset(lax,lay),color
mov ax,ldx
xor bx,bx
add ax,ax
jc bline_1
cmp ldx,0
setnz bl
inc bl
bline_1:
add bx,bx
mov ax,word ptr sign[bx]
mov lsx,ax ;lsx = sgn(ldx)
mov cx,word ptr abs_add[bx]
mov bx,word ptr abs_xor[bx]
mov ax,ldx
xor ax,bx
add ax,cx
mov lcx,ax ;lcx = abs(ldx)
mov ax,ldy
xor bx,bx
add ax,ax
jc bline_2
cmp ldy,0
setnz bl
inc bl
bline_2:
add bx,bx
mov ax,word ptr sign[bx]
mov lsy,ax ;lsy = sgn(ldy)
mov cx,word ptr abs_add[bx]
mov bx,word ptr abs_xor[bx]
mov ax,ldy
xor ax,bx
add ax,cx
mov lcy,ax ;lcy = abs(ldy)
cmp lcx,ax
jl bline_b ;if lcx > lcy then
mov ax,lcy
add ax,ax
mov ldy2,ax
mov ax,lcy
sub ax,lcx
add ax,ax
mov ldymdx2,ax
mov dx,lcy
add dx,dx
sub dx,lcx
mov cx,lcx
bline_a_1:
cmp dx,0
jl bline_a_2
add dx,ldymdx2
add di,lsy
jmp bline_a_3
bline_a_2:
add dx,ldy2
bline_a_3:
add si,lsx
mov bx,di
add bx,bx
mov bx,word ptr row_offset[bx]
add bx,si
add bx,buffer_off
mov al,byte ptr [bp+06]
mov byte ptr es:[bx],al
dec cx
jnz bline_a_1
pop bp
ret 10
bline_b: ;else
mov ax,lcx
add ax,ax
mov ldx2,ax
mov ax,lcx
sub ax,lcy
add ax,ax
mov ldxmdy2,ax
mov dx,lcx
add dx,dx
sub dx,lcy
mov cx,lcy
bline_b_1:
cmp dx,0
jl bline_b_2
add dx,ldxmdy2
add si,lsx
jmp bline_b_3
bline_b_2:
add dx,ldx2
bline_b_3:
add di,lsy
mov bx,di
add bx,bx
mov bx,word ptr row_offset[bx]
add bx,si
add bx,buffer_off
mov al,byte ptr [bp+06]
mov byte ptr es:[bx],al
dec cx
jnz bline_b_1
pop bp
ret 10
BLINE ENDP

draw_points proc
mov di,NUM_POINTS*4
mov si,63-NUM_POINTS
draw_points__1:
sub di,4
push dword ptr points[di-04]
pop dword ptr points[di]
cmp di,4
ja draw_points__1
mov di,NUM_POINTS*4
sub di,4
draw_points__2:
sub di,4
cmp word ptr points[di+02],-1
je draw_points__skip
cmp word ptr points[di+04],-1
je draw_points__skip
pusha
push word ptr points[di]
push word ptr points[di+02]
push word ptr points[di+04]
push word ptr points[di+06]
push si
call bline
popa
draw_points__skip:
inc si
cmp di,0
jne draw_points__2
ret
draw_points endp





.startup

push 13h
call set_screen
call make_pal_gradient
call init_mouse
;call show_mouse
call init_gfx_buffer

main:
call get_mouse
shr cx,1
cmp cx,mouse_x
jne update_mouse
cmp dx,mouse_y
jne update_mouse
jmp dont_update_mouse
update_mouse:
mov mouse_x,cx
mov mouse_y,dx
push mouse_x
push mouse_y
call add_point
jmp updated_mouse
dont_update_mouse:
mov mouse_x,cx
mov mouse_y,dx
updated_mouse:
call bcls
;push mouse_x
;push mouse_y
;mov ax,15
;push ax
;call bpset
call draw_points
call vsync
call bcopy
in al,60h
cmp al,1
jnz main

;call hide_mouse
push 3
call set_screen
call quit

end

Posted on May 11, 2008, 5:34 PM
from IP address 64.131.83.138

Respond to this message   

Return to Index


Response TitleAuthor and Date
I made one of those in text mode... on May 15