Merge branch 'master' into gh-pages

This commit is contained in:
Jeff Parsons 2017-07-15 10:48:22 -07:00
commit 87799c75b9
43 changed files with 4057 additions and 3364 deletions

View file

@ -0,0 +1,102 @@
---
layout: post
title: Flickery Fakery
date: 2017-07-15 22:00:00
permalink: /blog/2017/07/15/
---
For years, one of my pet peeves about PC emulators has been their obsession with raw speed, and how hard they
try to squeeze every last drop of performance out of their instruction execution loop, on the assumption that
everyone wants an an 8088 that runs at, say, 500Mhz, as opposed to the 4.77Mhz of the original IBM PC.
And sure, it might be nice if that [Lotus 1-2-3](/disks/pcx86/apps/lotus/123/1as/) spreadsheet recalculated instantly,
instead of the several seconds that it originally took. But most of the time, such a dramatic difference in speed is
more aggravating than helpful. In 1981, you could type `DIR` at a DOS prompt and skim the directory listing as it was
being printed. Do the same thing in a modern emulator, and the directory listing will display so fast that you'll have
no idea what just scrolled off the top of the screen. And many games become unplayable, because they were designed to
run on *machines of the day*, not machines of the future running hundreds of times faster.
Emulators like [DOSBox](https://github.com/Henne/dosbox-svn), which has since been ported to
[EM-DOSBOX](https://github.com/dreamlayers/em-dosbox) for the [Internet Archive's](https://archive.org)
[MS-DOS Collection](https://archive.org/details/softwarelibrary_msdos), do offer some crude controls to "throttle"
the emulated CPU's speed, but they provide no feedback: you don't know what the current speed is or what the target
speed should be. Even a "professional" emulator like Oracle's [VirtualBox](https://www.virtualbox.org/) offers
only very limited speed control: a processor "Execution Cap" that's defined as a percentage, which turns out to be
much too granular to recreate any particular CPU speed.
### Visual Veracity
Beyond speed accuracy, the next commonly short-changed feature is visual authenticity. Most emulators do a good
job faithfully emulating video hardware features, sometimes even obscure features that were used by only a handful
of apps. But many emulators don't bother with:
- Rendering the original IBM PC fonts
- Blinking the cursor
- Emulating character attributes like *underline* and *blink*
- Supporting [Dual Displays](/devices/pcx86/machine/5150/dual/64kb/)
And last, and maybe also least, **FLICKERING**.
Yes, the beloved flicker of the original IBM Color Graphics Adapter, or CGA. And I'm not talking about the
barely perceptible flicker produced by the CGA monitor's 60Hz refresh rate. That flicker was tolerable. In fact,
many people who didn't need either color or graphics would opt for IBM's Monochrome Display Adapter, or MDA, because
the green phosphor of IBM's monochrome monitor had such high persistence that the 60Hz refresh rate was virtually
imperceptible.
No, the capital-letter **FLICKER** that I'm talking about was a side-effect of what IBM's ROM BIOS did every time the
CGA's screen had to be scrolled: completely turn off the video signal OFF, rearrange the contents of video memory, and
then turn the video signal back ON. IBM adopted this approach because otherwise you would see an even *worse* effect:
random video interference or "snow".
This all came about because the CGA's memory wasn't "dual-ported": if the CPU accessed the CGA's memory at the same
that the display hardware was accessing it (to refresh the screen 60 times per second), the CPU would win and the
display hardware would lose, resulting in garbage appearing on the screen for a brief instant.
PC software could avoid that conflict by waiting until the CGA hardware was in a retrace period: either the brief
*horizontal retrace* period that occurs as the CRT repositions the electron beam from the right side of the screen
back to the left side, or the slightly longer *vertical retrace* period that involves moving the beam from the bottom
to the top.
However, IBM decided that, since neither of those retrace periods were long enough to perform a full-screen scroll,
the easiest solution was to simply turn the screen off for the duration. The result, which many of us suffered with
for years, was **FLICKER**.
I can hear the counter-arguments, starting with "Why in the world would anyone *want* to recreate or experience such
an annoying feature?" In part, it's a quest for authenticity. It's the difference between going to an art museum
and seeing original paintings and sculptures, as opposed to just looking at photographs or reading descriptions on the
internet. The photographs and descriptions can never faithfully reproduce the real objects, but the more accurate
they are, the better.
It's also important for understanding the world in which PC users and programmers operated in the early 1980's, the
challenges that programmers faced, and some of the interesting solutions they came up with.
One of those interesting solutions was a program from 1986 called [FlickerFree](/disks/pcx86/tools/other/flickerfree/),
the purpose and value of which would be almost completely lost on someone today if they had never seen or used an original
IBM PC with a CGA.
In fact, FlickerFree proved to be a useful PCjs test case, because it relied on a quirk of CGA hardware that I
hadn't originally implemented: frame buffer wrap-around. FlickerFree resolved the flickering-scroll problem by
treating the CGA's 16Kb of video memory as a giant ring buffer: instead of moving the contents of video memory
"upward", like IBM's ROM BIOS did, FlickerFree would simply shift the video memory start address "downward". After
all, one 25x80 screen of character data required only 4000 bytes, and the CGA had 16,384 bytes of memory.
At first glance, that approach would seem to merely delay the inevitable, because when the start address nears
the end of the buffer, the entire buffer still has to be scrolled. But, as it turned out, the CGA's CRT controller
starts reading from the top of video memory after it reaches the bottom. So all software has to do is write
new lines at the top of the video memory again. If IBM had thought of that trick 5 years earlier, back in 1981,
think of all the years of shared flicker-grief that could have been avoided!
Today, in honor of all that flickering, I'm pleased to announce that [PCx86](devices/pcx86/machine/), one of the
PCjs emulators I'm always trying to improve, now offers **FLICKERING** on all IBM PC Color Graphics configurations.
If you feel the need to override it, you can add *flicker=0* to the URL of your favorite machine; e.g.:
> [www.pcjs.org/disks/pcx86/tools/other/flickerfree/?flicker=0](/disks/pcx86/tools/other/flickerfree/?flicker=0)
In fact, you can set the *flicker* property to any value from 0 to 1; the default is 0.5. This value is applied to
the *opacity* property of the PCx86 <canvas> element, allowing you to mimic whatever degree of "phosphorescent
persistence" you prefer.
You can thank me later.
*[@jeffpar](http://twitter.com/jeffpar)*
*Jul 15, 2017*

View file

@ -68,7 +68,7 @@ more detail, along with a live demonstration of the software, but that's not yet
* [Borland Tools](tools/borland/)
* [IBM Tools](tools/ibm/)
* [Microsoft Tools](tools/microsoft/)
* [More...](tools/misc/)
* [More...](tools/other/)
### Tests

View file

@ -518,7 +518,8 @@
<disk path="/disks/pcx86/tools/microsoft/windows/sdk/3.00/WIN30SDK_DISK08.json">Windows SDK 3.00 (720K Disk 08)</disk>
<disk path="/disks/pcx86/tools/microsoft/windows/sdk/3.00/WIN30SDK_DISK09.json">Windows SDK 3.00 (720K Disk 09)</disk>
<disk path="/disks/pcx86/tools/microsoft/windows/sdk/3.00/WIN30SDK_DISK10.json">Windows SDK 3.00 (720K Disk 10)</disk>
<disk path="/disks/pcx86/tools/misc/enhdebug/ENHDEBUG.json">Enhanced DEBUG 1.32a</disk>
<disk path="/disks/pcx86/tools/other/enhdebug/ENHDEBUG.json">Enhanced DEBUG 1.32a</disk>
<disk path="/disks/pcx86/tools/other/flickerfree/FLICKERFREE.json">FlickerFree 1.0</disk>
<disk path="/disks/pcx86/games/id/wolf3d/1WOLF14.json">Wolfenstein 3D 1.4</disk>
<disk path="/disks/pcx86/games/microsoft/flightsim/1982/FLIGHTSIM-1982.json">MS Flight Simulator (1982)</disk>
<disk path="/disks/pcx86/games/microsoft/flightsim/1984/FLIGHTSIM-1984.json">MS Flight Simulator (1984)</disk>

View file

@ -172,7 +172,7 @@ MS-DOS 3.20 Photos
Here's what one of the MS-DOS 3.20 diskettes looked like.
> ![MS-DOS 3.20 Programmer's Reference](MSDOS320-DISK3-PROGREF1-thumb.jpg "link:MSDOS320-DISK3-PROGREF1.jpg:nogallery")
> [![MS-DOS 3.20 Programmer's Reference](MSDOS320-DISK3-PROGREF1-thumb.jpg)](MSDOS320-DISK3-PROGREF1.jpg)
And the box, courtesy of [www.oldcomputermuseum.com](http://www.oldcomputermuseum.com/os/msdos_3.2.html).

View file

@ -101,7 +101,8 @@
<manifest ref="/disks/pcx86/tools/microsoft/windows/sdk/1.04/manifest.xml"/>
<manifest ref="/disks/pcx86/tools/microsoft/windows/sdk/2.03/manifest.xml"/>
<manifest ref="/disks/pcx86/tools/microsoft/windows/sdk/3.00/manifest.xml"/>
<manifest ref="/disks/pcx86/tools/misc/manifest.xml"/>
<manifest ref="/disks/pcx86/tools/other/enhdebug/manifest.xml"/>
<manifest ref="/disks/pcx86/tools/other/flickerfree/manifest.xml"/>
<manifest ref="/disks/pcx86/games/id/wolf3d/manifest.xml"/>
<manifest ref="/disks/pcx86/games/microsoft/flightsim/1982/manifest.xml"/>
<manifest ref="/disks/pcx86/games/microsoft/flightsim/1984/manifest.xml"/>

View file

@ -13,4 +13,4 @@ Information is available for tools from these vendors:
* [IBM](ibm/)
* [Logitech](logitech/)
* [Microsoft](microsoft/)
* [Other](misc/)
* [Other...](other/)

View file

@ -7,7 +7,7 @@ redirect_from:
---
Microsoft Languages
---
-------------------
* Microsoft BASIC
* [Microsoft C Compilers](/disks/pcx86/tools/microsoft/c/)
@ -15,13 +15,13 @@ Microsoft Languages
* [Microsoft Mouse](/disks/pcx86/tools/microsoft/mouse/)
Microsoft Development Kits
---
--------------------------
* [Microsoft OS/2 Development Kits](/disks/pcx86/tools/microsoft/os2/)
* [Microsoft Windows Development Kits](/disks/pcx86/tools/microsoft/windows/)
Microsoft Languages Newsletters
---
-------------------------------
Below are all the "Microsoft Languages NewsLetters" that Microsoft published in
[PC Tech Journal](/pubs/pc/magazines/pctj/), before they decided to focus exclusively

View file

@ -5,6 +5,6 @@ permalink: /disks/pcx86/tools/microsoft/os2/
---
Microsoft OS/2 Development Kits
---
-------------------------------
* [Microsoft OS/2 SDK 1.02](/disks/pcx86/tools/microsoft/os2/sdk/1.02/)

View file

@ -5,7 +5,7 @@ permalink: /disks/pcx86/tools/microsoft/os2/sdk/1.02/
---
Microsoft OS/2 SDK 1.02
---
-----------------------
This copy of the Microsoft OS/2 SDK (1.02) was obtained from the [WinWorld](https://winworldpc.com/product/os-2-1x/10)
website. Unfortunately, it's missing the **NETWORK** disk, so we've included an empty **NETWORK** disk

View file

@ -5,7 +5,7 @@ permalink: /disks/pcx86/tools/microsoft/os2/sdk/
---
Microsoft OS/2 SDKs
---
-------------------
* [Microsoft OS/2 SDK 1.02](/disks/pcx86/tools/microsoft/os2/sdk/1.02/)

View file

@ -1,12 +0,0 @@
---
layout: page
title: Other PC Tools
permalink: /disks/pcx86/tools/misc/
---
Other PC Tools
---
Information is available for these miscellaneous tools:
* [Enhanced DEBUG](enhdebug/)

View file

@ -0,0 +1,13 @@
---
layout: page
title: Other PC Tools
permalink: /disks/pcx86/tools/other/
---
Other PC Tools
--------------
Information is available for these additional tools:
* [Enhanced DEBUG](enhdebug/)
* [FlickerFree](flickerfree/)

View file

@ -1,11 +1,11 @@
---
layout: page
title: Enhanced DEBUG for PC DOS and MS-DOS
permalink: /disks/pcx86/tools/misc/enhdebug/
title: Enhanced DEBUG for PC-DOS and MS-DOS
permalink: /disks/pcx86/tools/other/enhdebug/
---
Enhanced DEBUG for PC DOS and MS-DOS
---
Enhanced DEBUG for PC-DOS and MS-DOS
------------------------------------
The [PC DOS Retro](https://sites.google.com/site/pcdosretro/) website has documentation for
[Enhanced DEBUG](https://sites.google.com/site/pcdosretro/enhdebug).

View file

@ -2,9 +2,9 @@
<?xml-stylesheet type="text/xsl" href="/versions/pcx86/1.36.0/manifest.xsl"?>
<manifest type="software">
<title>Enhanced DEBUG</title>
<version>1.32a</version>
<source href="https://sites.google.com/site/pcdosretro/enhdebug">PC DOS Retro: Enhanced DEBUG for PC DOS and MS-DOS</source>
<disk id="disk01" size="368640" chs="40:2:9" href="/disks/pcx86/tools/misc/enhdebug/ENHDEBUG.json" md5="6e1456527e463c81bb5c9b4bd3d28bd9" md5json="71a18c0b921741f183cb90c2df1d4d03">
<name>Enhanced DEBUG 1.32a</name>
<disk id="disk01" size="368640" chs="40:2:9" href="/disks/pcx86/tools/other/enhdebug/ENHDEBUG.json" md5="6e1456527e463c81bb5c9b4bd3d28bd9" md5json="71a18c0b921741f183cb90c2df1d4d03">
<file size="20816" time="2016-04-21 09:40:04" attr="0x20" md5="0b9614b461b8287e536bf77bf7e26329">DEBUG.COM</file>
<file size="26198" time="2016-04-21 09:40:04" attr="0x20" md5="98e9b7fec9e2b5c736fd558114c312db">DEBUGX.COM</file>
<file size="27998" time="2016-04-12 11:44:02" attr="0x20" md5="42dca823821dc915dd94abedc5f19c65">DEBUG.TXT</file>

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,378 @@
---
layout: page
title: FlickerFree 1.0
permalink: /disks/pcx86/tools/other/flickerfree/
machines:
- id: ibm5150
type: pcx86
config: /devices/pcx86/machine/5150/cga/256kb/debugger/machine.xml
autoMount:
B:
name: FlickerFree 1.0
autoStart: true
autoType: $date\r$time\rdir\r\xff\xf1b:\rdir\r\xff\xf5ff\r\rfpa\rYff_hist\r\r
---
FlickerFree 1.0
---------------
FlickerFree was a DOS utility created by Steve Gibson in 1986 that improved common IBM PC display operations.
It was reviewed by Peter Norton in the
[July 1986 Issue of PC Magazine](https://books.google.com/books?id=5hdeC0k_JHwC&lpg=PP1&pg=PA73#v=onepage&q&f=false),
who described it as "the most fascinating software I've seen for some time." He goes on to say:
> FlickerFree is a memory-resident program that solves several problems that muck up display screens: snow,
flicker, and lack of speed. The original IBM Color/Graphics Adapter was cursed with an ugly "snow" effect
whenever programs wrote directly to the display memory (unless the programs used time-consuming desnowing
operations). Fortunately, newer display adapters, such as Compaq's nifty built-in adapter, dont suffer
from snow, but they do sometimes suffer from an even greater pain-in-the-eye: screen flickers when information
is scrolled. And all the screens, even with the IBM monochrome adapter, often function much more slowly
than they should.
The demo machine below is configured as an IBM PC (Model 5150) with a CGA and 256Kb of RAM. It will automatically
load FlickerFree (`FF.COM`) and then run the companion FlickerFree Performance Analyzer (`FPA.COM`).
{% include machine.html id="ibm5150" %}
### Directory of FlickerFree 1.0
Volume in drive B is FlickerFree
Directory of B:\
FF COM 22330 04-01-86 12:00a
FPA COM 5438 04-01-86 12:00a
FFIX COM 3590 04-01-86 12:00a
FF_HIST 14610 04-01-86 12:00a
README 859 04-01-86 12:00a
5 file(s) 46827 bytes
0 bytes free
### A Brief History of FlickerFree
From the file `FF_HIST`:
-------------------------------------------------------
A brief history of FlickerFree
- or -
A look at the Technology behind "FlickerFreedom".
- or -
Software efficiency is MUCH more important
than raw hardware power!!
-------------------------------------------------------
THANKS TO IBM!
-------------------------------------------------------
Before I begin, I'd like to take a moment to give
my sincere, public thanks and appreciation to
International Business Machines, Inc. (aka IBM) as
the company which created the IBM PC ... and the
tidal-wave phenomenon of that product's success.
FlickerFree, would not exist if the marketplace
created by IBM was any less vital and wonderful.
FlickerFree has the benefit of being designed many
years AFTER the architecture of the PC was cast in
marketing-hardened concrete ... so I have the
advantage of hindsight which IBM never enjoyed.
If here, or elsewhere, I ever appear to be harsh,
acerbic, or "Holier-than-IBM", please remember that
I NEVER STOP BEING GRATEFUL for the opportunities
created by IBM's success with this machine.
-------------------------------------------------------
-------------------------------------------------------
Phase ONE - discovery
-------------------------------------------------------
It began rather innocently.
Like everyone else, I kept reading about all the things
which could be purchased to speed up my "old clunker"
4.77 Mhz 8088 PC. Each passing "enhancement" article
reminded me that OTHER PEOPLE were computing FASTER
than I..... Hmmmm.....
From among all the TURBO Add-In Cards, V20 chips,
faster clock crystals, new motherboards, weird do-
hickies, and the like, one product caught my eye: The
286-EXPRESS CARD from PC Technologies. This excellent
card is the same one also being sold by Victor,
Mountain Computer, as well as several other well-known
companies.
So one of these beauties found its way into the unused
slot-8 of my trusty (rusty) old XT.
WHIZZZZZZZZzzzzzzzzzzzz . . .. ... (hic!)
Sure enough, the RAW PROCESSING POWER of my system shot
up SIGNIFICANTLY, just as I'd hoped, but to my surprise
and consternation, the SCREEN didn't receive NEARLY the
same speed boost as raw number-crunching.
My prior hardware products: The LPS II Light Pen
System for Apple II computers followed by Koala's
GIBSON Light Pen System, demonstrate that I'm a *BIG*
*FAN* of Display Screens. Screens are *REALLY*
important. They're our only WINDOWS into what's going
ON in there!! And SCREEN SPEED MATTERS . . . A LOT!!
I'm also sure that computers should be FAST! I mean
our EXPERIENCE of them should feel light, responsive,
and snappy under our fingers.
A slow screen makes EVERYTHING feel slow ... and dull.
Something was wrong in IBM screenland.
Out came my trusty IBM PC Technical Reference manual --
I hoped to understand where all of my new 80286's
power-juice was going. After all, the finest hardware
in the world is POWERLESS to perform in the face of
inefficient SOFTWARE. . . .
|
\ /
> GULP! <
/ \
|
I couldn't BELIEVE what I found. Did I say inefficient?
Horrifying would be more accurate. . .
The original authors of IBM's ROM BIOS could not have
known just what a phenomenon the IBM PC would become
... so I suppose that no one spent much (or perhaps
any) time worrying about the efficiency of the lower-
level ROM BIOS routines... after all, they WORKED
didn't they???
Yeah, sure.
It's just that no one ever knew HOW MUCH BETTER the
BIOS might have been or could be. The deeper and closer
I looked, the more room for "improvement" I found.
Though I still didn't know it then, the product which
would become FlickerFree ... was well on its way!
-------------------------------------------------------
Phase TWO - a closer look at the issues
-------------------------------------------------------
The Performance Issue:
The original IBM Color Graphics Display Adapter has an
intrinsic hardware limitation which places a FIXED LOW
RATE on display update speed. However, the CRIME is
that the BIOS ROM, which was written with these Color
Adapter limitations in mind, treats the Color and
Monochrome Display Adapters identically, needlessly
reducing the speed of the Monochrome Display output to
the slow speed of the Color Display!!
What's more, many of the newer color display adapters
do not suffer under the "screen static" limitations of
the original CGA, but they are STILL RUNNING UNDER THE
SAME (OLD) BIOS ..... and are therefore not permitted
to function as fast as their better designs allow!!
Finally, this FIXED LOW DISPLAY RATE is NOT TIED to the
speed and power of your computer's CPU chip ... but is
set by the FIXED RASTER SCAN RATE of the display's
sweeping beam. The BIOS only permits a single byte or
word to be written to the display for each horizontal
scan retrace.
Therefore, the addition of more PROCESSING POWER (like
my addition of the PC Technologies 80286) does not
deliver a proportionate increase in screen performance.
Your FASTER MACHINE simply spends a greater percentage
of its time WAITING for the ROM BIOS to permit a single
character to be written to the display... then waits
again for the next one....
-------------------------------------------------------
The FLICKER issue:
-------------------------------------------------------
Scrolling the screen image UP by one line normally
requires the rapid movement of all 4000 bytes of screen
character data. Essentially, EACH CHARACTER on the
screen is advanced FORWARD by exactly eighty locations.
As we've just seen, the Color Adapter's hardware
limitation prevents this mass data movement from being
performed quickly, so the IBM ROM BIOS simply TURNS THE
SCREEN OFF (to black) while the data is all quickly
moved up one line. (What you can't see can't hurt you?)
Since I found the Flickering effect to be extremely
annoying, and was sure you would too, I decided that it
would just have to go. So I invented a completely new
technique for scrolling the screen's data ... which
results in a effectively INSTANTANEOUS VERTICAL SCROLL.
(If you've seen the INFO page, you've already seen that
super-smooth HORIZONTAL SCROLLING can now be done too.)
-------------------------------------------------------
The Color Issue:
-------------------------------------------------------
I'm sure I'll NEVER understand how a computer could be
sold with a Color Graphics Adapter and Color Monitor
... but without any simple, semi-permanent means for
choosing and setting the display's default screen
colors. That's just unbelievable to me.
You've already seen how much nicer ANY COLORS OTHER
than the PC's default "DimWhite-on-Black" appears ...
and you may have already used the on-screen menu to set
up your own preferred screen colors. So enough said.
-------------------------------------------------------
The Inefficient Code Issue:
-------------------------------------------------------
I don't want to be critical of anyone else's work -
especially behind their back, so I'll keep this short,
polite, and a bit white washed:
The video portion (at least) of the standard IBM PC ROM
BIOS was not skillfully written. I don't need to stand
here in judgment, since FlickerFree is the result of
what I consider skillful writing (he said modestly)...
and you have seen the difference for yourself.
-------------------------------------------------------
Phase THREE - implementation of a product
-------------------------------------------------------
So I began dabbling here and there, counting each and
every single "thought" cycle of the PC's 8088 micro-
processor. Even though each "tick" of its clockwork
brain would make a difference of only 210 Billionths of
a second, I knew how quickly they tend to all add up.
(Having waited for your display screen, you know too!)
Every part of this project HAD to be hand-written in
100% machine language. Fortunately (and happily) I'm
one of that dying breed who eats and breathes (and
loves) machine language. I've never been comfortable
tolerating the inevitable performance loss of higher
level languages. I prefer the experience of that
special hand-crafted feeling ... the power, and control
which comes with machine language.
I was gaining ground.
With the new FlickerFree technologies up, working, and
tightly hand-coded for maximum speed and power, I had
two major aspects remaining: User Interface and
Software Compatibility.
I decided to go all out on the user interface. I've
always felt that little things make big differences.
Like the diagonal on-screen wipe.
I didn't just want *MY* menus to explode onto the
screen like so many other products. I wanted something
smoother. After hand-coding about ten "special-
effects" I settled upon the diagonal wipe.
But it wasn't right yet.
The EASY WAY for the menu to operate would have been to
let it "wipe-on" first, WITHOUT the inverse highlight
bars ... and add them AFTERWARD. That would have been
easy. I tried it, and knew it was wrong. The wipe
phase was so smooth and "proper" that the subsequent
sudden appearance of the inverse highlights carried the
impression of an afterthought. So, I did it the hard
way. The menu is completely built (WITH the inverse
highlight bars) "off stage", and only then wiped onto
the screen, complete.
I wouldn't ship it any other way.
What about the horizontal smooth-scroll?? Well I guess
I was just showing off ... but I never get tired of
seeing it slide by!
-------------------------------------------------------
Software Compatibility
-------------------------------------------------------
Boy... there is a nightmare! But I don't suppose I have
to tell you about the mish-mash of today's software
compatibility problems. It's all so technical and
uninteresting that I won't waste your time further,
except to say that fully one third of my time (and two-
thirds of my anxiety!) was devoted to developing the
resident technology behind FlickerFree. Again, I'm
proud of the result and know that it speaks for itself.
*******************************************************
-------------------------------------------------------
So, What's next???
Well, I'm at work on product number two (code name: P-2)
As a paid, registered, owner of FlickerFree, you'll be
receiving early notification of P-2's availability.
I'm as excited about it as I was about FlickerFree ...
and I know you will be too!!
In the mean time, enjoy being FlickerFreed, and thanks
again for you support and your purchase!
Steve Gibson
April, 1986
Irvine, CA, USA
- End Of File -

View file

@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="/versions/pcx86/1.36.0/manifest.xsl"?>
<manifest type="software">
<title>FlickerFree</title>
<version>1.0</version>
<type>Utility</type>
<category>Enhancement</category>
<author>Steve Gibson</author>
<releaseDate>1986</releaseDate>
<disk id="disk01" size="184320" chs="40:1:9" img="archive/FLICKERFREE.img" href="/disks/pcx86/tools/other/flickerfree/FLICKERFREE.json" md5="f4d6055fa14adffc754c2fadee04ac82" md5json="b9f60250d63a162c2b65c884c4bcba40">
<file size="22330" time="1986-03-31 23:00:00" attr="0x20">FF.COM</file>
<file size="3590" time="1986-03-31 23:00:00" attr="0x20">FFIX.COM</file>
<file size="14610" time="1986-03-31 23:00:00" attr="0x20">FF_HIST</file>
<file size="5438" time="1986-03-31 23:00:00" attr="0x20">FPA.COM</file>
<file size="859" time="1986-03-31 23:00:00" attr="0x20">README</file>
</disk>
</manifest>

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -264,12 +264,14 @@ Bus.prototype.cleanMemory = function(addr, size)
{
var fClean = true;
var iBlock = addr >>> this.nBlockShift;
var sizeBlock = this.nBlockSize - (addr & this.nBlockLimit);
while (size > 0 && iBlock < this.aMemBlocks.length) {
if (this.aMemBlocks[iBlock].fDirty) {
this.aMemBlocks[iBlock].fDirty = fClean = false;
this.aMemBlocks[iBlock].fDirtyEver = true;
}
size -= this.nBlockSize;
size -= sizeBlock;
sizeBlock = this.nBlockSize;
iBlock++;
}
return fClean;

View file

@ -296,12 +296,14 @@ class Bus8080 extends Component {
{
var fClean = true;
var iBlock = addr >>> this.nBlockShift;
var sizeBlock = this.nBlockSize - (addr & this.nBlockLimit);
while (size > 0 && iBlock < this.aMemBlocks.length) {
if (this.aMemBlocks[iBlock].fDirty) {
this.aMemBlocks[iBlock].fDirty = fClean = false;
this.aMemBlocks[iBlock].fDirtyEver = true;
}
size -= this.nBlockSize;
size -= sizeBlock;
sizeBlock = this.nBlockSize;
iBlock++;
}
return fClean;

View file

@ -345,12 +345,14 @@ class Bus extends Component {
{
var fClean = true;
var iBlock = addr >>> this.nBlockShift;
var sizeBlock = this.nBlockSize - (addr & this.nBlockLimit);
while (size > 0 && iBlock < this.aMemBlocks.length) {
if (this.aMemBlocks[iBlock].fDirty) {
this.aMemBlocks[iBlock].fDirty = fClean = false;
this.aMemBlocks[iBlock].fDirtyEver = true;
}
size -= this.nBlockSize;
size -= sizeBlock;
sizeBlock = this.nBlockSize;
iBlock++;
}
return fClean;

File diff suppressed because it is too large Load diff

View file

@ -327,12 +327,14 @@ class BusPDP10 extends Component {
{
var fClean = true;
var iBlock = addr >>> this.nBlockShift;
var sizeBlock = this.nBlockSize - (addr & this.nBlockLimit);
while (size > 0 && iBlock < this.aBusBlocks.length) {
if (this.aBusBlocks[iBlock].fDirty) {
this.aBusBlocks[iBlock].fDirty = fClean = false;
this.aBusBlocks[iBlock].fDirtyEver = true;
}
size -= this.nBlockSize;
size -= sizeBlock;
sizeBlock = this.nBlockSize;
iBlock++;
}
return fClean;

View file

@ -475,12 +475,14 @@ class BusPDP11 extends Component {
{
var fClean = true;
var iBlock = addr >>> this.nBlockShift;
var sizeBlock = this.nBlockSize - (addr & this.nBlockLimit);
while (size > 0 && iBlock < this.aBusBlocks.length) {
if (this.aBusBlocks[iBlock].fDirty) {
this.aBusBlocks[iBlock].fDirty = fClean = false;
this.aBusBlocks[iBlock].fDirtyEver = true;
}
size -= this.nBlockSize;
size -= sizeBlock;
sizeBlock = this.nBlockSize;
iBlock++;
}
return fClean;

View file

@ -5,6 +5,6 @@ permalink: /tests/
---
Test Resources
---
--------------
An assortment of [PC Tests](pc/) is available.
An assortment of [PCx86 Tests](pcx86/) is available.

View file

@ -182,10 +182,10 @@ function xf(a,b,c,d){var e=8>=a.Ca?8:16,f=8<e?15:0,g=a.ba.length/e,h=!1===d,k={g
(u&15)*b,(u>>4)*c)}return k}l.va=function(a,b){return b||!a||this.restore(a)?!0:!1};l.ua=function(a){return!a||this.save()};l.save=function(){var a=new vd(this);a.set(0,[]);return a.data()};l.restore=function(){return!0};
l.Wa=function(){var a=!1;if(this.b){if(this.b.Wa){a="100%";if(screen&&screen.width&&screen.height){var b=screen.width/screen.height,c=this.M/this.H;b>c&&(a=Math.round(c/b*100)+"%")}this.Sa?(this.G.style.width=a,this.G.style.width=a,this.G.style.display="block",this.G.style.margin="auto"):(this.b.style.width=a,this.b.style.height="auto");this.b.style.backgroundColor="black";this.b.Wa();a=!0}this.V&&this.V.focus()}return a};
function of(a,b){!b&&a.b&&(a.Sa?a.G.style.width=a.G.style.height="":a.b.style.width=a.b.style.height="");Gb(a,"notifyFullScreen("+b+")")}function qf(a,b){a.eb=b;a.W=!1;if(void 0===a.A||a.A.length!=a.eb)a.A=Array(a.eb)}function Bf(a,b,c,d,e){d=a.g?(b.height-c-1)*b.width+d:c+d*b.width;e&&a.Y==sf&&(208<=c&&236>c?e=a.X+tf:28<=c&&72>c&&(e=a.X+uf));a=a.U[e];d*=a.length;b.data[d]=a[0];b.data[d+1]=a[1];b.data[d+2]=a[2];b.data[d+3]=a[3]}
function bd(a,b){var c=!0;if(!b){a.oa&&(120==a.oa?a.gb&1?(Td(a.w,2),c=!1):Td(a.w,1):Td(a.w,4));if(c&&a.W&&a.L){for(var d=a.I,e=a.L,f=!0,g=a.ka>>>d.g;0<e&&g<d.b.length;)d.b[g].Da&&(d.b[g].Da=f=!1,d.b[g].Dc=!0),e-=d.u,g++;f&&(c=!1)}Yc(a.w,a.vb,1E3/Math.max(a.ib,a.oa));a.gb++}if(c)if(1<a.ga)switch(a.Y){case vf:for(var c=a.ka,d=-1,e=0,f=60==a.hb?2:5,h=g=0,k=-1;e<a.Z;){var p=0,u=c,v=d,B=a.O;for(v!=wf&&(B>>=1);;){var y=Xb(a.I,u++);if((y&Cf)==Cf){var w=Xb(a.I,u++),d=w&Df,c=(w&Ef)<<8|Xb(a.I,u),c=c+(w&Ff?
Gf:Hf);break}if(p<B)a.fa[p++]=y;else break}if(f)f--;else{for(;p<a.fa.length;)a.fa[p++]=0;if(0<=v)for(u=a.W&&a.A[g]==B,a.A[g++]=B,B=0;B<p;B++){y=a.fa[B];if(!u||y!==a.A[g]){a.A[k=g]=y;var w=a,C=a.ta,T=y&127;if(y=w.T[v][y&128?1:0]){var ya=(T&15)*y.ga,T=(T>>4)*y.ca,L,za,sa,Aa,ta=y.ga,Ba=y.ca;C?(L=B*w.ga,za=e*w.ca,sa=w.ga,Aa=w.ca):(L=B*w.Ka,za=e*w.La,sa=w.Ka,Aa=w.La);y.ga>w.ga&&(L*=2,sa*=2);y.ca>w.ca&&(v==Af&&(T+=w.ca),Ba=w.ca);C?C.drawImage(y.canvas,ya,T,ta,Ba,L,za,sa,Aa):(L+=0,za+=0,w.j.drawImage(y.canvas,
ya,T,ta,Ba,L,za,sa,Aa))}h++}g++}e++}}a.W=!0;!b&&a.wa&&1==h&&(a.A[k]=-1,h=0);a.wa=!1;(h||b)&&a.ta&&a.j.drawImage(a.D,0,a.sa,a.C,a.N-a.ca,0,0,a.Bb,a.ud)}else{e=a.ka;f=e+a.L;k=h=g=0;b=a.C;p=0;c=a.N;v=d=0;u=a.na;B=(1<<u)-1;a.zd&&(u=-u,v=16+u);for(;e<f;){w=Zb(a.I,e);if(a.W&&w===a.A[g])h+=a.fb;else{a.A[g]=w;(C=v)&&(w=w>>8|(w&255)<<8);h<b&&(b=h);for(y=a.fb;y--;)ya=w>>C&B,Bf(a,a.Ua,h++,k,ya),C+=u;h>p&&(p=h);k<c&&(c=k);k>=d&&(d=k+1)}e+=2;g++;if(h>=a.C&&(h=0,k++,k>a.N))break}a.W=!0;b<a.C&&(e=p-b,d-=c,a.g&&
(f=b,g=e,b=c,e=d,c=a.C-(f+g),d=g),a.ta.putImageData(a.Ua,0,0,b,c,e,d),a.j.drawImage(a.D,0,0,a.D.width,a.D.height,0,0,a.M,a.H))}}var tf=0,uf=1,rf=2,nf=0,sf=1,vf=2,mf={SI1978:sf,VT100:vf},wf=96,yf=64,zf=32,Af=0,Cf=127,Ef=15,Ff=16,Df=96,Gf=8192,Hf=16384;
function bd(a,b){var c=!0;if(!b){a.oa&&(120==a.oa?a.gb&1?(Td(a.w,2),c=!1):Td(a.w,1):Td(a.w,4));if(c&&a.W&&a.L){for(var d=a.I,e=a.ka,f=a.L,g=!0,h=e>>>d.g,e=d.u-(e&d.j);0<f&&h<d.b.length;)d.b[h].Da&&(d.b[h].Da=g=!1,d.b[h].Dc=!0),f-=e,e=d.u,h++;g&&(c=!1)}Yc(a.w,a.vb,1E3/Math.max(a.ib,a.oa));a.gb++}if(c)if(1<a.ga)switch(a.Y){case vf:for(var c=a.ka,d=-1,f=0,g=60==a.hb?2:5,e=h=0,k=-1;f<a.Z;){var p=0,u=c,v=d,B=a.O;for(v!=wf&&(B>>=1);;){var y=Xb(a.I,u++);if((y&Cf)==Cf){var w=Xb(a.I,u++),d=w&Df,c=(w&Ef)<<
8|Xb(a.I,u),c=c+(w&Ff?Gf:Hf);break}if(p<B)a.fa[p++]=y;else break}if(g)g--;else{for(;p<a.fa.length;)a.fa[p++]=0;if(0<=v)for(u=a.W&&a.A[h]==B,a.A[h++]=B,B=0;B<p;B++){y=a.fa[B];if(!u||y!==a.A[h]){a.A[k=h]=y;var w=a,C=a.ta,T=y&127;if(y=w.T[v][y&128?1:0]){var ya=(T&15)*y.ga,T=(T>>4)*y.ca,L,za,sa,Aa,ta=y.ga,Ba=y.ca;C?(L=B*w.ga,za=f*w.ca,sa=w.ga,Aa=w.ca):(L=B*w.Ka,za=f*w.La,sa=w.Ka,Aa=w.La);y.ga>w.ga&&(L*=2,sa*=2);y.ca>w.ca&&(v==Af&&(T+=w.ca),Ba=w.ca);C?C.drawImage(y.canvas,ya,T,ta,Ba,L,za,sa,Aa):(L+=0,
za+=0,w.j.drawImage(y.canvas,ya,T,ta,Ba,L,za,sa,Aa))}e++}h++}f++}}a.W=!0;!b&&a.wa&&1==e&&(a.A[k]=-1,e=0);a.wa=!1;(e||b)&&a.ta&&a.j.drawImage(a.D,0,a.sa,a.C,a.N-a.ca,0,0,a.Bb,a.ud)}else{f=a.ka;g=f+a.L;k=e=h=0;b=a.C;p=0;c=a.N;v=d=0;u=a.na;B=(1<<u)-1;a.zd&&(u=-u,v=16+u);for(;f<g;){w=Zb(a.I,f);if(a.W&&w===a.A[h])e+=a.fb;else{a.A[h]=w;(C=v)&&(w=w>>8|(w&255)<<8);e<b&&(b=e);for(y=a.fb;y--;)ya=w>>C&B,Bf(a,a.Ua,e++,k,ya),C+=u;e>p&&(p=e);k<c&&(c=k);k>=d&&(d=k+1)}f+=2;h++;if(e>=a.C&&(e=0,k++,k>a.N))break}a.W=
!0;b<a.C&&(f=p-b,d-=c,a.g&&(g=b,h=f,b=c,f=d,c=a.C-(g+h),d=h),a.ta.putImageData(a.Ua,0,0,b,c,f,d),a.j.drawImage(a.D,0,0,a.D.width,a.D.height,0,0,a.M,a.H))}}var tf=0,uf=1,rf=2,nf=0,sf=1,vf=2,mf={SI1978:sf,VT100:vf},wf=96,yf=64,zf=32,Af=0,Cf=127,Ef=15,Ff=16,Df=96,Gf=8192,Hf=16384;
Va(function(){for(var a=nb(document,"pc8080","video"),b=0;b<a.length;b++){var c=a[b],d=pb(c),e=document.createElement("canvas");if(!e||!e.getContext){c.innerHTML="<br/>Missing &lt;canvas&gt; support. Please try a newer web browser.";break}e.setAttribute("class","pcjs-canvas");e.setAttribute("width",d.screenWidth);e.setAttribute("height",d.screenHeight);e.style.backgroundColor=d.screenColor;e.style.height="auto";0<=Ja().indexOf("MSIE")&&(c.onresize=function(a,b,c,d){return function(){b.style.height=
(a.clientWidth*d/c|0)+"px"}}(c,e,d.screenWidth,d.screenHeight),c.onresize());var f=+(d.aspect||Qa("aspect"));f&&.3<=f&&3.33>=f&&(Ua("onresize",function(a,b,c){return function(){b.style.height=(a.clientWidth/c|0)+"px"}}(c,e,f)),window.onresize());c.appendChild(e);f=document.createElement("textarea");Pa("iOS")&&(f.setAttribute("autocapitalize","off"),f.setAttribute("autocorrect","off"),f.style.fontSize="16px");c.appendChild(f);var g=e.getContext("2d"),d=new lf(d,e,g,f,c);mb(d,c)}});
function If(a){t.call(this,"SerialPort",a,8388608);this.T=+a.adapter;switch(this.T){case 0:this.U=0;this.X=2;break;default:r("Unrecognized serial adapter #"+this.T);return}this.g=this.j=null;this.V=a.tabSize;this.S=a.charBOL;this.u=0;this.N=!1;this.D=!0;var b=a.binding;if("console"==b)this.j="";else{var c;a=Jf;b&&(void 0===c&&(c="Panel"),(c=sb(c,this.id))&&(b=c.P[b])&&this.da(null,a,b))}this.A="";this.b=this.Qa=this.H=null;this.exports={connect:this.Fc,receiveData:this.Nb,receiveStatus:this.oe}}

File diff suppressed because one or more lines are too long

View file

@ -4565,12 +4565,14 @@ class Bus8080 extends Component {
{
var fClean = true;
var iBlock = addr >>> this.nBlockShift;
var sizeBlock = this.nBlockSize - (addr & this.nBlockLimit);
while (size > 0 && iBlock < this.aMemBlocks.length) {
if (this.aMemBlocks[iBlock].fDirty) {
this.aMemBlocks[iBlock].fDirty = fClean = false;
this.aMemBlocks[iBlock].fDirtyEver = true;
}
size -= this.nBlockSize;
size -= sizeBlock;
sizeBlock = this.nBlockSize;
iBlock++;
}
return fClean;

View file

@ -172,10 +172,10 @@ function Gd(a,b,c,d){var e=8>=a.ua?8:16,f=8<e?15:0,g=a.W.length/e,h=!1===d,m={M:
(x&15)*b,(x>>4)*c)}return m}k.ca=function(a,b){return b||!a||this.restore(a)?!0:!1};k.ba=function(a){return!a||this.save()};k.save=function(){var a=new E(this);a.set(0,[]);return a.data()};k.restore=function(){return!0};
k.Ga=function(){var a=!1;if(this.a){if(this.a.Ga){a="100%";if(screen&&screen.width&&screen.height){var b=screen.width/screen.height,c=this.A/this.s;b>c&&(a=Math.round(c/b*100)+"%")}this.Da?(this.o.style.width=a,this.o.style.width=a,this.o.style.display="block",this.o.style.margin="auto"):(this.a.style.width=a,this.a.style.height="auto");this.a.style.backgroundColor="black";this.a.Ga();a=!0}this.J&&this.J.focus()}return a};
function xd(a,b){!b&&a.a&&(a.Da?a.o.style.width=a.o.style.height="":a.a.style.width=a.a.style.height="")}function zd(a,b){a.La=b;a.N=!1;if(void 0===a.g||a.g.length!=a.La)a.g=Array(a.La)}function Kd(a,b,c,d,e){d=a.b?(b.height-c-1)*b.width+d:c+d*b.width;e&&a.P==Bd&&(208<=c&&236>c?e=a.O+Cd:28<=c&&72>c&&(e=a.O+Dd));a=a.I[e];d*=a.length;b.data[d]=a[0];b.data[d+1]=a[1];b.data[d+2]=a[2];b.data[d+3]=a[3]}
function dc(a,b){var c=!0;if(!b){a.ha&&(120==a.ha?a.Na&1?(Bc(a.m,2),c=!1):Bc(a.m,1):Bc(a.m,4));if(c&&a.N&&a.v){for(var d=a.u,e=a.v,f=!0,g=a.da>>>d.b;0<e&&g<d.a.length;)d.a[g].ja&&(d.a[g].ja=f=!1,d.a[g].Zb=!0),e-=d.c,g++;f&&(c=!1)}$b(a.m,a.Pa,1E3/Math.max(a.Oa,a.ha));a.Na++}if(c)if(1<a.M)switch(a.P){case Ed:for(var c=a.da,d=-1,e=0,f=60==a.bc?2:5,h=g=0,m=-1;e<a.R;){var q=0,x=c,w=d,L=a.C;for(w!=Fd&&(L>>=1);;){var z=sb(a.u,x++);if((z&Ld)==Ld){var v=sb(a.u,x++),d=v&Md,c=(v&Nd)<<8|sb(a.u,x),c=c+(v&Od?Pd:
Qd);break}if(q<L)a.X[q++]=z;else break}if(f)f--;else{for(;q<a.X.length;)a.X[q++]=0;if(0<=w)for(x=a.N&&a.g[g]==L,a.g[g++]=L,L=0;L<q;L++){z=a.X[L];if(!x||z!==a.g[g]){a.g[m=g]=z;var v=a,F=a.ma,U=z&127;if(z=v.H[w][z&128?1:0]){var Z=(U&15)*z.M,U=(U>>4)*z.L,da,xa,Wa,qb,hd=z.M,ec=z.L;F?(da=L*v.M,xa=e*v.L,Wa=v.M,qb=v.L):(da=L*v.va,xa=e*v.wa,Wa=v.va,qb=v.wa);z.M>v.M&&(da*=2,Wa*=2);z.L>v.L&&(w==Jd&&(U+=v.L),ec=v.L);F?F.drawImage(z.canvas,Z,U,hd,ec,da,xa,Wa,qb):(da+=0,xa+=0,v.c.drawImage(z.canvas,Z,U,hd,ec,
da,xa,Wa,qb))}h++}g++}e++}}a.N=!0;!b&&a.na&&1==h&&(a.g[m]=-1,h=0);a.na=!1;(h||b)&&a.ma&&a.c.drawImage(a.l,0,a.la,a.j,a.B-a.L,0,0,a.kb,a.jc)}else{e=a.da;f=e+a.v;m=h=g=0;b=a.j;q=0;c=a.B;w=d=0;x=a.ea;L=(1<<x)-1;a.Tc&&(x=-x,w=16+x);for(;e<f;){v=a.u;F=e;z=F&v.f;Z=(F&v.g)>>>v.b;v=z!=v.f?v.a[Z].ec(z,F):v.a[Z++].fb(z,F)|v.a[Z&v.o].fb(0,F+1)<<8;if(a.N&&v===a.g[g])h+=a.Ma;else{a.g[g]=v;(F=w)&&(v=v>>8|(v&255)<<8);h<b&&(b=h);for(z=a.Ma;z--;)Z=v>>F&L,Kd(a,a.Ea,h++,m,Z),F+=x;h>q&&(q=h);m<c&&(c=m);m>=d&&(d=m+1)}e+=
2;g++;if(h>=a.j&&(h=0,m++,m>a.B))break}a.N=!0;b<a.j&&(e=q-b,d-=c,a.b&&(f=b,g=e,b=c,e=d,c=a.j-(f+g),d=g),a.ma.putImageData(a.Ea,0,0,b,c,e,d),a.c.drawImage(a.l,0,0,a.l.width,a.l.height,0,0,a.A,a.s))}}var Cd=0,Dd=1,Ad=2,wd=0,Bd=1,Ed=2,vd={SI1978:Bd,VT100:Ed},Fd=96,Hd=64,Id=32,Jd=0,Ld=127,Nd=15,Od=16,Md=96,Pd=8192,Qd=16384;
function dc(a,b){var c=!0;if(!b){a.ha&&(120==a.ha?a.Na&1?(Bc(a.m,2),c=!1):Bc(a.m,1):Bc(a.m,4));if(c&&a.N&&a.v){for(var d=a.u,e=a.da,f=a.v,g=!0,h=e>>>d.b,e=d.c-(e&d.f);0<f&&h<d.a.length;)d.a[h].ja&&(d.a[h].ja=g=!1,d.a[h].Zb=!0),f-=e,e=d.c,h++;g&&(c=!1)}$b(a.m,a.Pa,1E3/Math.max(a.Oa,a.ha));a.Na++}if(c)if(1<a.M)switch(a.P){case Ed:for(var c=a.da,d=-1,f=0,g=60==a.bc?2:5,e=h=0,m=-1;f<a.R;){var q=0,x=c,w=d,L=a.C;for(w!=Fd&&(L>>=1);;){var z=sb(a.u,x++);if((z&Ld)==Ld){var v=sb(a.u,x++),d=v&Md,c=(v&Nd)<<8|
sb(a.u,x),c=c+(v&Od?Pd:Qd);break}if(q<L)a.X[q++]=z;else break}if(g)g--;else{for(;q<a.X.length;)a.X[q++]=0;if(0<=w)for(x=a.N&&a.g[h]==L,a.g[h++]=L,L=0;L<q;L++){z=a.X[L];if(!x||z!==a.g[h]){a.g[m=h]=z;var v=a,F=a.ma,U=z&127;if(z=v.H[w][z&128?1:0]){var Z=(U&15)*z.M,U=(U>>4)*z.L,da,xa,Wa,qb,hd=z.M,ec=z.L;F?(da=L*v.M,xa=f*v.L,Wa=v.M,qb=v.L):(da=L*v.va,xa=f*v.wa,Wa=v.va,qb=v.wa);z.M>v.M&&(da*=2,Wa*=2);z.L>v.L&&(w==Jd&&(U+=v.L),ec=v.L);F?F.drawImage(z.canvas,Z,U,hd,ec,da,xa,Wa,qb):(da+=0,xa+=0,v.c.drawImage(z.canvas,
Z,U,hd,ec,da,xa,Wa,qb))}e++}h++}f++}}a.N=!0;!b&&a.na&&1==e&&(a.g[m]=-1,e=0);a.na=!1;(e||b)&&a.ma&&a.c.drawImage(a.l,0,a.la,a.j,a.B-a.L,0,0,a.kb,a.jc)}else{f=a.da;g=f+a.v;m=e=h=0;b=a.j;q=0;c=a.B;w=d=0;x=a.ea;L=(1<<x)-1;a.Tc&&(x=-x,w=16+x);for(;f<g;){v=a.u;F=f;z=F&v.f;Z=(F&v.g)>>>v.b;v=z!=v.f?v.a[Z].ec(z,F):v.a[Z++].fb(z,F)|v.a[Z&v.o].fb(0,F+1)<<8;if(a.N&&v===a.g[h])e+=a.Ma;else{a.g[h]=v;(F=w)&&(v=v>>8|(v&255)<<8);e<b&&(b=e);for(z=a.Ma;z--;)Z=v>>F&L,Kd(a,a.Ea,e++,m,Z),F+=x;e>q&&(q=e);m<c&&(c=m);m>=
d&&(d=m+1)}f+=2;h++;if(e>=a.j&&(e=0,m++,m>a.B))break}a.N=!0;b<a.j&&(f=q-b,d-=c,a.b&&(g=b,h=f,b=c,f=d,c=a.j-(g+h),d=h),a.ma.putImageData(a.Ea,0,0,b,c,f,d),a.c.drawImage(a.l,0,0,a.l.width,a.l.height,0,0,a.A,a.s))}}var Cd=0,Dd=1,Ad=2,wd=0,Bd=1,Ed=2,vd={SI1978:Bd,VT100:Ed},Fd=96,Hd=64,Id=32,Jd=0,Ld=127,Nd=15,Od=16,Md=96,Pd=8192,Qd=16384;
Fa(function(){for(var a=y(document,"pc8080","video"),b=0;b<a.length;b++){var c=a[b],d=A(c),e=document.createElement("canvas");if(!e||!e.getContext){c.innerHTML="<br/>Missing &lt;canvas&gt; support. Please try a newer web browser.";break}e.setAttribute("class","pcjs-canvas");e.setAttribute("width",d.screenWidth);e.setAttribute("height",d.screenHeight);e.style.backgroundColor=d.screenColor;e.style.height="auto";0<=(window?window.navigator.userAgent:"").indexOf("MSIE")&&(c.onresize=function(a,b,c,d){return function(){b.style.height=
(a.clientWidth*d/c|0)+"px"}}(c,e,d.screenWidth,d.screenHeight),c.onresize());var f=+(d.aspect||Ca("aspect"));f&&.3<=f&&3.33>=f&&(Ea("onresize",function(a,b,c){return function(){b.style.height=(a.clientWidth/c|0)+"px"}}(c,e,f)),window.onresize());c.appendChild(e);f=document.createElement("textarea");Ba("iOS")&&(f.setAttribute("autocapitalize","off"),f.setAttribute("autocorrect","off"),f.style.fontSize="16px");c.appendChild(f);var g=e.getContext("2d"),d=new ud(d,e,g,f,c);Ta(d,c)}});
function Rd(a){t.call(this,"SerialPort",a);this.H=+a.adapter;switch(this.H){case 0:this.I=0;this.O=2;break;default:r("Unrecognized serial adapter #"+this.H);return}this.b=this.c=null;this.J=a.tabSize;this.F=a.charBOL;this.f=0;this.B=!1;this.l=!0;var b=a.binding;if("console"==b)this.c="";else{var c;a=Sd;b&&(void 0===c&&(c="Panel"),(c=Xa(c,this.id))&&(b=c.w[b])&&this.S(null,a,b))}this.g="";this.a=this.Aa=this.s=null;this.exports={connect:this.ac,receiveData:this.nb,receiveStatus:this.Kd}}l(Rd,t);

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load diff

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -5762,12 +5762,14 @@ class BusPDP10 extends Component {
{
var fClean = true;
var iBlock = addr >>> this.nBlockShift;
var sizeBlock = this.nBlockSize - (addr & this.nBlockLimit);
while (size > 0 && iBlock < this.aBusBlocks.length) {
if (this.aBusBlocks[iBlock].fDirty) {
this.aBusBlocks[iBlock].fDirty = fClean = false;
this.aBusBlocks[iBlock].fDirtyEver = true;
}
size -= this.nBlockSize;
size -= sizeBlock;
sizeBlock = this.nBlockSize;
iBlock++;
}
return fClean;

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -6943,12 +6943,14 @@ class BusPDP11 extends Component {
{
var fClean = true;
var iBlock = addr >>> this.nBlockShift;
var sizeBlock = this.nBlockSize - (addr & this.nBlockLimit);
while (size > 0 && iBlock < this.aBusBlocks.length) {
if (this.aBusBlocks[iBlock].fDirty) {
this.aBusBlocks[iBlock].fDirty = fClean = false;
this.aBusBlocks[iBlock].fDirtyEver = true;
}
size -= this.nBlockSize;
size -= sizeBlock;
sizeBlock = this.nBlockSize;
iBlock++;
}
return fClean;

File diff suppressed because one or more lines are too long