diff --git a/build-linux.sh b/build-linux.sh index 66caf65..a3a62a3 100755 --- a/build-linux.sh +++ b/build-linux.sh @@ -66,5 +66,5 @@ mkisofs -quiet -V 'MIKEOS' -input-charset iso8859-1 -o disk_images/crawos.iso -b echo '>>> Done!' -qemu-system-i386 -drive file=disk_images/crawos.flp,index=0,if=floppy,format=raw +#qemu-system-i386 -drive file=disk_images/crawos.flp,index=0,if=floppy,format=raw diff --git a/disk_images/crawos.flp b/disk_images/crawos.flp index 3d3461d..4044973 100755 Binary files a/disk_images/crawos.flp and b/disk_images/crawos.flp differ diff --git a/disk_images/crawos.iso b/disk_images/crawos.iso index 6dc1a1f..1133aac 100644 Binary files a/disk_images/crawos.iso and b/disk_images/crawos.iso differ diff --git a/source/features/graphics.asm b/source/features/graphics.asm index a56b42f..e15a90c 100644 --- a/source/features/graphics.asm +++ b/source/features/graphics.asm @@ -16,8 +16,6 @@ os_set_graphics_mode: ; y_start ; colour os_draw_graphical_rectangle: - pusha - ; Tell BIOS we're changing 'da pixels! mov ah, 0Ch @@ -28,21 +26,28 @@ os_draw_graphical_rectangle: jmp .x_loop - .x_loop: - int 10h - cmp cx, [x_end] - je .next_row - inc cx - call .x_loop +.x_loop: + int 10h + cmp cx, [x_end] + je .next_row + inc cx + call .x_loop - .next_row: - mov cx, [x_start] - cmp dx, [y_end] - je .finish - inc dx ; Increase Row - call .x_loop +.next_row: + mov cx, [x_start] + cmp dx, [y_end] + je .finish + inc dx ; Increase Row + call .x_loop - .finish: - popa - Iret +.finish: + ret + + +section .data + x_start dw 0 + y_start dw 0 + x_end dw 0 + y_end dw 0 + colour db 1111b diff --git a/source/features/screen.asm~ b/source/features/screen.asm~ deleted file mode 100755 index c20a56b..0000000 --- a/source/features/screen.asm~ +++ /dev/null @@ -1,162 +0,0 @@ -; ================================================================== -; MikeOS -- The Mike Operating System kernel -; Copyright (C) 2006 - 2021 MikeOS Developers -- see doc/LICENSE.TXT -; -; SCREEN HANDLING SYSTEM CALLS -; ================================================================== - -; ------------------------------------------------------------------ -; os_print_string -- Displays text -; IN: SI = message location (zero-terminated string) -; OUT: Nothing (registers preserved) - -os_print_string: - pusha - - mov ah, 0Eh ; int 10h teletype function, we're telling the BIOS we will print something - -.repeat: - lodsb ; Get char from si into al - cmp al, 0 ; Compare al to 0 - je .done ; If char is zero, end of string - - int 10h ; Otherwise, print it - jmp .repeat ; And move on to next char - -.done: - popa - ret - -; Exact same as the above procedure, but this adds a newline -; after priting, similar to the difference between Rust's print! and println! -os_print_string_nl: pusha - - mov ah, 0Eh ; int 10h teletype function, we're telling the BIOS we will print something - -.repeat: - lodsb ; Get char from si into al - cmp al, 0 ; Compare al to 0 - je .done ; If char is zero, end of string - - int 10h ; Otherwise, print it - jmp .repeat ; And move on to next char - -.done: - call os_print_newline - popa - ret - -; -------------------------------------------- - -os_print_newline: - pusha - - mov ah, 03h - int 10h - - mov ah, 02h - add dh, 1 - mov dl, 0 - int 10h - - popa - ret - - -; ------------------------------------------- - -os_clear_screen: - pusha - - mov ah, 00h - mov al, 03h ; Set video mode to textmode (80x25). 16 colors, 8 pages - int 10h - - mov ah, 02h - mov dh, 0 - mov dl, 0 - int 10h - - popa - ret - -; ------------------------------------------- - -; AX = key pressed -os_read_input: - mov ah, 11h ; BIOS call to check for key - int 16h ; Interrupt - jnz .key_pressed ; Jump if input isn't 0 - - hlt - jmp os_read_input - -.key_pressed: - mov ah, 10h - int 16h - ret - -; ------------------------------------------- - -os_display_input: - pusha - mov cx, prompt_length ; Characters remaining - -.loop: - call .check_key_pressed - - jmp .loop - -.check_key_pressed: - call os_read_input - - cmp al, 08h - je .backspace - - cmp al, 0Dh - je .enter_key - - cmp al, 1Bh - je .esc_key - - dec cx - call .print_current_input - ret - -.esc_key: - call os_reboot - -.enter_key: - mov al, 0 - stosb - mov di, user_input - popa - call os_read_cli - -.backspace: - cmp cx, prompt_length ; If bx < 20 - jl .move_cursor_back ; then .move_cursor_back - call .loop ; Else .loop - -.move_cursor_back: - mov ah, 0Eh - - mov al, 08h - int 10h - mov al, 20h - int 10h - mov al, 08h - int 10h - - dec di - inc cx - jmp os_display_input - -.print_current_input: - stosb - - mov ah, 0Eh - int 10h - - - ret diff --git a/source/functions/math.asm b/source/functions/math.asm new file mode 100644 index 0000000..e69de29 diff --git a/source/games/pong.asm b/source/games/pong.asm index 6018bdd..852340e 100644 --- a/source/games/pong.asm +++ b/source/games/pong.asm @@ -1,27 +1,99 @@ game_pong: - pusha + call .draw_players + call .detect_input - call os_set_graphics_mode +; Clears screen and draws both players and ball +.draw_screen: + call os_set_graphics_mode ; Clear screen +.draw_p1: + ; Player 1 + mov ax, [p1_x] + mov [x_start], ax + mov [x_end], ax - call os_draw_graphical_rectangle + mov bx, [p1_y] + mov [y_start], bx + add bx, [bat_height] + mov [y_end], bx + + call os_draw_graphical_rectangle ; Draw player 1 +.draw_p2: + ; Player 2 + mov ax, [p2_x] + mov [x_start], ax + mov [x_end], ax + + mov bx, [p2_y] + mov [y_start], bx + add bx, [bat_height] + mov [y_end], bx + + call os_draw_graphical_rectangle ; Draw player 1 + ret + +; Player 1 movements +.p1_up: + mov dx, [p1_y] + sub dx, 5 + mov [p1_y], dx + call .draw_players + jmp .detect_input +.p1_down: + mov dx, [p1_y] + add dx, 5 + mov [p1_y], dx + call .draw_players + jmp .detect_input + +; Player 2 movements +.p2_up: + mov dx, [p2_y] + sub dx, 5 + mov [p2_y], dx + call .draw_players + jmp .detect_input +.p2_down: + mov dx, [p2_y] + add dx, 5 + mov [p2_y], dx + call .draw_players + jmp .detect_input + +; Ball bouncing +.bounce_ball: - call os_set_text_mode - jmp .finish .detect_input: - call os_read_input - cmp al, 08h - je .finish - jmp .detect_input + call os_read_input + cmp al, 08h + je .finish + + ; Player 1 + cmp al, 77h ; Pressed 'w' (player 1 up) + je .p1_up + cmp al, 73h ; Pressed 's' (player 1 down) + je .p1_down + + ; Player 2 + cmp al, 5bh ; Pressed '[' (player 2 up) + je .p2_up + cmp al, 27h ; Pressed ''' (player 2 down) + je .p2_down + + jmp .detect_input .finish: - call os_set_text_mode - popa - ret + call os_set_text_mode + call os_start_cli section .data - x_start dw 5 - y_start dw 5 - x_end dw 30 - y_end dw 46 - colour db 1100b + ball_x dw 5 + ball_y dw 5 + + p1_x dw 5 + p1_y dw 5 + + p2_x dw 315 + p2_y dw 5 + + bat_height dw 20 diff --git a/source/games/pong_old.asm b/source/games/pong_old.asm new file mode 100644 index 0000000..ec82717 --- /dev/null +++ b/source/games/pong_old.asm @@ -0,0 +1,86 @@ +game_pong: + pusha + call os_set_graphics_mode + jmp .draw_player_1 + jmp .draw_player_2 + jmp .detect_inputi +.draw_player_1: + ; X coords + mov ax, [p1_x] + mov [x_start], ax + mov [x_end], ax + + ; Y coords + mov bx, [p1_y] + mov [y_start], bx + add bx, [bat_height] ; Add the bat height to the y coord + mov [y_end], b + call os_draw_graphical_rectangle + ret +.draw_player_2: + ; X coords + mov ax, [p2_x] + mov [x_start], ax + mov [x_end], ax + + ; Y coords + mov bx, [p2_y] + mov [y_start], bx + add bx, [bat_height] ; Add the bat height to the y coord + mov [y_end], bx + + call os_draw_graphical_rectangle + ret +.detect_input: + call os_read_input + ; Exit if backspace is pressed + cmp al, 08h + je .finish + ; Go up when you press 'w' + cmp al, 77h + je .p1_up + ; Go up when you press 's' + cmp al, 73h + je .p1_down + + ; Loop back + jmp .detect_input +.p1_down: + ; X coords + mov ax, [p1_x] + mov [x_start], ax + mov [x_end], ax + + ; Y coords + mov bx, [p1_y] + add bx, 5 ; Move the bat down 5 + mov [y_start], bx + add bx, [bat_height] ; Add the bat height to the y coord + mov [y_end], bx + + call os_draw_graphical_rectangle + ret +.p1_up: + mov ax, [move_distance] + sub ax, [p1_y] + call os_draw_graphical_rectangle + ret +.finish: + call os_set_text_mode + popa + ret + +section .data + x_start dw 0 + y_start dw 0 + x_end dw 0 + y_end dw 0 + + p1_y dw 5 + p2_y dw 0 + p1_x dw 5 + p2_x dw 30 + + bat_height dw 20 + move_distance dw 5 + colour db 1111b diff --git a/source/kernel.asm b/source/kernel.asm index ea73479..912ca67 100755 --- a/source/kernel.asm +++ b/source/kernel.asm @@ -60,7 +60,6 @@ Sides dw 2 ; ------------------------------------------------------------------ ; FEATURES -- Code to pull into the kernel - %INCLUDE "features/screen.asm" %INCLUDE "features/cli.asm" %INCLUDE "features/power.asm" @@ -68,7 +67,10 @@ Sides dw 2 %INCLUDE "features/graphics.asm" %INCLUDE "features/sound.asm" -; GAMES +; FUNCTIONS -- Other stuff that is useful + %INCLUDE "functios/math.asm" + +; GAMES -- Games that I wrote for it %INCLUDE "games/pong.asm" ; ================================================================== diff --git a/source/kernel.bin b/source/kernel.bin index 5e5bb3e..c3efb35 100644 Binary files a/source/kernel.bin and b/source/kernel.bin differ