---input---
;----------------------------------------------------------------------------;
; Does A* pathfinding for rockraiders and vehicles
;
; Copyright 2015 Ruben De Smet
;
; Redistribution and use in source and binary forms, with or without
; modification, are permitted provided that the following conditions are
; met:
; 
;     (1) Redistributions of source code must retain the above copyright
;         notice, this list of conditions and the following disclaimer. 
; 
;     (2) Redistributions in binary form must reproduce the above copyright
;         notice, this list of conditions and the following disclaimer in
;         the documentation and/or other materials provided with the
;         distribution.  
;         
;     (3) The name of the author may not be used to
;         endorse or promote products derived from this software without
;         specific prior written permission.
; 
; THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
; IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
; WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
; DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
; INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
; SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
; HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
; STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
; IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
; POSSIBILITY OF SUCH DAMAGE.
;
;----------------------------------------------------------------------------;

IDEAL
P386
MODEL FLAT, C
ASSUME cs:_TEXT,ds:FLAT,es:FLAT,fs:FLAT,gs:FLAT

INCLUDE "ASTAR.INC"
INCLUDE "READLVL.INC"
INCLUDE "DEBUG.INC"

STRUC TPriorityField
    heuristic dd ?
    distance dd ?
    x db ?
    y db ?
    fromx db ?
    fromy db ?
ENDS

STRUC TField
    distance dd ?
    x db ?
    y db ?
ENDS

CODESEG 

PROC getPath
        USES ecx
        ARG @@tgtx:dword, \
            @@tgty:dword \
        RETURNS eax, ebx ; eax contains x, ebx contains y

        call getLevelWidth
        imul eax, [@@tgty]
        add eax, [@@tgtx]
        imul eax, SIZE TField
        add eax, offset backtraceGraph        
        mov ecx, eax

        xor eax, eax
        xor ebx, ebx

        mov al, [(TField ptr ecx).x]
        mov bl, [(TField ptr ecx).y]

        ret
ENDP getPath

PROC findPath
        ; eax will contain a 1 when a path has been found
        ;                    0 otherwise.
        ARG @@srcx:dword, \
            @@srcy:dword, \
            @@tgtx:dword, \
            @@tgty:dword, \
            @@type:dword \
            RETURNS eax

        ; Check whether the target field is "allowed" for
        ; the selected vehicle or rock raider
        call getField, [@@tgtx], [@@tgty]
        mov al, [byte ptr eax]
        and eax, 0FFh

        add eax, offset actionTable
        mov eax, [eax]
        and eax, [@@type]               ; TODO: for now, rock raider is hard coded
        jnz @canGoToTarget

        mov eax, 0
        ret
@canGoToTarget:

        call cleanData
        mov eax, [@@type]
        mov [currentType], eax

        mov eax, [@@srcx]
        mov [currentOpen.x], al
        mov eax, [@@srcy]
        mov [currentOpen.y], al

        call distance, [@@srcx], [@@srcy], [@@tgtx], [@@tgty] 
        ; eax <- distance
        call addOpen, [@@srcx], [@@srcy], eax, 0

@openListNotEmpty:
        call popOpen
        cmp eax, 0
        je @openListEmpty

        call addToMap

        call addClosed

        mov eax, [@@tgtx]
        cmp [currentOpen.x], al
        jne @nextOpen
        mov eax, [@@tgty]
        cmp [currentOpen.y], al
        jne @nextOpen

        jmp @routeFound

        @nextOpen:
        call addNeighbours, [@@tgtx], [@@tgty]

        jmp @openListNotEmpty

@openListEmpty:
        mov eax, 0
        ret

@routeFound:
        mov eax, 1
        ret
ENDP findPath

PROC addToMap
        USES eax, ecx

        call getLevelWidth
        xor ecx, ecx
        mov cl, [currentOpen.y]
        imul eax, ecx
        mov cl, [currentOpen.x]
        add eax, ecx
        imul eax, SIZE TField
        add eax, offset backtraceGraph

        mov ecx, [currentOpen.distance]
        cmp [(TField ptr eax).distance], ecx
        jbe @dontAdd

        mov [(TField ptr eax).distance], ecx
        mov cl, [currentOpen.fromx]
        mov [(TField ptr eax).x], cl
        mov cl, [currentOpen.fromy]
        mov [(TField ptr eax).y], cl

@dontAdd:
        ret
ENDP addToMap

; Is closed checks whether the field considered is "closed" for being added to the open list.
; So, it also checks whether we can go on the selected field.
PROC isClosed
        USES ebx, ecx, edx
        ARG @@x:dword, \
            @@y:dword RETURNS eax

        ; Check bounds first:

        call getLevelWidth
        cmp [@@x], eax
        ja notWithinBounds ; ja considers -1 > 10

        call getLevelHeight
        cmp [@@y], eax
        ja notWithinBounds

        ; Check whether this field is "allowed" for
        ; the selected vehicle or rock raider
        call getField, [@@x], [@@y]
        mov al, [byte ptr eax]
        and eax, 0FFh

        add eax, offset actionTable
        mov eax, [eax]
        and eax, [currentType]               ; TODO: for now, rock raider is hard coded
        jnz @canGoHere


        inc eax ; mov eax, 1
        ret

@canGoHere:
        
        ; Getting here means the field is okay to walk/fly/whatever on

        xor ecx, ecx
        mov cx, [closedlistSize]
        cmp cx, 0 ; If empty, return 0
        jne @closedNotEmpty

        mov eax, 0
        ret

@closedNotEmpty:
        mov ebx, offset closedlist

@loopClosed:
        mov edx, [@@x]
        cmp [(TField ptr ebx).x], dl
        jne @nextClosed
        mov edx, [@@y]
        cmp [(TField ptr ebx).y], dl
        jne @nextClosed

        ; If reached here, yep, contained in closed list
        mov eax, 1
        ret

    @nextClosed:
        add ebx, SIZE TField
        dec ecx
        jnz @loopClosed

        mov eax, 0
        ret

notWithinBounds:
        mov eax, 1
        ret
ENDP isClosed

PROC addNeighbours
        USES eax, ebx, ecx, edx
        ARG @@tgtx:dword, \
            @@tgty:dword
        ; Push all neighbours of currentOpen on openList

        xor ebx, ebx
        xor ecx, ecx
        
        mov bl, [currentOpen.x]
        mov cl, [currentOpen.y]
        mov edx, [currentOpen.distance]
        inc edx ; Next distance is one more.

        ; Up
        dec ecx
        call isClosed, ebx, ecx
        cmp eax, 0
        jne @noUp
        call distance, ebx, ecx, [@@tgtx], [@@tgty]
        add eax, edx
        call addOpen, ebx, ecx, eax, edx
        @noUp:
        inc ecx

        ; Right
        inc ebx
        call isClosed, ebx, ecx
        cmp eax, 0
        jne @noRight
        call distance, ebx, ecx, [@@tgtx], [@@tgty]
        add eax, edx
        call addOpen, ebx, ecx, eax, edx
        @noRight:
        dec ebx

        ; Left
        dec ebx
        call isClosed, ebx, ecx
        cmp eax, 0
        jne @noLeft
        call distance, ebx, ecx, [@@tgtx], [@@tgty]
        add eax, edx
        call addOpen, ebx, ecx, eax, edx
        @noLeft:
        inc ebx

        ; Down
        inc ecx
        call isClosed, ebx, ecx
        cmp eax, 0
        jne @noDown
        call distance, ebx, ecx, [@@tgtx], [@@tgty]
        add eax, edx
        call addOpen, ebx, ecx, eax, edx
        @noDown:
        dec ecx

        ret
ENDP addNeighbours

PROC popOpen
        ARG RETURNS eax
        USES ebx, ecx, edx, esi, edi
        ; eax contains the smallest current heuristic
        ; ebx contains the index of that field

        cmp [openlistSize], 0           ; If empty, return 0
        jne @goForth

        mov eax, 0
        ret

@goForth:

        mov eax, 0FFFFFFFFh             ; Longest distance possible in 32 bits.
        xor ebx, ebx
        xor ecx, ecx                    ; ecx contains the current index

@searchFurther:
        mov edx, ecx
        imul edx, SIZE TPriorityField
        cmp [(TPriorityField ptr (openlist + edx)).heuristic], eax
        ja @notBetter
        ; Better guess found, put right values in eax and ebx
        mov eax, [(TPriorityField ptr (openlist + edx)).heuristic]
        mov ebx, ecx

@notBetter:

        inc ecx
        cmp cx, [openlistSize]
        jne @searchFurther

        ; By now, we have found the right item to pop from the priorityqueue.

        ; Move the correct item in currentOpen
        mov ecx, SIZE TPriorityField
        mov esi, ebx
        imul esi, ecx
        add esi, offset openlist

        mov edi, offset currentOpen
        rep movsb

        ; Now make the remove the thing from the vector

        xor ecx, ecx
        mov cx, [openlistSize]
        sub ecx, ebx
        dec ecx
        imul ecx, SIZE TPriorityField
        mov edi, esi
        sub edi, SIZE TPriorityField
        rep movsb

        dec [openlistSize]
        mov eax, 1
        ret
ENDP popOpen

PROC addClosed
        USES eax, ebx

        xor ebx, ebx
        xor eax, eax

        mov bx, [closedlistSize]
        imul ebx, SIZE TField        
        add ebx, offset closedlist ; ebx contains the target TField

        mov al, [currentOpen.x]
        mov [(TField ptr ebx).x], al
        mov al, [currentOpen.y]
        mov [(TField ptr ebx).y], al
        mov eax, [currentOpen.distance]
        mov [(TField ptr ebx).distance], eax

        inc [closedlistSize]
        cmp [closedlistSize], CLOSED_LIST_SIZE_MAX
        jne @noProblemWithClosedVector

        xor eax, eax
        mov ax, [closedlistSize]
        call crash, offset closedOutOfMemory, eax

@noProblemWithClosedVector:
        ret
ENDP addClosed

PROC addOpen
        USES eax, ebx
        ARG @@x:dword, \
            @@y:dword, \
            @@priority:dword, \
            @@distance:dword

        xor eax, eax
        mov ax, [openlistSize]
        imul eax, SIZE TPriorityField
        add eax, offset openlist

        mov ebx, [@@x]
        mov [(TPriorityField ptr eax).x], bl
        mov ebx, [@@y]
        mov [(TPriorityField ptr eax).y], bl

        mov bl, [currentOpen.x]
        mov [(TPriorityField ptr eax).fromx], bl
        mov bl, [currentOpen.y]
        mov [(TPriorityField ptr eax).fromy], bl

        mov ebx, [@@priority]
        mov [(TPriorityField ptr eax).heuristic], ebx
        mov ebx, [@@distance]
        mov [(TPriorityField ptr eax).distance], ebx

        inc [openlistSize]
        cmp [openlistSize], OPEN_LIST_SIZE_MAX
        jne @noProblem

        xor eax, eax
        mov ax, [openlistSize]
        call crash, offset openOutOfMemory, eax

@noProblem:
        ret
ENDP

PROC distance
        USES ebx
        ARG @@srcx:dword, \
            @@srcy:dword, \
            @@tgtx:dword, \
            @@tgty:dword \
        RETURNS eax

        mov eax, [@@srcx]
        sub eax, [@@tgtx]

        jns @noSignChangex
        neg eax

        @noSignChangex:

        mov ebx, [@@srcy]
        sub ebx, [@@tgty]

        jns @noSignChangey
        neg ebx

        @noSignChangey:
        add eax, ebx
        ret
ENDP distance

PROC cleanData
        USES eax, ecx
        mov [openlistSize], 0
        mov [closedlistSize], 0

        mov [currentOpen.x], -1
        mov [currentOpen.y], -1
        mov [currentOpen.distance], 0

        call getLevelWidth
        mov ecx, eax
        call getLevelHeight
        imul ecx, eax

        mov eax, offset backtraceGraph
@fieldIter:
        mov [(TField ptr eax).distance], 0ffffffffh ; Set to approximately +inf
        mov [(TField ptr eax).x], 0
        mov [(TField ptr eax).y], 0
        add eax, SIZE TField
        dec ecx
        jnz @fieldIter

        ret
ENDP cleanData

DATASEG

openOutOfMemory   db "Out of openlistSize memory. Hi dev: Please increase$"
closedOutOfMemory db "Out of closedlistSize memory. Hi dev: Please increase$"

; power | discover | walking | sailing | flying
actionTable db  00001101b, \ ;EMPTY
                00001101b, \ ;RUBBLE
                00000000b, \ ;GRAVEL
                00000000b, \ ;LOOSE ROCK
                00000000b, \ ;HARD ROCK
                00000000b, \ ;MASSIVE ROCK
                00000000b, \ ;KRISTAL SOURCE
                00000000b, \ ;OREROCK
                00001011b, \ ;WATER
                00001001b, \ ;LAVA
                00001101b, \ ;SNAIL HOLE
                00001101b, \ ;EROSION
                00011101b, \ ;POWER PATH
                00011101b, \ ;BUILDING POWER PATH
                00011000b  \ ;BUILDING

UDATASEG

currentType      dd ?
currentOpen      TPriorityField ?

openlist         TPriorityField OPEN_LIST_SIZE_MAX dup(?)
openlistSize     dw ?
closedlist       TField CLOSED_LIST_SIZE_MAX       dup(?)
closedlistSize   dw ?
backtraceGraph   TField MAX_LEVEL_SIZE             dup(?)

END

---tokens---
';----------------------------------------------------------------------------;' Comment.Single
'\n'          Text

'; Does A* pathfinding for rockraiders and vehicles' Comment.Single
'\n'          Text

';'           Comment.Single
'\n'          Text

'; Copyright 2015 Ruben De Smet' Comment.Single
'\n'          Text

';'           Comment.Single
'\n'          Text

'; Redistribution and use in source and binary forms, with or without' Comment.Single
'\n'          Text

'; modification, are permitted provided that the following conditions are' Comment.Single
'\n'          Text

'; met:'      Comment.Single
'\n'          Text

'; '          Comment.Single
'\n'          Text

';     (1) Redistributions of source code must retain the above copyright' Comment.Single
'\n'          Text

';         notice, this list of conditions and the following disclaimer. ' Comment.Single
'\n'          Text

'; '          Comment.Single
'\n'          Text

';     (2) Redistributions in binary form must reproduce the above copyright' Comment.Single
'\n'          Text

';         notice, this list of conditions and the following disclaimer in' Comment.Single
'\n'          Text

';         the documentation and/or other materials provided with the' Comment.Single
'\n'          Text

';         distribution.  ' Comment.Single
'\n'          Text

';         '  Comment.Single
'\n'          Text

';     (3) The name of the author may not be used to' Comment.Single
'\n'          Text

';         endorse or promote products derived from this software without' Comment.Single
'\n'          Text

';         specific prior written permission.' Comment.Single
'\n'          Text

'; '          Comment.Single
'\n'          Text

"; THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR" Comment.Single
'\n'          Text

'; IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED' Comment.Single
'\n'          Text

'; WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE' Comment.Single
'\n'          Text

'; DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,' Comment.Single
'\n'          Text

'; INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES' Comment.Single
'\n'          Text

'; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR' Comment.Single
'\n'          Text

'; SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)' Comment.Single
'\n'          Text

'; HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,' Comment.Single
'\n'          Text

'; STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING' Comment.Single
'\n'          Text

'; IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE' Comment.Single
'\n'          Text

'; POSSIBILITY OF SUCH DAMAGE.' Comment.Single
'\n'          Text

';'           Comment.Single
'\n'          Text

';----------------------------------------------------------------------------;' Comment.Single
'\n'          Text

'\n'          Text

'IDEAL'       Keyword
'\n'          Text

'P386'        Keyword
'\n'          Text

'MODEL'       Keyword
' '           Text
'FLAT'        Name.Variable
','           Punctuation
' '           Text
'C'           Name.Variable
'\n'          Text

'ASSUME'      Keyword
' '           Text
'cs'          Name.Builtin
':'           Punctuation
'_TEXT'       Name.Variable
','           Punctuation
'ds'          Name.Builtin
':'           Punctuation
'FLAT'        Name.Variable
','           Punctuation
'es'          Name.Builtin
':'           Punctuation
'FLAT'        Name.Variable
','           Punctuation
'fs'          Name.Builtin
':'           Punctuation
'FLAT'        Name.Variable
','           Punctuation
'gs'          Name.Builtin
':'           Punctuation
'FLAT'        Name.Variable
'\n\n'        Text

'INCLUDE'     Keyword
' '           Text
'"ASTAR.INC"' Literal.String
'\n'          Text

'INCLUDE'     Keyword
' '           Text
'"READLVL.INC"' Literal.String
'\n'          Text

'INCLUDE'     Keyword
' '           Text
'"DEBUG.INC"' Literal.String
'\n\n'        Text

'STRUC'       Keyword
' '           Text
'TPriorityField' Name.Variable
'\n'          Text

'    '        Text
'heuristic'   Name.Constant
' '           Keyword.Declaration
'dd'          Keyword.Declaration
' '           Text
'?'           Name.Variable
'\n'          Text

'    '        Text
'distance'    Name.Constant
' '           Keyword.Declaration
'dd'          Keyword.Declaration
' '           Text
'?'           Name.Variable
'\n'          Text

'    '        Text
'x'           Name.Constant
' '           Keyword.Declaration
'db'          Keyword.Declaration
' '           Text
'?'           Name.Variable
'\n'          Text

'    '        Text
'y'           Name.Constant
' '           Keyword.Declaration
'db'          Keyword.Declaration
' '           Text
'?'           Name.Variable
'\n'          Text

'    '        Text
'fromx'       Name.Constant
' '           Keyword.Declaration
'db'          Keyword.Declaration
' '           Text
'?'           Name.Variable
'\n'          Text

'    '        Text
'fromy'       Name.Constant
' '           Keyword.Declaration
'db'          Keyword.Declaration
' '           Text
'?'           Name.Variable
'\n'          Text

'ENDS'        Keyword
'\n\n'        Text

'STRUC'       Keyword
' '           Text
'TField'      Name.Variable
'\n'          Text

'    '        Text
'distance'    Name.Constant
' '           Keyword.Declaration
'dd'          Keyword.Declaration
' '           Text
'?'           Name.Variable
'\n'          Text

'    '        Text
'x'           Name.Constant
' '           Keyword.Declaration
'db'          Keyword.Declaration
' '           Text
'?'           Name.Variable
'\n'          Text

'    '        Text
'y'           Name.Constant
' '           Keyword.Declaration
'db'          Keyword.Declaration
' '           Text
'?'           Name.Variable
'\n'          Text

'ENDS'        Keyword
'\n\n'        Text

'CODESEG'     Keyword
' '           Text
'\n\n'        Text

'PROC'        Keyword
' '           Text
'getPath'     Name.Variable
'\n'          Text

'        '    Text
'USES'        Keyword
' '           Text
'ecx'         Name.Builtin
'\n'          Text

'        '    Text
'ARG'         Keyword
' '           Text
'@@tgtx'      Name.Variable
':'           Punctuation
'dword'       Keyword.Type
','           Punctuation
' '           Text
'\\\n'        Text

'            ' Text
'@@tgty'      Name.Variable
':'           Punctuation
'dword'       Keyword.Type
' '           Text
'\\\n'        Text

'        '    Text
'RETURNS'     Name.Variable
' '           Text
'eax'         Name.Builtin
','           Punctuation
' '           Text
'ebx'         Name.Builtin
' '           Text
'; eax contains x, ebx contains y' Comment.Single
'\n\n'        Text

'        '    Text
'call'        Name.Function
' '           Text
'getLevelWidth' Name.Variable
'\n'          Text

'        '    Text
'imul'        Name.Function
' '           Text
'eax'         Name.Builtin
','           Punctuation
' '           Text
'['           Punctuation
'@@tgty'      Name.Variable
']'           Punctuation
'\n'          Text

'        '    Text
'add'         Name.Function
' '           Text
'eax'         Name.Builtin
','           Punctuation
' '           Text
'['           Punctuation
'@@tgtx'      Name.Variable
']'           Punctuation
'\n'          Text

'        '    Text
'imul'        Name.Function
' '           Text
'eax'         Name.Builtin
','           Punctuation
' '           Text
'SI'          Name.Builtin
'ZE'          Name.Variable
' '           Text
'TField'      Name.Variable
'\n'          Text

'        '    Text
'add'         Name.Function
' '           Text
'eax'         Name.Builtin
','           Punctuation
' '           Text
'offset'      Name.Variable
' '           Text
'backtraceGraph' Name.Variable
'        '    Text
'\n'          Text

'        '    Text
'mov'         Name.Function
' '           Text
'ecx'         Name.Builtin
','           Punctuation
' '           Text
'eax'         Name.Builtin
'\n\n'        Text

'        '    Text
'xor'         Name.Function
' '           Text
'eax'         Name.Builtin
','           Punctuation
' '           Text
'eax'         Name.Builtin
'\n'          Text

'        '    Text
'xor'         Name.Function
' '           Text
'ebx'         Name.Builtin
','           Punctuation
' '           Text
'ebx'         Name.Builtin
'\n\n'        Text

'        '    Text
'mov'         Name.Function
' '           Text
'al'          Name.Builtin
','           Punctuation
' '           Text
'[('          Punctuation
'TField'      Name.Variable
' '           Text
'ptr'         Name.Variable
' '           Text
'ecx'         Name.Builtin
')'           Punctuation
'.x'          Name.Variable
']'           Punctuation
'\n'          Text

'        '    Text
'mov'         Name.Function
' '           Text
'bl'          Name.Builtin
','           Punctuation
' '           Text
'[('          Punctuation
'TField'      Name.Variable
' '           Text
'ptr'         Name.Variable
' '           Text
'ecx'         Name.Builtin
')'           Punctuation
'.y'          Name.Variable
']'           Punctuation
'\n\n'        Text

'        '    Text
'ret'         Name.Function
'\n'          Text

'ENDP'        Keyword
' '           Text
'getPath'     Name.Variable
'\n\n'        Text

'PROC'        Keyword
' '           Text
'findPath'    Name.Variable
'\n'          Text

'        '    Text
'; eax will contain a 1 when a path has been found' Comment.Single
'\n'          Text

'        '    Text
';                    0 otherwise.' Comment.Single
'\n'          Text

'        '    Text
'ARG'         Keyword
' '           Text
'@@srcx'      Name.Variable
':'           Punctuation
'dword'       Keyword.Type
','           Punctuation
' '           Text
'\\\n'        Text

'            ' Text
'@@srcy'      Name.Variable
':'           Punctuation
'dword'       Keyword.Type
','           Punctuation
' '           Text
'\\\n'        Text

'            ' Text
'@@tgtx'      Name.Variable
':'           Punctuation
'dword'       Keyword.Type
','           Punctuation
' '           Text
'\\\n'        Text

'            ' Text
'@@tgty'      Name.Variable
':'           Punctuation
'dword'       Keyword.Type
','           Punctuation
' '           Text
'\\\n'        Text

'            ' Text
'@@type'      Name.Variable
':'           Punctuation
'dword'       Keyword.Type
' '           Text
'\\\n'        Text

'            ' Text
'RETURNS'     Name.Variable
' '           Text
'eax'         Name.Builtin
'\n\n'        Text

'        '    Text
'; Check whether the target field is "allowed" for' Comment.Single
'\n'          Text

'        '    Text
'; the selected vehicle or rock raider' Comment.Single
'\n'          Text

'        '    Text
'call'        Name.Function
' '           Text
'getField'    Name.Variable
','           Punctuation
' '           Text
'['           Punctuation
'@@tgtx'      Name.Variable
'],'          Punctuation
' '           Text
'['           Punctuation
'@@tgty'      Name.Variable
']'           Punctuation
'\n'          Text

'        '    Text
'mov'         Name.Function
' '           Text
'al'          Name.Builtin
','           Punctuation
' '           Text
'['           Punctuation
'byte'        Keyword.Type
' '           Text
'ptr'         Name.Variable
' '           Text
'eax'         Name.Builtin
']'           Punctuation
'\n'          Text

'        '    Text
'and'         Name.Function
' '           Text
'eax'         Name.Builtin
','           Punctuation
' '           Text
'0FFh'        Literal.Number.Hex
'\n\n'        Text

'        '    Text
'add'         Name.Function
' '           Text
'eax'         Name.Builtin
','           Punctuation
' '           Text
'offset'      Name.Variable
' '           Text
'actionTable' Name.Variable
'\n'          Text

'        '    Text
'mov'         Name.Function
' '           Text
'eax'         Name.Builtin
','           Punctuation
' '           Text
'['           Punctuation
'eax'         Name.Builtin
']'           Punctuation
'\n'          Text

'        '    Text
'and'         Name.Function
' '           Text
'eax'         Name.Builtin
','           Punctuation
' '           Text
'['           Punctuation
'@@type'      Name.Variable
']'           Punctuation
'               ' Text
'; TODO: for now, rock raider is hard coded' Comment.Single
'\n'          Text

'        '    Text
'jnz'         Name.Function
' '           Text
'@canGoToTarget' Name.Variable
'\n\n'        Text

'        '    Text
'mov'         Name.Function
' '           Text
'eax'         Name.Builtin
','           Punctuation
' '           Text
'0'           Literal.Number.Integer
'\n'          Text

'        '    Text
'ret'         Name.Function
'\n'          Text

'@canGoToTarget:' Name.Label
'\n'          Text

'\n'          Text

'        '    Text
'call'        Name.Function
' '           Text
'cl'          Name.Builtin
'eanData'     Name.Variable
'\n'          Text

'        '    Text
'mov'         Name.Function
' '           Text
'eax'         Name.Builtin
','           Punctuation
' '           Text
'['           Punctuation
'@@type'      Name.Variable
']'           Punctuation
'\n'          Text

'        '    Text
'mov'         Name.Function
' '           Text
'['           Punctuation
'currentType' Name.Variable
'],'          Punctuation
' '           Text
'eax'         Name.Builtin
'\n\n'        Text

'        '    Text
'mov'         Name.Function
' '           Text
'eax'         Name.Builtin
','           Punctuation
' '           Text
'['           Punctuation
'@@srcx'      Name.Variable
']'           Punctuation
'\n'          Text

'        '    Text
'mov'         Name.Function
' '           Text
'['           Punctuation
'currentOpen.x' Name.Variable
'],'          Punctuation
' '           Text
'al'          Name.Builtin
'\n'          Text

'        '    Text
'mov'         Name.Function
' '           Text
'eax'         Name.Builtin
','           Punctuation
' '           Text
'['           Punctuation
'@@srcy'      Name.Variable
']'           Punctuation
'\n'          Text

'        '    Text
'mov'         Name.Function
' '           Text
'['           Punctuation
'currentOpen.y' Name.Variable
'],'          Punctuation
' '           Text
'al'          Name.Builtin
'\n\n'        Text

'        '    Text
'call'        Name.Function
' '           Text
'di'          Name.Builtin
'stance'      Name.Variable
','           Punctuation
' '           Text
'['           Punctuation
'@@srcx'      Name.Variable
'],'          Punctuation
' '           Text
'['           Punctuation
'@@srcy'      Name.Variable
'],'          Punctuation
' '           Text
'['           Punctuation
'@@tgtx'      Name.Variable
'],'          Punctuation
' '           Text
'['           Punctuation
'@@tgty'      Name.Variable
']'           Punctuation
' '           Text
'\n'          Text

'        '    Text
'; eax <- distance' Comment.Single
'\n'          Text

'        '    Text
'call'        Name.Function
' '           Text
'addOpen'     Name.Variable
','           Punctuation
' '           Text
'['           Punctuation
'@@srcx'      Name.Variable
'],'          Punctuation
' '           Text
'['           Punctuation
'@@srcy'      Name.Variable
'],'          Punctuation
' '           Text
'eax'         Name.Builtin
','           Punctuation
' '           Text
'0'           Literal.Number.Integer
'\n\n'        Text

'@openListNotEmpty:' Name.Label
'\n'          Text

'        '    Text
'call'        Name.Function
' '           Text
'popOpen'     Name.Variable
'\n'          Text

'        '    Text
'cmp'         Name.Function
' '           Text
'eax'         Name.Builtin
','           Punctuation
' '           Text
'0'           Literal.Number.Integer
'\n'          Text

'        '    Text
'je'          Name.Function
' '           Text
'@openListEmpty' Name.Variable
'\n\n'        Text

'        '    Text
'call'        Name.Function
' '           Text
'addToMap'    Name.Variable
'\n\n'        Text

'        '    Text
'call'        Name.Function
' '           Text
'addClosed'   Name.Variable
'\n\n'        Text

'        '    Text
'mov'         Name.Function
' '           Text
'eax'         Name.Builtin
','           Punctuation
' '           Text
'['           Punctuation
'@@tgtx'      Name.Variable
']'           Punctuation
'\n'          Text

'        '    Text
'cmp'         Name.Function
' '           Text
'['           Punctuation
'currentOpen.x' Name.Variable
'],'          Punctuation
' '           Text
'al'          Name.Builtin
'\n'          Text

'        '    Text
'jne'         Name.Function
' '           Text
'@nextOpen'   Name.Variable
'\n'          Text

'        '    Text
'mov'         Name.Function
' '           Text
'eax'         Name.Builtin
','           Punctuation
' '           Text
'['           Punctuation
'@@tgty'      Name.Variable
']'           Punctuation
'\n'          Text

'        '    Text
'cmp'         Name.Function
' '           Text
'['           Punctuation
'currentOpen.y' Name.Variable
'],'          Punctuation
' '           Text
'al'          Name.Builtin
'\n'          Text

'        '    Text
'jne'         Name.Function
' '           Text
'@nextOpen'   Name.Variable
'\n\n'        Text

'        '    Text
'jmp'         Name.Function
' '           Text
'@routeFound' Name.Variable
'\n\n'        Text

'        '    Text
'@nextOpen:'  Name.Label
'\n'          Text

'        '    Text
'call'        Name.Function
' '           Text
'addNeighbours' Name.Variable
','           Punctuation
' '           Text
'['           Punctuation
'@@tgtx'      Name.Variable
'],'          Punctuation
' '           Text
'['           Punctuation
'@@tgty'      Name.Variable
']'           Punctuation
'\n\n'        Text

'        '    Text
'jmp'         Name.Function
' '           Text
'@openListNotEmpty' Name.Variable
'\n\n'        Text

'@openListEmpty:' Name.Label
'\n'          Text

'        '    Text
'mov'         Name.Function
' '           Text
'eax'         Name.Builtin
','           Punctuation
' '           Text
'0'           Literal.Number.Integer
'\n'          Text

'        '    Text
'ret'         Name.Function
'\n\n'        Text

'@routeFound:' Name.Label
'\n'          Text

'        '    Text
'mov'         Name.Function
' '           Text
'eax'         Name.Builtin
','           Punctuation
' '           Text
'1'           Literal.Number.Integer
'\n'          Text

'        '    Text
'ret'         Name.Function
'\n'          Text

'ENDP'        Keyword
' '           Text
'findPath'    Name.Variable
'\n\n'        Text

'PROC'        Keyword
' '           Text
'addToMap'    Name.Variable
'\n'          Text

'        '    Text
'USES'        Keyword
' '           Text
'eax'         Name.Builtin
','           Punctuation
' '           Text
'ecx'         Name.Builtin
'\n\n'        Text

'        '    Text
'call'        Name.Function
' '           Text
'getLevelWidth' Name.Variable
'\n'          Text

'        '    Text
'xor'         Name.Function
' '           Text
'ecx'         Name.Builtin
','           Punctuation
' '           Text
'ecx'         Name.Builtin
'\n'          Text

'        '    Text
'mov'         Name.Function
' '           Text
'cl'          Name.Builtin
','           Punctuation
' '           Text
'['           Punctuation
'currentOpen.y' Name.Variable
']'           Punctuation
'\n'          Text

'        '    Text
'imul'        Name.Function
' '           Text
'eax'         Name.Builtin
','           Punctuation
' '           Text
'ecx'         Name.Builtin
'\n'          Text

'        '    Text
'mov'         Name.Function
' '           Text
'cl'          Name.Builtin
','           Punctuation
' '           Text
'['           Punctuation
'currentOpen.x' Name.Variable
']'           Punctuation
'\n'          Text

'        '    Text
'add'         Name.Function
' '           Text
'eax'         Name.Builtin
','           Punctuation
' '           Text
'ecx'         Name.Builtin
'\n'          Text

'        '    Text
'imul'        Name.Function
' '           Text
'eax'         Name.Builtin
','           Punctuation
' '           Text
'SI'          Name.Builtin
'ZE'          Name.Variable
' '           Text
'TField'      Name.Variable
'\n'          Text

'        '    Text
'add'         Name.Function
' '           Text
'eax'         Name.Builtin
','           Punctuation
' '           Text
'offset'      Name.Variable
' '           Text
'backtraceGraph' Name.Variable
'\n\n'        Text

'        '    Text
'mov'         Name.Function
' '           Text
'ecx'         Name.Builtin
','           Punctuation
' '           Text
'['           Punctuation
'currentOpen.distance' Name.Variable
']'           Punctuation
'\n'          Text

'        '    Text
'cmp'         Name.Function
' '           Text
'[('          Punctuation
'TField'      Name.Variable
' '           Text
'ptr'         Name.Variable
' '           Text
'eax'         Name.Builtin
')'           Punctuation
'.distance'   Name.Variable
'],'          Punctuation
' '           Text
'ecx'         Name.Builtin
'\n'          Text

'        '    Text
'jbe'         Name.Function
' '           Text
'@dontAdd'    Name.Variable
'\n\n'        Text

'        '    Text
'mov'         Name.Function
' '           Text
'[('          Punctuation
'TField'      Name.Variable
' '           Text
'ptr'         Name.Variable
' '           Text
'eax'         Name.Builtin
')'           Punctuation
'.distance'   Name.Variable
'],'          Punctuation
' '           Text
'ecx'         Name.Builtin
'\n'          Text

'        '    Text
'mov'         Name.Function
' '           Text
'cl'          Name.Builtin
','           Punctuation
' '           Text
'['           Punctuation
'currentOpen.fromx' Name.Variable
']'           Punctuation
'\n'          Text

'        '    Text
'mov'         Name.Function
' '           Text
'[('          Punctuation
'TField'      Name.Variable
' '           Text
'ptr'         Name.Variable
' '           Text
'eax'         Name.Builtin
')'           Punctuation
'.x'          Name.Variable
'],'          Punctuation
' '           Text
'cl'          Name.Builtin
'\n'          Text

'        '    Text
'mov'         Name.Function
' '           Text
'cl'          Name.Builtin
','           Punctuation
' '           Text
'['           Punctuation
'currentOpen.fromy' Name.Variable
']'           Punctuation
'\n'          Text

'        '    Text
'mov'         Name.Function
' '           Text
'[('          Punctuation
'TField'      Name.Variable
' '           Text
'ptr'         Name.Variable
' '           Text
'eax'         Name.Builtin
')'           Punctuation
'.y'          Name.Variable
'],'          Punctuation
' '           Text
'cl'          Name.Builtin
'\n\n'        Text

'@dontAdd:'   Name.Label
'\n'          Text

'        '    Text
'ret'         Name.Function
'\n'          Text

'ENDP'        Keyword
' '           Text
'addToMap'    Name.Variable
'\n\n'        Text

'; Is closed checks whether the field considered is "closed" for being added to the open list.' Comment.Single
'\n'          Text

'; So, it also checks whether we can go on the selected field.' Comment.Single
'\n'          Text

'PROC'        Keyword
' '           Text
'isClosed'    Name.Variable
'\n'          Text

'        '    Text
'USES'        Keyword
' '           Text
'ebx'         Name.Builtin
','           Punctuation
' '           Text
'ecx'         Name.Builtin
','           Punctuation
' '           Text
'edx'         Name.Builtin
'\n'          Text

'        '    Text
'ARG'         Keyword
' '           Text
'@@x'         Name.Variable
':'           Punctuation
'dword'       Keyword.Type
','           Punctuation
' '           Text
'\\\n'        Text

'            ' Text
'@@y'         Name.Variable
':'           Punctuation
'dword'       Keyword.Type
' '           Text
'RETURNS'     Name.Variable
' '           Text
'eax'         Name.Builtin
'\n\n'        Text

'        '    Text
'; Check bounds first:' Comment.Single
'\n'          Text

'\n'          Text

'        '    Text
'call'        Name.Function
' '           Text
'getLevelWidth' Name.Variable
'\n'          Text

'        '    Text
'cmp'         Name.Function
' '           Text
'['           Punctuation
'@@x'         Name.Variable
'],'          Punctuation
' '           Text
'eax'         Name.Builtin
'\n'          Text

'        '    Text
'ja'          Name.Function
' '           Text
'notWithinBounds' Name.Variable
' '           Text
'; ja considers -1 > 10' Comment.Single
'\n\n'        Text

'        '    Text
'call'        Name.Function
' '           Text
'getLevelHeight' Name.Variable
'\n'          Text

'        '    Text
'cmp'         Name.Function
' '           Text
'['           Punctuation
'@@y'         Name.Variable
'],'          Punctuation
' '           Text
'eax'         Name.Builtin
'\n'          Text

'        '    Text
'ja'          Name.Function
' '           Text
'notWithinBounds' Name.Variable
'\n\n'        Text

'        '    Text
'; Check whether this field is "allowed" for' Comment.Single
'\n'          Text

'        '    Text
'; the selected vehicle or rock raider' Comment.Single
'\n'          Text

'        '    Text
'call'        Name.Function
' '           Text
'getField'    Name.Variable
','           Punctuation
' '           Text
'['           Punctuation
'@@x'         Name.Variable
'],'          Punctuation
' '           Text
'['           Punctuation
'@@y'         Name.Variable
']'           Punctuation
'\n'          Text

'        '    Text
'mov'         Name.Function
' '           Text
'al'          Name.Builtin
','           Punctuation
' '           Text
'['           Punctuation
'byte'        Keyword.Type
' '           Text
'ptr'         Name.Variable
' '           Text
'eax'         Name.Builtin
']'           Punctuation
'\n'          Text

'        '    Text
'and'         Name.Function
' '           Text
'eax'         Name.Builtin
','           Punctuation
' '           Text
'0FFh'        Literal.Number.Hex
'\n\n'        Text

'        '    Text
'add'         Name.Function
' '           Text
'eax'         Name.Builtin
','           Punctuation
' '           Text
'offset'      Name.Variable
' '           Text
'actionTable' Name.Variable
'\n'          Text

'        '    Text
'mov'         Name.Function
' '           Text
'eax'         Name.Builtin
','           Punctuation
' '           Text
'['           Punctuation
'eax'         Name.Builtin
']'           Punctuation
'\n'          Text

'        '    Text
'and'         Name.Function
' '           Text
'eax'         Name.Builtin
','           Punctuation
' '           Text
'['           Punctuation
'currentType' Name.Variable
']'           Punctuation
'               ' Text
'; TODO: for now, rock raider is hard coded' Comment.Single
'\n'          Text

'        '    Text
'jnz'         Name.Function
' '           Text
'@canGoHere'  Name.Variable
'\n\n\n'      Text

'        '    Text
'inc'         Name.Function
' '           Text
'eax'         Name.Builtin
' '           Text
'; mov eax, 1' Comment.Single
'\n'          Text

'        '    Text
'ret'         Name.Function
'\n\n'        Text

'@canGoHere:' Name.Label
'\n'          Text

'        '    Text
'\n'          Text

'        '    Text
'; Getting here means the field is okay to walk/fly/whatever on' Comment.Single
'\n'          Text

'\n'          Text

'        '    Text
'xor'         Name.Function
' '           Text
'ecx'         Name.Builtin
','           Punctuation
' '           Text
'ecx'         Name.Builtin
'\n'          Text

'        '    Text
'mov'         Name.Function
' '           Text
'cx'          Name.Builtin
','           Punctuation
' '           Text
'['           Punctuation
'cl'          Name.Builtin
'osedlistSize' Name.Variable
']'           Punctuation
'\n'          Text

'        '    Text
'cmp'         Name.Function
' '           Text
'cx'          Name.Builtin
','           Punctuation
' '           Text
'0'           Literal.Number.Integer
' '           Text
'; If empty, return 0' Comment.Single
'\n'          Text

'        '    Text
'jne'         Name.Function
' '           Text
'@closedNotEmpty' Name.Variable
'\n\n'        Text

'        '    Text
'mov'         Name.Function
' '           Text
'eax'         Name.Builtin
','           Punctuation
' '           Text
'0'           Literal.Number.Integer
'\n'          Text

'        '    Text
'ret'         Name.Function
'\n\n'        Text

'@closedNotEmpty:' Name.Label
'\n'          Text

'        '    Text
'mov'         Name.Function
' '           Text
'ebx'         Name.Builtin
','           Punctuation
' '           Text
'offset'      Name.Variable
' '           Text
'cl'          Name.Builtin
'osedlist'    Name.Variable
'\n\n'        Text

'@loopClosed:' Name.Label
'\n'          Text

'        '    Text
'mov'         Name.Function
' '           Text
'edx'         Name.Builtin
','           Punctuation
' '           Text
'['           Punctuation
'@@x'         Name.Variable
']'           Punctuation
'\n'          Text

'        '    Text
'cmp'         Name.Function
' '           Text
'[('          Punctuation
'TField'      Name.Variable
' '           Text
'ptr'         Name.Variable
' '           Text
'ebx'         Name.Builtin
')'           Punctuation
'.x'          Name.Variable
'],'          Punctuation
' '           Text
'dl'          Name.Builtin
'\n'          Text

'        '    Text
'jne'         Name.Function
' '           Text
'@nextClosed' Name.Variable
'\n'          Text

'        '    Text
'mov'         Name.Function
' '           Text
'edx'         Name.Builtin
','           Punctuation
' '           Text
'['           Punctuation
'@@y'         Name.Variable
']'           Punctuation
'\n'          Text

'        '    Text
'cmp'         Name.Function
' '           Text
'[('          Punctuation
'TField'      Name.Variable
' '           Text
'ptr'         Name.Variable
' '           Text
'ebx'         Name.Builtin
')'           Punctuation
'.y'          Name.Variable
'],'          Punctuation
' '           Text
'dl'          Name.Builtin
'\n'          Text

'        '    Text
'jne'         Name.Function
' '           Text
'@nextClosed' Name.Variable
'\n\n'        Text

'        '    Text
'; If reached here, yep, contained in closed list' Comment.Single
'\n'          Text

'        '    Text
'mov'         Name.Function
' '           Text
'eax'         Name.Builtin
','           Punctuation
' '           Text
'1'           Literal.Number.Integer
'\n'          Text

'        '    Text
'ret'         Name.Function
'\n\n'        Text

'    '        Text
'@nextClosed:' Name.Label
'\n'          Text

'        '    Text
'add'         Name.Function
' '           Text
'ebx'         Name.Builtin
','           Punctuation
' '           Text
'SI'          Name.Builtin
'ZE'          Name.Variable
' '           Text
'TField'      Name.Variable
'\n'          Text

'        '    Text
'dec'         Name.Function
' '           Text
'ecx'         Name.Builtin
'\n'          Text

'        '    Text
'jnz'         Name.Function
' '           Text
'@loopClosed' Name.Variable
'\n\n'        Text

'        '    Text
'mov'         Name.Function
' '           Text
'eax'         Name.Builtin
','           Punctuation
' '           Text
'0'           Literal.Number.Integer
'\n'          Text

'        '    Text
'ret'         Name.Function
'\n\n'        Text

'notWithinBounds:' Name.Label
'\n'          Text

'        '    Text
'mov'         Name.Function
' '           Text
'eax'         Name.Builtin
','           Punctuation
' '           Text
'1'           Literal.Number.Integer
'\n'          Text

'        '    Text
'ret'         Name.Function
'\n'          Text

'ENDP'        Keyword
' '           Text
'isClosed'    Name.Variable
'\n\n'        Text

'PROC'        Keyword
' '           Text
'addNeighbours' Name.Variable
'\n'          Text

'        '    Text
'USES'        Keyword
' '           Text
'eax'         Name.Builtin
','           Punctuation
' '           Text
'ebx'         Name.Builtin
','           Punctuation
' '           Text
'ecx'         Name.Builtin
','           Punctuation
' '           Text
'edx'         Name.Builtin
'\n'          Text

'        '    Text
'ARG'         Keyword
' '           Text
'@@tgtx'      Name.Variable
':'           Punctuation
'dword'       Keyword.Type
','           Punctuation
' '           Text
'\\\n'        Text

'            ' Text
'@@tgty'      Name.Variable
':'           Punctuation
'dword'       Keyword.Type
'\n'          Text

'        '    Text
'; Push all neighbours of currentOpen on openList' Comment.Single
'\n'          Text

'\n'          Text

'        '    Text
'xor'         Name.Function
' '           Text
'ebx'         Name.Builtin
','           Punctuation
' '           Text
'ebx'         Name.Builtin
'\n'          Text

'        '    Text
'xor'         Name.Function
' '           Text
'ecx'         Name.Builtin
','           Punctuation
' '           Text
'ecx'         Name.Builtin
'\n'          Text

'        '    Text
'\n'          Text

'        '    Text
'mov'         Name.Function
' '           Text
'bl'          Name.Builtin
','           Punctuation
' '           Text
'['           Punctuation
'currentOpen.x' Name.Variable
']'           Punctuation
'\n'          Text

'        '    Text
'mov'         Name.Function
' '           Text
'cl'          Name.Builtin
','           Punctuation
' '           Text
'['           Punctuation
'currentOpen.y' Name.Variable
']'           Punctuation
'\n'          Text

'        '    Text
'mov'         Name.Function
' '           Text
'edx'         Name.Builtin
','           Punctuation
' '           Text
'['           Punctuation
'currentOpen.distance' Name.Variable
']'           Punctuation
'\n'          Text

'        '    Text
'inc'         Name.Function
' '           Text
'edx'         Name.Builtin
' '           Text
'; Next distance is one more.' Comment.Single
'\n\n'        Text

'        '    Text
'; Up'        Comment.Single
'\n'          Text

'        '    Text
'dec'         Name.Function
' '           Text
'ecx'         Name.Builtin
'\n'          Text

'        '    Text
'call'        Name.Function
' '           Text
'isClosed'    Name.Variable
','           Punctuation
' '           Text
'ebx'         Name.Builtin
','           Punctuation
' '           Text
'ecx'         Name.Builtin
'\n'          Text

'        '    Text
'cmp'         Name.Function
' '           Text
'eax'         Name.Builtin
','           Punctuation
' '           Text
'0'           Literal.Number.Integer
'\n'          Text

'        '    Text
'jne'         Name.Function
' '           Text
'@noUp'       Name.Variable
'\n'          Text

'        '    Text
'call'        Name.Function
' '           Text
'di'          Name.Builtin
'stance'      Name.Variable
','           Punctuation
' '           Text
'ebx'         Name.Builtin
','           Punctuation
' '           Text
'ecx'         Name.Builtin
','           Punctuation
' '           Text
'['           Punctuation
'@@tgtx'      Name.Variable
'],'          Punctuation
' '           Text
'['           Punctuation
'@@tgty'      Name.Variable
']'           Punctuation
'\n'          Text

'        '    Text
'add'         Name.Function
' '           Text
'eax'         Name.Builtin
','           Punctuation
' '           Text
'edx'         Name.Builtin
'\n'          Text

'        '    Text
'call'        Name.Function
' '           Text
'addOpen'     Name.Variable
','           Punctuation
' '           Text
'ebx'         Name.Builtin
','           Punctuation
' '           Text
'ecx'         Name.Builtin
','           Punctuation
' '           Text
'eax'         Name.Builtin
','           Punctuation
' '           Text
'edx'         Name.Builtin
'\n'          Text

'        '    Text
'@noUp:'      Name.Label
'\n'          Text

'        '    Text
'inc'         Name.Function
' '           Text
'ecx'         Name.Builtin
'\n\n'        Text

'        '    Text
'; Right'     Comment.Single
'\n'          Text

'        '    Text
'inc'         Name.Function
' '           Text
'ebx'         Name.Builtin
'\n'          Text

'        '    Text
'call'        Name.Function
' '           Text
'isClosed'    Name.Variable
','           Punctuation
' '           Text
'ebx'         Name.Builtin
','           Punctuation
' '           Text
'ecx'         Name.Builtin
'\n'          Text

'        '    Text
'cmp'         Name.Function
' '           Text
'eax'         Name.Builtin
','           Punctuation
' '           Text
'0'           Literal.Number.Integer
'\n'          Text

'        '    Text
'jne'         Name.Function
' '           Text
'@noRight'    Name.Variable
'\n'          Text

'        '    Text
'call'        Name.Function
' '           Text
'di'          Name.Builtin
'stance'      Name.Variable
','           Punctuation
' '           Text
'ebx'         Name.Builtin
','           Punctuation
' '           Text
'ecx'         Name.Builtin
','           Punctuation
' '           Text
'['           Punctuation
'@@tgtx'      Name.Variable
'],'          Punctuation
' '           Text
'['           Punctuation
'@@tgty'      Name.Variable
']'           Punctuation
'\n'          Text

'        '    Text
'add'         Name.Function
' '           Text
'eax'         Name.Builtin
','           Punctuation
' '           Text
'edx'         Name.Builtin
'\n'          Text

'        '    Text
'call'        Name.Function
' '           Text
'addOpen'     Name.Variable
','           Punctuation
' '           Text
'ebx'         Name.Builtin
','           Punctuation
' '           Text
'ecx'         Name.Builtin
','           Punctuation
' '           Text
'eax'         Name.Builtin
','           Punctuation
' '           Text
'edx'         Name.Builtin
'\n'          Text

'        '    Text
'@noRight:'   Name.Label
'\n'          Text

'        '    Text
'dec'         Name.Function
' '           Text
'ebx'         Name.Builtin
'\n\n'        Text

'        '    Text
'; Left'      Comment.Single
'\n'          Text

'        '    Text
'dec'         Name.Function
' '           Text
'ebx'         Name.Builtin
'\n'          Text

'        '    Text
'call'        Name.Function
' '           Text
'isClosed'    Name.Variable
','           Punctuation
' '           Text
'ebx'         Name.Builtin
','           Punctuation
' '           Text
'ecx'         Name.Builtin
'\n'          Text

'        '    Text
'cmp'         Name.Function
' '           Text
'eax'         Name.Builtin
','           Punctuation
' '           Text
'0'           Literal.Number.Integer
'\n'          Text

'        '    Text
'jne'         Name.Function
' '           Text
'@noLeft'     Name.Variable
'\n'          Text

'        '    Text
'call'        Name.Function
' '           Text
'di'          Name.Builtin
'stance'      Name.Variable
','           Punctuation
' '           Text
'ebx'         Name.Builtin
','           Punctuation
' '           Text
'ecx'         Name.Builtin
','           Punctuation
' '           Text
'['           Punctuation
'@@tgtx'      Name.Variable
'],'          Punctuation
' '           Text
'['           Punctuation
'@@tgty'      Name.Variable
']'           Punctuation
'\n'          Text

'        '    Text
'add'         Name.Function
' '           Text
'eax'         Name.Builtin
','           Punctuation
' '           Text
'edx'         Name.Builtin
'\n'          Text

'        '    Text
'call'        Name.Function
' '           Text
'addOpen'     Name.Variable
','           Punctuation
' '           Text
'ebx'         Name.Builtin
','           Punctuation
' '           Text
'ecx'         Name.Builtin
','           Punctuation
' '           Text
'eax'         Name.Builtin
','           Punctuation
' '           Text
'edx'         Name.Builtin
'\n'          Text

'        '    Text
'@noLeft:'    Name.Label
'\n'          Text

'        '    Text
'inc'         Name.Function
' '           Text
'ebx'         Name.Builtin
'\n\n'        Text

'        '    Text
'; Down'      Comment.Single
'\n'          Text

'        '    Text
'inc'         Name.Function
' '           Text
'ecx'         Name.Builtin
'\n'          Text

'        '    Text
'call'        Name.Function
' '           Text
'isClosed'    Name.Variable
','           Punctuation
' '           Text
'ebx'         Name.Builtin
','           Punctuation
' '           Text
'ecx'         Name.Builtin
'\n'          Text

'        '    Text
'cmp'         Name.Function
' '           Text
'eax'         Name.Builtin
','           Punctuation
' '           Text
'0'           Literal.Number.Integer
'\n'          Text

'        '    Text
'jne'         Name.Function
' '           Text
'@noDown'     Name.Variable
'\n'          Text

'        '    Text
'call'        Name.Function
' '           Text
'di'          Name.Builtin
'stance'      Name.Variable
','           Punctuation
' '           Text
'ebx'         Name.Builtin
','           Punctuation
' '           Text
'ecx'         Name.Builtin
','           Punctuation
' '           Text
'['           Punctuation
'@@tgtx'      Name.Variable
'],'          Punctuation
' '           Text
'['           Punctuation
'@@tgty'      Name.Variable
']'           Punctuation
'\n'          Text

'        '    Text
'add'         Name.Function
' '           Text
'eax'         Name.Builtin
','           Punctuation
' '           Text
'edx'         Name.Builtin
'\n'          Text

'        '    Text
'call'        Name.Function
' '           Text
'addOpen'     Name.Variable
','           Punctuation
' '           Text
'ebx'         Name.Builtin
','           Punctuation
' '           Text
'ecx'         Name.Builtin
','           Punctuation
' '           Text
'eax'         Name.Builtin
','           Punctuation
' '           Text
'edx'         Name.Builtin
'\n'          Text

'        '    Text
'@noDown:'    Name.Label
'\n'          Text

'        '    Text
'dec'         Name.Function
' '           Text
'ecx'         Name.Builtin
'\n\n'        Text

'        '    Text
'ret'         Name.Function
'\n'          Text

'ENDP'        Keyword
' '           Text
'addNeighbours' Name.Variable
'\n\n'        Text

'PROC'        Keyword
' '           Text
'popOpen'     Name.Variable
'\n'          Text

'        '    Text
'ARG'         Keyword
' '           Text
'RETURNS'     Name.Variable
' '           Text
'eax'         Name.Builtin
'\n'          Text

'        '    Text
'USES'        Keyword
' '           Text
'ebx'         Name.Builtin
','           Punctuation
' '           Text
'ecx'         Name.Builtin
','           Punctuation
' '           Text
'edx'         Name.Builtin
','           Punctuation
' '           Text
'esi'         Name.Builtin
','           Punctuation
' '           Text
'edi'         Name.Builtin
'\n'          Text

'        '    Text
'; eax contains the smallest current heuristic' Comment.Single
'\n'          Text

'        '    Text
'; ebx contains the index of that field' Comment.Single
'\n'          Text

'\n'          Text

'        '    Text
'cmp'         Name.Function
' '           Text
'['           Punctuation
'openlistSize' Name.Variable
'],'          Punctuation
' '           Text
'0'           Literal.Number.Integer
'           ' Text
'; If empty, return 0' Comment.Single
'\n'          Text

'        '    Text
'jne'         Name.Function
' '           Text
'@goForth'    Name.Variable
'\n\n'        Text

'        '    Text
'mov'         Name.Function
' '           Text
'eax'         Name.Builtin
','           Punctuation
' '           Text
'0'           Literal.Number.Integer
'\n'          Text

'        '    Text
'ret'         Name.Function
'\n\n'        Text

'@goForth:'   Name.Label
'\n'          Text

'\n'          Text

'        '    Text
'mov'         Name.Function
' '           Text
'eax'         Name.Builtin
','           Punctuation
' '           Text
'0FFFFFFFFh'  Literal.Number.Hex
'             ' Text
'; Longest distance possible in 32 bits.' Comment.Single
'\n'          Text

'        '    Text
'xor'         Name.Function
' '           Text
'ebx'         Name.Builtin
','           Punctuation
' '           Text
'ebx'         Name.Builtin
'\n'          Text

'        '    Text
'xor'         Name.Function
' '           Text
'ecx'         Name.Builtin
','           Punctuation
' '           Text
'ecx'         Name.Builtin
'                    ' Text
'; ecx contains the current index' Comment.Single
'\n\n'        Text

'@searchFurther:' Name.Label
'\n'          Text

'        '    Text
'mov'         Name.Function
' '           Text
'edx'         Name.Builtin
','           Punctuation
' '           Text
'ecx'         Name.Builtin
'\n'          Text

'        '    Text
'imul'        Name.Function
' '           Text
'edx'         Name.Builtin
','           Punctuation
' '           Text
'SI'          Name.Builtin
'ZE'          Name.Variable
' '           Text
'TPriorityField' Name.Variable
'\n'          Text

'        '    Text
'cmp'         Name.Function
' '           Text
'[('          Punctuation
'TPriorityField' Name.Variable
' '           Text
'ptr'         Name.Variable
' '           Text
'('           Punctuation
'openlist'    Name.Variable
' '           Text
'+'           Operator
' '           Text
'edx'         Name.Builtin
'))'          Punctuation
'.heuristic'  Name.Variable
'],'          Punctuation
' '           Text
'eax'         Name.Builtin
'\n'          Text

'        '    Text
'ja'          Name.Function
' '           Text
'@notBetter'  Name.Variable
'\n'          Text

'        '    Text
'; Better guess found, put right values in eax and ebx' Comment.Single
'\n'          Text

'        '    Text
'mov'         Name.Function
' '           Text
'eax'         Name.Builtin
','           Punctuation
' '           Text
'[('          Punctuation
'TPriorityField' Name.Variable
' '           Text
'ptr'         Name.Variable
' '           Text
'('           Punctuation
'openlist'    Name.Variable
' '           Text
'+'           Operator
' '           Text
'edx'         Name.Builtin
'))'          Punctuation
'.heuristic'  Name.Variable
']'           Punctuation
'\n'          Text

'        '    Text
'mov'         Name.Function
' '           Text
'ebx'         Name.Builtin
','           Punctuation
' '           Text
'ecx'         Name.Builtin
'\n\n'        Text

'@notBetter:' Name.Label
'\n'          Text

'\n'          Text

'        '    Text
'inc'         Name.Function
' '           Text
'ecx'         Name.Builtin
'\n'          Text

'        '    Text
'cmp'         Name.Function
' '           Text
'cx'          Name.Builtin
','           Punctuation
' '           Text
'['           Punctuation
'openlistSize' Name.Variable
']'           Punctuation
'\n'          Text

'        '    Text
'jne'         Name.Function
' '           Text
'@searchFurther' Name.Variable
'\n\n'        Text

'        '    Text
'; By now, we have found the right item to pop from the priorityqueue.' Comment.Single
'\n'          Text

'\n'          Text

'        '    Text
'; Move the correct item in currentOpen' Comment.Single
'\n'          Text

'        '    Text
'mov'         Name.Function
' '           Text
'ecx'         Name.Builtin
','           Punctuation
' '           Text
'SI'          Name.Builtin
'ZE'          Name.Variable
' '           Text
'TPriorityField' Name.Variable
'\n'          Text

'        '    Text
'mov'         Name.Function
' '           Text
'esi'         Name.Builtin
','           Punctuation
' '           Text
'ebx'         Name.Builtin
'\n'          Text

'        '    Text
'imul'        Name.Function
' '           Text
'esi'         Name.Builtin
','           Punctuation
' '           Text
'ecx'         Name.Builtin
'\n'          Text

'        '    Text
'add'         Name.Function
' '           Text
'esi'         Name.Builtin
','           Punctuation
' '           Text
'offset'      Name.Variable
' '           Text
'openlist'    Name.Variable
'\n\n'        Text

'        '    Text
'mov'         Name.Function
' '           Text
'edi'         Name.Builtin
','           Punctuation
' '           Text
'offset'      Name.Variable
' '           Text
'currentOpen' Name.Variable
'\n'          Text

'        '    Text
'rep'         Name.Function
' '           Text
'movsb'       Name.Variable
'\n\n'        Text

'        '    Text
'; Now make the remove the thing from the vector' Comment.Single
'\n'          Text

'\n'          Text

'        '    Text
'xor'         Name.Function
' '           Text
'ecx'         Name.Builtin
','           Punctuation
' '           Text
'ecx'         Name.Builtin
'\n'          Text

'        '    Text
'mov'         Name.Function
' '           Text
'cx'          Name.Builtin
','           Punctuation
' '           Text
'['           Punctuation
'openlistSize' Name.Variable
']'           Punctuation
'\n'          Text

'        '    Text
'sub'         Name.Function
' '           Text
'ecx'         Name.Builtin
','           Punctuation
' '           Text
'ebx'         Name.Builtin
'\n'          Text

'        '    Text
'dec'         Name.Function
' '           Text
'ecx'         Name.Builtin
'\n'          Text

'        '    Text
'imul'        Name.Function
' '           Text
'ecx'         Name.Builtin
','           Punctuation
' '           Text
'SI'          Name.Builtin
'ZE'          Name.Variable
' '           Text
'TPriorityField' Name.Variable
'\n'          Text

'        '    Text
'mov'         Name.Function
' '           Text
'edi'         Name.Builtin
','           Punctuation
' '           Text
'esi'         Name.Builtin
'\n'          Text

'        '    Text
'sub'         Name.Function
' '           Text
'edi'         Name.Builtin
','           Punctuation
' '           Text
'SI'          Name.Builtin
'ZE'          Name.Variable
' '           Text
'TPriorityField' Name.Variable
'\n'          Text

'        '    Text
'rep'         Name.Function
' '           Text
'movsb'       Name.Variable
'\n\n'        Text

'        '    Text
'dec'         Name.Function
' '           Text
'['           Punctuation
'openlistSize' Name.Variable
']'           Punctuation
'\n'          Text

'        '    Text
'mov'         Name.Function
' '           Text
'eax'         Name.Builtin
','           Punctuation
' '           Text
'1'           Literal.Number.Integer
'\n'          Text

'        '    Text
'ret'         Name.Function
'\n'          Text

'ENDP'        Keyword
' '           Text
'popOpen'     Name.Variable
'\n\n'        Text

'PROC'        Keyword
' '           Text
'addClosed'   Name.Variable
'\n'          Text

'        '    Text
'USES'        Keyword
' '           Text
'eax'         Name.Builtin
','           Punctuation
' '           Text
'ebx'         Name.Builtin
'\n\n'        Text

'        '    Text
'xor'         Name.Function
' '           Text
'ebx'         Name.Builtin
','           Punctuation
' '           Text
'ebx'         Name.Builtin
'\n'          Text

'        '    Text
'xor'         Name.Function
' '           Text
'eax'         Name.Builtin
','           Punctuation
' '           Text
'eax'         Name.Builtin
'\n\n'        Text

'        '    Text
'mov'         Name.Function
' '           Text
'bx'          Name.Builtin
','           Punctuation
' '           Text
'['           Punctuation
'cl'          Name.Builtin
'osedlistSize' Name.Variable
']'           Punctuation
'\n'          Text

'        '    Text
'imul'        Name.Function
' '           Text
'ebx'         Name.Builtin
','           Punctuation
' '           Text
'SI'          Name.Builtin
'ZE'          Name.Variable
' '           Text
'TField'      Name.Variable
'        '    Text
'\n'          Text

'        '    Text
'add'         Name.Function
' '           Text
'ebx'         Name.Builtin
','           Punctuation
' '           Text
'offset'      Name.Variable
' '           Text
'cl'          Name.Builtin
'osedlist'    Name.Variable
' '           Text
'; ebx contains the target TField' Comment.Single
'\n\n'        Text

'        '    Text
'mov'         Name.Function
' '           Text
'al'          Name.Builtin
','           Punctuation
' '           Text
'['           Punctuation
'currentOpen.x' Name.Variable
']'           Punctuation
'\n'          Text

'        '    Text
'mov'         Name.Function
' '           Text
'[('          Punctuation
'TField'      Name.Variable
' '           Text
'ptr'         Name.Variable
' '           Text
'ebx'         Name.Builtin
')'           Punctuation
'.x'          Name.Variable
'],'          Punctuation
' '           Text
'al'          Name.Builtin
'\n'          Text

'        '    Text
'mov'         Name.Function
' '           Text
'al'          Name.Builtin
','           Punctuation
' '           Text
'['           Punctuation
'currentOpen.y' Name.Variable
']'           Punctuation
'\n'          Text

'        '    Text
'mov'         Name.Function
' '           Text
'[('          Punctuation
'TField'      Name.Variable
' '           Text
'ptr'         Name.Variable
' '           Text
'ebx'         Name.Builtin
')'           Punctuation
'.y'          Name.Variable
'],'          Punctuation
' '           Text
'al'          Name.Builtin
'\n'          Text

'        '    Text
'mov'         Name.Function
' '           Text
'eax'         Name.Builtin
','           Punctuation
' '           Text
'['           Punctuation
'currentOpen.distance' Name.Variable
']'           Punctuation
'\n'          Text

'        '    Text
'mov'         Name.Function
' '           Text
'[('          Punctuation
'TField'      Name.Variable
' '           Text
'ptr'         Name.Variable
' '           Text
'ebx'         Name.Builtin
')'           Punctuation
'.distance'   Name.Variable
'],'          Punctuation
' '           Text
'eax'         Name.Builtin
'\n\n'        Text

'        '    Text
'inc'         Name.Function
' '           Text
'['           Punctuation
'cl'          Name.Builtin
'osedlistSize' Name.Variable
']'           Punctuation
'\n'          Text

'        '    Text
'cmp'         Name.Function
' '           Text
'['           Punctuation
'cl'          Name.Builtin
'osedlistSize' Name.Variable
'],'          Punctuation
' '           Text
'CL'          Name.Builtin
'OSED_LIST_SIZE_MAX' Name.Variable
'\n'          Text

'        '    Text
'jne'         Name.Function
' '           Text
'@noProblemWithClosedVector' Name.Variable
'\n\n'        Text

'        '    Text
'xor'         Name.Function
' '           Text
'eax'         Name.Builtin
','           Punctuation
' '           Text
'eax'         Name.Builtin
'\n'          Text

'        '    Text
'mov'         Name.Function
' '           Text
'ax'          Name.Builtin
','           Punctuation
' '           Text
'['           Punctuation
'cl'          Name.Builtin
'osedlistSize' Name.Variable
']'           Punctuation
'\n'          Text

'        '    Text
'call'        Name.Function
' '           Text
'crash'       Name.Variable
','           Punctuation
' '           Text
'offset'      Name.Variable
' '           Text
'cl'          Name.Builtin
'osedOutOfMemory' Name.Variable
','           Punctuation
' '           Text
'eax'         Name.Builtin
'\n\n'        Text

'@noProblemWithClosedVector:' Name.Label
'\n'          Text

'        '    Text
'ret'         Name.Function
'\n'          Text

'ENDP'        Keyword
' '           Text
'addClosed'   Name.Variable
'\n\n'        Text

'PROC'        Keyword
' '           Text
'addOpen'     Name.Variable
'\n'          Text

'        '    Text
'USES'        Keyword
' '           Text
'eax'         Name.Builtin
','           Punctuation
' '           Text
'ebx'         Name.Builtin
'\n'          Text

'        '    Text
'ARG'         Keyword
' '           Text
'@@x'         Name.Variable
':'           Punctuation
'dword'       Keyword.Type
','           Punctuation
' '           Text
'\\\n'        Text

'            ' Text
'@@y'         Name.Variable
':'           Punctuation
'dword'       Keyword.Type
','           Punctuation
' '           Text
'\\\n'        Text

'            ' Text
'@@priority'  Name.Variable
':'           Punctuation
'dword'       Keyword.Type
','           Punctuation
' '           Text
'\\\n'        Text

'            ' Text
'@@distance'  Name.Variable
':'           Punctuation
'dword'       Keyword.Type
'\n\n'        Text

'        '    Text
'xor'         Name.Function
' '           Text
'eax'         Name.Builtin
','           Punctuation
' '           Text
'eax'         Name.Builtin
'\n'          Text

'        '    Text
'mov'         Name.Function
' '           Text
'ax'          Name.Builtin
','           Punctuation
' '           Text
'['           Punctuation
'openlistSize' Name.Variable
']'           Punctuation
'\n'          Text

'        '    Text
'imul'        Name.Function
' '           Text
'eax'         Name.Builtin
','           Punctuation
' '           Text
'SI'          Name.Builtin
'ZE'          Name.Variable
' '           Text
'TPriorityField' Name.Variable
'\n'          Text

'        '    Text
'add'         Name.Function
' '           Text
'eax'         Name.Builtin
','           Punctuation
' '           Text
'offset'      Name.Variable
' '           Text
'openlist'    Name.Variable
'\n\n'        Text

'        '    Text
'mov'         Name.Function
' '           Text
'ebx'         Name.Builtin
','           Punctuation
' '           Text
'['           Punctuation
'@@x'         Name.Variable
']'           Punctuation
'\n'          Text

'        '    Text
'mov'         Name.Function
' '           Text
'[('          Punctuation
'TPriorityField' Name.Variable
' '           Text
'ptr'         Name.Variable
' '           Text
'eax'         Name.Builtin
')'           Punctuation
'.x'          Name.Variable
'],'          Punctuation
' '           Text
'bl'          Name.Builtin
'\n'          Text

'        '    Text
'mov'         Name.Function
' '           Text
'ebx'         Name.Builtin
','           Punctuation
' '           Text
'['           Punctuation
'@@y'         Name.Variable
']'           Punctuation
'\n'          Text

'        '    Text
'mov'         Name.Function
' '           Text
'[('          Punctuation
'TPriorityField' Name.Variable
' '           Text
'ptr'         Name.Variable
' '           Text
'eax'         Name.Builtin
')'           Punctuation
'.y'          Name.Variable
'],'          Punctuation
' '           Text
'bl'          Name.Builtin
'\n\n'        Text

'        '    Text
'mov'         Name.Function
' '           Text
'bl'          Name.Builtin
','           Punctuation
' '           Text
'['           Punctuation
'currentOpen.x' Name.Variable
']'           Punctuation
'\n'          Text

'        '    Text
'mov'         Name.Function
' '           Text
'[('          Punctuation
'TPriorityField' Name.Variable
' '           Text
'ptr'         Name.Variable
' '           Text
'eax'         Name.Builtin
')'           Punctuation
'.fromx'      Name.Variable
'],'          Punctuation
' '           Text
'bl'          Name.Builtin
'\n'          Text

'        '    Text
'mov'         Name.Function
' '           Text
'bl'          Name.Builtin
','           Punctuation
' '           Text
'['           Punctuation
'currentOpen.y' Name.Variable
']'           Punctuation
'\n'          Text

'        '    Text
'mov'         Name.Function
' '           Text
'[('          Punctuation
'TPriorityField' Name.Variable
' '           Text
'ptr'         Name.Variable
' '           Text
'eax'         Name.Builtin
')'           Punctuation
'.fromy'      Name.Variable
'],'          Punctuation
' '           Text
'bl'          Name.Builtin
'\n\n'        Text

'        '    Text
'mov'         Name.Function
' '           Text
'ebx'         Name.Builtin
','           Punctuation
' '           Text
'['           Punctuation
'@@priority'  Name.Variable
']'           Punctuation
'\n'          Text

'        '    Text
'mov'         Name.Function
' '           Text
'[('          Punctuation
'TPriorityField' Name.Variable
' '           Text
'ptr'         Name.Variable
' '           Text
'eax'         Name.Builtin
')'           Punctuation
'.heuristic'  Name.Variable
'],'          Punctuation
' '           Text
'ebx'         Name.Builtin
'\n'          Text

'        '    Text
'mov'         Name.Function
' '           Text
'ebx'         Name.Builtin
','           Punctuation
' '           Text
'['           Punctuation
'@@distance'  Name.Variable
']'           Punctuation
'\n'          Text

'        '    Text
'mov'         Name.Function
' '           Text
'[('          Punctuation
'TPriorityField' Name.Variable
' '           Text
'ptr'         Name.Variable
' '           Text
'eax'         Name.Builtin
')'           Punctuation
'.distance'   Name.Variable
'],'          Punctuation
' '           Text
'ebx'         Name.Builtin
'\n\n'        Text

'        '    Text
'inc'         Name.Function
' '           Text
'['           Punctuation
'openlistSize' Name.Variable
']'           Punctuation
'\n'          Text

'        '    Text
'cmp'         Name.Function
' '           Text
'['           Punctuation
'openlistSize' Name.Variable
'],'          Punctuation
' '           Text
'OPEN_LIST_SIZE_MAX' Name.Variable
'\n'          Text

'        '    Text
'jne'         Name.Function
' '           Text
'@noProblem'  Name.Variable
'\n\n'        Text

'        '    Text
'xor'         Name.Function
' '           Text
'eax'         Name.Builtin
','           Punctuation
' '           Text
'eax'         Name.Builtin
'\n'          Text

'        '    Text
'mov'         Name.Function
' '           Text
'ax'          Name.Builtin
','           Punctuation
' '           Text
'['           Punctuation
'openlistSize' Name.Variable
']'           Punctuation
'\n'          Text

'        '    Text
'call'        Name.Function
' '           Text
'crash'       Name.Variable
','           Punctuation
' '           Text
'offset'      Name.Variable
' '           Text
'openOutOfMemory' Name.Variable
','           Punctuation
' '           Text
'eax'         Name.Builtin
'\n\n'        Text

'@noProblem:' Name.Label
'\n'          Text

'        '    Text
'ret'         Name.Function
'\n'          Text

'ENDP'        Keyword
'\n\n'        Text

'PROC'        Keyword
' '           Text
'di'          Name.Builtin
'stance'      Name.Variable
'\n'          Text

'        '    Text
'USES'        Keyword
' '           Text
'ebx'         Name.Builtin
'\n'          Text

'        '    Text
'ARG'         Keyword
' '           Text
'@@srcx'      Name.Variable
':'           Punctuation
'dword'       Keyword.Type
','           Punctuation
' '           Text
'\\\n'        Text

'            ' Text
'@@srcy'      Name.Variable
':'           Punctuation
'dword'       Keyword.Type
','           Punctuation
' '           Text
'\\\n'        Text

'            ' Text
'@@tgtx'      Name.Variable
':'           Punctuation
'dword'       Keyword.Type
','           Punctuation
' '           Text
'\\\n'        Text

'            ' Text
'@@tgty'      Name.Variable
':'           Punctuation
'dword'       Keyword.Type
' '           Text
'\\\n'        Text

'        '    Text
'RETURNS'     Name.Variable
' '           Text
'eax'         Name.Builtin
'\n\n'        Text

'        '    Text
'mov'         Name.Function
' '           Text
'eax'         Name.Builtin
','           Punctuation
' '           Text
'['           Punctuation
'@@srcx'      Name.Variable
']'           Punctuation
'\n'          Text

'        '    Text
'sub'         Name.Function
' '           Text
'eax'         Name.Builtin
','           Punctuation
' '           Text
'['           Punctuation
'@@tgtx'      Name.Variable
']'           Punctuation
'\n\n'        Text

'        '    Text
'jns'         Name.Function
' '           Text
'@noSignChangex' Name.Variable
'\n'          Text

'        '    Text
'neg'         Name.Function
' '           Text
'eax'         Name.Builtin
'\n\n'        Text

'        '    Text
'@noSignChangex:' Name.Label
'\n'          Text

'\n'          Text

'        '    Text
'mov'         Name.Function
' '           Text
'ebx'         Name.Builtin
','           Punctuation
' '           Text
'['           Punctuation
'@@srcy'      Name.Variable
']'           Punctuation
'\n'          Text

'        '    Text
'sub'         Name.Function
' '           Text
'ebx'         Name.Builtin
','           Punctuation
' '           Text
'['           Punctuation
'@@tgty'      Name.Variable
']'           Punctuation
'\n\n'        Text

'        '    Text
'jns'         Name.Function
' '           Text
'@noSignChangey' Name.Variable
'\n'          Text

'        '    Text
'neg'         Name.Function
' '           Text
'ebx'         Name.Builtin
'\n\n'        Text

'        '    Text
'@noSignChangey:' Name.Label
'\n'          Text

'        '    Text
'add'         Name.Function
' '           Text
'eax'         Name.Builtin
','           Punctuation
' '           Text
'ebx'         Name.Builtin
'\n'          Text

'        '    Text
'ret'         Name.Function
'\n'          Text

'ENDP'        Keyword
' '           Text
'di'          Name.Builtin
'stance'      Name.Variable
'\n\n'        Text

'PROC'        Keyword
' '           Text
'cl'          Name.Builtin
'eanData'     Name.Variable
'\n'          Text

'        '    Text
'USES'        Keyword
' '           Text
'eax'         Name.Builtin
','           Punctuation
' '           Text
'ecx'         Name.Builtin
'\n'          Text

'        '    Text
'mov'         Name.Function
' '           Text
'['           Punctuation
'openlistSize' Name.Variable
'],'          Punctuation
' '           Text
'0'           Literal.Number.Integer
'\n'          Text

'        '    Text
'mov'         Name.Function
' '           Text
'['           Punctuation
'cl'          Name.Builtin
'osedlistSize' Name.Variable
'],'          Punctuation
' '           Text
'0'           Literal.Number.Integer
'\n\n'        Text

'        '    Text
'mov'         Name.Function
' '           Text
'['           Punctuation
'currentOpen.x' Name.Variable
'],'          Punctuation
' '           Text
'-'           Operator
'1'           Literal.Number.Integer
'\n'          Text

'        '    Text
'mov'         Name.Function
' '           Text
'['           Punctuation
'currentOpen.y' Name.Variable
'],'          Punctuation
' '           Text
'-'           Operator
'1'           Literal.Number.Integer
'\n'          Text

'        '    Text
'mov'         Name.Function
' '           Text
'['           Punctuation
'currentOpen.distance' Name.Variable
'],'          Punctuation
' '           Text
'0'           Literal.Number.Integer
'\n\n'        Text

'        '    Text
'call'        Name.Function
' '           Text
'getLevelWidth' Name.Variable
'\n'          Text

'        '    Text
'mov'         Name.Function
' '           Text
'ecx'         Name.Builtin
','           Punctuation
' '           Text
'eax'         Name.Builtin
'\n'          Text

'        '    Text
'call'        Name.Function
' '           Text
'getLevelHeight' Name.Variable
'\n'          Text

'        '    Text
'imul'        Name.Function
' '           Text
'ecx'         Name.Builtin
','           Punctuation
' '           Text
'eax'         Name.Builtin
'\n\n'        Text

'        '    Text
'mov'         Name.Function
' '           Text
'eax'         Name.Builtin
','           Punctuation
' '           Text
'offset'      Name.Variable
' '           Text
'backtraceGraph' Name.Variable
'\n'          Text

'@fieldIter:' Name.Label
'\n'          Text

'        '    Text
'mov'         Name.Function
' '           Text
'[('          Punctuation
'TField'      Name.Variable
' '           Text
'ptr'         Name.Variable
' '           Text
'eax'         Name.Builtin
')'           Punctuation
'.distance'   Name.Variable
'],'          Punctuation
' '           Text
'0ffffffffh'  Literal.Number.Hex
' '           Text
'; Set to approximately +inf' Comment.Single
'\n'          Text

'        '    Text
'mov'         Name.Function
' '           Text
'[('          Punctuation
'TField'      Name.Variable
' '           Text
'ptr'         Name.Variable
' '           Text
'eax'         Name.Builtin
')'           Punctuation
'.x'          Name.Variable
'],'          Punctuation
' '           Text
'0'           Literal.Number.Integer
'\n'          Text

'        '    Text
'mov'         Name.Function
' '           Text
'[('          Punctuation
'TField'      Name.Variable
' '           Text
'ptr'         Name.Variable
' '           Text
'eax'         Name.Builtin
')'           Punctuation
'.y'          Name.Variable
'],'          Punctuation
' '           Text
'0'           Literal.Number.Integer
'\n'          Text

'        '    Text
'add'         Name.Function
' '           Text
'eax'         Name.Builtin
','           Punctuation
' '           Text
'SI'          Name.Builtin
'ZE'          Name.Variable
' '           Text
'TField'      Name.Variable
'\n'          Text

'        '    Text
'dec'         Name.Function
' '           Text
'ecx'         Name.Builtin
'\n'          Text

'        '    Text
'jnz'         Name.Function
' '           Text
'@fieldIter'  Name.Variable
'\n\n'        Text

'        '    Text
'ret'         Name.Function
'\n'          Text

'ENDP'        Keyword
' '           Text
'cl'          Name.Builtin
'eanData'     Name.Variable
'\n\n'        Text

'DATASEG'     Keyword
'\n\n'        Text

'openOutOfMemory' Name.Constant
'   '         Keyword.Declaration
'db'          Keyword.Declaration
' '           Text
'"Out of openlistSize memory. Hi dev: Please increase$"' Literal.String
'\n'          Text

'closedOutOfMemory' Name.Constant
' '           Keyword.Declaration
'db'          Keyword.Declaration
' '           Text
'"Out of closedlistSize memory. Hi dev: Please increase$"' Literal.String
'\n\n'        Text

'; power | discover | walking | sailing | flying' Comment.Single
'\n'          Text

'actionTable' Name.Constant
' '           Keyword.Declaration
'db'          Keyword.Declaration
'  '          Text
'00001101b'   Literal.Number.Bin
','           Punctuation
' '           Text
'\\ '         Text
';EMPTY'      Comment.Single
'\n'          Text

'                ' Text
'00001101b'   Literal.Number.Bin
','           Punctuation
' '           Text
'\\ '         Text
';RUBBLE'     Comment.Single
'\n'          Text

'                ' Text
'00000000b'   Literal.Number.Bin
','           Punctuation
' '           Text
'\\ '         Text
';GRAVEL'     Comment.Single
'\n'          Text

'                ' Text
'00000000b'   Literal.Number.Bin
','           Punctuation
' '           Text
'\\ '         Text
';LOOSE ROCK' Comment.Single
'\n'          Text

'                ' Text
'00000000b'   Literal.Number.Bin
','           Punctuation
' '           Text
'\\ '         Text
';HARD ROCK'  Comment.Single
'\n'          Text

'                ' Text
'00000000b'   Literal.Number.Bin
','           Punctuation
' '           Text
'\\ '         Text
';MASSIVE ROCK' Comment.Single
'\n'          Text

'                ' Text
'00000000b'   Literal.Number.Bin
','           Punctuation
' '           Text
'\\ '         Text
';KRISTAL SOURCE' Comment.Single
'\n'          Text

'                ' Text
'00000000b'   Literal.Number.Bin
','           Punctuation
' '           Text
'\\ '         Text
';OREROCK'    Comment.Single
'\n'          Text

'                ' Text
'00001011b'   Literal.Number.Bin
','           Punctuation
' '           Text
'\\ '         Text
';WATER'      Comment.Single
'\n'          Text

'                ' Text
'00001001b'   Literal.Number.Bin
','           Punctuation
' '           Text
'\\ '         Text
';LAVA'       Comment.Single
'\n'          Text

'                ' Text
'00001101b'   Literal.Number.Bin
','           Punctuation
' '           Text
'\\ '         Text
';SNAIL HOLE' Comment.Single
'\n'          Text

'                ' Text
'00001101b'   Literal.Number.Bin
','           Punctuation
' '           Text
'\\ '         Text
';EROSION'    Comment.Single
'\n'          Text

'                ' Text
'00011101b'   Literal.Number.Bin
','           Punctuation
' '           Text
'\\ '         Text
';POWER PATH' Comment.Single
'\n'          Text

'                ' Text
'00011101b'   Literal.Number.Bin
','           Punctuation
' '           Text
'\\ '         Text
';BUILDING POWER PATH' Comment.Single
'\n'          Text

'                ' Text
'00011000b'   Literal.Number.Bin
'  '          Text
'\\ '         Text
';BUILDING'   Comment.Single
'\n'          Text

'\n'          Text

'UDATASEG'    Keyword
'\n\n'        Text

'currentType' Name.Constant
'      '      Keyword.Declaration
'dd'          Keyword.Declaration
' '           Text
'?'           Name.Variable
'\n'          Text

'currentOpen' Name.Constant
'      '      Keyword.Declaration
'TPriorityField' Keyword.Declaration
' '           Text
'?'           Name.Variable
'\n\n'        Text

'openlist'    Name.Constant
'         '   Keyword.Declaration
'TPriorityField' Keyword.Declaration
' '           Text
'OPEN_LIST_SIZE_MAX' Name.Variable
' '           Text
'dup'         Name.Variable
'('           Punctuation
'?'           Name.Variable
')'           Punctuation
'\n'          Text

'openlistSize' Name.Constant
'     '       Keyword.Declaration
'dw'          Keyword.Declaration
' '           Text
'?'           Name.Variable
'\n'          Text

'closedlist'  Name.Constant
'       '     Keyword.Declaration
'TField'      Keyword.Declaration
' '           Text
'CL'          Name.Builtin
'OSED_LIST_SIZE_MAX' Name.Variable
'       '     Text
'dup'         Name.Variable
'('           Punctuation
'?'           Name.Variable
')'           Punctuation
'\n'          Text

'closedlistSize' Name.Constant
'   '         Keyword.Declaration
'dw'          Keyword.Declaration
' '           Text
'?'           Name.Variable
'\n'          Text

'backtraceGraph' Name.Constant
'   '         Keyword.Declaration
'TField'      Keyword.Declaration
' '           Text
'MAX_LEVEL_SIZE' Name.Variable
'             ' Text
'dup'         Name.Variable
'('           Punctuation
'?'           Name.Variable
')'           Punctuation
'\n\n'        Text

'END'         Keyword
'\n'          Text
