summaryrefslogtreecommitdiff
path: root/doc/www.os2museum.com_wp_a-brief-history-of-unreal-mode.txt
blob: a02d0bebc399617fe5b3f24027cb02e16410ed2e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
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/