; ; AssemblerApplication1.asm ; ; Created: 2025-11-19 09:45:59 ; Author : alvka474 ; ; Replace with your application code ldi r16, HIGH(RAMEND) out SPH, r16 ldi r16, LOW(RAMEND) out SPL, r16 .equ T = 40 call MORSE ;;;;;;;;;;;;;;;;; NOBEEP: ; set r18 to 1 to signal no beep ldi r18, 1 call BEEP ldi r18, 0 ret BEEP: ; beep i r16*T tidsenheter push r17 BEEP_OUTER: ldi r17, T BEEP_INNER: cpi r18, 1 ; om r18 == 1 breq SKIP_BEEP sbi PORTD, 7 SKIP_BEEP: call DELAY cbi PORTD, 7 call DELAY dec r17 brne BEEP_INNER dec r16 brne BEEP_OUTER pop r17 ret ;;;;,;;;;;;;;;;;;;;; FANGA: rjmp FANGA ;;;;;;;;;;;;;;;;;;;;; GET_CHAR: ; get next ASCII char to r16 lpm r16, Z+ cpi r16, 0 breq FANGA ret ;;;;;;;;;;;; MORSE: call INIT call GET_CHAR call SEND_IT ;;;;;;;;;;;;; SEND_IT: call ONE_CHAR rjmp SEND_IT ;;;;;;;;;;;;;;;; ONE_CHAR: call BEEP_CHAR call GET_CHAR ret ;;;;;;;;;;;;;;;;;;;;;;;;;;; BEEP_CHAR: call MELLANSLAG ldi r16, 2 call NOBEEP breq END rjmp BEEP_CHAR END: ret ;;;;;;;;; BEEP_LETTER: call LOOKUP mov r20, r16 call SEND ret ;;;;;;;;;;; MELLANSLAG: cpi r16, $20 breq JA ; vi har mellansla brne NO ; inte mellanslag NO: rjmp BEEP_LETTER JA: push r16 ldi r16, 7 call NOBEEP pop r16 ret ;;;;;;;;;;;;;;;;;;;;;;;;; SEND: call GET_BIT call SEND_BITS ret ;;;;;;;;;;;;; SEND_BITS: call BIT brne SEND_BITS ret ;;;;;;;;;;;;; BIT: ldi r16, 3 brcs MAKE_LONG ldi r16, 1 MAKE_LONG: call BEEP ldi r16, 1 call NOBEEP call GET_BIT ret ;;;;;;;;;;;;;;;;;; GET_BIT: ; set flags for sending lsl r20 ret ;;;;;;;;;;;;;;;;;;;;;;;;;;; DELAY: ; 1000 us push r18 ldi r19, 10 DELAY_YTTRE: ldi r18,$1f DELAY_INRE: dec r18 brne DELAY_INRE dec r19 brne DELAY_YTTRE pop r18 ret ;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;; LOOKUP: ; r16 är ASCII returnera morse push ZH push ZL push r17 ldi ZH, HIGH(MORSE_TABLE*2) ldi ZL, LOW(MORSE_TABLE*2) ldi r17, $41 sub r16, r17; subtract A from ASCII to get indexing hex ADD ZL, r16 ADC ZH, zero lpm r16, Z pop r17 pop ZL pop ZH ret ;;;;;;;;;;;;;; INIT: ldi r18, 0 ; set r18 to zero to allow beeping ldi ZH, HIGH(MESSAGE*2) ldi ZL, LOW(MESSAGE*2) .def zero = r2 clr r2 INIT_HARDWARE: ldi r16, $ff out DDRD, r16 ret ;;;;;;;;;;;;;;; MESSAGE: .db "SOS", $00 MORSE_TABLE: .db $60,$88,$A8,$90,$40,$28,$D0,$08,$20,$78,$B0,$48,$E0,$A0,$F0,$68,$D8,$50,$10,$C0,$30,$18,$70,$98,$B8