summaryrefslogtreecommitdiff
path: root/tests/lexers/tasm
diff options
context:
space:
mode:
Diffstat (limited to 'tests/lexers/tasm')
-rw-r--r--tests/lexers/tasm/example.txt4007
1 files changed, 4007 insertions, 0 deletions
diff --git a/tests/lexers/tasm/example.txt b/tests/lexers/tasm/example.txt
new file mode 100644
index 00000000..0e7c9d87
--- /dev/null
+++ b/tests/lexers/tasm/example.txt
@@ -0,0 +1,4007 @@
+---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