Skip to content

Instantly share code, notes, and snippets.

@gusaa960
Last active April 27, 2017 11:10
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save gusaa960/86c4675ccdafade241036bf8311d2630 to your computer and use it in GitHub Desktop.
Save gusaa960/86c4675ccdafade241036bf8311d2630 to your computer and use it in GitHub Desktop.
LE LABB 2
;
; Labb2.asm
;
; Created: 2017-04-24 16:18:25
; Author : Gustav Aaro
;
; Replace with your application code
.def currentChar = r21
.def morseCurrentChar = r22
.def zeroreg = r18
.def onereg = r19
.def currentLength = r25
.equ PITCH = 30 ; ca 500 hz, T = 2ms
.equ SPEED = 250 ; N = 0.5s
MESSAGE:
.db " DATORTEKNIK", 0
start:
ldi morseCurrentChar, 0
ldi zeroreg, 0
ldi onereg, 1
ldi r16,HIGH(RAMEND) ; Setup stack
out SPH,r16
ldi r16,LOW(RAMEND)
out SPL,r16
call INIT ; Setup output port
ldi ZH,HIGH((MESSAGE)*2)
ldi ZL,LOW((MESSAGE)*2)
GET_CHAR:
lpm currentChar, Z+ ; Load currentChar from Z-register. ASCII-value
cpi currentChar, $20 ;Check if space
breq SPACE ; If space, handle it
call LOOKUP
; Beeps one character in message
BEEP_CHAR:
lsl morseCurrentChar ;
breq END_OF_CHAR
brcs LONG_BEEP
; Beeps one short beep
SHORT_BEEP:
ldi currentLength, 1
call BEEP
jmp SPACE_BETWEEN_BITS
; Beeps one long beep
LONG_BEEP:
ldi currentLength, 3
call BEEP
jmp SPACE_BETWEEN_BITS
; Silent for one N between beeps
SPACE_BETWEEN_BITS:
ldi currentLength, 1
call NOBEEP
jmp BEEP_CHAR
; Silent for two extra periods to mark end of character
END_OF_CHAR:
ldi currentLength, 2
call NOBEEP
jmp GET_CHAR
; Silent for 7 periods for space
SPACE:
ldi currentLength, 7
call NOBEEP
jmp GET_CHAR
; Lookup of morse-value in hex for currentChar
LOOKUP:
push ZL
push ZH
ldi ZL, LOW(BTAB*2)
ldi ZH, HIGH(BTAB*2)
subi currentChar, $41 ; Accounts for ASCII-value offset
sbci currentChar, 0
add ZL, currentChar ; Offsets the Z-pointer to the position of our morse-value
adc ZH, zeroreg
lpm morseCurrentChar, Z
pop ZH
pop ZL
ret
NOBEEP:
call CONFIG_BEEP_LOOP
NOBEEP_LOOP:
out PORTB, zeroreg
call DELAYHALFT
call DELAYHALFT
subi XL, 1
sbc XH, zeroreg
brne NOBEEP_LOOP
ret
BEEP:
call CONFIG_BEEP_LOOP
BEEP_LOOP:
out PORTB, onereg
call DELAYHALFT
out PORTB, zeroreg
call DELAYHALFT
subi XL, 1
sbc XH, zeroreg
brne BEEP_LOOP
ret
; Sets the number of times to run the beeps, tailored to the hardware
CONFIG_BEEP_LOOP:
ldi r16, SPEED
mul r16, currentLength
mov XL, r0
mov XH, r1
ret
DELAYHALFT:
ldi r16,PITCH
OUTER:
ldi r17,0
INNER:
dec r17
brne INNER
dec r16
brne OUTER
ret
INIT:
ldi r16, $FF
out DDRB, r16 ; Set PORTB as output port
ret
.org $100 ; => Tabellen börjar på 60 eller ascii-värdet + 20
BTAB:
; .db $FC, $7C, $3C, $1C, $0C, $04, $84, $C4, $E4, $F4, $00, $00, $00, $00, $00, $00, $00, $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, $58, $E8, $6C, $00
.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, 0
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment