blob: f27af18c9aeb347cf694735628b03a94477acb9d (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
|
*** Registers
GR0 *always zero
GR1 scratch
GR2 normal return register
GR27 Global Data Pointer (Must be set in crt0)
GR30 SP stack pointer
GR31 milicode return pointer
SR* Space registers
CR24-31 Temporary Control Registers
CR14 Vector Table Register (like VBR on an m68020)
CR0 Put in a count, causes exception when decremented to 0.
FORTH's magic number is 031240
***
Series 700/800
The following options are also supported:
-snnn set the initial system load (ISL) start address to
nnn in the volume label. This is useful when
building boot media for Series 700/800 systems.
-lnnn specifies the length in bytes of the ISL code in
the LIF volume.
-ennn set the ISL entry point to nnn bytes from the
beginning of the ISL. For example, specifying -
e3272 means that the ISL entry point is 3272
(decimal) bytes from the beginning of the ISL
object module.
-Knnn forces the directory start location to be the
nearest multiple of nnn x 1024 bytes from the
beginning of the volume. This is necessary for
booting Series 700/800 systems from LIF media.
-n xxx Sets the volume name to be xxx.
lifinit -v64000000 -d64 -nISL10 -K2 -s4096 -l61440 -e5336 this_lif
# lifcp --
# -r Forces RAW mode copying. (file type BIN (-23951))
# -T Sets the file type of the directory entry.
# -Knnn forces each file copied in to begin on a nnn x
# 1024-byte boundary from the beginning of the volume
# Note: the word echoed below MUST be 10 characters exactly.
#
(echo "FORTH ") | lifcp -r -T-030001 -K2 - this_lif:AUTO
#
# somxtract infile outfile --
# converts a series 800 file *only* into a raw image
It turns out the native cc and our current gcc produce series 700
output, so in this case it runs till if fills up the hard disk.
*** rombootlf5 is a FORTH interpreter in a "boot" image. (it won't run on
the HP742 board)
lifls -l rombootlf5
volume ISL10 data size 249984 directory size 8 94/04/20 10:26:36
filename type start size implement created
===============================================================
ISL -12800 16 240 0 94/04/20 10:26:36
HPUX -12928 256 496 0 94/04/20 10:26:37
IOMAP -12960 752 1504 0 94/04/20 10:26:37
AUTO -12289 2256 1 0 94/04/20 10:26:38
FORTH -12960 2264 208 0 94/04/20 10:26:38
HPFORTH ASCII 2472 420 0 94/04/20 10:26:38
BOOTROM ASCII 2896 3849 0 94/04/20 10:26:40
PAD1 -12290 6752 1172 0 94/04/20 10:26:40
*** The ISL is only needed when booting the raw hardware. As we're runing
on a monitor (barely) all we need is a crt0 that initiallizes the GR27
Global Data Pointer and zero's bss.
*** Initial Program Load
--------------------
From page 11-56, architecture book.
0x00000000 +------------------------------------+ 0
| LIF_MAGIC | |
0x00000004 +------------------------------------+ 4
| |
0x000000F0 +------------------------------------+ 240
| IPL_ADDR |
0x000000F4 +------------------------------------+ 244
| IPL_SIZE |
0x000000F8 +------------------------------------+ 248
| IPL_ENTRY |
0x000000FC +------------------------------------+ 252
| |
IPL_ADDR +------------------------------------+ IPL_ADDR
| Position Independant |
| IPL Code |
| (including IPL_CHECKSUM) |
+------------------------------------+ IPL_ADDR + IPL_SIZE
| |
+------------------------------------+
IPL_ADDR 2 Kbyte aligned, nonzero
IPL_SIZE Multiple of 2Kbytes, <= 256 Kbytes
IPL_ENTRY Word aligned, less than IPL_SIZE
Loads at IPL_START
This is based on Cobra/Coral hardware:
LED register at 0xf080024
I/O status register at 0xf0800000
EEPROM at 0xf0810000 (LAN ID begins at byte 0)
Here's a dump of the LIF volume header using "xd" (od with hex output)
*
00000f0 0000 1000 0000 9800 0000 0000 0000 0000
^^^^
This is the size
*
0000800 5445 5354 2020 2020 2020 a271 0000 0010
^^^^ ^^^^ ^^^^ ^^^^ ^^^^ ^^^^<-- this is the ipl offset
this is the vol name ^^^^<- this is the type
0000810 0000 0098 9407 1919 1426 8001 0000 0000
^^^^
This is the ipl size
Interupts
---------
The vector table is access by %iva (%cr14). The address here must be a
multiple of 2048. The indexes are:
1 high-priority
2 power failure
3 recovery counter
4 external interrupt
5 low-priority machine check
6 instruction TLB miss/instruction page fault
7 instruction memory protection
8 illegal instruction
9 break instruction
10 priviledged operation
11 priviledged register
12 overflow
13 conditional
14 assist exception
15 data TLB miss fault/data page fault
16 non access instruction TLB miss fault
17 non access page TLB miss fault/non access data page fault
18 data memory protection/unaligned data reference
19 data memory break
20 TLB dirty bit
21 page reference
22 assist emulation
23 higher-priority transfer
24 lower-priority transfe
25 taken branch
|