Sun Logo


Writing FCode 3.x Programs

806-1379-10



Contents

Figures

Tables

Preface

1. SBus Cards and FCode

FCode PROM Format

Interpreting FCode

Device Identification

Creating and Executing FCode Definitions

2. PCI FCode Information

PCI FCode PROM Header Format

The PCI Expansion PROM Header Format

PCI Expansion PROM Data Structure Format

Format of Physical Address in reg Property

CPU PROM-Generated Properties

Adding a PCI Header to a PROM

3. Elements of FCode Programming

Colon Definitions

Stack Operations

Programming Style

Commenting Code

Coding Style

Definition Length

Stack Comments

A Minimal FCode Program

FCode Classes

Primitive FCode Functions

System FCode Functions

Interface FCode Functions

Local FCode Functions

4. Debugging and Testing FCode Programs

Packaging PCI FCode

System Flags and FCode Debugging

FCode Source

Tokenizing FCode Source

FCode Binary Format

Testing FCode Programs on the Target Machine

Configuring the Target Machine

Setting Appropriate Configuration Parameters

Modifying the Expansion Bus Probe Sequence

Getting to the Forth Monitor

Using the Command Line Editor of the Forth Monitor

Using the Forth Monitor to Test FCode Programs

Using dload to Load From Ethernet

Using dlbin to Load From Serial Port A

Using boot to Load From Hard Disk, Diskette, or Ethernet

Using dl to Load Forth Over Serial Port A

Using the Forth Monitor to Interpret an FCode Program

Using the Forth Monitor to Browse a Device Node

Using the Forth Monitor to Test a Device Driver

Device Node Methods

Testing FCode Programs in Source Form

Producing an FCode PROM

Exercising an Installed FCode PROM

Debugging Errors Generated by select-dev

5. Helpful Testing and Debugging Hints

Accessing a PCI Device's Configuration Space Registers

Base Address Register Setting

System Cache Line Size

Sun Ultra 30 UPA/PCI-Related Nodes

Finding and Using Physical Addresses

Controlling PCI Slot Probing on an Ultra 30 UPA/PCI System

Using 3.x Tokenizer and 3.x CPU PROMs

PCI Device Configuration Register Access

Boot Software Roles

Enabling Access to a PCI Device's Memory Space Locations

Expansion FCode PROM

Packaging Error With Ethernet FCode

6. Packages

Package Descriptions

Package Instances

Package Data

Static and Instance-Specific Methods

Execution Tokens

Intra-Package Calling Methods

Accessing Other Packages With phandle and ihandle

Inter-Package Calling Methods

execute-device-method and apply

Plug-in Device Drivers

Common Package Methods

Basic Methods

open

close

Recommended Methods

reset

selftest

Package Data Definitions

Instance Arguments and Parameters

Package Addresses

Package Mappings

The nvramrc Facility

Modifying Package Properties

Standard Support Packages

Sun Disk Label Support Package

TFTP Booting Support Package

Deblocker Support Package

7. Properties

Standard FCode Properties

Standard Property Names

Display Device Properties

Network Device Properties

Memory Device Properties

General Properties for Parent Nodes

Properties for PCI Parent Nodes

Properties for PCI Child Nodes

Detailed Descriptions of Standard Properties

#address-cells

#size-cells

address

address-bits

alternate-reg

assigned-addresses

available

big-endian-aperture

bus-range

character-set

class-code

compatible

depth

device-id

device_type

devsel-speed

existing

fast-back-to-back

has-fcode

height

interrupts

linebytes

little-endian-aperture

local-mac-address

mac-address

max-frame-size

max-latency

min-grant

model

name

page-size

power-consumption

ranges

reg

revision-id

slot-names

status

translations

vendor-id

width

Manipulating Properties

Property Creation and Modification

Property Values

Property Encoding

Property Retrieval

Property Decoding

Property-Specific FCodes

8. Block and Byte Devices

Block Devices

Byte Devices

Required Methods

block-size ( -- block-len )

load ( addr -- size )

max-transfer ( -- max-len )

read ( addr len -- actual )

read-blocks ( addr block# #blocks -- #read )

seek ( poslow poshigh -- status ) for block; seek ( offset file# -- error? ) for byte

write ( addr len -- actual )

write-blocks ( addr block# #blocks -- #written )

Required Properties

Device Driver Examples

Simple Block Device Driver

Extended Block Device Driver

Complete Block and Byte Device Driver

9. Display Devices

Required Methods

Required Properties

Device Driver Examples

Extended Display Device Driver

Complete Display Device Drive

10. Memory-Mapped Buses

Required Methods

decode-unit ( addr len -- phys.lo ... phys.hi )

dma-alloc ( size -- virt )

dma-free ( virt size -- )

dma-map-in ( virt size cacheable? -- devaddr )

dma-map-out ( virt devaddr size -- )

dma-sync ( virt devaddr size -- )

probe-self ( arg-addr arg-len reg- addr reg-len fcode-addr fcode-len -- )

map-in ( phys.lo ... phys.hi size -- virt )

map-out ( virt size -- )

SBus Addressing

SBus Required Properties

Device Driver Examples

Basic Hierarchical Device Driver

Extended Hierarchical Device Driver

Complete Hierarchical Device Driver

11. Network Devices

Required Methods

load ( addr -- len )

read ( addr len -- actual )

write ( addr len -- actual )

Required Device Properties

Optional Device Properties

Device Driver Examples

Simple Network Device Example

Sample Driver With Test and Debugging Methods

Bootable Network Device Driver Example

12. Serial Devices

Required Methods

install-abort ( -- )

read ( addr len -- actual )

remove-abort ( -- )

write ( addr len -- actual )

Required Properties

Device Driver Examples

Simple Serial FCode Program

Extended Serial FCode Program

Complete Serial FCode Program

13. PCI FCode Driver Example

14. FCode Dictionary

Special Characters

!

"

#

#>

'

(

(.)

*

*/

+

+!

,

-

.

."

.(

/

:

;

<

<#

<<

<=

<>

=

>

>=

>>

?

@

[

[']

\

]

Numerical Characters

0

0<

0<=

0<>

0=

0>

0>=

1

1+

1-

-1

2

2!

2*

2+

2-

2/

2@

3

A Words

>>a

abort

abs

accept

again

alarm

alias

align

aligned

alloc-mem

allot

and

ascii

B Words

b(")

b(')

b(:)

b(;)

base

b(constant)

b(create)

b(defer)

b(do)

b(?do)

because

begin

behavior

bell

b(endcase)

b(endof)

between

b(field)

bl

blank

b(leave)

blink-screen

b(lit)

bljoin

b(loop)

b(+loop)

b(<mark)

>body

b(of)

bounds

branch

branch

b(>resolve)

bs

b(to)

buffer:

buffer:)

b(value)

b(variable)

bwjoin

bxjoin

byte-load

C Words

c!

c,

/c

/c*

c@

ca+

ca1+

$call-method

call-package

$call-parent

carret

Xcase

catch

cell+

cells

char-height

chars

char-width

child

close-package

cmove>

column#

#columns

comp

compile,

[compile]

constant

control

count

cpeek

cpoke

cr

(cr

create

D Words

d#

d+

d-

.d

decimal

decode-bytes

decode-int

decode-phys

decode-string

default-font

defer

delete-characters

delete-lines

delete-property

depth

device-name

diagnostic-mode?

digit

do

?do

draw-character

draw-logo

drop

2drop

3drop

dup

2dup

3dup

?dup

E Words

else

emit

emit-byte

encode+

encode-bytes

encode-int

encode-phys

encode-string

end0

end1

endcase

endof

erase

erase-screen

eval

evaluate

execute

exit

expect

external

external-token

F Words

false

fb1-blink-screen

fb1-delete-characters

fb1-draw-character

fb1-draw-logo

fb1-erase-screen

fb1-insert-characters

fb1-insert-lines

fb1-install

fb1-invert-screen

fb1-reset-screen

fb1-slide-up

fb1-toggle-cursor

fb8-blink-screen

fb8-delete-characters

fb8-delete-lines

fb8-draw-character

fb8-draw-logo

fb8-erase-screen

fb8-insert-characters

fb8-insert-lines

fb8-install

fb8-invert-screen

fb8-reset-screen

fb8-toggle-cursor

fcode-revision

fcode-version1

fcode-version2

ferror

field

fill

$find

find-method

find-package

finish-device

fload

>font

fontbytes

frame-buffer-adr

free-mem

free-virtual

G Words

get-inherited-property

get-msecs

get-my-property

get-package-property

get-token

H Words

h# number

.h

headerless

headers

here

hex

hold

I Words

i

if

ihandle>phandle

insert-characters

insert-lines

instance

inverse?

inverse-screen?

invert

invert-screen

is-stack

is-install

is-remove

is-selftest

(is-user-word)

J - L Words

j

key

key?

l!

l,

l@

/l

/l*

<l@

la+

la1+

lbflip

lbflips

lbsplit

lcc

leave

?leave

left-parse-string

line#

#line

linefeed

#lines

loop

+loop

lpeek

lpoke

lshift

lwflip

lwflips

lwsplit

lxjoin

M Words

mac-address

map-low

mask

max

memory-test-suite

min

mod

*/mod

/mod

model

move

ms

my-address

my-args

my-parent

my-self

my-space

my-unit

N Words

/n

/n*

na+

na1+

name

named-token

negate

new-device

new-token

next-property

nip

noop

not

$number

O Words

of

off

offset16

on

open-package

$open-package

or

#out

over

2over

P Words

pack

parse-2int

peer

pick

property

R Words

r>

r@

.r

>r

rb!

rb@

reg

repeat

reset-screen

rl!

rl@

roll

rot

-rot

2rot

rshift

rw!

rw@

rx@

rx!

S Words

s"

s.

#s

.s

sbus-intr>cpu

screen-height

screen-width

set-args

set-font

set-token

sign

space

spaces

span

start0

start1

start2

start4

state

struct

suspend-fcode

swap

2swap

T Words

then

throw

to

toggle-cursor

tokenizer[

]tokenizer

true

tuck

type

U Words

u#

u#>

u#s

u.

u<

u<=

u>

u>=

(u.)

u2/

um*

um/mod

u/mod

unloop

until

upc

u.r

user-abort

V Words

value

variable

version1

versionx?

W Words

w!

w,

w@

/w

/w*

<w@

wa+

wa1+

wbflip

wbflips

wbsplit

while

window-left

window-top

within

wljoin

wpeek

wpoke

wxjoin

X Words

x,

x@

x!

/x

xa+

xa1+

xbflip

xbflips

xbsplit

xlflip

xlflips

xlsplit

xor

xwflip

xwflips

xwsplit

A. FCode Reference

FCodes by Function

FCodes by Byte Value

FCodes by Name

B. FCode Memory Allocation

C. Forth Coding Style

Typographic Conventions

Use of Spaces

if...then...else

do...loop

begin...while...repeat

begin...until...again

Block Comments

Stack Comments

Return Stack Comments

Numbers

D. Differences Between FCode 2.x and FCode 3.x

Index