Michael Doornbos (of https://imapenguin.com/) posted two “10 PRINT” articles for our beloved small 6502 SBC’s.
The KIM-1 version displays on the seven segment LED displays. The AIM 65 prints it on the thermal printer.
KIM-1 version of 10 PRINT in BASIC and assember
10 PRINT CHR$(47+INT(RND(0)*2)*45);:GOTO 10
; BY MICHAEL DOORNBOS MIKE@IMAPENGUIN.COM; 2025
; SOFT START AT $0200
; THIS PROGRAM GENERATES A RANDOM PATTERN OF SLASHES AND BACKSLASHES
; AND DISPLAYS IT ON THE KIM-1'S 7-SEGMENT DISPLAY.
; THE PATTERN SCROLLS TO THE LEFT, CREATING A CONTINUOUS EFFECT.
; A LOT OF THIS CODE IS BORROWED FROM:
; https://netzherpes.de/blog/index.php?entry=KIM-1-scrolltext
; kim_msg.asm
; testing lin2c64 6510 assembler
; using J. Butterfield's scan display from Wumpus
; 01/03/2013 ces
; CONSTANTS FOR 7-SEGMENT DISPLAY CHARACTERS
BACKSLASH .EQU $64 ; BACKSLASH CHARACTER
SLASH .EQU $52 ; FORWARD SLASH CHARACTER
SPC .EQU $80 ; SPACE CHARACTER
; KIM-1 HARDWARE ADDRESSES
SAD .EQU $1740 ; DATA PORT FOR PINS 1-4
SADD .EQU $1741 ; DATA DIRECTION REGISTER A
SBD .EQU $1742 ; DATA PORT FOR PINS 5-6
SBDD .EQU $1743 ; DATA DIRECTION REGISTER B
TIMER2 .EQU $1747 ; OPTIONAL 2ND 6532 TIMER
LOUT .EQU $7F ; SET PINS AS OUTPUT TO LEFT 4 LEDS
ROUT .EQU $1E ; SET PINS AS OUTPUT TO RIGHT 2 LEDS
; ZERO PAGE VARIABLES
SEED .EQU $00D0 ; RANDOM SEED LOCATION
TMR .EQU $00DB ; TIMER COUNTER
PTR .EQU $00DC ; POINTER
XFRHI .EQU $00DD ; USED FOR CHARACTER BUFFER HIGH BYTE
XFRLO .EQU $00DE ; USED FOR CHARACTER BUFFER LOW BYTE
TMP1 .EQU $00DF ; TEMPORARY STORAGE
CBUFF .EQU $00E8 ; CHARACTER BUFFER (6 BYTES)
MSGBUF .EQU $0180 ; BUFFER FOR GENERATED PATTERNS (30 BYTES)
.ORG $0200 ; START OF PROGRAM CODE
MAIN
; CLEAR THE MESSAGE BUFFER FIRST TO PREVENT GLITCHES
LDX #$00
CLRLOOP LDA #SPC ; USE SPACE CHARACTER TO INITIALIZE
STA MSGBUF,X
INX
CPX #$30 ; CLEAR THE ENTIRE BUFFER AREA
BNE CLRLOOP
LDA #$00 ; ADD NULL TERMINATOR AT THE END
STA MSGBUF+23
; INITIALIZE THE TIMER
LDA #$FF ; LOAD MAXIMUM VALUE
STA TIMER2 ; START TIMER
; USE TIMER VALUE AS SEED
LDA TIMER2 ; READ CURRENT TIMER VALUE
STA SEED ; USE AS RANDOM SEED
BNE SEEDOK ; IF NOT ZERO, IT'S FINE
INC SEED ; OTHERWISE INCREMENT TO MAKE NON-ZERO
SEEDOK JSR GENPAT ; GENERATE INITIAL PATTERN
INFINIT LDY #>MSGBUF ; LOAD BUFFER LOCATION
LDA #<MSGBUF
JSR SCAN ; DISPLAY THE PATTERN
; GENERATE NEW RANDOM SLASH AT END OF BUFFER
JSR RANDOM ; GET RANDOM BIT
BCC GENBACK ; BRANCH IF CARRY CLEAR (50% CHANCE)
LDA #SLASH ; FORWARD SLASH
JMP STORE
GENBACK LDA #BACKSLASH ; BACKSLASH
STORE STA MSGBUF+22 ; ADD NEW CHARACTER TO END OF BUFFER
; SHIFT BUFFER LEFT ONE POSITION (SCROLL EFFECT)
LDX #$00 ; START AT FIRST POSITION
SHIFT LDA MSGBUF+1,X ; GET NEXT CHARACTER
STA MSGBUF,X ; STORE IN CURRENT POSITION
INX ; MOVE TO NEXT POSITION
CPX #$22 ; CHECK IF WE'RE AT END OF BUFFER
BNE SHIFT ; CONTINUE IF NOT AT END
; ENSURE NULL TERMINATOR IS ALWAYS PRESENT
LDA #$00
STA MSGBUF+23
JMP INFINIT ; LOOP FOREVER
; GENERATE INITIAL PATTERN BUFFER WITH RANDOM SLASHES
GENPAT LDX #$00 ; START AT FIRST POSITION
GPLOOP JSR RANDOM ; GET RANDOM BIT
BCC GBACK ; BRANCH IF CARRY CLEAR
LDA #SLASH ; FORWARD SLASH
JMP GSTORE
GBACK LDA #BACKSLASH ; BACKSLASH
GSTORE STA MSGBUF,X ; STORE IN BUFFER
INX ; NEXT POSITION
CPX #$17 ; CHECK IF BUFFER IS FULL
BNE GPLOOP ; CONTINUE IF NOT FULL
LDA #$00 ; ADD NULL TERMINATOR
STA MSGBUF+23 ; AT END OF BUFFER
RTS ; RETURN
; RANDOM NUMBER GENERATOR (8-BIT LFSR)
RANDOM LDA SEED ; LOAD CURRENT SEED
ASL ; SHIFT LEFT (C GETS HIGH BIT)
BCC NOEOR ; SKIP EOR IF BIT 7 WAS 0
EOR #$B4 ; APPLY FEEDBACK POLYNOMIAL
NOEOR STA SEED ; STORE UPDATED SEED
RTS ; RETURN WITH CARRY = RANDOM BIT
; SCANNING ROUTINE FROM ORIGINAL CODE
SCAN STY XFRLO ; Y AND A GET LOADED BEFORE JSR TO SCAN
STA XFRHI
LDA #$07 ; INIT SCAN FORWARD
STA TMP1
LDY #$05 ; INIT Y
CONT LDX #$05 ; INIT X
CHAR LDA (XFRHI),Y ; GET CHARACTER
CMP #$00 ; LAST CHARACTER?
BNE MORE ; IF NOT, CONTINUE
RTS
MORE STA CBUFF,X ; STORE CHAR
DEY ; SET UP NEXT CHAR
DEX ; SET UP NEXT STORE LOC
BPL CHAR ; LOOP IF NOT 6TH CHAR
CLD ; BINARY MODE
CLC ; PREPARE TO ADD (CLEAR CARRY FLAG)
TYA ; GET CHAR POINTER
ADC TMP1 ; UPDATE FOR 6 NEW CHARACTERS
STA PTR ; SAVE NEW POINTER
JSR DSPDLY ; DELAY DISPLAY
LDY PTR ; RESTORE POINTER
JMP CONT ; CONTINUE WITH REST OF MESSAGE
DSPDLY LDX #$0A ; SET THE DELAY RATE HERE
STX TMR ; PUT IN DECR. LOCATION
TIME LDA #$52 ; LOAD TIMER
STA TIMER2 ; START TIMER
LITE JSR DISP ; GOSUB DISPLAY RTN
BIT TIMER2 ; TIMER DONE?
BPL LITE ; IF NOT, LOOP
DEC TMR ; DECREMENT TIMER COUNTER
BNE TIME ; NOT FINISHED
RTS ; NOW GET 6 NEW CHARACTERS
DISP LDA #LOUT ; CHANGE LEFT LED SEGMENTS
STA SADD ; TO OUTPUTS
LDY #$00 ; INIT RECALL INDEX
LDX #$09 ; INIT DIGIT NUMBER
SIX LDA CBUFF,Y ; GET CHARACTER
STY $00FC ; SAVE Y FOR MONITOR DISP ROUTINE
JSR $1F4E ; MONITOR ROUTINE - DISP CHAR, DELAY 500 CYCLES
INY ; SET UP FOR NEXT CHAR
CPY #$06 ; 6 CHAR DISPLAYED?
BCC SIX ; NO
RTS
AIM 65 version in BASIC
10 PRINTCHR$(47+(INT(RND(1)*2)*45));:GOTO 10
that print random ‘/’ or ‘\’
See also:
KIM-1 connectors: beware the Chinese cheap variants!
The KIM-1 needs 2 edge connectors.
The specifications are: card edge; PIN: 44; 3.96mm
When you search for those, ...
Magazines: Compute! and Compute II
The pages om Magazines had an update.
MICRO has its own page with all Best of MICRO pfds.
Compute! and Compute II ar...
All documents in the MTU pages are now clean and higher quality, about 50 new PDFs.
I got hold a about 10 cm of MTU documents. Several I already had in PDF format, some not available yet.
I took the oppo...
Focal-65 V3D for TIM and KIM-1
Focal on the 6502, a page on this small language, originating for Digital Equipment.
A small interpreter (about 5K) for...