;:sys36864
	;.opt o
;
; ------ startadresse -----
;
	*= 2142
;
; **** speech-finder v1.0 ****
;
; von nikolaus heusler
;     XXXXXXXXXXXX XX
;     XXXX XXXXXXXX XX
;
; (c) 64'er, markt & technik 1991
;
; ------- variablen -------
;
mem	=2	;zeiger in speicher
bts	=4	;anzahl der bits
ojoy	=254	;alter joystick-wert
ric	=5	;laufrichtung
v	=1277	;bildschirm-position
tmp	=166	;zwischenspeicher
tem	=6	;tempo
vol	=54296	;sid-lautstaerke
;
; ------- programm --------
;
; --- initialisieren
	jsr 65409	;videochip initialisieren
	lda #<hi
	ldy #>hi
	jsr $ab1e	;strout bildschirmtext ausgeben
	lda #0
	sta ric	;vorwaerts
	sta mem
	sta mem+1	;speicherzeiger
	ldx #24
csid	sta 54272,x	;sid loeschen
	dex
	bpl csid
	lda #9
	sta tem	;starttempo = 9
	lda #2
	sta bts	;aufloesung anfangs 2 bit
	jsr par	;parameter am schirm ausgeben
; --- hauptschleife
pump	sei	;interrupt aus
	lda #48
	sta 1	;ram einblenden
	lda mem+1
	sta v+240
	ldy #0
	lda (mem),y	;ein byte aus speicher holen
	sta tmp	;und merken
	lda #55
	sta 1
	cli	;und rom wiederherstellen
	ldx bts	;anzahl der bits
	bne no1	;nicht ein bit
; --- 1 bit
	ldy #7	;acht werte
b1l	lda tmp
	asl
	adc #0
	sta tmp	;register linksverschieben
	and #1	;unterstes bit ist datenbit
	beq n1l
	lda #15	;lautstaerke 15
n1l	jsr tb	;lautstaerke an sid melden und pause
	dey	;naechstes bit
	bpl b1l
	bmi rdy	;fertig
no1	dex	;zwei bit
	bne no2	;nein, dann vier bit
; --- 2 bit
	ldy #3	;vier werte
b2l	lda tmp
	asl
	adc #0
	asl
	adc #0
	sta tmp	;register zweimal linksverschieben
	and #3	;datenbits sind bits 0 und 1
	tax
	lda tab2,x	;wert aus tabelle lesen
	jsr tb	;und an sid melden und warten
	dey	;weitere bits
	bpl b2l
	bmi rdy	;nein dann fertig
no2	=*
; --- 4 bit
	ldy #1	;zwei werte
b4l	lda tmp
	asl
	adc #0
	asl
	adc #0
	asl
	adc #0
	asl
	adc #0	;register viermal linksverschieben
	and #15	;datenbits im unteren nibble
	jsr tb	;an sid melden, pause
	dey	;noch einen wert
	bpl b4l
; --- ein byte abgerabeitet
rdy	lda ric	;laufrichtung
	bne rew	;nicht null, dann rueckwaerts
; --- vorwaerts
	inc mem	;zeiger auf naechste zelle richten
	bne next
	inc mem+1	;high
	jmp next
; --- rueckwaerts
rew	lda mem
	bne r1
	dec mem+1	;zeiger auf vorherige speicherzelle richten
r1	dec mem	;= um eins erniedrigen
; --- naechstes byte bearbeiten, joystick abfragen
next	lda 56320	;joystick lesen
	and #31
	cmp ojoy
	beq k5
	sta ojoy	;entprellen
	lda 56320
	and #1	;oben
	bne k1
; --- anzahl bits veraendern
	ldx bts
	inx
	cpx #3
	bcc j1
	ldx #0
j1	stx bts
	jsr par	;parameter ausgeben
k1	lda 56320
	and #2	;unten
	bne k2
; --- laufrichtung umdrehen
	lda ric
	eor #1	;invertieren
	sta ric
	jsr par	;parameter anzeigen
k2	lda 56320
	and #4	;links
	bne k3
; --- tempo veraendern
	ldx tem
	dex
	bpl j3
	ldx #9	;maximalwert
j3	stx tem	;neues tempo
	jsr par	;parameter ausgeben
k3	lda 56320
	and #8	;rechts
	bne k4
	lda #0
	sta vol	;stumm
	jmp 65409	;fertig
k4	lda 56320
	and #16	;feuer
	beq x5	;ja, dann hexanzeige
k5	jmp pump	;sonst weiter in hauptschleife
; --- adresse hexadezimal einblenden
x5	lda #12
	sta 214	;cursorzeile
	lda #16
	sta 211	;cursorspalte
	jsr 58732	;cursor an neue stelle
	lda #"$"
	jsr 65490	;dollarzeichen drucken
	lda mem+1	;adresse high
	jsr hex	;ausgeben
	lda mem	;und lowbyte
	jsr hex	;auch
	ldx #0
	ldy #0	;verzoegerung, ca. 1 sekunde
pse	dex
	bne pse	;um stick zu entprellen
	dey
	bne pse
f1	lda 56320
	and #16	;wenn feuerknopf immer noch gedrueckt
	beq f1	;warten
f2	lda 56320
	and #16	;feuer
	bne f1	;warten, bis feuer gedrueckt
	lda #16
	sta 211	;cursor auf spalte 16
	ldx #4	;fuenf leerzeichen
spl	jsr $ab3f	;space drucken
	dex	;und anzeige
	bpl spl	;loeschen
	jmp pump
;
; --- zahl hexadezimal ausdrucken
hex	pha
	lsr
	lsr
	lsr
	lsr	;erst high-nibble drucken
	jsr hex1
	pla	;low-nibble
hex1	and #15	;signifikante bits isolieren
	tax	;als tabellen-index
	lda hext,x	;hexwert aus tabelle
	jmp 65490	;ausdrucken
;
; --- sid-lautstaerke setzen und pause
tb	sta vol	;wert an sid melden
	ldx tem	;tempo
	beq fert	;null, dann keine pause
wait	nop
	nop	;verzoegerung
	nop
	nop
	nop
	nop
	dex
	bpl wait
fert	rts
;
; --- parameter am bildschirm ausgeben
par	ldx bts	;anzahl bits
	lda bitt,x
	sta v	;in video-ram
	ldx ric
	lda rict,x
	sta v+80	;richtung
	lda #"9"
	sec
	sbc tem
	sta v+160	;neun minus tempo
	rts
;
; ------ diverse texte ----
;
hi	.byte "speech-finder v1"
	.byt 13
	.byte "\xa3\xa3\xa3\xa3\xa3\xa3\xa3\xa3\xa3\xa3\xa3\xa3\xa3\xa3\xa3\xa3"
	.byt 13,13
	.byte "von nikolaus heusler, 01.91"
	.byt 13
	.byte "\x11\x11  anz. bits: \xa0"
	.byt 13
	.byte "\x11   richtung: \xa0"
	.byt 13
	.byte "\x11      tempo: \xa0"
	.byt 13
	.byte "\x11   speicher: \xa0"
	.byt 13
	.byte "\x11\x11bedienung: joystick port 2"
	brk
hext	.byte "0123456789abcdef"
bitt	.byte "124"
rict	.byte "\x16\x12"
tab2	.byt 15,10,5,0
