done master
authorJohn Tsiombikas <nuclear@member.fsf.org>
Thu, 27 Feb 2020 18:13:11 +0000 (20:13 +0200)
committerJohn Tsiombikas <nuclear@member.fsf.org>
Thu, 27 Feb 2020 18:13:11 +0000 (20:13 +0200)
dos1/c.asm

index 78a0946..c3c62c9 100644 (file)
@@ -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) <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
        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
 
        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
 
 start:
 %ifdef BOOTSECT
@@ -31,8 +50,7 @@ start:
        mov es, ax
        mov ss, ax
        jmp 00:.setcs
        mov es, ax
        mov ss, ax
        jmp 00:.setcs
-.setcs:
-       mov sp, 0
+.setcs: xor sp, sp
 %endif
        mov al, 13h
        int 10h
 %endif
        mov al, 13h
        int 10h
@@ -43,7 +61,35 @@ start:
        mov es, ax
 
 mainloop:
        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
 
        ; clear the framebuffer
        mov al, 128
@@ -51,25 +97,26 @@ mainloop:
        xor di, di
        rep stosb
 
        xor di, di
        rep stosb
 
+       mov si, setcol + 1
        ; draw shadow
        ; 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
        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
        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
        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
        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
        ; 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
        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, [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
        mov bx, ax
        shl ax, 8
        shl bx, 6
@@ -143,46 +190,8 @@ bounds     dw 200 - SHADOW_OFFS
        dw 320 - 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
        ; 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
 ;      mov eax, [RANDVAL]
 ;      mul dword [randmul]
 ;      add eax, 12345