; ; morse.i ; ; ; Macro to convert ascii strings and numbers to encoded morse code data. ; Uses macro recursion. ; morsedata macro ; opcode,arg1,arg2,... if isstr(\2) morse_string \1,\2,0 else if streq("\2","") exitm endif morsechar \1,\2 endif morsedata \1,\3,\4,\5,\6,\7,\8,\9 endm ; ; This macro converts strings to morse code. ; Called from the morsedata macro. ; Also recursive. ; morse_string macro ;string, startpos if chrval(\2,\3) >= 0 morsechar \1,chrval(\2,\3) morse_string \1,\2,\3+1 endif endm ; ; a big macro to convert one character of ; ASCII to morse code at assembly time ; ; zero bit represents a dot, and one bit represents a dash. ; the code is right-justified inside a byte, and is preceeded ; by a start bit of one (and padded with zero bits). ; morsechar macro ; opcode,asciicode if (\2 == 32) \1 0xff ;special code for space exitm endif if (\2 == '"') \1 1010010b ; .-..-. exitm endif if (\2 == '(') \1 1101101b ; -.--.- exitm endif if (\2 == ')') \1 1101101b ; -.--.- exitm endif if (\2 == ',') \1 1110011b ; --..-- exitm endif if (\2 == '-') \1 1100001b ; -....- exitm endif if (\2 == '.') \1 1101010b ; -.-.-. exitm endif if (\2 == '/') \1 110010b ; -..-. exitm endif if (\2 == '0') \1 111111b ; ----- exitm endif if (\2 == '1') \1 101111b ; .---- exitm endif if (\2 == '2') \1 100111b ; ..--- exitm endif if (\2 == '3') \1 100011b ; ...-- exitm endif if (\2 == '4') \1 100001b ; ....- exitm endif if (\2 == '5') \1 100000b ; ..... exitm endif if (\2 == '6') \1 110000b ; -.... exitm endif if (\2 == '7') \1 111000b ; --... exitm endif if (\2 == '8') \1 111100b ; ---.. exitm endif if (\2 == '9') \1 111110b ; ----. exitm endif if (\2 == ':') \1 1111000b ; ---... exitm endif if (\2 == '=') \1 110001b ; -...- exitm endif if (\2 == '?') \1 1001100b ; ..--.. exitm endif if (\2 == 'A') | (\2 == 'a') \1 101b ; .- exitm endif if (\2 == 'B') | (\2 == 'b') \1 11000b ; -... exitm endif if (\2 == 'C') | (\2 == 'c') \1 11010b ; -.-. exitm endif if (\2 == 'D') | (\2 == 'd') \1 1100b ; -.. exitm endif if (\2 == 'E') | (\2 == 'e') \1 10b ; . exitm endif if (\2 == 'F') | (\2 == 'f') \1 10010b ; ..-. exitm endif if (\2 == 'G') | (\2 == 'g') \1 1110b ; --. exitm endif if (\2 == 'H') | (\2 == 'h') \1 10000b ; .... exitm endif if (\2 == 'I') | (\2 == 'i') \1 100b ; .. exitm endif if (\2 == 'J') | (\2 == 'j') \1 10111b ; .--- exitm endif if (\2 == 'K') | (\2 == 'k') \1 1101b ; -.- exitm endif if (\2 == 'L') | (\2 == 'l') \1 10100b ; .-.. exitm endif if (\2 == 'M') | (\2 == 'm') \1 111b ; -- exitm endif if (\2 == 'N') | (\2 == 'n') \1 110b ; -. exitm endif if (\2 == 'O') | (\2 == 'o') \1 1111b ; --- exitm endif if (\2 == 'P') | (\2 == 'p') \1 10110b ; .--. exitm endif if (\2 == 'Q') | (\2 == 'q') \1 11101b ; --.- exitm endif if (\2 == 'R') | (\2 == 'r') \1 1010b ; .-. exitm endif if (\2 == 'S') | (\2 == 's') \1 1000b ; ... exitm endif if (\2 == 'T') | (\2 == 't') \1 11b ; - exitm endif if (\2 == 'U') | (\2 == 'u') \1 1001b ; ..- exitm endif if (\2 == 'V') | (\2 == 'v') \1 10001b ; ...- exitm endif if (\2 == 'W') | (\2 == 'w') \1 1011b ; .-- exitm endif if (\2 == 'X') | (\2 == 'x') \1 11001b ; -..- exitm endif if (\2 == 'Y') | (\2 == 'y') \1 11011b ; -.-- exitm endif if (\2 == 'Z') | (\2 == 'z') \1 11100b ; --.. exitm endif ~ ;Error: Character not in morse code table! endm ; end of morsechar macro