The Art of
ASSEMBLY LANGUAGE PROGRAMMING

Chapter Nineteen (Part 6)

Table of Content

Chapter Nineteen (Part 8)

CHAPTER NINETEEN:
PROCESSES, COROUTINES AND CONCURRENCY (Part 7)
19.3.1 - AMAZE.ASM

19.3.1 AMAZE.ASM

The best way to learn how to use coroutines is via example. The following program is an interesting piece of code that generates mazes on the PC's display. The maze generation algorithm has one major constraint - there must be no more than one correct solution to the maze (it is possible for there to be no solution). The main program creates a set of background processes called "demons" (actually, daemon is the correct term, but demon sounds more appropriate here). Each demon begins carving out a portion of the maze subject to the main constraint. Each demon gets to dig one cell from the maze and then it passes control to another demon. As it turns out, demons can "dig themselves into a corner" and die (demons live only to dig). When this happens, the demon removes itself from the list of active demons. When all demons die off, the maze is (in theory) complete. Since the demons die off fairly regularly, there must be some mechanism to create new demons. Therefore, this program randomly spawns new demons who start digging their own tunnels perpendicular to their parents. This helps ensure that there is a sufficient supply of demons to dig out the entire maze; the demons all die off only when there are no, or few, cells remaining to dig in the maze.

; AMAZE.ASM
;
; A maze generation/solution program.
;
; This program generates an 80x25 maze and directly draws the maze on the
; video display.  It demonstrates the use of coroutines within a program.

                .xlist
                include         stdlib.a
                includelib      stdlib.lib
                .list

byp             textequ <byte ptr>

dseg            segment para public 'data'

; Constants:
;
; Define the "ToScreen" symbol (to any value) if the maze is 80x25 and you
; want to display it on the video screen.

ToScreen        equ     0


; Maximum X and Y coordinates for the maze (matching the display).

MaxXCoord       equ     80
MaxYCoord       equ     25

; Useful X,Y constants:

WordsPerRow     =       MaxXCoord+2
BytesPerRow     =       WordsPerRow*2

StartX          equ     1               ;Starting X coordinate for maze
StartY          equ     3               ;Starting Y coordinate for maze
EndX            equ     MaxXCoord       ;Ending X coordinate for maze
EndY            equ     MaxYCoord-1     ;Ending Y coordinate for maze

EndLoc          =       ( (EndY-1)*MaxXCoord + EndX-1)*2
StartLoc        =       ( (StartY-1)*MaxXCoord + StartX-1)*2

; Special 16-bit PC character codes for the screen for symbols drawn during
; maze generation.  See the chapter on the video display for details.

                ifdef   mono            ;Mono display adapter.

WallChar        equ     7dbh            ;Solid block character
NoWallChar      equ     720h            ;space
VisitChar       equ     72eh            ;Period
PathChar        equ     72ah            ;Asterisk

                else                    ;Color display adapter.

WallChar        equ     1dbh            ;Solid block character
NoWallChar      equ     0edbh           ;space
VisitChar       equ     0bdbh           ;Period
PathChar        equ     4e2ah           ;Asterisk

                endif




; The following are the constants that may appear in the Maze array:

Wall            =       0
NoWall          =       1
Visited         =       2

; The following are the directions the demons can go in the maze

North           =       0
South           =       1
East            =       2
West            =       3


; Some important variables:


; The Maze array must contain an extra row and column around the
; outside edges for our algorithm to work properly                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                e.
                pop     bp
                ret     4

; See if moving to this spot was an illegal move.  There will be
; a NoWall value at this cell in the maze if the move is legal.

NotSolved:      mov     dl, sm_X
                mov     dh, sm_Y
                MazeAdrs
                mov     bx, ax
                cmp     Maze[bx], NoWall
                je      MoveOK
                mov     ax, 0                   ;Return failure
                pop     bp
                ret     4

; Well, it is possible to move to this point, so place an appropriate
; value on the screen and keep searching for the solution.

MoveOK:         mov     Maze[bx], Visited

                ifdef   ToScreen
                push    es                      ;Write a "VisitChar"
                ScrnAdrs                        ; character to the
                mov     bx, ax                  ; screen at this X,Y
                mov     ax, ScreenSeg           ; position.
                mov     es, ax
                mov     word ptr es:[bx], VisitChar
                pop     es
                endif

; Recusively call SolveMaze until we get a solution.  Just call SolveMaze
; for the four possible directions (up, down, left, right) we could go.
; Since we've left "Visited" values in the Maze, we will not accidentally
; search back through the path we've already travelled.  Furthermore, if
; we cannot go in one of the four directions, SolveMaze will catch this
; immediately upon entry (see the code at the start of this routine).

                mov     ax, sm_X                ;Try the path at location
                dec     ax                      ; (X-1, Y)
                push    ax
                push    sm_Y
                call    SolveMaze
                test    ax, ax                  ;Solution?
                jne     Solved

                push    sm_X                    ;Try the path at location
                mov     ax, sm_Y                ; (X, Y-1)
                dec     ax
                push    ax
                call    SolveMaze
                test    ax, ax                  ;Solution?
                jne     Solved

                mov     ax, sm_X                ;Try the path at location
                inc     ax                      ; (X+1, Y)
                push    ax
                push    sm_Y
                call    SolveMaze
                test    ax, ax                  ;Solution?
                jne     Solved

                push    sm_X                    ;Try the path at location
                mov     ax, sm_Y                ; (X, Y+1)
                inc     ax
                push    ax
                call    SolveMaze
                test    ax, ax                  ;Solution?
                jne     Solved
                pop     bp
                ret     4

Solved:
                ifdef   ToScreen                ;Draw return path.
                push    es
                mov     dl, sm_X
                mov     dh, sm_Y
                ScrnAdrs
                mov     bx, ax
                mov     ax, ScreenSeg
                mov     es, ax
                mov     word ptr es:[bx], PathChar
                pop     es
                mov     ax, 1                   ;Return true
                endif

                pop     bp
                ret     4
SolveMaze       endp



; Here's the main program that drives the whole thing:

Main            proc
                mov     ax, dseg
                mov     ds, ax
                mov     es, ax
                meminit


                call    Init                    ;Initialize maze stuff.
                lesi    MainPCB                 ;Initialize coroutine
                coinit                          ; package.

; Create the first demon.
; Set up the stack pointer for this guy:

                mov     cx, 256
                malloc
                add     di, 248
                mov     DemonList.regsp, di
                mov     DemonList.regss, es

; Set up the execution address for this guy:

                mov     DemonList.regcs, cs
                mov     DemonList.regip, offset Dig

; Initial coordinates and direction for this guy:

                mov     cx, East                ;Start off going east.
                mov     dh, StartY
                mov     dl, StartX
                mov     DemonList.regcx, cx
                mov     DemonList.regdx, dx

; Set up other misc junk:

                mov     DemonList.regds, seg dseg
                sti
                pushf
                pop     DemonList.regflags
                mov     byp DemonList.NextProc, 1       ;Demon is "active".
                inc     DemonCnt
                mov     DemonIndex, 0




; Set up the Timer demon:

                mov     DemonList.regsp+(size pcb), offset EndTimerStk
                mov     DemonList.regss+(size pcb), ss

; Set up the execution address for this guy:

                mov     DemonList.regcs+(size pcb), cs
                mov     DemonList.regip+(size pcb), offset TimerDemon

; Set up other misc junk:

                mov     DemonList.regds+(size pcb), seg dseg
                sti
                pushf
                pop     DemonList.regflags+(size pcb)
                mov     byp DemonList.NextProc+(size pcb), 1
                inc     DemonCnt

; Start the ball rolling.

                mov     ax, ds
                mov     es, ax
                lea     di, DemonList
                cocall

; Wait for the user to press a key before solving the maze:

                getc

                mov     ax, StartX
                push    ax
                mov     ax, StartY
                push    ax
                call    SolveMaze

; Wait for another keystroke before quitting:

                getc

                mov     ax, 3           ;Clear screen and reset video mode.
                int     10h

Quit:           ExitPgm                 ;DOS macro to quit program.
Main            endp

cseg            ends

sseg            segment para stack 'stack'

; Stack for the timer demon we create (we'll allocate the other
; stacks dynamically).

TimerStk        byte    256 dup (?)
EndTimerStk     word    ?


; Main program's stack:

stk             byte    512 dup (?)
sseg            ends

zzzzzzseg       segment para public 'zzzzzz'
LastBytes       db      16 dup (?)
zzzzzzseg       ends
                end     Main

Chapter Nineteen (Part 6)

Table of Content

Chapter Nineteen (Part 8)

Chapter Nineteen: Processes, Coroutines and Concurrency (Part 7)
29 SEP 1996