Hier noch ein paar Ergänzungen:
Zunächst mal das BASIC-Listing, für diejenigen, die keinen Assembler zur Hand haben:
10 AD=&8000:L=&014F
20 READ a:POKE AD+P,a
30 P=P+1:IF P=L THEN CALL &8000:END
40 GOTO 20
50 DATA &21,&46,&81,&01,&09,&80,&C3,&D1,&BC,&26,&80,&C3,&52,&80,&C3,&F2
60 DATA &80,&C3,&06,&81,&C3,&12,&81,&C3,&1B,&81,&C3,&24,&81,&C3,&2D,&81
70 DATA &C3,&62,&80,&00,&00,&00,&45,&51,&55,&41,&4C,&49,&5A,&45,&D2,&53
80 DATA &45,&54,&50,&4F,&D3,&50,&41,&54,&54,&45,&52,&CE,&50,&45,&4E,&B1
90 DATA &50,&45,&4E,&B2,&50,&45,&4E,&B3,&44,&45,&C6,&53,&54,&4F,&D0,&00
100 DATA &00,&00,&21,&36,&81,&11,&5E,&80,&01,&00,&81,&C3,&D7,&BC,&CD,&69
110 DATA &80,&C9,&21,&36,&81,&C3,&DD,&BC,&C9,&F3,&CD,&D5,&80,&1E,&08,&CD
120 DATA &75,&80,&CD,&75,&80,&E5,&CD,&B0,&80,&E6,&0F,&C6,&01,&1C,&4F,&B7
130 DATA &28,&0A,&47,&CD,&9F,&80,&3A,&4E,&81,&77,&10,&F7,&3E,&0F,&91,&C6
140 DATA &01,&28,&08,&47,&CD,&9F,&80,&36,&00,&10,&F9,&E1,&23,&23,&C9,&7C
150 DATA &D6,&10,&FE,&C0,&30,&07,&7D,&D6,&50,&6F,&7C,&DE,&D0,&67,&FB,&C9
160 DATA &06,&F4,&ED,&59,&01,&C0,&F6,&ED,&49,&AF,&ED,&79,&01,&D2,&F7,&ED
170 DATA &49,&01,&40,&F6,&ED,&49,&06,&F4,&ED,&78,&01,&C2,&F7,&ED,&49,&01
180 DATA &00,&F6,&ED,&49,&C9,&2A,&4A,&81,&ED,&5B,&4C,&81,&7D,&E6,&07,&67
190 DATA &AD,&6F,&4F,&06,&60,&29,&29,&09,&29,&7B,&CB,&3A,&CB,&1B,&CB,&3B
200 DATA &19,&C9,&DD,&66,&01,&DD,&6E,&00,&22,&4A,&81,&DD,&56,&03,&DD,&5E
210 DATA &02,&ED,&53,&4C,&81,&C9,&E5,&DD,&66,&01,&DD,&6E,&00,&22,&4E,&81
220 DATA &E1,&C9,&E5,&21,&F0,&00,&22,&4E,&81,&E1,&C9,&E5,&21,&0F,&00,&22
230 DATA &4E,&81,&E1,&C9,&E5,&21,&FF,&00,&22,&4E,&81,&E1,&C9,&E5,&21,&6F
240 DATA &00,&22,&4E,&81,&E1,&C9,&00,&00,&00,&00,&00,&00,&00,&00,&00,&00
250 DATA &00,&00,&00,&00,&00,&00,&00,&00,&00,&00,&C7,&00,&94,&00,&6F
Ergänzt:
|STOP Stoppt den Equalizer
|PEN1 |PEN2 |PEN3 Wählt den PEN als Farbe (Einfarbiger Equalizer)
|PATTERN,<0-255> Setzt den Pattern für die Balken.
|DEF Setzt die Balken wieder auf die Voreinstellung
Nochmal der komplette Assemblercode:
org #8000
LD HL,BufferRsx
LD BC,InitRSX
JP #BCD1
.InitRSX
DW RSXTable
JP inton
JP initCoord
JP setPattern
JP setPattern1
JP setPattern2
JP setPattern3
JP setPattern4
JP StopInterrupt
nop
nop
nop
.RSXTable
DB "EQUALIZE","R"+#80
DB "SETPO","S"+#80
DB "PATTER","N"+#80
DB "PEN","1"+#80
DB "PEN","2"+#80
DB "PEN","3"+#80
DB "DE","F"+#80
DB "STO","P"+#80
nop
nop
nop
.IntOn
LD HL,BlocEvent
LD DE,InterruptLoop
LD BC,#8100
JP #BCD7
.InterruptLoop
call equalizer
ret
.StopInterrupt
LD HL,BlocEvent
JP #BCDD
ret
.equalizer
di
call setCoord
ld e,8
call draw_bars
call draw_bars
.draw_bars
push hl
call read_from_psg
and &0f
add 1
inc e
ld c,a
or a
jr z,nobars
ld b,a
.bars
call prev_line
LD a,(pattern)
ld (hl),a
djnz bars
.nobars
ld a,15
sub c
add 1
jr z,noblank
ld b,a
.blank
call prev_line
ld (hl),0
djnz blank
.noblank
pop hl
inc hl
inc hl
ret
.prev_line
ld a,h
sub 16 ;;8 ;; 16
cp #c0
jr nc,line_ok
ld a,l
sub #50
ld l,a
ld a,h
sbc &d0 ;;#c8 ;; d0
.line_ok
ld h,a
ei
ret
.read_from_psg
ld b,#f4
out (c),e
ld bc,#f6c0
out (c),c
xor a
out (c),a
ld bc,#f7d2
out (c),c
ld bc,#f640
out (c),c
ld b,#f4
in a,(c)
ld bc,#f7c2
out (c),c
ld bc,#f600
out (c),c
ret
.setCoord
LD HL,(ycoord)
LD DE,(xcoord)
LD A, L
AND %00000111
LD H, A
XOR L
LD L, A
LD C, A
LD B, &60
ADD HL, HL
ADD HL, HL
ADD HL, BC
ADD HL, HL
LD A, E
SRL D
RR E
SRL E
ADD HL, DE
ret
.initCoord
LD H,(IX+1)
LD L,(IX+0)
LD (ycoord),HL
LD d,(IX+3)
LD e,(IX+2)
ld (xcoord),DE
ret
.setPattern
push HL
LD H,(IX+1)
LD L,(IX+0)
LD (pattern),HL
pop HL
ret
.setPattern1
push hl
ld HL,%11110000
LD (pattern),HL
pop hl
ret
.setPattern2
push hl
ld HL,%00001111
LD (pattern),HL
pop hl
ret
.setPattern3
push hl
ld HL,%11111111
LD (pattern),HL
pop hl
ret
.setPattern4
push hl
ld HL,&6f
LD (pattern),HL
pop hl
ret
.BlocEvent
DS 16
.BufferRsx
DS 4
.ycoord
DB 199,0
.xcoord
db 148,0
.pattern
db &6f