Professional Documents
Culture Documents
The First Book of KIM
The First Book of KIM
The First Book of KIM
I
Dedicated to the person who just purchased a KIM-1
and doesn't know what to do with it...
ISBN 0-8104-5119-0
78 79 SO 81 82 83 84 85 86
PRINTING
YEAR
23
114
to help you test your KIM computer to help you test other devices,
such as cassette recorders and to make your KIM a more
powerful machine.
EXPANDING YOUR KIM:
143
guidelines on how to expand your KIM from the basic small-butpowerful KIM-1 system to a huge-and-super-powerful machine;
understanding the jargon; seeing what's available in both hardware
and software.
CONNECTING TO THE WORLD:
155
POTPOURRI:
other useful pieces of information about your KIM system; reference
material, hints, etc.
166
Acknowledgments
Thanks to all who have supported the KIM-1/6502 User Notes, from which
much of this material was taken. A special thanks to Earl Nied for the use
of his KIM-interfaced Selectric.
The KlM-1 microcomputer is manufactured by Commodore/MOS Technology, 950 Rittenhouse Road, Norristown, Pennsylvania 19401. It may be
obtained directly from the manufacturer or from many hobbyist computer
retail stores. At the time of writing, the complete KIM-1 system (less power
supply) sells for $245.
All programs in this book run on the basic KIM-1 system; two require an
audio amplifier.
When you get the hang of it - and it will take time you'll be able to create your own games, diversions, or
useful routines. This section tries to introduce you to
the mechanics of programming, so you can find your own way
at your own speed.
Don't be afraid to use ideas from other parts of this book.
If you like, try changing parts of a program or two and see
what happens. And you can borrow whole sections of coding
from another program if it does something you want.
LOOKING AT MEMORY
This kind of memory - the kind you can put information into
- is called RAM, which stands for Random Access Memory.
Random access means this: you can go to any part of memory
you like, directly, without having to start at the lowest
address and working your way through. Check this by going
straight up to address 0123 and looking at its contents
(key AD 0 1 2 3); then address 0000 (key AD 0 0 0 0), which
should still contain the value 44 that we put there.
Hexadecimal Numbers
Now that you're back at address 0000, let's step through
several locations using the + key. Don't worry about
contents too much. 0001 will still contain your lucky
number, of course, but keep stepping with the + key until
you reach 0009. What will the next address be? Most people
would think that the next number should be 0010, and that
would be correct if KIM used the familiar decimal numbering
scheme. But KIM still has six more digits to go past 9,
because it uses a computer numbering scheme called
Hexadecimal. Hit the + key and you'll see address OOOA come
up.
Don't let the alphabetic confuse you - to KIM, A is just
the digit that comes after 9. And there are more digits to
come. Keep pressing the + button and you'll see that A is
followed by B, C, D, E and F. Finally, after address OOOF,
you'll see address 0010 appear.
MINI-PROGRAM A;
Set
Set
Set
Set
address
address
address
address
17FA
17FB
17FE
17FF
to
to
to
to
00
1C
00
1C
A5
A6
85
86
00
10
11
11
10
START LDA
LDX
STA
STX
BRK
10
11
11
10
address 10 to A
address 11 to X
A to address 11
X to address 10
stop the program
The business end of the program - the part that goes into
the computer - is the group of numbers on the left hand
side. The stuff on the right helps explain what the
program does.
Now check that the program did indeed run correctly bylooking at the contents^ of locations OQIO and CX011.
You'll see that they have been exchanged.
10
How it works
Inside the Central Processor (the heart of the
computer) are several temporary storages called
registers. You can LOAD many of these registers with
the contents of memory; and you can STORE the contents
of the registers into memory. The two registers we are
using here are called A and X.
Step by Step
Let's go through the program a step at a time literally. Maybe you're satisfied that it works. Even
so, follow this procedure. It will show you how to
test any KIM program.
First go back to addresses 0010 and 0011 and put a
couple of brand new numbers there. This will help you
the computer operating.
:tion carefully.
11
12
From this point, find your own way through the last two
instructions. Don't bother about the BRK (Break); it
just stops the program. As the two registers are
stored, you'll want to check that the memory addresses
have been changed as expected.
Summary
The most important things that you've learned about
coding are:
the BRK (code 00) command stops the program;
the SST switch causes a single instruction to be
executed;
the internal registers can be viewed.
BUT YOU MUST SET YOUR VECTORS PROPERLY (see the
A5
85
A6
86
00
10
11
11
10
It didn't work.
START LDA
STA
LDX
STX
BRK
10
11
11
10
store A to 0011
put 0011 into X
store X to 0010
stop
13
MINI-PROGRAM B;
A9
A2
95
CA
10
00
00
09
30
FB
START LDA
LDX
LOOP STA
DEX
BPL
BRK
value 0 into A
#0
19
start X at 9
30, X zero into 0030+X
LOOP
decrease X by 1
back if X positv
stop the program
This program, when you load and run it, will set the
value of the ten locations from 0030 to 0039 to zero.
14
15
16
happen?
When we run the program, the X register will never
change from its starting value of 9 because we don't
have a DEX instruction. So the program will keep
branching back to LOOP forever, and it will never
stop. We've created this situation artificially, of
course, but it could have happened by oversight when we
were writing the program.
17
Set address 0200, SST off, and hit GO. Everything goes
dead. Our program is running but it will never stop.
Meanwhile, the display is dark. This time we know why
it's happening. But if we didn't, how would we solve
it?
18
MINI-PROGRAM C;
Displaying values
A9
85
85
85
20
4C
00
START
FB
FA
F9
IF IF LOOP
08 02
LDA
STA
STA
STA
JSR
JMP
#0
POINTH
POINTL
INK
SCANDS
LOOP
19
zero into A
first 2 digits
next 2 digits
last 2 digits
light up!
do it again
too well on
and it's not
tested and
use SST with
Exercises
1. Can you change the program to make the display show
5555 55?
2. Can you write a program to make the display show
1234 56?
3. How about a program to show the word EFFACE? or
FACADE? or COOCOO?
20
MINI-PROGRAM D;
0200
0201
0203
0205
0207
0209
020C
020F
D8
A9
85
85
85
20
20
4C
START CLD
LDA
STORE STA
STA
STA
IF IF
JSR
6A IF
JSR
JMP
03 02
00
FB
FA
F9
clr dc mode
zero into A
#0
POINTH
POINTL
INK
SCANDS light display
GETKEY test keys
STORE
Exercises
1. Do you think that the instruction at 0201 is really
needed? Try removing it (change 0201 and 0202 to EA)
and see.
2. What values do you get for the alphabetic keys? For
keys like PC and GO? Are there any keys that don't
work with JSR GETKEY?
21
CONCLUSION
22
RECREATIONAL
PROGRAMS
ADDITION
BY JIM BUTTERFIELD
0200
0203
0206
0208
020A
020C
020E
0210
0212
0211*
0216
0218
021A
021C
021E
0220
0222
022ii
0225
0227
0229
022A
022C
022E
0230
0232
023k
0235
0237
0239
023B
023D
023F
021*0
LDX n
24
light display
read keyboard
same as last time?
yes, skip
no, save new key
numeric key?
yes, branch
GO key?
yes, branch
+ key?
no, invalid key
prepare to add
minus 3; 3 digits
display digit
add total
total to display
& to total accum
next digit
last digit?
flag total-in-disnlay
return to start
set flap for
total- in- di SDlay
for 3 digits . . .
clear disnlay
next digit
last digit?
finished, back to go
total-in-display?
no, add new digit
clear t-i-d flag
save key
3 digits to move
02^2
02UU
02U6
02U8
02U9
02UB
02i|C
02l|E
0250
02^2
0253
0255
0257
0259
025A
025C
B5 F9
95 62
9U F9
CA
10 F7
68
OA OA
QA OA
A2 OU
OA
26 F9
26 FA
26 FB
CA
DO F6
FO A2
MOVE
IDA INK, I
STA ACCUM,X
STY INH,X
DEX
BPL MOVE
PLA
PASS ASL A ASL A
ASL A ASL A
LDX #b
SHIFT ASL A
ROL INH
ROL POINTL
ROL POINTH
DEX
BNE SHIFT
BEQ START
xxx::
0200
0210
0220
0230
0240
0250
20
C9
95
A2
A2
A2
IF
13
FC
02
02
04
HEX
IF
FO
95
95
B5
OA
20
18
65
F9
F9
26
6A
C9
E8
CA
95
F9
IF
12
30
10
62
26
C5
DO
F5
FB
94
FA
60
E8
86
30
F9
26
FO
F8
61
C7
CA
FB
F6
18
D8
A4
10
CA
85
A2
10
61
F7
DO
60
FD
D4
DO
68
F6
C9 OA
B5 FC
A9 00
OF E6
OA OA
FO A2
90
75
85
61
OA
25
29
65
61
48
OA
ASTEROID
BY STAN OCKERS
YOU ARE PILOTING YOUR SPACECRAFT BETWEEN MARS AND JUPITER WHEN
YOU ENCOUNTER A DENSE PORTION OF THE ASTEROID BELT. PRESS KEY
ZERO TO MOVE LEFT, THREE TO MOVE RIGHT. WHEN YOUR CRAFT IS HIT
THE DISPLAY WILL GIVE A NUMBER TO INDICATE HOW SUCESSFUL YOU
WERE. THE PROGRAM STARTS AT 0200.
A9
85
85
85
A2
BD
95
020F CA
0210 10
0212 A5
0214 49
0216 85
0218 A2
02 1A 20
. 021D 20
0220 CA
0221 DO
0223 20
0226 20
0229 C9
022B 10
022D C9
022F FO
0231 C9
0233 FO
0235 DO
0237 06
Q239 A9
023B C5
023D DO
023F 46
0241 DO
0243 38
0244 26
0246 DO
0200
0202
0204
0206
0208
020A
020D
00
F9
FA
FB
06
CE 02
E2
LDA
STA
STA
STA
LDX
INIT
F8
TOGG
E8
FF
E8
05
48 02 LITE
97 02
F7
40 IF
6A IF
15
E5
00
06
03
OA
DB
LEFT
E7
40
E7
D3
RT
E7
CF
tt$00
00 F9
OOFA
00 FB
tt$06
...INITIALIZE COUNTER...
...INITIALIZE OOE2-OOE8
LDA 02CE/X
STA OOE2,X
DEX
BPL INIT
LDA OOE8
EOR
STA
LDX
JSR
JSR
DEX
BNE
JSR
JSR
CMP
BPL
CMP
BEQ
#$FF
OOE8
tt$05
DISP
CHEK
LITE
KEYIN
GETKEY
ti$15
TOGG
tt$00
LEFT
...TOGGLE OOE8...
CFLASHER FLAG)
DELAY BETWEEN FLASHES
DISPLAY AND..
CHECK FOR MATCH
CMP tt$03
BEQ RT
BNE TOGG
ASL OOE7
LDA tt$40
CMP OOE7
NO, RETURN
BNE TOGG
SHIFT RIGHT
LSR OOE7
NOT RIGHT SIDE, RETURN
BNE TOGG
OFF EDGE, RETURN TO
SEC
RIGHT SIDE
ROL OOE7
E7
RETURN
BNE TOGG
CA
" DISPLAY SUBROUTINE -""
PORT TO OUTPUT
DISP
LDA tt$7F
0248 A9 7F
STA 1741
024A 8D 41 17
INIT. DIGIT
024D A9 09
LDA tt$09
STA 1742
024F 8D 42 17
BIT POSITION TO
LDA tt$20
0252 A9 20
6TH BIT
STA OOEO
0254 85 EO
3 BYTES
BIT
LDY tt$02
0256 AO 02
ZERO CHARACTER
LDA tt$00
0258 A9 00
STA OOE1
025A 85 El
26
025C
025E
0260
0262
0264
0267
0269
026A
026C
026E
0270
0272
0274
0276
0278
02 7A
027D
027F
0282
0285
0287
0289
028C
028F
0292
0294
0296
Bl
25
FO
A5
19
85
88
10
A5
C4
DO
A4
C4
DO
09
8D
A9
8D
AD
FO
A9
8D
EE
EE
46
DO
60
BYTE
E2
EO
07
El
E4 00
El
GET BYTE
NTH BIT = 1?
NO, SKIP
YES, UPDATE
CHARACTER
FO
El
E8
08
EO
E7
02
08
40
30
06
07
FB
00
40
42
42
EO
CO
NEXT BYTE
CHAR. IN ACCUM.
SHIP ON?
NO, SKIP
IS THIS SHIP
DIGIT?
NO, SKIP
ADD IN SHIP
LIGHT DIGIT
DELAY (DIGIT ON)
0297
0299
029B
029D
029F
02AO
02A1
02 A3
02A4
02A5
02A7
02A9
02AB
02 AC
02AE
02AF
02BO
02B1
02B3
02B5
02B7
02B9
02BB
02BD
02BF
02C1
C6
DO
A9
85
8A
48
A2
F8
38
B5
69
95
E8
DO
D8
68
AA
E6
A5
C9
FO
AO
A5
31
DO
60
E9
1A
30
E9
FD
FC
00
FC
F7
E2
E2
30
09
00
E7
E2
07
17
17
17
17
17
17
IDA (OOE2),Y
AND OOEO
BEQ NOBT
LDA OOE1
ORA OOE4,Y
STA OOE1
DEY
BPL BYTE
LDA OOE1
CPY OOE8
BNE DIGT
LDY OOEO
CPY OOE7
BNE DIGT
ORA tt$08
DIGT
STA 1740
LDA tt$30
STA 1706
DELA
LDA 1707
BEQ DELA
LDA tt$00
STA 1740
INC 1742
INC 1742
LSR OOEO
BNE BIT
RTS
""" CHECK SUbKUUiiiNt "
CHEK
DEC OOE9
BNE MORE
LDA tt$20
STA OOE9
TXA
PHA
LDX #$FD
SED
SEC
NXTB
LDA OOFC,X
ADC tt$00
STA OOFC,X
I NX
BNE NXTB
CLD
PLA
TAX
INC OOE2
LDA OOE2
MORE
CMP #$30
BEQ RECY
MATCH
LDY tt$00
LDA OOE7
AND OOE2,Y
BNE FIN
RTS
27
TIME UP?
NO
TURN OFF SEGMENTS
SHIFT TO NEXT DIGIT
SHIFT TO NEXT BIT
MORE BITS
RECY
00
E2
Fl
IF IF FIN
C8 02
02C2
02C4
02C6
02C8
02CB
A9
85
FO
20
ifC
02CE
02CF
02DO
02D1
02D2
02D3
02D4
D5
02
08
40
01
04
FF
LDA
STA
BEQ
JSR
JMP
#$00
OOE2
MATCH
SCANDS
FIN
02D502E502F50305-
00
16
2E
10
00 04 00 08 00 06 12 00 11 00 05 00 2C 00
29 00 16 00 2B 00 26 00 19 00 17 00 38 00
09 00 IB 00 24 00 15 00 39 00 OD 00 21 00
00
00
00
00
00
:
{
:
{:
:
pO,
0200021002200230^
02400250026002700280029002AO02BO02CO02DO02EO02FO0300-
A9
10
CA
06
E7
42
FO
DO
06
42
48
AA
07
08
00
00
00
.
00
F8
DO
C9
DO
17
07
08
17
17
A2
E6
60
40
05
17
OD
-7
85
A5
F7
03
CF
A9
A5
A4
AD
46
FD
E2
A9
01
00
00
00
F9
E8
20
FO
38
20
El
EO
07
EO
F8
A5
00
04
2C
38
21
85
49
40
OA
26
85
19
C4
17
DO
38
E2
85
FF
00
00
00
FA
FF
IF
DO
E7
EO
E4
E7
FO
CO
B5
C9
E2
00
16
2E
10
85
85
20
DB
DO
AO
00
DO
FB
60
FC
30
FO
00
00
00
00
1 A
FB A2 06
E8 A2 05
6A IF C9
06 E7 A9
CA A9 7F
02 A9 00
85 El 88
02 09 08
A9 00 8D
C6 E9 DO
69 00 95
FO 09 AO
Fl 20 IF
00 04 00
29 00 16
09 00 IB
00 , ~
BD
20
15
40
8D
85
10
8D
CE
48
10
C5
41
El
FO
40
40
1A
FC
00
IF
08
00
00
17
A9
E8
A5
4C
00
2B
24
c O
02
02
E5
E7
17
Bl
A5
17
EE
30
DO
E7
C8
06
00
00
95
20
C9
DO
A9
E2
El
A9
42
85
F7
31
02
12
26
15
^T
E2
97
00
D3
09
25
C4
30
17
E9
D8
E2
D5
00
00
00
CA
02
FO
46
8D
EO
E8
8D
EE
8A
68
DO
02
11
19
39
CHANGES YOU CAN MAKE YOUR OWN ASTEROID FIELD STARTING AT 02D5. THE
GROUP COUNT, C02B6), WILL HAVE TO BE CHANGED IF THE FIELD SIZE
DIFFERS. THE SPEED OF THE CRAFT MOVING THROUGH THE FIELD IS
CONTROLLED BY 027E.'' WHAT ABOUT A VARYING SPEED, SLOW AT FIRST
AND SPEEDING UP AS YOU GET INTO THE FIELD? WHAT ABOUT A FINAL
"DESTINATION COUNT" AND A SIGNAL TO INDICATE YOU HAVE REACHED
YOUR DESTINATION? HOW ABOUT ALLOWING A HIT OR TWO BEFORE YOU
ARE FINALLY DISABLED?
28
BAGELS
BY JIM BUTTERFIELD
DIRECTIONS THE COMPUTER HAS CHOSEN FOUR LETTERS, ALL OF WHICH ARE
A,B,C,D,E, OR F.
LETTERS MAY BE REPEATED - FOR EXAMPLE,
THE COMPUTER'S "SECRET" COMBINATION MIGHT BE CACF OR BBBB.
YOU GET TEN GUESSES. EACH TIME YOU GUESS, THE COMPUTER
WILL TELL YOU TWO THINGS: HOW MANY LETTERS ARE EXACTLY CORRECT
(THE RIGHT LETTER IN THE RIGHT PLACE); AND HOW MANY LETTERS
ARE CORRECT, BUT IN THE WRONG POSITION.
FOR EXAMPLE, IF THE COMPUTER'S SECRET COMBINATION IS
CBFB AND YOU GUESS BAFD, THE TWO NUMBERS WILL BE 1 AND 1
(THE F MATCHES EXACTLY; THE B MATCHES BUT IN THE WRONG PLACE).
THESE NUMBERS WILL SHOW ON THE RIGHT HAND SIDE OF THE DISPLAY;
THE CODE YOU ENTERED WILL APPEAR ON THE LEFT.
MAKE A NOTE OF YOUR GUESSES AND THE COMPUTER'S RESPONSE.
WITH A LITTLE MENTAL WORK, YOU SHOULD BE ABLE TO BREAK THE
CODE EXACTLY IN SEVEN OR EIGHT WORDS. A CORRECT GUESS WILL
PRODUCE A RESPONSE OF if - 0.
IF YOU DON'T GUESS RIGHT IN
TEN MOVES, THE-COMPUTER WILL GIVE YOU THE ANSWER.
AFTER A CORRECT GUESS, OR AFTER THE COMPUTER TELLS YOU
THE ANSWER, IT WILL START A NEW GAME (WITH A NEW SECRET CODE)
THE INSTANT YOU TOUCH A NEW KEY.
0200 E6 16
GO
0202 20 40 IF
0205 DO F9
020? D8
0208 A9 OA
NEW
020A 85 18
020C A9 03
020E 85 10
0210 38
RAND
0211 A5 13
0213 65 16
0215 65 1?
0217 85 12
0219 A2 04
021B B5 12
RLP
021D 95 13
021F CA
0220 10 F9
0222 A6 10
0224 AO CO
0226 84 11
0228 AO 06
022A C5 11
SET
022C 90 02
022E E5 11
0230 46 11
PASS
0232 88
0233 DO F5
0235 18
0236 69 OA
INC RND+4
randomize
JSR KEYIN
on pushbutton delay
BNE GO
CLD
LDA #$OA
ten guesses/game
STA COUNT new game starting
LDA #3
create 4 mystery codes
STA POINTR
SEC
one plus ...
LDA RND+1 . . . three previous
ADC RND+4
random numbers
ADC RND+5
STA RND
=new random value
LDX #4
LDA RND,X move random numbers over
STA RND+1, X
DEX
BPL RLP
LDX POINTR
LDY #$CO
divide by 6
STY MOD
keeping remainder
LDY #6
CMP MOD
BCC PASS
SBC MOD
LSR MOD
DEY
BNE SET
continue division
CLC
ADC #$OA
random value A to F
29
0238
023A
023C
023E
0240
02*4-2
0244
95
C6
10
C6
30
A9
A2
00
10
D2
18
7A
00
OC
0246 95 04
GUESS
WIPE
0248 CA
0249 10 FB
STA
DEC
BPL
DEC
BMI
LDA
LDX
STA
DEX
BPL
SECRET, X
POINTR
RAND
COUNT new guess starts here
FINISH ten guesses?
#0
#$OC
clear from WINDOW. . .
WINDOW, X
...to POINTR
WIPE
';
024B
024E
0250
0253
0255
025?
0259
025B
025D
025F
0261
0264
0266
0268
026A
026C
026D
026F
0271
20
FO
20
FO
A5
FO
29
49
FO
DO
20
C9
BO
09
90
A8
A6
E6
B9
0274 95
0276 98
0277 D5
0279 DO
027B E6
027D 8A
027E 95
0280 A5
0282 FO
0284 AO
0286 B9
0289 29
028B FO
028D B9
0290 A2
0292 D5
0294 FO
0296 CA
0297 10
0299 30
029B E6
029D 16
029F 88
02AO 10
CE 02 WAIT
JSR SHOW
FB
BEQ WAIT
CE 02
JSR SHOW
F6
BEQ WAIT
debounce key
08
LDA WINDOW+4
new guess?
08
BEQ RESUME
no, input digit
AND #$60
60
60
EOR #$60
previous game finished?
A9
BEQ NEW
...yes, new game;
DD
BNE GUESS ...no, next guess
6A IF RESUME JSR GETKEY
10
CMP #$10
guess must be in
E3
BCS WAIT
range A to F
OA
CMP #$OA
DF
BCC WAIT
TAY
10
LDX POINTR zero to start
10
INC POINTR
E7 IF
LDA TABLE, Y
segment pattern
STA WINDOW, X
04
TYA
00
CMP SECRET, X exact match?
BNE NOTEX
03
INC EXACT
OE
TXA
NOTEX
OA
07
31
03
oA 00 STEP
18
12
00 00
03
LOOK
OA
05
F9
04
OF
OA
LDA
BEQ
LDY
LDA
AND
BEQ
LDA SECRET, Y
LDX
CMP
BEQ
DEX
BPL
#3
INPUT, X
GOT
if not, test
...against input
LOOK
BMI ON
GOT
ON
E4
destroy input
STA INPUT, X
02A2
02A4
02A6
02A9
02AB
02AC
02AE
02B1
02B3
02B5
02B8
02BA
A2 01
B4 GE
TRANS
B9 E7 IF
95
CA
10
20
E6
DO
20
DO
FO
08
F6
CE 02 DELAY
OF
F9
CE 02 BUTT
FB
8F
J
!
FINISH
02BC A2 03
02BE B4 00
FIN2
02CO B9 E7 IF
02C3 95 04
0205 CA
02C6 10 F6
0208 A9 E3
02CA 85 08
02CC DO EO
LDX
LDY
LDA
STA
DEX
BPL
JSR
INC
BNE
JSR
BNE
BEQ
display counts
#1
EXACT, X
TABLE, Y
WINDOW+4.X
TRANS
SHOW
MATCH
DELAY
SHOW
BUTT
WAIT
#3
SECRET, X
TABLE , Y
WINDOW, X
FIN2
#$e3
'square ' flag
WINDOW+4
DELAY
unconditional jimp
SUBROUTINE TO DISPLAY
AND TEST KEYBOARD
02CE
02DO
02D2
02D4
02D7
02D9
02DC
02DF
02E1
02E3
02E4
02E5
02E6
02E8
02EB
AO
A2
A9
8D
B5
8D
80
E6
DO
88
88
CA
10
20
60
13
SHOW
05
7F
41 17
04
LITE
40 17
42 17
11
POZ
FC
EF
40 IF
LDY
LDX
LDA
STA
LDA
STA
STY
#$13
#5
#$7F
PADD
WINDOW, X
SAD
SBD
INC
BNE
DEY
DEY
DEX
BPL
JSR
RTS
END
MOD
POZ
pause loop
LITE
KEYIN
Program notes t
1. Program enforces a pause of about 4 seconds after
displaying counts or answer.
This guards against
display being 'missed1 due to bounce, hasty keying.
2. After count displayed, or at end of game(s), user
can blank display, if desired, by pressing GO or
any numeric key. Game operation is not affected,
but user may feel it 'separates' games better.
31
KEYIN
GETKEY
TABLE
PADD
SBD
SAD
=551F^O
=:;iF6A
={>1FE7
=!517*H
=5 517^-2
=J51740
0000
0004
OOOA
OOOE
OOOF
0010
0011
0012
0018
WORK AREAS
SECRET
WINDOW
INPUT
EXACT
MATCH
POINTR
MOD
RND
COUNT
*=*+^
*=*+6
*=*+4
#=*+!
*=*+!
*=*+!
*=*+!
*=*+6
*=*+!
0200
0210
0220
0230
0240
0250
0260
0270
0280
0290
02AO
02BO
02CO
02DO
02EO
E6
38
10
46
30
20
DD
10
A5
A2
10
02
B9
A2
11
16
A5
F9
11
7A
CE
20
B9
07
03
E4
E6
E7
05
DO
20
13
A6
88
A9
02
6A
E7
FO
D5
A2
OF
IF
A9
FC
40
65
10
DO
00
FO
IF
IF
31
OA
01
DO
95
7F
88
IF
16
AO
F5
A2
F6
C9
95
AO
FO
B4
F9
04
8D
88
DO
65
CO
18
OC
A5
10
04
03
05
OE
20
CA
41
CA
F9
17
84
69
95
08
BO
98
B9
CA
B9
CE
10
17
10
D8
85
11
OA
04
FO
E3
D5
OA
10
E7
02
F6
B5
EF
32
A9
12
AO
95
CA
08
C9
00
00
F9
IF
DO
A9
04
20
OA
A2
06
00
10
29
OA
DO
29
85
04
C5
C6
FB
60
90
03
18
30
95
FB
E3
8D
40
04
08
FO
85
40
IF
18
B5
11
10
20
49
DF
E6
FO
E6
CA
8F
08
17
60
A9
12
90
10
CE
60
A8
OE
12
OF
10
A2
DO
8C
03
95
02
D2
02
FO
A6
8A
B9
16
F6
03
EO
42
85
13
E5
C6
FO
A9
10
95
00
OA
20
B4
AO
17
10
CA
11
18
FB
DO
E6
OA
00
88
CE
00
13
E6
BUTT
COUNT
DELAY
EXACT
FIN2
FINISH
GETKEY
GO
GOT
GUESS
INPUT
KEYIN
LITE
LOOK
MATCH
MOD
NEW
NOTEX
ON
PADD
PASS
POINTR
POZ
RAND
RESUME
RLP
RND
SAD
SBD
SECRET
SET
SHOW
STEP
TABLE
TRANS
WAIT
WIPE
WINDOW
0282
020A
02B3
027B
02C6
0240
0261
0205
0294
025F
027E
0202
02E6
0297
029B
0226
025D
0279
0299
02D4
022C
020E
02E1
023C
0257
0220
0200
02D9
02DC
0238
0233
024B
02AO
0271
02 AC
024B
0249
0246
02B8
023E
02CC
02A4
02B1
022A 022E 0230 02DF
02A6 02CO
0253 0266 026A 02BA
33
BANDIT
JIM BUTTERFIELD
Start the program at 0200 and on the right, you'll see the $25
that KIM has given you to play with. The funny symbols on the
left are your "wheels" - hit any key and see them spin.
Every time you spin the wheels by hitting a key it costs you $1.
When the wheels stop, you might have a winning combination,
in which case you'll see money being added to your total
on the right. Most of the time, you'll get nothing ...
but that's the luck of the game.
-77V
-i J J
MICRO-WARE ASSEMBLER 65XX-1.0 PAGE 01
BANDIT
0010:
0020:
0030:
0040:
0050:
0060:
0070:
0080:
0090:
0100:
0110:
0120:
0130:
0140:
0150:
0160:
0170:
0180:
0190:
0200:
***ftft*ftftft**ftft***X**
02D1
02D1
02D1
02D1
02D1
02D1
WINDOW
AMT
ARROW
RWD
STALLA
TUMBLE
$0000
$0005
$0006
$0007
$0008
$0009
DISPLAY WINDOW
CASH CACHE
REWARD
WAIT WHILE
LINKAGES TO KIM
02D1
02D1
02D1
02D1
02D1
KEYIN
PADD
SAD
SBD
TABLE
34
$1F40
$1741
$1740
$1742
$1FE7
IS KEY DEPRESSED?
HEX:7 SEG
0210:
0220:
0230:
0240:
0250:
0260:
0270:
0280:
0290:
0300:
0310:
0320:
0330:
0340:
0350:
0360:
0370:
0380:
0390:
0400:
0410:
0420:
0430:
0440:
0450:
0460:
0470:
0480:
0490:
0500:
0510:
0520:
0530:
0540:
0550:
0560:
0570:
0580:
0590:
0600:
0610:
0620:
0630:
0640:
0650:
0660:
0670:
0680:
0690:
0700:
0710:
0720:
0730:
0740:
0750:
0760:
0770:
0780:
0790:
MAIN PROGRAM
0200
0200
0202
0204
0207
0209
A9
85
20
A9
85
25
05
BA 02
00
06
BANDIT ORG
GO
LDAIM
STA
JSR
LDAIM
STA
$0200
$25
AMT
CVAMT
$00
ARROW
020B
020E
0210
0212
0215
20
DO
E6
20
FO
0217
0219
021B
02 1C
02 1D
021F
0221
0223
0226
A9 03
85 06
F8
38
A5
E9
85
20
26
BA 02
09
0228
022B
022D
022F
0231
0233
0235
20
C6
DO
A6
A5
29
09
8D 02
08
F9
06
09
06
40
0237
0239
023B
023D
023F
95
46
46
C6
DO
01
09
09
06
E7
8D 02
FB
09
8D 02
F9
LPA
ROLL
05
01
05
LPB
JSR
BNE
INC
JSR
BEQ
DISPLY
LPA
TUMBLE
DISPLY
ROLL
DISPLAY UNTIL
[GO] IS RELEASED.
RANDOMIZ E TUMBLE.
DISPLAY UNTIL
A KEY IS HIT.
LDAIM
STA
SED
SEC
LDA
SBCIM
STA
JSR
ROL
$03
ARROW
AMT
$01
CHARGE ONE BUCK.
AMT
CVAMT CONVERT FOR LED.
TUMBLE
JSR
DEC
BNE
LDX
LDA
ANDIM
ORAIM
DISPLY
STALLA DISPLAY A WHILE.
LPB
ARROW
TUMBLE
MAKE A
$06
RESULT
$40
STAAX
LSR
LSR
DEC
BNE
WINDOW +01
TUMBLE
TUMBLE DO ALL
ARROW 3 WINDOWS.
LPB
A5
C5
DO
C5
DO
A2
C9
FO
A2
C9
FO
A2
C9
FO
CA
04
03
37
02
33
10
40
OD
OB
42
07
06
44
01
LDA
CMP
BNE
CMP
BNE
LDXIM
CMPIM
BEQ
LDXIM
CMPIM
BEQ
LDXIM
CMPIM
BEQ
DEX
35
WINDOW
WINDOW
NOMAT
WINDOW
NOMAT
$10
$40
PAY
$08
$42
PAY
$06
$44
PAY
+04
+03
CHECK FOR
A MATCH.
+02
PAY $15 FOR 3 BARS
PAY $10 FOR 3 UPS
^0800:
0810:
0820:
0830:
0840:
0850:
0860:
0870:
0880:
0890:
0900:
0910:
0920:
0930:
0940:
0950:
0960:
0970:
0980:
0990:
1000:
1010:
A WIN! ! ! PAY
AMOUNT IN X
86
A9
85
20
C6
DO
C6
FO
18
F8
0271 A5
0273 69
0275 BO
0277 85
0279 20
027C DO
025E
0260
0262
0264
0267
0269
026B
026D
026F
0270
1020: 027E
1030: 0280
1040: 0282
1050: 0284
1060: 0287
1070: 0289
1080: 028B
1090:
1100:
1110:
1120:
1130:
1140:
1150: 028D
1160: 028F
1170: 0291
1180: 0293
1190: 0294
1200: 0296
1210: 0298
1220: 029B
1230: 029D
1240: 029F
1250: 02A1
1260: 02A4
1 270 : 02A7
1 280 : 02A8
1 290 : 02AA
1300: 02AC
1310: 02AE
1320: 02B1
1330: 02B2
07
80
08
8D 02
08
F9
07
9C
PAY
PAX
LPC
05
01
94
05
BA 02
E2
STX
LDAIM
STA
JSR
DEC
BNE
DEC
BEQ
CLC
SED
LDA
ADCIM
BCS
STA
JSR
BNE
RWD
HIDE REWARD
$80
STALLA
DISPLAY
DISPLY
FOR A HALF
STALLA
LPC
A WHILE.
RWD
LPA
SLOWLY ADD
THE PAYOFF
TO THE AM'T.
AMT
$01
LPA
AMT
CVAMT
PAX
A2
C9
FO
20
A5
DO
FO
03
46
DA
8D 02
05
80
F7
NOMAT
LOK
LDXIM
CMPIM
BEQ
JSR
LDA
BNE
BEQ
$03
$46
A CHERRY?
PAY
DISPLY
CAN'T PLAY
AMT
WITH NO DOUGH!
LPA
LOK
DISPLAY SUBROUTINE
A6
10
F6
CA
10
A9
8D
AO
A2
B5
8C
8D
D8
A9
E9
DO
8D
C8
C8
06
02
02
FB
7F
41 17
OB
04
00
42 17
40 17
7F
01
FC
42 17
DISPLY LDX
BPL
OVER
INCAX
INDIS DEX
BPL
LDAIM
STA
LDYIM
LDXIM
LITE
LDAAX
STY
STA
CLD
LDAIM
ZIP
SBCIM
BNE
STA
INY
INY
36
ARROW
INDIS
ROLL
WINDOW +02 THE DRUM
OVER
$7F
PADD
$08
$04
WINDOW LIGHT
SBD
SAD
$7F
$01
ZIP
SBD
ALL THE
WINDOWS
1 340:
1 350:
1 360:
1 370:
1 380:
1 390:
1 400:
1 410:
1 420:
1 430:
1 440:
1 450:
1 460:
1 470:
1 480:
1 490:
1 500:
1 510:
1 520:
1 530:
1 540:
02B3
02B4
02B6
02B9
CA
10 E9
20 40 1F
60
DEX
BPL
JSR
RTS
LITE
KEYIN
AMOUNT CONVERSION
02BA
02BC
02BE
02BF
02C2
02C4
02C6
02C7
02C8
02C9
02CA
02CB
02CE
02DO
SYMBOL
AMI
DISPLY
LITE
LPC
PAX
SAD
TUMBLE
A5
29
AA
BD
85
A5
4A
4A
4A
4A
AA
BD
85
60
05
OF
E7 1F
00
05
E7 1F
01
CVAMT
LDA
ANDIM
TAX
LDAAX
STA
LDA
LSRA
LSRA
LSRA
LSRA
TAX
LDAAX
STA
RTS
AMT
$OF
TRANSLATE
AMOUNT
TABLE TO LED
WINDOW CODE.
AMT
TABLE
WINDOW +01
0200
0293
020B
0291
0210
0008
02AA
CVAMT
KEYIN
LPB
PADD
RWD
TABLE
37
02BA
1F40
0228
1741
0007
1FE7
3172
BY JIM BUTTERFIELD
D8
A9
85
20
20
START
01
ID
40 IF MAIN
6A IF
020D
020F
0211
0213
0215
021?
0219
021B
021D
021E
0221
0223
0225
0227
0229
022A
022D
022F
0231
0233
0235
0237
0239
023B
023E
023F
0241
FO
85
C9
FO
A6
DO
C5
DO
AA
BD
85
DO
C5
DO
AA
BD
85
DO
A6
FO
A9
85
85
AD
AA
29
85
50
14
15
1C
1C
OC
16
42
020B 05 14
CLD
LDA
STA
JSR
JSR
CMP
BEQ
STA
CMP
BEQ
LDX
BNE
CMP
BNE
TAX.
E? IF
LDA
1C
STA
3A
BNE
1?
DIG1 CMP
BNE
36
#1 Set FLAG2 . .
FLAG2
. . to new problem
KEYIN set directnl reg
GETKEY
get key input
PREV
same as last time?
LIGHT
yes, skip
PREV
record new input
#$15
no key?
NOKEY yes, brnch
FLAG1 first digit found?
DIG1
SEED1
LIGHT
TAX
E7 IF
LDA TABLE, X
change to segment
ID
STA FLAG2
2E
BNE LIGHT
ID
NOKEY LDX FLAG2
problem solved?
BEQ LIGHT
not yet, skip
2A
LDA #0
Clear. .
00
1C
STA FLAG1
. . for new problem
.STA FLAG2
ID
04 17
LDA TIMER
get random value
OF
17
TAX
AND #$OF
STA SEED2
38
024-3
0244
0246
024-8
024A
024C
024E
0250
0252
0253
0255
0256
TXA
8A
4A 4A
4A 4A
85 16
LSRA LSRA
LSRA LSRA
..and store
Store whole number
Minus 4 for window
#$FC
#0
Clear Accum
..then roll in..
SEED
A
..two bits..
SEED
.and.
A
. .convert..
..to..
..segments
TAB,Y
STA SEED1
STX SEED
86 15
A2 FC
LDX
LDA
A9 00
ROL
26 15
ROL
2A
ROL
26 15
ROL
2A
A8
TAY
LDA
0257 B9 7B 02
STA FLAG1.X
025A 95 1C
INX
next segment
025C E8
025D DO EF
BNE PATT
LIGHT LDA #$7F
025F A9 7F
Set directional..
STA SADD
..registers
0261 8D 41 17
0264 AO 09
LDY #9
LDX #$FA
Minus 6
0266 A2 FA
LDA FLAG2+1.X Window contents
0268 B5 IE
SHOW
STA SAD
026A 8D 4-0 17
STY SBD
026D 80 42 17
WAIT
DEC MOD
0270 C6 11
BNE WAIT
0272 DO FC
INY INY
0274 08 08
INX
0276 E8
BMI
SHOW
30
EF
0277
BPL
MAIN
10
8A
0279
TAB
.BYTE
$14,$12,$24,$22
027B 14 12
027D 24 22
l end
PATT
02000210022032300240025002600270-
D8
14
IF
2E
0F
26
7F
C6
A9
C9
85
A6
65
15
8D
11
01
15
1C
ID
17
2A
85
F0
D0
F0
8A
26
41 17
D0 FC
IE
1C
3A
2A
4A
15
A0
C8
20
A6
C5
A9
4A
2A
09
C8
40 IF 20 6A
1C D0 0C C5
17 D0 36 AA
00 85 1C 85
4A 4A 85 16
A3 59 7E 02
A 2 FA E5 IE
E8 30 EF 10
39
IF
16
ED
ID
86
95
8D
8A
C5 14 F0 50
D0 42 AA ED
E7 IF 85 ID
AL 04 17 AA
15 A2 FC A9
1C E8 D0 EF
40 17 6C 42
14 12 24 22
85
E7
D0
29
00
A9
17
BLACKJACK
BY JIM BUTTERFIELD
Descriptions
KIM uses a 'real* deck of cards in this game.
So when youfve seen four aces going by, you know
that there will be no more - until the next shuffle.
BLACKJACK starts at address 0200. You'll see the
cards being shuffled - the word SHUFFL appears on the
display - and then KIM will ask how much you want to bet.
You'll start with an initial amount of $20. Your balance
is always shown to the right of the BET? question, so
on the first hand, you'll see BET? 20 on the display.
You may bet from $1 to $9, which is the house limit.
The instant you hit key 1 to 9 to signal your bet,
KIM will deal. Of course, you can't bet more money
than you have ... and KIM ignores freeloaders who try
to bet a zero amount.
After the deal, you'll see both your cards on the left
of the display, and one of KIM's cards on the right.
(KIM's other card is a "hole" card, and you won't see
it until it's KIM's turn to play). Aces are shown
as letter A, face cards and tens as letter F, and
other cards as their value, two to nine. As always,
Aces count value 1 or 11 and face cards count 10.
You can call for a third card by hitting the 3 button .
then the fourth card with the 4 button, and so on.
If your total goes over 21 points, KIM will ungrammatically
say BUSTED, and you'll lose. If you get five cards
without exceeding 21 points, you'll win automatically.
If you don't want any more cards, hit key 0. KIM will
report your point total, and then will show and play
its own hand. KIM, too, might go BUSTED or win on
a five-card hand. Otherwise, the most points wins.
From time to time, KIM will advise SHUFFL when the
cards start to run low.
Remember that you have a good chance to beat KIM at
this game. Keep track of the cards that have been
dealt (especially aces and face cards), and you're
likely to be a winner.'
0200 A2 33
START LDX #51
52 cards in deck
0202 8A
DK1
TXA
Create deck
STA DECK.X
by inserting cards
0203 95 ^0
0205 CA
DEX
into deck
0206 10 FA
BPL DK1
in sequence
0208 A2 02
LDX #2
Set up 3 locations
020A BD BB 03 INLOP LDA INIT,X
..into..
020D 95 75
STA PARAM.X
zero page
020F CA
DEX
addresshi/ dpt/ amt
40
0210
0212
0215
021?
0218
021A
021C
10
AD
85
D8
A6
EO
BO
021E
0220
0223
0225
0227
022A
022B
022D
022F
0231
0233
0235
AO
20
AO
84
20
38
A5
65
65
85
A2
B5
F8
04- 1?
80
76
09
34
D8
57 03
33
76
30 03 SHLP
81
82
85
80
04
80
RMOV
0237 95 81
0239 CA
023A 10 F9
023C 29 3F
023E C9 34
0240 BO E5
B9
48
B5
99
68
95
88
JSR LIGHT
SEC
LDA RND+1
ADO RND+2
illuminate display
Generate
new
ADC RND+5
random
STA
LDX
LDA
STA
DEX
BPL
AND
CMP
BCS
seed numbers
TAX
LDA
PHA
LDA
STA
PLA
STA
DEY
BPL
40 00
40
40 00
40
0250 10 05
ripple 52 cards
set full deck
RND
number
#4
RND,X
move over
RND+1,X the random
RMOV
#$3F
#52
SHLP
0242 AA
0243
0246
0247
0249
024C
024D
024F
LDY #51
STY DPT
save it
get random card
into position N
and the original card
DECK.X
into the random slot
DECK,X
DECK,Y
next in sequence
0252
0254
0257
0259
025C
025F
0261
0263
0264
0266
0267
0269
026B
AO DE
NOSHUF LDY
20 57 03
JSR
LDA
A5 77
20 A6 03
JSR
20 30 03 BETIN JSR
C9 OA
CMP
BO F9
BCS
AA
TAX
STX
86 79
CA
DEX
30 F3
BMI
E4 77
CPX
BO EF
BCS
026D
026F
0271
0273
0274
A2
A9
95
CA
10
SHLP
#MBET-$300
Set up BET? msg
FILL
put in WINDOW
AMT
display balance
NUMDIS
.. put in WINDOW
LIGHT
illuminate display
#10
not key 0 to 9?
BETIN
nope, ignore
BET
zero bet?
sufficient funds?
no, refuse bet
; bet accepted - deal
OB
00
90
FB
BETIN
AMT
BETIN
LDX #11
LDA #0
CLOOP
STA WINDOW,X
DEX
BPL CLOOP
41
0276
0279
027C
027F
0282
20
20
20
20
86
78
8F
78
64
7A
03
03
03
03
0284 20 28 03
0287
028A
028C
028E
0290
20
AA
30
E4
DO
30 03
CA
11
96
F5
0292 20 78 03
0295 C9 22
0297 BO 40
0299 EO 05
029B FO 53
029D DO E8
029F
02A1
02A2
02A4
A5 95
48
A2 00
20 OF 03
02A7 A2 04
02A9 A9 00
02AB 95 90
02AD CA
02AE 10 FB
02BO
02B1
02B3
02B5
02B8
68
85
A6
20
20
95
7A
6D 03
92 03
02BB
02BE
02CO
02C2
02C4
02C6
02C8
02CA
02CC
02CE
02DO
02D2
02D4
02D7
20
A5
C9
BO
65
28 03 PLAY
9A
22
29
9B
JSR CREC
JSR MEX
rebuild
play and display
A6 91
DO
C9
90
A5
C9
BO
20
DO
18
22
02
9A
17
2C
8F 03
E2
02D9 20 28 03
02DC 20 55 03
02DF 20 28 03
JSR WLITE
pause to show cards
LDA MTOT
point total
CMP #$22
..22 or over?
BCS IBUST
yup, KIM bust
ADC MACE
add 10 for aces?
LDX WINDOW+1 five cards?
BNE IWIN
yes, KIM wins
22+ including aces?
CMP #$22
BCC POV
nope, count ace high
yup, ace low
LDA MTOT
POV
CMP #$17
17 or over?
BCS HOLD2
yes, stand.,
JSR ME
no, hit..
BNE PLAY
unconditional Branch
; KIM wins here
show player's hand.,
UBUST JSR WLITE
make BUST message..
JSR BUST
JSR WLITE
..and show it
42
02E2
02E4
02E6
02E8
02EA
A5
P8
E5
85
4-C
77
IWIN LDA AMT
38
SED SEC
79
SBC BET
77
JLINK STA AMT
17 02 XLINK JMP DEAL
Player wins here
02ED 20 55 03 IBUST JSR BUST
02FO
02F3
02F5
02F7
02F9
02FB
02FD
02FE
20 28 03 UWIN
ADD
A5 77
F8 18
0336
0338
033B
033D
0340
0343
A9
8D
B5
8D
8C
E6
65 79
JSR
LDA
SED
ADC
LDY
BCC
TYA
BNE
WLITE
AMT
CLC
BET
decrease balance
..by amount of bet
store new balance
next play
make BUST message..
display pause
increase balance
by amount of bet
$99 maximum..
NOFLO
have we passed it?
98
yes, restore $99
DO E8
JLINK
unconditional branch
KIM stands - compare points
0300 A2 03
HOLD2 LDX #3
flag KIM..
0302 20 OF 03
JSR SHOTOT
.. for total display
0305 A5 9A
LDA MTOT
KIM's total.,
CMP UTOT
0307 C5 97
vs. Player's total.,
0309 FO DF
BEQ XLINK
same, no score;
030B BO D5
BCS IWIN
KIM higher, wins;
030D 90 E4
BCC ADD
KIM lower, loses.
; subroutines start here
; SHTOT shows point totals per X register
030F B5 97
SHTOT LDA UTOT.X
player's or KIM's total
0311 F8 18
SED CLC
ADC UACE,X
try adding Ace points
0313 75 98
CMP #$22
exceeds 21 total?
0315 C9 22
0317 BO 02
BCS SHOVER
yes, skip
STA UTOT,X
no, make permanent
0319 95 97
031B D8
SHOVER CLD
031C B5 97
LDA UTOT,X
get revised total
031E 4-8
save it
PHA
031F AO E2
LDY #TOT-$300 set up TOT- msg
0321 20 57 03
JSR FILL
put in WINDOW
0324- 68
PLA
recall total
JSR NUMDIS
insert in window
0325 20 A6 03
display pause, approx 1 second
0328 AO 80
WLITE LDY #$80
timing constant
JSR LIGHT
032A 20 30 03 WDO
illuminate screen
032D 88
DEY
countdown
032E DO FA
BNE WDO
; illuminate display
LIGHT STY YSAV
0330 84 7F
save register
LDY # 13
0332 AO 13
LDX #(
6 digits to show
033^ A2 05
AO 99
90 01
#$99
7F
LDA
STA PADD
set directional reg
4-1 17
DIGIT LDA WINDOW,X
90
STA SAD
character segments
4o 17
STY SBD
character ID
42 17
WAIT
7B
INC PAUSE
43
0345 DO PC
BNE WAIT
wait loop
DEY DEY
DEX
BPL DIGIT
EF
switch Dir Reg
JSR KEYIN
40 IF
JSR GETKEY test keyboard
6A IF
restore Y value
LDY YSAV
?F
RTS
0354 60
; fill WINDOW with BUST or other message
BUST
LDY #$BST-$300
0355 AO E6
FILL
STY POINTR
0357 84 74
0347
03*1-9
034A
034C
034F
0352
88
CA
10
20
20
A4
88
0359
035B
035D
0360
0361
AO
Bl
99
88
10
LDY #5
six digits to move
05
FILLIT LDA (POINTR),Y load a digit
74
STA WINDOW,Y
put in window
90 00
DEY
BPL FILLIT
RTS
F8
0363 60
0364
0366
0368
036A
036C
036D
A6
C6
B5
4A
AA
18
76
76
40
4A
038D D8
038E 60
CLD
RTS
038F
0392
0394
0396
0398
039A
20
C6
A6
94
AO
90
64 03 ME
MEX
99
99
96
10
02
0390
039E
03AO
03A2
03A4
03A5
84
18
65
85
D8
60
9B
F8
9A
9A
RTS
44
03A6
03A?
03A9
03AB
03AC
03AF
48
4A
4A
A8
B9
85
03BB
03CB
03D8
03E2
03
F7
ED
F8
00
DB
F6
DC
0200
0210
0220
0230
0240
0250
0260
0270
0280
0290
02AO
02BO
02CO
02DO
02EO
02FO
0300
0310
0320
0330
0340
0350
0360
0370
0380
0390
03AO
03BO
03CO
03DO
03EO
A2
10
20
85
BO
10
OA
00
64
DO
95
68
C9
C9
28
20
A2
97
E2
84
8C
6A
88
38
8F
64
33 8A 95
F8 AD 04
57 03 AO
85 80 A2
E5 AA B9
D5 AO DE
BO F9 AA
95 90 CA
03 86 7A
F5 20 78
48 A2 00
85 95 A6
22 BO 29
17 BO 2C
03 A5 77
28 03 A5
03 20 OF
F8 18 75
20 57 03
7F AO 13
42 17 E6
IF A4 7F
10 F8 60
BD BE 03
AO 10 90
03 C6 99
65
94
03
FD
F8
9A
68
04
87
D3
85
29
05
FF
F8
9A
OF
06
EF
DC
40
17
33
04
40
20
86
10
20
03
20
7A
65
20
F8
77
03
98
68
A2
7B
60
A6
BC
02
A6
D8
A8
07
Fl
F8
CA
85
84
B5
00
57
79
FB
28
C9
OF
20
9B
8F
38
F8
A5
C9
20
05
DO
AO
76
CB
84
99
60
B9
08
Fl
CO
10
80
76
80
48
03
CA
20
03
22
03
6D
A6
03
E5
18
9A
22
A6
A9
FC
E6
C6
03
98
94
48
E7
09
Fl
FC
FA
D8
20
95
B5
A5
30
78
20
BO
A2
03
91
DO
79
65
C5
BO
03
7F
88
84
76
60
18
96
4A
IF
10
Fl
BE
A2
A6
30
81
40
77
F3
03
30
40
04
20
DO
E2
85
79
97
02
AO
8D
88
74
B5
20
F8
AO
4A
85
10
ED
ED
02
76
03
CA
99
20
E4
20
03
EO
A9
92
18
20
77
AO
FO
95
80
41
CA
AO
40
64
65
10
4A
95
10
F6
87
BD
EO
38
10
40
A6
77
8F
AA
05
00
03
C9
28
4C
99
DF
97
20
17
10
05
4A
03
97
90
4A
60
10
BE
F9
BB
09
A5
F9
00
03
BO
03
CA
FO
95
20
22
03
17
90
BO
D8
30
B5
EF
Bl
4A
E6
85
02
A8
03
F7
Fl
DE
03
BO
81
29
68
20
EF
20
30
53
90
28
90
20
02
01
D5
B5
03
90
20
74
AA
96
97
84
B9
00
DB
Fl
75
AO
82
C9
40
03
OB
03
E4
E8
10
A5
A5
03
55
DO
E4
48
DO
40
IF
90
DO
96
D8 60
9B 18
E7 IF
20 01
CF E6
B8 FC
95
34
65
3F
95
30
A2
78
11
DO
CA
03
02
55
20
98
90
97
88
8D
40
99
18
A6
CA
D8
65
34
88
C9
A9
20
96
A5
FB
9A
9A
20
03
E8
B5
AO
FA
17
20
00
01
94
20
F8
85
02
ED
F9
SLACK MATCH
by Ron Kushnier
(modified by
the editors)
A9
85
A9
85
A9
85
20
20
C9
10
C9
FO
85
A9
85
F8
38
A5
E5
0228
022A
022C
022E
0230
85
A9
85
A9
8D
0236
0239
023B
023D
023F
0240
0242
0244
2C
10
C6
DO
18
A5
FO
69
E9
FO
C9
BO
AE
E4
BO
A9
0226 30
0233 20
0246
0248
024A
024C
024E
0251
0253
0255
21
ED
21
START
NEW
F9
PLAY
00
FB
IF IF
6A IF
04
F2
00
EE
FB
00
FA
F9
FB
EO
F9
08
EE
FF
TIME
0? 17
IF IF DISP
07 17
F8
EE
EF
F9
26
04
04
OB
04
F8
SUB
46 17
ED
02
01
DUMP
LDA
STA
LDA
STA
LDA
STA
JSR
JSR
CMP
BPL
CMP
BPL
STA
LDA
STA
SED
SEC
LDA
SBC
BMI
STA
LDA
STA
LDA
STA
JSR
BIT
BPL
DEC
BNE
CLC
LDA
BEQ
ADC
SBC
BEQ
CMP
BCS
LDX
CPX
BCS
LDA
#$21
IQ
#$21
INK
#0
POINTH
SCANDS
GETKEY
#4
PLAY
#0
PLAY
POINTH
#0
POINTL
initial IQ
21 matches
to start game
clear player's move
light display
and test keys
key 4 or over?
go back
key 0? go "back
record move
wipe last KIM move
decimal mode
INH
POINTH
PLAY
INH
#8
SLOW
#$FF
CLOCK
SCANDS
CLOCK
DISP
SLOW
TIME
INH
DEAD
#4
#4
DUMP
#4
SUB
1746
IQ
COMP
#1
get total
player loses?
divide m-1 by 4
46
keep dividing
random, timer#2
KIM smart enough?
Yes
No
COMP
0257 85 FA
0259 38
025A
025C
025E
0260
0262
0264
0266
0268
026A
026C
026E
026F
0271
0273
0275
0278
027A
027C
A5
E5
85
DO
A2
AO
46
10
A2
AO
38
26
86
84
20
DO
FO
F9
FA
F9
A6
5A
FE
ED
0?
DE
AD
DEAD
ED
FB
SHOW
FA
IF IF LOK
8A
F9
STA
SEC
LDA
SBC
STA
BNE
LDA
LDY
LSR
BPL
LDX
LDY
SEC
ROL
STX
STY
JSR
BNE
BEQ
POINTL
INH
POINTL
INH
PLAY
#$5A
#$FE
IQ
SHOW
#$DE
#$AD
IQ
POINTH
POINTL
SCANDS
NEW
LOK
get dumb
end
xxxxx HEX
02000210022002300240025022600270-
21
IF
38
07
F9
85
C9
A5
17
F0
17 4 ED
D0 A 6 A 2
ED 86 FB
A9
6A
F8
8D
ED
04
F9
20
26
50
5A
84
A9
10
E5
IF
69
02
A0
FA
MATCH """""
21
F2
FE
IF
04
A9
FE
20
85
C9
30
2C
E9
01
46
IF
47
F9
00
E0
07
04
85
ED
IF
A9
F0
85
17
F0
FA
10
D0
00 85 FB 20
EE 85 Ft A9
F9 A9 08 85
10 F8 C6 EE
0B C9 04 B0
38 A 5 F9 E5
07 A 2 DE A0
8A F0 F9
IF
00
EE
D0
F8
FA
AD
IF
85
A9
EF
AE
85
38
20
FA
FF
18
46
F9
26
CARD DEALS ft
BY DM LEWART
0000
0002
0004
0006
0007
0009
OOOA
OOOC
OOOE
OOOF
0011
0012
0014
0016
0018
00 IB
00 IE
0020
0023
0025
0027
0028
0029
002B
002D
002F
0031
0033
0036
0038
0039
00 3B
003D
00 3E
0040
0042
0044
0045
0046
0047
A2
AO
94
CA
DO
D8
A2
86
C8
94
CA
DO
A5
DO
4C
AD
DO
AD
DO
A5
4A
18
69
C5
90
FO
E5
4C
A2
38
F5
FO
CA
10
95
C6
8A
4A
4A
A8
06
00
8B
INIT
INIT 1
FB
34
92
92
INIT 2
FB
92
NEWCRD
03
4F 1C
04 17 RANDOM
OB
44 17
06
92
01
92
07
05
92
2B 00
33
FASTER
FIND
FIND 1
93
03
F8
93
92
UPDATE
LDX
LDY
STY
DEX
BNE
CLD
LDX
STX
I NY
STY
DEX
BNE
LDA
BNE
JMP
LDA
BNE
LDA
BNE
LDA
LSR
CLC
ADC
CMP
BCC
BEQ
SBC
JMP
LDX
SEC
SBC
BEQ
DEX
BPL
STA
DEC
TXA
LSR
LSR
TAY
48
#$06
#$00
008B,X
CLEAR DISPLAY
C8C-91)=0
INIT 1
#$34
0092
FILL DECK
STORE CARDS LEFT (52)
C93-C6)=1
0092,X
INIT 2
0092
RANDOM
START
1704
FASTER
1744
FASTER
0092
#$01
0092
FIND
FIND
0092
FASTER
-$33
0093,X
UPDATE
FIND 1
0093,X
0092
DECK FINISHED?
YES, STOP
GET RANDOM # (1-FF)
CARD=0
1 LESS CARD LEFT
GET FIRST 6 BITS OF X
Y=(0-C)
0048
00 4B
004D
00 4E
0050
0051
0054
0056
0059
005B
005E
0060
0062
0064
0067
0069
006B
006E
0070
0073
0074
0076
0078
B9
85
8A
29
A8
B9
85
20
DO
20
DO
FO
A9
8D
AO
A2
B9
84
20
C8
CO
90
4C
7B 00
90
03
88 00
91
62 00 K DOWN
FB
62
B4
F9
7F
41
00
08
8C
FC
4E
00 K UP
DISP
17
00 DISP 1
IF
06
F3
3D IF
**************
**************
00 7B
00 7C
00 7D
00 7E
007F
0080
0081
0082
0083
0084
0085
0086
0087
0088
0089
00 8A
00 8B
77
5B
4F
66
6D
7D
07
7F
6F
78
IE
67
70
6D
76
5E
39
VALTBL
TABLES
"A"
112"
INITIALIZE
GET CHARACTER
DISPLAY CHARACTER
NEXT CHARACTER
XXJCC9CCX
llTll
Hij.ll
licit
II6II
tl^ll
llgll
ttgll
lljil
lljll
MQII
"K"
SUITBL
lien
"H"
"D"
"C"
**** ******
******
0000
0010
0020
0030
0040
0050
0060
0070
0080
LDA 007B,Y
STA 0090
TXA
AND #$03
TAY
LDA 0088,Y
STA 0091
JSR DISP
BNE K DOWN
JSR DISP
BNE NEWCRD
BEQ K UP
LDA #$7F
STA 1741
LDY #$00
LDX #$08
LDA 008C,Y
STY OOFC
JSR 1F4E
I NY
CPY #$06
BCC DISP 1
JMP 1F3D
A2
92
AD
05
95
A8
FO
20
7D
06
CA
44
E5
93
B9
F9
4E
07
00
FB
DO
4C
92
00
7F
C8
6F
94
A5
00
2B
8A
85
8D
CO
78
8B
92
A5
00
4A
91
41
06
IE
CA
DO
92
A2
4A
20
17
90
67
49
DO
03
4A
33
A8
62
AO
F3
70
FB
4C
18
38
B9
00
00
4C
6D
D8
4F
69
F5
7B
DO
A2
3D
76
A2
1C
01
93
00
FB
08
IF
5E
34
AD
C5
FO
85
20
B9
77
39
86
04
92
03
90
62
8C
5B
92
17
90
CA
8A
00
00
4F
C8
DO
07
10
29
DO
84
66
94
OB
FO
F8
03
B4
FC
6D
CHESS CLOCK
BY CASS LEWART
0200
0202
0203
0206
0207
0209
020C
020F
0211
0213
0215
0217
02 1A
021D
021F
0221
0224
0225
0227
0229
022B
022E
0231
0233
0235
0237
0239
023B
023D
023F
0241
0243
0245
0247
0248
024A
024C
02 4E
0250
0252
0254
0256
0258
A9
AA
9D
E8
DO
20
20
C9
DO
A9
85
20
20
A9
85
20
18
A5
00
00 00
FA
IF
6A
02
F6
01
D4
60
31
02
D4
60
IF
IF
02
02
02
F9
69 01
85 F9
20 31 02
4C 13 02
xx see
A9 02
C5 D4
DO 11
A5 FB
85 D2
A5 FA
85 D3
A5 DO
85 FB
A5 Dl
85 FA
60
A5 FB
85 DO
A5 FA
85 Dl
A5 D2
85 FB
A5 D3
85 FA
60
LDA #$00
TAX
ZERO
STA 0000, X
INX
BNE ZERO
DISP
JSR SCANDS
JSR GETKEY
CMP #$02
BNE DISP
LOOP
LDA #$01
STA OOD4
JSR TIME
JSR SAVE
LDA #$02
STA OOD4
JSR TIME
CLC
LDA OOF9
ADC #$01
STA OOF9
JSR SAVE
JMP LOOP
SAVE TIME INDICATED SI
SAVE
LDA #$02
CMP OOD4
BNE CLK1
LDA 00 FB
STA OOD2
LDA OOFA
STA OOD3
LDA 00 DO
STA OOFB
LDA OOD1
STA OOFA
RTS
CLK1 LDA OOFB
STA OODO
LDA OOFA
STA OOD1
LDA OOD2
STA OOFB
LDA OOD3
STA OOFA
RTS
50
DISPLAY ZEROS
KEY PRESSED?
KEY # 2?
NO, WAIT TILL 2 DOWN
FLAG TO 1
CCLOCK #1 TO RUN)
GET CLOCK RUNNING
SAVE TIME ON DISPLAY
FLAG TO 2
CCLOCK #2 TO RUN)
GET OTHER CLOCK RUNNING
...INCREMENT MOVE
NUMBER...
SAVE CLOCK 2 TIME
BACK TO CLOCK # 1
JTINE >s:x
CLOCK # 2 ?
0260
0261
0263
0265
0267
026A
026D
0270
0272
0274
0275
0278
027A
027C
027E
0280
0283
0286
0288
0289
02 88
028D
028F
0291
0293
0294
0296
0298
029A
029C
029E
F8
A9
85
A9
8D
20
20
C5
DO
60
2C
10
C6
DO
A9
8D
2C
10
18
A5
69
07 17
FO
D5
E7
BF
06 17
07 17
FB
FA
01
FA
85
C9 60
DO 05
38
A9 00
85 FA
A5 FB
69 00
85 FB
4C 60 02
LDA #$04
STA OOD5
LDA #$FO
LOAD
TIME MULTIPLIER TO 4
SET TIMER
STA 1707
LITE
JSR
JSR
CMP
BNE
RTS
BIT
BPL
DEC
BNE
LDA
WAIT
SCANDS
GETKEY
OOD4
WAIT
1707
LITE
OOD5
LOAD
#$BF
STA 1706
BIT 1707
BPL TINY
CLC
LDA 00 FA
ADC #$01
STA OOFA
CMP #$60
BNE NOMN
SEC
LDA #$00
STA OOFA
LDA OOFB
ADC #$00
STA OOFB
JMP TIME
TINY
NOMN
DISPLAY CLOCK
GET KEYBOARD ENTRY
EQUAL TO FLAG?
NO, TIME OUT THEN UPDATE
YES, RETURN FROM SUBR.
TIME DONE?
NOT YET
DECREMENT TIME MULT
NOT ZERO, RESET TIMER
LAST LITTLE BIT OF TIME
INTO TIMER
DONE?
NO
..ONE SECOND ADDED
TO CLOCK..
(CENTER TWO DIGITS)
A MINUTE UP?
NOT YET
YES, SEC. TO ZERO
A9 00 AA 9D 00 00 E8 D0 FA 20 IF IF 20 6A IF C9
02 D0 F6 A9 01 85 D4 20 60 02 20 31 02 A9 02 85
D4 20 60 02 18 A5 F9 69 01 85 F9 20 31 02 AC 13
02
D0
A5
F8
C5
8D
60
02
A9
85
D2
A9
DA
06
D0
02
FB
85
04
D0
17
05
C5
A5
FB
85
01
2C
38
DA
Dl
A5
D5
60
07
A9
D0
85
D3
A9
2C
17
00
11
FA
85
F0
07
10
85
51
A5
60
FA
8D
17
FB
FA
FB
A5
60
07
10
18
A5
85 D2 A5 FA 85 D3 A5
FE 85 D0 A5 FA 85 Dl
17
F0
A5
FE
20
C6
FA
69
IF IF 20
D5 D0 E7
69 01 85
00 85 FB
6A
A9
FA
AC
IF
BF
C9
60
CLOCK
- Charles Parsons
This clock routine uses KIM's built in interval timer with the
interrupt option. It works by loading $F^f into the timer (/1024) each
time the Non-Maskable Interrupt (NMI) occurs. This theoretically produce a time of 2^9856 microseconds or just under % second. The adjustment to % second is done with the timer (/I) in the interrupt routine.
A fine adjustment of the clock can be made by modifying the value in
location $0366. Only two subroutines will be documented here (ESCAPE
TO KIM & HOUR CHIME) but many more can be added by simply replacing
the NOP codes starting at $03DE with jumps to your own subroutines.
For instance, a home control system could be set up using the clock
program.
The escape to KIM allows KIM to run without stopping the clock.
This means that you can run other programs simultaneously with the
clock program unless your program also needs to use the NMI (such as
single step operation) or if there could be a timing problem (such as
with the audio tape operation). Pressing the KIM GO button will get
you out of the KIM loop.
0070
0080
0081
0082
0083
0084
NOTE
QSEC
SEC
MIN
HR
DAY
52
INTERRUPT EOUTINE
0360 48
0361
0362
0363
0364
0365
0367
036A
036D
036F
0371
0373
0375
0377
0379
037B
037C
037D
037F
0381
0383
0385
0387
0389
8A
48
98
48
A983
8D0417
2C0717 TM
10FB
E680
A904
C580
D038
A900
8580
18
F8
A581
6901
8581
C960
D028
A900
8581
A582
038B
038D 18
038E 6901
0390 8582
0392 C960
0394 D019
0396 A900
0398 8582
039A
039C
039D
039F
03A1
03A3
03A5
03A7
A583
18
6901
8583
C912
D002
E684
C913
03A9 D004
03AB A901
03AD 8583
03AF D8
03BO A9F4
03B2 8DOF17
TH
RTN
PHA
TXA
PHA
TYA
PHA
LDA #$83
STA TIME4
BIT TIME?
BPL TM
INC QSEC
LDA #$04
CMP QSEC
BNE RTN
LDA #$00
STA QSEC
CLC
SED
LDA SEC
ADC #$01
STA SEC
CMP #$60
BNE RTN
LDA #$00
STA SEC
LDA MIN
CLC
ADC #$01
STA MIN
CMP #360
BNE RTN
LDA #$00
STA MIN
LDA HR
CLC
ADC #$01
STA HR
CMP #$12
BNE TH
INC DAY
CMP #313
BNE RTN
LDA #301
STA HR
CLD
LDA #3F4
STA TIMEF
save A
save X
save Y
fine adjust timing
test timer
loop until time out
count H seconds
do four times before
updating seconds
until 12 hours
advance % day
if 13 hours
start again with one
go back to hex mode
start timer with interrupt
in 249,856 microseconds
03B5 68
03B6 A8
03B7 68
PLA
TAY
PLA
TAX
PLA
RTI
03B8 AA
03B9 68
03BA
40
restore Y
restore X
restore A
return from interrupt
206A1F KIM
G901
DOOD
201F1F
206A1F
C901
D003
0311 4co5ic
0314 60
ENDR
JSR
CMP
BNE
JSR
JSR
CMP
BNE
JMP
RTS
GETKEY
#01
ENDR
SGANDS
GETKEY
#301
ENDR
SAVE1
go back to KIM if
KIM keyboard is one
delay to make sure
A582
D029
BEEP
LDA
BNE
A581
LDA
SEC
38
SBC
E583
1024
BPL
A58o
AGAIN LDA
D006
BNE
A91E
LDA
STA
8570
DOOA
BNE
A901
ONE
LDA
CMP
0337 C580
BNE
0339 D014
033B A928
LDA
033D 8570
STA
LDA
033F A901
0341 8D0317
STA
0344 EE0217
INC
LDA
0347 A570
TAX
0349 AA
034A CA
DEC
DEX
034B 10FD
BPL
034D 30DC
BMI
034F 60
END
RTS
on the hour?
if not return
execute until SEC = HR
MIN
SND
SEC
HR
END
^SEC
ONE
#S1E
NOTE
GO
#301
QSEC
END
#$28
NOTE
#$01
PBDD
PBD
NOTE
first # second?
set high note
set delay
DEC
AGAIN
54
keep sounding
I
*
03CB
03CD
03CF
03D1
03D3
03D5
03D8
03DB
03DE
03E1
03E4
03E?
03EA
03ED
03FO
03F3
03F6
03F9
03FC
LDA
STA
LDA
STA
LDA
STA
LDA
STA
LDA
STA
JSR
JSR
JSR
85F9
A582
85FA
A583
85FB
201F1F
200003
202003
EAEAEA
EAEAEA
EAEAEA
EAEAEA
EAEAEA
EAEAEA
EAEAEA
EAEAEA
EAEAEA
EAEAEA
4CC903
#$00
QSEC
#$FV
TIMEF
SEC
INH
MIN
POINTL
HR
POINTH
SCANDS
KIM
BEEP
reset % s<
start timi
start her.
display c.
escape to
sound on
JMP DSP
03000310032003300340-
20
03
AS
IE
01
6A
4C
82
85
8D
IF
05
D0
70
03
C9
1C
29
D0
17
01
60
A5
0A
EE
D0 0D 20 IF IF 20 6A IF C9 01 D0
036003700380039003A003B003C003D003E003F0-
48
80
01
85
83
A9
A9
FA
EA
EA
8A
A9
85
82
C9
F4
00
A5
EA
EA
48
04
81
C9
12
8D
85
83
EA
EA
98
C5
C9
60
D0
0F
80
85
EA
EA
48 A9
80 D0
^2 D0
V&' 19
02 E6
17 68
A9 F4
FB 20
EA EA
EA EA
81 38 E5 83 10 24 A5 80 D0 06 A9
A9 01 C5 80 D0 14 A9 28 85 70 A9
02 17 A5 70 AA CA 10 FD 30 DC 60
83
38
28
A9
84
A8
8D
IF
EA
EA
55
8D
A9
A9
00
C9
68
0F
IF
EA
EA
04 17
00 85
00 85
85 82
13 B0
AA 68
17 A5
20 00
EA EA
EA EA
20
80
81
A5
04
40
81
03
EA
EA
C0
18
A5
83
A9
17
F8
82
18
01
10
A5
18
69
85
FB
81
69
01
83
E6
69
01
85
D8
85
20
EA
EA
F9
20
EA
4C
A5
03
EA
C9
82 85
EA EA
EA EA
03
CODE TfST
BY STAN OCKERS
0200
0202
0205
0207
0208
020A
020C
020F
0211
0213
0215
0217
0219
021C
021F
0221
0223
0225
0226
0229
022B
022E
0230
0232
0234
0236
0239
02 3B
02 3D
023F
0241
0243
0246
A2 OC
BD DF
95 E2
CA
10 J~8
A2 b f
20 AO
A9 06
85 EO
C6 EO
FO F3
A2 03
20 AO
20 CB
29 3F
C9 28
10 F7
AA
BD 13
A4 E2
99 3B
E6 E2
A5 E2
C9 1A
FO 20
BD EB
85 DF
06 DF
FO D4
BO OD
A2 01
20 82
A2 01
02 INIT
GRUP
02
CHAR
02
02 NUMB
03
03
02
BITS
02
SPAC
LDX
LDA
STA
DEX
BPL
LDX
JSR
LDA
STA
DEC
BEQ
LDX
JSR
JSR
AND
CMP
BPL
TAX
LDA
LDY
STA
INC
LDA
CMP
BEQ
LDA
STA
ASL
BEQ
BCS
LDX
JSR
LDX
#$OC
02DF,X
OOE2,X
INIT
#$04
SPACE
#$06
OOEO
OOEO
GRUP
#$03
SPACE
RAND
#$3F
#$28
NUMB
0313,X
OOE2
033B,Y
OOE2
OOE2
#$1A
DEBO
02EB,X
OODF
OODF
CHAR
DASH
#$01
MARK
#$01
56
0248 20
02 4B 18
024C 90
024E A2
0250 20
0253 18
0254 90
0256 20
0259 20
025C DO
025E 20
0261 FO
0263 18
0264 A5
0266 69
0268 85
026A AO
026C Bl
026E 99
0271 88
0272 10
0274 C6
0276 DO
0278 A9
02 7A 85
02JC A9
0*., 85
0280 DO
AO 02
ED
03
82 02
JSR SPACE
DASH
FO
8E IE DEBO
Bl 02
F8
Bl 02 WAIT
FB
E4
05
E4
04
E4
WIND
E8 00
F8
E3
DE
36
E4
05
E3
D4
***>*
CLC
BCC
LDX
JSR
CLC
BCC
JSR
JSR
BNE
02AO
02A2
02A4
02A7
02M
02AC
02AE
02BO
8D
A9
8D
EE
A6
CA
DO
2C
10
C6
DO
60
07 17
01
01 17
00 17 TOGG
E7
FREQ
FD
07 17
F3
DD
E5
86
A5
8D
2C
10
C6
DO
60
UNCOND. JUMP
(DASH LENGTH)
SEND A DASH
SPAC
INIT1
DISP
DEBO
UNCOND. JUMP
..DEBOUNCE KEY..
WAIT FOR KEY RELEASE
JSR DISP
BEQ
CLC
LDA
ADC
STA
LDY
LDA
STA
DEY
BPL
DEC
BNE
WAIT
OOE4
#$05
OOE4
#$04
(OOE4),Y
OOE8,Y
..UPDATE POINTER TO
POINT AT NEXT GROUP..
WIND
OOE3
DEBO
LDA #$36
STA OOE4
LDA #$05
STA
BNE
*w***
" MARK SUBROUTINE
0282 86 DD
STX
0284 A5 E6
TIMM
LDA
0286
0289
02 8B
02 8E
0291
0293
0294
0296
0299
029B
029D
029F
BITS
#$03
MARK
OOE3
DEBO
:: :::c
"
OODD
OOE6
STA 1707
LDA #$01
STA 1701
INC 1700
LDX OOE7
DEX
BNE
BIT
BPL
DEC
BNE
RTS
FREQ
1707
TOGG
OODD
TIMM
57
02B1
02B3
02B6
02B8
02BA
02BD
02BF
02C2
02C3
02C5
02C7
02CA
A9
8D
AO
A2
B9
84
20
C8
CO
90
20
60
RTS
38
A5
65
65
85
A2
B5
95
CA
10
60
D8
Dl
D4
D5
DO
04
DO
Dl
F9
RAND
ROLL
SEC
LDA
ADC
ADC
STA
LDX
LDA
STA
DEX
BPL
RTS
CLD
RND+1
from Kirn User Notes
vol 1, #1
RND+3
RND+4
(J. Butterfield)
RND
#4
RND,X
RND+1,X
ROLL
CRAPS
BY JIM BUTTERFIELD
DESCRIPTION SET ADDRESS 0200, THEN HOLD "GO" DOWN .. YOU'LL SEE:
- 2 DICE "ROLLING" ON THE LEFT
- $10 BALANCE ON THE RIGHT
LET "GO" GO ... THE DICE WILL STOP ROLLING, AND YOU'LL GET:
- A WIN ON A TOTAL OF 7 OR 11; YOU'LL SEE YOUR DOLLAR
BALANCE RISE; OR
- A LOSS ON TOTALS OF 2,3, OR 12; YOUR DOLLAR BALANCE
WILL DROP; OR
- A "POINT" - THE CENTER SEGMENTS WILL LIGHT WITH THE
ROLL AND YOU MUST TRY TO ROLL THIS TOTAL AGAIN
BEFORE YOU ROLL 7 PUSH THE "GO" BUTTON ONLY ON THE FIRST ROLL. FOR SUBSEQUENT
ROLLS, PUSH ANOTHER BUTTON.
0200 D8
START
0201 20 40 IF
0204 20 6A IF
0207 C5 4o
0209
020B
020D
020F
0211
0213
0215
0217
021A
021D
021F
0221
0223
0225
FO
85
49
85
C9
DO
A9
20
AD
A2
86
A2
C5
90
79
40
15
41
06
05
10
A9 02
04 17 NOGO
CO
4E
05
4E
RNDLP
02
0227 E5 4E
CJ-0)
J.I KEYIN
JSR GETKEY
CMP LAST
STA
EOR
STA
CMP
BNE
LDA
JSR
LDA
LDX
STX
LDX
CMP
BCC
SBC
0229 46 4E
RNDOV LSR
022B CA
DEX
0220 10 F5
BPL
022E AA
TAX
022F E8
INX
0230 BD E7 IF
LDA
0233 A4 41
LDY
0235 FO 06
BEQ
0237 86 42
STX
0239 85 43
STA
023B DO 47
BNE
023D 85 47
PLAY
STA
023F A5 43
LDA
0241 85 46
STA
0243 A5 44
LDA
59
LAST
#$15
FLAG
#6
NOGO
#$10
DOBUX
TIMER
#$CO
DIVR
no-key test
into flag
GO key?
nope . .
yes, $10
put in window
random value
divide by 6
#5
DIVR
RNDOV
DIVR
DIVR
divide..
. .a. .
. . digit
RNDLP
die 0-5
die 1-6
TABLE, X segment
FLAG
which die?
PLAY
second?
DIE
first, save it..
WINDX ..& segment
LIGHT unconditional
WINDOW+1 show die. .
WINDX
. . and other
WINDOW
one
BUX
out of dough?
' 024-5
024-7
024-9
024-B
024-D
024-F
0251
FO
8A
65
C5
FO
A6
FO
3D
18
4-2
4-5
28
4-5
12
0253 09 07
0255
0257
0259
025B
025D
025F
0260
0263
0265
0267
DO
A5
FO
18
E9
D8
20
DO
A6
86
2D
44
05
F8
00
LOSE
A9 02
IF
4-6
FIRST
4-8
0269 A6 4-7
026B 86 4-9
026D
026F
0270
0273
0275
0277
0279
027B
027D
027E
0280
0281
02840286
0288
028A
028C
028E
0291
0293
0295
0297
029A
029D
029F
02A1
02A3
02A402A6
02A9
02AB
02AD
02AF
85
AA
BD
FO
30
A5
4-5
BEQ
TXA
ADC
CMP
BEQ
LDX
BEQ
CMP
BNE
LDA
BEQ
CLC
SBC
CLD
JSR
BNE
LDX
STX
LDX
STX
STA POINT
TAX \
point value
LDA ^B-2,X 'win1 table
BEQ LIGHT
..says point
BMI LOSE
. . says craps
LDA BUX
. . says win
CMP
#$99
maximum
bucks?
C9 99
FO 04BEQ WINX yes, skip add
F8
SED
decimally add. .
ADC #1
. . one
69 01
D8
CLD
20 A9 02 WINX
JSR DO BUX make segments
A5 4-1
LIGHT LDA FLAG still rolling?
FO 04BEQ NOINC
..nope;
E6 4-6
INC WINDOW . .yup, so..
E6 4-7
INC WINDOW+1 ..roll em!
A9 7F
NOINC LDA #$7F
8D 4-1 17
STA PADD
AO 13
LDY #$13
LDX #5
A2 05
B5 4-6
LITE
LDA WINDOW, X
8D 4-0 17
STA SAD
8C 4-2 17
STY SBD
E6 4-F
PAWS
INC PAUSE
DO FC
BNE PAWS
88 88
DEY DEY
CA
DEX
10 EF
BPL LITE
4-C 00 02
JMP START
85 44
DOBUX STA BUX
AO 00
LDY #0
84- 4-5
STY POINT clear point
84- 4-8
STY WINDOW+2 ..and..
06 02
OF
EO
4-4WIN
60
02B1
02B3
02B5
02B8
02B9
02BC
02BE
02BF
02C1
8^
A8
4-A
AA
BD
85
98
29
4-9
4-A
1*A
E? IF
^A
LDA TABLE,X
STA WINDOW+4
TYA
OF
AND #$OF
AA
TAX
02C2 BD E? IF
LDA TABLE,X
02C5 85 4-B
STA WINDOW+5
02C7 60
RTS
02C8 FF FF 00 00 00 01 00 00 00 01 FF
:ssjsc5?
020002100220-
023002400250026002700280029002AO02BO02CO02 DO-
08
41
4E
BD
43
45
*20
BD
08
17
FC
48
OF
00
20
C9
A2
E7
85
FO
A9
C6
20
AO
88
84
AA
01
40
06
05
IF
46
12
02
02
A9
13
88
49
BD
FF
IF
DO
C5
A4
A5
C9
DO
FO
02
A2
CA
A8
E7
HEX
20
05
4E
41
44
07
IF
OF
A5
05
10
4A
IF
(TAB)
6A
A9
90
FO
FO
DO
A6
30
41
B5
EF
4A
85
T C540
ij 20 A9
02 E5 4E
06 86 42
3D 8A 18
2D A5 44
46 86 48
EO A5 44
FO 04 E6
46 8D 40
4C 00 02
4A 4A AA
4B 60 FF
FO
02
46
85
65
FO
A6
C9
46
17
85
BD
FF
79
AD
4E
43
42
05
47
99
E6
8C
44
E7
00
85
04
CA
DO
C5
18
86
FO
47
42
AO
IF
00
40
17
10
47
45
F8
49
04
A9
17
00
85
00
49
A2
F5
85
FO
E9
85
F8
7F
E6
84
4A
01
15
CO
AA
47
28
00
45
69
80
4F
45
98
00
85
86
E8
A5
A6
D8
AA
01
41
DO
84
29
00
61
DUEL
BY STAN OCKERS
0200
0202
0204
0206
0209
020B
020D
020F
0211
0213
0216
0219
02 IB
02 ID
0220
0222
0224
0226
0228
0229
022C
022F
0231
0233
0235
0237
0239
02 3B
02 3D
023F
0241
0243
0245
0247
0249
A9
85
85
AD
29
09
85
A9
85
20
AD
FO
A9
8D
C6
10
A9
85
D8
20
20
C9
10
C9
FO
C9
FO
DO
A2
A5
10
30
A2
A5
10
10
F9
FB
44
IF
01
EE
00
FA
71
07
OD
FF
07
EE
04
36
FA
17 RAND
02 DISP
17
17
MORE
40 IF
6A IF
15
EO
07
OE
00
02
D6
02
EE
14
06
00
EE
OC
LEFT
RITE
LDA
STA
STA
LDA
AND
ORA
STA
LDA
STA
JSR
LDA
BEQ
LDA
STA
DEC
BPL
LDA
STA
CLD
JSR
JSR
CMP
BPL
CMP
BEQ
CMP
BEQ
BNE
LDX
LDA
BPL
BMI
LDX
LDA
BPL
62
#$10
OOF9
00 FB
1744
#$1F
#$01
OOEE
#$00
OOFA
LITE
1707
MORE
#$FF
1707
OOEE
MORE
#$36
OOFA
KEY IN
GET KEY
#$15
DISP
#$07
RITE
#$00
LEFT
DISP
#$02
OOEE
LOS1
ADD1
#$00
OOEE
LOS1
INITIALIZE DIGITS
GET "RANDOM" #
NOT TOOJ3IG
NOT TOf JMALL
PUT IN DECREMENT LOC.
BLANK CENTER DIGITS
DISPLAY DIGITS
TIME UP?
NO
START TIMER
FULL TIME UP?
NO, SKIP
YES, CHANGE ..
CENTER DIGITS
CLEAR FOR KEYBOARD
INIT. KEYBOARD
KEY DEPRESSED?
VALID KEY?
NO
RIGHT KEY?
YES
LEFT KEY?
YES
NOT A 0 OR A 7
INDEX FOR LEFT
TIME UP?
NO DECREASE LEFT ONE
YES, INCREASE LEFT
INDEX FOR RIGHT
CHECK TIME
NOPE, NOT YET
024B
024C
024D
024F
0251
0253
0254
0256
0257
0258
0259
025B
025D
025F
0261
0264
0267
0269
026B
026E
026F
F8
18
B5
69
95
8A
49
AA
F8
38
B5
E9
95
FO
20
20
DO
FO
20
B8
50
ADD1
F9
01
F9
02
F9
01
F9
OA
71
40
F8
9B
71
FA
0271
0273
0276
0278
02 7A
02 7D
02 7F
0282
0285
0287
02 8A
A9 7F
8D 41
A2 09
A5 FB
20 8B
A5 FA
20 4E
20 4E
A5 F9
20 8B
60
xxxxx
02 8B
028C
02 8D
02 8E
028F
0290
0292
0295
0296
A8
4A
4A
4A
4A
FO
20
98
29
20
60
A9
84
20
B8
50
0298
029B
029C
029E
02AO
02A3
02A4
OA
48
OF
48
80
FC
4E
EF
SED
INCREASE SCORE ..
CLC
BY ONE
LDA OOF9,X
ADC #$01
STA OOF9,X
INDEX TO OTHER . .
TXA
SIDE
EOR #$02
TAX
LOS 1
SED
DECREASE SCORE ..
BY
ONE
SEC
LDA OOF9,X
SBC #$01
STA OOF9,X
BEQ FIN
GO TO FIN IF ZERO
02 WAIT
JSR LITE
WAIT FOR SWITCH ..
IF
JSR KEYIN
TO BE RELEASED
BNE WAIT
BEQ RAND
THEN START NEW DELAY
02 FIN
JSR LITE
FINISHED LOOP
CLV
BVC FIN
UNCOND. JUMP
xxxxx DISPLAY SUBROUTINE """-"
LITE
LDA #$7F
/^
17
STA SADD
INIT. DIGIT ft
LDX #$09
LDA OOFB
02
JSR 2HEX
LDA OOFA
GET CENTER DIGITS
IF
JSR CONVX
CONVERT NONHEX CHAR.
IF
JSR CONVX
TWO OF THEM
LDA OOF9
02
JSR 2HEX
RTS
HEX CHARACTER CONVERSION SUBROUTINE ""'""
2HEX
TAY
LSR A
SUBROUTINE TO CONVERT
LSR A
ONE WORD TO 2 HEX
LSR A
CHARACTERS
LSR A
BEQ ZBLK
IF
JSR CONVD
2NDC
TYA
SECOND CHARACTER
AND #$OF
IF
JSR CONVD
RTS
ZBLK
LDA #$80
BLANK LEADING ZEROS
STY 00 FC
CONVERT NONHEX CHAR.
IF
JSR CONVX
CLV
BVC 2NDC
UNCOND. JUMP
63
MOWN
by Jim Butterf ield
You are farmer Brown. You are growing a beautiful crop of corn
But the following animals try to come and steal your corn:
0
CD
"CC_
Ant
Bird
Cow
Dog
Elephant
Fox
As soon as you see one of these animals coming for your corn,
you can scare it away by calling its name. Press the button
with the first letter of the animal's name. So you would
press A to shoo away an ant, B to shoo away a bird, and so on.
If you press the right button, the animal will go back. If you
press the wrong button, it will think you mean somebody else
and keep coming for your corn. And when all your corn is gone,
KIM will show 000 and the game is* over.
The animal won't "shoo" unless it has completely entered the
display. Speed of the animals can be adjusted by changing the
contents of location 026A.
-"
0200 A2 OD
0202 86 6E
020ij A9 00
START
LDX #$13
STX CORN
bushels of corn to start
clear the window
IDA #0
.
0206 95 60
SLOOP STA WINDOW,!
0208 CA
DEX
BPL SLOOP
0209 10 FB
020B A 2 OB
TEST
is window empty?
LDX #11
020D B5 60
TLOOP IDA WINDOW,!
BNE CONTIN
no, keep going
020F DO 3B
0211 CA
DEX
0212 10 F9
BPL TLOOP
021i| E6 6D
yes. make new animal
INC GOT
0216 A 6C
LDA FIAG
BEQ MORE
did last animal get in?
0218 FO 09
021A C6 6D
DEC GOT
021C C6 6E
DEC CORN
take away some corn
021E DO 03
BNE MORE
any left?
0220 UC 25 19
JMP DONE
no, end of game
0223 AD OU 1? MORE
LDA TIMER
random value. .
0226 hA. IjA 1|A
LSRA LSRA LSRA
..to generate..
0229 UA UA
LSRA LSRA
..new random animal
022B C9 06
CMP #6
6 types of animal
022 D 90 02
BCC MAKE
022F 29 03
AND #$03
0231 18
MAKE
CLC
0232 AA
TAX
animal type to X
0233 69 OA
ADC #$OA
key type A to F
64
STA
LDA
STA
LDA
023S 85 71
STA
LDY
02UO AO 05
ALOOF LDA
02U2 Bl 70
STA
02hh 99 66 00
DEY
02U7 88
BPL
02U8 10 F8
02UA 81* 60
STY
02UC A2 05
CONTIN LDX
CLOOP LDA
02^E B5 66
0250 DO 13
BNE
0252 CA
DEX
BPL
0253 10 F9
JSR
0255 20 hO IF
0258 20 6A IF
JSR
025B C5 6F
CMP
025D DO 06
BNE
025F A5 6C
LDA
0261 10 02
BPL
INC
0263 E6 6C
NOKEY DEC
0265 C6 72
BNE
0267 DO IE
0235
0237
023A
023C
B5
ED
85
A9
6F
kh 02
70
02
0269 A9 20
026B 85 72
026D A5 6C
026F
0271
0273
0275
0277
0278
027A
027C
027E
0280
30
A2
B5
95
CA
DO
86
FO
A2
B5
OD
OA
5A
5B
F9
5A
09
FO
6C
LDA
STA
LDA
BMI
LDX
RLOOP LDA
STA
DEX
BNE
STX
BEQ
COMING LDX
CMLOOP LDA
STA
INX
KEY
INDEX,X animal 'picture1 address
POINL
to indirect pointer
#2
POINH
#5
(POINL),Y
WINGS,Y
ALOOP
flag FF animal coming
FLAG
test:
#5
is animal out of 'wings
WINGS ,X
NOKEY
LITE
CLOOP
KEYIN
GETKEY
right anim al named?
KEY
NOKEY
no, ignore key
FLAG
animal retreating?
NOKEY*
make animal retreat
FLAG
DELAY
wait a while.
before moving animal
NOMOVE
speed control value
#$20
DELAY
move animal - which way?
FLAG
COMING
..left
..right
#10
WINDOW-6.X
WINDOW-5.X
RLOOP
WINDCW-6
clear extreme left
unconditional branch
NOMOVE
#$FO
-16
WINDOW+12,X
WINDOW+11,X
0282 95 6B
028U E8
.BMI CMLOOP
0285 30 F9
NOMOVE LDA #$7F
0287 A9 7F
0289 8D Ul 17
STA PADD
028C AO 13
LDY #$13
028E A2 05
0290 B5 60
from 'picture'
..to 'wings'
LDX
LDA
STA
STY
#5
WINDCW,X
SAD
SBD
BNE
DEY
BPL
JMP
LITEX
DEY DEX
LITE
TEST
0292 8D hO 17
0295 8C h2 17
0298 E6 73
LITEX INC WAIT
029A DO FC
029C 88 88 CA
029F 10 EF
02A1 UC OB 02
01 61 61 hO 00 00
02B6 61 51 hi 01 00 00 63 58 UE 00 00 00 71 ID 111 IF 01 00
02C8 63 58 UC UO 00 00
-
FARMER BROWN....
Exercises:
1. You can see that each animal occupies 6 memory locations,
starting at 02AA (the Ant) - and the last location must always
be zero. Can you make up your own animals? The letters may
not fit exactly, but you can always invent names or use
odd ones (you could make an Aardvark, a Burfle, a Cobra, and
so on).
2. The game might be more fun if the animals went faster after
a while, so that sooner or later they would just zip by.
The location that controls speed is at address 026A;
the lower the number, the faster the animals will go.
So if you could arrange to have the program decrease
this number automatically once in a while, you'd get
a nice speed-up feature.
3. You can't "shoo" the animal until it's completely entered
the display; but you can still catch it after it's partly
left. The game would be harder - and maybe more fun if you could only shoo it while it was completely in the
display. Hint - testing location 00$F (WINDOW-l) would
tell you if an animal was on its way out.
020002100220023002400250026002700280029002A002B002C0-
A2
3B
4C
03
A0
D0
6C
0D
B5
B5
EF
01
00
0D
CA
25
18
05
13
10
A2
6C
60
4C
61
00
86
10
19
AA
Bl
CA
02
0A
95
8D
0B
61
71
6E
F9
AD
69
70
10
E6
B5
6B
40
02
40
ID
A9
E6
04
0A
99
F9
6C
5A
E8
17
AA
00
41
00
6D
17
85
66
20
C6
95
30
8C
B0
00
IF
95
A5
4A
6F
00
40
72
5B
F9
42
B6
61
01
60
6C
4A
BD
88
IF
D0
CA
A9
17
BC
51
00
66
CA
F0
4A
A4
10
20
IE
D0
7F
E6
C2
47
63
10
09
4A
02
F8
6A
A9
F9
8D
73
C8
01
58
FB
C6
4A
85
84
IF
20
86
41
D0
08
00
4C
A2
6D
C9
70
6C
C5
85
5A
17
FC
00
00
40
0B
C6
06
A9
A2
6F
72
F0
A0
88
00
63
00
B5
6E
90
02
05
D0
A5
09
13
88
00
58
00
60
D0
02
85
B5
06
6C
A2
A2
CA
00
4E
D0
03
29
71
66
A5
30
F0
05
10
00
00
HI 10
BY JIM BUTTERFIELD
0200
0201
0203
0204
0206
0208
020A
020C
020D
020F
0212
0214
0215
0217
0219
021B
02 ID
021F
0221
0223
0226
0229
022B
022D
022F
0231
F8
A5
38
69
A2
C9
DO
8A
85
20
DO
D8
A9
85
A9
85
A2
86
86
20
20
C9
FO
C5
FO
85
EO
START
TOP
00
01
99
01
EO
40 IF
ED
99
FB
00
FA
AO
F9
El
IF IF
6A IF
13
D3
E2
F2
E2
OVRO
RSET
NSET
GUESS
SED
LDA
SEC
ADC
LDX
CMP
BNE
TXA
STA
JSR
BNE
CLD
LDA
STA
LDA
STA
LDX
STX
STX
JSR
JSR
CMP
BEQ
CMP
BEQ
STA
67
RND
generate random f
01 to 98
#0
fl
overflow at 99
#$99
OVRO
RND
KEYIN
TOP
#$99
initialize:
hi
POINTH
#0
POINTL
and lo
#$AO guess counter
INK
NGUESS
GUESS
LAST
same key?
0233
0235
0237
0239
023A
023B
023C
023D
023F
0240
0242
OA
FO 10
BO EA
OA
OA
OA
OA
A2 03
OA
26 F9
CA
0243
0245
0247
0249
024B
024D
024F
0251
10
30
A5
C5
90
C5
BO
85
A6
E4
90
A6
E4
BO
85
A6
E8
EO
FO
DO
0255
0257
0259
025B
025D
025F
0261
0263
0264
0266
0268
FA
DC
F9
EO
06
FB
D2
FB
EO
F9
08
FA
F9
C4
FA
El
LOOP
EVAL
OVR1
OVR2
AA
B5
B5
xxxxx
CMP
BEQ
BCS
ASL
ASL
ASL
ASL
LDX
ASL
ROL
DEX
BPL
BMI
LDA
CMP
BCC
CMP
BCS
STA
LDX
CPX
BCC
LDX
CPX
BCS
STA
LDX
INX
CPX
BEQ
BNE
#$OA
EVAL
GUESS
A
A
A
A
#3
A
INK
LOOP
GUESS
INK
RND
OVR1
POINTH
GUESS
POINTH
RND
INK
OVR2
POINTL
INK
GUESS
POINTL
NGUESS
#$AA
RSET
NSET
'A' key?
yes, evaluate guess
no key?
roll character
..into..
position..
. then
. into
.display
guess lower..
..than number?
yes, s k i p
no, check hi
out of range?
number lower..
..than guess?
yes, skip
no,check lo
out of range?
'guess' number
. .plus 1
past limit?
yes, reset
0200 F8 A5 EO 38 69 00 A2 01 C9 99 DO 01 8A 85 EO 20
0210
40 IF DO ED D8 A9 99 85 FB A9 00 85 FA A2 AO 86
0220 F9 86 El 20 IF IF 20 6A IF C9 13 FO D3 C5 E2 FO
0230 F2 85 E2 C9 OA FO 10 BO EA OA OA OA OA A2 03 OA
0240 26 F9 CA 10 FA 30 DC A5 F9 C5 EO 90 06 C5 FB BO
0250 D2 85 FB A6 EO E4 F9 90 08 A6 FA E4 F9 BO C4 85
0260 FA A6 El
E8 EO AA FO B5 DO B5
68
BY CHUCK EATON
DESCRIPTION THIS IS AN EIGHT LAP HORSE RACE AND YOU CAN BE THE
JOCKEY AND WHIP YOUR HORSE TO GO FASTER. WARNING ... WHIP
THE HORSE TOO MUCH AND HE PROBABLY POOPS OUT. THE PROGRAM
STARTS AT 0200.
HORSE
TRACK
WHIPPING BUTTON
PRINCE CHARMING
TOP
PC
COLORADO COWBOY
MIDDLE
C
IRISH RAIR
BOTTOM
4
0200
0201
0203
0206
0208
0209
020B
020D
0210
0212
0214
0217
0219
021C
021D
021F
0221
0224
0226
0228
022A
022B
022D
022F
0231
0233
0235
0237
023A
023C
023E
023F
0241
0244
0246
0248
024A
024C
024E
0250
0252
0254
D8
A2
BD
95
CA
10
A9
8D
AO
A2
B9
84
20
C8
CO
90
20
A5
30
A2
CA
30
D6
DO
86
A4
B6
B9
35
95
E8
96
B9
49
15
95
EO
30
DO
A5
FO
DO
13
D9 02
7C
INIT
F8
7F
DISP
41 17
00
09
7C 00 LITE
FC
4E IF
06
F3
3D IF
8F
E3
03
NEXT
DE
86
F9
99
99
83
ED 02
7C
7C
83
ED 02
FF
7C
7C
05
2B
06
8F
IB
23
CLD
...INITIALIZATION...
LDX #$13
LDA 02D9,X HORSES TO STARTING GATE
STA 007C,X
DEX
BPL INIT
LDA #$7F
...LIGHT DISPLAY...
STA 1741
LDY #$00
LDX #$09
LDA 007C,Y
STY OOFC
JSR 1F4E
OUTPUT DIGIT
INY
SIX DIGITS DISPLAYED?
CPY #$06
BCC LITE
NOT YET
TURN OFF DIGITS
JSR 1F3D
LDA LAP CNT. FINISHED TOTAL LAPS?
BMI DISP
YES, FREEZE DISPLAY
LDX #$03
DEX
NEXT HORSE
BMI DISP
FINISHED 3 HORSES
DEC 0086,X DEC. CNT., HORSE X
BNE NEXT
NOT ZERO, NEXT HORSE
SAVE HORE INDEX
STX 0099
AND PUT IN Y AS INDEX
LDY 0099
LDX 0083,Y DIGIT POS. OF HORSE IN X
LDA 02ED,Y MASK TO REMOVE HORSE
AND 007C,X GET RID OF HORSE
STA 007C,X RETURN REMAINING HORSES
INX
GO TO NEXT DIGIT RIGHT
STX 0083,Y UPDATE HORSE DIGIT POS.
LDA 02ED,Y GET MASK
EOR #$FF
CHANGE TO AN INSERT MASK
ORA 007C,X PUT HORSE IN NEXT
STA 007C,X DIGIT RIGHT
REACHED RIGHT SIDE?
CPX #$05
BMI POOP
NOT YET
OFF RIGHT SIDE, CHANGE LAP
BNE NLAP
LDA 008F
CHECK LAP COUNTER
BEQ LAST
IF ZERO, LAST LAP
BNE POOP
69
0256
0258
0259
025B
025D
025F
0260
0262
0264
0266
0268
026A
026C
026D
026F
0271
0273
0275
0277
0279
027C
027E
0281
0283
0285
0288
028B
028D
028F
0292
0294
0296
0298
029A
029C
029F
02A2
02A4
02A6
02A9
02AB
02 AC
02AD
02AF
02B1
02B4
02B5
02B7
02B9
02BA
02BC
02BE
02CO
02C2
A2 02
NLAP
38
DOWN
B5 83
E9 06
95 83
CA
10 F6
A2 06
B5 7C
STOR
95 76
A9 80
95 7C
CA
DO F5
C6 8F
LAST
DO 06
A5 81
09 06 .
85 81
B9 89 00 POOP
FO OA
20 C5 02
29 3C
DO 1A
99 89 00
20 C5 02 NOPO
29 38
85 9A
B9 8C 00
30 OB
29 38
C5 9A
BO 05
A9 FF
99 89 00
20 3D IF FAST
AO FF
A6 99
3D FO 02
FO 01
88
98
SKIP
55 89
85 9A
20 C5 02
38
29 01
65 9A
18
A6 99
75 8C
95 8C
95 86
4C 2A 02
LDX #$02
SEC
LDA 0083,X
SBC #$06
STA 0083,X
DEX
BPL DOWN
LDX #$06
LDA 007C,X
STA 0076,X
LDA #$80
STA 007C,X
DEX
BNE STOR
DEC 00 8F
BNE POOP
LDA 0081
ORA #$06
STA 0081
LDA 0089,Y
BEQ NOPO
JSR RAND
AND #$3C
BNE FAST
STA 0089,Y
JSR RAND
AND #$38
STA 009A
LDA 008C,Y
BMI FAST
AND #$38
CMP 009A
BCS FAST
LDA #$FF
STA 0089, Y
JSR KEYIN
LDY #$FF
LDX 0099
AND 02FO,X
BEQ SKIP
DEY
TYA
EOR 0089,X
STA 009A
JSR RAND
SEC
AND #$01
ADC 009A
CLC
LDX 0099
ADC 008C,X
STA 008C,X
STA 0086,X
JMP NEXT
70
********
h*kh
02C5
02C6
02C8
02CA
02CC
02CE
Q2DO
02D2
02D4
02D5
02D7
38
A5
65
65
85
A2
B5
95
CA
10
60
92
95
96
91
04
91
92
F9
FROM J. BUTTERFIELD
KIM USER NOTES - 1
PAGE 4
w
m
"V
02D8- 00/80/80/80/80/80/80/80
02EO- FF/FF/FF/80/80/80/00/00/00/80/80/80/08/FE/BF/F7
02FO- 01/02/04
xxswcx HEX DUMP - HORSERACE xxxxx
0200
0210
0220
0230
0240
0250
0260
0270
0280
0290
02AO
02BO
02CO
02DO
02EO
02FO
D8
AO
F3
F9
83
A5
10
8F
02
8C
3D
9A
95
B5
FF
01
A2
00
20
86
B9
8F
F6
DO
29
00
IF
20
86
91
FF
02
13
A2
3D
99
ED
FO
A2
06
3C
30
AO
C5
4C
95
FF
04
BD
09
IF
A4
02
IB
06
A5
DO
OB
FF
02
2A
92
80
D9
B9
A5
99
49
DO
B5
81
1A
29
A6
38
02
CA
80
02
7C
8F
B6
FF
23
7C
09
99
38
99
29
38
10
80
95
00
30
83
15
A2
95
06
89
C5
3D
01
A5
F9
00
71
7C
84
E3
B9
7C
02
76
85
00
9A
FO
65
92
60
00
CA
FC
A2
ED
95
38
A9
81
20
BO
02
9A
65
00
00
10
20
03
02
7C
B5
80
B9
C5
05
FO
18
95
80
80
F8
4E
CA
35
EO
83
95
89
02
A9
01
A6
65
80
80
A9
IF
30
7C
05
E9
7C
00
29
FF
88
99
96
80
80
7F
C8
DE
95
30
06
CA
FO
38
99
98
75
85
80
08
8D
CO
D6
7C
2B
95
DO
OA
85
89
55
8C
91
80
FE
41
06
86
E8
DO
83
F5
20
9A
00
89
95
A2
80
17
90
DO
96
06
CA
C6
C5
B9
20
85
8C
04
80
BF F7
KtY TRAIN
Butterfild
Ever wish you could touch-type your KIM keypad like some people
can type? It's not hard; all you need is practice. And what
better teacher to drill you on key entry than the KIM system itself?
Load this fully relocatable program anywhere. Start it up, and
the display will show a random hexadecimal digit, ffcwn 0 to F.
Hit the corresponding key, and the display will blank, and then
present you with another random digit. Hit the Wrong key. and
nothing will happen.
The educational principle involved is called positive reinforcem^ht.
That is, you're rewarded for doing the right thing, and ignored if
you do it wrong. A few minutes
of practice a day. and you'll become
a speed demon on the keyboard.1
0000 20 hO IF START JSR KEYIN
0003 DO FB
BNE START
0005 AD Oh 17
LDA TIMER
LSRA LSRA
0008 UA UA
OOOA UA UA
LSRA LSRA
OOOC 85 FF
STA TEMP
OOOE OA OA
ASLA ASLA
0010 OA OA
ASLA ASLA
0012 05 FF
ORA TEMP
STA INH
OOlU 85 F9
0016 85 FA
STA POINTL
0018 85 FB
STA POINTH
001A 20 IF IF LIGHT JSR SCANDS
001D 20 6A IF
JSR GETKEY
0020 C5 FF
CMP TEMP
0022 FO DC
BEQ START
002U DO FU
BNE LIGHT
The random number used in this program is taken from the KIM timer.
This timer runs continuously and might be anywhere between 00 and FF
at the instant we push the button. We use the four left hand (high order']
bits of the timer to produce the next digit.
Be sure that KIM is not in decimal mode when you run this nrogram set address OOF1 to 00 before starting. If you forget, you might
find that the alphabetic keys (A to F) don't work right.
Exercises: can you make the program clear decimal mode automatically?
How about a counter to record the number of correct keystrokes you
have made? That way, you could time yourself to see how many keys
you can get right in 60 seconds. The count could be shown in the
two right hand digits of the display. Do you think it should be
in decimal or hexadecimal?
72
KIM NIM
BY JIM BUTTERFIELD
20 40 IF START
20 6A IF
C9 13
DO
AD
A2
A8
29
FO
3A
04 17
02
SPLIT
0?
03
18
69 02
95 04
98
4A
CA
10
20
DO
AD
ZINCH
4A 4A
EF
40 IF STALL
FB
04 17
A2 02
SPLAT
A8
29 07
95 07
98
4A 4A 4A
CA
10 F4
85 01
0238 85 02
023A A2 06
KEYIN
directional regs
GETKEY
#$13
GO key?
NOGO
nope, skip
TIMER get random nbr
#2
split into 3
save A
#7
extract 3 bits
ZINCH unless zero..
..add two
#2
VALUE,X store pile val
TYA
bring back rand
LSRA LSRA LSRA
DEX
BPL SPLIT
JSR KEYIN wait for. .
BNE STALL ..key release
LDA TIMER new random nbr
LDX #2
split 3 ways
TAY
again
AND #7
3 bits
STA VALUE+3.X
TYA
LSRA LSRA LSRA
DEX
BPL SPLAT
STA PILE
pile zero
STA MOVE
it's your move
LDX #6
for each pile..
73
JSR
JSR
CMP
BNE
LDA
LDX
TAY
AND
BEQ
CLC
ADC
STA
023C
023E
0241
0242
0244
0246
0243
024A
024C
024E
0250
0252
0254
0255
0257
0259
025B
0250
025E
0260
0262
0264
0266
0268
026A
026C
026E
02?0
0272
0274
0277
0279
027C
027E
0231
0233
0235
0237
0239
023B
023D
023F
0292
0294
0296
0293
029B
029E
02AO
02A2
02A4
02A5
02A7
02A9
B5
20
CA
DO
A6
DO
C9
BO
C9
03
2D
DRESS
03
F3
02
3D
10
39
00
NOGO
FO 35
C9
90
33
E9
A6
DO
AA
B5
FO
36
35
BO
A6
FO
85
B5
OA
12
OA
25
01
OA
IF
01
IB
03
03
20
E6
20
DO
20
35
46
2D 03
02
16 03
07
05 03
OB
00
09
01
2A
NUM
whose move?
computer's, skip
hex digit keyed?
no, skip
zero key?
yes, skip
alphabetic?
no, numeric
change A-F...
..to 1-6
#9
PILE
pile already..
NOKEY ..selected?
FLASHR,X
^
NOKEY nothing in pile?
PILE
OK, mark pile
FLASHR store flash code
NOKEY unconditional
LSR IQ
get smart!
; all routines join here - display
NOKEY
7F
41 17
LIGHT
13
05
OB
LITE
40 17
42 17
11
LITEX
FC
38
EF
12
E7
DRESS
MOVE
NOKEY
#$10
NOKEY
#0
NOKEY
#$OA
NUM
LDX PILE
BEQ
STA
LDA
CMP
BCC
SBC
JSR
INC
JSR
BNE
JSR
95 OA
A9
3D
AO
A2
B5
3D
30
E6
DO
88
CA
10
E6
DO
BNE
LDX
BNE
CMP
BOS
CMP
BEQ
CMP
BCC
SEC
SBC
LDX
BNE
TAX
LDA
BEQ
STX
STA
BCS
05 03
90 13
E5 03
A6 01
A5 OA
55 OA
LDA VALUE-1,X
..change to
JSR SEG
..segments
DEX
LDX
LDA
EOR
STA
LDA
STA
LDY
LDX
LDA
STA
STY
INC
BNE
DEY
DEX
BPL
INC
BNE
PILE
FLASHR flash pile
FLASHR,X
FLASHR,X
#$7F
PADD
#13
#5
WINDOW,X
SAD
SBD
CUE
LITEX
DEY
LITE
WAIT
LIGHT
74
02AB
02AD
02AF
02B1
02E3
02B402B6
02B3
02BA
02BC
02BD
02BF
02C1
02C3
A9
85
A6
FO
CA
DO
A9
A2
55
CA
10
85
A2
B5
02C7
02C9
02CB
02CC
02CE
02DO
02D2
02D5
02D?
02D9
02DB
02DD
02DF
02E1
02E3
02E5
02E?
02E9
02EB
02ED
02FO
02F3
02F5
02F8
02F9
02FB
02FD
02FF
0301
D5
90
CA
DO
FO
A**
CC
BO
85
86
A6
B5
85
E6
A5
C9
90
A6
A5
20
20
DO
20
38
26
A9
85
85
D8
F8
12
02
4E
LDA #$F8
STA WAIT
LDX MOVE
BEQ
DEX
BNE
LDA
LDX
MERGE EOR
DEX
2B
00
05
0^4FB
OA
06
03
LOOP
0205 4-5 OA
0302
0305
0307
0309
030B
030D
0310
0312
0313
0315
03
05
F5
OB
00
04
0403
01
01
OA
OA
02
02
10
13
01
03
2D
16
06
05
FOUND
17
MOVE
TRY
BPL
STA
LDX
LDA
EOR
CMP
BCC
DEX
BNE
BEQ
LDY
CPY
BCS
STA
STX
LDX
LDA
STA
INC
LDA
CMP
BCC
LDX
LDA
03
JSR
03
JSR
BNE
03
JSR
SEC
00
ROL
KEEP
LDA
00
02
STA
01
STA
CLD
4c oo 02
JMP
A9 00
MESSAG LDA
85 02
STA
STA
85 01
A2 06
LDX
BD 3B 03 MLOOP LDA
95 OA
STA
CA
DEX
BPL
10 F8
RTS
60
EXIT
whose move?
not computer's
first step?
no, skip stratgy
TRY
#0
#5
merge all piles..
VALUE, X ..by EOR-ing them
MERGE
FLASHR
save EOR product
#6
re-examine piles
VALUE-1, X
FLASHR
}
VALUE-1, X
^
W
FOUND
LOOP
MOVE
IQ
IQ high enuff?
TIMER ..randomly..
MOVE
TEMP
PILE
PILE
FLASHR, X flash mask
FLASHR
Flash.. .
MOVE
MOVE
#$10
EXIT
PILE
TEMP
SEG
SURVEY
KEEP
make move
end of game?
nope, keep
go in
MESSAG U LOSE1
dummy up. .
IQ
..the computer
#0
MOVE
it's your move
PILE
un-flash
START
#0
MOVE
PILE
end of play
no flashing
#6
move 7 digits
DATA,X
pick em up..
FLASHR, X ..put em down
MLOOP
75
0316
0313
031A
031C
031E
A9 00
SURVEY LDA #0
STA FLASHR un-flash
85 OA
A2 06
05 03
REVUE
BO 06
,,
LDX #6
for all piles..
CMP VALUE-1,X
BCS SMALL
0320 B5 03
0322 85 03
0324
0326
032?
0329
032B
032C
032D
032F
0331
0332
0335
0337
0339
033A
LDA VALUE-1,X
STA TEMP
86 01
STX PILE
CA
SMALL DEX
DO F3
BNE REVUE
C6 03
DEC TEMP
A3
TAY
test A
60
RTS
SEG
95 03
STA VALUE-1,X
store value
FO 04
BEQ NIL
blank digit
TAY
A3
B9 E? IF
LDA TABLE,Y
NIL
STA FLASHR,X segments to wndw
95 OA
A9 oo
LDA #0
RTS
60
FF 06 BE 00 B8 BF ED F9
(DATA)
0342
Jc:::s;;- HEX DUMP - KIM NIM """""
0200
0210
0220
0230
0240
0250
0260
0270
0280
0290
02AO
02BO
02CO
02DO
02EO
02FO
0300
0310
0320
0330
0340
20
29
20
4A
03
C9
86
90
03
41
DO
02
OA
A4
OA
20
01
95
B5
04
ED
40
07
40
4A
CA
OA
01
13
85
17
FC
FO
A2
00
E6
16
D8
OA
03
A8
F9
IF
FO
IF
4A
DO
90
85
E5
OB
AO
88
4E
06
CC
02
03
4C
CA
85
B9
20
03
DO
CA
F8
12
OA
03
46
13
88
CA
B5
04
A5
DO
00
10
03
E7
6A
18
FB
10
A6
38
BO
20
00
A2
CA
DO
03
17
02
06
02
F8
86
IF
IF
69
AD
F4
02
E9
IF
2D
A6
05
10
2B
45
BO
C9
20
A9
60
01
95
C9
02
04
85
DO
09
A6
03
01
B5
EF
A9
OA
04
10
05
00
A9
CA
OA
13
95
17
01
3D
A6
01
E6
A5
OB
E6
00
D5
85
90
03
85
00
DO
A9
76
DO
04
A2
85
C9
01
FO
3A
98
02
02
10
DO
IB
AD
4A
A8
A2
BO
2A
85
02
OA
8D
12
A2
03
03
18
38
02
85
F3
00
20
55
40
DO
05
90
86
A6
26
85
OA
C6
60
16
OA
17
E7
55
05
01
01
00
01
A2
03
FF
04
4A
29
06
39
AA
03
03
95
8C
A9
04
CA
A6
A5
A9
A2
06
A8
06
17 A2 02
4A CA 10
07 95 07
B5 03 20
C9 00 FO
B5 OA FO
B5 03 C5
DO 07 20
OA A9 7F
42 17 E6
F8 85 12
CA 10 FB
DO F5 FO
01 B5 OA
03 20 2D
00 85 02
06 BD 3B
D5 03 BO
60 95 03
BE 00 B8
A8
EF
98
2D
35
25
03
05
8D
11
A6
85
OB
85
03
85
03
06
FO
BF
KfM- TAC-TOi
BY LEW EDWARDS
DIRECTIONS PLAY BEGINS WITH KIM MAKING THE FIRST PLAY WHEN
"GO" IS PRESSED. THE SECOND THROUGH FOURTH DIGITS OF
*
THE DISPLAY HOLD THE PATTERN WITH SQUARES NUMBERED AS:
YOUR ENTRY WILL BE IMMEDIATE BUT
789
KIM'S ACTION WILL BE DELAYED. YOUR
456
PLAYS LIGHT STEADILY WHILE KIM'S
123
FLICKER. A WINNING ROW BLINKS AND A DRAW BLINKS
EVERYTHING. ON COMPLETION OF A GAME, THE "GO" KEY WILL
START A NEW GAME. IF YOU PREFER TO PLAY FIRST, PRESS THE
"+" KEY INSTEAD. THE KIM HAS AN I.Q. LEVEL THAT CAN BE
CHANGED BY PRESSING "PC" AT GAMES END. YOU WILL SEE,
"ODDS" AND KIM'S I.Q. DISPLAYED. THE I.Q. IS INITIALLY
SET TO 75%, COO. CHANGE IT TO WHAT YOU WISH AND THEN
PRESS "DA" TO RETURN TO THE DONE LOOP AND yART A tftw
GAME IN THE NORMAL MANNER. THE I.Q. L ADJUSTED UPWARD
EACH TIME THE PLAYER WINS AND DOWNWARD EACH TIME KIM WINS.
THE PROGRAM STARTS AT 0100.
0100
0103
4C 10 03
EA EA EA
0106
0108
010A
010C
010D
A9
15
95
60
EA
20
BF
BF
EA
08/08/08/40/40/40/01/01/01
0118
0120
0128
01/04/07/01/02/03/01/03
02/05/08/04/05/06/05/05
03/06/09/07/08/09/09/07
0130
0132
0134
0136
0138
013A
013C
013D
013F
0140
0142
0144
0146
77
0147
0149
014B
014D
0150
0153
0156
0159
015C
015F
0162
0163
0165
0200
0202
0204
0206
0207
0209
020B
020D
020F
0212
0214
0216
0218
0219
02 IB
02 IE
021F
0221
0223
0225
0228
022A
022C
022E
022F
0231
0234
0235
0237
0239
02 3B
023E
0240
0241
0243
0245
0248
024B
024E
95 BF
AO 08
A9 00
99 C8 00
BE 17 01
20 8A 03
BE IF 01
20 8A 03
BE 27 01
20 8A 03
88
DO E6
60
A9 00
A2 ID
95 B4
CA
DO FB
A9 05
85 BB
AO 04
20 F2 03
A2 04
D5 BB
FO F7
CA
DO F9
99 BB 00
88
DO EE
E6 B6
AO 04
20 F2 03
A2 05
D5 B6
FO F7
CA
DO F9
99 B6 00
88
DO EE
A9 03
AO 08
D9 C8 00
FO 05
88
DO F8
FO 15
BE 17 01
20 06 01
BE IF 01
20 06 01
.*.# *M**
'W* W*tf*
UPDA
UPLP
NEW
INLP
ELP1
ELP2
OLP1
OLP2
PVAL
TEST
WNLP
SS,X
"$08
-$00
RS,Y
SQ1,Y
RSADD
SQ2,Y
RSADD
SQ3,Y
RSADD
UPLP
LDA #$00
LDX #$1D
STA OOB4,X
DEX
BNE INLP
LDA #$05
STA OOBB
LDY #$04
JSR RPLA
LDX #$04
CMP REVN,X
BEQ ELP1
DEX
BNE ELP2
STA REVN,Y
DEY
BNE ELP1
INC ODEV
LDY #$04
JSR RPLA
LDX #$05
CMP RODD,X
BEQ OLP1
DEX
BNE OLP2
STA RODD,Y
DEY
BNE OLP1
LDA #$03
LDY #$08
CMP ROWS,Y
BEQ WIN
WIN
DEY
BNE WNLP
BEQ DRAW
LDX SQ1,Y
JSR BLNK
LDX SQ2,Y
JSR BLNK
78
THEN LOAD
CURRENT STATUS
VALUES
CLEAR REGISTERS
BLINK #1
BLINK #2
0251
0254
0257
025A
025C
025E
0260
0262
0263
0265
0267
026A
026B
026D
0270
0272
0274
0276
0279
027B
027D
027F
0280
0282
0284
0286
0289
028B
028D
0290
0292
0294
0296
0299
029B
029E
02AO
02A3
02A5
02A8
02AA
02 AD
02AF
02B1
02B4
02B6
02B8
02BB
02BD
02CO
02C2
02C4
02C6
BE
20
4C
A2
27 01
06 01
FE 02
09
LDX SQ3,Y
DRAW
A9 CO
OPEN
35 BF
FO OE
CA
DO F7
A2 09
20 06 01 NXBL
CA
DO
4C
E6
A5
DO
20
FO
C9
BO
AA
B4
DO
A9
20
E6
DO
20
E6
DO
A9
20
A9
20
A9
20
A9
20
A9
20
DO
A9
20
DO
A9
20
DO
20
29
C5
BO
A4
FA
15 03
B5
DB
17
A6 03
FB
OA
F7
BF
F2
40
47
DB
AA
4C
Dl
F9
08
C8
02
C8
04
C8
01
C8
CO
30
43
30
30
3C
08
30
35
B3
OF
D2
IF
B5
TURN
KEY
01
03 WAIT
03
03
03
03
01
01
01
03
IPLA
JSR BLNK
JMP MTST
LDX -$09
LDA #$CO
AND DSPL,X
BEQ TURN
DEX
BNE OPEN
LDX #$09
JSR BLNK
DEX
BNE NXBL
JMP DONE
INC PLA4
LDA MODE
BNE WAIT
JSR KEYS
BEQ KEY
CMP #$OA
BCS KEY
TAX
LDY DSPL,X
BNE KEY
LDA #$40
JSR UPDATE
INC MODE
BNE PVAL
JSR DISPLAY
INC LPCNT
BNE WAIT
LDA #$08
JSR PSLD
LDA #$02
JSR PSLD
LDA #$04
JSR PSLD
LDA #$01
JSR PSLD
LDA #$CO
JSR GETPLA
BNE PLAY
LDA #$30
JSR GETPLA
BNE PLAY
LDA #$08
JSR GETPLA
BNE PLAY
JSR RAND
AND #$OF
CMP IQ
BCS DUMB
LDY PLAC
79
BLINK #3
CHECK THE WINNER
OPEN SQUARE?
YES - MAKE IT
2 IN A ROW FOR..
PLAYER
YES - BLOCK IT
POSSIBLE SQUEEZE
PLAY FOR KIM
YES - DO IT
HOW MUCH SMARTS?
NEEDED?
KIM'S I.Q.
TOO LOW - BAD MOVES
SMART
02C8
02CA
02CC
02CE
02 DO
02D2
02D4
02D6
02D8
02DA
02DC
02DF
02E1
02E3
02E5
02E7
02E9
02EB
02ED
02EE
02FO
02F2
02F4
02F7
02F9
02FB
02FE
0300
0302
0304
0306
0308
030 A
030C
030E
0310
0312
0314
0315
0318
Q31A
031C
031E
031F
0321
0323
0325
0327
0329
032B
032D
032F
0331
0333
0336
0339
CO
DO
29
DO
CO
DO
24
30
70
A9
20
DO
AO
DO
AO
B6
B5
FO
88
DO
FO
A9
20
C6
A9
4C
A5
DO
C6
10
E6
A9
C5
90
BO
A9
85
D8
20
AO
C9
FO
88
C9
FO
C9
DO
A9
85
A9
85
A5
85
20
20
20
01
04
01
17
04
06
C4
OD
07
02
30 01
11
05
02
09
B6
BF
05
F7
F3
80
47 01
DB
OC
39 02
DB
04
D2
OF
D2
10
D2
F4
05
OC
D2
A6 03
01
13
28
12
23
14
EE
OD
FB
D5
FA
D2
F9
IF IF
40 IF
6A IF
FOUR
SPLA
PLAC
DUMB
TPLA
PLAY
MTST
IQDN
IQUP
BCS DONE
STIQ
IQST
DONE
CHIQ
CPY
BNE
AND
BNE
CPY
BNE
BIT
BMI
BVS
LDA
JSR
BNE
LDY
BNE
LDY
LDX
LDA
BEQ
DEY
BNE
BEQ
LDA
JSR
DEC
LDA
JMP
LDA
BNE
DEC
BPL
INC
LDA
CMP
BCC
LDA
STA
CLD
JSR
LDY
CMP
BEQ
DEY
CMP
BEQ
CMP
BNE
LDA
STA
LDA
STA
LDA
STA
JSR
JSR
JSR
80
#$01
FOUR
#$01
TPLA
#$04
SPLA
SQST+5
DUMB
PLAC
#$02
GETPLA
PLAY
"$05
TPLA
#$09
RPLA,Y
DISP,X
PLAY
RPLA
DUMB
#$80
UPDATE
MODE
#$OC
TEST
MODE
IQUP
IQ
DONE
IQ
#$10
IQ
IQDN
1ST PLAY?
NO
YES
1/2 TIME PLAY A CORNER
4TH PLAY?
NO, SKIP
YES, CK WHO HAS CENTER
KIM - PLAY A SIDE
PLAYER-PLAY A CORNER
CAN PLAYER MAKE A..
SQUEEZE PLAY?
YES - BLOCK IT
START WITH THE CENTER
START WITH THE SIDES
USE THE RANDOM PLAY
TABLE - OPEN* SQUARE?
FOUND ONE - PLAY IT
NO, TRY NEXT ONE
NOT YET
START OVER
MARK THE..
SQUARE FOR KIM
PLAYBfc'S TURN NEXT
FIRST DID KIM WIN?
WHO WON?
PLAYER, UP KIM'S I.Q.
KIM'S TOO SMART
LOWER THE I.Q.
NOT BELOW ZERO
NOT OVER 10 HEX
#$OC
IQ
KEYS
:c
$01
#$13
SEMO
#$12
SEMO
#$14
DONE
#$OD
POINTH
#$D5
POINTL
IQ
INH
SCANDS
KEYPR
GETKEY
AND I.Q.
ON DISPLAY
033C
033E
0340
0342
0344
0346
0348
034B
C9 *L1
FO D5
BO E5
85 D2
90 El
84 DB
4C 00 02
EA
SEMO
CMP
BEQ
BCS
STA
BCC
STY
JMP
NOP
#$11
DONE
CHIQ
IQ
CHIQ
MODE
NEW
034C
A9 7F
DISPLAY
034E
8D 41 17
E6 DA
0351
AO 00
0353
DIGX
A2 OB
0355
0357
B9 CO 00 SEGY
035A
85 FC
035C
FO 14
035E
29 20
0360
FO 04
0362
24 DA
0364
70 OC
0366
FLIC
A5 FC
0368
29 40
036A
DO OA
036C
A5 DA
036E
29 08
0370
FO 04
0372 A9 00
OFF
0374
FO 03
B9 OF 01 ON
0376
DIGT
84 FC
0379
037B
20 4E IF
037E
C8
037F
CO 09
0381
FO 06
EO
11
0383
FO
CE
0385
DO CE
0387
LAST
60
0389
038A
038C
038E
0390
0392
0394
0396
0398
039A
039C
039E
039F
03A2
03A5
LDA #$7F
STA PADD
OPEN DISPLAY CHANELS
*
INC RATE
LDY #$00
LDX #$OB
INDEX DIGIT
LDA SQST,Y
GET CONTROL BYTE
STA SAVE
SAVE IT
BEQ OFF
OPEN SQUARE
BLINK FLAG
AND #$20
BEQ FLIC
NOT ON - SKIP*BLINK
BIT RATE
BVS OFF
ALTERNATE ON-OFF
LDA SAVE
STE/DY FLAG
AND #$40
BNE ON
ON - SKIP FLICKER
LDA RATE
AND #$08
FLICI^R RATE
ON
BEQ ON
OFF
LDA #$00
BEQ DIGT
LDA SEGS,Y
SAVE FROM LOSS IN SUBR.
STY SAVE
DISPLAY A SEGMENT
JSR CONVD+6
I NY
LAST SQUARE
CPY #$09
BEQ LAST
YES - DONE
NO, LAST DIGIT?
CPX #$11
BNE DIGX
YES - REPEAT DIGITS
BNE SEGY
NO - NEXT DIGIT
RTS
;
" SUBROUTINE "RS ADD" "''"''
RSA
LDA SQST,X
B5 BF
STA
TEMP
85 D9
BIT
TEMP
WHO'S SQUARE?
24 D9
BMI
KIM
KIM'S
30 06
BVS
PLYR
PLAYER'S
70 08
OPEN
SQUARE VALUE
OPEN
LDA #$00
A9 00
BEQ
ADD
FO 06
KIM VALUE
A9 04
KIM
LDA #$04
BNE
ADD
DO 02
PLAYER VALUE
A9 01
PLYR
LDA # $ 0 1
ADD
CLC
18
ADD TO ROW STATUS
ADC RS,Y
79 C8 00
STA
RS,Y
BYTE
99 C8 00
RTS
60
81
03A6
03A9
03AC
03AE
03B1
03B2
03B3
03B4
03B5
03B7
03B9
03BB
03BD
03BF
03C1
03C3
03C4
03C6
03C7
03C8
03CA
03CC
03CE
0300
0301
0303
0305
03D7
03DA
03DC
03DF
03E2
03E5
03E8
03EB
03EE
03EF
03F1
85
A2
16
16
CA
DO
AO
A5
D9
DO
BE
20
BE
20
BE
20
88
DO
60
03F2
03F5
03F7
03F9
03FB
03FD
03FF
20
29
05
FO
C9
BO
60
09
09
OB
DB
F9
08
D9
C8
12
17
40
IF
40
27
40
E4
PSL
00
01
01
01
01
01
01
STA TEMP
LDX "$09
XLP
ASL PS,X
SHIFT PREVIOUS DATA
ASL PS,X
OUT OF THE WAY
DEX
BNE XLP
LDY -$08
YLP
LDA TEMP
CMP RS,Y
COUNT THE TIMES AN OPEN.
BNE NOCT
SQUARE FITS THE..
LDX SQ1,Y
TEST PARAMETER
JSR T+l
LDX SQ2,Y
JSR T+l
LDX SQ3,Y
JSR T+l
NOCT
DEY
BNE YLP
RTS
SUBROUTINE "RANDOM PLAYS"
B3 03 RPLA
OE
B6
F7
OA
F3
JSR
AND
ORA
BEQ
CMP
BCS
RTS
82
RAND
"$OE
ODEV
RPLA
-$OA
RPLA
is-
0100 4C 10 03 EA EA EA A9 20 15 BF 95 BF 60 EA EA 08
0110 08 08 40 40 40 01 01 01 01 04 07 01 02 03 01 03
0120 02 05 08 04 05 06 05 05 03 06 09 07 08 09 09 07
0130 85 D9 A2 09 A5 D9 35 DB 24 D9 DO 03 CA DO
0140 B5 BF DO 02 F6 DB 60 95 BF AO 08 A9 00 99
0150 BE 17 01 20 8A 03 BE IF 01 20 8A 03 BE 27 01 20
0160 8A 03 88 DO E6 60
0200 A9 00 A2 ID 95 B4 CA DO FB A9 05 85 BB AO 04 20
0210 F2 03 A2 04 D5 BB FO F7 CA DO F9 99 BB 00 88 DO
0220 EE E6 B6 AO 04 20 F2 03 A2 05 D5 B6 FO F7 CA DO'
0230 F9 99 B6 00 88 DO EE A9 03 AO 08 D9 C8 00 FO 05
0240 88 DO F8 FO 15 BE 17 01 20 06 01 BE IF 01 20 06
0250 01 BE 27 01 20 06 01 4C FE 02 A2 09 A9 CO 35 BF
0260 FO OE CA DO F7 A2 09 20 06 01 CA DO FA 4C 15 03
0270 E6 B5 A5 DB DO 17 20 A6 03 FO FB C9 OA BO F7 AA
0280 B4 BF DO F2 A9 40 20 47 01 E6 DB DO AA 20 4C 03
0290 E6 Dl DO F9 A9 08 20 C8 03 A9 02 20 C8 03 A9 04
02AO 20 C8 03 A9 01 20 C8 03 A9 CO 20 30 01 DO 43 A9
02BO 30 20 30 01 DO 3C A9 08 20 30 01 DO 35 20 B3 03
02CO 29 OF C5 D2 BO IF A4 B5 CO 01 DO 04 29 01 D&^7
02DO CO 04 DO 06 24 C4 30 OD 70 07 A9 02 20 30 01 DO
02EO 11 AO 05 DO 02 AO 09 B6 B6 B5 BF FO 05 88 DO F7
02FO FO F3 A9 80 20 47 01 C6 DB A9 OC 4C 39 02 A5 DB
0300 DO 04 C6 D2 10 OF E6 D2 A9 10 C5 D2 90 F4 BO 05
0310 A9 OC 85 D2 D8 20 A6 03 AO 01 C9 13 FO 28 88 C9
0320 12 FO 23 C9 14 DO EE A9 OD 85 FB A9 D5 85 FA A5
0330 D2 85 F9 20 IF IF 20 40 IF 20 6A IF C9 11 FO D5
0340 BO E5 85 D2 90 El 84 DB 4C 00 02 EA A9 7F 8D 41
0350 17 E6 DA AO 00 A2 OB B9 CO 00 85 FC FO 14 29 20
0360 FO 04 24 DA 70 OC A5 FC 29 40 DO OA A5 DA 29 08
0370 FO 04 A9 00 FO 03 B9 OF 01 84 FC 20 4E IF C8 CO
0380 09 FO 06 EO 11 FO CE DO CE 60 B5 BF 85 D9 24 D9
0390 30 06 70 08 A9 00 FO 06 A9 04 DO 02 A9 01 18 79
03AO C8 00 99 C8 00 60 20 4C 03 20 40 IF FO F8 20 6A
03BO IF AA 60 D8 38 A9 D4 65 D7 65 D8 85 D3 A2 04 B5
03CO D3 95 D4 CA 10 F9 60 EA 85 D9 A2 09 16 DB 16 DB
03DO CA DO F9 AO 08 A5 D9 D9 C8 00 DO 12 BE 17 01 20
03EO 40 01 BE IF 01 20 40 01 BE 27 01 20 40 01 88 DO
03FO E4 60 20 B3 03 29 OE 05 B6 FO F7 C9 OA BO F3 60
OOB6
OOCO-C8
OOC9-DO
OOD1
OOD2
I.Q.
OOD3-D8
OOD9
OODA
OODB
OODC-E4
OOFC
83
"""""
LUNAR LANDS*
Description The program starts at 0200. When started, you will find
yourself at 4500 feet and falling. The thrust on your machine
is set to low; so you'll pick up speed due to the force of
gravity.
You can look at your fuel at any time by pressing the
"F" button. Your fuel (initially 800 pounds) will be shown
in the first four digits of the KIM display.
^
The last two digits of the KIM display always show
your rate of descent or ascent. "A" restores altitude.
Set your thrust by pressing buttons 1 through 9.
Warning: button 0 turns your motor off, and it will not
re ignite! A thrust of 1, minimum, burns very little fuel;
but gravity will be pulling your craft down faster ^nd
faster. A thrust of 9, maximum, overcomes gravity and
reduces your rate of descent very sharply. A thrust of 5
exactly counterbalances gravity; you will continue to descend
(or ascend) at a constant rate. If you run out of fuel,
your thrust controls will become inoperative.
*"
A safe landing is considered to be one where you land
at a descent rate of 5 or less. After you land, your thrust
controls will be inoperative, since the motor is automatically
turned off; but you can still press "F" to look at your fuel..
Pressing "GO" starts a new flight.
0200
0202
0205
020?
0208
A2
BD
95
CA
10
020A
020C
020E
020F
A2
AO
F3
13
Jim
Butterfield
0210
0212
0214
0216
0217
0213
021A
021C
021E
0220
0222
0224
0225
0227
0229
022B
022D
022F
B5
75
95
CA
33
10
B5
10
A9
75
95
CA
10
A5
10
A9
35
A2
D5
D7
D5
F6
D3
02
99
D5
D5
10
33
A5
E5
35
A2
B5
E9
95
CA
10
BO
A9
A2
BFL
LDA
BFL
LDA
INCR
DIGIT
ALT+3.X
INCR
#$99
ADC ALT.X
STA ALT.X
DEX
BPL REGAL
DD
BPL
LDA
STA
LDX
STA
next digit
hi-order .. zero..
. . or . .
,
%
do next addition
UP
still flying?
#0
nope, turn off
DOWN
*
#2
ALT,X
STA TH2,X
DEX
BPL DD
UP
SEC
update fuel
LDA FUEL+2
SBC THRUST
STA FUEL+2
LDX #1
LP2
F7
OC
00
03
0250 95 DD
LDA ALT
F9
EO
DD
EO
01
DE
00
DE
LDA ALT.X
ADC ALT+2.X
STA ALT.X
DEX
DEY
E5
D5
OD
00
E2
02
0231 95 D5
0233 95 DB
0235 CA
0236
0233
0239
023B
023D
023F
0241
0243
0245
0247
0243
024A
024C
024E
DIGIT
LF3
0252 CA
0253 10 FB
LDA
SBC
STA
DEX
BPL
BCS
LDA
LDX
STA
DEX
BPL
FUEL.X
#%
FUEL.X
LP2
TANK still got fuel?
#0
nope, kill motor
#3
THRUST, X
LP3
20
A5
A6
09
A4
FO
FO
FO
A2
AO
13
A5
69
A5
69
BD 02
DE
TANK
DF
FO
El
20
9C
GOLINK
A4
CLINK
FE
5A
D9
05
D3
00
JSR
LDA
LDX
ORA
LDY
BEQ
BEQ
BEQ
LDX
LDY
CLC
LDA
ADC
LDA
ADC
THRSET
FUEL
fuel into regstrs
FUEL+1
#$FO
plus F flag
MODE
ST
GO
CALC
#$FE
#$5A
VEL+1
#5
VEL
#0
0273 BO
02?5 A2 AD
0277 AO DE
0279 93
027A A4 E2
027C FO 04
027E A5 05
0230 A6 D6
0232 35 ?B
36 FA
0236 A5 D9
0233 A6 D3
10 05
023C 33
023D A9 00
023F E5 D9
0291 35 F9
0293 A9 02
0295 35 E3
0297 D3
0293 20 IF
029B 20 6A
029E C9 13
02AO FO CO
02A2 BO 03
02A4 20tAD
02A7 C6 E3
02A9 DO ED
02AB FO B7
02AD
02AF
02B1
02B3
02B5
02B6
02B7
02B9
02BB
02BD
02BD
02BF
02CO
02C1
02C3
02C5
02C7
02C9
02CB
C9
90
49
35
60
AA
A5
FO
36
OA
05
OF
El
DD
FA
DD
A5 DD
33
F3
E9
35
A9
E9
35
60
05
DC
00
00
DB
02CC 45 01
02CF 99 31
GOOD
BCS
LDX
LDY
TYA
LDY
BEQ
LDA
LDX
STA
STX
GOOD
#$AD
#$DE
DOWN
ST
ALT
ALT+1
ST
FOINTH
POINTL
; show rate of ascent/descnt as absolute
LDA VEL+1
LDX VEL
up or down?
BPL FLY
..up, we're OK
SEC
LDA #0
,
SBC
VEL+1
FLY
STA INH
LDA #2
loop twice thru display
STA DECK
FLITE CLD
display &*ey test
IF
JSR SCANDS light 'em up
IF
JSR GETKEY check keys
GO key?
CMP #$13
BEQ GOLINK
. .yes
BCS NOKEY
..if no key
02
JSR DOKEY
NOKEY DEC DECK
BNE FLITE
BEQ CLINK to CALC
MODE
86
.BYTE
.BYTE
.BYTE
.BYTE
.BYTE
02D2 99 97
02D4
02D5
02D8
02D9
02
03 00 00
01
01
acceleration
thrust
fuel
display mode
in flight/landed
$99,$9?
2
8,0,0
1
1
end
OOD5
OOD8
OODB
OODD
ALT
VEL
TH2
THRUST
FUEL
MODE
DOWN
DECK
OODE
OOE1
OOE2
OOE3
*=*+3
*=*+2
*=*+!
*=*+3
*=*+!
*=*+!
*=*+!
SGANDS
GETPCEY
POINTH
POINTL
INK
=S1F1F
=$1F6A
=$FB
= $FA
=$F9
A2
B5
75
02
01
95
FO
D8
A6
D9
FO
05
F8
81
OD
D5
D5
95
B5
DD
20
69
D6
85
CO
49
E9
00
BD CC
75 D7
95 D5
D5 95
DE E9
CA 10
FO 5C
00 BD
85 FB
F9 A9
BO 03
OF 85
05 85
99 97
02
95
CA
DB
00
FB
FO
04
86
02
20
El
DC
02
95 D5
D5 CA
10 E5
CA 10
95 DE
20 BD
A4 A2
A2 AD
FA A5
85 E3
AD 02
60 AA
A9 00
08 00
CA
88
A5
F9
CA
02
FE
AO
D9
D8
C6
A5
E9
00
10
10
D5
38
10
A5
AO
DE
A6
20
E3
DD
00
01
F8
F6
10
A5
F7
DE
5A
98
D8
IF
DO
FO
85
01
A2 05
B5 D8
OD A9
EO E5
BO OC
A6 DF
18 A5
A4 E2
10 05
IF 20
ED FO
FA 86
DB 60
AO
10
00
DD
A9
09
D9
FO
38
6A
B7
DD
45
01
02
85
85
00
FO
69
04
A9
IF
C9
A5
01
F8
A9
E2
EO
A2
A4
05
A5
00
C9
OA
DD
00
18
99
A2
A2
03
El
A5
D5
E5
13
90
38
99
87
MULTI-MAZE
BY JIM BUTTERFIELD
Description: Find your way out of the maze. You are the
flashing light in the centre of the display. As you move
up (key 9) , down (1), left (4) or right (6), KIM will keep
you in the central display; you'll see the walls of the maze
moving by as you travel. Like walking through a real maze,
you'll only see a small part of the maze as you pass through.
If you can get out, you'll find yourself in a large open
area; that means you've won. Press GO at any time for
a new maze.
Program starts at address 0200.
Listing:
DO
40
F9
07
DO
17
08
10
DE
DE
START
0200
0202
0205
0207
0209
020B
020D
0210
0213
0216
0219
021A
024B
021E
0221
0224
0225
0227
0229
022A
022C
022F
0231
0232
E6
20
DO
A2
26
90
BC
BD
59
99
C8
C8
BD
59
99
CA
10
A2
D8
30
BD
95
CA
10
0234
0236
0238
023B
023C
AO
Bl
99
88
10
OB
D2
D8 00
023E
0240
0242
0244
0245
0247
0249
024A
024B
A2
A4
A9
38
36
36
2A
88
DO
OA
D4
FF
IF
LP1
03
03
02
02
18 03
DE 02
DE 02
E2
02
D4
DB 02
D2 V
F8
F8
D9
D8
F7
INC
JSR
BNE
LDX
ROL
BCC
LDY
LDA
EOR
STA
RND
KEYIN
START
#7
RND
NXUP
PLACE,X
POINT1,X
MAZE,Y
MAZE,Y
random seed
patch the maze
in 8 places
INY
LDA POINT2,X
EOR MAZE,Y
STA MAZE,Y
NXUP
DEX
BPL LP1
LDX #2
CLD
SLINK BMI START
SETUP LDA INIT,X
STA MZPT,X
DEX
3 values from INIT
BPL SETUP
; pick out specific part of maze
LDY #11
MAP
GETMOR LDA (MZPT) ,Y
6 rows x 2
-**
STA WORK,Y
DEY
BPL GETMOR
88
WORK+1,X
WORK,X
A
REROL
' -1
-35
roll 'em
; calculate segments
024D
024F
0250
0253
0255
0256
0257
29
A8
B9
95
CA
CA
10
07
AND
TAY
LDA
STA
DEX
DEX
BPL
C6 02
D8
E7
#7
TAB1,Y
WORK,X
3 bits to segment
..stored
NXDIG
; test flasher
0259
025B
025D
025F
0261
0263
0265
C6
10
A9
85
A5
49
85
D5
OA
05
D5
DE
40
DE
0267 A9
0269 8D
026C AO
026E A2
0270 B5
0272 8D
0275 8C
0278 C6
027A DO
027C C8
027D1C8
027E CA
027F CA
0280 10
EE
0282
0285
0288
028A
028C
20
20
C5
FO
85
40 IF
6A IF
D7
CD
D7
028E
0290
0293
0295
0296
0298
029A
029B
029D
02AO
02A3
02A6
A2
DD
FO
CA
10
30
CA
30
BC
B9
3D
DO
02A8
02A9
02AB
02AD
CA
10 04
C6 D4
DO 85
7F
41 17
09
OA
D8
40 17
42 17
D6
FC
04
CE 02
05
LIGHT
DEC PLUG
BPL MUG
LDA #5
STA PLUG
LDA WORK+6
EOR #$40
STA WORK+6
; light display
MUG
LDA #$7F
STA SADD
LDY #$09
LDX #10
SHOW
LDA WORK,X
STA SAD
.STY" S$D
STl
DEC STALL
BNE STl
IN
INT
DEX
DEX
BPL SHOW
time out?
. .no
..yes, reset
..and..
..flip..
..flasher
open the gate
tiptoe thru..
..the segments
..pausing
GETKEY
SOK
LIGHT
SOK
same as last?
, test
ueo
which key
LDX #4
5 items in table
SCAN
CMP
BEQ
DEX
BPL
BMI
DEX
BMI
LDY
LDA
AND
BNE
F8
BC
FOUND
8D
D3 02
D8 00
D7 02
Bl
TAB2,X
FOUND
SCAN
LIGHT
SLINK go key?
TAB3,X
WORK,Y
TAB4,X
LIGHT
move
MLINK
DEX
BPL NOTUP
DEC POSIT
BNE MAP
89
upward move
l.o.n.g branch
02AF
02B1
02B3
02B5
02B6
02B8
02BA
02BC
02BE
02CO
02C2
02C4
D0*04
E6 D4
DO F8
CA
DO 06
C6 D2
C6 D2
DO EF
E6 D2
E6 D2
DO E9
FO F2
NOTUP
BNE SIDEWY
RIGHT
DEC MZPT
right move
DEC MZPT
BNE
INC
INC
BNE
BEQ
LEFT
MLINK
MZPT
MZPT
MLINK
RIGHT
left move
02C6
02CE
02D3
02D7
02DB
02DE
TAB1
TAB 2
TABS
TAB 4
INIT
MAZE
08
09
06
08
02
FF
B6
00
OB
04
02
40 48 01 09 41
01 06 04
04 08
40 40
08
04 00 F5 7F 15
54 14 F7 D5 04
00 00 00 00 00
la 10 14 18 17
80 10 80 02 40
40 01 10 04 80
; end of program
49
00 41 FE 5F 04 51 7D 5D 04
54 7F 5E 01 00 FD FF 00 00
00,00 00
10
40
10
~> 9
0 \
0200 E6 DO .20. 40 IF DO F9 A2 07
0210 BD 10 03 59 DE 02 99 DE 02
0220 02 99 DE
0230 D2 CA 10
0240 A4 D4 A9
0250 B9 C6 02
0260 D5 A5 DE
0270 B5 D8 8D
0280 0 EE 20
"0290
CE 02
02AO B9 D8 00
02BO 04 E6 D4
02CO E6 D2 DO
02DO 01 06. 04
02EO 04 00 F5
02FO 54 14 F7
02
F8
FF
95
49
40
40
FT
3J
DO
E9
06
7F
D5
CA
AO
38
D8
40
17
IF
05
D7
F8
FO
06
15
04
10
OB
36
CA
85
8C
20
CA
02
CA
F2
04
00
54
E2 A2
Bl D2
D9 36
CA 10
DE A9
42 17
6A IF
1.0 F8
DO Bl
DO 06
00 08
08 01
41 FE
7F 5E
02
99
D8
E7
7F
C6
C5
30
CA
C6
40
08
5F
01
ft tf> , c
26 DO 90 17 BC 08J3
C8 C8 BD 18 03 59 DE
D8 30 D4 BD DB 02 95
D8 00 88 10 F8 A2 OA
2A 88 DO F7 29 07 A8
C6 D5 10 OA A9 05 85
8D 41 17 AO 09 A2 OA
D6 DO FC C8 C8 CA CA
D7 FO CD 85 D7 A2 04
BC CA 30 8D BC D3 02
TIT 04 C6 D4 DO 85 DO
D2 C6 D2 DO EF E6 D2
48 01 09 41 49 13. 09
40 40 DA 02 08 FF FF
04 51 7D 5D 04 51 B6
00 FD FF 00 00 00 00
0300 00 00 00 00 00 00 00 Ob 05 OB 10 10 14 18 17 10
0310 01 04 80 10 80 02 40 40 02 02 40 01 10 04 80 10
90
MUSIC BOX
JIM BUTTERFIELD
DESCRIPTION
THIS PROGRAM PLAYS ONE OR SEVERAL TUNES VIA THE "AUDIO OUT"
INTERFACE OF KIM-1. USE THE SAME CONNECTION AS THAT FOR
RECORDING ON CASSETTE TAPE. IF YOUR TAPE RECORDER HAS
A "MONITOR" FEATURE, YOU CAN LISTEN TO THE TUNE AS WELL
AS RECORD IT. ALTERNATIVELY, AN AMPLIFIER WILL PLAY THE
SIGNAL THROUGH A SPEAKER.
HOW TO RUN
LOAD THE PROGRAM. LOAD THE TUNECS) EITHER FROM CASSETTE
TAPE, PAPER TAPE, OR KEYBOARD ENTRY. BE SURE TO STORE
THE VALUE FA AT THE END OF EACH TUNE, AND BEHIND THE LAST
INITIALLY
EXAMPLES
$30
18 IS QUICK; 60 IS SLOW
02
2 MEANS, "LONG NOTE LASTS
TWICE AS LONG AS SHORT"
01
2 IS BASS; 4 IS DEEP BASS.
$FF
FF IS PIANO; 00 IS CLARINET.
00
00 WILL TAKE YOU BACK TO
FIRST TUNE; LIKE A "JUMP".
91
THE LOWEST NOTE YOU CAN PLAY IS A BELOW MIDDLE C. FOR EACH NOTE,
YOU CAN SELECT WHETHER IT IS PLAYED AS A LONG NOTE OR A SHORT NOTE
(NORMALLY, A LONG NOTE WILL LAST TWICE AS LONG AS A SHORT NOTE).
SOME OF THE NOTES ARE AS FOLLOWS:
NOTE
SHORT
LONG
A..................75
A#
6E
B..................68
MIDDLE C
62
Cfl.................5C
D
56
D#.................52
E
4D
F..................48
F#
44
G..................40
G#
3C
A..................39
A#
35
B..................32
HIGH C
2F
C#.................2C
D
29
.................24
,22
G..................1E
PAUSE
00
F5
EE
E8
E2
DC
D6
D2
CD
C8
C4
CO
BC
B9
.1
,B5
B2
AF
AC
A9
A4
A2
9E
80
0200 A2 05
0202 BD 86 02
0205 95 EO
0207 CA
0208 10 F8
START
LP1
LDA INIT,X
STA WORK,X
DEX
BPL LP1
3
020A
020C
020F
0211
0213
0215
0217
0219
021A
021B
02 ID
021F
0221
A9
8D
AO
Bl
E6
C9
DO
00
EA
FO
90
E9
AA
GO
BF
43 17
00
E4
E4
FA
04
ED
OB
FB
NEXT
LDA
STA
LDY
LDA
INC
CMP
BNE
BRK
NOP
BEQ
BCC
SBC
TAX
#$BF
PBDD
OPEN OUTPUT CHANNEL
#$00
CWORK+4),Y GET NEXT NOTE
WORK+4
#$FA
TEST FOR HALT
NEXT
COR RTS IF USED AS SUBR.)
GO
NOTE
#$FB
92
::|
'4
0222
0224
0226
0228
Bl
E6
95
BO
E4
E4
EO
EO
022A A6
022C 86
022E A6
0230 A8
0231 30
0233 A2
0235 86
0237 29
0239 85
023B FO
023D 85
023F A5
0241 25
024-3 FO
0245 E6
0247 06
0249 A6
024B^9
024D 20
0250 30
0252 A6
0254 A9
0256 20
0259 30
025B 10
EO
E7
El
02
01
E6
7F
E9
02
EA
E9
HUSH
E3
04
EA
E9
ON
E9
A7
5D 02
B8
EA
27
5D 02
AF
E2
STA
BEQ
STA
LDA
AND
BEQ
INC
DEC
LDX
LDA
JSR
BMI
LDX
LDA
JSR
BMI
*PL
VAL2
HUSH
VAL1
VAL2
WORK+3
ON
VAL1
VAL2
VAL2
#$A7
SOUND
GO
VAL1
#$27
SOUND
GO
HUSH
is it a pause?
no, set pitch
get timing and..
bypass if muted
; subroutine to se:
025D
025F
0261
0263
0265
0267
0269
026B
026D
026F
0272
0273
0275
0277
0279
027B
027D
SOUND
A4 E2
84 EB
86 EC
SLOOP
EO 00
DO 08
A^ EC
C6 EB
DO F6
FO 16
8D 42 17 CONT
CA
C6 E8
DO EC
C6 E7
DO E8
A4 EO
84 E7
027F C6 E6
LDY
STY
STX
CPX
BNE
LDX
DEC
BNE
BEQ
STA
DEX
DEC
BNE
DEC
BNE
LDY
STY
DEC
WORK+2
TIMER
XSAV
#0
CONT
XSAV
TIMER
SLOOP
SEX
SBD
LIMIT+2
SLOOP
LIMIT+1
SLOOP
WORK
LIMIT+1
LIMIT
93
octave flag
bit timing
end of timing?
no, continue
restore timing
in case of..
..another octave
else exit
0281 D O f O
0283 A9 FF
0285 60
BNE SLOOP
LDA #$FF
SEX
RTS
; INITIAL CONSTANTS
INIT
.BYTE $ 3 0 , 2 / 1 , $ F F / 0 , 0
0286 30 02 01
FF 00 00
0000 FB 18 FE FF 44 51 E6 E6 66 5A 51 4C C4 C4 C4 Dl
0010 BD BD BD 00 44 BD 00 44 3D 36 33 2D A8 80 80 33
0020 44 B3 80 80 44 51 C4 80 80 5A 51 E6 80 80 FA
0020
FE
0030 00 FB 28 5A 5A 51 48 5A 48 Dl 5A 5A 51 48 DA EO
0040 5A 5A 51 48 44 48 51 5A 60 79 6C 60 DA DA FA
0040
0050
0060
0070
0080
0090
FF
56
5A
F2
80
5A
56
56
80
4C
5A
56
4C
FE
56
5A
56
00
00
5A
5A
5A
C4
00
56
5A
66
44
72
5A
5A
F2
4C
5A
E6
66
80
56
CC
F2
72
80
5A
72
80
79
4C
5A
5A
FA
E6
4B
56
CC
FF
E6
4C
5A
72
00
80
4C
66
5A
00
4C
56
CC
56
4C
5A
80
FE
56
56
66
B8
NOTE THAT TUNES 1 AND 2 SET BOTHTHE SPEED AND THE INSTRUMENT.
TUNE 3 CONTINUES AT THE SAME SPEED AS THE PREVIOUS ONE; BUT THE
INSTRUMENT IS CHANGED DURING THE TUNE.
020D
43
01
024C
0255
0270
A7
27
42
FF
00
00
FE
2F
56
44
4D
A4
2F
FF
00
29
52
39
AF
32
29
00
56
26
4D
2F
4D
A9
A4
52
24
AF
A4
FC
AF
2F
4D
F
4D
29
06
80
29
AF
29
AF
2F
AF
80
2F
4D AF 4D FC 06 AF FC 02 FE FF
A4 32 A9 FC 06 AF FC 02 FE 00
4D
39
FC
2F
24
FC
A9
02
29
2F
06
80
FE
24
29
AF
80
FF
2F
A4
FC
FE
2F
29
32
02
00
29
A4
A9
FE
56
26
2F
AF
FF
52
24
29
80
94
39
4D
2F
2F
80
40
AF
29
24
FA
PING PONG
Play against the computer, or
change the program for a two-player
game. On each shot, you choose
between four plays: Spin, Lob,
Block, or Slam. If you're playing
the left side of the court, use the
left-hand buttons (0, 4, 8 and C).
See the diagram at right.
JIM BUTTERFIELD
slam
block B
lob
spin
95
directional registrs
40 IF START JSR KEYIN
JSR GETKEY
input key
6A IF
CMP |$13
GO key?
13
BNE NOGO
nope, skip
OA
; GO key - set up game here
020A A2 08
LDX #8
get 9 ..
..inital valus
020C BD 24 03 SETUP LDA INIT,X
to zero page
STA SPEED,X
020F 95 80
DEX
0211 CA
BPL SETUP
0212 10 F8
; test legal keys (0,3,4,7,8,B,C,F)
0214 C9 10
NOGO
CMP #$10
key 0 to F?
BCS NOKEY
no, skip
0216 BO 22
TAX
save key in X
0218 AA
test column
AND #3
0219 29 03
col 0 (0,4,8,C)?
BEQ KEY
021B FO 04
col 3 (3,7,B,F)?
CMP #3
021D C9 03
BNE NOKEY
neither - skip
021F DO 19
check vs ball postn
KEY
EOR PLACE
0221 45 85
TAY
0223 A8
ball off screen?
AND #4
0224 29 04
BNE NOKEY
0226 DO 12
restore key
TXA
0228 8A
EOR DIRECT ball going away?
0229 45 84
022B 29 02
AND #2
yes, ignore key
022D FO OB
BEQ NOKEY
ball position
022F 98
TYA
wrong side of net?
0230 29 02
AND #2
yes, lose!
BNE POINT
0232 DO 69
0200
0203
0206
0208
20
20
C9
DO
023F
0241
0243
0245
0247
0248
024A
024C
024E
0250
C6
10
A5
85
18
A5
65
85
29
FO
83
23
80
83
85
84
85
04
14
0252
0254
0256
0258
025A
025C
A5
30
A5
10
A5
DO
85
04
88
02
87
3F
DEC
BPL
LDA
STA
CLC
LDA
ADC
STA
AND
BEQ
PAUSE
FREEZE
SPEED
PAUSE
LDA
BMI
LDA
BPL
LDA
BNE
PLACE
TESTL
PRITE
SKPT
PLEFT
POINT
PLACE
DIRECT
PLACE
#4
FREEZE
move.
..ball
ball still..
in court?
ball outside - KIM to play?
TESTL
SKPT
96
ball on left
KIM plays right?
unconditional
KIM plays left?
no, lose point
A6
BD
20
A9
8D
026B
026D
026F
0271
0273
AO
A2
86
A5
4A
4A
85
A5
29
AA
BD
20
A6
C6
10
A2
BD
E4
DO
05
20
CA
10
30
0275
0277
0279
027B
027D
027E
0281
Q281
0286
0288
028A
028C
028F
0291
0293
0295
0298
0299
029B
82
LDX LOG
log determines..
39 03
LDA PLAY,X ..KIM's play
Bl 02
JSR SHOT
make the shot
7F
FREEZE LDA #$7F
41 17
STA PADD
open registers
; light display here
13
LDY #$13
01
LDX #1
89
STX DIGIT
count score digts
86
LDA SCORE
4A
LSRA LSRA
shift & store..
4A
LSRA LSRA
. .left player score
8A
STA ARC
86
LDA SCORE
OF
AND #$OF
..right player score
TAX
E7 IF HOO^ LDA TABLE,X
A4 02
JSR SHOW
8A
LDA ARC
89
DEC DIGIT
F4
BPL HOOP
03
LDX #3
2D 03 VUE
LDA PIX,X
85
CPX PLACE
02
BNE NOPIX
81
' ORA SPOT
show the ball
A4 02 NOPIX JSR SHOW
DEX
Fl
BPL VUE
03
BMI SLINK
JSR SKORE
CLD
02A4
02A7
02AA
02 AC
02AE
02BO
02B1
02B2
02B4
02B6
02B8
02BA
02BC
02BE
02BF
02C1
02C3
STA SAD
JMP START
return to main loop
; display subroutine
8D
8C
C6
DO
88
60
A8
A6
06
06
05
29
85
38
A5
E5
85
40 17 SHOW
42 17
8B
STALL
FC
88
SHOT
82
82
82
82
OF
82
80
83
83
STY SBD
MOD
STALL
DEY
DEC
BNE
DEY
RTS
TAY
LDX
ASL
ASL
ORA
AND
STA
SEC
LDA
SBC
LOG
LOG
LOG
LOG
#$F
LOG
SPEED
PAUSE
STA PAUSE
97
save shot in Y
old log in X
LDA
STA
LDA
STA
SPD,Y
SPEED
SEG,Y
SPOT
; test
test play success - random
02CF
02D2
02D3
02D5
02D7
02D9
02DB
02DC
02DE
02E1
02E3
02E5
02E7
BD
88
30
4A
10
29
OA
85
AD
29
C5
FO
90
49 03
GIT
04
4A
F9
03
8C
04 17
07
8C
33
31
02E9
02EB
02ED
02EF
02F1
02F3
02F5
02F7
02F9
02FA
02FC
02FE
0300
0301
A2
A5
OA
OA
10
A2
A9
86
18
65
85
AO
AA
29
04
84
OA
OA
04
FF
01
85
A2
BD
95
CA
10
031A
031C
031D
031F
0321
0323
A5
18
49
69
85
60
SKORE
\
OVER
86
86
00
TLP
OF
0303 C9 OB
0305 DO 02
0307 84 84
0309 8A
030A 4A 4A
030C 4A 4A
030E DO FO
0310
0312
0315
0317
0318
GET
SKI
LDA DIRECT
ASLA ASLA
ASLA ASLA
BPL OVER
position ball L
LDX #$FF
LDA #1
STX PLACE
CLC
ADC SCORE
STA SCORE
LDY #0
end game, kill ball
TAX
AND #$F
get one score
CMP #$11
11 points?
BNE SKI
STY DIRECT kill ball
TXA
LSRA LSRA
LSRA LSRA
BNE TLP
ball direction
; reverse
reve
REVRS LDA DIRECT
CLC
EOR #$FF
ADC #1
STA DIRECT
RTS
98
0324
032D
0331
0335
0339
0349
0359
; tables
30 08 00
00 06 30
20 20 20
08 40 01
02 02 01
78 B5 9E
INIT
FIX
SPD
SEG
PLAY
CHANCE
end
Zero Page:
80:
81;
82;
83;
84;
85;
86:
87:
- in Hexadecimal format
80 01 FF 00 01 00
00
14
49
02 01 03 01 02 03 03 00 02 00 00 02 02
76 6E Al AE 75 AA EB 8F 75 5B 56 7A 35
88: SPRITE
20
F8
A8
69
A5
85
20
4A
02
05
02
82
85
30
C5
A2
0200
0210
0220
0230
0240
0250
0260
0270
0280
0290
02AO
02BO
02CO
02DO
02EO
02FO
20
80
19
29
83
FO
BD
89
IF
85
D8
60
80
49
17
OA
40
CA
45
02
10
14
39
A5
20
DO
4C
A8
E5
03
29
10
IF
10
85
DO
23
A5
03
86
A4
02
00
A6
83
88
07
04
0300
0310
0320
0330
0340
0350
AA
A2
01
00
02
75
29
03
85
20
03
AA
OF C9
BD 24
84 60
20 20
03 00
EB 8F
C9
BO
DO
4A
83
A5
A9
4A
C6
A4
17
06
31
4A
33
01
13
22
12
20
18
88
7F
85
89
02
8C
82
03
10
90
86
DO
AA
8A
Bl
A5
10
8D
8A
10
CA
42
05
85
F9
31
85
OA
29
45
02
85
02
41
A5
F4
10
17
82
80
29
A2
18
A2
03
84
20
65
A5
17
86
A2
Fl
C6
29
B9
03
04
65
08
FO
29
40
84
87
AO
29
03
30
8B
OF
35
OA
A5
86
BD
04
02
IF
85
DO
13
OF
BD
03
DO
85
03
85
84
85
24
C9
FO
DO
85
3F
A2
AA
2D
20
FC
82
85
8C
OA
86
03
03
OB
27
29
A6
01
BD
03
E9
88
38
81
AD
OA
AO
OB DO 02
03 95 80
30 CO 00
14 08 40
02 00 00
75 5B 56
84
CA
80
01
02
7A
84
10
01
49
02
35
8A
F8
FF
02
78
4A
A5
00
02
B5
4A
84
01
01
9E
4A
18
00
02
76
4A
49
00
01
6E
DO'FO
FF 69
06 30
03 01
Al AE
6A
C9
29
8A
80
30
Bl
4A
A6
81
8D
06
83
04
8C
FF
IF
10
04
4A
85
04
02
4A
8A
20
40
82
B9
4A
FO
A9
99
95
DO
98
C6
04
82
86
E7
E4
02
88
A5
BD
04
OA
00
QUICK
By Peter Jennings
Modified by Jim Rutterfield
0300
0302
0303
0305
0307
0309
030C
030E
0310
0312
031^
0316
0318
031 A
031B
*031C
031E
0320
0322
0323
0325
0326
0329
032B
032E
0331
0333
0335
A5
2A
65
29
85
20
DO
E6
DO
E6
DO
85
A2
F8
38
B5
69
95
E8
DO
D8
20
FO
20
20
C9
DO
FO
F9
START
F9
7F
FB
40 IF
FB
FA
F7
FB
F3
F9
FD
ZIP
RANDOMIZE DELAY
..BY MULTIPLYING
BY 3 AND
MASKING
WORK rW DISPLAY AREA
IF YOU CHEAT BY KEYING...
PROGRAM WAITS YOU OUT
LDA
ROL
ADC
AND
STA
JSR
BNE
INH
A
INH
#$7F
POINTH
KEYIN
ZIP
INC
BNE
INC
BNE
STA
POINTL
COUNT DOWN FOR
ZIP
POINTH RANDOM DELAY
ZIP
SET TO ZERO
INH
RUN
LDX
SED
SEC
NEGATIVE THREE
COUNT IN DECIMAL
ADD VALUE 1
DIGIT
F7
LDA
ADC
STA
INX
BNE
POINTH+1,X
#$00
ADD IT IN
POINTH+1,X
MOVE ON TO NEXT DIGITS
DIGIT
IF IF
ED
IF IF
6A IF
13
F6
C9
JSR
BEQ
JSR
JSR
CMP
BNE
BEQ
FC
00
FC
CLD
STAND
t) i :
A5
D0
95
IF
F9
F7
FC
C9
2
2A 65 F9 29 7F 85 FE 20 40 IF D0 Ft E6 FA
E FE D0 F3 85 F9 A2 FD F8 38 B5 FC 69 00
E6
E8
E D0 F7 D8 20 IF 1F F0 EL 20 IF IF 20 6A
1
100
ft*
sucr '
for *
two 1*
The <
By JIB Butterfield
E6 16
START INC RND+4
rrandomize
JSR KEYIN
20 40 IF
**Gane by Bob Albrecht BNE START
DO F9
People's Computer Co **
CLD
D8
A2 05
LDX 5
LDA *0
A9 00
STX POINTR
86 10
020E 95 18
ZLOOP STA WINDOW, X set window to zeros
0210 CA
DEX
0211 10 FB
BPL ZLOCP
SEC
0213 38
RAND
LDA RND+1
h
0214 A5 13
hash
in new random number
ADC RND+4
0216 65 16
0218 65 17
ADC RND+5
023A 85 12
STA RND
021C A2 04
LDX 44
021E B5 12
RLP
LDA RND.X
ra
move
random string down one
STA RND+l.X
0220 95 13
"* 0222 CA
DEX
0223 10 F9
BPL RLP
LDY *$CO
0225 AO CO
divide random 4 by 6
0227 84 11
STY MOD
0229 AO 06
LDY #6
022B C5 11
SET
CMP MOD
022D 90 02
BCC PASS
022F E5 11
SBC MOD
0231 46 11
PASS LSR MOD
DEY
0233 88
0234 DO F5
BNE SET
0236 AA
TAX
0237 A4 10
LEY POINTR
0239 B9 Fl IF
LDA TABLE+10.Y
digits A to F
023C CA
TOP
DEX
023D 10 02
BPL TRY
find an empty window
LDX 45
023F A 2 05
0241 B4 18
TRY
LDY WINDOW,*
BNE TOP
0243 DO F7
0245 95 18
STA WINDOW, X
and put the digit in
0247 C6 10
DEC POINTR
0249 10 C 8
BPL RAND
101
02UB
024D
02*JF
0251
0254
0256
0257
0259
025B
025D
025F
0260
0262
0264.
FO B3
A 2 05
B5 18
DD A6 02
DO OC
CA
10 F 6
A 2 05
A9 40
95 18
CA
10 FB
A 9 7F
8D to 1?
0267 AO 09
0269 A 2 FA
026 B B5 IE
SHOW
026D 8D 40 1?
0270 8C 42 17
0273 C6 11
ST1
0275 DO FC
0277 C8
0278 C8
0279 E8
027A 30 EF
027C 20 40 1?
027F 20 6A IF
0282 C9 13
0284 FO C5
0286 C9 07
0288 BO C3
028A AA
028B FO D5
028P CA
028E FO D2 ^
0290 E4 10
0292 FO CE
0294 86 10
0296 B5 18
TOPI
0298 48
0299 CA
029A 10 FA
029C A 6 10
029E
029F
02A1
02A2
02A4
02A6
02A9
BPL SET
LDA #$7F
STA SADD
LDY 4$09
LDX #3FA
LDA
STA
STY
DEC
BNE
I NY
INY
INX
BPL
WINDOW.X
SAD
SH)
MD
ST1
link to start
test
win
condition
,
set
to
It
directional
registers
negative 5
light
display
W
SHOW
JSR KEYIN
JSR GETKEY
CFJ5 $13
00 key?
yes, restart
BHJ SLINK
CMP -*7
Keys 0 to 6?
no, test win
BCS WTEST
Keys 1 to 6?
TAX
no, exit
BEQ PLAY
*
Keys 2 to 6 (=1 to 5)?
DEX
no, exit
BEQ PLAY
Sane key as before?
CPX POINTR
95Q PLAY
yes, ignore
STX POINTR
no, we've got a live one
LDA WINDOW.X
roll f em out...
PHA
DEX
BPL TOPI
LDX POINTR
68
TOP2 PLA
roll 'era back in
STA WINDOW.X
95 18
CA
DEX
10 FA
BPL TOP2
30 BC
BMI PLAY
F7 FC B9 WINNER .BYTE $F7,$FC ,$B9,$DE,$F9,$F1
DE F9 Fl
; end
102
TEASER
By Lew Edwards
or (4,6)
Comers (1)
The game starts with a star in position 5; the rest
are holes. The object of the game is to reverse the initial
condition, making 5 a hole and all the rest stars. Eleven
moves are the minimum number.
Should you attempt to "shoot" a hole, the first digit
displays a "H" until a star key is pressed. This digit
also displays a valid number selection. A count of valid
moves is given at the right of the display. A win gives
a "F" in the first digit. All holes is a losing situation,
("L" in the first digit). You may start over at any time
by pressing the "Go" button. The program starts at 0200.
f}200
0202
0204
0206
0207
0209
020B
020D
020F
0211
0212
0214
0217
0219
021B
021E
0220
0223
Q225
0228
022A
022C
022E
0230
A9
A2
95
CA
DO
A9
85
A9
85
4A
85
20
A6
DO
20
FO
20
FO
20
C9
FO
C9
10
A8
BEGN
00
10
CF
CLOP
FB
40
D4
10
DE
DF
DD
D3
50
40
F4
40
EF
6A
13
D4
OA
E4
LDA
LDX
STA
DEX
BNE
Jt$00
#$10
OOCF,X
CLOP
...INITIALIZE DISPLAY...
02 MLOP
IF
IF
IF
STA OODR
LDA #$10
STA OODE
LSR
STA 00 DF
JSR DISP
LDX 00 D3
BNE DELA
JSR 1F40
BEQ MLOP
JSR 1F40
BEQ MLOP
JSR GETKEY
CMP #$13
BEQ BEGN
CMP #$OA
BPL MLOP
TAY
103
INIT. STARFIELD
REGISTERS
...DISPLAY...
MODE?
MODE=1, DELAY AND UPDATE
MODE=0, GET KEY
NO KEY, RETURN
KEY STILL PRESSED?
NO, RETURN
YES, GET KEY
"GO" KEY?
YES, START AGAIN
OVER 9?
YES, TRY AGAIN
USE AS INDEX
0231
0233
0235
0238
023A
023D
023F
0241
0243
0245
FO
85
20
85
B9
CO
30
24
DO
FO
El
Dl
F4 02
DO
CA 02
06
06
DF
OC
04
0247
0249
024B
024D
024F
0251
0252
0253
0255
0257
0259
025A
025D
025F
0261
0264
0266
0268
026B
026D
0270
0271
0273
0275
0278
0279
027B
027D
027F
0281
0282
0284
0285
0287
0289
028A
028B
028D
028F
0290
0292
24
DO
A9
85
DO
F8
38
A9
65
85
D8
20
85
A5
20
85
E6
4C
AO
20
88
DO
A6
BD
A8
EO
30
45
85
98
AO
OA
45
85
98
4A
45
85
OA
A5
A2
DE
06
76
DO
C3
BEQ
STA
JSR
STA
LDA
CMP $06
BMI
BIT
BNE
BEQ
SKIP
HOLE
/
STAR
00
D5
D5
F4
DA
D5
FO
D8
D3
14
00
DD
02
02
02
DELA
02
FA
Dl
D3 02
00
DF
DF
DE
06
SKIP
OODF
STAR
HOLE
BIT OODE
BNE STAR
LDA #$76
STA OODO
BNE MLOP
SED
SEC
LDA #$00
ADC OOD5
STA 00D5
CLD
JSR SEG
STA 00DA
LDA 00D5
JSR LEFT
STA 00D8
INC OOD3
JMP MLOP
LDY #$00
JSR DISP
DEY
BNE DELA
LDX OOD1
LDA 02D3,X
TAY
CPX #$06
06
08
DF
DF
DE
DE
MLOP
OQD1
SEG
OODO
02CA,Y
LOWF
BMI
EOR
STA
TYA
LDY
ASL
EOR
STA
TYA
LSR
EOR
STA
ASL
LDA
LDX
LOWF
OODF
OODF
#$00
A
OODE
OODE
A
OODF
OODF
A
OODE
#$06
104
0? - NOT VALID
1-9 STORE IT
CONVERT TO SEGMENTS
DISPLAY - LEFT DIGIT
GET STAR TEST BIT
TEST KEY #
1-5, SKIP
BY ADDING ONE
STORE IT
UNPACK, CONVERT
TO SEGMENTS AND
DISPLAY IN DIGITS
5 AND 6...
SET MODE TO 1
MAIN LOOP AGAIN
MODE = 1
DELAY ABOUT .8 SEC
WHILE DISPLAYING
KEY # AS INDEX
GET SHOT PATTERN
SAVE IN Y REGISTER
KEY # OVER 5?
NO, GO^TO LOW FIELD
UPDATE HI FIELD, 6-9
RECALL PATTERN, 6-9
NO SHOT 3RD TIME
ALIGN WITH LO FIELD
UPDATE LO FIELD
RECALL PATTERN, 1-5
ALIGN WITH HI FIELD
UPDATE HI FIELD, 1-5
(BLANK SHOT IF 6-9)
SHIFT 9 TO CARRY
GET REST OF FIELD
...STAR DISPLAY...
02A4
02A6
02A8
02AA
02AC
02AE
02BO
02B2
02B4
02B6
02B8
02BB
02BE
02C1
02C4
02C6
02C8
02CB
02DB
2A
48
29
95
68
CA
CA
DO
2A
BO
FO
C9
DO
A9
DO
A9
DO
C6
A9
85
DO
4C
20
20
20
C9
DO
4C
01
EO
02DD
02DF
02E2
02E4
02E6
02E8
02EB
02ED
02EF
A9
8D
A2
B5
84
20
EO
DO
60
0294
0295
0296
0298
02 9A
029B
029C
029D
029F
02AO
02A2
DLOP
49
DO
F5
OE
08
FF
08
71
08
38
04
D3
00
DO
03
14 02
DD 02
40 IF
6A IF
13
F3
00 02
02 04
D8
LOSE
MODE
FRST
DONE
ROL
PHA
AND #$49
STA OODO,X
PLA
DEX
DEX
BNE DLOP
ROL
}
BCS MODE
BEQ LOSE
/ CMP #$FF
/ BNE MODE
LDA #$71
BNE FRST
LDA #$38
BNE FRST
DEC OOD3
LDA #$00
STA 00 DO
BNE NONE
JMP MLOP
JSR DISP
JSR 1F40
JSR GETKEY
CMP #$13
* BNE DONE
JMP BEGN
08 10 10 20 40 80 IB 07 36 49 BA 92 6C
7F
DISP
41 17
09
C7
MORE
FC
4E IF
15
F5
:
s
:
:
:
02FO
02F1
02F2
02F3
02F4
02F6
02F7
02FA
105
By Joel Swank
Description TIMER turns KIM into a digital stopwatch showing up to
0200
0202
0204
0206
0208
020B
020E
0210
0212
0215
0217
0219
02 IB
021D
02 IF
0222
0225
0228
022A
022D
022F
0232
0233
0234
0236
0238
02 3A
023C
023E
0240
0242
0244
0246
0248
024A
024B
024D
024F
0250
0253
0255
0257
A9 .flfl.
85 F9
85 FA
85 FB
20 IF
20 6A
C9 04
DO 03
4C 64
C9 02
FO E7
C9 01
DO EB
A9 9C
8D 06
20 IF
AD 07
FO FB
8D 00
A9 9C
8D 06
18
F8
A5 F9
69 01
85 F9
A5 FA
69 00
85 FA
C9 60
DO OB
A9 00
85 FA
A5 FB
18
69 01
85 FB
D8
20 6A
C9 00
DO CB
FO AF
BEGN
IF
IF
HOLD
1C
CONT
17
IF DISP
17 CLCK
1C *
17
CKEY
IF
LDA #$00
ZERO DISPLAY
STA INH
STA POINTL
STA POINTH
JSR SCANDS LIGHT DISPLAY
JSR GETKEY
CMP #$04
KEY 4?
BNE CONT
JMP 1C64 RETURN TO KIM
KEY 2?
CMP #$02
BACK TO ZERO
BEQ BEGN
KEY 1?
\
CMP #$01
BNE HOLD
LDA #$9C
STA 1706 , SET TIMER
JSR SCANDS DISPLAY VALUE
CHECK TIMER
LDA 1707
BEQ CLCK
STA ROM
DELAY 4 MICROSEC
SET TIMER
LDA #$9C
STA 1706
CLC
SED
SET FLAGS
LDA INH
INC. 100THS
ADC #$01
STA INH
LDA POJNTL
INC. SECONDS
ADC #$00
STA POINTL
STOP AT 60
CMP #$60
BNE CKEY
LDA #$00
STA POINTL ZERO SECONDS
LDA POINTH
CLC
INC. MINUTES
ADC #$01
STA POINTH
CLD
JSR GETKEY READ KEYBOARD
KEY 0?
CMP #$00
BNE DISP
BEQ HOLD
STOP
106
WUMPUS
By Stan Ockers
/7\\
107
0305
0307
0309
030B
030C
030E
0310
0312
0314
0316
0318
031A
031D
031F
0321
0323
0324
0326
0329
032A
032C
032F
0331
0333
0336
0339
033A
033C
033E
0340
0342
0344
0346
0348
034A
034C
034E
0350
0353
0355
0357
0359
035B
035E
0260
0362
0364
0367
0369
036 A
036C
036E
036F
A9 FF
A2 OE
95 Cl
CA
10 FB
A9 03
85 EO
AO 05
10 02
AO 00
A2 05
20 72
29 OF
D5 CA
FO F5
CA
10 F9
99 CA
88
10 EC
20 B2
AO 03
84 El
B9 C6
20 8F
8A
30 17
EO 03
30 04
A9 19
10 OA
EO 01
30 04
A9 OE
10 02
A9 00
AO 01
20 00
C6 El
A4 El
10 DA
A4 CA
B9 E7
85 OC
A2 03
B4 C6
B9 E7
95 20
CA
10 F6
AO 00
98
20 00
INIT
GETN
02
CKNO
00
02 ADJR
00 NXTR
02
SKP1
SKP2
MESS
02
NOMA
IF
XRO
IF
ROOM
02
LDA #$FF
LDX #$OE
STA OOC1,X
DEX
BPL INIT
LDA #$03
STA OOEO
LDY #$05
BPL GETN
LDY #$00
LDX #$05
JSR RAND
AND #$OF
CMP OOCA,X
BEQ GETN
DEX
BPL CKNO
STA OOCA,Y
DEY
BPL GETN
JSR NXTR
LDY #$03
STY OQE1
LDA OOC6,Y
JSR COMP
TXA
BMI NOMA
CPX #$03
BMI SKP1
LDA #$19
BPL MESS
CPX #$01
BMI SKP2
LDA #$OE
BPL MESS
LDA #$00
LDY #$01
JSR SCAN
DEC OOE1
LDY OOE1
BPL NXTR
LDY OOCA
LDA 1FE7,Y
STA OOOC
LDX #$03
LDY OOC6,X
LDA 1FE7,Y
STA 0020, X
DEX
BPL XRO
LDY #$00
TYA
JSR SCAN
108
...INITIALIZATION...
..CLEAN OUT ROOMS..
INIT. TO FF
FINISHED?
NO
GIVE THREE CANS OF GAS
...RANDOMIZE...
YOU,WUMPUS,PITS AND BATS
(ONLY YOU ENTRY)
CONVERSION
PUT IN MESSAGE '
FINISHED?
NO
LOCATION AND..
PAGE OF MESSAGE
DISPLAY MESSAGE
0372
0375
0377
0379
037C
037E
037F
0381
0383
0385
0387
0389
038A
038C
038F
0390
0392
0394
0396
0398
039A
039C
039E
03A1
03A4
03A6
03A8
03AA
03 AD
03AF
03B1
03B4
03B7
03B9
03BC
03BE
03C1
03C3
03C5
03C8
03CB
03CE
03DO
03D1
03D3
03D5
03D7
03D9
03DB
03DD
03DF
03E1
03E3
03E6
20
C9
FO
20
85
8A
30
A5
A2
D5
FO
CA
10
20
8A
30
EO
10
EO
10
AO
A9
20
20
C5
DO
A9
4C
AO
A9
20
4C
A9
4C
A9
4C
AO
A9
20
20
20
85
8A
30
A5
A6
95
C5
FO
C6
FO
A6
20
20
58 02
14
48
C5 02
CA
EB
CA
04
Cl
33
NXTG
F9
8F 02
9A
03
17
01
ID
00
26
00
99
CA
84
26
CF
01
3D
00
16
4F
CF
65
CF
00
B7
00
58
C5
Dl
02
02
02
BATM
02
03
PITM
02
GASM
02
ROOM
02
02
02
EE
Dl
EO
CO
CB
15
EO
1A
CB
B4 02
A5 02
JSR DEBO
CMP #$14
BEQ ROOM
JSR VALID
STA OOCA
TXA
BMI ROOMS
LDA OOCA
LDX #$04
CMP OOC1,X
BEQ GASM
DEX
BPL NXTG
JSR COMP
TXA
BMI ADJR
CPX #$03
BPL BATM
CPX #$01
BPL PITM
LDY #$00
LDA #$26
JSR SCAN
JSR MOVE
CMP OOCA
BNE ADJR
LDA #$26
JMP LOSE
LDY #$01
LDA #$3D
JSR SCAN
JMP CHNG
LDA #$4F
JSR LOSE
LDA #$65
JMP LOSE
LDY #$00
LDA #$B7
JSR SCAN
JSR DEBO
JSR VALID
STA OOD1
TXA
BMI ROOM
LDA OOD1
LDX OOEO
STA OOCO,X
CMP OOCB
BEQ WIN
DEC OOEO
BEQ OUT
LDX OOCB
JSR NEXT
JSR MOVE
109
DEBOUNCE KEY
PC PUSHED?
YES
AN ADJACENT ROOM?
UPDATE YOUR ROOM
IF X=FF, NOT VALID ROOM
CHECK FOR GAS IN ROOM
5 POSSIBLE (EXPANSION)
GASSED!!
ALL CHECKED?
NO
CHECK YOUR NEW
ROOM FOR HAZARDS..
NO MATCH, NO HAZARDS
BATS
PIT!!!
MUST HAVE BUMPED WUMPUS
DISPLAY MESSAGE
..SEE IF HE MOVES..
STILL IN YOUR ROOM?
NO, YOU'RE O.K.
HE GOT YOU!
BAT MESSAGE
CHANGE YOUR ROOM
FELT- IN PIT!
GAS IN ROOM!
03E9
C5 CA
03EB FO BB
03ED 4C DE 02
03F2 AO 01
03F4
03F6
03F9
03FB
03FD
A9
20
FO
A9
4C
0200
84 DE
80
00 02
F7
73
OUT
CF 02
CMP
BEQ
JMP
LDY
LDA
JSR
BEQ
LDA
JMP
00 CA
03A8
02DE
#$01
#$80
SCAN
WIN
#$73
LOSE
STY OODE
STA OODD
LDA #$07
STA OODF
AO 05
LDY #$05
A2 05
CONT
LDX #$05
Bl DD
CHAR
LDA (OODD),Y
CMP #$00
C9 00
MORE
BNE
DO 01
RTS
60
STA OOE8,X
95 E8
88
MORE
DEY
DEX
CA
BPL CHAR
10 F3
CLD
D8
18
CLC
TYA
98
ADC OODF
65 DF
STA OODC
85 DC
20 28 02
JSR 0228
A4 DC
LDY OODC
4C OA 02
JMP CONT
DELAY DISPLAY SUBROUTINE
A2 OA
LDX #$OA
STX 00 DB
86 DB
TIME
LDA #$52
A9 52
8D 07 17
STA 1707
20 3E 02
JSR DISP
2C 07 17
BIT 1707
10 F8
BPL LITE
C6 DB
DEC OODB
DO EF
BNE TIME
60
RTS
swsscs BASIC DISPLAY SUBROUTINE ""::x
LDA #$7F
A9 7F
8D 41 17
STA PADD
LDY #$00
AO 00
A2 09
LDX #$09
SIX
LDA
OOE8,Y
E8
00
B9
84 FC
STY OOFC
20 4E IF
JSR 1F4E
0202 85 DD
0204 A9 07
0206 85 DF
0208
020A
020C
020E
0210
0212
0213
0215
0216
0217
0219
02 1A
021B
021C
021E
0220
0223
0225
0228
022A
022C
022E
0231
0234
0237
0239
023B
023D
023E
0240
0243
0245
0247
024A
024C
110
024F
0250
0252
0254
0257
C8
CO 06
90 F3
20 3D IF
60
0258
025B
025E
0260
0263
0265
0268
026A
026D
026F
0271
20
20
DO
20
FO
20
FO
20
C9
10
60
0272
0273
0274
0275
0276
0278
027A
027C
02 7E
0280
0282
0284
0285
0287
0289
02 8A
028B
028D
8A
48
D8
38
A5
65
65
85
A2
B5
95
CA
10
85
68
AA
A5
60
028F
0291
0293
0295
0296
0298
A2
D5
FO
CA
10
60
0299
029C
029E
02AO
02A2
02A5
02A8
02AA
02AB
02AD
20
29
C9
30
20
AD
29
AA
B5
85
111
A5 CB
60 '
A6
B5
85
B5
85
B5
85
B5
85
60
CA
50
C6
60
C7
70
C8
80
C9
02C5 A2 03
02C7 D5 C6
02C9 FO 03
02CB CA
02CC 10 F9
02CE 60
02CF
02D1
02D4
02D6
02D8
02DB
AO
20
AO
A9
20
4C
01
00
00
AC
00
D4
02DE
02EO
02E3
02E5
02E7
02E9
02EC
A4
B9
85
AO
A9
20
4C
EO
E7
9F
00
90
00
2C
NOCH
LDA OOCB
WUMPUS ROOM IN ACC.
RTS
LOAD NEXT
DMS SUBROUTINl
YOUR ROOM AS INDEX
LDX OOCA
... NEXT ROOMS ARE LOADED
LDA 0050,X
INTO OOC6-OOC9 FROM
STA OOC6
LDA 0060,X
TABLES ...
STA OOC7
LDA 0070,X
STA OOC8
LDA 0080,X
STA OOC9
RTS
"--" CH!
CHECK VALID SUBROUTINE
... CHECK IF ACC.
VALID
LDX #$03
CMP OOC6,X
MATCHS OOC6-OOC9
YES, VALID ROOM
BEQ YVAL
DEX
BPL NXTV
RTS
YVAL
****-**** LXOl
1 O^ 1 SUBROUTINE ":-::
LOSE
LOSE
...DISPLAY REASON LOST,
LDY x$01
THEN "YOU LOSE" ...
02
JSR SCAN
LDY #$00
LDA #$AC
02
JSR SCAN
02
JMP REPT
T MESSAGE """:
""" GAS 1
GET CANS LEFT
LDY OOEO
IF
LDA 1FE7,Y
GET CONVERSION
STORE IN MESSAGE
STA 09F
(PAGE ZERO)
LDY #$00
DISPLAY CANS OF GAS
LDA #$90
LEFT MESSAGE
02
f*
JSR SCAN
JMP ADJR
03
***** Messages *****
0000
0010
0020
0030
80
F8
FD
B7
EE
BE
FF
F3
DC
D4
F7
F9
BE
D4
B9
DE
80
F9
80
80
F7
B8
00
F7
DO
ED
80
80
F9
80
DC
9C
80
B8
DC
BE
84
F9
F3
B7
D4
F7
ED
F3
80
DE
80
BE
EF
80
CO
ED
80
F8
80
80
CO
DC
FC
80
80
80
BE
00
09
OB
OD
OE
OA
OC
OE
OF
01
OB
OC
OD
04
07
OA
OD
02
05
08
OB
02
03
04
OE
00
01
03
05
01
02
04
06
01
03
07
OF
00
02
06
08
03
05
07
09
112
OH
06
OA
OF
00
05
09
OB
06
08
OA
OC
07
09
OF
OD
00
08
OC
OE
0100
0110
0120
0130
0140
0150
0160
0170
0180
0190
01AO
80
84
B8
F3
F3
EE
F3
B7
80
BD
BE
9C
F8
DC
BE
F9
EE
84
80
80
F9
B7
BE
80
ED
ED
DO
84
F8
00
80
F8
F3
B7
B9
F9
80
FC
84
80
80
80
80
BE
F3
B8
80
BD
F7
F9
00
DC
80
F7
ED
BE
DC
00
DC
F8
F9
80
BE
BD
80
80
ED
ED
80
F8
80
F9
BD
F8
DO
F6
00
80
F9
F6
80
ED
80
F7
80
F9
BE
B9 B8
00 80
F7 80
EE DC
D4 F7
Fl F9
ED 80
DC Fl
F7 F8
BD 80
DC
FC
F6
BE
F8
B8
84
80
CO
Fl
ED F9
F7 F8
F7 80
80 00
B9 F6
B8 80
D4 80
BD F7
80 EE
DO DC
00
ED
9C
80
80
84
DO
ED
DC
B7
80
80
BE
ED
00
D4
DC
80
BE
80
F3
B9
B7
BE
80
80
DC
00
80
9C
C9
85
8D
A9
IF
DO
15
A2
60
C9
CB
85
60
A4
03
80
A9
OF
02
30
AO
85
98
8A
02
20
01
4C
85
EO
DE
CF
00
DC
07
7F
C8
F8
10
04
A2
04
A5
C8
AO
EO
F6
00
03
D5
AO
04
01
OC
20
30
8A
00
A9
CF
Dl
FO
02
02
0200
0210
0220
0230
0240
0250
0260
0270
0280
0290
02AO
02BO
02CO
02DO
02EO
02FO
0300
0310
0320
0330
0340
0350
0360
0370
0380
0390
03AO
03BO
03CO
03DO
03EO
03FO
84
DO
20
17
8D
CO
20
E7
B5
04
30
CB
B5
01
B9
BE
EA
85
CA
03
A9
20
A2
00
EB
30
02
3D
02
8A
1A
EA
DE
01
28
20
41
06
3E
60
40
D5
OD
60
80
20
E7
BD
EA
EO
FO
84
19
00
03
02
A5
9A
20
20
AO
30
A6
EA
85
60
02
3E
17
90
02
8A
95
CB
20
A6
85
00
IF
80
EA
AO
F5
El
10
02
B4
20
CA
EO
99
00
00
EE
CB
AO
DD
95
A4
02
AO
F3
FO
48
41
FO
B2
CA
C9
02
85
Fl
EA
05
CA
B9
OA
C6
C6
58
A2
03
02
02
A9
A5
20
01
A9 07
E8 8
DC 4C
2C 07
00 A2
20 3D
FB 20
D8 38
CA 10
03 CA
02 AD
B5 50
60 A2
AO 00
V A0
DO DC
EA A9
10 02
10 F9
C6 00
EO 01
El A4
B9 E7
02 C9
04 D5
10 17
C5 CA
4C 16
B7 20
Dl A6
B4 02
A9 80
85
CA
OA
17
09
IF
3E
A5
F9
10
06
85
03
A9
00
B7
FF
AO
99
20
30
El
IF
14
Cl
EO
DO
03
00
EO
20
20
DF
10
02
10
B9
60
02
41
85
F9
17
C6
D5
AC
A9
80
A2
00
CA
8F
04
10
95
FO
FO
01
84
A9
02
95
A5
00
113
AO
F3
A2
F8
E8
20
FO
65
CO
60
29
B5
C6
20
90
9C
OE
A2
00
02
A9
DA
20
48
33
10
A9
4F
20
CO
02
02
05
D8
03
C6
00
8C
F6
44
68
20
03
60
FO
00
20
BE
95
05
88
8A
OE
A4
CA
20
CA
ID
26
4C
58
C5
C5
FO
A2
18
86
DB
84
IE
20
65
AA
72
AA
85
03
02
00
B7
Cl
20
10
30
10
CA
10
C5
10
AO
4C
CF
02
CB
CA
F7
05
98
DB
DO
FC
20
6A
45
A5
02
B5
C7
CA
4C
02
F3
CA
72
EC
17
02
B9
F6
02
F9
00
CF
02
20
FO
FO
A9
Bl
65
A9
EF
20
3E
IF
85
CO
29
C6
B5
10
D4
4C
BE
10
02
20
EO
A9
E7
AO
85
20
A9
02
A9
C5
15
BB
73
DD
DF
52
60
4E
02
C9
40
60
OF
85
70
F9
02
2C
ED
FB
29
B2
03
00
IF
00
CA
8F
26
AO
65
02
C6
4C
20
..s
DIAGNOSTIC A\n
UTILITY IKOKAA\S
BKANCH
BY JIM BUTTERFIELD
D8
18
A5
E5
85
06
20
20
C5
FO
85
09
BO
OA
OA
OA
OA
A2
OA
26
26
CA
DO
FO
START OLD
CLC
FA
LDA POINTL
FB
SBC POINTH
F9
STA INK
F9
DEC INK
IF IF
JSR SCANDS
6A IF
JSR GETKEY
F3
CMP EAST
EG
BEQ START
F3
STA LAST
10
CMP #$10
E6
BCS START
ASL A
ASL A
ASL A
ASL A
04
LDX #4
ADDR ASL A
FA
ROL POINTL
FB
>
ROL POINTH
DEX
F8
BNE ADDR
D6
BEQ START
115
BROWSE
Jim Butterfield
Load BROWSE anywhere in memory - it's fully relocatable start it ut>, and presto.' It doesn't seem to do anything.
BROWSE is a mini-Monitor that performs most of the functions
of the regular KIM monitor; but you'll find it handy for entering
and proof-reading programs. Most of the keys work the same as
usual; but PC, +. and DA are slightly different.
When you hit + you go to the next address as usual .. but then
you keep on going.' Graat for proofreading a program you've
Just entered. It lets you browse through memory.
D8
A9 13
85 FE
A9 00
85 FA
85 FB
C6 F3
DO OE
A5 FD
FO OA
10 69
A5 FA
DO 02
C6 FB
C6 FA ,
20 19 3F
20 6A IF
0133 05 FE
0135 FO Eli
0137 85 FE
0139 C9 15
013B FO DE
013D A2 00
013F 86 FD
START
OLD
LDA #$13
STA CHAR
Lm #o
LOOP
>
DOWN
LP1
STA
STA
DEC
BNE
LDA
BEQ
BPL
LDA
BNE
DEC
DEC
JSR
JSR
CMP
BEQ
STA
CMP
BEQ
LDX
STX
POINTL
POINTH
WAIT
LP1
TMPX
LP1
UP
POINTL
DOWN
POINTH
POINTL
SCAND
GETKEY
CHAR
LOOP
CHAR
#&15
LOOP
#0
TMPX
116
OlUl C9 10
011*3 90 1C
01U5 86 FU
01U7 C9 11
CMP #$10
BCC HUM
STX DIGIT
numeric?
yes, branch
CMP nil
DA?
BEQ OVER
yes. leave X-0
INX
no. set X-l
OVER
STX MODE
0 or 1 into MODE
CMP #$12
+?
BNE PASS
no, skip
INC TMPX
yes. set browse
PASS
CMP #$1U
PC?
BNE PASS2
no, skip
DEC TMPX
yes, down-browse
PASS 2 CMP #$13
GO?
BNE LP1
no, loop
015E UC C8 ID
JMP GOEXEC start program
; numeric (hex) entry comes here
0161 OA OA
NUM
ASIA AS LA
position digit
0163 OA OA
ASLA ASIA
to left
STA TEMP
0165 85 FC
0167 A 2 Oh
LDX #U
h bits to move
LDY MODE
AD or DA?
0169 All FF
016B DO 17
BNE ADDR
branch if AD mode
016D C6 FU
DEC DIGIT
time to step?
016F 10 07
BPL SAME
no, skip
0171 20 63 IF
JSR INCPT
yes, step
INC DIGIT
^.and restore
017U E6 FU
0176 E6 FU
INC DIGIT
..digit count
0178 Bl FA
SAME
LDA (POINTL),Y
get data
017A 06 FC
DADA
ASL TEMP
move a bit..
017C 2A
ROL A '
. .into data
017D 91 FA
STA (POINTL),Y
017F CA
DEX
0180 DO F8
BNE DADA
last bit?
0182 FO-^9
BEQ LP1
yes, exit
ADDR
ASL A
move bits
018U OA
0185 26 FA
ROL POINTL
into address
0187 26 FB
ROL POINTH
0189 CA
DEX
018A DO F8
BNE ADDR
018C FO 9F
BEQ LP1
j increment address for browsing
018E 20 63 IF UP
JSR INCPT
TAX
0191 AA
0192 10 99
BPL LP1
end
019U
Olli9
OlUB
OlUC
OlUE
0150
015?
015U
0156
0158
015A
015C
FO 01
E8
86 FF
C9 12
DO 02
E6 FD
C9 1U
DO 02
C6 FD
C9 13
DO CF
OH.50
117
DIRECTORY
Jim Butierfield
Ever thought about the best way to organize your programs on tape?
I used to call the first program on each tape number 01, the next 02, etc.
Mostly I was afraid of forgetting the ID number and having trouble reading
it in. Program DIRECTORY (below) fixes up that part of the problem and
liberates you to choose a better numbering scheme.
You've got 25^ program IDs to choose from
libraries with some to spare.
So every program and data file would carry a unique number ... and if
you've forgotten what's on a given tape, just run DIRECTORY and get all the
IDs.
GO
CLD
LDA
STA
JSR
LSR
ORA
STA
CMP
BNE
JSR
DEC
BPL
CMP
BNE
LDX
JSR
STA
INX
BMI
JSR
BNE
BEQ
17
1A
SYN
TST
1A
19
IF
RD
SHOW
118
#$07
Directional reg
SBD
RDBIT
Scan thru bits...
INK
..shifting new bit
INK
..into left of
INH
..byte INH
#Sl6
SYNC character? SYN
no, back to bits
RDCHT
get a character
INH
count 22 SYNC's
TST
#S2A
then test astk
TST
..or SYNC
#3FD
if asterisk,
RDBYT
stack 3 bytes
POINTH+1 ,X
into display
area
RD
SCANDS
GO
SHOW
..and shine
until keyed
at's all folks
by Jim Butterfield
A9 AD
8D EC 17
20 32 19
A9 27
85 F5
A9 BF
8D 43 17
A2 64
A9 16
20 J61 01
A9 2A
20 88 01
AD F9 17
20 JTJLjQl
AD F5 17
DUMP
LDA
STA
JSR
LDA
STA
LDA
STA
LDX
LDA
JSR
LDA
JSR
LDA
JSR
LDA
#$AD
VEB
INTVEB
#$27
GANG
#$BF
PBDD
#$64
#$16
HIC
#$2A
OUTCHT
ID
OUTBT
SAL
119
set up sub
flag for SBD
0126
0129
012C
012F
0132
0135
0138
013B
013E
0141
0144
0146
0148
014B
014E
0151
0154
0157
0159
015B
015E
20
AD
20
20
20
20
AD
CD
AD
ED
90
A9
20
AD
20
AD
20
A2
A9
20
4C
6D 01
F6 17
fLILJll
EC 17
6D 01
EA 19
ED 17
F7 17
EE 17
F8 17
E9
2F
88 01
E7 17
7JLJU
E8 17
70 01
02
04
61 01
5C 18
0161
0163
0164
0167
0168
016A
016C
016D
0170
0171
0172
0173
0174
0175
0178
0179
017C
86 Fl
48
20 88 01
68
C6 Fl
DO F7
60
20 4C 19
48 >
4A
4A
4A
4A
20 1D__OJL
68
20 7D 01
60
JSR OUTBTC
LDA SAH
JSR
DUMPT4 JSR
JSR
JSR
LDA
CMP
LDA
SBC
BCC
LDA
JSR
LDA
JSR
LDA
EXIT
JSR
LDX
OUTBTC
VEB
OUTBTC
INCVEB
VEB+1
EAL
VEB +2
EAR
DUMPT4
#$2F
OUTCHT
CHKL
OUTBT
CHKH
OUTBT
#$02
LDA #$04
JSR HIC
JMP DISPZ
Subroutines
HIC
HIC1
STX
PHA
JSR
PLA
DEC
BNE
RTS
TIC
OUTCHT
TIC
HIC1
OUTBT
PHA
LSR
LSR
LSR
LSR
A
A
A
A
JSR HEXOUT
PLA
JSR HEXOUT
RTS
*
017D
017F
0181
0182
0184
0186
0188
018A
018C
018E
0190
0193
29
C9
18
30
69
69
AO
84
AO
84
BE
48
OF
OA
02
07
30
07
F2
02
F3
BE 01
"
HEXOUT AND
CMP
CLC
BMI
ADC
HEX!
ADC
OUTCHT LDY
STY
TRY
LDY
STY
ZON
LDX
PHA
120
#$OF
#$OA
HEX1
#$07
#$30
#$07
COUNT
#$02
TRIE
NPUL,Y
0194
0197
0199
019C
019F
01A1
01A3
01A6
01A8
01A9
01AB
01 AC
01AE
01BO
01B2
01B3
01B5
01B7
01B9
01BB
01BD
2C
10
B9
8D
A5
49
8D
85
CA
DO
68
C6
FO
30
4A
90
AO
FO
C6
10
60
47 17
FB
_J)1
44 17
F5
80
42 17
F5
ZON1
E9
F3
05
07
DB
00
D7
F2
CF
SETZ
ROUT
BIT
BPL
LDA
STA
LDA
EOR
STA
STA
DEX
BNE
PLA
DEC
BEQ
BMI
LSR
BCC
LDY
BEQ
DEC
BPL
RTS
CLKRDI
ZON1
TIMG,Y
CLK1T
GANG
t$80
SBD
GANG
ZON1
TRIE
SETZ
ROUT
A
ZON
#0
ZON
COUNT
TRY
;frequency/density controls
01BE 02
01BF C3 03 7E
NPUL
TIMG
.BYTE $02
.BYTE $C3,$03,$7E
0100-
0110-
0120013001400150016001700180019001A001B001C0-
A9
17
20
EC
17
01
18
48
0A
BE
F5
30
03
AD
A2
70
17
ED
AD
86
4A
18
BE
49
07
7E
8D
64
01
20
F8
E8
Fl
4A
30
01
80
4A
EC
A9
AD
6D
17
17
48
4A
02
48
8D
90
17
16
F5
01
90
20
20
4A
69
2C
42
DB
20
20
17
20
E9
70
88
20
07
47
17
32
61
20
EA
A9
01
01
7D
69
17
85
A0 00
19
01
6D
19
2F
A2
68
01
30
10
F5
F0
A9
A9
01
AD
20
02
C6
68
A0
FB
CA
D7
27
2A
AD
ED
88
A9
Fl
20
07
B9
D0
C6
85
20
F6
17
01
04
D0
7D
84
EF
E9
F2
F5
88
17
CD
AD
20
F7
01
F2
01
68
10
A9
01
20
F7
E7
61
60
60
A0
8D
C6
CF
EF
AD
6D
17
17
01
20
29
02
44
F3
60
8D
F9
01
AD
20
4C
4C
0F
84
17
F0
02
121
43
17
20
EE
70
5C
19
C9
F3
A5
05
C3
MEMORY TEST
Jim
Buttrfild
To run; Set the addresses of the first and last memory pages
you wish to test into locations 0000 and 0001 respectively.
Start the program at address 0002j it will halt with a memory
address on the display. If no faults were found, the address
will be one location past the last address tested. If a fault
is found, its address will be displayed.
^
Example: To test 0100 to 02FF (pages 01 and 02) in KIM:
Set 0000 to 01, 0001 to 02, start program at 0002. If memory
is good, see 0300 (-02FF + 1). Now if you try testing
0100 to 16FF (0000-01,0001-16) the piflgram will halt at
the first bad location - this will be OhOO if you haven't
added memory.
0000
0001
0002
OOOU
0005
xx
xx
A9 00
A8
85 FA
0007 85 70
0009 A2 02
OOOB 86 72
GOOD A5
OOOF 85
0011 A6
0013 A5
0015 U9
0017 85
0019 91
001B C8
001C DO
001E E6
0020 EU
0022 BO
00
FB
01
70
FF
71
FA
FB
FB
FB
F5
star tii
BEGIN xx
END
xx
ending
zero
START LDA #0
zei pointers
TAY
fo:
for low-order
STA POINTL addresses;
ad
-00 first pass, -FF second pass
-(
BIGLP STA FLAG
LDX #2
STX MOD
s^ 3 tests each pass
set pointer to..
PASS LDA BEGIN se"
STA POINTH ..! rt of test area
LDX END
LDA FLAG
reverse FLAG
EOR #$FF
reFF first pass. -00 second pass
STA FLIP
CLEAR STA (POINTL). Y
write above FLIP value..
..into all locations
INI
BNE CLEAR
INC POINTH
CPX POINTH
BCS CLEAR
122
0021* A6 72
0026
0028
002A
002C
002D
A5
85
A5
CA
10
002F A2
0031 91
0033 C8
00
FB
70
TOP
Ok
02
FA
SKIP
003lj
0036
0038
003A
003C
DO F6
E6 FB
A5 01
C5 FB
BO EC
003E
OOkO
0014?
0014*4
00146
A5
85
A6
A5
CA
0014? 10 014
A2 02
A5 70
Dl FA
DO 15
C8
DO FO
E6 FB
A5 01
C5 FB
BO E8
005C
005E
0060
0062
00614
0066
C6
10
A5
h9
30
8h
skip 2 out of 3
SKIP
#2
restore 3-counter
(POINTL),Y change 1 out of
TOP
POINTH
END
POINTH
FILL
new page
have we passed..
..end of test area?
nope, keep going
j mer
memory set up - now test it
LDA BEGIN
set pointer..
..back to start
STA POINTH
LDX MOD
set ur> 3-counter
POP
LDA FLIP
test for FLIP value..
DEX
..2 out of 3 times..
BPL SLIP
- or 1 out of 3..
test for FLAG value;
LDA FLAG
SLIP
CMP (POINTL),Y
Here's the test...
BNE OTTT
branch if failed
00
FB
72
71
00li9
0014B
0014D
OOUF
0051
0052
00514
0056
0058
005A
DEX
BPL
LDX
STA
INY
BNE
IMG
LDA
CMP
BCS
LDX n
INT.
BNE
INC
LDA
CMP
BCS
POP
POINTH
END
POINTH
POP
DEC MOD
BPL PASS
LDA FLAG
EOR
0068 kc UF ic
OUT
BUT BIGLP
STY POINTL
JMP START
0000
0010
0020
0030
0040
0050
0060
00
FB
E4
02
85
15
A5
00
A6
FB
91
FB
C8
70
A9
01
BO
FA
A6
DO
49
00 A8
A5 70
F5 A6
C8 DO
72 A5
FO E6
FF 30
85
49
72
F6
71
FB
Al
FA 85
FF 85
A5 00
E6 FB
CA 10
A5 01
84 FA
70
71
85
A5
04
C5
4C
123
A2
91
FB
01
A2
FB
4F
02
FA
A5
C5
02
BO
1C
86
C8
70
FB
A5
E8
72
DO
CA
BO
70
C6
A5
FB
10
EC
Dl
72
00
E6
04
A5
FA
10
85
FB
A2
00
DO
AD
MINI
DIS
By Dan Lewart
D8
A2
9A
AO
A2
94
CA
DO
E8
START
FF
00
09
E5
FB
INIT
INIT1
SED
LDX
TXS
LDY
LDX
STY
DEX
BNE
I NX
tt$FF
#$00
#$09
OOE5,X
INIT1
124
INITIALIZE STACK
POINTER
(E&-EE)=0
030E
0310
0312
0314
0316
0318
031A
031C
031D
031F
0321
0323
0325
0327
0329
032B
032D
032F
0330
0332
0334
0336
0338
033A
033D
033F
0341
0343
0346
0349
034B
034D
034E
03 4F
0350
0352
0354
0356
0358
0359
035B
035D
035E
0361
0363
0364
0365
0367
0368
036B
036D
036E
0370
0372
0374
0377
0379
Bl FA
C9 20
FO 3B
29 9F
FO 35
C9 92
FO 1A
A8
29 ID
C9 19
FO 2C
29 OD
C9 08
FO 24
29 OC
C9 OC
FO 20
98
29 8F
C9 02
DO 18
E6 EC
A9 FF
8D 07 17
A5 EC
29 01
FO 03
20 19 IF
2C 07 17
30 EB
10 FO
E8
E8
8A
49 07
85 ED
A4 EE
Bl FA
48
4A 4A
4A 4A
A8
B9 E7 IF
95 E5
E8
68
29 OF
A8
B9 E7 IF
95 E5
E8
E6 EE
E4 ED
90 EO
20 AF 03
DO FB
20 AF 03
LENGTH
FLASH
FLASH 1
FLASH2
1BYTE
2 BYTE
3 BYTE
LDA (POINTL),Y
CMP#$20
BEQ 3BYTE '
AND #$9F
BEQ 1BYTE
CMP #$92
BEQ FLASH
TAY
AND #$1D
CMP #$19
BEQ 3BYTE
AND 34 OD
CMP #$08
BEQ 1BYTE
AND #$OC
CMP #$OC
BEQ 3BYTE
TYA
AND #$8F
CMP #$02
BNE 2 BYTE
INC OOEC
LDA #$FF
STA 1707
LDA OOEC
AND #$01
BEQ FLASH2
JSR SCAND
BIT 1707
BMI FLASH
BPL FLASH 1
INX
INX
; 3 BYTES (4C,EE)
TXA
CENTER CODE
EOR #$07
STA O.OED
CONVRT LDY # $EE
LOOP FOR EACH BYTE
LDA (POINTL) ,Y CONVERT AND STORE
PHA
IN E6 - EB
LSR's
LSR's
TAY
LDA TABLE, Y
STA OOE5,X
INX
PLA
AND #$OF
TAY
LDA TABLE, Y
STA O O E 5 , X
INX
INC OOEE
CPX OOED
BCC CONVRT
DISPLAY UNTIL ALL KEYS
K DOWN JSR DISP
BNE K DOWN
ARE UP
K UP
JSR DISP
DISPLAY AND GET KEY
125
037C
037F
0381
0383
0384
0386
0388
0389
038B
038C
038E
0391
0393
0395
0397
0398
039 A
039B
039E
03AO
03A2
03A4
03A6
03A8
03AB
03AD
03AF
03B1
03B4
03B6
03B8
03BA
03BD
03CO
03C1
03C3
03C5
20 6A IF
C9 OP
DO OE
BA
EO FF
FO 20
68
85 FB
68
85 FA
4C 04 03
C9 <#=
DO OF
A5 FA
48
A5 FB
48
20 63 IF
C6 EE
FO EC
DO F7
C9 I*
DO Dl
20 19 IF
FO CC
DO F9
A9 7F
8D 41 17
A2 08
AO 00
84 FC
B9 E6 00
20 4E IF
C8
CO 06
90 F3
4C 3D IF
JSR GETKEY
CMP#$OB
BNE PLUS?
BCKSTP TSX
CPX#$FF
BEO WINDOW
PLA
STA OOFB
PLA
STA OOFA
NEWORD JMP INIT
PLUS?
CMP #$<Bf1
B?
BNE PC?
STEP
STEP 1
PC?
WINDOW
DISP
DISP 1
LDA
PHA
LDA
PHA
JSR
DEC
BEQ
BNE
CMP
BNE
JSR
BEQ
BNE
LDA
STA
LDX
LDY
STY
LDA
JSR
I NY
CPY
BCC
JMP
OOFA
IS "B" PRESSED?
NO, BRANCH
IS STACK EMPTY?
YES, ACT LIKE "PC"
PULL FB AND FA
DISPLAY WORD
^
IS "- PRESSED?
NO, BRANCH
PUSH FA AND FB
OOFB
FIND NEW LOCATION
DISPLAY WORD
INCPT
OOEE
NEWORD
STEP 1
#$14
K UP
SCAND
K UP
WINDOW
#$7F
PADD
#$08
#$00
OOFC
OOE6,Y
1F4E
IS *\
PRESSED?
NO, GET KEY
DISPLAY LOCATION
UNTIL KEY RELEASED
THEN GET KEY
SEGMENTS TO OUTPUT
INITIALIZE
GET CHARACTER
DISPLAY CHARACTER
NEXT CHARACTER
#$06
DISP1
1F3D
D8
C9
19
29
01
49
IF
E4
OB
03
FO
7F
C8
A2
20
FO
8F
FO
07
95
ED
DO
C9
EC
8D
CO
FF
FO
2C
C9
03
85
E5
90
OE
12
DO
41
9A
3B
29
02
20
ED
E8
EO
BA
DO
F7
17
AO
29
OD
DO
19
A4
68
20
EO
OF
C9
A2
00
9F
C9
18
IF
EE
29
AF
FF
A5
14
08
06 90 F3 4C
A2 09
FO 35
08 FO
E6 EC
2C 07
Bl FA
OF A8
03 DO
FO 20
FA 48
DO Dl
AO 00
3D IF
126
94
C9
24
A9
17
48
B9
FB
68
A5
20
84
E5
92
29
FF
30
4A
E7
20
85
FB
19
FC
CA
FO
OC
8D
EB
4A
IF
AF
FB
48
IF
B9
DO
1A
C9
07
10
4A
95
03
68
20
FO
E6
FB
A8
OC
17
FO
4A
E5
20
85
63
CC
00
E8
29
FO
A5
E8
A8
E8
6A
FA
IF
DO
20
Bl
ID
20
EC
E8
B9
E6
IF
4C
C6
F9
4E
FA
C9
98
29
8A
E7
EE
C9
04
EE
A9
IF
MOVIT
By Lew Edwards
1780
1781
1783
1784
1786
1788
USA
178C
178E
1790
1791
1793
1795
1797
1799
179B
179D
179F
17A1
17A2
17A4
17A6
17A8
17AA
17AC
17AE
17BO
17B2
17B4
17B6
17B8
17B9
17BB
D8
AO
38
A5
E5
85
A5
E5
85
18
A5
65
85
A5
65
85
E6
E6
38
A5
E5
A5
E5
A2
90
A2
Al
81
90
C6
98
45
DO
START
FF
D2
DO
D8
D3
Dl
D9
D8
D4
D6
D9
D5
D7
D8
D9
D4
DO
D5
Dl
00
02
02
DO
D4
14
D2
D2
02
LOOP
MOVE
CLD
LDY
SEC
LDA
SBC
STA
LDA
SBC
STA
CLC
LDA
ADC
STA
LDA
ADC
STA
INC
INC
SEC
LDA
SBC
LDA
SBC
LDX
BCC
LDX
LDA
STA
BCC
DEC
TYA
BCL
NSAL
NEAL
BCH
NSAH
NEAH
BCL
BCH
NSAL
OSAL
NSAH
OSAH
#$00
MOVE
#$02
OSAL,X
NSAL,X
DOWN
OEAL
IF NEW LOCATION
HIGHER THAN OLD
CARRY FLAG IS SET
EOR OEAL
BNE NO
127
17BD
17BF
17C1
17C2
17C4
17C6
17C8
17CA
17CC
17CE
17DO
17D2
17D4
17D6
17D8
17DA
17DC
17DE
C6
C6
98
45
DO
C6
BO
E6
DO
E6
E6
DO
E6
C6
DO
C6
DO
00
D3
D6
DEC
DEC
TYA
EOR
BNE
DEC
BCS
INC
BNE
INC
INC
BNE
INC
DEC
BNE
DEC
BNE
BRK
NOT
D6
02
D7
OC
DO
02
Dl
D4
02
D5
D8
02
D9
CC
NEIN
DOWN
NYET
COUNT
ONE
DONE
OEAH
NEAL
NEAL
NEIN
NEAH
COUNT
OSAL
NYET
OSAH
NSAL
COUNT
NSAH
BCL
ONE
BCH
LOOP
P.S. Don't forget to set the IRQ vector for the break
(KIM - 1COO at 17FE,FF)
1780
1790
17AO
17BO
17CO
17DO
D8
18
D9
Al
D6
E6
AO
A5
38
DO
98
D4
FF
D8
A5
81
45
DO
38
65
D4
D4
D6
02
A5
D4
E5
90
DO
E6
D2 E5
85 D6
DO A5
14 C6
02 C6
D5 C6
DO
A5
D5
D2
D7
D8
85
D9
E5
98
BO
DO
D8
65
Dl
45
OC
02
A5
D5
A2
D2
E6
C6
D3
85
00
DO
DO
D9
E5
D7
90
02
DO
DO
Dl
E6
02
C6
02
CC
85
D8
A2
D3
E6
00
D9
E6
02
C6
Dl
128
1780
1782
1785
1787
178A
178C
178E
1791
1793
1795
1798
179A
179C
179F
17A2
17A5
17A7
17A9
17AB
17AD
17AF
A9 07
8D 42 17
A9 01
8D 01 17
BEGN
85
El
A9 7F
8D 41 17
A2 09
AO 07
2C 42 17
30 02
AO 38
8c 40 17
8E 42 17
2C 47 17
MORE
SEGS
DELA
10 FB
E6 E2
30 04
A9 91
DO 03
HITO
A9 93
17B1 EA
17B2
17B5
17B7
17B9
17BB
17BE
17BF
17CO
17C2
17C4
8D 44
A9 01
45 El
85 El
8D 00
E8
E8
LOTO
17
CLK1
17
EO 15
DO CF
FO CB
1780
1790
17AO
17BO
A9
17
42
93
07
A2
17
EA
17CO EO 15
8D
09
2C
8D
DO
42
AO
47
44
CF
17 A9
07 2C
17 10
17 A9
FO CB
IDA
STA
LDA
STA
STA
LDA
STA
LDX
LDY
BIT
BMI
LDY
STY
STX
BIT
BPL
INC
BMI
LDA
BNE
LDA
NOP
STA
LDA
EOR
STA
STA
INX
INX
CPX
BNE
BEQ
01
42
FB
01
#07
SBD
#01
PAD
El
#7F
PADD
#09
#07
SBD
SEGS
#38
SAD
SBD
CLKRDI
DELA
E2
LOTO
#91
CLK1
#93
CLK1T
#01
El
El
PAO
#15
NEXT
MORE
8D
17
E6
45
01
30
E2
El
129
17 85
02 AO
30 04
85 El
El
38
A9
8D
A9
8C
91
00
7F
40
DO
17
8D
17
03
E8
41
8E
A9
E8
RELOCATE
Jim Butterfield
Ever long for an assembler? Remember when you wrote that 300 byte
program - and discovered that you'd forgotten one vital instruction in the
middle? And to make room, you'd have to change all those branches, all
those addresses... Or the program with that neat piece of coding in it, thr
you suddenly need to remove (say, to change it to a subroutine)...but if
you do, you'll have to fill all that empty space with NOPs? It's enough
to make a grown programmer cry...
Dry those tears. Program RELOCATE will fix up all those addresses
and branches for you, whether you're opening out a program to fit in an
extra instruction, closing up space you don't need, or just moving the whole
thing someplace else.
RELOCATE doesn't move the data. It just fixes up the addresses before
you make the move. It won't touch zero page addresses; you'll want them
to stay the same. And be careful: it won't warn you if a branch instruction goes out of range.
You'll have to give RELOCATE a lot of information about your program:
and place a dud instruction (FF) behind your last program instruction. This tells RELOCATE where to stop.
Place the program start address in locations EA and EB, low
order first as usual. Don't forget the FF behind the last
(3)
How far you will want to relocate information above the boundary. This value is called the increment. For example, if you
want to open up three more locations in your program, the increment will be 0003. If you want to close up four addresses,
the increment will be FFFC (effectively, a negative number).
Place the increment value in locations E8 and E9, low order
first.
130
Now you can move the program. If you have lots of memory to spare,
you can write a general MOVE program and link it in to RELOCATE, so as to
do the whole job in one shot.
But if, like me, you're memory-deprived, you'll likely want to run
RELOCATE first, and then load in a little dustom-written program to do
the actual moving. The program will vary depending on which way you want
to move, how far, and how much memory is to be moved. In a pinch, you can
use the FF option of the cassette input program to move your program.
OOE?
OOE8
OOEA
OOEC
0110
0111
0113
0115
0116
0118
0119
011C
011F
D8
AO 00
Bl EA
A8
A2 07
98
3D 8E 01
5D 95 01
FO 03
Jim Butterfield
; following addresses must be initialized
; by user prior to run
PAGLIM *=*+!
limit above which kill relocn
ADJST *=*+2
adjustment distance (signed)
POINT
start of program
BOUND
lower boundary for adjustment
; main program starts here
START CLD
LDY #0
LDA (POINT),Y
get op code
TAY
+cache in Y
LDX #7
LOOP TYA
restore op code
AND TAB1-1.X
remove unwanted bits
EOR TAB2-1.X
& test the rest
BEQ FOUND
131
0121
0122
012*f
012?
0129
012B
012D
012F
CA
DO F4
BC 9D 01
30 OD
FO 22
E6 EA
DO 02
E6 EB
0131 88
0132 DO F?
013^ FO DA
0136 c8
0137 30 D9
0139 C8
013A Bl EA
013C AA
0130 C8
013E
OUtO
01^3
01^5
Bl EA
20 ?9 01
91 EA
88
01^6 8A
OlU? 91 EA
01^9 AO 03
Ol^B 10 DE
Ol^D
Ol^E
0150
0152
C8
A6 EA
A5 EB
20 79 01
0155 86 EO
0157
0159
015B
015C
015E
0160
A2 FF
Bl EA
18
69 02
30 01
E8
0161 86 E3
0163 18
016^
0166
016?
0169
016B
016E
016F
0170
0171
0172
017^
65
AA
A5
65
20
CA
CA
8A
38
E5
91
0176 c8
EA
E3
EB
79 01
EO
EA
0177 10 B2
0179 C5 E7
01?B
01?D
01?F
0181
BO
C5
DO
E*f
11
ED
02
EC
0183 90 09
0185 ^8
0186 8A
0187 18
0188 65 E8
018A AA
018B 68
Ol8c 65 E9
018E 60
018F OC IF OD
0192 87 IF FF
0195 03
0196 OC 19 08
ADJUST CMP
BCS
CMP
BNE
CPX
TES2 BCC
PHA
TXA
CLC
ADC
TAX
PLA
ADC
OUT
RTS
PAGLIM
OUT
BOUND+1
TES2
BOUND
OUT
too high?
hi-order?
lo-order?
too low?
stack hi-order
ADJUST
adjust lo-order
ADJST+1
unstack hi-order
and adjust
.BYTE
*OC,$19,$08,$00,$10,$20,$03
TAB3
.BYTE
f02,$FF,$FF,$01,$01,$00,$FF,$FE
0199 00 10 20
019C 03
019D 02 FF FF
01AO 01 01 00
01A3 FF FE
end
Credit for the concept of RELOCATE goes to Stan Ockers, who insisted
that it was badly needed, and maintained despite my misgivings that it
should be quite straightforward to program. He was right on both counts.
01100120013001400150016001700180019001A0-
0 \
D8 A0
03 CA
EB 88
20 79
A5 EB
E8 86
8A 38
02 E4
IF 0D
01 01
2
00
D0
D0
01
20
E3
E5
EC
87
00
i
Bl
F4
F7
91
79
18
E0
90
IF
FF
EA
BC
F0
EA
01
65
91
09
FF
FE
^8
9D
DA
88
86
EA
EA
48
03
u
A2
01
C8
8A
0
AA
C8
8A
0C
133
07
30
30
91
A2
AS
10
18
19
%
98
0D
D9
EA
FF
E3
E2
65
08
<f
3D
F0
C8
A0
Bl
65
C5
E8
00
A
8E
22
Bl
03
EA
EB
E7
01 5D 95 01 F0
E6
EA
10
18
20
B0
AA 68
10 20
EA
AA
DE
69
79
11
65
03
D0
C8
C8
02
01
C5
E9
02
02
Bl
A6
30
CA
ED
60
FF
E6
.EA
EA
01
CA
D0
0C
FF
Jim Butterfield
134
^ ^gD ^ Q2 ^ ^
Q2 CA
^F? 00.
135
SORT
by Jim Pollock
START LO
17F5
17F6
17F7
17F8
AD
85
85
AD
85
85
AD
0211 85
0213 AD
0216 85
0218 A2
02 1A D8
02 IB Al
021D Cl
021F BO
0221 Al
0223 85
0200
0203
0205
0207
020A
020C
020E
F5
E8
EA
F6
E9
EB
F7
EC
F8
ED
00
E8
EA
OC
E8
E7
START HIGH
END LO
END HI
17 SORT
LDA 17F5
17
STA OOE8
STA OOEA
LDA 17F6
STA OOE9
STA OOEB
17
17
GET
SWAP
LDA
STA
LDA
STA
LDX
CLD
LDA
CMP
BCS
LDA
STA
17F7
OOEC
17F8
OOED
tt$00
(OOE8,X)
(OOEA,X)
INCN
(OOE8,X)
OOE7
136
0225
0227
0229
022B
022D
022F
0231
0233
0235
0237
0239
023B
023D
023F
0241
0243
0245
0247
0249
024B
024D
024F
0251
0253
0255
0257
0259
025B
Al
81
A5
81
E6
DO
E6
A5
C5
DO
A5
C5
DO
E6
DO
E6
A5
85
A5
85
A5
C5
DO
A5
85
C5
DO
4C
EA
E8
E7
EA
EA
INCN
02
EB
LASTN
EA
EC
E2
ED
EB
DC
E8
02
E9
OVER
E8
EA
E9
EB
EA
EC
C8
E9
EB
ED
CO
4F 1C
LDA
STA
LDA
STA
COOEA,X)
COOES,/)
OOE7
(OOEA,X)
INC
BNE
INC
LDA
CMP
BNE
LDA
CMP
BNE
INC
BNE
INC
LDA
STA
LDA
STA
LDA
CMP
BNE
LDA
STA
CMP
BNE
JMP
OOEA
LASTN
OOEB
OOEA
OOEC
GET
00ED
OOEB
GET
OOE8
OVER
OOE9
OOE8
OOEA
OOE9
OOEB
OOEA
OOEC
GET
OOE9
OOEB
OOED
GET
1C4F
NOT YET
IS THIS LAST PASS/LOOP?
NO
NO PAGE CHANGE
PAGE CHANGE
INIT. VALUE FOR NEXT PASS
AD
17
OC
02
E8
EC
F5
85
Al
E6
DO
DO
17
EC
E8
EB
02
C8
85
AD
85
A5
E6
A5
E8
F8
E7
EA
E9
E9
85 EA
17 85
Al EA
C5 EC
A5 E8
85 EB
AD
ED
81
DO
85
C5
F6
A2
E8
E2
EA
ED
137
17
00
A5
A5
A5
DO
85 E9 85 EB
D8 Al E8 Cl
E7 81 EA E6
ED C5 EB DO
E9 85 EB A5
CO 4C 4F 1C
AD F7
EA BO
EA DO
DC E6
EA C5
SUPSR-DUPS
by Jim Butterfield
A2
B5
95
CA
10
A9
85
85
D8
A9
8D
20
4&
05
03
E2
EO
START
LOOP
F9
00
F6
F7
07
42 17
41 1A
F9
F9
SW
LDX #3
LDA POINT2,X
STA POINT, X
DEX
BPL LOOP
LDA #0
STA CHKSUM
STA CHKKI
CLD
LDA #7
STA SBD
JSR RDBIT
LSR INK
ORA INH
138
001C
001E
0020
0022
0025
0027
0029
002B
002D
0030
0032
0034
0037
0039
003C
003D
003F
0041
0044
0046
0048
004B
004D
004E
0050
0052
0055
0057
0059
005B
005D
0060
0062
0064
0067
0069
006B
006E
0070
0073
0075
0076
0078
007B
007D
0080
0082
0084
0086
0089
008B
85
C9
DO
20
C6
10
C9
DO
20
85
A2
20
95
20
E8
30
A2
20
C9
FO
20
DO
CA
DO
81
20
E6
DO
E6
DO
20
C5
DO
20
C5
DO
20
FO
20
85
OA
FO
8D
65
8D
A9
85
A9
8D
A2
A9
F9
16
F3
24
F9
F5
2A
Fl
F3
F9
FE
F3
FC
91
STA INK
BNE
JSR
DEC
BPL
CMP
BNE
JSR
STA
1A
19
SYN
RDCHT
INK
TST
#$2A
TST
RDBYT
INK
ADDR
IF
F5
02
24 1A
2F
15
00 1A
1C
Fl
EO
91
EO
02
El
E2
F3
F7
05
F3
F6
95
IF
FB
6A
P5
TST
BYTE
DUBL
RDBYT
POINTH+1, X
CHK
ADDR
#2
RDCHT
#$2F eot?
WIND
PACKT
IF
19
JSR
STA
JSR
INX
BMI
LDX
JSR
CMP
BEQ
JSR
OVER
WIND
BNE
STA
JSR
INC
BNE
INC
BNE
JSR
CMP
DUBL
( POINT, X)
CHK
POINT
OVER
POINT+1
BYTE
RDBYT
CHKHI
19
CMP CHKSUM
IF
ELNK
FLSH
BNE START
(or 65?)
JSR SCANDS
JSR
STA
ASL
BEQ
STA
ADC
STA
88
BE 01
F5
CO 01
27
F5
BF
43 17
64
16
GETKEY
GANG
A
START
NPUL
GANG
TIMG+1
GANG
#$BF
PBDD
#$64
139
008D
008F
0091
0094
0096
0099
009B
009E
OOAO
OOA3
OOA5
OOA8
OOAA
OOAC
OOAF
OOB1
OOB3
OOB5
OOB7
OOB9
OOBB
OOBD
OOBF
OOC1
OOC4
OOC6
OOC9
OOCB
A2
A9
20
A9
20
A5
20
A5
20
A5
20
AO
Bl
20
E6
DO
E6
A5
C5
A5
E5
90
A9
20
A5
20
A5
4C
64
16
61
2A
88
F9
70
FA
70
FB
70
00
E2
70
E2
02
E3
E2
EO
E3
El
E9
2F
88
F7
70
F6
54
01
01
01
01
01
DATA
01
SAMP
01
01
01
LDX
LDA
JSR
LDA
JSR
LDA
JSR
LDA
JSR
LDA
JSR
LDY
LDA
JSR
INC
BNE
INC
LDA
CMP
LDA
SBC
BCC
LDA
JSR
LDA
JSR
LDA
JMP
#$64
send 100
#$16
sync
HIC
#$2A
start char
OUTCHT
INK
write ID
OUTBT
POINTL
start adds
OUTBT
POINTH
OUTBT
#0
(POINT2)
OUTBT
write data
POINT2
SAMP
next addrs
POINT2+1
POINT2
POINT
POINT2+1
POINT+1
DATA
more data?
#$2F
eot
OUTCHT
CHKHI
checksum
OUTBT
CHKSUM
EXIT
OODO 4C 29 19
JMP LOADT9
OOE2 00 02 00 02
FFFF option
00100020003000400050006000700080009000A003B000C000D000E0-
A2
A9
D0
85
02
81
C5
20
F5
16
20
E2
2F
4C
03
07
F3
F9
20
E0
F7
6A
8D
20
70
D0
20
29
B5
8D
20
A2
24
20
D0
IF
C0
61
01
02
88
19
00
E2
42
24
FE
1A
91
05
C9
01
01
A5
E6
01
95
17
1A
20
C9
IF
20
07
A9
A9
FB
E3
A5
E0
20
C6
F3
2F
E6
F3
B0
27
2A
20
A5
F7
CA
41
F9
19
F0
E0
19
F4
85
20
70
E2
20
10
1A
10
95
15
D0
C5
85
F5
88
01
C5
70
A9
F9
C9
20
00
E6
D0
0A
BF
A5
A0 00
E0 A5
01 A5
F9
46
F5
FC
20
02
F6
F5
A9
01
00
05
2A
91
1A
El
95
F0
8D
F9
Bl
E3
F6
85
F9
00
IF
D0
D0
20
84
43
20
E2
E5
4C
F6
85
Fl
E8
1C
E2
IF
8D
17
70
20
El
54
85
F9
20
30
CA
20
IF
BE
A2
01
70
90
01
02 00 02
140
F7
C9
F3
F5
D0
F3
F0
01
64
A5
01
E9
FF
D8
16
19
A2
Fl
19
FB
65
A9
FA
E6
A9
EA
VERIFY TAPf
Do you want to verify the cassette tape you just recorded before the
information is lost? Then follow this simple procedure:
1. Manually verify that the starting address ($1?F5, 8l?F6), the
ending address ($17*7, $1?F8) and the block identification
(S17F9) locations are correct in memory.
2. Enter zeros (800) into CHKL ($1?E7) and CHKH ($17E8).
3. Enter the following routine:
17EC CD 00 00
17EF DO 03
17F1 IfC OF 19
kC 29 19
VEB
failed
cmp
bne
jmp
jmp
START
failed
LOAD12
LOADT9
VU-TAPf
Jim Butterfield
Program VUTAPE lets you actually see the contents of a KIM format
tape as it's going by. It shows the data going by very quickly, because
of the tape speed..but you can at least "sense" the kind of material on
the tape.
In case of tape troubles, this should give you a hint as to the area
of your problem: nothing? noise? dropouts? And you can prepare a test
tape (see below) to check out the tape quality and your recorder. The
test tape will also help you establish the best settings for your volume
and tone controls.
Perhaps VUTAPE1s most useful function, though, is to give you a
"feeling" for how data is stored on tape. You can actually watch the
processor trying to synchronize into the bit stream. Once it's synohed,
you'll see the characters rolling off the tape...until an END or illegal
character drops you back into the sync mode again. It's educational to
watch And since the program is fairly short, you should be able to trace
out just how the processor tracks the input tape.
VUTAPE starts at location 0000 and is fully relocatable (so you can
load it anyplace it fits).
141
0000 D8
0001 A9 7F
0005 8D 41 17
0006 A9 13
0008 85 EO
START
SYN
OOOA 8D 42 17
OOOD 20 41 1A
0010 46 F9
0012 05 F9
0014 85 F9
0016 8D 4o 17
0019 C9 16
001B
001D
0020
0022
0024
0026
0029
002C
002F
0031
0033
0034
0035
0037
0039
003B
003D
0040
oo4i
0044
0047
DO E9
20 24 1A
C9 2A
DO F5
A9 00
8D E9 17
20 24 1A
20 00 1A
DO D5
A6 EO
E8
E8
EO 15
DO 02
A2 09
86 EO
8E 42 17
AA
BD E7 IF
8D 40 17
DO DB
TST
STREAM
CLD
LDA
STA
LDA
STA
STA
JSR
LSR
ORA
STA
STA
CMP
BNE
JSR
CMP
BNE
LDA
STA
JSR
JSR
BNE
LDX
INX
INX
#87F
PADD
#$13
POINT
SBD
RDBIT
INH
INH
INH
SAD
#816
SYN
RDCHT
#82A
TST
#800
SAVX
RDCHT
PACKT
SYN
POINT
CPX #815
BNE
LDX
STX
STX
TAX
LDA
STA
BNE
-OVER
OVER
#809
POINT
SBD
TABLE,X
SAD
STREAM
0050
0052
0055
0057
005A
AO BF
GO
8c 43 17
A9 16
LP
20 7A 19
DO F9
LDY
STY
LDA
JST
BNE
#8BF
PBOD
#816
DUTCH
LP
directional..
...registers
SYNC
...out to tape
Now use the program VUTAPE. The display should show a steady
synchronization pattern consisting of segments b,c, and e on the right
hand LED. Try playing with your controls and see over what range the
pattern stays locked in. The wider the range, the better your cassette/
recorder.
142
Games and diversions using the keyboard and display are fine.
Programming in assembly language can even be a lot of fun,
once you get over the first few hurdles . But, sooner or later
you are going to get the urge to have your KIM act like the
"big machines". What do you have to add on? How much will
it cost? How much trouble is it going to be? Let's look at
a few of the options and you can decide for yourself.
Memory Expansion
If you only had more memory, you could do anything, right?
Well, not exactly, but let's see what's involved in adding
memory.
Decoding
The complete address bus isn't available to each memory chip
because there are just too many lines and not enough pins on
the chips. Instead , there is some extra circuitry which looks
144
1
at the entire address bus and determines which block,
(usually IK blocks), of memory should be allowed to function.
This is called decoding circuitry. Sub-addressing within
blocks is handled by the lower address lines which are
connected to all chips.
If you start adding too many chips to the address and data
busses, the extra circuits begin to "load down" the bus and
cause it to not function prooerly. Additional boards are
sometimes isolated from the main busses with circuits
called "buffers" which prevent this from happening. Some
memory boards have buffers built in.
If you build from a kit, there are many solder connections that
are very close to each other; it's easy to make mistakes. Kit
or assembled board however, you should follow the instructions
of someone who has already done it.
What does it cost?
Here's the good part! Memory prices have been dropping and
are continuing to drop. Recently boards have been coming out
using 4K memory chips which have more bits per chip than the
older IK RAM. This reduces the cost further, especially on
boards having a lot of memory.
145
Any price quoted would soon be out of date and the price per
byte depends heavily on the size of board you buy. A quick
scan th rough a recent hobbyist publication should give you a
rough idea of what to expect.
How Much Do You Need ?
A Caution
No matter what bus you decide on, you are going to need
programs written for KIM to drive certain boards you might
plug in. Unless there is a program for that particular board,
written for KIM, you are in for a lot of work.
i<
*H
Remember that we had planned to use the serial I/O ports on KIM.
The video board or the keyboard is more than likely hooked up
to input or output in bytes, (parallel input or output). A whole
byte appears on 8 seperate pins along with a timing pulse, called
a strobe, on yet another pin. The strobe is used to indicate when
data is valid. We have to convert this type of input or output to
the sequential bit by bit information required by the serial port.
Luckily, there are chips designed especially to do this. They
are called UART's and are found on serial interface boards.
One such board was described in issue #1 of Kilobaud, (Jan. '77).
Wha>to look for
148
the next line start at the top. Instead, some boards automatically
push every line up to make room for the incoming line, (the top
line goes off the screen).
Blank to end-of-line and blank to end-of-screen features are
necessary to keep from having a lot of unwanted characters left
on the screen. Be sure to check to find out exactly what features
are included on the board you are buying. If you can, find
someone who has a similar board up and running.
Back To The Busses
It's not manditory that a video board work off the serial ports.
There are boards made to plug into most "standard" motherboards.
These work off the data and address busses directly. In many
cases, they include memory to hold the characters which looks
just like any other memory to the processor. This has the
advantage that any character can be changed instantaneously.
A board like this is undoubtedly going to require software to keep
things organized and you'll have to provide programs written
especially for KIM.
Hardware vs Software
With the prices of memory continuing to drop, it's becoming
cheaper to replace many hardware functions with software. In
the case of video, you can use software not only to keep track
of what characters go where; you can also use it to generate
most of the display itself. This tends to reduce the cost
considerably.
Using this fact, Don Lancaster describes a T.V. Typewritter
addition to the KIM for $25-$35, (Kilobaud #6, June '77 or
Popular Electronics, July '77 and August '77). But a word of
caution. You'll have to "chop up" your KIM a bit to implement
this-^the project involves cutting a piece of KIM's printed
circurTfoil, plus wiring in a whole bunch of new wires. And
while the changes don't affect KIM's operation, you have to
recognize that memory expansion becomes a different ball game
Don uses the addresses from 2000 to EFFF, and that means
that you can't just add on extra memory in those areas.
The keyboard also doesn't have to come into the serial port.
Some video boards have a keyboard port built in. Another
possibility is the parallel I/O ports on the KIM itself. Again,
you'll have to provide the necessary software, but it would
save you from having to buy a serial interface board.
149
If you are thinking of running both the keyboard and video board
off the parallel ports of KIM, you should add up the total number
of lines you need. By the time you include all necessary strobe
lines, you will probably find you don't have enough ports available,
Hooking To Your T.V.
When you hook a video board to a T.V. set, make sure that the
T.V. has a transformer which isolates the set from the A . C .
line. 110 volts can ruin a lot of chips in a hurry!
There are two ways of putting the video signal in the T.V.
If you want to go into the antenna terminals, you will need a
board which generates a regular T.V. frequency signal with
the video signal being imposed upon it. Kits are available
for $10 - $15.
The graphics boards that are used with T.V. sets generate many
tiny white rectangles, squares or dot patterns on the screen,
these can be individually turned on or off at will. Some video
boards meant to display characters also have limited graphics
capability.
150
Printers
There are faster tape units on the market, but the ultimate as
far as the hobbist is now concerned is the "floppy" . The floppy
disk is like a flexable phonograph record coated with iron oxide
as is used on tapes. A read/write head is moved radially outward
from the center to read or write on different "tracks". The main
advantage over tape is the speed at which any block of information
can be located. The information is also put on very compactly
and reading it back takes only a few seconds at most.
The mechanism to do all this is a precision piece of equipment
and quite expensive. Prices are continuing to drop however
as the demand becomes greater. The electronics necessary is
also quite complex, but as with the UART, single chips are now
being made which do most of the job.
151
152
Pis-Assemblers
CA
10 F8
AD 04 17
85 80
DEX
BPL 02 OA
IDA 1704
STA 0080
INPUT A
receive value "a" from keyboard
LET BA*A
"*" means multiplication
PRINT "THE SQUARE OF ";A;" IS ";B
STOP
See how easy it is? KIM must read each line, character by character,
decide what it means: inputting, calculating, printing or whatever,
and then perform that action. KIM works hard, but you don't .
153
IJ
Text Editors
It can be very handy to compose a number of lines of material
such as a letter, a program, or general data; put it into your
KIM system; save it permanently on tape or disk; and then later
recall it and change, insert or delete information.
If you're writing a letter, you can correct mistakes and insert
new thoughts as they occur to you, perhaps even generating
several slightly different versions to mail to various people.
If you have a program, you can correct bugs as you find them
and insert new coding as needed Data files can be kept up
to date.
Text Editors are very important with other software such as
assemblers and interpreters; often, they are built in.
Mathematical Packages
Each memory location in KIM can store a number from 0 to FF
hexadecimal, or 0 to 255 decimal. Ther are no fractions,
and you have to make special arrangement for signed (positive
and negative) numbers. You can link memory locations together
to hold larger numbers; but extremely large numbers and fractions
call for special mathematical techniques to be used. In addition,
KIM gives you only addition and subtraction; you have to work
out multiplication and division for yourself, to say nothing of
more complex functions like square roots and powers.
You can program all this yourself, if you have the time and
the mathematical background. But if you really need to perform
advanced math on your KIM, you'll be better off to obtain
a pre-written mathematical package.
154
CONNECTING
TO THE WOKIJI
By Cass Lewart
Introduction - Calculator versus Computer
156
Location
1700
1701
1702
1703
Port
Pin
PBO
A-9
PB1
A-10
157
Port
Pin
Port
Pin
PA2
A-3
PB2
A-ll
PAS
A-2
PB3
A-12
PA4
A-5
PB4
A-13
PAS
A-6
PB5
A-16
PA6
A-7
PB6
Not accessible
PA7
A-8
PB7
A-15
158
Code
Mnemonic
00
A9 80
LDA #80
02
8D 01 17
STA 1701
05
A9 00
LDA #00
Set output to 0
07
8D 00 17
STA 1700
OA
AD 00 17
LDA 1700
OD
29 7F
AND #7F
OF
C9 7F
CMP #7F
11
FO F7
BEQ OA
13
A9 80
LDA #80
15
8D 00 17
STA 1700
Csound alarm
18
4C 13 00
JMP 0013
Comments
159
BURGLAR
ALARM
CIRCUIT
Multiple Drives
MULTIPLE
6
KIM
+5-dttM.TS
-Si
INTERFACE
/-,-L
f +
|N4*1
UMIOS
160
AC Control
AC
INTERFACE
ir
$>*'
\p
f-SV
FROM
75191
_>, TO LIGHT
* OR
** *
(R.S.276-H4o)
TO IIOV
OUTLET
161
162
Similarly an analog-to-digital (A/D) converter interface can be used to turn KIM into a measuring instrument
such as a digital voltmeter, thermometer or even a
speech recognizer. Applications of a microprocessor
equipped with D/A and A/D converters are limited only
by your imagination and by your wallet.
Interval Timer
Many applications which interface KIM to the outside
world benefit from the addition of a timer. For
example, you may want the train in a model train
layout to stop for exactly 45 seconds at a station
under seme conditions but for only 30 seconds under
other conditions. For this and other purposes as well,
KIM has a built-in interval timer which can be set to
various multiples of its crystal
controlled cycle
time of 1 microsecond (10~6 sec.). By storing a number
K between 1 and FF^QX in one of the special memory
locations listed below we direct the timer to count
a specific number of cycles. The special memory locations used by the interval timer and the longest
count-down period are as follows
Max. Period (sec.)
1704
Timer Count
(microseconds)
K x 1
1705
K x 8
0.002
1706
K x 64
0.016
1707
K x 1024
0.26
Location
For K = FFhex
0.000255
163
Timer Example
The following short program illustrates the use of
the interval timer. The program will leave the loop
after 5 x 64 = 320 microseconds count is detected
by the BIT instruction. While the timer counts,
other tasks can be performed by KIM.
Mnemonic
Comments
LDA #05
STA 1706
5 in 1706
10
2C 07 17
BIT 1707
'13
10 FO
BPL 05
If still counting, go to 05
15
........
Otherwise continue
164
******************
I]
165
1.
Use of Memory.
4. General.
-Make your subroutines simple, with clearly visible entry
and return points. One of the stickiest problems to find
is a subroutine that doesn't return via a RTS command,
but instead jumps straight back to your main coding ...
or a subroutine that you somehow get into without giving
the vital JSR command.
Avoid super clever programming, such as having the program
change itself. (It can work . .. but if it misbehaves, you
can have a bad time).
Jim Butterfield
A. SIX-DIGIT HEXADECIMAL.
while the last two digits of the display show the contents
of that address.
If you look at the first three lines of subroutine SCAND
(lines 1057 to 1059 on page 25 of the listing), you'll
see how the program 'digs out' the contents of the
address given by POINTL/PQINTH and stores it in location
INH (OOF9). It's neat programming, and worth studying
if you're not completely familiar with the 6502's indirect
addressing operation.
Thus, if you skip these three lines, and call JSR SCANDS
(20 IF IF) you will be displaying , in hexidecimal, the
contents of three locations: POINTH, POINTL , and INH
This, of course, takes six digits.
To recap: SCAND will display four digits of address and
two digits 3& contents. SCANDS will display six digits
of data.
Important: in both cases, the display will be illuminated
for only a few milliseconds. You must call the subroutine
repeatedly in order to obtain a steady display.
B. DRIVING THE BITS OF THE DISPLAY DIRECTLY.
1. Store the value $7F into PADD (1741). This sets the
directional registers .
2. To select each digit of the display, you will want to
store the following values in location SBD (1742):
,
_
_\
Digit
Digit
Digit
Digit
Digit
Digit
1:
2:
3:
4:
5:
6:
$09
$OB
$OD
$OF
$11
$13
<
i
0
a V
, t> ^
'
* ux
l
' 10 M 1
o |> o \
168
Pit:
6
center
upper
left
"g"
f
4
lower
left
il
2
3
bottom lower
right
"e"
"f
1
upper
right
"c"
0
top
"a"
6 f
\ 0 l l ) | 00f
tQ
4. Now that you have picked a digit and lit the appropriate
segments, wait a while. Sit in a delay loop for
about 1/2 millisecond before moving on to the next digit.
THE KIM-1 ALPHABET.
$F7
$FF
$B9
$BF
$F9
$F1
$BD
$F6
$86
$9E
$B8
0 - $BF
P - $F3
b - $FC
c - $D8
d - $DE
f - $F1
0 p r -
h
i
J
1
n
$EF
$F4
$84
$9E
$86
$D4
$DC
$F3
$DO
2
3
4
5
6
7
8
9
0
^S - $ED
U - $BE
Y - $EE
t - $F8
u - $9C
y - $EE
minus
169
$86
$DB
$CF
$E6
$ED
$FD
$87
$FF
$EF
$BF
$CO
\'
4|
?>
W:
O OO
The following is reprinted from the KIM-1 User Manual with permission
from MOS Technology.
Interval Timer
1. Capabilities
The KIM-1 Interval Timer allows the user to specify a preset
count of up to 25610 an<^ 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.
Operation
yif 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.
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 *f) or NMI (Expansion Connector,
pin 6) pin depending on the desired interrupt function. PB7
should be programmed as in input line (its 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. IK 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.)
IMPORTANT ! !
171
V
;
Jim Butterfield
You often don't want a random number that goes all the way
up to 255 (Hexadecimal FF). There are two ways of reducing
this range. You can AND out the bits you don't want;
for example, AND #$7 reduces the range to 0-7 only.
Alternatively, you can write a small divide routine, and
the remainder becomes your random number; examples of this
can be seen in programs such as BAGELS.
172
,.;*
If
The one publication that devotes all of its space to the KIM-1/6502
hines is:
KIM-1/6502 USER NOTES
173
174
73 MAGAZINE
The Computerist
P.O. Box 3
S. Chelmsford MA
01824
Tom Pittman's
Tiny Basic
(send S.A.S.E. for info)
MICROWARE
27 Firstbrooke Rd.
Toronto, Ontario
CANADA
M4E 2L2
MICROCHESS, (Chess in
Ik), assembler
(s end S.A.S.E. for info)
2K assembler /editor
(send S.A.S.E. for info)
75428
IK monitor system,
(send S.A.S.E. for info)
Julien Dub6
3174 Rue Douai
Ste-Foy, Quebec G1W 2X2
Canada
Baudot Monitor
(send S.A.S.E.)
175
Jim Butterfield
14 Brooklyn Avenue
Toronto, Ontario, Canada
M4M 2X5
Charles Eaton
19606 Gary Avenue
Sunnyvale, California
94086
Lew Edwards
1451 Hamilton Ave.
Trenton 9, N.J. 08629
Peter Jennings
27 Firstbrooke Rd.
Toronto, Ontario Canada
M4E 2L2
Ron Kushnier
3108 Addison Ct.
Cornwells Hts., Penna.
19020
Cass Lewart or
Dan Lewart
12 Georjean Drive
Holmdel, N.J. 07733
Stan Ockers
R.R.#4, Box 209
Lockport, 111.
60441
Charles Parsons
80 Longview Rd.
Monroe, Conn.
06468
Jim Pollock
6 Terrace Ave.
New Egypt, New Jersey
08533
Eric Rehnke
109 Centre Ave.
W. Norriton PA
19401
Joel Swank
#186
4655 S.W. 142nd
****************************************************
176
5119-0
$8.95
Here is a step-by-step guide that will take you through the fundamentals of
writing KIM programs. This beginner's guide includes dozens of examples
of programs that are run on a basic KIM-1 system. These programs include
games and puzzles such as Blackjack, Chess Clock, Horserace, Lunar
Lander, Music Box, and Ping Pong, which are fully described so that you
can learn from the programming techniques illustrated as well as have fun
playing the games.
The authors go into detail on how you can expand your KIM from the
bas>c small-but-powerful KIM-1 system to a huge-and-super-powerful machir-e. They include diagnostic and utility programs to help you build extra
devices onto your KIM system, such as teletype, display, or more memory.
The book also covers the jargon of KIM programming and what's available
in both hardware and software i'->r the KIM microprocessor.
ar.d
ADVANCED BASIC: Applications and Problems
BOTH by JAMLS S. COAN
The complete picture of the BASIC language. One introduces the Isnguage
through an integration of programming and the teaching of mathematics.
The otr';r offers advanced techniques find applications. Both begin with
short, complete programs ,and progress to more sophisticated problems.
Basic BASIC, 5106-8, paper, #5107-7, cloth; Advanced BASIC, #5855-1,
paper, #5856-)', cloth.
X
HAYDEN ROOK COMPANY, INC,
Rochelle Park, New Jersey
ioSN 0-8104-5113-0