;************************************************** ; ; neetro ; ; Aaron Robinson (2001) ; ;************************************************** bits 16 ; 16-bit .com file org 0x100 ; .com files start at 0x100 ; ; program entry point ; Main: mov ax, 0x0013 ; temporary to force fullscreen int 10h call Init_Video ; Initialize Mode 0x03 call Init_Font ; Initialize dither font call Modify_Font ; Modify the current screen font to use ditherFont call Draw_Initial ; Render an initial image infi: ; ; check for ESC ; in al, 60h dec al jz get_the_hell_out call Wait_For_VBlank call Swap_Buffers call Manipulate jmp infi get_the_hell_out: ret ; Quick way to return to DOS ; ; Initialize video mode (VGA mode 0x03, 8x16 font) ; Init_Video: mov ax, 0x0003 ; ah=00, al(mode)=0x03 int 0x10 ; Call set video interrupt ; ; CRTC Register Protect OFF ; mov dx, 0x03D4 ; 0x03D4=addr mov al, 0x11 ; 11="Vertical Retrace End Register" register out dx, al mov dx, 0x03D5 ; 0x03D5=data in al, dx ; Set flag for CRTC Register Protect OFF and al, 0x7F out dx, al ; ; Set font width to 8 ; mov dx, 0x03C4 ; 0x03C4=addr mov al, 0x01 ; 1="Clocking Mode" register out dx, al mov dx, 0x03C5 ; 0x03C5=data in al, dx ; Set flag for 8 dot wide font or al, 0x01 out dx, al ; ; Set font height to 8 ; mov dx, 0x03D4 ; 0x03D4=addr mov al, 0x09 ; 9="Maximum Scan Line Register" out dx, al mov dx, 0x03D5 ; 0x03D5=data in al, dx ; Set flag for 8 dot tall font and al, 0xE0 or al, 0x07 out dx, al ret ; ; Initialize dither font ; Init_Font: mov bp, ditherFont mov dx, 0x04 mov cx, 256*8 xor si, si xor al, al clsFun: mov byte [ds:bp+si], al inc si loop clsFun nextStretch: mov si, ditherPreCalc mov di, 8 mov cx, 64 ; 63 dither levels (leave 0 black) mov byte [bp+di], al nextChar: mov ah, 0x07 nextRow: mov al, byte [si] mov byte [bp+di], al inc di inc si dec ah jge nextRow add di, 24 loop nextChar add bp, 8 dec dx jg nextStretch ret ; ; Initialize dither font ; Modify_Font: push es mov ax, ds ; Point to ditherFont mov es, ax ; es:ditherFont segment mov bp, ditherFont ; bp:offset mov ax, 0x1100 ; Load user-specific font patterns mov cx, 256 ; We are replacing all 256 chars mov dx, 0 ; Starting from char 0 mov bh, 8 ; Font is 8 dots tall (8x8) xor bl, bl ; Block number 0 int 0x10 ; Modify font! pop es ret ; ; Draw initial image ; Draw_Initial: push ds mov ax, word [ds:backBuffer] mov es, ax mov ax, word [ds:frontBuffer] mov ds, ax mov ax, 0x0F00 ; 0F = white on black, al=character (0) mov cx, 80*50 xor di, di bob: mov word [ds:di], ax mov word [es:di], ax add di, 2 loop bob pop ds ret ; ; Wait for start of vblank ; Wait_For_VBlank: mov dx,3dah VRT: in al,dx test al,8 jnz VRT ; Wait for start of vert retrace nVRT: in al,dx test al,8 jz nVRT ;Wait for end of vert retrace ret ; ; Swap Front/Back buffers ; Swap_Buffers: mov ax, word [ds:backBuffer] mov bx, word [ds:frontBuffer] mov word [ds:backBuffer], bx mov word [ds:frontBuffer], ax mov al, byte [ds:curBuffer] cmp al, 0x00 je jea mov ax, 0x0502 ; Page 2 mov byte [ds:curBuffer], 0x02 jmp duh jea: mov ax, 0x0500 ; Page 0 mov byte [ds:curBuffer], 0x00 duh: int 0x10 ; Set page ret ; ; Manipulate the current screen ; Manipulate: push ds push es mov ax, word [ds:backBuffer] mov es, ax mov ax, word [ds:frontBuffer] mov ds, ax call Draw_Funk mov cx, 80*49 mov di, 80*1*2 farf: xor bx, bx xor ax, ax mov al, byte [ds:di-160] mov bl, byte [ds:di-2] add ax, bx mov bl, byte [ds:di+2] add ax, bx mov bl, byte [ds:di+160] add ax, bx shr ax, 2 ; dec ax ; jng it_wrapped mov byte [es:di], al ; jmp no_wrap ; it_wrapped: ; mov byte [es:di], 0x00 ; no_wrap: add di, 2 loop farf mov cx, 160 xor di, di kClearTB: mov byte[es:di], 0 ; clear top row mov byte[es:di+80*49*2], 0 ; clear bottom row add di, 2 loop kClearTB pop es pop ds ret ; ; Draw various fun things ; Draw_Funk: mov ax, 0003 ; Get mouse position int 0x33 shr cx, 3 shr dx, 2 mov bl, 80 mov ax, dx mul bl add ax, cx shl ax, 1 mov bp, ax cmp ax, 80*49*2 jge dont_draw_mouse cmp ax, 80*1*2 jle dont_draw_mouse mov byte [ds:bp], 0xFF add bp, 2 mov byte [ds:bp], 0xFF add bp, 2 mov byte [ds:bp], 0xFF add bp, 156 mov byte [ds:bp], 0xFF add bp, 2 mov byte [ds:bp], 0xFF add bp, 2 mov byte [ds:bp], 0xFF add bp, 156 mov byte [ds:bp], 0xFF add bp, 2 mov byte [ds:bp], 0xFF add bp, 2 mov byte [ds:bp], 0xFF dont_draw_mouse: ret curBuffer: db 0x00 frontBuffer: dw 0xB800 backBuffer: dw 0xBA00 ; ; Format is CCRR where CC=column RR=row ; ditherPreCalc: ; Level 0 db 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ; Level 1 db 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00 ; Level 2 db 0x11, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00 ; Level 3 db 0x11, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00 ; Level 4 db 0x11, 0x00, 0x04, 0x00, 0x11, 0x00, 0x00, 0x00 ; Level 5 db 0x11, 0x00, 0x04, 0x00, 0x11, 0x00, 0x40, 0x00 ; Level 6 db 0x11, 0x00, 0x44, 0x00, 0x11, 0x00, 0x40, 0x00 ; Level 7 db 0x11, 0x00, 0x44, 0x00, 0x11, 0x00, 0x44, 0x00 ; Level 8 db 0x15, 0x00, 0x44, 0x00, 0x11, 0x00, 0x44, 0x00 ; Level 9 db 0x15, 0x00, 0x44, 0x00, 0x51, 0x00, 0x44, 0x00 ; Level 10 db 0x55, 0x00, 0x44, 0x00, 0x51, 0x00, 0x44, 0x00 ; Level 11 db 0x55, 0x00, 0x44, 0x00, 0x55, 0x00, 0x44, 0x00 ; Level 12 db 0x55, 0x00, 0x45, 0x00, 0x55, 0x00, 0x44, 0x00 ; Level 13 db 0x55, 0x00, 0x45, 0x00, 0x55, 0x00, 0x54, 0x00 ; Level 14 db 0x55, 0x00, 0x55, 0x00, 0x55, 0x00, 0x54, 0x00 ; Level 15 db 0x55, 0x00, 0x55, 0x00, 0x55, 0x00, 0x55, 0x00 ; Level 16 db 0x55, 0x02, 0x55, 0x00, 0x55, 0x00, 0x55, 0x00 ; Level 17 db 0x55, 0x02, 0x55, 0x00, 0x55, 0x20, 0x55, 0x00 ; Level 18 db 0x55, 0x22, 0x55, 0x00, 0x55, 0x20, 0x55, 0x00 ; Level 19 db 0x55, 0x22, 0x55, 0x00, 0x55, 0x22, 0x55, 0x00 ; Level 20 db 0x55, 0x22, 0x55, 0x08, 0x55, 0x22, 0x55, 0x00 ; Level 21 db 0x55, 0x22, 0x55, 0x08, 0x55, 0x22, 0x55, 0x80 ; Level 22 db 0x55, 0x22, 0x55, 0x88, 0x55, 0x22, 0x55, 0x80 ; Level 23 db 0x55, 0x22, 0x55, 0x88, 0x55, 0x22, 0x55, 0x88 ; Level 24 db 0x55, 0x2a, 0x55, 0x88, 0x55, 0x22, 0x55, 0x88 ; Level 25 db 0x55, 0x2a, 0x55, 0x88, 0x55, 0xa2, 0x55, 0x88 ; Level 26 db 0x55, 0xaa, 0x55, 0x88, 0x55, 0xa2, 0x55, 0x88 ; Level 27 db 0x55, 0xaa, 0x55, 0x88, 0x55, 0xaa, 0x55, 0x88 ; Level 28 db 0x55, 0xaa, 0x55, 0x8a, 0x55, 0xaa, 0x55, 0x88 ; Level 29 db 0x55, 0xaa, 0x55, 0x8a, 0x55, 0xaa, 0x55, 0xa8 ; Level 30 db 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xa8 ; Level 31 db 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa ; Level 32 db 0x57, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa ; Level 33 db 0x57, 0xaa, 0x55, 0xaa, 0x75, 0xaa, 0x55, 0xaa ; Level 34 db 0x77, 0xaa, 0x55, 0xaa, 0x75, 0xaa, 0x55, 0xaa ; Level 35 db 0x77, 0xaa, 0x55, 0xaa, 0x77, 0xaa, 0x55, 0xaa ; Level 36 db 0x77, 0xaa, 0x5d, 0xaa, 0x77, 0xaa, 0x55, 0xaa ; Level 37 db 0x77, 0xaa, 0x5d, 0xaa, 0x77, 0xaa, 0xd5, 0xaa ; Level 38 db 0x77, 0xaa, 0xdd, 0xaa, 0x77, 0xaa, 0xd5, 0xaa ; Level 39 db 0x77, 0xaa, 0xdd, 0xaa, 0x77, 0xaa, 0xdd, 0xaa ; Level 40 db 0x7f, 0xaa, 0xdd, 0xaa, 0x77, 0xaa, 0xdd, 0xaa ; Level 41 db 0x7f, 0xaa, 0xdd, 0xaa, 0xf7, 0xaa, 0xdd, 0xaa ; Level 42 db 0xff, 0xaa, 0xdd, 0xaa, 0xf7, 0xaa, 0xdd, 0xaa ; Level 43 db 0xff, 0xaa, 0xdd, 0xaa, 0xff, 0xaa, 0xdd, 0xaa ; Level 44 db 0xff, 0xaa, 0xdf, 0xaa, 0xff, 0xaa, 0xdd, 0xaa ; Level 45 db 0xff, 0xaa, 0xdf, 0xaa, 0xff, 0xaa, 0xfd, 0xaa ; Level 46 db 0xff, 0xaa, 0xff, 0xaa, 0xff, 0xaa, 0xfd, 0xaa ; Level 47 db 0xff, 0xaa, 0xff, 0xaa, 0xff, 0xaa, 0xff, 0xaa ; Level 48 db 0xff, 0xab, 0xff, 0xaa, 0xff, 0xaa, 0xff, 0xaa ; Level 49 db 0xff, 0xab, 0xff, 0xaa, 0xff, 0xba, 0xff, 0xaa ; Level 50 db 0xff, 0xbb, 0xff, 0xaa, 0xff, 0xba, 0xff, 0xaa ; Level 51 db 0xff, 0xbb, 0xff, 0xaa, 0xff, 0xbb, 0xff, 0xaa ; Level 52 db 0xff, 0xbb, 0xff, 0xae, 0xff, 0xbb, 0xff, 0xaa ; Level 53 db 0xff, 0xbb, 0xff, 0xae, 0xff, 0xbb, 0xff, 0xea ; Level 54 db 0xff, 0xbb, 0xff, 0xee, 0xff, 0xbb, 0xff, 0xea ; Level 55 db 0xff, 0xbb, 0xff, 0xee, 0xff, 0xbb, 0xff, 0xee ; Level 56 db 0xff, 0xbf, 0xff, 0xee, 0xff, 0xbb, 0xff, 0xee ; Level 57 db 0xff, 0xbf, 0xff, 0xee, 0xff, 0xfb, 0xff, 0xee ; Level 58 db 0xff, 0xff, 0xff, 0xee, 0xff, 0xfb, 0xff, 0xee ; Level 59 db 0xff, 0xff, 0xff, 0xee, 0xff, 0xff, 0xff, 0xee ; Level 60 db 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0xee ; Level 61 db 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0xfe ; Level 62 db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe ; Level 63 db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff ; ; Dither font bitmaps ; ditherFont: