Kernel 0.94+

This commit is contained in:
Rémy GIBERT 2020-12-17 21:23:54 +01:00
parent 0f9ebec8be
commit 76c8a3dc5f
8 changed files with 381 additions and 318 deletions

View File

@ -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 |

Binary file not shown.

View File

@ -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 #$A9 lda #imm
jsr CP.Emit.Byte
lda #$00
jsr CP.Emit.Byte
jsr CP.Emit.PUSHA
CP.LOOP lda #$00
jsr CP.Emit.PUSHBI >PUSHBI 0
lda #$A9 lda #imm
jsr CP.Emit.Byte
lda #$01
jsr CP.Emit.Byte
jsr CP.Emit.PUSHA pushed n = 1
lda #$01 >PUSHBI 1
jsr CP.Emit.PUSHBI
*--------------------------------------
CP.pLOOP >LDYA J.KEYWORDS.ADD MAX I n -> MAX NEWI
jsr CP.Emit.JsrYA
jsr CP.Emit.LOOP
CP.pLOOP jsr CP.Emit.LOOP
jsr CP.Emit.JMPBack
jsr CP.Emit.LOOPEND
inc RP
inc RP
clc
rts
*--------------------------------------
CP.I >LDYA J.KEYWORDS DUP
CP.I jsr CP.Emit.I
clc
jmp CP.Emit.JsrYA
rts
*--------------------------------------
CP.LEAVE
CP.LEAVE jsr CP.Emit.LEAVE
jsr CP.Emit.JMPBack
clc
rts
@ -91,40 +87,6 @@ CP.WHILE jsr CP.Emit.TESTTRUE
clc
rts
*--------------------------------------
CP.PushCodePtr ldy RP
lda ZPCodePtr+1
sta (pData),y
dey
lda ZPCodePtr
sta (pData),y
dey
sty RP
rts
*--------------------------------------
CP.PopPtr1 ldy RP
iny
lda (pData),y
sta ZPPtr1
iny
lda (pData),y
sta ZPPtr1+1
sty RP
rts
*--------------------------------------
CP.UpdatePtr1 lda ZPCodePtr
sta (ZPPtr1)
ldy #1
lda ZPCodePtr+1
sta (ZPPtr1),y
rts
*--------------------------------------
CP.Emit.JMP0000 lda #$4C JMP
jsr CP.Emit.Byte
@ -194,6 +156,12 @@ CP.Emit.PULLA ldx #CODE.PULLA.L
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
@ -205,6 +173,17 @@ CP.Emit.PUSHA ldx #CODE.PUSHA.L
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
@ -227,6 +206,28 @@ CP.Emit.LOOPEND ldx #CODE.LOOPEND.L
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
@ -240,6 +241,40 @@ CP.Emit.Byte sta (ZPCodePtr)
inc ZPCodePtr+1
.8 rts
*--------------------------------------
CP.PushCodePtr ldy RP
lda ZPCodePtr+1
sta (pData),y
dey
lda ZPCodePtr
sta (pData),y
dey
sty RP
rts
*--------------------------------------
CP.PopPtr1 ldy RP
iny
lda (pData),y
sta ZPPtr1
iny
lda (pData),y
sta ZPPtr1+1
sty RP
rts
*--------------------------------------
CP.UpdatePtr1 lda ZPCodePtr
sta (ZPPtr1)
ldy #1
lda ZPCodePtr+1
sta (ZPPtr1),y
rts
*--------------------------------------
MAN
SAVE usr/src/bin/forth.s.cp
LOAD usr/src/bin/forth.s

View File

@ -8,18 +8,15 @@ GFX.Open >PUSHBI 0
>STA.G hDevGFX
* ldy #S.PS.hStdIn
* lda (pPS),y
* >SYSCALL GetMemPtr
* >STYA ZPPtr1
ldy #S.PS.hStdIn
lda (pPS),y
bit #1
beq .9
* ldy #S.FD.DEV.DEVID
* lda (ZPPtr1),y
* >PUSHA
* >PUSHBI IOCTL.CONTROL
* >PUSHWI 0
* >SYSCALL IOCTL
>PUSHA
>PUSHBI IOCTL.CONTROL
>PUSHWI 0
>SYSCALL IOCTL
.9 rts
*--------------------------------------
@ -32,74 +29,52 @@ GFX.Close >LDA.G hDevGFX
*--------------------------------------
* (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
.1 >PULLA
sta (pData),y
dey
dex
bne .1
>PUSHB.G hDevGFX
>PUSHBI IOCTL.WRITE
>PUSHEA.G GFX.CB
>SYSCALL IOCTL
GFX.PLOT ldx #S.CB.CMD.SETPIXEL
jsr GFX.WriteX
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
GFX.RECT ldx #S.CB.CMD.FILLRECT
>PULLA
>STA.G GFX.CB+S.CB.COLOR
>PULLA
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
jsr GFX.WriteX
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
*--------------------------------------
*--------------------------------------
*--------------------------------------

View File

@ -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
@ -417,9 +418,18 @@ 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
@ -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
lda (pStack),y
sbc (pStack)
ldx #4
dec pStack
.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
.1 bcc .1+5
>PULLA
iny
adc (pData),y
sta (pData),y
dey
lda (pData),y
iny
iny
cmp (pData),y
dey
lda (pData),y
iny
iny
sbc (pData),y
.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

View File

@ -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

View File

@ -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
\ Translate escape count to ascii greyscale.
: .CHAR
S" ..,'~!^:;[/<&?oxOX# "
DROP + 1
TYPE ;
\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
\ Numbers above 4 will always escape, so compare to a scaled value.
: ESCAPES?
S_ESCAPE > ;
: CELL
0 ZX !
0 ZY !
0 ITER !
X CENTERX - ZOOM / CX !
Y CENTERY - ZOOM / CY !
\ Increment count and compare to max iterations.
: COUNT_AND_TEST?
COUNT @ 1+ DUP COUNT !
MAXITER > ;
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 ;
\ 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

View File

@ -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