Listing of file='MORSE.MAC;01' on disk='vmedia/taylor_5-sector.ccvf'
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; MORSE CODE PRACTISE PROGRAM ; (TWO VERSIONS - USING THE BELL AND SOUNDWARE) ; TITLE MORSE ; READS IN AN ASCII FILE AND SENDS IT AS MORSE CODE ; ; THE USER CAN SPECIFY THE SPEED IN WORDS/MINUTE, THE ; SPACING BETWEEN CHARACTERS, AND OF COURSE THE FILE. ; SPEED CAN BE ALTERED DYNAMICALLY BY USE OF THE UP- ; AND DOWN-ARROW KEYS. THE BREAK KEY SUSPENDS SENDING ; UNTIL ANOTHER KEY IS STRUCK, AND THE ESCAPE KEY ; ABORTS THE PROGRAM. PUBLIC FCSSP EXTRN DECOUT EXTRN SCND,DECIN EXTRN SEND,DOTTIM,CHSPD EXTRN CPYRGT ; FCS ROUTINES EXTRN JMPVEC,CO,OSTR,SAVE EXTRN FILVEC,EMESS,RESET,OPEN,PFSPC EXTRN RWSEQI EXTRN GTBYT,ADHLA ; MAXIMUM WORDS/MINUTE MAX EQU 30 ; SYSTEM ADDRESSES INPCRT EQU 81C5H ;JUMP VECTOR NUMBER 31 KBDFL EQU 81DFH ;HOLDS NUMBER OF JUMP VECTOR READY EQU 81FFH ;KEYBOARD READY FLAG KBCHA EQU 81FEH ;KEYBOARD CHARACTER BUFFER ; OFFSETS IN FILE PARAMETER BLOCK FOPT EQU 0 FATR EQU 1 FNAM EQU 2 FTYP EQU 8 FVER EQU 11 FSBK EQU 12 FSIZ EQU 14 FLBC EQU 16 FLAD EQU 17 FSAD EQU 19 FSPR EQU 21 FDBK EQU 22 FDEN EQU 23 FAUX EQU 24 FHAN EQU 26 FFCN EQU 28 FDRV EQU 29 FBLK EQU 30 FBUF EQU 32 FXBC EQU 34 FPTR EQU 36 ; SPECIAL CONTROL CHARACTERS CR EQU 13 LF EQU 10 FF EQU 12 ; ;.............................................................. ; ; START OF PROGRAM ; MORSE: DI LXI H,0 ;SAVE FCS STACK POINTER DAD SP SHLD FCSSP LXI SP,STACK ;SETUP PROGRAM STACK MVI A,31 ;SET UP VECTOR STA KBDFL ;TO INPCRT MVI A,0C3H ;LITERALLY JMP STA INPCRT LXI H,CHRINT ;INPCRT: JMP CHRINT SHLD INPCRT+1 LXI H,INBUF ;POINT TO COUNTER MVI M,0 ;CLEAR COUNTER CALL JMPVEC ;SET UP I/O JUMP VECTORS CALL FILVEC EI LXI H,MSG00 ;PRINT STARTUP MESSAGE CALL OSTR CALL CPYRGT ;COPYRIGHT MESSAGE CALL SETUP ;INITIALIZE FILE AND SPEED CALL SPEED ;DISPLAY THE SPEED ; ; MAIN SENDING LOOP ; LOOP: LXI H,FPB ;GET NEXT CHARACTER FROM FILE CALL GTBYT JC LOOPE1 CPI 26 ;MIGHT BE SCROLL JZ LOOPE1 CALL SEND ;XMIT MORSE CHARACTER ; ; CHECK FOR SPEED ADJUSTMENT ; ; THE KEYBOARD IS INTERROGATED DIRECTLY ; UP-ARROW MEANS INCREASE, AND DOWN-ARROW DECR. ; CHANGES ONLY TAKE PLACE AT THE END OF A CHARACTER. ; DI MVI A,05 ;CHECK DOWN-ARROW (LINE-FEED) OUT 07 IN 01 CPI 0EFH JNZ CHKUP EI LDA WPM ;DECREMENT THE WORDS/MIN DCR A JNZ GTHAN MVI A,1 ;CANNOT GO BELOW 1 WPM GTHAN: STA WPM CALL SPEED JMP ABTEST CHKUP: MVI A,03 ;CHECK FOR UP-ARROW OUT 07 IN 01 CPI 0DFH JNZ ABTEST EI LDA WPM INR A CPI MAX+1 ;CANNOT BE ABOVE MAX WORDS/MIN JC LTHAN MVI A,MAX LTHAN: STA WPM CALL SPEED ; ; SEE IF SENDING IS TO BE SUSPENDED ; ABTEST: EI LDA READY ;SEE IF BREAK CPI 50H JZ ABTEST ;HANG UNTIL ANOTHER IS STRUCK CPI 80H JNZ LOOP XRA A STA READY LDA KBCHA CPI 27 ;ESCAPE CAUSES PROGRAM ABORT JNZ LOOP JMP BAILOUT ; ; EXIT MAIN LOOP ; LOOPE1: JZ EOF ;AT END OF FILE - CLOSE OUTPUT JMP ERROR ;.............................................................. ; ; SETUP THE FILE FOR INPUT AND THE SPEED AND SPACING ; ; THE USER ENTERS: FILENAME,SPEED,SPACING ; WHERE FILENAME IS ANY VALID FCS FILE ; SPEED IS IN WORDS/MINUTE (1-MAX) ; SPACING IS NORMALLY 2 ; ; DEFAULT VALUES EXIST IF THE USER DOES NOT ; ENTER THE SPEED AND SPACING: 15,2 ; ; THE SPACING IS THE NUMBER OF DOT LENGTHS ; BETWEEN CHARACTERS. THIS ALLOWS FAST CHARACTERS ; WITH A LONG TIME BETWEEN THEM. ; SETUP: LXI H,MSG01 ; DISPLAY PROMPT CALL OSTR CALL RESET ; RESET DISK IF ERROR LXI H,BUFFER ; POINT AT BUFFER L02: CALL CI ; READ FROM CONSOLE CPI 13 ; IS IT CR ? JZ X02 ; YES, GO PROCESS CR CPI 26 ; IS IT BS ? JZ G021 ; YES, GO PROCESS BACKSPACE MOV M,A ; STORE CHARACTER INX H ; BUMP POINTER JMP L02 ; CONTINUE LOOP G021: MOV A,L ; TEST LO BYTE OF POINTER ORA A ; IF ZERO THEN RESTART READ JZ SETUP MVI A,' ' ; ELSE SPACE OVER CALL CO MVI A,26 ; TYPED DATA CALL CO DCX H JMP L02 ; CONTINUE LOOP X02: MVI M,0 ; INSERT TERMINATOR INX H MVI M,0 MVI A,CR ; PRINT CARRIAGE RETURN CALL CO MVI A,LF ; LINEFEED SEQUENCE CALL CO LXI H,BUFFER ; POINT AT BUFFER LXI D,FPB ; POINT AT INPUT FPB LXI B,DEFAULT ; POINT AT DEFAULT TYPE CALL PFSPC ; PARSE FILE SPEC JC E02 ; IF CARRY THEN ERROR CALL SCND ;GET SPEED JNC CHKEND ;USE DEFAULT IF NOT PRESENT CALL DECIN CPI MAX+1 ;MUST BE < MAX WPM JC STORE MVI A,MAX STORE: STA WPM ;STORE WPM CALL SCND ;GET SPACING FACTOR JNC CHKEND ;USE DEFAULT IF NOT FOUND CALL DECIN CPI 1 ;SPACING MUST BE >= 2 JNZ STORIT MVI A,2 STORIT: STA CHSPD CHKEND: MOV A,M ; TEST FOR END MVI B,9 ; SETUP SYNTAX ERROR ORA A JNZ E02 LXI H,FPB ; POINT AT INPUT FPB MVI A,0 ; SETUP AS OLD FILE MOV M,A CALL OPEN ; OPEN THE FILE JC E02 LXI H,IBUF ; POINT AT INPUT BUFFER SHLD FPB+FBUF ; SAVE INPUT BUFFER ADDRESS LXI H,1024 ; SETUP BUFFER SIZE SHLD FPB+FXBC ; SAVE INPUT BUFFER SIZE LXI H,FPB ; POINT AT INPUT FPB CALL RWSEQI ; REWIND INPUT FILE RET ; RETURN ;.............................................................. ; ; CHARACTER INTERRUPT ROUTINE ; ; THIS SHOWS HOW TO READ A CHARACTER ; AND ESCAPE FROM A HUNG PROGRAM ; CHRINT IS CALLED WHENEVER A KEY IS STRUCK. ; THE JUMP IS FROM INPCRT. CHRINT: PUSH H ;SAVE REGISTERS PUSH PSW LXI H,INBUF MVI A,30 ;LENGTH OF BUFFER CMP M ;SEE IF BUFFER IS FULL JC INTEXT ;IF IT IS IGNORE CHARACTER INR M ;INCREMENT COUNTER MOV A,M ;PUT COUNT IN A CALL ADHLA ;ADD COUNTER TO BEGINNING OF BUFFER MOV A,E ;CHARACTER IS IN E CPI 27 ;SEE IF ESCAPE HAS BEEN HIT JZ BREAK ;USER WANTS TO EXIT ANI 127 ;MAKE SURE ITS ASCII MOV M,A ;STORE IT INTEXT: POP PSW POP H ;RESTORE REGISTERS EI ;REENABLE INTERUPT RET ; ; BREAK ALLOWS THE USER TO BRANCH TO A LOCATION WHEN THE ; ESCAPE KEY IS STRUCK. IN THIS CASE THE LOCATION IS ; CALLED BAILOUT ; BREAK: POP PSW POP H POP H JMP BAILOUT INBUF: DS 32 ;STORAGE AREA FOR TYPE AHEAD ; ;.............................................................. ; ; CI READS AND ECHOS ONE CHARACTER FROM THE KEYBOARD ; CI: PUSH H ;SAVE H LXI H,INBUF CI1: MOV A,M ;READ COUNTER ANA A ;SEE IF ZERO JZ CI1 ;LOOK AND WAIT IF ZERO DI ;HOLD OFF INTERRUPTS WHILE PROCESSING PUSH D ;SAVE D DCR M ;REDUCE BUFFER COUNTER MOV D,M INX H ;POINT TO CHARACTER MOV A,M ;READ IT CALL CO ;ECHO IT PUSH PSW ;STACK IT CI2: DCR D ;SHIFT COUNTER JM CI3 ;WHEN DONE INX H ;CHARACTER TO BE SHIFTED MOV A,M DCX H ;POINT TO NEW HOME MOV M,A ;NEW HOME INX H JMP CI2 ;LOOP UNTIL DONE CI3: EI ;ENABLE INTERRUPTS POP PSW ;THE CHARACTER POP D POP H RET ; ;.............................................................. ; ; ERROR AND EXIT ; E02: CALL EMESS ; EMIT ERROR MESSAGE JMP SETUP ; READ NEW LINE ERROR: LXI H,ERRMSG ; PRINT ERROR MESSAGE CALL OSTR BAILOUT: EXIT: MVI B,0 ; SETUP NO ERROR LHLD FCSSP ; RESTORE FCS STACK SPHL RET ; AND EXIT TO FCS EOF: JMP EXIT ; ;.............................................................. ; ; OUTPUT THE SPEED MESSAGE AND ADJUST DOT TIME ; SPEED: LDA WPM ;GET WORDS/MIN LXI H,SPDTAB ;INDEX INTO SPEED TABLE MOV C,A MVI B,0 DAD B ;DOUBLE THE OFFSET DAD B ;BECAUSE ENTRIES ARE 2 BYTES MOV E,M INX H MOV D,M XCHG SHLD DOTTIM ;AND STORE NEW DOT TIME LXI H,HIDIG ;CONVERT TO ASCII FOR DISPLAY CALL DECOUT ;AND PRINT WPM LXI H,MSG02 CALL OSTR RET ; ; TABLE OF DOT TIMES FOR SPEEDS IN WORDS/MINUTE ; ; THE DOT TIME IS THE DURATION OF A DOT, SO THEIR IS A ; RECIPROCAL RELATIONSHIP BETWEEN SPEED IN WPM AND DOT ; TIME. 10 WPM = 155 "CYCLES", AND ANY OTHER SPEED CAN ; BE FOUND FROM: "CYCLES" = 1550 / WPM ; ; THE TABLE RANGES FROM 0 TO 30 WPM (0 = 1). MORE CAN BE ; ADDED. CHANGE THE VALUE OF 'MAX' AT THE TOP IF THIS ; IS DONE. ; SPDTAB: DW 1550,1550,775,517,388,310,259,221,194,172 DW 155,141,129,119,111,103,97,91,86,82 DW 78,74,70,67,65,62,60,57,55,53,52 WPM: DB 15 ; ;.............................................................. ; ; MESSAGES ; MSG00: DB 30,16,29,18,12,'COMPUCOLOR ',19,'II ',21 DB 'MORSE CODE PRACTISE ',22,'V5.80',13,10,10,239 MSG01: DB 19,11,'FILENAME,SPEED(WPM),SPACING FACTOR>',18,239 MSG02: DB 3,20,16,17,'SPEED = ',23 HIDIG: DB ' ' DB ' WPM',239 ERRMSG: DB 17,'HARDWARE ERROR !',13,10,239 DEFAULT:DB 'TXT' ;DEFAULT FILE TYPE IS TXT ; ;.............................................................. ; ; DATA AREAS ; BUFFER: DS 256 IBUF: DS 1024 ;INPUT BUFFER DS 150 ;STACK AREA STACK: DS 2 FCSSP: DS 2 ;FCS STACK POINTER FPB: DS 38 ;INPUT FPB END MORSE