It is currently Fri Sep 10, 2010 8:48 pm




Post new topic Reply to topic  [ 1 post ] 
Assembly 8085 :: Read In Numbers and Create a Histogram 
Author Message
Site Admin

Joined: Sat Jan 24, 2009 3:56 pm
Posts: 32
Post Assembly 8085 :: Read In Numbers and Create a Histogram
Another 8085 beginner program. : )
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!$'


Mon Jan 26, 2009 11:08 pm
Profile
Display posts from previous:  Sort by  
Post new topic Reply to topic  [ 1 post ] 


Who is online

Users browsing this forum: No registered users and 1 guest


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
cron
Powered by phpBB © phpBB Group.
Designed by Vjacheslav Trushkin for Free Forum/DivisionCore.