Listing of file='XMT300.SRC;07' on disk='vmedia/comm_pgms_source_code-sector.ccvf'
;^ASSEM PROG>XMT300.SRC;7 1981/03/11 2230 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; TRANSMIT AN ASCII FILE @ 300 BITS PER SECOND ; ; ; SYSTEM ADDRESSES (FCS VERSION 6.78) ; CO EQU 3392H ;SEND CHARACTER TO SCREEN S1OUT EQU 33C3H ;SEND CHARACTER TO RS-232 PORT OS EQU 33F4H ;SEND STRING ENDING WITH 239 SVCHA EQU 39DCH ;SEND CHARACTER TO SCREEN WATL EQU 3429H ;LONG WAIT: 20 MS / COUNT BRATE EQU 81E2H ;CURRENT BAUD RATE EMESS EQU 262DH ;FCS ERROR SUBROUTINE PFSPC EQU 3077H ;PARSE FILE SPEC RESET EQU 26A5H OPEN EQU 2DABH ;OPENS A FILE ;HL=>FPB RWSEQI EQU 30C6H ;'REWINDS' A SEQUENTIAL FILE ;INPUTS: HL=>FPB ;OUTPUTS: A-LOST ; BC,DE UNCHANGED ; HL=>FPB INSEQO EQU 30E7H ;INITIALIZES A SEQUENTIAL OUTPUT FILE ;INPUTS: HL=>FPB ;OUTPUTS: A-LOST ; BC,DE UNCHANGED ; HL=>FPB CLSEQO EQU 3136H ;CLOSES A NEWLY CREATED SEQUENTIAL FILE ;INPUTS: HL=>FPB ;OUTPUTS: A-LOST ; BC,DE LOST ; HL=>FPB IF NO ERRORS ;STATUS: <NC> NO ERRORS ; <C> ERROR ; B=ERROR CODE GTBYT EQU 322CH ;GETS A SINGLE BYTE FROM FILE ;INPUT HL=>FPB ;OUTPUTS A=BYTE ; BC,DE UNCHANGED ;STATUS: NC=NO ERRORS ; C,Z=END OF FILE ; C,NZ,M=ERROR PTBYT EQU 324AH ;PUTS A BYTE ON A FILE ;INPUTS HL=>FPB,A=THE BYTE ;OUTPUTS A=THE BYTE ; BC,DE UNCHANGED ;STATUS: SAME AS GTBYT ADHLA EQU 3518H ;ADDS A TO HL WITH CARRYS INPCRT EQU 81C5H ;JUMP VECTOR NUMBER 31 KBDFL EQU 81DFH ;KEYBOARD INPUT FLAG INPFL EQU 81E3H ;RS232 INPUT FLAG READY EQU 81FFH ;KEYBOARD READY FLAG KBCHA EQU 81FEH ;KEYBOARD CHARACTER CMPHD EQU 344DH ;COMPARE HL:DE REGISTERS ; ; DEFINITION OF 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 ; LF EQU 10 ;LINE FEED CR EQU 13 ;CARRIAGE RETURN ; RATE EQU 84H ;300 BAUD (88H = 1200) ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; START OF PROGRAM ; ORG 8200H START: LXI H,0 ; SAVE FCS STACK POINTER DAD SP SHLD FCSSP LXI SP,STACK ;SETUP RUNOFF STACK MVI A,RATE ;GET BAUD RATE CODE OUT 5 ;LOAD 5501 STA BRATE ;STORE SO FCS WILL KNOW MVI A,31 ;SET UP INPUT FLAGS STA KBDFL ;KEYBOARD FLAG STA INPFL ;INPUT FLAG MVI A,0C3H ;LITERALLY JMP STA INPCRT LXI H,WHICH ;THUS ;INPCRT: JMP WHICH SHLD INPCRT+1 LXI H,INBUF ;POINT TO COUNTER MVI M,0 ;CLEAR COUNTER LXI H,MSG00 ;PRINT STARTUP MESSAGE CALL OS CALL SETUP ;INITIALIZE FILES LOOP: LXI H,FPB1 CALL GTBYT JC LOOPE1 CPI 26 ;^Z=END-OF-FILE, SO EXIT JZ LOOPE1 CPI CR JZ DELAY CPI LF ;IGNORE LF JZ LOOP MOV E,A CALL PARITY JMP LOOP DELAY: MOV E,A CALL PARITY MVI A,10 CALL WATL ;WAIT 20 MS / COUNT IN A JMP LOOP ; ; PARITY - GENERATE PARITY AND TRANSMIT TO RS232 PORT ; PARITY: MOV A,E ;PUT DATA IN REGISTER ANI 07FH ;FORCE PARITY BIT OFF JPE POK ;TEST FOR EVEN PARITY ORI 080H ;FORCE PARITY BIT ON POK: MOV E,A ;PUT DATA IN E FOR S1OUT CALL S1OUT ;TRANSMIT ON RS232 PORT RET ;RETURN TO CALLER LOOPE1: JZ EOF ;AT END OF FILE - CLOSE OUTPUT JMP ERROR SETUP: LXI H,MSG01 ; DISPLAY PROMPT CALL OS 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 MVI A,CR ; PRINT CARRIAGE RETURN CALL CO MVI A,LF ; LINEFEED SEQUENCE CALL CO LXI H,BUFFER ; POINT AT BUFFER LXI D,FPB1 ; POINT AT INPUT FPB LXI B,DEFAULT ; POINT AT DEFAULT TYPE CALL PFSPC ; PARSE FILE SPEC JC E02 ; IF CARRY THEN ERROR MOV A,M ; TEST FOR END MVI B,9 ; SETUP SYNTAX ERROR ORA A JNZ E02 LXI H,FPB1 ; 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 FPB1+FBUF ; SAVE INPUT BUFFER ADDRESS LXI H,1024 ; SETUP BUFFER SIZE SHLD FPB1+FXBC ; SAVE INPUT BUFFER SIZE LXI H,FPB1 ; POINT AT INPUT FPB CALL RWSEQI ; REWIND INPUT FILE RET ; RETURN ; ; ; ROUTINE TO DETERMINE WHICH SOURCE ; OF DATA HAS PROVIDED A CHARACTER ; ; WHICH: PUSH PSW ;SAVE MACHINE STATE PUSH D ;SAVE DE LXI D,KBDFL ;ADDRESS OF KEYBOARD INPUT FLAG CALL CMPHD ;CALL HL:DE COMPARE JZ KEYHIT ;JUMP IF CALLED FOR KEYBOARD CHARACTER ; ASSUME CHARACTER FROM INPUT PORT POP D ;RESTORE DE MOV A,E ANI 7FH ;DROP PARITY BIT MOV E,A CPI 7FH JZ IGNORE POP PSW JMP SVCHA ;DISPLAY ON SCREEN IGNORE: POP PSW RET KEYHIT: POP D ;RESTORE DE POP PSW ;RESTORE PSW ; CHRINT IS CALLED WHENEVER A KEY IS STRUCK 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 INTERRUPTS 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: LXI H,4 ;POINT TO RETURN ADDRESS DAD SP ;NOW H POINTS TO RETURN ADDRESS MVI M,BAILOUT AND 255 ;STORE LOW ORDER BYTE INX H MVI M,BAILOUT/256 ;STORE HIGH ORDER BYTE JMP INTEXT ;EXIT INTO EXIT 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 E02: CALL EMESS ; EMIT ERROR MESSAGE JMP SETUP ; READ NEW LINE ERROR: LXI H,MSG02 ; PRINT ERROR MESSAGE CALL OS BAILOUT: EXIT: MVI B,0 ; SETUP NO ERROR MVI A,CR ; OUTPUT A CR TO FINISH MOV E,A CALL PARITY LHLD FCSSP ; RESTORE FCS STACK SPHL RET ; AND EXIT TO FCS EOF: JMP BAILOUT ; MESSAGES MSG00: DB 18,11,'COMPUCOLOR ',19,'II ' DB 21,'TRANSMIT @ ' DB 20,' 300 BITS PER SECOND ' DB 22,'11Mar81 2230',13,10,239 MSG01: DB 19,11,'XMT300>',18,239 MSG02: DB 17,'*** HARDWARE ERROR',13,10,239 DEFAULT:DB 'SRC' ; DATA AREAS BUFFER: DS 256 IBUF: DS 1024 ;INPUT BUFFER DS 200 ;STACK AREA STACK: DS 2 FCSSP: DS 2 ;FCS STACK POINTER FPB1: DS 38 ;INPUT FPB END START