CODE_SEG SEGMENT ASSUME CS:CODE_SEG , DS:DATA_SEG ORG 00100H ; 8279A Keyboard/Display locations and programming data : CKYBRD EQU 0FFEAH ;Control reg. for SDK-86 keyboard CDISPL EQU CKYBRD ;Control reg. for SDK-86 display DKYBRD EQU 0FFE8H ;Data reg. for SDK-86 keyboard DDISPL EQU DKYBRD ;Data reg. for SDK-86 display KYBPRG EQU 000H ;Left entry encoded kybd scan code DISPCLR EQU 0C1H ;Display clear code DISPINI EQU 090H ;Display initialize code, start at ; right digit, autoincrement digit ; after each write. ; 8251A USART locations and programming data : CUSART EQU 0FFF2H ;Control reg. for SDK-86 USART DUSART EQU 0FFF0H ;Data reg. for SDK-86 USART RxRDY_MASK EQU 002H ;Mask for testing if USART has ; received a character (for PC2SDK) TxRDY_MASK EQU 081H ;Mask for testing if USART is ready ; to transmit a character ; (for SDK2PC) START: MOV AX,DATA_SEG MOV DS,AX CALL SETUP ;Initialize hardware AGAIN: CALL PC2SDK ;Take PC (TTY) keystroke - echo to SDK display CALL DELAY ;Just to kill time CALL SDK2PC ;Take SDK-86 keystroke - echo to PC (TTY) disp. CALL DELAY ;Kill time again JMP AGAIN ;Repeat until reset SETUP PROC NEAR PUSHF ;SAVE REGISTERS PUSH AX PUSH DX MOV DX,CKYBRD ;SET UP CTRL REG ADDR FOR SDK-86 KEYBOARD MOV AL,KYBPRG ;LOAD AL WITH KEYBOARD PROGRAMMING COMMAND OUT DX,AL ;WRITE TO KYBRD CTRL REG MOV DX,CDISPL ;SET UP CTRL REG ADDR FOR SDK-86 DISPLAY MOV AL,DISPCLR ;LOAD AL WITH CLEAR DISPLAY COMMAND OUT DX,AL ;WRITE TO DISPLAY CTRL REG MOV DX,DDISPL ;SET UP CTRL REG ADDR FOR SDK-86 DISPLAY MOV AL,DISPINI ;LOAD AL WITH INITIALIZE DISPLAY COMMAND OUT DX,AL ;WRITE TO DISPLAY CTRL REG MOV DX,CUSART ;SET UP CTRL REG ADDR FOR USART MOV AL,00H ;LOAD AL WITH 0 OUT DX,AL ;WRITE TO CTRL REG CALL DELAY ;WAIT OUT DX,AL ;WRITE TO CTRL REG CALL DELAY ;WAIT OUT DX,AL ;WRITE TO CTRL REG CALL DELAY ;WAIT MOV AL,040H ;GET RESET COMMAND OUT DX,AL ;RESET THE USART CALL DELAY MOV AL,06FH ;GET MODE WORD OUT DX,AL ;WRITE MODE WORD CALL DELAY ;WAIT MOV AL,027H ;GET COMMAND WORD OUT DX,AL ;WRITE COMMAND WORD CALL DELAY ;WASTE TIME POP DX ;RESTORE CHARACTERS POP AX POPF RET ;RETURN TO MAIN PROGRAM SETUP ENDP ; ; When the IBM PC is running the SDK program, characters get transmitted ; to the USART chip (8251A) on the SDK-86 board. This subroutine should ; take in the characters from the USART and display them on the SDK-86 ; display. ; ; NOTE: The 8279 display chip has been initialized in SETUP. When it ; comes to the part in this subroutine to send a character to the ; 8279, you only need to use one OUT statement of the form: ; MOV DX,DDISPL ;Set up SDK-86 display address ; OUT DX,AL ;Send translated data to SDK-86 display ; ; Pseudo Code: ; Save all registers flags to be used. ; Test if the USART has received a character. ; If it hasn't, go to end of subroutine, restore registers ; and return. ; (Remember to CALL DELAY after every time you use the USART) ; Check if the character is '0'-'9'. If it is display it in ; 7-segment form using LED_TABLE ; Check if the character is 'A'-'F'. If it is display it in ; 7-segment form using LED_TABLE ; If character is none of '0'-'9','A'-'F', display '.' on ; SDK-86 display. (See LED_TABLE) ; Restore all used registers and flags. ; Return ; PC2SDK PROC NEAR ;=========================================================================== RET ;Return to main program PC2SDK ENDP SDK2PC PROC NEAR PUSHF ;SAVE REGISTERS PUSH AX PUSH BX PUSH DX MOV DX,CKYBRD ;GET CTRL REG ADDRESS IN AL,DX ;READ STATUS WORD AND AL,0BFH CMP AL,00H ;KEY PRESSED ? JZ DONE MOV DX,CUSART ;SET UP USART STATUS ADDR IN AL,DX ;READ STATUS WORD AND al, 070H AND AL,TxRDY_MASK ;MASK ALL BUT TXRDY BIT CMP AL,TxRDY_MASK ;TRANSMITTER READY ? JZ DONE MOV DX,DKYBRD ;SET UP SDK-86 KEYBOARD ADDRESS IN AL,DX ;READ CHARACTER FROM KEYBRD LEA BX,TXTABLE ;GET BASE ADDRESS OF TRANSLATION TABLE XLAT TXTABLE ;DO TABLE LOOK-UP MOV DX,DUSART ;GET USART ADDRESS OUT DX,AL ;SEND CHARACTER TO TX REGISTER DONE: POP DX ;RESTORE REGISTERS POP BX POP AX POPF RET SDK2PC ENDP DELAY PROC NEAR PUSHF PUSH CX MOV CX,0FFFH ;INITIALIZE LOOP COUNTER DELAY2: NOP ;THIS PART OF THE NOP ;ROUTINE WASTES NOP ;LOTS AND NOP ;LOTS OF TIME LOOP DELAY2 POP CX POPF RET DELAY ENDP CODE_SEG ENDS DATA_SEG SEGMENT LED_TAB_PTR DD LED_TABLE TXTABLE DB 030H DB 031H DB 032H DB 033H DB 034H DB 035H DB 036H DB 037H DB 038H DB 039H DB 041H DB 042H DB 043H DB 044H DB 045H DB 046H LED_TABLE DB 03FH ; 7-seg code for digit 0 DB 006H ; digit 1 DB 05BH ; digit 2 DB 04FH ; digit 3 DB 066H ; digit 4 DB 06DH ; digit 5 DB 07DH ; digit 6 DB 007H ; digit 7 DB 07FH ; digit 8 DB 06FH ; digit 9 DB 077H ; digit A DB 07CH ; digit B DB 039H ; digit C DB 05EH ; digit D DB 079H ; digit E DB 071H ; digit F DB 080H ; digit . DATA_SEG ENDS END START