; ; UPPER CASE CONVERSION PROGRAM ; VERSION 1 ; 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 SP,STACK ;STACK -> SP ; ; PROGRAM SEGMENT BEGINS ; 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 SENTINEL BYTE ; ; CLEAR SCREEN ; CALL CLRSCR ; ; OUTPUT ORIGINAL MESSAGE ; LXI H,MSG ;START OF ORIGINAL MESSAGE -> HL CALL MSGOUT ; ; OUTPUT NEW LINE (CR-CARRIAGE RETURN ASCII 13 PLUS LF-LINEFEED ASCII 10) ; CALL CRLF ; ; OUTPUT REVISED MESSAGE ; LXI H,REV_MSG ;START OF REVISED MESSAGE -> HL CALL MSGOUT ; DONE: HLT ;HALT ; ; CLEAR SCREEN SUBROUTINE ; ; DATA TRANSFER FROM CALL: NONE ; DATA TRANSFER ON RETURN: NONE ; ; REGISTERS USED: A AND C ; CLRSCR: MVI C,25 ;CLEAR SCREEN CHARACTER -> C JMP CHROUT ;BRANCH TO CHARACTER OUTPUT SUBROUTINE ; ; CR AND LF OUTPUT SUBROUTINE ; ; DATA TRANSFER FROM CALL: NONE ; DATA TRANSFER ON RETURN: NONE ; ; REGISTERS USED: A AND C ; CRLF: MVI C,13 ;CR -> C CALL CHROUT ;SEND CHARACTER TO TEMINAL SCREEN MVI C,10 ;LF -> C JMP CHROUT ;BRANCH TO CHARACTER OUTPUT SUBROUTINE ; ; CR AND LF OUTPUT SUBROUTINE ; ; DATA TRANSFER FROM CALL: HL POINTS TO START OF MESSAGE ; DATA TRANSFER ON RETURN: NONE ; ; REGISTERS USED: A, C, H, AND L ; MSGOUT: MOV A,M ;CHARACTER -> A ORA A ;IF A=0 THEN JUMP CONT2 RZ ;RETURN WHEN DONE MOV C,A ;CHARACTER -> C CALL CHROUT ;SEND CHARACTER TO TERMINAL SCREEN INX H ;NEXT HL ADDRESS JMP MSGOUT ;GET NEXT CHARACTER ; ; CHARACTER OUTPUT SUBROUTINE ; ; DATA TRANSFER FROM CALL: CHARACTER TO BE OUTPUT IN C REGISTER ; DATA TRANSFER ON RETURN: NONE ; ; REGISTERS USED: A AND C ; CHROUT: IN STATUS ;STATUS BYTE -> A ANI OUTMASK ;MASK TERMINAL BUSY BIT D7 JNZ CHROUT ;WAIT IF D7 = 1 - TERMINAL BUSY MOV A,C ;CHARACTER -> A OUT DATA ;SEND CHARACTER TO TEMINAL SCREEN RET ; ; PROGRAM SEGMENT END ; ; DATA SEGMENT BEGINS ; 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 ; DS 100 ;MEMORY SWPACE FOR STACK STACK: DS 1 ; ; DATA SEGMENT ENDS ;