From 89400a8e9db5efadc71b2481496d4f407cafe9f1 Mon Sep 17 00:00:00 2001 From: Michaelangel007 Date: Thu, 18 Aug 2016 18:20:12 -0700 Subject: [PATCH] Applesoft BASIC normal and debug versions --- rpm.bas | 1 + rpm.debug.bas | 98 +++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 99 insertions(+) create mode 100644 rpm.debug.bas diff --git a/rpm.bas b/rpm.bas index 28f1a80..763be53 100644 --- a/rpm.bas +++ b/rpm.bas @@ -52,6 +52,7 @@ 74 IF ZERO THEN 76:REM SKIP LEADING ZEROES 75 PRINT S(I); 76 NEXT +77 IF ZERO=1 THEN PRINT 0; 79 RETURN:REM 100 DIM A(32),B(32),S(64):M=32 diff --git a/rpm.debug.bas b/rpm.debug.bas new file mode 100644 index 0000000..337189b --- /dev/null +++ b/rpm.debug.bas @@ -0,0 +1,98 @@ +1 REM 0=OFF,1=PRINT '.' PER PASS,2=PRINT A,B,S +2 DEBUG=2 +10 HOME:GOTO 100:REM + +20 REM S += A +21 C=0 +22 FOR I=1 TO M +23 D=S(I) + A(I) + C +24 C=0:IF D > 9 THEN C=1:D=D-10 +25 S(I)=D +26 NEXT +29 RETURN:REM + +30 REM SHL A +31 C=0 +32 FOR I=1 TO M +33 SUM=A(I)*2 + C +34 C=0:IF SUM > 9 THEN C=1:SUM=SUM-10 +35 A(I)=SUM +36 NEXT +39 RETURN:REM + +40 REM SHR B +41 C=0 +42 FOR I=M TO 1 STEP-1 +43 V=B(I) + C +44 Q=INT(V/2) +45 B(I)=Q +46 C=(V-Q*2)*10 +47 NEXT +49 RETURN:REM + +50 REM IS B[] ZERO? +51 ZERO=1 +52 FOR I=1 TO M +53 IF B(I)<>0 THEN ZERO=0 +54 NEXT +59 RETURN:REM + +60 REM FILL BCD ARRAY: T$ -> S[] +61 T=LEN(T$) +62 FOR I=1 TO T +63 S(T-I+1)=VAL(MID$(T$,I,1)) +64 NEXT +65 FOR I=T+1 TO M +66 S(I) = 0 +67 NEXT +69 RETURN:REM + +70 REM PRINT S[] +71 ZERO=1 +72 FOR I=M TO 1 STEP -1 +73 IF S(I)<>0 THEN ZERO=0 +74 IF ZERO THEN 76:REM SKIP LEADING ZEROES +75 PRINT S(I); +76 NEXT +77 IF ZERO=1 THEN PRINT 0; +79 RETURN:REM + +80 REM PRINT A +81 ZERO=1 +82 FOR I=M TO 1 STEP-1 +83 IF S(I)<>0 THEN ZERO = 0 +84 IF ZERO THEN 86 +85 PRINT A(I); +86 NEXT +87 IF ZERO=1 THEN PRINT 0; +89 RETURN:REM + +90 REM PRINT B +91 ZERO=1 +92 FOR I=M TO 1 STEP-1 +93 IF S(I)<>0 THEN ZERO=0 +94 IF ZERO THEN 96 +95 PRINT B(I); +96 NEXT +97 IF ZERO=1 THEN PRINT 0; +99 RETURN:REM + +100 DIM A(32),B(32),S(64):M=32 +110 PRINT "RUSSIAN PEASANT MULTIPLICATION":PRINT +120 PRINT "ENTER A":INPUT A$ +130 PRINT "ENTER B":INPUT B$ +140 T$=A$:GOSUB 61:N=T :FOR I=1 TO T:A(I)=S(I):NEXT +150 T$=B$:GOSUB 61:M=T+N:FOR I=1 TO T:B(I)=S(I):NEXT +160 T=0:GOSUB 65:REM S = 0 +170 REM WHILE B != 0 +180 GOSUB 51:IF ZERO THEN 240 +190 HALF=B(1)*.5:IF DEBUG=1 THEN PRINT "."; +200 IF HALF <> INT(HALF) THEN GOSUB 21: REM S += A +210 GOSUB 31:REM SHL A +220 GOSUB 41:REM SHR B +225 IF DEBUG=2 THEN PRINT "A=";: GOSUB 81: PRINT +226 IF DEBUG=2 THEN PRINT "B=";: GOSUB 91: PRINT +227 IF DEBUG=2 THEN PRINT "S=";: GOSUB 71: PRINT +230 GOTO 180 +240 PRINT A$;" x ";B$;" = ":PRINT " ";:GOSUB 71:PRINT +