;***************************************************************************** ; ; Melodien Abspieler ; ; abgeleitet von original Version 12.2008, M.Baudisch ; Klingel mit 100 Melodien - last minute Weihnachtsgeschenk ; ; https://www.mikrocontroller.net/topic/120289 ; ; 2025-05-22 mchris ; ; Hardware: 6502, fcpu=1MHz, Junior Lerncomputer ; ; Lautsprecher Anschluss: Port P0 of 6532 ; ; assembler: ca65 ( https://cc65.github.io/doc/ca65.html ) ; 6502 instruction set: https://www.masswerk.at/6502/6502_instruction_set.html ; ;***************************************************************************** ; MOS6532 PIA Adressen PAD = $1A80 PADD = $1A81 PBD = $1A82 PBDD = $1A83 ;note=0 dauerL=0 dauerH=1 delayL=2 delayH=3 noteIdx=4 dauer=5 ; 16 bit accus A_LO=6 A_HI=7 B_LO=8 B_HI=9 liedL=10 liedH=11 speed=12 ; Programmstart .org $300 lda #$1 sta PBDD ; set PB0 to output main: ; load Liedadresse into liedpointer lda #lied1 sta liedH jsr playlied ; load Liedadresse into liedpointer lda #lied2 sta liedH jsr playlied ; load Liedadresse into liedpointer lda #lied6 sta liedH jsr playlied ; load Liedadresse into liedpointer lda #lied15 sta liedH jsr playlied jmp main playlied: ldy #0 lda (liedL),y ; load length tax iny lda (liedL),y ;load speed sta speed iny noteloop: ; save regs tya pha txa pha ;lda lied1,x ;lda lied2,x ;lda lied6,x ;lda lied15,y lda (liedL),y jsr playnote ; delay between notes ldx #0 ldy #20 jsr delayxy ; load regs pla tax pla tay iny ; next note dex ; numbers of notes to play bne noteloop ; Pause nach Lied ldx #$f0 ldy #$f0 jsr delayxy rts ; play a note with a give duration ; input accu ; accu format: dddnnnnn ; d: duration (d*20ms) ; n: notenumber playnote: pha and #$1f ; Hoehe extrahieren asl ; Idx *2, note is 2 bytes sta noteIdx pla and #$E0 ; mask bit 7,6,5 lsr a lsr a lsr a lsr a lsr a sta dauer ldx noteIdx lda durations,x sta B_LO inx lda durations,x sta B_HI jsr div16 jsr div16 ;jsr div16 lda dauer clc adc speed tay ; a16=0 lda #0 sta A_LO sta A_HI ;ldy dauer iny adder: jsr add16 ; a16=a16+b16 dey bne adder lda A_LO sta dauerL lda A_HI sta dauerH ldx noteIdx lda notes,x sta delayL inx lda notes,x sta delayH inx stx noteIdx jsr playtone rts div16: lsr B_HI ror B_LO rts ; add16 ; inputs: ; A_LO,A_HI ; B_LO,B_HI ; output ; A_LOW ; A_HIGH add16: CLC ; Clear carry before addition LDA A_LO ; Load low byte of first operand ADC B_LO ; Add low byte of second operand STA A_LO ; Store low byte of result LDA A_HI ; Load high byte of first operand ADC B_HI ; Add high byte of second operand plus carry STA A_HI ; Store high byte of result rts ; -- playtone -- ; inputs ; dauerL ; dauerH ; delayL ; delayH playtone: lda dauerL tax lda dauerH tay iny ; lowest frequency 1.522Hz, 657ms loop: ; save regs txa pha tya pha jsr delay ; load regs pla tay pla tax ; loudspeaker lda PBD ; port B lesen eor #$01 ; Bit 0 umschalten sta PBD ; zurückschreiben dex bne loop dey bne loop rts ; -- delay -- ; inputs ; delayL ; delayH delay: ldx delayL ldy delayH iny delayxy: dex ; 2 Takte bne delayxy ; 3 Takte jmp , 2 no jmp dey bne delayxy rts ; 6 Takte notes: .word $170,$15c,$148,$136,$124,$114,$104, $f6, $e8, $db, $cf, $c3, $b8, $ae, $a4, $9b, $92, $8a, $82, $7b, $74, $6d, $68, $61, $5c, $57, $52, $4d, $49, $45, $3e ; Hz: 262, 277, 294, 311, 330, 349, 370, 392, 416, 440, 466, 495, 524, 554, 588, 622, 660, 698, 740, 784, 831, 880, 929, 992,1050,1106,1179,1244,1316,1397,1562 durations: .word 75, 79, 84, 89, 95, 100, 106, 112, 119, 126, 133, 142, 150, 159, 168, 178, 189, 200, 212, 224, 238, 253, 265, 285, 300, 317, 337, 358, 378, 400, 445 lied1: .byte 65 ; length .byte 1 ; speed .byte 0,136,128,107,128,72,64,72,141,136,134,136,128,111,128,72,64,72,144,143,139,136,143,148,72,70,64,70,131,139,200,200,192,82,143,141,139,200,171,72,64,72,141,136,134,200,175,72,64,72,144,143,139,136,143,148,72,70,64,70,131,139,200,200 lied2: .byte 38 ; length .byte 2 ; speed .byte 65,3,3,67,131,65,65,65,65,4,4,68,132,67,67,67,65,3,3,67,131,65,65,65,65,4,4,68,132,67,66,65,77,236,72,70,232 lied6: .byte 98 ; length .byte 2 ; speed .byte 13,12,77,8,0,8,0,4,0,4,0,1,0,1,0,13,12,77,9,0,9,0,6,0,70,1,0,1,0,13,12,77,8,0,8,0,4,0,4,0,1,0,1,0,8,6,4,3,1,3,4,1,4,6,72,64,79,13,15,11,15,10,15,8,15,15,0,15,0,15,0,79,13,15,11,15,10,15,8,15,15,0,15,0,15,0,8,6,4,3,1,3,4,1,4,6,129 lied15: .byte 65 ; length .byte 2 ; speed .byte 15,16,15,16,15,16,15,16,15,15,16,17,18,19,20,84,128,84,128,87,64,77,64,84,128,84,128,82,64,83,64,84,128,84,128,87,64,77,64,84,128,84,128,82,64,83,64,87,84,207,207,0,87,84,206,206,0,87,84,205,205,64,75,77