\ADDSUB by Steven Pietrobon 24-1-2008 \8 digit addition and subtraction program \AC7 = Sign Bit (0 positive, 1 negative) \AC6 = Overflow Bit (0 no overflow, 1 overflow) \AC[2:0] = Character position 7 down to 0 \Octal Display displays character shown by character position \ \Keypad Inputs \0 to 9: Character is stored into display register position, position \ decremented by one modulo 8. \+ or -: Display register stored into working register, display register \ cleared, operation stored in OP register \ENTER: Display register is added to working register if OP is plus \ Display register is subtracted from working register if OP is minus \ Result is stored in display register \CTRL(0): Display register is cleared \CTRL(-): Sign bit of display register is inverted \CTRL(ENTER): display register position is decremented and character for new \ position is displayed \ \Program starts at address 026. \0 000 DR, VAR 000 \Display register (address 0) 001 000 002 000 003 000 004 000 005 000 006 000 007 000 010 DRS, VAR 000 \DR sign 011 WR, VAR 000 \Working register 012 000 013 000 014 000 015 000 016 000 017 000 \1 020 000 021 WRS, VAR 000 \WR sign 022 OP, VAR 000 023 MINUS9, #727 727 \-9 024 CTR1, VAR 000 025 I1, VAR 000 026 START, CLA.IAC 711 027 DCA OP 302 \OP := 1 (Not a valid OP) 030 CLEARDR, TAD MINUS9 103 031 DCA CTR1 304 \CTR1 := -9 032 DCA I1 305 \I1 := 0 033 DOCLEARDR, DCA I I1 325 \DR[I1] := 0 034 ISZ I1 205 \I1 := I1+1 035 ISZ CTR1 204 \CTR1 := CTR1+1; if CTR1 < 0 036 JMP DOCLEARDR 513 \then DOCLEARDR else 037 INITCHAR, CLA 710 \2 100 JMP END2 504 101 I2, VAR 000 102 SEVEN, #007 007 \+7 103 DRSA, A(DRS) 010 104 END2, DCA I2 301 \I2 := 0 105 TAD I I2 121 \AC := DR[I2] 106 NEWCHAR, DCA I I2 321 \DR[I2] := AC 107 DECI2, CMA 704 110 TAD I2 101 111 AND SEVEN 002 112 DCA I2 301 \I2 := (I2-1) mod 8 113 WRITECHAR, CLA 710 114 TAD I I2 121 115 LDS 0 622 \write(DR[I2]) 116 TAD I2 101 117 TAD I DRSA 123 \AC := I2 + DR[8] \3 120 JMP TESTCHAR 506 121 POS, #337 337 \%01111111 122 MINUS125, #403 403 \-125 123 LFTESTA, A(LFTEST) 705 124 DRSA, A(DRS) 010 125 NEG, #400 400 \%10000000 126 TESTCHAR, SKF 0 601 \if CHARFLAG = 0 127 JMP TESTCHAR 506 \then TESTCHAR else 130 KRB 0 606 \read(AC), FLAG := 0 131 AND POS 001 \clear sign bit of AC 132 NEGTEST, TAD MINUS125 102 \-CTRLMS = -125 = #403 133 SZA 730 \if CHAR <> CTRL(-) 134 JMP I LFTESTA 523 \then LFTEST else 135 TAD I DRSA 124 136 TAD NEG 105 137 DCA I DRSA 324 \DRS := -DRS \4 200 JMP I WRITECHARA 521 201 WRITECHARA, A(WRITECHAR) 113 202 THIRTEEN, #015 015 \+13 203 NEG, #400 400 \%10000000 204 TWO, #002 002 \+2 205 ENTERTESTA, A(ENTERTEST) 310 206 OPA, A(OP) 022 207 MINUSTEST, TAD THIRTEEN 102 \CTRLLF-MINUS = 122-109 = 13 = #015 210 SZA 730 \if CHAR <> MINUS 211 JMP PLUSTEST 514 \then DSPLYTEST else 212 TAD NEG 103 213 JMP NEWOP 517 214 PLUSTEST, TAD TWO 104 \MINUS-PLUS = 109-107 = 2 = #002 215 SZA 730 \if CHAR <> PLUS 216 JMP I ENTERTESTA 525 \then ENTERTEST else 217 NEWOP, DCA I OPA 326 \OP := AC (0 for ADD and NEG for SUB) \5 220 JMP END5 506 221 MINUS9, #727 727 \-9 222 CTR5, VAR 000 223 I5, VAR 000 224 WRA, A(WR) 011 225 J5, VAR 000 226 END5, TAD MINUS9 101 227 DCA CTR5 302 \CTR5 := -9 230 DCA I5 303 \I5 := 0 (DRA) 231 TAD WRA 104 232 DCA J5 305 \J5 := WRA 233 DOCOPY, TAD I I5 123 234 DCA I J5 325 \WR[J5] := DR[I5] 235 ISZ I5 203 \I5 := I5+1 236 ISZ J5 205 \J5 := J5+1 237 ISZ CTR5 202 \CTR5 := CTR5+1; if CTR5 < 0 \6 300 JMP I DOCOPYA 522 \then DOCOPY else 301 JMP I CLEARDRA 523 302 DOCOPYA, A(DOCOPY) 233 303 CLEARDRA, A(CLEARDR) 030 304 CLEARTESTA, A(CLEARTEST) 725 305 OPA, A(OP) 022 306 ADDTESTA, A(ADDTEST) 327 307 DRSA, A(DRS) 010 310 ENTERTEST, IAC 701 \PLUS-LF = 107-106 = 1 311 SZA 730 \if CHAR <> ENTER 312 JMP I CLEARTESTA 524 \then CLEARTEST else 313 TAD I OPA 125 314 SUBTEST, SMA 724 \if OP <> MINUS 315 JMP I ADDTESTA 526 \then ADDTEST else 316 SUBTRACT, TAD I DRSA 127 317 DCA I DRSA 327 \DRS := -DRS \7 320 JMP ADD 511 321 WRITECHARA, A(WRITECHAR) 113 322 DRSA, A(DRS) 010 323 SMG2TCMA, A(SMG2TCM) 605 324 WRSA, A(WRS) 021 325 CARRYA, A(CARRY) 520 326 CTR8A, A(CTR8) 405 327 ADDTEST, SZA 730 \if OP <> PLUS 330 JMP I WRITECHARA 521 \then WRITECHAR else 331 ADD, TAD DRSA 102 \AC := DRSA 332 JMS I SMG2TCMA 423 \if DR < 0 then DR := tenscomp(DR) 333 TAD WRSA 104 \AC := WRSA 334 JMS I SMG2TCMA 423 \if WR < 0 then WR := tenscomp(WR) 335 DCA I CARRYA 325 \CARRY := 0 336 TAD ADDTEST 107 \ADDTEST = MINUS8 337 DCA I CTR8A 326 \CTR8 := -8 \8 400 JMP END8 506 401 I8, VAR 000 402 WRA, A(WR) 011 403 J8, VAR 000 404 CARRYADDA, A(CARRYADD) 523 405 CTR8, VAR 000 406 END8, DCA I8 301 \I8 := 0 (DRA) 407 TAD WRA 102 410 DCA J8 303 \J8 := WRA 411 DOADD, TAD I I8 121 412 TAD I J8 123 \AC := DR[I8]+WR[J8]; AC:=(AC+CARRY) mod 10 413 JMS I CARRYADDA 424 \CARRY:=(AC+CARRY) div 10 414 DCA I I8 321 \DR[I8] := AC, AC := 0 415 ISZ I8 201 \I8 := I8+1 416 ISZ J8 203 \J8 := J8+1 417 ISZ CTR8 205 \CTR8 := CTR8+1; if CTR8 < 0 \9 420 JMP I DOADDA 522 \then DOADD else 421 JMP END9 507 422 DOADDA, A(DOADD) 411 423 WRSA, A(WRS) 021 424 CARRYA, A(CARRY) 520 425 DRSA, A(DRS) 010 426 THREE, #003 003 \+3 427 END9, TAD I WRSA 123 430 TAD I CARRYA 124 431 RAL 702 432 TAD I CARRYA 124 433 DCA I CARRYA 324 434 TAD I DRSA 125 435 RAL 702 436 TAD I CARRYA 124 437 AND THREE 006 \AC := (DRS+WRS+3*CARRY) mod 4 \10 500 TAD SEA 113 501 DCA I10 314 \I10 := A(SE)+ AC 502 TAD I I10 134 503 DCA I DRSA 335 \DRS := SE[I8] 504 TAD DRSA 115 \AC := DRSA 505 JMS I SMG2TCMA 436 \if DR < 0 then DR := tenscomp(DR) 506 JMP I INITCHARA 537 507 SE #000 000 510 #400 400 511 #600 600 512 #200 200 513 SEA, A(SE) 507 514 I10, VAR 000 515 DRSA, A(DRS) 010 516 SMG2TCMA, A(SMG2TCM) 605 517 INITCHARA, A(INITCHAR) 037 \11 520 CARRY, VAR 000 521 TEMP, VAR 000 522 MINUS10, #726 726 \-10 523 CARRYADD, RTNADR 000 524 TAD CARRY 100 525 DCA TEMP 301 \TEMP := AC+CARRY 526 IAC 701 527 DCA CARRY 300 \CARRY := 1 530 TAD TEMP 101 531 TAD MINUS10 102 \AC := TEMP-10 532 SMA 724 \if TEMP-10 >= 0 533 JMP I CARRYADD 523 \then RETURN else 534 CLA 710 535 DCA CARRY 300 \CARRY := 0 536 TAD TEMP 101 537 JMP I CARRYADD 523 \RETURN \12 600 I12, VAR 000 601 NEG, #400 400 \%10000000 602 CARRYA, A(CARRY) 520 603 MINUS8, #730 730 \-8 604 CTR13A, A(CTR13) 625 605 SMG2TCM, RTNADR 000 \Sign Magnitude to Tens Compliment 606 DCA I12 300 \Input AC is sign index 607 TAD I I12 120 610 AND NEG 001 611 SMA 724 \if R[8] = 0 612 RETURN, JMP I SMG2TCM 525 613 CLA.IAC 711 614 DCA I CARRYA 322 \CARRY := 1 615 TAD MINUS8 103 616 DCA I CTR13A 324 \CTR13 := -8 617 TAD I12 100 \13 620 JMP END13 506 621 MINUS8, #730 730 \-8 622 I13, VAR 000 623 NINE, #011 011 \+9 624 CARRYADDA, A(CARRYADD) 523 625 CTR13, VAR 000 626 END13, TAD MINUS8 101 627 DCA I13 302 \I13 := I12-8; 630 DOCOMP, TAD I I13 122 631 CMA.IAC 705 632 TAD NINE 103 \AC := 9-R[I13]; AC:=(AC+CARRY) mod 10 633 JMS I CARRYADDA 424 \CARRY:=(AC+CARRY) div 10 634 DCA I I13 322 \DR[I13] := AC 635 ISZ I13 202 \I13 := I13+1 636 ISZ CTR13 205 \CTR13 := CTR13+1, if CTR13 < 0 637 JMP DOCOMP 510 \then DOCOMP else \14 700 TAD I CARRYA 131 701 RAR 722 702 TAD I DRSA 132 703 DCA I DRSA 332 704 JMP I RETURNA 533 705 LFTEST, TAD THREE 114 \CTRLMS-CTRLLF = 125-122 = 3 = #003 706 SZA 730 \if CHAR <> LF 707 JMP I MINUSTESTA 535 \then MINUSTEST else 710 JMP I DECI2A 536 711 CARRYA, A(CARRY) 520 712 DRSA, A(DRS) 010 713 RETURNA, A(RETURN) 612 714 THREE, #003 003 \+3 715 MINUSTESTA, A(MINUSTEST) 207 716 DECI2A, A(DECI2) 107 717 #000 000 \15 720 PLUS90, #232 232 \+90 721 CLEARDRA, A(CLEARDR) 030 722 WRITECHARA, A(WRITECHAR) 113 723 SIXTEEN, #020 020 \+16 724 NEWCHARA, A(NEWCHAR) 106 725 CLEARTEST, TAD PLUS90 100 \LF-CTRL0 = 106-16 = 90 = #232 726 SZA 730 \if CHAR <> CTRL(0) 727 JMP NUMTEST 511 \then ENTERTEST else 730 JMP I CLEARDRA 521 731 NUMTEST, SMA 724 \if 0 > AC > 9 732 JMP I WRITECHARA 522 \then WRITECHAR else 733 TAD SIXTEEN 103 \CTRL0 = 16 = #020 734 JMP I NEWCHARA 524