Junior display overlay and PSU PCB scans

The Junior Display print came with a transparant overlay.

Also PSU scans by Dick Blok.

post

Unilab Three Chips clone

Stephen Crozier made a clone of the Unilab Three Chips main board.

post

Das EMUF Sonderheft 2

Thanks to Mathias Ohlerich for the scan of the Sonderheft 2

post

Decapped 6530-004 TIM photo’s by Frank Wolf

post

Replacement of some old prom by a GAL, Application to a Thaler MPS-65 board

Didier form aida.org was approached by his friend Erik about a malfunctioning MPS-65.

By studying the material on this page and doing measurements on the board it was decided the PROM on the board was malfunctioning.

So Didier designed a GAL replacement for the PROM and the board came back to life!

Here the story how the design looks like.

Suppress the KIM-1 echo

A page on suppressing the KIM-1 echo of TTY input, read non-blocking and make the TTY input deaf.

Problems with the KIM-1 TTY character input

  1. The KIM-1 hardware is hardware echoing incoming serial characters to the output, no echo in software involved, so you cannot influence what appears on screen. Very annoying!
  2. The KIM-1 GETCH routine is blocking, no way to check for a character coming in, like a Break. waiting.
    Also quite annoying if porting other software to the KIM-1 or you want the program interruptable.
  3. While a program is running something CPU intensive and you type something the program is not really waiting for, the characters appear on screen. Because the KIM-1 does hardware echoing of TTY input, this is unavoidable it seems

Here I present solutions for these problems in software, made possible by the genius hardware design of the KIM-1 TTY I/O.
Are they perfect? Maybe not, it is still bitbanging the incoming serial signal. It can miss the correct starting point for the incoming character bit stream.
If you want a perfect solution, you will need interrupt driven ringbuffered serial I/O with a dedicated IC like the 6850, 6551 etc.
Without this extra hardware you can achieve acceptable results with these routines.

Background in (updated) original article KIM Kenner 17 page 14, Dutch, Hans Otten, 1980

In the KIM Kenner 1 Siep de Vries, founder of the Dutch KIM Club mentioned how in Focal-65 for the 6502 a trick was built in to suppress the hardware echo by manipulating the TTY out bit PB0. I took the idea and implemented it on my KIM-1 in 1980 without seeing the Focal code, as I did not have a Focal binary yet then!

I examined in 2003 how it was done, from the Focal disassembly I made then:

34AF  E6 76       L34AF INC $76         ; random number?
34B1  2C 40 17          BIT H1740       ; check if character is incoming
34B4  30 F9             BMI H34AF       ;=> wait until startbit
34B6  AD 42 17          LDA H1742
34B9  29 FE             AND #$FE        ; clear PA7
34BB  8D 42 17          STA H1742
34BE  20 5A 1E          JSR H1E5A       ; KIM-1 input
34C1  48                PHA
34C2  AD 42 17          LDA H1742
34C5  29 FE             AND #$FE        ; isolate PA7
34C7  09 01             ORA #$01        ; set PA7 to 1
34C9  8D 42 17          STA H1742
34CC  68                PLA
34CD  18                CLC
34CE  60                RTS

How to suppress the hardware echo to TTY out or making the TTY input deaf

The hardware echo of incoming serial signal to outgoing TTY output is shown in the next figures (from the KIM user manual and the KIM Circuit poster).
The TTY KEYBD signal goes via a transistor and NAND gate U15 to PA7 port of the 6532. That signal also goes to pin 10 input  of NAND gate U26  which is the TTY out line. This is the hardware echo. When the KIM-1 sends out a character it comes from PB0 to pin 9 of of NAND gate U26 and so comes out to the TTY Out line.
PB5 (audio TTY control) is connected via an inverter to NAND gate U15. The other input is TTY IN. Making PB5 high will make the TTY input PA7 deaf for incoming signals.


The genius designers of the KIM-1 used NAND gates in the TTY I/O!

Non-blocking input

The KIM-1 GETCH routine detects an incoming character by looking in a loop for the start bit to appear. It then reads the character.
By first doing that loop of looking for the start bit and returning if not yet, then we have the check for a key pressed and a character coming in.
If a character is incoming we have to call as fast as possible the GETCH routine.

;
; KEYPRESS
;   check character coming on character non-blocking 
;   - carry set if char coming in
;   - follow up with GETCH or EGETCH as fast as possible if you want echo or no echo 
;
KEYPRS  LDA  SAD
        BMI  NOKEY      ; If bit 7 is set, the line is idle, no char
        SEC
        RTS             ; Carry set if key pressed, A is key
NOKEY   CLC
        RTS             ; carry clear, no key

As argued above, this is not foolproof. It is easy to miss an incoming character, as there is no buffering of the input.

Echo suppress

The solution to suppress the echo is making output PB0 low. The NAND gate out will now stay high, ignoring any changes on the other input, the incoming serial character. So nothing is echoed.

In this routine the standard KIM-1 GETCH routine at $1E5A is encapsulated in a subroutine that prevents the echo by setting PB0. Note that this is not a complete block of the echo, it is only active when the program calls the blocking EGETCHAR. The calling program is now responsible for the echoing or otherwise.

;
; EGETCH from TTY without echo (Y returned FF due to GETCH)
;
EGETCH  LDA  SBD
        AND  #$FE       ; Set PB0 to U26 low to suppress the echo
        STA  SBD
        JSR  GETCH
        PHA
        LDA  SBD
        ORA  #$01       ; Set PB0 to U26 high to enable the echo
        STA  SBD
        PLA
        RTS

To make the TTY input really deaf you can use PB5. Calling the deaf routine hardware blocks any incoming TTY signal.

; 
; TTYDEAF
;   call this to block any incoming character
;
TTYDEAF LDA  SBD
        ORA  #$20       ; Set PB5 to U26 high to block input
        STA  SBD
        RTS
; 
; TTYHEAR
;   call this to restore incoming character via GETCH or EGETCH
;
TTYHEAR LDA  SBD
        AND  #$DF       ; Set PB5 to U26 low to allow input
        STA  SBD
        RTS

Using TTYdeaf/hear in combination with KEYPRS and EGETCH works quite well to prevent most unwanted screen display of characters.

Example program of suppressing echo and non-blocking

I wrote a litle program demonstarting the non-blocking and no echo facilities presented here.
Download sources, binary, papertape here.
This is the console output of the program:

KIM
0000 0200
0200 A2 G

Demo of echo suppress and non-blocking input Hans Otten, 2026

Normal get character, until ESCAPE
 1 31 2 32 3 33 4 34 5 35 6 36  03 1B
NOECHO get character, until ESCAPE
  31  32  33  34  35  36  03  1B

If run on KIM-1 Simulator: set in  Settings Non-blocking or Focal-V3D

Non-blocking no echo until ESCAPE
31
key pressed
32
key pressed
33
key pressed
03
key pressed

Demo of echo suppress and non-blocking input Hans Otten, 2026

KIM
0200 A2 _

If you have a KIM-1, PAL-1, PAL-2 or Micro-KIM, these routines may help you.
The Corsham KIM Clone does not support PB5, and no deaf input on that one. Echo suppress works!

These routines also run on the KIM-1 Simulator. The non-blocking routine requires a Setting in the Simulator.
In versions before 2.3.1 check Focal-V3D, the later versions check Allow non-blocking.
The TTYdeaf routine does not work yet on the Simulator, PB5 is ignored.

Settings in 2.3.0

Settings 2.3.1












post

Convert to Papertape V2.2

On the Utilities page I have two programs to convert to MOS Technology papertape format: KIMpaper, a command line utility, and ConvertHexFormat, a GUI app.

All in Freepascal/Lazarus source format, and tested on Linux (Raspberry PI OS) and Windows 10 64 bit. So the programs will run everywhere Lazarus is available (MS DOS, WIndows, Linux Mac OS).

KIMPAPER  is written at the time the Micro-KIM appeared. CLI utility.  Supports Binary to/from Papertape.  Still runs fine on all platforms supported by Freepascal (Windows, MS DOS, Linux etc) after a recompilation, source available.

ConvertHexFormat is a more recent GUI utilitilty with many more 8 bit hex formats as input and output.

There were some bugs of course in older versions. V2 added the ability for multipart hex formats, records having a non-consecutive load address. That seems to wok fine since V2.1
In 2.2 a bug in MOS Papertape format for bigger files is fixed, the end-of-file record (record type 00, total line count) had a bug in the checksum calculation. KIMPAPER is and was correct in the calculation.
But in ConvertHexFormat it was wrong (as it still  is in the well known srec utility in the Unix world!).

post

PC utilities updated

The PC utilities page has seen an update of th4 Conversion hex formats utility.

Programs to manipulate the binary and hex formatted files of interest for SBC owners. Intel hex, MOS papertape, Motorola S-record, binary, hex conversion fort eh 8 bit world.
Runs on Windows, Linux, Mac due to Lazarus and Freepascal. Source included.

post

Load papertape format

The KIM-1 has two methods of loading programs:
– from audio files on the audio interface
– from papertape from a papertape reader connected to the teletype terminal

Loading from papertape is something that comes for the old Teletype with papertape reader and punch.
It is therefore accessible with the ‘L’ command in the TTY CLI.
The routine will not work in LED display/hex keyboard mode, as GETCH does not work there.

0868   1DF7 C9 4C               CMP   #'L'       ; LOAD TAPE
0869   1DF9 F0 09               BEQ   LOADV

0874   1E04 4C E7 1C    LOADV   JMP   LOAD

0722   1CE7             ;
0723   1CE7             ;          LOAD PAPER TAPE FROM TTY   
0724   1CE7             ;
0725   1CE7 20 5A 1E    LOAD    JSR   GETCH      ; LOOK FOR FIRST CHAR 
0726   1CEA C9 3B               CMP   #$3B       ; SMICOLON
0727   1CEC D0 F9               BNE   LOAD
0728   1CEE A9 00               LDA   #$00
0729   1CF0 85 F7               STA   CHKSUM
0730   1CF2 85 F6               STA   CHKHI
0731   1CF4             ;             
0732   1CF4 20 9D 1F            JSR   GETBYT     ; GET BYTE COUNT
0733   1CF7 AA                  TAX              ; SAVE IN X INDEX
0734   1CF8 20 91 1F            JSR   CHK        ; COMPUTE CHECKSUM
0735   1CFB             ;             
0736   1CFB 20 9D 1F            JSR   GETBYT     ; GET ADDRESS HI
0737   1CFE 85 FB               STA   POINTH
0738   1D00 20 91 1F            JSR   CHK
0739   1D03 20 9D 1F            JSR   GETBYT     ; GET ADDRESS LO
0740   1D06 85 FA               STA   POINTL
0741   1D08 20 91 1F            JSR   CHK
0742   1D0B             ; 
0743   1D0B 8A                  TXA              ; IF CNT=0 DONT
0744   1D0C F0 0F               BEQ   LOAD3      ; GET ANY DATA
0745   1D0E             ;
0746   1D0E 20 9D 1F    LOAD2   JSR   GETBYT     ; GET DATA
0747   1D11 91 FA               STA   (POINTL),Y ; STORE DATA
0748   1D13 20 91 1F            JSR   CHK
0749   1D16 20 63 1F            JSR   INCPT      ; NEXT ADDRESS
0750   1D19 CA                  DEX   
0751   1D1A D0 F2               BNE   LOAD2
0752   1D1C E8                  INX              ; X=1 DATA RECORD 
0753   1D1D             		         ; X=0 LAST RECORD
0754   1D1D 20 9D 1F    LOAD3   JSR   GETBYT     ; COMPARE CHKSUM
0755   1D20 C5 F6               CMP   CHKHI
0756   1D22 D0 17               BNE   LOADE1
0757   1D24 20 9D 1F            JSR   GETBYT
0758   1D27 C5 F7               CMP   CHKSUM
0759   1D29 D0 13               BNE   LOADER
0760   1D2B             ;
0761   1D2B 8A                  TXA              ; X=0  LAST RECORD
0762   1D2C D0 B9               BNE   LOAD
0763   1D2E             ;
0764   1D2E A2 0C               LDX   #$0C       ; X-OFF KIM
0765   1D30 A9 27       LOAD8   LDA   #$27
0766   1D32 8D 42 17            STA   SBD        ; DISABLE DATA IN
0767   1D35 20 31 1E            JSR   PRTST
0768   1D38 4C 4F 1C            JMP   START
0769   1D3B             ;             
0770   1D3B 20 9D 1F    LOADE1  JSR   GETBYT     ; DUMMY
0771   1D3E A2 11       LOADER  LDX   #$11       ; X-OFF ERR KIM
0772   1D40 D0 EE               BNE   LOAD8

1141   1F91 18          CHK     CLC
1142   1F92 65 F7               ADC   CHKSUM
1143   1F94 85 F7               STA   CHKSUM
1144   1F96 A5 F6               LDA   CHKHI
1145   1F98 69 00               ADC   #$00
1146   1F9A 85 F6               STA   CHKHI
1147   1F9C 60                  RTS
1148   1F9D             ;		
1149   1F9D             ;       GET 2 HEX CHAR'S AND PACK 
1150   1F9D             ;       INTO INL AND INH
1151   1F9D                     X PRESERVED Y RETURNED = 0
1152   1F9D             ;       NON-HEX WILL BE LOADED AS NEAREST HEX EQU
1153   1F9D             ;
1154   1F9D 20 5A 1E    GETBYT  JSR   GETCH
1155   1FA0 20 AC 1F            JSR   PACK
1156   1FA3 20 5A 1E            JSR   GETCH
1157   1FA6 20 AC 1F            JSR   PACK
1158   1FA9 A5 F8               LDA   INL
1159   1FAB 60                  RTS
1160   1FAC             ;		
1161   1FAC             ;       SHIFT CHAR IN A INTO
1162   1FAC             ;       INL AND INH 
1163   1FAC             ;
1164   1FAC C9 30       PACK    CMP   #$30       ; CHECK FOR HEX 
1165   1FAE 30 1B               BMI   UPDAT2
1166   1FB0 C9 47               CMP   #$47       ; NOT HEX EXIT
1167   1FB2 10 17               BPL   UPDAT2
1168   1FB4 C9 40               CMP   #$40       ; CONVERT TO HEX
1169   1FB6 30 03               BMI   UPDATE
1170   1FB8 18                  CLC   
1171   1FB9 69 09               ADC   #$09
1172   1FBB 2A          UPDATE  ROL   A
1173   1FBC 2A                  ROL   A
1174   1FBD 2A                  ROL   A
1175   1FBE 2A                  ROL   A
1176   1FBF A0 04               LDY   #$04       ; SHIFT INTO I/O BUFFER
1177   1FC1 2A          UPDAT1  ROL   A
1178   1FC2 26 F8               ROL   INL
1179   1FC4 26 F9               ROL   INH
1180   1FC6 88                  DEY   
1181   1FC7 D0 F8               BNE   UPDAT1
1182   1FC9 A9 00               LDA   #$00       ; A=0 IF HEX NUM
1183   1FCB 60          UPDAT2  RTS

(Photos by Dave Wiliams with the MOS KIM-1 Reproduction connected to a Teletype)

Now papertape format is a special MOS Technology format, already used in the TIM-1. See the KIM-1 user manual for a technical description.
This is for example the papertape output captured with the KIM-1 S command for the memory test program in the Fist Book of KIM

;1800000000A900A885FA8570A2028672A50085FBA601A57049FF850B27
;1800187191FAC8D0FBE6FBE4FBB0F5A672A50085FBA570CA1004A20FF6
;1800300291FAC8D0F6E6FBA501C5FBB0ECA50085FBA672A571CA100F73
;18004804A202A570D1FAD015C8D0F0E6FBA501C5FBB0E8C67210AD0F29
;0B0060A57049FF30A184FA4C4F1C05CE
;0000050005

Load address, data and checksums are in the records.
A record is made up of:

‘;’ XX YYYY D..D CCCC

where
XX is number of databytes
YYYY is load address
D..D are XX databytes
CCCC is checksum, sum of XX YYYY and D.D)

What is happening in the code?

– a papertape record starts with a ‘;’, so line 725-727 look for that incoming to find start of a record, skipping any Null character if present
– the checksum is calculated per record, so cleared in 728 -730
– first two characters in record have byte count in record ($18 in examples above), 732-733 saved in X and added to checksum
– next the address to load the data in is read in and added to checksum (736-741)
– if count = 0 we are at the end of the papertape
– get the databytes in the record in a loop, add to checksum and store at load address (746-751)
– load checksum, compare to calculated checksum and report fatal error if not equal (754-759)
– continue loading records until last record (count 0 in X) (761-762)
– make input deaf via PB5 ($27 to SBD and print string KIM (0C)KIM and return (764-768)

error handling
– if low checksum wrong, read high checksum byte (770
– print string ERR KIM (771 -772) and return

CHK
– addition to 16 bit checksum, overflow ignored (1141-1147)

GETBYT
– read a character
– pack into byte
– read second character
– pack shift also into byte INL

PACK
– if char < '0' exit (1164) - if char > ‘F’ exit (1166)
– if char <'A' add $09 - convert to binary (1172-1175) - shift into INL (1176-1181) - hex convert success with A = 0 (1182), not used here The convert to binary works as follows: '0' = $30 .. '9' = $39 'A' = $40 + $09 = $4A .. 'F' = $46 + $09 = $4F So the shift of four leaves 0 .. F Note that any non-hex character will load to checksum errors and are detected that way

Note also the null characters (value 00) inserted at the beginning of a papertape are discarded by the search for the ‘;’ starting character.

Multipart papertape format
The papertape format has in every record the address where to load the databytes. So you can have non-contiguous parts of memory loaded with one papertape file.
The Convert to hex 8 bit utility supports mulipart papertapes.
These can be loaded by the KIM-1 loader with no problems, since every record load address is read and used.
The KIM-1 Save to papertape can not produce multipart papertape files.

post

Kowalski assembler and simulator

A 6502, 65C02, 65816 assembler and simulator. Original (with Polish help) by Michal Kowalski, 65816 extensions with English help by Daryl Rictor.

A nice tool to develop and test 65XX software.

Read here to get it, install and some startup help.