User Tools

Site Tools


sd:part_ii_writing_games_in_assembly_language

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
sd:part_ii_writing_games_in_assembly_language [2026/04/02 19:59] appledogsd:part_ii_writing_games_in_assembly_language [2026/04/03 05:30] (current) appledog
Line 3: Line 3:
  
 == Introduction == Introduction
-At the end of [[SD-8516 Stellar BASIC]] we wrote a game called [[sdb:robots|ROBOTS.BAS]]. This was a fun little take on the classic CHASE or 'robots' game from the bsd games collection. Now, for our study of Assembly Language, let's write a similar game: 'robots.asm'.+At the end of [[SD-8516 Stellar BASIC]] we wrote a game called [[sdb:robots|ROBOTS.BAS]]. This was a fun little take on the classic CHASE or 'robots' game from the bsd games collection. Now, for our study of Assembly Language, let's write a similar game: 'robots.asm'. Don't worry if you're not familiar with the BASIC version of this program; everything will be explained here.
  
 == Part 1: Assembling and Running a Program == Part 1: Assembling and Running a Program
-An assembly language program should start with an .address the bytes will be compiled fromOur program therefore begins:+Just like BASIC programs have line numbers, or C programs have #include statements, an assembly language program should start with an ''.address'' statementThis will tell the assembler where to start assembling the program. This enables us to use labels like ''start:'' and ''message:''. The assembler can calculate the exact address of the label in relative to the ''.address'' when assembling the program.
  
 <codify armasm> <codify armasm>
Line 280: Line 280:
 The second compare has a protective function. The second compare has a protective function.
  
-    CMP AL, #123 +    CMP AL, #123             ; if AL >= 123, set carry. 
 +    
     ; If it's '{' or anything after, skip:     ; If it's '{' or anything after, skip:
     JC @gi_check_keys        ; Jump if Carry = Jump if AL > 'z' (al >= '}')     JC @gi_check_keys        ; Jump if Carry = Jump if AL > 'z' (al >= '}')
Line 289: Line 289:
  
 Visual summary: Visual summary:
- +AL Value Meaning What Happens ^
-AL Value Meaning What Happens |+
 | < 97 | before ''a'' | Skipped. | | < 97 | before ''a'' | Skipped. |
-| 97-122 | ''a'' to ''z'' | SUB #32 becomes 'A' to 'Z'+| 97-122 | ''a'' to ''z'' | SUB #32 becomes 'A' to 'Z'
-| >= 123 | after 'z'\\ //('}' and up)// |  Skipped |+| >= 123 | after 'z'\\ //'}' and up// | Skipped| 
 + 
 +=== Processing player input 
 +We will use the HJKL convention: 
 + 
 +<codify armasm> 
 +gi_check_keys: 
 +    CMP AL, #'H' 
 +    JZ @move_left 
 + 
 +    CMP AL, #'J' 
 +    JZ @move_down 
 + 
 +    CMP AL, #'K' 
 +    JZ @move_up 
 + 
 +    CMP AL, #'L' 
 +    JZ @move_right 
 + 
 +    CMP AL, #'Q' 
 +    JZ @quit_game 
 + 
 +    RET 
 +</codify> 
 + 
 +This is easy enough; after a CMP, if the values are equal then the zero flag is set. We will use JZ (jump if zero flag is set) to go to the correct routine. 
 + 
 +=== processing each command 
 +<codify armasm> 
 +move_left: 
 +    LDAL [@PX]        ; load variable PX into register AL. 
 +    DEC AL            ; X = X - 1 (move to the left!) 
 +     
 +    CMP AL, #1        ; bounds check. Is the player on the border? 
 +    JC @ml_ok         ; AL >= 1, so it's ok. skip to ml_ok, 
 +     
 +    LDAL #1           ; If  we reach here the player was on the border; set position to 1. 
 +     
 +ml_ok: 
 +    STAL [@PX]        ; pass! Save the player's location. 
 +    RET 
 +</codify>
  
 +This is the move_left command. We begin by loading the player's X location into AL and executing the move. After a bounds check, we save the variable. All of the other moves operate this way.
sd/part_ii_writing_games_in_assembly_language.1775159993.txt.gz · Last modified: by appledog

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki