]> wirehaze git hosting - lifeboot.git/blobdiff - lifeboot.asm

wirehaze git hosting

add delay() and use farptrs to load segment registers
[lifeboot.git] / lifeboot.asm
index 07d9c5a56e900f5b895e521b4e3a763bb6b782ae..f1545209a35feff333e53ab7ab1eadf0af8b45bf 100644 (file)
@@ -10,6 +10,7 @@ org 0x7c00
 %define DEAD ' '            ; char to represent a dead cell
 %define ALIVE '#'           ; char to represent an alive cell
 %define PRINT_COLOR 0x07    ; grey on black
 %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 GRID        ORG + 512               ; current cell grid (80 * 25 bytes)
 %define NEXT_GRID   GRID + COLS * ROWS      ; next cell grid (80 * 25 bytes)
 
 %define GRID        ORG + 512               ; current cell grid (80 * 25 bytes)
 %define NEXT_GRID   GRID + COLS * ROWS      ; next cell grid (80 * 25 bytes)
@@ -18,14 +19,13 @@ org 0x7c00
 ; entry point -----------------------------------------------------------------
 
 ; initialize segment registers
 ; entry point -----------------------------------------------------------------
 
 ; initialize segment registers
-xor ax, ax
-mov ds, ax
-mov es, ax
-mov ss, ax
+lds ax, [farptr.zero]
+les ax, [farptr.zero]
+lss ax, [farptr.zero]
 
 ; set stack pointers
 
 ; set stack pointers
-mov sp, ORG
 mov bp, ORG
 mov bp, ORG
+mov sp, bp
 
 ; clear direction flag
 cld
 
 ; clear direction flag
 cld
@@ -35,38 +35,36 @@ mov ch, 0x3f
 mov ah, 0x01
 int 0x10
 
 mov ah, 0x01
 int 0x10
 
-; setup -----------------------------------------------------------------------
-
-setup:
-
 ; initialize xss
 mov ah, 0x00                ; get
 int 0x1a                    ;  system time
 mov [XSS], dx               ; cx:dx = number of clock ticks since midnight
 
 ; initialize xss
 mov ah, 0x00                ; get
 int 0x1a                    ;  system time
 mov [XSS], dx               ; cx:dx = number of clock ticks since midnight
 
-; initialize grid
-mov di, GRID                ; es:di -> GRID
-mov cx, COLS * ROWS         ; for each cell
+; setup -----------------------------------------------------------------------
 
 
-.initgrid:                  ; do {
-    call xs                 ;     [XSS] = rand
-    mov al, DEAD            ;     al = DEAD (likely)
+setup:
 
 
-    test [XSS], 0b11
+call init_grid
+call print_grid
+call delay
 
 
-    jnz  .initgrid_nz       ;     if ([XSS] % 4 == 0)
-    mov al, ALIVE           ;         al = ALIVE
+jmp setup
 
 
-.initgrid_nz:
-    stosb                   ;     [es:(di++)] = al
+; functions -------------------------------------------------------------------
 
 
-    loop .initgrid          ; } while (--cx)
+; delay() - suspend program execution temporarily -----------------------------
 
 
-call print_grid
+; clobbers ah, cx, dx
 
 
-jmp halt
+delay:
 
 
-; functions -------------------------------------------------------------------
+mov cx, WAIT_DELAY          ; cx:dx = interval in microseconds
+mov dx, 0
+
+mov ah, 0x86
+int 0x15                    ; wait
+
+ret
 
 ; xs() - xorshift pseudorandom number generator -------------------------------
 
 
 ; xs() - xorshift pseudorandom number generator -------------------------------
 
@@ -94,6 +92,33 @@ mov [XSS], bx
 
 ret
 
 
 ret
 
+; init_grid() - initialize GRID cells with random values ----------------------
+
+; (*) expects es = 0.
+
+; clobbers al, bx, cx, dx, di
+
+init_grid:
+
+mov di, GRID                ; es:di -> GRID
+mov cx, COLS * ROWS         ; for each cell
+
+.write_cell:                ; do {
+    call xs                 ;     [XSS] = rand
+    mov al, DEAD            ;     al = DEAD (likely)
+
+    test word [XSS], 0b11
+
+    jnz  .nz                ;     if ([XSS] % 4 == 0)
+    mov al, ALIVE           ;         al = ALIVE
+
+.nz:
+    stosb                   ;     [es:(di++)] = al
+
+    loop .write_cell        ; } while (--cx)
+
+ret
+
 ; print_grid() - print GRID cells to screen -----------------------------------
 
 ; (*) this function expects ds = 0 when called and sets es = 0 before
 ; print_grid() - print GRID cells to screen -----------------------------------
 
 ; (*) this function expects ds = 0 when called and sets es = 0 before
@@ -104,10 +129,7 @@ ret
 
 print_grid:
 
 
 print_grid:
 
-mov ax, VGA >> 4
-xor di, di
-
-mov es, ax                  ; es:di -> VGA
+les di, [farptr.vga_start]  ; es:di -> VGA
 mov si, GRID                ; ds:si -> GRID
 
 mov ah, PRINT_COLOR         ; ah = color attribute
 mov si, GRID                ; ds:si -> GRID
 
 mov ah, PRINT_COLOR         ; ah = color attribute
@@ -132,7 +154,14 @@ cli                         ; disable interrupts
 hlt
 jmp halt
 
 hlt
 jmp halt
 
-; -----------------------------------------------------------------------------
+; data ------------------------------------------------------------------------
+
+farptr:                     ; offset, segment
+.zero:
+    dw 0                    ; take advantage of next dw 0
+
+.vga_start:
+    dw 0, VGA >> 4
 
 times 510 - ($ - $$) db 0   ; fill remaining bytes with zeroes
 dw 0xaa55                   ; mbr magic byte
 
 times 510 - ($ - $$) db 0   ; fill remaining bytes with zeroes
 dw 0xaa55                   ; mbr magic byte