Welcome, Guest. Please login or register.


Author Topic: Elakadtam IS-Basic Programozás közben (Read 10236 times)

Offline Tuby128

  • EP addict
  • *
  • Posts: 1449
  • Country: hu
Re: Elakadtam IS-Basic Programozás közben
« Reply #30 on: 2024.January.05. 20:51:04 »
Mondjuk csinálhatnám, hogy nem értéket, hanem címet adok át és poke-kal kiolvasom. De hol van szabad hely?

Offline ergoGnomik

  • EP addict
  • *
  • Posts: 1299
  • Country: hu
  • Stray cat from Commodore alley
Re: Elakadtam IS-Basic Programozás közben
« Reply #31 on: 2024.January.06. 09:28:34 »
De hol van szabad hely?
A kódod mögött a foglaláskor megadott extra memóriaterületen?

Offline Tuby128

  • EP addict
  • *
  • Posts: 1449
  • Country: hu
Re: Elakadtam IS-Basic Programozás közben
« Reply #32 on: 2024.January.06. 14:37:05 »
A kódod mögött a foglaláskor megadott extra memóriaterületen?
Mi a kezdőcím?

Offline ergoGnomik

  • EP addict
  • *
  • Posts: 1299
  • Country: hu
  • Stray cat from Commodore alley
Re: Elakadtam IS-Basic Programozás közben
« Reply #33 on: 2024.January.06. 15:02:36 »
Mi a kezdőcím?
A Tippek és trükkök ENTERPRISE könyv 10-11. oldalán található memóriatérkép és IS-BASIC példaprogram alapján meg lehet határozni. Szerintem.

Offline Tuby128

  • EP addict
  • *
  • Posts: 1449
  • Country: hu
Re: Elakadtam IS-Basic Programozás közben
« Reply #34 on: 2024.January.06. 15:41:01 »
Megvan.
Csak nem beszél az allocate kulcsszóról.

Offline Tuby128

  • EP addict
  • *
  • Posts: 1449
  • Country: hu
Re: Elakadtam IS-Basic Programozás közben
« Reply #35 on: 2024.January.06. 15:49:40 »
Azt talaltam ki, hogy írok egy kamukódot helyfoglalónak, ami a "variables" lesz.
100 Allocate 100
110 code variables=hex$("00","00","00","00")
120 code a1=hex$("....  ! Ide jön a gépi kódom
130 poke variables+0=12
140 poke variables+1=55
150 poke variables+0=43
160 poke variables+1=44
170 call usr(a1,variables)  ! Átadom a variables címét, hogy tudja a gépi kód hol keresse, tárolja a változókat

Visszatérési értéket pedig a peek(variables+x) függvénnyel olvashatom ki.

Offline Ferro73

  • EP lover
  • *
  • Posts: 980
  • Country: hu
Re: Elakadtam IS-Basic Programozás közben
« Reply #36 on: 2024.January.06. 19:44:02 »
Azt talaltam ki, hogy írok egy kamukódot helyfoglalónak, ami a "variables" lesz.
100 Allocate 100
110 code variables=hex$("00","00","00","00")
120 code a1=hex$("....  ! Ide jön a gépi kódom
130 poke variables+0=12
140 poke variables+1=55
150 poke variables+0=43
160 poke variables+1=44
170 call usr(a1,variables)  ! Átadom a variables címét, hogy tudja a gépi kód hol keresse, tárolja a változókat

Visszatérési értéket pedig a peek(variables+x) függvénnyel olvashatom ki.
Code: [Select]
130 poke variables+0,12
140 poke variables+1,55
150 poke variables+0,43
160 poke variables+1,44
Így valahogy.
Ha jól emlékszem  call usr(a1,variables) ~ ->ld hl,variables -> call a1
« Last Edit: 2024.January.06. 19:54:14 by Ferro73 »

Offline ergoGnomik

  • EP addict
  • *
  • Posts: 1299
  • Country: hu
  • Stray cat from Commodore alley
Re: Elakadtam IS-Basic Programozás közben
« Reply #37 on: 2024.January.06. 20:48:45 »
Ez a POKE VARIABLES+0=12 forma nekem meglehetősen szokatlan. De az még inkább, hogy kétszer van +0 és +1. Így nem lesz az adatok fele felülírva?

Offline Zozosoft

  • Global Moderator
  • EP addict
  • *
  • Posts: 14739
  • Country: hu
    • http://enterprise.iko.hu/
Re: Elakadtam IS-Basic Programozás közben
« Reply #38 on: 2024.January.06. 20:50:14 »
Azt talaltam ki, hogy írok egy kamukódot helyfoglalónak, ami a "variables" lesz.
170 call usr(a1,variables)  ! Átadom a variables címét, hogy tudja a gépi kód hol keresse, tárolja a változókat
Ügyes, pont ezt akartam javasolni!
Ha aztán a kódban átrakod a variables-t az IX vagy IY-ba, akkor könnyedén tudsz hivatkozni ott is (IX), (IX+1), stb módon rájuk.

Offline Tuby128

  • EP addict
  • *
  • Posts: 1449
  • Country: hu
Re: Elakadtam IS-Basic Programozás közben
« Reply #39 on: 2024.January.07. 04:31:03 »
Már csak arra kellene rájönni, hogy egy kétbájtos integert hogyan hozok és viszek át gépi kódból basic-be. Mármint hogy nem 1 byte-ként kezelem, hanem 2 byte módon.

Ha a fenti megoldást használom több adat áthozására és átvitelére, akkor a 8 bites (1 byteos) számokkal kell dolgoznom, amiket aztán át kell alakítani 2 byte integerré.

let a=peek(variables+0) tartalmazza az alsó byte-ot
let b=peek(variables+1) tartalmazza a felső byte-ot

csinálhatnám, hogy
let c=a+(256*b), de attól félek, hogy a basic tényleg elvégzi a szorzást, és sokáig tart, nem pedig csak 8 bittel eltol.

 A másik dolog visszafelé BASIC->ASSEMBLY még nagyobb a probléma, mert 256-tal kell osztanom, és maradékos osztás kell. Ha csupa drága idő elmegy feleslegesen.

Nem úszom meg, deklarálni kell egy-két globális basic változót, amik integer számok, és dirketben férek hozzájuk:

Code: [Select]
100 ALLOCATE 100
110 LET A=256  ! azért 256. hogy a basic 2byte integerként kezelje
120 LET B=256
130 LET C=256
140 CODE P1=HEX$("....... kódom
150 = itt kiszámolom A címét valahogy =
160 CALL USR(p1,A-címe)
170 PRINT A
« Last Edit: 2024.January.07. 04:34:51 by Tuby128 »

Offline Tuby128

  • EP addict
  • *
  • Posts: 1449
  • Country: hu
Re: Elakadtam IS-Basic Programozás közben
« Reply #40 on: 2024.January.07. 04:44:49 »
Megtaláltam. Hát nagyon nem egyszerű a dolog.
Forrás Tippek és Trükkök könyv.
Quote
A program által lefoglalt tárterület után a változókat tárolja a számítógép. Ez a terület változó nagyságú, és kezdete is függ a program hosszától. Azt, hogy egy adott esetben ennek a területnek mik a határai, azt a rendszerváltozó terület megfelelő címeiről olvashatjuk ki (17. program).

1 PROGRAM "Var_TBL.bas"
100 ! valtozo tabla mamoriabeli helye, merete
110 LET A=2 ! kiserletezz ertekadasokkal
120 ! vizsgald a hatasat: DIM,DEF,A$
130 LET ELEJE=PEEK(566)+256*PEEK(567)
140 LET VEGE=PEEK(564)+256*PEEK(565)
150 PRINT "Valtozo tabla eleje: ";ELEJE
160 PRINT "Valtozo tabla vege: ";VEGE
170 PRINT "valtozo tabla altal foglalt:";VEGE-ELEJE

Ezen a területen a gyanútlan szemlélőnek kusza összevisszaságban helyezkednek el a bejegyzések, pedig logikája nyomon követhető. Nézzünk bele a változóterület tárolására szolgáló memóriaterületbe a 18. program segítségével.

1 PROGRAM "Szam.bas"
100 ! szamabrazolas
110 LET SAMU=1.2345678 ! ezt valtoztasd
120 LET M=PEEK(566)+256*PEEK(567)
130 ! M az elsonek bejegyzett valtozo tarolasi helye
140 LET H=PEEK(M+3) ! valtozonev hossza
150 PRINT M+2;PEEK(M+2),"adattipus jelzo"
160 PRINT M+3;H,"valtozonev hossza"
170 FOR V=M+4 TO M+H+3 ! nev kiiras
180   PRINT V;PEEK(V);CHR$(PEEK(V))
190 NEXT
200 FOR V=M+H+4 TO M+H+8
210   LET T=PEEK(V) ! tarolt ertek
220   LET E=INT(T/16) !BCD elso tag
230   LET M=MOD(T,16) ! BCD masodik tag
240   PRINT V;T,E;M
250 NEXT
260 PRINT V;PEEK(V),"hatvanykitevo"

A numerikus változók értékét változó táblában 5+1 byte-on tárolja a gép. Egész típusú - 10 0000x10 00 nagyságú számokat két byte-on hexadecimális alakban találhatjuk a memóriában és a hatványkitevő tárolására szolgáló 6 byte tartalma 127. A 9999-nél nagyobb egészeket és a törtszámokat a gép BCD alakban ábrázolja.
Hogyan néz ki egy decimális szám BCD alakban? A tízes számrendszerű szám egy helyi értékének ábrázolásához négy bit bőven elegendő, így lehetőség van arra, hogy nyolc biten (egy byte-on) két decimális számjegyet ábrázoljunk úgy, hogy az egyik (alacsonyabb helyi értékű) számjegyet binárisan a 0-3. biten, a másik a magasabb helyi értékű számjegyet pedig a 4-7. biten tároljuk.
Azaz 29DEC=0010 1001 BCD, igaz ez a szám a szokványos módon kiolvasva (hiszen PEEK-kel kiolvashatjuk) egészen más értéket reprezentál. Ezért kell tudni, hogy a kiolvasott érték BCD-ben van! Ez a számábrázolás-tárolás kissé pazarló, hiszen öt byte-on tízjegyű decimális szám ábrázolható, míg tisztán bináris (vagy hexadecimális) formában ugyanezen az 5 byte-on 2 * 749 *10^14 értékű a maximálisan ábrázolható szám. Ez a pazarlás a műveletek elvégzése során időben megtérül. A binárisan kódolt decimális rendszerben (BCD) a 10-es alapot megtartjuk, azaz a szomszédos számok egymásnak tízszeresei, de a számokat binárisan fejezzük ki.
Az elmondottak jobb megvilágítására, ill. a szerzett ismeret hasznosítására futtassuk le a 19. programot.

100 ! PEEK-el kiolvasott ertek visszaalakitasa
110 LET PROBA=1988.12 ! csak tort szamot
120 LET M=PEEK(566)+256*PEEK(567)
130 LET H=PEEK(M+3)
140 IF PEEK(M+H+9)=127 THEN 330
150 LET SZORZO=.0000000001
160 LET SUMMA=0
170 FOR V=M+H+4 TO M+H+8
180   LET T=PEEK(V)
190   LET E=MOD(T,16) ! BCD elso tag
200   LET SUMMA=SUMMA+E*SZORZO:LET SZORZO=SZORZO*10
210   LET M=INT(T/16) ! BCD masodik taz
220   LET SUMMA=SUMMA+M*SZORZO:LET SZORZO=SZORZO*10
230   PRINT T,M;E
240 NEXT
250 LET KI=PEEK(V)
260 LET S=(KI BAND 128)/128
270 LET KI=KI-64-128*S
280 IF S=1 THEN LET ELOJEL=-1
290 IF S=0 THEN LET ELOJEL=1
300 PRINT KI,"hatvanykiyevo"
310 PRINT ELOJEL*SUMMA*10^(KI+1)
320 END
330 PRINT "Ez egesz szam, erre mas szabaly igaz!"

A 9999-nél nagyobb egészeket [...] a gép (IS-BASIC) BCD alakban ábrázolja.
Ezen nagyon elszomorodtam. Es sokat bonyolít mindenen. :(

Offline Zozosoft

  • Global Moderator
  • EP addict
  • *
  • Posts: 14739
  • Country: hu
    • http://enterprise.iko.hu/
Re: Elakadtam IS-Basic Programozás közben
« Reply #41 on: 2024.January.07. 08:17:50 »
Esetleg használod a Plus-t, és abban van DOKE/DEEK (16 bites POKE/PEEK).


Offline Ferro73

  • EP lover
  • *
  • Posts: 980
  • Country: hu
Re: Elakadtam IS-Basic Programozás közben
« Reply #42 on: 2024.January.07. 10:15:07 »
Esetleg használod a Plus-t, és abban van DOKE/DEEK (16 bites POKE/PEEK).
Akkor bele kellene építeni a BASIC program elejébe egy ellenőrzőt ami nézi telepítve van a 'plus'.
Mert nem mindenki telepíti alapból.

Offline Ferro73

  • EP lover
  • *
  • Posts: 980
  • Country: hu
Re: Elakadtam IS-Basic Programozás közben
« Reply #43 on: 2024.January.07. 10:28:47 »
Már csak arra kellene rájönni, hogy egy kétbájtos integert hogyan hozok és viszek át gépi kódból basic-be. Mármint hogy nem 1 byte-ként kezelem, hanem 2 byte módon.


Ha jól emlékszem  BASIC

call usr(a1,65535)

ld hl,65535
call a1
ret

a1  kódod
...

Offline Ferro73

  • EP lover
  • *
  • Posts: 980
  • Country: hu
Re: Elakadtam IS-Basic Programozás közben
« Reply #44 on: 2024.January.07. 11:33:27 »


csinálhatnám, hogy
let c=a+(256*b), de attól félek, hogy a basic tényleg elvégzi a szorzást, és sokáig tart, nem pedig csak 8 bittel eltol.

Code: [Select]
100 ALLOCATE 100
110 LET A=256  ! azért 256. hogy a basic 2byte integerként kezelje
120 LET B=256
130 LET C=256
140 CODE P1=HEX$("....... kódom
150 = itt kiszámolom A címét valahogy =
160 CALL USR(p1,A-címe)
170 PRINT A

Miért kell ?
Code: [Select]
100 ALLOCATE 100
110 CODE RAM00=HEX$("0000")
120 CODE RAM02=HEX$("0000")
...
540 CODE P1=HEX$("....... kódom
550 LET CIM_RAM00=RAM00
555 LET CIM_RAM02=RAM02
660 CALL USR(p1,CIM_RAM00)
170  A=USR(RD_RAM,RAM00)
Annyi hogy A= -327xx és 32767 között lesz.
De szerintem van BASIC változó ami AA=xxx(a)   -327xx-32767 -> 0-65535 csinál.