sd:rogueima_i_mvp_1
Differences
This shows you the differences between two versions of the page.
| Next revision | Previous revision | ||
| sd:rogueima_i_mvp_1 [2026/04/11 02:42] – created appledog | sd:rogueima_i_mvp_1 [2026/04/11 02:45] (current) – appledog | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| = Rogueima I MVP 1 | = Rogueima I MVP 1 | ||
| - | * See: [[Part II Writing Games in Assembly Language]] | + | * See: [[Part II Writing Games in Assembly Language# |
| + | |||
| + | |||
| + | == rogueima.sda | ||
| + | <codify armasm> | ||
| + | // Rogueima (C) 2026 Appledog Hu | ||
| + | // rogueima.sda | ||
| + | // rogueima ' | ||
| + | |||
| + | ; Variables | ||
| + | .equ PX $00 ; player X | ||
| + | .equ PY $01 ; player Y | ||
| + | .equ RX $02 ; robot X | ||
| + | .equ RY $03 ; robot Y | ||
| + | |||
| + | .equ player_str | ||
| + | .equ player_hp | ||
| + | .equ player_name | ||
| + | .equ pname_zero | ||
| + | .equ game_time | ||
| + | .equ player_score | ||
| + | |||
| + | .equ VIDEO_MODE | ||
| + | |||
| + | ; Address statement. | ||
| + | .address $00C000 | ||
| + | |||
| + | ; BASIC stub: 10 SYS 269 | ||
| + | ;.bytes $FB, $0A, $00 | ||
| + | ;.bytes "SYS 269", $00 | ||
| + | ;.bytes $00, $00 | ||
| + | |||
| + | ; --- Entry point at $00010D (decimal 269) --- | ||
| + | start: | ||
| + | ; Set mode 6. | ||
| + | LDAH $40 ; Set video mode | ||
| + | LDAL #6 ; to 6 | ||
| + | INT 0x10 | ||
| + | |||
| + | CALL @title_screen | ||
| + | CALL @init_game | ||
| + | |||
| + | CALL @get_player_name | ||
| + | LDA #0 | ||
| + | STAL [@pname_zero] | ||
| + | |||
| + | JMP @main_loop | ||
| + | |||
| + | init_game: | ||
| + | ; Initialize variables | ||
| + | LDAL #19 | ||
| + | STAL [@PX] | ||
| + | LDAL #11 | ||
| + | STAL [@PY] | ||
| + | LDAL #40 | ||
| + | STAL [@RX] | ||
| + | LDAL #22 | ||
| + | STAL [@RY] | ||
| + | |||
| + | LDA #10 | ||
| + | STA [@player_str] | ||
| + | STA [@player_hp] | ||
| + | |||
| + | LDA #0 | ||
| + | STA [@game_time] | ||
| + | STA [@player_score] | ||
| + | |||
| + | RET | ||
| + | |||
| + | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| + | ;; Main Loop | ||
| + | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| + | main_loop: | ||
| + | CALL @draw_map | ||
| + | CALL @get_input | ||
| + | CALL @move_mobs | ||
| + | CALL @robot_beep | ||
| + | CALL @inc_game_time | ||
| + | |||
| + | JMP @main_loop ; Player can press Q to quit. | ||
| + | |||
| + | inc_game_time: | ||
| + | LDA [@game_time] | ||
| + | INC A | ||
| + | STA [@game_time] | ||
| + | RET | ||
| + | |||
| + | |||
| + | get_player_name: | ||
| + | LDELM @what_is_your_name | ||
| + | LDAH $18 ; write string | ||
| + | INT 0x10 | ||
| + | |||
| + | LDAH $68 ; IO_INPUT | ||
| + | INT 0x05 | ||
| + | ; player name is now at ELM. | ||
| + | |||
| + | ; Ensure player name is no longer than 16 characters. | ||
| + | MOV FLD, ELM | ||
| + | ADD FLD, #17 | ||
| + | LDAL #0 | ||
| + | STAL [FLD] | ||
| + | |||
| + | ; Copy player name into variable space. | ||
| + | LDFLD @player_name | ||
| + | name_copy_loop: | ||
| + | LDAL [ELM, +] | ||
| + | STAL [FLD, +] | ||
| + | JNZ @name_copy_loop | ||
| + | |||
| + | RET ;; return. | ||
| + | |||
| + | what_is_your_name: | ||
| + | .bytes " What is your name? ", 0 | ||
| + | |||
| + | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| + | ;; Get input from the player. | ||
| + | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| + | get_input: | ||
| + | ; Blocking GETKEY -> AL | ||
| + | LDAH $02 | ||
| + | INT $10 | ||
| + | |||
| + | ; Uppercase: if AL >= ' | ||
| + | CMP AL, #97 | ||
| + | JNC @gi_check_keys | ||
| + | CMP AL, #123 | ||
| + | JC @gi_check_keys | ||
| + | SUB AL, #32 | ||
| + | |||
| + | gi_check_keys: | ||
| + | CMP AL, #' | ||
| + | JZ @move_left | ||
| + | CMP AL, #' | ||
| + | JZ @move_down | ||
| + | CMP AL, #' | ||
| + | JZ @move_up | ||
| + | CMP AL, #' | ||
| + | JZ @move_right | ||
| + | CMP AL, #' | ||
| + | JZ @quit_game | ||
| + | |||
| + | RET | ||
| + | |||
| + | move_left: | ||
| + | LDAL [@PX] | ||
| + | DEC AL | ||
| + | CMP AL, #1 | ||
| + | JC @ml_ok | ||
| + | LDAL #1 | ||
| + | ml_ok: | ||
| + | STAL [@PX] | ||
| + | RET | ||
| + | |||
| + | move_down: | ||
| + | LDAL [@PY] | ||
| + | INC AL | ||
| + | CMP AL, #23 | ||
| + | JNC @md_ok | ||
| + | LDAL #23 | ||
| + | md_ok: | ||
| + | STAL [@PY] | ||
| + | RET | ||
| + | |||
| + | move_up: | ||
| + | LDAL [@PY] | ||
| + | DEC AL | ||
| + | CMP AL, #1 | ||
| + | JC @mu_ok | ||
| + | LDAL #1 | ||
| + | mu_ok: | ||
| + | STAL [@PY] | ||
| + | RET | ||
| + | |||
| + | move_right: | ||
| + | LDAL [@PX] | ||
| + | INC AL | ||
| + | CMP AL, #59 | ||
| + | JNC @mr_ok | ||
| + | LDAL #58 | ||
| + | mr_ok: | ||
| + | STAL [@PX] | ||
| + | RET | ||
| + | |||
| + | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| + | ;; Move the robot. | ||
| + | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| + | move_mobs: | ||
| + | RET | ||
| + | |||
| + | ;;;;;;;;;;;;;;;;;;;;;;;; | ||
| + | ;; Game Over. | ||
| + | ;;;;;;;;;;;;;;;;;;;;;;;; | ||
| + | game_over: | ||
| + | ; CLS | ||
| + | LDAH $10 | ||
| + | INT $10 | ||
| + | |||
| + | ; Print "OH NO! THE ROBOT CATCHES YOU." | ||
| + | LDBLX @msg_game_over1 | ||
| + | LDAH $66 | ||
| + | INT $05 | ||
| + | LDAH $64 ; newline | ||
| + | INT $05 | ||
| + | |||
| + | ; Print "GAME OVER." | ||
| + | LDBLX @msg_game_over2 | ||
| + | LDAH $66 | ||
| + | INT $05 | ||
| + | LDAH $64 | ||
| + | INT $05 | ||
| + | |||
| + | RET | ||
| + | |||
| + | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| + | ;; Player quit game | ||
| + | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| + | quit_game: | ||
| + | ; CLS | ||
| + | LDAH $10 | ||
| + | INT $10 | ||
| + | |||
| + | ; Print "QUIT GAME" | ||
| + | LDBLX @msg_quit | ||
| + | LDAH $66 | ||
| + | INT $05 | ||
| + | |||
| + | POP ELM ; destroy return address of CALL from main loop | ||
| + | RET ; exit program. | ||
| + | |||
| + | robot_beep: | ||
| + | LDELM @robot_sfx | ||
| + | LDAH $52 | ||
| + | INT $11 | ||
| + | RET | ||
| + | |||
| + | ; ============================================================================ | ||
| + | ; String data | ||
| + | ; ============================================================================ | ||
| + | msg_game_over1: | ||
| + | .bytes "OH NO! THE ROBOT CATCHES YOU.", 0 | ||
| + | msg_game_over2: | ||
| + | .bytes "GAME OVER.", | ||
| + | msg_quit: | ||
| + | .bytes "QUIT GAME", 10,13,0 | ||
| + | robot_sfx: | ||
| + | .bytes "T120 W1 V5 O2 L24 B", 0 | ||
| + | |||
| + | |||
| + | ; ============================================= | ||
| + | ; Title Screen | ||
| + | ; ============================================= | ||
| + | title_screen: | ||
| + | ; Clear screen | ||
| + | ; (This is done on mode switch, but we do it here anyways.) | ||
| + | LDAH $10 | ||
| + | INT $10 | ||
| + | |||
| + | LDA $1500 ; Set cursor | ||
| + | LDX #1 | ||
| + | LDY #1 | ||
| + | INT 0x10 | ||
| + | |||
| + | LDELM @str_title1 | ||
| + | LDA $1800 | ||
| + | INT 0x10 | ||
| + | RET | ||
| + | |||
| + | str_title1: | ||
| + | .bytes "The Rogue' | ||
| + | .bytes " Copyright 2026 by Appledog Hu.", | ||
| + | </ | ||
| + | |||
| + | == draw.sda | ||
| + | <codify armasm> | ||
| + | // rogueima (C) 2026 Appledog Hu | ||
| + | // draw.asm | ||
| + | // Draw the display screen; borders, status, chat, wold map, etc. | ||
| + | |||
| + | draw_map: | ||
| + | ; VSTOP | ||
| + | LDAL $86 ; Mode 6 VSTOP | ||
| + | STAL [@VIDEO_MODE] | ||
| + | |||
| + | CALL @draw_borders | ||
| + | CALL @draw_world | ||
| + | CALL @draw_player | ||
| + | CALL @draw_mobs | ||
| + | CALL @draw_stats | ||
| + | CALL @draw_msgs | ||
| + | |||
| + | |||
| + | ; VSTART | ||
| + | LDAL #6 ; Mode 6 VSTART | ||
| + | STAL [@VIDEO_MODE] | ||
| + | |||
| + | RET | ||
| + | |||
| + | ;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| + | ;; Draw borders. | ||
| + | ;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| + | draw_borders: | ||
| + | ; CLS | ||
| + | LDAH $10 ; CLS | ||
| + | INT $10 | ||
| + | |||
| + | LDX #0 ;; clear XH and YH. | ||
| + | LDY #0 | ||
| + | |||
| + | ; Draw top/bottom border: ' | ||
| + | LDBL #' | ||
| + | LDXL #0 | ||
| + | |||
| + | dm_top_bottom: | ||
| + | LDYL #0 | ||
| + | LDAH $11 ; write char AL at XL, YL | ||
| + | INT $10 | ||
| + | |||
| + | LDYL #24 | ||
| + | LDAH $11 ; write char | ||
| + | INT $10 | ||
| + | |||
| + | CMP XL, #59 ; if XL >= 10, then set carry. | ||
| + | JNC @dm_skip_ms | ||
| + | |||
| + | LDYL #10 ; status/text window separator | ||
| + | LDAH $11 ; write char | ||
| + | INT $10 | ||
| + | |||
| + | dm_skip_ms: | ||
| + | INC XL | ||
| + | CMP XL, #80 ; Mode 6 is 80 chars wide. | ||
| + | JNC @dm_top_bottom | ||
| + | |||
| + | ; Draw left/right borders: ' | ||
| + | LDBL #' | ||
| + | LDYL #0 | ||
| + | dm_left_right: | ||
| + | LDXL #0 ; left border | ||
| + | LDAH $11 ; write char | ||
| + | INT $10 | ||
| + | |||
| + | LDXL #59 ; middle border | ||
| + | LDAH $11 ; write char | ||
| + | INT $10 | ||
| + | |||
| + | LDXL #79 ; right side border | ||
| + | LDAH $11 ; write char | ||
| + | INT $10 | ||
| + | |||
| + | INC YL | ||
| + | CMP YL, #25 | ||
| + | JNC @dm_left_right | ||
| + | RET | ||
| + | |||
| + | |||
| + | draw_player: | ||
| + | ; Draw player ' | ||
| + | LDAH $11 | ||
| + | LDBL #' | ||
| + | LDXL [@PX] | ||
| + | LDYL [@PY] | ||
| + | LDAH $11 ; write char | ||
| + | INT $10 | ||
| + | RET | ||
| + | |||
| + | |||
| + | draw_mobs: | ||
| + | ; stub for now | ||
| + | RET | ||
| + | |||
| + | |||
| + | draw_stats: | ||
| + | ; Set cursor | ||
| + | LDA $1500 | ||
| + | LDX #61 | ||
| + | LDY #2 | ||
| + | INT 0x10 | ||
| + | |||
| + | LDELM @str_name | ||
| + | LDA $1800 ; write string | ||
| + | INT 0x10 | ||
| + | |||
| + | ; Draw player' | ||
| + | ; This will draw right after the 'Name: ' above. | ||
| + | ; That's why we added spaces to the strings (below). | ||
| + | LDELM @player_name | ||
| + | LDA $1800 ; write string | ||
| + | INT 0x10 | ||
| + | |||
| + | ;;;;;;;;;;;;;;;;;;;; | ||
| + | LDA $1500 ; set cursor | ||
| + | LDX #61 | ||
| + | LDY #4 | ||
| + | INT 0x10 | ||
| + | |||
| + | LDELM @str_str | ||
| + | LDA $1800 ; write string | ||
| + | INT 0x10 | ||
| + | |||
| + | ; Draw player' | ||
| + | LDA $6300 ; print unsigned word (will print after string above). | ||
| + | LDB [@player_str] | ||
| + | INT 0x05 | ||
| + | |||
| + | ;;;;;;;;;;;;;;;;;;;; | ||
| + | LDA $1500 ; set cursor | ||
| + | LDX #61 | ||
| + | LDY #5 | ||
| + | INT 0x10 | ||
| + | |||
| + | LDELM @str_hp | ||
| + | LDA $1800 ; Write string | ||
| + | INT 0x10 | ||
| + | |||
| + | LDA $6300 ; Write number (unsigned) | ||
| + | LDB [@player_hp] | ||
| + | INT 0x05 | ||
| + | |||
| + | |||
| + | ;;;;;;;;;;;;;;;;;;;; | ||
| + | LDA $1500 ; Set cursor | ||
| + | LDX #61 | ||
| + | LDY #7 | ||
| + | INT 0x10 | ||
| + | |||
| + | LDELM @str_score | ||
| + | LDA $1800 ; write string | ||
| + | INT 0x10 | ||
| + | |||
| + | LDA $6300 ; print number | ||
| + | LDB [@player_score] | ||
| + | INT 0x05 | ||
| + | |||
| + | |||
| + | ;;;;;;;;;;;;;;;;;;;; | ||
| + | LDA $1500 ; set cursor | ||
| + | LDX #61 | ||
| + | LDY #8 | ||
| + | INT 0x10 | ||
| + | |||
| + | LDELM @str_time | ||
| + | LDA $1800 ; write string | ||
| + | INT 0x10 | ||
| + | |||
| + | LDA $6300 ; print number | ||
| + | LDB [@game_time] | ||
| + | INT 0x05 | ||
| + | |||
| + | RET | ||
| + | |||
| + | str_name: | ||
| + | .bytes "Name: ", 0 | ||
| + | |||
| + | str_str: | ||
| + | .bytes "STR: ", 0 | ||
| + | |||
| + | str_hp: | ||
| + | .bytes "HP: ", 0 | ||
| + | |||
| + | str_time: | ||
| + | .bytes "T: ",0 | ||
| + | |||
| + | str_score: | ||
| + | .bytes " | ||
| + | |||
| + | draw_msgs: | ||
| + | ; We will work on this after. | ||
| + | RET | ||
| + | |||
| + | draw_world: | ||
| + | ; We will work on this last. | ||
| + | RET | ||
| + | </ | ||
sd/rogueima_i_mvp_1.1775875364.txt.gz · Last modified: by appledog
