コマンドリストを見ると、2番目の入力から最初の入力を減算し、条件分岐を使用してどちらが大きいかを確認することで、これを実現できるようです。このようなもの:
INP // Get input into accumulator
BRZ QUIT // If zero, we're finished
STA A // Accumulator to A
INP // Get input into accumulator
BRZ QUIT // If zero, we're finished
STA B // Accumulator to B
SUB A // Subtract A from accumulator (B)
BRP LOOP // Jump to LOOP if B > A already, otherwise swap
LDA A // Put A into accumulator
STA TEMP // Accumulator to TEMP
LDA B // Put B into accumulator
STA A // Overwrite A with B
LDA TEMP // Put TEMP (A) into accumulator
STA B // Overwrite B with A: now B > A
LOOP LDA AB // Put result into accumulator (starts off as zero)
ADD B // Add larger input to accumulator
STA AB // Update result
LDA A // Put loop counter (A) into accumulator
SUB ONE // Decrement
STA A // Update loop counter
BRZ DONE // Jump to DONE if loop counter is zero
BRP LOOP // Jump to LOOP if loop counter is positive
DONE LDA AB // Put result into accumulator
QUIT OUT // Output
HLT // Finish
ONE DAT 1 // ONE = 1
A DAT // First input
B DAT // Second input
AB DAT // A * B
TEMP DAT // Temporary (needed for swap)
これは完全にテストされていないため、バグが含まれている可能性が高いことに注意してください。ただし、ソースにコメントしたので、アイデアを確認できます。
編集バグはないことが判明しました-暗闇の中で刺すのは悪くありません;)とにかく、コメントで言及されているJavaベースのシミュレータで実行されるわずかに変更された構文は次のとおりです。
INP // Get input into accumulator
BRZ :QUIT // If zero, we're finished
STA :A // Accumulator to A
INP // Get input into accumulator
BRZ :QUIT // If zero, we're finished
STA :B // Accumulator to B
SUB :A // Subtract A from accumulator (B)
BRP :LOOP // Jump to LOOP if B > A already, otherwise swap
LDA :A // Put A into accumulator
STA :TEMP // Accumulator to TEMP
LDA :B // Put B into accumulator
STA :A // Overwrite A with B
LDA :TEMP // Put TEMP (A) into accumulator
STA :B // Overwrite B with A: now B > A
LOOP: LDA :AB // Put result into accumulator (starts off as zero)
ADD :B // Add larger input to accumulator
STA :AB // Update result
LDA :A // Put loop counter (A) into accumulator
SUB :ONE // Decrement
STA :A // Update loop counter
BRZ :DONE // Jump to DONE if loop counter is zero
BRP :LOOP // Jump to LOOP if loop counter is positive
DONE: LDA :AB // Put result into accumulator
QUIT: OUT // Output
HLT // Finish
ONE: 1 // ONE = 1
A: 0 // First input
B: 0 // Second input
AB: 0 // A * B
TEMP: 0 // Temporary (needed for swap)