Enterprise Forever
:HUN => Programozás => Topic started by: Z80System on 2013.March.30. 14:04:52
-
FORTH- nak is legyen sajat topikja magyarul is.
-
Azt tudja valaki, hogy a FORTH- ban honnan jon ez az utasitas forma ? Es hogy miert kellett az assembly- t is hozza igazitani ?! Hihetetlen hogy 25 ev utan is tud lenni egy akkora kavaras, hogy a hajam az egnek all ...
Tehat hogy mi ez a "5, a, ld " sorrend ? Mire jo ez ? Vagy mit gyorsit ? Vagy kinek allt igy ra az agya ? Honnan jon ez ?
-
Azt tudja valaki, hogy a FORTH- ban honnan jon ez az utasitas forma ? Es hogy miert kellett az assembly- t is hozza igazitani ?! Hihetetlen hogy 25 ev utan is tud lenni egy akkora kavaras, hogy a hajam az egnek all ...
Tehat hogy mi ez a "5, a, ld " sorrend ? Mire jo ez ? Vagy mit gyorsit ? Vagy kinek allt igy ra az agya ? Honnan jon ez ?
Egyszeru, a forth egy verem (stack) orientalt nyelv. Pl a klasszikus 5 + 3 az forth-ban 5 3 + Azaz, beteszed a verembe az 5-ot, majd a 3-at, a + meg osszeadja a verem tetejen levo ket szamot. Az assembly syntax-a ezzel van osszhangban, mivel az is forth implementacio vegulis: a parametereit benyomod a verembe eloszor, es utana jon csak hogy "ld" aminek az operandusai ott vannak a veremben mar.
A forth szepsege amugy az, hogy total egyszeru megis hatekony: a nyelvnek ugymond syntaxisa sincs igazan, un "szavakbol" (word) all, melyeket lehet definialni, az alap forth mag csak annyi kb hogy a word list-ben word-ot keres, amit definialtal, illetve stack-be probal szamokat (ami memoria cim is lehet) elhelyezni, ha nem talal wordlistben semmit az aktualis szora, akkor megprobalja annak tekinteni. A maga a + stb is ugy van definialva, valojaban nem arrol van szo, hogy a "forth mag" resze lenne. Igy a forth nagyon elemi szinten nezve hihetetlenul egyszeru, ellentetben pl BASIC-kel stb.
Pl gforth-ban amit Linux alol probalgatok, egy szo definicioja utolag is megvizsgalhato (see), ott pl latszik, hogy a + az valojaban egy definialt forth word, aminek definicioja egy assembly nyelvu reszlet, ami pont azt csinalja, hogy a verem tetejen levo ket szamot osszead (kiveve azokat), majd az eredmenyt szinten a verembe helyezi el.
-
Azt tudja valaki, hogy a fig-Forth (http://www.ep128.hu/Ep_Util/Prg/Z80_fig-Forth.rar)-ban hogy működik a file-kezelés?
-
Pont most ismerkedem egy nagyon hasonló programnyelvvel, ahol a verem (STACK) 1. elemét ACCU1-nek, a 2. elemét ACCU2-nek hívják.
Az összeadás úgy működik, hogy:
L 12 - (LOAD) Töltsd a 12-őt az ACCU1-be (ACCU1 régi tartalma egyúttal ACCU2-be másolódik)
L 23 - Töltsd a 23-at az ACCU1-be (ACCU1 régi tartalma egyúttal ACCU2-be másolódik, tehát ACCU2 most 12 lesz)
i+ - Végezz integer összeadást ACCU1 és ACCU2 között, majd az eredményt tárold el ACCU1-ben
S "result" - (STORE) Tárold el ACCU1-ben lévő értéket a "result" nevű változóba
Vajon a Forth is így működik?
-
Ohh, valamit elfelejtettem. Az általam elmített esetben a verem nem olyan verem, hogy "megtelik", tehát nem kell üríteni. Itt inkább arról van szó, hogy új elem esetén az egész sor átmásolódik a következő helyre, a legutolsó pedig "kiesik". Egyébként nálam 4db ACCU van, de még nem jöttem rá milyen utasítás használja az ACCU3-at és 4-et.
Ha processzorszinten gondolkodom az ilyen típusú veremkezeléshez nem is kell a memóriában matatni, elég hozzá néhány regiszter, ami a megfelelő módon működik. (Természetesen a feldolgozandó adatokat a memóriából vesszük).
Valahol mintha azt olvastam volna, hogy az x86 matematikai társprocesszora (amit később a 386DX, 486DX majd Pentium prociknál be is integrálták) is hasonló elven működik. Sőt mintha az MMX utasításkészlet is valahogy így dolgozna.
-
Érdekes amiket írtok. Az jutott eszembe hogy akkor a gépi kódú nyelv miért nem forth jellegű? Vagy későn jött létre ez a nyelv, hogy már csak a math procikba építhettek be hasonlót?
-
Illetve azért a gépi kód is forth jellegű valamennyire persze...
-
Ez vajon miért nem működik?
( Vangelis )
: PL
DURATION PITCH 1 SOUND
;
: VANGELIS
0 63 63 2 PHASE 0 -10 -10 4 PHASE
0 -40 -40 20 PHASE 1 ENVELOPE
160 LEFT 160 RIGHT
54 6 PL 53 6 PL 53 12 PL
54 6 PL 53 6 PL 53 12 PL
54 6 PL 53 6 PL 53 12 PL
61 24 PL
61 6 PL 60 6 PL 58 12 PL
58 6 PL 56 6 PL 54 12 PL
54 6 PL 53 6 PL 51 36 PL
53 6 PL 51 6 PL 51 12 PL
53 6 PL 51 6 PL 51 12 PL
53 6 PL 51 6 PL 51 12 PL
60 24 PL
;
-
Van fantázia ebben a nyelvben.
Ez mondjuk még nem FORTH "mélyvíz" :-)
-
Két számolást meg lehet még "spórolni".
-
Jé egy ember aki képes volt Forth programot írni? :ds_icon_cheesygrin:
:smt038
-
3 1 DO I
650 1 DO
Egyik sorban így van a DO utána meg úgy. Ez nekem nem tetszik. Gondolom az elso DO az olyan mint a Basic-ben a FOR.
A másodiknál nem értem miért kell 650 a sor elejére.
-
Az I nem tartozik a DO, hoz, az már a következő utasítás :-)
Mindkettő számlálós ciklus, a lépésköz a ciklus végéből derül ki (LOOP - egyesével lépeget vagy +LOOP)
-
Reverse Polish Notation (https://en.wikipedia.org/wiki/Reverse_Polish_notation).
-
IS-FORTH alatt hogyan lehet 80 oszlopos módba váltani?
-
[attachimg=1]
-TEXT +n-
Sets up and displays 24 lines of text with +n columns (40 or 80). Resets the current graphics and text channel numbers. Closes the graphics channel if open.
-
Próbáltam, nem csinál semmit. Hibaüzenetet sem ad. Marad 40 oszlopos a képernyő.
-
80 -TEXT
-
ÁÁÁÁ, de hülye voltam. Kösz. Simán lehagytam előle a kötőjelet... Az agyam valahogy nem úgy processzálta, hogy az egy begépelendő karakter.
Nagyon köszönöm.
-
Ezek a könyvek nincsenek meg valakinek?
https://www.libri.hu/konyv/Forth-programozasi-rendszer-es-nyelv-9.html (https://www.libri.hu/konyv/Forth-programozasi-rendszer-es-nyelv-9.html)
https://www.libri.hu/konyv/A-FORTH-programozasi-nyelv-8.html (https://www.libri.hu/konyv/A-FORTH-programozasi-nyelv-8.html)
-
Akkor itt az első Forth programom:
EMPTY
: STAR 42 EMIT ; ( -- )
: 03ROLL 3 0 DO 3 ROLL LOOP ; ( n1, n2, n3, n4, -- n4, n1, n2, n3 )
: 3DUP 4 1 DO 2 PICK LOOP ; ( n1, n2, n3 -- n1, n2, n3, n1, n2, n3 )
: PUTSTAR 3DUP + SWAP MOD 0 = 03ROLL - SWAP MOD 0 = OR IF STAR ELSE SPACE THEN ; ( n1, n2, n3 -- )
: ROW 37 0 DO 2DUP I SWAP PUTSTAR LOOP 2DROP ; ( n1, n2 -- )
: SECTION DUP 1 + 0 DO CR DUP I ROW LOOP DROP ; ( n -- )
: STARS BEGIN DUP SECTION REPEAT ; ( patternsize -- )
A verembe kell tenni a minta méretét, és utána a STARS szóval indul. Pl: 8 STARS
-
Újabb FORTH program:
: READKEY
1+ BEGIN KEY 48 -
2DUP > OVER 0 > AND IF
DUP 48 + EMIT CR SWAP DROP EXIT
THEN DROP
REPEAT ;
: 21GAME CLS 102 #GRAPHICS
0 2 RND
." 21 is a two player game." CR
." The game is played by choosing a number (1, 2 or 3) to be added to the running total. "
." The game is won by the player whose chosen number causes the running total to reach exactly 21." CR
." The running total starts at zero. One player will be the computer"
CR
BEGIN
1 SWAP -
3 INK
CR ." The sum is " OVER . CR
1 INK
DUP 1 = IF
SWAP
." How many would you like add?"
." (1-3) " 3 READKEY
THEN
DUP 0 = IF
." It is the computer's turn."
SWAP 4 OVER 1- 4 MOD -
DUP 4 = IF 3 RND 1+ MIN THEN
DUP CR ." Computer adds " . CR
THEN
+
SWAP
OVER 21 < NOT UNTIL
CR 3 INK
0 = IF ." Bad luck. Computer wins."
ELSE ." Congratulations. You win."
THEN CR DROP 1 INK 101 #GRAPHICS
;
Ez (https://rosettacode.org/wiki/21_game#IS-BASIC) alapján készült.
-
A két IF ág ELSE-vel egyszerűsítve:
: READKEY
1+ BEGIN KEY 48 -
2DUP > OVER 0 > AND IF
DUP 48 + EMIT CR SWAP DROP EXIT
THEN DROP
REPEAT ;
: 21GAME CLS 102 #GRAPHICS
0 2 RND
." 21 is a two player game." CR
." The game is played by choosing a number (1, 2 or 3) to be added to the running total. "
." The game is won by the player whose chosen number causes the running total to reach exactly 21." CR
." The running total starts at zero. One player will be the computer."
CR
BEGIN
1 SWAP -
3 INK
CR ." The sum is " OVER . CR
1 INK
DUP 1 = IF
SWAP
." How many would you like add?"
." (1-3) " 3 READKEY
ELSE
." It is the computer's turn."
SWAP 4 OVER 1- 4 MOD -
DUP 4 = IF 3 RND 1+ MIN THEN
DUP CR ." Computer adds " . CR
THEN
+
SWAP
OVER 21 < NOT UNTIL
CR 3 INK
0 = IF ." Bad luck. Computer wins."
ELSE ." Congratulations. You win."
THEN CR DROP 1 INK 101 #GRAPHICS
;
-
Nem semmi! :shock: Az én agyam nem veszi be ezt a nyakatekert szintaxist :oops:
-
Nem semmi! :shock: Az én agyam nem veszi be ezt a nyakatekert szintaxist :oops:
Nekem másfél nap volt megírni a csillagrajzolót olyanra, amilyenre akartam. Pedig amúgy programozóként dolgozom. :-D Szóval nekem is nehéz volt. Szünidei kihívásnak vettem.
-
Nekem másfél nap volt megírni a csillagrajzolót olyanra, amilyenre akartam.
Ez amúgy a karácsonyi csillagos? Be is küldted nekik?
-
Következőnek, amit kinéztem magamnak, az a Demo kazettáról az Animan.
Bár ott elég sokat kellene zsonglőrködni a veremmel, meg a cindexszel is.
-
Ez amúgy a karácsonyi csillagos? Be is küldted nekik?
Az adta az alapötletet. De el is késtem vele, meg nem pont azt csinálja a program. Még le kéne vágni a sarkokat, hogy oda ne rajzoljon. Forthban még nem jutottam el idáig. :-)
-
Ez vajon miért nem működik?
( Vangelis )
: PL
DURATION PITCH 1 SOUND
;
: VANGELIS
0 63 63 2 PHASE 0 -10 -10 4 PHASE
0 -40 -40 20 PHASE 1 ENVELOPE
160 LEFT 160 RIGHT
...
Nem értek hozzá, de nem lehet, hogy ilyesmi kellene?
: PL
160 LEFT 160 RIGHT ENVELOPE DURATION PITCH 1 SOUND
És az envelope és a duration után/elé is kellene valami szám/változó? Az envelope fázisok végére pedig nem kellene a LEFT és a RIGHT? És az envelope fázisai mennének előbbre, utána a sound, ami megszólaltatja?
Amúgy a számok alapján nekem nem Vangelisnek tűnik, hanem valami klasszikus lehet, de meg nem mondom, micsoda...
-
A letölthető (http://ep128.hu/Ep_Util/Prg/Is-Forth.rar) csomagban 1.0-ás .EXT van és 1.1-es verziószámú .ROM. A ROM-ból hogyan is kell csinálni EXT-et?
-
A letölthető (http://ep128.hu/Ep_Util/Prg/Is-Forth.rar) csomagban 1.0-ás .EXT van és 1.1-es verziószámú .ROM.
Ebben az a érdekes, hogy honnan van 1.1-es ROM-od, amikor csak és kizárólag az 1.0 forgott közkézen? :shock:
ep128emu ROM csomagban is az van. Érdekes, hogy pont az 1.0 ROM meg hiányzik nálad :lol:
1.1-et egyedül Andrew Richardstól kapott lemezen találtam, illetve valaki valahova feltöltött egy forth-pascal ROM-ot 2008-ban, abban van még.
Az EXT fáj hibás méretű, a végére valahogy odakeveredett egy csomó szemét, a valódi hasznos méret a fejléc alapján 16390 bájt.
Azonban a ROM végi üres terület (csomó FFh bájt) is levágható, így csak 15878 bájt marad, magnós töltésnél ez is számít :-)
A ROM-ból hogyan is kell csinálni EXT-et?
ROM elejéről le kell vágni az első 10 bájtot, helyére odafűzni 16 bájtos EXOS modul fejlécet, 6-os típusbájttal.
Hossz az a teljes ROM tartalom esetén 4000h-0Ah=3FF6h, azaz a fejlécben F6h 3Fh. A fölösleges FFh-ek levágásával 3DF6h (F6h 3Dh).
Itt a kiegészített csomag.
-
Van valami doksi az 1.0 és az 1.1 különbségeiről?