X-Git-Url: https://git.wirehaze.ovh/lifeboot.git/blobdiff_plain/1f37f09b39ff30c4154b2deaef399eebb594c8db..a8cfbb9937178d02aa35816ac8607b2525ba7263:/lifeboot.asm?ds=sidebyside diff --git a/lifeboot.asm b/lifeboot.asm index 7ada2fa..9b03696 100644 --- a/lifeboot.asm +++ b/lifeboot.asm @@ -1,31 +1,32 @@ bits 16 -org 0x7c00 +org 7c00h ; ============================================================================= ; settings -------------------------------------------------------------------- %define DEAD ' ' ; char to represent a dead cell -%define ALIVE '#' ; char to represent an alive cell -%define PRINT_COLOR 0x07 ; grey on black -%define WAIT_DELAY 0x02 ; 0.131072 seconds +%define ALIVE '.' ; char to represent an alive cell +%define PRINT_COLOR 07h ; grey on black +%define ITER_LIM 500 ; reset the simulation after ITER_LIM iterations ; constants ------------------------------------------------------------------- %define COLS 80 %define ROWS 25 -%define VGAPGSZ (COLS * ROWS * 2 + 96) ; why 96 ?????? +%define VGAPGSZ 1000h ; memory layout --------------------------------------------------------------- -%define ORG 0x7c00 -%define VGA 0xb8000 +%define ORG 7c00h +%define VGA 0b8000h %define DAT ORG + 512 ; static variables ------------------------------------------------------------ %define xss DAT ; xs() state (word) %define currvgapg DAT + 2 ; current vga page near pointer (word) +%define iter DAT + 4 ; current iteration # (word) ; ============================================================================= @@ -47,16 +48,16 @@ mov sp, bp cld ; disable cursor -mov ch, 0x3f ; cursor start and options -mov ah, 0x01 ; set text-mode cursor shape -int 0x10 ; video services +mov ch, 3fh ; cursor start and options +mov ah, 01h ; set text-mode cursor shape +int 10h ; video services ; initialize xss set_xss_seed: -mov ah, 0x00 ; get -int 0x1a ; system time +mov ah, 00h ; get +int 1ah ; system time cmp dx, 0 je set_xss_seed ; if seed is 0, xs wont work properly @@ -71,62 +72,44 @@ mov word [currvgapg], 0 start: call init_grid +mov word [iter], 1 ; apply game of life's rules to determine the next state ---------------------- next_state: +call vsync_wait call write_next_vga_page -call wait_keypress + +call vsync_wait call flip_vga_page -jmp next_state +inc word [iter] +cmp word [iter], ITER_LIM +jle next_state + +jmp start ; reset ; ============================================================================= ; functions ------------------------------------------------------------------- -; delay() - suspend program execution temporarily ----------------------------- - -; clobbers ah, cx, dx - -delay: - -mov cx, WAIT_DELAY ; cx:dx = interval in microseconds -mov dx, 0 - -mov ah, 0x86 -int 0x15 ; wait - -ret - -; wait_keypress() - wait for any keypress ------------------------------------- - -; clobbers: ax - -wait_keypress: - -mov ah, 0x00 ; read key press -int 0x16 ; keyboard services - -ret - ; vsync_wait() - wait for display to enter the next VBlank cycle -------------- ; clobbers ax, dx vsync_wait: -mov dx, 0x3da ; input status #1 register +mov dx, 3dah ; input status #1 register .wait_on: in al, dx - test al, 0x08 ; vertical retrace bit + test al, 08h ; vertical retrace bit jnz .wait_on .wait_off: in al, dx - test al, 0x08 + test al, 08h jz .wait_off ret @@ -189,13 +172,11 @@ ret flip_vga_page: -call vsync_wait - xor word [currvgapg], VGAPGSZ ; flip currvgapg setnz al ; al = !(currvgapg == 0) -mov ah, 0x05 ; select active display page -int 0x10 ; video services +mov ah, 05h ; select active display page +int 10h ; video services ret @@ -366,4 +347,4 @@ jmp halt ; ============================================================================= times 510 - ($ - $$) db 0 ; fill remaining bytes with zeroes -dw 0xaa55 ; mbr magic byte +dw 0aa55h ; mbr magic byte