; ; WORD ECHO PROGRAM ; STATUS EQU 1 ;RDT STATUS PORT DATA EQU 2 ;RDT DATA PORT INMASK EQU 0x80 ;STATUS PORT BIT D0 = 7 WHEN KEYBOARD CHARACTER DATA AVAILABLE OUTMASK EQU 0x40 ;STATUS PORT BIT D7 = 6 WHEN TERMINAL BUSY PROCESSING CHARACTER DATA ; ORG 0X0000 ;PROGRAM START ADDRESS ; ; CLEAR RDT SCREEN ; START: IN STATUS ;STATUS BYTE -> A ANI OUTMASK ;MASK TERMINAL BUSY BIT D7 JNZ START ;WAIT IF D7 = 1 - TERMINAL BUSY MVI A,25 ;CLEAR SCREEN-> A OUT DATA ;SEND CHARACTER TO TEMINAL SCREEN ; ; GET KEYBOARD CHARACTER INTO REGISTER C ; AGAIN: IN STATUS ;STATUS BYTE -> A ANI INMASK ;MASK CHARACTER DATA AVAILABLE BIT D0 JNZ AGAIN ;WAIT IF D0 = 1 - NO CHARACTER AVAILABLE IN DATA ;KEYBOARD CHARACTER -> A MOV C,A ;A->C ; ; OUTPUT CHARACTER IN C TO RDT SCREEN ; LOOP0: IN STATUS ;STATUS BYTE -> A ANI OUTMASK ;MASK TERMINAL BUSY BIT D7 JNZ LOOP0 ;WAIT IF D7 = 1 - TERMINAL BUSY MOV A,C ;C -> A OUT DATA ;SEND CHARACTER TO TEMINAL SCREEN ; ; TEST FOR DIGITS ZERO TO NINE ; CPI '0' ;IF CHARACTER<'0' THEN JUMP TO INV_CHR JC INV_CHR CPI '9'+1 ;IF CHARACTER>='9'+1 THEN JUMP TO INV_CHR JNC INV_CHR ; ; COMPUTE AND LOAD ADDRESS OF NUMBER SPELLED OUT ; ANI 0x0F ;MASK OFF UPPER NIBBLE RLC ;2*A->A ALLOW FOR TWO BYTES PER TABLE ENTRY LXI H,NUM_TBL ;START OF NUMBER TABLE->HL LXI D,0 ;0->DE MOV E,A ;A->E DAD D ;DE+HL->HL MOV E,M ;ADDRESS OF NUMBER SPELLED OUT->DE INX H MOV D,M ; ; OUTPUT NUMBER SPELLED OUT (MESSAGE OUTPUT ROUTINE) ; LOOP1: LDAX D ;CHARACTER->A ORA A ;IF A=0 THEN JUMP DONE JZ DONE MOV C,A ;A->C LOOP2: IN STATUS ;STATUS BYTE -> A ANI OUTMASK ;MASK TERMINAL BUSY BIT D7 JNZ LOOP2 ;WAIT IF D7 = 1 - TERMINAL BUSY MOV A,C ;C->A OUT DATA ;SEND CHARACTER TO TEMINAL SCREEN INX D ;DE+1->DE JMP LOOP1 ;GET NEXT CHARACTER ; ; OUTPUT A '?' TO INDCATE INVALID CHARACTER ENTERED ; INV_CHR:IN STATUS ;STATUS BYTE -> A ANI OUTMASK ;MASK TERMINAL BUSY BIT D7 JNZ INV_CHR ;WAIT IF D7 = 1 - TERMINAL BUSY MVI A,'?' ;CLEAR SCREEN-> A OUT DATA ;SEND CHARACTER TO TEMINAL SCREEN ; ; OUTPUT NEW AND DO AGAIN ; DONE: IN STATUS ;STATUS BYTE -> A ANI OUTMASK ;MASK TERMINAL BUSY BIT D7 JNZ DONE ;WAIT IF D7 = 1 - TERMINAL BUSY MVI A,13 ;CARRIAGE RETURN-> A OUT DATA ;SEND CR TO TEMINAL SCREEN JMP AGAIN ; ; PROGRAM END ; ; DATA MEMORY ; ; TABLE OF ADDRESSES THAT POINT TO NUMBERS SPELLED OUT ; NUM_TBL:DW WORD_0 DW WORD_1 DW WORD_2 DW WORD_3 DW WORD_4 DW WORD_5 DW WORD_6 DW WORD_7 DW WORD_8 DW WORD_9 ; ; LIST OF NUMBERS SPELLED OUT ; WORD_0: DM ' ZERO',0 WORD_1: DM ' ONE',0 WORD_2: DM ' TWO',0 WORD_3: DM ' THREE',0 WORD_4: DM ' FOUR',0 WORD_5: DM ' FIVE',0 WORD_6: DM ' SIX',0 WORD_7: DM ' SEVEN',0 WORD_8: DM ' EIGHT',0 WORD_9: DM ' NINE',0 ; ; DATA END ;