home *** CD-ROM | disk | FTP | other *** search
- ; FILE NAME: PRACTICE.ASM
- ; VERSION #: 1.01
- ; PROGRAMMED BY: JAMES K. MILLS
- ;
- ; PURPOSE: A PROGRAM TO TRANSMIT CP/M TEXT FILES
- ; IN MORSE CODE FOR AMATEUR RADIO CODE
- ; PRACTICE PURPOSES.
- ;
- ; COMMENTS: THIS PROGRAM MUST BE ASSEMBLED UNDER
- ; MAC (CP/M AND MAC ARE TRADEMARKS OF
- ; DIGITAL RESEARCH). IF YOU FIND BUGS
- ; OR MAKE IMPROVEMENTS, PLEASE SEND ME
- ; A NOTE DESCRIBING THEM:
- ; James K. Mills WB9KFP
- ; P.O. BOX 94864
- ; Schaumburg, IL 60194
- ; THANK YOU.
- ;
- ; REVISION HISTORY
- ; ----------------
- ;
- ; 09/22/79 INITIAL VERSION WITH CONCEPTS STOLEN
- ; FROM BOB VAN VALZAH'S "TEACH" PROGRAM
- ; 11/26/79 - ADDED ADM-3A USAGE OF CONTROL-G
- ; TO SEND CODE.
- ;
- MACLIB SEQIO ;GET THE SEQIO MACRO LIBRARY
- ;
- ; ASSEMBLY CONSTANTS
- ;
- TITLE 'MORSE CODE PRACTICE PROGRAM'
- PAGE 56
- ;
- FALSE EQU 0
- TRUE EQU NOT FALSE
- SHERWD EQU FALSE
- ADM EQU TRUE
- PMMI EQU FALSE
- ;
- ABORT EQU 3 ;ABORT KEY IS ^C
- BOOT EQU 0 ;RETURN POINT FOR CP/M WARMBOOT
- BDOS EQU 5 ;BDOS ENTRY POINT
- PORT EQU 5 ;CONSOLE DATA PORT
- PRINT EQU 9 ;PRINT BUFFER TO CONSOLE
- ;
- IF SHERWD
- SCREECH EQU 203 ;OUTPUT PORT FOR SHERWOOD
- ENDIF
- ;
- IF PMMI
- BASE EQU 0F0H ;BASE ADDRESS OF PMMI
- PMMI0 EQU BASE
- PMMI1 EQU BASE+1
- PMMI2 EQU BASE+2
- PMMI3 EQU BASE+3
- SCREECH EQU PMMI0
- ENDIF
- ;
- ;***************
- ;* GLOBAL DATA *
- ;***************
- ;
- FREQ EQU 2000 ;MACHINE CYCLES PER MILLISECOND
- WPM EQU 20 ;DEFAULT CHARACTER TRANSMISSION SPEED
- ;
- ORG 100H
- ;
- ;
- ;***************************
- ;* BEGIN PROGRAM OPERATION *
- ;***************************
- ;
- SIGNON: LXI D,MSG ;PROGRAM SIGN-ON MESSAGE
- MVI C,PRINT ;GET READY
- CALL BDOS ;GO
- ;
- GETRDY: CALL INIT ;INITIALIZE SHERWOOD FRONT PANEL
- ;
- FILE INFILE,SOURCE,,1,,
- START: GET SOURCE
- CPI 26 ;IS IT END-OF-FILE (^Z)?
- JZ BOOT ;IF SO, BACK TO CP/M
- CPI 22 ;DOUBLE-QUOTES?
- JZ START ;IF SO, GET NEXT CHARACTER
- PUT CON ;SEND TO CONSOLE
- CPI 10 ;IS IT A LINE FEED?
- JZ START ;IF SO, GET NEXT CHARACTER
- CPI 13 ;IS IT A <CR>?
- JZ SPACE ;IF SO, SEND A SPACE
- CPI 32 ;IS IT A SPACE?
- JZ SPACE ;IF SO, WAIT 1 SPACE
- SUI ' ' ;SUBRACT VALUE OF "SPACE"
- MOV C,A ;MOVE "INDEX" TO C-REGISTER
- MVI B,0 ;PUT 0 IN HIGH-ORDER BYTE
- LXI H,MORSE ;ADDRESS OF CONVERSION TABLE
- DAD B ;MOVE TO OUR CHARACTER
- MOV A,M ;PUT IT IN ACCUMULATOR
- SEND: CPI 80H ;SHOULD WE IGNORE THE CHARACTER?
- JZ START ;IF SO, GET NEXT CHARACTER
- ANA A ;SET CARRY FLAG TO ZERO
- SEN1: RAL ;PUT MORSE BIT INTO CARRYFLAG
- MOV B,A ;BETTER SAVE THE CHARACTER INDEX
- MVI C,1200/WPM ;ONE DIT TIME IN MSEC
- JNC SEN2 ;IT'S A DIT -- SEND IT
- MVI C,3*1200/WPM ;ONE DAH TIME IN MSEC
- SEN2: ANA A ;IS ACCUMULATOR ZERO?
- JZ INTER ;YEP--THAT LAST ONE WAS STOPBIT
- CALL BEEP ;TELL ME ABOUT IT
- MVI C,1200/WPM ;INTER-BIT SPACE
- CALL WAIT ;DELAY TIL READY FOR NEXT MORSE BIT
- MOV A,B ;BETTER RESTORE CHARACTER INDEX
- JMP SEN1 ;LOOP FOR REMAINING MORSE BITS
- WAIT: MVI A,FREQ/16
- WAI1: DCR A
- JNZ WAI1 ;LOOP FOR A MSEC
- DCR C
- JNZ WAIT ;MORE WAITING
- RET
- BEEP: IF SHERWD
- MVI A,20H
- OUT SCREECH ;TONE ON
- ENDIF
- IF ADM
- MVI A,7
- OUT PORT
- ENDIF
- BEE0: MVI B,FREQ/16/2
- BEE1: DCR B
- IF ADM
- MVI A,7
- OUT PORT
- ENDIF
- JNZ BEE1 ;LOOP 1/2 MSEC
- BEE2: MVI B,FREQ/16/2
- BEE3: DCR B
- IF ADM
- MVI A,7
- OUT PORT
- ENDIF
- JNZ BEE3 ;OH I WONDER WONDER WONDER
- DCR C
- JNZ BEE0 ;SCREECH ON!
- IF SHERWD
- MVI A,255
- OUT SCREECH ;STOP, IT ALREADY!
- ENDIF
- IF ADM
- MVI A,0
- OUT PORT
- ENDIF
- RET
- INTER: MVI C,3*1200/WPM
- CALL WAIT
- IN PORT ;SCAN FOR KBD DATA
- CPI ABORT ;CHECK FOR ^C
- JZ BOOT ;IF SO, EXIT PROGRAM
- JMP START
- SPACE: MVI C,1200/WPM ;ONE DIT TIME
- CALL WAIT
- MVI C,3*1200/WPM ;+ ONE DAH TIME
- CALL WAIT
- MVI C,3*1200/WPM ;+ ONE MORE = 7
- CALL WAIT ;7*1200/WPM IS TOO BIG A NUMBER
- JMP START
- ;
- ;*********************
- ;* SUBROUTINE PRESET *
- ;*********************
- ;
- ;INITIALIZE I/O
- ;
- INIT:
- IF SHERWD
- XRA A ;INIT FRONT PANEL PIA
- OUT 200
- OUT 202
- CMA
- OUT 201
- OUT 203
- MVI A,4
- OUT 200
- OUT 202
- MVI A,10H
- OUT 203 ;INITIALLY TURN OFF TONE
- RET
- ENDIF
- ;
- IF PMMI
- RET
- ENDIF
- ;
- ;*************************
- ;* CHARACTER CODE TABLES *
- ;*************************
- ;
- MORSE DB 080H ; = 1000 0000 = SPACE
- DB 056H ; = 0101 0110 = EXCLAMATION POINT
- DB 080H ; = 1000 0000 = DOUBLE QUOTE
- DB 080H ; = 1000 0000 = CROSS-HATCH
- DB 080H ; = 1000 0000 = DOLLAR-SIGN
- DB 080H ; = 1000 0000 = PERCENT-SIGN
- DB 080H ; = 1000 0000 = AMPERSAND
- DB 080H ; = 1000 0000 = APOSTROPHE
- DB 0B6H ;( = 1011 0110 = DAH-DI-DAH-DAH-DI-DAH
- DB 0B6H ;) = 1011 0110 = DAH-DI-DAH-DAH-DI-DAH
- DB 080H ; = 1000 0000 = ASTERISK
- DB 080H ; = 1000 0000 = PLUS-SIGN
- DB 0CEH ;, = 1000 0000 = COMMA
- DB 08CH ;- = 1000 1100 = DAH-DI-DI-DI-DAH
- DB 056H ;. = 0101 0110 = DI-DAH-DI-DAH-DI-DAH
- DB 094H ;/ = 1001 0100 = DAH-DI-DI-DAH-DIT
- DB 0FCH ;0 = 1111 1100 = DAH-DAH-DAH-DAH-DAH
- DB 07CH ;1 = 0111 1100 = DI-DAH-DAH-DAH-DAH
- DB 03CH ;2 = 0011 1100 = DI-DI-DAH-DAH-DAH
- DB 01CH ;3 = 0001 1100 = DI-DI-DI-DAH-DAH
- DB 00CH ;4 = 0000 1100 = DI-DI-DI-DI-DAH
- DB 004H ;5 = 0000 0100 = DI-DI-DI-DI-DIT
- DB 084H ;6 = 1000 0100 = DAH-DI-DI-DI-DIT
- DB 0C4H ;7 = 1100 0100 = DAH-DAH-DI-DI-DIT
- DB 0E4H ;8 = 1110 0100 = DAH-DAH-DAH-DI-DIT
- DB 0F4H ;9 = 1111 0100 = DAH-DAH-DAH-DAH-DIT
- DB 080H ; = 1000 0000 = COLON
- DB 080H ; = 1000 0000 = SEMI-COLON
- DB 080H ; = 1000 0000 = LEFT ARROW
- DB 080H ; = 1000 0000 = EQUALS-SIGN
- DB 080H ; = 1000 0000 = RIGHT ARROW
- DB 032H ;? = 0011 0010 = DI-DI-DAH-DAH-DI-DIT
- DB 080H ; = 1000 0000 = AT-SIGN
- DB 060H ;A = 0110 0000 = DI-DAH
- DB 088H ;B = 1000 1000 = DAH-DI-DI-DIT
- DB 0A8H ;C = 1010 1000 = DAH-DI-DAH-DIT
- DB 090H ;D = 1001 0000 = DAH-DI-DIT
- DB 040H ;E = 0100 0000 = DIT
- DB 028H ;F = 0010 1000 = DI-DI-DAH-DIT
- DB 0D0H ;G = 1101 0000 = DAH-DAH-DIT
- DB 008H ;H = 0000 1000 = DI-DI-DI-DIT
- DB 020H ;I = 0010 0000 = DI-DIT
- DB 078H ;J = 0111 1000 = DI-DAH-DAH-DAH
- DB 0B0H ;K = 1011 0000 = DAH-DI-DAH
- DB 048H ;L = 0100 1000 = DI-DAH-DI-DIT
- DB 0E0H ;M = 1110 0000 = DAH-DAH
- DB 0A0H ;N = 1010 0000 = DAH-DIT
- DB 0F0H ;O = 1111 0000 = DAH-DAH-DAH
- DB 068H ;P = 0110 1000 = DI-DAH-DAH-DIT
- DB 0D8H ;Q = 1101 1000 = DAH-DAH-DI-DAH
- DB 050H ;R = 0101 0000 = DI-DAH-DIT
- DB 010H ;S = 0001 0000 = DI-DI-DIT
- DB 0C0H ;T = 1100 0000 = DAH
- DB 030H ;U = 0011 0000 = DI-DI-DAH
- DB 018H ;V = 0001 1000 = DI-DI-DI-DAH
- DB 070H ;W = 0111 0000 = DI-DAH-DAH
- DB 098H ;X = 1001 1000 = DAH-DI-DI-DAH
- DB 0B8H ;Y = 1101 1000 = DAH-DAH-DI-DAH
- DB 0C8H ;Z = 1100 1000 = DAH-DAH-DI-DIT
- DB 0B6H ;[ = 1011 0110 = DAH-DI-DAH-DAH-DI-DAH
- DB 094H ;\ = 1001 0100 = DAH-DI-DI-DAH-DIT
- DB 0B6H ;] = 1011 0110 = DAH-DI-DAH-DAH-DI-DAH
- DB 080H ;^ = 1000 0000 = UP-ARROW
- DB 080H ; = 1000 0000 = IGNORE IT
- DB 080H ; = 1000 0000 = IGNORE IT
- DB 060H ;a
- DB 088H ;b
- DB 0A8H ;c
- DB 090H ;d
- DB 040H ;e
- DB 028H ;f
- DB 0D0H ;g
- DB 008H ;h
- DB 020H ;i
- DB 078H ;j
- DB 0B0H ;k
- DB 048H ;l
- DB 0E0H ;m
- DB 0A0H ;n
- DB 0F0H ;o
- DB 068H ;p
- DB 0D8H ;q
- DB 050H ;r
- DB 010H ;s
- DB 0C0H ;t
- DB 030H ;u
- DB 018H ;v
- DB 070H ;w
- DB 098H ;x
- DB 0B8H ;y
- DB 0C8H ;z
- DB 0B6H ;{
- DB 080H ;|
- DB 0B6H ;}
- DB 080H ;~
- DB 080H ;DEL
- ;
- ;
- MSG: DB 26,0,'MORSE CODE PRACTICE PROGRAM VERSION 1.01',13,10
- DB 'WRITTEN BY JAMES K. MILLS WB9KFP',13,10,'$'
- BUFFERS:
- END
-