Welcome, Guest. Please login or register.


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

Offline Ferro73

  • EP lover
  • *
  • Posts: 980
  • Country: hu
Re: Elakadtam IS-Basic Programozás közben
« Reply #45 on: 2024.January.07. 11:57:41 »
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.
Nem találtam de ha:
Code: [Select]
xxxx VALTOZO=USR(RD_RAM,RAM00)
xxxx IF VALTOZO<0 THEN VALTOZO=VALTOZO+65536
Már jó is.

Offline BruceTanner

  • EP lover
  • *
  • Posts: 607
  • Country: gb
Re: Elakadtam IS-Basic Programozás közben
« Reply #46 on: 2024.January.07. 14:49:35 »
IS-BASIC does the 32768 "trick" itself internally. Source code for PEEK():

Code: [Select]
;-----------------------------------------------------------------------------;
; FNPEEK = PEEK function.       ;
;       ;
;-----------------------------------------------------------------------------;


FNPEEK:: CALL @P_NUM ; Get address
CALL GET16ADR
LD L,(HL) ; Get value at this address
LDL:
PEEKRES: LD H,0 ; Set MSB to zero
RST OP
DEFB $LOADINT## ; Put result on stack, and return.
DEFB $END##
RET

GET16ADR: LD HL,32768
PUSH HL
RST OP
DEFB $LOADINT## ; Put 32768 on dtack
DEFB $FSUB## ; Subtract from address, and then FIX
DEFB $FIX## ;  to return value between -32768 and
DEFB $END## ;  +32767
POP DE ; DE = 32768
ADD HL,DE ; Adjust to get proper address
RET

Offline Tuby128

  • EP addict
  • *
  • Posts: 1449
  • Country: hu
Re: Elakadtam IS-Basic Programozás közben
« Reply #47 on: 2024.January.07. 16:10:00 »
Hello Bruce!

 I try to describe it english maybe you did not get from the translation.

My problem is i would like to use assembly code in IS-Basic by using the Call USR function.
 I would like to pass more then one 16 bit value, and maybe receive also more than one.
 
 I need an advice how to do it without too much calculation.
 The problem is, if I use poke to send a 16 bit value, i have to do a division with 256 and use the result to sent the hibyte, and take the remainder to send the lobyte. This division in is basic probably very expensive, because of the division.

 On the way back, from assembl to basic (by using more than one return variable), i have to multiply the hibyte with 256 and add to lobyte. I assume the multiplicatiom with 256 and adding is more expensive than put the high and lowbyte together.
 My idea was, that the assembly code takes the variable from the memory directly where the e.g LET a=23675 stores the value, instead of passing somewhere else. But later i read that is-basic stores only integer from 0-9999, and if we exceed it it will be converted to bcd format (where a 8bit memory stores 2 decimals.

 It would be handy, if CALL(USR) would take 2 possible or maybe more values: call usr(routine1,x,y)
 I could accept that it returns only 1 value, because in that case i would call it twice (with different routines), to get more results.
 Maybe you have an idea about this topic.
 

Offline Ferro73

  • EP lover
  • *
  • Posts: 980
  • Country: hu
Re: Elakadtam IS-Basic Programozás közben
« Reply #48 on: 2024.January.07. 16:55:16 »
Végül is mennyi adatot szeretnél egyszerre egy USR(PR1,v1,v2,...)-nél ?
 

Offline Tuby128

  • EP addict
  • *
  • Posts: 1449
  • Country: hu
Re: Elakadtam IS-Basic Programozás közben
« Reply #49 on: 2024.January.07. 17:05:47 »
Kettőt biztosan. Harmadik már opcionális.

Online Zozosoft

  • Global Moderator
  • EP addict
  • *
  • Posts: 14739
  • Country: hu
    • http://enterprise.iko.hu/
Re: Elakadtam IS-Basic Programozás közben
« Reply #50 on: 2024.January.07. 17:21:08 »
Csak ennyi kell:
 3840 DEF PEEK16(M)
 3850   LET PEEK16=PEEK(M)+PEEK(M+1)*256
 3860 END DEF

 4010 DEF POKE16(M,N)
 4020   NUMERIC X
 4030   LET X=MOD(N,256)
 4040   POKE M,X
 4050   LET N=(N-X)/256
 4060   POKE M+1,N
 4070 END DEF

(Az FDISK-emből. Ott van 32 bites variáció is.)

Offline Ferro73

  • EP lover
  • *
  • Posts: 980
  • Country: hu
Re: Elakadtam IS-Basic Programozás közben
« Reply #51 on: 2024.January.07. 18:53:52 »
nem emlékszem pontosan de volt BASIC ban a CODE HEX$ kódban olyasmi

CODE P1=HEX$("...,C9")
CODE P2=HEX$("...,CD"& xxx(P1) &("...,C9")

Egy változó ami a P1 NNNN címet beilleszti a gépi kódba.

Offline Ferro73

  • EP lover
  • *
  • Posts: 980
  • Country: hu
Re: Elakadtam IS-Basic Programozás közben
« Reply #52 on: 2024.January.07. 21:23:05 »
Megtaláltam WORD$() a változó.

Olyasmit  kipróbáltam, hogy
CODE RAM00...   bc
CODE RAM02...   de
CODE RAM04...   hl

CALL USR(WR0,nnnn) ~ LD (RAM00),nnnn
CALL USR(WR2,nnnn) ~ LD (RAM02),nnnn
CALL USR(WR4,nnnn) ~ LD (RAM04),nnnn
 
A=USR(RD16,RAM00) ~ LD nnnn,(RAM00)
A=USR(RD16,RAM02) ~ LD nnnn,(RAM02)
A=USR(RD16,RAM04) ~ LD nnnn,(RAM04)
igaz A=-3276x-3276x

Offline gflorez

  • EP addict
  • *
  • Posts: 3610
  • Country: es
    • Támogató Támogató
Re: Elakadtam IS-Basic Programozás közben
« Reply #53 on: 2024.January.07. 21:41:41 »
Sorry, only in English:

This has been discussed several times. For example this one.

One of the beauties and also a handicap of Machine Code on IS-Basic is that the resulting routine is relocatable: the start address depends on the extras you have installed on your Enterprise.

Zozo gave me long ago the clue to manage it: CALL USR(MC,MC)

I am not a real programmer, but I like to do little routines, almost by writing them on a note of paper....

This is how I would do what you want:

Send the start address of the routine as the second operand with the CALL USR(MC,MC) Basic command. Then place an immediate relative jump at the start of your code, leaving all the data bytes you need. Save HL value for later. Like on this example:

MC:
JR Start       ; A JR instruction has a length of 2 bytes: 18h+two's complement of the displacement.  
Value1: DEFB 0
Value2: DEFB 255
etc...
Start:
PUSH HL
etc...

You can know on every moment the address of Start, adding  JR displacement + MC( in HL), and also Value1 address=MC+2, Value2 address=MC+3, etc. Then you can do the same easily on Basic: Value1=peek(mc+2): Value2=peek(mc+3)

Offline Tuby128

  • EP addict
  • *
  • Posts: 1449
  • Country: hu
Re: Elakadtam IS-Basic Programozás közben
« Reply #54 on: 2024.January.08. 03:59:32 »
Megtaláltam WORD$() a változó.

Olyasmit  kipróbáltam, hogy
CODE RAM00...   bc
CODE RAM02...   de
CODE RAM04...   hl

CALL USR(WR0,nnnn) ~ LD (RAM00),nnnn
CALL USR(WR2,nnnn) ~ LD (RAM02),nnnn
CALL USR(WR4,nnnn) ~ LD (RAM04),nnnn
 
A=USR(RD16,RAM00) ~ LD nnnn,(RAM00)
A=USR(RD16,RAM02) ~ LD nnnn,(RAM02)
A=USR(RD16,RAM04) ~ LD nnnn,(RAM04)
igaz A=-3276x-3276x

A WORD$ függvény arra való (Gépi kódú programozás könyv szerit), hogy ha vann egy CODE-dal deklarált string a basic kódban:
CODE  A=CHR$(17)&"THIS IS A STRING."  ! itt CHR utáni "17" a string hosszát adja meg
Akkor ennek a CODE-dal készített "String füzérnek" a kezdőcímét be tudjuk tenni a gépi kódba:
CODE ROUTINE1=HEX$("00",... assembly code...,WORD$(A), ... assembly code....)

Mert ugye alapvetően a CODE egyébként is azt mondja meg, hogy hol tárolta el a HEX után deklarált kódot a memóriában (2Byte-os integer).

Mivel a basic dinamukusan fordít, arra is jó lehet, hogy egy vagy több integer számot szétbontson két byte-ra, és elhelyezze a CODE-ban, viszont többszöri meghívásra ez nem alkalmas mert a CODE csak egyszer helyez el memórában adatot.

Amit még el tudok képzelni, hogy van egy integer, amit WORD-del szétbontuk, majd ORD-vel leszedjük az elemeket.
100 ALLOCATE 100
110 CODE MEMO=HEX$("00","00","00","00")  ! Helyfoglaló
120 A=12345
130 B=3425
140 D$=WORD$(A) ! A értéke szétbontva D$-ba kerül
150 E$=WORD$(B)
160 POKE (MEMO+0),ORD(D$(1:1))  ! copy lo-BYTE to MEMORY
170 POKE (MEMO+1),ORD(D$(2:2)) ! hi-BYTE
180 POKE (MEMO+2),ORD(E$(1:1))  ! lo-BYTE
190 POKE (MEMO+3),ORD(E$(2:2)) ! hi-BYTE

Már csak Benchmarkot kell lefuttatni, hogy a fenti kód gyorsabb-e, vagy a lenti osztás.
POKE (MEMO+0)=MOD(A,256)
POKE (MEMO+1)=A/256

Offline Tuby128

  • EP addict
  • *
  • Posts: 1449
  • Country: hu
Re: Elakadtam IS-Basic Programozás közben
« Reply #55 on: 2024.January.08. 04:38:11 »
Közben elvégeztem egy gyors tesztet:
127 db futás 6 poke,
- WORD és ORD-dal - 13 sec
- Osztással és MOD-dal - 38 sec

Tehat a WORD/ORD 3-szor gyorsabb kódot ad.

Még egy lehetőség van, hogy a CALL USR() rutint többször egymás után hívom meg, hogy adatokat átadjak:

100 CODE MEMO("00,00,00,00,00,00")
110 CODE PASS_A=HEX$("...,WORD$(MEMO)... ,C9")   ! LD IX,MEMO ;  LD (IX+0),L ; LD (IX+1),H ; RET ;
120 CODE PASS_B=HEX$("...,WORD$(MEMO)... ,C9")  ! LD IX,MEMO ;  LD (IX+2),L ; LD (IX+3),H ; RET ;
130 CODE CALC_RES1=HEX$("...WORD$(MEMO)....,C9")  
140 CODE GET_RES2=HEX$("........,C9")  ! LD IX,MEMO ;  PUSH HL, POP IX (a változatosság kedvéért); LD L,(IX+2) ; LD H,(IX+3) ; RET ;
150 LET A=23456
160 LET B=1234
170 CALL USR(PASS_A,A)  ! A value goes into HL, then stored to MEMO
180 CALL USR(PASS_B,B)  ! B value goes into HL, then stored to MEMO
190 LET RESULT1=CALL USR(CALC_RES1)
200 LET RESULT2=CALL USR(MEMO)

Itt még  talán a 120 és 130 sorokat össze lehetne vonni, hogy amikor a CALC kódot hívom, akkor egyúttal átadok egy értéket, így nem kell kétszer hívni.
Lassan megoldódik a kérdésem.
« Last Edit: 2024.January.08. 04:55:07 by Tuby128 »

Offline ergoGnomik

  • EP addict
  • *
  • Posts: 1299
  • Country: hu
  • Stray cat from Commodore alley
Re: Elakadtam IS-Basic Programozás közben
« Reply #56 on: 2024.January.08. 08:25:36 »
Ha ennyire kritikus a sebesség, akkor nem lenne esetleg megfontolandó más nyelvre áttérni? Pl. Pascal.

Offline Tuby128

  • EP addict
  • *
  • Posts: 1449
  • Country: hu
Re: Elakadtam IS-Basic Programozás közben
« Reply #57 on: 2024.January.08. 10:43:28 »
Beépített interpreteres nyelvre van szükségem. Csak az IS-Basic adja magát.
Itt most a sebesség azért fontos mert sokféle megoldás van, és nem akarom a leglassabbat választani.

Offline Ferro73

  • EP lover
  • *
  • Posts: 980
  • Country: hu
Re: Elakadtam IS-Basic Programozás közben
« Reply #58 on: 2024.January.08. 19:15:19 »
Közben elvégeztem egy gyors tesztet:
127 db futás 6 poke,
- WORD és ORD-dal - 13 sec
- Osztással és MOD-dal - 38 sec

Tehat a WORD/ORD 3-szor gyorsabb kódot ad.

Beszállhatok egy 3. lehetőséggel ?

1000x
- WORD és ORD-dal - 55 sec
- Osztással és MOD-dal - 201 sec
- USR osztó - 46 sec

Offline Tuby128

  • EP addict
  • *
  • Posts: 1449
  • Country: hu
Re: Elakadtam IS-Basic Programozás közben
« Reply #59 on: 2024.January.08. 19:20:36 »
Beszállhatok egy 3. lehetőséggel ?

1000x
- WORD és ORD-dal - 55 sec
- Osztással és MOD-dal - 201 sec
- USR osztó - 46 sec

Hogy néz ki az USR osztó?