Listing of file='SMART.SRC;0C' on disk='vmedia/comm_pgms-sideB-sector.ccvf'
; ^EXP>SMART.SRC;2 ; ; 1980/12/07 19:00 ; ; ; ROUTINE TO ALLOW THE COMPUCOLOR II ; TO COMMUNICATE WITH OTHER COMPUTERS ; ; 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 EXTIN EQU MFIOA+1 STAT5 EQU MFIOA+3 COMND EQU MFIOA+4 BAUD EQU MFIOA+5 TXBUF EQU MFIOA+6 EXTOT EQU MFIOA+7 MASK EQU MFIOA+8 TIME2 EQU MFIOA+10 TIME3 EQU MFIOA+11 TIME4 EQU MFIOA+12 SSOBE EQU 10H ; ; 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 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 RCOMD EQU 0017H ;BAUD 1X=08H 8X=18H 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 1 ;DUPLEX FLAG (1=HALF, -1=FULL) PARITY: DB 0 ;PARITY FLAG (-1=ODD, 0=NONE, 1=EVEN) REPEAT: DB 1 ;AUTO-REPEAT FLAG (0=OFF, 1=ON) 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,RS232C SHLD INPUTV+1 ;USER INPUT ROUTINE JUMP VECTOR LDA RST1J ;SAVE TIMER #2 INTERRUPT VECTOR STA TMPVEC LHLD RST1J+1 SHLD TMPVEC+1 MVI A,JMPOPC ; AND SET UP NEW ONE STA RST1J LXI H,TIM2X SHLD RST1J+1 ; ; SET UP THE FLAGS ; MVI A,31 ;USER INPUT ROUTINE VECTOR STA INPFL ;RS232 INPUT PORT FLAG MVI A,12 ;SET FCS KEYBOARD ROUTINE STA KBDFL ; TO DUMP ; XRA A STA BASFL STA EXITFG ;SET NOT READY TO EXIT FLAG STA READY LDA RATE ;SET BAUD RATE OUT BAUD STA CRATE MVI A,0D7H ;NOTE THE INTERRUPT MASK OUT MASK STA CMASK ; ; 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" MESSAGE CALL OSTR MVI A,255 ;START THE KEYBOARD SCANNER OUT TIME2 LOOP: LDA EXITFG ;USER WANTS TO EXIT IF <> 0 CPI 0 JZ LOOP1 XRA A STA INPFL STA KBDFL MVI A,0DFH ;RESTART FCS KEYBOARD SCANNER STA CMASK OUT MASK MVI A,255 OUT TIME3 XRA A MOV B,A LHLD FCSSP SPHL RET ;RETURN TO CALLER ; ; RESTORE INPUT FLAG (DESTROYED BY CURSOR ROUTINE) ; LOOP1: 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 STA KBDFL MVI A,0D7H OUT MASK STA CMASK JMP LOOP ;.............................................................. ; ; KEYBOARD INTERRUPT ROUTINE KEYBRD: 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 ; ; GENERATE PARITY ; NOTEOT: MOV A,E ANI 7FH ;FORCE PARITY BIT OFF PTYSET: DB JPEOPC ;THIS INSTRUCTION IS DW PAROK ; OVERLAID TO RUN OTHER ; PARITY OPTIONS ORI 80H ;SET PARITY BIT ON PAROK: MOV E,A ;MOVE CHARACTER TO REGISTER E ; FOR S1OUT ROUTINE LDA DUPLEX ;CHECK IF ECHO TO SCREEN REQD ORA A JM FULL PUSH D CALL EDIT ; ECHO POP D FULL: CALL S1OUT ;TRANSMIT ON RS232 RET ;.............................................................. ; ; RS232C RECEIVER INTERRUPT ROUTINE ; RS232C: CALL EDIT 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 ; ; ; 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 ;************************************************************** ; ; THE REST OF THESE ROUTINES HAVE BEEN COPIED FROM ROM. ; REFER TO FCS LISTINGS FOR DOCUMENTATION. ; ; ROUTINE TO RING THE BELL - MODIFIED ; BELL: MVI A,40H STA EXTBF OUT EXTOT BELL1: LDA TPROG STA MS150 MVI A,195 OUT TIME4 RET ; ; BREAK KEY PROCESSOR - MODIFIED ; BREAK: LDA RCOMD ORI 2 OUT COMND JMP BELL1 ; ; COMPARE HL:DE ; CMPHD: MOV A,H CMP D RNZ MOV A,L CMP E RET ; ; SAVE ALL REGISTERS ; 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 - MODIFIED ; LO: CALL SAVE ;SAVE ALL REGS CPI 7 ;BELL IS SPECIAL JNZ NOBELL CALL BELL RET NOBELL: CALL BASOUT RET ; ; OUTPUT A CHARACTER STRING ; 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 ; 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 ; ; KEYBOARD SCANNER - MODIFIED ; KEDEL EQU 255 CHTIM EQU 20 ;NOTE: 4 TIMES THE NORMAL REPEAT TIME TIM2X: CALL SAVE LDA EXITFG ORA A JZ SCAN LDA TMPVEC ;RESTORE TIMER #2 INTERRUPT VECTOR STA RST1J LHLD TMPVEC+1 SHLD RST1J+1 RET ;RETURN WITHOUT RESTARTING TIMER SCAN: CALL KEYBD JNC KEYCO JZ BREAK RET TMPVEC: DS 3 KEYCO: MOV E,A MVI A,0D7H OUT MASK STA CMASK LXI H,KBDFL LDA EXTBF OUT EXTOT XRA A JMP KEYBRD KEYBD: MVI A,KEDEL OUT TIME2 ;USES TIMER #2 - NOT #3 Q01: LXI B,0FFFH MOV E,C Q02: MOV A,B OUT EXTOT IN EXTIN INR A JZ Q06 INR E JNZ ROT Q03: DCR A STC Q04: INR E RAR JC Q04 PUSH PSW MOV A,E ADD A ADD A ADD A ADD A ORA B XRI 0FH INR C JZ Q05 MOV E,A POP PSW INR A JNZ ROT DCR C JMP Q06 Q05: MOV C,A POP PSW INR A JNZ Q03 MVI E,-1 Q06: DCR B JP Q02 INR C JNZ Q08 Q07: XRA A STA LKC STA NKC ROT: LDA EXTBF OUT EXTOT ORI 1 STC RET Q08: DCR C INR E JNZ Q09 XRA A STA NKC LDA LKC CMP C JNZ Q10 ; ; ADDITIONAL AUTO-REPEAT CODE ; LDA REPEAT ORA A JNZ REP ; ; ORIGINAL COMPUCOLOR CODE ; MVI A,80H OUT EXTOT IN EXTIN ANI 40H JNZ ROT ; REP: LXI H,SEC15 DCR M JNZ ROT MVI A,CHTIM/4 ;ADDED THIS JMP Q11+2 ;WAS ... JMP Q11 Q09: DCR E LDA LKC CALL Q20 JZ ROT LDA NKC CALL Q20 JNZ Q07 Q10: MOV A,C STA LKC Q11: MVI A,CHTIM ;WAS ... LDA CHTIM NOP ; STA SEC15 MOV A,C CPI 50H JC Q12 CPI 56H JC Q16 Q12: RRC RRC RRC RRC ANI 7 MOV E,A MVI A,80H OUT EXTOT IN EXTIN ANI 30H RLC RLC ORA E RLC RLC MOV E,A MVI D,0 LXI H,KTAB-4 DAD D MVI A,0FH ANA C ORA M MOV E,A MOV A,C CPI 7CH JNC Q13 SUI 1CH CPI 20H-1CH JNC Q14 Q13: MVI A,10H XRA E MOV E,A Q14: IN EXTIN ANA A JP Q15 MOV A,E SUI 'A' CPI 'Z'+20H+1-'A' JNC Q15 SUI 'Z'+1-'A' CPI 'A'+20H-'Z'-1 JC Q15 MVI A,20H XRA E MOV E,A Q15: CALL ROT MVI A,80H STA READY ORA A MOV A,E STA KBCHA RET Q16: STA READY SUI 50H STC RZ MVI E,127 CPI 4 JZ Q15 MOV E,A MVI A,6 SUB E MOV E,A JMP Q15 Q20: CMP C JZ Q21 MOV L,C MOV C,E MOV E,L CMP C RNZ Q21: MOV A,E STA NKC RET LKC: DB 0 NKC: DB 0 SEC15: DB 0 READY: DB 0 KBCHA: DB 0 KTAB: DB 0A0H DB 020H DB 0B0H DB 030H DB 080H DB 060H DB 000H DB 040H DB 090H DB 070H DB 010H DB 050H DB 0E0H DB 0D0H DB 0C0H DB 0F0H DB 080H DB 080H DB 000H DB 000H DB 090H DB 090H DB 010H DB 010H DB 020H DB 020H DB 020H DB 020H ; ;************************************************************** ; 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 EMULATOR' DB 22,'VERSION ' DB 17,'4.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