KIM-1 TIDBITS
Harvey B. Herman
Chemistry Department
University of North Carolina at Greensboro
Greensboro, NC 27412
This article is the second in what I hope is a continuing series on the KIM. My intension is to share with others programs which should make KIM easier to use. The reader will please note the machine language programs have been documented with the excellent Macro Assembler and Text Editor (ASSM/TED) from Eastern House software (see my review in COMPUTE #1, p100). When I started messing with KIM several years ago, my programs were mostly hand assembled. This task has been made much easier by using ASSM/TED.
The first program is an implementation of a KIM real-time clock (sometimes called a tick counter). I have whimsically referred to it as a 'Jeffrey counter' after a former student of mine. Every 100 milliseconds a location in page zero is incremented. By peeking at this location one can time external events up to about 25 seconds. We have used it to tell when to take readings from an analog-to-digital converter. The clock can be started, stopped or read under program control. A source listing of the program is shown in figure 1. An example of a BASIC program which uses the tick counter is shown in figure 2.
In order for this program to work one external connection needs to be made. The counter is interrupt driven and requires PB7 on the application connector (A-15) to be connected directly to IRQ (E-4). The program sets PB7 as an input line and initializes the IRQ vectors at $17FE/ $17FF to point to the clock service routine. For convenience I have modified KIM Microsoft BASIC to execute a preamble which, among other things, sets up these vectors before jumping to the normal start of BASIC.
The second program is an enhancement to KIM Microsoft BASIC. Support is added for a terminal (e.g. ASR 33 Teletype) which used the X-ON/X-OFF protocol to start and stop a paper tape reader. Over the years I had accumulated a number of programs on paper tape which I wanted to use with KIM BASIC. As supplied the BASIC software did not read paper tapes reliably and I had no desire to key in long programs again. I waded through a disassembly of BASIC and found two calls to a subroutine which could be called “input a line.”
The change I made was to send out an X-ON character (with added code in page 2 - Listing 3) before jumping to this subroutine. My paper tape reader will begin reading upon receipt of this character.
It was necessary to make one further change in order for KIM to punch BASIC program tapes that would read back properly. The tape reader must stop after carriage return while BASIC “digests” a line. Therefore the X-OFF character (stop reading) must be included in the data stream. I found a call to BASIC's output routine immediately after loading the accumulator with “CR” (hex 0D). I changed this to a jump to code, again in page 2, which outputs X-OFF and CR before continuing as before. Later when the teletype reads the X-OFF character on tape it shuts off but does not stop immediately and reads one additional character (CR). Return sets the BASIC interpreter off and running. In a short time, after digesting the line, BASIC sends the X-ON character asking for more data. Only one caveat – remember to type Control/0 before and after reading tapes so the teletype will only single space.
I hope these additional programs will be found useful. As always, if you have any questions I will be happy to respond if you include a SASE.
Listing 1
0100 ;
0110 ; INTERRUPT SERVICE ROUTINE FOR REAL-TIME CLOCK
0120 ; (TICK COUNTER). ENHANCEMENT TO KIM MICROSOFT
0130 ; BASIC. 1/10 SEC PER TICK
0140 ;
0150 ; HARVEY B. HERMAN
0160 ;
0170 ; REQUIRES CONNECTION OF IRQ TO PB7.
0180 ; SET ALL PB PINS AS INPUT. SET ORIGINAL COUNT
0190 ; AND DIVIDE RATE(/1024) OF 6530 TIMER.
0200 ; START TICKING - POKE 5891,0:POKE 5903,98
0210 ; DISABLE IRQ (OTHER WAYS POSSIBLE).
0220 ; STOP TICKING - POKE 5894,98
0230 ; READ TICK COUNTER - PEEK(224)
0240 ; RESET STOPS CLOCK.
0250 ;
0260 TICK .DE $E0 ;FREE LOCATION PAGE ZERO
0270 COUNT .DE $62 ;1/10 SEC.
0280 CLKKTE .DE $170F ;DIVIDE BY 1024(INT. EN.)
0290 IRQL .DE $17FE ;KIM IRQ INTERRUPT
0300 IRQH .DE $17FF ; VECTORS
0310 ;
0320 ; INITIALIZATION ROUTINE
0330 ; SET UP VECTORS AND ZERO TICK COUNTER
0340 ; LOCATE ANYWHERE CONVENIENT
0350 .BA $4368
0360 ; OTHER CODE ABOVE IN MY VERSION
4368- A9 DA 0370 LDA #INTER
436A- 8D FE 17 0380 STA IRQL
436D- A9 02 0390 LDA #H,INTER
436F- 8D FF 17 0400 STA IRQH
4372- A9 00 0410 LDA #00
4374- 85 E0 0420 STA *TICK
0430 ; OTHER CODE BELOW IN MY VERSION
0440 ;
0450 ; INTERRUPT HERE ON TIMEOUT
0460 .BA $2DA
02DA- 48 0470 INTER PHA
02DB- EA 0480 NOP ;HIDE MY IGNORANCE
02DC- E6 E0 0490 INC *TICK
02DE- A9 62 0500 LDA #COUNT
02E0- 8D 0F 17 0510 STA CLKKTE
02E3- 68 0520 PLA
02E4- 40 0530 RTI
0540 .EN
Listing 2
10 REM EXAMPLE PROGRAM TO PRINT A NUMBER
20 REM ONCE EVERY 10 SECONDS
30 POKE 5903, 98: REM START CLOCK
40 FOR I = 1 TO 10
50 POKE 224,0: REM ZERO CLOCK
60 IF PEEK (224) < 100 THEN 60
70 PRINT I;
80 NEXT I
90 POKE 5894, 98: REM STOP CLOCK
100 END
Listing 3
0100 ;
0110 ; X-ON/X-OFF ENHANCEMENT TO
0120 ; KIM MICROSOFT BASIC
0130 ; SERIAL NUMBER 9011
0140 ;
0150 ; HARVEY B. HERMAN
0160 ;
0170 ; SENDS X-ON (HEX 11) TO TERMINAL BEFORE JUMPING TO
0180 ; "INPUT A LINE". TERMINALS WITH THIS FEATURE WILL
0190 ; AUTOMATICALLY START READING PAPER TAPE. WHEN AN
0200 ; X-OFF (HEX 13) IS READ, THE TAPE READER CONTROL
0210 ; WILL TURN OFF AND THE READER WILL COAST AND
0220 ; TRANSMIT ONE EXTRA CHARACTER.
0230 ;
0240 ; PUNCHES PAPER TAPE (BY LIST) WITH X-OFF/CR/LF/
0250 ; NULL(S) AS END OF LINE FORMAT.
0260 ;
0270 ; NULL(S) CORRECTION (NECESSARY FOR EARLY VERSIONS
0280 ; OF BASIC).
0290 ;
0300 OUTCH .DE $1EA0 ;KIM OUTPUT ROUTINE
0310 INPUT .DE $2426 ;BASIC "INPUT A LINE"
0320 OUTPUT .DE $2A3A ;BASIC OUTPUT ROUTINE
0330 LDA0 .DE $29D1 ;INSTRUTION LDA #00
0340 ;
0350 ; INTERCEPT CALLS TO "INPUT A LINE"
0360 .BA $2351
2351- 20 C8 02 0370 JSR XON
0380 .BA $2AB6
2AB6- 4C C8 02 0390 JMP XON
0400 ; OUTPUT X-ON CHARACTER
0410 .BA $2C8
02C8- A9 11 0420 XON LDA #$11 ;X-ON
02CA- 20 A0 1E 0430 JSR OUTCH ;OUT TO TERMINAL
02CD- 4C 26 24 0440 JMP INPUT ;INPUT A LINE
0450 ; INTERCEPT CALLS TO OUTPUT CR
0460 .BA $29C3
29C3- 20 D0 02 0470 JSR XOFF
0480 ; OUTPUT X-OFF/CR CHARACTERS
0490 .BA $2D0
02D0- A9 13 0500 XOFF LDA #$13 ;X-OFF
02D2- 20 3A 2A 0510 JSR OUTPUT ;BASIC OUTPUT ROUTINE
02D5- A9 0D 0520 LDA #$0D ;CR
02D7- 4C 3A 2A 0530 JMP OUTPUT
0540 ; CORRECT NULL(S) ERROR IN EARLY VERSION
0550 ; OF BASIC. A WAS DESTROYED BY OUTPUT AND MUST
0560 ; BE LOADED AGAIN WITH ZERO.
0570 .BA $29D7
29D7- D0 F8 0580 BNE LDA0
0590 .EN