Write language name in 3D ASCII: Difference between revisions
Content deleted Content added
Line 938: | Line 938: | ||
=={{header|FORTH}}== |
=={{header|FORTH}}== |
||
==={{header|FORTH}}=== |
|||
<lang FORTH>\ Rossetta Code Write language name in 3D ASCII |
|||
<lang FORTH TEXT>\ Rossetta Code Write language name in 3D ASCII |
|||
\ Simple Method |
\ Simple Method |
||
Line 971: | Line 972: | ||
ok |
ok |
||
</pre> |
|||
==={{header|FORTH}}=== |
|||
<lang FORTH Banner>\ Original code: "Short phrases with BIG Characters by Wil Baden 2003-02-23 |
|||
\ Modified BFox for simple 3D presentation 2015-07-14 |
|||
\ Forth is a very low level language but by using primitive operations |
|||
\ we create new words in the language to solve the problem. |
|||
\ This solution coverts an acsii string to big text characters |
|||
HEX |
|||
: toUpper ( char -- char ) 05F and ; |
|||
: w, ( n -- n ) CSWAP , ; \ compile 'n', a 16 bit integer, into memory in the correct order |
|||
CREATE Banner-Matrix |
|||
0000 w, 0000 w, 0000 w, 0000 w, 2020 w, 2020 w, 2000 w, 2000 w, |
|||
5050 w, 5000 w, 0000 w, 0000 w, 5050 w, F850 w, F850 w, 5000 w, |
|||
2078 w, A070 w, 28F0 w, 2000 w, C0C8 w, 1020 w, 4098 w, 1800 w, |
|||
40A0 w, A040 w, A890 w, 6800 w, 3030 w, 1020 w, 0000 w, 0000 w, |
|||
2040 w, 8080 w, 8040 w, 2000 w, 2010 w, 0808 w, 0810 w, 2000 w, |
|||
20A8 w, 7020 w, 70A8 w, 2000 w, 0020 w, 2070 w, 2020 w, 0000 w, |
|||
0000 w, 0030 w, 3010 w, 2000 w, 0000 w, 0070 w, 0000 w, 0000 w, |
|||
0000 w, 0000 w, 0030 w, 3000 w, 0008 w, 1020 w, 4080 w, 0000 w, |
|||
7088 w, 98A8 w, C888 w, 7000 w, 2060 w, 2020 w, 2020 w, 7000 w, |
|||
7088 w, 0830 w, 4080 w, F800 w, F810 w, 2030 w, 0888 w, 7000 w, |
|||
1030 w, 5090 w, F810 w, 1000 w, F880 w, F008 w, 0888 w, 7000 w, |
|||
3840 w, 80F0 w, 8888 w, 7000 w, F808 w, 1020 w, 4040 w, 4000 , |
|||
7088 w, 8870 w, 8888 w, 7000 w, 7088 w, 8878 w, 0810 w, E000 w, |
|||
0060 w, 6000 w, 6060 w, 0000 w, 0060 w, 6000 w, 6060 w, 4000 w, |
|||
1020 w, 4080 w, 4020 w, 1000 w, 0000 w, F800 w, F800 w, 0000 w, |
|||
4020 w, 1008 w, 1020 w, 4000 w, 7088 w, 1020 w, 2000 w, 2000 w, |
|||
7088 w, A8B8 w, B080 w, 7800 w, 2050 w, 8888 w, F888 w, 8800 w, |
|||
F088 w, 88F0 w, 8888 w, F000 w, 7088 w, 8080 w, 8088 w, 7000 w, |
|||
F048 w, 4848 w, 4848 w, F000 w, F880 w, 80F0 w, 8080 w, F800 w, |
|||
F880 w, 80F0 w, 8080 w, 8000 w, 7880 w, 8080 w, 9888 w, 7800 w, |
|||
8888 w, 88F8 w, 8888 w, 8800 w, 7020 w, 2020 w, 2020 w, 7000 w, |
|||
0808 w, 0808 w, 0888 w, 7800 w, 8890 w, A0C0 w, A090 w, 8800 w, |
|||
8080 w, 8080 w, 8080 w, F800 w, 88D8 w, A8A8 w, 8888 w, 8800 w, |
|||
8888 w, C8A8 w, 9888 w, 8800 w, 7088 w, 8888 w, 8888 w, 7000 w, |
|||
F088 w, 88F0 w, 8080 w, 8000 w, 7088 w, 8888 w, A890 w, 6800 w, |
|||
F088 w, 88F0 w, A090 w, 8800 w, 7088 w, 8070 w, 0888 w, 7000 w, |
|||
F820 w, 2020 w, 2020 w, 2000 w, 8888 w, 8888 w, 8888 w, 7000 w, |
|||
8888 w, 8888 w, 8850 w, 2000 w, 8888 w, 88A8 w, A8D8 w, 8800 w, |
|||
8888 w, 5020 w, 5088 w, 8800 w, 8888 w, 5020 w, 2020 w, 2000 w, |
|||
F808 w, 1020 w, 4080 w, F800 w, 7840 w, 4040 w, 4040 w, 7800 w, |
|||
0080 w, 4020 w, 1008 w, 0000 w, F010 w, 1010 w, 1010 w, F000 w, |
|||
0000 w, 2050 w, 8800 w, 0000 w, 0000 w, 0000 w, 0000 w, 00F8 w, |
|||
: >col ( char -- ndx ) \ convert ascii char into column index in the matrix |
|||
toupper BL - 0 MAX ; \ Space char (BL) = 0. Index is clipped to 0 as minimum value |
|||
: ]banner-matrix ( row ascii -- addr ) \ convert Banner-matrix memory to a 2 dimensional matri |
|||
>col 8 * Banner-matrix + + ; |
|||
: PLACE ( str len addr -- ) \ store a string with length at addr |
|||
2DUP 2>R 1+ SWAP MOVE 2R> C! ; |
|||
synonym len c@ \ fetch the 1st char of a counted string to return the length |
|||
DECIMAL |
|||
create bannerstr 5 allot \ memory for the character string |
|||
\ Font selection characters stored as a counted string |
|||
: STARFONT c" *" count bannerstr PLACE ; |
|||
: HASHFONT c" #" count bannerstr PLACE ; |
|||
: 3DFONT c" _/" count bannerstr PLACE ; |
|||
: .BIGCHAR ( matrix-byte -- ) |
|||
2 7 \ we use bits 7 to 2 |
|||
DO |
|||
dup 1 I lshift AND \ read the bit |
|||
IF bannerstr count TYPE \ if BIT=TRUE |
|||
ELSE bannerstr len SPACES \ if BIT=false |
|||
THEN |
|||
-1 +LOOP \ loop backwards |
|||
DROP ; \ drop the matrix-byte |
|||
: BANNER ( str len -- ) |
|||
8 0 |
|||
DO CR \ str len |
|||
2dup |
|||
BOUNDS \ calc. begin & end addresses of string |
|||
DO |
|||
J I C@ ]Banner-Matrix C@ .BIGCHAR |
|||
LOOP \ str len |
|||
LOOP |
|||
2DROP ; \ drop str & len |
|||
\ test the solution in the Forth console |
|||
3DFONT s" FORTH" banner |
|||
{{out}} |
|||
<pre> |
|||
_/_/_/_/_/ _/_/_/ _/_/_/_/ _/_/_/_/_/ _/ _/ |
|||
_/ _/ _/ _/ _/ _/ _/ _/ |
|||
_/ _/ _/ _/ _/ _/ _/ _/ |
|||
_/_/_/_/ _/ _/ _/_/_/_/ _/ _/_/_/_/_/ |
|||
_/ _/ _/ _/ _/ _/ _/ _/ |
|||
_/ _/ _/ _/ _/ _/ _/ _/ |
|||
_/ _/_/_/ _/ _/ _/ _/ _/ |
|||
ok |
|||
hashfont ok |
|||
s" FORTH" BANNER |
|||
##### ### #### ##### # # |
|||
# # # # # # # # |
|||
# # # # # # # # |
|||
#### # # #### # ##### |
|||
# # # # # # # # |
|||
# # # # # # # # |
|||
# ### # # # # # |
|||
ok |
|||
</pre> |
</pre> |