From 2de764203d46c9fe6b506ec070f399439ab7ce09 Mon Sep 17 00:00:00 2001 From: John Tsiombikas Date: Thu, 27 Feb 2020 20:13:11 +0200 Subject: [PATCH 1/1] done --- dos1/c.asm | 119 ++++++++++++++++++++++++++++++++---------------------------- 1 file changed, 64 insertions(+), 55 deletions(-) diff --git a/dos1/c.asm b/dos1/c.asm index 78a0946..c3c62c9 100644 --- a/dos1/c.asm +++ b/dos1/c.asm @@ -1,5 +1,12 @@ -; Lowest yet: 265 - +; Sierpbounceski / Mindlapse +; -------------------------- +; Sierpinski fractal, bummed to 253b down from the 416b initial version +; Author: John Tsiombikas (Nuclear / Mindlapse) +; 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 @@ -23,6 +30,18 @@ SIERP_VERTS equ code_end + 8 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 @@ -31,8 +50,7 @@ start: mov es, ax mov ss, ax jmp 00:.setcs -.setcs: - mov sp, 0 +.setcs: xor sp, sp %endif mov al, 13h int 10h @@ -43,7 +61,35 @@ start: 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 @@ -51,25 +97,26 @@ mainloop: 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 @@ -101,7 +148,7 @@ drawsierp: ; 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 @@ -119,7 +166,7 @@ dsloop: ; pick a vertex at random and move half-way there 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 @@ -143,46 +190,8 @@ bounds dw 200 - SHADOW_OFFS 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 -- 1.7.10.4