From 76c8a3dc5fec6015ef28ef85309bbb5f75aa4654 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20GIBERT?= Date: Thu, 17 Dec 2020 21:23:54 +0100 Subject: [PATCH] Kernel 0.94+ --- .Docs/Forth Words.md | 2 +- .Floppies/A2OSX.BUILD.po | Bin 33553920 -> 33553920 bytes BIN/FORTH.S.CP.txt | 317 +++++++++++++++++++++----------------- BIN/FORTH.S.GFX.txt | 109 +++++-------- BIN/FORTH.S.txt | 137 +++++++++++----- DRV/DHGR.DRV.S.LINE.txt | 1 + EXAMPLES/MANDELBROT.F.txt | 131 +++++++--------- SBIN/TELNETD.S.txt | 2 +- 8 files changed, 381 insertions(+), 318 deletions(-) diff --git a/.Docs/Forth Words.md b/.Docs/Forth Words.md index 35b45e9c..3d0c8544 100644 --- a/.Docs/Forth Words.md +++ b/.Docs/Forth Words.md @@ -98,7 +98,7 @@ This document lists all of the **Forth Words** supported in the A2osX implementa | LOOP | ( - ) | Working | Increment index, terminate loop if equal to limit | | +LOOP | ( n - ) | Working | Increment index by n. Terminate loop if outside limit | | I | ( - index ) | Working | Place loop index on stack | -| LEAVE | ( - ) | | Terminate loop at next LOOP or +LOOP | +| LEAVE | ( - ) | Working | Terminate loop at next LOOP or +LOOP | | IF | ( f - ) | Working | If top of stack is true, execute true clause | | ELSE | ( - ) | Working | Beginning of the false clause | | ENDIF | ( - ) | Working | End of the IF-ELSE structure | diff --git a/.Floppies/A2OSX.BUILD.po b/.Floppies/A2OSX.BUILD.po index f17b68fd1acc1472981ed5d2270007b5cbfec41a..4831fbbae8bbcf9bcab4c854ce3aa706de5f342e 100644 GIT binary patch delta 20649 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 SSKv3`67W0sgnXHs^?v}d|1w7a diff --git a/BIN/FORTH.S.CP.txt b/BIN/FORTH.S.CP.txt index 3ea481ad..bd72e305 100644 --- a/BIN/FORTH.S.CP.txt +++ b/BIN/FORTH.S.CP.txt @@ -13,37 +13,33 @@ CP.RUN cpx #KW.CONLY .1 jmp (J.KEYWORDS,x) *-------------------------------------- -CP.DO jsr CP.PushCodePtr for compiling LOOP later +CP.DO jsr CP.Emit.DO + jsr CP.PushCodePtr for compiling LOOP later + clc + rts +*-------------------------------------- +CP.LOOP lda #$00 + jsr CP.Emit.PUSHBI >PUSHBI 0 + + lda #$01 >PUSHBI 1 + jsr CP.Emit.PUSHBI +*-------------------------------------- +CP.pLOOP jsr CP.Emit.LOOP + jsr CP.Emit.JMPBack + jsr CP.Emit.LOOPEND + + inc RP + inc RP clc rts *-------------------------------------- -CP.LOOP lda #$A9 lda #imm - jsr CP.Emit.Byte - lda #$00 - jsr CP.Emit.Byte - jsr CP.Emit.PUSHA - - lda #$A9 lda #imm - jsr CP.Emit.Byte - lda #$01 - jsr CP.Emit.Byte - jsr CP.Emit.PUSHA pushed n = 1 -*-------------------------------------- -CP.pLOOP >LDYA J.KEYWORDS.ADD MAX I n -> MAX NEWI - jsr CP.Emit.JsrYA - jsr CP.Emit.LOOP - jsr CP.Emit.JMPBack - jsr CP.Emit.LOOPEND +CP.I jsr CP.Emit.I clc rts *-------------------------------------- -CP.I >LDYA J.KEYWORDS DUP - - clc - jmp CP.Emit.JsrYA -*-------------------------------------- -CP.LEAVE +CP.LEAVE jsr CP.Emit.LEAVE + jsr CP.Emit.JMPBack clc rts @@ -55,7 +51,7 @@ CP.IF jsr CP.Emit.TESTTRUE rts *-------------------------------------- CP.ELSE jsr CP.PopPtr1 get previous JMP -> ptr1 - jsr CP.Emit.JMP0000 to put jmp -> ENDIF later + jsr CP.Emit.JMP0000 to put jmp -> ENDIF later jsr CP.UpdatePtr1 clc @@ -87,10 +83,164 @@ CP.REPEAT jsr CP.Emit.JMPBack CP.WHILE jsr CP.Emit.TESTTRUE jsr CP.Emit.JMPBack jsr CP.Emit.RPDROP2 - + clc rts *-------------------------------------- +CP.Emit.JMP0000 lda #$4C JMP + jsr CP.Emit.Byte + + jsr CP.PushCodePtr + + lda #0 + jsr CP.Emit.Byte + jsr CP.Emit.Byte + + rts +*-------------------------------------- +CP.Emit.JMPBack lda #$4C JMP + jsr CP.Emit.Byte + + ldy RP + iny + lda (pData),y + jsr CP.Emit.Byte + + iny + lda (pData),y + jmp CP.Emit.Byte +*-------------------------------------- +CP.Emit.RPDROP2 ldx #CODE.RPDROP2.L + ldy #0 + +.1 lda CODE.RPDROP2,y + jsr CP.Emit.Byte + iny + dex + bne .1 + + rts +*-------------------------------------- +CP.Emit.TESTTRUE + ldx #CODE.TESTTRUE.L + ldy #0 + +.1 lda CODE.TESTTRUE,y + jsr CP.Emit.Byte + iny + dex + bne .1 + + rts +*-------------------------------------- +CP.Emit.TESTFALSE + ldx #CODE.TESTFALSE.L + ldy #0 + +.1 lda CODE.TESTFALSE,y + jsr CP.Emit.Byte + iny + dex + bne .1 + + rts +*-------------------------------------- +CP.Emit.PULLA ldx #CODE.PULLA.L + ldy #0 + +.1 lda CODE.PULLA,y + jsr CP.Emit.Byte + iny + dex + bne .1 + + rts +*-------------------------------------- +CP.Emit.PUSHBI pha + lda #$A9 lda #imm + jsr CP.Emit.Byte + pla + jsr CP.Emit.Byte +*-------------------------------------- +CP.Emit.PUSHA ldx #CODE.PUSHA.L + ldy #0 + +.1 lda CODE.PUSHA,y + jsr CP.Emit.Byte + iny + dex + bne .1 + + rts +*-------------------------------------- +CP.Emit.DO ldx #CODE.DO.L + ldy #0 + +.1 lda CODE.DO,y + jsr CP.Emit.Byte + iny + dex + bne .1 + + rts +*-------------------------------------- +CP.Emit.LOOP ldx #CODE.LOOP.L + ldy #0 + +.1 lda CODE.LOOP,y + jsr CP.Emit.Byte + iny + dex + bne .1 + + rts +*-------------------------------------- +CP.Emit.LOOPEND ldx #CODE.LOOPEND.L + ldy #0 + +.1 lda CODE.LOOPEND,y + jsr CP.Emit.Byte + iny + dex + bne .1 + + rts +*-------------------------------------- +CP.Emit.I ldx #CODE.I.L + ldy #0 + +.1 lda CODE.I,y + jsr CP.Emit.Byte + iny + dex + bne .1 + + rts +*-------------------------------------- +CP.Emit.LEAVE ldx #CODE.LEAVE.L + ldy #0 + +.1 lda CODE.LEAVE,y + jsr CP.Emit.Byte + iny + dex + bne .1 + + rts +*-------------------------------------- +CP.Emit.JsrYA pha + lda #$20 + jsr CP.Emit.Byte + tya + jsr CP.Emit.Byte + pla +*-------------------------------------- +CP.Emit.Byte sta (ZPCodePtr) + inc ZPCodePtr + bne .8 + inc ZPCodePtr+1 +.8 rts +*-------------------------------------- CP.PushCodePtr ldy RP lda ZPCodePtr+1 @@ -125,121 +275,6 @@ CP.UpdatePtr1 lda ZPCodePtr sta (ZPPtr1),y rts *-------------------------------------- -CP.Emit.JMP0000 lda #$4C JMP - jsr CP.Emit.Byte - - jsr CP.PushCodePtr - - lda #0 - jsr CP.Emit.Byte - jsr CP.Emit.Byte - - rts -*-------------------------------------- -CP.Emit.JMPBack lda #$4C JMP - jsr CP.Emit.Byte - - ldy RP - iny - lda (pData),y - jsr CP.Emit.Byte - - iny - lda (pData),y - jmp CP.Emit.Byte -*-------------------------------------- -CP.Emit.RPDROP2 ldx #CODE.RPDROP2.L - ldy #0 - -.1 lda CODE.RPDROP2,y - jsr CP.Emit.Byte - iny - dex - bne .1 - - rts -*-------------------------------------- -CP.Emit.TESTTRUE - ldx #CODE.TESTTRUE.L - ldy #0 - -.1 lda CODE.TESTTRUE,y - jsr CP.Emit.Byte - iny - dex - bne .1 - - rts -*-------------------------------------- -CP.Emit.TESTFALSE - ldx #CODE.TESTFALSE.L - ldy #0 - -.1 lda CODE.TESTFALSE,y - jsr CP.Emit.Byte - iny - dex - bne .1 - - rts -*-------------------------------------- -CP.Emit.PULLA ldx #CODE.PULLA.L - ldy #0 - -.1 lda CODE.PULLA,y - jsr CP.Emit.Byte - iny - dex - bne .1 - - rts -*-------------------------------------- -CP.Emit.PUSHA ldx #CODE.PUSHA.L - ldy #0 - -.1 lda CODE.PUSHA,y - jsr CP.Emit.Byte - iny - dex - bne .1 - - rts -*-------------------------------------- -CP.Emit.LOOP ldx #CODE.LOOP.L - ldy #0 - -.1 lda CODE.LOOP,y - jsr CP.Emit.Byte - iny - dex - bne .1 - - rts -*-------------------------------------- -CP.Emit.LOOPEND ldx #CODE.LOOPEND.L - ldy #0 - -.1 lda CODE.LOOPEND,y - jsr CP.Emit.Byte - iny - dex - bne .1 - - rts -*-------------------------------------- -CP.Emit.JsrYA pha - lda #$20 - jsr CP.Emit.Byte - tya - jsr CP.Emit.Byte - pla -*-------------------------------------- -CP.Emit.Byte sta (ZPCodePtr) - inc ZPCodePtr - bne .8 - inc ZPCodePtr+1 -.8 rts -*-------------------------------------- MAN SAVE usr/src/bin/forth.s.cp LOAD usr/src/bin/forth.s diff --git a/BIN/FORTH.S.GFX.txt b/BIN/FORTH.S.GFX.txt index ff2c8b88..a3bf846a 100644 --- a/BIN/FORTH.S.GFX.txt +++ b/BIN/FORTH.S.GFX.txt @@ -7,19 +7,16 @@ GFX.Open >PUSHBI 0 bcs .9 >STA.G hDevGFX - -* ldy #S.PS.hStdIn -* lda (pPS),y -* >SYSCALL GetMemPtr -* >STYA ZPPtr1 -* ldy #S.FD.DEV.DEVID -* lda (ZPPtr1),y - -* >PUSHA -* >PUSHBI IOCTL.CONTROL -* >PUSHWI 0 -* >SYSCALL IOCTL + ldy #S.PS.hStdIn + lda (pPS),y + bit #1 + beq .9 + + >PUSHA + >PUSHBI IOCTL.CONTROL + >PUSHWI 0 + >SYSCALL IOCTL .9 rts *-------------------------------------- @@ -27,79 +24,57 @@ GFX.Close >LDA.G hDevGFX beq .9 >SYSCALL Close - -.9 rts + +.9 rts *-------------------------------------- * (Y X C) *-------------------------------------- -GFX.PLOT lda #S.CB.CMD.SETPIXEL - >STA.G GFX.CB+S.CB.CMD - lda #S.CB.OP.SET - >STA.G GFX.CB+S.CB.OP - lda #S.CB.M.C16 - >STA.G GFX.CB+S.CB.M - - >PULLA - >STA.G GFX.CB+S.CB.COLOR - - >PULLA - - ldx #4 - ldy #GFX.CB+S.CB.X1+3 +GFX.PLOT ldx #S.CB.CMD.SETPIXEL + jsr GFX.WriteX -.1 >PULLA - sta (pData),y - dey - dex - bne .1 - - >PUSHB.G hDevGFX - >PUSHBI IOCTL.WRITE - >PUSHEA.G GFX.CB - >SYSCALL IOCTL - lda pStack clc - adc #6 + adc #8 sta pStack - + clc rts *-------------------------------------- * (Y2 X2 Y1 X1 C) *-------------------------------------- -GFX.RECT lda #S.CB.CMD.FILLRECT - >STA.G GFX.CB+S.CB.CMD - lda #S.CB.OP.SET - >STA.G GFX.CB+S.CB.OP - lda #S.CB.M.C16 - >STA.G GFX.CB+S.CB.M - - >PULLA - >STA.G GFX.CB+S.CB.COLOR +GFX.RECT ldx #S.CB.CMD.FILLRECT - >PULLA + jsr GFX.WriteX - ldx #8 - ldy #GFX.CB+S.CB.X1+7 - -.1 >PULLA - sta (pData),y - dey - dex - bne .1 - - >PUSHB.G hDevGFX - >PUSHBI IOCTL.WRITE - >PUSHEA.G GFX.CB - >SYSCALL IOCTL - lda pStack clc - adc #10 + adc #12 sta pStack - + clc rts *-------------------------------------- +GFX.WriteX ldy #1 + lda (pStack) + sta (pStack),y + + lda #S.CB.M.MONO + sta (pStack) + + >PUSHBI S.CB.OP.SET + txa + >PUSHA + + >PUSHB.G hDevGFX + >PUSHBI IOCTL.WRITE + lda pStack + clc + adc #2 + tay + lda pStack+1 + adc #0 + >PUSHYA + >SYSCALL IOCTL + clc DHGR.DRV bug ? + rts *-------------------------------------- *-------------------------------------- *-------------------------------------- diff --git a/BIN/FORTH.S.txt b/BIN/FORTH.S.txt index 5e82b897..774c35bd 100644 --- a/BIN/FORTH.S.txt +++ b/BIN/FORTH.S.txt @@ -7,6 +7,7 @@ NEW *-------------------------------------- .INB inc/macros.i .INB inc/a2osx.i + .INB inc/kernel.i .INB inc/mli.i .INB inc/mli.e.i .INB inc/gfx.i @@ -98,7 +99,7 @@ J.ESC .DA CL.BS left arrow L.KEYWORDS .DA KEYWORDS J.KEYWORDS .DA GFX.PLOT .DA GFX.RECT - .DA KW.DUP +J.KEYWORDS.DUP .DA KW.DUP .DA KW.DROP .DA KW.SWAP J.KEYWORDS.OVER .DA KW.OVER @@ -266,7 +267,7 @@ CS.RUN >PUSHW L.MSG.GREETINGS stz bCompile lda #127 sta RP - + jsr GFX.Open *-------------------------------------- CS.RUN.LOOP >SLEEP @@ -278,15 +279,15 @@ CS.RUN.LOOP >SLEEP .2 jsr CS.FORTH.Run bcs .7 - + >LDA.G hFile bne CS.RUN.LOOP - + >PUSHW L.MSG.OK >PUSHBI 0 >SYSCALL PrintF bcs .99 - + bra CS.RUN.LOOP .7 cmp #MLI.E.EOF @@ -298,17 +299,17 @@ CS.RUN.LOOP >SLEEP pha >LDA.G hFile beq .71 - + >LDA.G bTrace bmi .70 jsr PrintTraceMsg - + .70 pla pha jsr PrintErrPtr bra .9 - + .71 pla >PUSHA @@ -360,7 +361,7 @@ CS.FORTH.Run jsr CL.Reset *-------------------------------------- CS.FORTH.Run.File >INCW.G LineCounter - + >PUSHWI 256 >PUSHW ZPCLBuf @@ -399,7 +400,7 @@ CS.RUN.EXEC lda (ZPCLBufPtr) jsr IsSpaceOrCR bcc .1 - + jsr NextChar bra CS.RUN.EXEC @@ -417,8 +418,17 @@ CS.RUN.EXEC lda (ZPCLBufPtr) bit ZPType bmi .4 CODE + bit bCompile + bmi .3 + >PUSHW ZPAddrPtr CONSTANT,VARIABLE bra CS.RUN.EXEC + +.3 lda ZPAddrPtr+1 VARIABLE : push addr, CONSTANT : push value + jsr CP.Emit.PUSHBI + lda ZPAddrPtr + jsr CP.Emit.PUSHBI + bra CS.RUN.EXEC .4 bit bCompile bmi .40 @@ -445,7 +455,7 @@ CS.RUN.EXEC lda (ZPCLBufPtr) cpx #KW.CONLY bcc .70 - + lda #E.SYN sec rts @@ -559,7 +569,7 @@ CS.RUN.GetNum >PUSHW ZPCLBufPtr sta (pStack),y inc pStack - + * clc .9 rts @@ -570,14 +580,14 @@ CS.RUN.GetNum >PUSHW ZPCLBufPtr jsr CP.Emit.Byte jsr CP.Emit.PUSHA - + lda #$A9 lda #imm jsr CP.Emit.Byte lda (pStack) jsr CP.Emit.Byte jsr CP.Emit.PUSHA - + >RET 4 *-------------------------------------- CS.DOEVENT sec @@ -630,7 +640,7 @@ PrintDebugMsg >PUSHW L.MSG.DEBUG >PUSHB RP >PUSHBI 6 >SYSCALL PrintF - + rts *-------------------------------------- PrintTraceMsg ldy #S.PS.hStdErr @@ -651,25 +661,25 @@ PrintErrPtr lda ZPCLBufPtr sbc ZPCLBuf tax - + ldy #0 lda #C.SPACE - + .1 sta (ZPCLBuf),y iny cpy #7 bne .1 - + txa beq .3 - + lda #'-' - + .2 sta (ZPCLBuf),y iny dex bne .2 - + .3 lda #'^' sta (ZPCLBuf),y iny @@ -681,14 +691,14 @@ PrintErrPtr lda ZPCLBufPtr lda #C.LF sta (ZPCLBuf),y iny - + txa sta (ZPCLBuf),y - + ldy #S.PS.hStdErr lda (pPS),y >PUSHA - + >PUSHW ZPCLBuf >SYSCALL FPutS @@ -755,12 +765,12 @@ IsSpaceOrCR cmp #C.SPACE CS=TRUE beq .8 clc - + .8 rts *-------------------------------------- CheckStackPop4 lda pStack beq .9 - + cmp #$FD bcs .9 @@ -932,25 +942,80 @@ CODE.PULLA.L .EQ *-CODE.PULLA CODE.PUSHA >PUSHA CODE.PUSHA.L .EQ *-CODE.PUSHA *-------------------------------------- -CODE.LOOP ldy #2 - lda (pStack),y - cmp (pStack) - inc pStack +CODE.DO lda RP + sec + sbc #4 + sta RP + tay + + ldx #4 + +.1 >PULLA + sta (pData),y + iny + dex + bne .1 +CODE.DO.L .EQ *-CODE.DO +*-------------------------------------- +CODE.LOOP >PULLA + ldy RP + clc + adc (pData),y + sta (pData),y - lda (pStack),y - sbc (pStack) + >PULLA + iny + adc (pData),y + sta (pData),y - dec pStack + dey + + lda (pData),y + iny + iny + cmp (pData),y + + dey + + lda (pData),y + iny + iny + sbc (pData),y -.1 bcc .1+5 +.1 bcs .1+5 CODE.LOOP.L .EQ *-CODE.LOOP *-------------------------------------- -CODE.LOOPEND lda pStack POP 4 bytes +CODE.LOOPEND lda RP POP 4 bytes clc adc #4 - sta pStack + sta RP clc CODE.LOOPEND.L .EQ *-CODE.LOOPEND +*-------------------------------------- +CODE.I ldy RP + iny + lda (pData),y + >PUSHA + dey + lda (pData),y + >PUSHA +CODE.I.L .EQ *-CODE.I +*-------------------------------------- +CODE.LEAVE ldy RP + iny + iny + lda (pData),y + tax + iny + lda (pData),y + dey + dey + sta (pData),y + txa + dey + sta (pData),y + >DEBUG +CODE.LEAVE.L .EQ *-CODE.LEAVE *-------------------------------------- .DUMMY .OR 0 diff --git a/DRV/DHGR.DRV.S.LINE.txt b/DRV/DHGR.DRV.S.LINE.txt index 75f02799..ccf59513 100644 --- a/DRV/DHGR.DRV.S.LINE.txt +++ b/DRV/DHGR.DRV.S.LINE.txt @@ -19,6 +19,7 @@ HLINE.MONO >LDYA CB.Cache+S.CB.X1 lda #%01111111 .1 ldx LBUF.C1 + .2 sta LBUF.DATA,x cpx LBUF.C2 inx diff --git a/EXAMPLES/MANDELBROT.F.txt b/EXAMPLES/MANDELBROT.F.txt index f3305bfb..efbc33fa 100644 --- a/EXAMPLES/MANDELBROT.F.txt +++ b/EXAMPLES/MANDELBROT.F.txt @@ -1,84 +1,71 @@ NEW AUTO 3,1 #!/bin/forth -\ Setup constants to remove magic numbers to allow -\ for greater zoom with different scale factors. -20 CONSTANT MAXITER --39 CONSTANT MINVAL -40 CONSTANT MAXVAL -20 32 * CONSTANT RESCALE -RESCALE 4 * CONSTANT S_ESCAPE -\ These variables hold values during the escape calculation. -0 VARIABLE CREAL -0 VARIABLE CIMAG -0 VARIABLE ZREAL -0 VARIABLE ZIMAG -0 VARIABLE COUNT +140 CONSTANT MAXX +70 CONSTANT CENTERX +192 CONSTANT MAXY +92 CONSTANT CENTERY +100 CONSTANT ZOOM +16 CONSTANT MAXITER -\ Compute squares, but rescale to remove extra scaling factor. -: ZR_SQ ZREAL @ DUP RESCALE */ ; -: ZI_SQ ZIMAG @ DUP RESCALE */ ; +0 VARIABLE X +0 VARIABLE Y +0 VARIABLE ZX +0 VARIABLE ZY +0 VARIABLE ZX2 +0 VARIABLE ZY2 +0 VARIABLE CX +0 VARIABLE CY +0 VARIABLE TMP +0 VARIABLE ITER + +\for y in range(0,200) +\ for x in range(0,300) +\ zx = 0 +\ zy = 0 +\ cx = (x - 200) / ZOOM +\ cy = (y - 100) / ZOOM +\ for iter in range(MAX_ITER) +\ if zx*zx + zy*zy > 4 then break +\ tmp = zx * zx - zy * zy + cx +\ zy = 2 * zx * zy + cy +\ zx = tmp +\ end for +\ if iter then +\ gfx.setPixel x, y, rgb(255-iter*6, 0, iter*6) +\ end if +\ end for +\end for -\ Translate escape count to ascii greyscale. -: .CHAR - S" ..,'~!^:;[/<&?oxOX# " - DROP + 1 - TYPE ; +: CELL + 0 ZX ! + 0 ZY ! + 0 ITER ! + X CENTERX - ZOOM / CX ! + Y CENTERY - ZOOM / CY ! + + MAXITER 0 DO + ZX ZX * ZX2 ! + ZY ZY * ZY2 ! + ZX2 ZY2 + 4 > IF I ITER ! LEAVE ENDIF + ZX2 ZY2 - CX + TMP ! + ZX ZY * 2 * CY + ZY ! + TMP ZX ! + LOOP +\ Y 4 / X ITER PLOT + Y @ . X @ . ITER @ . CR ; -\ Numbers above 4 will always escape, so compare to a scaled value. -: ESCAPES? - S_ESCAPE > ; - -\ Increment count and compare to max iterations. -: COUNT_AND_TEST? - COUNT @ 1+ DUP COUNT ! - MAXITER > ; - -\ stores the row column values from the stack for the escape calculation. -: INIT_VARS - 32 * DUP CREAL ! ZREAL ! - 32 * DUP CIMAG ! ZIMAG ! - 1 COUNT ! ; - -\ Performs a single iteration of the escape calculation. -: DOESCAPE - ZR_SQ ZI_SQ 2DUP + - ESCAPES? IF - DROP DROP 1 - ELSE - - CREAL @ + \ leave result on stack - ZREAL @ ZIMAG @ RESCALE */ 2 * - CIMAG @ + ZIMAG ! - ZREAL ! \ Store stack item into ZREAL - COUNT_AND_TEST? - ENDIF ; - -\ Iterates on a single cell to compute its escape factor. -: DOCELL - INIT_VARS - BEGIN - DOESCAPE - UNTIL - COUNT @ - .CHAR ; - -\ For each cell in a row. -: DOROW - MAXVAL MINVAL DO - DUP I - DOCELL - LOOP - DROP ; - -\ For each row in the set. : MANDELBROT - CR - MAXVAL MINVAL DO - I DOROW CR - LOOP ; +\ 191 559 0 0 0 RECT + MAXY 0 DO + I Y ! + MAXX 0 DO + I X ! + CELL + LOOP + LOOP ; -\ Run the computation. MANDELBROT MAN TEXT root/mandelbrot.f diff --git a/SBIN/TELNETD.S.txt b/SBIN/TELNETD.S.txt index 16c29d3d..484a08ef 100644 --- a/SBIN/TELNETD.S.txt +++ b/SBIN/TELNETD.S.txt @@ -185,7 +185,7 @@ CS.RUN.CLIENT >SLEEP give some time for TCPIP SYN/ACK >PUSHBI 1 >SYSCALL SPrintF -CS.RUN.CLIENT1 >PUSHEA.G NodBuf +CS.RUN.CLIENT1 >PUSHEA.G NodBuf+5 >PUSHW 0 >PUSHB hClientSocket >SYSCALL MKNod