; ; UPPER CASE CONVERSION 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 ; LXI H, MSG ;START OF ORIGINAL MESSAGE->HL LXI D, REV_MSG ;START OF MEMORY SPACE FOR REVISED COPY->DE ; LOOP0: MOV A,M ;CHARACTER->A ORA A ;IF A=0 THEN JUMP CONT1 JZ CONT1 CPI 0x61 ;IF CHARACTER < 'a' THEN JUMP CONT JC CONT0 CPI 0x7B ;IF CHARACTER >= 'z'+1 THEN JUMP CONT JNC CONT0 ANI 0b11011111 ;ZERO BIT 5 CONT0: STAX D ;CHARACTER->[DE] NOTE: [rp] MEANS MEMORY ADDRESS POINTED TO BY REGISTER PAIR rp INX H ;NEXT HL ADDRESS INX D ;NEXT DE ADDRESS JMP LOOP0 ;GET NEXT CHARACTER ; CONT1: STAX D ;STORE SIGNAL (END) BYTE ; ; CLEAR SCREEN ; MVI C,25 ;CLR->C ; ; CHROUT - OUTPUT CHARACTER IN C TO RDT SCREEN ; CHROUT0:IN STATUS ;STATUS BYTE -> A ANI OUTMASK ;MASK TERMINAL BUSY BIT D7 JNZ CHROUT0 ;WAIT IF D7 = 1 - TERMINAL BUSY MOV A,C ;CHARACTER->A OUT DATA ;SEND CHARACTER TO TEMINAL SCREEN ; ; OUTPUT ORIGINAL MESSAGE ; LXI H,MSG ;START OF ORIGINAL MESSAGE->HL LOOP1: MOV A,M ;CHARACTER->A ORA A ;IF A=0 THEN JUMP CONT2 JZ CONT2 MOV C,A ;CHARACTER->C CHROUT1:IN STATUS ;STATUS BYTE -> A ANI OUTMASK ;MASK TERMINAL BUSY BIT D7 JNZ CHROUT1 ;WAIT IF D7 = 1 - TERMINAL BUSY MOV A,C ;CHARACTER->A OUT DATA ;SEND CHARACTER TO TEMINAL SCREEN INX H ;NEXT HL ADDRESS JMP LOOP1 ;GET NEXT CHARACTER ; ; OUTPUT NEW LINE (CR-CARRIAGE RETURN ASCII 13 PLUS LF-LINEFEED ASCII 10) ; CONT2: MVI C,13 ;CR->C CHROUT2:IN STATUS ;STATUS BYTE -> A ANI OUTMASK ;MASK TERMINAL BUSY BIT D7 JNZ CHROUT2 ;WAIT IF D7 = 1 - TERMINAL BUSY MOV A,C ;CHARACTER->A OUT DATA ;SEND CHARACTER TO TEMINAL SCREEN ; MVI C,10 ;LF->C CHROUT3:IN STATUS ;STATUS BYTE -> A ANI OUTMASK ;MASK TERMINAL BUSY BIT D7 JNZ CHROUT3 ;WAIT IF D7 = 1 - TERMINAL BUSY MOV A,C ;CHARACTER->A OUT DATA ;SEND CHARACTER TO TEMINAL SCREEN ; ; OUTPUT REVISED MESSAGE ; LXI H,REV_MSG ;START OF ORIGINAL MESSAGE->HL LOOP2: MOV A,M ;CHARACTER->A ORA A ;IF A=0 THEN JUMP CONT2 JZ DONE MOV C,A ;CHARACTER->C CHROUT4:IN STATUS ;STATUS BYTE -> A ANI OUTMASK ;MASK TERMINAL BUSY BIT D7 JNZ CHROUT4 ;WAIT IF D7 = 1 - TERMINAL BUSY MOV A,C ;CHARACTER->A OUT DATA ;SEND CHARACTER TO TEMINAL SCREEN INX H ;NEXT HL ADDRESS JMP LOOP2 ;GET NEXT CHARACTER ; DONE: HLT ;HALT ; ; PROGRAM END ; ; DATA STORAGE ; MSG: DM 'Upper case test program: AB...Z = ab...z' ;ORIGINAL MESSAGE DB 'a'-1 ;TEST CHARACTER IMMEDIATELY BELOW 'a' DB 'z'+1 ;TEST CHARACTER IMMEDIATELY ABOVE 'z' DB 0 ;SIGNAL (END) BYTE ; REV_MSG:DS 100 ;MEMORY SPACE FOR REVISED MESSAGE