{-----------------------------------------------------------------------+ | | | Prime | | | +-----------------------------------------------------------------------} gcl0x {GCL version for this program} AnzahlPrimzahlen D I N X Teiler Teilerhalbe Isprime ZZ R x y i tmp fontData Pos q p bits Color Radix Value Char {-----------------------------------------------------------------------+ |}\vLR>++ ret{ RAM page 3 | +-----------------------------------------------------------------------} $0300: [def {DrawChar} {Map ASCII code to offset in font table} Char 82- [if<0 50+ i= \font32up else i= \font82up] fontData= {Select low or high page} i i+ tmp= tmp+ i+ {Multiply by 5} fontData+ fontData= {Add to page address to reach bitmap data for Char} $800 Pos+ q= {Where to stop the inner drawing loop} {Draw 6 vertical slices: 5 using font data, the last with all-zeros} 5 i= [do [if<>0 fontData 0? fontData<++ else 0] bits= Pos p= {Draw vertical slice} [do bits 128& [if=0 32 {Blue} else Color] p. bits bits+ bits= p>++ p q- if<0loop] Pos<++ i 1- i= if>=0loop] ret ] DrawChar= [def {DrawNextDigit} push Radix= Value Radix- [if>=0 Value= $31 Char= Value [do Radix- if>=0 Value= Char<++ loop ] DrawChar! $30 Char= else DrawChar! ] pop ret ] DrawNextDigit= [def {DrawNumber} push Value= $20 Char= 10000 DrawNextDigit! 1000 DrawNextDigit! 100 DrawNextDigit! 10 DrawNextDigit! $30 Char= 1 DrawNextDigit! pop ret ] DrawNumber= {-----------------------------------------------------------------------+ |}\vLR>++ ret{ RAM page 4 | +-----------------------------------------------------------------------} $0400: [def {halt} $7FFF ZZ= [do ZZ if>0 loop] $7FFF ZZ= ret ] halt= [def {ReadPrime} DRead>, $7F- [if<>0 {if höchste highbyte adresse erreicht} DRead<, $FE- [if=0 DRead>++ $A0 DRead<. ret {if höchste lowbyte adresse erreicht} else DRead<++ DRead<++ ret]] { nächste adresse einstellen} ] ReadPrime= [def {NewLine} $800 Pos+ 255| 255^ Pos= ret ] NewLine= [def { Clear screenV1} $800 p= $8801 i= \SYS_VDrawBits_134 \sysFn= 32 \sysArgs0. \sysArgs1. {Blue} [do p [do \sysArgs4= 134! {Clears 8 pixels vertically} $800 p+ p= if>0loop] i+ p= 255& 160^ if<>0loop] ret ] ClearScreenV1= [def { Clear screenV3 } \SYS_SetMemory_v2_54 \sysFn= {!!! Not in ROM v1 !!!} 32 \sysArgs1. {Color blue} $800 [do p= \sysArgs2= {Destination} 160 \sysArgs0. {Count} 54! {SYS call} $100 p+ if>0loop] ret ] ClearScreenV3= [def {WritePrime} D>, $7F- [if<>0 {if höchste highbyte adresse erreicht} D<, $FE- [if=0 D>++ $A0 D<. ret {if höchste lowbyte adresse erreicht} else D<++ D<++ ret]] { nächste adresse einstellen} ] WritePrime= {-----------------------------------------------------------------------+ |}\vLR>++ ret{ RAM page 5 | +-----------------------------------------------------------------------} $0500: [do ClearScreenV1! 0 AnzahlPrimzahlen= 63 Color= $800 Pos= 5 x= 75 y= 0 $089E D= {erste Posiiton Mimnus 2 im RAM für Primzahlen,start 08A0 } 32767 N= { compute prime until } 1 Isprime= ZZ= 2 I= [do { 3 bis 32767 } \SYS_LSRW1_48 \sysFn= { Lade SysFunction rechtsshift1 (/2) in sysfn } $08A0 R= 2 R: { preload $80A0 with 2 for first loop,when I=2 } $089E DRead= { erste Posiiton Mimnus 2 im RAM für Primzahlen,start 08A0 } 1 Isprime= { Isprime = 1 } [do { Divisionsschleife } ReadPrime! DRead; Teiler= { get addr of next prime, read it in Teiler } I 48! Teilerhalbe= { 48!: call function in SysFn:rechtsshift1 = /2 } I X= { X=I } [do { Subtraktionsschleife } X Teiler- X= { X=X-Teiler} if>0 loop] [if=0 I 2- [if=0 1 Isprime= else 0 Isprime=]] { if 2->Isprime=1 else no prime Isprime=0 } [if<0 { possible prime, next divisor } Teilerhalbe Teiler- if>0 loop] ] { dividieren bis Teiler /2} {halt!} Isprime [if>0 AnzahlPrimzahlen 1+ AnzahlPrimzahlen= WritePrime! I D: { write prime to next RAM addr } Pos<++ Pos<++ { 2 pixel space between 5 digit numbers } I DrawNumber! y 1- y= x 1- x= { print prime on screen } [if=0 NewLine! 5 x= { handle newline and newpage} y [if=0 $800 Pos= 75 y= ClearScreenV1!]] ] I 2- [if=0 I 1+ else I 2+ ] I= N- { if prime is 2: ++1, else ++2 } if<=0 loop { from 3 only compute odd numbers } ] { loop from 2 bis N} AnzahlPrimzahlen DrawNumber! loop]