mirror of
https://github.com/dschmenk/PLASMA.git
synced 2025-08-09 01:25:00 +00:00
Add printer echo support
This commit is contained in:
130
doc/DRAWL.md
130
doc/DRAWL.md
@@ -21,6 +21,132 @@ However, the code is partitioned to allow for easy extension so some of these mi
|
|||||||
- Bit-wise logic operations on 32 bit integers
|
- Bit-wise logic operations on 32 bit integers
|
||||||
- Hexadecimal input/output
|
- Hexadecimal input/output
|
||||||
|
|
||||||
|
Thes DRAWL implementation comes with the follwoing built-in:
|
||||||
|
|
||||||
|
### Constants
|
||||||
|
- T = True
|
||||||
|
- F = False
|
||||||
|
- NIL = NULL
|
||||||
|
- SPACE = SPACE character on output
|
||||||
|
- CR = Carriage Return character on output
|
||||||
|
- CSET()
|
||||||
|
- CSETQ()
|
||||||
|
- DEFINE()
|
||||||
|
|
||||||
|
### Function types
|
||||||
|
|
||||||
|
- LAMBDA
|
||||||
|
- FUNARG
|
||||||
|
- FUNCTION
|
||||||
|
|
||||||
|
|
||||||
|
### Predicates
|
||||||
|
|
||||||
|
- ATOM()
|
||||||
|
- EQ()
|
||||||
|
- NOT()
|
||||||
|
- AND(...)
|
||||||
|
- OR(...)
|
||||||
|
- NULL()
|
||||||
|
|
||||||
|
### Misc
|
||||||
|
|
||||||
|
- SET
|
||||||
|
- QUOTE()
|
||||||
|
- ARRAY
|
||||||
|
- TRACE() = Turn tracing on/off
|
||||||
|
- GC() = Run garbage collector and return free memory amount
|
||||||
|
- QUIT() = Exit REPL
|
||||||
|
|
||||||
|
### List manipulation
|
||||||
|
|
||||||
|
- CAR()
|
||||||
|
- CDR()
|
||||||
|
- CONS()
|
||||||
|
- LIST(...)
|
||||||
|
|
||||||
|
### Conditionals
|
||||||
|
|
||||||
|
- COND(...)
|
||||||
|
- IF()
|
||||||
|
|
||||||
|
### Output
|
||||||
|
|
||||||
|
- PRHEX() = Turn hexadecimal output on/off
|
||||||
|
- PRI(...) = Print without newline
|
||||||
|
- PRINT(...) = Print with newline
|
||||||
|
- FMTFPI() = Floating point format integer digits
|
||||||
|
- FMTFPF() = Floating point format fractional digits
|
||||||
|
- PRINTER() = Turn printer echo on/off on slot#
|
||||||
|
|
||||||
|
### Looping
|
||||||
|
|
||||||
|
- FOR()
|
||||||
|
- WHILE()
|
||||||
|
- UNTIL()
|
||||||
|
|
||||||
|
### Associations
|
||||||
|
|
||||||
|
- LABEL()
|
||||||
|
- SET()
|
||||||
|
- SETQ()
|
||||||
|
|
||||||
|
### Program feature
|
||||||
|
|
||||||
|
- PROG
|
||||||
|
- GO()
|
||||||
|
- RETURN()
|
||||||
|
|
||||||
|
### Numbers
|
||||||
|
|
||||||
|
- +()
|
||||||
|
- -()
|
||||||
|
- '\*'()
|
||||||
|
- /()
|
||||||
|
- REM()
|
||||||
|
- NEG()
|
||||||
|
- ABS()
|
||||||
|
- >()
|
||||||
|
- <()
|
||||||
|
- MIN()
|
||||||
|
- MAX()
|
||||||
|
|
||||||
|
### Integers
|
||||||
|
|
||||||
|
- BITNOT() = Bit-wise NOT
|
||||||
|
- BITAND() = Bit-wise AND
|
||||||
|
- BITOR() = Bit-wise OR
|
||||||
|
- BITXOR= Bit-wise XOR
|
||||||
|
- SHIFT() = Bit-wise SHIFT (positive = left, negative = right)
|
||||||
|
- ROTATE() = Bit-wise ROTATE (positive = left, negative = right)
|
||||||
|
|
||||||
|
### Floating Point (from the SANE library)
|
||||||
|
|
||||||
|
- PI()
|
||||||
|
- MATH_E()
|
||||||
|
- LOGB()
|
||||||
|
- SCALEB_I()
|
||||||
|
- TRUNCATE()
|
||||||
|
- ROUND()
|
||||||
|
- SQRT()
|
||||||
|
- COS()
|
||||||
|
- SIN()
|
||||||
|
- TAN()
|
||||||
|
- ATAN()
|
||||||
|
- LOG2()
|
||||||
|
- LOG2_1()
|
||||||
|
- LN()
|
||||||
|
- LN_1()
|
||||||
|
- POW2()
|
||||||
|
- POW2_1()
|
||||||
|
- POWE()
|
||||||
|
- POWE_1()
|
||||||
|
- POWE2_1()
|
||||||
|
- POW_I()
|
||||||
|
- POWY()
|
||||||
|
- COMP()
|
||||||
|
- ANNUITY()
|
||||||
|
|
||||||
LISP is one of the earliest computer languages. As such, it holds a special place in the anals of computer science. I've always wanted to learn why LISP is held in such high regard by so many, so I went about learning LISP by actually implementing a LISP interpreter in PLASMA. PLASMA is well suited to implement other languages due to its rich syntax, performance and libraries.
|
LISP is one of the earliest computer languages. As such, it holds a special place in the anals of computer science. I've always wanted to learn why LISP is held in such high regard by so many, so I went about learning LISP by actually implementing a LISP interpreter in PLASMA. PLASMA is well suited to implement other languages due to its rich syntax, performance and libraries.
|
||||||
|
|
||||||
## Links
|
## Links
|
||||||
@@ -29,6 +155,10 @@ Here are some links to get you started.
|
|||||||
|
|
||||||
LISP 1.5 Manual: https://archive.org/details/bitsavers_mitrlelisprammersManual2ed1985_9279667
|
LISP 1.5 Manual: https://archive.org/details/bitsavers_mitrlelisprammersManual2ed1985_9279667
|
||||||
|
|
||||||
|
LISP 1.5 Primer: https://www.softwarepreservation.org/projects/LISP/book/Weismann_LISP1.5_Primer_1967.pdf
|
||||||
|
|
||||||
|
Apple Numerics Manual (SANE): https://vintageapple.org/inside_o/pdf/Apple_Numerics_Manual_Second_Edition_1988.pdf
|
||||||
|
|
||||||
Video showing DRAWL in action: https://youtu.be/wBMivg6xfSg
|
Video showing DRAWL in action: https://youtu.be/wBMivg6xfSg
|
||||||
|
|
||||||
Preconfigured PLASMA ProDOS boot floppy for DRAWL: https://github.com/dschmenk/PLASMA/blob/master/images/apple/DRAWL.po
|
Preconfigured PLASMA ProDOS boot floppy for DRAWL: https://github.com/dschmenk/PLASMA/blob/master/images/apple/DRAWL.po
|
||||||
|
Binary file not shown.
@@ -59,10 +59,14 @@ import smath
|
|||||||
predef eval_int(expr)#1
|
predef eval_int(expr)#1
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
var prog, prog_expr, prog_return // Current PROG expressions
|
var prog, prog_expr, prog_return // Current PROG expressions
|
||||||
var sym_cond, sym_if, sym_fpint, sym_fpfrac
|
var sym_cond, sym_if, sym_fpint, sym_fpfrac
|
||||||
var pred_true
|
var pred_true
|
||||||
|
|
||||||
|
const csw = $0036 // Output switch vector
|
||||||
|
var scrncsw = 0 // Output screen value
|
||||||
|
|
||||||
const FILEBUF_SIZE = 128
|
const FILEBUF_SIZE = 128
|
||||||
var readfn // Read input routine
|
var readfn // Read input routine
|
||||||
var fileref, filebuf // File read vars
|
var fileref, filebuf // File read vars
|
||||||
@@ -174,6 +178,24 @@ def natv_gc(symptr, expr)
|
|||||||
return new_int(heapavail, 0)
|
return new_int(heapavail, 0)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def natv_printer(symptr, expr)
|
||||||
|
byte slot
|
||||||
|
|
||||||
|
slot = eval_int(expr)=>intval & 7
|
||||||
|
if slot
|
||||||
|
if !scrncsw
|
||||||
|
scrncsw = *csw
|
||||||
|
fin
|
||||||
|
*csw = $C000 | (slot << 8)
|
||||||
|
else
|
||||||
|
if scrncsw
|
||||||
|
*csw = scrncsw
|
||||||
|
fin
|
||||||
|
scrncsw = 0
|
||||||
|
fin
|
||||||
|
return new_int(slot, 0)
|
||||||
|
end
|
||||||
|
|
||||||
def natv_bye(symptr, expr)
|
def natv_bye(symptr, expr)
|
||||||
quit = TRUE
|
quit = TRUE
|
||||||
return new_sym("GOODBYE!")
|
return new_sym("GOODBYE!")
|
||||||
@@ -267,22 +289,23 @@ end
|
|||||||
//
|
//
|
||||||
|
|
||||||
puts("DRAWL (LISP 1.5) symbolic processor\n")
|
puts("DRAWL (LISP 1.5) symbolic processor\n")
|
||||||
pred_true = bool_pred(TRUE) // Capture value of TRUE
|
pred_true = bool_pred(TRUE) // Capture value of TRUE
|
||||||
sym_fpint = new_sym("FMTFPI")
|
sym_fpint = new_sym("FMTFPI")
|
||||||
sym_fpfrac = new_sym("FMTFPF")
|
sym_fpfrac = new_sym("FMTFPF")
|
||||||
sym_fpint=>natv = @natv_fpint
|
sym_fpint=>natv = @natv_fpint
|
||||||
sym_fpfrac=>natv = @natv_fpfrac
|
sym_fpfrac=>natv = @natv_fpfrac
|
||||||
sym_fpint=>apval = new_int(fmt_fpint, 0) ^ NULL_HACK
|
sym_fpint=>apval = new_int(fmt_fpint, 0) ^ NULL_HACK
|
||||||
sym_fpfrac=>apval = new_int(fmt_fpfrac, 0) ^ NULL_HACK
|
sym_fpfrac=>apval = new_int(fmt_fpfrac, 0) ^ NULL_HACK
|
||||||
sym_cond = new_sym("COND") // This should actually match COND
|
sym_cond = new_sym("COND") // This should actually match COND
|
||||||
sym_if = new_sym("IF") // This should actually match IF
|
sym_if = new_sym("IF") // This should actually match IF
|
||||||
new_sym("PROG")=>natv = @natv_prog
|
new_sym("PROG")=>natv = @natv_prog
|
||||||
new_sym("GO")=>natv = @natv_go
|
new_sym("GO")=>natv = @natv_go
|
||||||
new_sym("RETURN")=>natv = @natv_return
|
new_sym("RETURN")=>natv = @natv_return
|
||||||
new_sym("SET")=>natv = @natv_set
|
new_sym("SET")=>natv = @natv_set
|
||||||
new_sym("SETQ")=>natv = @natv_setq
|
new_sym("SETQ")=>natv = @natv_setq
|
||||||
new_sym("GC")=>natv = @natv_gc
|
new_sym("GC")=>natv = @natv_gc
|
||||||
new_sym("QUIT")=>natv = @natv_bye
|
new_sym("PRINTER")=>natv = @natv_printer
|
||||||
|
new_sym("QUIT")=>natv = @natv_bye
|
||||||
|
|
||||||
parse_cmdline
|
parse_cmdline
|
||||||
while not quit
|
while not quit
|
||||||
|
Reference in New Issue
Block a user