home *** CD-ROM | disk | FTP | other *** search
/ HAM Radio 1 / HamRadio.cdr / cw / morscom1 / morscom1.asm next >
Assembly Source File  |  1988-01-04  |  9KB  |  345 lines

  1. ;
  2. ;
  3. ;  MORSCOM1.ASM
  4. ;
  5. ;
  6. ;  Written by:      Bob Gallagher, Jr.
  7. ;  Last Revised:    15:37:39  1/4/1988
  8. ;
  9. ;
  10.  
  11. DSEG    SEGMENT PUBLIC 'DSEG'
  12.  
  13. ;------------------------------------------------------------------
  14. ;-------------------- EQUATES BELOW -------------------------------
  15. ;------------------------------------------------------------------
  16.  
  17.  
  18. EOL     EQU     0
  19. EOM     EQU     255
  20. CR      EQU     13
  21. LF      EQU     10
  22. DOS     EQU     21h
  23. VIDEO   EQU     10h
  24.  
  25.  
  26. ; ---------------------------------------------------------------------
  27. ;----------------------- DATA BELOW -----------------------------------
  28. ;----------------------------------------------------------------------
  29.  
  30. MESG  db CR,LF,LF,"Morse Code from COM1",CR,LF
  31.       db "Written by:   Bob Gallagher, Jr.",CR,LF
  32.       db "  (Press ESC to quit)",LF,LF,'$'
  33.  
  34.  
  35. BAUDMSB  DW  3F9H
  36. BAUDLSB  DW  3F8H
  37. MODSTS   DW  3FEH
  38. MODCTL   DW  3FCH
  39. LINCTL   DW  3FBH
  40. LINSTS   DW  3FDH
  41. DATAPORT DW  3F8H
  42. INTENBL  DW  3F9H
  43. INTID    DW  3FAH
  44. IRQMASK  DB  11101111B
  45. VECTOR   DB  0CH
  46.  
  47. TONESTATE DB 0        ; used by CHKPORT to see which way to flip
  48.  
  49.  
  50.  
  51.  
  52. ;------------------------------------------------------------------
  53. DSEG    ENDS
  54. CSEG SEGMENT PARA PUBLIC 'CODE'
  55.         ASSUME CS:CSEG,DS:DSEG,SS:DSEG,ES:NOTHING
  56. SHELL PROC NEAR
  57. S_BEGIN:
  58.         PUSH    ES
  59.         CALL    RUN_MODULE
  60. S_EXIT  PROC FAR
  61.         XOR     AX,AX           ; zero register
  62.         PUSH    AX              ; Put 0 return addr on stack
  63.         RET
  64. S_EXIT ENDP
  65. RUN_MODULE:
  66.         MOV     AX,DSEG
  67.         MOV     DS,AX
  68.         MOV     ES,AX
  69. ;---------------------------------------------------------------------
  70. ;--------------------- CODE  BELOW -----------------------------------
  71. ;----------------------------------------------------------------------
  72.  
  73.         call    CLS
  74.  
  75.         mov     DX,offset MESG
  76.         call    PRINT_STR
  77.  
  78.  
  79. ;----------- init port, raise DTR  -------------
  80.         mov     CX,60h
  81.         mov     BL,03H
  82.         call    INIT_PORT
  83.  
  84.  
  85. ;----------- check for escape ------------
  86. CHKESC:
  87.         call    CHECK_KEY
  88.         jnz     CE01
  89.         jmp     CHKPORT
  90. CE01:
  91.         call    GET_KEY
  92.         cmp     AL,27
  93.         jne     CHKPORT
  94.  
  95.         call    TONE_OFF  ; end program if ESC
  96.         ret
  97.  
  98. ;---------- check port ---------------
  99. CHKPORT:
  100.         mov     DX,MODSTS          ; check for carrier detect (CD)
  101.         in      AL,DX
  102.         and     AL,10000000b
  103.         cmp     AL,0
  104.         je      CP01
  105.  
  106.         cmp     TONESTATE,0        ; yes, CD active, check current state
  107.         je      CP03
  108.         jmp     CHKESC
  109. CP03:   call    TONE_ON
  110.         jmp     CHKESC
  111.  
  112. CP01:   cmp     TONESTATE,0        ; no CD, check current state
  113.         jne     CP02
  114.         jmp     CHKESC
  115. CP02:   call    TONE_OFF
  116.         jmp     CHKESC
  117.  
  118.  
  119. ;----------------------------------------------------------------------
  120. ;-------------------- SUBROUTINES  BELOW ------------------------------
  121. ;----------------------------------------------------------------------
  122.  
  123. TONE_ON PROC NEAR
  124.         mov     TONESTATE,1
  125.  
  126.         MOV     AL,0B6H         ; Timer mode register signal
  127.         OUT     67,AL
  128.  
  129.         MOV     AX,2711         ; Divisor for 440  (note A)
  130.         OUT     66,AL
  131.         MOV     AL,AH
  132.         OUT     66,AL
  133.  
  134.         IN      AL,97           ; Activate speaker
  135.         OR      AL,03
  136.         OUT     97,AL
  137.         ret
  138. TONE_ON ENDP
  139.  
  140.  
  141. TONE_OFF PROC NEAR
  142.         mov     TONESTATE,0
  143.  
  144.         MOV     AL,0B6H         ; Now turn it off
  145.         OUT     67,AL
  146.  
  147.         MOV     AX,2711
  148.         OUT     66,AL
  149.         MOV     AL,AH
  150.         OUT     66,AL
  151.  
  152.         IN      AL,97
  153.         AND     AL,11111100B
  154.         OUT     97,AL
  155.         ret
  156. TONE_OFF ENDP
  157.  
  158.  
  159.  
  160. ;----------------------------------------
  161. CHECK_KEY PROC NEAR
  162. ;
  163. ;       Entry:  none
  164. ;
  165. ;       Returns:        AX = 0  - no key
  166. ;                            1  - yes, key now ready
  167. ;
  168. ;       Also:    Zero flag set...use JZ test for no key.
  169. ;-----------------------------------------
  170.         MOV     AH,1
  171.         INT     16H
  172.         JZ      CK10
  173.  
  174.         MOV     AX,1
  175.         RET
  176.  
  177. CK10:   MOV     AX,0
  178.         RET
  179. CHECK_KEY ENDP
  180.  
  181.  
  182. ;------------------------------------------------------------------
  183. CLS PROC NEAR                            ; Clear Screen   (IBM Bios)
  184. ;
  185. ; Entries: None        ; NEW routine, clears the current screen
  186. ; Returns: None        ; regardless of the page
  187. ; Corrupts: None
  188. ;--------------------------------------------------------------------
  189.         PUSH    AX
  190.         PUSH    BX                       ; Preserve Registers
  191.         PUSH    CX
  192.         PUSH    DX
  193.                                     ; clear the current screen
  194.         SUB     CX,CX                    ; BH = Atribute (7)
  195.         MOV     BH,7                     ; CX = Upper Left
  196.         MOV     DX,184FH                 ; DX = Lower Right
  197.         MOV     AX,600H                  ; AH = Service #  6=scroll
  198.         INT     10H                      ; AL = # of lines (0=whole screen)
  199.  
  200.         MOV     AH,15       ; get cuurent page # into BH, read video status
  201.         INT     10h
  202.  
  203.         XOR     DX,DX                   ; Locate Cursor to 0,0
  204.         MOV     AH,2                    ; AH=Service #   2=move cursor
  205.         INT     10H                     ; BH = page #
  206.  
  207.         POP     DX                      ; Restore Registers
  208.         POP     CX
  209.         POP     BX
  210.         POP     AX
  211.         RET
  212. CLS ENDP
  213.  
  214.  
  215. ;-----------------------------------------------
  216. GET_KEY PROC NEAR       ; (use CHECK_KEY first)
  217. ;
  218. ;       Entry:  none
  219. ;
  220. ;       Returns:        AL - ASCII result
  221. ;                       AH - scan code
  222. ;
  223. ;-----------------------------------------------
  224.         MOV     AH,0
  225.         INT     16H
  226.         RET
  227. GET_KEY ENDP
  228.  
  229.  
  230.  
  231.  
  232.  
  233. ;------------------------------------------------------------
  234. INIT_PORT PROC NEAR              ; (IBM XT)
  235. ;
  236. ; Set baud rate, parity and word length.
  237. ; Also puts up DTR & RTS
  238. ;
  239. ; Entries:
  240. ;          CX- Baud Rate:      300   180H
  241. ;                             1200    60H
  242. ;                             2400    30H
  243. ;                             4800    18H
  244. ;                             9600    0CH
  245. ;                            19200     6H
  246. ;
  247. ;    BL- Parity & Word Length: 8,N  03H
  248. ;                              7,E  1AH
  249. ;
  250. ; Returns:   NONE
  251. ;
  252. ; Corrupts:  AX
  253. ;
  254. ;-----------------------------------------------------------------
  255.  
  256.   MOV   AL,00000011b       ; Put up DTR & RTS
  257.   MOV   DX,MODCTL
  258.   OUT   DX,AL
  259.  
  260.   MOV   AL,80H             ; Set Divisor Latch
  261.   MOV   DX,LINCTL
  262.   OUT   DX,AL
  263.  
  264.   MOV   AL,CH              ; Set Baud Rate
  265.   MOV   DX,BAUDMSB
  266.   OUT   DX,AL
  267.   MOV   AL,CL
  268.   MOV   DX,BAUDLSB
  269.   OUT   DX,AL
  270.  
  271.   MOV   AL,BL              ; Set Parity & Word Length
  272.   MOV   DX,LINCTL
  273.   OUT   DX,AL
  274.  
  275.   RET
  276. INIT_PORT ENDP
  277.  
  278.  
  279.  
  280. ;---------------------------------------------------------------------
  281. PRINT_STR PROC NEAR     ; Print a string in the data area to the screen.
  282. ;
  283. ; Entries:   Data offset in DX before call.
  284. ; Returns:   None
  285. ; Corrupts:  AX DX
  286. ;
  287. ; The data string must end in '$' as an end of line mark.
  288. ;----------------------------------------------------------------------
  289.                 MOV     AX,0
  290.                 MOV     AH,9H           ; Print a string in the data area
  291.                 INT     21H             ; string must end in '$'
  292.                 RET                     ; Data offset in DX before call.
  293. PRINT_STR ENDP
  294.  
  295.  
  296. ;--------------------------------------------------------
  297. SHORT_BEEP PROC NEAR     ; Makes a shorter beep.
  298. ;
  299. ;       Entries :  None
  300. ;       Returns :  None
  301. ;       Corrupts:  AX
  302. ;
  303. ;
  304. ;--------------------------------------------------------
  305.         MOV     AL,0B6H         ; Timer mode register signal
  306.         OUT     67,AL
  307.  
  308.         MOV     AX,2711         ; Divisor for 440  (note A)
  309.         OUT     66,AL
  310.         MOV     AL,AH
  311.         OUT     66,AL
  312.  
  313.         IN      AL,97           ; Activate speaker
  314.         OR      AL,03
  315.         OUT     97,AL
  316.  
  317.                 MOV     AH,1    ;  .2 second delay
  318.                 SHL     AH,1
  319.                 SHL     AH,1
  320.                 MOV     AL,0
  321. SD1:            MOV     CX,9000
  322. SD2:            LOOP    SD2
  323.                 INC     AL
  324.                 CMP     AL,AH           ; Change for length of delay
  325.                 JNE     SD1
  326.  
  327.         MOV     AL,0B6H         ; Now turn it off
  328.         OUT     67,AL
  329.  
  330.         MOV     AX,2711
  331.         OUT     66,AL
  332.         MOV     AL,AH
  333.         OUT     66,AL
  334.  
  335.         IN      AL,97
  336.         AND     AL,11111100B
  337.         OUT     97,AL
  338.         RET
  339. SHORT_BEEP ENDP
  340.  
  341. ;----------------------------------------------------------------------
  342. SHELL ENDP
  343. CSEG ENDS
  344.      END
  345.