; calc.asm
init:
 LDM 0
 XCH R7          ; clear index
 LDM 0
 XCH R8          ; clear sign
 SRC 0
 RD2
 DAC
 JCN NZ, startSub
startAdd:
 JMS checkLen
 JCN NZ,addLen   ; number 2 >= 1
 JUN addGo
addLen:
 SRC 1
addGo:
 RD0             ; length number 1
 JMS stLen  
doAdd:
 JMS ldCarry
 SRC 0
 RDM             ; read digit of number 1 
 SRC 1
 ADM             ; add digit of number 2
 DAA
 SRC 7
 WRM             ; write digit of result
 TCC             ; store carry
 XCH R7
 LD R4           ; check length
 DAC
 JCN Z, endAdd   ; no digits left, ready
 XCH R4
 INC R1          ; next addresses
 INC R3
 INC RF
 JUN doAdd       ; add next digits
endAdd:
 JMS ldCarry
 JCN NC, addLen2 ; carry?
 INC RF      
 LDM 1
 SRC 7
 WRM             ; store carry in next digit
addLen2:
 LD RF       
 IAC
 WR0             ; write lenght of result
 BBL 0           ; end
startSub:
 JMS checkLen
 JCN NZ,subLen   ; number 2 >= 1
 JUN subGo
subLen:
 LD R0
 XCH R2
 XCH R0
 LDM 1           ; store negativ sign
 XCH R8
 SRC 0
subGo:
 RD0
 JMS stLen
doSub:
 JMS ldCarry
 SRC 0
 RDM             ; read digit of number 1 
 SRC 1
 SBM             ; subtract digit of number 2
 JCN C, subGo2   ; carry not set when result<0
 STC             ; need borrow
 DAA 
subGo2:
 SRC 7
 WRM             ; write digit of result
 TCC             ; store borrow
 XCH R7
 LD R4           ; check length
 DAC
 JCN Z, endSub   ; no digits left, ready
 XCH R4
 INC R1          ; next addresses
 INC R3
 INC RF
 JUN doSub       ; subtract next digits
endSub:
 LD R8           ; write sign
 WR1
 RDM             ; check length
 JCN Z, short
 INC RF
short:
 LD RF           ; write lenght of result       
 WR0
 BBL 0           ;end
checkLen:
 SRC 1           ; number 2
 RD0             ; read length
 XCH R4      
 SRC 0           ; number 1
 RD0             ; read length
 SUB R4
 XCH R4
 JCN NC, negLen
 LD R4
 JCN Z, chkSingle 
 BBL 0
chkSingle:
 CLC
 LD R4
 XCH R1
 LD R4
 XCH R3
 SRC 0
 RDM             ; read digit number 1
 SRC 1
 SBM             ; subtract digit number 2
 JCN NC, negLen  ; number 2 > 1
 JCN NZ, go      ; number 1 > 2
 LD R4           ; digits equal
 JCN Z, go       ; last digit checked
 DAC
 XCH R4
 JUN chkSingle
go:
 BBL 0 
negLen:
 BBL 1
stLen:
 XCH R4          ; store length
 LDM 0           ; reset addresses
 XCH R1
 LDM 0
 XCH R3
 BBL 0
ldCarry:
 LDM 15          ; restore carry
 ADD R7
 BBL 0 
 