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
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
|
#[1]OS/2 Museum » Feed [2]OS/2 Museum » Comments Feed [3]OS/2 Museum »
A Brief History of Unreal Mode Comments Feed [4]alternate [5]alternate
[6]alternate
[7]OS/2 Museum
OS/2, vintage PC computing, and random musings
[8]Skip to content
* [9]Home
* [10]About
+ [11]Wanted List
* [12]OS/2 History
+ [13]OS/2 Beginnings
+ [14]OS/2 1.0
+ [15]OS/2 1.1
+ [16]OS/2 1.2 and 1.3
+ [17]OS/2 16-bit Server
+ [18]OS/2 2.0
+ [19]OS/2 2.1 and 2.11
+ [20]OS/2 Warp
+ [21]OS/2 Warp, PowerPC Edition
+ [22]OS/2 Warp 4
+ [23]OS/2 Timeline
+ [24]OS/2 Library
o [25]OS/2 1.x SDK
o [26]OS/2 1.x Programming
o [27]OS/2 2.0 Technical Library
+ [28]OS/2 Videos, 1987
* [29]DOS History
+ [30]DOS Beginnings
+ [31]DOS 1.0 and 1.1
+ [32]DOS 2.0 and 2.1
+ [33]DOS 3.0, 3.1, and 3.2
+ [34]DOS 3.3
+ [35]DOS 4.0
+ [36]DOS Library
* [37]NetWare History
+ [38]NetWare Timeline
+ [39]NetWare Library
* [40]Windows History
+ [41]Windows Library
* [42]PC UNIX History
+ [43]Solaris 2.1 for x86
[44]<- USB 0.9
[45]ANOMALY: meaningless REX prefix used ->
A Brief History of Unreal Mode
Posted on [46]June 15, 2018 by [47]Michal Necasek
After a run-in with a particularly crazy manifestation of unreal mode
(Flat Assembler, or [48]fasm), I decided to dig deeper into the history
of this undocumented yet very widely used feature of 32-bit x86
processors.
For the purposes of this discussion, unreal mode is a variant of the
x86 real mode with non-standard segment limits and/or attributes,
different from the processor state at reset. To recap, real mode on the
286 and later CPUs has much more in common with protected mode than
with the real (and only) mode of the 8086. Notably, undefined opcodes
raise exceptions, segment limit overruns cause general protection or
stack faults, and (on the 386 and later) 32-bit registers and 32-bit
addressing can be used--subject to limit checks.
The origins of unreal mode are shrouded in the mists of time. But
enough is known that certain outlines are quite clearly defined. Let's
present a rough timeline of unreal mode.
* 1985--the Intel 386 became available in silicon. Like the 286, the
386 was not designed to switch from protected back to real mode.
Intel's idea was presumably that users should either leave the 386
in real mode, reset the CPU to get back to it (like a 286), or use
the 386's new V86 mode. This may sound like a crazy claim, but it's
not. In the October 15, 1991 issue of PC Magazine, page 436
("Stepping Up"), Jeff Prosise [49]wrote quite clearly: "The very
first 80386 chips that rolled off the line (A-step chips) could not
be switched from protected to real mode." Indeed the confidential
Intel iAPX 386 Architecture Specification, revision 1.8 from June
1985, had only this to say on the subject of switching from
protected back to real mode: "Disabling protection by loading a 0
into the PE bit in CR0 (assuming the current value is 1) will have
unpredictable effects." In other words, the original 386 design
tracked the 286: in real mode, segment limits and attributes retain
their initial reset values and cannot be changed.
* 1985?--someone or someones (Microsoft? Compaq?) convinced Intel to
relent and allow switching from protected to real mode by clearing
the PE bit in control register CR0; this was no doubt inspired by
the headaches the 286 was causing. It is unclear if there was
actual silicon change or only a documentation change. While a
transition to V86 mode always carefully loads all segment
registers, making any funny business impossible, the act of
clearing the PE bit in CR0 does almost nothing. It affects future
segment register loads in real mode, it affects interrupt and
exception dispatching, but it has near zero impact on the immediate
CPU state. Crucially, it does not change the current segment limits
or attributes, which allows the currently executing code to
continue running. Note that the I/O Permission Bitmap (applicable
in protected mode) was an even later addition to the 386 design.
* October 1985--The 386 datasheet (80386 High Performance
Microprocessor with Integrated Memory Management, Intel order no.
231630-001), says in section 2.3.5: "In Real Address Mode, only the
base address is updated directly (by shifting the selector value
four bits to the left) [when loading segment registers], since the
segment maximum limit and attributes are fixed in Real Mode." In
section 2.3.4, the document says: "In Real Address Mode, the
maximum segment size is fixed at 64 Kbytes." In other words, this
document both explains why unreal mode works and claims that it
does not exist. The datasheet also declares in section 2.3.6 that
switching back to real mode is possible, but no additional detail
is given: "If PE [bit in CR0 register] is reset, the processor
operates again in Real Mode. PE may be set by loading MSW or CR0.
PE can be reset only by a load into CR0."
* January 8, 1986--Intel writes a confidential memo titled Returning
to real mode on the 80386. This memo explains not only how to set
up a canonical real-mode environment on return from real mode, but
also why it is necessary: "While operating in REAL mode, the 80386
uses exactly the same memory management functions as in protected
mode. However, when the part resets into real mode the values
loaded into the descriptors appear as if they were 8086 style
segments. In real mode, when a segment register is loaded, only the
base field is changed, in particular the value placed into the base
is selector*16. Since only the base is changed, it is necessary to
set the access rights while still in protected mode." The memo
proceeds to explain the required segment attribute setup,
information which appeared in the official 1986 PRM (Programmer's
Reference Manual) for the 80386. What the memo also says, and the
PRM does not, is that the code segment (CS) cannot be made writable
in protected mode, but "an architectural feature reloads real mode
attributes into the CS descriptor during real mode far jumps". This
memo explains real-mode operation of the 386 far better than the
official documentation, and serves unreal mode on a silver platter
to anyone willing to experiment even just a little.
* April 1986--The updated 386 datasheet, Intel order no. 231630-002,
offers a tantalizing hint of unreal mode in section 2.3.6:
"Resetting the PE bit [in CR0] is typically part of a longer
instruction sequence needed for proper transition from Protected
Mode to Real Mode." The quoted text was not present in the original
October 1985 edition of the datasheet, and presumably refers to the
information first published in the Jan '86 memo.
* 1986--The 1986 Intel 80386 Programmer's Reference Manual says that
to switch from protected to real mode, the programmer must among
other things transfer control to a code segment with 64K limit, and
load SS, DS, ES, FS, and GS segment registers with selectors that
have a 64K limit, are byte granular, expand-up, writable, and
present. Only then can CR0.PE be cleared. In other words, Intel was
practically begging programmers to see what happens when they don't
do that. The PRM publishes the how-to information from the Jan '86
memo, but none of the background explanation.
* 1987--In the 1987 edition of the 80386 System Software Writer's
Guide (Intel order no. 231499-001), in section 9.2 on page 9-3 (4th
para), Intel hints: "Because, except for base address, descriptor
register values cannot be loaded in real mode, 8086-compatible
attributes must be loaded into the data segment descriptor
registers before switching to real mode."
* January 15, 1988--Phoenix 386 BIOS with this date employs unreal
mode to emulate some aspects of the 286 LOADALL instruction, by
returning to real mode with segment bases not corresponding to the
segment register value. The date is tentative; this was the oldest
386 BIOS using this technique available for analysis. More below.
* August 4, 1988--Microsoft adds 386 "Big Mode" or "Real Big Mode"
code to implement 386 extended memory moves in HIMEM.SYS 2.04.
Microsoft's method is quite clever, using an exception handler to
recover from anyone resetting the segment limits behind HIMEM's
back. Extended memory copying can thus be run with interrupts
enabled, with no impact on interrupt latency (that was a
significant problem on 286 CPUs). The term "unreal mode" is not
used. This change can be dated exactly, thanks to comments in
HIMEM.ASM. At the same time, LOADALL support was added to the HIMEM
286 extended memory move.
* August 15, 1988--Microsoft makes an archive of the HIMEM.SYS 2.04
source code, with LOADALL usage removed but unreal mode code left
in place. It is unclear how widely this code was distributed at the
time. In 1992, the source archive from 1988 was published on
Softlib as part of [50]XMS.EXE, which contains the new XMS 3.0
specification. In the late 1980s and early 1990s, Microsoft
published the HIMEM.SYS source code together with the XMS 2.0
specification (the first published version was 2.01, before the
unreal mode code was added).
* February 7, 1989--Microsoft [51]publishes HIMEM.SYS version 2.06
source code as XMS20.ARC; unlike the previous release, this one
produces an exact match of the official binary, because the source
code includes 386 Real Big Mode and 286 LOADALL (yes, really!)
support.
* March 21, 1989--Microsoft publishes an updated HIMEM.SYS version
2.06 source archive as S12023.EXE, formerly XMS20.ARC. This one
[52]survived to the present. Although the 1989 source code releases
were public, they seem to have gone more or less completely
unnoticed.
* 1989--In the 386 SX Microprocessor Programmer's Reference
Manual (order no. 140331-001), section 14.5 (Switching Back to
Real-Address Mode), Intel drops another big hint. To the paragraph
describing how to load segment registers when transitioning from
protected back to real mode, the following sentence is added: "Note
that if the segment registers are not reloaded, execution continues
using the descriptors loaded during protected mode." The same text
is also added to the updated 1990 edition of the 386 DX PRM, and
appears in the 1990 i486 PRM and all subsequent Intel programming
manuals.
* November 1989--In the November/December issue of Programmer's
Journal, Thomas Roden (a software engineer at AST Research, one of
the big PC OEMs) publishes an article titled Four Gigabytes in Real
Mode (page 89). This is the oldest known public description of
unreal mode, although the term "unreal mode" is never used. Unreal
mode is described, including the exception handler technique to
handle other code resetting the segment limits. Thanks to his
position at AST Research, Mr. Roden was already able to confirm
that unreal mode works not only on the 386DX and SX, but also on
the then-brand-new Intel 80486. The article mentions that it may be
possible to set the D-bit of the code segment to run in real mode
with 32-bit CS. There is no explicit mention or even a hint that
Mr. Roden was aware that HIMEM.SYS was already using unreal mode.
* January 1990--In the German c't magazine, Harald Albrecht publishes
an article titled Grenzenlos: Vier Gigabyte im Real Mode des 80386
adressieren (Boundless: Addressing four gigabytes in 80386's real
mode). Mr. Albrecht suggests that the 386 documentation directly
challenges programmers to not follow the prescribed
return-to-real-mode method exactly. The article is notable for
documenting that in real mode, a far jump partially changes CS
attributes, and also that after a switch to/from protected mode, a
near jump is sufficient to flush the prefetch queue (a far jump is
not necessary). Mr. Albrecht does not name the non-standard real
mode but presents a TSR which implements a fast INT 15h/87h block
move routine which uses 4GB selector limits, runs with interrupts
enabled, and does not disable the A20 gate when done. The author
incorrectly claims that (paraphrasing) no one needs the A20 gate
disabled, something that others learned the hard way not to be
true. Mr. Albrecht also notes that the segment limit extension
technique is unusable in V86 mode, and that 32-bit code or stack
segments are not practical due to corruption of the high word of
EIP/ESP. The article was probably written at about the same time as
Mr. Roden's PJ article; it may be an independent discovery,
although Mr. Albrecht's earlier article in the November 1989 issue
of c't (Odyssee im Adressraum) explicitly mentions the HIMEM.SYS
source code provided in Microsoft's XMS Developer's Kit.
* July 1990--In the July 1990 issue of Dr. Dobb's Journal, Al
Williams publishes an article titled DOS + 386 = 4 Gigabytes! (page
62), again describing unreal mode. The article is by all
appearances another independent discovery of unreal mode, as there
are no hints Mr. Williams was aware of either HIMEM.SYS or the
Nov/Dec '89 PJ article. Again, the term unreal mode is not used.
* October 1990--In the October 1990 issue of DDJ (page 12), a reader
letter from Thomas Roden appears, pointing out minor problems with
the July '90 DDJ article about unreal mode. It is clear from the
letter that Mr. Roden had access to an ICE (In-Circuit Emulator),
which no doubt greatly eased unreal mode experimentation. An
editor's note identifies Mr. Roden as the author of the Nov/Dec '89
PJ article.
* January 1991--On page 176 of the 1/91 issue of German DOS
International magazine, an article titled Vier GByte im Real Mode
unter MS-DOS (Four Gigabytes in Real Mode under MS-DOS) by Martin
Althaus explains in detail how to change segment limits to enable
full 4GB addressing in real mode. The necessity of enabling the A20
gate is discussed, and complete example code is presented; the
article also notes that the technique does not work when EMM386 (or
V86 mode in general) is in use. The article does not explore what
might happen if segment attributes in real mode are changed in
other ways, beyond setting the G bit. The author does not claim to
have invented the unnamed technique, but also does not give any
references to earlier publications.
* March 1991--In Chapter 18 of Assembly Language Programming for the
Intel 80XXX Family, William B. Giles describes in detail (page 676
and following) how to program 386 real-mode selectors such that
they cover the entire 4GB address space. Example code is also
presented. The [53]code samples are dated September 4, 1990. The
'89 PJ article is referenced as the source of information on
expanding real-mode selector limits.
* March 1991--In Chapter 18 of DOS 5: A Developer's Guide, Al
Williams again describes unreal mode, with code examples. Note that
the exact publication date is unclear; March, August, September,
and October 1991 are given. A [54]1992 review of the book discusses
Chapter 18 in some detail, together with referencing the '90 DDJ
and '89 PJ articles.
* 1991--In 80×86 Architecture & Programming Volume II: Architecture
Reference (page 72), Rakesh K. Agarwal (a former member of the
80386 design team) clearly explains what all the official Intel
documentation carefully doesn't: "When [switching from protected to
real mode] is done, the only action taken by the 80×86 is to clear
the PE flag. In particular, the current state of the descriptor
registers is left undisturbed." And further: "Such a pseudo REAL,
or UNREAL, execution mode can cause a REAL mode system to crash,
unless used very carefully" (capitalization in original). This may
be the first published use of the term "unreal mode".
* April 16, 1992--Origin releases [55]Ultima VII: The Black Gate, a
game using a custom DOS extender appropriately named "Voodoo".
Ultima VII is a proof that unreal mode is a terrible idea for DOS
applications; the game requires a significant amount of free
conventional memory, but is incompatible with 386-based DOS
extenders, as well as with any DOS-compatible advanced operating
systems.
* 1992--German DOS Extra Nr. 20 (supplement of the DOS International
magazine) publishes the HugeRealMode driver, enabling larger than
64K code segments in unreal mode, with restrictions (more below).
* June 29, 1993--In his Tutor column starting on page 302, Jeff
Prosise [56]wrote a section on "accessing 4GB from real mode"
without using LOADALL. "Recently, another method of accessing 4GB
[...] was brought to my attention by a reader on PC MagNet." The
text gives a brief overview of unreal mode and refers to Chapter 18
of DOS 5: A Developer's Guide by Al Williams (also the author of
the 1990 DDJ article).
* January 1994--Chapter 8 (Extended Memory Access from Real Mode) of
Geoff Chappell's DOS Internals provides a very detailed description
of unreal mode and HIMEM's use of it. There is talk of "unreal"
segment properties (quotes in original, page 356), but the chapter
is about "real-mode Flat Memory Model", and "Big Real Mode" is also
gets a mention. The chapter also provides a detailed treatment of
286 and 386 LOADALL. It is probably the best description of the
inner workings of HIMEM.SYS. Curiously, in Chapter 12 (page 443)
Mr. Chappell grumbles that only the outdated HIMEM.SYS 2.01 source
code is available on CompuServe (apparently uploaded by Steve
Gibson of InfoWorld). Clearly, Microsoft's 1989 and 1992 HIMEM.SYS
source code releases did a very good job of flying under the radar
when they escaped Mr. Chappell's laser-like attention.
* September 21, 1994--IBM files patent application 309,862 titled
Method for expanding addressable memory range in real-mode
processing to facilitate loading of large programs into high
memory. [57]U.S. patent 5,642,491 was granted on June 24, 1997. The
patent describes unreal mode, and mentions Chappell's DOS
Internals, pages 355-385. The patent makes strange references to a
"64-kbyte wrapping feature associated with true 8086 real mode";
that might refer to stack wrapping when PUSH and POP instruction
are used, but no such wrapping is used for data segments. The
patent suggests using unreal mode during operating system
initialization only, not at run-time.
* 1993-1995--Unreal mode becomes a thing and every up-and-coming
programmer writes a [58]utility or [59]library to use it. It is
popular among demo coders, who are dismayed when [60]EMM386 use is
mandated for Assembly '95, interfering with unreal mode.
* November 11, 1994--Italian programmer Daniele Paccaloni
[61]publishes UNREAL.EXE, a utility to enable unreal mode on a 386
or later CPU, and UNREAL.DOC, a document explaining how unreal mode
works. In a continuation of the recurring theme, Mr. Paccaloni
appears to have been completely unaware of the fact that unreal
mode had been in use for years, or the growing body of literature
about it. It appears that Mr. Paccaloni also independently
re-invented the term "unreal mode".
* September 1995--Robert R. Collins writes an article (NB: The exact
date is uncertain, Sep '95 is a guess based on source file
timestamps) titled [62]Descriptor Cache Register Anomalies; this is
probably the definitive description of unreal mode. Mr. Collins
thoroughly explored the CPU behavior using LOADALL for 386 CPUs,
and also using SMM together with an ICE on 486, Pentium, and
Pentium Pro CPUs. Mr. Collins showed that real mode is much closer
to protected mode than one would be led to believe, and most
protections are in fact in place. Mr. Collins also found that CS
register attributes are handled differently on different CPUs
generations. On older processors, far jumps change the CS
attributes as described in the Jan '86 memo, while newer CPUs
preserve the CS attributes but ignore them in real mode.
* February 1996--In the book Protected Mode Software
Architecture (chapter 5, page 61), Tom Shanley purportedly
describes "Big Real Mode", yet makes the ridiculous claim that
segment offsets are still restricted to 64K (while the segment base
can be set to any 32-bit address before returning to real mode).
Perhaps this is just shows that unreal mode is not well understood,
despite numerous authors' attempts to explain it.
* September 20, 1996--Phoenix and Intel publish the POST Memory
Manager Specification version 1.0 (PMM specification), which
mandates the use of "big real mode" (aka unreal mode). Big Real
Mode is not explained in detail, presumably because readers already
know how it works. The PMM specification is later adopted by the
PXE and PCI firmware 3.0 standards. Intel thus manages the
astonishing feat of specifying and mandating the use of unreal
mode, while simultaneously denying that it exists. Although the
original 1.0 PMM specification may be lost, the touched-up [63]PMM
1.01 is available.
* August 1998--Dr. Dobb's Journal does not publish an article titled
[64]The Segment Descriptor Cache by Robert R. Collins. The article
says that "[u]nreal mode has been used commonly since it was
discovered on the 80386. Unreal mode is so commonly used, in fact,
that Intel has been forced to support this mode as part of legacy
80×86 behavior, though it's never been documented."
* August 2004--(This entry is only included for completeness.) In The
Unabridged Pentium 4, Tom Shanley correctly describes unreal mode,
saying that it "is sometimes referred to as Big Real Mode, Flat
Real Mode, Real Big Mode and UnReal Mode" (italics in original).
Unfortunately the author makes new, although minor, incorrect
claims, namely that CS:IP and SS:SP are always used in real mode,
precluding larger than 64K code and stack segments. Larger than 64K
code and stack segments are indeed in practice unusable in unreal
mode, but for different reasons.
But... Is Unreal Mode Any Good?
Yes and no. As a general-purpose programming technique it is unusable,
because it absolutely cannot function in V86 mode. Transitions to V86
mode always force real-mode compatible segment limits and attributes.
That means unreal mode cannot be used together with EMM386 or other DOS
memory managers utilizing V86 mode. Unreal mode also cannot be used in
the DOS boxes of 386 Enhanced Mode Windows 3.x, in the DOS boxes of
OS/2 2.x, Windows NT, or Windows 9x. That is an extremely serious
drawback.
The reason why the Voodoo memory manager in Origin's Ultima VII games
is unique is that no one else wanted to repeat the same mistake. The
Ultima VII: The Black Isle credits capture the situation rather well:
Ultima VII's Voodoo Memory Management System
On the other hand, when unreal mode can be used, it is very useful.
HIMEM.SYS uses unreal mode to speed up extended memory access, and
perhaps more importantly, preserve normal interrupt latency. Firmware
can and does use unreal mode for accessing memory beyond 1 MB during
initialization; it avoids switching between real and protected mode,
and in firmware there is no danger of segment limits being reset.
Basic unreal mode (data segments with up to 4G limits, as well as data
segments with non-standard base) has become a standard part of the x86
architecture.
Unreal LOADALL
At least as far back as January 1988, Phoenix 386 BIOS combined two
undocumented favorites, using unreal mode to emulate the 286 LOADALL
instruction. When handling an invalid opcode fault, the BIOS checks
whether the faulting instruction is a 286 LOADALL (opcode 0Fh 05h); if
so, it examines the provided LOADALL state buffer at address 800h and
checks whether the segment bases for ES and/or DS are 1MB or higher. If
so, the BIOS builds descriptors with the appropriate bases, loads them
in protected mode, and returns to real mode with these "unreal" values
in the segment descriptor cache (segment base other than 16 times
segment value). The segment bases will get overwritten as soon as ES or
DS gets reloaded in real mode, but that is entirely consistent with
LOADALL behavior.
The LOADALL emulation is very limited, but it is sufficient to support
the [65]use of LOADALL in OS/2, and possibly others.
The detailed history of this method is unclear. What's known is that
the first 386 BIOS, shipped with the Compaq DeskPro 386 in 1986, did
not use unreal mode. Compaq was clearly on good terms with Intel and
got the secret memo describing the 386 LOADALL instruction. The Compaq
386 BIOS emulated 286 LOADALL rather accurately using the 386 LOADALL
instruction, going at least as far back as September 1986 and
continuing to use the same method at least until 1989 (it would no
longer work on a 486 CPU).
IBM's PS/2 Model 80 BIOS did not emulate LOADALL at all, and is
therefore uninteresting.
There are also known to have been more or less no-name 386 systems sold
around 1987 which used effectively a 286 BIOS and had no provisions to
emulate LOADALL, nor did they use 386 instructions at all.
It is unknown when Phoenix first introduced unreal mode usage to
emulate LOADALL, or if other vendors did that before Phoenix. Clone 386
BIOS images from before 1988 are rather difficult to find.
Unreal Mode Compatibility
Basic unreal mode with extended DS, ES, FS, and/or GS segment limits is
widely compatible across all 32-bit x86 CPU implementations. After all
that's what is mandated by PMM and by extension, PXE and PCI 3.0
Firmware specifications, all standards created with a significant
involvement of Intel.
Extending data segment limits in fact causes shockingly few problems,
as evidenced by the fact that HIMEM.SYS does just that. On an 8086,
referencing a word at offset 0FFFFh causes a wrap-around and the second
byte is fetched from offset zero. The 286 is already incompatible with
this behavior, causing a #GP fault. On a 386, any attempt to address
beyond 64K likewise causes #GP faults, which are typically fatal.
Therefore, functioning software does not do it and extending the
segment limit has no visible impact.
Anything else gets more complicated, and interrupts are the number one
enemy. For example, Intel CPUs typically support non-standard data
segment attributes; it's possible to make DS read-only, but that won't
be terribly useful when running real-mode software. It is likewise
possible to set the segment limit smaller than 64K, but that won't make
16-bit software happy.
It is possible to extend the CS limit up to 4GB and use 32-bit EIP in
unreal mode. In practice that is not very usable because interrupts in
real mode only save 16-bit IP and restore it on return. The German DOS
Extra magazine presented a [66]hair-raising scheme to solve the
problem, using the CR3 register to store the high word of EIP so that
it could be restored on return from interrupts, but this requires
software to manually keep track of the high word. In practice, larger
than 64K code segments are unusable in unreal mode because the
complications very quickly outweigh any benefits unreal mode might
have.
It is also possible to set the D bit in CS, changing the default
operand size to 32-bit. This may reduce the size of unreal code if it
is largely 32-bit (by obviating the need for overrides). Unfortunately,
this again causes serious trouble with interrupts, because existing
16-bit code cannot run correctly with the D bit set. It is possible to
switch to protected mode, clear the D bit, and execute the 16-bit
handler every time an interrupt occurs, and in fact it's [67]exactly
what fasm does (or at least did in some versions), but with so much
mode switching and complexity, the advantages of unreal mode are
rapidly lost.
Similar trouble strikes when attempting to use larger than 64K stack
segments. It is possible, but again destroys compatibility with
existing 16-bit real-mode code. The complications are such that one
might as well use a regular DOS extender and skip all the unreal mode
incompatibilities.
A larger problem is that the "advanced" aspects of unreal mode may not
be implemented identically across CPU generations and vendors,
precisely because they have never been documented. It is not specified
anywhere exactly which segment attributes are ignored and which are
honored in real mode. Protected mode, on the other hand, works
consistently.
What Does It All Mean?
Unreal mode is almost certainly an accident of history, a side effect
of the fact that the initial 386 design had no architected way of
switching from protected mode back to real mode. Once the technique
started being used, instead of clearly documenting how it works, Intel
in its typical fashion documented only certain aspects of it, such that
only programmers who already know about unreal mode find traces of it
in the official documentation.
On the other hand, Intel did leave enough hints in the public
documentation that unreal mode appears to have been independently
discovered a number of times. What is fascinating is that Microsoft
apparently implemented unreal mode support in HIMEM.SYS and made its
source code available before any literature on unreal mode was
published. Starting in late 1989, articles describing unreal mode were
written without knowing of each other, and likely without knowing of
Microsoft's prior published work. Reinventing wheels may be satisfying,
but in the end it's just not very productive.
PS: Images of 386 clone BIOSes (other than Compaq and IBM) from 1987
and earlier would be worth checking for LOADALL emulation and possible
other unreal mode use.
Feb 2021 Update: The original 231630-001 datasheet has now been
recovered and this post updated accordingly.
This entry was posted in [68]386, [69]Corrections, [70]Microsoft,
[71]PC history, [72]Undocumented. Bookmark the [73]permalink.
[74]<- USB 0.9
[75]ANOMALY: meaningless REX prefix used ->
43 Responses to A Brief History of Unreal Mode
1. [76]Neozeed says:
[77]June 15, 2018 at 5:38 am
The PCem folks are doing a good job of getting numerous 286/386
BIOS running on their framework, they ought to have quite a number
of images.
2. [78]Yuhong Bao says:
[79]June 15, 2018 at 6:35 am
The fun thing is that they never changed the LMSW instruction. I
wonder why/
3. dosfan says:
[80]June 15, 2018 at 8:33 am
Good article but why were you using fasm ? What fasm is doing
(32-bit real mode and relocating the IVT via LIDT) is crazy as it's
too much effort for too little gain and too many compatibility
issues. I'm not sure which is crazier, that or attempting to use
real mode paging on the 386 (which isn't allowed on 486 or later
CPUs).
4. God says:
[81]June 15, 2018 at 1:59 pm
Love these sorts of "software archaeology" articles Michal - always
informative (and a pleasure) to read. However, something of a typo
jumped out at me:
>August 1998--Dr. Dobb's Journal does NOT publish an article titled
The Segment Descriptor Cache
5. Michal Necasek says:
[82]June 15, 2018 at 7:07 pm
Presumably because someone was calling it in protected mode with
the PM bit clear, and expected to stay in protected mode...
6. Michal Necasek says:
[83]June 15, 2018 at 7:07 pm
Oh, there are zillions of BIOS images out there. But 386 BIOS
images from 1986-87? Nada...
7. Michal Necasek says:
[84]June 15, 2018 at 7:09 pm
I wasn't, I think the author is certifiably insane But someone else
using it made me aware of certain curious behaviors.
8. Michal Necasek says:
[85]June 15, 2018 at 7:09 pm
It's not a typo. I could find no evidence that the article was ever
published in DDJ.
9. Richard Wells says:
[86]June 15, 2018 at 9:18 pm
Early 386 BIOSes: Don Maslin's collection of ROMs includes the AMI
BIOS copyright 1987. I don't believe anyone has collected the
Phoenix BIOS used in the 1986 ALR 386 system.
While an interesting collection of the history, I believe you
overlooked one minor article. The October 1988 issue of Doctor
Dobbs had an article entitled "80386 PROTECTED MODE INITIALIZATION"
by Neal Marguiles (Intel employee). That title is a misnomer. It
covers the allocation of a 4 GB address space followed by a return
to real mode plus some other interesting concepts.
[87]http://www.drdobbs.com/80386-protected-mode-initialization/1844
08010
10. Rugxulo says:
[88]June 16, 2018 at 1:37 am
Actually, latest stable FASM seems to be 1.73.04, which silently
omits the unreal hack, hence you basically have to always use the
DPMI fallback nowadays. Not exactly sure why, he didn't (AFAIR)
publicly mention dropping it or why, nor whether it will come back
(somewhat unlikely, but he was always proud of his hack). Maybe it
(again) conflicted with his (Linux) 64-bit hosted version hack
(fasm.x64). Dunno, it's very complicated!
11. dosfan says:
[89]June 16, 2018 at 2:17 am
A gross hack like that belongs in a technology demo, not production
software.
I'm not sure why anyone would bother with fasm in the first place ?
If you're writing assembly language code for DOS or Windows then
there's no reason not to use MASM which was *the* industry standard
or the highly MASM-compatible JWasm (or whatever its successor is).
12. [90]Yuhong Bao says:
[91]June 18, 2018 at 2:47 am
Thinking about it, I wonder if reloading the real mode CS
attributes was the main change that allowed switching back to real
mode. It is unfortunate that writable code segments did not make
even the 80386 BTW.
13. techfury90 says:
[92]June 18, 2018 at 3:33 am
Unreal mode seems to have been known to PC-98 programmers to an
extent as well. Oldest reference I can find is from April 1995:
[93]http://www.tsg.ne.jp/buho/189/tsg189.html#8086
Author may have discovered it independently. There may be earlier
examples in books and/or magazines, but I have yet to uncover them.
Their description of their first cited source is slightly
ambiguous: it's possible that they learned about unreal mode from
them. The stumbling block is that I cannot seem to find their name
for unreal mode in general. I don't think they adopted the name we
assigned to it, if there is even a "well-known" name.
14. dosfan says:
[94]June 18, 2018 at 5:11 am
Why is it referred to as "unreal mode" anyway ? That's a foolish
and terrible name. Considering that it is referred to as "big real
mode" in an Intel doc and it involves setting the big bit in the
segment descriptor that should be the official name (not that it
really matters today). Certainly "flat real mode" is reasonable
alternative since you have direct access to the entire flat 4GB
address space.
15. Richard Wells says:
[95]June 18, 2018 at 8:53 am
"Big real mode" suggests that existing code works exactly the same
except that the segments can be larger. "Unreal mode" showcases the
differences.
Those interested in a more intentional version of a similar concept
of accessing 32-bit memory for >64K allocations from 16-bit code
could look at 1980 Data General MV 8000 documentation especially
the section "MV/8000 C/350 Program Combinations" and the following
section "Anomolies."(sic) Some of the issues DG discovered were
similar to ones that programmers using Intel chip noticed a decade
later.
16. [96]Yuhong Bao says:
[97]June 18, 2018 at 11:38 am
In this case, the only difference is that the segment limit is
larger, and existing real mode code do work the same.
17. Michal Necasek says:
[98]June 18, 2018 at 3:03 pm
Hmm, I don't see anything about unreal mode in that article. It
only says that "to assure proper operation after returning to real
mode, the segment registers must be loaded with real mode type
selectors while still in protected mode", which is the official
Intel party line. And the sample code does exactly that.
I think I looked at that AMI BIOS and it's much newer than 1987.
It's somewhat common that the copyright message is older than the
BIOS date. The opposite also happens. I'm sure there had to be
clone BIOSes in 1986-87 but so far I've been unable to locate any.
18. Michal Necasek says:
[99]June 18, 2018 at 3:06 pm
I know why, It's actually automatic. The unreal mode stuff is only
used if the code segment is smaller than 64K. In the newer fasm
versions there's more code than that, so the unreal mode code path
doesn't get compiled in (or at least not used). For that reason
it's very unlikely to come back, because using > 64K unreal mode
code segments brings another, much nastier layer of complications.
19. Michal Necasek says:
[100]June 18, 2018 at 4:12 pm
That sounds quite plausible. It would be a silicon change, but a
very localized one, and only visible from switching from protected
back to real mode.
20. Michal Necasek says:
[101]June 18, 2018 at 4:18 pm
Unreal mode because it's real mode, but not conforming to Intel's
definition of real mode. "Big real mode" is descriptive but it's
unclear whether it covers 32-bit code segments, or code or stack
segments with > 64K limits. Same problem with "flat real mode". I
suppose you could call it "not-real" mode, or "non-protected mode",
but "unreal mode" is really better.
To be clear, at least in this article, I use the term "unreal mode"
to mean any non-canonical real mode usage. I don't think the terms
"big real mode" or "flat real mode" were used to mean anything
other than 4G data segment limits, but there's more to unreal mode
than that. For example, unreal mode would cover running with
segment limits smaller than 64K (just because it's useless doesn't
mean it can't be done).
21. Michal Necasek says:
[102]June 18, 2018 at 4:20 pm
"Breaking the wall", I kind of like that.
22. dosfan says:
[103]June 18, 2018 at 8:08 pm
Big real mode (4GB address space) is the only thing that was ever
useful. Changing the default bit of the code segment would break
everything. If anything should be called "unreal mode" it's that
since it's still real mode per-se (no protections) but no regular
16-bit real mode program would run properly.
23. Michal Necasek says:
[104]June 19, 2018 at 2:02 pm
The other thing that was clearly useful (as in widely utilized) was
64K segments with bases at or beyond 1MB. The rest is more about
understanding how the damn architecture actually works than about
having practical value.
24. dosfan says:
[105]June 19, 2018 at 8:22 pm
I thought that particular trick was only done via 286 LOADALL. It
is of limited use since interrupts have to be disabled because once
the segment register is reloaded the base is changed and access
beyond 1MB is lost. Big real mode makes that trick impractical.
25. Michal Necasek says:
[106]June 19, 2018 at 10:34 pm
286 LOADALL... and the emulation thereof on 386s. Just about every
BIOS in the late 1980s and in the 1990s does that. Disabling
interrupts for a short time is still much better than resetting the
CPU, which isn't fast. Big real mode is certainly much better, but
doesn't emulate 286 LOADALL.
26. M says:
[107]June 20, 2018 at 12:16 pm
I am wondering if the 64K wrap-around alluded to in the IBM patents
could be a clumsy reference to A20-behavior?
27. Michal Necasek says:
[108]June 20, 2018 at 3:33 pm
That would be really clumsy, but as an explanation it makes as much
sense as anything
28. M says:
[109]June 20, 2018 at 10:34 pm
@Michal: Yes - and it is inconsistent with what they write about
being compatible with only pmode and real-mode apps not relying on
the wrap-around etc. and the A20 wrap-around indeed does exist (and
would not be possible to emulate w paging in unreal-mode, as is
done in V86). But yeah, definitely clumsy
29. Richard Wells says:
[110]June 20, 2018 at 11:13 pm
All 16-bit segments wrap around unless concealed behind the complex
logic of a 16-bit huge library. Some programs depended on it;
sometimes, it just concealed a bug. IBM's note in the patent on
wrap around boils down to keeping the standard 16-bit behavior for
all programs except those that specifically expect the big segments
of unreal mode. Otherwise, a program may be caught accessing memory
it didn't plan to leading to interesting results.
[111]https://www.pcjs.org/pubs/pc/reference/microsoft/kb/Q58987/
shows that wrap around has nothing to do with A20.
30. Michal Necasek says:
[112]June 21, 2018 at 12:00 am
No, 16-bit segments do not wrap on a 286 or later (except for a
special case with stack pushes and pops). If you try to address
past the end of a segment, you get a #GP fault. The KB article
talks about 16-bit pointers wrapping around, which is a different
issue, and more likely than not avoids addressing past the end of a
segment.
31. Chris M. says:
[113]June 21, 2018 at 4:11 am
AMI used dates instead of version numbers for their HiFlex BIOS
cores, hence why you would see two dates on a POST screen. One was
the "core" date/revision, and one was the built date/revision that
the vendor created. I think this changed when the WinBIOS was
introduced, but so many vendors went running to Award after that
disaster that nobody really noticed when they released a new
revision!
That 1988 Phoenix core was around for a long time, that 486
EISA/VLB board has it despite being from 1993! (it also has the
stupid 16MB RAM limitation when ROM shadowing is enabled) I think
Dell might have used it for a long time on their custom
motherboards as well (later stuff was mostly Intel OEM).
32. Richard Wells says:
[114]June 22, 2018 at 11:45 pm
16-bit relative near jumps will be done modulo 64k. That happens
according to the documentation even with latest chips. There may be
an exception triggered but most real mode systems should wind up
ignoring the exception. Otherwise, code involving relative 16-bit
jumps would have failed since it required overflow/underflow
wrapping to get to the more distant parts of the segment.
Memory access is a bit different because Intel decided not to
follow the 8086 practice of turning any incorrectly aligned word
access into a pair of byte accesses which had a side effect of
handling a word that occupied both the first and last bytes of a
segment. Speed beat out correctly handling an edge case. Some
programs seemed to still work with the exception being ignored
because I remember 1990s reports of people finally noticing the
exception. (Seemed to work because who knows what was in the second
byte of that word.)
33. Michal Necasek says:
[115]June 24, 2018 at 2:22 pm
Relative jumps are signed and sign-extended, so there's normally no
overflow and no truncation. #GP faults are fatal, in real mode they
lead to hangs (the BIOS does nothing special, the
interrupt/exception handler will likely return but it will just
re-trigger the exception immediately) or visible fatal errors
(EMM386, QEMM, NTVDM).
I don't know if with the split-word access speed beat out
compatibility or if Intel decided that it was a quirk not worth
preserving. At any rate it was a well documented difference between
the 8086 and later CPUs; how much software it affected in practice
I don't know.
34. Pingback: [116]Michael Tsai - Blog - A Brief History of Unreal Mode
35. [117]Yuhong Bao says:
[118]July 8, 2018 at 1:00 am
Thinking about it, I think virtual 8086 mode was designed before
they officially supported switching the 80386 to real mode, right?
36. Michal Necasek says:
[119]July 8, 2018 at 11:31 am
Yes, definitely. And the transitions into and out of V86 mode are
clean, with no way to leave junk in segment registers. It's
apparent that Intel's idea was that with V86 mode, no one needed
real mode anymore. But in the absence of a V86 monitor built into
the BIOS(?), that wasn't so simple.
37. Michal Necasek says:
[120]July 10, 2018 at 4:16 pm
Found this in a 1985 IEEE Micro paper by El-Ayat and Agarwal called
The Intel 80386-Architecture and Implementation: "Real mode is
useful for initialization and for configuration of the processor
data structures needed to run in native 80386 protected mode. The
recommended method for running 8086 code is called virtual 86
mode." Intel's idea clearly was that real mode was for bring-up
only and no one would want to switch in and out. If you wanted to
run 8086 code, you were supposed to do that in a V86 monitor. Yet
another plan that did not survive first contact with reality.
38. Al Williams says:
[121]July 29, 2018 at 7:47 am
Nice walk down memory lane. The original DDJ article was written on
my Intel Inboard 386 plugged into an XT-style motherboard. This did
not switch A20 like a "real" PC/AT and so my original code actually
would only work on the Inboard but I didn't know that. Later
versions (like in the book) would correct that.
I was looking. I got an e-mail from an Italian researcher that had
used the technique in some scholarly paper and referenced my
article for some kind of SEM or spectroscopy, but I couldn't find
that and I don't remember the exact year.
In addition -- and again, I can't remember the year -- a guy at
Software Development cornered me to tell me how he had started a
company based on the mode. I think he was selling a library or
something. I don't think he had much success. That had to be right
after it published within a year or so. I think he advertised with
a small ad in a couple of DDJs.
As for Necasek's comment, my DOS Extender PROT did run all the real
mode code like BIOS/DOS calls in V86 mode. As far as I know, it may
have been the first to do that in a nontrivial way.
39. Michal Necasek says:
[122]July 31, 2018 at 4:14 pm
I saw the updates to your article... as I like to say, the A20 gate
is the most expensive bit in history. It never occurred to me but
of course the Inboard had to have a different A20 gate control
mechanism.
Do you remember anything about the unreal mode origins? Was that
something you independently discovered, or was it something that
was already common knowledge in certain circles?
40. [123]Myself says:
[124]August 30, 2018 at 12:09 am
Bummer, I only have the third edition of the i386 datasheet
(231630-003, Nov. 1986).
In page 2, there is the "update notice" which lists updated
paragraphs.
If you have the version -002, maybe there are hints about changes
in the paragraphs you are emphasizing.
41. [125]Al Williams says:
[126]August 30, 2018 at 5:19 pm
No I had been tantalized by the discussions in the Intel doc
warning you to set up the segment registers before switching. Like
you mentioned, they all but told you how to do it and then stopped
short. It reminded me of the old story about during prohibition
where you could buy a "grape block" that had a warning label:
Warning: Do not place in 2 quarts of water in a cool dark place for
3 weeks or an illegal alcoholic beverage will result."
I have been experimenting with protected mode programs and
naturally had to try it out. The lead times in the publishing
business at the time means I probably was writing that about the
time the PJ article hit the streets if not a little before.
Consider it took us 3 months to publish a letter to the editor! By
the time an article went through the snail mail, the contracts came
back, then the editing and typesetting with galleys in the mail. So
I don't remember an exact date, but I do remember being surprised
when the PJ article was called out. None of us had heard of it as
PJ was not a major competitor so we were not tracking them the way
we did some of the other magazines.
42. Michal Necasek says:
[127]August 31, 2018 at 10:16 am
Indeed there is. The -002 edition is at
[128]http://www.bitsavers.org/components/intel/80386/231746-001_Int
roduction_to_the_80386_Apr86.pdf and page 63 in the PDF (page 2 of
the actual datasheet) lists the changes, though with no detail.
Some of the relevant sections were "revised", but that's all we
know until the -001 edition turns up.
43. Michal Necasek says:
[129]August 31, 2018 at 12:17 pm
Thanks for remembering! And the grape block bit, I've not heard of
that. Yeah, the Intel docs were like that, daring developers to see
what happens if they don't follow the recipe exactly.
It's hard to imagine how long the publishing turnaround was was
back then, but that's how it was. Entirely possible that someone
wrote an article and someone else independently came up with the
same thing before it was published. It's quite likely that the
articles in foreign press were also independent discoveries; I dug
into the German archives a little but I doubt they were the only
ones.
Leave a Reply
Your email address will not be published. Required fields are marked *
Comment *
_____________________________________________
_____________________________________________
_____________________________________________
_____________________________________________
_____________________________________________
_____________________________________________
_____________________________________________
_____________________________________________
Name * ______________________________
Email * ______________________________
Website ______________________________
Post Comment
D
_____________________________________________
_____________________________________________
_____________________________________________
_____________________________________________
_____________________________________________
_____________________________________________
_____________________________________________
_____________________________________________
This site uses Akismet to reduce spam. [130]Learn how your comment data
is processed.
* Archives
+ [131]June 2022
+ [132]May 2022
+ [133]April 2022
+ [134]March 2022
+ [135]February 2022
+ [136]January 2022
+ [137]December 2021
+ [138]November 2021
+ [139]October 2021
+ [140]September 2021
+ [141]August 2021
+ [142]July 2021
+ [143]June 2021
+ [144]May 2021
+ [145]April 2021
+ [146]March 2021
+ [147]February 2021
+ [148]January 2021
+ [149]December 2020
+ [150]November 2020
+ [151]October 2020
+ [152]September 2020
+ [153]August 2020
+ [154]July 2020
+ [155]June 2020
+ [156]May 2020
+ [157]April 2020
+ [158]March 2020
+ [159]February 2020
+ [160]January 2020
+ [161]December 2019
+ [162]November 2019
+ [163]October 2019
+ [164]September 2019
+ [165]August 2019
+ [166]July 2019
+ [167]June 2019
+ [168]May 2019
+ [169]April 2019
+ [170]March 2019
+ [171]February 2019
+ [172]January 2019
+ [173]December 2018
+ [174]November 2018
+ [175]October 2018
+ [176]August 2018
+ [177]July 2018
+ [178]June 2018
+ [179]May 2018
+ [180]April 2018
+ [181]March 2018
+ [182]February 2018
+ [183]January 2018
+ [184]December 2017
+ [185]November 2017
+ [186]October 2017
+ [187]August 2017
+ [188]July 2017
+ [189]June 2017
+ [190]May 2017
+ [191]April 2017
+ [192]March 2017
+ [193]February 2017
+ [194]January 2017
+ [195]December 2016
+ [196]November 2016
+ [197]October 2016
+ [198]September 2016
+ [199]August 2016
+ [200]July 2016
+ [201]June 2016
+ [202]May 2016
+ [203]April 2016
+ [204]March 2016
+ [205]February 2016
+ [206]January 2016
+ [207]December 2015
+ [208]November 2015
+ [209]October 2015
+ [210]September 2015
+ [211]August 2015
+ [212]July 2015
+ [213]June 2015
+ [214]May 2015
+ [215]April 2015
+ [216]March 2015
+ [217]February 2015
+ [218]January 2015
+ [219]December 2014
+ [220]November 2014
+ [221]October 2014
+ [222]September 2014
+ [223]August 2014
+ [224]July 2014
+ [225]June 2014
+ [226]May 2014
+ [227]April 2014
+ [228]March 2014
+ [229]February 2014
+ [230]January 2014
+ [231]December 2013
+ [232]November 2013
+ [233]October 2013
+ [234]September 2013
+ [235]August 2013
+ [236]July 2013
+ [237]June 2013
+ [238]May 2013
+ [239]April 2013
+ [240]March 2013
+ [241]February 2013
+ [242]January 2013
+ [243]December 2012
+ [244]November 2012
+ [245]October 2012
+ [246]September 2012
+ [247]August 2012
+ [248]July 2012
+ [249]June 2012
+ [250]May 2012
+ [251]April 2012
+ [252]March 2012
+ [253]February 2012
+ [254]January 2012
+ [255]December 2011
+ [256]November 2011
+ [257]October 2011
+ [258]September 2011
+ [259]August 2011
+ [260]July 2011
+ [261]June 2011
+ [262]May 2011
+ [263]April 2011
+ [264]March 2011
+ [265]January 2011
+ [266]November 2010
+ [267]October 2010
+ [268]August 2010
+ [269]July 2010
* Categories
+ [270]286
+ [271]386
+ [272]3Com
+ [273]3Dfx
+ [274]486
+ [275]8086/8088
+ [276]Adaptec
+ [277]AGP
+ [278]AMD
+ [279]AMD64
+ [280]Apple
+ [281]Archiving
+ [282]Assembler
+ [283]ATi
+ [284]BIOS
+ [285]Books
+ [286]Borland
+ [287]BSD
+ [288]Bugs
+ [289]BusLogic
+ [290]C
+ [291]C&T
+ [292]CD-ROM
+ [293]Cirrus Logic
+ [294]CompactFlash
+ [295]Compaq
+ [296]Compression
+ [297]Conner
+ [298]Corrections
+ [299]CP/M
+ [300]Creative Labs
+ [301]Crystal Semi
+ [302]Cyrix
+ [303]DDR RAM
+ [304]Debugging
+ [305]DEC
+ [306]Development
+ [307]Digital Research
+ [308]Documentation
+ [309]DOS
+ [310]DOS Extenders
+ [311]Dream
+ [312]E-mu
+ [313]Editors
+ [314]EISA
+ [315]Ensoniq
+ [316]ESDI
+ [317]Ethernet
+ [318]Fakes
+ [319]Fixes
+ [320]Floppies
+ [321]Graphics
+ [322]Hardware Hacks
+ [323]I18N
+ [324]IBM
+ [325]IDE
+ [326]Intel
+ [327]Internet
+ [328]Keyboard
+ [329]Kryoflux
+ [330]Kurzweil
+ [331]LAN Manager
+ [332]Legal
+ [333]Linux
+ [334]MCA
+ [335]Microsoft
+ [336]MIDI
+ [337]NetWare
+ [338]Networking
+ [339]NeXTSTEP
+ [340]NFS
+ [341]Novell
+ [342]NT
+ [343]OS X
+ [344]OS/2
+ [345]PC architecture
+ [346]PC hardware
+ [347]PC history
+ [348]PC press
+ [349]PCI
+ [350]PCMCIA
+ [351]Pentium
+ [352]Pentium 4
+ [353]Pentium II
+ [354]Pentium III
+ [355]Pentium Pro
+ [356]Plug and Play
+ [357]PowerPC
+ [358]Pre-release
+ [359]PS/2
+ [360]QNX
+ [361]Quantum
+ [362]Random Thoughts
+ [363]RDRAM
+ [364]Roland
+ [365]Ryzen
+ [366]S3
+ [367]SCO
+ [368]SCSI
+ [369]Seagate
+ [370]Security
+ [371]Site Management
+ [372]SMP
+ [373]Software Hacks
+ [374]Solaris
+ [375]Sound
+ [376]Sound Blaster
+ [377]Source code
+ [378]Standards
+ [379]Storage
+ [380]Supermicro
+ [381]TCP/IP
+ [382]ThinkPad
+ [383]Trident
+ [384]UltraSound
+ [385]Uncategorized
+ [386]Undocumented
+ [387]UNIX
+ [388]UnixWare
+ [389]USB
+ [390]VGA
+ [391]VirtualBox
+ [392]Virtualization
+ [393]VLB
+ [394]Watcom
+ [395]Wave Blaster
+ [396]Western Digital
+ [397]Windows
+ [398]Windows 95
+ [399]Windows XP
+ [400]Wireless
+ [401]WordStar
+ [402]x86
+ [403]Xenix
+ [404]Xeon
+ [405]Yamaha
[406]OS/2 Museum
[407]Proudly powered by WordPress.
References
Visible links:
1. http://www.os2museum.com/wp/feed/
2. http://www.os2museum.com/wp/comments/feed/
3. http://www.os2museum.com/wp/a-brief-history-of-unreal-mode/feed/
4. http://www.os2museum.com/wp/wp-json/wp/v2/posts/4169
5. http://www.os2museum.com/wp/wp-json/oembed/1.0/embed?url=http%3A%2F%2Fwww.os2museum.com%2Fwp%2Fa-brief-history-of-unreal-mode%2F
6. http://www.os2museum.com/wp/wp-json/oembed/1.0/embed?url=http%3A%2F%2Fwww.os2museum.com%2Fwp%2Fa-brief-history-of-unreal-mode%2F&format=xml
7. http://www.os2museum.com/wp/
8. http://www.os2museum.com/wp/a-brief-history-of-unreal-mode/#content
9. http://www.os2museum.com/wp/
10. http://www.os2museum.com/wp/about/
11. http://www.os2museum.com/wp/about/wanted-list/
12. http://www.os2museum.com/wp/os2-history/
13. http://www.os2museum.com/wp/os2-history/os2-beginnings/
14. http://www.os2museum.com/wp/os2-history/os2-1-0/
15. http://www.os2museum.com/wp/os2-history/os2-1-1/
16. http://www.os2museum.com/wp/os2-history/os2-1-2-and-1-3/
17. http://www.os2museum.com/wp/os2-history/os2-16-bit-server/
18. http://www.os2museum.com/wp/os2-history/os2-2-0/
19. http://www.os2museum.com/wp/os2-history/os2-2-1-and-2-11/
20. http://www.os2museum.com/wp/os2-history/os2-warp/
21. http://www.os2museum.com/wp/os2-history/os2-warp-powerpc-edition/
22. http://www.os2museum.com/wp/os2-history/os2-warp-4/
23. http://www.os2museum.com/wp/os2-history/os2-timeline/
24. http://www.os2museum.com/wp/os2-history/os2-library/
25. http://www.os2museum.com/wp/os2-history/os2-library/os2-1-x-sdk/
26. http://www.os2museum.com/wp/os2-history/os2-library/os2-1-x-programming/
27. http://www.os2museum.com/wp/os2-history/os2-library/os2-2-0-technical-library/
28. http://www.os2museum.com/wp/os2-history/os2-videos-1987/
29. http://www.os2museum.com/wp/dos/
30. http://www.os2museum.com/wp/dos/dos-beginnings/
31. http://www.os2museum.com/wp/dos/dos-1-0-and-1-1/
32. http://www.os2museum.com/wp/dos/dos-2-0-and-2-1/
33. http://www.os2museum.com/wp/dos/dos-3-0-3-2/
34. http://www.os2museum.com/wp/dos/dos-3-3/
35. http://www.os2museum.com/wp/dos/dos-4-0/
36. http://www.os2museum.com/wp/dos/dos-library/
37. http://www.os2museum.com/wp/netware-history/
38. http://www.os2museum.com/wp/netware-history/netware-timeline/
39. http://www.os2museum.com/wp/netware-history/netware-library/
40. http://www.os2museum.com/wp/windows-history/
41. http://www.os2museum.com/wp/windows-history/windows-library/
42. http://www.os2museum.com/wp/pc-unix-history/
43. http://www.os2museum.com/wp/pc-unix-history/solaris-2-1-for-x86/
44. http://www.os2museum.com/wp/usb-0-9/
45. http://www.os2museum.com/wp/anomaly-meaningless-rex-prefix-used/
46. http://www.os2museum.com/wp/a-brief-history-of-unreal-mode/
47. http://www.os2museum.com/wp/author/michaln/
48. https://en.wikipedia.org/wiki/FASM
49. https://books.google.de/books?id=tSLe3yMjc-AC&lpg=PP1&pg=PT437#v=onepage&q&f=false
50. http://www.gaby.de/ftp/pub/win3x/archive/softlib/xms.exe
51. http://www.megalextoria.com/usenet-archive/news095f1/b118/comp/binaries/ibm/pc/d/00002158.html
52. https://archives.scovetta.com/pub/power_programming/MICROSFT/
53. https://vetusware.com/download/Assembly%20Language%20Programming%20for%20the%20Intel%2080XXX%20Family%201/?id=15869
54. https://link.springer.com/content/pdf/10.3758/BF03203592.pdf
55. https://en.wikipedia.org/wiki/Ultima_VII:_The_Black_Gate
56. https://books.google.com/books?id=gCfzPMoPJWgC&pg=PA304&lpg=PA304&source=bl&ots=rnelM7Nq98&sig=NwfNst9V6yPrUqTMu4oSayD2594&hl=en&sa=X&ved=0ahUKEwinjISbjKjbAhXQZ1AKHfF3D3UQ6AEIPDAC#v=onepage&f=false
57. https://patents.google.com/patent/US5642491
58. http://ftp.lanet.lv/ftp/mirror/x2ftp/msdos/programming/memory/
59. http://ftp.lanet.lv/ftp/mirror/x2ftp/msdos/programming/libs/
60. http://dgi_il.tripod.com/gemmis.txt
61. https://ftp.sunet.se/mirror/archive/ftp.sunet.se/pub/simtelnet/msdos/asmutl/unreal10.zip
62. http://www.rcollins.org/Productivity/DescriptorCache.html
63. https://web.archive.org/web/20051111084304/http://www.phoenix.com/NR/rdonlyres/873A00CF-33AC-4775-B77E-08E7B9754993/0/specspmm101.pdf
64. http://www.rcollins.org/ddj/Aug98/Aug98.html
65. http://www.os2museum.com/wp/more-on-loadall-and-os2/
66. http://www.delorie.com/djgpp/doc/rbinter/it/91/37.html
67. https://board.flatassembler.net/topic.php?t=11940
68. http://www.os2museum.com/wp/category/386/
69. http://www.os2museum.com/wp/category/corrections/
70. http://www.os2museum.com/wp/category/microsoft/
71. http://www.os2museum.com/wp/category/pc-history/
72. http://www.os2museum.com/wp/category/undocumented/
73. http://www.os2museum.com/wp/a-brief-history-of-unreal-mode/
74. http://www.os2museum.com/wp/usb-0-9/
75. http://www.os2museum.com/wp/anomaly-meaningless-rex-prefix-used/
76. http://virtuallyfun.com/
77. http://www.os2museum.com/wp/a-brief-history-of-unreal-mode/#comment-347786
78. https://yuhongbao.blogspot.com/
79. http://www.os2museum.com/wp/a-brief-history-of-unreal-mode/#comment-347787
80. http://www.os2museum.com/wp/a-brief-history-of-unreal-mode/#comment-347790
81. http://www.os2museum.com/wp/a-brief-history-of-unreal-mode/#comment-347796
82. http://www.os2museum.com/wp/a-brief-history-of-unreal-mode/#comment-347801
83. http://www.os2museum.com/wp/a-brief-history-of-unreal-mode/#comment-347802
84. http://www.os2museum.com/wp/a-brief-history-of-unreal-mode/#comment-347803
85. http://www.os2museum.com/wp/a-brief-history-of-unreal-mode/#comment-347804
86. http://www.os2museum.com/wp/a-brief-history-of-unreal-mode/#comment-347808
87. http://www.drdobbs.com/80386-protected-mode-initialization/184408010
88. http://www.os2museum.com/wp/a-brief-history-of-unreal-mode/#comment-347810
89. http://www.os2museum.com/wp/a-brief-history-of-unreal-mode/#comment-347812
90. https://yuhongbao.blogspot.com/
91. http://www.os2museum.com/wp/a-brief-history-of-unreal-mode/#comment-347858
92. http://www.os2museum.com/wp/a-brief-history-of-unreal-mode/#comment-347860
93. http://www.tsg.ne.jp/buho/189/tsg189.html#8086
94. http://www.os2museum.com/wp/a-brief-history-of-unreal-mode/#comment-347861
95. http://www.os2museum.com/wp/a-brief-history-of-unreal-mode/#comment-347862
96. https://yuhongbao.blogspot.com/
97. http://www.os2museum.com/wp/a-brief-history-of-unreal-mode/#comment-347864
98. http://www.os2museum.com/wp/a-brief-history-of-unreal-mode/#comment-347865
99. http://www.os2museum.com/wp/a-brief-history-of-unreal-mode/#comment-347866
100. http://www.os2museum.com/wp/a-brief-history-of-unreal-mode/#comment-347867
101. http://www.os2museum.com/wp/a-brief-history-of-unreal-mode/#comment-347868
102. http://www.os2museum.com/wp/a-brief-history-of-unreal-mode/#comment-347869
103. http://www.os2museum.com/wp/a-brief-history-of-unreal-mode/#comment-347872
104. http://www.os2museum.com/wp/a-brief-history-of-unreal-mode/#comment-347964
105. http://www.os2museum.com/wp/a-brief-history-of-unreal-mode/#comment-347974
106. http://www.os2museum.com/wp/a-brief-history-of-unreal-mode/#comment-347978
107. http://www.os2museum.com/wp/a-brief-history-of-unreal-mode/#comment-347996
108. http://www.os2museum.com/wp/a-brief-history-of-unreal-mode/#comment-348003
109. http://www.os2museum.com/wp/a-brief-history-of-unreal-mode/#comment-348035
110. http://www.os2museum.com/wp/a-brief-history-of-unreal-mode/#comment-348037
111. https://www.pcjs.org/pubs/pc/reference/microsoft/kb/Q58987/
112. http://www.os2museum.com/wp/a-brief-history-of-unreal-mode/#comment-348040
113. http://www.os2museum.com/wp/a-brief-history-of-unreal-mode/#comment-348048
114. http://www.os2museum.com/wp/a-brief-history-of-unreal-mode/#comment-348117
115. http://www.os2museum.com/wp/a-brief-history-of-unreal-mode/#comment-348188
116. https://mjtsai.com/blog/2018/07/03/a-brief-history-of-unreal-mode/
117. https://yuhongbao.blogspot.com/
118. http://www.os2museum.com/wp/a-brief-history-of-unreal-mode/#comment-348565
119. http://www.os2museum.com/wp/a-brief-history-of-unreal-mode/#comment-348575
120. http://www.os2museum.com/wp/a-brief-history-of-unreal-mode/#comment-348630
121. http://www.os2museum.com/wp/a-brief-history-of-unreal-mode/#comment-348979
122. http://www.os2museum.com/wp/a-brief-history-of-unreal-mode/#comment-349002
123. http://temlib.org/
124. http://www.os2museum.com/wp/a-brief-history-of-unreal-mode/#comment-349848
125. http://www.awce.com/
126. http://www.os2museum.com/wp/a-brief-history-of-unreal-mode/#comment-349870
127. http://www.os2museum.com/wp/a-brief-history-of-unreal-mode/#comment-349883
128. http://www.bitsavers.org/components/intel/80386/231746-001_Introduction_to_the_80386_Apr86.pdf
129. http://www.os2museum.com/wp/a-brief-history-of-unreal-mode/#comment-349890
130. https://akismet.com/privacy/
131. http://www.os2museum.com/wp/2022/06/
132. http://www.os2museum.com/wp/2022/05/
133. http://www.os2museum.com/wp/2022/04/
134. http://www.os2museum.com/wp/2022/03/
135. http://www.os2museum.com/wp/2022/02/
136. http://www.os2museum.com/wp/2022/01/
137. http://www.os2museum.com/wp/2021/12/
138. http://www.os2museum.com/wp/2021/11/
139. http://www.os2museum.com/wp/2021/10/
140. http://www.os2museum.com/wp/2021/09/
141. http://www.os2museum.com/wp/2021/08/
142. http://www.os2museum.com/wp/2021/07/
143. http://www.os2museum.com/wp/2021/06/
144. http://www.os2museum.com/wp/2021/05/
145. http://www.os2museum.com/wp/2021/04/
146. http://www.os2museum.com/wp/2021/03/
147. http://www.os2museum.com/wp/2021/02/
148. http://www.os2museum.com/wp/2021/01/
149. http://www.os2museum.com/wp/2020/12/
150. http://www.os2museum.com/wp/2020/11/
151. http://www.os2museum.com/wp/2020/10/
152. http://www.os2museum.com/wp/2020/09/
153. http://www.os2museum.com/wp/2020/08/
154. http://www.os2museum.com/wp/2020/07/
155. http://www.os2museum.com/wp/2020/06/
156. http://www.os2museum.com/wp/2020/05/
157. http://www.os2museum.com/wp/2020/04/
158. http://www.os2museum.com/wp/2020/03/
159. http://www.os2museum.com/wp/2020/02/
160. http://www.os2museum.com/wp/2020/01/
161. http://www.os2museum.com/wp/2019/12/
162. http://www.os2museum.com/wp/2019/11/
163. http://www.os2museum.com/wp/2019/10/
164. http://www.os2museum.com/wp/2019/09/
165. http://www.os2museum.com/wp/2019/08/
166. http://www.os2museum.com/wp/2019/07/
167. http://www.os2museum.com/wp/2019/06/
168. http://www.os2museum.com/wp/2019/05/
169. http://www.os2museum.com/wp/2019/04/
170. http://www.os2museum.com/wp/2019/03/
171. http://www.os2museum.com/wp/2019/02/
172. http://www.os2museum.com/wp/2019/01/
173. http://www.os2museum.com/wp/2018/12/
174. http://www.os2museum.com/wp/2018/11/
175. http://www.os2museum.com/wp/2018/10/
176. http://www.os2museum.com/wp/2018/08/
177. http://www.os2museum.com/wp/2018/07/
178. http://www.os2museum.com/wp/2018/06/
179. http://www.os2museum.com/wp/2018/05/
180. http://www.os2museum.com/wp/2018/04/
181. http://www.os2museum.com/wp/2018/03/
182. http://www.os2museum.com/wp/2018/02/
183. http://www.os2museum.com/wp/2018/01/
184. http://www.os2museum.com/wp/2017/12/
185. http://www.os2museum.com/wp/2017/11/
186. http://www.os2museum.com/wp/2017/10/
187. http://www.os2museum.com/wp/2017/08/
188. http://www.os2museum.com/wp/2017/07/
189. http://www.os2museum.com/wp/2017/06/
190. http://www.os2museum.com/wp/2017/05/
191. http://www.os2museum.com/wp/2017/04/
192. http://www.os2museum.com/wp/2017/03/
193. http://www.os2museum.com/wp/2017/02/
194. http://www.os2museum.com/wp/2017/01/
195. http://www.os2museum.com/wp/2016/12/
196. http://www.os2museum.com/wp/2016/11/
197. http://www.os2museum.com/wp/2016/10/
198. http://www.os2museum.com/wp/2016/09/
199. http://www.os2museum.com/wp/2016/08/
200. http://www.os2museum.com/wp/2016/07/
201. http://www.os2museum.com/wp/2016/06/
202. http://www.os2museum.com/wp/2016/05/
203. http://www.os2museum.com/wp/2016/04/
204. http://www.os2museum.com/wp/2016/03/
205. http://www.os2museum.com/wp/2016/02/
206. http://www.os2museum.com/wp/2016/01/
207. http://www.os2museum.com/wp/2015/12/
208. http://www.os2museum.com/wp/2015/11/
209. http://www.os2museum.com/wp/2015/10/
210. http://www.os2museum.com/wp/2015/09/
211. http://www.os2museum.com/wp/2015/08/
212. http://www.os2museum.com/wp/2015/07/
213. http://www.os2museum.com/wp/2015/06/
214. http://www.os2museum.com/wp/2015/05/
215. http://www.os2museum.com/wp/2015/04/
216. http://www.os2museum.com/wp/2015/03/
217. http://www.os2museum.com/wp/2015/02/
218. http://www.os2museum.com/wp/2015/01/
219. http://www.os2museum.com/wp/2014/12/
220. http://www.os2museum.com/wp/2014/11/
221. http://www.os2museum.com/wp/2014/10/
222. http://www.os2museum.com/wp/2014/09/
223. http://www.os2museum.com/wp/2014/08/
224. http://www.os2museum.com/wp/2014/07/
225. http://www.os2museum.com/wp/2014/06/
226. http://www.os2museum.com/wp/2014/05/
227. http://www.os2museum.com/wp/2014/04/
228. http://www.os2museum.com/wp/2014/03/
229. http://www.os2museum.com/wp/2014/02/
230. http://www.os2museum.com/wp/2014/01/
231. http://www.os2museum.com/wp/2013/12/
232. http://www.os2museum.com/wp/2013/11/
233. http://www.os2museum.com/wp/2013/10/
234. http://www.os2museum.com/wp/2013/09/
235. http://www.os2museum.com/wp/2013/08/
236. http://www.os2museum.com/wp/2013/07/
237. http://www.os2museum.com/wp/2013/06/
238. http://www.os2museum.com/wp/2013/05/
239. http://www.os2museum.com/wp/2013/04/
240. http://www.os2museum.com/wp/2013/03/
241. http://www.os2museum.com/wp/2013/02/
242. http://www.os2museum.com/wp/2013/01/
243. http://www.os2museum.com/wp/2012/12/
244. http://www.os2museum.com/wp/2012/11/
245. http://www.os2museum.com/wp/2012/10/
246. http://www.os2museum.com/wp/2012/09/
247. http://www.os2museum.com/wp/2012/08/
248. http://www.os2museum.com/wp/2012/07/
249. http://www.os2museum.com/wp/2012/06/
250. http://www.os2museum.com/wp/2012/05/
251. http://www.os2museum.com/wp/2012/04/
252. http://www.os2museum.com/wp/2012/03/
253. http://www.os2museum.com/wp/2012/02/
254. http://www.os2museum.com/wp/2012/01/
255. http://www.os2museum.com/wp/2011/12/
256. http://www.os2museum.com/wp/2011/11/
257. http://www.os2museum.com/wp/2011/10/
258. http://www.os2museum.com/wp/2011/09/
259. http://www.os2museum.com/wp/2011/08/
260. http://www.os2museum.com/wp/2011/07/
261. http://www.os2museum.com/wp/2011/06/
262. http://www.os2museum.com/wp/2011/05/
263. http://www.os2museum.com/wp/2011/04/
264. http://www.os2museum.com/wp/2011/03/
265. http://www.os2museum.com/wp/2011/01/
266. http://www.os2museum.com/wp/2010/11/
267. http://www.os2museum.com/wp/2010/10/
268. http://www.os2museum.com/wp/2010/08/
269. http://www.os2museum.com/wp/2010/07/
270. http://www.os2museum.com/wp/category/286/
271. http://www.os2museum.com/wp/category/386/
272. http://www.os2museum.com/wp/category/3com/
273. http://www.os2museum.com/wp/category/3dfx/
274. http://www.os2museum.com/wp/category/486/
275. http://www.os2museum.com/wp/category/8086-8088/
276. http://www.os2museum.com/wp/category/adaptec/
277. http://www.os2museum.com/wp/category/agp/
278. http://www.os2museum.com/wp/category/amd/
279. http://www.os2museum.com/wp/category/amd64/
280. http://www.os2museum.com/wp/category/apple/
281. http://www.os2museum.com/wp/category/archiving/
282. http://www.os2museum.com/wp/category/assembler/
283. http://www.os2museum.com/wp/category/ati/
284. http://www.os2museum.com/wp/category/bios/
285. http://www.os2museum.com/wp/category/books/
286. http://www.os2museum.com/wp/category/borland/
287. http://www.os2museum.com/wp/category/bsd/
288. http://www.os2museum.com/wp/category/bugs/
289. http://www.os2museum.com/wp/category/buslogic/
290. http://www.os2museum.com/wp/category/c/
291. http://www.os2museum.com/wp/category/ct/
292. http://www.os2museum.com/wp/category/cd-rom/
293. http://www.os2museum.com/wp/category/cirrus-logic/
294. http://www.os2museum.com/wp/category/compactflash/
295. http://www.os2museum.com/wp/category/compaq/
296. http://www.os2museum.com/wp/category/compression/
297. http://www.os2museum.com/wp/category/conner/
298. http://www.os2museum.com/wp/category/corrections/
299. http://www.os2museum.com/wp/category/cp-m/
300. http://www.os2museum.com/wp/category/creative-labs/
301. http://www.os2museum.com/wp/category/crystal-semi/
302. http://www.os2museum.com/wp/category/cyrix/
303. http://www.os2museum.com/wp/category/ddr-ram/
304. http://www.os2museum.com/wp/category/debugging/
305. http://www.os2museum.com/wp/category/dec/
306. http://www.os2museum.com/wp/category/development/
307. http://www.os2museum.com/wp/category/digital-research/
308. http://www.os2museum.com/wp/category/documentation/
309. http://www.os2museum.com/wp/category/dos/
310. http://www.os2museum.com/wp/category/dos-extenders/
311. http://www.os2museum.com/wp/category/dream/
312. http://www.os2museum.com/wp/category/e-mu/
313. http://www.os2museum.com/wp/category/editors/
314. http://www.os2museum.com/wp/category/eisa/
315. http://www.os2museum.com/wp/category/ensoniq/
316. http://www.os2museum.com/wp/category/esdi/
317. http://www.os2museum.com/wp/category/ethernet/
318. http://www.os2museum.com/wp/category/fakes/
319. http://www.os2museum.com/wp/category/fixes/
320. http://www.os2museum.com/wp/category/floppies/
321. http://www.os2museum.com/wp/category/graphics/
322. http://www.os2museum.com/wp/category/hardware-hacks/
323. http://www.os2museum.com/wp/category/i18n/
324. http://www.os2museum.com/wp/category/ibm/
325. http://www.os2museum.com/wp/category/ide/
326. http://www.os2museum.com/wp/category/intel/
327. http://www.os2museum.com/wp/category/internet/
328. http://www.os2museum.com/wp/category/keyboard/
329. http://www.os2museum.com/wp/category/kryoflux/
330. http://www.os2museum.com/wp/category/kurzweil/
331. http://www.os2museum.com/wp/category/lan-manager/
332. http://www.os2museum.com/wp/category/legal/
333. http://www.os2museum.com/wp/category/linux/
334. http://www.os2museum.com/wp/category/mca/
335. http://www.os2museum.com/wp/category/microsoft/
336. http://www.os2museum.com/wp/category/midi/
337. http://www.os2museum.com/wp/category/netware/
338. http://www.os2museum.com/wp/category/networking/
339. http://www.os2museum.com/wp/category/nextstep/
340. http://www.os2museum.com/wp/category/nfs/
341. http://www.os2museum.com/wp/category/novell/
342. http://www.os2museum.com/wp/category/nt/
343. http://www.os2museum.com/wp/category/os-x/
344. http://www.os2museum.com/wp/category/os2/
345. http://www.os2museum.com/wp/category/pc-architecture/
346. http://www.os2museum.com/wp/category/pc-hardware/
347. http://www.os2museum.com/wp/category/pc-history/
348. http://www.os2museum.com/wp/category/pc-press/
349. http://www.os2museum.com/wp/category/pci/
350. http://www.os2museum.com/wp/category/pcmcia/
351. http://www.os2museum.com/wp/category/pentium/
352. http://www.os2museum.com/wp/category/pentium-4/
353. http://www.os2museum.com/wp/category/pentium-ii/
354. http://www.os2museum.com/wp/category/pentium-iii/
355. http://www.os2museum.com/wp/category/pentium-pro/
356. http://www.os2museum.com/wp/category/plug-and-play/
357. http://www.os2museum.com/wp/category/powerpc/
358. http://www.os2museum.com/wp/category/pre-release/
359. http://www.os2museum.com/wp/category/ps2/
360. http://www.os2museum.com/wp/category/qnx/
361. http://www.os2museum.com/wp/category/quantum/
362. http://www.os2museum.com/wp/category/random-thoughts/
363. http://www.os2museum.com/wp/category/rdram/
364. http://www.os2museum.com/wp/category/roland/
365. http://www.os2museum.com/wp/category/ryzen/
366. http://www.os2museum.com/wp/category/s3/
367. http://www.os2museum.com/wp/category/sco/
368. http://www.os2museum.com/wp/category/scsi/
369. http://www.os2museum.com/wp/category/seagate/
370. http://www.os2museum.com/wp/category/security/
371. http://www.os2museum.com/wp/category/site-management/
372. http://www.os2museum.com/wp/category/smp/
373. http://www.os2museum.com/wp/category/software-hacks/
374. http://www.os2museum.com/wp/category/solaris/
375. http://www.os2museum.com/wp/category/sound/
376. http://www.os2museum.com/wp/category/sound-blaster/
377. http://www.os2museum.com/wp/category/source-code/
378. http://www.os2museum.com/wp/category/standards/
379. http://www.os2museum.com/wp/category/storage/
380. http://www.os2museum.com/wp/category/supermicro/
381. http://www.os2museum.com/wp/category/tcp-ip/
382. http://www.os2museum.com/wp/category/thinkpad/
383. http://www.os2museum.com/wp/category/trident/
384. http://www.os2museum.com/wp/category/ultrasound/
385. http://www.os2museum.com/wp/category/uncategorized/
386. http://www.os2museum.com/wp/category/undocumented/
387. http://www.os2museum.com/wp/category/unix/
388. http://www.os2museum.com/wp/category/unixware/
389. http://www.os2museum.com/wp/category/usb/
390. http://www.os2museum.com/wp/category/vga/
391. http://www.os2museum.com/wp/category/virtualbox/
392. http://www.os2museum.com/wp/category/virtualization/
393. http://www.os2museum.com/wp/category/vlb/
394. http://www.os2museum.com/wp/category/watcom/
395. http://www.os2museum.com/wp/category/wave-blaster/
396. http://www.os2museum.com/wp/category/western-digital/
397. http://www.os2museum.com/wp/category/windows/
398. http://www.os2museum.com/wp/category/windows-95/
399. http://www.os2museum.com/wp/category/windows-xp/
400. http://www.os2museum.com/wp/category/wireless/
401. http://www.os2museum.com/wp/category/wordstar/
402. http://www.os2museum.com/wp/category/x86/
403. http://www.os2museum.com/wp/category/xenix/
404. http://www.os2museum.com/wp/category/xeon/
405. http://www.os2museum.com/wp/category/yamaha/
406. http://www.os2museum.com/wp/
407. https://wordpress.org/
Hidden links:
409. http://www.os2museum.com/wp/a-brief-history-of-unreal-mode/ultima-vii-voodoo/
|