Recently (May 2021) I received a very nice e-mail from Jason Zinserling, who got his hands on a TM-990/189 prototype board. Jason proceeded to implement a program that searches for perfect numbers: Numbers that are equal to the sum of their divisors. Jason describes the program as follows:
This program computes the 1st 5 positive integer perfect numbers. I used the perfect number algorithm process as a bench mark program for see how fast a computer processor is. I have written this algorithm process in many different computer languages as well a the processor's assembler. The algorithm process uses a division of number for seeing if number is a factor of a product. The division used is the long division method. Sorry no floating point guys.
For the TM990-189 it takes about 35 minutes and for our laptops of today a couple seconds or less. Not bad for this processor of running at 2Mhz and over 40 years old for the board/processor.
Without further ado, here's Jason's code, lightly formatted for presentation purposes:
; perfect number program for TM990-189 computer ; Authour: Jason M. Zinserling ; Status: working 000000 CPU "TMS9900.TBL" ;PROCESSOR TABLE 000000 HOF "BIN16" ;HEX FORMAT 000200 ORG 200H ; starting address of program in memory 000200 02E00300 LWPI $300 ; define work space to memory $300 for register set 000204 02001FC1 LI R0,8129 ; define largest product to be process 000208 02010001 LI R1,1 ; Set starting product 1 00020C 02070320 LI R7,$320 ; Define prointer to prefect number table 000210 04C8 CLR R8 ; define zero value 000212 Prod: 000212 C081 MOV R1,R2 ; compute largest factor by getting current product 000214 0812 SRA R2,1 ; divide by 2 (largest factor half the product) 000216 0582 INC R2 ; add one to largest factor value 000218 04C3 CLR R3 ; starting sum of factors for a given product being tested 00021A 02040001 LI R4,1 ; current factor starting at 1 00021E Facts: 00021E 04C5 CLR R5 ; setup MSW word of current product to 0 000220 C181 MOV R1,R6 ; transfer current product to LSW of product 000222 3D44 DIV R4,R5 ; R5 =(R5 R6) / R4 (result in R5 Quotient/ R6 Remainder) 000224 8206 C R6,R8 ; found no remainder (value 0) ?? 000226 1601 JNE NxtFact ; No ,not a factor 000228 A0C4 A R4,R3 ; Yes a factor !! - r3 = r3 + r4 (add factor to sum of factors) 00022A NxtFact: 00022A 0584 INC R4 ; add one to current factor 00022C 8084 C R4,R2 ; check if current factor > largest factor 00022E 12F7 JLE Facts ; No go process another factor 000230 80C1 C R1,R3 ; check if current product equals sum of factors 000232 1601 JNE NxtProd ; No, skip to next product 000234 CDC1 MOV R1,*R7+ ; Yes - prefect number store product in perfect number table for later review 000236 NxtProd: 000236 0581 INC R1 ; add one to current product 000238 8001 C R1,R0 ; check current product > maximum product 00023A 12EB JLE Prod ; No - go process another product number 00023C Done: 00023C 10FF JMP Done ; Yes .. done so loop for breakpoint address for E command 000000 END ; end of program
It has been a while since I last dealt with such old-school 16-bit assembler code. This piece of code, compiled, amounts to 62 instruction bytes in the computer's memory. Think about that number, 62 bytes, the next time you download a 60 gigabyte installer for your favorite computer game, for instance. Yes, those were different days.