╬OT SURPRISINGLY, THE MEMORY MAPS OF ╞ORTH SYSTEMS TEND TO DIFFER. ╚ERE IS THE ONE FOR ┬LAZIN' ╞ORTH:
╠╧╫ ═┼═╧╥┘ **********************
* ╨┴╥┴═┼╘┼╥ ╙╘┴├╦ *
**********************
* ╘┼╥═╔╬┴╠ ╔╬╨╒╘ *
* ┬╒╞╞┼╥ *
**********************
* ╥┼╘╒╥╬ ╙╘┴├╦ *
**********************
* ┼╥╥╧╥ ═┼╙╙┴╟┼ *
* ┬╒╞╞┼╥ *
**********************
* ╧╨┼╥┴╘╔╬╟ ╙┘╙╘┼═ *
* ╓┴╥╔┴┬╠┼╙ *
**********************
* ╒╙┼╥ ╓┴╥╔┴┬╠┼╙ *
**********************
* ╙├╥┼┼╬ ═┼═╧╥┘ *
**********************
* ╨╥┼-├╧═╨╔╠┼─ *
* ╞╧╥╘╚ *
**********************
* ╨╥┼-├╧═╨╔╠┼─ *
* ┼╠┼├╘╔╓┼╙ *
**********************
* ╒╙┼╥ ─╔├╘╔╧╬┴╥┘ *
**********************
* ╨┴─ *
**********************
* ┬╒╞╞┼╥ ├╧╬╘╥╧╠ *
* ╤╒┼╒┼ *
**********************
* ┬╠╧├╦ ┬╒╞╞┼╥╙ *
* (4) *
* OR *
* ╙╨╥╔╘┼ ╔═┴╟┼╙ *
**********************
* ═┼═╧╥┘ ═┴╨╨┼─ ╔╧ *
╚╔╟╚ ═┼═╧╥┘* ┴╬─ ╦┼╥╬┴╠ ╧╙ *
* OR *
* ╚╔╥┼╙ ├╧╠╧╥ ═┼═╧╥┘ *
* ╚╔╥┼╙ ╙├╥┼┼╬ *
* ╙╨╥╔╘┼ ╔═┴╟┼╙ *
**********************
Ç*FP0
╒SER ─ICTIONARY
╨AGE 233
╘HE ARRANGEMENT DESCRIBED HERE WORKS THE SAME IN ┬LAZIN' ╞ORTH. ╘HE ONLY DIFFERENCE IS THAT THE VARIABLE ╚ , USED BY ┬RODIE, IS CALLED ─╨ IN ┬LAZIN' ╞ORTH. (╙TANDS FOR ─ICTIONARY ╨OINTER.)
╨ARAMETER ╙TACK
╨AGE 235-236
'╙ IS ╙╨@ IN '83 ╞ORTH. ╩UST SUBSTITUTE ╙╨@ FOR '╙ IN THE EXAMPLES GIVEN, AND THEY WILL WORK JUST FINE. ╔N REFERENCE TO THE EXAMPLE SHOWING HOW TO COPY THE FIFTH ELEMENT DOWN, YOU MIGHT WANT TO CONSULT THE SYSTEM DOCUMENTATION FOR THE WORDS ╨╔├╦ AND ╥╧╠╠. (╘HESE ARE '83 STANDARD WORDS.)
╙0 IS ╙╨0 IN ┬LAZIN' ╞ORTH. ╬OTE THAT THIS IS ╬╧╘ A '83 STANDARD WORD. ╘HERE IS ALSO A WORD ╙╨! , WHICH COPIES THE VALUE STORED IN ╙╨0 TO THE STACK POINTER. ╘HIS EFFECTIVELY EMPTIES THE RETURN STACK.
╔NPUT ═ESSAGE ┬UFFER
╨AGE 236
╘HE MODERN NAME FOR THIS MEMORY REGION IS ╘ERMINAL ╔NPUT ┬UFFER. ╙╨0 DOES NOT REFERENCE THIS AREA. ╔NSTEAD, USE THE SYSTEM CONSTANT ╘╔┬ . ╘╔┬ LEAVES THE STARTING ADDRESS OF THE TERMINAL INPUT BUFFER ON THE TOP OF THE STACK.
Ç*CN1;├HAPTER 10Ç*CN0
PAGE 255-256
╞ORTH-83 MAKES A DISTINCTION BETWEEN ╞╠╒╙╚ AND ╙┴╓┼-┬╒╞╞┼╥╙. ┬OTH WORDS FORCE ALL UPDATED BUFFERS TO BE WRITTEN TO THE DISK. ╘HE DIFFERENCE IS THAT AFTER EXECUTING ╞╠╒╙╚ , THE BUFFERS WILL BE EMPTIED (╞╠╒╙╚-ED , GET IT?). ┬UT AFTER ╙┴╓┼-┬╒╞╞┼╥╙, THE BLOCKS WILL STILL BE IN MEMORY, ALTHOUGH THEY WILL NO LONGER BE MARKED AS ╒╨─┴╘┼ED, SINCE THEY HAVE BEEN WRITTEN TO DISK.
╧UTPUT ╧PERATORS
╨AGE 258
╔NSTEAD OF ╙0 (╙╨0 IN ┬LAZIN' ╞ORTH) USE ╘╔┬ :
╘╔┬ 12 ╘┘╨┼
╬OTE THAT A WORD LIKE ╙0 OR ╙╨0 IS VERY SYSTEM DEPENDENT, BUT SINCE ╘╔┬ IS A '83 STANDARD WORD, IT CAN ALWAYS BE USED TO ACCESS THE TERMINAL INPUT BUFFER.
╨AGE 259
╘O USE ╘┼╙╘ IN THE WAY ┬RODIE DESCRIBES, IT IS IMPORTANT TO REMEMBER THAT THE '83 TICK RETURNS THE CODE FIELD ADDRESS, AND NOT THE ADDRESS OF THE PARAMTER FIELD. ╩UST REMEMBER TO USE >┬╧─┘ TO DO STUFF LIKE THIS, AND YOU'LL BE FINE. ╔.┼.:
' ╘┼╙╘ >┬╧─┘ 3 + 7 ╘┘╨┼
WHERE
' ╘┼╙╘
GIVES THE ├╞┴ (COMPILATION ADDRESS) OF ╘┼╙╘
>┬╧─┘
CONVERTS THIS ADDRESS TO THE ╨╞┴ (ADDRESS OF PARAMETER FIELD), AND THE REST WORKS AS DESCRIBED BY ┬RODIE.
╬OTE THAT THE SAME REMARK APPLIES TO THE DEFINITION OF ╠┴┬┼╠ . ╔N '83 ╞ORTH, ╠┴┬┼╠ WOULD BE:
╬OTE THE ADDITION OF >┬╧─┘ TO CONVERT THE COMPILATION ADDRESS (├╞┴) TO THE ADDRESS OF THE PARAMETER FIELD.
╔NTERNAL ╙TRING ╧PERATORS
╨AGE 266
═╧╓┼ IS NOT PART OF THE '83 STANDARD. ╔T IS INCLUDED IN THE ╒NCONTROLLED ╥EFERENCE ╫ORD SET, AND IN ┬LAZIN' ╞ORTH, BUT ITS DEFINITION IS DIFFERENT FROM THAT GIVEN BY ┬RODIE. ┼SSENTIALLY, ═╧╓┼ IS JUST A SMART ├═╧╓┼. ╔T EXAMINES THE ADDRESSES, AND THEN PICKS ├═╧╓┼ OR ├═╧╓┼> AS APPROPRIATE. ╘HIS PREVENTS ACCIDENTALLY OVERWRITING DATA, AND IS IN GENERAL ONE LESS WORRY FOR THE HACKER.
<├═╧╓┼ HAS BEEN RENAMED ├═╧╓┼> IN '83. (╘HE IDEA IS TO EMPHASIZE FUNCTION, INSTEAD OF HOW ITS DONE. ├═╧╓┼> IS USUALLY USED TO SLIDE STRINGS TOWARDS HIGH MEMORY, AS ┬RODIE EXPLAINS. ╘HAT'S WHY THE UPWARD POINTING BRACKET.)
Ç*FP0
╙INGLE-├HARACTER ╔NPUT
╨AGE 268
╞OLLOWING IS FROM THE ╞ORTH-83 STANDARD:
"...CHARACTERS RECEIVED BY ╦┼┘ WILL NOT BE DISPLAYED." ╧THER THAN THIS, ╦┼┘ BEHAVES AS DESCRIBED. ╘O DUPLICATE THE BEHAVIOUR OF THE ╦┼┘ DESCRIBED BY ┬RODIE USE THE PHRASE:
╦┼┘ ─╒╨ ┼═╔╘
┘OU MIGHT ALSO EXAMINE THE SYSTEMS ?╦┼┘ ROUTINE, WHICH WORKS LIKE ╦┼┘ , BUT DOESN'T WAIT FOR THE USER TO TYPE A KEY.
╨AGE 270
'83 SYSTEMS RETURN THE ┴╙├╔╔ CODE FOR EVERY KEY PRESSED, INCLUDING THE RETURN KEY. ╙O THE DEFINITION OF ┬╠╧├╦╙ IN '83 ╞ORTH IS:
: ┬╠╧├╦╙ ( COUNT --- )
╙├╥ @ + ╙├╥ @ ─╧ ╔ ╠╔╙╘
╦┼┘ 13 = ( ├╥) ╔╞ ╠┼┴╓┼ ╘╚┼╬ ╠╧╧╨ ;
┘OU CAN ALSO USE ┬LAZIN' ╞ORTHS ?╠┼┴╓┼ :
: ┬╠╧├╦╙ ( COUNT --- )
╙├╥ @ + ╙├╥ @ ─╧ ╔ ╠╔╙╘
╦┼┘ 13 = ( ├╥) ?╠┼┴╓┼ ╠╧╧╨ ;
╙TRING ╔NPUT ├OMMANDS, FROM THE ┬OTTOM UP
PAGE 270
╘HE DEFINITION FOR TEXT IS ALMOST THE SAME AS ┬LAZIN' ╞ORTHS ╘┼╪╘. ┬LAZIN' ╞ORTH'S ╘┼╪╘ FOLLOWS THE RECOMMENDATION OF THE '83 STANDARD TEAM, AND STORES THE COUNT IN THE FIRST BYTE OF THE STRING, AS DOES ╫╧╥─. ╧THERWISE, WORKS THE SAME AS DESCRIBED.
╨AGE 271
╘HE EXAMPLE
╙0 @ 80 ┼╪╨┼├╘
WOULD BE
╘╔┬ 80 ┼╪╨┼├╘
IN ╞ORTH-83 SYSTEMS.
╬OTE ALSO THAT THE '83 ┼╪╨┼├╘ DOES NOT STORE A NULL AT THE END OF THE STRING. ╘HIS IS ONE OF THE MAJOR IMPROVEMENTS OF THE '83 STANDARD. '83 STANDARD SYSTEMS USE A COUNT, INSTEAD OF A DELIMITER, TO DETERMINE THE END OF THE INPUT STREAM. '83 ┼╪╨┼├╘ STORES THE COUNT OF THE CHARACTERS RECEIVED IN THE VARIABLE ╙╨┴╬ . ═ORE ON THIS LATER.
╨AGE 275
┴S YOU MIGHT DISCOVER, THE ╞╧╥═ ╠╧╓┼ ╠┼╘╘┼╥ DOES NOT WORK AS DESCRIBED. ├ERTAIN NAMES WILL TEND TO CHANGE THE TEXT COLORS, OR DO OTHER ODD THINGS TO THE DISPLAY. ╞OR EXAMPLE, USING:
╓╔╘┴╠╙ ┬╩,┬╠╒┼,╞╥┼─
THE PROGRAM WILL APPEAR TO WORK JUST FINE. ┬UT USING
╓╔╘┴╠╙ ╓╔╧╠┴,┬╠╒┼,╞╥┼─
WILL CAUSE A PROBLEM - THE TEXT WILL CHANGE WHITE WHEN PRINTING THE WORD ╓╔╧╠┴. ├LEARLY, ╓╔╧╠┴ CAUSES A PROBLEM, WHILE ┬╩ DOES NOT. ╫HY IS THIS?
╔T HAS TO DO WITH THE FACT THAT '83 ╘┼╪╘ STORES A COUNT BYTE IN THE FIRST BYTE OF ╨┴─. ╙O WHEN YOU EXECUTE THE PHRASE
╬┴═┼ 14 -╘╥┴╔╠╔╬╟ ╘┘╨┼
┘OU ARE ╘┘╨┼ING EXTRA CHARACTERS. ╔N THE CASE OF ┬╩, YOU WILL BE TYPING A ┴╙├╔╔ 2, AN ┴╙├╔╔ ┬ AND AN ┴╙├╔╔ ╩. ╧N THE ├┬═-64, ┴╙├╔╔ 2 IS A DO-NOTHING CHARACTER - DOESN'T DO ANYTHING AT ALL. ╙O THE PROGRAM APPEARS TO WORK FINE. ╧N THE OTHER HAND, WHEN ╬┴═┼ CONTAINS ╓╔╧╠┴ (OR ANY OTHER 5 CHARACTER NAME), YOU WILL BE ╘┘╨╔╬╟ AN ┴╙├╔╔ 5, WHICH IS THE CHARACTER TO ┼═╔╘ IF YOU WANT TO CHANGE THE CHARACTER COLOR TO WHITE.
╘HERE ARE TWO SOLUTIONS TO THIS PROBLEM. ╧NE IS TO CHANGE THE DEFINITION OF ╓╔╘┴╠╙ TO THE FOLLOWING:
: ╓╔╘┴╠╙ // MODIFICATION 1
┴╙├╔╔ , ╘┼╪╘ ( 44) ╨┴─ 1+ ╬┴═┼ 14 ═╧╓┼
┴╙├╔╔ , ╘┼╪╘ ╨┴─ 1+ ┼┘┼╙ 12 ═╧╓┼
1 ╘┼╪╘ ╨┴─ 1+ ═┼ 14 ═╧╓┼ ;
╫HICH WILL PREVENT THE COUNT (STORED AT ╨┴─) FROM BEING MOVED TO THE VARIABLE. ╚OWEVER, THERE IS A BETTER SOLUTION ALL TOGETHER. ╘HE SOLUTION IS TO USE ├╧╒╬╘. ├OUNT TAKES AN ADDRESS ON THE STACK, AND RETURNS THE ADDRESS OF THE START OF THE STRING, AND THE COUNT BYTE IN THE ORDER NEEDED BY ╘┘╨┼. ╔N THIS VERSION, ╓╔╘┴╠╙ REMAINS UNCHANGED (I.E. ╩UST AS ┬RODIE GIVES IT IN HIS BOOK), BUT YOU WILL HAVE TO REPLACE EVERY OCCURRENCE OF
<NUMBER> -╘╥┴╔╠╔╬╟ ╘┘╨┼
WITH THE SHORTER (AND FASTER) PHRASE
├╧╒╬╘ ╘┘╨┼
╚ERE IS HOW THE BEGINNING OF ╠┼╘╘┼╥ WILL LOOK WITH THIS SECOND VERSION:
: ╠┼╘╘┼╥ ╨┴╟┼ // MODIFICATION 2
." ─┼┴╥ " ╬┴═┼ ├╧╒╬╘ ╘┘╨┼ ." ,"
├╥ ." ╔ ╟╧ ╘╧ ╚┼┴╓┼╬ ╫╚┼╬┼╓┼╥ ╔ ╙┼┼ ┘╧╒╥ ─┼┼╨ "
┼┘┼╙ ├╧╒╬╘ ╘┘╨┼ ." ┼┘┼╙. ├┴╬ "
AND SO ON. ╔F YOU TRY THIS VERSION, YOU WILL NOTICE THAT IT RUNS MUCH FASTER, AND ALSO OCCUPIES LESS SPACE IN THE DICTIONARY.
Ç*LN2
╨AGE 276
╘HE VERSION OF ╟╥┼┼╘ GIVEN HERE DOESN'T WORK BECAUSE OF A RATHER SUBTLE PROBLEM. ╥EMEMBER THAT '83 ╞ORTH USES A COUNT, AND NOT A DELIMITER TO DETERMINE THE LENGTH OF THE INPUT STREAM. ╙O IN ORDER TO GET THIS DEFINITION OF ╟╥┼┼╘ TO WORK, IN '83 ╞ORTH, YOU MUST DO THE FOLLOWING:
: ╟╥┼┼╘83 ├╥ ." ╫╚┴╘'╙ ┘╧╒╥ ╬┴═┼? " ╘╔┬ 40 ┼╪╨┼├╘
╙╨┴╬ @ #╘╔┬ ! 0 >╔╬ ! 1 ╘┼╪╘ ├╥ ." ╚┼╠╠╧, "
╨┴─ ├╧╒╬╘ ╘┘╨┼ ." , ╔ ╙╨┼┴╦ ╞╧╥╘╚. " ;
┴LL OF THE CHANGES TO THIS DEFINITION HAVE BEEN DISCUSSED PREVIOUSLY, WITH THE EXCEPTION OF THE PHRASE
╙╨┴╬ @ #╘╔┬ !
╙INCE '83 ╞ORTH DOESN'T USE A DELIMITER, BUT A COUNT WHICH DETERMINES THE SIZE OF THE INPUT STREAM, IN ADDITION TO RESETING THE INPUT STREAM BACK TO THE BEGINNING OF THE ╘╔┬ WITH 0 >╔╬ ! , YOU MUST ALSO TELL ╞ORTH HOW LONG THE CURRENT STREAM IS. #╘╔┬ CONTROLS THE LENGTH OF THE INPUT STREAM WHEN YOU ARE NOT INTERPRETING FROM DISK. ╙╨┴╬ IS A VARIABLE WHICH IS SET BY ┼╪╨┼├╘ , AND WHICH ALWAYS CONTAINS THE NUMBER OF CHARACTERS ACTUALLY RECEIVED BY ┼╪╨┼├╘ . ╙O BY STORING THE VALUE OF ╙╨┴╬ IN #╘╔┬ , WE HAVE TOLD ╞ORTH THAT THE INPUT STREAM IS AS LONG AS THE NAME THE USER TYPED.
╬UMBER ╔NPUT ├ONVERSIONS
╨AGE 277
╨╠╒╙ WILL NOT WORK AS SHOWN, SINCE THE VERSION OF ╬╒═┬┼╥ USED IN ┬LAZIN' ╞ORTH FOLLOWS THE RECOMMENDATIONS OF THE '83 ╙TANDARD, AND ALWAYS RETURNS A DOUBLE NUMBER. ╒SE THIS VERSION OF PLUS ON '83 SYSTEMS:
: ╨╠╒╙ ┬╠ ╫╧╥─ ╬╒═┬┼╥ ─╥╧╨ + ." =" . ;
╘HIS JUST DROPS THE HIGH CELL OF THE DOUBLE NUMBER, WHICH WILL BE ZERO, IF YOU ARE ENTERING SINGLE LENGTH NUMBERS. ╘HE WORD ┬╠ IN THE ABOVE DEFINITION IS A SYSTEM CONSTANT THAT RETURNS THE VALUE FOR AN ┴╙├╔╔ BLANK (32). ╟ENERALLY, IT'S BETTER TO USE CONSTANTS LIKE THIS WHEN YOU HAVE THEM, SINCE THEY RESULT IN MEMORY SAVINGS. ╔ JUST THREW IT IN AS AN EXCUSE TO TELL YOU THIS.
╨AGE 278
╞OOTNOTE: ╙EE THE SYSTEM DOCUMENTATION FOR ╬╒═┬┼╥ ╨╒╬├╘? AND ─╨╠ ( WHICH IS EQUIVALENT TO ┬RODIES ╨╘╥ ). ╙EE ALSO THE EXAMPLE IN THIS DOCUMENT, UNDER ├HAPTER 7, WHICH EXPLAINS HOW TO ALTER THE BEHAVIOUR OF ╬╒═┬┼╥ .
╨AGE 282
┬LAZIN' ╞ORTHS -╘┼╪╘ RETURNS ╘╥╒┼ IF THERE IS A MATCH, UNLIKE THE ONE ┬RODIE USES, WHICH RETURNS FALSE IF THERE IS A MATCH. ┘OU WILL NEED TO KEEP THIS IN MIND IF YOU WANT TO GET THE FILE SYSTEM EXAMPLE IN THE APPENDIX TO WORK.
Ç*CN1;├HAPTER 11Ç*CN0
╨AGE 304
┬ECAUSE OF THE COMPILER SECURITY, THE SECOND DEFINITION FOR ╠╔═╔╘ WON'T WORK IN ┬LAZIN' ╞ORTH. ╔N MANY PEOPLES VIEW, THIS IS KIND OF DUBIOUS PRACTICE, BUT IF YOU WANT TO USE IT, HERE'S HOW TO TRICK THE SECURITY:
╚┼╥┼ 10 ┴╠╠╧╘
: ╠╔═╔╘ 2* ╠╔╘┼╥┴╠ + [ ╚┼╥┼ ] ; ─╥╧╨
╘HIS KEEPS THE STACK POSITION THE SAME. ┴NOTHER WAY TO DO THE SAME THING IS:
: ╠╔═╔╘ 2* ╠╔═╔╘ + [ ╙╨@ !├╙╨ ] ;
╨AGE 306
╚ANDY ╚INT. ┬LAZIN' ╞ORTH WILL REMAIN IN COMPILE MODE UNTIL A ; IS ENCOUNTERED, OR A FATAL ERROR OCCURS. ┴ MESSAGE LIKE <NAME> ┴╠╥┼┴─┘ ┼╪╔╙╘╙ IS NOT A FATAL ERROR. ╔N FACT, YOU CAN TELL THE SYSTEM NOT TO TELL YOU ABOUT THESE ERRORS AT ALL, BY TYPING: