TITLE 'XSTAM transmit module vers 1.304' ; ;******************************** ;* * ;* BSTAM v4.3 * ;* TRANSMIT * ;* LOCAL REV 04 * ;* * ;******************************** ; ; MODIFICATION HISTORY ;===================== ; ; 10/Jun/82 Added error count to abort after a number ; of error messages. ; 06/Aug/81 INCORPORATED K'S FIX TO BUG IN LOCPRT, ; MADE CONSOLE ABORT ASSEMBLE SIMPLE ; RETURN IF QUIET MODE IS TRUE, BROUGHT ; LOCAL REV NUMBER UP TO 3 (R) ; 04/Aug/81 FIXED BUFFER EQUATES (R) ; 31/Jul/81 ADDED QUIET MODE,CONDITIONALS FOR NOT SENDING ; COM FILES, SYS FILES, TAGGED FILES, AND FILES ; WITH NAMES ENDING IN "#" (R) ; ORG 0100H ; FALSE EQU 0 TRUE EQU NOT FALSE ; QUIET EQU TRUE ;TRUE ASSEMBLES TQ.COM NOCOMS EQU TRUE ;TRUE SUPPRESSES COM FILES NOTAGS EQU TRUE ;TRUE SUPPRESSES TAG2 FILES NOSYS EQU TRUE ;TRUE SUPPRESSES SYS FILES NOPNDS EQU TRUE ;TRUE SUPPRESSES FILES ;ENDING IN "#" ; BDOS EQU 5 DBUF EQU 80H DFCB EQU 5CH EXT EQU 0CH SPEED EQU 6 ;CPU Speed in MHz MAXDROP EQU 10 ;Maximum number of line dropouts CARSEC EQU 5 ;Carrier timeout in seconds MAXERR EQU 20 ;Number of error messages before ; quiting, reset after each good block ; CR EQU 13 LF EQU 10 ; VDP80 EQU TRUE ;True for RCPM system VDATA EQU 81H VSTAT EQU 80H VMASK EQU 04H ; PAGE ; ; PRINT MACRO FOR MESSAGES ; TO BE SUPPRESSED IN QUIET MODE ; $-MACRO ;TURN ON SUPPRESSION ; PRINT MACRO STRING LOCAL OVRSTR,MARK JMP OVRSTR MARK: DB CR,LF,STRING OVRSTR: LXI D,MARK ; IF QUIET CALL LOCPRT ;MAYBE PRINT LOCAL ONLY ELSE MVI C,9 ;NON-QUIET, USE BDOS CALL BDOS ENDIF ; ENDM ; ; PRINT MACRO FOR MESSAGES ALWAYS PRINTED ; APRINT MACRO STRING LOCAL OVRSTR,MARK JMP OVRSTR MARK: DB CR,LF,STRING OVRSTR: LXI D,MARK MVI C,9 CALL BDOS ENDM ; ; PAGE ; ; USER AREA ; NOTE: THE USER AREA SHOULD BE SILENT ; WHEN ASSEMBLED FOR TQ.COM ; ; USER EQU $ ;DEFINE USER AREA ; JMP ENTRY ;**************************************************************** ;* * ;* XSTAM Interface routines for 2651 UART. * ;* on Godbout System Support 1 Board * ;* * ;**************************************************************** ; ;************************************************ ;* * ;* 2651 Baud Rate Table * ;* * ;************************************************ ; B50 EQU 0000B ;50 bps B75 EQU 0001B ;75 bps B110 EQU 0010B ;110 bps B134 EQU 0011B ;134.5 bps B150 EQU 0100B ;150 bps B300 EQU 0101B ;300 bps B600 EQU 0110B ;600 bps B1200 EQU 0111B ;1200 bps B1800 EQU 1000B ;1800 bps B2000 EQU 1001B ;2000 bps B2400 EQU 1010B ;2400 bps B3600 EQU 1011B ;3600 bps B4800 EQU 1100B ;4800 bps B7200 EQU 1101B ;7200 bps B9600 EQU 1110B ;9600 bps B19200 EQU 1111B ;19200 bps ; ;************************************************ ;* * ;* 2651 Equates * ;* * ;************************************************ ; BASE EQU 5CH ;UART base register DATA EQU BASE+0 ;Data port MSTATUS EQU BASE+1 ;Status port MODE EQU BASE+2 ;Mode register CMMD EQU BASE+3 ;Command register USERP EQU BASE+7 ;User select port UNUM EQU 6 ;Modem user number MODE1 EQU 01101110B ;Asynch,16x,8 data bits, ; no parity, even, 1 stop bit MODE2 EQU 01110000B + B300 ;Baud rate CMMDB EQU 00100111B ;Tx enabled, RX enabled, no break ; DTR high, RTS high ERESET EQU CMMDB+10H ;Error reset GBDTR EQU 10000000B ;CCITT 108 GBCD EQU 01000000B ;Carrier detect ; SYSSPT EQU TRUE ;True for Godbout system support INTER3 EQU NOT SYSSPT ;True for Godbout Interfacer 3 ; UINITV: JMP INITIU ;UART/USART INITIALATION ENTRY POINT MSTSV: JMP INSPRU ;STATUS PORT READ ENTRY POINT ERRSET: JMP ERRSTU ;UART/USART ERROR RESET ENTRY POINT INPORT: JMP INPRTU ;READ DATA PORT ENTRY POINT OUTPORT: JMP OUTPRU ;WRITE DATA PORT ENTRY POINT ; ; NEW VECTOR FOR LOCAL CONSOLE ; OUTPUT: PRINT CHAR IN C, CAN ; MODIFY ANY REGISTERS ; LCOV: JMP LCO ; INITIU: CALL SIGNON ;Announce version if inter3 MVI A,UNUM OUT USERP ;Select UART endif ;inter3 MVI A,MODE1 ;Get first mode word OUT MODE MVI A,MODE2 ;Get second mode word OUT MODE MVI A,CMMDB ;Get command byte OUT CMMD RET ;Retuen to XSTAM ; INSPRU: RDMSTS: if inter3 MVI A,UNUM OUT USERP ;Select UART endif ;inter3 IN MSTATUS ;GET MODEM STATUS ANI GBCD ;GOT A CARRIER? JNZ CARROK ;YES, GO ON WITH TESTS LDA DROPOUT ;Get dropout count ADI 1 ;Increment it CPI MAXDROP ;Bad line? JZ NOCAR ;Yes, reset system STA DROPOUT ;Save for later PUSH B ;PRESERVE BC SO WE CAN USE IT MVI B,CARSEC*10 ;SETUP TIMEOUT CARLP: CALL DELAY ;WAIT .1 SECONDS IN MSTATUS ;GET MODEM STATUS ANI GBCD ;HAS CARRIER RETURNED? MOV A,B ;PRESERVE COUNTDOWN VALUE POP B ;FIX STACK IN CASE ALL IS OK JNZ CARROK ;GOT CARRIER, CONTINUE ON DCR A ;COUNT TIME DOWN STC ;IN CASE THIS IS THE END OF TIME PUSH B ;PRESERVE B MOV B,A ;GET COUNTER VALUE IN B JNZ CARLP ;KEEP CHECKING POP B NOCAR: LXI D,LOST ;Sending anything to conosle MVI C,9 ; will let BYE grab control if CALL 5 ; carrier lost totally else JMP 0 ; back to CP/M if dropout max ; was reached. ; LOST: DB CR,LF,' ++CARRIER LOST++' DB CR,LF,'The modem is now ' DB 'DISCONNECTED',CR,LF,'$' ; CARROK: if inter3 MVI A,UNUM OUT USERP ;Select UART endif ;inter3 IN MSTATUS ;Get status ORI 4 ;Force Tx empty high RET ; DELAY: PUSH B ;Delay 0.1 second LXI B,SPEED*4167 ;TIMING CONSTANT DELAY1: DCX B MOV A,B ORA C JNZ DELAY1 POP B RET ; ERRSTU: if inter3 MVI A,UNUM OUT USERP ;Select UART endif ;inter3 MVI A,ERESET ;Reset error flags in 2651 OUT CMMD MVI A,CMMDB ;Restore normal operation OUT CMMD RET ; INPRTU: if inter3 MVI A,UNUM OUT USERP ;Select UART endif ;inter3 IN DATA ;Get data RET ; OUTPRU: if inter3 PUSH PSW MVI A,UNUM OUT USERP ;Select UART POP PSW endif ;inter3 OUT DATA ;Send data RET ; ; SIGNON: PUSH B ;Save the environment PUSH D PUSH H LXI D,MESSGE MVI C,9 ;BDOS display string command CALL BDOS ;Announce version to user POP H ;Restore the enviroment POP D POP B RET ; hexnum macro num if (num/16) > 9 db (num/16 and 0fh) + 'A' - 10 else db (num/16 and 0fh) + '0' endif if (num and 0fh) > 9 db (num and 0fh) + 'A' - 10 else db (num and 0fh) + '0' endif endm MESSGE: if not quiet DB CR,LF,LF DB 'Version 1.304, March 29, 1982 by Software Tools',CR,LF DB '2651 UART on ' if sysspt DB 'Godbout System Support 1 Board' endif ;sysspt if inter3 DB 'Godbout Interfacer 3 Board' endif ;sysspt DB CR,LF DB 'UART Addressed at ' hexnum %BASE DB 'H, 300 bps, no parity.',CR,LF if inter3 DB 'UART Relative User ' hexnum %UNUM DB ',',CR,LF endif ;inter3 endif ;not quite DB '$' ; ; NEW HANDLER FOR LOCAL-CONSOLE ; ONLY. PRINT REG C, CAN USE ; ANY REGISTER ; LCO: if vdp80 IN VSTAT ANI VMASK JZ LCO MOV A,C OUT VDATA else LHLD 1 LXI D,9 ;Offset to COUT DAD D PCHL endif ;vdp80 RET ;NULL FOR NOW ; ; END OF USER AREA ; PAGE ORG USER+300 ;ALLOW 300 BYTES USER AREA ; ; BSTAM INITIAL ENTRY POINT ; ENTRY: LXI H,0 DAD SP SHLD STACK LXI SP,STACK JMP BYSTAK ; DB 0,0,0,0,0,0,0,0,0,0,0,0,0 DB 0,0,0,0,0,0,0,0,0,0,0,0,0 DB 0,0,0,0,0,0,0,0,0,0,0,0,0 DB 0,0,0,0,0,0,0,0,0,0,0,0,0 DB 0,0,0,0,0,0,0,0,0,0,0,0,0 DB 0,0,0,0,0,0,0,0,0,0,0,0,0 DB 0,0,0,0,0,0,0,0,0,0,0,0,0 DB 0,0,0,0,0,0,0,0,0,0,0,0,0 DB 0,0,0,0,0,0,0,0,0,0,0,0,0 DB 0,0,0,0,0,0,0,0,0,0,0,0,0 DB 0,0,0,0,0,0,0,0,0,0,0,0,0 DB 0,0,0,0,0,0,0,0,0,0,0,0,0 DB 0,0,0,0,0,0,0,0,0,0,0,0,0 DB 0,0,0,0,0,0,0,0,0,0,0,0,0 DB 0,0,0,0,0,0,0,0,0,0,0,0,0 DB 0,0,0,0,0,0,0,0,0,0,0,0,0 DB 0,0,0,0,0,0,0,0,0,0,0,0,0 DB 0,0,0,0,0,0,0,0,0,0,0,0,0 DB 0,0,0,0,0,0,0,0,0 LXI H,0 DAD SP SHLD STACK LXI SP,STACK JMP BYSTAK ; STACK: DW 0 ; BYSTAK: APRINT 'XSTAM rev 1.304$' APRINT 'Transmit Ready$' APRINT '$' ; PASTMS: LDA DBUF CPI 0 JNZ GOTFIL APRINT '**** NO FILE NAME - PROGRAM ABORTING ****$' JMP EXIT ; GOTFIL: JMP START ; BLDMAP: SHLD NAMSTO LXI H,DBUF MVI C,11H LXI D,DFCB LDAX D STA SDRIVE JMP SRCH2 ; SRCHLP: LXI H,DBUF MVI C,12H LXI D,DFCB SRCH2: CALL 5 LXI H,DBUF CPI 0FFH RZ ANI 3 RLC RLC RLC RLC RLC ADD L MOV L,A ; IF NOTAGS ;CODE TO SKIP TAGGED FILES INX H INX H ;POINT TO F2 BYTE MOV A,M ;LOAD IT DCX H ;POINT BACK DCX H ORA A ;SET FLAGS ON A JM SRCHLP ;AND SKIP IF ATR SET ENDIF ;NOTAGS ; IF NOSYS ;CODE TO SKIP SYS FILES XCHG ;PUT NAME PTR IN DE LXI H,10 ;OFFSET TO T2 BYTE DAD D MOV A,M ;PICK UP T2 XCHG ;RESTORE POINTER ORA A ;SET FLAGS ON A JM SRCHLP ;SKIP IF SYS ATR SET ENDIF ;NOSYS ; IF NOPNDS ;CODE TO SKIP "#" FILES XCHG ;MOVE PTR TO DE LXI H,11 ;OFFSET TO LAST FT CHAR DAD D MOV A,M ;LOAD IT ANI 7FH ;KILL ANY ATR BIT XCHG ;RESTORE POINTER CPI '#' ;GOT A # FILE? JZ SRCHLP ;SKIP IT IF SO ENDIF ;NOPNDS ; IF NOCOMS ;CODE TO SKIP COM FILES XCHG ;MOVE POINTER TO DE LXI H,9 ;OFFSET TO FIRST FT CHAR DAD D MOV A,M ;PICK UP FIRST ANI 7FH ;KILL ATR BIT CPI 'C' ;CHAR 1 OF 'COM' JNZ FILOK ;JMP, NOT COM INX H ;GOT C, CHECK FOR 'O' MOV A,M ;PICK UP 2ND FILETYPE CHAR ANI 7FH ;KILL ATTRIBUTE CPI 'O' JNZ FILOK ;NO COM, FILE OK TO SEND INX H ;GOT 'CO', CHECK FOR 'M' MOV A,M ANI 7FH ;STRIP ATR CPI 'M' ;NOW...HAVE WE GOT 'COM'? JZ SRCHLP ;SKIP IF SO FILOK: XCHG ;NOPE, RESTORE NAME PTR ENDIF ;NOCOMS ; LDA SDRIVE MOV M,A CALL MOVNAM JMP SRCHLP MOVNAM: MVI B,12 XCHG LHLD NAMSTO XCHG MOVLP: MOV A,M ANI 7FH ;KILL ANY ATTRIBUTES STAX D INX H INX D DCR B JNZ MOVLP XCHG SHLD NAMSTO RET ; SDRIVE: DB 0 NAMSTO: DW 0 ; START: LXI H,BUFFER CALL BLDMAP LXI H,BUFFER SHLD NAMPTR MORCHK: MVI A,0 STA FILFLG CALL INI LDA FILFLG CPI 1 JZ NOMORE MAIN: LDA FILFLG SUI 0 JNZ NOMORE CALL SNDFIL JMP MAIN ; NOMORE: CALL CLNUP EXIT: LDA FILFLG SUI 2 JZ MORCHK LHLD STACK SPHL RET ; ; LOCAL PRINT SUBROUTINE...EMULATES BDOS ; FUNCTION 9 ON LOCAL CONSOLE WHEN 'QUIET' ; CONDITIONAL TRUE...USES LOCAL CO VECTOR ; IN USER AREA (WHICH CAN SIMPLY DO RET ; TO BE TRULY QUIET). ; IF QUIET LOCPRT: LDAX D ;PICK UP CHAR INX D ;POINT PAST IT CPI '$' ;GOT TERMINATOR? RZ ;WE'RE DONE IF SO MOV C,A ;NOT TERM, OUTPUT IT PUSH D ;SAVE STRING PTR CALL LCOV ;SEND IT POP D ;GET STR PTR BACK JMP LOCPRT ;PRINT REST OF STRING ENDIF ;QUIET ; INI: MVI A,0 STA L12A9 STA L1522 STA FILFLG STA ERRCNT ;Reset error count STA L12B7 STA ERRHIT ;Reset error count MVI A,1 STA L1510 CALL UINITV PRINT '**** CONNECTING TO REMOTE CPU ****$' JMP L079A ; L050E: SHLD L0781 SHLD L0785 XCHG SHLD L0789 MOV H,B MOV L,C SHLD L0787 STA L078B MVI A,0 LHLD L0789 MOV M,A INX H INX H INX H MOV M,A DCX H MVI A,0FFH MOV M,A DCX H MVI A,0 MOV M,A INX H INX H INX H MOV M,A INX H MVI A,0FFH MOV M,A MVI A,1 STA L0784 STA L0783 CALL ERRSET ;Reset UART errors L0545: LDA L0784 SUI 1 JNZ L0780 LHLD L0787 MOV A,M LHLD L0789 INX H INX H INX H CMP M JNZ L0697 MVI A,0 STA L0784 JMP L05DB MODOUT: STA L05DA SHLD L05D5 XCHG SHLD L05D7 MODLP: CALL MSTSV STA STATUS ANI 1 JZ MODLP LDA STATUS ANI 4 JZ MODLP LHLD L05D7 MOV A,M CALL OUTPORT L0587: CALL MSTSV ANI 4 JZ L0587 LDA L05DA CPI 1 RNZ LHLD L05D5 INX H INX H MOV D,M INX H INX H INX H MOV E,M LHLD L05D7 MOV A,M XCHG JMP L05C6 ; CRCADD: XRA H MOV B,A RLC RLC RLC RLC XRA B MOV C,A ANI 0F0H MOV D,A ADD C MOV E,A MOV A,D ACI 0 XRA L MOV H,A MOV A,B ANI 0F0H MOV B,A XRA E MOV L,A MOV A,B RRC RRC RRC XRA H MOV H,A RET ; L05C6: CALL CRCADD XCHG LHLD L05D5 INX H INX H MOV M,D INX H INX H INX H MOV M,E RET ; L05D5: DW 0 L05D7: DW 0 STATUS: DB 0 L05DA: DB 0 ; L05DB: LHLD L0789 XCHG LHLD L078F XCHG MVI A,1 CALL MODOUT CALL MSTSV ANI 2 JZ L05FA LHLD L0789 MVI A,2 ORA M MOV M,A JMP L077D ; L05FA: LDA L078B CPI 1 JZ L0612 LHLD L0789 XCHG LHLD L0792 XCHG MVI A,1 CALL MODOUT JMP L063E ; L0612: LHLD NAMPTR INX H MOV A,M CPI 0 JZ NONAMS MVI A,2 STA FILFLG LHLD L0789 XCHG LHLD L078C XCHG MVI A,1 CALL MODOUT JMP L063E ; NONAMS: LHLD L0789 XCHG LHLD L0795 XCHG MVI A,1 CALL MODOUT L063E: CALL MSTSV ANI 2 JZ L0650 LHLD L0789 MVI A,2 ORA M MOV M,A JMP L077D ; L0650: LHLD L0789 INX H INX H SHLD L0798 LHLD L0789 XCHG LHLD L0798 XCHG MVI A,0 CALL MODOUT CALL MSTSV ANI 2 JNZ L068D LHLD L0789 INX H INX H INX H INX H INX H SHLD L0798 LHLD L0789 XCHG LHLD L0798 XCHG MVI A,0 CALL MODOUT CALL MSTSV ANI 2 JZ L077D L068D: LHLD L0789 MVI A,2 ORA M MOV M,A JMP L077D ; L0697: CALL MSTSV ANI 2 JZ L06AE LHLD L0789 MVI A,2 ORA M MOV M,A MVI A,0 STA L0784 JMP L077D ; L06AE: LDA L0783 SUI 1 JNZ L071E LHLD L0789 INX H INX H INX H MOV A,M INR A MOV M,A LHLD L0789 XCHG LHLD L0785 XCHG MVI A,1 CALL MODOUT LHLD L0785 INX H SHLD L0785 CALL MSTSV ANI 2 JZ L06EA LHLD L0789 MVI A,2 ORA M MOV M,A MVI A,0 STA L0784 JMP L077D ; L06EA: LHLD L0789 INX H INX H INX H MOV A,M INR A MOV M,A LHLD L0789 XCHG LHLD L0785 XCHG MVI A,1 CALL MODOUT LHLD L0785 INX H SHLD L0785 DCX H MVI A,2 CMP M JNZ L0716 MVI A,0 STA L0783 JMP L077D ; L0716: MVI A,0 STA L0784 JMP L077D ; L071E: LHLD L0789 INX H INX H INX H MOV A,M INR A MOV M,A LHLD L0789 XCHG LHLD L0785 XCHG MVI A,1 CALL MODOUT LHLD L0785 INX H SHLD L0785 CALL MSTSV ANI 2 JZ L0752 LHLD L0789 MVI A,2 ORA M MOV M,A MVI A,0 STA L0784 JMP L077D ; L0752: LHLD L0785 DCX H MVI A,10H CMP M JNZ L077D LHLD L0789 XCHG LHLD L078F XCHG MVI A,1 CALL MODOUT CALL MSTSV ANI 2 JZ L077D LHLD L0789 MVI A,2 ORA M MOV M,A MVI A,0 STA L0784 L077D: JMP L0545 ; L0780: RET ; L0781: DW 0 L0783: DB 0 L0784: DB 0 L0785: DW 0 L0787: DW 0 L0789: DW 0 L078B: DB 0 L078C: DW L078E L078E: DB 1BH L078F: DW L0791 L0791: DB 10H L0792: DW L0794 L0794: DB 3 L0795: DW L0797 L0797: DB 17H L0798: DW 0 ; L079A: LXI H,L1511 LXI D,STSTOR LXI B,L12B4 MVI A,0 CALL L050E L07A8: LDA L1510 SUI 1 JNZ L0CC8 LDA STSTOR CPI 0 JZ L0989 JMP ERRORS ; ERRCHK: SHLD STSPTR MVI A,80H ANA M JZ PARCHK PRINT '**** FRAMING ERROR ****$' PARCHK: LHLD STSPTR MVI A,40H ANA M JZ OVRCHK PRINT '**** PARITY ERROR ****$' OVRCHK: LHLD STSPTR MVI A,20H ANA M JZ BCCHCK PRINT '**** OVERRUN ERROR ****$' BCCHCK: LHLD STSPTR MVI A,10H ANA M JZ LOSCHK PRINT '**** BCC ERROR ****$' LOSCHK: LHLD STSPTR MVI A,8 ANA M JZ TIMCHK PRINT '**** LOST DATA ERROR ****$' TIMCHK: LHLD STSPTR MVI A,4 ANA M JZ EXCHEK PRINT '**** TIME OUT ERROR ****$' EXCHEK: LHLD STSPTR MVI A,2 ANA M JZ LENCHK PRINT '**** EXCEPTION ERROR ****$' LENCHK: LHLD STSPTR MVI A,1 ANA M JZ HITS PRINT '**** LENGTH ERROR ****$' ; HITS: LDA ERRHIT INR A STA ERRHIT CPI MAXERR RNZ PRINT '**** ABORTED, TOO MANY ERRORS ****$' XRA A STA L12A8 JMP EXIT ; STSPTR: DW 0 ; ERRORS: LXI H,STSTOR CALL ERRCHK JMP L0986 ; STOPCK: MVI C,11 CALL 5 ORA A ;Character at console? RZ ;No MVI C,1 ;Yes CALL 5 CPI 3 ;Abort (control-c)? RNZ ;No PRINT '**** ABORTED BY USER ****$' XRA A STA L12A8 JMP EXIT ; L0986: CALL STOPCK L0989: JMP L0C38 ; L098C: SHLD L0C33 XCHG SHLD L0C36 STA L0C35 LHLD L0C33 SHLD L0C31 MVI A,1 STA L0C2C STA L0C2D STA L0C2F MVI A,0 STA L0C2E LHLD L0C36 MOV M,A INX H MOV M,A INX H MVI A,0FFH MOV M,A INX H MVI A,0 MOV M,A INX H MOV M,A INX H MVI A,0FFH MOV M,A L09C0: LDA L0C2F SUI 1 JNZ L0C2B LHLD L0C36 INX H INX H INX H LDA L0C35 CMP M JNZ L0A0A MVI A,0 STA L0C2F LHLD L0C31 DCX H DCX H MOV A,M CPI 10H JNZ L0A00 INX H MOV A,M CPI 6 JZ L0C28 CPI 15H JZ L0C28 CPI 5 JZ L0C28 CPI 3 JZ L0C28 CPI 17H JZ L0C28 L0A00: LHLD L0C36 MVI A,1 ORA M MOV M,A JMP L0C28 ; L0A0A: LHLD L0C36 MVI A,0 MOV M,A JMP L0AAF ; GFMODM: SHLD HLSAVE STA ASAVE LHLD L0AAB SHLD L0AA9 L0A1F: CALL MSTSV STA L0AAE LDA L0AAE ANI 10H JZ L0A38 CALL ERRSET LHLD HLSAVE MVI A,20H ORA M MOV M,A RET ; L0A38: LDA L0AAE ANI 8 JZ L0A4B CALL ERRSET LHLD HLSAVE MVI A,40H ORA M MOV M,A RET ; L0A4B: LDA L0AAE ANI 2 JZ L0A85 CALL INPORT STA L0AAE LDA ASAVE CPI 1 JZ L0A65 LDA L0AAE RET ; L0A65: LHLD HLSAVE INX H INX H MOV D,M INX H INX H INX H MOV E,M LDA L0AAE XCHG CALL CRCADD XCHG LHLD HLSAVE INX H INX H MOV M,D INX H INX H INX H MOV M,E LDA L0AAE RET ; L0A85: LHLD L0AA9 DCX H MVI A,0 CMP H JZ L0A95 SHLD L0AA9 JMP L0A1F ; L0A95: CMP L JZ L0A9F SHLD L0AA9 JMP L0A1F ; L0A9F: LHLD HLSAVE MVI A,4 ORA M MOV M,A RET ; HLSAVE: DW 0 L0AA9: DW 0 L0AAB: DW 0 ASAVE: DB 0 L0AAE: DB 0 ; L0AAF: LHLD L0C36 MVI A,1 CALL GFMODM STA L0C30 LHLD L0C36 MVI A,0 CMP M JZ L0ACB MVI A,0 STA L0C2F JMP L0C28 ; L0ACB: LDA L0C2C SUI 1 JNZ L0B43 LDA L0C2D SUI 1 JNZ L0AFB LDA L0C30 CPI 10H JNZ L0AEB MVI A,0 STA L0C2D JMP L0B2A L0AEB: LHLD L0C36 MVI A,8 ORA M XCHG STAX D MVI A,0 STA L0C2F JMP L0B2A ; L0AFB: LDA L0C30 CPI 2 JNZ L0B0B MVI A,0 STA L0C2C JMP L0B2A ; L0B0B: LDA L0C30 CPI 6 JZ L0B25 CPI 15H JZ L0B25 CPI 5 JZ L0B25 MVI A,8 LHLD L0C36 ORA M XCHG STAX D L0B25: MVI A,0 STA L0C2F L0B2A: LDA L0C30 LHLD L0C31 XCHG STAX D INX D XCHG SHLD L0C31 LHLD L0C36 INX H INX H INX H MOV A,M INR A MOV M,A JMP L0C28 ; L0B43: LDA L0C2E SUI 1 JNZ L0C07 LDA L0C30 CPI 10H JNZ L0B6F MVI A,0 STA L0C2E LDA L0C30 LHLD L0C31 MOV M,A INX H SHLD L0C31 LHLD L0C36 INX H INX H INX H MOV A,M INR A MOV M,A JMP L0C28 ; L0B6F: LDA L0C30 CPI 17H JZ L0B9F CPI 3 JZ L0B9F CPI 1BH JZ L0B9F LHLD L0C36 MVI A,8 ORA M MOV M,A LDA L0C30 LHLD L0C31 MOV M,A INX H SHLD L0C31 LHLD L0C36 INX H INX H INX H MOV A,M INR A MOV M,A JMP L0BFF ; L0B9F: MVI A,10H LHLD L0C31 MOV M,A INX H LDA L0C30 MOV M,A LHLD L0C36 INX H INX H INX H MOV A,M INR A INR A MOV M,A LHLD L0C36 MVI A,0 CALL GFMODM STA L0C30 LHLD L0C36 MVI A,0 CMP M JNZ L0BFF INX H LDA L0C30 MOV M,A LHLD L0C36 MVI A,0 CALL GFMODM STA L0C30 LHLD L0C36 MVI A,0 CMP M JNZ L0BFF INX H INX H INX H INX H LDA L0C30 MOV M,A INX H CMP M JNZ L0BF8 LHLD L0C36 INX H MOV A,M INX H CMP M JZ L0BFF L0BF8: MVI A,10H LHLD L0C36 ORA M MOV M,A L0BFF: MVI A,0 STA L0C2F JMP L0C28 ; L0C07: LDA L0C30 CPI 10H JNZ L0C17 MVI A,1 STA L0C2E JMP L0C28 ; L0C17: LHLD L0C31 MOV M,A INX H SHLD L0C31 LHLD L0C36 INX H INX H INX H MOV A,M INR A MOV M,A L0C28: JMP L09C0 L0C2B: RET ; L0C2C: DB 0 L0C2D: DB 0 L0C2E: DB 0 L0C2F: DB 0 L0C30: DB 0 L0C31: DW 0 L0C33: DW 0 L0C35: DB 0 L0C36: DW 0 ; L0C38: LXI H,L1380 LXI D,L1519 MVI A,2 CALL L098C LDA L1519 CPI 0 JZ L0C65 LXI H,L1519 CALL ERRCHK CALL STOPCK LXI H,L1511 LXI D,STSTOR LXI B,L12B4 MVI A,0 CALL L050E JMP L0CC5 ; L0C65: LDA L1380 CPI 10H JNZ L0C7D LDA SYNCB CPI 6 JNZ L0C7D MVI A,0 STA L1510 JMP L0CC5 L0C7D: PRINT '**** CONNECTION IS STILL IN PROGRESS ****$' CALL STOPCK LXI H,L1511 LXI D,STSTOR LXI B,L12B4 MVI A,0 CALL L050E L0CC5: JMP L07A8 ; L0CC8: XRA A STA ERRHIT ;Reset error count PRINT '**** REMOTE CPU IS NOW CONNECTED ****$' RET ; SNDFIL: MVI A,1 STA L151F STA L1520 MVI A,0 STA ERRCNT STA ERRSFL LDA L1522 SUI 1 JZ OPENOK LHLD NAMPTR LXI D,DFCB MVI C,0CH MV1: MOV A,M STAX D INX H INX D DCR C JNZ MV1 LXI D,L12B8 LHLD NAMPTR INX H MVI C,0BH MV2: MOV A,M STAX D INX H INX D DCR C JNZ MV2 SHLD NAMPTR MVI A,1 STA L1522 MVI B,8 LXI H,DFCB+1 LXI D,FILNAM MV3: MOV A,M STAX D INX H INX D DCR B JNZ MV3 INX D MVI B,3 MV4: MOV A,M STAX D INX H INX D DCR B JNZ MV4 FILNAM EQU $+24+3 PRINT '---- TRANSMITING FILE --------.--- ----$' JMP BLDFCB ; MOVE: MOV A,M STAX D INX H INX D DCR C JNZ MOVE RET ; BLDFCB: LXI H,DFCB LXI D,MYFCB MVI C,0CH CALL MOVE JMP PSTFCB ; MYFCB: DB '****$',0EH,9,11H,80H,0CH DB 0CDH,5 DB 0,0CDH,'4',9,'!',11H,15H,11H DB 13H,15H,1,0B4H,12H,'>',0,0CDH DB 0EH,5,0C3H,0A8H FILREC: DB 7 FILBAS: DW L1B25 BUFLEN: DW L1380 BUFPTR: DW L2A0A ; PSTFCB: JMP OPNFCB ; RDFILE: LHLD BUFLEN XCHG LHLD BUFPTR MOV A,L SUB E MOV A,H SBB D JC NOREAD LXI H,0 SHLD BUFPTR RDLOOP: XCHG LHLD BUFLEN MOV A,E SUB L MOV A,D SBB H JNC L0E19 LHLD FILBAS DAD D XCHG MVI C,1AH CALL 5 LXI D,MYFCB MVI C,14H CALL 5 ORA A JNZ BADRD LXI D,DBUF LHLD BUFPTR DAD D SHLD BUFPTR JMP RDLOOP ; BADRD: LHLD BUFPTR SHLD BUFLEN L0E19: LXI D,DBUF MVI C,1AH CALL 5 LXI H,0 SHLD BUFPTR NOREAD: XCHG LHLD FILBAS DAD D XCHG LHLD BUFLEN MOV A,L ORA H MVI A,1AH RZ LDAX D LHLD BUFPTR INX H SHLD BUFPTR RET ; OPNFCB: XRA A STA MYFCB+EXT STA FILREC LXI H,1380H ;LENGTH OF BUFFER SHLD BUFLEN SHLD BUFPTR MVI C,0FH LXI D,MYFCB CALL 5 INR A JNZ OPENOK MVI C,9 LXI D,NOFEMS CALL 5 JMP 0 ; NOFEMS: DB CR,LF,'NO SOURCE FILE$' ; OPENOK: CALL RDFILE JNZ L0E84 MVI A,1 STA FILFLG JMP L0EF4 ; L0E84: MVI C,80H LXI H,L1448 L0E89: MOV M,A INX H SHLD L12AE DCR C JZ L0EF4 MOV A,C STA L12B2 CALL RDFILE JNZ OKRD PRINT '**** BUG 2 IN PROGRAM CONTACT SOFTWARE TOOLS ****$' MVI A,1 STA FILFLG STA ERRSFL RET ; OKRD: STA L12B3 LDA L12B2 MOV C,A LHLD L12AE LDA L12B3 JMP L0E89 ; L0EF4: LDA L151F SUI 1 JNZ BLOKCK LDA FILFLG CPI 0 JZ L0F2E LDA L12A9 SUI 0 JNZ L0F1D LXI H,L12B5 LXI D,STSTOR LXI B,L12AC MVI A,1 CALL L050E JMP L0F55 ; L0F1D: LXI H,L12B5 LXI D,STSTOR LXI B,L12AD MVI A,1 CALL L050E JMP L0F55 ; L0F2E: LDA L12A9 SUI 0 JNZ L0F47 LXI H,L12B5 LXI D,STSTOR LXI B,L12AC MVI A,0 CALL L050E JMP L0F55 ; L0F47: LXI H,L12B5 LXI D,STSTOR LXI B,L12AD MVI A,0 CALL L050E L0F55: LDA STSTOR CPI 0 JZ L1009 L0F5D: LDA L1520 SUI 1 JNZ L1006 LXI H,STSTOR CALL ERRCHK LDA ERRCNT INR A STA ERRCNT LDA ERRCNT SUI 0C8H JC RETRY JZ RETRY APRINT '**** PERMANENT TRANSMISSION ERROR - PROGRAM ABORTING ****$' MVI A,1 STA FILFLG STA ERRSFL MVI A,0 STA L151F STA L1520 RETRY: LXI H,L1380 LXI D,L1519 MVI A,2 CALL L098C LDA L1519 SUI 0 JZ L0FFE LXI H,L1519 CALL ERRCHK LXI H,L1523 LXI D,STSTOR LXI B,L12B4 MVI A,0 CALL L050E JMP L1003 ; L0FFE: MVI A,0 STA L1520 L1003: JMP L0F5D ; L1006: JMP L11E5 ; L1009: LDA L1520 SUI 1 JNZ L11E5 LXI H,L1380 LXI D,L1519 MVI A,2 CALL L098C LDA L1519 SUI 0 JZ L10B7 LDA FILFLG SUI 0 JZ L1034 LDA L1519 SUI 4 JZ L10C7 L1034: LXI H,L1519 CALL ERRCHK LDA ERRCNT INR A STA ERRCNT LDA ERRCNT SUI 0C8H JC RETRY2 JZ RETRY2 APRINT '**** PERMANENT TRANSMISSION ERROR - PROGRAM ABORTING ****$' MVI A,1 STA FILFLG STA ERRSFL MVI A,0 STA L151F STA L1520 JMP L10B4 ; RETRY2: LXI H,L1523 LXI D,STSTOR LXI B,L12B4 MVI A,0 CALL L050E L10B4: JMP RETRY3 ; L10B7: LDA L1380 CPI 10H JNZ L10E9 LDA SYNCB CPI 6 JNZ L10E9 L10C7: LDA L12B7 INR A STA L12B7 LXI H,L1448 LXI D,L12B8 MVI C,80H L10D6: MOV A,M STAX D INX H INX D DCR C JNZ L10D6 MVI A,0 STA L151F STA L1520 JMP RETRY3 ; L10E9: LDA SYNCB CPI 5 JNZ SYNCOK PRINT '**** SYNCHRONIZATION ERROR ****$' PRINT '**** WILL ATTEMPT TO RE-TRANSMIT FILE ****$' XRA A STA ERRHIT INR A STA ERRSFL INR A STA FILFLG LHLD NAMPTR DCX H DCX H DCX H DCX H DCX H DCX H DCX H DCX H DCX H DCX H DCX H DCX H SHLD NAMPTR JMP L11DA SYNCOK: MVI A,0 STA L1520 LDA ERRCNT INR A STA ERRCNT LDA ERRCNT SUI 0C8H JC RETRY3 JZ RETRY3 PRINT '**** PERMANENT TRANSMISSION ERROR - PROGRAM ABORTING ****$' MVI A,1 STA FILFLG STA ERRSFL L11DA: MVI A,0 STA L151F STA L1520 RETRY3: JMP L1009 ; L11E5: MVI A,1 STA L1520 JMP L0EF4 BLOKCK: LDA ERRSFL SUI 1 JZ BKBACK PRINT '**** BLOCK TRANSMITTED CORRECTLY ****$' XRA A STA ERRHIT ;Reset error count INR A STA L12A9 BKBACK: RET ; CLNUP: LDA ERRSFL CPI 0 JNZ CLBACK PRINT '---- FILE HAS BEEN COMPLETELY TRANSMITTED ----$' PRINT '**** DISCONNECTING FROM REMOTE CPU ****$' CLBACK: RET ; L12A8: DB 0 L12A9: DB 0 FILFLG: DB 0 ERRCNT: DB 0 L12AC: DB 0EH L12AD: DB 83H L12AE: DB 0,0 NAMPTR: DB 0,0 L12B2: DB 0 L12B3: DB 0 L12B4: DB 2 L12B5: DB 10H,2 L12B7: DB 0 L12B8: DB 0,0,0,0,0,0,0,0,0,0,0,0,0 DB 0,0,0,0,0,0,0,0,0,0,0,0,0 DB 0,0,0,0,0,0,0,0,0,0,0,0,0 DB 0,0,0,0,0,0,0,0,0,0,0,0,0 DB 0,0,0,0,0,0,0,0,0,0,0,0,0 DB 0,0,0,0,0,0,0,0,0,0,0,0,0 DB 0,0,0,0,0,0,0,0,0,0,0,0,0 DB 0,0,0,0,0,0,0,0,0,0,0,0,0 DB 0,0,0,0,0,0,0,0,0,0,0,0,0 DB 0,0,0,0,0,0,0,0,0,0,0,0,0 DB 0,0,0,0,0,0,0,0,0,0,0,0,0 DB 0,0,0,0,0,0,0,0,0,0,0,0,0 DB 0,0,0,0,0,0,0,0,0,0,0,0,0 DB 0,0,0,0,0,0,0,0,0,0,0,0,0 DB 0,0,0,0,0,0,0,0,0,0,0,0,0 DB 0,0,0,0,0 L1380: DB 0 SYNCB: DB 0,0,0,0,0,0,0,0,0,0,0,0,0 DB 0,0,0,0,0,0,0,0,0,0,0,0,0 DB 0,0,0,0,0,0,0,0,0,0,0,0,0 DB 0,0,0,0,0,0,0,0,0,0,0,0,0 DB 0,0,0,0,0,0,0,0,0,0,0,0,0 DB 0,0,0,0,0,0,0,0,0,0,0,0,0 DB 0,0,0,0,0,0,0,0,0,0,0,0,0 DB 0,0,0,0,0,0,0,0,0,0,0,0,0 DB 0,0,0,0,0,0,0,0,0,0,0,0,0 DB 0,0,0,0,0,0,0,0,0,0,0,0,0 DB 0,0,0,0,0,0,0,0,0,0,0,0,0 DB 0,0,0,0,0,0,0,0,0,0,0,0,0 DB 0,0,0,0,0,0,0,0,0,0,0,0,0 DB 0,0,0,0,0,0,0,0,0,0,0,0,0 DB 0,0,0,0,0,0,0,0,0,0,0,0,0 DB 0,0,0,0 L1448: DB 0,0,0,0,0,0,0,0,0,0,0,0,0 DB 0,0,0,0,0,0,0,0,0,0,0,0,0 DB 0,0,0,0,0,0,0,0,0,0,0,0,0 DB 0,0,0,0,0,0,0,0,0,0,0,0,0 DB 0,0,0,0,0,0,0,0,0,0,0,0,0 DB 0,0,0,0,0,0,0,0,0,0,0,0,0 DB 0,0,0,0,0,0,0,0,0,0,0,0,0 DB 0,0,0,0,0,0,0,0,0,0,0,0,0 DB 0,0,0,0,0,0,0,0,0,0,0,0,0 DB 0,0,0,0,0,0,0,0,0,0,0,0,0 DB 0,0,0,0,0,0,0,0,0,0,0,0,0 DB 0,0,0,0,0,0,0,0,0,0,0,0,0 DB 0,0,0,0,0,0,0,0,0,0,0,0,0 DB 0,0,0,0,0,0,0,0,0,0,0,0,0 DB 0,0,0,0,0,0,0,0,0,0,0,0,0 DB 0,0,0,0,0 L1510: DB 0 L1511: DB 10H,5 STSTOR: DB 0,0,0,0,0,0 L1519: DB 0,0,0,0,0,0 L151F: DB 0 L1520: DB 0 ERRSFL: DB 0 L1522: DB 0 L1523: DB 10H,15H DROPOUT: DB 0 ;Carrier dropout count ERRHIT: DB 0 ;Error count BUFFER: DB 0 ; REPT 256 ;GET 2K OF ZEROES DW 0,0,0,0,0,0,0,0 ENDM ; L1B25 EQU BUFFER+600H L2A0A EQU BUFFER + (2A0AH-1525H) ; END