Programfájlt lehet kérni? :oops:
PROGRAM EXOSBOVITO;
VAR
STRTEMP : ARRAY[1..255] OF CHAR;
PROCEDURE XSET(VALTOZO,ERTEK:INTEGER);
BEGIN
INLINE(#06,#01) {LD B,1};
INLINE(#DD,#4E,#04) {LD C,(IX+04)};
INLINE(#DD,#56,#02) {LD D,(IX+02)};
INLINE(#F7,#10) {EXOS 16};
END;
PROCEDURE GRAFON(CH,MODE,COLOR,XSIZE,YSIZE:INTEGER);
BEGIN
XSET(22,MODE);
XSET(23,COLOR);
XSET(24,XSIZE);
XSET(25,YSIZE);
INLINE(#DD,#7E,#0A) {LD A,(IX+10H)};
INLINE(#11,#8A,#14) {LD DE,148AH)};
INLINE(#F7,#01) {EXOS 1};
END;
PROCEDURE GRAFOFF(CH:INTEGER);
BEGIN
INLINE(#DD,#7E,#02) {LD A,(IX+2)};
INLINE(#F7,#03) {EXOS 3};
END;
PROCEDURE DISPLAY(CH,SAT,SFROM,STO:INTEGER);
BEGIN
INLINE(#DD,#7E,#08) {LD A,(IX+8)};
INLINE(#06,#01) {LD B,1};
INLINE(#DD,#4E,#04) {LD C,(IX+4)};
INLINE(#DD,#56,#02) {LD D,(IX+2)};
INLINE(#DD,#5E,#06) {LD E,(IX+6)};
INLINE(#F7,#0B) {EXOS 11};
END;
PROCEDURE PALETTE(CH,C0,C1,C2,C3,C4,C5,C6,C7:INTEGER);
BEGIN
POKE(ADDR(STRTEMP),CHR(27));
POKE(ADDR(STRTEMP)+1,'C');
POKE(ADDR(STRTEMP)+2,CHR(C0));
POKE(ADDR(STRTEMP)+3,CHR(C1));
POKE(ADDR(STRTEMP)+4,CHR(C2));
POKE(ADDR(STRTEMP)+5,CHR(C3));
POKE(ADDR(STRTEMP)+6,CHR(C4));
POKE(ADDR(STRTEMP)+7,CHR(C5));
POKE(ADDR(STRTEMP)+8,CHR(C6));
POKE(ADDR(STRTEMP)+9,CHR(C7));
INLINE(#DD,#7E,#12) {LD A,(IX+18)};
INLINE(#01,#0A,#00) {LD BC,10};
INLINE(#11,#01,#FF) {LD DE,FF01H};
INLINE(#F7,#08) {EXOS 8};
END;
PROCEDURE PLOT(CH,X,Y:INTEGER);
BEGIN
POKE(ADDR(STRTEMP),CHR(27));
POKE(ADDR(STRTEMP)+1,'A');
POKE(ADDR(STRTEMP)+2,X);
POKE(ADDR(STRTEMP)+4,Y);
INLINE(#DD,#7E,#06) {LD A,(IX+6)};
INLINE(#01,#06,#00) {LD BC,6};
INLINE(#11,#01,#FF) {LD DE,FF01H};
INLINE(#F7,#08) {EXOS 8};
END;
PROCEDURE BEAM(CH,ONOFF:INTEGER);
BEGIN
POKE(ADDR(STRTEMP),CHR(27));
POKE(ADDR(STRTEMP)+1,CHR(ORD('s')-(ONOFF*32)));
INLINE(#DD,#7E,#04) {LD A,(IX+4)};
INLINE(#01,#02,#00) {LD BC,2};
INLINE(#11,#01,#FF) {LD DE,FF01H};
INLINE(#F7,#08) {EXOS 8};
END;
PROCEDURE FILL(CH:INTEGER);
BEGIN
POKE(ADDR(STRTEMP),CHR(27));
POKE(ADDR(STRTEMP)+1,'F');
INLINE(#DD,#7E,#02) {LD A,(IX+2)};
INLINE(#01,#02,#00) {LD BC,2};
INLINE(#11,#01,#FF) {LD DE,FF01H};
INLINE(#F7,#08) {EXOS 8};
END;
PROCEDURE MOVETO(CH,X,Y:INTEGER);
BEGIN
BEAM(CH,0);
PLOT(CH,X,Y);
END;
PROCEDURE SIERP(W,X,Y:INTEGER);
BEGIN
IF W>28 THEN BEGIN
SIERP(W DIV 2,X,Y);
SIERP(W DIV 2,X+W DIV 4,Y-W DIV 2);
SIERP(W DIV 2,X+W DIV 2,Y)
END
ELSE BEGIN
PLOT(101,X,Y);BEAM(101,1);
PLOT(101,X+W DIV 2,Y-W);
PLOT(101,X+W,Y);PLOT(101,X,Y);
MOVETO(101,X+4,Y-4);FILL(101);
END
END;
BEGIN
GRAFON(101,1,0,40,27);
PALETTE(101,32,142,0,0,0,0,0,0);
DISPLAY(101,1,1,27);
SIERP(896,180,950);
READLN;
GRAFOFF(101);
END.
PROCEDURE VALAMI(A,B,C:INTEGER);
akkor a C paraméter értéke az IX+2 és IX+3 helyen, a B = IX+4 és IX+5, A = IX+6 és IX+7 címen lesz eltárolva.
Szerettem a pascal -ban, hogy kicsit olyan assembly -re emlékeztető a szintaxisa ...meg főleg az EP basicre
Ugyan magával a nyelvvel tán egy iskolai év keretein belül foglalkoztam csak, de mindíg olyan jó volt ránézni a forrásaira ... olyan otthonos volt az assembly után ...
na, megcsináltam a Sierpinski háromszög-rajzoló progit Pascal-on is.Ez az assembler verzió is ~10 másodperc alatt fut le, tehát a futásidő nagy részét valójában az EXOS rajzoló rutinok teszik ki:
a Turbo Pascal-on 17 mp, itt 10 mp alatt lefut...
VAR
I : INTEGER;
CH : CHAR;
R : REAL;
esetén a változók az alábbi memóriacímeken lesznek eltárolva:na, megcsináltam a Sierpinski háromszög-rajzoló progit Pascal-on is.Hoppá! Ez igen!
a Turbo Pascal-on 17 mp, itt 10 mp alatt lefut...
http://www.youtube.com/watch?v=GXBMkGNDceI&feature=youtu.be
Hoppá! Ez igen!pedig ez működik!!!! :-)
Includ file-t nem lehet használni Hisoft Pascal-ban? Enterpress alapján próbálkoztam ezzel (lásd csatolmány), de nem tudtam életet lehelni belé.
Bár, ha jól sejtem, a tied amúgy gyorsabb megoldás. Esetleg ki lehetne egészíteni a Graphh.tpu összes eljárására? :oops: Utána a TURTLE.TPU szerintem már menne egyedül is
LD HL,11
CALL 04D7H
04D7H LD A,L ;A-ban az EXOS funkcióhívás száma
LD (04E7H),A ;az RST 30h autasítás mögé bemásolásra kerül a funkcióhívás száma
LD A,(04F4H)
LD BC,(04F5H)
LD DE,(04F7H)
04E6H EXOS xx
LD (04F7H),DE
LD (04F5H),BC
LD (04F4H),A
RET
akkor ezek szerint lehet include fájlt csinálni:smt038
akkor így meg tudnám csinálni a tpu-kat
ha az editorban nyomsz egy "W"-t, majd ENTER-t, az nem jó? utána már 80 karakteresben maradszProgramból nem lehet váltani? Bár Spectrumos cucc, tartok tőle, hogy nem...
Zozo, escape szekvenciákat küldeni lehet karakterenként is küldeni, vagy csak egyben, stringként? Pl. esc "F" a Fill-re...Lehet.
az létezhet, hogy a 2.3-as EXOS valamiért összeveszik a Pascal-lal?Elképzelhető, fogtunk ott egy bugot, amitől 2.31 lett :oops: EXDOS volt a konfigodban? Ha jól emlékszem magnós konfigban jött elő.
2.32-vel már működik rendesen
PROCEDURE FILL(CH:INTEGER);
BEGIN
INLINE(#DD,#7E,#02) {LD A,(IX+2)};
INLINE(#06,#1B) {LD B,27};
INLINE(#F7,#07) {EXOS 7};
INLINE(#DD,#7E,#02) {LD A,(IX+2)};
INLINE(#06,#46) {LD B,"F"};
INLINE(#F7,#07) {EXOS 7};
END;
kérdésem az, hogy vajon mennyivel lassabb n db bájtot kiírni EXOS 7-tel, mint egy n-bájtos blokkírás EXOS 8-cal? (pl. a paletta írásnál 10 byte-ot kell küldeni, persze ez pont nem sebességkritikus, az ember nem gyakran állítgatja a palettát).Összehasonlítás az ASM verzióval (minden teszt a 100h címtől (program indítása) a billentyűzetre várakozás eléréséig futott, kivéve az utolsót, ami a rajzolás sebességét nem mérte):ez jó, köszi István! :-)
Eredeti verzió (rövid EXOS 8 blokkok): 10.96 s
Pufferelt video adat (az összes adatot először csak egy pufferben tárolta, majd az egészet egyszerre írta ki egy EXOS 8 hívással, és csak utána hívta a display-t): 8.67 s
Pufferelt verzió karakterenkénti kiírásra módosítva: 17.43 s
Pufferelt változat csak az EXOS 8 eléréséig: 0.61 s
A tesztek 640K-s emulált konfiguráción futottak, a BFh port értéke 4 volt (várakozás csak M1-nél).
Azt nem értem még, hogy az EXOS miért bal alsó sarokba rakja a 0,0-t?Matekórán hova raktad a koordináta rendszer kezdetét? :-)
akkor úgy tűnik, mégis csak jobb a blokkírás, akár két bájt esetén is (?)válaszul a saját kérdésemre:
1. nem túl elegáns (szerintem)
2. ha ezt a fájlt include-olni akarom, akkor már nem lehet a második pas fájlban globális változókat deklarálni
kezd egyre kevésbé tetszeni ez a HiSoft Pascal... (pedig jó gyors)És nincs benne file-kezelés.
nem ismeri a konstansokat...
nagybetűvel kell írni mindent...
Azt nem értem még, hogy az EXOS miért bal alsó sarokba rakja a 0,0-t? nekem bal fölül logikusabb lenne.Szerintem meg rajzolásnál a jobb alsó a logikusabb (koordinátarendszer). CGA-ban mindent "fejjel lefelé" rajzolsz.
vagyis minél nagyobb a szín, annál gyorsabb a rajzolásKevesebb pixelt kell rajzolni :)
vajon miért?
tényleg, poke, az van benne :-) de mire is gondolsz? :-)Bepókolod a lefoglalt szegmensbe az LPT-t.
Bepókolod a lefoglalt szegmensbe az LPT-t.Á, értem :-)
Mondjuk ehhez SPOKE kéne, ha nincs, akkor azt végülis egy kisebb rutinnal meg lehet csinálni.
sikerült a videolap létrehozása... :-):smt038
közben arra jöttem rá, hogy a 3-as lapot nem lapozgathatom ám csak úgy össze-vissza, mert annak a tetején (0FFFFH-tól lefelé) vannak tárolva a változók.közben nem túl elegánsan ezt úgy oldottam meg, hogy deklaráltam egy 16384 byte méretű változót (konkrétan egy 16384 elemű CHAR tömböt) a program elején, így az összes többi (később deklarált) globális változóm címe már a kettes lapra esik. Így nyugodtan kilapozhatom a 3-as lapot. :-)
pl. jó lenne általános eljárást készíteni, ahol paraméterben megadhatnám a pixelsorok számát, és a kép szélességét. A színmód változtatása egyértelmű. De a többihez elég-e az első LPB-be piszkálni, vagy akkor a többibe is bele kell nyúlni? (ráadásul a "margó" nevezető bitek nem tudom, hogyan értelmezendők, gondolom, ezekből jön majd ki a kép szélessége?volt ilyen, én sokat használtam
d
De a többihez elég-e az első LPB-be piszkálni, vagy akkor a többibe is bele kell nyúlni?Az alsó és a felső keret hosszát is módosítani kell a kép magasságának megfelelően. A korábban már ajánlott graph.s-ben található példa ezeknek a beállítására tetszőleges magasságú (de legfeljebb 256 soros) képhez:
(ráadásul a "margó" nevezető bitek nem tudom, hogyan értelmezendők, gondolom, ezekből jön majd ki a kép szélessége?Igen. Ezeket célszerű így állítani (a szélesség karakterekben értendő):
ráadásul ez 082h port... b4..b11=LPT kezdőcímének középső nyolc bitje... ennél bonyolultabban nem is lehetett volna már megcsinálni... :-)Az alsó 4 bit mindig 0, ezért azt a portokon meg is takarították. :)
Akkor azzal a tömbbel tudod pókolni is :-)igen, de az POKE parancs rövidebb kódba fordul, mint a tömbbe írás, szóval, sok értelme nem lenne azt használni... :-)
A korábban már ajánlott graph.s-ben található példa ezeknek a beállítására tetszőleges magasságú (de legfeljebb 256 soros) képhez:igen, ezt én is nézegettem, csak már elakadtam ott, hogy (ha jól számolom) nálad 8 LPB van, míg Zozonál csak 7. Mi az a plusz egy? A status soré?
igen, ezt én is nézegettem, csak már elakadtam ott, hogy (ha jól számolom) nálad 8 LPB van, míg Zozonál csak 7. Mi az a plusz egy? A status soré?Valószínűleg a függőleges visszafutásnál van kisebb eltérés, de ennek nincs nagy jelentősége. Ha probléma az LPT mérete, akkor a 6. (3 soros) LPB törölhető, az utána következő 9 soros pedig 12 sorosra növelhető, így már csak 7 LPB marad. A legfontosabb, hogy a teljes kép 312 soros legyen.
A "(63 - VIDEO_WIDTH) / 2" -nál ha páratlan számot osztunk, csonkolni kell, vagy kerekíteni?Az előbbi, mert az assembler is így fordítja az egész osztást. A konstans azért 63, hogy a 40 karakter széles kép a "szabványos" LM=11,RM=51 pozícióba kerüljön, és páratlan méretnél jobbra legyen igazítva (igazi gépen ugyanis a kép általában kissé el van tolva balra).
10 PROGRAM A;
20 BEGIN
30 USER(#0242);
40 END.
Csináltam az 1.1-es ROM verzióból 5-ös fejlécű fájlt is.Kösz! Ez nekem igen hasznos.
Ezt érdemes kipróbálni, látványos: :-)Ez mit csinál? Sosem használtam Pascalt, de az USER utasítást leszámítva ezeket az utasításokat véletlenül ismerem.
Ez mit csinál?A USER parancs a megadott címen lévő utasításra ugrik, onnét folytatja a program futását.
10 PROGRAM PROBA;
20 BEGIN
30 WRITELN('Hello');
40 END.
pl. így néz ki a memóriában:;első sor:
dw 10
db 0
db 81h ;a PROGRAM tokenizálva
db " PROBA;"
db 13
;második sor:
dw 20
db 0
db 98h ;a BEGIN tokenizálva
db 13
harmadik sor:
dw 30
db 2 ;2 szóköz van a sor elején
db "WRITELN('Hello');"
db 13
;negyedik sor:
dw 40
db 0
db 90h ;END tokenizálva
db "."
db 13
Mivel a sorszámok INTEGER formában vannak, összesen csak 32767 sorunk lehet (persze ez is bőven elég, ha lenne egy ekkora programunk, csak a sorszámok tárolására elmenne 64kB :-) ).Olyasmi lehet ez az utasítás, mint a RANDOMIZE. Más értelmes magyarázatot nem találok.Pontosan, mint a nevéből látszik is :-) (http://en.wikipedia.org/wiki/Random_seed)
Ez nem lehet átírni CHR(26)-ra?Ha Povi megtalálja a kódban, akkor át lehet :-)
VAR CH : CHAR;
BEGIN
REPEAT
CH:=INCH;
IF CH<>CHR(0) THEN WRITE(CH);
UNTIL CH=CHR(27);
END.
Újabb (félig-meddig) ismeretlen függvény:Jól látom, hogy tulajdonképpen semmi leírás nincs a dokumentációban, hogy mit is tud a Hisoft Pascal? Vajon csak a magyar leírás ilyen béna, vagy angolul se volt?
Jól látom, hogy tulajdonképpen semmi leírás nincs a dokumentációban, hogy mit is tud a Hisoft Pascal?Jól látod! :ds_icon_cheesygrin:
itt a javított változat, amiben már működik a PAGE utasításennek azért örülök, legalább volt valami értelme annak, hogy belekezdtem a visszafejtésébe - kijavítottam egy majdnem 30 éves bugot! :-)
itt a javított változat, amiben már működik a PAGE utasításEz gyors volt, kösz! A ROM változatokban kijavítanád? :oops:
ha van rá igény, ezt majd később át lehetne javítani CLRSCR-re, persze ehhez fordítható forrás kell majd
Laci: a ROM változatokat holnap küldöm, és a 0.3-as .com-ban is kijavítomA 0.3-assal szerintem feleslewges foglalkozni. Én is kiszedtem a régebbieket, a letölthető csomagban csak az 1.1-es van már.
Amúgy ez a PACKED dolog valamiféle "tömörítés" akart volna lenni, mert a régi Pascal-oknál, ha valaki pl. létrehozott egy BOOLEAN tömböt, akkor a Pascal minden elemének lefoglalt egy "alapegységnyi" helyet. Ez az "alapegység" általában egy WORD (2 byte) volt, máskor talán más.
A PACKED BOOLEAN esetében pedig volt olyan implementáció, amelyik mindegyik bool értéknek csak 1 bitet foglalt, így "tömörödött". Nyilván a CHAR tömbnél is hasonló lehetett a helyzet, hogy csak 1 byte kellett volna...
Jah, amennyire remlik meg a hoskorbol, pascal-nal alapbol "szoegyseg" hatarra vannak igazitva a valtozok, ez az egyseg pl adott esetben egy 16 bites word (2 byte).Van egy olyan gyanúm, hogy itt a PACKED kulcsszót csak a kompatibilitás érdekében hagyták meg, de nem csinál semmit.
itt a javított változat, amiben már működik a PAGE utasításegyébként ez nem feltétlenül volt bug, mert eredetileg a PAGE parancsot lapdobásra (a nyomtatón) találták ki. Annak a kódja pedig tényleg a CHR(12). Inkább kicsit furcsa nekem, hogy az EXOS tervezői miért nem hagyták meg ezt a kódot a képernyőtörlésre is, miért használják helyette a CHR(26)-ot, ami pedig hagyományosan a fájl-vége jel.
ha van rá igény, ezt majd később át lehetne javítani CLRSCR-re, persze ehhez fordítható forrás kell majd
miért használják helyette a CHR(26)-ot, ami pedig hagyományosan a fájl-vége jel.Mert CP/M-ben képernyő törlés.
a tokenizálás hátulütője:de szemét ez a Pascal :-)
nem használhatók a chr(128) fölötti kódok (lásd az ábrát)!
majd át kéne írni, hogy a tokenizált parancsokat A1H-tól tárolja (81H helyett), hogy lehessen használni az chr(128)-chr(159) karaktereket pl. kiíráshoz.
közben nem túl elegánsan ezt úgy oldottam meg, hogy deklaráltam egy 16384 byte méretű változót (konkrétan egy 16384 elemű CHAR tömböt) a program elején, így az összes többi (később deklarált) globális változóm címe már a kettes lapra esik. Így nyugodtan kilapozhatom a 3-as lapot. :-)rájöttem, hogy erre való az Alter parancs :-)
rájöttem, hogy erre való az Alter parancs :-)Közérthetően elmagyaráznád mire is való? :oops:
Közérthetően elmagyaráznád mire is való? :oops:Alter:
var
i : integer;
ch : char;
mivel az integer 2 byte-ot foglal, az I változónk a 0FFFEH és 0FFFFH címen lesz eltárolva (erről meggyőzödhetünk az ADDR(I) paranccsal is).Az nem túl szimpatikus, hogy a write másképp működik, mint TP-ben.:ds_icon_frown:Minden egész szám után automatikusan ír egy space-t, gondolom, az a baj, ugye?
Minden egész szám után automatikusan ír egy space-t, gondolom, az a baj, ugye?Ha ennyi mindent javítasz rajta, van egy javaslatom: hagyjuk békén az eredeti 1.1-es verziót, és legyen 1.2-es. Ez a számok utáni automatikus space nagyon zavaró, és TP-ben nem így van. (Más Pascal változatot meg nem ismerek...)
a 33b7-re írj egy 3-ast, akkor nem fog :-)
sííímán :-)És ha már így adod az ember alá a lovat...
hogy tényleg kéne már a szerkeszthető fordítható forráskód,Na de nem azt csinálod éppen ?
tervek:SETVAR, TOGGLE, ASK parancs nincs a tervek között?
Azon gondolkodom, hogy inkább ezt egy sima eljárássá kéne alakítani, így lehetne simán EXOS(x)-ként hívni. Az A regiszter értékét pedig úgy is feltölti az RA-ba, tehát nem vész el az infó.Ez jó ötlet!
Ez jó ötlet!itt van
eddig még nem sok:A DISPLAY-ból, OPENVIDEO-ból, CLOSE szavakból kár kivenni a csatornaszámra hivatkozás. Ez ott szerintem inkább bonyolítás.
PLOT(x,y : integer)
PLOTREL(x,y : integer)
BEAMON
BEAMOFF
FILL
DISPLAY(ch,at,from,to : integer)
OPENVIDEO(ch : integer)
CLOSE(ch : integer)
most kivettem a csatornaszámra vonatkozó paramétert
Text 80-ba hogy kell programból átlépni?Az a baj, hogy az a programrész, ami a váltást csinálja, nem a runtime részben van, szóval Translate-tel lefordított programban nem fog működni.
PROCEDURE MODE80;
BEGIN
POKE(#14FD,CHR(40));
USER(#1EEC);
END;
PROCEDURE MODE40;
BEGIN
POKE(#14FD,CHR(80));
USER(#1EEC);
END;
PROGRAM PROBA;
VAR A : INTEGER;
BEGIN
A := MAKESTR('Hello');
WRITE(A);
END.
RA:=1;
RDE:=MAKESTR('PROBA.TXT');
EXOS(1);
és változóval is működik
Azt kell, hogy mondjam a Hisoft Pascal még gyorsabb, mint a Turbo Pascal. ;-)persze, hogy gyorsabb, mert a REAL számok csak 4 byte-on vannak tárolva, a TP-ben pedig 6 byte-on
l07b0: ld a,h ;4
or a ;4
ret p ;11/5
l07b3: xor a ;4
sub l ;4
ld l,a ;4
ld a,0 ;7
sbc a,h ;4
ld h,a ;4
ret ;10
összesen 50 cikusABSint:
bit 7,h 8 ; Test sign bit
ret z 11/5 ; .. already >0
ComplINT:
ld a,h 4 ; .. one's complement
cpl 4
ld h,a 4
ld a,l 4
cpl 4
ld l,a 4
inc hl 6 ; Fix for two's complement
ret 10
összesn 53 ciklus, vagyis 6%-kal gyorsabb a Hisoft Pascal :-)
összesn 53 ciklus, vagyis 6%-kal gyorsabb a Hisoft Pascal :-)Persze, hogy gyors! Ez már nem is Pascal, hanem assembly!
ABS számítása HP-ban:Code: [Select]l07b0: ld a,h ;4
összesen 50 cikus
or a ;4
ret p ;11/5
l07b3: xor a ;4
sub l ;4
ld l,a ;4
ld a,0 ;7
sbc a,h ;4
ld h,a ;4
ret ;10
l03c4: call l03df
l03c7: ld a,123
exos 2
call l0458
or a
jp nz,ErrorEXOS
ret
a címkéket már én írtam hozzá (nem a disassembler), hogy rájuk kereshessekjaj, azt mindig elfelejtem...És akkor ott vannak még a valahol a verembe dobjuk a címet, aztán majd ráRETelünk féle mókák is :-)
;SQRT(x : real) : real
;input: X in HLDE
;output SQRT(x) in HLDE
l0e67: ld a,h
or a
jp m,l06c4 ;if X<0 then Maths Call Error
ret z ;if X=0 then result=0 and return
ld (l150f),de
ld (l150d),hl ;save X to memory
sra d ;divide exponent by 2 (X0 in HLDE)
ld b,4
l0e78: push bc
push hl
push de ;Xn to stack
ld bc,(l150d)
push bc
ld bc,(l150f)
push bc ;X to stack
call l0acd ;X / Xn
call l09a1 ;+ Xn
dec d ;dec exponent (divide by 2)
pop bc
djnz l0e78
l0e8f: ret
most már kicsit legalább világos, hogy is működik... :-)Érthetetlen egyébként, hogy a Spectrum-os ismertető is értékelhetetlen, mintha a HiSoft titkolni akarta volna, mit is tud a termékük...Szerintem a Spectrum-os ismertető (http://www.nascomhomepage.com/lang/Hpascal.txt) teljesen jó!
Még egy fejezet lesz még az ismertetőben, az 1.2-es verzió őjdonságairól!
Szerintem a Spectrum-os ismertető (http://www.nascomhomepage.com/lang/Hpascal.txt) teljesen jó!Hát, én pl. azokon a "folyamatábrákon" annyira nem igazodok ki... :oops:
A linken valami egészen más jön be... :smt017Jaj, ez a régi hiba amit még nem javított ki MrPrise :cry:
A szkenneltben talán jobban kivehetőek az ábrák. (http://ftp://ftp.worldofspectrum.org/pub/sinclair/games-info/h/HiSoftPascal4.pdf)Én a scannelt-tel próbálkoztam, de azt sem értettem... :oops:
azok a szavak, amiket tokenizál fordítás közben, azok már nagybetűvel lesznek kiírva listázáskor, így kicsit vegyes lesz a kód kinézete, de ez a CPC-nél is így van:A writeln-t akkor nem tokenizálja?
A writeln-t akkor nem tokenizálja?Csak a PROGRAM, DIV, CONST, PROCEDURE, FUNCTION, NOT, OR, AND, MOD, VAR, OF, TO, DOWNTO, THEN, UNTIL, END, DO, ELSE, REPEAT, CASE, WHILE, FOR, IF, BEGIN, WITH, GOTO, SET, ARRAY, FORWARD, RECORD, TYPE, IN, LABEL, NIL, PACKED szavakat tokenizálja.
a REAL számok csak 4 byte-on vannak tárolva, a TP-ben pedig 6 byte-onÚjabb összehasonlító preview, a Povi által mondottak alátámasztására (elég durva, érdemes összevetni!):
gyorsabb, de nem olyan pontos... :-)
persze, hogy gyorsabb, mert a REAL számok csak 4 byte-on vannak tárolva, a TP-ben pedig 6 byte-onegyébként érdekes a HP lebegőpontos számformátuma...
gyorsabb, de nem olyan pontos... :-)
Forráskódok:István!
(Attachment)
(Attachment)
(Attachment)
(Attachment)
(Attachment)
adc a,d
sub e
ld d,a
sorokat el is hagyhatom?
Viszont a drawpixel rutinodat felhasználnám, ha nem gondNem gond. :)
Ugye jól látom, hogy a pixelrajzoló rutinban, ha a pixelTable-t xxx0h címre rakom, akkor azIgen. Ez a rutin nem igazán optimalizált, mivel elsősorban a Mandelbrot programokhoz készült, ahol a futásidő nagy részét a számítások teszik ki. :oops: Eredetileg dithert is tartalmazott, amit a BASIC változat "emulációjához" töröltem. A szorzás helyett is lehetne például táblázat a cím számításánál. A korábbi fraktál programokban használt 2 színű rutinok gyorsabb megoldást alkalmaztak a rajzolási pozíció pixelenkénti mozgatásra (egy struktúrában tárolták az aktuális koordinátákat, címet, és pixel maszkot, így a következő pixel rajzolása egyszerű és gyors inline kóddal megoldható volt).
Code: [Select]Code: [Select]adc a,d
sorokat el is hagyhatom?
sub e
ld d,a
A szorzás helyett is lehetne például táblázat a cím számításánál.Ja, ja, azt a részt én át is írtam úgy, hogy összeadásokból meg van a 80*Y, úgy is fix szélességhez kéne.
LD HL,Y
LD DE,HL
ADD HL,HL ;HL = Y * 2
ADD HL,HL ;HL = Y * 4
ADD HL,DE ;HL = Y * 5
ADD HL,HL ;HL = Y * 10
ADD HL,HL ;HL = Y * 20
ADD HL,HL ;HL = Y * 40
ADD HL,HL ;HL = Y * 80
vajon van ennél is gyorsabb módszer?procedure PutPixel(x,y,color : integer);
begin
inline(#26,#00) {ld h,0};
inline(#dd,#6e,#04) {ld l,(ix+4)};
inline(#54,#5d) {ld de,hl};
inline(#29,#29,#19,#29);
inline(#29,#29,#29) {hl=hl*80};
inline(#dd,#5e,#06) {ld e,(ix+6)};
inline(#cb,#3b) {srl e};
inline(#9f) {sbc a,a};
inline(#ee,#aa) {xor 0aah};
inline(#19) {add hl,de};
inline(#cb,#fc) {set 7,h};
inline(#cb,#f4) {set 6,h};
inline(#4f) {ld c,a};
inline(#2f) {cpl};
inline(#47) {ld b,a};
inline(#dd,#7e,#02) {ld a,(ix+2)};
inline(#e6,#0f) {and 0fh};
inline(#16,#bf) {ld d,high(pixeltable)};
inline(#5f) {ld e,a};
inline(#1a) {ld a,(de)};
inline(#a1) {and c};
inline(#4f) {ld c,a};
inline(#7e) {ld a,(hl)};
inline(#a0) {and b};
inline(#b1) {or c};
inline(#77) {ld (hl),a};
end;
végül ez lett a pixelrajzoló rutinEz hova rajzol (melyik csatornára)?
(egyelőre csak LDIR-rel - kíváncsi vagíok, mennyivel lesz gyorsabb a veremből törlés)EXOS 2.3-ban hasonlítsd össze a normál gyors tesztet (PUSH-os), és a Slow tesztet (LDIR-es), ebből sejthető :-)
EXOS 2.3-ban hasonlítsd össze a normál gyors tesztet (PUSH-os), és a Slow tesztet (LDIR-es), ebből sejthető :-)közben megcsináltam, majdnem 3,5-szer gyorsabb :-)
közben megcsináltam, majdnem 3,5-szer gyorsabb :-)Mennyi PUSH van a ciklusban? Minél több annál gyorsabb :-) persze annál több helyet foglal.
Mennyi PUSH van a ciklusban? Minél több annál gyorsabb :-) persze annál több helyet foglal.40 :-)
CopyMem(#c000,10);
{a következő 10 byte-ot másolja a 0c00h címre}
inline(0,1,2,3,4,5,6,7,8,9);
{itt folytatódik a program}
writeln('Sikerült!');
így már elegánsan be lehet POKE-olni bármilyen adatot...meg a hp-t, amivel le lehet fordítani :-)Ez már késznek számít, kirakható?
Újabb összehasonlító program. 1.1-hez van, tehát van forrásprogram is.Messze van ez még az 50 FPS-től!!! :mrgreen:
Ez már késznek számít, kirakható?Egy program sosincs kész... :-)
Messze van ez még az 50 FPS-től!!! :mrgreen:A tendencia viszont afelé halad... :)
De persze, kirakhatod, legfeljebb ha belenyúlok még, akkor azt majd v1.3-nak hívjuk :-)A SetVar benne van? Ha még az nincs, azt rakd bele légy szíves, az azért hiányzik bele.
A SetVar benne van? Ha még az nincs, azt rakd bele légy szíves, az azért hiányzik bele.ebben, amit innét lehet letölteni, már benne van
.ROM verzió majd lesz belőle? Cartridge-be kellene rakni. :oops:megpróbálom...
Tényleg, az kiderült, miért akad össze a HEASS-al? Mással remélem nem.
simán lehetne helyette egy PUSH IX, majd POP DEAkkor esetleg át is írhatnád :-)
ebben, amit innét lehet letölteni, már benne vanEbben a verzióban végül mi van benne, és mi nincs? :oops:
a LOCK_KEY változót nem állítja induláskor, helyette a keretet állítja feketére
Ebben a verzióban végül mi van benne, és mi nincs? :oops:a PAGE parancs javítva lett (képernyőre chr(26)-ot küld, nyomtatóra chr(12)-t.
Össze kellene gyűjteni, hogy lehessen dokumentálni.
Mostanára egyébként egész jól megszoktam, hogy mindent nagybetűvel kell írni... :ds_icon_cheesygrin:monjduk én notepad++-ban írom a forrásokat, a kisbetűs forrást könnyebb olvasni, pihentetőbb a szemnek (szerintem)
Ma beírtam valamit a TP-be sorszámmal és nagybetűvel. Aztán meg hirtelen nem értettem, miért nem fordítja le... :oops:
és még van egy csomó minden, amit még meg kéne csinálni... :oops:Akkor még ne rakjam ki? ;-)
A GotoXY, ClrScr, Write és WriteLn eljárások érvényességét (hogy melyik csatornán hajtsa végre az adott feladatot) a 0328h címen lévő bájttal lehet állítani (alapeset: 121, ezt a program végén vissza kell állítani, ha átállítottuk).Ez szerintem működik az 1.1-ben is(?)
Az jutott még eszembe, hogy a nyomtatóváltásra nem lehet valami mást kitalálni, mint a CHR(16)? Az escape-szekvenciák írásakor ez ugyanis probléma. (Esetleg egy "hangos" unit készítésekor...)szerintem nem kéne átállítani, úgy se találunk olyan karaktert, amit semmilyen escape szekvencia se használ...
var ch : char;
begin
repeat
ch := inch;
if ch='a' then valami1;
if ch='b' then valami2;
.
.
.
until ch=chr(27);
Bocs, igen a KeyPressed-re gondolok. :oops: Az nem törli a puffert, az Inch igen.
program a;
var ch : char;
function KeyPressed : boolean;
begin
ra:=chr(105);
exos(9);
if rc=chr(0) then keypressed:=true else keypressed:=false;
end;
function ReadKey : char;
begin
ra:=chr(105);
exos(5);
ReadKey:=rb;
end;
begin
writeln('Billentyu lenyomasra varok...');
repeat until keypressed;
writeln('Sikerult!');
ch:=readkey;
writeln('A chr(',ord(ch),')-t nyomtad le.');
end.
persze inline-okkal még lehet gyorsítani (az olvashatóság rovására... :-) );INCH function
;input: -
;output: pressed key ascii code in A
; if no key pressed, then return with A=0
l035c: push bc
push de
ld a,105
exos 9 ;chan. read status
or a
jp nz,ErrorEXOS
ld a,c
or a
pop de
pop bc
ld a,00h
ret nz
l036d: push bc
push de
ld a,105
exos 5 ;read a char from keyboard
or a
jp nz,ErrorEXOS
ld a,b
pop de
pop bc
ret
és ugyanez így nézne ki Pascal-ban:function inch : char;
begin
if KeyPressed then inch:=ReadKey else inch:=chr(0);
end;
Találtam egy bugot a HP-ben, már az 1.1-ben is benne van, nem az újba került bele.arra gondolsz, hogy a 45. sor környékén kifagy a fordítás??? :-D
Az alábbi programot be kell tölteni, a többi adja magát...
arra gondolsz, hogy a 45. sor környékén kifagy a fordítás??? :-DFordítani sem kell, csak listázni. Valahogy az egymásba ágyazott IF-ekkel lehet a gond, ami azért elég nagy gond... :shock:
67c1: dw 44
db 6 ;6 darab szóköz
db 097h ;"IF"
db " c=0 "
db 08eh ;"THEN"
db " jelez:=1"
db 13
67d5: dw 45
db 13 ;13 darab szóköz -> ezt hiszi sor végének
67d8: dw 46 ;ezért már rögtön a 46. sor jön
db 6 ;6 darab szóköz
db 090h ;"END"
db 13
úgy látszik, babonás, nem szereti a 13 db szóközt a sor elején!!!! :-)Úgy látszik Ep-n a 13-as számra működik a babona, fügetlenül attól, hogy HiSoft, vagy IS termékről van szó... :ds_icon_cheesygrin:
közben megnéztem a CPC verzión, és ott nem akad ki (ugyanígy tárolja a programot a memóriában), szóval megpróbálom kivadászni a javított kódot belőle...kész is van :-)
Még annyit beleírnék, hogy a kisbetűs írás miatt, megszűnt a 1.1-es verzió "case sensitive" tulajdonsága. Vagyis az eredeti verzióban a "valami" és a "VALAMI" nevű változók két külön változóként lettek deklarálva. Ez most nem érvényes, azonosnak számít a kettő, és a később deklaráltat fogja használni.Ja, és a funkcióbillentyűk nem működnek. Azt miért kellett kivenni?
működnekAmit most letöltöttem, abban nem működnek. :oops:
azt egy köztes verzióból vettem ki, amelyikben benne voltak a grafikus parancsok
Ja és eddig kihagytam az S direktívát. Az, ha jól tévedek az eljáráshívásoknál történő verem túlcsorulás-ellenőrzést kapcsolja ki?igen
;if {$S+ } then this part is copied
; to the beginning of PROCEDURE or FUNCTION
; to check stack overflow
l408c: db 8
ld de,(l1501)
add hl,de
call nc,l0693 ;error: "Out of RAM"
Amit most letöltöttem, abban nem működnek. :oops:öööö, tényleg
igenAkkor ez a direktíva még gyorsít elvileg a FRACTALS.PAS programon. :twisted:
ha be van kapcsolva (az az alapeset), akkor ezt még bemásolja az eljárások és függvények kezdéséhez:Code: [Select];if {$S+ } then this part is copied
; to the beginning of PROCEDURE or FUNCTION
; to check stack overflow
l408c: db 8
ld de,(l1501)
add hl,de
call nc,l0693 ;error: "Out of RAM"
Akkor ez a direktíva még gyorsít elvileg a FRACTALS.PAS programon. :twisted:ha ki van kapcsolva, akkor gyorsít.
A kódban, amit bemásoltál, vannak L betűk. Az elírás, vagy ez jó így? Én hexa számnak nézném...
Zozóét nem ismerem.Itt (http://www.ep128.hu/Ep_Util/Prg/Util.rar) letölthető (ORAJEL.BAS)
pontosan mit kéne csinálni? nem használtam még a FILE-tSzerintem nagyon hasznos bővítés (lást itt (http://www.ep128.hu/Ep_Util/Pack.htm), kár, hogy nem vállt "ipari szabvánnyá".
azt tudom, mire való, csak nem tudom, hogy lehet kiszedni a választott fájlnevet - hogy adja vissza a bővítő azt, amire rákattintunk a listából?0. lapon kell 256 bájtos puffer.
Van itt valaki, aki nullánál többször próbálkozott zenekészítéssel BASIC-ből?Szipucsu :-)
Szipucsu :-)Igen, rá gondoltam. :ds_icon_cheesygrin:
Van itt valaki, aki nullánál többször próbálkozott zenekészítéssel BASIC-ből?Az hogy lehet, hogy Zozo előbb válaszolt a kérdésre, mint hogy Laci feltette volna? Ha van időgép, engem is érdekelne.
Van itt valaki, aki nullánál többször próbálkozott zenekészítéssel BASIC-ből?Ezeket megnyitni se tudom. Valamennyire elolvasgatom, amit a pascal topikba írtok, de ezek a PAS, stb. kiterjesztések nekem ismeretlenek.
Hogy lehetne ezt használhatóbbá tenni, van esetleg tipp / javaslat?
Valami gond lenne a fórummal?Nincs, Zozo túl gyorsan válaszolt, pedig szinte azonnal töröltem a hozzászólást és javított melléklettel visszaraktam...
ezek a PAS, stb. kiterjesztések nekem ismeretlenek.Sima szöveges állományok, notepad-dal is meg tudod nyitni.
Gondolom ra-ban lesz a hibakód (?).Igen.
Milyen a sebesség?Picit más mint BASIC-ban :-D
Szipucsu ötletét kellene továbbfejleszteni.Vagy Endiét. :D Scrollozó game. Esetleg a kettőt összekombinálva egyetlen játékká.
Nekem gyanús egyébként, hogy jóval előbb kell lenyomni a szóközt a bombázáshoz, tehát kb. 2-3 házzal már előtte nyomva kell tartani.
Nem lehet, hogy "csoda USB-s" billentyűzetet használsz, aminek nagy a késleltetése?PC-t használok. Elvileg ahogy megnyomom a gombot (pl. gépelésnél), azonnal van hatása, nem késik.
Kezd tetszeni az attribútum üzemmód. Most, hogy már kezdem érteni... ;-)jó lett :) ,mennyivel gyorsabb, mint a basic verzió?
Ez már ki van egészítve néhány grafikai elemmel. "Cheat" 'A'-'E' billentyűkkel.Nem rossz!
A csúcsos háztetődet ellopom szerintem a basic változatomba.Ha belenézel a PAS-ba, szerintem elég egyértelmű :-)
Illetve nem lopom ki sem a háztetőt, sem a másik repcsi/bomba alakját, mert nem tudom. Ezeknek a set character formátumát fel tudnád tenni?
Nem rossz!
Az a két fajta repcsi/bomba változat van? Azokat te tervezted?
A csúcsos háztetődet ellopom szerintem a basic változatomba.
Illetve nem lopom ki sem a háztetőt, sem a másik repcsi/bomba alakját, mert nem tudom. Ezeknek a set character formátumát fel tudnád tenni?
Ezeknek a set character formátumát fel tudnád tenni?
Szintén GRAFON, a második és harmadik paraméter (mód és színmód) mely értékei mit jelentenek?
Valamint az X- és Y-méretet pixelekben kell megadni?
GRAFON(101,1,3,40,20);
DISPLAY(101,1,1,20);
Más dolog: a Hisoft Pascal kézikönyvében ez áll a fordításról: "Lefordítja a forrásszöveget, de nem futtatható formában"
Hogy érti, hogy nem futtatható formában? És hogy lehet akkor rendes futtatható állományt létrehozni?
Találtam egy súlyos bug-ot a HiSoft Pascalban.
Az < összehasonlító operátor hibás eredményt ad, ha a két oldal különbsége nagyobb, mint 32768.
Tehát:
-1 < 32767 = TRUE
-2 < 32767 = FALSE
Az > összehasonlító operátor hibás eredményt ad, ha a két oldal különbsége nagyobb, mint 32767.
Tehát:
0 > 32767 = FALSE
-1 > 32767 = TRUE
kis hack:
integer (16 bit, előjeles) szám kiiratása word-ként (előjel nélkül)
prímszámok 65535-ig
Ez jól hangzik.én kicsi vagyok ahhoz... :-) Meg ahhoz full fordítható disassembly kéne, ami nekem nincs
WORD típust bele lehet "belehegeszteni" a Hisoft-Pascalba?
Ez elvileg nem bug, benne van az eredeti doksiban is. Meg az enyémben is :ds_icon_cheesygrin:Hm... Tényleg!
én kicsi vagyok ahhoz... :-) Meg ahhoz full fordítható disassembly kéne, ami nekem nincs
a {$O-} -val ki lehet kapcsolnia túlcsordulás figyelését, tehát nem fog kiakadni a 32767 + 1 -re
de azt könnyű megoldani, hogy word-ként írja ki az integer-t, két poke az egész
Mi az a két POKE? Beleraknám az ismertetőbe.
poke(#05be, chr(#18));
poke(#05e7, chr(#18));
visszaállítás: poke(#05be, chr(#28));
poke(#05e7, chr(#28));
az első poke csak akkor kell, ha formázott kiírást akarunk (vezető space-ekkel), különben elhagyható.Konstansokkal viszont nem lehet összehasonlítást végezni, ha jól látom. Ez a két POKE csak a kiírással van hatással?Lehet, ha hexa-ban írod be.
Endi Tunnel Demoja Pascalban
hát igen, nem sokkal gyorsabb
Valószínűleg az EXOS rajzoló rutinjai korlátozzák a sebességet. Nagyobb gyorsulás elsősorban olyan programoknál lehetséges, amelyek sok egyszerű műveletet végeznek egész számokkal.
hát igen, nem sokkal gyorsabbGraphca módban írt játékok jó gyorsak lennének.
amúgy mi lenne sokkal gyorsabb ep-n ha pascalban lenne írva?
ah mekkora király lett volna még egy gép, amíg az egyik renderel :DVagy a multitask SymbOS rendszer. Bár abban nem tudom, programozni lehet-e valamilyen nyelven.
program sieve2;
var
prime : array[0..32767] of boolean;
n, index : integer;
begin
{$A-}
{$O-}
poke(#38, chr(#c9));
for n := 1 to 32767 do
prime[n] := true;
for n := 1 to 127 do begin
if prime[n] then begin
index := 2 * (n * n + n);
repeat
prime[index] := false;
index := index + n + n + 1;
until (hi(index) > chr(#7f));
end;
end;
poke(#0328, chr(120));
poke(#05be, chr(#18));
poke(#05e7, chr(#18));
write(chr(27),'S', 2 : 8);
for n := 1 to 32767 do
if prime[n] then write(n + n + 1 : 8);
writeln;
poke(#0328, chr(121));
poke(#05be, chr(#28));
poke(#05e7, chr(#28));
poke(#38, chr(#f5));
end.
Pixelenkénti sin() nélkül:
Asm verzió (lehetne ditherelt is, a korábban már használt kóddal egyszerűen megoldható):
(Attachment Link)
ez is exossal írja a pixeleket?
Endi Tunnel Demoja Pascalban
Az megoldható, hogy Pascal program asm rajzoló rutinokat használjon?Van INLINE. (http://ep128.hu/Ep_Util/Hisoft_Pascal.htm#10_4)
Van INLINE. (http://ep128.hu/Ep_Util/Hisoft_Pascal.htm#10_4)
Ez így meglehetősen korlátozottnak tűnik. :oops: Esetleg ha már lefordított asm rutinokat lehetne betölteni fix címre (ahol a Pascal program nem írja felül) és onnan hívni, az használhatóbb lenne. PC-s C fordítóknál (SDCC és z88dk) viszonylag könnyen megoldható a már meglevő EP-s betöltő módosításával, de azokat nem használja senki, a HiSoft Pascal "bővítésének" több értelme lenne.Az Alter paranccsal a Compiler és a Translate stack-et átírva (default értéke 0xffff) a megadott érték fölött memóriacímeket nem fogja bántani a Pascal.
Mi a különbség a Plot és a PlotC között? Plot-nál paraméterben nincs csatorna. Ha jól látom, az i paraméter a csatornaszám, de az ink-nél csak i paraméter van(?)
Az Rnd8Init, Rnd8, UpdateLpt mit csinál?
A VSyncWait-ból kérhetek INLINE-os verziót, amit bele lehetne rakni a GRAPH.HPU-ba? :oops:
A C9 (RET) nem kell a végén, javítottam. :oops:
Ha a paraméter 0, mennyit vár? Akkor a leglassabb...
Úgy tűnik, hogy a sebesség így is változik a különböző órajeleken, ez lehetséges?
A GRAPH16.HPU 16 színű 40x20-as méretű 101-es csatornát használ?
Nem semmi a kőrrajzoló rutin, pedig az EP körrajzoló rutinja alapból is gyorsnak számított. :)
Az UpdateLPT mit csinál?
Néhány újabb eljárás (még fejlesztés alatt):
Ez az egérkezelés gyorsabb, mint ami itt (http://ep128.hu/Ep_Hardware/Ep_EnterMice.htm) van?
Majd beraknám a Hisoft Pascal ismertetőbe ha kész, bár az új sprite és egérkezelő utasítások annyira már nem egyértelműek nekem.
A graph16.hpu fejlesztése befejeződött?
Egyelőre igen, az esetleges hibák vagy nem jól optimalizált kód lehetőségétől eltekintve. :oops:szerintem tuti, ha valaki esetleg C-ben szeretne programot irni
Szerk.: korábban elkezdtem C (SDCC) változat készítését is, de nem tudom, érdemes-e befejezni.
István! Majd itt (http://ep128.hu/Ep_Util/Hisoft_Pascal.htm#13_5) a GRAPH16.HPU-ra vonatkozó részt? Pl. a SpriteNew(b,p) működése nekem nem egyértelmű.
szerintem tuti, ha valaki esetleg C-ben szeretne programot irni
talán BASIC verziónak lenne a legtöbb értelme, bár azt nem tudom, hogyan lehetne jól megoldani.BASIC utasítás bővítés?
"win7 alatt már nem fut nekem"
Nálam fut 64 biten. Jó kis játék lehetett volna ebből. :D
hú, nem tudnál felvenni videót?
nekem is win7 64 bit van. simán csak elindítod és fut?
Igen. Bár az Avast sz%rakodott, hogy ismeretlen file, de kikapcsoltam. :)
ja hát ez előfordul :)
de biztos nem vírusos
Ilyen inline-os soroknál honnan tudja, hogy a "C" paramétert honnan vegye? Több eljárást nézegetve a #02 lett gyanús, mert több eljárásban is előfordult. Ez mutatja, hogy pl. valami után 2 bájttal található az érték?
A GRAPH16.HPU-nál a képernyő egyszerűen a 49152 (-16384) címtől kezdődően érhető el, mindig be van lapozva.Érdemes ilyen esetekben hexa formában megadni a forráskódban a címeket, és akkor nem kell negatív számokkal elcsúfítani a kódot.
POKE(#c000,value);
Sziasztok!
Megint segítséget szeretnék kérni. Basic-ben a keret színét be lehet állítani a SPOKE 255,16352,n paranccsal. Pascalban miért nem működik az alábbi program?
Program Border;
BEGIN
Poke(#BFE0,Chr(73));
END.
#3FE0-val sem működik, illetve próbáltam Out paranccsal belapozni az FF szegmenst, de úgy sem csinál semmit.
Mert nem tudom, hogy kell. :) Meg majd a click-et és a statust is ki szeretném kapcsolni, és ezek nagyjából egy kupacban vannak. Annyit még felfogok, hogy a memóriában átírok valamit, de a hexa inline parancsokat nem értem.
A funkcióhívásokról itt (http://ep128.hu/Ep_Konyv/Gepi_kod.htm#19) lehet közérthetően olvasni. Ebből még én is - többé-kevésbé - megértem... :oops:
A az ep128.hu-ról letölthető Hisoft Pascal-ban van grafikai rutingyűjtemény (több is). Ezek használatáról itt (http://ep128.hu/Ep_Util/Hisoft_Pascal.htm#13_5) lehet olvasni
Sziasztok!
Kezdő szintű Pascal-os kérdést szeretnék feltenni, ugyanis megint elakadtam az ismerkedéssel. Még mindig a videomemóriában szeretnék turkálni poke-kal, de egyelőre egy árva pixelt sem sikerült megjelenítenem, mert szinte mindig fagyás lesz a dolog vége. A 255-ös (meg majd a 254-es) lapra szeretnék írni, amiket úgy gondolom, be kellene lapozni valahová. Ha egy kis programmal megnézem, akkor alapból a 248, 249, 250 és 251 szegmenseket látom belapozva, azaz a Pascal elfoglalja mind a négy lapot? A korábbi tanácsra az Alter paranccsal próbálkoztam, de nem igazán értem, hogy mit kéne változtatni és mire. A stack-ek értéke alapból 0000h, ezek közül kellene az egyiket a könyv által javasolt C000h-ra változtatni, és ez után használhatnám a 3-as lapot? Ezt a Pascal minden betöltése után be kell állítani?
Ha jól értem, amit olvastam, ha egy szegmenst használni szeretnék, azt le kell foglalni az EXOS által. Vajon ha egy videolapot nyitok, akkor belapozhatom egyből az adott szegmenst, vagy még le is kell előtte valahogy foglalni?
Magasszintű nyelvekhez szokva nehéz felfogni az Enterprise memóriakezelését. :(
Olyan játékot szeretnék csinálni, ami egy program- és egy képfájlból állA képfájlt legegyszerűbben a TIN paranccsal tudod betölteni:
tin('game.scr', #c000);
Nem is betöltéskor van baj, hanem úgy látszik, hogy fordításkor. A screenshot-on látszik: az eredeti sor ez volt: "Pic.XByte := 84;", de a 4-est lenyúlta. Ráadásul a kettes hiba pontosvessző hiányára utal, ami ott van, legalábbis a képernyőn látszik. Utána átírom a sort, listázáskor még helyesen jelenik meg, de fordításkor megint eltűnik egy karakter. Parajelenséggel állunk szemben, tárcsázom a szellemirtókat.Nem lehet, hogy az a baj, hogy pont van a változó nevében?
Hmmm, nagybetűs szavakkal az 1.2-es is jól fordít. Nem értem...Lásd HiSoft Pascal leírás (http://www.ep128.hu/Ep_Util/Hisoft_Pascal.htm#3_2) 3.2 pont utolsó mondata!
No de az az 1.1-re vonatkozik. Az 1.2-nek ott a 14. fejezet, ami szerint megengedett a kisbetű is, csak listázáskor nagybetűsként jelenik meg. Lehet, hogy ezen csúszik el a dolog és emiatt tűnik el egy-egy karakter? Legyen akkor nagybetű, ha így stabilan fordít.Povi fel szokott itt tűnni időnként. Lehet, hogy vele kellene egy kis eszmecserét megejtened.
Ep32 emut használsz?Az milyen betegség? :evil:
Ep32 emut használsz?
Ha csak EP32-n hibás, akkor érdekes lehet, hogy mi okozza az eltérést.Játékok közül is volt olyan ami hibásan futott rajta, ha jól emlékszem pl a Tomahawk.
Povi fel szokott itt tűnni időnként. Lehet, hogy vele kellene egy kis eszmecserét megejtened.A kisbetűs foglalt név írásnak nem kéne ilyen hibát okoznia, lehet, hogy akkor tényleg emu probléma van a háttérben?
Játékok közül is volt olyan ami hibásan futott rajta, ha jól emlékszem pl a Tomahawk.
Sziasztok!
Rá lehet valahogy bírni a fordítót, hogy a readln után ne várjon még egy enterig?
READLN;
READ(valtozo);
Ha tudom a kép vízszintes méretét, akkor lehet gyorsítani azzal, hogy a PEEK-nek tömb típust adok meg, pl. 9 bájtnyi széles képhez így jó: POKE(VOfs+#C000,PEEK(Addr0,ARRAY[1..9] OF CHAR)); viszont ez nem túl rugalmas, mert csak konstanst fogad el.
Sziasztok!Nem teszteltem, de elvileg ennek jónak kell lennie:
Azt szeretném kérdezni, hogy Pascalban van lehetőség gyorsan átmásolni bizonyos mennyiségű adatot a memória egyik részéről a másikra?
Köszönöm!
procedure memcpy(dest, source, count : integer)
begin
inline(#dd,#46,#03) { ld b,(ix+3) };
inline(#dd,#4e,#02) { ld c,(ix+2) };
inline(#dd,#66,#05) { ld h,(ix+5) };
inline(#dd,#6e,#04) { ld l,(ix+4) };
inline(#dd,#56,#07) { ld d,(ix+7) };
inline(#dd,#5e,#06) { ld e,(ix+6) };
inline(#ed,#b0) { ldir};
end
procedure Move(source, dest, count : integer)
begin
inline(#dd,#46,#03) { ld b,(ix+3) };
inline(#dd,#4e,#02) { ld c,(ix+2) };
inline(#dd,#56,#05) { ld d,(ix+5) };
inline(#dd,#5e,#04) { ld e,(ix+4) };
inline(#dd,#66,#07) { ld h,(ix+7) };
inline(#dd,#6e,#06) { ld l,(ix+6) };
inline(#ed,#b0) { ldir};
end
Ó, köszönöm! De szuper! Ki fogom próbálni, bár most más akadályba ütköztem. :)
Utánanéztem, szóval ez az LDIR ciklusban másol.
Most ott akadtam el, hogy futtatáskor az "out of RAM" üzenet jelenik meg. Fordítás előtt a stack-eket C000-ra állítom, hogy az utolsó lapra szabadon lapozhassak. Az EXOS-tól elkérem az FC-FD-FE szegmenseket (ezeket dugig töltöm, a többit felszabadítom), maga a forrás program pedig kb. 10K eddig. Nagyjából 3 KB-nyi méretű tömböt használok, ezeket tervezem áttenni a heap-re, hátha így felszabadul némi memória. Azt találtam még ki, hogy átállítom az emulátort 160 KB-nyi RAM-ra azzal a céllal, hogy hátha így elfér minden és lehet fordítani, tesztelni, majd a kész, lefordított program Pascal környezet nélkül talán belefér 128K RAM-ba. Vajon sok helyet foglalhat a fordító és az editorban a forrásprogram? Ezek felszabadulnak, ha a .COM programot futtatom? Mindenképp cél, hogy alap, gyári 128K-s Enterprise-on fusson, mindenféle tuning nélkül.
Nagyjából 3 KB-nyi méretű tömböt használok, ezeket tervezem áttenni a heap-re, hátha így felszabadul némi memória.Ezt hogy tervezed? Sejtem, hogy mit akarsz, csak kíváncsi vagyok, hogyan.
Az LDIR-nél arra azért figyelj, hogy mi van akkor, ha átfedésben van a célterület a forrással, az nincs lekezelve :-)
PROGRAM HIBA;
VAR TMP,RA: CHAR;
I:INTEGER;
BEGIN
RA:=CHR(101);
TMP:=EXOS(3);
IF RA<>CHR(0) THEN BEGIN
RDE:=#14AE;
TMP:=EXOS(28);
FOR I:=#14AE+1 TO #14AE+ORD(PEEK(#14AE,CHAR)) DO
WRITE(PEEK(I,CHAR));
WRITELN('.')
END
END.
A memória egy adott területéről (hossz-byte-tal az elején) egy szövegfüzért kiírni van valami egyszerűbb módszer ehelyett:Code: [Select]PROGRAM HIBA;
VAR TMP,RA: CHAR;
I:INTEGER;
BEGIN
RA:=CHR(101);
TMP:=EXOS(3);
IF RA<>CHR(0) THEN BEGIN
RDE:=#14AE;
TMP:=EXOS(28);
FOR I:=#14AE+1 TO #14AE+ORD(PEEK(#14AE,CHAR)) DO
WRITE(PEEK(I,CHAR));
WRITELN('.')
END
END.
A PEEK hiába rugalmas, típusmegadásnál csak konstans fogad el...
POKE(£023F,CHR(£C9));
USER(£0231);
PROGRAM HIBA;
VAR TMP: CHAR;
I:INTEGER;
BEGIN
RA:=CHR(101);
TMP:=EXOS(3);
IF RA<>CHR(0) THEN BEGIN
RDE:=#14AE;
POKE(#023F,CHR(#C9));
USER(#0231);
POKE(#023F,CHR(#C3));
RA:=CHR(121);RDE:=#14AE+1;RBC:=ORD(PEEK(#14AE,CHAR));
TMP:=EXOS(8);
WRITELN('.')
END;
WRITELN('Vege.')
END.
Jól értem, így kellene működnie:
Ez "csatorna nincs nyitva" hibaüzenetre is a fentit adja.
PROGRAM HIBA;
VAR TMP: CHAR;
I:INTEGER;
BEGIN
RA:=CHR(101);
EXOS(3);
IF RA<>CHR(0) THEN BEGIN
RDE:=#14AE;
EXOS(28);
RA:=CHR(121);RDE:=#14AF;RBC:=ORD(PEEK(#14AE,CHAR));
EXOS(8);
WRITELN('.')
END;
WRITELN('Vege.')
END.
Valami bugot találhattunk...hááát
A program lefut, de pl a W parancsra lefagy a PASCAL.
az 14AE területre nem szerencsés írni