;#################################################### ; ; DUMBA3.ASM 27-JUL-83 20:30 ; ;RUDIMENTARY MODEM PRG FOR APPLE/// SOFTCARD/// (Z80) ;SENDS INP FROM CONS TO EXTERN MODEM & RETURNS ECHOED ;CHARS VIA RDR TO CONSOLE; IF NO CHARS IN RS232 INPUT ;BUFFER, CHECKS CONSOLE FOR INPUT;IF NO CONSOLE INPUT, ;CHECKS RDR:, THENCE TO CONSOLE ETC. ;IF CONSOLE INPUT = CTRLZ, TERMINATES PRG. ;N.B. : DRIVER.SOS MUST CONTAIN .RS232 DRIVER. ;SET SOFTCARD/// CONFIG SO THAT PUN:=PU1:=.RS232. ;RDR:=RD1:=.RS232. IF YOU ARE USING BUILT IN SERIAL ;PORT FOR BOTH OUTPUT TO PRINTER VIA LST: AND ;FOR .RS232, LST: MUST BE SET = .NULL, THAT IS, ;NOT CONFIGURED = .PRINTER. ;###########################P.J. FILLINGHAM########## ; ; ASCII CHARS CR EQU 0DH LF EQU 0AH CTRLZ EQU 1AH ; ; CP/M BDOS FUNCS DIOF EQU 6 WPUNF EQU 4 RRDRF EQU 3 WCONF EQU 2 RCONF EQU 1 ; ; CP/M ADDRESSES RBOOT EQU 0 BDOS EQU 5 TPA EQU 100H ; ORG TPA START: LXI SP,STAK ;SET UP USER'S STACK START0: CALL CCRLF ; START A NEW LINE LXI H,SIGNON ; WITH HEADER CALL COMSG MVI E,0FFH ;TELL DIR I/O TO CHECK CONSOLE START1: CALL CKDIO ;CHK STATUS/GET CHAR FROM CONSOLE CALL RDRST ;CHECK RDR: (.RS232) BUFFER CPI 0 ;IF EMPTY JZ NOCHAR ;FORGET RDR BUFFER CALL RDRIN ;IF CHAR, GET IT MOV E,A ;PUT CHAR IN E FOR OUPUT TO CONS JMP START1 ;DO IT VIA DIRECT I/O NOCHAR: MVI E,0FFH ;TELL DIR I/O TO LOOK FOR CONS CHAR JMP START1 ;DO IT ; RDRST: ;DEVICE STATUS CALL TO SOS .RS232 BUFFER ; CALL65 EQU 0DF80H ;6502 SUBROUTINE CALLER XBYTE EQU 0E5C4H ;ADDRESS OF X-BYTE (=00H) DEVMGR EQU 1986H ;ADDR OF DEVICE MANAGER DINFDT EQU 16E0H ;=DFE0H (Z80);START OF 32 BYTES ;OF RET'D DATA LXI H,0DFA0H ;Z80 ADDR OF SOS DEVMGR COMMAND MVI M,02H ; 2 = DEV CALL # FOR STATUS INX H MVI M,02H ;STUFF UNIT # FROM DFB4 INTO DFA1 INX H MVI M,03H ;.RS232 SOS STAT CODE 3 INTO DFA2 INX H MVI M,0E0H ;LSB OF SOS ADDR OF RETURNED DATA INX H MVI M,016H ;MSB OF SOS ADDR OF RET DATA LXI H,XBYTE ;SOS MEMORY BANK ADDRESS MVI M,00H ;$00 IS SOS MEM BANK OF DFE0 LXI H,DEVMGR ;SOS DEV MGR ENTRY POINT CALL CALL65 ;6502 SUBR CALLER LDA 0DFE6H ;NO. OF CHARS RDR BUFFER => (DFE6) RET ; ; OUTPUT CHAR FROM CONSOLE TO PUN: (THUS TO MODEM) ; PUNOUT: PUSH B ;SAVE REGISTERS PUSH D PUSH H MVI C,WPUNF ;OUTPUT CHARS TO PUN: MOV E,A CALL BDOS POP H ;RESTORE REGS POP D POP B RET ; ;GET A CHAR FROM RDR: ; RDRIN: PUSH B ;SAVE YE OLDE REGS PUSH D PUSH H MVI C,RRDRF ;GET CHAR FROM RDR: CALL BDOS ANI 7FH ;MASK TO 7 BITS POP H ;RESTORE REGS POP D POP B RET ; ; OUTPUT CHAR IN REG A TO CONSOLE ; CONOUT: PUSH B ;SAVE REGS PUSH D PUSH H MVI C,DIOF ;SELECT CONS DIR I/O FUNC MOV E,A ;CHAR TO E CALL BDOS POP H ;RESTORE REGS POP D POP B RET ; ; CHK STATUS / GET CHAR FROM CONS CKDIO: PUSH B ;SAVE REGS PUSH D PUSH H MVI C,DIOF ;DIOF = 06H = DIRECT I/O FUNCTION CALL BDOS CPI 0 ;IF ZERO, NO CHAR FROM CONSOLE JZ NOCHCN ;THEN GET OUT ANI 7FH ;MASK TO 7 BITS CPI CTRLZ ;WAS IT CTRLZ ? JZ RBOOT ;YES, WARM BOOT. NO, RET AND CALL PUNOUT ;OUTPUT TO MODEM VIA PUN: NOCHCN: POP H ;ANYHOW, RESTORE REGS POP D POP B RET ; ; MESSAGE POINTED TO BY HL OUT TO CONSOLE COMSG: MOV A,M ;GET A CHAR ORA A RZ ;RETURN ON ZERO CALL CONOUT ;ELSE DISLAY CHAR INX H ;POINT TO NEXT CHAR JMP COMSG ; ; SIGN-ON MESSAGE SIGNON: DB 'MODEM PROGRAM: TO EXIT TYPE CTRLZ',CR,LF,LF,0 ; ; CR LF TO CONSOLE CCRLF: MVI A,CR CALL CONOUT MVI A,LF JMP CONOUT ; ; SET UP STACK SPACE DS 64 ;40H LOCATIONS STAK: DB 0 ;TOP OF STACK ; END ;END PRG DUMBA3.ASM