Code:
; -- Working with 2D arrays ---
<font color="#000000"><b>Width </b><font color="#008000"><b>CON </b></font><font color="#800000"><b>8 </b></font><font color="#0000FF"><b><i>; Number of bytes in a Row
</i></b></font><b>Length </b><font color="#008000"><b>CON </b></font><font color="#800000"><b>10 </b></font><font color="#0000FF"><b><i>; Number of Rows in the array
;---------------------------------------------------------------------------
</i></b></font><b>ArraySize </b><font color="#008000"><b>CON </b></font><b>Width </b>* <b>Length </b><font color="#0000FF"><b><i>; Total size of the array
</i></b></font><b>MyArray </b><font color="#008000"><b>VAR BYTE</b></font>[<b>ArraySize</b>] <font color="#0000FF"><b><i>; The Array
</i></b></font><b>Idx </b><font color="#008000"><b>VAR BYTE </b></font><font color="#0000FF"><b><i>; Index, points to 1D array locations
</i></b></font><b>Xidx </b><font color="#008000"><b>VAR BYTE </b></font><font color="#0000FF"><b><i>; 2D column Index
</i></b></font><b>Yidx </b><font color="#008000"><b>VAR BYTE </b></font><font color="#0000FF"><b><i>; 2D row Index
</i></b></font><b>ArrayData </b><font color="#008000"><b>VAR BYTE </b></font><font color="#0000FF"><b><i>; holding register for array data
;----[Get a value from the 2D array]----------------------------------------
</i></b></font><b>Get2D</b>:
<b>Idx</b>=(<b>Yidx</b>*<b>Width</b>+<b>Xidx</b>) <font color="#008000"><b>MIN </b></font>(<b>ArraySize</b>-<font color="#800000"><b>1</b></font>) <font color="#0000FF"><b><i>; find Index, limit to ArraySize
</i></b></font><b>ArrayData </b>= <b>MyArray</b>(<b>Idx</b>) <font color="#0000FF"><b><i>; retrieve value from the array
</i></b></font><font color="#008000"><b>RETURN
</b></font><font color="#0000FF"><b><i>;----[Put a value in the 2D array]------------------------------------------
</i></b></font><b>Put2D</b>:
<b>Idx</b>=(<b>Yidx</b>*<b>Width</b>+<b>Xidx</b>) <font color="#008000"><b>MIN </b></font>(<b>ArraySize</b>-<font color="#800000"><b>1</b></font>) <font color="#0000FF"><b><i>; find Index, limit to ArraySize
</i></b></font><b>MyArray</b>(<b>Idx</b>) = <b>ArrayData </b><font color="#0000FF"><b><i>; store the value in the array
</i></b></font><font color="#008000"><b>RETURN
</b></font><font color="#0000FF"><b><i>;----[Set entire array to 0's]----------------------------------------------
</i></b></font><b>Clear2D</b>:
<font color="#008000"><b>FOR </b></font><b>Idx </b>= <font color="#800000"><b>0 </b></font><font color="#008000"><b>TO </b></font><b>ArraySize</b>-<font color="#800000"><b>1
</b></font><b>MyArray</b>(<b>Idx</b>) = <font color="#800000"><b>0
</b></font><font color="#008000"><b>NEXT </b></font><b>Idx
</b><font color="#008000"><b>RETURN
</b></font><font color="#0000FF"><b><i>;----[Turn the Subroutines into Functions]----------------------------------
</i></b></font><font color="#008000"><b>ASM
</b></font><font color="#000080">#Get2D macro X, Y
MOVE?BB X, _Xidx </font><font color="#0000FF"><b><i>; copy users X value to Xidx
</i></b></font><font color="#000080">MOVE?BB Y, _Yidx </font><font color="#0000FF"><b><i>; copy users Y value to Yidx
</i></b></font><font color="#000080">L?CALL _Get2D </font><font color="#0000FF"><b><i>; call the Get subroutine
</i></b></font><font color="#000080">endm </font><font color="#0000FF"><b><i>; value is returned in ArrayData
</i></b></font><font color="#000080">#define Get2D(X, Y) #Get2D X, Y </font><font color="#0000FF"><b><i>; allows paretheses in macro
;-----------------------
</i></b></font><font color="#000080">#Put2D macro X, Y </font><font color="#0000FF"><b><i>; value should be in ArrayData
</i></b></font><font color="#000080">MOVE?BB X, _Xidx </font><font color="#0000FF"><b><i>; copy users X value to Xidx
</i></b></font><font color="#000080">MOVE?BB Y, _Yidx </font><font color="#0000FF"><b><i>; copy users Y value to Yidx
</i></b></font><font color="#000080">L?CALL _Put2D </font><font color="#0000FF"><b><i>; call the Put subroutine
</i></b></font><font color="#000080">endm
#define Put2D(X, Y) #Put2D X, Y </font><font color="#0000FF"><b><i>; allows paretheses in macro
;-----------------------
</i></b></font><font color="#000080">#Clear2D macro
L?CALL _Clear2D </font><font color="#0000FF"><b><i>; call the Clear subroutine
</i></b></font><font color="#000080">endm
#define Clear2D() #Clear2D
</font><font color="#008000"><b>ENDASM
</b></font>
Code:
<font color="#0000FF"><b><i>;____[The Main Program]_____________________________________________________
</i></b></font><b>X </b><font color="#008000"><b>VAR BYTE </b></font><b>SYSTEM
Y </b><font color="#008000"><b>VAR BYTE </b></font><b>SYSTEM
Main</b>:
@ <b>Clear2D </b><font color="#0000FF"><b><i>; clear the array
</i></b></font><font color="#008000"><b>FOR </b></font><b>Y </b>= <font color="#800000"><b>0 </b></font><font color="#008000"><b>TO </b></font><b>Length</b>-<font color="#800000"><b>1 </b></font><font color="#0000FF"><b><i>; fill the array with data
</i></b></font><font color="#008000"><b>FOR </b></font><b>X </b>= <font color="#800000"><b>0 </b></font><font color="#008000"><b>TO </b></font><b>Width</b>-<font color="#800000"><b>1
</b></font><b>ArrayData </b>= <b>X </b><font color="#0000FF"><b><i>; value to put in array
</i></b></font>@ <b>Put2D</b>(<b>X</b>,<b>Y</b>)
<font color="#008000"><b>NEXT </b></font><b>X
</b><font color="#008000"><b>NEXT </b></font><b>Y
</b><font color="#008000"><b>FOR </b></font><b>Y </b>= <font color="#800000"><b>0 </b></font><font color="#008000"><b>TO </b></font><b>Length</b>-<font color="#800000"><b>1 </b></font><font color="#0000FF"><b><i>; Read data back and send to serial port
</i></b></font><font color="#008000"><b>FOR </b></font><b>X </b>= <font color="#800000"><b>0 </b></font><font color="#008000"><b>TO </b></font><b>Width</b>-<font color="#800000"><b>1
</b></font>@ <b>Get2D</b>(<b>X</b>,<b>Y</b>)
<font color="#008000"><b>HSEROUT </b></font>[<font color="#008000"><b>HEX2 </b></font><b>ArrayData</b>,<font color="#FF0000">", "</font>]
<font color="#008000"><b>NEXT </b></font><b>X
</b><font color="#008000"><b>HSEROUT </b></font>[<font color="#800000"><b>13</b></font>,<font color="#800000"><b>10</b></font>]
<font color="#008000"><b>NEXT </b></font><b>Y
</b><font color="#008000"><b>HSEROUT </b></font>[<font color="#800000"><b>13</b></font>,<font color="#800000"><b>10</b></font>]
<font color="#008000"><b>PAUSE </b></font><font color="#800000"><b>3000
</b></font><font color="#008000"><b>GOTO </b></font><b>Main</b>
Code:
[color=#0000FF][b][i];____[Working with 2D arrays]_____________________________________________________
Width CON 8 ; Number of bytes in a Row
Length CON 10 ; Number of Rows in the array
;---------------------------------------------------------------------------
ArraySize CON Width * Length ; Total size of the array
MyArray VAR BYTE[ArraySize] ; The Array
Idx VAR BYTE ; Index, points to 1D array locations
Xidx VAR BYTE ; 2D column Index
Yidx VAR BYTE ; 2D row Index
ArrayData VAR BYTE ; holding register for array data
;----[Get a value from the 2D array]----------------------------------------
Get2D:
Idx=(Yidx*Width+Xidx) MIN (ArraySize-1) ; find Index, limit to ArraySize
ArrayData = MyArray(Idx) ; retrieve value from the array
RETURN
;----[Put a value in the 2D array]------------------------------------------
Put2D:
Idx=(Yidx*Width+Xidx) MIN (ArraySize-1) ; find Index, limit to ArraySize
MyArray(Idx)=ArrayData ; store the value in the array
RETURN
;----[Set entire array to 0's]----------------------------------------------
Clear2D:
FOR Idx = 0 TO ArraySize-1
MyArray(Idx)=0
NEXT Idx
RETURN
;----[Turn the Subroutines into Functions]----------------------------------
ASM
#Get2D macro X, Y
MOVE?BB X, _Xidx ; copy users X value to Xidx
MOVE?BB Y, _Yidx ; copy users Y value to Yidx
L?CALL _Get2D ; call the Get subroutine
endm ; value is returned in ArrayData
#define Get2D(X, Y) #Get2D X, Y ; allows paretheses in macro
;-----------------------
#Put2D macro X, Y ; value should be in ArrayData
MOVE?BB X, _Xidx ; copy users X value to Xidx
MOVE?BB Y, _Yidx ; copy users Y value to Yidx
L?CALL _Put2D ; call the Put subroutine
endm
#define Put2D(X, Y) #Put2D X, Y ; allows paretheses in macro
;-----------------------
#Clear2D macro
L?CALL _Clear2D ; call the Clear subroutine
endm
#define Clear2D() #Clear2D
ENDASM
Code:
;____[The Main Program]_____________________________________________________
X VAR BYTE SYSTEM
Y VAR BYTE SYSTEM
Main:
@ Clear2D ; clear the array
FOR Y = 0 TO Length-1 ; fill the array with data
FOR X = 0 TO Width-1
ArrayData = X ; value to put in array
@ Put2D(X,Y)
NEXT X
NEXT Y
FOR Y = 0 TO Length-1 ; Read data back and send to serial port
FOR X = 0 TO Width-1
@ Get2D(X,Y)
HSEROUT [HEX2 ArrayData,", "]
NEXT X
HSEROUT [13,10]
NEXT Y
HSEROUT [13,10]
PAUSE 3000
GOTO Main
Bookmarks