After RESET the baudrate is determined by measuring the length of the start bit of an incoming serial character. This means any character is usable where the first data bit is the opposite of the start bit. The KIM-1 User manual suggest RUBOUT ($7F 1111111) but ENTER ($0D 0000 1101) also works fine. SPACE ($20 0010 0000) for example does not work, any character with an odd value is OK.
0612 1C2A A9 FF LDA #$FF ; COUNT START BIT 0613 1C2C 8D F3 17 STA CNTH30 ; ZERO CNTH30 0614 1C2F A9 01 LDA #$01 ; MASK HI ORDER BITS 0615 1C31 2C 40 17 DET1 BIT SAD ; TEST 0616 1C34 D0 19 BNE START ; KEYBD SSW TEST 0617 1C36 30 F9 BMI DET1 ; START BIT TEST 0618 1C38 A9 FC LDA #$FC 0619 1C3A 18 DET3 CLC ; THIS LOOP COUNTS 0620 1C3B 69 01 ADC #$01 ; THE START BIT TIME 0621 1C3D 90 03 BCC DET2 0622 1C3F EE F3 17 INC CNTH30 0623 1C42 AC 40 17 DET2 LDY SAD ; CHECK FOR END OF START BIT 0624 1C45 10 F3 BPL DET3 0625 1C47 8D F2 17 STA CNTL30 0626 1C4A A2 08 LDX #$08 0627 1C4C 20 6A 1E JSR GET5 ; GET REST OF THE CHAR, 0628 1C4F ; TEST CHAR HERE
What happens here:
– bit 7 (PB7) is tested until it becomes 0 (BIT SAD and BMI DET1 loop)
– the time is counted and kept in CNTH30 and CNTL30
– bit 7 is tested for becoming 1 (LDY SAD and BPL DET3)
– the rest of the character is read in by jumping into GETCH , the actual character received is not tested.
1006 1ED4 ; 1007 1ED4 ; DELAY 1 BIT TIME 1008 1ED4 ; AS DETERMINED BY DETCPS 1009 1ED4 ; 1010 1ED4 AD F3 17 DELAY LDA CNTH30 ; THIS LOOP SIMULATES 1011 1ED7 8D F4 17 STA TIMH ; DETCPS SECTIONS AND WILL DELAY 1012 1EDA AD F2 17 LDA CNTL30 ; 1 BIT TIME 1013 1EDD 38 DE2 SEC 1014 1EDE E9 01 DE4 SBC #$01 1015 1EE0 B0 03 BCS DE3 1016 1EE2 CE F4 17 DEC TIMH 1017 1EE5 AC F4 17 DE3 LDY TIMH 1018 1EE8 10 F3 BPL DE2 1019 1EEA 60 RTS 1020 1EEB ; 1021 1EEB ; DELAY 1/2 BIT TIME 1022 1EEB AD F3 17 DEHALF LDA CNTH30 ; DOUBLE RIGHT SHIFT OF DELAY 1023 1EEE 8D F4 17 STA TIMH ; CONSTANT FOR A DIVE 2 1024 1EF1 AD F2 17 LDA CNTL30 1025 1EF4 4A LSR A 1026 1EF5 4E F4 17 LSR TIMH 1027 1EF8 90 E3 BCC DE2 1028 1EFA 09 80 ORA #$80 1029 1EFC B0 E0 BCS DE4
The actual delay routines use the same logic as DETCPS. IN DEHALF the delay time is divided by 2 and jumped into DELAY.
SPEED CONTROL OF KIM-1 TTY PORT
KIM User notes Vol 06
If you are having problems trying to use a high speed terminal with the KIM YTY port the following information might be useful. To start with, the Reset/ Rubout sequence activates a subroutine called DETCPS (1C2AH to IC4EH)
which determines two constants CNTL30 (17F2N1 and CNTH30 (12F3H). These are used to time the serial TTY port via subroutines DELAY (1E4DH to IEEAH) and DEHALF (1EEBH to 1EFDH). DELAY and DEHALF are called by GETCH (
1E5AH to 1E87H) which inputs one character, and OUTCH (1EA0H to 1ED3H1) which outputs one character.
CNTL30 and CNTH30 are the whole key to trimming up the TTY port speed. You can change the baudrate without going through the Reset/Rubout sequence simply by changing one or both of these constants.
The following list gives the values of CNTL30 and CNTH30 for several speeds as determined by my particular KIM-I Reset/Rubout sequence.
BAUD 110 150 300 600 1200 1800 2400 4800 9600 CNTL30 85H D8H EBH 74H 38H 24H 1AH 06H 03H CNTH30 02H 01H OOH 00H 00H 00H 00H 00H 00H
Now for the interesting part. At lower speeds (110 through 1800 Baud) everything works fine with these values. But, at higher speeds problems arise.
Repeated Reset/Rubout sequences kept producing CNTL30 = 1AH for 2400 Baud. This value did work for most functions like examine and fill memory. however, for tape dump (Q command) intermittent characters were lost.
This problem was eliminated by substituting either 18H or 19H In CNTL30. All functions worked perfectly for either value.
At 4800 Baud I was unable to use the terminal at all. It acted more like it wanted to work at CNTL30 = 07H rather than at 06H, but no value between 05H and OAH would make it work.
At 9600 Baud the slow functions like examine and fill would work, but tape dump (Q) resulted in severe loss of characters.
The problem at these speeds is that the quantization level between allowed speeds (i.e. integer values of CNTL30) is so large that unless you are lucky you will not hit close enough to your terminal speed.
Since CNTL30 as used in a software timing loop to count instruction sequences (thus machine cycles) the high Baud can be fine tuned with the system clock.
You should be able to use the technique described by R. H. Burhans (page 10, issue #5. May 77, KIM-1/6502 Users Notes) to perform this fine tuning.
For casual use, 2400 Baud (or maybe even 110 Baud) is satisfactory with no hardware modifications.
However, if you have a dedicated high speed terminal you may find it worthwhile to fine tune either the KIM-1 clock or the terminal clock.
This will allow you to utilise the KIM-1 software (like GETCH and OUTCH) at high speeds. After you become accustomed to it. 9600 Baud is nice. 2400 ok, 1200 a bit of a drag. and anything less unbearable.
Finally, since CNTL30 • 03H (greater than zero) for 9600 Baud you should be able to fine tune for 19,200 Baud. and maybe (but probably not) for 38,400 Baud. Dwight D. Egbert
Jim mcClahanan notes
The PAL-1 (just like the KIM-1) uses a ‘soft UART’ or ‘bit banger’ for its serial I/O. I’m not a fan of this approach, but at the same time it demonstrates what could be accomplished with a minimial amount of hardware. The PAL-1 automatically figures out the appropriate delay between bits of the serial character when you press enter after a reboot. I have found that decreasing the value actually significantly improves the odds of an error-free load of larger punchtape format files. Below is a table for values found and suggest for $17F2.
Baud Found New 300 $EA $E8 1200 $37 $35 2400 $1A $18 4800 $0B $0A
I haven’t tried to optimize the delay values. Right now I’m using 5 ms between characters and 500 ms between lines when doing 8K transfers and with the modified values I usually am successful. With the default values, it seemed like even with longer delays things would slip out of synchronization at some point more often than not on large transfers.








