; ; SUM INTEGERS FROM MEMORY USING WHILE-DO LOOP ; VERSION 1 ; ORG 0x0000 ;PROGRAM START ADDRESS ; ; CALCULATE TOTAL NUMBER OF DATA LIST ITEMS (ASSUME COUNT TOTAL<256) ; MVI A,lo(D_TBLE) ;D_TBLE LOCATION->A SUI lo(D_TBLB) ;(D_TBLE LOCATION - D_TBLB LOCATION) = COUNT->A MOV B,A ;COUNT->B ; LXI H,D_TBLB ;START OF DATA LIST ->HL INR B ;COUNT+1->B MVI C,0 ;0->SUM ; AGAIN: DCR B ;IF COUNT=0 THEN JUMP DONE JZ DONE MOV A,C ;SUM+DATA VALUE->SUM ADD M MOV E,A ;SUM->E (TEMPORARY STORAGE) MOV A,C ;IF ADDENDS HAVE DIFFERENT SIGNS THEN CONTINUE XRA M JM CONT0 MOV A,E ;IF ADDENDS HAVE SAME SIGN, DOES THE NEW SUM ;HAVE A DIFFERENT SIGN? XRA C JM ERROR ;IF SO, JUMP ERROR CONT0: MOV C,E ;NEW SUM -> C INX H ;NEXT DATA VALUE JMP AGAIN ;LOOP TO AGAIN ; DONE: MOV A,C ;RETRIEVE SUM OUT 0xFF ;DISPLAY IN DATA LEDS HLT ;HALT ; ERROR: SUB A ;0->A OUT 0xFF ;DISPLAY IN DATA LEDS HLT ;HALT ; ; END OF PROGRAM SEGMENT ; ; START OF DATA SEGMENT ; D_TBLB: DB 3,12,32,14,13,38,0,-5 D_TBLE: ; ; END OF DATA SEGMENT ;