Created
November 20, 2024 19:35
-
-
Save xacrimon/f67d957b9db3c65c22c9ca930898b6a7 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
.equ N = 30 ; Antalet toncykler som utförs per morse-tidsenhet. | |
.equ T = 20 ; Cykeltiden på tonen, invers relation till frekvens. | |
ENTRYPOINT: | |
; Sätt stackregister | |
ldi r16, HIGH(RAMEND) | |
out SPH, r16 | |
ldi r16, LOW(RAMEND) | |
out SPL, r16 | |
; Sätt pin 7 på port B till output. | |
sbi DDRB, 7 | |
; Lets goooo | |
jmp MAIN | |
MESSAGE: | |
.db "D ATORTEKNIK", $00 | |
MORSE_TAB: | |
; A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z | |
.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, $C8 | |
GET_CHAR: | |
lpm r16, Z+ ; Ladda nästa bokstav från meddelandet till r16. | |
ret | |
LOOKUP: | |
; Spara Z då den används av GET_CHAR | |
push ZH | |
push ZL | |
; --- | |
; Sätt pekaren till arraybas + offset för tecknet. | |
subi r16, 'A' | |
mov ZL, r16 | |
clr ZH | |
subi ZL, LOW(-MORSE_TAB*2) | |
sbci ZH, HIGH(-MORSE_TAB*2) | |
; -- | |
lpm r16, Z ; Ladda tabellvärdet (dvs morsekoden) till r16. | |
; Återställ Z | |
POP ZL | |
POP ZH | |
; --- | |
ret | |
DELAY: | |
push r17 | |
push r18 | |
sbi PORTD, 7 | |
delayYttreLoop: | |
ldi r17, $1F ;1F | |
delayInreLoop: | |
dec r17 | |
brne delayInreLoop | |
dec r18 ; Modifiera denna fˆr hur lÂng delay ska vara | |
brne delayYttreLoop | |
cbi PORTD, 7 | |
pop r18 | |
pop r17 | |
ret | |
SILENCE_BIT_CYCLE: ; Mellan varje noll-ett steg i BEEP inuti en character. T/2 för att den körs två gånger per toncykel. | |
push r18 | |
ldi r18, T/2 | |
call DELAY | |
pop r18 | |
ret | |
SILENCE_BETWEEN_BIT: ; Delay mellan bitar. | |
push r18 | |
push r19 | |
ldi r19, N | |
jmp SILENCE_impl | |
SILENCE_CHAR: ; Delay i slutet på en bokstav. Ska vara 3 tidsenheter där men här körs två då en körs av SILENCE_BETWEEN_BIT. | |
push r18 | |
push r19 | |
ldi r19, N*2 | |
jmp SILENCE_impl | |
SILENCE_SPACE: ; Delay för mellanslag, sju tidsenheter. | |
push r18 | |
push r19 | |
ldi r19, N*7 | |
jmp SILENCE_impl | |
SILENCE_impl: | |
ldi r18, T | |
call DELAY | |
dec r19 | |
brne SILENCE_impl | |
pop r19 | |
pop r18 | |
ret | |
GET_SIGNAL: | |
lsl r16 ; Shifta av en bit in i carryn, indikerar om lång eller kort beep. | |
brcs CARRY_F | |
ldi r17, $00 ; Carry är noll, måste vara en kort beep. | |
jmp GET_SIGNAL_ret | |
CARRY_F: ; Carry är 1, kontrollera om R16 är tom | |
cpi r16, $00 | |
breq GET_SIGNAL_end | |
ldi r17, $01 ; Finns bitar kvar i strängen | |
jmp GET_SIGNAL_ret | |
GET_SIGNAL_end: ; Tom sträng med 1:a i carry | |
ldi r17, $02 | |
GET_SIGNAL_ret: | |
ret | |
BEEP: ; Kolla r17 för vilken signal som ska skickas | |
sbrs r17, 0 | |
jmp BEEP_KORT | |
jmp BEEP_LANG | |
BEEP_kort: | |
ldi r19, N | |
jmp BEEP_send | |
BEEP_lang: | |
ldi r19, N*3 | |
jmp BEEP_send | |
BEEP_send: | |
sbi PORTB, 7 | |
call SILENCE_BIT_CYCLE | |
cbi PORTB, 7 | |
call SILENCE_BIT_CYCLE | |
dec r19 | |
brne BEEP_send | |
ret | |
SEND_BITS: ;loopa tills r16 ‰r tom och carryn ‰r en 1:a. | |
call GET_SIGNAL | |
sbrs r17, 1 | |
call BEEP | |
call SILENCE_BETWEEN_BIT | |
ret | |
SEND: | |
call SEND_BITS | |
sbrs r17, 1 | |
jmp SEND | |
call SILENCE_CHAR | |
ret | |
BEEP_CHAR: | |
; $20 ‰r mellansla, j‰mfˆr r16 med detta innan man gÂr vidare | |
cpi r16, $20 ; ASCII värde för mellanslag. | |
breq BEEP_CHAR_space | |
call LOOKUP ; R16 innehÂller korrekt Hexadeciamlt v‰rde | |
call SEND | |
jmp BEEP_CHAR_end | |
BEEP_CHAR_space: | |
call SILENCE_SPACE | |
BEEP_CHAR_end: | |
ret | |
SEND_IT: | |
call BEEP_CHAR | |
call GET_CHAR | |
cpi r16, $00 | |
brne SEND_IT | |
ret | |
MORSE: | |
; Initiera Z till början av meddelandet för GET_CHAR. | |
ldi ZH, HIGH(MESSAGE*2) | |
ldi ZL, LOW(MESSAGE*2) | |
call GET_CHAR; | |
call SEND_IT; | |
ret | |
MAIN: | |
call MORSE | |
jmp MAIN |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment