Skip to content

Instantly share code, notes, and snippets.

@xacrimon
Created November 20, 2024 19:35
Show Gist options
  • Save xacrimon/f67d957b9db3c65c22c9ca930898b6a7 to your computer and use it in GitHub Desktop.
Save xacrimon/f67d957b9db3c65c22c9ca930898b6a7 to your computer and use it in GitHub Desktop.
.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