Last active
April 27, 2017 11:10
-
-
Save gusaa960/86c4675ccdafade241036bf8311d2630 to your computer and use it in GitHub Desktop.
LE LABB 2
This file contains 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
; | |
; 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