Welcome, Guest. Please login or register.


Author Topic: CoProcessor (Read 76908 times)

Offline Zozosoft

  • Global Moderator
  • EP addict
  • *
  • Posts: 14710
  • Country: hu
    • http://enterprise.iko.hu/
Re: CoProcessor
« Reply #15 on: 2014.August.06. 15:57:06 »
Quote from: Povi
a kinából jövők hamisitványok lehetnek?
Valószínűleg régi panelekből bontott használtak. Ebből azt hiszem nem nagyon volt több féle, így nincs az probléma, mint a Z80-nál, hogy a 4Mhz-esre ráírják, hogy 20Mhz-es.

Offline Povi

  • EP addict
  • *
  • Posts: 2290
  • Country: hu
    • http://povi.fw.hu
Re: CoProcessor
« Reply #16 on: 2014.September.08. 19:38:40 »
Vettem egy koprocit 2000 Ft-ért (ingyenes szállítással) az ebay-ről:
http://www.ebay.com/itm/1PCS-AM9511A-AM9511A-1DC-CDIP-ARITHMETIC-PROCESSOR-GOOD-QUALITY-LI2-/360988583027?pt=LH_DefaultDomain_0&hash=item540c98a473
Még van 187 db az eladónak, ha valaki kedvet kapna.

Még nem érkezett meg, legrosszabb esetben csak október közepén jön meg, kíváncsian várom, vajon működik-e.

Tervem az vele, hogy a HiSoft Pascal-t átírjam úgy, hogy a koprocira fordítson. Sajnos nem ugyanaz a lebegőpontos számformátum, de elég hasonló (nem IEEE 754 egyik se).
*** Speicherplatz zu klein

Offline Povi

  • EP addict
  • *
  • Posts: 2290
  • Country: hu
    • http://povi.fw.hu
Re: CoProcessor
« Reply #17 on: 2014.September.08. 22:14:29 »
Gyorsan írtam is egy programot, ami a HiSoft Pascal lebegőpontos formátumát konvertálja át Am9511 formátumra. Egy-két hiányosság van:
a Pascal 23 biten tárolja a mantisszát, az Am9511 pedig 24 biten, tehát az Am9511 formátumban a mantissza LSB-je mindig 0 lesz. Pl. a 0.6 értéke "00 99 99 99" kéne hogy legyen, de így most csak "00 99 99 98" lesz.
Cserébe viszont az Am9511 kitevője csak 7 biten van tárolva a Pascal 8 bitje helyett.
Így a legnagyobb ábrázolható szám az Am9511-en 9,2x1018 (263), míg a Pascalban 3,4x1038 (2x2127).
*** Speicherplatz zu klein

Offline Povi

  • EP addict
  • *
  • Posts: 2290
  • Country: hu
    • http://povi.fw.hu
Re: CoProcessor
« Reply #18 on: 2014.September.09. 11:28:47 »
itt a konvertáló rutin (HiSoft real formátumból Am9511 formátumba), és ki is küldi a procinak az adatot:
Code: [Select]
convert2AMD:
; converts HiSoft Pascal REAL number to Am9511 floating point number
; and sends it to TOS

; input: X (real) in HLDE
;   D     = exponent
;   HLE   = mantissa (b0..b22)
;   H MSB = sign

; output: Am9511 floating number in AHLE and in TOS
;   A     = exponent in b0..b6
;   HLE   = mantissa (b0..b23)
;   A MSB = sign

        ld   a,d        ; D = exponent
        add  a,65
        call m,06a6h    ; if exp > 62 or exp < -65 then overflow error
        xor  a
        sla  e
        rl   l
        rl   h          ; rotates left HLE
        rra             ; MSB of A = sign
        inc  d
        res  7,d
        add  a,d
        ld   c,DATAPORT
        out  (c),e
        out  (c),l
        out  (c),h
        out  (c),a
        ret
A kérdésem az volna, hogy jó-e igy a 4 byte küldése? Fogja tudni fogadni az AMD az adatot? Sajnos a buszrendszerek működésével nem vagyok igazán tisztában.
« Last Edit: 2014.September.09. 11:36:24 by Povi »
*** Speicherplatz zu klein

Offline lgb

  • EP addict
  • *
  • Posts: 3563
  • Country: hu
  • æðsta yfirmaður
    • http://lgb.hu/
Re: CoProcessor
« Reply #19 on: 2014.September.09. 13:56:55 »
Quote from: Povi
itt a konvertáló rutin (HiSoft real formátumból Am9511 formátumba), és ki is küldi a procinak az adatot:

Az gondolom joval nehezebb lenne, hogy ne kelljen konvertalgatni, hanem az Am9511 formatuma legyen a "nativ". Es max a sw-es rutinokat ujrairni az coproc formatumra, hogy azert a hw hianyaban is menjen. Mivel konkretan semennyire nem ismerem a HiSoft pascal-t, konnyen jartatom a szamat :-P

Offline Povi

  • EP addict
  • *
  • Posts: 2290
  • Country: hu
    • http://povi.fw.hu
Re: CoProcessor
« Reply #20 on: 2014.September.09. 14:28:02 »
Ez lenne  a jobb megoldás, de ahhoz mélyebben bele kéne nyúli a Pascal lelkivilágába, erre (sajnos) nem vagyok képes. :-)
Jelenleg úgy működik a Pascal, hogy egy operandusos függvényeknél (pl. SIN) a HLDE-ben van az input, meghija az adott rutint, és HLDE-ben adja vissza az eredményt. Két operandus esetén (pl. osztás) az első op. (az osztandó) a veremben van, a második (az osztó) a HLDE-ben, meghivja a rutint, és HLDE-ben megkapjuk az eredményt.

A tervem:
egy op. esetén (pl. SQRT):
  1. HLDE átalakitva Am9511 formára, és kiküldi a procnak.
  2. Kiküldi a megfelelő parancsot.
  3. Visszaolvassuk az eredményt, és ezt visszakonvertálom Pascal REAL-ra, a HLDE-be.

Két op. esetén (osztás):
  1. HLDE átalakitva Am9511 formára, és kiküldi a procnak.
  2. Veremből kivesszük  a 2. operandust.
  3. Átalakitom ezt is Am9511 formára, és kiküldeni a procnak.
  4. osztás esetén TOS és NOS csere parancs küldése a procnak (hogy ne az osztót ossza az osztandóval). Összeadásnál és szorzásnál nincs szükség erre a cserére.
  5. Kiküldi a megfelelő parancsot. (osztás)
  6. Visszaolvassuk az eredményt, és ezt visszakonvertálom Pascal REAL-ra, a HLDE-be.

Annyira talán nem sok idő a konvertálás... :-)
*** Speicherplatz zu klein

Offline Povi

  • EP addict
  • *
  • Posts: 2290
  • Country: hu
    • http://povi.fw.hu
Re: CoProcessor
« Reply #21 on: 2014.September.09. 14:43:45 »
Itt  az eredmény beolvasása a koprociból, és a számformátum átalakítása Pascal formába:
Code: [Select]
GetResult:
; get result from TOS and converts to HiSoft Pascal REAL format
        ld   c,DATAPORT
        in   d,(c)
        in   h,(c)
        in   l,(c)
        in   e,(c)       
        ld   a,80h
        and  d          ; MSB of A = sign, clear Carry
        res  7,d        ; clear sign in D
        dec  d
        bit  6,d
        jr   z,notset
        set  7,d
notset: rr   h
        rr   l
        rr   e          ; rotates right HLE
        add  a,h
        ld   h,a
        ret
Nem tudom, van-e valami elegánsabb megoldás arra, hogy csak akkor állítsa be a D regiszter 7. bitjét, ha a 6. be van állítva.
*** Speicherplatz zu klein

Offline IstvanV

  • EP addict
  • *
  • Posts: 4822
Re: CoProcessor
« Reply #22 on: 2014.September.09. 15:07:00 »
Ha nem fontos, hogy A = H legyen:
Code: ZiLOG Z80 Assembler
  1.         ld      c, DATAPORT
  2.         in      a, (c)
  3.         ...
  4.         in      e, (c)
  5.         add     a, a
  6.         rr      h
  7.         rr      l
  8.         rr      e
  9.         sub     2
  10.         sra     a
  11.         ld      d, a
  12.         ret

Az IN A, (C) helyett lehet IN A, (DATAPORT) is, ami még 1 ciklussal gyorsabb. :)
« Last Edit: 2014.September.09. 15:15:47 by IstvanV »

Offline Povi

  • EP addict
  • *
  • Posts: 2290
  • Country: hu
    • http://povi.fw.hu
Re: CoProcessor
« Reply #23 on: 2014.September.09. 15:29:30 »
Ez zseniális, köszönöm!!!
Teli van a kód apró ötletekkel, nem tudom, milyen agy kell ehhez, de igazából pont az ilyen kódolások miatt szerettem meg az assembly-t. :-)
*** Speicherplatz zu klein

Offline Ferro73

  • EP lover
  • *
  • Posts: 960
  • Country: hu
Re: CoProcessor
« Reply #24 on: 2014.September.09. 16:41:38 »
Esetleg ha memcim-et használnál és OUTI, INI  utasítást használnál?
PL:
   ld   hl,kezd cdhle
   ld   bc,xxx   ; b=4 C= DATAPORT
   outi

   ld   hl,kezd cdhle
   ld   bc,xxx   ; b=4 C= DATAPORT
   ini

Offline Povi

  • EP addict
  • *
  • Posts: 2290
  • Country: hu
    • http://povi.fw.hu
Re: CoProcessor
« Reply #25 on: 2014.September.09. 19:12:40 »
Gondolkodtam én is rajta, de 4 byte miatt nem éri meg, nem lesz se gyorsabb, se rövidebb a kód.
A 4 byte kiküldése a portra OUT (C),reg utasítással 4x12T, plusz 7T a C-nek kezdőértéket adni (összesen 55T).
4 byte kiírása a memóriába LD (HL),reg utasítással 4x7T, HL kezdőérték adás 10T (eddig 38T), de a HL értékét 3x növelni kell, ez minimum 3x3T (ha INC L-t használunk csak), és még mindig csak a memóriában van a 4 byte-om, ahonnét OUTI-val ki kéne küldeni.
*** Speicherplatz zu klein

Offline Povi

  • EP addict
  • *
  • Posts: 2290
  • Country: hu
    • http://povi.fw.hu
Re: CoProcessor
« Reply #26 on: 2014.September.09. 19:28:49 »
Itt van egy rövidke program, ami kiírja a Pascal lebegőpontos formátumot, átszámolja Am9511 formátumra, majd vissza alakítja Pascal formátumra.
http://ep.lgb.hu/jsep/demo/?snapshot=http%3A%2F%2Fbeac.uw.hu%2Fbigyo.ep128s&autostart=yes
A visszaalakító kód István műve.
Nulla esetén még nem biztos, hogy jó a konvertálás, a Pascal 00 00 00 00-t ad HLDE-nek, de igazából csak a H 6. bitjét nézi, hogy az nulla-e. Nem egyértelmű az Am9511 doksijából, vajon elég-e, ha a mantissza MSB-je nulla, vagy mind a 32 bitnek 0-nak kell lenni.
*** Speicherplatz zu klein

Offline BruceTanner

  • EP lover
  • *
  • Posts: 607
  • Country: gb
Re: CoProcessor
« Reply #27 on: 2014.September.09. 21:37:39 »
(via google translate) You can improve the first routine too. 
Code: [Select]
        ld      a,d
        cp      -65
        call    m,06a6h
        inc     a
        add     a,a     ; lose MSB, will shift back later with sign
        sla     e
        adc     hl,hl   ; same as rl l, rl h but quicker
        rra             ; shift back with sign
        ld      c,DATAPORT
            :
            :

Offline Povi

  • EP addict
  • *
  • Posts: 2290
  • Country: hu
    • http://povi.fw.hu
Re: CoProcessor
« Reply #28 on: 2014.September.09. 21:43:28 »
Thanks a lot your help!
*** Speicherplatz zu klein

Offline lgb

  • EP addict
  • *
  • Posts: 3563
  • Country: hu
  • æðsta yfirmaður
    • http://lgb.hu/
Re: CoProcessor
« Reply #29 on: 2014.September.09. 21:58:50 »
Quote from: BruceTanner
(via google translate) You can improve the first routine too.

I'm curious if IS-BASIC can be modified somehow to use hardware coprocessor instead of software routines. But since IS-BASIC uses some kind of BCD logic (at least what I remember from my project to convert exos type-4 files into text or HTML on PC), I am not sure how easy/hard and efficient to do this ...