A boxed VIM-1 acquired in August 2026. More SYM-1 photos here.





About small SBC systems
A boxed VIM-1 acquired in August 2026. More SYM-1 photos here.





In August 2026 I acquired an boxed engineering SYM-2 prototype. It comes with two large circuit diagrams illustrating the design.
Next photos by Paul Schroeter.
With thanks to Jonathan Chapman of Glitchworks who found a Jolt system, here images of a Jolt with 4K memory, an experimenters board and the power supply.
With thanks to Jonathan Chapman of Glitchworks who found a Jolt system, here images of a Jolt with 4K memory, an experimenters board and the power supply.






With a scan of manuals by Gerben Voort, and a third photo of a cassette with KB-9, time to refresh the KB-9 pages. Thanks Gerben Voort
Despite all the versions you see on the download page, there is only one official and original binary known of the MOS TECH BASIC for the 6502 KIM and that is my V1.1 (ID 01) loaded from my original tape. There is another tape known recently, owned by my friend Gerben Voort, and we hope to be able to read that tape.
Every other version is a derivate, in the 80ties or in the past years.
There are also sources of Microsoft Basic for the 6502. The official source, in PDP-11 MACRO source format has been declared open not so long ago.
The title is ‘M6502 8K VER 1.1 BY MICRO-SOFT’. Yes the name of the company was originally MICRO-SOFT!
Many years before the official source, Michael Steyl of pagetable.com reconstructed the source, based upon my binary dump. A perfect start to create derivate versions!
Versions known in the 80ties

My MSBasic for the KIM-1 cassette

Another MOS TECH BASIC for KIM-1, lower serial number

Thanks Gerben Voort
In the previous section the pagetable article was shown, with resources to recreate from source many 6502 Basic’s, like KB-9.
Here an example how I, quick and dirty, used this to create a KB-9 named V1.2 which is smaller and faster than the original.
This is how to prepare for it (Windows, can be done also on Linux)
Do the adaptations as described below or your own:
ca65 -D kb9 msbasic.s -o tmp/kb9v2.o -l tmp/kb9v2.lst ld65 -C kb9.cfg tmp/kb9v2.o -o tmp/kb9v2.bin -Ln tmp/kb9v2.lbl
These are the adaptations done in V1.2 use the ROR instruction and suppress nulls sent to the terminal and Clear decimal and fix GET
I changed this:
;CONFIG_NULL := 1 ;CONFIG_ROR_WORKAROUND := 1 ; patch HO 2021
COLD_START:
.ifdef SYM1
jsr ACCESS
.endif
.ifdef KBD
.
.
.
.else
.ifndef CBM2
cld ; patch for KIM-1 HO 2021
ldx #$FF
stx CURLIN+1
Change line 493 init.s
.ifdef KIM
.byte "MOS TECH 6502 BASIC V1.2"
Assemble and link with the batch file makekb9v2.bat, this will deliver in the folder tmp
– kb9v2.bin file : load as usual at $20001
– kb9v12.lbl text file
– kb9v12lst textfile
Start KB9 V2 now at location $3FB1, label COLD_START (used to be $4065, so we gained some RAM), see the lbl file for other addresses.
I know KB-6 existed. The ‘6’ stands for the precision in digits of the floating point number. In the documentation KB-6 is described.
Never seen a version in the wild. So the reconstruction here is not checked with the original, addresses in the reconstruction from the linker differ from the documentation.
Perhaps the ROR workaround or the insertion of CLD in the init.s caused this.
KB-6 can be ‘reconstructed’ since other versions of 6 digit Microsoft Basic are in the ‘pagetable sources’.
It takes one define added in define_kim.s, changes on the original file are now:
; CONFIG_NULL := 1 ; patch HO 2021 ;CONFIG_ROR_WORKAROUND := 1 ; patch HO 2021 CONFIG_SMALL := 1 ; patch H0 2021
Assemble and link as above, replace kb9v12 with kb6v12 in the batch file. See the archive for a working batch file.
COLD_START moves to $3D50, size shrinks to 8K.
As you can see in the following screenshots it works! Note the number of digits is less, as expected. It should be faster also.

Microsoft Basic for the KIM-1 KB-9

Microsoft Basic for the KIM-1 KB-6, less precision, smaller program size
The bug was described and fixed first by an article in the KIM User notes 17
From the pagetable sources:
BUG: The beq/bne L2AF8 below is supposed to be always taken. For this to happen, the last load must be a 0 for beq and != 0 for bne.
The original Microsoft code had ldx/ldy/bne here, which was only correct for a non-ZP INPUTBUFFER. Commodore fixed it in CBMBASIC V1 by swapping the ldx and the ldy. It was broken on KIM, but okay on APPLE and CBM2, because these used a non-ZP INPUTBUFFER. Microsoft fixed this somewhere after KIM and before MICROTAN, by using beq instead of bne in the ZP case.
.ifdef CBM1
ldy >(INPUTBUFFER-1)
ldx <(INPUTBUFFER-1)
.else
ldx >(INPUTBUFFER-1)
ldy <(INPUTBUFFER-1)
..
beq 08
You can easily fix this in KB9 by changing the branch in $2AEE from $D0 (bne) to $F0 (beq).
I have fixed this in the source of KB9V2 (KB6 does not have the GET statement) .
Correcting typing errors can be done with the _ key ($5F). On a video terminal, like we use nowadays it can be done with backspace.
The way characters are handled by the input routine do not allow to just replace the compare with _ (C9 5F) with 08 for backspace.
A trick by Jim W4JBM can be used to reuse the BELL handling (07) to a backspace.
Replace in inline.s
INLINAIM:
.endif
.ifndef CONFIG_NO_LINE_EDITING
cmp #$07
beq L2443
with
INLINAIM:
.ifndef CONFIG_NO_LINE_EDITING
cmp #$08
beq L2420
In the original KB9.BIN you can do that with
poke 9260,8
poke 9262,241

V2 adaptations to V1.2 by Eduardo Casino
(after applying all above)
The start address is moved to $2000 by changing this in header.s
.segment "HEADER"
.ifdef KBD
jmp LE68C
.byte $00,$13,$56
.endif
.ifdef KIM
jmp COLD_START
.endif
.ifdef AIM65
jmp COLD_START
jmp RESTART
.word AYINT,GIVAYF
.endif
.ifdef SYM1
jmp PR_WRITTEN_BY
.endif
Change line 493 init.s
.ifdef KIM
.byte "MOS TECH 6502 BASIC V2.0"
Assemble and link with
ca65 -D kb9 msbasic.s -o tmp/kb9v2.o -l tmp/kb9v2.lst ld65 -C kb9.cfg tmp/kb9v2.o -o tmp/kb9v2.bin -Ln tmp/kb9v2.lbl
KB6 V2
Change this in defines_kim.s (after applying all above)
CONFIG_SMALL := 1
Assemble and link with
ca65 -D kb9 msbasic.s -o tmp/kb6v2.o -l tmp/kb6v2.lst ld65 -C kb9.cfg tmp/kb6v2.o -o tmp/kb6v2.bin -Ln tmp/kb6v2.lbl
See the downloads for the binary files.

Another MOS TECH BASIC for KIM-1, lower serial number

Thanks Gerben Voort
During the hot summer days, locked up in house because of the heat, I made a deep dive into the KIM-1 and the TIM/Jolt software and hardware.
50 years of working with a KIM-1:
The KIM-1 Explained
The Jolt, one of the first 6502 SBC’s, so nicely reproduced now:
The TIM/Jolt explained.
|
Jolt Replica User manual |
|
Jolt User Newsletter |
![]() |
DEMON software manual (this manual has an alternative listing of the TIM 6530-004 monitor) |
Sample session
* 7052 B0 00 FF 00 FF .M 0200 00 00 00 00 00 00 00 00 .: 0200 33 44 55 .M 0200 33 44 55 00 00 00 00 00 .R 7052 B0 00 FF 00 FF .: 3455 55 55 55 55 55 .R 3455 55 55 55 55 55 .M 00F6 55 34 55 55 55 55 55 02 .M 7000 85 F9 A9 23 D0 55 A9 16 .: 7000 77? .? .
The ‘:’ command reacts different upon previous actions:
Note the current address and the Program Counter are not the same. The GO command requires the Program Counter to be set to the desired address.
0282 70E0 ; 0283 70E0 ; READ AND STORE BYTE. NO STORE IF SPACE OR RCNT=0. 0284 70E0 ; 0285 70E0 20 B3 73 BYTE JSR RDOB ; CHAR IN A, CY=0 IF SP 0286 70E3 90 10 BCC BY3 ; SPACE 0287 70E5 ; 0288 70E5 A2 00 LDX #0 ; STORE BYTE 0289 70E7 81 EE STA (TMP0,X) 0290 70E9 ; 0291 70E9 C1 EE CMP (TMP0,X) ; TEST FOR VALID WRITE (RAM) 0292 70EB F0 05 BEQ BY2 0293 70ED 68 PLA ; ERR, CLEAR JSR ADR IN STACK 0294 70EE 68 PLA 0295 70EF 4C BA 70 JMP ERROPR 0296 70F2 ; 0297 70F2 20 7C 72 BY2 JSR CADD ; INCR CKSUM 0298 70F5 20 97 73 BY3 JSR INCTMP ; GO INCR TMPO ADR 0299 70F8 C6 FE DEC RCNT 0300 70FA 60 RTS
BYTE
What is happening here?
0272 70D0 A5 EE PUTP LDA TMP0 ; MOVE TMP0 TO PCH,PCL 0273 70D2 85 F6 STA PCL 0274 70D4 A5 EF LDA TMP0+1 0275 70D6 85 F7 STA PCH 0276 70D8 60 RTS 0302 70FB A9 F8 SETR LDA #FLGS ; SET TO ACCESS REGS 0303 70FD 85 EE STA TMP0 0304 70FF A9 00 LDA #0 0305 7101 85 EF STA TMP0+1 0306 7103 A9 05 LDA #5 0307 7105 60 RTS
PUTP
Move current address in TMP0 to Program Counter PCL
SETR
0349 713A ; ALTER LAST DISPLAYED ITEM (ADR IN TMPC) 0350 713A ; 0351 713A C6 E9 ALTER DEC PREVC ; R INDEX = 1 0352 713C D0 0D BNE A3 0353 713E ; 0354 713E 20 A4 73 JSR RDOA ; CY=0 IF SP 0355 7141 90 03 BCC A2 ; SPACE 0356 7143 20 D0 70 JSR PUTP ; ALTER PC 0357 7146 20 FB 70 A2 JSR SETR ; ALTER R*S 0358 7149 D0 05 BNE A4 ; JMP A4 (SETR RETURNS ACC = 5) 0359 714B 20 9A 72 A3 JSR WROA ; ALTER M, TYPE ADR 0360 714E A9 08 LDA #8 ; SET CNT=8 0361 7150 ; 0362 7150 85 FE A4 STA RCNT 0363 7152 20 77 73 A5 JSR SPACE ; PRESERVES Y 0364 7155 20 E0 70 JSR BYTE 0365 7158 D0 F8 BNE A5 0366 715A F0 D8 A9 BEQ BEQS1 0345 7134 4C 86 70 BEQS1 JMP START
What is happening here?