KIM-1
MICROCOMPUTER MODULE
USER MANUAL
AUGUST 1976
The information in this manual has been reviewed and is believed to be entirely reliable. However,
no responsibility is assumed for inaccuracies. The material in this manual is for informational
purposes only and is subject to change without notice.
Second Edition
© MOS TECHNOLOGY, INC. 1976
"All Rights Reserved"
MOS TECHNOLOGY, INC.
950 Rittenhouse Road
Norristown, PA 19401
TABLE OF CONTENTS
CHAPTER I YOUR KIM-1 MICROCOMPUTER MODULE 1
CHAPTER 2 GETTING STARTED 5
2.1 Parts Complement 5
2.2 A Few Words of Caution! 6
2.3 First Steps 6
2.4 Let's Try a Simple Problem 9
2.5 Adding an Audio Tape Unit 12
2.6 Adding a Teleprinter 17
CHAPTER 3 THE KIM-1 SYSTEM 21
3.1 KIM-1 System Description 21
3.2 KIM-1 Memory Allocation 34
3.3 KIM-1 Operating Programs 40
CHAPTER 4 OPERATING THE KIM-1 SYSTEM 43
4.1 Using the Keyboard and Display 43
4.2 Using the Audio Tape Unit 47
4.3 Using the Teleprinter 50
CHAPTER 5 LET'S TRY A REAL APPLICATION 55
5.1 Defining the Interface 55
5.2 Writing the Program 58
5.3 Entering the Program 65
5.4 Executing the Program 66
5.5 Program Debugging and Modification 67
ii
CHAPTER 6 EXPANDING YOUR SYSTEM 71
6.1 Memory and I/O Expansion 71
6.2 Interrupt Vector Management 75
CHAPTER 7 WARRANTY AND SERVICE 79
7.1 In-Warranty Service 79
7.2 Out-of-Warranty Service 80
7.3 Policy on Changes 80
7.4 Shipping Instructions 80
iii
LIST OF FIGURES
CHAPTER 2 2-1 KIM MODULE 7
2-2 Power Supply Connections 8
2-3 Audio Tape Unit Connections 13
2-4 TTY Connections 18
CHAPTER 3 3-1 KIM-1 Block Diagram 24
3-2 Detailed Block Diagram 25
3-3 Control and Timing 26
3-4 1K x 8 RAM Memory 27
3-5 Keyboard and Display 28
3-6 Keyboard Detail 29
3-7 TTY Interface 30
3-8 Audio Tape Interface 31
3-9 Application Connector 32
3-10 Expansion Connector 33
3-11 Memory Block Diagram 37
3-12 Memory Map 38
3-13 Special Memory Addresses 39
3-14 Flow Chart 41
CHAPTER 5 5-1 Speaker Application 57
5-2 Assembly Language Listing 60
5-3 Square Wave Output 62
5-4 Machine Language Code Table 63
5-5 Key Sequence: Enter Program 65
CHAPTER6 6-1 4K Expansion 73
6-2 65K Expansion 74
6-3 Vector Selection 78
iv
LIST OF APPENDiCES
APPENDIX A KIM-1 Parts List A-1
APPENDIX B KIM-1 Parts Location B-1
APPENDIX C In Case of Trouble C-1
APPENDIX D Suggested Power Supply D-1
APPENDIX E Audio Tape Format E-1
APPENDIX F Paper Tape Format F-1
APPENDIX G 6502 Characteristics G-1
APPENDIX H 6530 Characteristics H-1
APPENDIX I KIM-1 Program Listings I-1
Congratulations and welcome to the exciting new world of micro-
computers! As the owner of a KIM-1 Microcomputer Module, you now have at
your disposal a completely operational, fully tested, and very capable
digital computer which incorporates the latest in microprocessor tech-
nology offered by MOS Technology, Inc. By selecting the KIM-1 module,
you have eliminated all of the problems of constructing and debugging a
microcomputer system. Your time is now available for learning the opera-
tion of the system and beginning immediately to apply it to your specific
areas of interest. In fact, if you will follow a few simple procedures
outlined in this manual, you should be able to achieve initial operation
of your KIM-1 module within a few minutes after unpacking the shipping
container.
Your KIM-1 module has been designed to provide you with a choice of
operating features. You may choose to operate the system using only the
keyboard and display included as part of the module. Next, you may add
a low cost audio cassette tape recorder to allow storage and retrieval
of your programs. Also, you may add a serial interfaced teleprinter to
the system to provide keyboard commands, hard-copy printing, and paper
tape read or punch capability.
1
At the heart of your KIM-1 system is an MCS 6502 Microprocessor
Array operating in conjunction with two MCS 6530 arrays. Each MCS 6530
provides a total of 1024 bytes of Read-only Memory (ROM) , 64 bytes of
Random Access Memory (RAM), 15 Input/Output pins, and an Interval Timer.
Stored permanently in the ROM's of the MCS 6530 arrays are the monitor
and executive programs devised by NOS Technology, Inc. to control the
various operating modes of the KIM-1 system.
The KIM-1 system is intended to provide you with a capable micro-
computer for use in your real-world" application. Accordingly, the
system includes a full 1024 bytes of RAM to provide data and program
storage for your application program. In addition, you are provided
with 15 bidirectional input/output pins to allow interface control of
your specific application. Finally, one of the interval timers included
in the system is available for generation of time base signals required
by your application.
Your KIM-1 system comes to you complete with all components mounted
and tested as a system. You need not worry about timing signals (we've
included a 1MHz crystal oscillator on the module), interface logic or
levels between system components, or interface circuitry to peripheral
devices. In fact, you need only apply the indicated power supply voltages
to the designated pins to achieve full operation of your KIM-1 system.
We recommend that you read all of this manual before applying power
to or attempting to operate your KIM-1 module. In the order presented,
you will find:
Chapter 2 - "hints and kinks" to help you achieve initial
system operation
Chapter 3 - a more detailed description of the KIM-1 system
hardware and software
Chapter 4 - operating procedures for all system modes
Chapter 5 - an example of a typical application program
using all of the features of the KIM-1 system.
2
At some future time, you may find it desirable to expand the KIM-1
system to incorporate more memory, different types of memory, or addi-
tional input/output capability. Again, we have tried to make system
expansion as simple as possible with all required interface signals
brought out to a special connector on the module. Watch for:
Chapter 6 - a guide to system expansion for increasing
both memory and input/output capability
Despite our best efforts to provide you with a fully operable
and reliable system, you might encounter some difficulties with your
KIM-1 module. If so, refer to:
Chapter 7 - some guidance on warranty and service
procedures for your KIM-1 module
Following the basic text of this manual, you will find a series of
Appendices intended to provide you with detailed information on certain
specialized subjects of interest to you in understanding the operation
of the KIM-1 system.
Lastly, since this manual cannot presume to provide all of the
technical information on the hardware or programming aspects of the
MCS 6502 microprocessor array, we are including with your KIM-1 system
two additional manuals for your reference. The Hardware Manual defines
the various elements of the system, their electrical and interface
characteristics, and the basic system architecture and timing. The
Programming Manual provides the detailed information required to write
effective programs using the MCS 6502 instruction program set.
So much for introductory comments! Now lets get started and see
if we can get your KIM-1 Microcomputer Module doing some real work for you.
This chapter is intended to guide you through the first important
steps in achieving initial operation of your KIM-1 Microcomputer Module.
We will ask you to perform certain operations without explanation at this
time as to why they are being done. In later sections of this manual,
full explanations will be offered for every operating procedure.
2.1 PARTS COMPLEMENT
After unpacking the shipping container for your KIM-1, you should
have located the following items:
3 Books - KIM-1 Users Manual
Hardware Manual
Programming Manual
1 Programming Card
1 System Schematic
1 KIM-1 Module
1 Connector (Already mounted on the Module)
1 Hardware Packet
1 Warranty Card
You may wish to save the shipping container and packing material
should you need to return your KIM-1 module to us at some future date.
5
2.2 A FEW WORDS OF CAUTION
WARNING
Your KIM-1 module includes a number of MOS integrated circuits. All such
circuits include protective devices to prevent damage resulting from
inadvertant application of high voltage potentials to the pins of the
device. However, normal precautions should be taken to prevent the appli-
cation of high voltage static discharges to the pins of an MOS device.
Immediately before removal of the packing material from your KIM-1 module,
you should develop the following precautionary habits:
1. Discharge any static charge build up on your body by touching a
ground connection before touching any part of your KIM-1 module.
(This precaution is especially important if you are working in a
carpeted area)
2. Be certain that soldering irons or test equipment used on the
KIM-1 module are properly grounded and not the source of
dangerously high voltage levels.
On a different subject, after unpacking your KIM-1 module, you will
note the presence of a potentiometer. This adjustment has been set at
the factory to insure correct operation of the audio cassette interface
circuits. It should never be necessary for you to change the position of
this potentiometer. ------
2.3 FIRST STEPS
After unpacking the KIM-1 module, locate the small hardware packet
and install the rubber pads provided. The rubber pads are located at the
bottom of the module (see attached sketch) and act both to lift the card
off your work surface and to provide mechanical support for the module
while you depress keys.
6
Place the module such that the keyboard is to your lower right and
observe that two connector locations extend from the module to your left.
The connector area on the lower left is referred to as the Application
connector (A). You will note that a 44 pin board edge connector is
already installed at this location. The connector area to the upper
left is for use by you for future system expansion and is referred to
as the Expansion connector (E).
KIM-1 Module
FIGURE 2.1
7
Remove the (A) connector from the module and connect the pins as
shown in the sketch.
Power Supply Connections
FIGURE 2.2
Reinstall the (A) connector making certain that the orientation is
correct.
Note 1: The +12 volt power supply is required only if you
will be using an audio cassette recorder in your system.
Note 2: The jumper from pin A-K to Vss (Pin A-1) is essential
for system operation. If you expand your system later,
this jumper will be removed and we'll tell you what to
do to pin A-K.
Note 3. If you don't have the proper power supplies already
available, you may wish to construct the iow cost
version shown with schematic and parts list in
Appendix D. In any event, your power supply must
be regulated to insure correct system operation and
must be capable of supplying the required current
levels indicated in the sketch.
8
Now, recheck your connections, turn on your power supplies, and
depress [RS] (reset). You should see the LED display digits light
as your first check that the system is operational. If not, recheck
your hookup or refer to Appendix C (In Case of Trouble).
2.4 LETS TRY A SIMPLE PROGRAM
Assuming that you have completed successfully all of the steps thus
far, a simple program now can be tried to demonstrate the operation of
the system and increase your confidence that everything works properly.
We'll be using only the keyboard and display on the module for this
example. (In the next two sections we'll worry about the teleprinter
and the audio cassette).
For our first example, we will add two 8 bit binary numbers together
and display the result. We presume that you are familiar with the hex-
adecimal representation of numbers and the general rules for binary arith-
metic.
First check and be sure that the slide switch in the upper right
corner of the keyboard is pushed to the left (SST Mode is OFF). Now
proceed with the following key sequence:
Press Keys See On Display Step #
[AD] xxxx xx 1
[0] [0] [0] [2] 0002 xx 2
[DA] 0002 xx 3
[1] [8] 0002 18 4
[+] [A] [5] 0003 A5 5
[+] [0] [0] 0004 00 6
[+] [6] [5] 0005 65 7
[+] [0] [1] 0006 01 8
[+] [8] [5] 0007 85 9
[+] [F] [A] 0008 FA 10
[+] [A] [9] 0009 A9 11
[+] [0] [0] 000A 00 12
[+] [8] [5] 000B 85 13
[+] [F] [B] 000C FB 14
[+] [4] [C] 000D 4C 15
[+] [4] [F] 000E 4F 16
[+] [1] [C] 000F 1C 17
9
What you have just done is entered a program and stored it in the
RAM at locations 0002 through QOOF. You should have noticed the purpose
of several special keys on your keyboard:
[AD] - selects the address entry mode
[DA] - selects the data entry mode
[+] - increments the address without
changing the entry mode
[0] to [F] - 16 entry keys defining the hex
code for address or data entry
You've noticed as well that your display contains 6 digits. The
four on the left are used to display the hex code for an address. The
two on the right show the hex code for the data stored at the address
shown. Therefore, when you pressed [AD] (step 1) and [0] [0] [0] [2]
(step 2), you defined the address entry mode, selected the address 0002,
and displayed the address 0002 in the four left-most display digits.
Incidentally, when we show an "x" in the display chart, we mean that we
don't know what will be displayed and we "don't care."
Next you pressed [DA] (step 3) followed by [1] [8] (step 4). Here,
you have defined the data entry mode and entered the value 18 to be
stored at your selected address 0002. Of course, the 18 then was dis-
played in the two right-most digits of your display.
You remained in the data entry mode but began to press [+] followed
by a two digit number (steps 5 to 17). Note that each depression of the
[+] key caused the address displayed to increase by one. The hex keys
following the [+] key continued to enter the data field of the display.
This procedure is merely a convenience when a number of successive address
locations are to be filled.
If you made any mistakes in pressing the keys, you should have noticed
that correcting an error is simply a matter of reentering the data until
the correct numbers show on the display.
10
The program you have entered is a simple loop to add two 8 bit
binary numbers together and present the result on the display. For a
programmer, the listing of the program entered might appear as follows:
POINTL = $FA
POINTH = $FB
START = $1C4F
0000 VALl
0001 VAL2
0002 18 PROG CLC
0003 A5 00 LDA VALl
0005 65 01 ADC VAL2
0007 85 FA STA POINTL
0009 A9 00 LDA #00
000B 85 FB STA POINTH
000D 4C 4F 1C JMP START
Stated in simple terms, the program will clear the carry flag (CLC)
load VALl into the accumulator (LDA VALl), add with carry VAL2 to the
accumulator (ADC VAL2), and store the result in a location POINTL (STA
POINTL). A zero value is stored in a location POINTH (LDA #00 and STA
POINTH) and the program jumps to a point labelled START (JMP START).
This pre-stored program will cause the display to be activated and will
cause the address field of your display to show the numbers stored in
locations POINTH and POINTL. Note that the result of the addition has
already been stored in location POINTL.
The hex codes appearing next to the address field of the listing are
exactly the numbers you entered to store the program. We refer to these
as machine language codes. For example, 4C is the hex code for the JMP
instruction of the microprocessor. The next two bytes of the program
define 1C4F (START) as the jump address.
As yet, you are not able to run the program because you have not yet
entered the two variables (VALl and VAL2). Lets try an actual example:
Press Keys See On Display Step #
[AD] 000F 1C 17A
[0] [0] [F] [1] 00F1 xx 17B
[DA] [0] [0] 00F1 00 18
[AD] 00F1 00 19
[0] [0] [0] [0] 0000 xx 20
[DA] 0000 02 21
[+] [0] [3] 0001 03 22
[+] [GO] 0002 18 23
11
Steps 17A, 17B, and 18 insure that the binary arithmetic mode is
selected.
Steps 19 to 21 store the hex value 02 in location 0000 (VAL1). Step
22 stores the hex value 03 in location 0001 (VAL2). Now we are ready to
run the program. In step 23, the [GO] key causes the program to execute
and the result, 05, appears in the right two digits of the address display.
Although the problem appears triviAL, it illustrates the basic principles
of entering and executing any program as well as providing a fairly high
assurance level that your KIM-1 module is operating properly.
You should try one more example using your stored program. Repeat
steps 17A to 23 but substitute the value FF for VALl and VAL2 at locations
0000 and 0001. Now when you press the GO key, your display should read:
00FE xx
The answer is correct because:
FF = 1111 1111
+ FF = 1111 1111
FE 1111 1110
Try some more examples if you wish and then let's move on to the rest
of the system.
2.5 ADDING A TAPERECORDER
In the previous section, you entered and executed a program. If you
turn off the power supplies to the system, your program is lost since the
memory into which you stored your program is volatile. If you require
the same program again, you would have to repower the system and reenter
the program as in the previous example.
The KIM-1 system is designed to work with an audio cassette tape
recorder/player to provide you with a medium for permanent storage of your
programs or data. The cassette with recorded data may be reread by the
system as often as you wish. In this section, you will connect the audio
cassette unit to the system and verify its operation.
12
The recording technique used by the KIM-1 system and the interface
circuits provided have been selected to insure trouble-free operation
with virtually any type and any quality level audio cassette unit. (We
have demonstrated correct operation with a tape unit purchased for less
than $20.00 from a local discount outlet). In addition, tapes recorded
on one unit may be played back to the system on a different unit if
desired. We recommend, of course, that you make use of the best equip-
ment and best quality tapes you have available.
In selecting a tape unit for use with your KIM-1 system, you should
verify that it comes equipped with the following features:
1. An earphone jack to provide a source of recorded
tape data to the KIM-1 system.
2. A microphone jack to allow recording of data from
the KIM-1 system on the tape.
3. Standard controls for Play, Record, Rewind, and Stop.
Note: You should avoid certain miniaturized tape equipment intended
for dictating applications where the microphone and speaker are enclosed
within the unit and no connections are provided to external jacks. If
such equipment is used, you will have to make internal modifications to
reach the desired connection points.
To connect your tape unit to the KIM-1 module, turn off the power
supplies and remove the connector (A) from the module. Add the wires
shown in the sketch:
Audio Tape Unit Connections
FIGURE 2.3
13
Keep the leads as short as possible and avoid running the leads near
sources of electrical interference. The connections shown are for typical,
portable type units. The Audio Data Out (LO) signal has a level of approx-
imately 15 mv. (peak) at pin M. Should you desire to use more expensive
and elaborate audio tape equipment, you may prefer to connect the high
level (1 volt peak) audio signal available at pin P to the "LINE" input
of your equipment.
Return the connector (A) to its correct position on the KIM-1 module
and turn on the power supplies. To verify the operation of your audio
cassette equipment, try the following procedures:
1. Reenter the sample program following the procedures
outlined in the previous section (2.4). Try the
sample problem again to be sure the system is
working correctly.
2. Install a cassette in your tape equipment and REWIND
to the limit position.
3. Define the starting and ending address of the program to
be stored and assign an identification number (ID) to
the program.
Press Keys See On Display Step #
[AD] xxxx xx 1
[0] [0] [F] [1] 00F1 xx 2
[DA] [0] [0] 00F1 00 3
[AD] 00F1 00 4
[1] [7] [F] [5] 17F5 xx 5
[DA] [0] [0] 17F5 00 6
[+] [0] [0] 17F6 00 7
[+] [1] [0] 17F7 10 8
[+] [0] [0] 17F8 00 9
[+] [0] [1] 17F9 01 10
[AD] 17F9 01 11
[1] [8] [0] [0] 1800 xx 12
You will recall that the program we wish to store on tape was loaded
into locations 0000 to OOOF of the memory. Therefore, we define a start-
ing address for recording as 0000 and store this in locations 17F5 and
17F6 (Steps 4 to 7). We define an ending address for recording as one
more than the last step of our program and stored the value 0010
(= 000F + 1) in locations 17F7 and 17F8 (Steps 8,9). Finally we pick
an arbitrary ID as 01 and store this value at location 17F9 (Step 10).
Note that before we use the audio cassette unit for recording
or playing back, we must put 00 in location 00F1 (Steps 1,2 and 3).
14
The starting address of the tape recording program is 1800. In Steps
11 and 12 we set this address value into the system. If we were to press
[GO], the system would proceed to load data on to the magnetic tape. But
first, we'd better start the tape!
4. Select the Record/Play mode of the tape recorder. Wait a
few seconds for the tape to start moving and now:
Press [GO]
5. The display will go dark for a short time and then will
relight showing:
0000 xx
6. As soon as the display relights, the recording is finished
and you should STOP the tape recorder.
Now, you should verify that the recording has taken place correctly.
This can be proven by reading the tape you have just recorded. Proceed
as follows:
1. Rewind the tape cassette to its starting position.
2. Turn off the system power supplies and then later,
turn them back on.
This has the effect of destroying your previously stored program
which you already have recorded on tape.
3. Prepare the system for reading the tape as follows:
Press Keys See On Display Step #
[RS]
[AD] xxxx xx 1
[0] [0] [F] [1] 00F1 xx 2
[DA] [0] [0] 00F1 00 3
[AD] 00F1 00 4
[1] [7] [F] [9] 17F9 xx 5
[DA] 17F9 xx 6
[0] [1] 17F9 01 7
[AD] 17F9 01 8
[1] [8] [7] [3] 1873 xx 9
[GO] (Dark) 10
15
The KIM-1 system is now looking for tape input data with the ID
label 01. Recall that this is the same ID label we assigned when we
recorded the program.
4. If your tape unit has a volume control, set the control
at approximately the half way point.
5. If your tape unit has a tone control, set the control
for maximum treble.
6. Now, turn on the tape using the PLAY mode. The tape
will move forward and the system will accept the recorded
data. As soon as the data record (ID=01) has been read,
the display should relight showing:
0000 xx
You may now stop the tape unit. If the display relights and shows;
FFFF xx
this means that the selected record has been located and read but that an
error has occurred during the reading of the data. In this case, press
the [RS] key and repeat the read tape procedures from the beginning. If
the FFFF still shows on the display, repeat the entire recording and play-
back procedures checking each step carefully. If the problem persists,
refer to Appendix C, (In Case of Trouble).
If the tape continues to run and the display does not relight, this
means that the system has been unsuccessful in reading any data back from
the tape. In this case, repeat the entire recording and playback proce-
dures checking each step carefully. If the problem persists, refer to
Appendix C, (In Case of Trouble).
7. Assuming that you have read the tape successfully, you
now may verify that the program has been restored to
memory by trying a sample problem. (02 + 03 = 05)
NOTE: The KIM-1 interface circuits for the audio tape system
are designed so that you do not require special test
equipment to set up correct operating levels. If you
have followed the procedures indicated, the tape system
should work without the need of any adjustments by you.
16
2.6 ADDING A TELEPRINTER
If you have access to a serial teleprinter, you may add such a unit
to the KIM-1 system with very little effort. One of the more commonly
available units of this type is the Teletype Nodel 33ASR which we will
use for the purposes of illustration in this section. However, if you
have available different equipment, you may use the information presented
here as a guide to connecting your specific unit. In any case, we recom-
mend you follow the directions offered by the equipment manufacturer in
his instruction manual to effect the desired wiring and connection options.
The KIM-1 provides for a 4 wire interface to the TTY. Specifically,
the "20 mA loop" configuration should be used and you should check that
your TTY has been wired for this configuration. If not, you may easily
change from "60 mA loop" to "20 mA loop" configurations following the
manufacturers directions. The KIM-1 has been designed to work properly
only with a teleprinter operating in full duplex mode. Check the
literature supplied with your teleprinter if you are unsure if your
unit is properly configured. You are not restricted to units with specific
bit rates (10 CPS for TTY) since the KIM-1 system automatically adjusts
for a wide variety of data rates (10CPS, 15CPS, 30CPS, etc.).
To connect the TTY to the system, proceed as follows:
1. Turn off system power and remove connector (A) from
the module.
2. Add the wires shown in the sketch to connector (A) and
to the appropriate connector on the TTY unit.
3. The jumper wire from A-21 to A-V is used to define for the
KIM-1 system that a teleprinter will be used as the only
input/display device for the system. If you expect to use
both TTY and the KIM-1 keyboard/display, you should install
the switch shown instead of the jumper. Now, the switch,
when open, will allow use of the keyboard and display on
the KIM-1 module and, when closed, will select the tele-
printer as the input/display device. (of course, you may
use a clip-lead instead of the switch if you desire).
4. Be sure pins A-21 and A-V are connected. Reinstall con-
nector (A) and return power to the system. Turn-on the TTY.
5. Press the [RS] key on the KIM-1 module then press
the [RUB OUT] key on the TTY. This step is most important
since the KIM-1 system adjusts automatically to the
bit rate of the serial teleprinter and requires this
first key depression to establish this rate.
18
If everything is working properly you should immediately observe a
message being typed as follows:
KIM
This is a prompting message telling you that the TTY is on-line and the
KIM-1 system is ready to accept commands from the TTY keyboard.
Should the prompting message not be typed press the [RS] key on the
KIM-1 keyboard and then the [RUB OUT] key on the TTY. If the "KIM" message
still is not typed, recheck all connections and the TTY itself and try
again. If the problem persists, refer to Appendix C, (In Case of Trouble).
6. Assuming that the TTY is operable, you may now try a simple
group of operations to verify correct system operation:
Press Keys See On Display Step #
KIM
xxxx xx 1
0002 0002 2
[SPACE] 0002 xx 3
18. 18. 4
0003 xx 5
A5. A5. 6
0004 xx 7
[LF] 0003 A5 8
[RUB OUT] KIM
xxxx xx 9
Step 1 shows the "KIM" prompting message. In Step 2, an address
(0002) is selected followed by a space key in Step 3. The address cell
0002 together with the data stored at that location (xx) is printed.
Step 4 shows the "modify cell" operation using the [.] key and the hex
data keys preceding. Step 5 shows the incrementing to the next address
cell (0003) after the [.] key. Note that the modification of cell 0002
also occurs. Steps 6 and 7 show the modification of data in cell 0003
and the incrementing to cell 0004. Step 8 shows the action of the [LF] key
in backing up one cell to 0003 where we can see from the printout that
the correct data (A5) has been stored at that location. Step 9 shows the
reaction to the [RUB OUT] key in resetting the system and producing a new
"KIM" prompting message. Note, by the way, that in this example you have
repeated a portion of the program entry exactly as you did in Section 2.4
but this time using the TTY.
19
So much for now! If all of the operations have occurred properly,
you may be certain that your TTY and KIM-1 module are working together
correctly. We will describe in detail all of the other operations pos-
sible with the TTY in a later section of the manual.
If you have reached this point without problems, you now have
completed all of the required system tests and may be confident that
the KIM-1 module and your peripheral units are all working correctly.
Our next task is to learn more about the KIM-1 system and its operating
programs.
Up to this point you have been engaged in bringing up your KIM-1
system and verifying its correct operation. Now it's time to learn more
about the various parts of the KIM-1, how the parts work together as a
system, and how the operating programs control the various activities of
the system. The diagrams included in this section together with your
full sized system schematic will be helpful in understanding the elements
of your KIM-1 module.
3.1 KIM-1 SYSTEM DESCRIPTION
Figure 3-1 shows a complete block diagram of the KIM-1 system. You
should note first the presence of the MCS 6502 Microprocessor Array which
acts as the central control element for the system. This unit is an 8
bit microprocessor which communicates with other system elements on three
separate buses. First, a 16 bit address bus permits the 6502 to address
directly up to 65,536 memory locations in the system. Next, an 8 bit,
bidirectional data bus carries data from the 6502 array to any memory
location or from any memory location back to the 6502 array. Lastly, a
control bus carries various timing and control signals between the 6502
array and other system elements.
21
Associated with the 6502 array is a 1 MHz crystal which operates with
an oscillator circuit contained on the 6502 array. This crystal control-
led oscillator is the basic timing source from which all other system
timing signals are derived. In particular, the þ2 signal generated by
the 6502 array and used either alone, or gated with other control signals,
is used as the system time base by all other system elements.
The 6502 microprocessor is structured to work in conjunction with
various types of memory. In the KIM-1 system, all memory may be consid-
ered to be of the Read-only (ROM) or Read/Write (RAM) variety. The ROM
portion of the memory provides permanent storage for the operating progams
essential to the control of the KIM-1 system. You will note the inclusion
of two devices, labelled 6530-002 and 6530-003. Each of these devices
include a 1024 byte (8 bits per byte) ROM with different portions of the
operating program stored permanently in each ROM.
RAM type memory is available at three locations in the system.
Again, each of the 6530 arrays include 64 bytes of RAM primarily used for
temporary data storage in support of the operating program. In addition,
a separate 1024 byte RAM is included in the KIM-1 system and provides
memory storage for user defined application programs and data.
Input/output controls for the system also are included within the
6530 arrays. Each 6530 array provides 15 I/O pins with the microprocessor
and operating program defining whether each pin is an input pin or output
pin, what data is to appear on the output pins, and reading the data appear
ing on input pins. The I/O pins provided on the 6530-002 are dedicated to
interfacing with specific elements of the KIM-1 system including the key-
board, display, TTY interface circuit, and audio tape interface circuit.
The 15 I/O pins on the 6530-003 are brought to a connector and are avail-
able for the user to control a specific application.
22
Finally, each 6530 array includes an interval timer capable of count-
ing a specific number of system clocks to generate precise timing gates.
The exact time interval is preset under program control. The interval
timer on the 6530-003 array is available for a user defined application
program and is not required by the operating programs.
Figure 3-1 shows a major block labelled Control Logic. Included
under this category are an address decoder used for generation of chip
select signals for the 6530 arrays and the static RAM. Also included is
the logic required to debounce the keys for system reset (RS key) and pro-
gram stop (ST key). Lastly, special logic is included to allow operation
of the system in a "single instruction" mode to facilitate program de-
bugging.
Figure 3-1 shows the keyboard/display logic interfacing with the I/O
pins of the 6530-002. Also shown are the interface circuits for trans-
mission of data to and reception of data from the TTY and audio tape units.
Figure 3-2 shows the detailed interconnections between the MCS 6502
and the two NCS 6530 arrays.
Figure 3-3 shows detailed logic and schematics for the control logic.
Figure 3-4 shows a detailed schematic of the static RAM.
Figure 3-5 and 3-6 show the detailed schematic of the keyboard and
display logic and circuits.
Figure 3-7 details the schematic of the TTY interface circuits.
Figure 3-8 details the schematic of the audio tape cassette interface
circuits.
Figures 3-9 and 3-10 provide a summary of all signals available on
either the Application connector or the Expansion Connector.
The fold-out system schematic shows all of the elements of the system
connected together and all signals appearing on the module connectors.
You may refer to the Hardware Manual included with your KIM-1 module
for additional details on the operating characteristics of the 6502 and
6530 arrays as well as detailed information on system timing.
3.2 KIM-1 MEMORY ALLOCATION
It has been stated that the 6502 microprocessor array included in
the KIM-1 system is capable of addressing any of 65,536 memory locations.
Obviously, we have not included that much memory in your KIM-1 system and
this section is intended to detail for you exactly what memory locations
are included in the system and where they are located (their exact
addresses).
Each byte of memory in the system is understood to include 8 bits.
Also, you should note that any addressable location in the system may be
performing any one of four functions:
1. A ROM byte - read-only memory in which we have stored the
operating program.
2. A RAM byte - read/write memory for storage of variable data.
3. An I/O location - these locations include both direction
registers which define the I/O pins to be either input pins
or output pins, and the actual data buffer locations contain-
ing the data to be transmitted on output pins or the data
read from input pins. Any I/O location may be viewed as a
read/write memory location with a specific address.
4. An Interval Timer location - a series of addresses are
reserved for each interval timer in the system. Again, you
may write to the timer to define its counting period or read
from the timer to determine its exact state.
Figure 3-11 shows a block diagram detailing all memory blocks in the
KIM-1 system. Figure 3-12 provides a memory map showing all addressable
locations included in the system and their relationship to each other.
Note also the areas in the memory map indicated as available for expansion.
(Section 6 of the manual provides more detail on the subject of memory
expansion). Finally, Figure 3-13 provides a complete listing of all impor-
tant memory locations and will be referenced frequently by you when writing
your application programs.
34
Referring to Figure 3-12, note that the memory map shows a block of
8192 address locations all existing in the lowest address space within
the possible 65,536 address locations. This address space is further
divided into eight blocks of 1024 locations each. Each 1024 block is
further divided into four pages of 256 locations each. The "K"
reference defines a specific block of 1024 locations and refers to the
"K" number of the address decoder included within the system control
logic. The "page" reference defines a specific group of 256 addresses.
A total of 32 pages (0 to 31) are included in the 8192 address locations.
The hex codes for certain addresses are shown at strategic locations in
the memory map.
Beginning from the highest address location of the 8192, note that
the first 1024 block (K7) is assigned to the ROM of the 6530-002 and the
second 1024 block (K6) is assigned to the ROM of the 6530-003. The entire
operating program of the KIM-1 system is included in these two blocks.
Next in order, a portion of the K5 block is dedicated to the RAM,
I/O, and Timer locations of the two 6530 arrays. An expanded view of
this address space is shown in Figure 3-12. Note that the RAM addresses
for the 6530-002 (Hex 17EC to 17FF) are reserved for use by the operating
program and should not appear in a user generated application program.
The same is true for the I/O and Timer locations of the 6530-002 which
also are reserved for use by the operating programs.
The next four blocks in order (K4, K3, K2, Kl) are reserved for
additional memory in an expanded system. In Section 6, the methods for
adding memory will be discussed.
Finally, the lowest 1024 address locations (K0) are assigned to the
static RAM included within the KIM-1 system. You should note that within
this block, Page 0 and Page 1 have special significance. Page 1 is used
as the system stack onto which return addresses and machine status words
are pushed as the system responds to interrupts and subroutine commands.
Page 0 has significance for certain of the special addressing modes avail-
able when programming for the 6502 microprocessor array.
35
Figure 3-12 shows an expanded view of Page 0 and Page 1. Note that
17 addresses (00EF to 00FF) are reserved for use by the operating program
and must never appear in the user generated application program. Also,
note the comment that a maximum of eight locations may be required on the
stack (Page 1) to service operating program interrupts.
In summary, the user generated application program may make use of
the following areas of memory:
1. All of Page 0 except 00EF to 00FF
2. All of Page 1 (remember that the stack will extend an
extra 8 bytes deep to accommodate the operating program).
3. All of Page 2 and Page 3.
4. In Page 23:
- All I/O locations from 1700 to 173F
- All 64 bytes of RAM from 1780 to l7BF
- An additional 44 bytes of RAM from 17c0 to l7EB
3.3 KIM-1 OPERATING PROGRAMS
Figure 3-14 shows a simplified flow chart of the KIM-1 operating
programs. This section provides a brief explanation of these programs
to assist you in understanding the various operating modes of the system.
First, you should note that when power is first applied to your
KIM-1 module and the [RS] (reset) key is depressed, control of the system
automatically is assumed by the operating program. This is true, as well,
for any succeeding depression of the reset key.
For each depression of the reset key, the system is initialized.
At this time, stack pointer values are set, the I/O configuration is
established, and essential status flags are conditioned. Next the
program determines whether the system is to respond to TTY inputs or
is to operate with the keyboard and display on the KIM-1 module.
If the TTY mode has been selected, the program halts and awaits a
first key depression from the TTY (the RubOut Key). Upon receipt of this
key depression, the program automatically performs a bit rate measurement
and stores the correct value for use in receiving and decoding succeeding
data transfers from the TTY. Note that this bit rate measurement is per-
formed after each depression of the reset key.
The program will proceed immediately to a routine causing the
prompting message ("KIM") to be typed on the TTY. Now, the program halts
at the loop called "Get Character". As each key is depressed on the TTY,
the coded data is accepted and analyzed in the routine called "Execute Key".
The various keys depressed will cause the program to branch to the appro-
priate subroutines required to perform the desired operation. Upon com-
pletion of the individual key executions, the program returns to the "Get
Key" loop and awaits the next key depression.
Exit from the TTY processing loop will occur in response to:
1. A depression of the reset key,
2. A depression of the G key which initiates execution of
the application program, or
3. A change in the mode from TTY to Keyhoard/Display.
If, after system reset and initialization, the Keyboard/Display
mode (KB) is determined to be in effect, the program will proceed dir-
ectly to display, and keyboard scan routines. The program will cause the
display scan to occur continuously ("Display Cell") until one of the keys
on the keyboard is depressed (AK?). Key validation is performed during
an additional scan cycle. If the key is truly depressed (not noise), the
program proceeds to the routine called "Get Key" in which the exact key
depressed is defined. Next, the program moves to the "Execute Key"
routine where branches to appropriate execution routines will be per-
formed. Finally, after key execution, the program returns to the "Display
Cell" routine and waits for the key to be released. When no key is de-
pressed, the program returns to the normal "Display Cell" routine and
awaits the next key depression.
In either the TTY or KB modes, the audio tape load or dump routines
may be executed using appropriate commands from the selected keyboards.
In either case, completion of the tape load or dump routine allows the
program to return to the "Start" position which will, as usual, activate
the KIM-1 display or cause the "KIM" prompting message on the TTY.
You should note the use of the Stop key to activate the non-maskable
interrupt input (NMI) of the 6502 microprocessor array. Depression of
this key causes an unconditional termination of program execution, a
saving of machine status registers on the stack, and a return to the
control of the operating program.
A second interrupt input is available and referred to as IRQ. This
interrupt may be defined by the user and will cause the program to jump to
any location defined by the user in his program.
Now that you have a better idea of what is included in your KIM-1
system and how it operates, its time to provide you with detailed pro-
cedures for all of the operations you can perform with the system. We
will separate our operating procedures into three areas giving specific
direction for the use of the KIM-1 keyboard and display, the audio tape
recorder, and the serial teleprinter (TTY).
4.1 USING THE KIM KEYBOARD AND DISPLAY
A brief study of your keyboard shows a total of 23 keys and one
slide switch. First, let's list the purpose of each key:
[0] to [F] - Sixteen keys used to define the hex code
of address or data
[AD] - selects the address entry mode
[DA] - selects the data entry mode
[+] - increments the address by +1 but does
not change the entry mode
[PC] - recalls the address stored in the Program
Counter locations (PCH, PCL) to the display
[RS] - causes a total system reset and a return to
the control of the operating program
[GO] - causes program execution to begin starting
at the address shown on the display
[ST] - terminates the execution of a program and
causes a return to the control of the
operating program
43
You have seen in an earlier chapter that the six digit display in-
cludes a four digit display of an address (left four digits) and a two
digit display of data (right two digits).
Using only the KIM-1 keyboard and display, you may perform any of
the following operations:
1. Select an Address
Press AD followed by any four of the hex entry keys.
The address selected will appear on the display. If an
entry error is made, just continue to enter the correct
hex keys until the desired address shows on the display.
Regardless of what address is selected, the data field of
the display will show the data stored at that address.
2. Modify Data
After selecting the proper address, press [DA] followed by
two hex entry keys which correctly define the data to be
stored at the selected address. The data entered will
appear in the data field of the display to indicate that
the desired code has already been entered.
Note that it is possible for you to select an address of
a ROM memory cell or even the address of a memory cell that
does not exist in your system. In these cases, you will not
be able to change the data display since it is clearly not
possible for the system to write data to a ROM cell or a
non-existent memory location.
3. Increment the Address
By pressing the [+] key the address displayed is auto-
matically increased by +1. Of course, the data stored at
the new address will appear on the display. This operation
is useful when a number of successive address locations must
be read or modified. Note that the use of the [+] key will
not change the entry mode. If you had previously pressed
the [AD] key, you remain in the address entry mode and a
previous depression of the [DA] means you remain in the
data entry mode.
44
4. Recall Program Counter
Whenever the NMI interrupt pin of the 6502 microprocessor
array is activated, the program execution in progress will
halt and the internal registers of the 6502 are saved in
special memory locations before the control of the system
is returned to the operating program. In the KIM-1 system,
the NMI interrupt may occur in response to a depression of
the [ST] key (stop) or, when operating in the Single Step
mode, after each program instruction is executed following
the depression of the GO key.
The [PC] key allows you automatically to recall the value
of the Program Counter at the time an interrupt occurred.
You may have performed a variety of operations since the
interrupt such as inspecting the contents of various
machine registers stored at specific memory locations.
However, when you press the [PC] key, the contents of the
Program Counter at the time ot the interrupt are recalled
to the address field of the display. You now may continue
program execution from that point by pressing the [GO] key.
5. Execute a Program
Select the starting address of the desired program. Now,
press the [GO] key and program execution will commence
starting with the address appearing on the display.
6. Terminate a Program
The [ST] key is provided to allow termination of program
execution. As mentioned earlier, the [ST] key activates
the NMI interrupt input of the 6502 microprocessor array.
Note: The [ST] key will operate correctly only if you
store the correct interrupt vector at locations 17FA and
17FB. For most of your work with the KIM-1 system, you
should store the address 1C00 in these locations as follows:
[AD]
[1] [7] [F] [A]
[DA] [0] [0]
[+] [1] [C]
45
Now, when the NMI interrupt occurs, the program will return to
location 1C00 and will proceed to save all machine registers before
returning control to the operating program.
You should remember to define the NMI vector each time the power
to the system has been interrupted. A failure of the system to react
to the [ST] key means you have forgotten to define the NMI vector.
7. Single Step Program Execution
In the process of debugging a new program, you will find
the single step execution mode helpful. To operate in
this mode, move the SST slide switch to the ON position
(to your right). Now, depress the [GO] key for each
desired execution of a program step. The display will
show the address and data for the next instruction to
be executed. Note that in the course of stepping
through a program, certain addresses will appear to
be skipped. A program instruction will occupy one, two,
or three bytes of memory depending upon the type of
instruction. In single instruction mode, all of the
bytes involved in the execution of the instruction are
accessed and the program will halt only on the first
byte of each successive instruction.
Note: SST mode also makes use of the NMI interrupt of the
6502 microprocessor array. Again, the NMI vector must be
defined as described in (6) above if the SST mode is to
work correctly.
This covers all of the standard operations you may perform from the
KIM-1 keyboard. Using combinations of the operations described, you may
wish to perform certain specialized tasks as follows:
1. Define the IRQ Vector
You will recall that a separate interrupt input labelled
IRQ is available as an input to the 6502 microprocessor
array. If you wish to use this feature, you should enter
the address to which the program will jump. The IRQ
vector is stored in locations 17FE and 17FF.
2. Interrogate Machine Status
We have mentioned that after an NMI interrupt in response
to the ST key or during the SST mode, the contents of
various machine registers are stored in specific memory
locations. If you wish to inspect these locations, their
addresses are:
46
00EF = PCL
00F0 = PCH
00F1 = Status Register (P)
00F2 = Stack Pointer (SP)
00F3 = Accumulator (A)
00F4 = Y Index Register
00F5 = X Index Register
4.2 USING THE AUDIO TAPE RECORDER
There are two basic operations possible when working with your audio
tape system. You may transfer data from the KIM-1 memory and record it
on tape. Or, you may read back a previously recorded tape, transferring
the data on tape into the KIM-1 memory.
Recording on Audio Tape
The procedure for recording on audio tape requires that you
perform the following steps:
1. Clear decimal mode by entering 00 in location 00F1.
Define an identification number (ID) for the data
block you are about to record. This two digit number
is loaded into address 17F9. Don't use ID = 00 or
ID = FF.
2. Define the starting address of the data block to be
transferred. This address is to be loaded into
locations:
17F5 = Starting Address Low (SAL)
17F6 = Starting Address High (SAH)
3. Define the ending address as one greater than the
last address in the data block to be recorded. The
ending address is to be loaded into locations:
17F7 = End Address Low (EAL)
17F8 - End Address High (EAH)
As an example, assume you wish to record a data block from
address 0200 up to and including address 03FF. (All of Pages 2 and 3).
You wish to assign an ID number of 06 to this block. Using the KIM-1
keyboard, you should load the data shown into the addresses indicated
so that:
00F1 = 00 (Clear Decimal Mode)
17F5 = 00 (SAL)
17F6 = 02 (SAH)
17F7 = 00 (EAL) \
> = 03FF + 1
17F8 = 04 (EAH) /
17F9 = 06 (ID)
47
Note that the ending address must be greater than the starting
address for proper operation.
4. Assuming that you are using a new cassette on which
no data has been stored previously, insert the
cassette in the unit and rewind the tape to its
start position.
5. Select the starting address of the tape record program.
This address is 1800.
6. Select the Play/Record mode of the audio unit and allow
several seconds for the tape to begin to move.
7. Press the [GO] key and the recording process will begin.
The display will be blanked for a period and then will
relight showing 0000 xx. This means that the data
block selected has been recorded.
8. You may now stop the tape or allow some additional
seconds of blank tape and then stop the unit.
Loading Data From Audio Tape
The procedure for loading data from an audio tape into the
KIM-1 memory requires that you perform the following steps:
1. Clear decimal mode by entering 00 in location 00F1.
Define the ID number of the data block to be loaded
from tape. The ID number is loaded into address 17F9.
2. Select the starting address of the Tape Load program.
This address is l873 HEX.
3. Press the [GO] key. The KIM-1 system is now waiting
for the appearance of data from the tape unit.
4. Load the cassette and, presuming you do not know where
on the tape the data block is recorded, rewind the tape
to its starting position. Check the volume control
setting.
5. Start the audio tape unit in its Play mode and observe'
that the tape begins to move.
6. Wait for the KIM-1 display to relight showing 0000 xx.
This means the data block has been loaded successfully
from the tape into the KIM-1 memory. If the display
relights with FFFF xx, the correct data block has been
found but there has been an error detected during the
read operation. If the tape continues to run and the
display never relights, the system has not been
successful in finding the data block with the specific
ID number you requested.
48
7. If in step (1), you had selected an ID = 00, the ID
number recorded on the tape will be ignored and the
system will read the first valid data block encountered
on the tape. The data read from the tape will be
loaded into memory address as specified on the tape.
8. If, in step (1), you had selected an ID = FF, the ID
number recorded on the tape will be ignored and the sys-
tem will read the first valid data block encountered on
the tape. In addition, the data block will be loaded
into successive memory locations beginning at the
address specified in locations 17F5 and 17F6 (SAL, SAH)
instead of the locations specified on the tape.
Special Operations with Audio Tape
The KIM-1 system causes data to be recorded on audio tape with
a specific format as detailed in Appendix E. Each recorded data block is
preceeded by a group of synchronizing characters together with an identi-
fication code to define the specific block. Data blocks may be of arbi-
trary length.
With a little care, there is no reason for you not to include a
number of recorded data blocks on the same tape. If you are recording
blocks in sequence and have not rewound the tape between blocks, you need
only specify the parameters of each new block (ID, SAL, SAH, EAH, EAL) and
proceed with recording the new block.
If the tape has been rewound, you will need to know the ID
number of the last recorded~data block. Rewind the tape to its starting
point and set up the parameters required to read the last recorded data
block. After reading this block, stop the tape and you may now proceed
to add a new block or blocks to the tape.
If you wish, you may add voice messages between the recorded
data blocks on the tape. The KIM-1 system will ignore these audio
messages when the tape is read back. Of course, you will need to install
an earphone or speaker in parallel with the KIM-1 audio tape data input
pin in order to hear the voice messages.
We do not recommend that you attempt to record data blocks in
areas of the tape which have been used previously for recorded data.
Variations in tape speed and block lengths can result in overlapping of
recorded data which may be read incorrectly by the KIM-1 system.
49
4.3 USING A SERIAL TELEPRINTER
The addition of a serial teleprinter (such as the Teletype Model
33ASR) to work with the KIM-1 system permits a variety of special opera-
tions to be performed. In all cases, you define desired operations by
depressing the proper keys while simultaneously producing a hard-copy
printed record of each operation. If your teleprinter is equipped
with a paper tape reader/punch, you may generate or read paper tapes
using the KIM-1 system. Using the serial teleprinter, you may perform
the following operations:
Select an Address
Type four hex keys (0 to F) to define the desired address.
Next, press the [SPACE] bar.
The printer will respond showing the address code selected
followed by a two digit hex code for data stored at the selected
address location:
Type: 1234 [SPACE]
Printer Responds: 1234 AF
showing that the data AF is stored at location 1234.
Modify Data
Select an address as in the previous section. Now type two hex
characters to define the data to be stored at that address. Next type
the [.] key to authorize the modification of data at the selected address:
Type: 1234 [SPACE]
Printer Responds: 1234 AF
Type: 6D [.]
Printer Responds: 1235 B7
Note that the selected address (1234) has been modified and the system
increments automatically to the next address (1235).
Note: Leading zero's need not be entered for either address
or data fields: For example:
EF [SPACE] selects address 00EF
E [SPACE] selects address 000E
A [.] enters data 0A
[.] enters data 00 (etc.)
50
Step to Next Address
Type [CR] to step to the next address without modifying the
current address:
See Printed: 1234 AF
Type: [CR]
Printer Responds: 1235 B7
Type: [CR]
Printer Responds: 1236 C8 (etc.)
Step to Preceeding Address
Type [LF] to step back to the preceeding address:
See Printed: 1234 AF
Type: [LF]
Printer Responds: 1233 9D
Type: [LF]
Printer Responds: 1232 8E (etc.)
Abort Current Operation
Type [RUB OUT] to terminate the current operation. The prompting
message will be printed ("KIM") indicating that a new operation may
proceed:
Type: 1264 [RUB OUT]
Printer Responds: KIM
xxxx xx
Type: 1234 [SPACE]
Printer Responds: 1234 AF
In the example, the [RUB OUT] key is used to correct an erroneous
address selection.
Note: The [RUB OUT] key must be depressed after each depression
of the KIM-1 reset key in order to allow the operating
program to define the serial bit rate for the tele-
printer.
51
Load Paper Tape
Paper Tapes suitable for use with the KIM-1 system are generated
using the format shown in Appendix F. To read such a tape into the KIM-1
system, proceed as follows:
1. Load the punched paper tape on to the tape mechanism
2. Type [L]
3. Activate the paper tape reader
The paper tape will advance and data will be loaded into addresses
as specified on the tape. A printed copy of the data read will be generated
simultaneously with the reading of the paper tape.
Check-sums are generated during the reading of the paper tape
and are compared to check-sums already contained on the tape. A check-
sum error will cause an error message to appear in the printed copy.
Punch Paper Tape
The KIM-1 system can be used to punch paper tapes having the
format described in Appendix F. The procedures for generating these
tapes is as follows:
1. Define the starting address and ending address of the
data block to be punched on the paper tape.
2. Load blank paper tape on the punch unit and activate
the punch.
Type: [1] [7] [F] [7] [SPACE]
See Printed: 17F7 xx
Type: [F] [F] [.]
See Printed: 17F8 xx
Type: [0] [3] [.]
See Printed: 17F9 xx
Type: [2] [0] [0] [SPACE]
See Printed: 0200 xx
52
You have now loaded the ending address (03FF) into address
locations 17F7 (EAL) and 17F8 (EAH). The starting address (0200) is
selected as shown.
3. Now type [Q]
The paper tape will advance and punching of the data
will proceed. Simultaneously, a printed record of
the data will be typed.
List Program
A printed record of the contents of the KIM-1 memory may be
typed. The procedure is the same as for punching paper tape except that
the punch mechanism is not activated.
Execute Program
To initiate execution of a program using the TTY keyboard, the
following procedures should be followed:
1. Enter the starting address of the program
2. Type [G]
For example, to begin program execution from
address location 0200:
Type: [2] [0] [0] [SPACE]
See Printed: 0200 xx
Type: [G]
Program execution begins from location 0200 and will
continue until the [ST] or [RS] keys of the KIM-1
module are depressed. The single step feature may
be employed while in the TTY mode.
It is not practical in this manual to describe every possible
application or Programming technique. However, now that you have become
familiar with the basic elements and operating procedures of the KIM-1
system, this section will show you how to apply what you have learned in
a simple but realistic application example.
Our example will involve the generation of a variable frequency
square wave which will be connected to a speaker to produce an audible
tone. The frequency of the tone will be selected using a set of seven
toggle switches. We will proceed through the example by defining the in-
terface, writing and entering the program, and executing the program.
Finally, we will study a series of program debugging techniques which
will be useful to you for any new program you may write.
5.1 DEFINING THE INTERFACE
You will recall that a group of 15 I/O pins are brought to the
Application connector from the 6530-003 array. The logic and circuit
details concerning these I/O pins are described in Appendix H and in
Section 1.6 of the Hardware Manual ("Peripheral Interface/Memory
Device - - MCS 6530").
55
For our application example we will use eight of these I/O pins.
One pin (PA0) will be used as an output line to supply a square wave to
a driver circuit and speaker. The other seven I/O pins (PA1 to PA7) are
defined as input points with a SPST toggle switch connected to each.
Figure 5-1 shows the circuit configuration for this example. Note that
the remaining seven I/O pins (the PB port) are not used for this problem.
For the switches connected to the input pins, we would like the sense
of the switch to be defined as a logic "0" when open and a logic "1" when
closed. By connecting the switches to ground, we are producing exactly
the opposite sense and must remember to complement the switch states with
software when we write our program. Also, we must define now that the
switch at PA1 is to be the LSB (least significant bit) and the switch at
PA7 is to be the MSB (most significant bit) of the seven bit binary word
formed by all seven switches. In this way, the state of the switches can
define a binary number from zero (all switches open) to 127DEC (all switches
closed).
5.2 WRITING THE PROGRAM
Having defined the interface for our application, we may proceed now to
write our program. The effort proceeds in four stages:
1. Generate a flow chart
2. Generate assembly language code
3. Analyze the program
4. Generate machine language code
58
Briefly, our flow chart shows a first step of system initialization.
During this step, we must define the I/O configuration of the system in
that pin PA0 becomes the output to the speaker and that pins PA1 to PA7
become inputs from the seven switches.
After initialization, a loop is set up which begins by inverting the
state of PA0 (Toggle PA0). Next, the state of the switches is read and
the data is complemented to produce the correct "sense" from the switches.
The value so read is used to define a delay before returning to the start
of the loop and again toggling the state of PA0. A little thought will
show that this loop will produce a square wave with a frequency determined
by the setting of the seven switches.
Assembly Language Program
Our next task is to convert the simple flow chart into a
program. The program is first written in "Assembly Language". You should
refer to your Programming Manual to become familiar with all of the pos-
sible 6502 instructions (especially see Appendix B; Instruction Summary).
Figure 5-2 shows the application example programmed in assembly language.
59
| | | | MACHINE | |
| LABEL | OPCODE | OPERAND | CYCLES | COMMENTS |
| INIT | LDA | #$01 | 2 | Define I/O 0=Input 1=Output |
| | STA | PADD | 4 | PADD PORT A DATA DIRECTION REG. |
| START | INC | PAD | 6 | Toggle PA0, PA1-PA7 Inputs |
| | | | | not affected |
| READ | LDA | PAD | 4 | READ switches into accumulator |
| | EOR | #$FF | 2 | Complement switch value |
| | LSR | A | 2 | Shift Accumulator 1 bit to right |
| | TAX | | 2 | Transfer final count into X-Index |
| DELAY | DEX | | 2 | Delay by an amount specified |
| | BPL | DELAY | 3,2 | By the count in the X-Index |
| | BMI | START | 3 | Go To START |
| PADD | =$1701 | | | Define absolute address of |
| | | | | Data Direction Reg. A |
| PAD | =$1700 | | | Define absolute address of |
| | | | | Data Reg. A |
Assembly Language Listing
FIGURE 5.2
60
You will note that each line of the program is broken into
several fields:
- A label field permitting you to assign a "name" to
a specific location in the program.
- An Operation Code field (Op Code) in which the exact
instruction to be executed is defined.
- An Operand Field where the exact data required by the
instruction is defined together with certain symbols
defining addressing modes or data formats. Symbols
encountered generally in MOS Technology, Inc. manuals
are:
# Immediate Addressing
$ Hex Code
@ Octal Code
% Binary Code
' ASCII literal
= Equates a label to a value
- A Machine Cycle field defining the total number of
machine cycles required to execute an instruction.
(This information is derived from Appendix B of
the Programming Manual).
- A Comment Field where the programmer may define the
intent of specific program steps.
Program Analysis
The inclusion of the "machine cycle" information of the program
chart (Figure 5-2) allows us to analyze the exact timing relationships
involved in our program example. Note that the KIM-1 system operates
from a fixed frequency (1 MHz) oscillator with each machine cycle being
1us. Therefore, an instruction like "INC PAD" which requires 6 machine
cycles will be executed in a 6µs period.
61
By counting the total machine cycles occurring between each
toggle of PAØ, an equation for the square wave frequency can be developed.
The actual frequency is determined by the position of the seven switches,
the number of machine cycles between each toggle of PAØ, and the basic
clock rate (1 MHz) of the KIM-1 system. Figure 5-3 shows the waveform
of the PAØ square wave and the derived equations for computing the
exact frequency.
Square Wave Output
FIGURE 5.3
62
Machine Language Coding
Our next problem is to convert our assembly language program
into a program written in "machine language". The quickest and most
foolproof method for accomplishing this conversion is by using the
MOS Technology, Inc. Assembler (available for use on the time share
services of United Computing Systems, Inc.). If you choose not to
use this method, you will need to convert your source program to
machine code using "paper-and-pencil" techniques.
You should proceed by constructing a table similar to that
shown in Figure 5-4.
| | INSTRUCTION || SOURCE CODE |
| ADDRESS | BYTE 1 | BYTE 2 | BYTE 3 || LABEL OP CODE OPERAND |
| 0200 | A9 | 01 | || INIT LDA #$01 |
| 0202 | 8D | 01 | 17 || STA PADD |
| 0205 | EE | 17 | || START INC PAD |
| 0208 | AD | 17 | || READ LDA PAD |
| 020B | 49 | FF | || EOR #$FF |
| 020D | 4A | | || LSR A |
| 020E | AA | | || TAX |
| 020F | CA | | || DELAY DEX |
| 0210 | 10 | F0 | || BPL DELAY |
| 0212 | 30 | F1 | || BMI START |
| 0214 | | | || |
Machine Language Code Table
FIGURE 5.4
The source code contained in your assembly language program
(Figure 5-2) is entered into the table first. A column is provided to
allow you to define the specific address at which an instruction is
located. The Instruction column provides space for defining one, two,
or three byte instructions. (Please refer to Appendix B of the Program-
ming Manual or to your Programming Card for specific Op Codes).
63
As an example, the first source instruction is LDA #$01 which,
when translated, means load the accumulator with the byte stored in the
next program location (hex 01). This is the "immediate" addressing
mode defined by the "#" symbol. The Op Code for LDA# is A9. This
value is entered in the first column under the heading, Instruction.
The next column contains the hex 01 value defined by the source state-
ment. The initial address for the program is inserted in the "Address"
column as 0200 (an arbitrary selection). The total instruction LDA #$01
now occupies address locations 0200 and 0201.
The next available address is 0202 which is inserted in the
"Address" column for the next source instruction. In this manner, you
will proceed through all of the source statements decoding each and
entering one, two, or three bytes of machine code as required in the
"Instruction" column. The "Address" column will contain the address of
the first byte of machine code (the Op Code) for each source statement.
In cases where the operand of the source statement is a symbol,
the address to which the symbol has been equated should be filled in as
the proper machine code. For example, the source statement "INC PAD"
requires the incrementing of data stored at a location "PAD" defined in
our assembly programs to have the address: PAD = 1700. Therefore, the
address 1700 is entered as the second and third bytes of the source
statement "INC PAD". (See Figure 5-4). Note also that when entering
an address, such as 1700, the low order byte (00) is entered first and
immediately after the Op Code and the high order byte (17) is entered
next as the third byte of the instruction.
When dealing with branch instructions (BPL, BMI, etc.), you
will need to calculate the exact value of the offset which may be either
positive (branch forward) or negative (branch backward). You should refer
to Section 4.1.1 of the Programming Manual to explore "Basic Concept of
Relative Branching." As an example, the source statement "BMI START" (See
Figures 5-2 and 5-4) requires a branch backward by (-15) locations to the
address labelled "START" (from address 0213 backward to 0205 inclusive).
64
(The 2's complement of the -15 displacement is F1 HEX which you should
insert at location 0212). Had the branch been to a forward location
the positive value of the offset would be inserted rather than the 2's
complement value.
5.3 ENTERING THE PROGRAM
With the program now reduced to machine language code, you may enter
the program address and data codes listed in Figure 5-4 following the
procedures detailed in Section 2.4. The procedure for entering the program
is as follows:
Press Keys See On Display
[AD] [0] [2] [0] [0] 0200 xx
[DA] [A] [9] 0200 A9
[+] [0] [1] 0201 01
[+] [8] [D] 0202 8D
[+] [0] [1] 0203 01
[+] [1] [7] 0204 17
[+] [E] [E] 0205 EE
[+] [0] [0] 0206 00
[+] [1] [7] 0207 17
[+] [A] [D] 0208 AD
[+] [0] [0] 0209 00
[+] [1] [7] 020A 17
[+] [4] [9] 020B 49
[+] [F] [F] 020C FF
[+] [4] [A] 020D 4A
[+] [A] [A] 020E AA
[+] [C] [A] 020F CA
[+] [1] [C] 0210 1C
[+] [F] [D] 0211 FD
[+] [3] [0] 0212 30
[+] [F] [1] 0213 F1
Key Sequences: Enter Program
FIGURE 5.5
65
5.4 EXECUTING THE PROGRAM
With the program entered, you may proceed to program execution.
First, if the NMI vector has not been defined previously, enter the
vector as follows:
Press Keys See Displayed
[AD] [1] [7] [F] [A] 17FA xx
[DA] [0] [0] 17FA 00
[+] [1] [C] 17fb 1C
This procedure insures that the [ST] key will be effective in
tenninating the program. Now, select the starting address of your
program (0200) and begin execution as follows:
Press Keys See Displayed
[AD] [0] [2] [0] [0] 0200 xx
[GO] (DARK)
The program will now execute. If your seven selector switches all
are open, you will probably hear no sound from the speaker because the
square wave frequency is too high. If all selector switches are closed,
you will hear in the speaker the lowest frequency that can be generated
with the program as currently written. You may experiment with other
combinations of switch settings to hear a variety of tones from the
speaker.
Depression of the [ST] key will cause the program execution to stop
(the tone will terminate) and the KIM-1 display will relight. The display
will show the address and data for the next instruction to be executed
(probably 020F or 0210 since this is the delay loop where the program
spends most of its running time).
66
5.5 PROGRAM DEBUGGING AND MODIFICATION
If your program did not execute correctly, you would follow a
debugging procedure involving the following steps:
Step 1: List the Program
First make sure you have entered the program steps
correctly. Select the starting address ([AD] [0] [2] [0] [0])
and observe that the correct data (A9) is displayed. Now, using
the [+] key, step through the remaining program locations check-
ing for the correct data stored in each location.
Step 2: Single Step the Program
Follow the procedures listed in Section 5-4 for program
execution but before depressing the [GO] key, place the SST
slide switch in the ON position. Now, press the [GO] key and
the first instruction will be executed. The display will
relight indicating that the operating program is again in
control of the system. The address displayed will be the
address of the first byte of the next instruction to be
executed. You may press the [GO] key again to execute the
next instruction or you may choose to investigate changes in
the contents of machine registers stored in selected memory
locations (See Figure 3-13). The procedure detailed in Figure 5-6
gives a good indication of the various operations you may wish
to perform in the SST mode.
Step 3: Check the I/O Operations
If program entry has been verified and program execution
in the SST mode appears to be normal, you may wish to verify the
correct operation of your specific I/O configuration.
You should recall that writing to or reading from any
I/O port is the same as reading from or writing to any other
memory location in the system. Therefore, if you select the
address of an I/O port, the KIM-1 display will show you the hex
code for the data being read from that address and thus, directly
indicate the state of each I/O pin in the port. For example, the
67
address of the I/O port used for your sample program is 1700.
Press [AD] [1] [7] [0] [0] and the display will show the hex
code corresponding to the settings of your selector switches.
If you change the positions of your selector switches, you will
see the hex code change in the data field of the display.
Now, leave the same address (1700) selected and press
the [DA] key. If you press any of the hex keys [0] to [F]
you will write the data to the I/O port (1700). Since seven
of the pins of this I/O port are defined as inputs, only one
(PA0) will act as an output and will respond to the data
entered by you from the keyboard. Try alternating rapidly
between the [0] and [1] keys and you should hear clicking in
the speaker indicating that you are successfully toggling
the PA0 pin.
This concept of using the KIM-1 keyboard and display
to exercise and verify the operation of I/O ports is a
generally useful technique for debugging the hardware
portions of most specific applications.
68
Press Keys See On Display Comments
[AD] [0] [2] [0] [0] 0200 A9 Select first instruction address
| SST |X| |ON 0200 A9 Set SST to ON; All selector
switches open
[GO] 0202 8D Accumulator now loaded with $01
[GO] 0205 EE PADD now loaded
[GO] 0208 AD PA0 now toggled
[GO] 020B 49 Switch values (PA1-PA7) now
[GO] loaded
[GO] 020D 4A Accumulator now complemented
[GO] 020E AA Accumulator now right shifted
1 Bit
[AD] [0] [0] [F] [3] 00F3 xx Display Accu
[+] 00F4 xx Display Y - INDEX
[+] 00F5 00 Display X - INDEX
[PC] 020E AA Restore PC (TAX will
execute next)
[GO] 020F CA Accumulator now loaded in
X-INDEX
[AD] [0] [0] [F] [3] 00F3 00 Display Accumulator
[+] 00F4 xx Display Y-INDEX
[+] 00F5 00 Display X-INDEX (A=0->X)
[PC] 020F CA Restore PC
[GO] 0210 10 DEX now completed
[AD] [0] [0] [F] [5] 00F5 FF Display X-INDEX (X<0)
[PC] 0210 10 Restore PC
[GO] 0212 30 No branch (Result of DEX
not positive)
[GO] 0205 EE Branch (Result of DEX is
negative).
In earlier sections you have learned that the MCS 6502 Microprocessor
Array is capable of directly addressing up to 65,536 locations (bytes) of
memory. (Usually abbreviated to 65K where "1K" for the remainder of this
section is to mean 1024 memory locations). In this section, we will
discuss first the techniques for adding memory or I/O locations to the
system and next, the proper handling of interrupt vectors in an expanded
system.
6.1 MEMORY AND I/O EXPANSION
In the KIM-1 system, the management of input/output data is handled
exactly the same as transfers to or from any other memory location in the
system. There are no instructions dealing specifically with input/output
transfers. Instead, transfer of data is accomplished by reading from or
writing to registers connected to the data bus and to I/O pins in specific
I/O interface devices (such as the 6530 array). These registers have a
specific address in the system just as does any other memory location.
Therefore, when we speak of expanding the memory of the KIM-1 system, we
are defining the methods for expanding both the real memory (RAM, ROM,
PROM, etc.) as well as the I/O ports since they are both treated exactly
alike as far as address assignments are concerned.
71
The first and most easilly implemented memory expansion is the
addition of up to 4K of memory space. You will recall that
the lowest 8K memory locations are defined by an address decoder included
on the KIM-1 module, (Device U4 on the schematic). The eight outputs
of this decoder (KØ to K7) each define a 1K block of addresses in the
lowest 8K of the memory map. Three of the outputs (K5, K6, K7) are
used to select ROM, RAM, I/O and Timer locations on the two 6530 arrays
while a fourth (K0) is used to select the 1024 locations of the static
RAM memory. The remaining four outputs (K1, K2, K3, K4) are not used
on the KIM-1 module but instead, are brought out to the Expansion connector
for use as chip selects for memory or I/O additions.
Figure 6-1 shows the proper method for deriving the four chip select
signals for the additional 4K of memory. Note that one of input pins of
the decoder (D) was brought out to the Application Connector. It was
this pin which we asked you to connect to ground in Chapter 2 of this
manual. As long as this point remains connected to ground, the decoder
will always select the lowest 8K addresses of the memory field regardless
of the state of AB13, AB14, and AB15.
If you wish to expand the memory and I/O address space beyond the
lower 8K addresses, you must arrange to de-select the lower 8K memory
block while selecting some other 8K block. One suggested method for
expanding beyond the lower 8K space is shown in Figure 6-2.
Note that the three high order address bits (AB13, AB14, AB15) are
connected to a decoder. The eight outputs of the decoder act to divide
the total 65K memory space into eight blocks of 8K each (8K0, 8K1, etc.).
Now, the 8K0 output may be returned as the fourth inpur (D) to the de-
coder (U4) on the KIM-1 module causing the proper selection and de-selec-
tion of this block within the total address space. The remaining seven
outputs (8K1 to 8K7) may be used to select and de-select the additional
decoders shown in Figure 6-2. You need add only as many decoders (one
for each 8K block of memory) as you need for your desired memory expansion.
72
A word of caution is in order when you decide to add memory to your
system. You have noticed the inclusion of the line receivers for the
AB10, AB11, and AB12 signals, (See Figure 6-2). These devices are
included because of loading limitations placed on the address bus lines
of the 6502 array (Each such line is capable of driving one standard
TTL load and l3Opf of capacity. See Appendix G).
Before deciding how to expand your system, we recommend a careful study
of all of the loading limitations of the KIM-1 signals since almost
certainly you will require additional buffering circuits if correct
operation is to be achieved.
6.2 INTERRUPT VECTOR MANAGEMENT
We have referred several times in earlier sections to the interrupt
features of the 6502 Microprocessor Array. We suggest now a careful
reading of Section 9 of the Programming Manual for the subject "Reset
and Interrupt Considerations".
In summary, there are three possible types of interrupt: Reset, NMI,
and IRQ. Each will occur in response to an activation of one of the three
pins of the 6502 array (RST, NMI, IRQ). In response to these inputs, the
6502 array will fetch the data stored at a specific pair of addresses and
load the data fetched into the program counter. The addresses are hardware
determined and not under the control of the programmer. The specific
addresses for each type of interrupt are:
FFFA, FFFB - NMI Vector
FFFC, FFFD - RST Vector
FFFE, FFFF - IRQ Vector
You will note that these addresses define the highest six locations in
the 65K memory map.
In the KIM-1 system, three address bits (AB13, AB14, ABl5) are not
decoded at all. Therefore, when the 6502 array generates a fetch from
FFFC and FFFD in response to a RST input, these addresses will be read
as 1FFC and 1FFD and the reset vector will be fetched from these locations.
You now see that all interrupt vectors will be fetched from the top 6
locations of the lowest 8K block of memory which is the only memory block
decoded for the unexpanded KIM-1 system.
75
It is typical in any system to store the interrupt vectors in ROM
so that they are immediately available after power-on. However, it is
desirable that for the NMI and IRQ interrupts, the programmer be allowed
to define as a variable the exact vector to which these interrupts will
direct the system. Accordingly, the NMI and IRQ vector locations contain
an indirect jump instruction referencing a RAM location into which the
programmer will store the specific vector for the two types of interrupt.
In the KIM-1 system, locations 17FA and 17FB contain the actual NMI vector
and 17FE with 17FF contain the actual IRQ vector. The RST vector is not
handled in this manner and always directs the system to the first step
of the power-on initialization routine.
But what happens if we expand our memory above the lowest 8K block
included in the KIM-1 system? Recall that we now must use ABl3, ABT4,
and AB15 to decode the additional address locations of the memory. By so
doing, the interrupt vector locations are no longer located in the K7 memory
block since the decoder (U4) is de-selected in response to the addresses
generated by the 6502 array in fetching the interrupt vectors (FFFA for
example). We would have the same problem even in an unexpanded system
if we wished to use a RST vector and initialization routine different
than what the KIM-1 system provides and if the RST vector was to be
located in a 1K block lower than K7 (K0 for instance).
The solution to this dilemma is to generate logically a special
signal for interrupt select. Referring to Figure 6-2, a special signal
called "Vector Select" is created to define the highest 1K memory black
(K65). The fetch of any interrupt vector will cause this signal to
go low "Select". Assuming that the K65 state is not used to select RAM,
this signal may be "wire-or'd" with any one of the other "K" signals
(K0 to K64) to define exactly which 1K block is to contain the interrupt
vectors.
76
As an example, assume that you have connected the K65 "Vector Select"
line to the K0 line. When a RST occurs, the 6502 array generates a fetch
from locations FFFC and FFFD. These addresses cause K65 to be selected
which, in turn, accesses the K0 field of the memory and causes the actual
fetch of the RST vector from locations 03FC and 03FD. (Had you chosen to
connect K65 to K7, the fetch of the reset vectors would occur from
locations 1FFC and 1FFD).
In this way, the highest six addresses of any 1K block of memory may
be used to supply the interrupt vectors for the system. If desired, a
switch could be installed to allow you to select different areas of memory
as the source locations for the interrupt vectors. (By the way, we
selected the 75145 type decoders in Figure 6-2 specifically to allow the
"wire-or" of K65 with any other K. This is possible because the 75145
decoder is provided with open-collector outputs which allows "wire-or"
of several states using an external load resistor.)
An even simpler arrangement using the "Vector Select" approach is
shown in Figure 6-3. Here, the KIM-1 system is assumed to have only the
lower 8K of memory in place. The address decoder (U4) is de-selected
using the AB15 signal which becomes "true" whenever an interrupt vector
fetch is initiated by the system. The same signal (AB15) is inverted and
"wire-or'd" through a switch to the K0 or the K7 chip select lines. Now,
depending upon the position of the switch, interrupt vectors will be
fetched from the top 6 addresses of either block K0 or K7. K0 in the
KIM-1 system is the RAM and K7 is the ROM in the 6530-002 array (the
operating program). In this way, you may have two different sets of inter-
rupt vectors in your system and may select which set is to be used with a
simple switch.
77
Should you experience difficulty with your KIM-1 module and
be unable to diagnose or correct the problem, you may return the unit
to MOS Technology, Inc. for repair.
7.1 IN-WARRANTY SERVICE
All KIM-1 series Microcomputer Modules are warranted by
MOS Technology, Inc. against defects in workmanship and materials
for a period of ninety (90) days from date of delivery. During the
warranty period, MOS Technology, Inc. will repair or, at its option,
replace at no charge components that prove to be defective provided
that the module is returned, shipping prepaid, to:
KIM Customer Service Department
MOS Technology, Inc.
950 Rittenhouse Road
Norristown, Pennsylvania 19401
This warranty does not apply if the module has been damaged by accident
or misuse, or as a result of repairs or modifications made by other than
authorized personnel at the above captioned service facility
No other warranty is expressed or implied. NOS Technology, Inc. is
not liable for consequential damages.
79
7.2 OUT-OF-WARRANTY SERVICE
Beyond the ninety (90) day warranty period, KIM modules will be
repaired for a reasonable service fee. All service work performed by
MOS Technology, Inc. beyond the warranty period is warranted for an
additional ninety (90) day period after shipment of the repaired module.
7.3 POLICY ON CHANGES
All KIM series modules are sold on the basis of descriptive
specifications in effect at the time of sale. MOS Technology, Inc.
shall have no obligation to modify or update products once sold.
MOS Technology, Inc. reserves the right to make periodic changes or
improvements to any KIM series module.
7.4 SHIPPING INSTRUCTIONS
It is the customer's responsibility to return the KIM series
module with shipping charges prepaid to the above captioned service
facility.
For in-warranty service, the KIM module will be returned to the
customer, shipping prepaid, by the fastest economical carrier.
For out-of-warranty service, the customer will pay for shipping
charges both ways. The repaired KIM module will be returned to the
customer C.O.D. unless the repairs and shipping charges are prepaid
by the customer.
Please be certain that your KIM module is safely packaged when
returning it to the above captioned service facility.
| | | | |
| ITEM | PART | QTY. | DESCRIPTION |
| | | | |
| 1. | Ul | 1 | 6502 Microprocessor |
| 2. | U2 | 1 | 6530 ROM RAM I/O Chip-02 |
| 3. | U3 | 1 | 6530 ROM RAM I/O Chip-03 |
| 4. | U5 through U12 | 8 | 6102 RAM 500ns Acc,0ns |
| 5. | U18 through U23 | 6 | 7 SEG .3" Red Display |
| 6. | U25 | 1 | 556 Timer IC |
| 7. | U27 | 1 | 565 Phase Lock Loop |
| 8. | U28 | 1 | 311 Comparator |
| 9. | U24 | 1 | 74145 BCD Decoder IC |
| 10. | U13 & U14 | 2 | 74125 TRI STATE Buffer |
| 11. | u15 | 1 | 7400 Quad Nand IC |
| 12. | U16 | 1 | 7404 Hex Inverter IC |
| 13. | U17 | 1 | 7406 Hex Inv. O/C IC |
| 14. | U26 | 1 | 7438 Quad Nand O/C IC |
| 15. | CR1,2,3,4,&8 | 5 | 20 mA. 50v Diode - 1N914 |
| 16. | CR5, CR6 | 2 | 1A 50v Diode - 1N4001 |
| 17. | CR7 | 1 | 6.2v ½w Z. Diode - 1N4735 |
| 18. | Q7 | 1 | NPN Transistor B>20, VCE>12 - 2N5371 |
| 19. | Q1 through Q6 | 6 | PNP Transistor B>20, VCE>6 - 2N5375 |
| 20. | 04 & 05 | 2 | 47K ±10% ¼w Resistor |
| 21. | R1,2,3,4, & 6 | 5 | 3.3K ±10% ¼w Resistor |
| 22. | R34 & P50 | 2 | 2.2K ±10% ¼w Resistor |
| 23. | Rl2-R17, R41-R46 | 12 | l.0K ±10% ¼w Resistor |
| 24. | R35 through R40 | 6 | 560Ohm ±10% ¼w Resistor |
| 25. | R18-R23, R47 | 7 | 220Ohm ±10% ¼w Resistor |
| 26. | R33 | 1 | 47Ohm ±l0% ¼w Resistor |
| 27. | R52 | 1 | 5 Meg. ±10% ¼w Resistor |
| 28. | R51 | 1 | 30K ±5% ¼w Resistor |
| 29. | R7,R8,R9,R10&R1l | 5 | l0K ±5% 1/4w Resistor |
| 30. | R48, R49 | 2 | 150 ±5% 0 |
| 31. | R26 through R32 | 7 | 82Ohm ±05% |
| 32. | VR1 | 1 | 5K Potentiometer |
| 33. | C2, C3, C6 | 3 | .22±10% uf.>12 wv. cap |
| 34. | C1, C4 | 2 | 1uf+80-l0%>12WV Cap |
| 35. | CS | 1 | .33 uf±l0%>12WV Cap |
| 36. | C7,C8,C15,C16,C17 | 5 | .1uf+80-l0%>12WV Cap |
| 37 | C9, C10, C11 | 3 | .0068uf±l0%>l2WV |
| 38. | C12 | 1 | .047uf±1O%>l2WV |
| 39. | C13 | 1 | .022uf±10%>l2WV |
| 40. | C14 | 1 | .OOluf±lO%>l2WV |
| 41. | | 1 | 44 Pin Edge Conn. (Vector #R644) |
| 42. | X1 | 1 | 1 MHz XTAL |
| 43. | | 1 | PCB. |
| 44. | | 1 | 24 Key KBD |
| 45. | | 6 | Rubber Pads |
| 46. | | 1 | Shipping Bag (Static Free) |
| 47. | | 1 | Shipping Box |
| 48. | | 1 | Hardware Manual |
| 49. | | 1 | Software Manual |
| 50. | | 1 | KIM Manual |
| 51. | | 1 | Warranty Card |
| 52. | | 1 | Wall Chart |
| 53. | | 2 | #2 x ¼ SS Screws (Keyboard) |
| 54. | | 1 | Program Card |
| 55. | C18 | 1 | 10pf CAP |
| 56. | R53 | 1 | 330K ¼w Resistor |
| 57. | U4 | 1 | 74L5145 BCD Decoder lC |
SYMPTOM: Display Not Lit
1. Test +5 volt power supply. Using a VOM check for +5
volts between Pin E-21 and E-22. Also check for +5
volts between Pin A-A and Pin A-1. KIM-1 power supply
should be set at +5v ñ 5%.
2. Test KB/TTY option wiring (Figure 2-4). Pin A-21 should
not be connected to Pin A-V.
3. Make sure decoder is enabled. See Figure 2-2 and insure
that Pin A-K is connected to ground.
4. Depress the reset key and check all other keys to insure
that no key is stuck.
5. Place a VOM between Pin E-21 (+5v) and Pin E-7 (Reset).
Alternately depress and release the reset key checking to
see if the voltage swings from (>4v) to (<1v).
6. Test Pin E-V (è2) with an oscilloscope and insure 1 MHz
operation.
SYMPTOM: Cannot Dump to Audio Tape
Cannot Load From Audio Tape
1. Test +12 volt power supply. Using a VOM check for +12
volts between Pin A-N (+12v) and Pin A-1 (GND). Set
power supply to +12v ñ 5%. (See Figure 2-2).
2. Check volume control on the tape recorder (Set at half
way point).
C-1
3. Make sure that you are using the proper tape output pin.
See Figure 2-3.
4. Check the tape interface circuit by disconnecting the
tape recorder and shorting Pin A-P (Audio Out High) to
Pin A-L (Audio In). Set up KIM-1 monitor to dump a
section of memory. Using an oscilloscope observe data
at Pin E-X (PLL TEST). See Appendix E for correct data
format and calibration procedure.
5. Record voice on a section of tape and play it back to insure
that the tape recorder is working. Connect another tape
recorder to the system or try another cassette.
6. Make sure Status Register (Location 00F1) has been loaded
with data value "00".
7. Make sure Tone Control is set to High.
SYMPTOM: TTY Interface Problems
1. Make sure that Pin A-21 is connected to Pin A-V (Figure 2-4)
to allow TTY operation.
2. Compare the connections on Figure 2-4 with interface
schematics in your TTY manual ( or any other serial
teleprinter ).
3. Depress the reset key on the KIM-1 keyboard followed by
a rub out character from the TTY.
Data is stored out onto your audio cassette recorder in a specific
format designed to insure an error free recovery. In the unlikely event
that a playback error does occur, several "ERROR DETECTION" methods are
incorporated to warn you of this condition.
Data is transmitted to the tape recorder in the form of serial
"ASCII" encoded characters (seven data bits plus Parity bit). Data
retrieved from the memory is converted into this form by separating each
byte into two half bytes. The half bytes are then converted into their
ASCII equivalents.
Each record transmitted begins with a leader of one hundred "SYN"
characters (ASCII 16) followed by a * character (ASCII 2A). During
playback, this pattern allows your micro-computer to detect the start of
a valid data record and synchronize to the serial data stream. Following
the *, the record identification number (ID), and starting address low
(SAL) and the starting address high (SMI) are transmitted. The data
specified by the starting (SAL, SAH) and ending limits (EAL, EAH) is
transmitted next followed by a "/" character (ASCII 2F) to indicate the
end of the data portion of the record. Following the "/" two "CHECK-SUM"
bytes are transmitted for comparison with a calculated check-sum number
during playback to further insure that a proper data retrieval has taken
place. Two "EOT" characters (ASCII ø4) mark the end of record transmission.
E-1
Each transmitted bit begins with a 3700 hertz tone and ends with
a 2400 hertz tone. "Ones" have the high to low frequency transition
at one-third of the bit period. "Zeros" have the transition at two-
thirds of the period. During playback the 565 phase locked loop locks
to, and tracks these two frequencies producing (through the 311
comparator) a logic "1" pulse of one-third the bit period for a "One".
A pulse two thirds the bit period is likewise produced for a "Zero".
Your microcomputer uses a software controlled algorithm for converting
this signal into eight bit data words.
The frequency shift keyed phase lock loop method of data recovery
is relatively insensitive to amplitude and phase variations. The "FREE
RUNNING" frequency of the phase lock loop has been adjusted at the factory
to a frequency half way between the two data frequencies (called the Center
Frequency). This adjustment is accomplished by strapping Pin A-P (Audio
Out High) to Pin A-L (Audio In). A program starting at address 1A6BHEX
provides the center frequency reference that allows the loop to be
adjusted by potentiometer VR1. Pin E-X (PLL TEST) is monitored with a
voltmeter while the pot is rotated until the voltmeter reading is at the
transition point between a logical "1" (+5v) and "0" (GND).
THIS ADJUSTMENT HAS BEEN FACTORY PRESET AND SHOULD ONLY REQUIRE
ADJUSTMENT DUE TO COMPONENT REPLACE0NT.'
The paper tape LOAD and DUMP routines store and retrieve data in
a specific format designed to insure error free recovery. Each byte
of data to be stored is converted to two half bytes. The half bytes
(whose possible values are 0 to FHEX) are translated into their ASCII
equivalents and written out onto paper tape in this form.
Each record outputted begins with a ";" character (ASCII 3B) to
mark the start of a valid record. The next byte transmitted (18HEX) or
(2410) is the number of data bytes contained in the record. The record's
starting address High (1 byte, 2 characters), starting address Lo (1 byte,
2 characters), and data (24 bytes, 48 characters) follow. Each record is
terminated by the record's check-sum (2 bytes, 4 characters), a carriage
return (ASCII OD), line feed (ASCII øA), and six "NULL" characters
(ASCII øø).
The last record transmitted has zero data bytes (indicated by ;00)
The starting address field is replaced by a four digit Hex number repre-
senting the total number of data records contained in the transmission,
followed by the records usual check-sum digits. A "XOFF" character ends
the transmission.
;180000FFEEDDCCBBAA0099887766554433221122334455667788990AFC
;0000010001
F-1
During a "LOAD" all incoming data is ignored until a ";" character
is received. The receipt of non ASCII data or a mismatch between a
records calculated check-sum and the check-sum read from tape will cause
an error condition to be recognized by KIM. The check-sum is calculated
by adding all data in the record except the ";" character.
The paper tape format described is compatible with all other
MOS Technology, Inc. software support programs.
Clocks (ø1, ø2)
The MCS 6502 is supplied with an internal clock generator. The
frequency of this clock is crystal controlled.
Address Bus (A0-A15)
These outputs are TTL compatible, capable of driving one standard
TTL load and 13Opf.
Data Bus (D0-D7)
Eight pins are used for the data bus. This is a bi-directional bus,
transferring data to and from the device and peripherals. The
outputs are tri-state buffers capable of driving one standard
TTL load and 130pf.
Ready (RDY)
This input signal allows the user to single cycle the microprocessor
on all cycles except write cycles. A negative transition to the low
state during or coincident with phase one (þ1) will halt the micro-
processor with the output address lines reflecting the current
address being fetched. This condition will remain through a
subsequent phase two (þ2) in which the Ready signal is high. This
feature allows microprocessor interfacing with low speed PROMS as
well as fast (max 2 cycle) Direct Memory Access (DMA). If Ready
is low during a write cycle, it is ignored until the following
read operation.
G-1
Interrupt Request (IRQ)
This TTL level input requests that an interrupt sequence begin
within the microprocessor. The microprocessor will complete the
current instruction being executed before recognizing the request.
At that time, the interrupt mask bit in the Status Code Register
will be examined. If the interrupt mask flag is not set, the
microprocessor will begin an interrupt sequence. The Program
Counter and Processor Status Register are stored in the stack.
The microprocessor will then set the interrupt mask flag high
so that no further interrupts may occur. At the end of this
cycle, the program counter low will be loaded from address FFFE,
and program counter high from location FFFF, therefore trans-
ferring program control to the memory vector located at these
addresses. The RDY signal must be in the high state(for control
to the memory vector) located at these addresses. The RDY signal
must be in the high state for any interrupt to be recognized.
A 3Kþ external register should be used for proper wire-OR operation.
Non-Maskable Interrupt (NMI)
A negative going edge on this input requests that a non-maskable
interrupt sequence be generated within the microprocessor.
NMI is an unconditional interrupt. Following completion of the
current instruction, the sequence of operations defined for IRQ
will be performed, regardless of the state of the interrupt mask flag.
The vector address loaded into the program counter, low and high,
are locations FFFA and FFFB respectively. The instructions
loaded at these locations causes the microprocessor to branch to
a non-maskable interrupt routine in memory.
NMI also requires an external 3KOhm resistor to Vcc for proper
wire-OR operations.
G-2
Inputs IRQ and NMI are hardware interrupts lines that are sampled
during ø2 (phase 2) and will begin the appropriate interrupt
routine on the ø1 (phase 1) following the completion of the
current instruction.
Set Overflow Flag (S.O.)
This TTL level input signal allows external control of the
overflow bit in the Status Code Register.
SYNC
This output line is provided to identify those cycles in which
the microprocessor is doing an Op Code fetch. The SYNC line
goes high during ø1 of an Op Code fetch and stays high for the
remainder of that cycle. If the RDY line is pulled low during
the þ1 clock pulse in which SYNC went high, the processor will
stop in its current state and will remain in the state until
the RDY line goes high. In this manner, the SYNC signal can be
used to control RDY to cause single instruction execution.
RESET
This input is used to reset or start the microprocessor from a
power down condition. During the time that this line is held
low, writing to or from the microprocessor is inhibited. When
a positive edge is detected on the input, the microprocessor
will immediately begin the reset sequence.
After a system initialization time of six clock cycles, the mask
interrupt flag will be set and the microprocessor will load the
program counter from the memory vector locations FFFC and FFFD.
This is the start location for program control.
After Vcc reaches 4.75 volts in a power up routine, reset must
be held low for at least two clock cycles.
When the reset signal goes high following these two clock cycles,
the microprocessor will proceed with the normal reset procedure
detailed above.
The MCS 6530 is designed to operate in conjunction with the MCS 650X
Microprocessor Family. It is comprised of a mask programmable 1024 x 8
ROM, a 64 x 8 static RAM, two software controlled 8 bit bi-directional
data ports allowing direct interfacing between the microprocessor unit
and peripheral devices, and a software programmable interval timer
with interrupt, capable of timing in various intervals from 1 to 262,144
clock periods.
MCS 6530 Block Diagram
FIGURE H.1
H-1
Reset (RES)
During system initialization a Logic "0" on the RES input will
cause a zeroing of all four I/O registers. This in turn will
cause all I/O buses to act as inputs thus protecting external
components from possible damage and erroneous data while the
system is being configured under software control. The Data
Bus Buffers are put into an OFF-STATE during Reset. Interrupt
capability is disabled with the RES signal. The RES signal must
be held low for at least one clock period when reset is required.
Input Clock
The input clock is a system Phase Two clock which can be either
a low level clock (VIL < 0.4, VIH > 2.4) or high level clock
(VIL < 0.2, VIH = Vcc +.3/-.2)
Read/Write (R/W)
The R/W signal is supplied by the microprocessor array and is used
to control the transfer of data to and from the microprocessor array
and the MCS 6530. A high on the R/W pin allows the processor to
read (with proper addressing) the data supplied by the MCS 6530.
A low on the R/W pin allows a write (with proper addressing) to
the MCS 6530.
Interrupt Request (IRQ)
The IRQ pin is an interrupt pin from the interval timer. This
same pin, if not used as an interrupt, can be used as a peripheral
I/O pin (PB7). Then used as an interrupt, the pin should be set
up as an input by the data direction register. The pin will be
normally high with a low indicating an interrupt from the MCS 6530.
H-2
Data Bus (D0-D7)
The MCS 6530 has eight bi-directional data pins (Dø-D7). These
pins connect to the system's data lines to allow transfer of data
to and from the microprocessor array. The output buffers remain
in the off state except when a Read operation occurs.
Peripheral Data Ports
The MCS 6530-002, MCS 6530-003 both have 15 pins available for
peripheral I/O operations. Each pin is individually software
programmable to act as either an input or an output. The 15
pins are divided into 2 8-bit ports, PAø-PA7 and PBø-PB7. PB6
was used as a chip select and is not available to the user. The
pins are set up as an input by writing a "0" into the corresponding
bit of the data direction register. A "1" into the data direction
register will cause its corresponding bit to be an output. Wben in
the input mode, the peripheral output buffers are in the "1" state
and a pull-up device acts as less than one TTL load to the peripheral
data lines. On a Read operation, the microprocessor unit reads the
peripheral pin. When the peripheral device gets information from
the MCS 6530 it receives data stored in the data register. The
microprocessor will read correct information if the peripheral lines
are greater than 2.0 volts for a "1" and less than 0.8 volts for a
"0" as the peripheral pins are all TTL compatible. Pins PA0 and PB0
are also capable of sourcing 3 ma at 1.5v, thus making them capable
of Darlington drive. Pin PB7 has no internal pull-up (to allow
collector-oring with other devices).
Address Lines (Aø-A9)
There are 10 address pins. In addition to these 10, there is the
ROM SELECT pin. The above pins, Aø-A9 and ROM SELECT, are always
used as addressing pins. There are 2 additional pins which are mask
programmable and can be used either individually or together as
CHIP SELECTS. They are pins PB5 and PB6. When used as peripheral
data pins they cannot be used as chip selects. PB5 was used as a
data pin while PB6 was used as a chip select and is not available
to the user.
H-3
A block diagram of the internal architecture is shown in Figure H-1
The NCS 6530 is divided into four basic sections, RAM, ROM, I/O and TIMER.
The RAM and ROM interface directly with the microprocessor through the
system data bus and address lines. The I/O section consists of 2 8-bit
halves. Each half contains a Data Direction Register (DDR) and an I/O
Register.
ROM 1K Byte (8K Bits)
The 8K ROM is in a 1024 x 8 configuration. Address lines A0-A9,
as well as RSO are needed to address the entire ROM. With the
addition of CS1 and CS2, seven NCS 6530's may be addressed, giving
7168 x 8 bits of contiguous ROM.
RAM 64 Bytes (512 Bits)
A 64 x 8 static RAM is contained on the MCS 6530. It is addressed
by Aø-A5 (Byte Select), RSø, A6, A7, A8, A9 and CS1.
Internal Peripheral Registers
There are four internal registers, two data direction registers
and two peripheral I/O data registers. The two data direction
registers (A side and B side) control the direction of the data
into and out of the peripheral pins. A "1" written into the Data
Direction Register sets up the corresponding peripheral buffer pin
as an output. Therefore, anything then written into the I/O Register
will appear on that corresponding peripheral pin. A "0" written into
the DDR inhibits the output buffer from transmitting data to or from
the I/O Register. For example, a "1" loaded into data direction
register A, position 3, sets up peripheral pin PA3 as an output.
If a "0" had been loaded, PA3 would be configured as an input and
remain in the high state. The two data I/O registers are used to
latch data from the Data Bus during a Write operation until the
peripheral device can read the data supplied by the microprocessor
array.
H-4
During a read operation the microprocessor is not reading the I/O
Registers but in fact is reading the peripheral data pins. For
the peripheral data pins which are programmed as outputs the
microprocessor will read the corresponding data bits of the I/O
Register. The only way the I/O Register data can be changed is by
a microprocessor Write operation. The I/O Register is not affected
by a Read of the data on the peripheral pins.
Interval Timer
1. Capabilities
The KIM-1 Interval Timer allows the user to specify a preset count
of up to 25610 and a clock divide rate of 1, 8, 64 or 1024 by writing
to a memory location. As soon as the write occurs, counting at the
specified rate begins. The timer counts down at the clock frequency
divided by the divide rate. The current timer count may be read at
any time. At the user's option, the timer may be programmed to generate
an interrupt when the counter counts down past zero. When a count of
zero is passed, the divide rate is automatically set to 1 and the
counter continues to count down at the clock rate starting at a count
of FF (-1 in two's complement arithmetic). This allows the user to
determine how many clock cycles have passed since the timer reached
a count of zero. Since the counter never stops, continued counting
down will reach 00 again, then FF, and the count will continue.
2. Operation
a. Loading the timer
The divide rate and interrupt option enable/disable are programmed
by decoding the least significant address bits. The starting count for
the timer is determined by the value written to that address.
H-5
Writing to Address Sets Divide Ratio To Interrupt Capability Is
1704 1 Disabled
1705 8 Disabled
1706 64 Disabled
1707 1024 Disabled
170C 1 Enabled
170D 8 Enabled
170E 64 Enabled
170F 1024 Enabled
b. Determining the timer status
After timing has begun, reading address location 1707 will provide
the timer status. If the counter has passed the count of zero, bit 7
will be set to 1, otherwise, bit 7 (and all other bits in location 1707)
will be zero. This allows a program to "watch" location 1707 and
determine when the timer has timed out.
c. Reading the count in the timer
If the timer has not counted past zero, reading location 1706 will
provide the current timer count and disable the interrupt option;
reading location 170E will provide the current timer count and enable
the interrupt option. Thus the interrupt option can be changed while
the timer is counting down.
If the timer has counted past zero, reading either memory location
1706 or 170E will restore the divide ratio to its previously programmed
value, disable the interrupt option and leave the timer with its current
count (not the count originally written to the timer). Because the timer
never stops counting, the timer will continue to decrement, pass zero,
set the divide rate to 1, and continue to count down at the clock
frequency, unless new information is written to the timer.
H-6
d. Using the interrupt option
In order to use the interrupt option described above, line PB7
(application connector, pin 15) should be connected to either the
IRQ (Expansion Connector, pin 4) or NMI (Expansion Connector, pin 6)
pin depending on the desired interrupt function. PB7 should be
programmed as in input line (it's normal state after a RESET).
NOTE: If the programmer desires to use PB7 as a normal I/O line,
the programmer is responsible for disabling the timer
interrupt option (by writing or reading address 1706)
so that it does not interfere with normal operation
of PB7. Also, PB7 was designed to be wire-ORed with
other possible interrupt sources; if this is not desired,
a 5.1K resistor should be used as a pull-up from PB7 to
+5v. (The pull-up should NOT be used if PB7 is connected
to NMI or IRQ.)
PAGE 2
CARD # LOC CODE CARD
3 ; 666666 555555 333333 000000
4 ; 6 5 3 0 0
5 ; 6 5 3 0 0
6 ; 666666 555555 333333 0 0
7 ; 6 6 5 3 0 0
8 ; 6 6 5 3 0 0
9 ; 666666 666666 666666 000000
10 ;
11 ;
12 ;
13 ; 000000 000000 333333
14 ; 0 0 0 0 3
15 ; ------ 0 0 0 0 3
16 ; ------ 0 0 0 0 333333
17 ; ------ 0 0 0 0 3
18 ; 0 0 0 0 3
19 ; 000000 000000 333333
20 ;
21 ;
22 ;
23 ;
24 ;
25 ; COPYRIGHT
26 ; MOS TECHNOLOGY, INC
27 ; DATE: OCT 18, 1975 REV-D
28 ;
29 ;
30 ;
31 ; 6530-003 I.C. IS AN AUDIO CASSETT TAPE
32 ; RECORDER ENTENSION OF THE BASIC
33 ; KIM MONITOR
34 ;
35 ; IT FEATURES TWO BASIC ROUTINES
36 ; LOADT-LOAD MEM FROM AUDIO TAPE
37 ; DUMPT-STOR MEM ONTO AUDIO TAPE
38 ;
39 ; LOADT
40 ; ID=00 IGNORE ID
41 ; ID=FF IGN. ID USE SA FOR START ADDR
42 ; ID=01-FE IGN.ID USE ADDRESS ON TAPE
43 ;
44 ; DUMPT
45 ; ID=00 SHOULD NOT BE USED
46 ; ID=FF SHOULD NOT BE USED
47 ; ID=01-FE NORMAL ID RANGE
48 ; SAL LSB STARTING ADDRESS OF PROGRAM
49 ; SAH MSB
50 ; EAL ENDING ADDRESS OF PROGRAM
51 ; EAH MSB
52 ;
PAGE 3
CARD # LOC CODE CARD
54 ;
55 ; EQUATES
56 ; SET UP FOR 6530-002 I/O
57 ;
58 SAD =$1740 6530 A DATA
59 PADD =$1741 6530 A DATA DIRECTION
60 SBD =$1742 6530 B DATA
61 PBDD =$1743 6530 B DATA DIRECTION
62 CLK1T =$1744 DIV BY 1 TIME
63 CLK8T =$1745 DIV BY 8 TIME
64 CLK64T =$1746 DIV BY 64 TIME
65 CLKKT =$1747 DIV BY 1024 TIME
66 CLKRDI =$1747 READ TIME OUT BIT
67 CLKRDT =$1746 READ TIME
68 ;
69 0000 *=$00EF
70 ; MPU REG. SAVX AREA IN PAGE 0
71 ;
72 00EF PCL *=*+1 PROGRAM CNT LOW
73 00F0 PCH *=*+1 PROGRAM CNT HI
74 00F1 PREG *=*+1 CURRENT STATUS REG
75 00F2 SPUSER *=*+1 CURRENT STACK POINTER
76 00F3 ACC *=*+1 ACCUMULATOR
77 00F4 YREG *=*+1 Y INDEX
78 00F5 XREG *=*+1 X INDEX
79 ;
80 ; KIM FIXED AREA IN PAGE 0
81 ;
82 00F6 CHKHI *=*+1
83 00F7 CHKSUM *=*+1
84 00F8 INL *=*+1 INPUT BUFFER
85 00F9 INH *=*+1 INPUT BUFFER
86 00FA POINTL *=*+1 LSB OF OPEN CELL
87 00FB POINTH *=*+1 MSB OF OPEN CELL
88 00FC TEMP *=*+1
89 00FD TMPX *=*+1
90 00FE CHAR *=*+1
91 00FF MODE *=*+1
92 ;
93 ; KIM FIXED AREA IN PAGE 23
94 ;
95 0100 *=$17E7
96 17E7 CHKL *=*+1
97 17E8 CHKH *=*+1 CHKSUM
98 17E9 SAVX *=*+3
99 17EC VEB *=*+6 VOLATILE EXECUTION BLOCK
100 17F2 CNTL30 *=*+1 TTY DELAY
101 17F3 CNTH30 *=*+1 TTY DELAY
102 17F4 TIMH *=*+1
103 17F5 SAL *=*+1 LOW STARTING ADDRESS
104 17F6 SAH *=*+1 HI STARTING ADDRESS
105 17F7 EAL *=*+1 LOW ENDING ADDRESS
PAGE 4
CARD # LOC CODE CARD
106 17F8 EAH *=*+1 HI ENDING ADDRESS
107 17F9 ID *=*+1 TAPE PROGRAM ID NUMBER
108 ;
109 ; INTERRUPT VECTORS
110 ;
111 17FA NMIV *=*+2 STOP VECTOR (STOP=1C00)
112 17FC RSTV *=*+2 RST VECTOR
113 17FE IRQV *=*+2 IRQ VECTOR (BRK= 1C00)
114 ;
PAGE 5
CARD # LOC CODE CARD
116 1800 *=$1800
117 ;
118 ; INIT VOLATILE EXECUTION BLOCK
119 ; DUMP MEM TO TAPE
120 ;
121 1800 A9 AD DUMPT LDA #$AD LOAD ABSOLUTE INST
122 1802 8D EC 17 STA VEB
123 1805 20 32 19 JSR INTVEB
124 ;
125 1808 A9 27 LDA #$27 TURN OFF DATAIN PB5
126 180A 8D 42 17 STA SBD
127 180D A9 BF LDA #$BF CONVERT PB7 TO OUTPUT
128 180F 8D 43 17 STA PBDD
129 ;
130 1812 A2 64 LDX #$64 100 CHARS
131 1814 A9 16 DUMPT1 LDA #$16 SYNC CHAR'S
132 1816 20 7A 19 JSR OUTCHT
133 1819 CA DEX
134 181A D0 F8 BNE DUMPT1
135 ;
136
137 181C A9 2A LDA #$2A START CHAR
138 181E 20 7A 19 JSR OUTCHT
139 ;
140 1821 AD F9 17 LDA ID OUTPUT ID
141 1824 20 61 19 JSR OUTBT
142 ;
143 1827 AD F5 17 LDA SAL OUTPUT STARTING
144 182A 20 5E 19 JSR OUTBTC ADDRESS
145 182D AD F6 17 LDA SAH
146 1830 20 5E 19 JSR OUTBTC
147 ;
148 1833 AD ED 17 DUMPT2 LDA VEB+1 CHECK FOR LAST
149 1836 CD F7 17 CMP EAL DATA BYTE
150 1839 AD EE 17 LDA VEB+2
151 183C ED F8 17 SBC EAH
152 183F 90 24 BCC DUMPT4
153 ;
154 1841 A9 2F LDA #'/ OUTPUT END OF DATA CHAR
155 1843 20 7A 19 JSR OUTCHT
156 1846 AD E7 17 LDA CHKL LAST BYTE HAS BEEN
157 1849 20 61 19 JSR OUTBT OUTPUT NOW OUTPUT
158 184C AD E8 17 LDA CHKH CHKSUM
159 184F 20 61 19 JSR OUTBT
160 ;
161 ;
162 1852 A2 02 LDX #$02 2 CHAR'S
163 1854 A9 04 DUMPT3 LDA #$04 EOT CHAR
164 1856 20 7A 19 JSR OUTCHT
165 1859 CA DEX
166 185A D0 F8 BNE DUMPT3
167 ;
PAGE 6
CARD # LOC CODE CARD
168 185C A9 00 LDA #$00 DISPLAY 0000
169 185E 85 FA STA POINTL FOR NORMAL EXIT
170 1860 85 FB STA POINTH
171 1862 4C 4F 1C JMP START
172 ;
173 1865 20 EC 17 DUMPT4 JSR VEB DATA BYTE OUTPUT
174 1868 20 5E 19 JSR OUTBTC
175 ;
176 186B 20 EA 19 JSR INCVEB
177 186E 4C 33 18 JMP DUMPT2
178 ;
179 ; LOAD MEMORY FROM TAPE
180 ;
181 ;
182 1871 0F 19 TAB .WORD LOAD12
183 1873 A9 8D LOADT LDA #$8D INIT VOLATILE EXECUTION
184 1875 8D EC 17 STA VEB BLOCK WITH STA ABS.
185 1878 20 32 19 JSR INTVEB
186 ;
187 187B A9 4C LDA #$4C JUMP TYPE RTRN
188 187D 8D EF 17 STA VEB+3
189 1880 AD 71 18 LDA TAB
190 1883 8D F0 17 STA VEB+4
191 1886 AD 72 18 LDA TAB+1
192 1889 8D F1 17 STA VEB+5
193 ;
194 188C A9 07 LDA #$07 RESET PB5=0 (DATA-IN)
195 188E 8D 42 17 STA SBD
196 ;
197 1891 A9 FF SYNC LDA #$FF CLEAR SAVX FOR SYNC CHAR
198 1893 8D E9 17 STA SAVX
199 ;
200 1896 20 41 1A SYNC1 JSR RDBIT GET A BIT
201 1899 4E E9 17 LSR SAVX SHIFT BIT INTO CHAR
202 189C 0D E9 17 ORA SAVX
203 189F 8D E9 17 STA SAVX
204 18A2 AD E9 17 LDA SAVX GET NEW CHAR
205 18A5 C9 16 CMP #$16 SYNC CHAR
206 18A7 D0 ED BNE SYNC1
207 ;
208 18A9 A2 0A LDX #$0A TEST FOR 10 SYNC CHARS
209 18AB 20 24 1A SYNC2 JSR RDCHT
210 18AE C9 16 CMP #$16
211 18B0 D0 DF BNE SYNC IF NOT 10 CHAR, RE-SYNC
212 18B2 CA DEX
213 18B3 D0 F6 BNE SYNC2
214 ;
215 ;
216 18B5 20 24 1A LOADT4 JSR RDCHT LOOK FOR START OF
217 18B8 C9 2A CMP #$2A DATA CHAR
218 18BA F0 06 BEQ LOAD11
219 18BC C9 16 CMP #$16 IF NOT , SHOULD BE SYN
PAGE 7
CARD # LOC CODE CARD
220 18BE D0 D1 BNE SYNC
221 18C0 F0 F3 BEQ LOADT4
222 ;
223 18C2 20 F3 19 LOAD11 JSR RDBYT READ ID FROM TAPE
224 18C5 CD F9 17 CMP ID COMPARE WITH REQUESTED ID
225 18C8 F0 0D BEQ LOADT5
226 18CA AD F9 17 LDA ID DEFAULT 00, READ RECORD
227 18CD C9 00 CMP #$00 ANYWAY
228 18CF F0 06 BEQ LOADT5
229 18D1 C9 FF CMP #$FF DEFAULT FF, IGNORE SA ON
230 18D3 F0 17 BEQ LOADT6 TAPE
231 18D5 D0 9C BNE LOADT
232 ;
233 18D7 20 F3 19 LOADT5 JSR RDBYT GET SA FROM TAPE
234 18DA 20 4C 19 JSR CHKT
235 18DD 8D ED 17 STA VEB+1 SAVX IN VEB+1,2
236 18E0 20 F3 19 JSR RDBYT
237 18E3 20 4C 19 JSR CHKT
238 18E6 8D EE 17 STA VEB+2
239 18E9 4C F8 18 JMP LOADT7
240 ;
241 18EC 20 F3 19 LOADT6 JSR RDBYT GET SA BUT IGNORE
242 18EF 20 4C 19 JSR CHKT
243 18F2 20 F3 19 JSR RDBYT
244 18F5 20 4C 19 JSR CHKT
245 ;
246 ;
247 18F8 A2 02 LOADT7 LDX #$02 GET 2 CHARS
248 18FA 20 24 1A LOAD13 JSR RDCHT GET CHAR (X)
249 18FD C9 2F CMP #$2F LOOK FOR LAST CHAR
250 18FF F0 14 BEQ LOADT8
251 1901 20 00 1A JSR PACKT CONVERT TO HEX
252 1904 D0 23 BNE LOADT9 Y=1 NON-HEX CHAR
253 1906 CA DEX
254 1907 D0 F1 BNE LOAD13
255 ;
256 1909 20 4C 19 JSR CHKT COMPUTE CHECKSUM
257 190C 4C EC 17 JMP VEB SAVX DATA IN MEMORY
258 190F 20 EA 19 LOAD12 JSR INCVEB INCREMENT DATA POINTER
259 1912 4C F8 18 JMP LOADT7
260 ;
261 1915 20 F3 19 LOADT8 JSR RDBYT END OF DATA, COMPARE CHKSUM
262 1918 CD E7 17 CMP CHKL
263 191B D0 0C BNE LOADT9
264 191D 20 F3 19 JSR RDBYT
265 1920 CD E8 17 CMP CHKH
266 1923 D0 04 BNE LOADT9
267 1925 A9 00 LDA #$00 NORMAL EXIT
268 1927 F0 02 BEQ LOAD10
269 ;
270 1929 A9 FF LOADT9 LDA #$FF ERROR EXIT
271 192B 85 FA LOAD10 STA POINTL
PAGE 8
CARD # LOC CODE CARD
272 192D 85 FB STA POINTH
273 192F 4C 4F 1C JMP START
274 ;
PAGE 9
CARD # LOC CODE CARD
276 ;
277 ; SUBROUTINES FOLLOW
278 ;
279 ; SUB TO MOVE SA TO VEB+1,2
280 ;
281 1932 AD F5 17 INTVEB LDA SAL MOVE SA TO VEB+1,2
282 1935 8D ED 17 STA VEB+1
283 1938 AD F6 17 LDA SAH
284 193B 8D EE 17 STA VEB+2
285 193E A9 60 LDA #$60 RTS INST
286 1940 8D EF 17 STA VEB+3
287 1943 A9 00 LDA #$00 CLEAR CHKSUM AREA
288 1945 8D E7 17 STA CHKL
289 1948 8D E8 17 STA CHKH
290 194B 60 RTS
291 ;
292 ; COMPUTE CHKSUM FOR TAPE LOAD
293 ; RTN USES Y TO SAVEX A
294 ;
295 194C A8 CHKT TAY
296 194D 18 CLC
297 194E 6D E7 17 ADC CHKL
298 1951 8D E7 17 STA CHKL
299 1954 AD E8 17 LDA CHKH
300 1957 69 00 ADC #$00
301 1959 8D E8 17 STA CHKH
302 195C 98 TYA
303 195D 60 RTS
304 ;
305 ; OUTPUT ONE BYTE USE Y
306 ; TO SAVX BYTE
307 ;
308 195E 20 4C 19 OUTBTC JSR CHKT COMPARE CHKSUM
309 1961 A8 OUTBT TAY SAVX DATA BYTE
310 1962 4A LSR A SHIFT OFF LSD
311 1963 4A LSR A
312 1964 4A LSR A
313 1965 4A LSR A
314 1966 20 6F 19 JSR HEXOUT OUTPUT MSD
315 1969 98 TYA
316 196A 20 6F 19 JSR HEXOUT OUTPUT LSD
317 196D 98 TYA
318 196E 60 RTS
319 ;
320 ; CONVERT LSD OF A TO ASCII
321 ; OUTPUT TO TAPE
322 ;
323 196F 29 0F HEXOUT AND #$0F
324 1971 C9 0A CMP #$0A
325 1973 18 CLC
326 1974 30 02 BMI HEX1
327 1976 69 07 ADC #$07
PAGE 10
CARD # LOC CODE CARD
328 1978 69 30 HEX1 ADC #$30
329 ;
330 ; OUTPUT TO TAPE ONE ASCII
331 ; CHAR USE SUB'S ONE + ZRO
332 ;
333 197A 8E E9 17 OUTCHT STX SAVX
334 197D 8C EA 17 STY SAVX+1
335 1980 A0 08 LDY #$08 START BIT
336 1982 20 9E 19 CHT1 JSR ONE
337 1985 4A LSR A GET DATA BIT
338 1986 B0 06 BCS CHT2
339 1988 20 9E 19 JSR ONE DATA BIT=1
340 198B 4C 91 19 JMP CHT3
341 198E 20 C4 19 CHT2 JSR ZRO DATA BIT=0
342 1991 20 C4 19 CHT3 JSR ZRO
343 1994 88 DEY
344 1995 D0 EB BNE CHT1
345 1997 AE E9 17 LDX SAVX
346 199A AC EA 17 LDY SAVX+1
347 199D 60 RTS
348 ;
349 ;
340 ; OUTPUT 1 TO TAPE
351 ; 9 PULSES, 138 MICROSEC EACH
352 ;
353 199E A2 09 ONE LDX #$09
354 19A0 48 PHA SAVX A
355 19A1 2C 47 17 ONE1 BIT CLKRDI WAIT FOR TIME OUT
356 19A4 10 FB BPL ONE1
357 19A6 A9 7E LDA #126
358 19A8 8D 44 17 STA CLK1T
359 19AB A9 A7 LDA #$A7
360 19AD 8D 42 17 STA SBD SET PB7=1
361 19B0 2C 47 17 ONE2 BIT CLKRDI
362 19B3 10 FB BPL ONE2
363 19B5 A9 7E LDA #126
364 19B7 8D 44 17 STA CLK1T
365 19BA A9 27 LDA #$27
366 19BC 8D 42 17 STA SBD RESET PB7=0
367 19BF CA DEX
368 19C0 D0 DF BNE ONE1
369 19C2 68 PLA
370 19C3 60 RTS
371 ;
372 ;
373 ; OUTPUT 0 TO TAPE
374 ; 6 PULSES, 207 MICROSEC EACH
375 ;
376 19C4 A2 06 ZRO LDX #$06
377 19C6 48 PHA SAVX A
378 19C7 2C 47 17 ZRO1 BIT CLKRDI
379 19CA 10 FB BPL ZRO1
PAGE 11
CARD # LOC CODE CARD
380 19CC A9 C3 LDA #$C3
381 19CE 8D 44 17 STA CLK1T
382 19D1 A9 A7 LDA #$A7
383 19D3 8D 42 17 STA SBD SET PB7=1
384 19D6 2C 47 17 ZRO2 BIT CLKRDI
385 19D9 10 FB BPL ZRO2
386 19DB A9 C3 LDA #195
387 19DD 8D 44 17 STA CLK1T
388 19E0 A9 27 LDA #$27
389 19E2 8D 42 17 STA SBD RESET PB7=0
390 19E5 CA DEX
391 19E6 D0 DF BNE ZRO1
392 19E8 68 PLA RESTORE A
393 19E9 60 RTS
394 ;
395 ; SUB TO INC VEB+1,2
396 ;
397 19EA EE ED 17 INCVEB INC VEB+1
398 19ED D0 03 BNE INCVE1
399 19EF EE EE 17 INC VEB+2
400 19F2 60 INCVE1 RTS
401 ;
402 ; SUB TO READ BYTE FROM TAPE
403 ;
404 19F3 20 24 1A RDBYT JSR RDCHT
405 19F6 20 00 1A JSR PACKT
406 19F9 20 24 1A JSR RDCHT
407 19FC 20 00 1A JSR PACKT
408 19FF 60 RTS
409 ;
410 ; PACK A=ASCII INTO SAVX
411 ; AS HEX DATA
412 ;
413 1A00 C9 30 PACKT CMP #$30
414 1A02 30 1E BMI PACKT3
415 1A04 C9 47 CMP #$47
416 1A06 10 1A BPL PACKT3
417 1A08 C9 40 CMP #$40
418 1A0A 30 03 BMI PACKT1
419 1A0C 18 CLC
420 1A0D 69 09 ADC #$09
421 1A0F 2A PACKT1 ROL A
422 1A10 2A ROL A
423 1A11 2A ROL A
424 1A12 2A ROL A
425 1A13 A0 04 LDY #$04
426 1A15 2A PACKT2 ROL A
427 1A16 2E E9 17 ROL SAVX
428 1A19 88 DEY
429 1A1A D0 F9 BNE PACKT2
430 1A1C AD E9 17 LDA SAVX
431 1A1F A0 00 LDY #$00 Y=0 VALID HEX CHAR
PAGE 12
CARD # LOC CODE CARD
432 1A21 60 RTS
433 1A22 C8 PACKT3 INY Y=1 NOT HEX
434 1A23 60 RTS
435 ;
436 ; GET 1 CHAR FROM TAPE AND RETURN
437 ; WITH CHAR IN A USE SAVX+1 TO ASM CHAR
438 ;
439 1A24 8E EB 17 RDCHT STX SAVX+2
440 1A27 A2 08 LDX #$08 READ 8 BITS
441 1A29 20 41 1A RDCHT1 JSR RDBIT GET NEXT DATA BIT
442 1A2C 4E EA 17 LSR SAVX+1 RIGHT SHIFT CHAR
443 1A2F 0D EA 17 ORA SAVX+1 OR IN SIGN BIT
444 1A32 8D EA 17 STA SAVX+1 REPLACE CHAR
445 1A35 CA DEX
446 1A36 D0 F1 BNE RDCHT1
447 ;
448 1A38 AD EA 17 LDA SAVX+1 MOVE CHAR INTO A
449 1A3B 2A ROL A SHIFT OFF PARITY
450 1A3C 4A LSR A
451 1A3D AE EB 17 LDX SAVX+2
452 1A40 60 RTS
453 ;
454 ; THIS SUB GETS ONE BIT FROM
455 ; TAPE AND RETURNS IT IN SIGN OF A
456 ;
457 1A41 2C 42 17 RDBIT BIT SBD WAIT FOR END OF START BIT
458 1A44 10 FB BPL RDBIT
459 1A46 AD 46 17 LDA CLKRDT GET START BIT TIME
460 1A49 A0 FF LDY #$FF A=256-T1
461 1A4B 8C 46 17 STY CLK64T SET UP TIMER
462 ;
463 1A4E A0 14 LDY #$14
464 1A50 88 RDBIT3 DEY DELAY 100 MICROSEC
465 1A51 D0 FD BNE RDBIT3
466 ;
467 1A53 2C 42 17 RDBIT2 BIT SBD
468 1A56 30 FB BMI RDBIT2 WAIT FOR NEXT START BIT
469
470 1A58 38 SEC
471 1A59 ED 46 17 SBC CLKRDT (256-T1)-(256-T2)=T2-T1
472 1A5C A0 FF LDY #$FF
473 1A5E 8C 46 17 STY CLK64T SET UP TIMER FOR NEXT BIT
474
475 1A61 A0 07 LDY #$07
476 1A63 88 RDBIT4 DEY DELAY 50 MICROSEC
477 1A64 D0 FD BNE RDBIT4
478 ;
479 1A66 49 FF EOR #$FF COMPLEMENT SIGN OF A
480 1A68 29 80 AND #$80 MASK ALL EXCEPT SIGN
481 1A6A 60 RTS
PAGE 13
CARD # LOC CODE CARD
483 ;
484 ; DIAGNOSTICS
485 ; MEMORY
486 ; PLLCAL
487 ;
488 ;
489 ;
490 ; PLLCAL OUTPUT 166 MICROSEC
491 ; PULSE STRING
492 ;
493 1A6B A9 27 PLLCAL LDA #$27
494 1A6D 8D 42 17 STA SBD TURN OFF DATIN PB5=1
495 1A70 A9 BF LDA #$BF CONVERT PB7 TO OUTPUT
496 1A72 8D 43 17 STA PBDD
497 ;
498 1A75 2C 47 17 PLL1 BIT CLKRDI
499 1A78 10 FB BPL PLL1
500 1A7A A9 9A LDA #154 WAIT 166 MICROSEC
501 1A7C 8D 44 17 STA CLK1T
502 1A7F A9 A7 LDA #$A7 OUTPUT PB7=1
503 1A81 8D 42 17 STA SBD
504 ;
505 1A84 2C 47 17 PLL2 BIT CLKRDI
506 1A87 10 FB BPL PLL2
507 1A89 A9 9A LDA #154
508 1A8B 8D 44 17 STA CLK1T
509 1A8E A9 27 LDA #$27 PB7=0
510 1A90 8D 42 17 STA SBD
511 1A93 4C 75 1A JMP PLL1
512 ;
513 ;
514 ; INTERRUPTS PAGE 27
515 ;
516 *=*+$164 RESERVED FOR TEST
517 1BFA 6B 1A NMIP27 .WORD PLLCAL
518 1BFC 6B 1A RSTP27 .WORD PLLCAL
519 1BFE 6B 1A IRQP27 .WORD PLLCAL
520 ;
PAGE 14
CARD # LOC CODE CARD
522 ;
523 ;
524 ;
525 ;
526 ; 666666 555555 333333 000000
527 ; 6 5 3 0 0
528 ; 6 5 3 0 0
529 ; 666666 555555 333333 0 0
530 ; 6 6 5 3 0 0
531 ; 6 6 5 3 0 0
532 ; 666666 666666 666666 000000
523 ;
534 ;
535 ;
536 ; 000000 000000 222222
537 ; 0 0 0 0 2
538 ; ------ 0 0 0 0 2
539 ; ------ 0 0 0 0 222222
540 ; ------ 0 0 0 0 2
541 ; 0 0 0 0 2
542 ; 000000 000000 222222
543 ;
PAGE 15
CARD # LOC CODE CARD
545 ;
546 ;
547 ;
548 ; COPYRIGHT
549 ; MOS TECHNOLOGY INC.
550 ; DATE OCT 13 1975 REV E
551 ;
552 ; KIM :TTY INTERFACE
553 ; :KEYBOARD INTERFACE
554 ; :7 SEG 6 DIGIT DISPLAY
555 ;
556 ;
557 ; TTY CMDS:
558 ; G GOEXEC
559 ; CR OPEN NEXT CELL
560 ; LF OPEN PREV. CELL
561 ; . MODIFY OPEN CELL
562 ; SP OPEN NEW CELL
563 ; L LOAD (OBJECT FORMAT)
564 ; Q DUMP FROM OPEN CELL ADDR TO HI LIMIT
565 ; RO RUB OUT - RETURN TO START (KIM)
566 ; ((ALL ILLEGAL CHARS ARE IGNORED))
567 ;
568 ; KEYBOARD COMMANDS:
569 ; ADDR SETS MODE TO MODIFY CELL ADDRESS
570 ; DATA SETS MODE TO MODIFY DATA IN OPEN CELL
571 ; STEP INCREMENTS TO NEXT CELL
572 ; RST SYSTEM RESET
573 ; RUN GOEXEC
574 ; STOP $1C00 CAN BE LOADED INTO NMIV TO
575 ; USE STOP FEATURE
576 ; PC DISPLAY PC
577 ;
578 ; CLOCK IS NOT DISABLED IN SIGMA 1
579 ;
580 ;
581 ;
582 ;
PAGE 16
CARD # LOC CODE CARD
584 *=$1C00
585 ;
586 ;
587 1C00 85 F3 SAVE STA ACC KIM ENTRY VIA STOP (NMI)
588 1C02 68 PLA OR BRK (IRQ)
589 1C03 85 F1 STA PREG
590 1C05 68 PLA KIM ENTRY VIA JSR (A LOST)
591 1C06 85 EF STA PCL
592 1C08 85 FA STA POINTL
593 1C0A 68 PLA
594 1C0B 85 F0 STA PCH
595 1C0D 85 FB STA POINTH
596 1C0F 84 F4 STY YREG
597 1C11 86 F5 STX XREG
598 1C13 BA TSX
599 1C14 86 F2 STX SPUSER
600 1C16 20 88 1E JSR INITS
601 1C19 4C 4F 1C JMP START
602 ;
603 1C1C 6C FA 17 NMIT JMP (NMIV) NON-MASKABLE INTERRUPT TRAP
604 1C1F 6C FE 17 IRQT JMP (IRQV) INTERRUPT TRAP
605 ;
606 1C22 A2 FF RST LDX #$FF KIM ENTRY VIA RST
607 1C24 9A TXS
608 1C25 86 F2 STX SPUSER
609 1C27 20 88 1E JSR INITS
610 ;
611 ;
612 1C2A A9 FF LDA #$FF COUNT START BIT
613 1C2C 8D F3 17 STA CNTH30 ZERO CNTH30
614 1C2F A9 01 LDA #$01 MASK HI ORDER BITS
615 1C31 2C 40 17 DET1 BIT SAD TEST
616 1C34 D0 19 BNE START KEYBD SSW TEST
617 1C36 30 F9 BMI DET1 START BIT TEST
618 1C38 A9 FC LDA #$FC
619 1C3A 18 DET3 CLC THIS LOOP COUNTS
620 1C3B 69 01 ADC #$01 THE START BIT TIME
621 1C3D 90 03 BCC DET2
622 1C3F EE F3 17 INC CNTH30
623 1C42 AC 40 17 DET2 LDY SAD CHECK FOR END OF START BIT
624 1C45 10 F3 BPL DET3
625 1C47 8D F2 17 STA CNTL30
626 1C4A A2 08 LDX #$08
627 1C4C 20 6A 1E JSR GET5 GET REST OF THE CHAR, TEST CHAR
628 ;
629 ;
630 ;
631 ;
632 ;
633 ;
634 ; MAKE TTY/KB SELECTION
635 ;
PAGE 17
CARD # LOC CODE CARD
636 1C4F 20 8C 1E START JSR INIT1
637 1C52 A9 01 LDA #$01
638 1C54 2C 40 17 BIT SAD
639 1C57 D0 1E BNE TTYKB
640 1C59 20 2F 1E JSR CRLF PRT CR LF
641 1C5C A2 0A LDX #$0A TYPE OUT KIM
642 1C5E 20 31 1E JSR PRTST
643 1C61 4C AF 1D JMP SHOW1
644 ;
645 1C64 A9 00 CLEAR LDA #$00
646 1C66 85 F8 STA INL CLEAR INPUT BUFFER
647 1C68 85 F9 STA INH
648 1C6A 20 5A 1E READ JSR GETCH GET CHAR
649 1C6D C9 01 CMP #$01
650 1C6F F0 06 BEQ TTYKB
651 1C71 20 AC 1F JSR PACK
652 1C74 4C DB 1D JMP SCAN
653 ;
654 ; MAIN ROUTINE FOR KEY BOARD
655 ; AND DISPLAY
656 ;
657 1C77 20 19 1F TTYKB JSR SCAND IF A=0 NO KEY
658 1C7A D0 D3 BNE START
659 1C7C A9 01 TTYKB1 LDA #$01
660 1C7E 2C 40 17 BIT SAD
661 1C81 F0 CC BEQ START
662 1C83 20 19 1F JSR SCAND
663 1C86 F0 F4 BEQ TTYKB1
664 1C88 20 19 1F JSR SCAND
665 1C8B F0 EF BEQ TTYKB1
666 ;
667 1C8D 20 6A 1F GETK JSR GETKEY
668 1C90 C9 15 CMP #$15
669 1C92 10 BB BPL START
670 1C94 C9 14 CMP #$14
671 1C96 F0 44 BEQ PCCMD DISPLAY PC
672 1C98 C9 10 CMP #$10 ADDR MODE=1
673 1C9A F0 2C BEQ ADDRM
674 1C9C C9 11 CMP #$11 DATA MODE=1
675 1C9E F0 2C BEQ DATAM
676 1CA0 C9 12 CMP #$12 STEP
677 1CA2 F0 2F BEQ STEP
678 1CA4 C9 13 CMP #$13 RUN
679 1CA6 F0 31 BEQ GOV
680 1CA8 0A DATA ASL A SHIFT CHAR INTO HIGH
681 1CA9 0A ASL A ORDER NIBBLE
682 1CAA 0A ASL A
683 1CAB 0A ASL A
684 1CAC 85 FC STA TEMP STORE IN TEMP
685 1CAE A2 04 LDX #$04
686 1CB0 A4 FF DATA1 LDY MODE TEST MODE 1=ADDR
687 1CB2 D0 0A BNE ADDR MODE=0 DATA
PAGE 18
CARD # LOC CODE CARD
688 1CB4 B1 FA LDA (POINTL),Y GET DATA
689 1CB6 06 FC ASL TEMP SHIFT CHAR
690 1CB8 2A ROL A SHIFT DATA
691 1CB9 91 FA STA (POINTL),Y STORE OUT DATA
692 1CBB 4C C3 1C JMP DATA2
693 ;
694 1CBE 0A ADDR ASL A SHIFT CHAR
695 1CBF 26 FA ROL POINTL SHIFT ADDR
696 1CC1 26 FB ROL POINTH SHIFT ADDR HI
697 1CC3 CA DATA2 DEX
698 1CC4 D0 EA BNE DATA1 DO 4 TIMES
699 1CC6 F0 08 BEQ DATAM2 EXIT HERE
700 ;
701 1CC8 A9 01 ADDRM LDA #$01
702 1CCA D0 02 BNE DATAM1
703 ;
704 1CCC A9 00 DATAM LDA #$00
705 1CCE 85 FF DATAM1 STA MODE
706 1CD0 4C 4F 1C DATAM2 JMP START
707 ;
708 1CD3 20 63 1F STEP JSR INCPT
709 1CD6 4C 4F 1C JMP START
710 ;
711 1CD9 4C C8 1D GOV JMP GOEXEC
712 ;
713 ;
714 ; DISPLAY PC BY MOVING
715 ; PC TO POINT
716 ;
717 1CDC A5 EF PCCMD LDA PCL
718 1CDE 85 FA STA POINTL
719 1CE0 A5 F0 LDA PCH
720 1CE2 85 FB STA POINTH
721 1CE4 4C 4F 1C JMP START
722 ;
723 ; LOAD PAPER TAPE FROM TTY
724 ;
725 1CE7 20 5A 1E LOAD JSR GETCH LOOK FOR FIRST CHAR
726 1CEA C9 3B CMP #$3B SMICOLON
727 1CEC D0 F9 BNE LOAD
728 1CEE A9 00 LDA #$00
729 1CF0 85 F7 STA CHKSUM
730 1CF2 85 F6 STA CHKHI
731 ;
732 1CF4 20 9D 1F JSR GETBYT GET BYTE CNT
733 1CF7 AA TAX SAVE IN X INDEX
734 1CF8 20 91 1F JSR CHK COMPUTE CHKSUM
735 ;
736 1CFB 20 9D 1F JSR GETBYT GET ADDRESS HI
737 1CFE 85 FB STA POINTH
738 1D00 20 91 1F JSR CHK
739 1D03 20 9D 1F JSR GETBYT GET ADDRESS LO
PAGE 19
CARD # LOC CODE CARD
740 1D06 85 FA STA POINTL
741 1D08 20 91 1F JSR CHK
742 ;
743 1D0B 8A TXA IF CNT=0 DONT
744 1D0C F0 0F BEQ LOAD3 GET ANY DATA
745 ;
746 1D0E 20 9D 1F LOAD2 JSR GETBYT GET DATA
747 1D11 91 FA STA (POINTL),Y STORE DATA
748 1D13 20 91 1F JSR CHK
749 1D16 20 63 1F JSR INCPT NEXT ADDRESS
750 1D19 CA DEX
751 1D1A D0 F2 BNE LOAD2
752 1D1C E8 INX X=1 DATA RECORD
753 ; X=0 LAST RECORD
754 1D1D 20 9D 1F LOAD3 JSR GETBYT COMPARE CHKSUM
755 1D20 C5 F6 CMP CHKHI
756 1D22 D0 17 BNE LOADE1
757 1D24 20 9D 1F JSR GETBYT
758 1D27 C5 F7 CMP CHKSUM
759 1D29 D0 13 BNE LOADER
760 ;
761 1D2B 8A TXA X=0 LAST RECORD
762 1D2C D0 B9 BNE LOAD
763 ;
764 1D2E A2 0C LOAD7 LDX #$0C X-OFF KIM
765 1D30 A9 27 LOAD8 LDA #$27
766 1D32 8D 42 17 STA SBD DISABLE DATA IN
767 1D35 20 31 1E JSR PRTST
768 1D38 4C 4F 1C JMP START
769 ;
770 1D3B 20 9D 1F LOADE1 JSR GETBYT DUMMY
771 1D3E A2 11 LOADER LDX #$11 X-OFF ERR KIM
772 1D40 D0 EE BNE LOAD8
773 ;
774 ; DUMP TO TTY
775 ; FROM OPEN CELL ADDRESS
776 ; TO LIMHL,LIMHH
777 ;
778 1D42 A9 00 DUMP LDA #$00
779 1D44 85 F8 STA INL
780 1D46 85 F9 STA INH CLEAR RECORD COUNT
781 1D48 A9 00 DUMP0 LDA #$00
782 1D4A 85 F6 STA CHKHI CLEAR CHKSUM
783 1D4C 85 F7 STA CHKSUM
784 ;
785 1D4E 20 2F 1E JSR CRLF PRINT CR LF
786 1D51 A9 3B LDA #$3B PRINT SEMICOLON
787 1D53 20 A0 1E JSR OUTCH
788 1D56 A5 FA LDA POINTL TEST POINT GT OR ET
789 1D58 CD F7 17 CMP EAL HI LIMIT GOTO EXIT
790 1D5B A5 FB LDA POINTH
791 1D5D ED F8 17 SBC EAH
PAGE 20
CARD # LOC CODE CARD
792 1D60 90 18 BCC DUMP4
793 ;
794 1D62 A9 00 LDA #$00 PRINT LAST RECORD
795 1D64 20 3B 1E JSR PRTBYT 0 BYTES
796 1D67 20 CC 1F JSR OPEN
797 1D6A 20 1E 1E JSR PRTPNT
798 ;
799 1D6D A5 F6 LDA CHKHI PRINT CHKSUM
800 1D6F 20 3B 1E JSR PRTBYT FOR LAST RECORD
801 1D72 A5 F7 LDA CHKSUM
802 1D74 20 3B 1E JSR PRTBYT
803 1D77 4C 64 1C JMP CLEAR
804 ;
805 1D7A A9 18 DUMP4 LDA #$18 PRINT 24 BYTE COUNT
806 1D7C AA TAX SAVE AS INDEX
807 1D7D 20 3B 1E JSR PRTBYT
808 1D80 20 91 1F JSR CHK
809 1D83 20 1E 1E JSR PRTPNT
810 ;
811 1D86 A0 00 DUMP2 LDY #$00 PRINT 24 BYTES
812 1D88 B1 FA LDA (POINTL),Y GET DATA
813 1D8A 20 3B 1E JSR PRTBYT PRINT DATA
814 1D8D 20 91 1F JSR CHK COMPUTE CHKSUM
815 1D90 20 63 1F JSR INCPT INCREMENT POINT
816 1D93 CA DEX
817 1D94 D0 F0 BNE DUMP2
818 ;
819 1D96 A5 F6 LDA CHKHI PRINT CHKSUM
820 1D98 20 3B 1E JSR PRTBYT
821 1D9B A5 F7 LDA CHKSUM
822 1D9D 20 3B 1E JSR PRTBYT
823 1DA0 E6 F8 INC INL INCR RECORD COUNT
824 1DA2 D0 02 BNE DUMP3
825 1DA4 E6 F9 INC INH
826 1DA6 4C 48 1D DUMP3 JMP DUMP0
827 ;
828 1DA9 20 CC 1F SPACE JSR OPEN OPEN NEW CELL
829 1DAC 20 2F 1E SHOW JSR CRLF PRINT CR LF
830 1DAF 20 1E 1E SHOW1 JSR PRTPNT
831 1DB2 20 9E 1E JSR OUTSP PRINT SPACE
832 1DB5 A0 00 LDY #$00 PRINT DATA SPECIFIED
833 1DB7 B1 FA LDA (POINTL),Y BY POINT AD=LDA EXT
834 1DB9 20 3B 1E JSR PRTBYT
835 1DBC 20 9E 1E JSR OUTSP PRINT SPACE
836 1DBF 4C 64 1C JMP CLEAR
837 ;
838 1DC2 20 63 1F RTRN JSR INCPT OPEN NEXT CELL
839 1DC5 4C AC 1D JMP SHOW
840 ;
841 1DC8 A6 F2 GOEXEC LDX SPUSER
842 1DCA 9A TXS
843 1DCB A5 FB LDA POINTH PROGRAM RUNS FROM
PAGE 21
CARD # LOC CODE CARD
844 1DCD 48 PHA OPEN CELL ADDRESS
845 1DCE A5 FA LDA POINTL
846 1DD0 48 PHA
847 1DD1 A5 F1 LDA PREG
848 1DD3 48 PHA
849 1DD4 A6 F5 LDX XREG RESTORE REGS
850 1DD6 A4 F4 LDY YREG
851 1DD8 A5 F3 LDA ACC
852 1DDA 40 RTI
853 ;
854 1DDB C9 20 SCAN CMP #$20 OPEN CELL
855 1DDD F0 CA BEQ SPACE
856 1DDF C9 7F CMP #$7F RUB OUT (KIM)
857 1DE1 F0 1B BEQ STV
858 1DE3 C9 0D CMP #$0D NEXT CELL
859 1DE5 F0 DB BEQ RTRN
860 1DE7 C9 0A CMP #$0A PREV CELL
861 1DE9 F0 1C BEQ FEED
862 1DEB C9 2E CMP #'. MODIFY CELL
863 1DED F0 26 BEQ MODIFY
864 1DEF C9 47 CMP #'G GO EXEC
865 1DF1 F0 D5 BEQ GOEXEC
866 1DF3 C9 51 CMP #'Q DUMP FROM OPEN CELL TO HI LIMIT
867 1DF5 F0 0A BEQ DUMPV
868 1DF7 C9 4C CMP #'L LOAD TAPE
869 1DF9 F0 09 BEQ LOADV
870 1DFB 4C 6A 1C JMP READ IGNORE ILLEGAL CHAR
871 ;
872 1DFE 4C 4F 1C STV JMP START
873 1E01 4C 42 1D DUMPV JMP DUMP
874 1E04 4C E7 1C LOADV JMP LOAD
875 ;
876 1E07 38 FEED SEC
877 1E08 A5 FA LDA POINTL DEC DOUBLE BYTE
878 1E0A E9 01 SBC #$01 AT POINTL AND POINTH
879 1E0C 85 FA STA POINTL
880 1E0E B0 02 BCS FEED1
881 1E10 C6 FB DEC POINTH
882 1E12 4C AC 1D FEED1 JMP SHOW
883 ;
884 1E15 A0 00 MODIFY LDY #$00 GET CONTENTS OF INPUT BUFF
885 1E17 A5 F8 LDA INL INL AND STORE IN LOC
886 1E19 91 FA STA (POINTL),Y SPECIFIED BY POINT
887 1E1B 4C C2 1D JMP RTRN
888 ;
889 ; END OF MAIN LINE
PAGE 22
CARD # LOC CODE CARD
891 ; SUBROUTINES FOLLOW
892 ;
893 ;
894 ;
895 ; SUB TO PRINT POINTL,POINTH
896 ;
897 1E1E A5 FB PRTPNT LDA POINTH
898 1E20 20 3B 1E JSR PRTBYT
899 1E23 20 91 1F JSR CHK
900 1E26 A5 FA LDA POINTL
901 1E28 20 3B 1E JSR PRTBYT
902 1E2B 20 91 1F JSR CHK
903 1E2E 60 RTS
904 ;
905 ; PRINT STRING OF ASCII CHARS FROM
906 ; TOP+X TO TOP
907 ;
908 1E2F A2 07 CRLF LDX #$07
909 1E31 BD D5 1F PRTST LDA TOP,X
910 1E34 20 A0 1E JSR OUTCH
911 1E37 CA DEX
912 1E38 10 F7 BPL PRTST STOP ON INDEX ZERO
913 1E3A 60 RTS
914 ;
915 ; PRINT 1 HEX BYTE AS TWO ASCII CHAR'S
916 ;
917 1E3B 85 FC PRTBYT STA TEMP
918 1E3D 4A LSR A SHIFT CHAR RIGHT 4 BITS
919 1E3E 4A LSR A
920 1E3F 4A LSR A
921 1E40 4A LSR A
922 1E41 20 4C 1E JSR HEXTA CONVERT TO HEX AND PRINT
923 1E44 A5 FC LDA TEMP GET OTHER HALF
924 1E46 20 4C 1E JSR HEXTA CONVERT TO HEX AND PRINT
925 1E49 A5 FC LDA TEMP RESTORE BYTE IN A AND RETURN
926 1E4B 60 RTS
927 ;
928 1E4C 29 0F HEXTA AND #$0F MASK HI 4 BITS
929 1E4E C9 0A CMP #$0A
930 1E50 18 CLC
931 1E51 30 02 BMI HEXTA1
932 1E53 69 07 ADC #$07 ALPHA HEX
933 1E55 69 30 HEXTA1 ADC #$30 DEC HEX
934 1E57 4C A0 1E JMP OUTCH PRINT CHAR
935 ;
936 ; GET 1 CHAR FROM TTY
937 ; CHAR IN A
938 ; X IS PRESERVED AND Y RETURNED = FF
939 ;
940 1E5A 86 FD GETCH STX TMPX SAVE X REG
941 1E5C A2 08 LDX #$08 SET UP 8-BIT CNT
942 1E5E A9 01 LDA #$01
PAGE 23
CARD # LOC CODE CARD
943 1E60 2C 40 17 GET1 BIT SAD
944 1E63 D0 22 BNE GET6
945 1E65 30 F9 BMI GET1 WAIT FOR START BIT
946 1E67 20 D4 1E JSR DELAY DELAY 1 BIT
947 1E6A 20 EB 1E GET5 JSR DEHALF DELAY 1/2 BIT TIME
948 1E6D AD 40 17 GET2 LDA SAD GET 8 BITS
949 1E70 29 80 AND #$80 MASK OFF LOW ORDER BITS
950 1E72 46 FE LSR CHAR SHIFT RIGHT CHAR
951 1E74 05 FE ORA CHAR
952 1E76 85 FE STA CHAR
953 1E78 20 D4 1E JSR DELAY DELAY 1 BIT TIME
954 1E7B CA DEX
955 1E7C D0 EF BNE GET2 GET NEXT CHAR
956 1E7E 20 EB 1E JSR DEHALF EXIT THIS RTN
957 ;
958 1E81 A6 FD LDX TMPX
959 1E83 A5 FE LDA CHAR
960 1E85 2A ROL A SHIFT OFF PARITY
961 1E86 4A LSR A
962 1E87 60 GET6 RTS
963 ;
964 ; INITIALIZATION FOR SIGMA
965 ;
966 1E88 A2 01 INITS LDX #$01 SET KB MODE TO ADDR
967 1E8A 86 FF STX MODE
968 ;
969 1E8C A2 00 INIT1 LDX #$00
970 1E8E 8E 41 17 STX PADD FOR SIGMA USE SADD
971 1E91 A2 3F LDX #$3F
972 1E93 8E 43 17 STX PBDD FOR SIGMA USE SBDD
973 1E96 A2 07 LDX #$07 ENABLE DATA IN
974 1E98 8E 42 17 STX SBD OUTPUT
975 1E9B D8 CLD
976 1E9C 78 SEI
977 1E9D 60 RTS
978 ;
979 ; PRINT 1 CHAR CHAR IN A
980 ; X IS PRESERVED Y RETURNED = FF
981 ; OUTSP PRINTS 1 SPACE
982 ;
983 1E9E A9 20 OUTSP LDA #$20
984 1EA0 85 FE OUTCH STA CHAR
985 1EA2 86 FD STX TMPX
986 1EA4 20 D4 1E JSR DELAY 10/11 BIT CODE SYNC
987 1EA7 AD 42 17 LDA SBD START BIT
988 1EAA 29 FE AND #$FE
989 1EAC 8D 42 17 STA SBD
990 1EAF 20 D4 1E JSR DELAY
991 1EB2 A2 08 LDX #$08
992 1EB4 AD 42 17 OUT1 LDA SBD DATA BIT
993 1EB7 29 FE AND #$FE
994 1EB9 46 FE LSR CHAR
PAGE 24
CARD # LOC CODE CARD
995 1EBB 69 00 ADC #$00
996 1EBD 8D 42 17 STA SBD
997 1EC0 20 D4 1E JSR DELAY
998 1EC3 CA DEX
999 1EC4 D0 EE BNE OUT1
1000 1EC6 AD 42 17 LDA SBD STOP BIT
1001 1EC9 09 01 ORA #$01
1002 1ECB 8D 42 17 STA SBD
1003 1ECE 20 D4 1E JSR DELAY STOP BIT
1004 1ED1 A6 FD LDX TMPX RESTORE INDEX
1005 1ED3 60 RTS
1006 ;
1007 ; DELAY 1 BIT TIME
1008 ; AS DETERMEND BY DETCPS
1009 ;
1010 1ED4 AD F3 17 DELAY LDA CNTH30 THIS LOOP SIMULATES
1011 1ED7 8D F4 17 STA TIMH DETCPS SECTION AND WILL DELAY
1012 1EDA AD F2 17 LDA CNTL30 1 BIT TIME
1013 1EDD 38 DE2 SEC
1014 1EDE E9 01 DE4 SBC #$01
1015 1EE0 B0 03 BCS DE3
1016 1EE2 CE F4 17 DEC TIMH
1017 1EE5 AC F4 17 DE3 LDY TIMH
1018 1EE8 10 F3 BPL DE2
1019 1EEA 60 RTS
1020 ;
1021 ; DELAY 1/2 BIT TIME
1022 1EEB AD F3 17 DEHALF LDA CNTH30 DOUBLE RIGHT SHIFT OF DELAY
1023 1EEE 8D F4 17 STA TIMH CONSTANT FOR A DIV BY 2
1024 1EF1 AD F2 17 LDA CNTL30
1025 1EF4 4A LSR A
1026 1EF5 4E F4 17 LSR TIMH
1027 1EF8 90 E3 BCC DE2
1028 1EFA 09 80 ORA #$80
1029 1EFC B0 E0 BCS DE4
1030 ;
1031 ; SUB TO DETERMINE IF KEY IS
1032 ; DEPRESSED OR CONDITION OF SSW
1033 ; KEY NOT DEP OR TTY MODE A=0
1034 ; KEY DEP OR KB MODE A NOT ZERO
1035 ;
1036 ;
1037 1EFE A0 03 AK LDY #$03 3 ROWS
1038 1F00 A2 01 LDX #$01 DIGIT 0
1039 ;
1040 1F02 A9 FF ONEKEY LDA #$FF
1041 1F04 8E 42 17 AK1 STX SBD OUTPUT DIGIT
1042 1F07 E8 INX GET NEXT DIGIT
1043 1F08 E8 INX
1044 1F09 2D 40 17 AND SAD INPUT SEGMENTS
1045 1F0C 88 DEY
1046 1F0D D0 F5 BNE AK1
PAGE 25
CARD # LOC CODE CARD
1047 ;
1048 1F0F A0 07 LDY #$07
1049 1F11 8C 42 17 STY SBD
1050 ;
1051 1F14 09 80 ORA #$80
1052 1F16 49 FF EOR #$FF
1053 1F18 60 RTS
1054 ;
1055 ; SUB OUTPUT TO 7-SEGMENT DISPLAY
1056 ;
1057 1F19 A0 00 SCAND LDY #$00 GET DATA SPECIFIED
1058 1F1B B1 FA LDA (POINTL),Y BY POINT
1059 1F1D 85 F9 STA INH SET UP DISPLAY BUFFER
1060 1F1F A9 7F SCANDS LDA #$7F CHANGE SEG
1061 1F21 8D 41 17 STA PADD TO OUTPUT
1062 ;
1063 1F24 A2 09 LDX #$09 INIT DIGIT NUMBER
1064 1F26 A0 03 LDY #$03 OUTPUT 3 BYTES
1065 ;
1066 1F28 B9 F8 00 SCAND1 LDA INL,Y GET BYTE
1067 1F2B 4A LSR A GET MSD
1068 1F2C 4A LSR A
1069 1F2D 4A LSR A
1070 1F2E 4A LSR A
1071 1F2F 20 48 1F JSR CONVD OUTPUT CHAR
1072 1F32 B9 F8 00 LDA INL,Y GET BYTE AGAIN
1073 1F35 29 0F AND #$0F GET LSD
1074 1F37 20 48 1F JSR CONVD OUTPUT CHAR
1075 1F3A 88 DEY SET UP FOR NXT BYTE
1076 1F3B D0 EB BNE SCAND1
1077 1F3D 8E 42 17 STX SBD ALL DIGITS OFF
1078 1F40 A9 00 LDA #$00 CHANGE SEGMENT
1079 1F42 8D 41 17 STA PADD TO INPUTS
1080 1F45 4C FE 1E JMP AK GET ANY KEY
1081 ;
1082 ; CONVERT AND DISPLAY HEX
1083 ; USED BY SCAND ONLY
1084 ;
1085 1F48 84 FC CONVD STY TEMP SAVE Y
1086 1F4A A8 TAY USE CHAR AS INDEX
1087 1F4B B9 E7 1F LDA TABLE,Y LOOKUP CONVERSION
1088 1F4E A0 00 LDY #$00 TURN OFF SEGMENTS
1089 1F50 8C 40 17 STY SAD
1090 1F53 8E 42 17 STX SBD OUTPUT DIGIT ENABLE
1091 1F56 8D 40 17 STA SAD OUT PUT SEGMENTS
1092 ;
1093 1F59 A0 7F LDY #$7F DELAY 500 CYCLES APPROX.
1094 1F5B 88 CONVD1 DEY
1095 1F5C D0 FD BNE CONVD1
1096 ;
1097 1F5E E8 INX GET NEXT DIGIT NUMBER
1098 1F5F E8 INX ADD 2
PAGE 26
CARD # LOC CODE CARD
1099 1F60 A4 FC LDY TEMP RESTORE Y
1100 1F62 60 RTS
1101 ;
1102 ; SUB TO INCREMENT POINT
1103 ;
1104 1F63 E6 FA INCPT INC POINTL
1105 1F65 D0 02 BNE INCPT2
1106 1F67 E6 FB INC POINTH
1107 1F69 60 INCPT2 RTS
1108 ;
1109 ; GET KEY FROM KEY BOARD
1110 ; RETURN WITH A=KEY VALUE
1111 ; GT. 15 THEN ILLEGAL OR NO KEY
1112 ;
1113 ;
1114 1F6A A2 21 GETKEY LDX #$21 START AT DIGIT 0
1115 1F6C A0 01 GETKE5 LDY #$01 GET 1 ROW
1116 1F6E 20 02 1F JSR ONEKEY
1117 1F71 D0 07 BNE KEYIN A=0 NO KEY
1118 1F73 E0 27 CPX #$27 TEST FOR DIGIT 2
1119 1F75 D0 F5 BNE GETKE5
1120 1F77 A9 15 LDA #$15 15=NOKEY
1121 1F79 60 RTS
1122 1F7A A0 FF KEYIN LDY #$FF
1123 1F7C 0A KEYIN1 ASL A SHIFT LEFT
1124 1F7D B0 03 BCS KEYIN2 UNTIL Y=KEY NUM
1125 1F7F C8 INY
1126 1F80 10 FA BPL KEYIN1
1127 1F82 8A KEYIN2 TXA
1128 1F83 29 0F AND #$0F MASK MSD
1129 1F85 4A LSR A DIVIDE BY 2
1130 1F86 AA TAX
1131 1F87 98 TYA
1132 1F88 10 03 BPL KEYIN4
1133 1F8A 18 KEYIN3 CLC
1134 1F8B 69 07 ADC #$07 MULT (X-1) TIMES A
1135 1F8D CA KEYIN4 DEX
1136 1F8E D0 FA BNE KEYIN3
1137 1F90 60 RTS
1138 ;
1139 ; SUB TO COMPUTE CHECK SUM
1140 ;
1141 1F91 18 CHK CLC
1142 1F92 65 F7 ADC CHKSUM
1143 1F94 85 F7 STA CHKSUM
1144 1F96 A5 F6 LDA CHKHI
1145 1F98 69 00 ADC #$00
1146 1F9A 85 F6 STA CHKHI
1147 1F9C 60 RTS
1148 ;
1149 ; GET 2 HEX CHAR'S AND PACK
1150 ; INTO INL AND INH
PAGE 27
CARD # LOC CODE CARD
1151 ; X PRESERVED Y RETURNED = 0
1152 ; NON HEX CHAR WILL BE LOADED AS NEAREST HEX EQU
1153 ;
1154 1F9D 20 5A 1E GETBYT JSR GETCH
1155 1FA0 20 AC 1F JSR PACK
1156 1FA3 20 5A 1E JSR GETCH
1157 1FA6 20 AC 1F JSR PACK
1158 1FA9 A5 F8 LDA INL
1159 1FAB 60 RTS
1160 ;
1161 ; SHIFT CHAR IN A INTO
1162 ; INL AND INH
1163 ;
1164 1FAC C9 30 PACK CMP #$30 CHECK FOR HEX
1165 1FAE 30 1B BMI UPDAT2
1166 1FB0 C9 47 CMP #$47 NOT HEX EXIT
1167 1FB2 10 17 BPL UPDAT2
1168 1FB4 C9 40 CMP #$40 CONVERT TO HEX
1169 1FB6 30 03 BMI UPDATE
1170 1FB8 18 CLC
1171 1FB9 69 09 ADC #$09
1172 1FBB 2A UPDATE ROL A
1173 1FBC 2A ROL A
1174 1FBD 2A ROL A
1175 1FBE 2A ROL A
1176 1FBF A0 04 LDY #$04 SHIFT INTO I/O BUFFER
1177 1FC1 2A UPDAT1 ROL A
1178 1FC2 26 F8 ROL INL
1179 1FC4 26 F9 ROL INH
1180 1FC6 88 DEY
1181 1FC7 D0 F8 BNE UPDAT1
1182 1FC9 A9 00 LDA #$00 A=0 IF HEX NUM
1183 1FCB 60 UPDAT2 RTS
1184 ;
1185 1FCC A5 F8 OPEN LDA INL MOVE I/O BUFFER TO POINT
1186 1FCE 85 FA STA POINTL
1187 1FD0 A5 F9 LDA INH TRANSFER INH- POINTH
1188 1FD2 85 FB STA POINTH
1189 1FD4 60 RTS
1190 ;
1191 ;
1192 ; END OF SUBROUTINES
PAGE 28
CARD # LOC CODE CARD
1194 ;
1195 ; TABLES
1196 ;
1197 1FD5 00 TOP .BYTE $00,$00,$00,$00,$00,$00,$0A,$0D,'MIK'
1197 1FD6 00
1197 1FD7 00
1197 1FD8 00
1197 1FD9 00
1197 1FDA 00
1197 1FDB 0A
1197 1FDC 0D
1197 1FDD 4D 49 4B
1198 1FE0 20 .BYTE ' ',$13,'RRE',' ',$13
1198 1FE1 13
1198 1FE2 52 52 45
1198 1FE5 20
1198 1FE6 13
1199 ;
1200 ; TABLE HEX TO 7 SEGMENT
1201 ; 0 1 2 3 4 5 6 7
1202 1FE7 BF TABLE .BYTE $BF,$86,$DB,$CF,$E6,$ED,$FD,$87
1202 1FE8 86
1202 1FE9 DB
1202 1FEA CF
1202 1FEB E6
1202 1FEC ED
1202 1FED FD
1202 1FEE 87
1203 ; 8 9 A B C D E F
1204 1FEF FF .BYTE $FF,$EF,$F7,$FC,$B9,$DE,$F9,$F1
1204 1FF0 EF
1204 1FF1 F7
1204 1FF2 FC
1204 1FF2 B9
1204 1FF4 DE
1204 1FF5 F9
1204 1FF6 F1
PAGE 29
CARD # LOC CODE CARD
1206 ;
1207 ;
1208 ;
1209 ;
1210 ; INTERRUPT VECTORS
1211 ;
1212 1FF7 *=$1FFA
1213 1FFA 1C 1C NMIENT .WORD NMIT
1214 1FFC 22 1C RSTENT .WORD RST
1215 1FFE 1F 1C IRQENT .WORD IRQT
1269 .END
END OF MOS/TECHNOLOGY 650X ASSEMBLY VERSION 4
NUMBER OF ERRORS = 0, NUMBER OF WARNINGS = 0
SYMBOL TABLE DUMP
SYMBOL VALUE LINE DEFINED CROSS REFERENCES
ACC 00F3 76 587 851
ADDR 1CBE 694 687
ADDRM 1CC8 701 673
AK 1EFE 1037 1080
AK1 1F04 1041 1046
CHAR 00FE 90 950 951 952 959 984 994
CHK 1F91 1141 734 738 741 748 808 814 899 902
CHKH 17E8 97 158 265 289 299 301
CHKHI 00F6 82 730 755 782 799 819 1144 1146
CHKL 17E7 96 156 262 288 297 298
CHKSUM 00F7 83 729 758 783 801 821 1142 1143
CHKT 194C 295 234 237 242 244 256 308
CHT1 1982 336 344
CHT2 198E 341 338
CHT3 1991 342 340
CLEAR 1C64 645 803 836
CLKKT 1747 65 ****
CLKRDI 1747 66 355 361 378 384 498 505
CLKRDT 1746 67 459 471
CLK1T 1744 62 358 364 381 387 501 508
CLK64T 1746 64 461 473
CLK8T 1745 63 ****
CNTH30 17F3 101 613 622 1010 1022
CNTL30 17F2 100 625 1012 1024
CONVD 1F48 1085 1071 1074
CONVD1 1F5B 1094 1095
CRLF 1E2F 908 640 785 829
DATA 1CA8 680 ****
DATAM 1CCC 704 675
DATAM1 1CCE 705 702
DATAM2 1CD0 706 699
DATA1 1CB0 686 698
DATA2 1CC3 697 692
DEHALF 1EEB 1022 947 956
DELAY 1ED4 1010 946 953 986 990 997 1003
DETCPS 1C2A 612 ****
DET1 1C31 615 617
DET2 1C42 623 621
DET3 1C3A 619 624
DE2 1EDD 1013 1018 1027
DE3 1EE5 1017 1015
DE4 1EDE 1014 1029
DUMP 1D42 778 873
DUMPT 1800 121 ****
DUMPT1 1814 131 134
DUMPT2 1833 148 177
DUMPT3 1854 163 166
DUMPT4 1865 173 152
DUMPV 1E01 873 867
DUMP0 1D48 781 826
DUMP1 1D4E 785 ****
DUMP2 1D86 811 817
DUMP3 1DA6 926 824
DUMP4 1D7A 805 792
EAH 17F8 106 151 791
EAL 17F7 105 149 789
FEED 1E07 987 861
FEED1 1E12 882 880
GETBYT 1F9D 1154 732 736 739 746 754 757 770
GETCH 1E5A 940 648 725 1154 1156
GETK 1C8D 667 ****
GETKEY 1F6A 1114 667
GETKE5 1F6C 1115 1119
GET1 1E60 943 945
GET2 1E6D 948 955
GET5 1E6A 947 627
GET6 1E87 962 944
GOEXEC 1DC8 841 711 865
GOV 1CD9 711 679
HEXALP 1FB9 1170 ****
HEXNUM 1FB4 1168 ****
HEXOUT 196F 323 314 316
HEXTA 1E4C 928 922 924
HEXTA1 1E55 933 931
HEX1 1978 928 326
ID 17F9 107 140 224 226
INCPT 1F63 1104 708 749 815 838
INCPT2 1F69 1107 1105
INCVEB 19EA 397 176 258
INCVE1 19F2 400 398
INH 00F9 85 647 760 625 1059 1179 1187
INITS 1E88 966 600 609
INIT1 1E8C 969 636
INL 00F8 84 646 779 823 885 1066 1072 1158 1178 1185
INTVEB 1932 281 123 185
IRQENT 1FFE 1215 ****
IRQP27 1BFE 519 ****
IRQT 1C1F 904 1215
IRQV 17FE 113 604
KEYIN 1F7A 1122 1117
KEYIN1 1F7C 1123 1126
KEYIN2 1F82 1127 1124
KEYIN3 1F8A 1133 1136
KEYIN4 1F8D 1135 1132
LOAD 1CE7 725 727 762 874
LOADER 1D3E 771 759
LOADE1 1D3B 770 756
LOADS 1CEE 728 ****
LOADT 1873 183 231
LOADT4 18B5 216 221
LOADT5 18D7 233 225 228
LOADT6 18EC 241 230
LOADT7 18F8 247 239 259
LOADT8 1915 261 250
LOADT9 1929 270 252 263 266
LOADV 1E04 874 869
LOAD10 192B 271 268
LOAD11 18C2 223 218
LOAD12 190F 258 182
LOAD13 18FA 248 254
LOAD2 1D0E 764 751
LOAD3 1D1D 754 744
LOAD7 1D2E 764 ****
LOAD8 1D30 765 772
MODE 00FF 91 686 705 967
MODIFY 1E15 884 863
NMIENT 1FFA 1213 ****
NMIP27 1BFA 517 ****
NMIT 1C1C 603 1213
NMIV 17FA 111 603
ONE 199E 353 336 339
ONEKEY 1F02 1040 1116
ONE1 19A1 355 356 368
ONE2 19B0 361 362
OPEN 1FCC 1185 796 828
OUTBT 1961 309 141 157 159
OUTBTC 195E 308 144 146 174
OUTCH 1EA0 984 787 910 934
OUTCHT 197A 333 132 138 155 164
OUTSP 1E9E 983 831 835
OUT1 1EB4 992 999
PACK 1FAC 1164 651 1155 1157
PACKT 1A00 413 251 405 407
PACKT1 1A0F 421 418
PACKT2 1A15 426 429
PACKT3 1A22 433 414 416
PADD 1741 59 970 1061 1079
PBDD 1743 61 128 496 972
PCCMD 1CDC 717 671
PCH 00F0 73 594 719
PCL 00EF 72 591 717
PLLCAL 1A6B 493 517 518 519
PLL1 1A75 498 499 511
PLL2 1A84 505 506
POINTH 00FB 87 170 272 595 696 720 737 790 843 881
897 1106 1188
POINTL 00FA 86 169 271 592 688 691 695 718 740 747
788 812 833 845 877 879 886 900 1058
1104 1186
PREG 00F1 74 589 847
PRTBYT 1E3B 917 795 800 802 807 813 820 822 834 898
901
PRTPNT 1E1E 897 797 809 830
PRTST 1E31 909 642 767 912
PRT1 1E3A 913 ****
RDBIT 1A41 457 200 441 458
RDBIT2 1A53 467 468
RDBIT3 1A50 464 465
RDBIT4 1A63 476 477
RDBYT 19F3 404 223 233 236 241 243 261 264
RDBYT2 19F9 406 ****
RDCHT 1A24 439 209 216 248 404 406
RDCHT1 1A29 441 446
READ 1C6A 648 870
RST 1C22 606 1214
RSTENT 1FFC 1214 ****
RSTP27 1BFC 518 ****
RSTV 17FC 112 ****
RTRN 1DC2 838 859 887
SAD 1740 58 615 623 638 660 943 948 1044 1089 1091
SAH 17F6 104 145 283
SAL 17F5 103 143 281
SAVE 1C00 587 ****
SAVE1 1C05 590 ****
SAVE2 1C0F 596 ****
SAVX 17E9 98 198 201 202 203 204 233 324 345 346
427 430 439 442 443 444 448 451
SBD 1742 60 126 195 360 366 383 389 457 467 494
503 510 766 974 987 989 992 996 1000
1002 1041
1049 1077 1090
SCAN 1DDB 854 652
SCAND 1F19 1057 657 662 664
SCAND1 1F28 1060 ****
SCAND1 1F28 1066 1076
SHOW 1DAC 829 839 882
SHOW1 1DAF 930 643
SPACE 1DA9 828 855
SPUSER 00F2 75 599 608 841
START 1C4F 636 171 273 601 616 658 661 669 706 709
721 768 872
STEP 1CD3 708 677
STV 1DFE 872 857
SYNC 1891 197 211 220
SYNC1 1896 200 206
SYNC2 18AB 209 213
TAB 1871 182 189 191
TABLE 1FE7 1202 1087
TEMP 00FC 88 684 689 917 923 925 1085 1099
TIMH 17F4 102 1011 1016 1017 1023 1026
TMPX 00FD 89 940 958 985 1004
TOP 1FD5 1197 909
TTYKB 1C77 657 639 650
TTYKB1 1C7C 659 663 665
UPDATE 1FBB 1172 1169
UPDAT1 1FC1 1177 1181
UPDAT2 1FCB 1183 1165 1167
VEB 17EC 99 122 148 150 173 184 188 190 192 235
238 257 282 284 286 397 399
XREG 00F5 77 597 849
YREG 00F4 78 596 850
ZRO 19C4 367 341 342
ZRO1 19C7 378 379 391
ZRO2 19D6 384 385
INSTRUCTION COUNT
ADC 13
AND 9
ASL 7
BCC 4
BCS 5
BEQ 26
BIT 12
BMI 9
BNE 44
BPL 15
BRK 0
BVC 0
BVS 0
CLC 8
CLD 1
CLI 0
CLV 0
CMP 38
CPX 1
CPY 0
DEC 2
DEX 14
DEY 8
EOR 2
INC 7
INX 5
INY 2
JMP 31
JSR 115
LDA 108
LDX 29
LDY 25
LSR 22
NOP 0
ORA 6
PHA 5
PHP 0
PLA 5
PLP 0
ROL 18
RTI 1
RTS 28
SBC 5
SEC 3
SED 0
SEI 1
STA 81
STX 14
STY 7
TAX 3
TAY 3
TSX 1
TXA 3
TXS 2
TYA 4
SYMBOLS = 204 (LIMIT = 400) BYTES = 1690 (LIMIT = 4096)
LINES = 1242 (LIMIT = 1500) XREFS = 646 (LIMIT = 900)
TOP 0