UNIT CmpSci 201 Lab Exercise #6 ; Robert S. Laramee ; cs201 ; start date 2 Nov 1996 ; StatReg EQU 20h ; stat reg port add ; InReg EQU 22h ; input data reg port add ; OutReg EQU 24h ; output data reg port add ; CtlReg EQU 26h ; control register port add ; In8 EQU 00000010b ; 8-bit input ; Out8 EQU 00000001b ; 8-bit output PROGRAM Lab6 Stack DH 32 A DB ('a', 'a', 'a', 'a', 'a', 'a') ; 1st number B DB ('b', 'b', 'b', 'b', 'b', 'b') ; 2nd number begin SUBH R5,R5 array1 CMPH #6,R5 BUGE array2 ; IF [i] >= 6 THEN --> array2 MOVB #'a',A[R5] ; reset array ADDH #1,R5 ; increment [i] BRUN array1 ; array2 SUBH R5,R5 reset2 CMPH #6,R5 BUGE proceed ; IF [i] >= 6 THEN --> proceed MOVB #'b',B[R5] ; reset array ADDH #1,R5 ; increment [i] BRUN reset2 ; proceed OUTB #00000010b,26h ; set bit 2 to 1 in cont reg ; meaning input mode = 8-bit SUBH R0,R0 ; clear R0, use for status reg SUBH R1,R1 ; clear R1, use for I/O character SUBH R2,R2 ; clear R2, use as 1st_number total SUBH R3,R3 ; clear R3, holds remainder of R2 SUBH R4,R4 ; clear R4 use as 2nd_number total SUBH R5,R5 ; use R5 as index, [i] ; ################ ; # 1st number # ; ################ num_1 CMPH #6,R5 ; look at 6 vs [i] BUGT Error ; IF [i] > 6 THEN --> error inwait1 INPB 20h,R0 ; R0 = status register ; [20h = status register address] TSTB #10b,R0 ; test bit 2 of status BREQ inwait1 ; IF IN reg empty THEN --> inwait1 ; otherwise INPB 22h,R1 ; R1 = ASCII code of input char ; [22h = input data reg add] CMPB #'-',R1 ; look for a minus sign BREQ ngtv1 ; IF input = '-' THEN --> ngtv1 CMPB #',',R1 ; look for a comma BREQ next1 ; IF input = ',' THEN --> next1 CMPB #'.',R1 ; look for a period, '.' BREQ verify ; IF input = '.' THEN --> verify SUBB #30h,R1 ; otherwise, convert ASCII -> actual # ngtv1 MOVB R1,A[R5] ; store input character in A[i] ADDH #1,R5 ; increment index [i] BRUN num_1 ; goto next digit ; ################ ; # 2nd number # ; ################ next1 SUBH R0,R0 ; clear R0, for status reg SUBH R1,R1 ; clear R1, for input/output char SUBH R5,R5 ; clear R5, for index [i] num_2 CMPH #6,R5 ; look at 6 vs [i] BSGT error ; IF [i] > 6 THEN --> error inwait2 INPB 20h,R0 ; R0 = stat reg ; [20h = stat reg add] TSTB #10b,R0 ; test bit 2 of status BREQ inwait2 ; IF IN reg empty THEN --> inwait2 ; otherwise INPB 22h,R1 ; R1 = ASCII code of input char ; [22h = input data reg add] CMPB #'-',R1 ; look for a minus sign BREQ ngtv2 ; IF input = '-' THEN --> ngtv2 CMPB #',',R1 ; look for a comma BREQ error ; IF input = ',' THEN --> error CMPB #'.',R1 ; look for a period, '.' BREQ verify ; IF input = '.' THEN --> verify SUBB #30h,R1 ; convert ASCII -> actual # ngtv2 MOVB R1,B[R5] ; store input character in B[i] ADDH #1,R5 ; increment index [i] BRUN num_2 ; goto next digit verify SUBH R5,R5 ; reset [i] again1 CMPH #5,R5 ; BSGT next2 ; IF [i] > 5 THEN --> next2 CMPB #'-',A[R5]; BREQ skip1 ; IF A[0] = '-' THEN --> skip1 ADDB A[R5],R2 ; R2 = total 1st_num BULT error ; IF C = 1 THEN goto error ; [input > 32,767] skip1 ADDH #1,R5 ; otherwise, increment index [i] CMPB #'a',A[R5] BREQ next2 ; IF A[i] = 'a' THEN --> next2 MULH #10,R2 ; left one decimal place BRUN again1 ; add next digit next2 SUBH R0,R0 ; use R0 as [i] because again2 CMPH #5,R0 ; R5 gets overwritten BUGT add ; IF [i] > 5 THEN --> add CMPB #'-',B[R0]; BREQ skip2 ; IF B[0] = '-' THEN --> skip2 CMPB #'b',B[R0]; BREQ add ; IF B[R0] = 'b' THEN --> add ADDB B[R0],R4 ; R4 = total 2nd_num BULT error ; IF C = 1 THEN --> error ; [input > 32,767] skip2 ADDH #1,R0 ; increment index [i] CMPB #'b',B[R0]; BREQ add ; IF B[R0] = 'b' THEN --> add MULH #10,R4 ; left one decimal place BRUN again2 ; add next digit add CMPB #'-',A ; BRNE skip3 ; IF num_1 => 0 THEN --> skip3 MULB #-1,R2 ; otherwise, num_1 < 0 skip3 CMPB #'-',B ; BRNE skip4 ; IF 2nd_num => 0 THEN --> skip4 MULB #-1,R4 ; otherwise num_2 < 0 skip4 ADDH R2,R4 ; R4 = 1st_num + 2nd_num BROV out_output; IF V = 1 THEN --> out_output BRNG neg_output; IF N = 1 THEN --> neg_output BRUN output ; otherwise, --> output ; ################## ; # correct result # ; ################## output OUTB #00000001b,26h ; set bit 0 of cont reg = 1 ; meaning output mode = 8-bit SUBH R5,R5 ; use R5 as num_of_digits pushed MOVH R4,R2 ; R2 = result SUBH R4,R4 ; clear R3 again3 DIVH #10,R2 ; divide result by 10 ; remainder should be in R3 ADDH #30h,R3 ; convert actual num --> ASCII value PSHH R3 ; push value on stack SUBH R3,R3 ; clear R3 for next value ADDH #1,R5 ; increment num_of_digits pushed ANDH #0111111111111111b,R2 CMPH #0,R2 ; BREQ display ; IF R2 = 0 THEN goto display BRUN again3 ; otherwise goto again3 display NOOP again4 CMPH #0,R5 ; NOOP ; <--Print screen here BREQ begin ; IF #_of_digits = 0 THEN --> begin SUBH R3,R3 ; clear R3 for next value POPH R3 ; R3 = current ASCII value outwait INPB 20h,R1 ; R1 = status register ; [20h = add of status reg] TSTB #00000001b,R1 BREQ outwait ; IF OUT reg empty THEN --> outwait OUTB R3,24h ; current ASCII value --> display ; [24h = output data reg port address] SUBH #1,R5 ; decrement num_of_digits BRUN again4 ; display next digit ; ################ ; # out of range # ; ################ out_output OUTB #00000001b,26h ; set bit 0 of ; control reg = 1, meaning output mode = 8-bit MOVB #'?',R3 ; outwait2 INPB 20h,R1 ; R1 = status reg ; [20h = add of stat reg] TSTB #00000001b,R1 BREQ outwait2 ; IF OUT reg empty THEN --> outwait2 OUTB R3,24h ; '#' --> display ; [24h = output data reg port add] MOVB #'-',R3 ; outwait3 INPB 20h,R1 ; R1 = status register ; [20h = add of stat reg] TSTB #00000001b,R1 BREQ outwait3 ; IF OUT reg empty THEN --> outwait3 OUTB R3,24h ; '#' --> display ; [24h = output data reg port add] MULB #-1,R4 BRUN output ; ################### ; # negative output # ; ################### neg_output OUTB #00000001b,26h ; set bit 0 of ; cont reg to 1 meaning output mode = 8-bit MOVB #'-',R3 ; outwait4 INPB 20h,R1 ; R1 = status register ; [20h = address of stat reg] TSTB #00000001b,R1 ; BREQ outwait4 ; IF OUT reg empty THEN --> outwait4 OUTB R3,24h ; '#' --> display ; [24h = output data reg port addr] MULB #-1,R4 ; ADDH #30h,R4 ; convert actual num --> ASCII value OUTB R4,24h ; current ASCII value --> display ; [24h = output data reg port add] NOOP ; <--Print screen here BRUN begin ; ######### ; # error # ; ######### error OUTB #00000001b,26h ; set bit 0 of cont reg = 1 ; meaning output mode = 8-bit MOVB #'#',R3 ; outwait5 INPB 20h,R1 ; R1 = status register ; [20h = addr of stat reg] TSTB #00000001b,R1 BREQ outwait5 ; IF OUT reg empty THEN --> outwait5 OUTB R3,24h ; '#' --> display ; [24h = output data reg port addr] MOVB #2Eh,R1 ; R1 = ascii code of '.' CMPB #'.',R1 ; look for a period, '.' NOOP ; <--Print screen here BREQ begin ; IF input = '.' THEN --> begin END