home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / SIMTEL / CPMUG / CPMUG041.ARK / PRACTICE.ASM < prev    next >
Assembly Source File  |  1984-04-29  |  7KB  |  298 lines

  1. ;    FILE NAME:    PRACTICE.ASM
  2. ;    VERSION #:    1.01
  3. ;    PROGRAMMED BY:    JAMES K. MILLS
  4. ;
  5. ;    PURPOSE:    A PROGRAM TO TRANSMIT CP/M TEXT FILES
  6. ;            IN MORSE CODE FOR AMATEUR RADIO CODE 
  7. ;            PRACTICE PURPOSES.
  8. ;
  9. ;    COMMENTS:    THIS PROGRAM MUST BE ASSEMBLED UNDER
  10. ;            MAC (CP/M AND MAC ARE TRADEMARKS OF
  11. ;            DIGITAL RESEARCH).  IF YOU FIND BUGS
  12. ;            OR MAKE IMPROVEMENTS, PLEASE SEND ME
  13. ;            A NOTE DESCRIBING THEM:
  14. ;                James K. Mills WB9KFP
  15. ;                P.O. BOX 94864
  16. ;                Schaumburg, IL  60194
  17. ;            THANK YOU.
  18. ;
  19. ;    REVISION HISTORY
  20. ;    ----------------
  21. ;
  22. ;    09/22/79    INITIAL VERSION WITH CONCEPTS STOLEN
  23. ;            FROM BOB VAN VALZAH'S "TEACH" PROGRAM
  24. ;    11/26/79 - ADDED ADM-3A USAGE OF CONTROL-G 
  25. ;    TO SEND CODE.
  26. ;
  27. MACLIB    SEQIO    ;GET THE SEQIO MACRO LIBRARY
  28. ;
  29. ;    ASSEMBLY CONSTANTS
  30. ;
  31. TITLE    'MORSE CODE PRACTICE PROGRAM'
  32. PAGE    56
  33. ;
  34. FALSE    EQU    0
  35. TRUE    EQU    NOT FALSE
  36. SHERWD    EQU    FALSE
  37. ADM    EQU    TRUE
  38. PMMI    EQU    FALSE
  39. ;
  40. ABORT    EQU    3    ;ABORT KEY IS ^C
  41. BOOT    EQU    0    ;RETURN POINT FOR CP/M WARMBOOT
  42. BDOS    EQU    5    ;BDOS ENTRY POINT
  43. PORT    EQU    5    ;CONSOLE DATA PORT
  44. PRINT    EQU    9    ;PRINT BUFFER TO CONSOLE
  45. ;
  46. IF    SHERWD
  47. SCREECH    EQU    203    ;OUTPUT PORT FOR SHERWOOD
  48. ENDIF
  49. ;
  50. IF    PMMI
  51.     BASE    EQU    0F0H    ;BASE ADDRESS OF PMMI
  52.     PMMI0    EQU    BASE
  53.     PMMI1    EQU    BASE+1
  54.     PMMI2    EQU    BASE+2
  55.     PMMI3    EQU    BASE+3
  56.     SCREECH    EQU    PMMI0
  57. ENDIF
  58. ;
  59. ;***************
  60. ;* GLOBAL DATA *
  61. ;***************
  62. ;
  63. FREQ    EQU    2000    ;MACHINE CYCLES PER MILLISECOND
  64. WPM    EQU    20    ;DEFAULT CHARACTER TRANSMISSION SPEED
  65. ;
  66.     ORG    100H
  67. ;
  68. ;
  69. ;***************************
  70. ;* BEGIN PROGRAM OPERATION *
  71. ;***************************
  72. ;
  73. SIGNON:    LXI    D,MSG    ;PROGRAM SIGN-ON MESSAGE
  74.     MVI    C,PRINT    ;GET READY
  75.     CALL    BDOS    ;GO
  76. ;
  77. GETRDY:    CALL    INIT    ;INITIALIZE SHERWOOD FRONT PANEL
  78. ;
  79. FILE    INFILE,SOURCE,,1,,
  80. START:    GET    SOURCE
  81.     CPI    26    ;IS IT END-OF-FILE (^Z)?
  82.     JZ    BOOT    ;IF SO, BACK TO CP/M
  83.     CPI    22    ;DOUBLE-QUOTES?
  84.     JZ    START    ;IF SO, GET NEXT CHARACTER
  85.     PUT    CON    ;SEND TO CONSOLE
  86.     CPI    10    ;IS IT A LINE FEED?
  87.     JZ    START    ;IF SO, GET NEXT CHARACTER
  88.     CPI    13    ;IS IT A <CR>?
  89.     JZ    SPACE    ;IF SO, SEND A SPACE
  90.     CPI    32    ;IS IT A SPACE?
  91.     JZ    SPACE    ;IF SO, WAIT 1 SPACE
  92.     SUI    ' '    ;SUBRACT VALUE OF "SPACE"
  93.     MOV    C,A    ;MOVE "INDEX" TO C-REGISTER
  94.     MVI    B,0    ;PUT 0 IN HIGH-ORDER BYTE
  95.     LXI    H,MORSE    ;ADDRESS OF CONVERSION TABLE
  96.     DAD    B    ;MOVE TO OUR CHARACTER
  97.     MOV    A,M    ;PUT IT IN ACCUMULATOR
  98. SEND:    CPI    80H    ;SHOULD WE IGNORE THE CHARACTER?
  99.     JZ    START    ;IF SO, GET NEXT CHARACTER
  100.     ANA    A    ;SET CARRY FLAG TO ZERO
  101. SEN1:    RAL        ;PUT MORSE BIT INTO CARRYFLAG
  102.     MOV    B,A    ;BETTER SAVE THE CHARACTER INDEX
  103.     MVI    C,1200/WPM    ;ONE DIT TIME IN MSEC
  104.     JNC    SEN2    ;IT'S A DIT -- SEND IT
  105.     MVI    C,3*1200/WPM    ;ONE DAH TIME IN MSEC
  106. SEN2:    ANA    A    ;IS ACCUMULATOR ZERO?
  107.     JZ    INTER    ;YEP--THAT LAST ONE WAS STOPBIT
  108.     CALL    BEEP    ;TELL ME ABOUT IT
  109.     MVI    C,1200/WPM    ;INTER-BIT SPACE
  110.     CALL    WAIT    ;DELAY TIL READY FOR NEXT MORSE BIT
  111.     MOV    A,B    ;BETTER RESTORE CHARACTER INDEX
  112.     JMP    SEN1    ;LOOP FOR REMAINING MORSE BITS
  113. WAIT:    MVI    A,FREQ/16
  114. WAI1:    DCR    A
  115.     JNZ    WAI1    ;LOOP FOR A MSEC
  116.     DCR    C
  117.     JNZ    WAIT    ;MORE WAITING
  118.     RET
  119. BEEP:    IF    SHERWD
  120.     MVI    A,20H
  121.     OUT    SCREECH    ;TONE ON
  122.     ENDIF
  123.     IF    ADM
  124.     MVI    A,7
  125.     OUT    PORT
  126.     ENDIF
  127. BEE0:    MVI    B,FREQ/16/2
  128. BEE1:    DCR    B
  129.     IF    ADM
  130.     MVI    A,7
  131.     OUT    PORT
  132.     ENDIF
  133.     JNZ    BEE1    ;LOOP 1/2 MSEC
  134. BEE2:    MVI    B,FREQ/16/2
  135. BEE3:    DCR    B
  136.     IF    ADM
  137.     MVI    A,7
  138.     OUT    PORT
  139.     ENDIF
  140.     JNZ    BEE3    ;OH I WONDER WONDER WONDER
  141.     DCR    C
  142.     JNZ    BEE0    ;SCREECH ON!
  143.     IF    SHERWD
  144.     MVI    A,255
  145.     OUT    SCREECH    ;STOP, IT ALREADY!
  146.     ENDIF
  147.     IF    ADM
  148.     MVI    A,0
  149.     OUT    PORT
  150.     ENDIF
  151.     RET
  152. INTER:    MVI    C,3*1200/WPM
  153.     CALL    WAIT
  154.     IN    PORT        ;SCAN FOR KBD DATA
  155.     CPI    ABORT        ;CHECK FOR ^C
  156.     JZ    BOOT        ;IF SO, EXIT PROGRAM
  157.     JMP    START
  158. SPACE:    MVI    C,1200/WPM    ;ONE DIT TIME
  159.     CALL    WAIT
  160.     MVI    C,3*1200/WPM    ;+ ONE DAH TIME
  161.     CALL    WAIT
  162.     MVI    C,3*1200/WPM    ;+ ONE MORE = 7
  163.     CALL    WAIT        ;7*1200/WPM IS TOO BIG A NUMBER
  164.     JMP    START
  165. ;
  166. ;*********************
  167. ;* SUBROUTINE PRESET *
  168. ;*********************
  169. ;
  170. ;INITIALIZE I/O
  171. ;
  172. INIT:
  173. IF    SHERWD
  174.     XRA    A    ;INIT FRONT PANEL PIA
  175.     OUT    200
  176.     OUT    202
  177.     CMA
  178.     OUT    201
  179.     OUT    203
  180.     MVI    A,4
  181.     OUT    200
  182.     OUT    202
  183.     MVI    A,10H
  184.     OUT    203    ;INITIALLY TURN OFF TONE
  185.     RET
  186. ENDIF
  187. ;
  188. IF    PMMI
  189.     RET
  190. ENDIF
  191. ;
  192. ;*************************
  193. ;* CHARACTER CODE TABLES *
  194. ;*************************
  195. ;
  196. MORSE    DB    080H    ;  = 1000 0000 = SPACE
  197.     DB    056H    ;  = 0101 0110 = EXCLAMATION POINT
  198.     DB    080H    ;  = 1000 0000 = DOUBLE QUOTE
  199.     DB    080H    ;  = 1000 0000 = CROSS-HATCH
  200.     DB    080H    ;  = 1000 0000 = DOLLAR-SIGN
  201.     DB    080H    ;  = 1000 0000 = PERCENT-SIGN
  202.     DB    080H    ;  = 1000 0000 = AMPERSAND
  203.     DB    080H    ;  = 1000 0000 = APOSTROPHE
  204.     DB    0B6H    ;( = 1011 0110 = DAH-DI-DAH-DAH-DI-DAH
  205.     DB    0B6H    ;) = 1011 0110 = DAH-DI-DAH-DAH-DI-DAH
  206.     DB    080H    ;  = 1000 0000 = ASTERISK
  207.     DB    080H    ;  = 1000 0000 = PLUS-SIGN
  208.     DB    0CEH    ;, = 1000 0000 = COMMA
  209.     DB    08CH    ;- = 1000 1100 = DAH-DI-DI-DI-DAH
  210.     DB    056H    ;. = 0101 0110 = DI-DAH-DI-DAH-DI-DAH
  211.     DB    094H    ;/ = 1001 0100 = DAH-DI-DI-DAH-DIT
  212.     DB    0FCH    ;0 = 1111 1100 = DAH-DAH-DAH-DAH-DAH
  213.     DB    07CH    ;1 = 0111 1100 = DI-DAH-DAH-DAH-DAH
  214.     DB    03CH    ;2 = 0011 1100 = DI-DI-DAH-DAH-DAH
  215.     DB    01CH    ;3 = 0001 1100 = DI-DI-DI-DAH-DAH
  216.     DB    00CH    ;4 = 0000 1100 = DI-DI-DI-DI-DAH
  217.     DB    004H    ;5 = 0000 0100 = DI-DI-DI-DI-DIT
  218.     DB    084H    ;6 = 1000 0100 = DAH-DI-DI-DI-DIT
  219.     DB    0C4H    ;7 = 1100 0100 = DAH-DAH-DI-DI-DIT
  220.     DB    0E4H    ;8 = 1110 0100 = DAH-DAH-DAH-DI-DIT
  221.     DB    0F4H    ;9 = 1111 0100 = DAH-DAH-DAH-DAH-DIT
  222.     DB    080H    ;  = 1000 0000 = COLON
  223.     DB    080H    ;  = 1000 0000 = SEMI-COLON
  224.     DB    080H    ;  = 1000 0000 = LEFT ARROW
  225.     DB    080H    ;  = 1000 0000 = EQUALS-SIGN
  226.     DB    080H    ;  = 1000 0000 = RIGHT ARROW
  227.     DB    032H    ;? = 0011 0010 = DI-DI-DAH-DAH-DI-DIT
  228.     DB    080H    ;  = 1000 0000 = AT-SIGN
  229.     DB    060H    ;A = 0110 0000 = DI-DAH
  230.     DB    088H    ;B = 1000 1000 = DAH-DI-DI-DIT
  231.     DB    0A8H    ;C = 1010 1000 = DAH-DI-DAH-DIT
  232.     DB    090H    ;D = 1001 0000 = DAH-DI-DIT
  233.     DB    040H    ;E = 0100 0000 = DIT
  234.     DB    028H    ;F = 0010 1000 = DI-DI-DAH-DIT
  235.     DB    0D0H    ;G = 1101 0000 = DAH-DAH-DIT
  236.     DB    008H    ;H = 0000 1000 = DI-DI-DI-DIT
  237.     DB    020H    ;I = 0010 0000 = DI-DIT
  238.     DB    078H    ;J = 0111 1000 = DI-DAH-DAH-DAH
  239.     DB    0B0H    ;K = 1011 0000 = DAH-DI-DAH
  240.     DB    048H    ;L = 0100 1000 = DI-DAH-DI-DIT
  241.     DB    0E0H    ;M = 1110 0000 = DAH-DAH
  242.     DB    0A0H    ;N = 1010 0000 = DAH-DIT
  243.     DB    0F0H    ;O = 1111 0000 = DAH-DAH-DAH
  244.     DB    068H    ;P = 0110 1000 = DI-DAH-DAH-DIT
  245.     DB    0D8H    ;Q = 1101 1000 = DAH-DAH-DI-DAH
  246.     DB    050H    ;R = 0101 0000 = DI-DAH-DIT
  247.     DB    010H    ;S = 0001 0000 = DI-DI-DIT
  248.     DB    0C0H    ;T = 1100 0000 = DAH
  249.     DB    030H    ;U = 0011 0000 = DI-DI-DAH
  250.     DB    018H    ;V = 0001 1000 = DI-DI-DI-DAH
  251.     DB    070H    ;W = 0111 0000 = DI-DAH-DAH
  252.     DB    098H    ;X = 1001 1000 = DAH-DI-DI-DAH
  253.     DB    0B8H    ;Y = 1101 1000 = DAH-DAH-DI-DAH
  254.     DB    0C8H    ;Z = 1100 1000 = DAH-DAH-DI-DIT
  255.     DB    0B6H    ;[ = 1011 0110 = DAH-DI-DAH-DAH-DI-DAH
  256.     DB    094H    ;\ = 1001 0100 = DAH-DI-DI-DAH-DIT
  257.     DB    0B6H    ;] = 1011 0110 = DAH-DI-DAH-DAH-DI-DAH
  258.     DB    080H    ;^ = 1000 0000 = UP-ARROW
  259.     DB    080H    ;  = 1000 0000 = IGNORE IT
  260.     DB    080H    ;  = 1000 0000 = IGNORE IT
  261.     DB    060H    ;a
  262.     DB    088H    ;b
  263.     DB    0A8H    ;c
  264.     DB    090H    ;d
  265.     DB    040H    ;e
  266.     DB    028H    ;f
  267.     DB    0D0H    ;g
  268.     DB    008H    ;h
  269.     DB    020H    ;i
  270.     DB    078H    ;j
  271.     DB    0B0H    ;k
  272.     DB    048H    ;l
  273.     DB    0E0H    ;m
  274.     DB    0A0H    ;n
  275.     DB    0F0H    ;o
  276.     DB    068H    ;p
  277.     DB    0D8H    ;q
  278.     DB    050H    ;r
  279.     DB    010H    ;s
  280.     DB    0C0H    ;t
  281.     DB    030H    ;u
  282.     DB    018H    ;v
  283.     DB    070H    ;w
  284.     DB    098H    ;x
  285.     DB    0B8H    ;y
  286.     DB    0C8H    ;z
  287.     DB    0B6H    ;{
  288.     DB    080H    ;|
  289.     DB    0B6H    ;}
  290.     DB    080H    ;~
  291.     DB    080H    ;DEL
  292. ;
  293. ;
  294. MSG:    DB    26,0,'MORSE CODE PRACTICE PROGRAM VERSION 1.01',13,10
  295.     DB    'WRITTEN BY JAMES K. MILLS WB9KFP',13,10,'$'
  296. BUFFERS:
  297.     END
  298.