MORSE.ASM


1
tx_on  equ  p1.0
2
3
delay10ms  equ 10000  ;cycle count for 10msec delay at 12MHz
4
5
  dseg at 30h
6
speed:  ds 1
7
  cseg
8
9
10
init:  mov speed, #10    ;morse speed = 10 * 10msec
11
main:  acall morsestring
12
  db 'Hello World   '
13
  db 0      ;0 mark end of string
14
  sjmp main
15
16
signal_on:
17
  setb tx_on
18
  ret
19
20
signal_off:
21
  clr tx_on
22
  ret
23
24
25
morsestring:
26
  pop dph      ;get return address,
27
  pop dpl      ;point to string
28
  sjmp _mst2
29
_mst1:  acall morsechar    ;send byte
30
  inc dptr    ;point to next byte
31
_mst2:  clr a
32
  movc a, @a+dptr    ;get byte
33
  jnz _mst1    ;send if not 0
34
  jmp @a+dptr    ;jump after string
35
36
morsechar:
37
  acall morsetable  ;ascii to morse code
38
  setb c      ;acc = 00 after 9 shifts
39
_mch1:  rlc a
40
  jnc _mch1    ;search leading 1
41
  sjmp _mch4
42
_mch2:  acall signal_on
43
  jnc _mch3    ;if 0 then skip 2 times delay
44
  acall delay2    ;send 3 times: -
45
_mch3:  acall delay1    ;send 1 time : .
46
  acall signal_off
47
  acall delay1
48
_mch4:  add a, acc    ;shift left with always 0 into ACC.0
49
  jnz _mch2
50
;  ajmp delay2    ;pause 3 times until next char
51
52
delay2:  acall delay1
53
delay1:  mov r5, speed
54
_del1:
55
  mov r7, #high(delay10ms/2+253)  ;wait 10ms
56
  mov r6, #low(delay10ms/2-2)
57
_del2:  djnz r6, _del2
58
  djnz r7, _del2
59
60
  djnz r5, _del1
61
  ret
62
63
;**********************  convert ascii to morse code *********************
64
;
65
; Definition of morse code table:
66
; Since the length can be variable, all bits,
67
; until the 1. bit which was set, are skipped.
68
; Then all next bits are send:
69
; Bit = 0 was send as '.' and bit = 1 was send as '-'.
70
; Not translated codes are send as space
71
;
72
morsetable:
73
  add a, #-'Z'-1-5  ; <= 'Z'+5
74
  jnc _mta2
75
  add a, #'Z'-'z'    ; <= 'z'+5
76
  jnc _mta2
77
_mta1:  clr a      ;pause or not defined characters
78
  ret
79
_mta2:  add a, #'Z'+1+5-','  ; >= ','
80
  jnc _mta1
81
  inc a
82
  movc a, @a+pc
83
  ret
84
  db 01110011b    ;,: --..--
85
  db 0      ;not defined: 45
86
  db 01010101b    ;. = stop: .-.-.-
87
  db 0      ;not defined: 47
88
  db 00111111b    ;0: -----
89
  db 00101111b    ;1: .----
90
  db 00100111b    ;2: ..---
91
  db 00100011b    ;3: ...--
92
  db 00100001b    ;4: ....-
93
  db 00100000b    ;5: .....
94
  db 00110000b    ;6: -....
95
  db 00111000b    ;7: --...
96
  db 00111100b    ;8: ---..
97
  db 00111110b    ;9: ----.
98
  db 0, 0, 0, 0, 0  ;not defined: 58..62
99
  db 01001100b    ;?: ..--..
100
  db 0      ;not defined: 64, 96
101
  db 00000101b    ;a: .-
102
  db 00011000b    ;b: -...
103
  db 00011010b    ;c: -.-.
104
  db 00001100b    ;d: -..
105
  db 00000010b    ;e: .
106
  db 00010010b    ;f: ..-.
107
  db 00001110b    ;g: --.
108
  db 00010000b    ;h: ....
109
  db 00000100b    ;i: ..
110
  db 00010111b    ;j: .---
111
  db 00001101b    ;k: -.-
112
  db 00010100b    ;l: .-..
113
  db 00000111b    ;m: --
114
  db 00000110b    ;n: -.
115
  db 00001111b    ;o: ---
116
  db 00010110b    ;p: .--.
117
  db 00011101b    ;q: --.-
118
  db 00001010b    ;r: .-.
119
  db 00001000b    ;s: ...
120
  db 00000011b    ;t: -
121
  db 00001001b    ;u: ..-
122
  db 00010001b    ;v: ...-
123
  db 00001011b    ;w: .--
124
  db 00011001b    ;x: -..-
125
  db 00011011b    ;y: -.--
126
  db 00011100b    ;z: --..
127
  db 0, 0, 0, 0, 0  ;not defined: 91..95, 123..127
128
129
end