-; Lowest yet: 265
-
+; Sierpbounceski / Mindlapse
+; --------------------------
+; Sierpinski fractal, bummed to 253b down from the 416b initial version
+; Author: John Tsiombikas (Nuclear / Mindlapse) <nuclear@member.fsf.org>
+; This code is public domain
+; --------------------------
+; Build for DOS: nasm -o sierpb.com -f bin sierpb.asm
+; Build as boot sector: nasm -o sierpb.img -f bin -DBOOTSECT sierpb.asm
+; --------------------------
bits 16
%ifdef BOOTSECT
org 7c00h
jz .notblank ; loop while vblank bit is 0 (visible area)
%endmacro
+%macro RAND 0
+ ; random number generator
+ mov ax, [randval]
+ mov bx, ax
+ shr bx, 7
+ xor ax, bx
+ mov bx, ax
+ shl bx, 9
+ xor ax, bx
+ mov [randval], ax
+%endmacro
+
start:
%ifdef BOOTSECT
mov es, ax
mov ss, ax
jmp 00:.setcs
-.setcs:
- mov sp, 0
+.setcs: xor sp, sp
%endif
mov al, 13h
int 10h
mov es, ax
mainloop:
- call animate
+ ; --- animate start ---
+ mov cx, 3
+ mov di, sierp_verts
+ mov si, sierp_vel
+.loop:
+ mov bx, 4
+.xyloop:
+ mov ax, [di] ; grab vertex X
+ add ax, [si] ; add velocity X
+ jl .xout
+ cmp ax, [bx + bounds - 2]
+ jge .xout
+ jmp .skip_xflip
+.xout:
+ sub ax, [si] ; revert to previous X
+ neg word [si] ; negate velocity X
+.skip_xflip:
+ mov [di], ax ; update vertex X
+
+ ; to do the same for Y increment edi and esi by 2
+ add di, 2
+ add si, 2
+ sub bx, 2
+ jnz .xyloop
+
+ dec cx
+ jnz .loop
+ ; --- animate end ---
+
; clear the framebuffer
mov al, 128
xor di, di
rep stosb
+ mov si, setcol + 1
; draw shadow
- mov si, 5
- mov byte [setcol + 1], 199 ; shadow color
+ mov bp, 5
+ mov byte [si], 199 ; shadow color
call drawsierp
; draw fractal
- xor si, si
- mov byte [setcol + 1], 2 ; fractal color
+ xor bp, bp
+ mov byte [si], 48h ; fractal color
call drawsierp
; copy framebuffer to video ram
push ds
push es
- ; point ds:si (source) to es:0
- mov ax, es
- mov ds, ax
+ ; point ds:si (source) to es:0 (framebuffer)
+ push es
+ pop ds
xor si, si
; point es:di (dest) to a000:0
- mov ax, 0a000h
- mov es, ax
+ push word 0a000h
+ pop es
xor di, di
mov cx, 32000
WAIT_VBLANK
; number of iterations in cx
mov cx, NUM_POINTS
dsloop: ; pick a vertex at random and move half-way there
- call rand
+ RAND
mov bx, 3
xor dx, dx
div bx ; dx is now rand % 3
add ax, [SIERP_PT + 2]
shr ax, 1
mov [SIERP_PT + 2], ax ; store the reuslting Y back to [SIERP_PT + 2]
- add ax, si ; add offset
+ add ax, bp ; add offset
mov bx, ax
shl ax, 8
shl bx, 6
dw 320 - SHADOW_OFFS
-animate:
- mov cx, 3
- mov di, sierp_verts
- mov si, sierp_vel
-.loop:
- mov bx, 4
-.xyloop:
- mov ax, [di] ; grab vertex X
- add ax, [si] ; add velocity X
- jl .xout
- cmp ax, [bx + bounds - 2]
- jge .xout
- jmp .skip_xflip
-.xout:
- sub ax, [si] ; revert to previous X
- neg word [si] ; negate velocity X
-.skip_xflip:
- mov [di], ax ; update vertex X
-
- ; to do the same for Y increment edi and esi by 2
- add di, 2
- add si, 2
- sub bx, 2
- jnz .xyloop
-
- dec cx
- jnz .loop
- ret
-
; random number generator
-rand:
- mov ax, [randval]
- mov bx, ax
- shr bx, 7
- xor ax, bx
- mov bx, ax
- shl bx, 9
- xor ax, bx
- mov [randval], ax
- ret
+;rand:
; mov eax, [RANDVAL]
; mul dword [randmul]
; add eax, 12345