Listing of file='DUMB.SRC;01' on disk='vmedia/comm_pgms-sideB-sector.ccvf'
; ^EXP>TERM.SRC;2 ; ; 1980/12/05 19:00 ; ; ; ROUTINE TO ALLOW THE COMPUCOLOR II ; TO COMMUNICATE WITH OTHER COMPUTERS ; USING THE INDUSTRY STANDARD OF EVEN PARITY ; FOR FULL DUPLEX ASYNCHRONOUS COMMUNICATIONS ; ; ; NOTE: THE FOLLOWING EXCEPTIONS TO ; STANDARD COMPUCOLOR AND ASCII ; USAGE OF CONTROL CHARACTERS ; ; SEE WHERE TO GO TABLE FOR MORE ; INFORMATION ON DISCREPANCIES ; ; CONTROL D -> HOME CURSOR ; CONTROL H -> CURSOR LEFT ; ; MFIOA EQU 0 COMND EQU MFIOA+4 BAUD EQU MFIOA+5 EXTIN EQU MFIOA+1 EXTOT EQU MFIOA+7 MASK EQU MFIOA+8 SSOBE EQU 10H STAT5 EQU MFIOA+3 TIME2 EQU MFIOA+10 TIME4 EQU MFIOA+12 TXBUF EQU MFIOA+6 ; ; RST1J EQU 81C8H ;TIMER #2 JUMP VECTOR BASOUT EQU 0033H ;BASIC OUTPUT ROUTINE BFILL EQU 81DCH ;BLIND FILL (+0=A7 BIT, +1=CCI) BHLAD EQU 81D4H ;BLIND CURSOR HL ADDRESS CMASK EQU 81E0H CRATE EQU 81E2H ;CURRENT BAUD RATE COLFL EQU 81E6H ;FLAG (FG/BG) 0=OFF 1=ON ESCUSE EQU 33215 ;ESCAPE USER JUMP VECTOR EXTBF EQU 81D6H ;EXTERNAL OUTPUT PORT BUFFER INPCRT EQU 81C5H ;FREE INPUT TABLE JUMP INPFL EQU 33251 ;RS232 INPUT PORT FLAG INPUTV EQU 33221 ;USER INPUT ROUTINE JUMP VECTOR JUMP EQU 81E7H ;JUMP USED FOR CURSOR POSITIONING ; LEFT,RIGHT,UP,DOWN KBDFL EQU 33247 ;KEYBOARD INPUT FLAG BASFL EQU 81F1H LOFL EQU 81F9H ;SYSTEM OUTPUT FLAG MS150 EQU 81FDH ;150 MILLISECOND TIMER COUNTER READY EQU 81FFH NOCHA EQU 64 ;64 CHARACTERS / LINE NOLIN EQU 32 ;32 LINES / DISPLAY RCOMD EQU 0017H ;BAUD 1X=08H 8X=18H ROLFL EQU 81DCH ;ROLL FLAG => 0= NO ROLL 1= ROLL ROLLN EQU 81CDH ;ROLL COUNT (0=NO ROLL) TEMP0 EQU 81F2H ;TEMPORARY LOCATION TPROG EQU 001BH ;150MS X80 EQU 7000H ;START OF DISPLAY MEMORY SLOW RAM ; ; JPOOPC EQU 0E2H ;JPO OPCODE JMPOPC EQU 0C3H ;JMP OPCODE JPEOPC EQU 0EAH ;JPE OPCODE ; ; LEAVE ROOM FOR BASIC DRIVER ; ; NOTE: THE STACK GROWS DOWNWARD ; FROM HERE TOWARDS BASIC ; ORG 09000H ; ; USER-DEFINED PARAMETERS ; RATE: DB 84H ;BAUD RATE DUPLEX: DB 0FFH ;DUPLEX FLAG (1=HALF, -1=FULL) PARITY: DB 0 ;PARITY FLAG (-1=ODD, 0=NONE, 1=EVEN) INIT: DI LXI H,0 ;SAVE FCS STACK POINTER DAD SP SHLD FCSSP LXI SP,STACK ;SETUP STACK ; ; SET UP THE JUMP VECTORS ; MVI A,JMPOPC ;JMP OPCODE STA ESCUSE ;ESCAPE USER JUMP VECTOR LXI H,INIT ;INITIALIZATION ROUTINE SHLD ESCUSE+1 ;ESCAPE USER JUMP VECTOR STA INPUTV ;USER INPUT ROUTINE JUMP VECTOR LXI H,WHICH SHLD INPUTV+1 ;USER INPUT ROUTINE JUMP VECTOR ; ; SET UP THE FLAGS ; MVI A,31 ;USER INPUT ROUTINE VECTOR STA INPFL ;RS232 INPUT PORT FLAG STA KBDFL ; XRA A STA BASFL STA EXITFG ;SET NOT READY TO EXIT FLAG STA READY LDA RATE ;SET BAUD RATE OUT BAUD STA CRATE ; ; SETUP THE PARITY OVERLAYS ; LDA PARITY ORA A JNZ INIT10 MVI A,JMPOPC JMP FIXIT INIT10: JP INIT20 MVI A,JPOOPC JMP FIXIT INIT20: MVI A,JPEOPC FIXIT: STA PTYSET STA PTYCHK EI LXI H,PROMPT ;"TERMINAL EMULATOR" CALL OSTR ;DISPLAY MESSAGE LOOP: LDA READY CPI 50H JNZ LOOP1 XRA A STA READY CALL BREAK JMP LOOP LOOP1: LDA EXITFG ;USER WANTS TO EXIT IF <> 0 CPI 0 JZ LOOP3 MVI A,0 STA INPFL STA KBDFL MOV B,A LHLD FCSSP SPHL RET ;RETURN TO CALLER ; ; RESTORE INPUT FLAG (DESTROYED BY CURSOR ROUTINE) ; LOOP3: LDA INPFL ;GET CURRENT INPUT FLAG CPI 0 ;SYSTEM DISPLAY ROUTINE JNZ LOOP ;JUMP IF NOT EQUAL MVI A,31 ;USER INPUT ROUTINE VECTOR STA INPFL ;RS232 INPUT PORT FLAG JMP LOOP WHICH: PUSH PSW PUSH D LXI D,KBDFL CALL CMPHD JZ KEYBRD LXI D,INPFL CALL CMPHD JZ RS232C POP D POP PSW RET ; ; KEYBOARD INTERRUPT ROUTINE KEYBRD: POP D POP PSW CALL SAVE MOV A,E CPI 1 JNZ CONTIN STA EXITFG RET CONTIN: CPI 26 JNZ NOTBS MVI E,8 NOTBS: CPI 8 JNZ NOTEOT MVI E,4 NOTEOT: LDA DUPLEX ORA A JM FULL PUSH D CALL EDIT POP D FULL: CALL XMIT RET ; RS232C RECEIVER INTERRUPT ROUTINE RS232C: POP D POP PSW CALL SAVE CALL EDIT RET ; ; ROUTINE TO GENERATE PARITY FOR HOST COMPUTERS ; XMIT: MOV A,E ANI 7FH ;FORCE PARITY BIT OFF PTYSET: DB JPEOPC ;THIS INSTRUCTION MAY BE DW POK ; OVERLAID TO RUN OTHER ; PARITY OPTIONS ; ORI 80H ;SET PARITY BIT ON POK: MOV E,A ;MOVE CHARACTER TO REGISTER E ; FOR S1OUT ROUTINE CALL S1OUT ;TRANSMIT E ON RS232 ; OUTPUT PORT RET ; ; ROUTINE TO EDIT INPUT FROM HOST ; EDIT: MOV A,E ANA A ;SET PARITY BIT PTYCHK: DB JPEOPC ;CHECK PARITY DW INPOK ;JUMP IF INPUT PARITY OK MVI A,03FH ;"?" INPOK: ANI 7FH MOV E,A ;SAVE CHARACTER WITHOUT PARITY CPI 7FH JZ IGNORE ;IGNORE DEL CPI 20H JNC ACCEPT ;ACCEPT NON-CONTROL CHARACTERS LXI H,WTGTAB ;WHERE TO GO TABLE BASE ADDRESS RLC ;MULTIPLY CHARACTER BY 2 ADD L ;LOW ORDER BYTE OF ADDRESS MOV L,A ;UPDATE LOW ORDER BYTE OF HL MOV A,H ;HIGH ORDER BYTE OF ADDRESS ACI 0 ;ADD IN POSSIBLE CARRY MOV H,A ;UPDATE HIGH ORDER BYTE OF HL ; ; HL -> WTG FOR THIS CHARACTER ; MOV A,M ;LOW ORDER BYTE OF WTG INX H ;NEXT BYTE OF WTG MOV H,M ;HIGH ORDER BYTE OF WTG MOV L,A ;LOW ORDER BYTE OF WTG MOV A,E ;RESTORE CHARACTER PCHL ;GO TO WTG LOCATION ACCEPT: MOV E,A CALL BASOUT ;ROM ROUTINE TO DISPLAY ; CHARACTER IN E RET BEL: CALL BELL ;RING THE BELL IGNORE: RET ; ; BACK SPACE = LEFT CURSOR ; BS: MVI A,26 ;LEFT CURSOR JMP ACCEPT ;TAKE LEFT CURSOR ; ; CONTROL E = HOME CURSOR ; RVHOME: MVI A,8 ;HOME CURSOR JMP ACCEPT ;TAKE HOME CURSOR ; ; ;************************************************************** ; ; THE REST OF THESE ROUTINES HAVE BEEN COPIED FROM ROM ; ; ROUTINE TO RING THE BELL (FROM ROM) ; BELL: MVI A,40H STA EXTBF OUT EXTOT BELL1: LDA TPROG STA MS150 MVI A,195 OUT TIME4 RET ; ; BREAK KEY PROCESSOR (FROM ROM) ; BREAK: LDA RCOMD ORI 2 OUT COMND JMP BELL1 ; ; COMPARE HL:DE (FROM ROM) ; CMPHD: MOV A,H CMP D RNZ MOV A,L CMP E RET ; ; SAVE ALL REGISTERS (FROM ROM) ; SAVE: XTHL ;SAVE HL WHILE LOADING ADDRESS PUSH D ; TO RESUME EXECUTION AT PUSH B ;THEN SAVE ALL REGISTERS PUSH PSW ; AND STATUS CALL JMPHL ;PUSH $+3 AS RETURN ADDRESS POP PSW ; AND RESUME EXECUTION OF CALLER POP B ;THEN RESTORE ALL REGISTERS POP D ; AND STATUS POP H EI ;REENABLE INTERRUPTS RET ; AND EXIT FROM INTERRUPT JMPHL: PCHL ; JUMP THRU HERE TO ROUTINE ; ; SEND A BYTE TO THE SCREEN (FROM ROM) ; LO: CALL SAVE ;SAVE ALL REGS CPI 7 JNZ NOBELL CALL BELL RET NOBELL: CALL BASOUT RET ; ; SEND A STRING TO THE SCREEN. (FROM ROM) ; BYTE VALUE OF 239 DECIMAL ; TERMINATES THE STRING. ; ALSO SUPPORTS REPEAT LOOPS ; OF THE FORM: ; ...,237,N,D1,D2,...,DM,238,... ; WHERE N IS THE REPEAT COUNT ; FOR THE STRING OF BYTES: ; D1,D2,...,DM ; OSTR: MOV A,M ;GET NEXT BYTE INX H CPI 237 ;SPECIAL CODE ? JC OSTR1 ;A<237: GO SEND BYTE JZ OSTR2 ;A=237: START REPEAT LOOP CPI 239 ;SPECIAL CODE ? RZ ;A=239: END: RETURN JC OSTR4 ;A=238: END OF REPEAT LOOP OSTR1: CALL LO ;SEND BYTE JMP OSTR ;GET NEXT BYTE OSTR2: MOV D,M ;GET REPEAT COUNT INX H OSTR3: PUSH H ;SAVE START POINTER JMP OSTR ;GET NEXT BYTE OSTR4: DCR D ;FINISHED REPEAT ? JZ OSTR5 ;YES! POP H ;RESTORE START POINTER JMP OSTR3 ;REPEAT AGAIN! OSTR5: POP PSW ;CLEAN THE STACK JMP OSTR ;GET NEXT BYTE ; ; TRANSMIT E ON RS232 (FROM ROM) ; S1OUT: IN STAT5 ;GET STATUS ANI SSOBE ;CAN WE SEND ? JZ S1OUT ;NO: WAIT! IN EXTIN ;IS CLEAR TO SEND HIGH ? ANI 80H JZ S1OUT MOV A,E ;GET CHARACTER TO SEND OUT TXBUF ;SEND THE CHARACTER RET ;RETURN ; ; ;************************************************************** ; ; WHERE TO GO TABLE ; WTGTAB: ; DEC ASCII CCII ; DW IGNORE ; 0 NUL @ NULL DW IGNORE ; 1 SOH A AUTO DW IGNORE ; 2 STX B PLOT DW ACCEPT ; 3 ETX C CURSOR X Y DW RVHOME ; 4 EOT D [ HOME CURSOR ] DW IGNORE ; 5 WRU E DW IGNORE ; 6 ACK F CCI FOLLOWS DW BEL ; 7 BEL G BELL DW BS ; 8 BS H [ BACK SPACE ] DW ACCEPT ; 9 HT I TAB DW ACCEPT ;10 LF J LINE FEED DW ACCEPT ;11 VT K ERASE LINE DW ACCEPT ;12 FF L FORM FEED DW ACCEPT ;13 CR M RETURN DW ACCEPT ;14 SO N A7 ON DW ACCEPT ;15 SI O A7 OFF DW ACCEPT ;16 DLE P BLACK DW ACCEPT ;17 DC1 Q RED DW ACCEPT ;18 DC2 R GREEN DW ACCEPT ;19 DC3 S YELLOW DW ACCEPT ;20 DC4 T BLUE DW ACCEPT ;21 NAK U MAGENTA DW ACCEPT ;22 SYN V CYAN DW ACCEPT ;23 ETB W WHITE DW IGNORE ;24 CAN X XMIT DW ACCEPT ;25 EM Y CURSOR RIGHT DW ACCEPT ;26 SUB Z CURSOR LEFT DW IGNORE ;27 ESC [ ESCAPE DW ACCEPT ;28 FS \ CURSOR UP DW ACCEPT ;29 GS ] FG ON DW ACCEPT ;30 RS ^ FG OFF DW ACCEPT ;31 US _ BLINK ; ; EXITFG: DB 0 ;EXIT IF <> 0 ; FCSSP: DW 0 ;THE STACK POINTER USED BY THE CALLER ; ; PROMPT: DB 6,2,11,29 DB 19,'TERMINAL ' DB 20,'EMULATOR ' DB 23,'VERSION ' DB 17,'2.0',13,10 DB 23,'PRESS "AUTO" TO EXIT FROM THIS PROGRAM' DB 7,18,13,10,239 DS 200 STACK: DS 2 END INIT