goto arrays
; Cutrefacto ARRAY SYSTEM
; Can work as a vector and as a stack (even a mix,
; i.e. Push datas and use Get`s instead of Pop`s to keep them).

; Only can hold 30 vectors of 3 variables each one
; It isn`t very fast :( . But until a true array system....


; Sintaxis: 

;   call Array RESET
;   call Array INFO
;As a vector, a normal array
;   call Array ADD    Index Value1 [Value2] [Value3]
;   call Array GET    Index
;   call Array DELETE Index
;As a stack
;   call Array PUSH  Value1 [Value2] [Value3]
;   call Array POP


;  Parameters
;   Action: 
;          RESET --> Delete all values. Reinit. Must be done at startup.
;          ADD   --> Adds a new value at Index position
;          GET   --> exits value at Index position to %1 [%2] [%3]
;          DELETE--> Erase value at Index position 
;          PUSH  --> Insert a value onto the stack
;          POP   --> exit the last value inserted to %1 [%2] [%3]
;          INFO  --> %1 : Number of vectors stored
;                    %2 : Number of vectors the array can store at once
;   Index: Is a position in the array. A value between [1-30] 
;   Value: New data for the array. Needed in ADD & PUSH action

arrays:
IF %1 = ADD
  gosub ArrayADD
IF %1 = PUSH
  gosub ArrayPUSH
IF %1 = POP
  gosub ArrayPOP
IF %1 = DELETE
  gosub ArrayDEL
IF %1 = GET
  gosub ArrayGET
IF %1 = RESET
  gosub ArrayRESET
IF %1 = INFO
  gosub ArrayINFO
exit


sub ArrayPop
 if %ArrayIndex > 1
    {
    set %ArrayIndex %ArrayIndex - 1
    set %2 %ArrayIndex 
    gosub ArrayGET
    exit
   }
set %1 N/A
set %2 N/A
set %3 N/A
set %4 N/A
set %5 N/A
exit


sub ArrayGET
goto %2
    set %1 N/A
    set %2 N/A
    set %3 N/A
    set %4 N/A
    set %5 N/A
 exit 
1:
   set %1 %Array1_1
   set %2 %Array1_2
   set %3 %Array1_3
   set %4 %Array1_4
   set %5 %Array1_5
 exit
2:
   set %1 %Array2_1
   set %2 %Array2_2
   set %3 %Array2_3
   set %4 %Array2_4
   set %5 %Array2_5
 exit
3:
   set %1 %Array3_1
   set %2 %Array3_2
   set %3 %Array3_3
   set %4 %Array3_4
   set %5 %Array3_5
 exit
4:
   set %1 %Array4_1
   set %2 %Array4_2
   set %3 %Array4_3
   set %4 %Array4_4
   set %5 %Array4_5
 exit
5:
   set %1 %Array5_1
   set %2 %Array5_2
   set %3 %Array5_3
   set %4 %Array5_4
   set %5 %Array5_5
 exit


sub ArrayPush
 if %ArrayIndex <= %ArrayMaxIndex 
   {
     set %7 %6
     set %6 %5
     set %5 %4
     set %4 %3
     set %3 %2
     set %2 %ArrayIndex 
     set %ArrayIndex %ArrayIndex + 1
     gosub ArrayADD 
   }
exit


sub ArrayADD
set %2 %2 + 105
goto %2
exit
106:
   set %Array1_1 %3
   set %Array1_2 %4
   set %Array1_3 %5
   set %Array1_4 %6
   set %Array1_5 %7
 exit
107:
   set %Array2_1 %3
   set %Array2_2 %4
   set %Array2_3 %5
   set %Array2_4 %6
   set %Array2_5 %7
 exit
108:
   set %Array3_1 %3
   set %Array3_2 %4
   set %Array3_3 %5
   set %Array3_4 %6
   set %Array3_5 %7
 exit
109:
   set %Array4_1 %3
   set %Array4_2 %4
   set %Array4_3 %5
   set %Array4_4 %6
   set %Array4_5 %7
 exit
110:
   set %Array5_1 %3
   set %Array5_2 %4
   set %Array5_3 %5
   set %Array5_4 %6
   set %Array5_5 %7
 exit


sub ArrayRESET
set %ArrayIndex 1
set %ArrayMaxIndex 5
 set %Array1_1  N/A
 set %Array1_2  N/A
 set %Array1_3  N/A
 set %Array1_4  N/A
 set %Array1_5  N/A

 set %Array2_1  N/A
 set %Array2_2  N/A
 set %Array2_3  N/A
 set %Array2_4  N/A
 set %Array2_5  N/A

 set %Array3_1  N/A
 set %Array3_2  N/A
 set %Array3_3  N/A
 set %Array3_4  N/A
 set %Array3_5  N/A

 set %Array4_1  N/A
 set %Array4_2  N/A
 set %Array4_3  N/A
 set %Array4_4  N/A
 set %Array4_5  N/A

 set %Array5_1  N/A
 set %Array5_2  N/A
 set %Array5_3  N/A
 set %Array5_4  N/A
 set %Array5_5  N/A

exit


sub ArrayINFO
    set %1 %ArrayIndex - 1
    set %2 %ArrayMaxIndex 
exit

sub ArrayDEL
set %3 N/A
set %4 N/A
set %5 N/A
set %6 N/A
set %7 N/A
 gosub ArrayADD
 exit


