 | Code: ; ************************************************************* ; * AN ASSEMBLER PROGRAM THAT READS IN NUMBERS AND THEN * ; * PROVIDES A HISTOGRAM DISPLAYING THE TALLEY COUNT * ; * OF EACH NUMBER WITH THE LETTER 'X' v2 CODE AT BOTTOM * ; ************************************************************* ; BOOT EQU 0 ;address to get back to CP/M READ EQU 1 ;keyboard read function number PRINT EQU 2 ;console output function numbr BDOS EQU 5 ;CP/M function call address SPRINT EQU 9 ;string print function number LF EQU 0Ah ;ASCII code of line feed CR EQU 0Dh ;ASCII code of <Enter> BS EQU 08h ;BACKSPACE PERIOD EQU 2Eh ;ASCII PERIOD ULNNUM EQU 3Ah ;UPPER LIMIT OF NOT NUMBERS LLNNUM EQU 30h ;LOWER LIMIT OF NOT NUMBERS X EQU 58h ;VAL OF ASCII X ; ORG 100h ;standard origin for CP/M LXI sp,sp0 ; initialize stack pointer LXI D,WELCOM MVI C,SPRINT ; MESSAGE 1 WELCOME CALL BDOS LXI D,RQUST ; MOVE MESSAGE 2 INTO D CALL BDOS ;PRNT MESSAGE 2 TO SCRN ; ;********************************************************************** ; GET SENTENCE AND TALLY NUMBERS ;********************************************************************** ; MVI A,0 ;MOVE #0 INTO A REG ; LXI H,B0 ;MEM LOCATION DEFINED FOR GIVEN # MOV M,A ;SET LOCATION TO VAL OF ZERO LXI H,B1 ;THIS IS NECESSARY BECAUSE MOV M,A ;RESPECTIVE LOCATIONS WILL BE LXI H,B2 ;INCRIMENTED AS NUMBERS ARE SORTED MOV M,A ;AND A BASE VALUE OF 0 IS NEEDED LXI H,B3 ;IN ALL DEFINED SPACES MOV M,A LXI H,B4 MOV M,A LXI H,B5 MOV M,A LXI H,B6 MOV M,A LXI H,B7 MOV M,A LXI H,B8 MOV M,A LXI H,B9 MOV M,A ; RSENT: MVI c,READ ; THIS WILL READ CHAR INPUT CALL BDOS ; WAIT FOR USER INPUT CPI CR ; COMPARE W/ CR JZ NEXT ; JUMP ON <ENTER> CPI LLNNUM ; COMP W/ LOWER NUMBER ASCII LIMIT JC DEL ; TESE TO IGNORE NON #'S CPI ULNNUM ; COMP W/ UPPER NUMBER ASCII LIMIT JNC DEL CALL MEMINC ; WILL INC # OF #'S IF #ENTERED JMP RSENT ; REPEATE DEL: MVI C,SPRINT ; ERASE NON NUMERICAL CHAR LXI D,ERASE ; SINGLE MSG TO REMOVE NON NUM. CHR CALL BDOS JMP RSENT ; LOOP BACK SINCE !<ENTER> ; NEXT: MVI C,SPRINT ; MESSAGE # LDA B0 ; MOVE CONTENTS OF B0 INTO A LXI D,MESS0 ; PRINT MESSAGE CALL BDOS ; FUNCTION MVI C,PRINT ; CHARACTER PRINT MVI E,X ; MOVE ASCII X INTO REG E CPI 0 THIS ; PREVENTS PROG FAILURE IF CNZ EXES ; THERE ARE NO OCCURANCES OF A NMBR MVI C,SPRINT LDA B1 ; THOUGH LONG, THIS METHOD PROVIDES LXI D,MESS1 ; A 17% SPEED INCREASE COMPARED TO CALL BDOS A LOOP MVI C,PRINT MVI E,X CPI 0 CNZ EXES MVI C,SPRINT LDA B2 LXI D,MESS2 CALL BDOS MVI C,PRINT MVI E,X CPI 0 CNZ EXES MVI C,SPRINT LDA B3 LXI D,MESS3 CALL BDOS MVI C,PRINT MVI E,X CPI 0 CNZ EXES MVI C,SPRINT LDA B4 LXI D,MESS4 CALL BDOS MVI C,PRINT MVI E,X CPI 0 CNZ EXES MVI C,SPRINT LDA B5 LXI D,MESS5 CALL BDOS MVI C,PRINT MVI E,X CPI 0 CNZ EXES MVI C,SPRINT LDA B6 LXI D,MESS6 CALL BDOS MVI C,PRINT MVI E,X CPI 0 CNZ EXES MVI C,SPRINT LDA B7 LXI D,MESS7 CALL BDOS MVI C,PRINT MVI E,X CPI 0 CNZ EXES MVI C,SPRINT LDA B8 LXI D,MESS8 CALL BDOS MVI C,PRINT MVI E,X CPI 0 CNZ EXES MVI C,SPRINT LDA B9 LXI D,MESS9 CALL BDOS MVI C,PRINT MVI E,X CPI 0 CNZ EXES ; ; ********************************************************************** ; FINAL MESSAGE ANT TERMINATE ; ********************************************************************** ; FINISH: MVI C,SPRINT ; print a log out message LXI D,byby CALL BDOS JMP BOOT ; and get back to the operating system ; ; ********************************************************************** ; SUB ROUTINES ; ********************************************************************** ; MEMINC: CPI '0' ;FIGURE OUT WHAT THE NUMBER IS AND JZ B01 ;INCREMENT MEM VAL OR CORRESPONDING CPI '1' ;MEMORY LOCATION. JZ B11 CPI '2' JZ B21 CPI '3' JZ B31 CPI '4' JZ B41 CPI '5' JZ B51 CPI '6' JZ B61 CPI '7' JZ B71 CPI '8' JZ B81 CPI '9' JZ B91 B01: LXI H,B0 INR M RET B11: LXI H,B1 INR M RET B21: LXI H,B2 INR M RET B31: LXI H,B3 INR M RET B41: LXI H,B4 INR M RET B51: LXI H,B5 INR M RET B61: LXI H,B6 INR M RET B71: LXI H,B7 INR M RET B81: LXI H,B8 INR M RET B91: LXI H,B9 INR M RET ; EXES: CALL BDOS ; X IS ALREADY LOADED INTO E REGISTER SO DCR A ; THAT WHEN THIS LOOP EXECUTES IT ISN'T JNZ EXES ; REPEATING THAT INSTRUCTION. REG A CONT. RZ ; THE # OF OCCURANCES OF #'S(0-9). ; ; ********************************************************************** ; MESSAGES AND STACK ; ********************************************************************** ; welcom: db '* tALLEY m uP: A dIGItAL hISTOGRAM' db lf,cr, '* (c) 2006' db lf,cr, ' * * *$' rqust: db lf,cr, 'Type sum Numbers! $' erase: db bs,' ',bs,'$' mess0: db lf,lf,cr, 'Histogram:',lf,lf,cr,'0: $' mess1: db lf,cr, '1: $' mess2: db lf,cr, '2: $' mess3: db lf,cr, '3: $' mess4: db lf,cr, '4: $' mess5: db lf,cr, '5: $' mess6: db lf,cr, '6: $' mess7: db lf,cr, '7: $' mess8: db lf,cr, '8: $' mess9: db lf,cr, '9: $' byby: db lf,cr, ' ' db lf,cr, 'Come Back Again!$' ; B0: ds 1 B1: ds 1 B2: ds 1 B3: ds 1 B4: ds 1 B5: ds 1 B6: ds 1 B7: ds 1 B8: ds 1 B9: ds 1 ds 10 sp0 equ $ ; end TERMINATE PROGRAM x__x
; ; ********************************************************************** ; APLICABLE COMPACTED CODE ; ********************************************************************** ; ; NEXT: MVI C,SPRINT ; INITIALIZING NON RPTD PRINTOUT FN'S ; LXI D,MESS0 ; ; CALL BDOS ; MVI B,'0' ; LXI H,B0 ; ; AGH: MOV A,B COUNTER COMPARISON ; CPI ':' ; JZ FINISH ; TERMINATE PROG IF ZEROFLAG SET ; MOV A,M MOVE CONTENTS OF MEM ADRS TO REG A ; MVI C,PRINT ; ; MOV E,B THIS WILL PRINT OUT THE CORISPONDING # ; CALL BDOS NUMBER ; MVI C,SPRINT ; ; LXI D,MESS1 ; ; CALL BDOS ; CPI 0 ; MVI E,X ASCII VALUE OF LETTER X ; MVI C,PRINT ; ; CNZ EXES X PRINTOUT SUBROUTINE ; MVI C,SPRINT ; ; LXI D,MESS2 ; ; CALL BDOS ; INR B ; INX H INCRIMENT MEMORY LOCATION TO NEXT BUFF ; JMP AGH ; ; welcom: db '* tALLEY m uP: A dIGItAL hISTOGRAM' ; db lf,cr, '* (c) 2006' ; db lf,cr, ' * * *$' ; ; rqust: db lf,cr, 'Type sum Numbers! $' ; erase: db bs,' ',bs,'$' ; mess0: db lf,lf,cr, 'Histogram:',lf,lf,cr,'$' ; mess1: db ': $' ; mess2: db lf,cr, '$' ; byby: db lf,cr, ' ' ; db cr, 'Come Back Again!$'
|  |