Inhaltsverzeichnis
Tabellen und Daten
Egal in welcher Programmiersprache programmiert wird, es werden immer wieder gewisse Daten benötigt um die gewünschten Funktionen zu realisieren. Hier eine Liste der wichtigsten Daten für die Programmierung des ATARI® Portfolio™.
ASCII-Tabelle
Den ASCII-Zeichen 0 bis 32 kommt eine besondere Bedeutung zu, es sind Steuerzeichen. Sie werden auch als „die nicht druckbaren“ bezeichnet, das sind sie im Normalfall auch, sie werden benutzt um an der Konsole oder an Ein/Ausgabegeräten gewisse Funktionen auszulösen.
ASCII | Zeichen | Funktion | Bedeutung | |
---|---|---|---|---|
000 | NUL | Der Wert Null | ||
001 | ☺ | SOH | Start of heading | |
002 | ☻ | STX | Start of text | |
003 | ♥ | ETX | End of text | |
004 | ♦ | EOT | End of transmission | |
005 | ♣ | ENQ | Enquiry | |
006 | ♠ | ACK | Ackwnoledge | |
007 | ■ | BEL | Bell | |
008 | □ | BS | Backspace (Korrekturtaste) | |
009 | ○ | HT | Horizontal TAB | |
010 | ◙ | LF | Line feed | |
011 | ♂ | VT | Vertical TAB | |
012 | ♀ | FF | Form feed | |
013 | ♪ | CR | Carriage return | |
014 | ♫ | SO | Shift out | |
015 | ☼ | SI | Shift in | |
016 | ► | DLE | Data link escape | |
017 | ◄ | DC1 | Device control 1 | |
018 | ↕ | DC2 | Device control 2 | |
019 | ‼ | DC3 | Device control 3 | |
020 | ¶ | DC4 | Device control 4 | |
021 | § | NAK | Negative acknowledge | |
022 | ▄ | SYN | Synchronous idle | |
023 | ↨ | ETB | End of transmission block | |
024 | ↑ | CAN | Cancel | |
025 | ↓ | EM | End of medium | |
026 | → | SUB | Substitute | |
027 | ← | Esc | Escape-Taste | |
028 | ∟ | FS | File separator | |
029 | ↔ | GS | Group separator | |
030 | ▲ | RS | Record separator | |
031 | ▼ | US | Unit separator |
ASCII | Zeichen | ASCII | Zeichen | ASCII | Zeichen | ASCII | Zeichen | ASCII | Zeichen | ASCII | Zeichen | ASCII | Zeichen | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
032 | 064 | @ | 096 | ` | 128 | Ç | 160 | á | 192 | └ | 224 | α | ||
033 | ! | 065 | A | 097 | a | 129 | ü | 161 | í | 193 | ┴ | 225 | β | |
034 | „ | 066 | B | 098 | b | 130 | é | 162 | ó | 194 | ┬ | 226 | Γ | |
035 | # | 067 | C | 099 | c | 131 | â | 163 | ú | 195 | ├ | 227 | π | |
036 | $ | 068 | D | 100 | d | 132 | ä | 164 | ñ | 196 | ─ | 228 | Σ | |
037 | % | 069 | E | 101 | e | 133 | à | 165 | Ñ | 197 | ┼ | 229 | σ | |
038 | & | 070 | F | 102 | f | 134 | å | 166 | ª | 198 | ╞ | 230 | μ | |
039 | ´ | 071 | G | 103 | g | 135 | ç | 167 | ° | 199 | ╟ | 231 | τ | |
040 | ( | 072 | H | 104 | h | 136 | ê | 168 | ¿ | 200 | ╚ | 232 | Φ | |
041 | ) | 073 | I | 105 | i | 137 | ë | 169 | ⌐ | 201 | ╔ | 233 | Ө | |
042 | * | 074 | J | 106 | j | 138 | è | 170 | ¬ | 202 | ╩ | 234 | Ω | |
043 | + | 075 | K | 107 | k | 139 | ï | 171 | ½ | 203 | ╦ | 235 | б | |
044 | , | 076 | L | 108 | l | 140 | î | 172 | ¼ | 204 | ╠ | 236 | ∞ | |
045 | - | 077 | M | 109 | m | 141 | ì | 173 | ¡ | 205 | ═ | 237 | ø | |
046 | . | 078 | N | 110 | n | 142 | Ä | 174 | « | 206 | ╬ | 238 | Є | |
047 | / | 079 | O | 111 | o | 143 | Å | 175 | » | 207 | ╧ | 239 | ∩ | |
048 | 0 | 080 | P | 112 | p | 144 | É | 176 | ░ | 208 | ╨ | 240 | ≡ | |
049 | 1 | 081 | Q | 113 | q | 145 | æ | 177 | ▒ | 209 | ╤ | 241 | ± | |
050 | 2 | 082 | R | 114 | r | 146 | Æ | 178 | ▓ | 210 | ╥ | 242 | ≥ | |
051 | 3 | 083 | S | 115 | s | 147 | ô | 179 | │ | 211 | ╙ | 243 | ≤ | |
052 | 4 | 084 | T | 116 | t | 148 | ö | 180 | ┤ | 212 | ╘ | 244 | ⌠ | |
053 | 5 | 085 | U | 117 | u | 149 | ò | 181 | ╡ | 213 | ╒ | 245 | ⌡ | |
054 | 6 | 086 | V | 118 | v | 150 | û | 182 | ╢ | 214 | ╓ | 246 | ÷ | |
055 | 7 | 087 | W | 119 | w | 151 | ù | 183 | ╖ | 215 | ╫ | 247 | ≈ | |
056 | 8 | 088 | X | 120 | x | 152 | ÿ | 184 | ╕ | 216 | ╪ | 248 | ° | |
057 | 9 | 089 | Y | 121 | y | 153 | Ö | 185 | ╣ | 217 | ┘ | 249 | ▪ | |
058 | : | 090 | Z | 122 | z | 154 | Ü | 186 | ║ | 218 | ┌ | 250 | • | |
059 | ; | 091 | [ | 123 | { | 155 | ¢ | 187 | ╗ | 219 | █ | 251 | √ | |
060 | < | 092 | \ | 124 | ¦ | 156 | ₤ | 188 | ╝ | 220 | ▄ | 252 | ⁿ | |
061 | = | 093 | ] | 125 | } | 157 | ¥ | 189 | ╜ | 221 | ▌ | 253 | ² | |
062 | > | 094 | ˆ | 126 | ~ | 158 | ћ | 190 | ╛ | 222 | ▐ | 254 | ■ | |
063 | ? | 095 | _ | 127 | ⌂ | 159 | ƒ | 191 | ┐ | 223 | ▀ | 255 |
Tastatur Scancodes
Der Porfolio besitzt keinen Tastatur-Controller wie der IBM-PC und keine intelligente Tastatur. Seine 63 Tasten werden über eine 16×16-Matrix abgefragt, deren letztes Ergebnis an Port 8000h der CPU anliegt. Zusätzlich stellt das BIOS die üblichen Tastatur Scancodes zur Verfügung, die auch von Portfolio´s Zeileneditor verwendet werden. Die Tastatur kann Hardwareseitig über den Port 08000h, oder Softwareseitig über den BIOS-Interrupt 16h (Portfolio´s GetKey-Funktion) abgefragt werden.
Dies sind die vom BIOS generierten Scan-Codes für die deutsche Tastaturbelegung. Wenn eine Taste oder Tastenkombination gedrückt wird, so wird der jeweils folgende Scan-Code zurückgegeben.
A | 97 | Shift+A | 65 | Alt+A | 00 30 | Strg+A | 1* |
B | 98 | Shift+B | 66 | Alt+B | 00 48 | Strg+B | 2 |
C | 99 | Shift+C | 67 | Alt+C | 00 46 | Strg+C | 3 |
D | 100 | Shift+D | 68 | Alt+D | 00 32 | Strg+D | 4 |
E | 101 | Shift+E | 69 | Alt+E | 00 18 | Strg+E | 5 |
F | 102 | Shift+F | 70 | Alt+F | 00 33 | Strg+F | 6 |
G | 103 | Shift+G | 71 | Alt+G | 00 34 | Strg+G | 7 |
H | 104 | Shift+H | 72 | Alt+H | 00 35 | Strg+H | 8 |
I | 105 | Shift+I | 73 | Alt+I | 00 23 | Strg+I | 9 |
J | 106 | Shift+J | 74 | Alt+J | 00 36 | Strg+J | 10 |
K | 107 | Shift+K | 75 | Alt+K | 00 37 | Strg+K | 11 |
L | 108 | Shift+L | 76 | Alt+L | 00 38 | Strg+L | 12 |
M | 109 | Shift+M | 77 | Alt+M | 00 50 | Strg+M | 13 |
N | 110 | Shift+N | 78 | Alt+N | 00 49 | Strg+N | 14 |
O | 111 | Shift+O | 79 | Alt+O | 00 24 | Strg+O | 15 |
P | 112 | Shift+P | 80 | Alt+P | 00 25 | Strg+P | 16 |
Q | 113 | Shift+Q | 81 | Alt+Q | 00 16 | Strg+Q | 17 |
R | 114 | Shift+R | 82 | Alt+R | 00 19* | Strg+R | 18 |
S | 115 | Shift+S | 83 | Alt+S | 00 31 | Strg+S | 19 |
T | 116 | Shift+T | 84 | Alt+T | 00 20 | Strg+T | 20 |
U | 117 | Shift+U | 85 | Alt+U | 00 22 | Strg+U | 21 |
V | 118 | Shift+V | 86 | Alt+V | 00 47 | Strg+V | 22 |
W | 119 | Shift+W | 87 | Alt+W | 00 17 | Strg+W | 23 |
X | 120 | Shift+X | 88 | Alt+X | 00 45 | Strg+X | 24 |
Y | 121 | Shift+Y | 89 | Alt+Y | 00 21 | Strg+Y | 25 |
Z | 122 | Shift+Z | 90 | Alt+Z | 00 44 | Strg+Z | 26 |
Ä | 148 | Shift+Ä | 153 | Alt+Ä | 94 | Strg+Ä | 27 |
Ö | 132 | Shift+Ö | 142 | Alt+Ö | - | Strg+Ö | - |
Ü | 129 | Shift+Ü | 154 | Alt+Ü | 91 | Strg+Ü | - |
ß | 225 | Shift+ß | 63 | Alt+ß | 00 130 | Strg+ß | - |
+ | 43 | Shift++ | 42 | Alt++ | 93 | Strg++ | 29 |
− | 45 | Shift+− | 95 | Alt+− | 125 | Strg+− | - |
0 | 48 | Shift+0 | 61 | Alt+0 | 00 129 | Strg+0 | - |
1 | 49 | Shift+1 | 33 | Alt+1 | 00 120 | Strg+1 | - |
2 | 50 | Shift+2 | 34 | Alt+2 | 00 121 | Strg+2 | 03 |
3 | 51 | Shift+3 | 21 | Alt+3 | 00 122 | Strg+3 | - |
4 | 52 | Shift+4 | 36 | Alt+4 | 00 123 | Strg+4 | - |
5 | 53 | Shift+5 | 37 | Alt+5 | 00 124 | Strg+5 | - |
6 | 54 | Shift+6 | 38 | Alt+6 | 00 125 | Strg+6 | 30 |
7 | 55 | Shift+7 | 47 | Alt+7 | 00 126 | Strg+7 | - |
8 | 56 | Shift+8 | 40 | Alt+8 | 00 127 | Strg+8 | - |
9 | 57 | Shift+T | 41 | Alt+9 | 00 128 | Strg+9 | - |
` | - | Shift+` | - | Alt+` | 00 131 | Strg+` | - |
. | 46 | Shift+. | 58 | Alt+. | 123 | Strg+. | - |
, | 44 | Shift+, | 59 | Alt+, | 126 | Strg+, | - |
Esc | 27 | Shift+Esc | 27 | Alt+Esc | - | Strg+Esc | 27 |
TAB | 9 | Shift+TAB | 00 15 | Alt+TAB | - | Strg+TAB | - |
Entf | 00 83 | Shift+Entf | 00 82 | Alt+Entf | - | Strg+Entf | - |
BS | 8 | Shift+BS | 8 | Alt+BS | - | Strg+BS | 127 |
F1 | 00 59 | Shift+F1 | 00 84 | Alt+F1 | 00 104 | Strg+F1 | 00 94 |
F2 | 00 60 | Shift+F2 | 00 85 | Alt+F2 | 00 105 | Strg+F2 | 00 95 |
F3 | 00 61 | Shift+F3 | 00 86 | Alt+F3 | 00 106 | Strg+F3 | 00 96 |
F4 | 00 62 | Shift+F4 | 00 87 | Alt+F4 | 00 107 | Strg+F4 | 00 97 |
F5 | 00 63 | Shift+F5 | 00 88 | Alt+F5 | 00 108 | Strg+F5 | 00 98 |
F6 | 00 64 | Shift+F6 | 00 89 | Alt+F6 | 00 109 | Strg+F6 | 00 99 |
F7 | 00 65 | Shift+F7 | 00 90 | Alt+F7 | 00 110 | Strg+F7 | 00 100 |
F8 | 00 66 | Shift+F8 | 00 91 | Alt+F8 | 00 111 | Strg+F8 | 00 101 |
F9 | 00 67 | Shift+F9 | 00 92 | Alt+F9 | 00 112 | Strg+F9 | 00 102 |
F10 | 00 68 | Shift+F10 | 00 93 | Alt+F10 | 00 113 | Strg+F10 | 00 103 |
← | 00 75 | Shift+← | 00 75 | Alt+← | - | Strg+← | 00 115 |
↑ | 00 72 | Shift+↑ | 00 72 | Alt+↑ | - | Strg+↑ | - |
↓ | 00 80 | Shift+↓ | 00 80 | Alt+↓ | - | Strg+↓ | - |
→ | 00 77 | Shift+→ | 00 77 | Alt+→ | - | Strg+→ | 00 116 |
Pos1 | 00 71 | Shift+Pos1 | 00 71 | Alt+Pos1 | - | Strg+Pos1 | 00 119 |
Bild↑ | 00 73 | Shift+Bild↑ | 00 73 | Alt+Bild↑ | - | Strg+Bild↑ | 00 132 |
Bild↓ | 00 81 | Shift+Bild↓ | 00 81 | Alt+Bild↓ | - | Strg+Bild↓ | 00 118 |
Ende | 00 79 | Shift+Ende | 00 79 | Alt+Ende | - | Strg+Ende | 00 117 |
Enter | 13 | Shift+Enter | 13 | Alt+Enter | - | Strg+Enter | 10 |
Atari | 00 59 | Shift+Atari | 00 59 | Alt+Atari | 00 59 | Strg+Atari | 00 59 |
Ist der Wert des Key-Codes 0 so handelt es sich um einen erweiterten Key-Code. Dieser ist zweistellig, so muß er ein weiteres mal ausgelesen werden.
*Dieser Scan-Code kann seltsames Verhalten der Software verursachen.
Einen direkten Zugang zur Tastatur bietet der Port 08000h. Jede der 63 Tasten des Portfolio besitzt einen eindeutigen “Make Code”, der beim Niederdrücken an der Portadresse 8000h erscheint. Beim Loslassen einer Taste geschieht dasselbe mit ihrem “Break Code”, der stets um 128 größer ist als der Make Code. Somit lässt sich jederzeit feststellen, welche Taste zuletzt niedergedrückt oder losgelassen wurde.
Taste | Make Code | Taste | Make Code |
---|---|---|---|
, | 38 | A | 62 |
- | 26 | B | 58 |
. | 52 | C | 56 |
/ | 61 | D | 5 |
0 | 24 | E | 19 |
1 | 2 | F | 40 |
2 | 3 | K | 47 |
3 | 4 | G | 35 |
4 | 34 | H | 41 |
5 | 6 | I | 25 |
6 | 7 | J | 42 |
7 | 13 | K | 47 |
8 | 46 | L | 39 |
9 | 15 | M | 60 |
; | 51 | N | 59 |
= | 53 | O | 12 |
links | 43 | P | 33 |
rechts | 44 | Q | 10 |
oben | 29 | R | 20 |
unten | 37 | S | 32 |
lShift | 27 | T | 21 |
rShift | 36 | U | 11 |
Fn | 54 | V | 57 |
Esc | 63 | W | 17 |
Enter | 22 | X | 55 |
Space | 50 | Z/Y | 23 |
Ä | 30 | Y/Z | 49 |
Ü | 28 | Alt | 9 |
\ / < | 48 | Atari | 0 |
+ / ] | 31 | BS | 14 |
Caps | 45 | Ctrl | 18 |
Del | 8 |
Port-Adressen
Ports sind Speicheradressen in denen das BIOS wichtige Daten für die Kommunikation mit den Schnittstellen ablegt. Eine Liste aller bekannten Port-Adressen des Portfolio:
Adresse | Beschreibung | |
---|---|---|
8000 | Tastatur: Scan-Code (Controller) | |
8010 | Datenregister des LCD-Controllers | |
8011 | Befehlsregister des LCD-Controllers | |
8020 | Daten-Register des Soundchips | |
8030 | Power-Management | |
8040 | Zähler | |
8051 | Batterie-Status (C2h=ok, 82h=leer) | |
8060 | Kontrastwert des Bildschirms | |
8070 | RX/TX der seriellen Schnittstelle | |
8071 | Interrupt enable der seriellen Schnittstelle | |
8072 | Interrupt identity der seriellen Schnittstelle | |
8073 | Line control der seriellen Schnittstelle | |
8074 | MODEM control der seriellen Schnittstelle | |
8075 | Line status der seriellen Schnittstelle | |
8076 | MODEM status der seriellen Schnittstelle | |
8077 | Scratch-Register der seriellen Schnittstelle | |
8078 | Port A der parallelen schnittstelle | |
8079 | Port B der parallelen schnittstelle | |
807A | Port C der parallelen Schnittstelle | |
807B | Kontroll-Register der parallelen Schnittstelle | |
807C | ROM-Extension enable | |
8080 | Peripheral ID |
Peripheral IDs
Die Peripheral-ID ist die Kennzeichnung eines angeschlossnen Zubehörs.
Es gibt 64 frei definierbare User-Interfaces ( PID 64…128) von denen nur wenige bekannt sind. Bekannte IDs bitte nachtragen!
ID | Interface | |
---|---|---|
000 | Communication-Card (BSE Universal Interface ) | |
001 | serielles interface | |
002 | paralleles interface | |
003 | Drucker | |
004 | HERMES VT52 Modem Interface | |
005 | reserved | |
….. | reserved | |
063 | reserved | |
064 | user peripheral | |
065 | user peripheral | |
066 | Portalog von IBP | |
067 | user peripheral | |
….. | user peripheral | |
100 | ATARIs Beispiel-Erweiterung (siehe Technical Reference Guide) | |
….. | user peripheral | |
111 | user peripheral | |
112 | MIDI Interface | |
113 | user peripheral | |
….. | user peripheral | |
125 | NETWORK 8000 Interface | |
126 | user peripheral | |
127 | IDE oder Portfolio Packet-Radio Interface | |
128 | File-transfer interface | |
129 | reserved | |
….. | reserved | |
255 | reserved |
BIOS-Datenbereich
Adresse | Länge | Inhalt | |
---|---|---|---|
03FC | 1 | Kontroll-Register des Ausgangs der seriellen Schnittstelle | |
03FD | 1 | I/O-Register der seriellen Schnittstelle | |
03FE | 2 | Status-Register des Eingangs der seriellen Schnittstelle | |
0413 | 2 | Freier Speicher in Kilobytes | |
0417 | 1 | Tastatur: Shift-Satus-Flag | |
0419 | 1 | Tastatur: Alt-Status Register | |
041A | 2 | Zeiger auf Anfang des Tastaturpuffers | |
041C | 2 | Zeiger auf Ende des Tastaturpuffers | |
1F40 | 2 | Tastatur:Scan-Code |
Interrupt-Vektor-Tabelle
Hard- und Software-Interrupts verzweigen (bei Aufruf oder Auftreten) zu den Adressen, die in der Interrupt-Vektor-Tabelle gespeichert sind. Die IVT befindet sich im untersten Adressraum: 0000:0000 bis 0000:03FF. Die Adressen sind in zwei Words (4 Bytes) im „little endian“-Format gespeichert, d.h. dass die niederwertigen Bytes voran stehen, erst Offset, dann Segment.
Durch „umbiegen“ (redirect) eines Vektors, kann man die Routinen des Betriebssystems durch andere ersetzen, dies ist wichtig, um das Verhalten des Betriebsystems beinflussen zu können.
Ohne dies, würde das Programm UPDATE.COM nicht funktionieren, es umgeht einige Systemfehler, in dem es die entsprechenden Interrupts umleitet, in eine neue (speicherresidente) Routine.
Ebenso lässt sich das Betriebsystem „bespitzeln“, in dem man die Codes an den entsprechenden Adressen disassembliert (z.B. mit DEBUG.COM).
Hier die IVT eines HPC-004 mit der BIOS-Version 1.072.
Int | Beschreibung | Adresse | Vektor | UPDATE.COM | PORTDIV.EXE | ALMBOOST.COM |
---|---|---|---|---|---|---|
00h | Teilung durch Null | 0000 | E000:0EEE | 03B2:0103 | ||
01h | Einzelschritt | 0004 | E000:24D7 | |||
02h | NMI (Speicherfehler) | 0008 | E000:1D06 | |||
03h | Breakpoint erreicht | 000C | E000:24D7 | |||
04h | Numerischer Überlauf | 0010 | E000:24D7 | |||
05h | Hardcopy | 0014 | E000:1F6C | |||
… | unbelegt … | |||||
08h | Timer | 0020 | E000:2A5B | |||
09h | Tastatur | 0024 | E000:1545 | |||
… | unbelegt … | |||||
10h | BIOS Video-Funktionen | 0040 | E000:2BF5 | |||
11h | BIOS Konfiguration | 0044 | E000:1DB4 | |||
12h | BIOS Speichergröße | 0048 | E000:1CFA | |||
13h | BIOS Speicherkarten | 004C | E000:0B20 | |||
14h | BIOS Serielle Schnittst | 0050 | E000:24DA | |||
15h | ??? | 0054 | E000:1CCC | |||
16h | BIOS Tastaturabfrage | 0058 | EB3E:005E | |||
17h | BIOS Parallele Schnitts | 005C | E000:1E02 | |||
18h | ROM-BASIC (error) | 0060 | E000:048F | |||
19h | Neustart (Strg_Alt_Entf) | 0064 | E000:0530 | |||
1Ah | Zeit/Datum Wecker (RTC) | 0068 | E000:0653 | |||
1Bh | Programmabruch | 006C | FF00:0562 | |||
1Ch | Aufruf nach jedem Int08 | 0070 | E000:24D7 | |||
… | unbelegt … | |||||
1Eh | Disk-Parameter-Tabelle | 0078 | 0040:01F4 | |||
… | unbelegt | |||||
20h | DOS Programm beenden | 0080 | E52D:32E0 | |||
21h | DOS Funktionen | 0084 | E52D:451C | 0366:016E | ||
22h | Adresse DOS Pgmm Ende | 0088 | F25C:026D | |||
23h | Adresse DOS Strg_Break | 008C | 0294:08BA | 0366:0175 | ||
24h | Adresse DOS Fehler | 0090 | 0294:08C4 | |||
25h | DOS Speicherkarte lesen | 0094 | E52D:05BF | |||
26h | DOS Speicherkarte schr. | 0098 | E52D:05C5 | |||
27h | DOS beenden, resident | 009C | E52D:32FB | |||
28h | Aufruf bei Tast.-polling | 00A0 | E52D:04BA | |||
29h | Zeichen Ausgeben | 00A4 | FF00:0555 | |||
2Ah | ??? | 00A8 | E52D:04BA | |||
… | unbelegt … | |||||
3Fh | unbelegt | |||||
… | unbelegt | |||||
41h | Disk-Parameter-Tabelle | 0104 | 0040:01F4 | |||
… | unbelegt … | |||||
4Ah | Alarmzeit errreicht | 0128 | FF9F:0227 | 0366:0167 | 0368:0167 | |
… | unbelegt … | |||||
5Fh | PORTGR.EXE graphics | 0176 | 0000:0000 | |||
… | unbelegt | |||||
60h | DIP AES | 0180 | EA0C:07DE | |||
61h | DIP BIOS | 0184 | E000:32E6 | 0366:0111 |
Die Tabelle kann von Gerät zu Gerät sehr unterschiedlich aussehen, je nachdem um welche BIOS-Version es sich handelt, und welche Programme gestartet wurden.
Wie man sieht, leitet UPDATE.COM vier Interrupts um (21h, 24h, 4Ah und 61h), PORTDIV.EXE, von Centennial Software, fängt den Fehler „Teilung durch Null“ ab indem es Int 00h auf eine Routine bei 03B2:0103 umleitet.
Um den tatsächlichen Vektor des aktuellen Geräts im aktuellen Zustand zu ermitteln, muss man nur die Tabelle auslesen. Die Tabelle ist 256*4 bytes lang (Int 00h…Int FFh, OFS:SEG) und beginnt bei der Adresse 0000:0000. Siehe Assembler-Programmierung zur Umleiting von Interrupts (Int 09h).
Programme, die Vektoren umleiten, sollten immer den ursprünglichen Vektor wiederherstellen können, sobald sie, oder ihr residenter Teil beendet werden.
LCD-Controller HD-61830
Der LCD-Controller wird durch Zugriffe auf die I/O-Adressen 8010h und 8011h gesteuert.
Befehlsliste
Befehle werden durch Angabe der Befehlsnummer im Kontroll-Register (8011h) mit dem im Daten-Register (8010h) angegebenen Wert ausgeführt.
00h | Mode-Byte lesen/setzen |
01h | Position des Zeichens |
02h | Zeichen pro Zeile |
03h | Vertikale Pixel |
04h | Cursor-Position |
05h | unbekannt/reserviert |
06h | unbekannt/reserviert |
07h | unbekannt/reserviert |
08h | Start-Adresse (LSB) des Bildschirms |
09h | Start-Adresse (MSB) des Bildschirms |
0Ah | Cursor-Adresse (LSB) |
0Bh | Cursor-Adresse (MSB) |
0Ch | Refresh schreiben (ASCII oder Bitmap) |
0Dh | Refresh lesen |
0Eh | Pixel löschen |
0Fh | Pixel setzen |
Mode-Byte
Portfolios BIOS schreibt bei jeden Refresh das Mode-Byte neu, Änderungen des Mode-Bytes sind also nur bis zum nächsten Refresh (Tastendruck, Timer-Tick, oder Aus- und Einschalten) wirksam.
Bit 0: | Character-ROM int/ext |
Bit 1: | Bildschirm-Modus Text/Grafik |
Bit 2: | Cursor-Modus ein/aus |
Bit 3: | Cursor-Modus statisch/blinkend |
Bit 4: | Master/Slave 1 |
Bit 5: | Betrieb ein/aus |
Bit 6: | null |
Bit 7: | null |
Die Parallel-Ports
Vier Ports dienen der Kommunikation mit dem UART 82C55, wie er in Portfolio´s intelligenter parallelen Schnittstelle verbaut ist. Er besitzt ein Kontrollregister (Port 807B) und 3 I/O Ports (8078, 8079 und 807A), die sich individuell als Ein- oder Ausgang konfigurieren lassen, Port C sogar separat für das höhere und niedere Nibble. Das Kontrollregister (807B) bestimmt wie die einzelnen Ports geschaltet sind.
Kontrollregister Port 807B | ||||||
---|---|---|---|---|---|---|
Wert | Ports | |||||
Hex | Dezimal | Port A | Port B | Port C (lo) | Port C (hi) | |
0080 | 128 | OUT | OUT | OUT | OUT | |
0081 | 129 | OUT | OUT | IN | OUT | |
0082 | 130 | OUT | IN | OUT | OUT | |
0083 | 131 | OUT | IN | IN | OUT | |
0088 | 137 | OUT | OUT | OUT | IN | |
0089 | 138 | OUT | OUT | IN | IN | |
008A | 139 | OUT | IN | OUT | IN | |
008B | 140 | OUT | IN | IN | IN | |
0090 | 144 | IN | OUT | OUT | OUT | |
0091 | 145 | IN | OUT | IN | OUT | |
0092 | 146 | IN | IN | OUT | OUT | |
0093 | 147 | IN | IN | IN | OUT | |
0098 | 152 | IN | OUT | OUT | IN | |
0099 | 153 | IN | OUT | IN | IN | |
009A | 154 | IN | IN | OUT | IN | |
009B | 155 | IN | IN | IN | IN |
Portfolio´s intelligente parallele Schnittstelle verwendet nur 17 der 24 möglichen Bits.
-Port A (8078) verfügt über alle acht Bits (0..7)
-Port B (8079) führt nur die unteren 4 Bits (0..3) heraus
-Port C (807C) führt 5 Bits (0,1, und 3..5) heraus
Im Normalzustand (Drucker) enthält das Kontrollregister den Wert 138 (089h), Port A und B auf Ausgang (Daten und Steuerung) und Port C auf Eingang (Acknowledge, Busy, Fehler…)
Port A | Port B | Port C | |||||
---|---|---|---|---|---|---|---|
Bit | Pin | Signal | Pin | Signal | Pin | Signal | |
0 | 2 | DATA0 | 1 | Strobe | 12 | Paper | |
1 | 3 | DATA1 | 14 | Autofeed | 13 | Select | |
2 | 4 | DATA2 | 16 | Init/Reset | - | - | |
3 | 5 | DATA3 | 17 | Select In | 15 | Error | |
4 | 6 | DATA4 | - | - | 11 | Busy | |
5 | 7 | DATA5 | - | - | 10 | Acknowledge | |
6 | 8 | DATA6 | - | - | - | - | |
7 | 9 | DATA7 | - | - | - | - |
Die Einschränkung auf 17 Bits ist Hardware-bedingt, Portfolio´s intelligente parallele Schnittstelle führt nicht alle Leitungen des 82C55 heraus. Softwareseitig werden alle 24 (3×8) Bits geschaltet. Eine Erweiterung der Schnittstelle, oder der Bau einer eigenen ermöglicht den Betrieb als 24-Bit I/O (3×8 oder 2×8+2×4).
Melody-Codes
Liste der Codes für die BIOS-Funktion 16h (Melodie-Töne) des Interrupts 61h (siehe Technical Reference Guide)
Note | Frequenz | Code |
---|---|---|
D#5 | 622,3 Hz | 30h |
E5 | 659,3 Hz | 31h |
F5 | 698,5 Hz | 32h |
F#5 | 740 Hz | 33h |
G5 | 784 Hz | 34h |
G#5 | 830,6 Hz | 35h |
A5 | 880 Hz | 36h |
A#5 | 932,3 Hz | 37h |
B5 | 987,8 Hz | 38h |
C6 | 1046,5 Hz | 39h |
C#6 | 1108,7 Hz | 3Ah |
D6 | 1174,7 Hz | 29h |
D#6 | 1244,5 Hz | 3Bh |
E6 | 1318,5 Hz | 3Ch |
F6 | 1396,9 Hz | 3Dh |
F#6 | 1480 Hz | 0Eh |
G6 | 1568 Hz | 3Eh |
G#6 | 1661,2 Hz | 2Ch |
A6 | 1760 Hz | 3Fh |
A#6 | 1864,7 Hz | 04h |
B6 | 1975,5 Hz | 05h |
C7 | 2093 Hz | 25h |
C#7 | 2217,5 Hz | 2Fh |
D7 | 2349,3 Hz | 06h |
D#7 | 2489 Hz | 07h |
undokumentierte Codes:
DTMF-Ton | Code |
---|---|
0 | 10h |
1 | 11h |
2 | 12h |
3 | 13h |
4 | 14h |
5 | 15h |
6 | 16h |
7 | 17h |
8 | 18h |
9 | 19h |
A | 1Ah |
B | 1Bh |
C | 1Ch |
D | 1Dh |
* | 1Eh |
# | 1Fh |
Klang | Code |
---|---|
Stumm | 80h |
Klick1 | 01h |
Klick2 | 10h |
Klick3 | A1H |
Klick4 | A3H |
Sound (?) | A4h |
weitere Melodie-Töne:
Code | Note |
---|---|
4Bh | zwischen A#5 (37h) und B5 (38h) |
49h | zwischen F#5 (33h) und G5 (34h) |
4Ah | zwischen G#5 (35h) und A5 (36h) |
2Eh | zwischen B6 (05h) und C7 (25h) |
2Ah | zwischen C6 (39h) und C#6 (3Ah) |
4Ch | zwischen D6 (29h) und D#6 (3Bh) |
2Bh | zwischen D#6 (3B) und E6 (3Ch) |
0Fh | zwischen G6 (3Eh) und G#6 (2CH) |
27h | zwischen C7 (25h) und C#7 (2Fh) |
Folgende Codes erzeugen Melodie-Töne mit einem Klick (Anschlag) am Anfang:
Code | Note |
---|---|
B2h | F5 (32h) |
B3h | F#5 (33h) |
B4h | G5 (34h) |
B5h | G#5 (35h) |
B6h | A5 (36h) |
B7h | A#5 (37h) |
B8H | B5 (38h) |
B9H | C6 (39h) |
BAH | C#6 (3Ah) |
BBH | D#6 (3Bh) |
BCH | E6 (3Ch) |
BDH | F6 (3Dh) |
BEH | G6 (3Eh) |
BFH | A6 (3Fh) |
Datei-Formate
Manche Datei-Formate sind unbestimmt. So kann z.B. eine Datei mit der Endung DAT alles mögliche enthalten, von Text im ASCII-Format bis hin zu Binär-Codes. Bei anderen erwartet der Portfolio eine ganz bestimmte Datenstruktur, wird diese nicht erfüllt so wird wahrscheinlich eine Fehlermeldung ausgegeben. Im folgenden sollen die wichtigsten Datei-Formate beschrieben werden.
DAT
Im System-Ordner auf Laufwerk C: legen die internen Anwendungen bis zu drei Dateien an:
- PERMDATA.DAT
- CLIPBORD.DAT
- UNDELETE.DAT
Diese Dateien werden beim Aufruf der internen Anwendungen in den Arbeitspeicher geladen. Veränderungen wärend der Arbeit werden nur in dieser RAM-Kopie durchgeführt, erst beim Verlassen einer Anwendung werden alle drei Dateien neu geschrieben.
- Die PERMDATA.DAT
Die PERMDATA enthält wichtige Daten über die System-Einstellungen und Parameter für die internen Anwendungen. Wenn eine interne Anwendung gestartet wird lädt sie meistens die zuletzt geladene bzw. gespeicherte Datei, die Information darüber entnehmen die Anwendungen der Datei PERMDATA.DAT die auf Laufwerk C: im System-Ordner angelegt ist. Sie hat immer eine Größe von 730 Bytes. Der Aufbau ist wie folgt:
Offset | Funktion | |
---|---|---|
000 | Wiederherstellen ein/aus | |
001 | Wiederherstellungsdaten speichern ja/nein | |
002 | Klemmbrett ein/aus | |
003 | Klemmbrett speichern ein/aus | |
004..006 | reserviert | |
Rechenblatt | ||
007 | Textrahmen, 0=aus, sonst an | |
008..056 | Pfad und Name der zuletzt verwendeten Datei | |
057 | automatisch laden, 0=ja, 255=nein | |
058..05B | dreistelliges, null-terminiertes Währung-Symbol | |
05C | anfänglicher Dezimaltrenner, 2Eh=“.„, 2Dh=“,„ | |
05D | Drucker: Standard-Papierbriete | |
05E..060 | reserviert | |
Terminplaner | ||
061 | Textrahmen, 0=aus, sonst an | |
062..0B0 | Pfad und Name der zuletzt verwendeten Datei | |
0B1..0B4 | reserviert | |
Text-Editor | ||
0B5 | Textrahmen, 0=aus, sonst an | |
0B6..104 | Pfad und Name der zuletzt verwendeten Datei | |
105..106 | oberste Zeile von Bildschirm 0 ist erste Zeile in Datei | |
107..108 | aktuelle Cursor-Zeile 0 ist erste Zeile | |
109..10A | Cursor-Spalte in aktueller Zeile | |
10B | rechter Rand | |
10C | Zeilenumbruch: 0=aus, sonst an | |
10D..10E | reserviert | |
Adressbuch | ||
10F | Textrahmen, 0=aus, sonst an | |
110..15E | Pfad und Name der zuletzt verwendeten Datei | |
15F..168 | Vorwahl in ASCII, null-terminiert | |
169..16F | reserviert | |
Taschenrechner | ||
170 | Textrahmen, 0=aus, sonst an | |
171..1BF | reserviert | |
1C0 | M1 Vorzeichen, wenn negativ dann Bit 7 gesetzt | |
1C1..1C2 | M1 Exponent, Wort mit Vorzeichen, 0:1.000⇐mant<2.000 | |
1C3..1CA | M1 Mantisse | |
1CB..1D5 | Memory 2 | |
1D6..1E0 | Memory 3 | |
1E1..1EB | Memory 4 | |
1EC..1F6 | Memory 5 | |
1F7 | Format: 0=allgemein, 1=dezimal, 2=wissenschaftlich, 3=technisch | |
1F8 | Stellen hinter dem Komma | |
1F9 | Trennzeichen: 0=keines, sonst Trennzeichen | |
1FA | Dezimaltrenner: 0=“.„, sonst “,„ | |
System-Einstellungen | ||
1FB | reserviert | |
1FC..24A | Pfad und Name der Druckzielatei | |
24B..24E | reserviert | |
24F | Druckziel: 0=parallel, 1=seriell, 2=Datei | |
250 | Zeilen pro Druckseite | |
251 | Länge des Drucker Setup-Codes | |
252..2D1 | Drucker Setup-Codes | |
2D2 | Drucker-Code für Zeilenende: 0=CR, 1=CR-LF, 2=CR-LF-LF | |
2D3 | Anzahl Zeilen für oberen Rand | |
2D4 | Anzahl Zeilen für unteren Rand | |
2D5 | Zeichen-Indentierung für linken Rand | |
2D6 | Serielle Schnittstelle: Baudrate, 0=110, 1=150 … 7=9600 | |
2D7 | Serielle Schnittstelle: Parität, 0=keine, 1=ungerade, 3=gerade | |
2D8 | Serielle Schnittstelle: Datenbits, 2=7Bits, 3=8Bits | |
2D9 | Serielle Schnittstelle: Stop-Bits, 0=1Stoppbit, 1=2StoppBits |
- Die CLIPBORD.DAT
Wenn sie im System-Menü unter Programme das Sichern des Klemmbretts eingeschaltet haben wird der Inhalt des Klemmbretts in dieser Datei gespeichert. Sie kann maximal 8KB groß werden. Sie besteht aus einem einzigen großen Textblock der mit Null terminiert ist. Zeilenumbrüche werden als 0Dh (ASCII(013)) gespeichert (ohne das folgende 0Ah (ASCII(010)).
Ist die Datei nicht Null-terminiert kann sie nicht ins Klemmbrett zurückgeladen werden, das selbe gilt für den Fall, dass sie größer als 8KB ist. Wird die Datei aus diesen Gründen nicht zurückgelesen, so wird sie beim Verlassen der Anwendung durch eine frische Datei überschrieben.
Hat die CLIPBORD.DAT das normale Text-Format (0Dh,0Ah), so kann sie nur in der Textverarbeitung oder im Terminplaner ins Klemmbrett zurückgelesen werden.
Man braucht sich über diese Einschränkungen keine Sorgen zu machen, da die Anwendungen diese Datei recht gut verwalten. Sollten sie aber mit eigener Software auf sie zugreifen, so ist dies unbedingt zu berücksichtigen!
- Die UNDELETE.DAT
Wenn sie im System-Menü unter Programme das Wiederherstellen eingeschaltet haben werden alle gelöschten Zeichen oder Blöcke aller Anwendungen in die Datei C:\SYSTEM\UNDELETE.DAT geschrieben. Sie besteht aus mehreren Datenblöcken. Jeder Block besteht aus einer Anzahl Zeichen die mit einem einzelnen Befehl gelöscht wurden. Jeder Block hat folgendes Format:
Daten Länge Richtung
Die Daten sind die gelöschten Zeichen (Zeilenumbrüche werden als 0Dh, nicht 0Dh 0Ah, gespeichert), Länge ist die Anzahl der Zeichen im Block und Richtung ist 0 wenn nach links gelöscht wurde (z.B. mit der Korrekturtaste) und 1 wenn nach rechts gelöscht wurde (z.B. mit Entf).
Die UNDELETE.DAT kann maximal 2000 Byte groß werden. Ist die maximale Größe erreicht gehen die zuerst gelöschten Daten nach und nach verloren und die neuesten werden hinzugefügt.
Wenn die UNDELETE.DAT nicht das richtige Format hat kann dies unvorhersehbare Auswirkungen haben, wahrscheinlich wird kein Zugriff auf die Daten möglich sein.
TXT
In Prinzip lädt der eingebaute Text-Editor alles was man ihm sagt, allerdings kann dies bei gewissen Dateien zu unvorhersehbaren Ergebnissen führen. Am besten kann der Text-Editor mit reinen ASCII-Dateien umgehen, die Standarderweiterung für diese Dateien ist TXT. Wenn man im FileManager (FM.COM) eine Datei mit der Endung TXT auswählt, so wird diese automatisch in den Text-Editor geladen. Die einzigen Dinge die man berücksichtigen sollte sind, dass diese Dateien nur ASCII-Zeichen größer als ASCII(031) (siehe Tabelle) enthalten, nicht größer als 64 Kilobytes sind und möglichst nicht mit einem Zeilenvorschub und einer Leerstelle enden, dies kann bei BIOS-Versionen vor 1.072 ohne UPDATE.COM zu einem Absturz des Rechners führen. Wenn sie im Text-Editor die Eingabetaste drücken wird ein Zeilenumbruch mit Wagenrücklauf (CR-LF) eingefügt (ASCII(013) gefolgt von einem ASCII(010)). Der automatische Wortumbruch fügt weitere Zeilenumbrüche ein. Wenn sie eine *.TXT-Datei speichern wärend der Wortumbruch aktiv ist, so speichert der Text-Editor diese mit ab. Verändern sie später die Einstellung für den rechten Rand, so entfernt der Editor diese Wagenrückläufe wieder und platziert sie an der entsprechenden Stelle. Hierfür sucht er nach der Bytefolge 20h 0Dh 0Ah (also eine Leerstelle gefolgt von einem Zeilenumbruch). Wollen sie die automatischen Wortumbrüche gänzlich entfernen, so geben sie zuerst bei eingeschaltetem Umbruch eine Rechten Rand von 250 (mehr geht nicht) ein und schalten sie den Umbruch dann aus. Es ist unwahrscheinlich, dass sie eine Zeile eingegeben haben die länger als 250 Zeichen ist. Enthält eine Text-Datei absichtlich die Folge 20h 0Dh 0Ah so geht der Zeilenumbruch beim Einschalten des Wortumbruchs verloren!
ADR
Portfolio´s Adress-Dateien sind eigentlich Text-Dateien, man kann sie im Text-Editor erzeugen, laden, editieren und Speichern. Man kann auch jede Text-Datei in das Adressbuch laden, ein unerwünschter Effekt: die Zeilen werden alfabetisch sortiert. Damit das Adressbuch die Einträge auseinander halten kann müssen sie lediglich durch eine Leerzeile getrennt sein.
Beate (0034)987654
In der Kurve 2
Adele (0012)347856
Gerade Straße 1
Diese Text-Datei würde in der Adressverwaltung folgendermaßen aussehen:
Adele (0012)347856
Beate (0034)987654
Damit die Adressverwaltung die Nummern wählen kann müssen sie in dem im Hanbuch angegebenen Format eingegeben werden.
Adress-Dateien werden vom Adressbuch mit zwei Nullen terminiert.
WKS
Wer eine detaillierte Beschreibung des Work-Sheet-Formats erwartet hat muss auch hier enttäuscht werden. Dieses Format ist so komplex, dass es den Rahmen dieser Beschreibung sprengen würde. Es handelt sich um ein nicht Portfolio-spezifisches Format, es ist das Format des bekannten Rechenblatts Lotus 1-2-3. Dieses Format wird in dem Buch von Addison-Wesley „File-Formats“ beschrieben. Sei an dieser Stelle gesagt, dass es sich beim Portfolio grundsätzlich um die Lotus-Version 1A oder auch 2 handelt, mit folgenden Einschränkungen:
-Grafik-Informationen in einer *.WKS werden ignoriert.
- Folgende Lotus- Befehle und Funktionen werden vom Portfolio nicht erkannt:
- Datenbankstatistik: @DMITTELWERT @DDB @DANZAHL @DMAX @DMIN @DSTDABW @DSUMME @DVAR
- Stringmanipulation: @ZEICHEN @LEEREN @KODE @GENAU @FINDE @ISTZAHL @ISTZEICHENKETTE @LINKS @UNTERER @MITTE @N @SAUBER @WIEDERHOLE @ERSETZE @RECHTS @S @ZEICHENKETTE @TRIMME @OBERER @WERT
- Weitere: @ZELLZEIGER @ZELLE @SPALTEN @CTERM @STUNDE @MINUTE @REIHEN @RATE @SEKUNDE @SLN @SYD @TERM @ZEIT
Findet der Portfolio eine ihm unbekannte Funktion so wird sie durch die Funktion @FEHLER ersetzt.
Eine „leere“ *.WKS-Datei ohne Name (bzw. UNNAMED.WKS) hat bereits eine Größe von 67 Bytes und sieht mit PDUMP betrachtet so aus:
00001¦00 00 02 00 04 04 02 00 ¦..☻.♦♦☻. 00009¦01 00 FF 29 00 01 00 27 ¦☺. ).☺.´ 00017¦06 00 08 00 00 00 00 00 ¦♠....... 00025¦00 00 00 00 07 00 1F 00 ¦......▼. 00033¦00 00 00 00 F1 00 09 00 ¦....±... 00041¦04 00 14 00 00 00 00 00 ¦♦.¶..... 00049¦00 00 00 00 00 00 00 00 ¦........ 00057¦04 00 04 00 48 00 00 01 ¦♦.♦.H..☺ 00065¦00 00 00 00 00 00 00 00 ¦........
Geben wir in der Zelle A1 das Wort „Spalte1“ ein hat die *.WKS eine Größe von 85 Bytes und sieht folgendermaßen aus:
00001¦00 00 02 00 04 04 02 00 ¦..☻.♦♦☻. 00009¦01 00 FF 29 00 01 00 27 ¦☺. ).☺.´ 00017¦06 00 08 00 00 00 00 00 ¦♠....... 00025¦00 00 00 00 07 00 1F 00 ¦......▼. 00033¦00 00 00 00 F1 00 09 00 ¦....±... 00041¦04 00 14 00 00 00 00 00 ¦♦.¶..... 00049¦00 00 00 00 00 00 00 00 ¦........ 00057¦04 00 04 00 48 00 00 0F ¦♦.♦.H..☼ 00065¦00 0E 00 00 00 00 00 00 ¦.♫. .... 00073¦27 53 70 61 6C 74 65 31 ¦´Spalte1 00081¦00 01 00 00 00 00 00 00 ¦.☺......
DRY
Die Datei-Endung DRY ist für Dateien des Terminplaners reserviert. Die Dateien sind dim ASCII-Format gespeichert. Egal welche Spracheinstellungen im System vorgenommen wurden, das Format für Datum und Uhrzeit sind immer englisch.
Im Prinzip ist die Datei-Struktur so wie man sie im Zeitplaner sieht: Ist es der erste Eintrag am Tag, so steht zuerst das Datum. In der nächsten Zeile steht, falls eine Weckfunktion eingestellt ist, zuerst das Wiederholungszeichen(t für täglich, w für wöchentlich, a für arbeitstäglich, m für monatlich oder j für jährlich) falls es eine sich wiedrholende Weckfunktion ist, dann der Klammeraffe (@), nicht das Notensymbol, und zulezt der entsprechende Text.
Zum Beispiel die Datei DIARY.DRY eines „Pechvogels“:
──────────── Mi 15 Mär 2006 16:45 ── 27 Feb 1999 Sa j♫ 22:57 Geb. Mama 15 Mär 2006 Mi 16:30 Mama abholen
sieht mit PDUMP folgendermaßen aus:
00001¦20 20 20 32 37 2F 30 33 ¦ 27/03 00009¦2F 39 39 0D 0A 20 79 40 ¦/99.. j@ 00017¦20 32 32 3A 35 37 20 47 ¦ 22:57 G 00025¦65 62 2E 20 4D 61 6D 61 ¦eb. Mama 00033¦0D 0A 20 20 20 31 35 2F ¦.. 15/ 00041¦30 33 2F 30 36 0D 0A 20 ¦03/06.. 00049¦20 20 20 31 36 3A 33 30 ¦ 16:30 00057¦20 4D 61 6D 61 20 61 62 ¦ Mama ab 00065¦68 6F 6C 65 6E 00 00 00 ¦holen...
Sind also keine Weckfunktionen aktiv steht an Stelle des Weckzeichens ein Leerzeichen ASCII(032).
Interessant ist, man kann eine *.DRY mit dem Text-Editor schreiben ohne die korrekte Reihenfolge zu berücksichtigen, oder irgendwo einen neuen Eintrag schreiben, der Zeitplaner sortiert sie beim Laden chronologisch. Wurde eine *.DRY in englischer Sprache geschrieben, die Wiederholungszeichen sind also nicht t, w, a, m, und j, sondern d, w, n, m und y, so werden diese Zeichen beim Laden in die derzeitig eingestellte Systemsprache übersetzt. Wahre Portfolio-Software ist eben multilingual.
Nicht vergessen: wie im Handbuch beschrieben wird nur die DIARY.DRY im Systemverzeichnis von Laufwerk C: Weckfunktionen auslösen. Beim Speichern prüft der Zeitplaner die Datei auf anstehende Weckzeiten und stellt die Alarmfunktion in das System.
PGT
Seltsamerweise steht für PGT Portfolio Graphics Text. Mit Grafik hat es aber wenig zu tun, der Bildschirm bleibt im Textmodus. PGT-Dateien sind nichts anderes als eine Kopie des sichtbaren Text-Bildschirmes. Die Zeichen werden 1:1 in die Datei übertragen, immer der ganze Bildschirm. *.PGTs sind also immer (40×8) 320 Bytes groß. Sie enthalten nur die sichtbaren Zeichen, also Wagenrückläufe (ASCII(013)) oder Zeilenvorschübe (ASCII(010)) entfallen. Der Vorteil ist, dass man auf diese Weise gesamte Bildschirme mit hoher Geschwindigkeit darstellen und sichern kann.
PGF
Portfolio Graphics File. Portfolio´s natives Grafikformat. So wie PGTs Textbildschirme enthalten, so enthalten PGF-Dateien eine Kopie des Grafik-Videospeichers (VRAM bei Offset B0000h). Die Pixel werden horizontal in Bytes dargestellt (8 Pixel pro Byte). Folglich haben sie eine Größe von (64×240/8) 1920 Bytes. Das Pixel in der oberen linken Ecke ist das höherwertige Bit des ersten Bytes, das Pixel der unteren rechten Ecke ist das niederwertige Bit des letzten Bytes. So ergibt das Byte 21 (=(2^0)+(2^2)+(2^4)) folgendes Muster:
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
█ | █ | █ |
Nach den ersten 30 Bytes ist die obere Bildschirmzeile voll. Die zweite Zeile beginnt bei Byte Nr. 31, die dritte bei
Byte Nr. 61 usw. bis mit der 64sten Zeile der Bildschirm voll ist. Ein PGF besteht also aus 64 Pixel-Zeilen á 30 Bytes (=1920 Bytes).
PGC
Portfolio Graphics Compressed. PGF-Dateien sind immer gleich groß (1920 Bytes), egal wie komplex die Grafik ist. Dies ist meistens Platzverschwendung. Durch Komprimierung lassen sich zwischen 20% und 80% einsparen. Allerdings kann es passieren, dass die Datei, wenn sie sehr komplex ist größer wird. Dies ist zum Beispiel bei Fotos der Fall.
Das Format besteht aus einem Header und einigen Datenblöcken:
-Der Header
Die ersten drei Bytes sind die File-ID „PG1“ (50h 47h 01h).
-Die Daten
Die Bild-Daten bestehen aus Index-Bytes gefolgt von Daten Bytes. Das Index-Byte sagt dem Dekoder wie er die folgenden Daten zu behandeln hat. Ausschlaggebend ist ob das höherwertige Bit gesetzt ist oder nicht. Die maximale Anzahl der darauf folgenden Bytes ist 127.
-Bit gesetzt:
Ist das höherwertige Bit des Index-Bytes gesetzt so bestehen die folgenden Daten aus identischen Bytes. Die restlichen 7 Bits geben an wie oft dieses Byte wiederholt wird.
Beispiel:
86 FF index Daten-Byte
Das höherwertige Bit des Index Bytes ist gesetzt, die restlichen Bits stellen die Zahl 6 dar.
Das bedeutet, dass das Daten-Byte (FF) 6 mal wiederholt wird.
-Bit nicht gesetzt:
Ist das höherwertige Bit nicht gesetzt heißt das, dass die folgenden Daten eine Kette unterschiedlicher Bytes
ist, die so gelassen werden soll wie sie ist.
Beispiel:
0A FF 01 10 09 1A BB CE D0 FF 1A index Daten-Bytes
Das höherwertige Bit ist nicht gesetzt, die darauf folgenden 10 Bytes sollen so bleiben wie sie sind.
Das war´s auch schon. Je mehr Wiederholungen in den Bild-Daten enthalten sind, desto kleiner wird die Datei. Einen Dekoder zu programmieren ist sicherlich einfacher als einen Enkoder.
PGX
PGX-Dateien sind als Grafik-Animationen für den Portfolio bekannt. Aber eigentlich können sie viel mehr, das ist zumindest die Absicht. PGX-Dateien können von Programmen verwendet werden die laufende Demos, Grafik-Bibliotheken oder einfach nur mehrere Grafik und Text Seiten benötigen.
Das Format ist aber keineswegs geschlossen, zukünftige Entwicklungen sollen das Einbinden ausführbarer Programme ermöglichen.
Das PGX-Format besteht aus einem Header und mehreren Frames.
-Der Header:
Der Header besteht aus 8 Bytes, 3 für die ID „PGX“, eins für die Version (bisher immer 1) und weitere 4 für zukünftige Entwicklungen (normalerweise alle 0).
-Die Frames:
Es gibt bislang 4 Frame-Typen:
Typ | Bedeutung | |
---|---|---|
00h | PGC-Frame | |
01h | PGT-Frame | |
FEh | Anwendungs-Frame | |
FFh | EOF-Frame |
Ein Frame besteht wiederum aus einem Header und den Frame-Daten. Je nach Frame-Typ sieht der Header folgendermaßen aus:
-Der PGC-Frame-Header:
Bytes | Bedeutung | |
---|---|---|
1 | Frame-Typ=0 | |
2 | Größe in Bytes | |
1 | Steuerung | |
1 | Parameter 1 | |
1 | Parameter 2 | |
1 | Parameter 3 | |
1 | Parameter 4 |
Der Frame-Typ für PGC-Files ist 0. Die Größe bezieht sich auf die Länge des Datenblocks (ohne Header). Das Steuerungsbyte ist eines der folgenden:
Byte | Bedeutung | |
---|---|---|
00h | keine Steuerung | |
01h | warte auf Tastendruck | |
02h | warte n Sekunden |
Die Anzahl Sekunden steht im Parameter 1.
Nach den 8 Bytes PGC-Header folgen die Daten dessen Länge mit der im Header angegebenen Größe übereinstimmen muß.
-Der PGT-Frame-Header:
Entspricht dem PGC-Frame-Header, mit dem Unterschied, dass die Datenlänge immer 320 Byte ist (40×8).
-Der Anwendungs-Frame-Header:
Es gibt so viele unterschiedliche Anwendungen, dass es wenig sinnvoll ist eine Header-Spezifikation zu definieren. Auf eines der Felder kann man allerdings nicht verzichten, die Datengröße. Dieses Feld ist wichtig damit das ausführende Programm das Frame gegebenenfalls überspringen kann.
-Der EOF-Frame-Header:
Entspricht auch dem PGC-Frame-Header, allerdings wird derzeitig nur das Typ-Feld (Typ FFh) verwendet. Jede PGX-Datei sollte mit einem EOF-Frame enden, somit kann das ausführende Programm schneller durchgeführt werden weil es beim lesen nicht das Datei-Ende im Auge behalten muß.
Das PGX-Format ist frei. Sollten sie allerdings Ergänzungen vornehmen setzen sie sich bitte mit den Autoren in Verbindung damit diese Ergänzungen richtig eingebunden werden und es keine Konflikte mit anderen Erweiterungen gibt. Die Autoren sind unter folgenden Adressen zu erreichen:
Donald Messerli
Software Vineyard
CompuServe: 72500,1671
GEnie: D.MESS
BJ Gleason
Thin Air Labs
CompuServe: 75300,2517
FNT
FNT-Files sind Dateien die Bitmaps für grafische Schriftzeichen enthalten. Es gibt bereits verschiedene Arten
von Font-Files, diese sind aber meistens für PCs gedacht und Programme die sie verwenden laufen nicht auf dem
Portfolio. Vor Jahren definierte der tschechische Portfolioclub ein Font-File Format für den Portfolio. Diese
Dateien tragen ebenfalls die Endung FNT, enthalten aber eine Kennung (die ersten zwei Bytes) die klarstellt, dass es sich um Portfolio-Fonts handelt.
Alle Zeichen eines Satzes haben die selbe Größe in Vertikalen und horizontalen Pixels. Die kleinst mögliche
Größe ist 1×1 Pixel (wenig sinnvoll) und die größte ist 16×64 Pixel. Jede Bitmap wird in Bytes oder Words
gespeichert, je nachdem wie breit (horizontale Pixels) sie ist.
zB.:
Pixel | Bytes | |
---|---|---|
4×6 | 6 | |
6×6 | 6 | |
6×8 | 8 | |
8×8 | 8 | |
12×12 | 24 | |
12×16 | 32 | |
16×16 | 32 | |
16×27 | 54 | |
usw. |
Jede *.FNT-Datei für den Portfolio besteht aus einem 16-Byte Header der die Eigenschaften des Zeichensatzes beinhaltet, gefolgt von den eigentlichen Bitmaps.
Der Header:
Offset | Länge | Bedeutung | |
---|---|---|---|
0 | 2 | Dateikennung „PF“ | |
2 | 8 | 8 Bytes Benutzer-Text | |
10 | 1 | 0-Terminierung | |
11 | 1 | reserviert | |
12 | 1 | reserviert | |
13 | 1 | Breite | |
14 | 1 | Höhe | |
15 | 1 | Anzahl Zeichen (max 255) |
Beispiel für den Anfang eines Font-Files (zum assenblieren):
DB 'PF' ;PF Kennung DB '895 6x8 ',00 ;Benutzer-Text - Zeichensatz PC895 in 6*8 Matrix DB 00,00 ;reserviert DB 06 ;6 Pixel breit DB 08 ;8 Pixel hoch DB 255 ;255 definierte Zeichen DB 000,000,000,000,000,000,000,000 ;Bitmap DB .......
Die Software kann den benötigten Speicherplatz für die Bitmaps folgendermaßen errechnen (der benötigte
Speicherplatz wird in AX ausgegeben):
FNTHEAD DB DUP 16 (?) ;zuerst die ersten 16 Byte der Datei hier hin kopieren MOV SI,OFFSET FNTHEAD MOV AL,[SI+14] ;Zeichenhöhe MOV BL,[SI+15] ;Anzahl Zeichen MUL BL ;gesamt Bytes MOV BL,[SI+13] ;Zeichenbreite CMP BL,8 ;Bytes oder Words JNA LABEL1 SHR AX,1 ;wenn Word, dann mal 2 LABEL1: ;Anzahl Bytes in AX