mirror of https://github.com/wwarthen/RomWBW.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
154 lines
5.3 KiB
154 lines
5.3 KiB
; LISTING 3.
|
|
;
|
|
; ===============================================
|
|
; CamelForth for the Zilog Z80
|
|
; Copyright (c) 1994,1995 Bradford J. Rodriguez
|
|
;
|
|
; This program is free software; you can redistribute it and/or modify
|
|
; it under the terms of the GNU General Public License as published by
|
|
; the Free Software Foundation; either version 3 of the License, or
|
|
; (at your option) any later version.
|
|
;
|
|
; This program is distributed in the hope that it will be useful,
|
|
; but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
; GNU General Public License for more details.
|
|
;
|
|
; You should have received a copy of the GNU General Public License
|
|
; along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
; Commercial inquiries should be directed to the author at
|
|
; 115 First St., #105, Collingwood, Ontario L9Y 4W3 Canada
|
|
; or via email to bj@camelforth.com
|
|
;
|
|
; ===============================================
|
|
; CAMEL80D.AZM: CPU and Model Dependencies
|
|
; Source code is for the Z80MR macro assembler.
|
|
; Forth words are documented as follows:
|
|
;* NAME stack -- stack description
|
|
; Word names in upper case are from the ANS
|
|
; Forth Core word set. Names in lower case are
|
|
; "internal" implementation words & extensions.
|
|
;
|
|
; Direct-Threaded Forth model for Zilog Z80
|
|
; cell size is 16 bits (2 bytes)
|
|
; char size is 8 bits (1 byte)
|
|
; address unit is 8 bits (1 byte), i.e.,
|
|
; addresses are byte-aligned.
|
|
; ===============================================
|
|
|
|
; ALIGNMENT AND PORTABILITY OPERATORS ===========
|
|
; Many of these are synonyms for other words,
|
|
; and so are defined as CODE words.
|
|
|
|
;C ALIGN -- align HERE
|
|
head ALIGN,5,ALIGN,docode
|
|
noop: next
|
|
|
|
;C ALIGNED addr -- a-addr align given addr
|
|
head ALIGNED,7,ALIGNED,docode
|
|
jr noop
|
|
|
|
;Z CELL -- n size of one cell
|
|
head CELL,4,CELL,docon
|
|
dw 2
|
|
|
|
;C CELL+ a-addr1 -- a-addr2 add cell size
|
|
; 2 + ;
|
|
head CELLPLUS,5,CELL+,docode
|
|
inc bc
|
|
inc bc
|
|
next
|
|
|
|
;C CELLS n1 -- n2 cells->adrs units
|
|
head CELLS,5,CELLS,docode
|
|
jp twostar
|
|
|
|
;C CHAR+ c-addr1 -- c-addr2 add char size
|
|
head CHARPLUS,5,CHAR+,docode
|
|
jp oneplus
|
|
|
|
;C CHARS n1 -- n2 chars->adrs units
|
|
head CHARS,5,CHARS,docode
|
|
jr noop
|
|
|
|
;C >BODY xt -- a-addr adrs of param field
|
|
; 3 + ; Z80 (3 byte CALL)
|
|
head TOBODY,5,>BODY,docolon
|
|
DW LIT,3,PLUS,EXIT
|
|
|
|
;X COMPILE, xt -- append execution token
|
|
; I called this word ,XT before I discovered that
|
|
; it is defined in the ANSI standard as COMPILE,.
|
|
; On a DTC Forth this simply appends xt (like , )
|
|
; but on an STC Forth this must append 'CALL xt'.
|
|
head COMMAXT,8,'COMPILE,',docode
|
|
jp COMMA
|
|
|
|
;Z !CF adrs cfa -- set code action of a word
|
|
; 0CD OVER C! store 'CALL adrs' instr
|
|
; 1+ ! ; Z80 VERSION
|
|
; Depending on the implementation this could
|
|
; append CALL adrs or JUMP adrs.
|
|
head STORECF,3,!CF,docolon
|
|
DW LIT,0CDH,OVER,CSTORE
|
|
DW ONEPLUS,STORE,EXIT
|
|
|
|
;Z ,CF adrs -- append a code field
|
|
; HERE !CF 3 ALLOT ; Z80 VERSION (3 bytes)
|
|
head COMMACF,3,',CF',docolon
|
|
DW HERE,STORECF,LIT,3,ALLOT,EXIT
|
|
|
|
;Z !COLON -- change code field to docolon
|
|
; -3 ALLOT docolon-adrs ,CF ;
|
|
; This should be used immediately after CREATE.
|
|
; This is made a distinct word, because on an STC
|
|
; Forth, colon definitions have no code field.
|
|
head STORCOLON,6,'!COLON',docolon
|
|
DW LIT,-3,ALLOT
|
|
DW LIT,docolon,COMMACF,EXIT
|
|
|
|
;Z ,EXIT -- append hi-level EXIT action
|
|
; ['] EXIT ,XT ;
|
|
; This is made a distinct word, because on an STC
|
|
; Forth, it appends a RET instruction, not an xt.
|
|
head CEXIT,5,',EXIT',docolon
|
|
DW LIT,EXIT,COMMAXT,EXIT
|
|
|
|
; CONTROL STRUCTURES ============================
|
|
; These words allow Forth control structure words
|
|
; to be defined portably.
|
|
|
|
;Z ,BRANCH xt -- append a branch instruction
|
|
; xt is the branch operator to use, e.g. qbranch
|
|
; or (loop). It does NOT append the destination
|
|
; address. On the Z80 this is equivalent to ,XT.
|
|
head COMMABRANCH,7,',BRANCH',docode
|
|
jp COMMA
|
|
|
|
;Z ,DEST dest -- append a branch address
|
|
; This appends the given destination address to
|
|
; the branch instruction. On the Z80 this is ','
|
|
; ...other CPUs may use relative addressing.
|
|
head COMMADEST,5,',DEST',docode
|
|
jp COMMA
|
|
|
|
;Z !DEST dest adrs -- change a branch dest'n
|
|
; Changes the destination address found at 'adrs'
|
|
; to the given 'dest'. On the Z80 this is '!'
|
|
; ...other CPUs may need relative addressing.
|
|
head STOREDEST,5,'!DEST',docode
|
|
jp STORE
|
|
|
|
; HEADER STRUCTURE ==============================
|
|
; The structure of the Forth dictionary headers
|
|
; (name, link, immediate flag, and "smudge" bit)
|
|
; does not necessarily differ across CPUs. This
|
|
; structure is not easily factored into distinct
|
|
; "portable" words; instead, it is implicit in
|
|
; the definitions of FIND and CREATE, and also in
|
|
; NFA>LFA, NFA>CFA, IMMED?, IMMEDIATE, HIDE, and
|
|
; REVEAL. These words must be (substantially)
|
|
; rewritten if either the header structure or its
|
|
; inherent assumptions are changed.
|
|
|
|
|