; Tiny Serpinsky Triangle Generator v96.7.12.11p
; (like my version system?)
; Copyright (c) 1996, Justin Frankel
; Additional size optimizations by Kevin Vigor
; XCHG tip thanks to Richard Pavlicek (1 byte saved)
;
; optimized for size - should assemble to a 56 byte .COM file
;

VGA320  equ 0 ;
VGA640  equ 1 ; set the appropriate resolution to 1.
SVGA800 equ 0 ;

if SVGA800 ; VESA SVGA 800x600x16
VID_MODE equ 6Ah
SCR_WIDTH equ 800
SCR_HEIGHT equ 600
elseif VGA640 ; VGA 640x480x16
VID_MODE equ 12h
SCR_WIDTH equ 640
SCR_HEIGHT equ 480
elseif VGA320 ; VGA 320x200x256
VID_MODE equ 13h
SCR_WIDTH equ 320
SCR_HEIGHT equ 200
endif

.8086
.model tiny
.code

.startup
        mov al, VID_MODE
        int 10h
        mov di, 3
BigLoop:
        mov dx, 9421
        mul dx
        inc ax
        push ax
        sub dx, dx
        div di
        dec dx
        jz short L2
        jns short L1
        add si, SCR_HEIGHT
        sub cx, SCR_WIDTH/2
L1:
        add cx, SCR_WIDTH
L2:
        shr cx, 1
        shr si, 1

        mov ah, 0Ch
        mov dx, si
        int 10h

        mov ah, 1
        int 16h
        pop ax
        jz short BigLoop

        xchg ax, di
        int 10h
        ret
END


; Draws a Serpinski triangle
; David Stafford
; 7/14/96
; 8086 code, assemble to a COM file
; 31 bytes

code            segment
                assume  cs:code,ds:code,es:code,ss:code

                org     100h            ;for COM files
Start:
                mov     al,13h          ;assume ah = 0 (true for COM files)
                int     10h             ;set VGA 320x200 256-color mode

                mov     bx,0A1E0h - 320 ;ds = video memory, bx = offset
                mov     ds,bx           ;small and very cute, the segment
                                        ;and offset are identical

                mov     al,15           ;a white pixel- can eliminate this
                                        ;to save 2 bytes but the color is
                                        ;too dark
DrawLoop:
                mov     [bx-318],al     ;order is important
                mov     al,[bx+2]       ;two pixels...
                xor     al,[bx]

                dec     bx              ;dec pointer
                jnz     DrawLoop

                int     16h             ;assume ah = 0, wait for keystroke
                                        ;unfortunately, this fills ah...

                mov     ax,3            ;...so we have to clear it here
                int     10h             ;set 80x25 text mode

                ret                     ;exit (returns to cs:0000 where
                                        ;there is an INT 20h for COM files)

                ends
                end     Start


I found a way to keep the color visible and squeezed a couple more
bytes out of my code.

; Draws a Serpinski triangle
; David Stafford
; 7/15/96
; 8086 code, assemble to a COM file
; 29 bytes

code            segment
                assume  cs:code,ds:code,es:code,ss:code

                org     100h            ;for COM files
Start:
                mov     al,13h          ;assume ah = 0 (true for COM files)
                int     10h             ;set VGA 320x200 256-color mode

                mov     bl,3            ;bx = 3, assume bh = 0
                                        ;comes in handy in two places below

                mov     si,0A1E0h - 320 ;ds = video memory, si = offset
                mov     ds,si           ;small and very cute, the segment
                                        ;offset and counter are identical

                db      0b9h            ;MOV CX,0C8Bh where 0C = color red
                                        ;skip the next instr the first time
                                        ;I can make this use white but it
                                        ;costs one more byte
DrawLoop:
                mov     cx,[si]         ;order is important!  8B 0C
                xor     ch,[bx+si]      ;handy place #1 (bx = 3)
                mov     [si-318],ch

                dec     si              ;dec pointer
                jnz     DrawLoop

                int     16h             ;assume ah = 0, wait for keystroke

                xchg    ax,bx           ;handy place #2 (bx = 3)
                int     10h             ;set 80x25 text mode

                ret                     ;exit (returns to cs:0000 where
                                        ;there is an INT 20h for COM files)
                ends
                end     Start

From: kemp@gil.com.au

;For those of you who dislike compiled bitmaps, here's a 14h (sounds better
;than 20) byter. Might be fairly dark on some monitors.
;There's some purposeful minor incorrectness in the algorithm causing an
;off-by-one error or two in order to save a few bytes.

.8086
.model tiny
.code
.startup
mov al,13h
int 10h    ;if already in graphics mode, can save two bytes here.
x:
mov dl,cl
and dl,bl
mov ah,0ch
int 10h
mid:
dec cl
jnz short x
inc bl
jnz short mid

;ret ;optional for achieving goal, saves a byte if not used.
END


