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 >
Wrap
Assembly Source File
|
1984-04-29
|
7KB
|
298 lines
; 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