You can find the description of these in 'HiLoRes.txt', it describes the character set of OZ V4.005 (UK), exactly the same as OZ V3.26 (FR)!
Byte 1 (odd)
ch7 ch6 ch5 ch4 ch3 ch2 ch1 ch0
Byte 2 (even)
sw1 sw2 hrs rev fls gry und ch8
Bit | Value | Description |
---|---|---|
SW1 | x | No hardware command (only used by OZ) |
SW2 | x | No hardware command (only used by OZ) |
HRS | 0 | Refer to LORES offset, display a 6 bits wide matrix |
1 | Refer to HIRES offset, display a 8 bits wide matrix | |
REV | 1 | Reverse attribute for LORES, Special use for HIRES |
FLS | 1 | Flash attribute |
GRY | 1 | Grey attribute |
UND | 1 | Underline attribute |
ch0-ch8 character number (refering to the RES tables, not ascii)
LORES
ch8 | ch7 | ch6-ch0 |
---|---|---|
0 | 0 | Normal charset (ascii order) |
0 | 1 | Bold charset (ascii order) |
1 | 0 | Tiny charset (ascii order) |
1 | 1 | Special (see RES tables) and user defined (LORES0) |
HIRES
ch8 | ch7 | ch6-ch0 |
---|---|---|
0 | 0 | Map (HIRES0) |
0 | 1 | Map (HIRES0) |
1 | 0 | Unused |
1 | 1 | Char set (upper case only) and specials |
When HRS and REV are set, it is a special command, FLS selects the type :
FLS set : LORES cursor (other attributes are valid),
It is clear that the cursor is only a Reversed char when flashing (once per second).
The cursor will always look like : $xx $38 or $xx $39.
FLS res : null character (always $00 $34)
The null character fulls the empty areas of the screen (it is not spaces).
Set | HRS | REV | FLS | GRY | UND | CHAR (bit 0 - bit 8) |
---|---|---|---|---|---|---|
LORES1 | 0 | v | v | v | v | 000-1BF (448 chars) |
LORES0 | 0 | v | v | v | v | 1C0-1FF (64 chars) |
HIRES0 | 1 | 0 | v | v | v | 000-0FF (256 chars) |
HIRES1 | 1 | 0 | v | v | v | 100-200 (256 chars) |
CURSOR | 1 | 1 | 1 | v | v | 000-1FF (lores char number) |
NULL | 1 | 1 | 0 | 1 | 0 | 000 |
The OZ window is the right part of the map. There are 2 visible hires char (16 pixels). In fact, it is 3 chars wide window, the third char is always a space.
Line | Char | Description |
---|---|---|
1 | $80 $81 | 'OZ' |
1 | $82 $83 | 'LOCK OUT' |
1 | $94 $95 | 'CARD' |
1 | $96 $97 | 'INDEX' |
1 | $8A $8B | 'FAIL' |
2 | $92 $93 | Bell symbol |
3 | $88 $89 | 'CLI' |
4 | - | - |
5 | $90 | Diamond symbol |
5 | $91 | Square symbol |
6 | $8C $8D | 'BAT' |
7 | $8E $8F | 'LOW' |
8 | $84 $85 | 'CAPS' |
8 | $86 $87 | 'caps' |
$7FE7 | 2 | Active window frame (=IX) |
$7FE9 | 1 | VDU length, zero if no VDU |
$7FEA | 1 | ? |
$7FEB | 1 | ? |
$7FEC | n | buffer for VDU. |
Example with a VDU for defining a user lores character : 1,138,'=',..,...
$7FE9 10 the VDU length
$7FEC '=' the VDU command
$7FED user defined char number
$7FEE user defined char data (8 raws)
In that frame, the data of each window are stored. All the coordinates are absolutes. These coordinates are the address of the character attributes. One X is two bytes (attribute 1 and 2). The screen base file address is $21 7800 on expaned and unexpanded machines. These (X,Y) coordinates are L H addresses.
For example: (0,0) will be $00 $78 (HL=$7800). (105,7) will be $E2 $7F (HL=$7FE2).
Byte | Bit | Description |
---|---|---|
IX-01 | Y up left coordinate | |
IX-02 | X up left coordinate | |
IX-03 | Y down right coordinate | |
IX-04 | X down right coordinate | |
IX-05 | Left margin | |
IX-06 | Right margin | |
IX-07 | Y cursor address | |
IX-08 | X cursor address | |
IX-09 | cursor attrib | |
bit 5 | ? set=08 res=38 | |
IX-0A | ? | |
IX-0B | ? | |
IX-0C | ? | |
IX-0D | bit 0 | justification bit 1 |
bit 1 | justification bit 2 | |
Value | Justification | |
0 | normal | |
1 | right | |
2 | left | |
3 | centered | |
bit 6 | update cursor | |
bit 7 | cursor mode (res=OFF, set=ON) | |
IX-0E | bit 7 | ? set=in use, res=first time |
Their softcopies are stored in $047n and $046n where n is screen reason minus one. Be careful when you set the register, you have to use both B, C and A registers in OUT (C),A. B contains the left bits of data (more than 8), A the data, C the port. So, A will be ($047x) and B will be ($046x).
Port | Number | With (bits) | Granularity | Screen file | Reason | Size |
---|---|---|---|---|---|---|
PB0 | $70 | 13 | 512 bytes | Lores0 | 1 | 512 |
PB1 | $71 | 10 | 4K | Lores1 | 2 | 3.5K |
PB2 | $72 | 9 | 8K | Hires0 | 3 | 2K |
PB3 | $73 | 11 | 2K | Hires1 | 4 | 2K |
SBR | $74 | 11 | 2K | Base | 5 | 2K |
The coding method to set the address in the blink register is below, the non significant bits are set to zero.
Example with Lores0.
PB0 : Lores0
B / H / L b7 b6 b5 b4 b3 b2 b1 b0 / 0 0 h5 h4 h3 h2 h1 0 / 0 0 0 0 0 0 0 0 will become $0460 $0470 0 0 0 b7 b6 b5 b4 b3 / b2 b1 b0 h5 h4 h3 h2 h1
Now the table of the screens address defined by OZ on reset :
Screen | Unexpanded machine | Expanded machine | ||||
---|---|---|---|---|---|---|
Address | Size | Address | Size | ($0460) | ($0470) | |
Lores0 | $212200 | 256B | $430800 | 512B | $08 | $64 |
Lores1 | $070000 | 2K | - | - | $00 | $1C |
Hires0 | $212000 | 512B | $430000 | 2K | $00 | $86 |
Hires1 | $070800 | 1.8K | - | - | $00 | $39 |
Base | $217800 | 2K | - | - | $01 | $0F |
For getting the screen addresses, you can use an undescribed feature of OS_SCI. Call it with the screen file reason in A and B=0. The screen file address is outed in BHL without changing the register value.
Thierry Peycru (Zlab), April 1998.