( a blank file )

%+  { ADD } %-   { SUB }  %*  { MUL } %/   { DIV }  
%<  { LTH } %>   { GTH }  %=  { EQU } %!   { NEQ } 
%++ { ADD2 } %-- { SUB2 } %** { MUL2 } %// { DIV2 } 
%<< { LTH2 } %>> { GTH2 } %== { EQU2 } %!! { NEQ2 }  

%DEBUG  { ;print-hex JSR2 #0a .Console/write DEO }
%DEBUG2 { SWP ;print-hex JSR2 ;print-hex JSR2 #0a .Console/write DEO }

%RTN { JMP2r }

( devices )

|00 @System     [ &vector $2 &wst      $1 &rst    $1 &pad   $4 &r      $2 &g      $2 &b     $2 ]
|10 @Console    [ &vector $2 &read     $1 &pad    $5 &write $1 &error  $1 ]
|20 @Screen     [ &vector $2 &width    $2 &height $2 &pad   $2 &x      $2 &y      $2 &addr  $2 &color $1 ]
|30 @Audio0     [ &vector $2 &position $2 &output $1 &pad   $3 &adsr   $2 &length $2 &addr  $2 &volume $1 &pitch $1 ]
|40 @Audio1     [ &vector $2 &position $2 &output $1 &pad   $3 &adsr   $2 &length $2 &addr  $2 &volume $1 &pitch $1 ]
|50 @Audio2     [ &vector $2 &position $2 &output $1 &pad   $3 &adsr   $2 &length $2 &addr  $2 &volume $1 &pitch $1 ]
|60 @Audio3     [ &vector $2 &position $2 &output $1 &pad   $3 &adsr   $2 &length $2 &addr  $2 &volume $1 &pitch $1 ]
|70 @Midi       [ &vector $2 &channel  $1 &note   $1 &velocity $1 ]
|80 @Controller [ &vector $2 &button   $1 &key    $1 ]
|90 @Mouse      [ &vector $2 &x        $2 &y      $2 &state $1 &wheel $1 ]
|a0 @File       [ &vector $2 &success  $2 &offset $2 &pad   $2 &name  $2 &length $2 &load $2 &save $2 ]
|b0 @DateTime   [ &year   $2 &month    $1 &day    $1 &hour $1 &minute $1 &second $1 &dotw $1 &doty $2 &isdst $1 ]

( variables )

|0000

@lista $3
@listb $3
@listc $3

( program )

|0100 ( -> )

	( theme ) 
	#0fe5 .System/r DEO2 
	#0fc5 .System/g DEO2 
	#0f25 .System/b DEO2

	#01 .lista #00 + STZ
	#02 .lista #01 + STZ
	#03 .lista #02 + STZ

	#10 .listb #00 + STZ
	#20 .listb #01 + STZ
	#30 .listb #02 + STZ

	.lista .listb .listc ;add-lists-loop JSR2

	.listc LDZ DEBUG
	.listc #01 + LDZ DEBUG
	.listc #02 + LDZ DEBUG

BRK

( Write a Forth word to add together two integer 
vectors (a.k.a. arrays) of three elements each. )

@add-lists-linear ( a b c -- )
	
	STH
	( a[0] b[0] + ) LDZk STH SWP LDZk STHr + STHkr STZ 
	( a[1] b[1] + ) #01 + LDZk STH SWP #01 + LDZk STHr + STHkr #01 + STZ 
	( a[2] b[2] + ) #01 + LDZ SWP #01 + LDZ + STHr #02 + STZ

RTN

@add-lists-loop ( a b c -- )
	
	STH
	#00 #03
	&loop
		( get incr ) OVR STH
		( get a[x] ) OVR2 STHkr ADD LDZ 
		( get b[x] ) SWP STHkr ADD LDZ 
		( set c[x] ) ADD STHr STHkr ADD STZ
		( incr ) SWP #01 ADD SWP 
		LTHk ,&loop JCN
	POP2 POP2 POPr

JMP2r

@print-hex ( value -- )
	
	STHk #04 SFT ,&parse JSR .Console/write DEO
	STHr #0f AND ,&parse JSR .Console/write DEO
	RTN
	&parse ( value -- char )
		DUP #09 GTH ,&above JCN #30 ADD RTN &above #09 SUB #60 ADD RTN

RTN