; Crosstalk I/O Primitives for Morrow Decisions 1 org 100h start: jmp init ; go do initialization FILEDES:DW 0000 ;STORAGE FOR FILE DESCRIPTOR STTYSTR:DB 9 ;INPUT SPEED = 1200 BAUD DB 9 ;OUTPUT SPEED = 1200 BAUD DB 08 ;ERASE CHARACTER DB 18h ;KILL CHARACTER DW 20h ;NO CTS,RAW,NO CR->LF MAP,NO ECHO,NO EXPAND TAB CONDES: DW 0000 ;STORAGE FOR CONSOLE FILE DESCRIPTOR JMP STAT NCHAR: DB 00h ;NUMBER OF CHARACTERS READ FROM uNIX CONSOLE:DB '/dev/ttyA' DB 0 ;NULL TERMINATION org 120h JMP SIN MDMPORT:DB '/dev/ttyC' DB 0 ;NULL TERMINATION org 130h JMP SOUT STTYCON:DB 13d ;INPUT SPEED = 9600 BAUD DB 13d ;OUTPUT SPEED = 9600 BAUD DB 08h ;ERASE CHARACTER DB 18h ;KILL CHARACTER DW 20h ;NO CTS,RAW,NO CR->LF MAP,NO ECHO,NO EXPAND TAB org 140h carr: MVI A,1 ANA A ret INIT: RST 1 ;uNIX SYSTEM CALL DB 5 ;OPEN A FILE FOR READING OR WRITING DW MDMPORT DW 0002 ;MODE: OPEN FOR READING AND WRITING SHLD FILEDES ;SAVE RETURNED FILE DESCRIPTOR CC ERROR ;IF ERROR LHLD FILEDES ;HL <-- FILE DESCRIPTOR RST 1 ;uNIX SYSTEM CALL DB 31d ;uNIX STTY CALL DW STTYSTR ;POINTER TO STTY STRUCTURE CC ERROR ;IF ERROR JMP 200h ;JUMP INTO CROSSTALK Š ************************************************************************* * * * ERROR REPORTING ROUTINE. ON ENTRY ERROR NUMBER IS TO BE IN HL. * * * ************************************************************************* ERROR: MVI A,0FFh ;INITIALIZE 10's DIGIT ADD10: INR A ; TO ZERO LXI D,0FFF6h ;-10d DAD D ;SUBTRACT 10d JC ADD10 ADI 30h ;MAKE IT AN ASCII PRINTING DIGIT STA ERRTEN ;SAVE THE TENs DIGIT OF THE ERROR NUMBER LXI D,000Ah ;ADD BACK +10d DAD D MVI A,0FFh ;INITIALIZE 1's DIGIT ADD1: INR A ; TO 0 LXI D,0FFFFh ;-1 DAD D ;SUBTRACT 1 JC ADD1 ADI 30h ;MAKE IT AN ASCII PRINTING DIGIT STA ERRONE MVI C,9 ;BDOS PRINT STRING LXI D,ERRMSG ;ERROR STRING ADDRESS CALL 5 ;CALL BDOS RET ERRMSG: DB 'uNIX ERROR ' ERRTEN: DS 1 ERRONE: DS 1 ENDERR: DB '$' STAT: LDA NCHAR ;GET NUMBER OF CHARACTERS IN BUFFER ORA A ;IS NCHAR 0 ? RNZ ;RETURN IF CHARACTERS ARE ALREADY IN BUFFER LHLD FILEDES ;HL <-- FILE DESCRIPTOR RST 1 ;uNIX SYSTEM CALL DB 03 ;READ CALL RDCBUF: DW RDBUF ;BUFFER TO READ CHARACTERS FROM ttyX INTO ŠRDCSIZ: DW BUFEND-RDBUF ;SIZE OF BUFFER CC ERROR ;IF ERROR MOV A,L ;NUMBER OF BYTES READ IN THIS CALL STA NCHAR ORA A ;IS Low BYTE OF NCHAR 0 ? RET SIN: CALL STAT JZ SIN LDA NCHAR DCR A STA NCHAR MOV L,A XRA A MOV H,A ;NUMBER OF CHARACTERS IN HL LXI D,RDBUF DAD D ;FORM OFFSET INTO BUFFER MOV A,M ;GET A CHARACTER FOR XTALK RET RDBUF: DS 7d BUFEND: SOUT: STA CHAROUT ;PUT CHAR TO BE OUTPUT IN MEMORY FOR uNIX CALL LHLD FILEDES ;HL <-- FILE DESCRIPTOR RST 1 ;uNIX SYSTEM CALL DB 04 ;WRITE CALL DW CHAROUT ;ADDRESS OF STRING TO WRITE DW CHAREND-CHAROUT ;NUMBER OF BYTES TO WRITE CC ERROR ;IF ERROR RET CHAROUT:DS 1 CHAREND: end start