contact- please use subject="pc99 page" to avoid spam trap!
This page contains articles on the TI99/4a. There is a brief linked index to help you find something useful.
The sevens problem solutions:
Extended Basic | c99 | Turbo Pascal |
9900 Machine Code
Computers available in 1982 and 1984
How to make a basic program unLISTable
Why use old computers?
R A M B L E S
by Stephen Shaw
Written for TI*MES April 1990.
Welcome to another Rambles, which includes bits and pieces for all owners. Even
a bit that at first sight you may feel is not appropriate to you is still worth
a quick scan...
------------------
We are starting this issue with a test which is valid in any language and that
includes CONSOLE ONLY OWNERS. I have an answer to this test in Basic and know
it can be done. It is an interesting test for programmers in other languages,
and is certainly suitable for c99 and Pascal.
Here we go...
If I write 7^2, that means SEVEN SQUARED, or put another way, SEVEN TO THE POWER OF TWO, also 7 * 7.OK. Your test is to write a program, in any language, which will determine the first power of seven which has a result containing six sevens in succession-eg "777777". Clue: The result has MORE than 15 digits!
Equally 7^3 is SEVEN TO THE POWER OF THREE or 7 * 7 * 7.
Get the idea?
100 P$="" :: N$="1" :: P=0
110 CARRY=0 :: FOR F=LEN(N$) TO 1 STEP -1
120 V=VAL(SEG$(N$,F,1))*7+CARRY
130 CARRY=INT(V/10) :: V=V-CARRY*10
140 P$=STR$(V)&P$ :: NEXT F
150 IF CARRY<>0 THEN P$=STR$(CARRY)&P$
160 P=P+1 :: N$=P$ :: P$="" :: PRINT P;"
";N$
170 Z=POS(N$,"777777",1)
180 IF Z<1 THEN 110
48k Spectrum 130.00 20k CGL (Sord) M5 150.00 16k Colour Genie 168.00 48k Oric Atmos 170.00 48k Alphatronic 170.00 16k Spectravideo SV318 186.00 64k Commodore 64 199.00 32k Acorn Electron 199.00 48k Lynx 225.00 64k Amstrad CPC464 incl grn monitor 229.00 64k Dragon 225.00 64k Atari 800XL. 250.00
1 CALL INIT :: CALL PEEK(-31
952,A,B,C,D):: SL=C*256+D-65
539 :: EL=A*256+B-65536 :: F
OR X=SL TO EL STEP -4 :: CAL
L PEEK(X,E,F,G,H):: ADD=G*25
6+H-65536 :: PRINT E*256+F
2 CALL LOAD(ADD-1,0):: NEXT
X :: STOP :: !@P-
1 CALL INIT :: CALL PEEK(-31952,A,B,C,D):: SL=C*256+
D-65539 :: EL=A*256+B-65536 :: FOR X=SL TO EL STEP
-4 :: CALL PEEK(X,E,F,G,H):: ADD=G*256+H-65536 :: PR
INT E*256+F
2 I=1 :: CALL PEEK(ADD-1,V):: IF V THEN 6
3 CALL PEEK(ADD+I,V,W):: IF V THEN I=I+1 :: GOTO 3
4 FOR Y=SL TO EL STEP -4 :: CALL PEEK(Y,E,E,E,F):: IF
E*256+F-65536=ADD+I+2 OR W=0 OR ADD+I>-3 THEN CALL L
OAD(ADD-1,I+1):: GOTO 6
5 NEXT Y :: I=I+1 :: GOTO 3
6 NEXT X :: STOP :: !@P-
* PROGRAM TO REENTER LINE
* LENGTH VALUES TO A BASIC PROG
* author wishes to be anon
* FROM TISHUG JULY 90
*
* RUNS ONLY FROM XB+32K
* load corrupted program into xb
* CALL INIT
* CALL LOAD("DSKn.FILENAME")
* CALL LINK("UNFIX")
*
DEF UNFIX
AORG >2500
UNFIX LWPI USRWS
MOV @>8330,R1
MOV @>8332,R2
C R1,R2
JHE FIN
*
INC R2
S R1,R2
SRL R2,1
CI R2,BUFMAX
JGT FIN
*
SRL R2,1
MOV R2,@BUFLEN
INCT R1
LI R4,BUFF
*
LOOP MOVB *R1+,*R4+
MOVB *R1+,*R4
DEC R4
DEC *R4
INCT R4
INCT R1
DEC R2
JNE LOOP
LI R5,>FFE8
AGAIN MOV @BUFLEN,R3
LI R2,ZERO
LI R1,BUFF
DECT R1
*
NEXT INCT R1
C *R1,*R2
JL SKIP
MOV R1,R2
SKIP DEC R3
JNE NEXT
*
MOV *R2,R6
MOV *R1,*R2
S R6,R5
DEC R5
SWPB R5
MOVB R5,*R6
MOV R6,R5
DEC @BUFLEN
JNE AGAIN
*
FIN LWPI >83E0
CLR R0
MOVB R0,@>837C
RT
*
USRWS BSS 32
BUFLEN BSS 2
ZERO DATA >0000
BUFMAX EQU >1800
BUFF BSS BUFMAX
*
END
/* S S TEST. 'SEVENS' */
/* VERSION 2 */
/* requires CSUP & PRINTF */
/* to be loaded at run time */
extern printf();
main()
{
/* declare variables */
int power,carry,count,sevens,i,len,temp;
int num[2500];
/* initialise variables */
power=1;
len=0;
num[0]=7;
/* calculate number */
while(1)
{
count=sevens=carry=0; power++;
for(i=0;i<=len;i++)
{
temp=num[i]*7+carry;
num[i]=temp%10;
carry=temp/10;
if(num[i]!=7)
count=0;
else
count++;
if(count>sevens)
sevens=count;
}
if(carry>0)
{
len++; num[len]=carry;
if(num[len]!=7)
count=0;
else
count++;
if(count>sevens)
sevens=count;
}
locate(1,1);
printf("checking 7 to the power of %d",power);
/* check for 6 sevens & display if found */
if(sevens==6)
{
locate(1,1);
printf("7 to the power of %d=",power);
puts(" ");
locate(3,1);count=0;
for(i=len;i>=0;i--)
{
printf("%d",num[i]);count++;
if(count==800)
{
locate(24,1);puts("any key for next section of number");
getchar();locate(24,1);puts(" ");
locate(3,1);
for(count=0;count<=800;count++)
{puts(" ");}
locate(3,1);count=0;
}
}
/* continue */
locate(24,1);puts("any key to proceed");
getchar();
locate(1,1);
for(count=0;count<=960;count++)
{puts(" ");}
}
if(len==2500)
{exit(0);}
}
}
Return to top of page
======================================
Now for ordinary 9900 machine code, this time from John Stocks...
DEF SEVAC
SEVAC LI 1,1 [NO. OF DIGITS]
LI 7,7
LI 10,10
MOV 1,@DIG
CLR 2 [POWER]
CLR 3 [CARRY]
A BL @MULT
CI 1,6
JNE A
B BL @MULT
BL @TEST
JMP B
MULT INC 2
CLR 4
LI 0,DIG [DIGIT STORE]
C INC 4
MOV *0,5
MPY 7,5
A 3,6
DIV 10,5
MOV 5,3
MOV 6,*0+
C 4,1
JNE C
CI 3,0
JEQ D
MOV 3,*0
CLR 3
INC 1
D B *11
TEST CLR 4
LI 0,DIG-2
E CLR 8
F AI 4,6
C 4,1
JGT RTN
AI 0,12
MOV *0,6
C 6,7
JNE F
G DEC 4
CI 4,0
JEQ H
DECT 0
MOV *0,6
C 6,7
JEQ G
H INC 4
C 4,1
JGT RTN
INCT 0
MOV *0,6
CI 6,7
JNE E
INC 8
CI 8,6
JNE H
B @PRINT
RTN B *11
PRINT MOV 1,14
MOV 2,6
LI 0,>182
LI 2,>E
LI 3,TXT1
BL @VMBW
LI 0,>195
LI 2,2
LI 3,TXT2
BL @VMBW
LI 0,>193
I CLR 5
DIV 10,5
MOV 6,1
AI 1,>30
BL @VSBW
DEC 0
MOV 5,6
CI 6,0
JNE I
MOV 14,0
AI 0,>1BF
MOV 14,4
INC 4
LI 5,DIG
J DEC 0
DEC 4
MOV *5+,1
AI 1,>30
BL @VSBW
CI 4,1
JNE J
LI 0,>FFFF
LI 1,>B
K DEC 1
L DEC 0
CI 0,0
JNE L
CI 1,0
JNE K
CLR 0
MOVB 0,@>837C
LWPI >83E0
B @>70
VSBW SWPB 0
MOVB 0,@>8C02
SWPB 0
MOVB 0,@>8C02
SWPB 1
MOVB 1,@>8C04
B *11
VMBW SWPB 0
MOVB 0,@>8C02
SWPB 0
MOVB 0,@>8C02
CLR 4
M MOV *3+,1
MOVB 1,@>8C04
INC 4
C 15,2
JEQ N
SWPB 1
MOVB 1,@>8C04
INC 4
C 4,2
JNE M
N B *11
TXT1 TEXT 'SEVEN TO POWER'
TXT2 TEXT 'IS'
DIG BSS 400
END
====================
Return to top of page
DEF SEVHI
SEVHI LI 1,1 [NO. OF DIGITS]
LI 7,7
LI 10,10
LI 9,-2
MOV 1,@DIG
CLR 2 [POWER]
CLR 3 [CARRY]
A BL @MULT
CI 1,6
JNE A
B BL @MULT
BL @TEST
CI 2,10000
JNE B
MOV 9,0
AI 0,3
LI 2,10
LI 3,TXT-2
BL @VMBW
DATA >10FF
MULT INC 2
CLR 4
LI 0,DIG [DIGIT STORE]
C INC 4
MOV *0,5
MPY 7,5
A 3,6
DIV 10,5
MOV 5,3
MOV 6,*0+
C 4,1
JNE C
CI 3,0
JEQ D
MOV 3,*0
CLR 3
INC 1
D B *11
TEST CLR 4
LI 0,DIG-2
E CLR 8
F AI 4,6
C 4,1
JGT RTN
AI 0,12
MOV *0,6
C 6,7
JNE F
G DEC 4
CI 4,0
JEQ H
DECT 0
MOV *0,6
C 6,7
JEQ G
H INC 4
C 4,1
JGT RTN
INCT 0
MOV *0,6
CI 6,7
JNE E
INC 8
CI 8,6
JNE H
MOV 11,8
BL @PRINT
MOV 8,11
JMP E
RTN B *11
PRINT MOV 11,13
MOV 1,14
MOV 2,12
AI 9,8
MOV 9,0
MOV 12,6
I CLR 5
DIV 10,5
MOV 6,1
AI 1,>30
BL @VSBW
DEC 0
MOV 5,6
CI 6,0
JNE I
MOV 12,2
MOV 14,1
MOV 13,11
B *11
VSBW SWPB 0
MOVB 0,@>8C02
SWPB 0
MOVB 0,@>8C02
SWPB 1
MOVB 1,@>8C04
B *11
VMBW SWPB 0
MOVB 0,@>8C02
SWPB 0
MOVB 0,@>8C02
CLR 4
M MOV *3+,1
MOVB 1,@>8C04
SWPB 1
MOVB 1,@>8C04
INC 4
C 4,2
JNE M
N B *11
TXT TEXT 'END OF RUN'
DIG BSS 400
END
====================================
Return to top of page
TXT2 TEXT 'IS'
PROGRAM SEVPAS;
VAR X,POW,MAXDIG,CARRY : INTEGER;
DIG : ARRAY[500] OF INTEGER;
PROCEDURE PRINT;
VAR Z:INTEGER;
BEGIN
WRITELN("SEVEN TO THE POWER OF",POW," IS :");
WRITELN;
FOR Z:=MAXDIG DOWNTO 1 DO
WRITE(SEG(CIS(DIG[Z]),2,1));
WRITELN;
WRITELN
END;
PROCEDURE SCAN;
VAR Y,SEV:INTEGER;
BEGIN
Y:=X;
WHILE DIG[Y]=7 DO
Y:=Y-1;
SEV:=0;
Y:=Y+1;
WHILE DIG[Y]=7 DO
BEGIN
SEV:=SEV+1;
IF SEV>=6 THEN PRINT;
Y:=Y+1
END;
END;
PROCEDURE TEST;
BEGIN
X:=6;
WHILE X<=MAXDIG DO
BEGIN
IF DIG[X]=7 THEN SCAN;
X:=X+6
END;
END;
PROCEDURE MULTIPLY;
VAR X : INTEGER;
BEGIN
FOR X:=1 TO MAXDIG DO
BEGIN
DIG[X]:=DIG[X]*7+CARRY;
IF DIG[X]>9 THEN
BEGIN
CARRY:=DIG[X] DIV 10;
DIG[X]:=DIG[X]-10*CARRY
END
ELSE CARRY:=0
END;
IF CARRY<>0 THEN
BEGIN
DIG[MAXDIG+1]:=CARRY;
MAXDIG:=MAXDIG+1;
CARRY:=0
END;
POW:=POW+1
END;
BEGIN
MAXDIG:=1;
DIG[1]:=1;
POW:=0;
CARRY:=0;
REPEAT
MULTIPLY;
UNTIL POW=11;
REPEAT
MULTIPLY;
TEST;
UNTIL POW=500
END.
Many thanks to everyone who has submitted code. Can any of this be made faster?
Any more languages?
Return to top of page