DASK-kode

Fra DDHFwiki
Spring til navigation Spring til søgning

Christian Gram: I 2007 lavede Mogens Kjær sin DASK-simulator. Den måtte jeg prøve for at se, om jeg kunne genopfriske DASK-kodning. Så jeg lavede nedenstående primitive program til primtalstest. Med lidt hjælp fra Mogens lykkedes det at få programmet til at køre. En 'strimmel' (dvs en tekstfil) med programmet på hexadecimal form kan indlæses og køres i en helt tom DASK. Her er 'manual' og programbeskrivelse.


Kørselsvejledning

Program-strimlen indlæses til den tomme DASK ved at aktivere nøglen ”Indlæsning Strimmel” på kontrolbordet. Efter indlæsning af programmet stopper DASK, klar til start i celle 108.

Program-strimlen har efter selve programmet et antal positive heltal mellem 2 og 2ˆ19, adskilt med bogstavet A. Ved Start læser programmet det første heltal, tester om det er et primtal, trykker resultatet på skrivemaskinen og stopper. Ved fornyet aktivering af Start-nøglen indlæses næste heltal o.s.v.

For hvert tal, der testes, trykkes en linie på skrivemaskinen med tallet selv fulgt af ”+” eller ”-”, afhængigt af om tallet er primtal eller ej. Udskrift på skrivemaskinen forudsætter, at omskifteren ”S-Kanal” står på 0 eller S+P.

Funktion

Primtalstesten af hvert tal N sker ganske primitivt ved at beregne divisionsresterne N mod m med alle tallene 2 <= m <= N/2: Hvis blot en rest er 0, er N ikke primtal; hvis alle rester er >0, er N primtal. DASK-programmet svarer nogenlunde til flg. Pascal-program:

 var  N, m, i: integer;
 begin 
 Om:readinteger(N);
    for i := 2 to (N div 2) do begin
      m := N mod i;
      if m = 0 then begin
         writeln(N, ‘-‘);
         goto Slut;
         end;
      end;
    writeln(N, ’+’);
 Slut:stop; goto Om;
 end.

Programmet placeres i celle 100-147. Her er celle 100-107 diverse variable og talkonstanter, mens selve ordrerne fylder celle 108-147, altså 40 ordrer. Her udgør celle 140-47 en slags subsekvens.

Maskinprogrammet er lidt mere indviklet end ovenstående Pascal-program, bl.a. fordi heltalsdivisionen udføres i en subsekvens (celle 140-147) helt primitivt ved gentagne subtraktioner N-m, N-2m, … indtil 0<=Rest<N. Derefter testes, om resten er 0 eller ej. Tallet N indlæses også ciffer for ciffer , opbygges i registeret AR og udskrives ciffer for ciffer (ordrerne 109-120). En mere maskinnær version af Pascalprogrammet er flg.:

var N, m, T, Nhalve: integer;
begin
Om:  writeln;
      N := 0;
 NytT:T := nextchar;
      writechar(T);
      if (AR ikke ciffer) then goto Test;
      N := 10*N + T;
      goto NytT;
 Test:Nhalve := N div 2; 
      m := 2;
NyDiv:AR := N;      
Subtr:AR := AR – m;     {afsnittet Subtr er subsekvensen, som 'dividerer' vhja subtraktioner}
      if AR<0 then begin AR := AR + m;
                         go to Nytm;
                   end;
      if AR=0 then goto Ej    {divisionsrest=0}
              else goto Subtr;
Nytm  m := m + 1;
      if m+1 < Nhalve then goto NyDiv;
Prim: write(‘ +’);              {alle divisorer gav rest>0}
      stop; goto Om;
EjP:  write(’ –’);              {en division gik op}
      stop; goto Om;
end.

Assembler-kode

For at indlæse program (og konstanter) opbygges først i celle 25-48 et antal indlæseordrer, som er i stand til at placere programmet i celle 100-147. Det sker med ordrer af form yy A 19, som skal hulles forrest på strimlen. Hver ordre indlæser 2 nye ordrer (af samme form), og ved at gøre dette 24 gange opbygges 24 indlæseordrer, som så indlæser konstanterne og selve programmet til celle 100-147. Indlæseordrerne slutter med ordren ”stop; hop til programstart” i celle 49. Det næste på strimlen er variabelceller, konstanter og selve programmet. Kolonnen til venstre viser, hvor i lageret alle indlæseordrerne bliver placeret.

  0   0 A 00 } læses m. startnøgle
  1   2 A 19 }   
  2   4 A 19   læses af ordre 1
  3   6 A 19   
  4   8 A 19   læses af ordre 2
  5  10 A 19
  6  12 A 19   læses af ordre 3
  7  14 A 19
  8  16 A 19   læses af ordre 4
  9  18 A 19
 10  20 A 19   læses af ordre 5
 11  22 A 19
 . . .
 24  48 A 19   læses af ordre 12
 25 100 A 19   (flg. ordrer læser selve programmet, 2 ordrer ad gangen)
 26 102 A 19
 27 104 A 19
 . . .
 47 144 A 19
 48 146 A 19   læses af ordre 22
 49 108 A 30   stop. hop til 108 (programstart)
      0 A 00
      0 A 00   (celle 100: variabel N)
      0 A 00   {celle 102: variabel m}
      0 A 00   (celle 103: variabel T)
      0 A 00   
      0 A 0A   (konst 10)
      0 A 00   (celle 106: Nhalve)
      0 A 01   {celle 107: konst 1}
      1 A 1B   (programstart i celle 108)
    100 A 48
      0 A 59   (NytT:celle 110)
    . . .
    107 A 20  
147:140 A 10    (sidste programordre i celle 147) 

Herefter følger nogle heltal, adskilt med bogstav A. Det er de tal der skal testes.

Assemblerkoden (med kommentarer) og den endelige hexadecimale kode kan ses i DASK primtalsprogram.