;=============================================================== ; MACRO: DP ; Written by Howard Fernald (2004-05-26) ; ; Syntax: dp "word1"[, "word2"[, "word3"[, ...]]] ; ; The "dp" macro is meant to complement NASM's data directives ; (db, dw, dd, dq, and dt). It takes one or more strings and ; converts each string into a 32-bit number -- a "pre-parsed ; word" using the ColorForth encoding, as documented at ; http://www.colorforth.com/chars.html. The purpose of "dp" is ; to make it much easier to specify ColorForth (or Korth) ; wordlists in NASM source code. ; ; CAVEAT: The pre-parsed words that "dp" generates will usually, ; but not always, match those in Chuck Moore's ColorForth. ; Mismatches will happen for two reasons: ; (1) The encoding at http://www.colorforth.com/chars.html ; is apparently NOT exactly the encoding that Chuck Moore used ; to build his wordlists in his COLOR.ASM source code. The ; characters that require four or five bits each are apparently ; the same in both versions of the encoding, but seven-bit char- ; acters are different: ; -- 'j' is 152q here, 162q in COLOR.ASM. ; (as in "jump") ; -- 'k' is 150q here, 164q in COLOR.ASM. ; (as in "seek", "mark", "keyboard") ; -- '1' is 162q here, 151q in COLOR.ASM. ; (as in "1,") ; -- '2' is 166q here, 152q in COLOR.ASM. ; (as in "2," and "2emit") ; (2) My macro crams up to the first seven characters of the ; string into the high 28 bits of the 32-bit cell, always leav- ; ing the bottom four bits set to zero. Chuck Moore usually does ; this, but in at least one case ("accept" -- 0x59493110), he ; fills 29 bits, thus using one of the bottom four bits. (The ; code lengths of the six letters in "accept" are 4, 5, 5, 4, 7, ; and 4 respectively, for a total of 29; my macro would see that ; the code length of 't' would result in a total length greater ; than 28 and thus would not add the 't' bits to the pre-parsed ; word.) ;=============================================================== ; This code is not to be run, because it consists only of data. ; Instead, use a hex-dump utility such as DumpHex by Robert ; Bachmann (http://www.rbdev.net/tools/dumphex) to view the ; contents of the file and verify that the macro works. %imacro dp 1-* %rep %0 %assign _cell 0 %assign _wlen 0 %assign _index 1 %rep 7 ; Do no more than first seven characters %substr _char %1 _index %if _char = 'r' || _char = 'R' %assign _code 001q %assign _clen 4 %elif _char = 't' || _char = 'T' %assign _code 002q %assign _clen 4 %elif _char = 'o' || _char = 'O' %assign _code 003q %assign _clen 4 %elif _char = 'e' || _char = 'E' %assign _code 004q %assign _clen 4 %elif _char = 'a' || _char = 'A' %assign _code 005q %assign _clen 4 %elif _char = 'n' || _char = 'N' %assign _code 006q %assign _clen 4 %elif _char = 'i' || _char = 'I' %assign _code 007q %assign _clen 4 %elif _char = 's' || _char = 'S' %assign _code 020q %assign _clen 5 %elif _char = 'm' || _char = 'M' %assign _code 021q %assign _clen 5 %elif _char = 'c' || _char = 'C' %assign _code 022q %assign _clen 5 %elif _char = 'y' || _char = 'Y' %assign _code 023q %assign _clen 5 %elif _char = 'l' || _char = 'L' %assign _code 024q %assign _clen 5 %elif _char = 'g' || _char = 'G' %assign _code 025q %assign _clen 5 %elif _char = 'f' || _char = 'F' %assign _code 026q %assign _clen 5 %elif _char = 'w' || _char = 'W' %assign _code 027q %assign _clen 5 %elif _char = 'd' || _char = 'D' %assign _code 140q %assign _clen 7 %elif _char = 'v' || _char = 'V' %assign _code 141q %assign _clen 7 %elif _char = 'p' || _char = 'P' %assign _code 142q %assign _clen 7 %elif _char = 'b' || _char = 'B' %assign _code 143q %assign _clen 7 %elif _char = 'h' || _char = 'H' %assign _code 144q %assign _clen 7 %elif _char = 'x' || _char = 'X' %assign _code 145q %assign _clen 7 %elif _char = 'u' || _char = 'U' %assign _code 146q %assign _clen 7 %elif _char = 'q' || _char = 'Q' %assign _code 147q %assign _clen 7 %elif _char = 'k' || _char = 'K' %assign _code 150q %assign _clen 7 %elif _char = 'z' || _char = 'Z' %assign _code 151q %assign _clen 7 %elif _char = 'j' || _char = 'J' %assign _code 152q %assign _clen 7 %elif _char = '3' %assign _code 153q %assign _clen 7 %elif _char = '4' %assign _code 154q %assign _clen 7 %elif _char = '5' %assign _code 155q %assign _clen 7 %elif _char = '6' %assign _code 156q %assign _clen 7 %elif _char = '7' %assign _code 157q %assign _clen 7 %elif _char = '8' %assign _code 160q %assign _clen 7 %elif _char = '9' %assign _code 161q %assign _clen 7 %elif _char = '1' %assign _code 162q %assign _clen 7 %elif _char = '-' %assign _code 163q %assign _clen 7 %elif _char = '0' %assign _code 164q %assign _clen 7 %elif _char = '.' %assign _code 165q %assign _clen 7 %elif _char = '2' %assign _code 166q %assign _clen 7 %elif _char = '/' %assign _code 167q %assign _clen 7 %elif _char = ';' %assign _code 170q %assign _clen 7 %elif _char = ':' %assign _code 171q %assign _clen 7 %elif _char = '!' %assign _code 172q %assign _clen 7 %elif _char = '+' %assign _code 173q %assign _clen 7 %elif _char = '@' %assign _code 174q %assign _clen 7 %elif _char = '*' %assign _code 175q %assign _clen 7 %elif _char = ',' %assign _code 176q %assign _clen 7 %elif _char = '?' %assign _code 177q %assign _clen 7 %else ; (Character is not one of the 48 defined ; in ColorForth's character set.) %assign _code 000q %assign _clen 0 %endif %assign _wlen _wlen+_clen %if _wlen > 28 %assign _wlen _wlen-_clen ;Do not %exitrep here! %else %assign _cell (_cell << _clen)+_code %endif %assign _index _index+1 %endrep %assign _cell _cell<<(32-_wlen) dd _cell %rotate 1 %endrep %endmacro ;------------------------------------------------------------------------------- ; DEFINE PRE-PARSED WORDS HERE ;------------------------------------------------------------------------------- ; Here I define pre-parsed words in groups of four, so that when you use a hex- ; dump utility to examine the file, a pre-parsed word produced by my macro ; appears right above the equivalent produced by Chuck Moore, like this: ; 00 40 66 C6 00 40 8C BA 80 A0 B9 C4 00 4C C8 8A ; 00 40 66 C6 00 40 8C BA 80 A0 B9 C4 00 4C C8 8A ; The "dd" directives are actually taken from a NASM-compatible version of ; Chuck Moore's ColorForth code, at: ; http://www.dnd.utwente.nl/~tim/colorforth/cfinal/color.asm dp "boot", "warm", "pause", "MACRO" dd ((((((143q<<4)+3)<<4)+3)<<4)+2)<<13 ; 00 40 66 C6 - boot dd ((((((27q<<4)+5)<<4)+1)<<5)+21q)<<14 ; 00 40 8C BA - warm dd ((((((((142q<<4)+5)<<7)+146q)<<5)+20q)<<4)+4)<<5 ; 80 A0 B9 C4 - pause dd ((((((((21q<<4)+5)<<5)+22q)<<4)+1)<<4)+3)<<10 ; 00 4C C8 8A - MACRO dp "FORTH", "c", "stop", "read" dd ((((((((26q<<4)+3)<<4)+1)<<4)+2)<<7)+144q)<<8 ; 00 64 89 B1 - FORTH dd (22q << 27) ; 00 00 00 90 - c dd ((((((20q << 4)+2)<< 4)+3)<< 7)+142q)<< 12 ; 00 20 1E 81 - stop dd ((((((1 << 4)+4)<< 4)+5)<< 7)+140q)<< 13 ; 00 00 5C 14 - read dp "write", "nc", "command", "seek" dd ((((((((27q << 4)+1)<< 4)+7)<< 4)+2)<< 4)+4)<< 11 ; 00 20 B9 B8 - write dd ((6 << 5)+22q)<< 23 ; 00 00 00 69 - nc dd ((((((((((22q<<4)+3)<<5)+21q)<<5)+21q)<<4)+5)<<4)+6)<<5 ; C0 2A C6 91 - comman(d) dd ((((((20q<<4)+4)<<4)+4)<<7)+164q)<<12 ; 00 40 27 82 - seek dp "ready", "act", "show", "load" dd ((((((((1<<4)+4)<<4)+5)<<7)+140q)<<5)+23q)<<8 ; 00 13 5C 14 - ready dd ((((5<<5)+22q)<<4)+2)<<19 ; 00 00 10 59 - act dd ((((((20q<<7)+144q)<<4)+3)<<5)+27q)<<11 ; 00 B8 43 86 - show dd ((((((24q<<4)+3)<<4)+5)<<7)+140q)<<12 ; 00 00 AE A1 - load dp "here", "?lit", "3,", "2," dd ((((((144q<<4)+4)<<4)+1)<<4)+4)<<13 ; 00 80 82 C8 - here dd ((((((177q<<5)+24q)<<4)+7)<<4)+2)<<12 ; 00 20 47 FF - ?lit dd ((153q<<7)+176q)<<18 ; 00 00 F8 D7 - 3, dd ((152q<<7)+176q)<<18 ; 00 00 F8 D5 - 2, dp "1,", ",", "less", "jump" dd ((151q<<7)+176q)<<18 ; 00 00 F8 D3 - 1, dd (176q<<25) ; 00 00 00 FC - , dd ((((((24q<<4)+4)<<5)+20q)<<5)+20q)<<13 ; 00 00 42 A2 - less dd ((((((162q<<7)+146q)<<5)+21q)<<7)+142q)<<6 ; 80 38 9A E5 - jump dp "accept", "pad", "erase", "copy" dd ((((((((((5<<5)+22q)<<5)+22q)<<4)+4)<<7)+142q)<<4)+2)<<3 ; 10 31 49 59 - accept dd ((((142q<<4)+5)<<7)+140q)<<14 ; 00 00 B8 C4 - pad dd ((((((((4<<4)+1)<<4)+5)<<5)+20q)<<4)+4)<<11 ; 00 20 58 41 - erase dd ((((((22q<<4)+3)<<7)+142q)<<5)+23q)<<11 ; 00 98 E2 91 - copy dp "mark", "empt", "emit", "digit" dd ((((((21q<<4)+5)<<4)+1)<<7)+164q)<<12 ; 00 40 8F 8A - mark dd ((((((4<<5)+21q)<<7)+142q)<<4)+2)<<12 ; 00 20 E2 48 - empt dd ((((((4<<5)+21q)<<4)+7)<<4)+2)<<15 ; 00 00 B9 48 - emit dd ((((((((140q<<4)+7)<<5)+25q)<<4)+7)<<4)+2)<<8 ; 00 72 F5 C0 - digit dp "2emit", ".", "h.", "h.n" dd ((((((((152q<<4)+4)<<5)+21q)<<4)+7)<<4)+2)<<8 ; 00 72 91 D4 - 2emit dd (165q<<25) ; 00 00 00 EA - . dd ((144q<<7)+165q)<<18 ; 00 00 D4 C9 - h. dd ((((144q<<7)+165q)<<4)+6)<<14 ; 00 80 D5 C9 - h.n dp "cr", "space", "down", "edit" dd ((22q<<4)+1)<<23 ; 00 00 80 90 - cr dd ((((((((20q<<7)+142q)<<4)+5)<<5)+22q)<<4)+4)<<7 ; 00 92 25 86 - space dd ((((((140q<<4)+3)<<5)+27q)<<4)+6)<<12 ; 00 60 77 C0 - down dd ((((((4<<7)+140q)<<4)+7)<<4)+2)<<13 ; 00 40 0E 4C - edit dp "e", "lm", "rm", "graphic" dd (4<<28) ; 00 00 00 40 - e dd ((24q <<5)+21q)<<22 ; 00 00 40 A4 - lm dd ((1<<5)+21q)<<23 ; 00 00 80 18 - rm dd ((((((((25q<<4)+1)<<4)+5)<<7)+142q)<<7)+144q)<<5 ; 80 2C AE A8 - graph(ic) dp "text", "keyboard", "debug", "at" dd ((((((2<<4)+4)<<7)+145q)<<4)+2)<<13 ; 00 40 CA 24 - text dd ((((((((164q<<4)+4)<<5)+23q)<<7)+143q)<<4)+3)<<5 ; 60 C6 93 E8 - keybo(ard) dd ((((((140q<<4)+4)<<7)+143q)<<7)+146q)<<7 ; 00 F3 98 C0 - debu(g) dd ((5<<4)+2)<<24 ; 00 00 00 52 - at dp "+at", "xy", "fov", "fifo" dd ((((173q<<4)+5)<<4)+2)<<17 ; 00 00 A4 F6 - +at dd ((145q<<5)+23q)<<20 ; 00 00 30 CB - xy dd ((((26q<<4)+3)<<7)+141q)<<16 ; 00 00 E1 B1 - fov dd ((((((26q<<4)+7)<<5)+26q)<<4)+3)<<14 ; 00 C0 D8 B3 - fifo dp "box", "line", "color", "octant" dd ((((143q<<4)+3)<<7)+145q)<<14 ; 00 40 79 C6 - box dd ((((((24q<<4)+7)<<4)+6)<<4)+4)<<15 ; 00 00 B2 A3 - line dd ((((((((22q<<4)+3)<<5)+24q)<<4)+3)<<4)+1)<<10 ; 00 C4 D0 91 - color dd ((((((((((3<<5)+22q)<<4)+2)<<4)+5)<<4)+6)<<4)+2)<<7 ; 00 B1 12 39 - octant dp "sp", "last", "unpack", "" dd ((20q<<7)+142q)<<20 ; 00 00 20 86 - sp dd ((((((24q<<4)+5)<<5)+20q)<<4)+2)<<14 ; 00 80 C0 A2 - last dd (((((((((146q<<4)+6)<<7)+142q)<<4)+5)<<5)+22q))<<5 ; 40 96 D8 CC - unpac(k) dd 0