mirror of https://github.com/smartykit/apple1.git
POM1 cross-platform emulator by Verhille Arnaud to test SmartyKit 1 ROM with software
*************************************** Pom1 Version 0.61 (21 juin 2001) *************************************** Written by VERHILLE Arnaud E.mail : gist@wanadoo.fr http://www.chez.com/apple1/
This commit is contained in:
parent
1baa16a5fe
commit
a058720e39
|
@ -0,0 +1,341 @@
|
|||
GNU GENERAL PUBLIC LICENSE
|
||||
Version 2, June 1991
|
||||
|
||||
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
|
||||
675 Mass Ave, Cambridge, MA 02139, USA
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
Preamble
|
||||
|
||||
The licenses for most software are designed to take away your
|
||||
freedom to share and change it. By contrast, the GNU General Public
|
||||
License is intended to guarantee your freedom to share and change free
|
||||
software--to make sure the software is free for all its users. This
|
||||
General Public License applies to most of the Free Software
|
||||
Foundation's software and to any other program whose authors commit to
|
||||
using it. (Some other Free Software Foundation software is covered by
|
||||
the GNU Library General Public License instead.) You can apply it to
|
||||
your programs, too.
|
||||
|
||||
When we speak of free software, we are referring to freedom, not
|
||||
price. Our General Public Licenses are designed to make sure that you
|
||||
have the freedom to distribute copies of free software (and charge for
|
||||
this service if you wish), that you receive source code or can get it
|
||||
if you want it, that you can change the software or use pieces of it
|
||||
in new free programs; and that you know you can do these things.
|
||||
|
||||
To protect your rights, we need to make restrictions that forbid
|
||||
anyone to deny you these rights or to ask you to surrender the rights.
|
||||
These restrictions translate to certain responsibilities for you if you
|
||||
distribute copies of the software, or if you modify it.
|
||||
|
||||
For example, if you distribute copies of such a program, whether
|
||||
gratis or for a fee, you must give the recipients all the rights that
|
||||
you have. You must make sure that they, too, receive or can get the
|
||||
source code. And you must show them these terms so they know their
|
||||
rights.
|
||||
|
||||
We protect your rights with two steps: (1) copyright the software, and
|
||||
(2) offer you this license which gives you legal permission to copy,
|
||||
distribute and/or modify the software.
|
||||
|
||||
Also, for each author's protection and ours, we want to make certain
|
||||
that everyone understands that there is no warranty for this free
|
||||
software. If the software is modified by someone else and passed on, we
|
||||
want its recipients to know that what they have is not the original, so
|
||||
that any problems introduced by others will not reflect on the original
|
||||
authors' reputations.
|
||||
|
||||
Finally, any free program is threatened constantly by software
|
||||
patents. We wish to avoid the danger that redistributors of a free
|
||||
program will individually obtain patent licenses, in effect making the
|
||||
program proprietary. To prevent this, we have made it clear that any
|
||||
patent must be licensed for everyone's free use or not licensed at all.
|
||||
|
||||
The precise terms and conditions for copying, distribution and
|
||||
modification follow.
|
||||
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||
|
||||
0. This License applies to any program or other work which contains
|
||||
a notice placed by the copyright holder saying it may be distributed
|
||||
under the terms of this General Public License. The "Program", below,
|
||||
refers to any such program or work, and a "work based on the Program"
|
||||
means either the Program or any derivative work under copyright law:
|
||||
that is to say, a work containing the Program or a portion of it,
|
||||
either verbatim or with modifications and/or translated into another
|
||||
language. (Hereinafter, translation is included without limitation in
|
||||
the term "modification".) Each licensee is addressed as "you".
|
||||
|
||||
Activities other than copying, distribution and modification are not
|
||||
covered by this License; they are outside its scope. The act of
|
||||
running the Program is not restricted, and the output from the Program
|
||||
is covered only if its contents constitute a work based on the
|
||||
Program (independent of having been made by running the Program).
|
||||
Whether that is true depends on what the Program does.
|
||||
|
||||
1. You may copy and distribute verbatim copies of the Program's
|
||||
source code as you receive it, in any medium, provided that you
|
||||
conspicuously and appropriately publish on each copy an appropriate
|
||||
copyright notice and disclaimer of warranty; keep intact all the
|
||||
notices that refer to this License and to the absence of any warranty;
|
||||
and give any other recipients of the Program a copy of this License
|
||||
along with the Program.
|
||||
|
||||
You may charge a fee for the physical act of transferring a copy, and
|
||||
you may at your option offer warranty protection in exchange for a fee.
|
||||
|
||||
2. You may modify your copy or copies of the Program or any portion
|
||||
of it, thus forming a work based on the Program, and copy and
|
||||
distribute such modifications or work under the terms of Section 1
|
||||
above, provided that you also meet all of these conditions:
|
||||
|
||||
a) You must cause the modified files to carry prominent notices
|
||||
stating that you changed the files and the date of any change.
|
||||
|
||||
b) You must cause any work that you distribute or publish, that in
|
||||
whole or in part contains or is derived from the Program or any
|
||||
part thereof, to be licensed as a whole at no charge to all third
|
||||
parties under the terms of this License.
|
||||
|
||||
c) If the modified program normally reads commands interactively
|
||||
when run, you must cause it, when started running for such
|
||||
interactive use in the most ordinary way, to print or display an
|
||||
announcement including an appropriate copyright notice and a
|
||||
notice that there is no warranty (or else, saying that you provide
|
||||
a warranty) and that users may redistribute the program under
|
||||
these conditions, and telling the user how to view a copy of this
|
||||
License. (Exception: if the Program itself is interactive but
|
||||
does not normally print such an announcement, your work based on
|
||||
the Program is not required to print an announcement.)
|
||||
|
||||
These requirements apply to the modified work as a whole. If
|
||||
identifiable sections of that work are not derived from the Program,
|
||||
and can be reasonably considered independent and separate works in
|
||||
themselves, then this License, and its terms, do not apply to those
|
||||
sections when you distribute them as separate works. But when you
|
||||
distribute the same sections as part of a whole which is a work based
|
||||
on the Program, the distribution of the whole must be on the terms of
|
||||
this License, whose permissions for other licensees extend to the
|
||||
entire whole, and thus to each and every part regardless of who wrote it.
|
||||
|
||||
Thus, it is not the intent of this section to claim rights or contest
|
||||
your rights to work written entirely by you; rather, the intent is to
|
||||
exercise the right to control the distribution of derivative or
|
||||
collective works based on the Program.
|
||||
|
||||
In addition, mere aggregation of another work not based on the Program
|
||||
with the Program (or with a work based on the Program) on a volume of
|
||||
a storage or distribution medium does not bring the other work under
|
||||
the scope of this License.
|
||||
|
||||
3. You may copy and distribute the Program (or a work based on it,
|
||||
under Section 2) in object code or executable form under the terms of
|
||||
Sections 1 and 2 above provided that you also do one of the following:
|
||||
|
||||
a) Accompany it with the complete corresponding machine-readable
|
||||
source code, which must be distributed under the terms of Sections
|
||||
1 and 2 above on a medium customarily used for software interchange; or,
|
||||
|
||||
b) Accompany it with a written offer, valid for at least three
|
||||
years, to give any third party, for a charge no more than your
|
||||
cost of physically performing source distribution, a complete
|
||||
machine-readable copy of the corresponding source code, to be
|
||||
distributed under the terms of Sections 1 and 2 above on a medium
|
||||
customarily used for software interchange; or,
|
||||
|
||||
c) Accompany it with the information you received as to the offer
|
||||
to distribute corresponding source code. (This alternative is
|
||||
allowed only for noncommercial distribution and only if you
|
||||
received the program in object code or executable form with such
|
||||
an offer, in accord with Subsection b above.)
|
||||
|
||||
The source code for a work means the preferred form of the work for
|
||||
making modifications to it. For an executable work, complete source
|
||||
code means all the source code for all modules it contains, plus any
|
||||
associated interface definition files, plus the scripts used to
|
||||
control compilation and installation of the executable. However, as a
|
||||
special exception, the source code distributed need not include
|
||||
anything that is normally distributed (in either source or binary
|
||||
form) with the major components (compiler, kernel, and so on) of the
|
||||
operating system on which the executable runs, unless that component
|
||||
itself accompanies the executable.
|
||||
|
||||
If distribution of executable or object code is made by offering
|
||||
access to copy from a designated place, then offering equivalent
|
||||
access to copy the source code from the same place counts as
|
||||
distribution of the source code, even though third parties are not
|
||||
compelled to copy the source along with the object code.
|
||||
|
||||
4. You may not copy, modify, sublicense, or distribute the Program
|
||||
except as expressly provided under this License. Any attempt
|
||||
otherwise to copy, modify, sublicense or distribute the Program is
|
||||
void, and will automatically terminate your rights under this License.
|
||||
However, parties who have received copies, or rights, from you under
|
||||
this License will not have their licenses terminated so long as such
|
||||
parties remain in full compliance.
|
||||
|
||||
5. You are not required to accept this License, since you have not
|
||||
signed it. However, nothing else grants you permission to modify or
|
||||
distribute the Program or its derivative works. These actions are
|
||||
prohibited by law if you do not accept this License. Therefore, by
|
||||
modifying or distributing the Program (or any work based on the
|
||||
Program), you indicate your acceptance of this License to do so, and
|
||||
all its terms and conditions for copying, distributing or modifying
|
||||
the Program or works based on it.
|
||||
|
||||
6. Each time you redistribute the Program (or any work based on the
|
||||
Program), the recipient automatically receives a license from the
|
||||
original licensor to copy, distribute or modify the Program subject to
|
||||
these terms and conditions. You may not impose any further
|
||||
restrictions on the recipients' exercise of the rights granted herein.
|
||||
You are not responsible for enforcing compliance by third parties to
|
||||
this License.
|
||||
|
||||
7. If, as a consequence of a court judgment or allegation of patent
|
||||
infringement or for any other reason (not limited to patent issues),
|
||||
conditions are imposed on you (whether by court order, agreement or
|
||||
otherwise) that contradict the conditions of this License, they do not
|
||||
excuse you from the conditions of this License. If you cannot
|
||||
distribute so as to satisfy simultaneously your obligations under this
|
||||
License and any other pertinent obligations, then as a consequence you
|
||||
may not distribute the Program at all. For example, if a patent
|
||||
license would not permit royalty-free redistribution of the Program by
|
||||
all those who receive copies directly or indirectly through you, then
|
||||
the only way you could satisfy both it and this License would be to
|
||||
refrain entirely from distribution of the Program.
|
||||
|
||||
If any portion of this section is held invalid or unenforceable under
|
||||
any particular circumstance, the balance of the section is intended to
|
||||
apply and the section as a whole is intended to apply in other
|
||||
circumstances.
|
||||
|
||||
It is not the purpose of this section to induce you to infringe any
|
||||
patents or other property right claims or to contest validity of any
|
||||
such claims; this section has the sole purpose of protecting the
|
||||
integrity of the free software distribution system, which is
|
||||
implemented by public license practices. Many people have made
|
||||
generous contributions to the wide range of software distributed
|
||||
through that system in reliance on consistent application of that
|
||||
system; it is up to the author/donor to decide if he or she is willing
|
||||
to distribute software through any other system and a licensee cannot
|
||||
impose that choice.
|
||||
|
||||
This section is intended to make thoroughly clear what is believed to
|
||||
be a consequence of the rest of this License.
|
||||
|
||||
8. If the distribution and/or use of the Program is restricted in
|
||||
certain countries either by patents or by copyrighted interfaces, the
|
||||
original copyright holder who places the Program under this License
|
||||
may add an explicit geographical distribution limitation excluding
|
||||
those countries, so that distribution is permitted only in or among
|
||||
countries not thus excluded. In such case, this License incorporates
|
||||
the limitation as if written in the body of this License.
|
||||
|
||||
9. The Free Software Foundation may publish revised and/or new versions
|
||||
of the General Public License from time to time. Such new versions will
|
||||
be similar in spirit to the present version, but may differ in detail to
|
||||
address new problems or concerns.
|
||||
|
||||
Each version is given a distinguishing version number. If the Program
|
||||
specifies a version number of this License which applies to it and "any
|
||||
later version", you have the option of following the terms and conditions
|
||||
either of that version or of any later version published by the Free
|
||||
Software Foundation. If the Program does not specify a version number of
|
||||
this License, you may choose any version ever published by the Free Software
|
||||
Foundation.
|
||||
|
||||
10. If you wish to incorporate parts of the Program into other free
|
||||
programs whose distribution conditions are different, write to the author
|
||||
to ask for permission. For software which is copyrighted by the Free
|
||||
Software Foundation, write to the Free Software Foundation; we sometimes
|
||||
make exceptions for this. Our decision will be guided by the two goals
|
||||
of preserving the free status of all derivatives of our free software and
|
||||
of promoting the sharing and reuse of software generally.
|
||||
|
||||
NO WARRANTY
|
||||
|
||||
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
|
||||
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
|
||||
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
|
||||
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
|
||||
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
|
||||
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
|
||||
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
|
||||
REPAIR OR CORRECTION.
|
||||
|
||||
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
|
||||
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
|
||||
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
|
||||
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
|
||||
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
|
||||
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
|
||||
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGES.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
Appendix: How to Apply These Terms to Your New Programs
|
||||
|
||||
If you develop a new program, and you want it to be of the greatest
|
||||
possible use to the public, the best way to achieve this is to make it
|
||||
free software which everyone can redistribute and change under these terms.
|
||||
|
||||
To do so, attach the following notices to the program. It is safest
|
||||
to attach them to the start of each source file to most effectively
|
||||
convey the exclusion of warranty; and each file should have at least
|
||||
the "copyright" line and a pointer to where the full notice is found.
|
||||
|
||||
<one line to give the program's name and a brief idea of what it does.>
|
||||
Copyright (C) 19yy <name of author>
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
|
||||
Also add information on how to contact you by electronic and paper mail.
|
||||
|
||||
If the program is interactive, make it output a short notice like this
|
||||
when it starts in an interactive mode:
|
||||
|
||||
Gnomovision version 69, Copyright (C) 19yy name of author
|
||||
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
||||
This is free software, and you are welcome to redistribute it
|
||||
under certain conditions; type `show c' for details.
|
||||
|
||||
The hypothetical commands `show w' and `show c' should show the appropriate
|
||||
parts of the General Public License. Of course, the commands you use may
|
||||
be called something other than `show w' and `show c'; they could even be
|
||||
mouse-clicks or menu items--whatever suits your program.
|
||||
|
||||
You should also get your employer (if you work as a programmer) or your
|
||||
school, if any, to sign a "copyright disclaimer" for the program, if
|
||||
necessary. Here is a sample; alter the names:
|
||||
|
||||
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
|
||||
`Gnomovision' (which makes passes at compilers) written by James Hacker.
|
||||
|
||||
<signature of Ty Coon>, 1 April 1989
|
||||
Ty Coon, President of Vice
|
||||
|
||||
This General Public License does not permit incorporating your program into
|
||||
proprietary programs. If your program is a subroutine library, you may
|
||||
consider it more useful to permit linking proprietary applications with the
|
||||
library. If this is what you want to do, use the GNU Library General
|
||||
Public License instead of this License.
|
||||
|
||||
|
Binary file not shown.
|
@ -0,0 +1,39 @@
|
|||
/*
|
||||
* Exec.java - Apple 1 Emulator Test v 0.5
|
||||
* Copyright (C) 2000 VERHILLE Arnaud
|
||||
* gist@wanadoo.fr
|
||||
* http://www.chez.com/apple1/
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
||||
|
||||
import gui.Gui;
|
||||
|
||||
/**
|
||||
* Simple Executable for testing purpose
|
||||
*
|
||||
* @author VERHILLE Arnaud
|
||||
* @created 21 octobre 2000
|
||||
*/
|
||||
class Exec {
|
||||
/**
|
||||
* Main Fonction for execution
|
||||
*
|
||||
* @param args Nothing to pass for now
|
||||
*/
|
||||
public static void main(String[] args) {
|
||||
Gui gui;
|
||||
gui = new Gui();
|
||||
}
|
||||
}
|
|
@ -0,0 +1,4 @@
|
|||
all:
|
||||
javac Exec.java
|
||||
clean :
|
||||
rm -f *~ *.class apple1/*~ apple1/*.class gui/*~ gui/*.class
|
|
@ -0,0 +1 @@
|
|||
javaw Exec
|
|
@ -0,0 +1,69 @@
|
|||
/*
|
||||
* Pom1Applet.java - Applet Interface v 0.1
|
||||
* Copyright (C) 2000 VERHILLE Arnaud
|
||||
* gist@wanadoo.fr
|
||||
* http://www.chez.com/apple1/
|
||||
*
|
||||
* This Class do not receive input from keyboard. Update it if you want :-)
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
||||
|
||||
import apple1.*;
|
||||
import java.net.URL;
|
||||
import java.awt.*;
|
||||
import java.applet.*;
|
||||
|
||||
public class Pom1Applet extends Applet {
|
||||
|
||||
// Emulation Object
|
||||
private Memory mem;
|
||||
private M6502 micro;
|
||||
private Pia6820 pia;
|
||||
private Screen screen;
|
||||
private Keyboard keyboard;
|
||||
|
||||
public void init(){
|
||||
int pixelSize = 1;
|
||||
URL appletCodeBase;
|
||||
appletCodeBase = this.getCodeBase();
|
||||
|
||||
// Init Apple1
|
||||
screen = new Screen(pixelSize,appletCodeBase,true);
|
||||
pia = new Pia6820(screen);
|
||||
keyboard = new Keyboard(screen, pia);
|
||||
mem = new Memory(pia,appletCodeBase,true);
|
||||
micro = new M6502(mem, 1000, 50);
|
||||
|
||||
// 6502 at 1Mhz, refresh with real time every 50 ms
|
||||
this.add(screen);
|
||||
|
||||
try {
|
||||
Thread.sleep(10000);
|
||||
} catch (Exception e) {}
|
||||
}
|
||||
public void start(){
|
||||
micro.reset();
|
||||
micro.start();
|
||||
System.out.println("Pom1 Start Ok");
|
||||
}
|
||||
public void stop(){
|
||||
micro.stop();
|
||||
System.out.println("Pom1 Stop OK");
|
||||
}
|
||||
public void destroy(){}
|
||||
public void paint (Graphics g) {
|
||||
screen.update(g);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,96 @@
|
|||
***************************************
|
||||
Pom1 Version 0.61 (21 juin 2001)
|
||||
***************************************
|
||||
Written by VERHILLE Arnaud
|
||||
E.mail : gist@wanadoo.fr
|
||||
http://www.chez.com/apple1/
|
||||
|
||||
Content :
|
||||
1) What it is ?
|
||||
2) Getting Started
|
||||
3) Known Issues
|
||||
4) Coming Soon
|
||||
5) Credits
|
||||
6) Legal Information
|
||||
|
||||
1) What it is ?
|
||||
---------------
|
||||
Pom1 has been developed to comemorate the works of Steve Wozniak,
|
||||
who set out to develop a machine that would change the world forever.
|
||||
That machine has come to be known as the Apple I.
|
||||
|
||||
Pom1 primary emulates the 6502 microprocessor and extends it to the
|
||||
Apple I computer. It was designed as a challenging first Java programming exercise.
|
||||
|
||||
CURRENT FEATURES
|
||||
|
||||
- Cycle exact CPU emulation
with NMOS6502 Bugs
|
||||
- 100% of regular opcodes
|
||||
- Genuine Terminal speed (60 char/s)
|
||||
- Hard/Soft Reset Behaviour
|
||||
- Load/Save Memory in Raw Data and Sim6502 format
|
||||
- Apple I software : The Little Tower
|
||||
|
||||
Included with Pom1 are several sample codes. If you are lucky,
|
||||
some of them might actually work.
|
||||
|
||||
2) Getting Started
|
||||
------------------
|
||||
First you'll need a Java Runtime Environment.
|
||||
The JRE is a Java Virtual Machine that known how to execute the Java ByteCode.
|
||||
Sun Microsystem and IBM are providing great and free Java Runtime Environment :
|
||||
|
||||
http://www.alphaworks.ibm.com/
|
||||
http://www.java.sun.com/
|
||||
|
||||
If you want to develop Java Applications, choose the Java SDK instead of the Java JRE
|
||||
(the JRE is included in the SDK). Carefully read the installation instructions
|
||||
(skip this on windows) and install Java on your computer.
|
||||
|
||||
Then open a terminal (DOS window), go to the unzipped Pom1 directory (ex: c:/Pom1/)
|
||||
and type "java Exec".
|
||||
|
||||
If you want to run The little Tower, just load the file from the Software directory
|
||||
and type in Pom1 : "300R" then return. Little Tower should start. Have Fun :-)
|
||||
|
||||
GO TO http://www.chez.com/apple1/ look for the documentation section and check
|
||||
the Apple I Online Manuel to know how you can use the BIOS.
|
||||
|
||||
3) Known issues
|
||||
---------------
|
||||
Some wrong keyboard mapping on my Laptop with the
|
||||
SUN Jdk (IBM Jdk works perfect !)
|
||||
Bug in Window's Resizing (The Linux port works well)
|
||||
|
||||
Let me know if you found anything more bad.
|
||||
(gist@wanadoo.fr)
|
||||
|
||||
4) Coming Soon
|
||||
--------------
|
||||
Pom1 Applet
|
||||
(Hmmm, perhaps if YOU work on it)
|
||||
|
||||
5) Credits
|
||||
----------
|
||||
Steve Wozniak (The Brain)
|
||||
Fabrice Frances (Java Microtan Emulator)
|
||||
Achim Breidenbach from Boinx Software
|
||||
(Sim6502, Online "Apple-1 Operation Manual")
|
||||
Juergen Buchmueller (MAME and MESS 6502 core)
|
||||
Stephano Priore from the MESS DEV
|
||||
Joe Torzewski (Apple I owners Club)
|
||||
Tom Owad (http://applefritter.com/apple1/)
|
||||
Francis Limousy (for his help, and his friendship)
|
||||
Peter Rittwage (Hey, Unknown, but great emu)
|
||||
Also, good luck to all those who are writing emulators.
|
||||
|
||||
6) Legal Information
|
||||
--------------------
|
||||
I accept no liability for any loss or damage of any kind caused by running this program.
|
||||
Only run it if you agree to these terms.
|
||||
|
||||
Java JRE and JDK are registered trademarks of Sun Microsystem, Inc.
|
||||
The Apple1 Bios is copyrighted by Steve Wozniak and Apple Computer.
|
||||
|
||||
This product is not affiliated with, nor authorized or licensed in any way by
|
||||
Apple Computer, its affiliates or subsidiaries.
|
|
@ -0,0 +1,18 @@
|
|||
TODO :
|
||||
|
||||
*Graphisme
|
||||
Marges
|
||||
SpeedUp pour l'affichage des characteres sous
|
||||
forme d'image et le masquage lors de update()
|
||||
Icones pour Pom1
|
||||
|
||||
*Core
|
||||
Faire un debugger
|
||||
Fichier config pour le clavier
|
||||
|
||||
*Applet
|
||||
Faire marcher Pom1Applet.java
|
||||
|
||||
*Misc
|
||||
Ecrire quelques jeux
|
||||
2ksa
|
Binary file not shown.
|
@ -0,0 +1,229 @@
|
|||
/*
|
||||
* Keyboard.java - Keyboard Handler v 0.5
|
||||
* Copyright (C) 2000 VERHILLE Arnaud
|
||||
* gist@wanadoo.fr
|
||||
* http://www.chez.com/apple1/
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
||||
|
||||
package apple1;
|
||||
import java.awt.*;
|
||||
import java.awt.event.*;
|
||||
|
||||
/**
|
||||
* The Keyboard Class handle the translation between your keyboard keycodes and
|
||||
* the Apple1 keyboard keycodes in an architecture independant way.
|
||||
*
|
||||
* @author VERHILLE Arnaud
|
||||
* @created 21 octobre 2000
|
||||
*/
|
||||
public class Keyboard implements KeyListener {
|
||||
private Canvas screen;
|
||||
private Pia6820 pia;
|
||||
|
||||
/**
|
||||
* Constructor for the Keyboard object
|
||||
*
|
||||
* @param screen The keyEvents creator
|
||||
* @param pia Interface between Memory & Keyboard
|
||||
*/
|
||||
public Keyboard(Canvas screen, Pia6820 pia) {
|
||||
this.screen = screen;
|
||||
this.pia = pia;
|
||||
screen.addKeyListener(this);
|
||||
}
|
||||
|
||||
//**************************************************
|
||||
//************** KeyListener Methods ***************
|
||||
//**************************************************
|
||||
/**
|
||||
* If the Pia object has KeyInterrups enabled, translate the KeyEvent.
|
||||
*
|
||||
* @param e The KeyEvent
|
||||
*/
|
||||
public void keyTyped(KeyEvent e) {
|
||||
if (pia.getKbdInterrups()) {
|
||||
int tmp = kbdTranslator(e);
|
||||
if (!(tmp == -1)) {
|
||||
pia.writeKbd(tmp);
|
||||
pia.writeKbdCr(0xA7);
|
||||
}
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Just because of the KeyListener Interface
|
||||
*
|
||||
* @param e KeyEvent
|
||||
*/
|
||||
public void keyPressed(KeyEvent e) {
|
||||
}
|
||||
/**
|
||||
* Just because of the KeyListener Interface
|
||||
*
|
||||
* @param e KeyEvent
|
||||
*/
|
||||
public void keyReleased(KeyEvent e) {
|
||||
}
|
||||
/**
|
||||
* The Key Translator. All lowercase ASCII is translated to upperCase then to the Apple 1 ASCII
|
||||
*
|
||||
* @param e KeyEvent
|
||||
* @return -1 if the Keycode is unknown for the Apple1 else the Apple1 Keycode
|
||||
*/
|
||||
private int kbdTranslator(KeyEvent e) {
|
||||
char tmp = e.getKeyChar();
|
||||
|
||||
// Bit 7 enable Monitor Reading
|
||||
//tmp = Character.toUpperCase(tmp);
|
||||
|
||||
if ((tmp > 64) & (tmp < 91)) {
|
||||
// A to Z KeyCodes
|
||||
return (tmp + 0x80);
|
||||
}
|
||||
if ((tmp > 47) & (tmp < 58)) {
|
||||
// O to 9 KeyCodes
|
||||
return (tmp + 0x80);
|
||||
}
|
||||
if (tmp == KeyEvent.VK_ENTER) {
|
||||
return 0x8D;
|
||||
}
|
||||
if (tmp == KeyEvent.VK_ESCAPE) {
|
||||
return 0x9B;
|
||||
}
|
||||
if (tmp == KeyEvent.VK_BACK_SPACE) {
|
||||
return 0xDF;
|
||||
}
|
||||
if (tmp == KeyEvent.VK_SPACE) {
|
||||
return 0x1F + 0x80;
|
||||
}
|
||||
if (tmp == KeyEvent.VK_COMMA) {
|
||||
return 0x2C + 0x80;
|
||||
}
|
||||
if (tmp == KeyEvent.VK_CLOSE_BRACKET) {
|
||||
return 0x5D+0x80;
|
||||
}
|
||||
if (tmp == KeyEvent.VK_OPEN_BRACKET) {
|
||||
return 0x5B+0x80;
|
||||
}
|
||||
if (tmp == 46) { // no VK
|
||||
// .
|
||||
return 0xAE;
|
||||
}
|
||||
if (tmp == 47) { // no VK
|
||||
// :
|
||||
return 0xAF;
|
||||
}
|
||||
if (tmp == 43) { // no VK
|
||||
// + (ADD)
|
||||
return 0xAB;
|
||||
}
|
||||
if (tmp == 42) { // no VK
|
||||
// * (ASTERISK)
|
||||
return 0xAA;
|
||||
}
|
||||
if (tmp == 64) { // no VK
|
||||
// @ (AT)
|
||||
return 0xC0;
|
||||
}
|
||||
if (tmp == 33) { // no VK
|
||||
// ! (EXCLAMATION_MARK)
|
||||
return 0xA1;
|
||||
}
|
||||
if (tmp == 58) { // no VK
|
||||
// / (BACK_SLASH)
|
||||
return 0x3A+0x80;
|
||||
}
|
||||
if (tmp == 0) { // no VK
|
||||
// ^ (CIRCUMFLEX)
|
||||
return 0xDE;
|
||||
}
|
||||
if (tmp == 40) { // no VK
|
||||
// ( (BRACELEFT)
|
||||
return 0xA8;
|
||||
}
|
||||
if (tmp == 41) { // no VK
|
||||
// ) (BRACERIGHT)
|
||||
return 0xA9;
|
||||
}
|
||||
if (tmp == 37) { // no VK
|
||||
// % (AMPERSAND)
|
||||
return 0x25+0x80;
|
||||
}
|
||||
if (tmp == 59) { // no VK
|
||||
// ;
|
||||
return 0x3B+0x80;
|
||||
}
|
||||
if (tmp == 60) {
|
||||
// <
|
||||
return 0xBC;
|
||||
}
|
||||
if (tmp == 61) {
|
||||
// =
|
||||
return 0xBD;
|
||||
}
|
||||
if (tmp == 62) {
|
||||
// >
|
||||
return 0xBE;
|
||||
}
|
||||
if (tmp == 63) {
|
||||
// ?
|
||||
return 0x3F+0x80;
|
||||
}
|
||||
if (tmp == 92) {
|
||||
// \
|
||||
return 0xDC;
|
||||
}
|
||||
if (tmp == 36) {
|
||||
// $
|
||||
return 0x24+0x80;
|
||||
}
|
||||
if (tmp == 34) {
|
||||
// "
|
||||
return 0x22+0x80;
|
||||
}
|
||||
if (tmp == 35) {
|
||||
// #
|
||||
return 0x23+0x80;
|
||||
}
|
||||
if (tmp == 38) {
|
||||
// &
|
||||
return 0x26+0x80;
|
||||
}
|
||||
if (tmp == 39) {
|
||||
// '
|
||||
return 0x27+0x80;
|
||||
}
|
||||
if (tmp == 45) {
|
||||
// -
|
||||
return 0x2D+0x80;
|
||||
}
|
||||
|
||||
// Ctrl + ( Ato Z) KeyCodes
|
||||
// Some are wiped away (ex: 8D for ENTER) ??
|
||||
if ((tmp > 0) & (tmp <27)) {
|
||||
return (tmp + 0x80);
|
||||
}
|
||||
// Heavy Test
|
||||
if (tmp == KeyEvent.VK_CONTROL) {
|
||||
System.out.println("VK_CONTROL");
|
||||
return 0x0D;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
Binary file not shown.
|
@ -0,0 +1,186 @@
|
|||
/*
|
||||
* Pia6820.java - Pia6820 v 0.2
|
||||
* Copyright (C) 2000 VERHILLE Arnaud
|
||||
* gist@wanadoo.fr
|
||||
* http://www.chez.com/apple1/
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
||||
|
||||
package apple1;
|
||||
import java.awt.*;
|
||||
|
||||
/**
|
||||
* The Pia6820 is an Interface between the Memory and the outside world <BR>
|
||||
* In this case the Keyboard, The Terminal, and the Tape Interface.
|
||||
*
|
||||
* @author VERHILLE Arnaud
|
||||
* @created 21 octobre 2000
|
||||
*/
|
||||
public class Pia6820 {
|
||||
private int dspCr, dsp, kbdCr, kbd;
|
||||
private boolean kbdInterrups, dspOutput;
|
||||
private Screen screen;
|
||||
|
||||
/**
|
||||
* Constructor for the Pia6820 object
|
||||
*
|
||||
* @param screen Graphic Terminal
|
||||
*/
|
||||
public Pia6820(Screen screen) {
|
||||
this.screen = screen;
|
||||
reset();
|
||||
}
|
||||
/**
|
||||
* Set the KbdInterrups attribute of the Pia6820 object
|
||||
*
|
||||
* @param b The new KbdInterrups value
|
||||
*/
|
||||
public void setKbdInterrups(boolean b) {
|
||||
kbdInterrups = b;
|
||||
}
|
||||
/**
|
||||
* Get the KbdInterrups attribute of the Pia6820 object
|
||||
*
|
||||
* @return The KbdInterrups value
|
||||
*/
|
||||
public boolean getKbdInterrups() {
|
||||
return kbdInterrups;
|
||||
}
|
||||
/**
|
||||
* Get the DspOutput attribute of the Pia6820 object
|
||||
*
|
||||
* @return The DspOutput value
|
||||
*/
|
||||
public boolean getDspOutput() {
|
||||
return dspOutput;
|
||||
}
|
||||
|
||||
//*****************************************
|
||||
//************** Write Methods ************
|
||||
//*****************************************
|
||||
|
||||
/**
|
||||
* Write the DSP Control Register
|
||||
*
|
||||
* @param dspCr New DSP Control Register
|
||||
*/
|
||||
public void writeDspCr(int dspCr) {
|
||||
if (!dspOutput) {
|
||||
if (dspCr >= 0x80) {
|
||||
// Enable DSP Output
|
||||
dspOutput = true;
|
||||
}
|
||||
dspCr = 0x00;
|
||||
}
|
||||
else {
|
||||
this.dspCr = dspCr;
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Write DSP Register
|
||||
*
|
||||
* @param dsp New DSP Register
|
||||
*/
|
||||
public void writeDsp(int dsp) {
|
||||
if (dsp >= 0x80) {
|
||||
dsp = dsp - 0x80;
|
||||
}
|
||||
screen.outputDsp(dsp);
|
||||
this.dsp = dsp;
|
||||
}
|
||||
/**
|
||||
* Write the Keyboard Control Register
|
||||
*
|
||||
* @param kbdCr New Keyboard Control Register
|
||||
*/
|
||||
public void writeKbdCr(int kbdCr) {
|
||||
if (!kbdInterrups) {
|
||||
if (kbdCr >= 0x80) {
|
||||
// Enable Keyboard Interrups, set Call
|
||||
kbdInterrups = true;
|
||||
kbdCr = 0x00;
|
||||
}
|
||||
}
|
||||
else {
|
||||
this.kbdCr = kbdCr;
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Write Keyboard Register
|
||||
*
|
||||
* @param kbd New Keyboard Register
|
||||
*/
|
||||
public void writeKbd(int kbd) {
|
||||
this.kbd = kbd;
|
||||
}
|
||||
|
||||
//*****************************************
|
||||
//************** Read Methods *************
|
||||
//*****************************************
|
||||
|
||||
/**
|
||||
* Read the DSP Control Register
|
||||
*
|
||||
* @return DSP Control Register
|
||||
*/
|
||||
public int readDspCr() {
|
||||
return dspCr;
|
||||
}
|
||||
/**
|
||||
* Read the DSP Register
|
||||
*
|
||||
* @return DSP Register
|
||||
*/
|
||||
public int readDsp() {
|
||||
return dsp;
|
||||
}
|
||||
/**
|
||||
* Read Keyboard Control Register
|
||||
*
|
||||
* @return Keyboard Control Register
|
||||
*/
|
||||
public int readKbdCr() {
|
||||
if (kbdInterrups) {
|
||||
if (kbdCr >= 0x80) {
|
||||
kbdCr = 0x00;
|
||||
return 0xA7;
|
||||
}
|
||||
}
|
||||
return kbdCr;
|
||||
}
|
||||
/**
|
||||
* Read Keyboard Register
|
||||
*
|
||||
* @return Keyboard Register
|
||||
*/
|
||||
public int readKbd() {
|
||||
return kbd;
|
||||
}
|
||||
|
||||
//*****************************************
|
||||
//*********** Utility Method *************
|
||||
//*****************************************
|
||||
|
||||
/**
|
||||
* Reset the Pia
|
||||
*/
|
||||
public void reset() {
|
||||
kbdInterrups = false;
|
||||
kbdCr = 0x00;
|
||||
dspOutput = false;
|
||||
dspCr = 0x00;
|
||||
}
|
||||
}
|
||||
|
Binary file not shown.
|
@ -0,0 +1,336 @@
|
|||
/*
|
||||
* Screen.java - Video Terminal v 0.4
|
||||
* Copyright (C) 2000,2001 VERHILLE Arnaud
|
||||
* gist@wanadoo.fr
|
||||
* http://www.chez.com/apple1/
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
||||
|
||||
package apple1;
|
||||
import java.awt.*;
|
||||
import java.awt.event.*;
|
||||
import java.io.FileInputStream;
|
||||
import java.net.URL;
|
||||
import java.io.DataInputStream;
|
||||
|
||||
/**
|
||||
* The Screen Class Behave like the TV interface + The TV itself
|
||||
*
|
||||
* @author VERHILLE Arnaud
|
||||
* @created 21 octobre 2000
|
||||
*/
|
||||
public class Screen extends Canvas {
|
||||
private int charac[][];
|
||||
private int screenTbl[][];
|
||||
private int indexX, indexY;
|
||||
private int pixelSize;
|
||||
private boolean scanline;
|
||||
private int terminalSpeed;
|
||||
private Image offScrImg;
|
||||
private long lastTime = System.currentTimeMillis();
|
||||
|
||||
private boolean appletMode = false;
|
||||
private URL appletCodeBase;
|
||||
|
||||
/**
|
||||
* Constructor for the Screen object
|
||||
*
|
||||
* @param pixelSize Choose your pixel Size
|
||||
*/
|
||||
public Screen(int pixelSize) {
|
||||
charac = new int[0x80][8];
|
||||
screenTbl = new int[40][24];
|
||||
loadCharac();
|
||||
this.pixelSize = pixelSize;
|
||||
if (pixelSize == 1) {
|
||||
scanline = false;
|
||||
}
|
||||
terminalSpeed = 60;
|
||||
// 60 charac/s is the genuine speed
|
||||
reset();
|
||||
}
|
||||
/**
|
||||
* Constructor for the Screen object in Applet Mode
|
||||
*
|
||||
* @param pixelSize Choose your pixel Size
|
||||
* @param appletCodeBase The Applet URL
|
||||
* @param appletMode Must be true
|
||||
*/
|
||||
public Screen(int pixelSize,URL appletCodeBase,boolean appletMode) {
|
||||
charac = new int[0x80][8];
|
||||
screenTbl = new int[40][24];
|
||||
this.appletMode = appletMode;
|
||||
scanline = false;
|
||||
this.appletCodeBase = appletCodeBase;
|
||||
loadCharac();
|
||||
this.pixelSize = pixelSize;
|
||||
terminalSpeed = 60;
|
||||
// 60 charac/s is the genuine speed
|
||||
reset();
|
||||
}
|
||||
/**
|
||||
* Sets the PixelSize attribute of the Screen object
|
||||
*
|
||||
* @param ps The new PixelSize value
|
||||
*/
|
||||
public void setPixelSize(int ps) {
|
||||
pixelSize = ps;
|
||||
}
|
||||
/**
|
||||
* Sets scanlines
|
||||
*
|
||||
* @param scanline Scanline on or off
|
||||
*/
|
||||
public void setScanline(boolean scanline) {
|
||||
this.scanline = scanline;
|
||||
}
|
||||
/**
|
||||
* Sets the TerminalSpeed attribute of the Screen object
|
||||
*
|
||||
* @param ts The new TerminalSpeed value
|
||||
*/
|
||||
public void setTerminalSpeed(int ts) {
|
||||
terminalSpeed = ts;
|
||||
}
|
||||
/**
|
||||
* Reset the Screen by Filling it with no character
|
||||
*/
|
||||
public void reset() {
|
||||
indexX = indexY = 0;
|
||||
initScreenTbl();
|
||||
repaint();
|
||||
}
|
||||
|
||||
//*************************************************
|
||||
//************** Video Terminal *******************
|
||||
//*************************************************
|
||||
|
||||
/**
|
||||
* Read the Pia Output and Ouput a character on Display
|
||||
*
|
||||
* @param dsp Pia Output
|
||||
*/
|
||||
public void outputDsp(int dsp) {
|
||||
|
||||
switch (dsp) {
|
||||
case 0x00:
|
||||
// Nothing
|
||||
break;
|
||||
case 0x5F:
|
||||
// Backspace
|
||||
if (indexX == 0) {
|
||||
indexY--;
|
||||
indexX = 39;
|
||||
}
|
||||
else {
|
||||
indexX--;
|
||||
}
|
||||
screenTbl[indexX][indexY] = 0x00;
|
||||
break;
|
||||
case 0x0A:
|
||||
// End of Line
|
||||
indexX = 0;
|
||||
indexY++;
|
||||
break;
|
||||
case 0x0D:
|
||||
// End of Line
|
||||
indexX = 0;
|
||||
indexY++;
|
||||
break;
|
||||
case 0x7F:
|
||||
// Nothing (Dsp Register Mask)
|
||||
break;
|
||||
default:
|
||||
// Standard Charac
|
||||
screenTbl[indexX][indexY] = dsp;
|
||||
indexX++;
|
||||
// Place for next Charc
|
||||
break;
|
||||
}
|
||||
if (indexX == 40) {
|
||||
indexX = 0;
|
||||
indexY++;
|
||||
}
|
||||
if (indexY == 24) {
|
||||
newLine();
|
||||
indexY--;
|
||||
}
|
||||
repaint();
|
||||
synchronizeOutput();
|
||||
}
|
||||
|
||||
//**************************************************
|
||||
//*************** Graphical Methods ****************
|
||||
//**************************************************
|
||||
|
||||
/**
|
||||
* The Classic update() Method (Use of Double Buffering)
|
||||
*
|
||||
* @param gc The Graphic Context
|
||||
*/
|
||||
public void update(Graphics gc) {
|
||||
if (offScrImg == null) {
|
||||
// Double Buffering :-)
|
||||
offScrImg = createImage(280 * pixelSize, 192 * pixelSize);
|
||||
}
|
||||
Graphics og = offScrImg.getGraphics();
|
||||
paint(og);
|
||||
gc.drawImage(offScrImg, 0, 0, this);
|
||||
og.dispose();
|
||||
}
|
||||
/**
|
||||
* The Classic paint() Method
|
||||
*
|
||||
* @param gc The Graphic Context
|
||||
*/
|
||||
public void paint(Graphics gc) {
|
||||
int i;
|
||||
int j;
|
||||
int xPosition;
|
||||
int yPosition;
|
||||
// Charac Resolution 7x8 ; Matrix 5x7
|
||||
// Screen Resolution 280x192
|
||||
gc.setColor(Color.black);
|
||||
gc.fillRect(0, 0, 280 * pixelSize, 192 * pixelSize);
|
||||
gc.setColor(Color.green);
|
||||
for (i = 0; i < 40; i++) {
|
||||
for (j = 0; j < 24; j++) {
|
||||
xPosition = i * (pixelSize * 7);
|
||||
yPosition = j * (pixelSize * 8);
|
||||
drawCharac(gc, xPosition, yPosition,screenTbl[i][j]);
|
||||
}
|
||||
} // Cursor
|
||||
drawCharac(gc, indexX * (pixelSize * 7), indexY * (pixelSize * 8), 0x01);
|
||||
}
|
||||
/**
|
||||
* Synchronize the Terminal Output on terminalSpeed char/s <BR>
|
||||
* This method froze the whole program when it wait (This is not really a problem)
|
||||
*/
|
||||
private void synchronizeOutput() {
|
||||
// Apple1 Terminal Output terminalSpeed Charac each second
|
||||
int sleepMillis = (int) ((1000 / terminalSpeed) - (System.currentTimeMillis() - lastTime));
|
||||
if (sleepMillis > 0) {
|
||||
try {
|
||||
Thread.sleep(sleepMillis);
|
||||
}
|
||||
catch (Exception e) {
|
||||
System.out.println(e);
|
||||
}
|
||||
}
|
||||
lastTime = System.currentTimeMillis();
|
||||
}
|
||||
/**
|
||||
* Draw a Character from the Character Table on Display
|
||||
*
|
||||
* @param gc The Graphic Context
|
||||
* @param xPosition The Upper Left X position
|
||||
* @param yPosition The upper left Y position
|
||||
* @param characNumber The Character Value [0x00 -> 0xFF]
|
||||
*/
|
||||
private void drawCharac(Graphics gc, int xPosition,
|
||||
int yPosition, int characNumber) {
|
||||
int k;
|
||||
int l;
|
||||
gc.setColor(Color.green);
|
||||
for (k = 0; k < 8; k++) {
|
||||
for (l = 1; l < 8; l++) {
|
||||
// first bit unused (color in apple2)
|
||||
if ((charac[characNumber][k] & (0x01 << l)) == (0x01 << l)) {
|
||||
gc.fillRect(xPosition + pixelSize * (l - 1), yPosition + pixelSize * k, pixelSize, pixelSize - (scanline ? 1 : 0));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//******************************************************
|
||||
//******************** Utility methods *****************
|
||||
//******************************************************
|
||||
|
||||
/**
|
||||
* Create the Charactere Table from apple1.vid <BR>
|
||||
* Depend on appletMode (Executable or URL Access)
|
||||
*/
|
||||
private void loadCharac() {
|
||||
if (appletMode == false){ // Normal File Access
|
||||
|
||||
String filename = System.getProperty("user.dir") + "/bios/apple1.vid";
|
||||
FileInputStream fis = null;
|
||||
try {
|
||||
fis = new FileInputStream(filename);
|
||||
int i;
|
||||
int j;
|
||||
for (i = 0; i < 0x80; i++) {
|
||||
for (j = 0; j < 8; j++) {
|
||||
charac[i][j] = fis.read();
|
||||
}
|
||||
}
|
||||
fis.close();
|
||||
}
|
||||
catch (Exception e) {
|
||||
System.out.println(e);
|
||||
}
|
||||
|
||||
} else { //URL Applet File Access Mode
|
||||
|
||||
try {
|
||||
URL u = new URL(appletCodeBase,"apple1.vid");
|
||||
DataInputStream fis = null;
|
||||
|
||||
fis = new DataInputStream (u.openStream());
|
||||
int i;
|
||||
int j;
|
||||
for (i = 0; i < 0x80; i++) {
|
||||
for (j = 0; j < 8; j++) {
|
||||
charac[i][j] = fis.read();
|
||||
}
|
||||
}
|
||||
fis.close();
|
||||
} catch (Exception e) {
|
||||
System.out.println(e);
|
||||
System.out.println("URL Error Access in Screen.class");
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Fill the Screen Table with No Character
|
||||
*/
|
||||
private void initScreenTbl() {
|
||||
int i;
|
||||
int j;
|
||||
for (i = 0; i < 40; i++) {
|
||||
for (j = 0; j < 24; j++) {
|
||||
screenTbl[i][j] = 0x00;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a new line and scroll the old lines
|
||||
*/
|
||||
private void newLine() {
|
||||
int i;
|
||||
int j;
|
||||
for (i = 0; i < 40; i++) {
|
||||
for (j = 0; j < 23; j++) {
|
||||
screenTbl[i][j] = screenTbl[i][j + 1];
|
||||
}
|
||||
}
|
||||
for (i = 0; i < 40; i++) {
|
||||
screenTbl[i][23] = 0x00;
|
||||
}
|
||||
}
|
||||
}
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
@ -0,0 +1,858 @@
|
|||
/*
|
||||
* Gui.java - General User Interface v 0.4
|
||||
* Copyright (C) 2000 VERHILLE Arnaud
|
||||
* gist@wanadoo.fr
|
||||
* http://www.chez.com/apple1/
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
||||
|
||||
package gui;
|
||||
|
||||
import apple1.*;
|
||||
import java.awt.*;
|
||||
import java.awt.event.*;
|
||||
import java.io.*;
|
||||
|
||||
/**
|
||||
* The General User Interface Class, Initialize all the Emulation Objects and control them
|
||||
*
|
||||
* @author VERHILLE Arnaud
|
||||
* @created 21 octobre 2000
|
||||
*/
|
||||
public class Gui implements WindowListener, ActionListener {
|
||||
private Frame guiFrame;
|
||||
// The GUI Menu Bar Definition
|
||||
private MenuBar guiMenuBar;
|
||||
private Menu guiMenuFile, guiMenuEmulator, guiMenuConfig, guiMenuDebug,guiMenuHelp;
|
||||
private MenuItem guiMenuFileLoad, guiMenuFileSave, guiMenuFileSeparator,guiMenuFileExit;
|
||||
private MenuItem guiMenuEmulatorReset, guiMenuEmulatorHardReset;
|
||||
private MenuItem guiMenuConfigScreen, guiMenuConfigMemory;
|
||||
private MenuItem guiMenuDebugShow, guiMenuDebugDispose;
|
||||
private MenuItem guiMenuHelpAbout;
|
||||
|
||||
// Dialog GUI
|
||||
private Dialog guiDialog;
|
||||
private Button btSave;
|
||||
private Button btLoad;
|
||||
private TextField startHexTxt, endHexTxt;
|
||||
private TextField miscTxt;
|
||||
private Checkbox rawCbox;
|
||||
private Checkbox wRomCbox;
|
||||
private CheckboxGroup cbg;
|
||||
private Button btScreen;
|
||||
private Button btMemory;
|
||||
private Button bt6502;
|
||||
|
||||
// Debug Dialog
|
||||
private Dialog debugDialog;
|
||||
|
||||
// Major variables
|
||||
private int pixelSize;
|
||||
private boolean scanlines;
|
||||
private int terminalSpeed;
|
||||
private boolean writeInRom;
|
||||
private boolean ram8k;
|
||||
|
||||
// Emulation Objects
|
||||
private Memory mem;
|
||||
private M6502 micro;
|
||||
private Pia6820 pia;
|
||||
private Screen screen;
|
||||
private Keyboard keyboard;
|
||||
|
||||
/**
|
||||
* Initialize Apple1 Objects, the Gui and some Variables
|
||||
*/
|
||||
public Gui() {
|
||||
initVariable();
|
||||
initApple1();
|
||||
initGui();
|
||||
}
|
||||
|
||||
//***************************************************
|
||||
//********** ActionPerformed Methods ****************
|
||||
//***************************************************
|
||||
|
||||
/**
|
||||
* MenuActionListener (menu selection)
|
||||
*
|
||||
* @param evt An ActionEvent
|
||||
*/
|
||||
public void actionPerformed(ActionEvent evt) {
|
||||
// guiMenu ActionEvent
|
||||
if (guiMenuFileLoad.equals(evt.getSource())) {
|
||||
fileLoad();
|
||||
return;
|
||||
}
|
||||
if (guiMenuFileSave.equals(evt.getSource())) {
|
||||
fileSave();
|
||||
return;
|
||||
}
|
||||
if (guiMenuFileExit.equals(evt.getSource())) {
|
||||
System.exit(0);
|
||||
}
|
||||
if (guiMenuEmulatorReset.equals(evt.getSource())) {
|
||||
pia.reset();
|
||||
micro.reset();
|
||||
return;
|
||||
}
|
||||
if (guiMenuEmulatorHardReset.equals(evt.getSource())) {
|
||||
micro.stop();
|
||||
micro.reset();
|
||||
screen.reset();
|
||||
pia.reset();
|
||||
mem.reset();
|
||||
try {
|
||||
Thread.sleep(200); // To avoid wrong synchronized methods
|
||||
}
|
||||
catch (Exception e) {
|
||||
System.out.println(e);
|
||||
}
|
||||
micro.start();
|
||||
return;
|
||||
}
|
||||
if (guiMenuConfigScreen.equals(evt.getSource())) {
|
||||
configScreen();
|
||||
return;
|
||||
}
|
||||
if (guiMenuConfigMemory.equals(evt.getSource())) {
|
||||
configMemory();
|
||||
return;
|
||||
}
|
||||
if (guiMenuDebugShow.equals(evt.getSource())) {
|
||||
debugShow();
|
||||
return;
|
||||
}
|
||||
if (guiMenuDebugDispose.equals(evt.getSource())) {
|
||||
debugDispose();
|
||||
return;
|
||||
}
|
||||
if (guiMenuHelpAbout.equals(evt.getSource())) {
|
||||
aboutPom1();
|
||||
return;
|
||||
}
|
||||
// Secondary gui ActionEvent
|
||||
if (btSave.equals(evt.getSource())) {
|
||||
fileSaveExec();
|
||||
return;
|
||||
}
|
||||
if (btLoad.equals(evt.getSource())) {
|
||||
fileLoadExec();
|
||||
return;
|
||||
}
|
||||
if (btScreen.equals(evt.getSource())) {
|
||||
configScreenExec();
|
||||
return;
|
||||
}
|
||||
if (btMemory.equals(evt.getSource())) {
|
||||
configMemoryExec();
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
//***************************************************
|
||||
//********** WindowListener Methods *****************
|
||||
//***************************************************
|
||||
|
||||
/**
|
||||
* Close the Windows Event
|
||||
*
|
||||
* @param e WindowEvent
|
||||
*/
|
||||
public void windowClosing(WindowEvent e) {
|
||||
if (guiFrame.equals(e.getSource())) {
|
||||
System.exit(0);
|
||||
}
|
||||
if (guiDialog.equals(e.getSource())) {
|
||||
guiDialog.dispose();
|
||||
}
|
||||
}
|
||||
/**
|
||||
* WindowActivated
|
||||
*
|
||||
* @param e WindowEvent
|
||||
*/
|
||||
public void windowActivated(WindowEvent e) {
|
||||
if (guiFrame.equals(e.getSource())) {
|
||||
guiFrame.toFront();
|
||||
}
|
||||
if (guiDialog.equals(e.getSource())) {
|
||||
guiDialog.toFront();
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Description of the Method
|
||||
*
|
||||
* @param e Description of Parameter
|
||||
*/
|
||||
public void windowClosed(WindowEvent e) {
|
||||
}
|
||||
/**
|
||||
* Description of the Method
|
||||
*
|
||||
* @param e Description of Parameter
|
||||
*/
|
||||
public void windowDeactivated(WindowEvent e) {
|
||||
}
|
||||
/**
|
||||
* Description of the Method
|
||||
*
|
||||
* @param e Description of Parameter
|
||||
*/
|
||||
public void windowDeiconified(WindowEvent e) {
|
||||
if (guiFrame.equals(e.getSource())) {
|
||||
guiFrame.toFront();
|
||||
}
|
||||
if (guiDialog.equals(e.getSource())) {
|
||||
guiDialog.toFront();
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Description of the Method
|
||||
*
|
||||
* @param e Description of Parameter
|
||||
*/
|
||||
public void windowIconified(WindowEvent e) {
|
||||
}
|
||||
/**
|
||||
* Window Opened
|
||||
*
|
||||
* @param e WindowEvent
|
||||
*/
|
||||
public void windowOpened(WindowEvent e) {
|
||||
if (guiFrame.equals(e.getSource())) {
|
||||
guiFrame.toFront();
|
||||
}
|
||||
if (guiDialog.equals(e.getSource())) {
|
||||
guiDialog.toFront();
|
||||
}
|
||||
}
|
||||
|
||||
//***************************************************
|
||||
//********** Initialisation Methods *****************
|
||||
//***************************************************
|
||||
|
||||
/**
|
||||
* Initialization for Gui Variables
|
||||
*/
|
||||
private void initGui() {
|
||||
guiFrame = new Frame("Pom1 : Apple1 Java Emulator");
|
||||
guiFrame.setLayout(new BorderLayout());
|
||||
|
||||
guiMenuBar = new MenuBar();
|
||||
|
||||
guiMenuFile = new Menu("File");
|
||||
guiMenuFileLoad = new MenuItem("Load Memory");
|
||||
guiMenuFileLoad.addActionListener(this);
|
||||
guiMenuFileSave = new MenuItem("Save Memory");
|
||||
guiMenuFileSave.addActionListener(this);
|
||||
guiMenuFileSeparator = new MenuItem("-");
|
||||
guiMenuFileSeparator.addActionListener(this);
|
||||
guiMenuFileExit = new MenuItem("Exit");
|
||||
guiMenuFileExit.addActionListener(this);
|
||||
guiMenuFile.add(guiMenuFileLoad);
|
||||
guiMenuFile.add(guiMenuFileSave);
|
||||
guiMenuFile.add(guiMenuFileSeparator);
|
||||
guiMenuFile.add(guiMenuFileExit);
|
||||
guiMenuBar.add(guiMenuFile);
|
||||
guiMenuEmulator = new Menu("Emulator");
|
||||
guiMenuEmulatorReset = new MenuItem("Reset");
|
||||
guiMenuEmulatorReset.addActionListener(this);
|
||||
guiMenuEmulatorHardReset = new MenuItem("Hard Reset");
|
||||
guiMenuEmulatorHardReset.addActionListener(this);
|
||||
guiMenuEmulator.add(guiMenuEmulatorReset);
|
||||
guiMenuEmulator.add(guiMenuEmulatorHardReset);
|
||||
guiMenuBar.add(guiMenuEmulator);
|
||||
guiMenuConfig = new Menu("Config");
|
||||
guiMenuConfigScreen = new MenuItem("Screen");
|
||||
guiMenuConfigScreen.addActionListener(this);
|
||||
guiMenuConfig.add(guiMenuConfigScreen);
|
||||
guiMenuConfigMemory = new MenuItem("Memory");
|
||||
guiMenuConfigMemory.addActionListener(this);
|
||||
guiMenuConfig.add(guiMenuConfigMemory);
|
||||
guiMenuBar.add(guiMenuConfig);
|
||||
guiMenuDebug = new Menu("Debug");
|
||||
guiMenuDebugShow = new MenuItem("Show");
|
||||
guiMenuDebugShow.addActionListener(this);
|
||||
guiMenuDebugDispose = new MenuItem("Dispose");
|
||||
guiMenuDebugDispose.addActionListener(this);
|
||||
guiMenuDebug.add(guiMenuDebugShow);
|
||||
guiMenuDebug.add(guiMenuDebugDispose);
|
||||
guiMenuBar.add(guiMenuDebug);
|
||||
guiMenuHelp = new Menu("Help");
|
||||
guiMenuHelpAbout = new MenuItem("About");
|
||||
guiMenuHelpAbout.addActionListener(this);
|
||||
guiMenuHelp.add(guiMenuHelpAbout);
|
||||
guiMenuBar.add(guiMenuHelp);
|
||||
|
||||
// Gui Dialog Initialisation
|
||||
guiDialog = new Dialog(guiFrame, true);
|
||||
guiDialog.addWindowListener(this);
|
||||
startHexTxt = new TextField("0000", 4);
|
||||
endHexTxt = new TextField("FFFF", 4);
|
||||
rawCbox = new Checkbox("Raw Data");
|
||||
btSave = new Button("Save");
|
||||
btSave.addActionListener(this);
|
||||
btLoad = new Button("Load");
|
||||
btLoad.addActionListener(this);
|
||||
cbg = new CheckboxGroup();
|
||||
btScreen = new Button("OK");
|
||||
btScreen.addActionListener(this);
|
||||
miscTxt = new TextField("", 2);
|
||||
wRomCbox = new Checkbox("Write in ROM enabled");
|
||||
btMemory = new Button("OK");
|
||||
btMemory.addActionListener(this);
|
||||
bt6502 = new Button("OK");
|
||||
bt6502.addActionListener(this);
|
||||
|
||||
// Main screen Init
|
||||
guiFrame.addWindowListener(this);
|
||||
guiFrame.setMenuBar(guiMenuBar);
|
||||
guiFrame.add(screen);
|
||||
// Screen Resolution 280x192 + Insets
|
||||
guiFrame.show(); // Java Bug, Needed for menu y in i.top
|
||||
Insets i = guiFrame.getInsets();
|
||||
// guiFrame.setResizable (false);
|
||||
guiFrame.setSize(280 * pixelSize + (i.left + i.right), 192 * pixelSize + (i.top + i.bottom));
|
||||
guiFrame.show();
|
||||
}
|
||||
/**
|
||||
* Initialize all The Apple1 Emulation Objects
|
||||
*/
|
||||
private void initApple1() {
|
||||
screen = new Screen(pixelSize);
|
||||
pia = new Pia6820(screen);
|
||||
keyboard = new Keyboard(screen, pia);
|
||||
mem = new Memory(pia);
|
||||
// 6502 at 1Mhz, refresh with real time every 50 ms
|
||||
micro = new M6502(mem, 1000, 50);
|
||||
micro.start();
|
||||
}
|
||||
/**
|
||||
* Initialize Global Variable (pixelSize,terminalSpeed, writeInRom, ram8k)
|
||||
*/
|
||||
private void initVariable() {
|
||||
pixelSize = 2;
|
||||
// Strange Screen resizing bug
|
||||
terminalSpeed = 60;
|
||||
// Charac/s for Terminal
|
||||
writeInRom = true;
|
||||
ram8k = false;
|
||||
}
|
||||
|
||||
//***************************************************
|
||||
//************* Debug Dialog Methods ****************
|
||||
//***************************************************
|
||||
|
||||
/**
|
||||
* Show the Debugger Screen
|
||||
*/
|
||||
private void debugShow() {
|
||||
}
|
||||
/**
|
||||
* Close the Debugger Screen
|
||||
*/
|
||||
private void debugDispose() {
|
||||
}
|
||||
|
||||
//***************************************************
|
||||
//************** File Dialog Methods ****************
|
||||
//***************************************************
|
||||
|
||||
/**
|
||||
* Load a File in memory (Menu)
|
||||
*/
|
||||
private void fileLoad() {
|
||||
guiDialog.removeAll();
|
||||
guiDialog.setTitle("Load memory");
|
||||
guiDialog.setLayout(new FlowLayout());
|
||||
guiDialog.add(new Label("Starting Address (Hex): "));
|
||||
guiDialog.add(startHexTxt);
|
||||
guiDialog.add(new Label("(Used only if Raw data is checked)"));
|
||||
guiDialog.add(rawCbox);
|
||||
guiDialog.add(btLoad);
|
||||
Point point = new Point();
|
||||
point = guiFrame.getLocation();
|
||||
int x = (int) point.getX();
|
||||
int y = (int) point.getY();
|
||||
guiDialog.setLocation(60 + x, 70 + y);
|
||||
guiDialog.setSize(220, 190);
|
||||
// guiDialog.setResizable (false);
|
||||
guiDialog.show();
|
||||
}
|
||||
/**
|
||||
* Load a File in Memory (Execution)
|
||||
*/
|
||||
private void fileLoadExec() {
|
||||
int start;
|
||||
start = hexStringToInt(startHexTxt.getText());
|
||||
if (start == -1) {
|
||||
return;
|
||||
}
|
||||
|
||||
String fileName = new String();
|
||||
FileDialog fileDialog = new FileDialog(guiFrame, "Load Memory ...", FileDialog.LOAD);
|
||||
fileDialog.show();
|
||||
if (fileDialog.getFile() == null) {
|
||||
return;
|
||||
}
|
||||
fileName = fileDialog.getDirectory() + File.separator +
|
||||
fileDialog.getFile();
|
||||
FileInputStream fis = null;
|
||||
|
||||
if (rawCbox.getState()) {
|
||||
// Load Raw Data
|
||||
try {
|
||||
fis = new FileInputStream(fileName);
|
||||
int i;
|
||||
int size = fis.available();
|
||||
for (i = start; i < (start + size); i++) {
|
||||
mem.write(i, fis.read());
|
||||
}
|
||||
fis.close();
|
||||
}
|
||||
catch (Exception e) {
|
||||
System.out.println(e);
|
||||
}
|
||||
}
|
||||
else {
|
||||
// Load Sim 6502 file
|
||||
try {
|
||||
int i;
|
||||
int address;
|
||||
int value;
|
||||
String _address;
|
||||
String _value;
|
||||
String _strLine;
|
||||
fis = new FileInputStream(fileName);
|
||||
BufferedReader _br = new BufferedReader(new InputStreamReader(fis));
|
||||
for (; ; ) {
|
||||
// Get Lines
|
||||
_strLine = _br.readLine();
|
||||
// End of File
|
||||
if (_strLine == null) {
|
||||
break;
|
||||
}
|
||||
// blank line
|
||||
if (_strLine.length() == 0) {
|
||||
continue;
|
||||
}
|
||||
// comments
|
||||
if (_strLine.charAt(0) == '/') {
|
||||
continue;
|
||||
}
|
||||
// Analyse line
|
||||
_address = _strLine.substring(0, 4);
|
||||
address = hexStringToInt(_address);
|
||||
if (address == -1) {
|
||||
// Wrong Address
|
||||
continue;
|
||||
}
|
||||
// Read Values
|
||||
for (i = 6; i < _strLine.length();
|
||||
i = i + 3) {
|
||||
_value = _strLine.substring(i,i + 2);
|
||||
value = hexStringToInt(_value);
|
||||
if (value == -1) {
|
||||
// Wrong value, get newLine
|
||||
break;
|
||||
}
|
||||
// Good value, put in Memory
|
||||
mem.write((address +
|
||||
((i - 6) / 3)), value);
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception e) {
|
||||
System.out.println(e);
|
||||
}
|
||||
}
|
||||
guiDialog.dispose();
|
||||
guiFrame.toFront();
|
||||
}
|
||||
/**
|
||||
* Save a File from Memory (Menu)
|
||||
*/
|
||||
private void fileSave() {
|
||||
guiDialog.removeAll();
|
||||
guiDialog.setTitle("Save memory");
|
||||
guiDialog.setLayout(new FlowLayout());
|
||||
guiDialog.add(new Label("From(Hex): "));
|
||||
guiDialog.add(startHexTxt);
|
||||
guiDialog.add(new Label("To(Hex): "));
|
||||
guiDialog.add(endHexTxt);
|
||||
guiDialog.add(rawCbox);
|
||||
guiDialog.add(btSave);
|
||||
Point point = new Point();
|
||||
point = guiFrame.getLocation();
|
||||
int x = (int) point.getX();
|
||||
int y = (int) point.getY();
|
||||
guiDialog.setLocation(60 + x, 70 + y);
|
||||
guiDialog.setSize(180, 180);
|
||||
// guiDialog.setResizable (false);
|
||||
guiDialog.show();
|
||||
}
|
||||
/**
|
||||
* save a File ffrom memory (Execution)
|
||||
*/
|
||||
private void fileSaveExec() {
|
||||
int start;
|
||||
int end;
|
||||
|
||||
start = hexStringToInt(startHexTxt.getText());
|
||||
end = hexStringToInt(endHexTxt.getText());
|
||||
if ((start == -1) | (end == -1)) {
|
||||
return;
|
||||
}
|
||||
|
||||
int[] fbrut = new int[end - start + 1];
|
||||
fbrut = mem.dumpMemory(start, end);
|
||||
|
||||
String fileName = new String();
|
||||
FileDialog fileDialog = new FileDialog(guiFrame, "Save Memory ...", FileDialog.SAVE);
|
||||
fileDialog.show();
|
||||
if (fileDialog.getFile() == null) {
|
||||
return;
|
||||
}
|
||||
if (rawCbox.getState()) {
|
||||
// Save Raw Data
|
||||
fileName = fileDialog.getDirectory() + File.separator +
|
||||
fileDialog.getFile();
|
||||
FileOutputStream fos = null;
|
||||
try {
|
||||
fos = new FileOutputStream(fileName);
|
||||
int i;
|
||||
for (i = 0; i < (end - start + 1); i++) {
|
||||
fos.write(fbrut[i]);
|
||||
}
|
||||
fos.close();
|
||||
}
|
||||
catch (IOException e) {
|
||||
System.out.println(e);
|
||||
}
|
||||
}
|
||||
else {
|
||||
// Save Sim6502 file
|
||||
fileName = fileDialog.getDirectory() + File.separator + fileDialog.getFile() + ".txt";
|
||||
FileOutputStream fos = null;
|
||||
// Construct the StringBuffer for Save
|
||||
StringBuffer _buf = new StringBuffer(4 * (end - start + 1));
|
||||
_buf.append("// Pom1 Save : " + fileDialog.getFile() + "\r\n");
|
||||
int i;
|
||||
int j;
|
||||
j = start;
|
||||
for (i = 0; i < (end - start + 1); i++, j++) {
|
||||
if (((j % 8) == 0) | (j == start)) {
|
||||
_buf.append("\r\n" + toHex4(j) + ": ");
|
||||
}
|
||||
_buf.append(toHex(fbrut[i]) + " ");
|
||||
}
|
||||
// Save it
|
||||
try {
|
||||
fos = new FileOutputStream(fileName);
|
||||
fos.write(_buf.toString().getBytes());
|
||||
fos.close();
|
||||
}
|
||||
catch (IOException e) {
|
||||
System.out.println(e);
|
||||
}
|
||||
}
|
||||
guiDialog.dispose();
|
||||
}
|
||||
|
||||
//***************************************************
|
||||
//************ Config Dialog Methods ****************
|
||||
//***************************************************
|
||||
|
||||
/**
|
||||
* Configure Screen (Menu)
|
||||
*/
|
||||
private void configScreen() {
|
||||
guiDialog.removeAll();
|
||||
guiDialog.setTitle("Screen Configuration");
|
||||
guiDialog.setLayout(new FlowLayout());
|
||||
guiDialog.add(new Label("Choose the Pixel Size :"));
|
||||
guiDialog.add(new Checkbox("x1", cbg, (pixelSize == 1)));
|
||||
guiDialog.add(new Checkbox("x2", cbg, (pixelSize == 2)));
|
||||
guiDialog.add(new Checkbox(" Or choose the Scanlines", cbg, (scanlines == true)));
|
||||
guiDialog.add(new Label("Terminal speed in Charac/s :"));
|
||||
miscTxt.setText((new Integer(terminalSpeed).toString()));
|
||||
guiDialog.add(miscTxt);
|
||||
guiDialog.add(new Label(" "));
|
||||
guiDialog.add(btScreen);
|
||||
Point point = new Point();
|
||||
point = guiFrame.getLocation();
|
||||
int x = (int) point.getX();
|
||||
int y = (int) point.getY();
|
||||
guiDialog.setLocation(60 + x, 70 + y);
|
||||
guiDialog.setSize(315, 140);
|
||||
// guiDialog.setResizable (false);
|
||||
guiDialog.show();
|
||||
}
|
||||
/**
|
||||
* Configure Screen (Execution)
|
||||
*/
|
||||
private void configScreenExec() {
|
||||
String _str = cbg.getSelectedCheckbox().getLabel();
|
||||
if (_str == "x1") {
|
||||
pixelSize = 1;
|
||||
scanlines = false;
|
||||
}
|
||||
if (_str == "x2") {
|
||||
pixelSize = 2;
|
||||
scanlines = false;
|
||||
}
|
||||
if (_str == " Or choose the Scanlines") {
|
||||
pixelSize = 2;
|
||||
scanlines = true;
|
||||
}
|
||||
// Screen Resolution 280x192 + Insets
|
||||
Insets i = guiFrame.getInsets();
|
||||
guiFrame.setSize(280 * pixelSize + (i.left + i.right), 192 * pixelSize + (i.top + i.bottom));
|
||||
screen.setPixelSize(pixelSize);
|
||||
screen.setScanline(scanlines);
|
||||
|
||||
terminalSpeed = (Integer.decode(miscTxt.getText())).intValue();
|
||||
screen.setTerminalSpeed(terminalSpeed);
|
||||
|
||||
guiDialog.dispose();
|
||||
screen.repaint();
|
||||
}
|
||||
/**
|
||||
* Configure Memory (Menu)
|
||||
*/
|
||||
private void configMemory() {
|
||||
guiDialog.removeAll();
|
||||
guiDialog.setTitle("Memory Configuration");
|
||||
guiDialog.setLayout(new FlowLayout());
|
||||
guiDialog.add(new Label("Apple I available RAM size :"));
|
||||
guiDialog.add(new Checkbox("8kb", cbg, ram8k));
|
||||
guiDialog.add(new Checkbox("Max", cbg, (!ram8k)));
|
||||
wRomCbox.setState(writeInRom);
|
||||
guiDialog.add(new Label(" "));
|
||||
guiDialog.add(wRomCbox);
|
||||
guiDialog.add(new Label(" "));
|
||||
guiDialog.add(new Label("IRQ/BRK vector :"));
|
||||
miscTxt.setText(toHex(mem.read(0xFFFF)) + toHex(mem.read(0xFFFE)));
|
||||
guiDialog.add(miscTxt);
|
||||
guiDialog.add(new Label(" "));
|
||||
guiDialog.add(btMemory);
|
||||
Point point = new Point();
|
||||
point = guiFrame.getLocation();
|
||||
int x = (int) point.getX();
|
||||
int y = (int) point.getY();
|
||||
guiDialog.setLocation(60 + x, 70 + y);
|
||||
guiDialog.setSize(320, 150);
|
||||
// guiDialog.setResizable (false);
|
||||
guiDialog.show();
|
||||
}
|
||||
/**
|
||||
* Configure Memory (Execution)
|
||||
*/
|
||||
private void configMemoryExec() {
|
||||
int brkVector;
|
||||
String _str = cbg.getSelectedCheckbox().getLabel();
|
||||
if (_str == "8kb") {
|
||||
ram8k = true;
|
||||
}
|
||||
if (_str == "Max") {
|
||||
ram8k = false;
|
||||
}
|
||||
mem.setRam8k(ram8k);
|
||||
writeInRom = wRomCbox.getState();
|
||||
mem.setWriteInRom(writeInRom);
|
||||
brkVector = (hexStringToInt(miscTxt.getText()));
|
||||
mem.write(0xFFFE, (brkVector & 0xFF));
|
||||
mem.write(0xFFFF, (brkVector / 0x100) & 0xFF);
|
||||
guiDialog.dispose();
|
||||
}
|
||||
|
||||
//***************************************************
|
||||
//************* About Dialog Methods ****************
|
||||
//***************************************************
|
||||
|
||||
/**
|
||||
* About Pom1 Dialog
|
||||
*/
|
||||
private void aboutPom1() {
|
||||
TextArea ta = new TextArea(" *Pom1* the Java Apple I Emulator\nWritten by Verhille Arnaud\nE.mail : gist@wanadoo.fr\nhttp://www.chez.com/apple1/\n\nThanks to :\nSteve Wozniak (The Brain)\nFabrice Frances (Java Microtan Emulator)\nAchim Breidenbach from Boinx Software \n(Sim6502, Online 'Apple-1 Operation Manual')\nJuergen Buchmueller (MAME and MESS 6502 core)\nFrancis Limousy (for his help, and his friendship)\nStephano Priore from the MESS DEV\nJoe Torzewski (Apple I owners Club)\nTom Owad (http://applefritter.com/apple1/)", 23, 45, TextArea.SCROLLBARS_NONE);
|
||||
ta.setEditable(false);
|
||||
guiDialog.removeAll();
|
||||
guiDialog.setTitle("About Pom1");
|
||||
guiDialog.setLayout(new FlowLayout());
|
||||
guiDialog.add(ta);
|
||||
Point point = new Point();
|
||||
point = guiFrame.getLocation();
|
||||
int x = (int) point.getX();
|
||||
int y = (int) point.getY();
|
||||
guiDialog.setLocation(60 + x, 70 + y);
|
||||
guiDialog.setSize(375, 280);
|
||||
// guiDialog.setResizable (false);
|
||||
guiDialog.show();
|
||||
}
|
||||
|
||||
// *********************************************
|
||||
// ************* Utility Fonctions *************
|
||||
// *********************************************
|
||||
|
||||
/**
|
||||
* Utility Function : Transform an Hexadecimal String to an Int <BR>
|
||||
* 0xFFFF is the maximum value <BR>
|
||||
* return -1 on error
|
||||
*
|
||||
* @param s Hexadecimal String
|
||||
* @return The Int value of the String
|
||||
*/
|
||||
private int hexStringToInt(String s) {
|
||||
//return -1 if s wrong
|
||||
int i;
|
||||
//return -1 if s wrong
|
||||
int j;
|
||||
int max = 4;
|
||||
int total = 0;
|
||||
int p = 0;
|
||||
char[] schar = new char[4];
|
||||
//get valids Characters
|
||||
if (s.length() < 4) {
|
||||
max = s.length();
|
||||
}
|
||||
s.getChars(0, max, schar, 0);
|
||||
|
||||
for (i = 0; i < max; i++) {
|
||||
j = (max - 1) - i;
|
||||
// Left char is the High bit so char inversion
|
||||
if (i == 0) {
|
||||
p = 1;
|
||||
}
|
||||
if (i == 1) {
|
||||
p = 16;
|
||||
}
|
||||
if (i == 2) {
|
||||
p = 16 * 16;
|
||||
}
|
||||
if (i == 3) {
|
||||
p = 16 * 16 * 16;
|
||||
}
|
||||
if ((schar[j] == 'F') | (schar[j] == 'f')) {
|
||||
total += 15 * p;
|
||||
continue;
|
||||
}
|
||||
if ((schar[j] == 'E') | (schar[j] == 'e')) {
|
||||
total += 14 * p;
|
||||
continue;
|
||||
}
|
||||
if ((schar[j] == 'D') | (schar[j] == 'd')) {
|
||||
total += 13 * p;
|
||||
continue;
|
||||
}
|
||||
if ((schar[j] == 'C') | (schar[j] == 'c')) {
|
||||
total += 12 * p;
|
||||
continue;
|
||||
}
|
||||
if ((schar[j] == 'B') | (schar[j] == 'b')) {
|
||||
total += 11 * p;
|
||||
continue;
|
||||
}
|
||||
if ((schar[j] == 'A') | (schar[j] == 'a')) {
|
||||
total += 10 * p;
|
||||
continue;
|
||||
}
|
||||
if (schar[j] == '9') {
|
||||
total += 9 * p;
|
||||
continue;
|
||||
}
|
||||
if (schar[j] == '8') {
|
||||
total += 8 * p;
|
||||
continue;
|
||||
}
|
||||
if (schar[j] == '7') {
|
||||
total += 7 * p;
|
||||
continue;
|
||||
}
|
||||
if (schar[j] == '6') {
|
||||
total += 6 * p;
|
||||
continue;
|
||||
}
|
||||
if (schar[j] == '5') {
|
||||
total += 5 * p;
|
||||
continue;
|
||||
}
|
||||
if (schar[j] == '4') {
|
||||
total += 4 * p;
|
||||
continue;
|
||||
}
|
||||
if (schar[j] == '3') {
|
||||
total += 3 * p;
|
||||
continue;
|
||||
}
|
||||
if (schar[j] == '2') {
|
||||
total += 2 * p;
|
||||
continue;
|
||||
}
|
||||
if (schar[j] == '1') {
|
||||
total += 1 * p;
|
||||
continue;
|
||||
}
|
||||
if (schar[j] == '0') {
|
||||
continue;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
return total;
|
||||
}
|
||||
|
||||
/**
|
||||
* Format a 2 letter Hexadecimal number from an Int
|
||||
*
|
||||
* @param i Int
|
||||
* @return String
|
||||
*/
|
||||
private String toHex(int i) {
|
||||
String s = Long.toHexString(i).toUpperCase();
|
||||
if (i < 0x10) {
|
||||
s = "0" + s;
|
||||
}
|
||||
return s;
|
||||
}
|
||||
/**
|
||||
* Format a 4 letter Hexadecimal number from an Int
|
||||
*
|
||||
* @param i Int
|
||||
* @return String
|
||||
*/
|
||||
private String toHex4(int i) {
|
||||
String s = Long.toHexString(i).toUpperCase();
|
||||
if (i < 0x1000) {
|
||||
s = "0" + s;
|
||||
if (i < 0x100) {
|
||||
s = "0" + s;
|
||||
if (i < 0x10) {
|
||||
s = "0" + s;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
return s;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,9 @@
|
|||
<HTML>
|
||||
<HEAD>
|
||||
|
||||
</HEAD><BODY>
|
||||
<APPLET CODE="Pom1Applet.java" WIDTH="280" HEIGHT="192">
|
||||
</APPLET>
|
||||
|
||||
</BODY>
|
||||
</HTML>
|
|
@ -0,0 +1,8 @@
|
|||
// Pom1 Save : Program to print ASCII HEX equivalents of all printing characters
|
||||
// Type 750R to execute
|
||||
|
||||
0750: A2 A0 A9 8D 20 EF FF 8A
|
||||
0758: 20 EF FF A9 A0 20 EF FF
|
||||
0760: 8A 20 DC FF E8 A9 A0 20
|
||||
0768: EF FF 20 EF FF E0 00 F0
|
||||
0770: 03 4C 54 07 4C 1F FF
|
|
@ -0,0 +1,7 @@
|
|||
// Pom1 Save : Program to print ASCII HEX equivalent of any keyboard character
|
||||
// Type 700R to execute
|
||||
|
||||
0700: A9 8D 20 EF FF AD 11 D0
|
||||
0708: 10 FB AD 10 D0 AA 20 EF
|
||||
0710: FF A9 A0 20 EF FF 8A 20
|
||||
0718: DC FF 4C 00 07
|
|
@ -0,0 +1,20 @@
|
|||
// This is the first programm on the Apple 1 from the
|
||||
// 'Section I - Getting The System Running' of
|
||||
// the Apple-1 Operation Manual. It was written by Steve Wozniak in 1976.
|
||||
|
||||
0000: A9 00 // LDA #0
|
||||
0002: AA // TAX
|
||||
0003: 20 EF FF // JSR $FFEF -> 'Echo' the accu
|
||||
0006: E8 // INX
|
||||
0007: 8A // TXA
|
||||
0008: 4C 02 00 // JMP $0002 -> Next Character
|
||||
|
||||
// Load this program by choosing the "Load Memory..."-item of the "File"-menu.
|
||||
// If there is an error while loading the error message will be displayed in
|
||||
// the Apple-1 monitor. Start the Program with "0 R" (which means "Go to $0000 and Run!")
|
||||
// It should print out all the characters of the computer.
|
||||
// You can only stop the program by reseting the cpu with command-period.
|
||||
|
||||
// Apple for ever! Achim Breidenbach 1997
|
||||
// e-mail: achim@boinx.com
|
||||
// http://www.boinx.com
|
|
@ -0,0 +1,575 @@
|
|||
// Pom1 Save : LittleTower.txt
|
||||
// Load the program with File - Load Memory ...
|
||||
// Then type 300R to execute Little Tower
|
||||
// Have Fun :-)
|
||||
|
||||
0300: D8 20 EB 08 A9 01 85 10
|
||||
0308: A9 00 85 11 85 15 85 12
|
||||
0310: 85 13 85 14 A9 FF 85 16
|
||||
0318: A9 00 85 04 4C 1F 03 A5
|
||||
0320: 04 D0 03 20 E4 06 20 A0
|
||||
0328: 08 20 2F 03 4C 1F 03 A9
|
||||
0330: B3 85 02 A9 0C 85 03 20
|
||||
0338: 7F 08 30 78 A9 AE 85 02
|
||||
0340: A9 0C 85 03 20 7F 08 30
|
||||
0348: 77 A9 B8 85 02 A9 0C 85
|
||||
0350: 03 20 7F 08 30 6D A9 BD
|
||||
0358: 85 02 A9 0C 85 03 20 7F
|
||||
0360: 08 30 65 A9 C2 85 02 A9
|
||||
0368: 0C 85 03 20 7F 08 30 58
|
||||
0370: A9 CD 85 02 A9 0C 85 03
|
||||
0378: 20 7F 08 30 72 A5 10 C9
|
||||
0380: 01 D0 03 4C 34 04 C9 02
|
||||
0388: D0 03 4C C7 04 C9 03 D0
|
||||
0390: 03 4C 30 05 C9 04 D0 03
|
||||
0398: 4C 93 05 C9 05 D0 03 4C
|
||||
03A0: 08 06 C9 06 D0 03 4C 6D
|
||||
03A8: 06 A9 52 85 02 A9 0C 85
|
||||
03B0: 03 20 CF 08 A9 D6 85 02
|
||||
03B8: A9 0A 85 03 20 CF 08 60
|
||||
03C0: 4C 1A FF A9 00 85 04 60
|
||||
03C8: A9 C4 85 02 A9 0B 85 03
|
||||
03D0: 20 CF 08 20 A0 08 A9 C7
|
||||
03D8: 85 02 A9 0C 85 03 20 7F
|
||||
03E0: 08 10 F0 A9 1B 85 02 A9
|
||||
03E8: 0C 85 03 20 CF 08 60 A9
|
||||
03F0: 6F 85 02 A9 0C 85 03 20
|
||||
03F8: CF 08 A5 12 30 0C A9 A5
|
||||
0400: 85 02 A9 0C 85 03 20 CF
|
||||
0408: 08 60 A9 84 85 02 A9 0C
|
||||
0410: 85 03 20 CF 08 A5 13 10
|
||||
0418: 0B A9 8B 85 02 A9 0C 85
|
||||
0420: 03 20 CF 08 A5 14 10 0B
|
||||
0428: A9 94 85 02 A9 0C 85 03
|
||||
0430: 20 CF 08 60 A9 D9 85 02
|
||||
0438: A9 0C 85 03 20 7F 08 30
|
||||
0440: 28 A9 69 85 02 A9 0D 85
|
||||
0448: 03 20 7F 08 30 24 A9 86
|
||||
0450: 85 02 A9 0D 85 03 20 7F
|
||||
0458: 08 30 33 A9 80 85 02 A9
|
||||
0460: 0D 85 03 20 7F 08 30 46
|
||||
0468: 60 A9 02 85 10 A9 00 85
|
||||
0470: 04 60 A5 11 30 0C A9 3C
|
||||
0478: 85 02 A9 11 85 03 20 CF
|
||||
0480: 08 60 A9 50 85 02 A9 11
|
||||
0488: 85 03 20 CF 08 60 A5 12
|
||||
0490: 30 0C A9 1C 85 02 A9 12
|
||||
0498: 85 03 20 CF 08 60 A9 3B
|
||||
04A0: 85 02 A9 12 85 03 20 CF
|
||||
04A8: 08 A9 FF 85 11 60 A5 11
|
||||
04B0: 30 0C A9 3C 85 02 A9 11
|
||||
04B8: 85 03 20 CF 08 60 A9 03
|
||||
04C0: 85 10 A9 00 85 04 60 A9
|
||||
04C8: D7 85 02 A9 0C 85 03 20
|
||||
04D0: 7F 08 30 28 A9 D9 85 02
|
||||
04D8: A9 0C 85 03 20 7F 08 30
|
||||
04E0: 24 A9 4B 85 02 A9 0D 85
|
||||
04E8: 03 20 7F 08 30 26 A9 58
|
||||
04F0: 85 02 A9 0D 85 03 20 7F
|
||||
04F8: 08 30 25 60 A9 01 85 10
|
||||
0500: A9 00 85 04 60 A9 81 85
|
||||
0508: 02 A9 11 85 03 20 CF 08
|
||||
0510: 68 4C 1A FF A9 AB 85 02
|
||||
0518: A9 11 85 03 20 CF 08 60
|
||||
0520: A9 DF 85 02 A9 11 85 03
|
||||
0528: 20 CF 08 A9 FF 85 12 60
|
||||
0530: A9 DB 85 02 A9 0C 85 03
|
||||
0538: 20 7F 08 30 28 A9 DD 85
|
||||
0540: 02 A9 0C 85 03 20 7F 08
|
||||
0548: 30 24 A9 3D 85 02 A9 0D
|
||||
0550: 85 03 20 7F 08 30 20 A9
|
||||
0558: 76 85 02 A9 0D 85 03 20
|
||||
0560: 7F 08 30 1F 60 A9 01 85
|
||||
0568: 10 A9 00 85 04 60 A9 04
|
||||
0570: 85 10 A9 00 85 04 60 A9
|
||||
0578: 55 85 02 A9 12 85 03 20
|
||||
0580: CF 08 60 A9 72 85 02 A9
|
||||
0588: 12 85 03 20 CF 08 A9 FF
|
||||
0590: 85 13 60 A9 DD 85 02 A9
|
||||
0598: 0C 85 03 20 7F 08 30 35
|
||||
05A0: A9 E0 85 02 A9 0C 85 03
|
||||
05A8: 20 7F 08 30 31 A9 D9 85
|
||||
05B0: 02 A9 0C 85 03 20 7F 08
|
||||
05B8: 30 2D A9 21 85 02 A9 0D
|
||||
05C0: 85 03 20 7F 08 30 29 A9
|
||||
05C8: 31 85 02 A9 0D 85 03 20
|
||||
05D0: 7F 08 30 28 60 A9 06 85
|
||||
05D8: 10 A9 00 85 04 60 A9 03
|
||||
05E0: 85 10 A9 00 85 04 60 A9
|
||||
05E8: 05 85 10 A9 00 85 04 60
|
||||
05F0: A9 91 85 02 A9 12 85 03
|
||||
05F8: 20 CF 08 60 A9 03 85 02
|
||||
0600: A9 13 85 03 20 CF 08 60
|
||||
0608: A9 07 85 02 A9 0D 85 03
|
||||
0610: 20 7F 08 30 28 A9 14 85
|
||||
0618: 02 A9 0D 85 03 20 7F 08
|
||||
0620: 30 2B A9 D7 85 02 A9 0C
|
||||
0628: 85 03 20 7F 08 30 2A A9
|
||||
0630: FD 85 02 A9 0C 85 03 20
|
||||
0638: 7F 08 30 26 60 A9 32 85
|
||||
0640: 02 A9 13 85 03 20 CF 08
|
||||
0648: A9 FF 85 14 60 A9 6E 85
|
||||
0650: 02 A9 13 85 03 20 CF 08
|
||||
0658: 60 A9 04 85 10 A9 00 85
|
||||
0660: 04 60 A9 FF 85 15 A9 00
|
||||
0668: 85 04 85 13 60 A9 E0 85
|
||||
0670: 02 A9 0C 85 03 20 7F 08
|
||||
0678: 30 1B A9 E5 85 02 A9 0C
|
||||
0680: 85 03 20 7F 08 30 2E A9
|
||||
0688: F2 85 02 A9 0C 85 03 20
|
||||
0690: 7F 08 30 31 60 A5 16 10
|
||||
0698: 0F A9 67 85 02 A9 14 85
|
||||
06A0: 03 20 CF 08 68 4C 1A FF
|
||||
06A8: A9 04 85 10 A9 FF 85 16
|
||||
06B0: A9 00 85 04 60 A9 D3 85
|
||||
06B8: 02 A9 13 85 03 20 CF 08
|
||||
06C0: A9 00 85 16 60 A5 16 10
|
||||
06C8: 0C A9 FA 85 02 A9 13 85
|
||||
06D0: 03 20 CF 08 60 A9 1D 85
|
||||
06D8: 02 A9 14 85 03 20 CF 08
|
||||
06E0: 68 4C 1A FF A9 FF 85 04
|
||||
06E8: A5 10 C9 01 D0 03 4C 1F
|
||||
06F0: 07 C9 02 D0 03 4C 57 07
|
||||
06F8: C9 03 D0 03 4C 8F 07 C9
|
||||
0700: 04 D0 03 4C C7 07 C9 05
|
||||
0708: D0 03 4C FF 07 C9 06 D0
|
||||
0710: 03 4C 47 08 A9 52 85 02
|
||||
0718: A9 0C 85 03 20 CF 08 A9
|
||||
0720: 8E 85 02 A9 0D 85 03 20
|
||||
0728: CF 08 A9 AE 85 02 A9 0B
|
||||
0730: 85 03 20 CF 08 A9 36 85
|
||||
0738: 02 A9 0E 85 03 20 CF 08
|
||||
0740: A9 BA 85 02 A9 0B 85 03
|
||||
0748: 20 CF 08 A9 3C 85 02 A9
|
||||
0750: 0E 85 03 20 CF 08 60 A9
|
||||
0758: 45 85 02 A9 0E 85 03 20
|
||||
0760: CF 08 A9 AE 85 02 A9 0B
|
||||
0768: 85 03 20 CF 08 A9 D4 85
|
||||
0770: 02 A9 0E 85 03 20 CF 08
|
||||
0778: A9 BA 85 02 A9 0B 85 03
|
||||
0780: 20 CF 08 A9 E3 85 02 A9
|
||||
0788: 0E 85 03 20 CF 08 60 A9
|
||||
0790: E8 85 02 A9 0E 85 03 20
|
||||
0798: CF 08 A9 AE 85 02 A9 0B
|
||||
07A0: 85 03 20 CF 08 A9 81 85
|
||||
07A8: 02 A9 0F 85 03 20 CF 08
|
||||
07B0: A9 BA 85 02 A9 0B 85 03
|
||||
07B8: 20 CF 08 A9 88 85 02 A9
|
||||
07C0: 0F 85 03 20 CF 08 60 A9
|
||||
07C8: 8E 85 02 A9 0F 85 03 20
|
||||
07D0: CF 08 A9 AE 85 02 A9 0B
|
||||
07D8: 85 03 20 CF 08 A9 1D 85
|
||||
07E0: 02 A9 10 85 03 20 CF 08
|
||||
07E8: A9 BA 85 02 A9 0B 85 03
|
||||
07F0: 20 CF 08 A9 2A 85 02 A9
|
||||
07F8: 10 85 03 20 CF 08 60 A5
|
||||
0800: 15 30 0C A9 9F 85 02 A9
|
||||
0808: 13 85 03 20 CF 08 60 A9
|
||||
0810: 35 85 02 A9 10 85 03 20
|
||||
0818: CF 08 A9 AE 85 02 A9 0B
|
||||
0820: 85 03 20 CF 08 A9 A5 85
|
||||
0828: 02 A9 10 85 03 20 CF 08
|
||||
0830: A9 BA 85 02 A9 0B 85 03
|
||||
0838: 20 CF 08 A9 B0 85 02 A9
|
||||
0840: 10 85 03 20 CF 08 60 A9
|
||||
0848: B3 85 02 A9 10 85 03 20
|
||||
0850: CF 08 A9 AE 85 02 A9 0B
|
||||
0858: 85 03 20 CF 08 A9 2D 85
|
||||
0860: 02 A9 11 85 03 20 CF 08
|
||||
0868: A9 BA 85 02 A9 0B 85 03
|
||||
0870: 20 CF 08 A9 36 85 02 A9
|
||||
0878: 11 85 03 20 CF 08 60 A0
|
||||
0880: FF C8 B1 02 C9 25 F0 0A
|
||||
0888: 69 7F D9 00 02 F0 F2 A9
|
||||
0890: 00 60 A9 FF 60 C9 DF F0
|
||||
0898: 13 C9 9B F0 03 C8 10 0F
|
||||
08A0: A9 8D 20 EF FF A9 3E 20
|
||||
08A8: EF FF A0 01 88 30 F1 AD
|
||||
08B0: 11 D0 10 FB AD 10 D0 99
|
||||
08B8: 00 02 20 EF FF C9 8D D0
|
||||
08C0: D4 60 A0 00 A5 00 C8 20
|
||||
08C8: EF FF C4 01 D0 F8 60 A0
|
||||
08D0: FF C8 B1 02 C9 25 F0 12
|
||||
08D8: C9 26 F0 06 20 EF FF 4C
|
||||
08E0: D1 08 A9 8D 20 EF FF 4C
|
||||
08E8: D1 08 60 A9 8D 20 EF FF
|
||||
08F0: 20 EF FF A9 08 85 01 A9
|
||||
08F8: A0 85 00 20 C2 08 A9 71
|
||||
0900: 85 02 A9 0A 85 03 20 CF
|
||||
0908: 08 A9 0A 85 01 20 C2 08
|
||||
0910: A9 7F 85 02 A9 0A 85 03
|
||||
0918: 20 CF 08 A9 0C 85 01 20
|
||||
0920: C2 08 A9 92 85 02 A9 0A
|
||||
0928: 85 03 20 CF 08 A9 8D 20
|
||||
0930: EF FF A9 10 85 01 A9 A0
|
||||
0938: 85 00 20 C2 08 A9 08 85
|
||||
0940: 01 A9 C9 85 00 20 C2 08
|
||||
0948: A9 8D 20 EF FF A9 10 85
|
||||
0950: 01 A9 A0 85 00 20 C2 08
|
||||
0958: A9 C9 20 EF FF A9 06 85
|
||||
0960: 01 20 C2 08 A9 C9 20 EF
|
||||
0968: FF A9 8D 20 EF FF A9 10
|
||||
0970: 85 01 A9 A0 85 00 20 C2
|
||||
0978: 08 A9 C9 20 EF FF A9 06
|
||||
0980: 85 01 20 C2 08 A9 C9 20
|
||||
0988: EF FF A9 8D 20 EF FF A9
|
||||
0990: 10 85 01 A9 A0 85 00 20
|
||||
0998: C2 08 A9 C9 20 EF FF A9
|
||||
09A0: 06 85 01 20 C2 08 A9 C9
|
||||
09A8: 20 EF FF A9 8D 20 EF FF
|
||||
09B0: A9 10 85 01 A9 A0 85 00
|
||||
09B8: 20 C2 08 A9 C9 20 EF FF
|
||||
09C0: A9 02 85 01 20 C2 08 A9
|
||||
09C8: C9 85 00 20 C2 08 A9 A0
|
||||
09D0: 85 00 20 C2 08 A9 C9 20
|
||||
09D8: EF FF A9 8D 20 EF FF A9
|
||||
09E0: 10 85 01 A9 A0 85 00 20
|
||||
09E8: C2 08 A9 C9 20 EF FF A9
|
||||
09F0: 02 85 01 20 C2 08 A9 C9
|
||||
09F8: 85 00 20 C2 08 A9 A0 85
|
||||
0A00: 00 20 C2 08 A9 C9 20 EF
|
||||
0A08: FF A9 8D 20 EF FF A9 0C
|
||||
0A10: 85 01 A9 A0 85 00 20 C2
|
||||
0A18: 08 A9 C9 85 00 A9 10 85
|
||||
0A20: 01 20 C2 08 A9 8D 20 EF
|
||||
0A28: FF 20 EF FF A9 0C 85 01
|
||||
0A30: A9 A0 85 00 20 C2 08 A9
|
||||
0A38: A9 85 02 A9 0A 85 03 20
|
||||
0A40: CF 08 A9 3E 20 EF FF AD
|
||||
0A48: 11 D0 10 FB AD 10 D0 C9
|
||||
0A50: B1 F0 12 C9 B2 F0 03 4C
|
||||
0A58: 47 0A A9 D6 85 02 A9 0A
|
||||
0A60: 85 03 20 CF 08 A9 BC 85
|
||||
0A68: 02 A9 0A 85 03 20 CF 08
|
||||
0A70: 60 4C 49 54 54 4C 45 20
|
||||
0A78: 54 4F 57 45 52 26 25 41
|
||||
0A80: 50 50 4C 45 20 31 20 43
|
||||
0A88: 4F 4F 4C 20 47 41 4D 45
|
||||
0A90: 26 25 57 52 49 54 54 45
|
||||
0A98: 4E 20 42 59 20 41 2E 56
|
||||
0AA0: 45 52 48 49 4C 4C 45 26
|
||||
0AA8: 25 31 5D 20 50 4C 41 59
|
||||
0AB0: 20 20 32 5D 20 48 45 4C
|
||||
0AB8: 50 26 26 25 4F 4B 2C 20
|
||||
0AC0: 4E 4F 57 20 4C 45 54 27
|
||||
0AC8: 53 20 42 45 47 49 4E 20
|
||||
0AD0: 2E 2E 2E 26 26 25 54 48
|
||||
0AD8: 49 53 20 49 53 20 41 20
|
||||
0AE0: 42 41 53 49 43 20 54 58
|
||||
0AE8: 54 20 41 44 56 45 4E 54
|
||||
0AF0: 55 52 45 2E 26 56 41 4C
|
||||
0AF8: 49 44 53 20 43 4F 4D 4D
|
||||
0B00: 41 4E 44 53 20 41 52 45
|
||||
0B08: 3A 26 26 44 49 52 45 43
|
||||
0B10: 54 49 4F 4E 3A 20 4E 2C
|
||||
0B18: 53 2C 57 2C 45 2C 55 50
|
||||
0B20: 2C 44 4F 57 4E 2E 26 41
|
||||
0B28: 43 54 49 4F 4E 3A 20 4C
|
||||
0B30: 4F 4F 4B 2C 45 58 41 4D
|
||||
0B38: 49 4E 45 2C 45 4E 54 45
|
||||
0B40: 52 2C 47 45 54 2C 55 53
|
||||
0B48: 45 2C 53 41 59 2E 26 53
|
||||
0B50: 50 45 43 49 41 4C 3A 20
|
||||
0B58: 49 4E 56 45 4E 54 4F 52
|
||||
0B60: 59 2C 48 45 4C 50 2C 45
|
||||
0B68: 58 49 54 2E 26 4F 42 4A
|
||||
0B70: 45 43 54 3A 20 42 4F 41
|
||||
0B78: 54 2C 44 4F 4F 52 2C 41
|
||||
0B80: 4E 44 20 4D 4F 52 45 2E
|
||||
0B88: 2E 2E 26 26 43 4F 4D 50
|
||||
0B90: 4C 45 58 20 43 4F 4D 4D
|
||||
0B98: 41 4E 44 20 55 53 45 20
|
||||
0BA0: 54 57 4F 20 57 4F 52 44
|
||||
0BA8: 20 4D 41 58 26 25 4F 42
|
||||
0BB0: 4A 45 43 54 28 53 29 3A
|
||||
0BB8: 20 25 45 58 49 54 28 53
|
||||
0BC0: 29 3A 20 25 48 45 59 2C
|
||||
0BC8: 20 42 45 43 41 55 53 45
|
||||
0BD0: 20 59 4F 55 20 53 41 59
|
||||
0BD8: 20 54 48 41 54 2C 26 59
|
||||
0BE0: 4F 55 20 4D 55 53 54 20
|
||||
0BE8: 54 59 50 45 20 27 53 4F
|
||||
0BF0: 52 52 59 27 20 54 4F 20
|
||||
0BF8: 43 4F 4E 54 49 4E 55 45
|
||||
0C00: 2E 26 4F 42 45 59 20 43
|
||||
0C08: 41 4E 20 42 45 20 41 20
|
||||
0C10: 47 4F 4F 44 20 49 44 45
|
||||
0C18: 41 26 25 4F 4B 2C 20 59
|
||||
0C20: 4F 55 27 52 45 20 41 20
|
||||
0C28: 47 4F 4F 44 20 42 4F 59
|
||||
0C30: 20 28 4F 52 20 47 49 52
|
||||
0C38: 4C 29 2C 26 59 4F 55 20
|
||||
0C40: 43 41 4E 20 50 4C 41 59
|
||||
0C48: 20 4E 4F 57 20 2E 2E 2E
|
||||
0C50: 26 25 52 4F 4F 4D 20 50
|
||||
0C58: 4F 53 49 54 49 4F 4E 20
|
||||
0C60: 45 52 52 4F 52 20 3A 2D
|
||||
0C68: 28 28 28 28 28 26 25 59
|
||||
0C70: 4F 55 52 20 42 41 47 20
|
||||
0C78: 43 4F 4E 54 41 49 4E 53
|
||||
0C80: 20 3A 26 25 41 20 4B 45
|
||||
0C88: 59 26 25 41 20 54 4F 52
|
||||
0C90: 43 48 26 25 41 20 53 49
|
||||
0C98: 4C 56 45 52 20 44 41 47
|
||||
0CA0: 47 45 52 26 25 4E 4F 54
|
||||
0CA8: 48 49 4E 47 26 25 45 58
|
||||
0CB0: 49 54 25 48 45 4C 50 25
|
||||
0CB8: 4C 4F 4F 4B 25 53 48 49
|
||||
0CC0: 54 25 46 55 43 4B 25 53
|
||||
0CC8: 4F 52 52 59 25 49 4E 56
|
||||
0CD0: 45 4E 54 4F 52 59 25 4E
|
||||
0CD8: 25 53 25 57 25 55 50 25
|
||||
0CE0: 44 4F 57 4E 25 53 41 59
|
||||
0CE8: 20 41 4E 41 45 54 4F 53
|
||||
0CF0: 48 25 55 53 45 20 44 41
|
||||
0CF8: 47 47 45 52 25 55 53 45
|
||||
0D00: 20 54 4F 52 43 48 25 45
|
||||
0D08: 58 41 4D 49 4E 45 20 44
|
||||
0D10: 45 53 4B 25 45 58 41 4D
|
||||
0D18: 49 4E 45 20 42 4F 4F 4B
|
||||
0D20: 25 45 58 41 4D 49 4E 45
|
||||
0D28: 20 50 49 43 54 55 52 45
|
||||
0D30: 25 45 58 41 4D 49 4E 45
|
||||
0D38: 20 42 45 44 25 45 58 41
|
||||
0D40: 4D 49 4E 45 20 54 4F 52
|
||||
0D48: 43 48 25 45 58 41 4D 49
|
||||
0D50: 4E 45 20 42 4F 41 54 25
|
||||
0D58: 45 58 41 4D 49 4E 45 20
|
||||
0D60: 53 4B 45 4C 45 54 4F 4E
|
||||
0D68: 25 45 58 41 4D 49 4E 45
|
||||
0D70: 20 44 4F 4F 52 25 47 45
|
||||
0D78: 54 20 54 4F 52 43 48 25
|
||||
0D80: 45 4E 54 45 52 25 55 53
|
||||
0D88: 45 20 4B 45 59 25 59 4F
|
||||
0D90: 55 27 52 45 20 49 4E 20
|
||||
0D98: 41 20 44 41 52 4B 20 46
|
||||
0DA0: 4F 52 45 53 54 2E 26 45
|
||||
0DA8: 4C 55 53 49 56 45 20 53
|
||||
0DB0: 48 41 44 4F 57 53 20 41
|
||||
0DB8: 52 45 20 46 4C 59 49 4E
|
||||
0DC0: 47 20 41 52 4F 55 4E 44
|
||||
0DC8: 2E 26 49 4E 20 46 52 4F
|
||||
0DD0: 4E 54 20 4F 46 20 59 4F
|
||||
0DD8: 55 2C 20 41 20 54 48 52
|
||||
0DE0: 45 45 20 46 4C 4F 4F 52
|
||||
0DE8: 20 54 4F 57 45 52 26 53
|
||||
0DF0: 45 45 4D 53 20 54 4F 20
|
||||
0DF8: 42 45 20 57 45 4C 43 4F
|
||||
0E00: 4D 49 4E 47 2E 26 54 4F
|
||||
0E08: 20 54 48 45 20 53 4F 55
|
||||
0E10: 54 48 2C 20 41 20 4C 41
|
||||
0E18: 4B 45 20 44 49 53 41 50
|
||||
0E20: 50 45 41 52 49 4E 47 26
|
||||
0E28: 49 4E 54 4F 20 54 48 45
|
||||
0E30: 20 46 4F 47 26 25 44 4F
|
||||
0E38: 4F 52 26 25 53 2C 45 4E
|
||||
0E40: 54 45 52 26 25 59 4F 55
|
||||
0E48: 27 52 45 20 4F 4E 20 54
|
||||
0E50: 48 45 20 4C 41 4B 45 27
|
||||
0E58: 53 20 42 41 4E 4B 2C 26
|
||||
0E60: 54 48 45 52 45 20 49 53
|
||||
0E68: 20 41 20 53 4B 45 4C 45
|
||||
0E70: 54 4F 4E 20 48 45 52 45
|
||||
0E78: 2C 20 41 4E 44 20 41 4E
|
||||
0E80: 20 4F 4C 44 26 53 4D 41
|
||||
0E88: 4C 4C 20 42 4F 41 54 20
|
||||
0E90: 46 4C 4F 41 54 54 49 4E
|
||||
0E98: 47 20 4F 4E 20 54 48 45
|
||||
0EA0: 20 57 41 54 45 52 2E 20
|
||||
0EA8: 49 54 26 43 41 4E 20 50
|
||||
0EB0: 52 4F 42 41 42 4C 59 20
|
||||
0EB8: 54 52 41 4E 53 50 4F 52
|
||||
0EC0: 54 20 59 4F 55 20 54 4F
|
||||
0EC8: 20 54 48 45 20 53 4F 55
|
||||
0ED0: 54 48 26 25 53 4B 45 4C
|
||||
0ED8: 45 54 4F 4E 2C 42 4F 41
|
||||
0EE0: 54 26 25 4E 2C 53 26 25
|
||||
0EE8: 59 4F 55 27 52 45 20 49
|
||||
0EF0: 4E 20 41 20 57 4F 52 4B
|
||||
0EF8: 53 48 4F 50 2E 20 4C 4F
|
||||
0F00: 54 53 20 4F 46 20 57 4F
|
||||
0F08: 4F 44 27 53 26 50 4C 41
|
||||
0F10: 4E 4B 53 20 41 52 45 20
|
||||
0F18: 52 45 53 54 49 4E 47 20
|
||||
0F20: 4F 4E 20 54 48 45 20 57
|
||||
0F28: 41 4C 4C 53 2E 20 54 48
|
||||
0F30: 45 52 45 26 41 52 45 20
|
||||
0F38: 53 4F 4D 45 20 54 4F 52
|
||||
0F40: 43 48 53 20 4F 4E 20 41
|
||||
0F48: 20 57 4F 52 4B 42 45 4E
|
||||
0F50: 43 48 2C 20 53 54 41 49
|
||||
0F58: 52 53 26 54 4F 20 54 48
|
||||
0F60: 45 20 4E 4F 52 54 48 20
|
||||
0F68: 41 4E 44 20 41 20 44 4F
|
||||
0F70: 4F 52 20 54 4F 20 54 48
|
||||
0F78: 45 20 57 45 53 54 2E 26
|
||||
0F80: 25 54 4F 52 43 48 26 25
|
||||
0F88: 57 2C 55 50 26 25 57 45
|
||||
0F90: 4C 43 4F 4D 45 20 54 4F
|
||||
0F98: 20 54 48 45 20 54 4F 57
|
||||
0FA0: 45 52 27 53 20 42 45 44
|
||||
0FA8: 52 4F 4F 4D 2E 26 54 48
|
||||
0FB0: 45 52 45 20 41 52 45 20
|
||||
0FB8: 53 4F 4D 45 20 50 49 43
|
||||
0FC0: 54 55 52 45 53 20 4F 4E
|
||||
0FC8: 20 54 48 45 20 57 41 4C
|
||||
0FD0: 4C 2C 26 42 55 54 20 4E
|
||||
0FD8: 4F 54 48 49 4E 47 20 4D
|
||||
0FE0: 4F 52 45 20 53 45 45 4D
|
||||
0FE8: 53 20 55 53 45 46 55 4C
|
||||
0FF0: 20 48 45 52 45 2E 26 4F
|
||||
0FF8: 48 2C 20 54 48 45 52 45
|
||||
1000: 27 53 20 41 20 44 4F 4F
|
||||
1008: 52 20 4F 4E 20 54 48 45
|
||||
1010: 20 53 4F 55 54 48 20 54
|
||||
1018: 4F 4F 2E 26 25 50 49 43
|
||||
1020: 54 55 52 45 2C 42 45 44
|
||||
1028: 26 25 55 50 2C 44 4F 57
|
||||
1030: 4E 2C 53 26 25 49 4E 20
|
||||
1038: 54 48 49 53 20 52 4F 4F
|
||||
1040: 4D 2C 20 54 48 45 52 45
|
||||
1048: 27 53 20 41 20 4C 49 42
|
||||
1050: 52 41 52 59 20 57 48 45
|
||||
1058: 52 45 26 48 55 4E 44 52
|
||||
1060: 45 44 20 4F 46 20 42 4F
|
||||
1068: 4F 4B 53 20 41 52 45 20
|
||||
1070: 53 54 4F 52 45 44 2E 26
|
||||
1078: 41 20 57 4F 4F 44 45 4E
|
||||
1080: 20 44 45 53 4B 20 41 4E
|
||||
1088: 44 20 41 20 43 48 41 49
|
||||
1090: 52 26 41 52 45 20 52 45
|
||||
1098: 53 54 49 4E 47 20 48 45
|
||||
10A0: 52 45 2E 26 25 44 45 53
|
||||
10A8: 4B 2C 42 4F 4F 4B 26 25
|
||||
10B0: 4E 26 25 54 48 49 53 20
|
||||
10B8: 52 4F 4F 4D 20 49 53 20
|
||||
10C0: 54 4F 54 41 4C 59 20 57
|
||||
10C8: 49 50 45 44 20 4F 55 54
|
||||
10D0: 2C 26 59 4F 55 20 43 41
|
||||
10D8: 4E 20 53 45 45 20 54 48
|
||||
10E0: 45 20 53 54 41 52 53 20
|
||||
10E8: 46 52 4F 4D 20 48 45 52
|
||||
10F0: 45 2E 26 49 4E 20 54 48
|
||||
10F8: 45 20 4D 49 44 44 4C 45
|
||||
1100: 20 4F 46 20 54 48 45 20
|
||||
1108: 4D 45 53 53 2C 26 41 20
|
||||
1110: 44 41 52 4B 20 4D 41 4E
|
||||
1118: 20 49 53 20 4C 4F 4F 4B
|
||||
1120: 49 4E 47 20 41 54 20 59
|
||||
1128: 4F 55 2E 26 25 4E 4F 54
|
||||
1130: 48 49 4E 47 26 25 44 4F
|
||||
1138: 57 4E 26 25 54 48 45 20
|
||||
1140: 44 4F 4F 52 20 49 53 20
|
||||
1148: 43 4C 4F 53 45 44 26 25
|
||||
1150: 54 48 45 20 44 4F 4F 52
|
||||
1158: 20 49 53 20 55 4E 4C 4F
|
||||
1160: 43 4B 45 44 20 41 4E 44
|
||||
1168: 20 4F 50 45 4E 2C 26 54
|
||||
1170: 59 50 45 20 27 45 4E 54
|
||||
1178: 45 52 27 20 4E 4F 57 26
|
||||
1180: 25 54 48 45 20 42 4F 41
|
||||
1188: 54 20 49 53 20 53 49 4E
|
||||
1190: 4B 49 4E 47 20 21 21 21
|
||||
1198: 21 26 54 48 41 54 27 53
|
||||
11A0: 20 54 48 45 20 45 4E 44
|
||||
11A8: 2E 26 25 54 48 45 52 45
|
||||
11B0: 20 49 53 20 41 20 4C 49
|
||||
11B8: 54 54 4C 45 20 48 4F 4C
|
||||
11C0: 45 20 49 4E 20 54 48 45
|
||||
11C8: 20 42 4F 41 54 2C 26 47
|
||||
11D0: 4F 4F 44 20 54 4F 20 4B
|
||||
11D8: 4E 4F 57 20 21 26 25 54
|
||||
11E0: 48 45 52 45 20 49 53 20
|
||||
11E8: 41 20 4B 45 59 20 55 4E
|
||||
11F0: 44 45 52 20 54 48 45 20
|
||||
11F8: 53 4B 45 4C 45 54 4F 4E
|
||||
1200: 26 59 4F 55 20 47 45 54
|
||||
1208: 20 54 48 45 20 4B 45 59
|
||||
1210: 20 57 49 54 48 20 59 4F
|
||||
1218: 55 2E 26 25 4E 4F 20 4B
|
||||
1220: 45 59 20 49 4E 20 59 4F
|
||||
1228: 55 52 20 49 4E 56 45 4E
|
||||
1230: 54 4F 52 59 20 21 21 21
|
||||
1238: 21 26 25 4F 4B 2C 20 54
|
||||
1240: 48 45 20 44 4F 4F 52 20
|
||||
1248: 49 53 20 55 4E 4C 4F 43
|
||||
1250: 4B 45 44 26 25 47 4F 4F
|
||||
1258: 44 20 54 4F 52 43 48 20
|
||||
1260: 46 4F 52 20 47 4F 4F 44
|
||||
1268: 20 4C 49 47 48 54 20 21
|
||||
1270: 26 25 4F 4B 2C 20 54 48
|
||||
1278: 45 20 54 4F 52 43 48 20
|
||||
1280: 49 53 20 49 4E 20 59 4F
|
||||
1288: 55 52 20 42 41 47 2E 26
|
||||
1290: 25 54 48 45 52 45 20 41
|
||||
1298: 52 45 20 53 4F 4D 45 20
|
||||
12A0: 43 41 42 41 4C 49 53 54
|
||||
12A8: 49 43 53 20 53 49 47 4E
|
||||
12B0: 53 2E 26 4F 4E 45 20 4F
|
||||
12B8: 4E 4C 59 20 43 41 4E 20
|
||||
12C0: 42 45 20 52 45 41 44 20
|
||||
12C8: 3A 26 27 41 4E 41 45 54
|
||||
12D0: 4F 53 48 27 20 49 53 20
|
||||
12D8: 54 48 45 20 57 4F 52 44
|
||||
12E0: 20 57 48 4F 20 43 41 4E
|
||||
12E8: 20 53 41 56 45 26 59 4F
|
||||
12F0: 55 20 46 52 4F 4D 20 50
|
||||
12F8: 41 52 41 4C 59 53 49 53
|
||||
1300: 2E 26 25 54 48 45 52 45
|
||||
1308: 27 53 20 4E 4F 54 48 49
|
||||
1310: 4E 47 20 4F 4E 20 54 48
|
||||
1318: 45 20 42 45 44 26 41 4E
|
||||
1320: 44 20 55 4E 44 45 52 20
|
||||
1328: 54 48 45 20 42 45 44 2E
|
||||
1330: 26 25 54 48 45 52 45 20
|
||||
1338: 49 53 20 41 20 53 49 4C
|
||||
1340: 56 45 52 20 44 41 47 47
|
||||
1348: 45 52 20 48 45 52 45 26
|
||||
1350: 59 4F 55 20 47 45 54 20
|
||||
1358: 54 48 45 20 44 41 47 47
|
||||
1360: 45 52 20 57 49 54 48 20
|
||||
1368: 59 4F 55 2E 26 25 4C 4F
|
||||
1370: 54 53 20 4F 46 20 42 4F
|
||||
1378: 4F 4B 20 54 41 4C 4B 20
|
||||
1380: 41 42 4F 55 54 26 56 41
|
||||
1388: 4D 50 49 52 45 53 20 45
|
||||
1390: 58 54 45 52 4D 49 4E 41
|
||||
1398: 54 49 4F 4E 2E 26 25 54
|
||||
13A0: 48 45 52 45 20 49 53 20
|
||||
13A8: 4E 4F 20 4C 49 47 48 54
|
||||
13B0: 20 48 45 52 45 2C 26 41
|
||||
13B8: 50 41 52 54 20 46 52 4F
|
||||
13C0: 4D 20 54 48 45 20 4E 4F
|
||||
13C8: 52 54 48 20 44 4F 4F 52
|
||||
13D0: 2E 26 25 59 45 41 48 48
|
||||
13D8: 2C 20 49 54 20 57 4F 52
|
||||
13E0: 4B 53 20 21 21 21 26 59
|
||||
13E8: 4F 55 20 43 41 4E 20 4D
|
||||
13F0: 4F 56 45 20 4E 4F 57 2E
|
||||
13F8: 26 25 49 54 27 53 20 49
|
||||
1400: 4D 50 4F 53 53 49 42 4C
|
||||
1408: 45 2C 20 59 4F 55 20 43
|
||||
1410: 41 4E 27 54 20 4D 4F 56
|
||||
1418: 45 20 21 26 25 54 48 45
|
||||
1420: 20 56 41 4D 50 49 52 45
|
||||
1428: 20 49 53 20 44 49 53 41
|
||||
1430: 50 50 45 41 52 49 4E 47
|
||||
1438: 26 55 4E 44 45 52 20 59
|
||||
1440: 4F 55 52 20 41 54 54 41
|
||||
1448: 43 4B 26 43 4F 4E 47 52
|
||||
1450: 41 54 55 4C 41 54 49 4F
|
||||
1458: 4E 2C 20 59 4F 55 20 57
|
||||
1460: 49 4E 20 21 21 26 25 59
|
||||
1468: 4F 55 20 41 52 45 20 54
|
||||
1470: 52 59 49 4E 47 20 54 4F
|
||||
1478: 20 45 53 43 41 50 45 2C
|
||||
1480: 26 42 55 54 20 59 4F 55
|
||||
1488: 20 43 41 4E 27 54 20 4D
|
||||
1490: 4F 56 45 2E 20 54 48 45
|
||||
1498: 20 56 41 4D 50 49 52 45
|
||||
14A0: 26 49 53 20 53 55 43 4B
|
||||
14A8: 49 4E 47 20 59 4F 55 52
|
||||
14B0: 20 42 4C 4F 4F 44 20 4E
|
||||
14B8: 4F 57 2E 26 54 48 41 54
|
||||
14C0: 27 53 20 54 48 45 20 45
|
||||
14C8: 4E 44 2E 26 25 00
|
|
@ -0,0 +1,26 @@
|
|||
// This is a modified version of the original code of the
|
||||
// "Getting The System Running"-Section written by Steve
|
||||
// Wozniak in 1976.
|
||||
|
||||
0000: A9 00 // LDA #0
|
||||
0002: AA // TAX
|
||||
0003: 20 DC FF // Print Byte as Hex
|
||||
0006: A9 3D // LDA "="
|
||||
0008: 20 EF FF // JSR $FFEF -> 'Echo' the accu
|
||||
000B: 8A // TXA
|
||||
000C: 20 EF FF // JSR $FFEF -> 'Echo' the accu
|
||||
000F: A9 20 // LDA " "
|
||||
0011: 20 EF FF // JSR $FFEF -> 'Echo' the accu
|
||||
0014: E8 // INX
|
||||
0015: 8A // TXA
|
||||
0016: 4C 03 00 // JMP $0002 -> Next Character
|
||||
|
||||
// Load this program by choosing the "Load Memory..."-item of the "File"-menu.
|
||||
// If there is an error while loading the error message will be displayed in
|
||||
// the Apple-1 monitor. Start the Program with "0 R" (which means "Go to $0000 and Run!")
|
||||
// It should print out all the characters with its byte number in the monitor.
|
||||
// You can only stop the program by reseting the cpu with command-period.
|
||||
|
||||
// Apple for ever! Achim Breidenbach 1997
|
||||
// e-mail: achim@boinx.com
|
||||
// http://www.boinx.com
|
|
@ -0,0 +1,34 @@
|
|||
// Pom1 Save : WozMonitor
|
||||
|
||||
FF00: D8 58 A0 7F 8C 12 D0 A9
|
||||
FF08: A7 8D 11 D0 8D 13 D0 C9
|
||||
FF10: DF F0 13 C9 9B F0 03 C8
|
||||
FF18: 10 0F A9 DC 20 EF FF A9
|
||||
FF20: 8D 20 EF FF A0 01 88 30
|
||||
FF28: F6 AD 11 D0 10 FB AD 10
|
||||
FF30: D0 99 00 02 20 EF FF C9
|
||||
FF38: 8D D0 D4 A0 FF A9 00 AA
|
||||
FF40: 0A 85 2B C8 B9 00 02 C9
|
||||
FF48: 8D F0 D4 C9 AE 90 F4 F0
|
||||
FF50: F0 C9 BA F0 EB C9 D2 F0
|
||||
FF58: 3B 86 28 86 29 84 2A B9
|
||||
FF60: 00 02 49 B0 C9 0A 90 06
|
||||
FF68: 69 88 C9 FA 90 11 0A 0A
|
||||
FF70: 0A 0A A2 04 0A 26 28 26
|
||||
FF78: 29 CA D0 F8 C8 D0 E0 C4
|
||||
FF80: 2A F0 97 24 2B 50 10 A5
|
||||
FF88: 28 81 26 E6 26 D0 B5 E6
|
||||
FF90: 27 4C 44 FF 6C 24 00 30
|
||||
FF98: 2B A2 02 B5 27 95 25 95
|
||||
FFA0: 23 CA D0 F7 D0 14 A9 8D
|
||||
FFA8: 20 EF FF A5 25 20 DC FF
|
||||
FFB0: A5 24 20 DC FF A9 BA 20
|
||||
FFB8: EF FF A9 A0 20 EF FF A1
|
||||
FFC0: 24 20 DC FF 86 2B A5 24
|
||||
FFC8: C5 28 A5 25 E5 29 B0 C1
|
||||
FFD0: E6 24 D0 02 E6 25 A5 24
|
||||
FFD8: 29 07 10 C8 48 4A 4A 4A
|
||||
FFE0: 4A 20 E5 FF 68 29 0F 09
|
||||
FFE8: B0 C9 BA 90 02 69 06 2C
|
||||
FFF0: 12 D0 30 FB 8D 12 D0 60
|
||||
FFF8: 00 00 00 0F 00 FF 00 00
|
Loading…
Reference in New Issue