NAME HEXLINK TITLE HEXLINK ; ; HEXLINK.ASM VERSION 1.0 ; BY LESTER VEENSTRA K1YCM/3 ; FREDERICK MD ; VOICE DAY (301)-428-4390 ; VOICE EVE (301)-662-6702 ; BBS (301)-371-6271 (300/1200) ; ; WHY: THIS PROGRAM IS INTENDED TO SOLVE THE PROBLEM OF ; HOW DO YOU GET THE FIRST COPY OF A MODEM PROGRAM ; INTO A SYSTEM THAT DOES NOT HAVE A DISK FORMAT ; COMPATABLE WITH THE AVAILABLE SOURCE. HEXLINK ; ALLOWS THE TRANSFER OF .COM ,OR FOR THAT MATTER, ; ANY FILE TO A MINIMUM CP/M SYSTEM CONTAINING ONLY ; THE UTILITIES AS SUPPLIED BY DIGITAL RESEARCH, PIP ; AND LOAD. HEXLINK IS ONLY NEEDED IN THE SOURCE ; SYSTEM, NOT THE RECEIVING SYSTEM. NO CODE HAS TO ; BE HAND ENTERED ON THE RECEIVING SYSTEM. ; ; TYPICAL USE: THE SOURCE SYSTEM THAT HAS MODEM7XX WILL ; ASSEMBLE AND OVERLAY A VERSION SUITABLE ; FOR THE TARGET SYSTEM. HEXLINK WILL THEN ; BE USED TO SEND THE CONFIGURED MDM7XX.COM ; TO THE NEW SYSTEM. THE NEW SYSTEM WILL LOAD ; THE MDM7XX.HEX FILE THAT HAS BEEN CREATED ; AND USE IT FOR FURTHER FILE TRANSFERS ; ; ; HEXLINK IS A SIMPLE FILE TRANSFER PROGRAM THAT USES ONLY ; ASCII CHARACTERS AND THAT DOES NOT REQUIRE THE USE OF ; A SPECIAL PROGRAM IN THE RECEIVING MACHINE. THE UNIQUE ; FEATURE OF HEXLINK IS THAT IT SUPPORTS LONG FILES THAT WOULD ; NORMALLY OVER RUN A CAPTURE BUFFER. IT IS INTENDED THAT THE ; RECEIVING MACHINE USES PIP IN THE BLOCK MODE TO INPUT ; VIA THE RDR: LOGICAL PORT. HEXLINK PERIODICALLY STOPS ; AND CAUSES THE RECEIVING MACHINE TO EMPTY ITS BUFFER TO ; THE SPECIFIED DISK FILE. THE LINK IS ONE-WAY. THAT IS, HEXLINK ; DOES NOT TEST THE CONDITION OF THE RECEIVING SYSTEM. INSTEAD ; IT WAITS A SAFE PERIOD TO ALLOW ALL DISK ACTIVITY TO FINISH ; AT THE RECEIVING MACHINE BEFORE SENDING MORE CHARACTERS. ; THE FILE IS SENT IN THE INTEL HEX FORMAT. THUS EACH LINE ; CONTAINS A CHECKSUM. THE RECEIVING SYSTEM MUST "LOAD" ; THE RECEIVED .HEX FILE TO RECONVERT IT BACK TO A .COM FILE. ; ANY LINK ERRORS WILL BE DETECTED AT THIS TIME. ; ; TO USE HEX LINK THE RECEIVING SYSTEM MUST FIRST BE SET-UP ; WITH A PIP COMMAND SUCH AS: ; ; PIP B:FILENAME.HEX=RDR:[EB] ; ; THE SENDING MACHINE CAN THEN START HEXLINK AND FOLLOW THE ; PROMPTS ISSUED BY THE PROGRAM. THE NAME OF THE FILE TO BE ; SENT SHOULD BE UNIQUE. ; ; HEXLINK IS USEFUL AS A FIRST STEP IN GETTING A MORE USEFUL ; FILE TRANSFER PROGRAM SUCH AS MODEM7XX.COM INTO A NEW ; MACHINE WHEN THE DISK FORMAT IS NOT AVAILABLE. ; ; PSECT ABS ORG 00100H WARMBOOT EQU 00000H FCB EQU 0005CH BIOS EQU 00005H Sp EQU 020H Lf EQU 00AH Cr EQU 00DH Ff EQU 00CH LINES EQU 070H ;DEFINE THE NUMBER OF LINES PER BLOCK ;CAN BE INCREASED IF THE RECEIVING SYSTEM ;HAS A LARGER BUFFER ; ; ; JP START ; LineCo: DEFB LINES ECHO?: DEFB 000H LstPun: DEFB 000H BUFFER: DEFS 16D ChrCount: DEFB 000H DEFB 000H ADDRLO: DEFB 000H DEFB 000H ADDRHI: DEFB 000H DEFB 000H FRAME34: DEFB 000H DEFB 000H FRAME56: DEFB 000H DEFB 000H BytesPerLine: DEFB 000H DEFB 000H SUM: DEFS 67D ; ; TOPSTACK: ; ; START: LD SP,TOPSTACK LD DE,MSG1 ;PROGRAM INTRODUCTION CALL PrintString ;ASK IF USE PUN: OR LST: CALL ANSWER1or2 ;GET ANSWER LD HL,LstPun ;CONVERT TO FUNCTION NUMBER AND 003H ; \ LD B,003H ; \ ADD A,B ; \ LD (HL),A ;SAVE FUNCTION NUMBER AT LstPun LD DE,MSG2 ;DO YOU WANT THE OUTPUT CALL PrintString ;TO ALSO APPEAR ON THE CONSOLE? CALL ANSWER1or2 ;GET ANSWER LD HL,ECHO? ;POINT TO SAVE LOCATION AND 002H RRCA LD (HL),A ;SAVE ANSWER IN ECHO? LD A,00EH LD DE,BUFFER EX DE,HL LD (HL),A ;PUT 0E IN FIRST LOCATION OF BUFFER ; ; MAIN: CALL GetName ;ASK FOR FILE NAME CALL OpenFile ;TRY TO FIND NAME LD A,080H ;NUMBER OF BYTES PER CPM RECORD LD (ChrCount),A ;SAVE BYTE COUNTER LD HL,ADDRLO ;POINT TO LOW ORDER SOURCE ADDRESS BYTE LD A,000H LD (HL),A ;STORE INITIAL ZERO IN LOW BYE OF ADDRESS LD HL,ADDRHI ;POINT TO HIGH ORDER SOURCE ADDRESS BYTE LD A,001H LD (HL),A ;STORE INITIAL ONE IN ADDRES ;ASSUME DUMP OF COM FILE ;THUS FIRST ADDRESS WILL ALWAYS BE 0100 LD HL,BytesPerLine LD A,010H LD (HL),A ;STORE VALUE 16 BYTES PER LINE ; MAIN1: CALL NewLine ;OUTPUT Cr,Lf AND TEST FOR WAIT RRCA JP C,ENDIT ;NO MORE RECORDS IN FILE LD HL,SUM LD A,00 LD (HL),A ;STORE INITIAL 00 IN SUM ; ; LD A,':' CALL OUTPUT ;INTEL FRAME 0 ALWAYS ":" LD HL,BytesPerLine LD A,(HL) ;GET NUMBER OF BYTES PER LINE OF FORMAT CALL SENDBOTHHEX ;SEND AS INTEL FRAME 1,2 ; ; LD HL,ADDRHI LD A,(HL) ;GET SOURCE ADDRESS HIGH ORDER BYTE LD HL,FRAME34 LD (HL),A ;SAVE VALUE IN FRAME34 CALL SENDBOTHHEX ;SEND AS INTEL FRAME 3,4 ; ; LD HL,ADDRLO LD A,(HL) ;GET SOURCE ADDRESS LOW ORDER BYTE LD HL,FRAME56 LD (HL),A ;SAVE VALUE IN FRAME56 CALL SENDBOTHHEX ;SEND AS INTEL FRAME 5,6 ; ; XOR A ;STAGE A ZERO FOR RECORD TYPE CALL SENDBOTHHEX ;SEND AS INTEL FRAME 7,8 ; ; MAIN2: ;GET SOURCE MEMORY VALUE LD A,(ChrCount) ;GET CURRENT POINTER IN RECORD CP 080H ;SEE IF ALL READ JP NZ,MAIN3 ;IF NOT SKIP CALL ReadFile ;ELSE GET SOME MORE XOR A ;ZERO CHARACTER COUNT IF NEW RECORD MAIN3: LD E,A ;SAVE CHARACTER COUNT IN REG E LD D,000H ;ZERO D REGISTER DE IS INDEX TO CHARACTER INC A ;COUNT CHARACTERS PROCESSED LD (ChrCount),A ;SAVE THE COUNT OF CURRENT RECORD LD HL,00080H ;POINT TO START OF DEFAULT DMA BUFFER ADD HL,DE ;HL POINTS TO NEW BYTE LD A,(HL) ;GET THE NEW BYTE LD B,A ;SAVE NEW BYTE IN REGISTER B LD HL,SUM ;POINT AT PREVIOUS CHECK-SUM LD A,(HL) ;GET VALUE OF PREVIOUS CHECK-SUM ADD A,B ;ADD NEW BYTE TO OLD VALUE LD (HL),A ;SAVE UPDATED CHECK-SUM IN (SUM) SCF ;SET CARRY FLAG CCF ;AND INVERT IT>>ENSURE NO CARRY IN ADDITION LD HL,ADDRLO ;POINT TO LOW ADDRESS BYTE STORAGE LD A,(HL) ;GET CURRENT LOW ADDRESS VALUE ADC A,001H ;INCREASE BY ONE COUNT FOR EACH BYTE JP NC,MAIN4 ;SKIP IF NOT CROSS PAGE BOUNDARY XOR A ;SAVE 00 IN ADDRLO LD (HL),A ;SHOULD BE ZERO ALREADY LD HL,ADDRHI ;POINT TO HIGH ADDRESS BYTE LOCATION LD A,(HL) ;GET CURRENT HIGH ADDRESS BYTE INC A ;INCREASE BY ONE PER PAGE MAIN4: LD (HL),A ;SAVE UPDATED ADDRESS LD A,B ;NEW BYTE BACK IN REGISTER A CALL SENDBOTHHEX ;SEND AS TWO INTEL FORMAT CHARACTERS LD HL,ADDRLO ; LD A,(HL) ;GET LOW BYTE OF SOURCE ADDRESS AND 00FH ;MASK LOWEST 4 BITS JP NZ,MAIN2 ;TEST IS 16 HAVE BEEN DONE ;IF NOT GO BACK FOR MORE CALL CHECKSUM ;IF DONE COMPUTE CHECKSUM ;AND SEND IT JP MAIN1 ;THEN START OVER WITH NEW LINE ; ; ; ; ; ; ; CHECKSUM: LD HL,SUM ;POINT TO ACCUMULATED CHECK-SUM LD A,(HL) ;OF ALL BYTES OF SOURCE USED IN LINE LD E,A ;SAVE SUM IN REGISTER E LD HL,BytesPerLine ;GET THIS VALUE LD A,(HL) ADD A,E ;ADD TO SUM LD E,A ;SAVE NEW SUM IN E LD HL,FRAME56 ;GET THIS VALUE LD A,(HL) ADD A,E ;ADD TO SUM LD E,A ;SAVE NEW SUM IN E LD HL,FRAME34 ;GET THIS VALUE LD A,(HL) ADD A,E ;ADD TO SUM NOW THE FINAL SUM CPL ;OF ALL BYTES USED IN LINE INC A ;FORM CHECK-SUM CALL SENDBOTHHEX ;SEND AS LAST TWO CHARACTERS IN LINE RET ; ; ; OUTPUT: PUSH HL PUSH DE PUSH BC LD E,A PUSH DE ;SAVE THE CHARACTER LD A,(ECHO?) ;TEST FOR ECHO OR A JP Z,OUT ;IF NOT SKIP LD C,002H ;CONSOLE OUTPUT CALL BIOS OUT: POP DE ;RESTORE THE CHARACTER LD HL,LstPun ;POINT TO LOGICAL DEVICE TO BE USED LD C,(HL) ;SEND CHARACTER OUT TO REMOTE CALL BIOS ;FUNCTION CALL POP BC POP DE POP HL RET ; ; SENDHEX: AND 00FH CP 00AH ;TEST IF GT 9 JP NC,LESS10 ;IF LESS THAN 10 JUMP ADD A,030H ;0-9 NUMBER TO ASCII CHARACTER JP GOOUT ; LESS10: ADD A,037H ;A-F NUMBER TO ASCII CHARACTER GOOUT: CALL OUTPUT RET ; SENDBOTHHEX: PUSH AF ;SAVE LEAST SIGNIF NIBBLE RRCA ;GET MOST SIGNIF NIBBLE RRCA RRCA RRCA CALL SENDHEX ;SEND MOST POP AF CALL SENDHEX ;SEND LEAST RET ; ; ; ; GetName: CALL ClearFCB ;INITIALIZE FCB AREA LD DE,MSG6 ;ASK FOR FILE NAME CALL PrintString LD DE,BUFFER ;SET-UP BUFFER POINTER PUSH DE ;SAVE BUFFER POINTER LD C,00AH ;READ CONSOLE BUFFER CALL BIOS POP DE ;RETURN BUFFER POINTER INC E ;POINT AT SECOND BYTE,NUMBER OF CHR TYPED LD A,(DE) ;GET COUNT AND A ;TEST IT JP Z,GetName ;IF NO CHARACTERS TYPED INC E ;POINT A FOURTH BYTE THAT MAY INDICATE INC E ;IF A DRIVE WAS SPECIFIED EX DE,HL LD A,(HL) ;GET FOURTH BYTE (THE SECOND CHAR TYPED) CP ':' JP Z,DiskSpec ;IF IT WAS A : THEN JUMP LD HL,BUFFER+1 ;POINT TO NUMBER OF CHARACTERS TYPED LD B,(HL) ;LOAD NUMBER IN REG B INC L ;HL NOW POINTS TO FIRST CHARACTER TYPED ; MovName: LD DE,FCB+1 ;DE POINT AT FIRST CHAR OF FCB FILE NAME ; MovMore: LD A,(HL) ;GET FIRST CHARACTER CP 02EH ;TEST IF ITS A "." INDICATING END OF NAME JP Z,FType ;IF TRUE JUMP EX DE,HL ;ELSE MOVE CHAR LD (HL),A ;TO NAME AREA OF FCB INC E ;NEXT BUFFER CHARACTER INC L ;NEXT FCB POSITION DEC B ;COUNT HOW MANY REMAINING RET Z ;DONE MOVING IF ALL TYPED ARE MOVED EX DE,HL ;ELSE JP MovMore ; BACK FOR MORE ; FType: LD DE,FCB+09D ;POINT AT FILE TYPE POSITION OF FCB INC L ;POINT TO NEXT IN BUFFER DEC B ;DECREASE CHARACTER COUNT JP Z,BADNAME ;IF NONE LEFT JP MovMore ;RESUME MOVE FROM THIS POSITION ; DiskSpec: DEC L ;POINT BACK AT DISK SPECIFIER LD A,(HL) ;GET IT SUB 040H ;CONVERT ASCII A-P TO NUMBER 1-16 CP 1 ;TEST FOR VALID RANGE JP C,BADNAME ;IF IT WAS LESS THAN "A" CP 17 ; JP NC,BADNAME ;IF IT WAS GREATER THAN "P" LD DE,FCB ;POINT AT DRIVE CODE POSITION OF FCB DEC L ;POINT BACK AT NUMBER OF CHARACTERS TYPED LD B,(HL) ;SAVE IT IN B INC L ;POINT AT FIRST CHARACTER EX DE,HL ; LD (HL),A ;PLACE DRIVE CODE IN FCB DEC B ;COUNT THE DRIVE SPECIFIER CHARACTER DEC B ;COUNT THE ":" CHARACTER JP Z,BADNAME ;IF NO MORE CHARACTERS INC E ;POINT AT NAME IN INPUT BUFFER INC E ; EX DE,HL JP MovName ; BADNAME: LD DE,MSG6ERR CALL PrintString DEC SP DEC SP JP MAIN ; ; ; ClearFCB: LD B,11D ;LENGTH OF NAME,TYPE LD A,Sp ;FILL WITH SPACES LD HL,FCB+1 ;POINT TO F1 POSITION ClrSp: LD (HL),A ;MAKE IT SPACE INC L ;POINT TO NEXT DEC B ;COUNT DOWN JP NZ,ClrSp ;BACK FOR MORE XOR A ;STAGE A 00 LD B,24D ;DO REMAINING SPACES Set00: LD (HL),A ;MAKE THEM ZERO INC L ;POINT TO NEXT DEC B ;COUNT DOWN RET Z ;IF ALL DONE JP Set00 ;BACK FOR NEXT ; OpenFile: LD DE,FCB LD BC,0000FH ;OPEN FILE CALL BIOS CP 0FFH ;TEST IF OK JP NZ,GoodOpen ;SKIP FORWARD IF GOOD BadOpen: ;ELSE LD DE,MSG1ERR ; MSG=FILE NOT FOUND CALL PrintString DEC SP ;RESET DEC SP JP MAIN ;RETRY FOR FILE NAME ENTRY ; ; ; ; GoodOpen: XOR A ;ZERO REGISTER A LD (FCB+32),A ;ZERO CURRENT RECORD POSITION OF FCB RET ; ReadFile: PUSH HL PUSH DE PUSH BC LD DE,FCB LD BC,00014H ;READ SEQUENTIAL CALL BIOS POP BC POP DE POP HL CP 000H ;GOOD READ RETURNS 00 IN REGISTER A RET Z ;THEREFOR RETURN NOW IF ALL OK CP 001H ;ELSE IF RETURNS 01 JP Z,EndData ;SKIP TO EndData LD DE,MSG2ERR ;SAY READ ERROR CALL PrintString RET ; ; BREAK: ;TEST IF CHARACTER WAITING FROM ;CONSOLE LD C,00BH ;GET CONSOLE STATUS CALL BIOS CP 0FFH ;TEST IF WAITING RET NZ ;BACK IF NONE LD C,01H ;IF WAITING CALL BIOS ;GET IT CP 003H ;TEST FOR CONTROL C JP Z,ABORT ;QUIT IF IT IS RET ; ; ; PrintString: LD C,009H ;PRINT STRING JP BIOS ; EndData: XOR A ;STAGE A ZERO VALUE CALL SENDBOTHHEX ;SEND 00 CHARACTER LD HL,ADDRLO LD A,(HL) ;GET LOW BYTE OF VIRTUAL SOURCE ADDRESS INC A ;COUNT 1 MORE00: LD B,A ;SAVE COUNT IN B AND 00FH ;MASK OFF HIGH 4 BITS CP 000H ;TEST IF 16 DONE IN LINE JP Z,FINISH ;IF SO ALL DONE LD A,000H ;ELSE STAGE NEXT A TO SEND INC B ;COUNT 1 CALL SENDBOTHHEX ;SEND 00 CHARACTER LD A,B ;RESTORE COUNTER TO REGISTER A JP MORE00 ;BACK TO CONTINUE FILLING LINE WITH 00 ; FINISH: CALL CHECKSUM ;END LAST LINE WITH CHECK-SUM CALL NewLine LD A,':' CALL OUTPUT ;START LAST LINE LD A,000H ;RECORD LENGTH OF 00 CALL SENDBOTHHEX LD A,001H ;START ADDRESS HIGH BYTE CALL SENDBOTHHEX XOR A ;START ADDRESS LOW BYTE CALL SENDBOTHHEX LD A,01 ;RECORD TYPE 01 FOR END OF FILE CALL SENDBOTHHEX LD A,0FEH ;CHECK-SUM FOR THIS LINE CALL SENDBOTHHEX CALL NewLine ;FINISH WITH A CR-LF ABORT: LD A,01AH ;STAGE A CTRL-Z CALL OUTPUT ;SEND TO REMOTE TO TERMINATE BLOCK ; TRANSFER OPERATION ENDIT: ;PROGRAM END WITH MESSAGE LD DE,MSG3 CALL PrintString JP WARMBOOT ; ; ; ; ANSWER1or2: LD C,001H ;CONSOLE INPUT CALL BIOS CP 003H ;TEST FOR CONTROL C JP Z,WARMBOOT ;ESCAPE PATH CP 031H RET Z CP 032H RET Z JP ANSWER1or2 ;INCORRECT ANSWER BACK FOR MORE ; ; ; ; NewLine: PUSH AF PUSH BC PUSH DE PUSH HL LD A,Cr ;SEND A CR - LF CALL OUTPUT LD A,Lf CALL OUTPUT CALL BREAK ;TEST FOR CONTROL C TYPED LD HL,LineCount ;GET NUMBER OF LINES LD A,(HL) ;REMAINING IN BLOCK DEC A ;COUNT DOWN CALL Z,WaitToEmptyBuffer ;IF END OF BLOCK LD (HL),A ;SAVE NEW COUNT POP HL POP DE POP BC POP AF RET ; WaitToEmptyBuffer: LD A,013H ;SEND X-OFF (CNTRL S) CALL OUTPUT LD A,013H ;SEND IT AGAIN TO BE SURE CALL OUTPUT LD DE,MSG4 ;MSG "SENDING X-OFF...." LD C,009H ;PRINT STRING CALL BIOS LD B,00BH DELAY2: DJNZ DELAY ;GET ONE UNIT OF DELAY LD DE,MSG5 ;MSG "REMOTE SHOULD BE DONE" LD C,009H ;PRINT STRING CALL BIOS LD HL,LineCount LD A,LINES ;RESET NUMBER OF LINES PER BLOCK RET ; DELAY: PUSH BC ;SAVE DELAY COUNT LD E,'*' ;ACTIVITY INDICATOR LD C,002H ;CONSOLE OUT CALL BIOS LD E,Sp ;SEND A SPACE LD C,002H ;CONSOLE OUT CALL BIOS LD HL,0AFFFH ;DELAY LOOP DELAY1: INC HL ;WASTE TIME DEC HL ;WASTE TIME DEC HL ;WASTE TIME EX (SP),IX ;WASTE TIME EX (SP),IX ;WASTE TIME LD A,H ;TEST FOR OR L ;END OF DELAY JR NZ,DELAY1 ;TEST IF DONE POP BC ;RETURN DELAY COUNT IN B JR DELAY2 ;BACK FOR NEXT CYCLE ; ; ; ; MSG1: DEFB Ff DEFB Sp DEFB Sp DEFB Sp DEFB Sp DEFB Sp DEFB Sp DEFB Sp DEFB Sp DEFB Sp DEFB Sp DEFB Sp DEFB Sp DEFB Sp DEFB Sp DEFM 'H E X L I N K' DEFB Cr DEFB Lf DEFB Sp DEFB Sp DEFB Sp DEFB Sp DEFB Sp DEFB Sp DEFB Sp DEFB Sp DEFB Sp DEFB Sp DEFB Sp DEFB Sp DEFB Sp DEFB Sp DEFB Sp DEFB Sp DEFB Sp DEFB Sp DEFM 'VERSION 4.0' DEFB Cr DEFB Lf DEFB Lf DEFM 'TO TRANSFER A COM FILE TO ANOTHER COMPUTER IN THE HEX ' DEFM 'FORMAT' DEFB Cr DEFB Lf DEFM 'THE RECEIVING SYSTEM DOES NOT REQUIRE ANY SPECIAL ' DEFM 'FILE TRANSFER PROGRAM' DEFB Cr,Lf DEFM 'INSTEAD ALL THAT IS NEED TO RECEIVE A COM FILE IS PIP' DEFB Cr,Lf,Lf DEFM 'THE RECEIVING SYSTEM SHOULD BE SET-UP TO RECEIVE VIA THE' DEFM ' READER INPUT' DEFB Cr,Lf DEFM 'THE RECEIVING SYSTEM SHOULD BE WAITING FOR THE TRANSFER' DEFB Cr,Lf DEFM 'AFTER THE FOLLOWING PIP COMMAND: PIP FILENAME.HEX=RDR:[BE]' DEFB Cr,Lf DEFM 'THIS PROGRAM WILL WAIT FOR THE RECEIVING SYSTEM TO TRANSFER ' DEFM 'EACH' DEFB Cr,Lf DEFM 'BLOCK TO DISK. THEREFORE ANY LENGTH FILE CAN BE TRANSFERRED' DEFB Cr DEFB Lf DEFM 'THIS TRANSFER WILL BE DONE VIA THE PORT ASSIGNED BY THE' DEFM ' CP/M SYSTEM' DEFB Cr,Lf DEFM 'TO EITHER THE "LST:" OR THE "PUN:" LOGICAL DEVICE' DEFB Cr,Lf DEFB Lf DEFB Lf DEFM 'SELECT ONE OF THE FOLLOWING:' DEFB Sp DEFB Sp DEFM '(TYPE THE NUMBER)' DEFB Cr DEFB Lf DEFB Sp DEFB Sp DEFB Sp DEFB Sp DEFB '1' DEFB Sp DEFB '-' DEFB Sp DEFM 'THE PUNCH PORT (PUN:)' DEFB Cr DEFB Lf DEFB Sp DEFB Sp DEFB Sp DEFB Sp DEFB '2' DEFB Sp DEFB '-' DEFB Sp DEFM 'THE LISTING PORT (LST:)' DEFB Cr DEFB Lf DEFM '$' ; ; MSG2: DEFB Cr DEFB Lf DEFB Lf DEFM 'SELECT ECHO ON THE CONSOLE:' DEFB Cr DEFB Lf DEFB Sp DEFB Sp DEFB Sp DEFB Sp DEFM '1 - DO NOT ECHO ON THE CONSOLE' DEFB Cr DEFB Lf DEFB Sp DEFB Sp DEFB Sp DEFB Sp DEFM '2 - ECHO TO CONSOLE' DEFB Cr DEFB Lf DEFM '$' ; ; MSG3: DEFB Cr DEFB Lf DEFB Lf DEFB Lf DEFB Sp DEFB Sp DEFB Sp DEFB Sp DEFB Sp DEFB Sp DEFM 'FILE TRANSFER COMPLETED.' DEFB Sp DEFB Sp DEFM '$' DEFB Cr DEFB Lf ; ; MSG4: DEFB Lf DEFB Cr DEFM 'SENDING X-OFF TO THE REMOTE SYSTEM' DEFB Lf DEFB Cr DEFM 'PAUSE TO ALLOW REMOTE WRITE BUFFER TO DISK' DEFB Lf DEFB Cr DEFM '$' ; ; MSG5: DEFB Lf DEFB Cr DEFM 'REMOTE SHOULD BE DONE BY NOW SENDING NEXT BLOCK' DEFB Lf DEFB Cr DEFM '$' ; ; MSG1ERR: DEFB Cr DEFB Lf DEFB Lf DEFM '** ERROR **' DEFB Sp DEFB Sp DEFB Sp DEFB Sp DEFB Sp DEFM 'FILE NOT FOUND' DEFM '$' ; ; ; MSG2ERR: DEFB Cr DEFB Lf DEFM '** ERROR ** READ ERROR' DEFB Sp DEFM '$' ; ; MSG6ERR: DEFB Cr DEFB Lf DEFM '** ERROR **' DEFB Sp DEFB Sp DEFB Sp DEFB Sp DEFB Sp DEFB Sp DEFM 'INCORRECT ENTRY.' DEFM '$' MSG6: DEFB Cr DEFB Lf DEFB Lf DEFB Lf DEFB Lf DEFM 'ENTER DISC,FILE-NAME,AND FILE-TYPE TO BE TRANSFERRED. ' DEFM 'DO NOT USE * OR ?.' DEFB Cr DEFB Lf DEFM '(EX: B:STAT.COM )' DEFB Cr DEFB Lf DEFM '$' ; END