Welcome, Guest. Please login or register.


Author Topic: ASM EP-n - hogyan kezdjem? (Read 31941 times)

Offline lgb

  • EP addict
  • *
  • Posts: 3496
  • Country: hu
  • æðsta yfirmaður
  • OS:
  • Linux Linux
  • Browser:
  • Safari Safari
    • View Profile
    • http://lgb.hu/
Re: ASM EP-n - hogyan kezdjem?
« Reply #15 on: 2011.December.03. 21:39:57 »
Nos, elkezdtem jatszani a gondolattal, hogy EP-re kene programoznom :) Kis backgound info rolam (remelem nem lesz unalmas): nem volt ugye EP-m, amikor kb 10 eve szereztem egyet, doksik alapjan elkezdtem irni egy emulatort (hogy PC elott ulve tudjak kiserletezni/fejleszteni), mert nem talaltam megfelelot, foleg nem olyat, ami Linux alatt normalisan menne. Ez el is jutott addig, hogy pl a WP mar ment benne (http://web.archive.org/web/20050205020248/http://nemesys.lgb.hu/screen.php   regi site-m egy maradvanya az archive.org segitsegevel, sajna a kepek kozul nem sok latszik mar), amde aztan se idom se energiam nem volt ra. Most, hogy visszatertem a temahoz, ujra megneztem az ep128emu-t, es orommel lattam, hogy kb mindent tud amire valaha is szuksegem lehet es remekul fut Linux alatt. Tehat emulator irasi probalkozasomat kb 10 ev utan feladtam :)

No, ez a bevezeto ahhoz kellett, hogy ravilagitsak: habar HW oldalrol van nemi elkepzelesem az EP-rol (eleve kellett az emulator irashoz, hogy megismerjek par dolgot az EP-rol, ideertve persze magat a Z80-at is), software oldalrol a tudasom a nullahoz konvergal (emulatoromnal csak azt csinaltam hogy netrol levadaszott ROM image-ekkel "megetettem" es addig programozgattam amig nem csinalt valamit aztan a kerdeses rom tartalomnak hala az emulalt EP). Tehat kvazi szuz vagyok a temaban. 10 perc keresgeles utan most irtam egy olyat, hogy 81h portot irogatom es vegtelen ciklusban igy szeeeeep effektet kaptam :) Tehat, az megvan, hogy 5-os tipusu fejlec, stb. De magarol az EXOS-rol pl semmit nem tudok. Van valami bevezeto jellegu iras, ami igy magyarzgatja el az EP-re fejlesztes menetet assembly-ben?

Pl konkretan most ez erdekelne: kellene nekem egy "szokasos" karakteres kepernyo, amit azonban en kozvetlenul irogatnek. Azonban ugye a Nick rugalmassaganak hala, ez maris sok kerdest vet fel: van valami lehetosegem arra, hogy tudjam: adott felbontasu karakteres kepernyo, a videoram egy fixed helyen es kesz, irhatok bele (gondolom pl grafikus stb modhoz biztos nincs, de en most elsore egy std karakteres dologra vagyok csak semmi faxni). Vagy nekem kell egy LPT-t felepiteni, video ram szegmenst foglalni, stb? Nincs erre valami pl EXOS funkcionalitas, hogy egyszeruen ugymond "kerjek egy kepernyot"? Hasonloan amator kerdes: ha nem kozvetlenul irkalnek a kepernyore, hogyan tudok pl egy karaktert mondjuk EXOS-al kiiratni a kepernyore, esetleg egy egesz sztringet? Olvasgattam az EXOS leirast, de igy teljesen elsore nem feltetlen tiszta nekem.

Koszi a turelmet :)

Offline Zozosoft

  • EP addict
  • *
  • Posts: 13519
  • Country: hu
  • OS:
  • Windows 7 Windows 7
  • Browser:
  • Firefox 8.0 Firefox 8.0
    • View Profile
    • http://enterprise.iko.hu/
Re: ASM EP-n - hogyan kezdjem?
« Reply #16 on: 2011.December.03. 21:58:28 »
Áthoztam ide, mert már volt ilyen téma.
Itt lentebb találsz is példa programocskákat indulásnak, igaz ezekben grafikus képernyõrõl van szó.

Offline Zozosoft

  • EP addict
  • *
  • Posts: 13519
  • Country: hu
  • OS:
  • Windows 7 Windows 7
  • Browser:
  • Firefox 8.0 Firefox 8.0
    • View Profile
    • http://enterprise.iko.hu/
Re: ASM EP-n - hogyan kezdjem?
« Reply #17 on: 2011.December.03. 22:17:18 »
Pl konkretan most ez erdekelne: kellene nekem egy "szokasos" karakteres kepernyo, amit azonban en kozvetlenul irogatnek. Azonban ugye a Nick rugalmassaganak hala, ez maris sok kerdest vet fel: van valami lehetosegem arra, hogy tudjam: adott felbontasu karakteres kepernyo, a videoram egy fixed helyen es kesz, irhatok bele (gondolom pl grafikus stb modhoz biztos nincs, de en most elsore egy std karakteres dologra vagyok csak semmi faxni). Vagy nekem kell egy LPT-t felepiteni, video ram szegmenst foglalni, stb? Nincs erre valami pl EXOS funkcionalitas, hogy egyszeruen ugymond "kerjek egy kepernyot"? Hasonloan amator kerdes: ha nem kozvetlenul irkalnek a kepernyore, hogyan tudok pl egy karaktert mondjuk EXOS-al kiiratni a kepernyore, esetleg egy egesz sztringet? Olvasgattam az EXOS leirast, de igy teljesen elsore nem feltetlen tiszta nekem.
Ha közvetlenül akarod írogatni, akkor a legjobb, ha csinálsz saját LPT-t, saját videómemóriával.
Ha elég egy sornyi is, akkor használhatod a Status sort is, ennek a címét a rendszerszegmensbõl lehet kiolvasni.

Ha van egy videólapod, akkor annak videómemória címét az EXOS 11/3 hívással tudod lekérdezni a direkt kezeléshez, de ezzel vigyázni kell, mert egyes mûveletektõl (pl további csatornák nyitása, zárása) változhat.

Saját videó laphoz itt az anno Enterpressben közölt példaprogram. Van benne kiíratás is.

Offline Zozosoft

  • EP addict
  • *
  • Posts: 13519
  • Country: hu
  • OS:
  • Windows 7 Windows 7
  • Browser:
  • Firefox 8.0 Firefox 8.0
    • View Profile
    • http://enterprise.iko.hu/
Re: ASM EP-n - hogyan kezdjem?
« Reply #18 on: 2011.December.03. 22:27:02 »
Lacika! Innen hiányzik még egy Haluska cikk, ami számok, szövegek kiírásáról szól. Itt a hozzátartozó ASM.
(Amúgy meg a szöveges részt érdemes lenne átnézni OCR hibák után kutatva, akad bõven  :oops: )

Offline Lacika

  • EP addict
  • *
  • Posts: 2929
  • Country: hu
  • OS:
  • Windows XP Windows XP
  • Browser:
  • Firefox 8.0 Firefox 8.0
    • View Profile
    • http://www.ep128.hu
Re: ASM EP-n - hogyan kezdjem?
« Reply #19 on: 2011.December.03. 23:49:03 »
(Amúgy meg a szöveges részt érdemes lenne átnézni OCR hibák után kutatva, akad bõven  :oops: )
Sokat segítene a hibakeresésben, ha segítenél, hol keressem:  :oops:

Offline Attus

  • EP addict
  • *
  • Posts: 1230
  • Country: hu
  • OS:
  • Linux Linux
  • Browser:
  • Firefox 7.0.1 Firefox 7.0.1
    • View Profile
Re: ASM EP-n - hogyan kezdjem?
« Reply #20 on: 2011.December.04. 15:17:03 »
Ahogy az írásodat értelmezem, te nem szinte kizárólag "magasabb szintû" EXOS hívásokkal operáló progikon töröd a fejed, (exos hívásokkal képre írkálás, rajzolás stb.). A "fix" kép (LPT), memória környezet felépítéséhez (amiben garázdálkodni szándékozol amolyaan spectrum, c64 stílusban) azonban szinte kikerülhetetlen ezek használata.

Offline IstvanV

  • EP addict
  • *
  • Posts: 4806
  • OS:
  • Linux 64 bit Linux 64 bit
  • Browser:
  • Firefox 5.0 Firefox 5.0
    • View Profile
Re: ASM EP-n - hogyan kezdjem?
« Reply #21 on: 2011.December.04. 15:25:19 »
A "fix" kép (LPT), memória környezet felépítéséhez (amiben garázdálkodni szándékozol amolyaan spectrum, c64 stílusban) azonban szinte kikerülhetetlen ezek használata.

Szerencsére általában minimális EXOS használat is elég:
  - memória foglalás (EXOS 24), felszabadítás (EXOS 25)
  - melegindítási rutin írása (többnyire néhány soros) és a cím beállítása
  - file megnyitása, olvasása, bezárása (ha a program több file-ból áll)
  - EXOS változók írása/olvasása (BIAS állításához a beépített hangszóró engedélyezésének a megváltoztatása nélkül)

Offline IstvanV

  • EP addict
  • *
  • Posts: 4806
  • OS:
  • Linux 64 bit Linux 64 bit
  • Browser:
  • Firefox 5.0 Firefox 5.0
    • View Profile
Re: ASM EP-n - hogyan kezdjem?
« Reply #22 on: 2011.December.04. 16:38:11 »
Itt egy egyszerű program (SjASM PC-s Z80 assemblerrel fordítható), amely karakteres képernyőt állít be, és kiír egy üzenetet, majd a SPACE billentyűre vár, aminek a lenyomásakor kilép:

Code: ZiLOG Z80 Assembler
  1.         org   00f0h
  2.         defw  0500h, prg_end - 0100h, 0, 0, 0, 0, 0, 0
  3.  
  4.     macro exos n
  5.         rst   30h
  6.         defb  n
  7.     endm
  8.  
  9. dispw   equ     40
  10. disph   equ     25
  11.  
  12. main:
  13.         di
  14.         ld    sp, 0100h
  15.         ld    a, 0ffh
  16.         out   (0b2h), a
  17.         ld    hl, reset
  18.         ld    (0bff8h), hl
  19.         ei
  20.         ld    bc, 1:27                  ; BORD_VID
  21.         ld    d, 00100000b
  22.         exos  16
  23.         halt
  24.         halt
  25.         call  mem_alloc
  26.         call  lpt_init
  27.         ei
  28.         ld    hl, testmsg
  29.         ld    de, 1:2
  30.         call  printstr
  31. .l1:    ld    a, 8
  32.         di
  33.         out   (0b5h), a
  34.         in    a, (0b5h)
  35.         ei
  36.         and   40h
  37.         jr    nz, .l1
  38.         jp    reset
  39.  
  40. mem_alloc:
  41. .l1:    exos  24
  42.         or    a
  43.         jp    nz, reset
  44.         ld    a, c
  45.         cp    0fch
  46.         jr    c, .l1
  47.         ld    l, c
  48.         out   (0b3h), a
  49. .l2:    dec   l
  50.         ret   z
  51.         ld    c, l
  52.         exos  25
  53.         jr    .l2
  54.  
  55. lpt_init:
  56.         di
  57.         ld    hl, (0bff4h)
  58.         set   7, h
  59.         res   6, h
  60.         set   2, l
  61.         set   1, l
  62.         ld    a, (hl)
  63.         inc   l
  64.         ld    h, (hl)
  65.         ld    l, a
  66.         ld    (lpbdata + 6), hl
  67.         ld    de, lpt_begin
  68.         ld    hl, disp_begin & 3fffh
  69.         in    a, (0b3h)
  70.         rrca
  71.         rrca
  72.         and   0c0h
  73.         push  af
  74.         or    h
  75.         ld    h, a
  76.         ld    a, disph
  77. .l1:    ld    (lpbdata + 4), hl
  78.         ld    bc, dispw
  79.         add   hl, bc
  80.         push  hl
  81.         ld    hl, lpbdata
  82.         ld    c, 16
  83.         ldir
  84.         pop   hl
  85.         dec   a
  86.         jr    nz, .l1
  87.         ld    hl, lptborderblank
  88.         ld    bc, lptborderblank_end - lptborderblank
  89.         ldir
  90.         ld    hl, disp_begin
  91.         ld    de, disp_begin + 1
  92.         ld    bc, disph * dispw - 1
  93.         ld    (hl), ' '
  94.         ldir
  95.         pop   af
  96.         or    high (lpt_begin & 3fffh)
  97.         ld    l, low lpt_begin
  98.         ld    h, a
  99.  
  100. setlptaddr:
  101.         ld    a, 1ch
  102. .l1:    add   hl, hl
  103.         rla
  104.         jr    nc, .l1
  105.         ld    c, 82h
  106.         out   (c), h
  107.         out   (83h), a
  108.         ret
  109.  
  110. printstr:
  111.         push  hl
  112.         push  de
  113.         ld    e, d                      ; D = Y
  114.         ld    d, 0
  115.         ld    a, dispw
  116.         call  multDEbyAtoHL
  117.         ld    bc, disp_begin
  118.         pop   de                        ; E = X
  119.         ld    d, 0
  120.         add   hl, bc
  121.         add   hl, de
  122.         pop   de
  123. .l1:    ld    a, (de)
  124.         or    a
  125.         ret   z
  126.         ld    (hl), a
  127.         inc   de
  128.         inc   hl
  129.         jr    .l1
  130.  
  131. multDEbyAtoHL:
  132.         ld    hl, 0
  133.         add   a, a
  134.         jr    nc, .l1
  135.         ld    l, e
  136.         ld    h, d
  137.         add   hl, hl
  138. .l1:    add   a, a
  139.         jr    nc, .l2
  140.         add   hl, de
  141. .l2:    add   hl, hl
  142.         add   a, a
  143.         jr    nc, .l3
  144.         add   hl, de
  145. .l3:    add   hl, hl
  146.         add   a, a
  147.         jr    nc, .l4
  148.         add   hl, de
  149. .l4:    add   hl, hl
  150.         add   a, a
  151.         jr    nc, .l5
  152.         add   hl, de
  153. .l5:    add   hl, hl
  154.         add   a, a
  155.         jr    nc, .l6
  156.         add   hl, de
  157. .l6:    add   hl, hl
  158.         add   a, a
  159.         jr    nc, .l7
  160.         add   hl, de
  161. .l7:    add   hl, hl
  162.         ret   p
  163.         add   hl, de
  164.         ret
  165.  
  166. reset:
  167.         di
  168.         ld    sp, 4000h
  169.         ld    a, 0ffh
  170.         out   (0b2h), a
  171.         ld    hl, reset
  172.         ld    (0bff8h), hl
  173.         ld    bc, 1:27                  ; BORD_VID
  174.         ld    d, 00h
  175.         exos  16
  176.         ld    c, 40h
  177.         exos  0
  178.         ld    a, 01h
  179.         out   (0b3h), a
  180.         ld    a, 6
  181.         jp    0c00dh
  182.  
  183.  
  184. lpt_begin       equ     0f800h
  185. disp_begin      equ     0c000h
  186.  
  187. lpbdata:
  188.         defb  256 - 9, 08h, (63 - dispw) / 2, (63 + dispw) / 2
  189.         defw  0, 0
  190.         defb  00000000b, 10010010b, 00000000b, 01001001b
  191.         defb  0, 0, 0, 0
  192.  
  193. tborder         equ     (294 / 2) - (disph * 9 / 2)
  194. bborder         equ     (294 / 2) - ((disph * 9 + 1) / 2)
  195.  
  196. lptborderblank:
  197.         defb  256 - bborder, 82h, 63, 0,  0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0
  198.         defb  256 - 3, 00h, 63, 0,  0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0
  199.         defb  256 - 2, 00h, 6, 63,  0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0
  200.         defb  256 - 1, 00h, 63, 32,  0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0
  201.         defb  256 - 3, 00h, 63, 0,  0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0
  202.         defb  256 - 9, 02h, 6, 63,  0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0
  203.         defb  256 - tborder, 03h, 63, 0,  0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0
  204. lptborderblank_end:
  205.  
  206. testmsg:
  207.         defm  "Enterprise"
  208.         defb  0
  209.  
  210. prg_end:

A program működésének a magyarázata:
  - először beállítja a veremmutatót, minden EXOS 5 fejlécű programot ezzel kell kezdeni, mert egyébként a veremmutató érvénytelen, és a program az első megszakításnál lefagy
  - belapozza a rendszerszegmenst (FFh) a 2. lapra, a program futása közben a 8000h-BFFFh területen mindig ez lesz látható
  - ha a program hosszabb lenne egy szegmensnél, akkor a második és a harmadik szegmens száma a BFFDh és BFFEh címeken lenne található (a rendszer nem lapozza be automatikusan)
  - beállítja a melegindítási címet (BFF8h), hogy a reset gomb lenyomására ne történjen hidegindítás
  - EXOS változó írása (EXOS 16) hívással beállítja a keretszínt
  - lefoglal egy video szegmenst az LPT-nek és a karakteres képernyőnek
  - létrehozza az LPT-t, törli a képernyőt, és beállítja az LPT címét a 82h/83h I/O portokon
  - kiír egy üzenetet a képernyő bal felső sarkába
  - a Space billentyű lenyomására vár (B5h port figyelése), és ha ez megtörténik, akkor a melegindítási rutinra ugrik

A memóriafoglalás:
  - ciklusban szegmenst foglal (EXOS 24) addig, amíg a száma FCh vagy nagyobb lesz (video szegmens); az EXOS a szegmenseket növekvő sorrendben foglalja le, tehát az esetleges video szegmensek csak minden más szegmens lefoglalása után kerülnek sorra
  - ha ez nem sikerül, akkor a melegindítási rutinra ugrik
  - egyébként a 3. lapra belapozza a video szegmenst, és minden más szegmenst felszabadít (EXOS 25)

A képernyő inicializálása:
  - az EXOS LPT címét a rendszerszegmensről kiolvassa (BFF4h), és ehhez képest +6 byte eltolással megtalálható az LPT-be írandó karakterkészlet cím
  - létrehozza az LPT-t (a karaktersoroknak megfelelő számú LPB + a keretek és a függőleges visszafutás)
  - a címeket NICK címekre konvertálja a szegmensszámnak megfelelően
  - feltölti a képernyőt szóköz karakterekkel
  - végül a 82h és 83h I/O portokon beállítja az LPT címét

Szöveg írása a képernyőre (E = X pozíció, D = Y pozíció, HL = szöveg címe, a szöveg C formátumú, azaz 00h karakter jelzi a végét):
  - kiszámítja a képernyő memória kezdőcímet, ami C000h + (D * szélesség) + E
  - a szöveget 00h karakterig másolja (nem ellenőrzi, hogy nem történik-e a képernyő területén kívülre írás)

Melegindítás:
  - beállítja a veremmutatót és belapozza a rendszerszegmenst a 2. lapra
  - átmenetileg visszaállítja a címet, hogy a reset gomb esetleges nagyon gyors újabb lenyomása (pl. érintkezési hiba miatt) ne eredményezzen hidegindítást (ez nem biztos, hogy a gyakorlatban hasznos)
  - visszaállítja a korábban EXOS változó írásával beállított keretszínt feketére
  - felszabadít minden lefoglalt memóriát (EXOS 0 C=40h jelzőbitekkel)
  - a 01h:C00Dh címre ugrik A=6 kóddal, ami a rendszer indításakor látható villogó Enterprise logót jeleníti meg (a RAM-ban található bővítők, RAMDISK, és EXOS változók nem vesznek el)
  - az LPT visszaállításával nem foglalkozik, mert azt a rendszer egyébként is megteszi, ahogy az esetleges csatornák bezárását is; csak a Reset gomb lenyomásakor szintén automatikusan helyreállítja a rendszer a 0030h-005Fh területet is
« Last Edit: 2011.December.04. 19:58:22 by IstvanV, Reason: Kisebb javítás az lpt_init-ben »

Offline lgb

  • EP addict
  • *
  • Posts: 3496
  • Country: hu
  • æðsta yfirmaður
  • OS:
  • Linux Linux
  • Browser:
  • Safari Safari
    • View Profile
    • http://lgb.hu/
Re: ASM EP-n - hogyan kezdjem?
« Reply #23 on: 2011.December.04. 20:52:53 »
Itt egy egyszerű program (SjASM PC-s Z80 assemblerrel fordítható), amely karakteres képernyőt állít be, és kiír egy üzenetet, majd a SPACE billentyűre vár, aminek a lenyomásakor kilép:
Koszi! Franko pelda volt. Azonban van ami nem vilagos nekem. Miert kell az, hogy ilyen reset szeru modon kilepni? Elnezest, ha hulyeseget irok, vagy hulyen fogalmazok, megprobalom leirni, mi nem vilagos nekem. Sajna mindig C64-es peldaval kell jonnom: ott betoltok egy programot, futtatom (itt eleve kulon nem is kell futtatni?), aztan visszakapom a vezerlest ha az kilep. Ugy, hogy ujra tudom futtatni ha akarom, megvizsgalhatom a memoriat stb. Itt viszont a billentyulenyomas utan nem kilep, hanem "resetel" hiszen ujra ott vagyok ahogy a gep bekapcsol amugy. Bocsanat, tudom, alapveto EP ismereti hianyossagaim vannak :)

Amugy nagyon erdekes ez az EP. Ehhez kepest a C64 az csak egy vas, sw tekinteteben kb nulla, van ugye basic interpreter meg valami kernal ami kb ahhoz kell h a basic menjen. De semmi meg csak hasonlo advanced dolog sincs, mint ami az EP-re jellemezo, tobbek kozott imho ennek koszonheto az, ami nekem itt uj es "komplexnek" elek meg, hogy nem csak annyi a dolog, miszerint kb minden hw elemet kezzel kell programoznom, "OS" (hmm kernal) az max alap funkciokra jo pl billentyuzet, disk I/O, de legtobb valamire valo program ugyis direktbe csinalja mintha nulla sw komponens lenne a C64-ben. Ezt csak azert irtam le, hogy ertheto legyen, miert fura nekem ez a szemlelet elsore :) Persze a mai korban se hw-t programozunk tobb esetben direktbe PC-n sem (legyen Windows, Linux, akarmi), nekem csak az uj, hogy a 8 bites korszakban is van olyan, ahol ilyesmivel talalkozik az ember. Cool. Csak meg kell ertenem :)

Offline Zozosoft

  • EP addict
  • *
  • Posts: 13519
  • Country: hu
  • OS:
  • Windows 7 Windows 7
  • Browser:
  • Firefox 8.0 Firefox 8.0
    • View Profile
    • http://enterprise.iko.hu/
Re: ASM EP-n - hogyan kezdjem?
« Reply #24 on: 2011.December.04. 22:17:26 »
Az neked a furcsa, hogy van a gépnek operációs rendszere, a szó valódi értelmében.
Natívan magát az EXOS-t a villogó EP feliratig láthatod futni. (De eddig a pontig is ad több lehetõséget más, ROM-ba égetett programoknak, hogy átvegyék a vezérlést.)
Ezután mindig van (az EXOS könyv szóhasználatával élve) egy aktuális alkalmazói program. Ez induláskor valamelyik rendszerbõvítõ lesz, amelyik válaszol az EXOS hívására. Átlag gépen az IS-BASIC, ha nincs bent a cartridge, akkor pedig a WP.
Amikor pedig a betöltés egy 5-ös fejlécû programot talál, akkor az lesz az új alkalmazói program, amit 100H-tól tölt be, és indít el.
Az aktuális alkalmazói program kiváltsága a 0-ás lap szegmens használata az EXOS által használt pár tucat bájt kivételével. Ebbõl adódik, hogy amikor elindult egy új program, a régihez már nem lehet visszatérni, hiszen annak a 0-ás lapon lévõ adatai már felül lesznek írva. Így kilépni úgy lehet, ha meghívunk vagy betöltünk egy másik programot.
Ami meghívható program, és minden gépen egészen biztosan ott van az a WP. Viszont ezt meghívni nem túl felhasználóbarát lépés.
Másik verzió az, amit István programjában is láthatsz, hogy visszaadjuk annak a ROM rutinnak a vezérlést, amit az EXOS is használ amikor a rendszer indításakor végzett minden feladattal, azaz a bejelentkezõ képhez. Innen a felhasználó oda jut tovább, ahova egyébként szokott, ha a BASIC-be akkor oda, ha EPDOS-ba akkor oda, stb
Ez a "resetel" viszont nagyon nem igaz! A memória nem lesz törölve, a beállított rendszerváltozók, dátum, idõ, RAMDISK, betöltött rendszerbõvítõk mind-mind megmaradnak!

Amire te gondolsz C64 szerû végrehajtásként, azt IS-BASIC-ben elõ lehet adni, ALLOCATE, USR utasításokkal lehet gépi kódot bevinni, amit aztán meg lehet hívni, és visszatér. Bár az Asmon tud ilyen formára is fordítani, azért komolyabb feladatra nem igazán alkalmas :-) Lehet azt is, hogy ez az basicesgépikód rész foglal memóriát, oda betölti a komolyabb programkódot, meghívja, majd ha onnan visszatért, visszarendezi a memóriát a BASIC-nek, és visszatér. A korai gyári játék programokból sok készült ilyen módszerrel. De ha ZZZIP-el lefordítunk egy Basic programot az is ilyen lesz.
Annyi elõnye van, hogy a Basic által megnyitott csatornákat lehet használni be/kivitelhez.

Ill. ha fejlesztési szempontból érdekes ez az egész, akkor valamelyik Assembler Debugger részét lehet használni.
De manapság ott az ep128emu debuggere, az sokkal full extrásabb erre a feladatra!

És van még egy lehetõség meghívható-visszatérõ gépi kód futtatására ez a rendszerbõvítõ programforma, ez dönthet úgyis, hogy átveszi a vezérlést, és aktuális alkalmazói programmá válik, vagy elvégezvén a tevékenységét vissza is adhatja a vezérlését. Ha nem válik aktuális alkalmazói programmá, akkor az alapértelmezett csatorna funkciót használva be/kivitelre pl úgy írhat ki üzeneteket, hogy nem kell saját videolap megnyitásával foglalkozni. Pl erre az EXDOS parancsok, ahol az üzenetek a BASIC, vagy WP, vagy stb képernyõjén jelennek meg, és amikor billentyû válaszra vár (Pl Retry/Abort/Ignore), azt szintén ezek billentyûzethez meg nyitott csatornájáról olvassa be.

Ha elmentjük a 0-ás lap tartalmát, akkor egész bonyolult dolgokból is vissza lehet térni, pl erre az általam elkövetett Spectrum Emulátor ROM, ahol úgy lehet visszatérni pl a BASIC-be, hogy annak szempontjából csak egy melegindítás történt, a bent lévõ BASIC programok is megmaradnak.

Offline lgb

  • EP addict
  • *
  • Posts: 3496
  • Country: hu
  • æðsta yfirmaður
  • OS:
  • Linux Linux
  • Browser:
  • Safari Safari
    • View Profile
    • http://lgb.hu/
Re: ASM EP-n - hogyan kezdjem?
« Reply #25 on: 2011.December.04. 22:30:39 »
Az neked a furcsa, hogy van a gépnek operációs rendszere, a szó valódi értelmében.

Jol latod, es persze nem negativ ertelemben mondtam: ez nekem tetszik, csak teny, hogy igy egy ideig eltart mire igazan megertem :)

Amugy tudsz ajanlani olyan doksit (keresgettem, de pont ilyet nem leltem), ami kb ott indul, hogy nem akar Z80 assembly-t oktatni, EP HW-t se nagyon, csupan az assembly szintu fejlesztes finomsagait "oktatja" (a fent emlitett ket tema nelkul) kiemelve az EXOS dolgait, stb. Amit talaltam EXOS leirast az mar elegge feltetelezi, hogy tud az ember rola azert par dolgot ...

De koszi mindenkinek, odaig azert eljutottam, hogy irok egyszeru programokat, max jelenleg csunya, mert pl letiltom az interrupt-okat, aztan kb hw szinten csinalok amit akarok, es oda irok ahova akarok :) Nyilvan ez egyaltalan nem szep megoldas, de legalabb van sikerelmenyem, hogy latok futni az emulatoron valamit, amit en irtam.

Offline Zozosoft

  • EP addict
  • *
  • Posts: 13519
  • Country: hu
  • OS:
  • Windows XP Windows XP
  • Browser:
  • Firefox 8.0 Firefox 8.0
    • View Profile
    • http://enterprise.iko.hu/
Re: ASM EP-n - hogyan kezdjem?
« Reply #26 on: 2011.December.05. 10:07:13 »
Ezt olvastad már?

Offline lgb

  • EP addict
  • *
  • Posts: 3496
  • Country: hu
  • æðsta yfirmaður
  • OS:
  • Linux Linux
  • Browser:
  • Safari Safari
    • View Profile
    • http://lgb.hu/
Re: ASM EP-n - hogyan kezdjem?
« Reply #27 on: 2011.December.12. 07:47:07 »
Ezt olvastad már?

Koszi, folyamatban :) Par kerdesem azert meg lenne, ha van meg turelmetek hozzam:

* Akkor cross-platform (PC-n) valo fejleszteshez sjasm-ot ajanljatok? Talaltam en egy rakas Z80 assembler-t, azert kerdezem. Persze olyan kell, ami Linuxos verzioban is elerheto, az sjasm speciel ilyen.
* az elozo kerdesemhez, hogy miert nem tud egy program csak ugy "kilepni": mi van, ha egy zenelejatszot irnek mondjuk, de olyat, ami IRQ-ba epul be, hogy betoltes utan  hatterben zeneljen szepen. Ekkor persze valahogy csak ki kell lepnem, gondolom en ...


Offline Zozosoft

  • EP addict
  • *
  • Posts: 13519
  • Country: hu
  • OS:
  • Windows XP Windows XP
  • Browser:
  • Firefox 8.0 Firefox 8.0
    • View Profile
    • http://enterprise.iko.hu/
Re: ASM EP-n - hogyan kezdjem?
« Reply #28 on: 2011.December.12. 09:42:21 »
* az elozo kerdesemhez, hogy miert nem tud egy program csak ugy "kilepni": mi van, ha egy zenelejatszot irnek mondjuk, de olyat, ami IRQ-ba epul be, hogy betoltes utan  hatterben zeneljen szepen. Ekkor persze valahogy csak ki kell lepnem, gondolom en ...
Erre a feladatra a rendszerbõvítõ formátum alkalmas, ami inicializáláskor beláncol egy saját periféria kezelõt, és annak a megszakítási rutinja végzi a zenélést.
A rendszerbõvítõ a beláncolás után visszaadja a vezérlést az EXOS-nak, ami meg az aktuálisan futó programnak, pl BASIC-nek.
A továbbiakban a bõvítõ felismerhet parancsokat, amivel a lejátszást lehet vezérelni.
Így mûködik az általam elkövetett Music Box Player is :-)

Offline Tuby128

  • EP lover
  • *
  • Posts: 955
  • Country: hu
  • OS:
  • Windows XP Windows XP
  • Browser:
  • Firefox 3.6.25 Firefox 3.6.25
    • View Profile
Re: ASM EP-n - hogyan kezdjem?
« Reply #29 on: 2012.February.07. 23:46:04 »
Tegnap olvasgattam az EXOS referencia könyvet és rengeteg olyan információt találtam, ami programírásra inspirált.
Ki akartam próbálni, hogy az 5-ös kódú Exos fejléccel fordított és file-ba mentett új felhasználói program valóban automatikusan elindul-e.
 Pár órámba tellett, mire felfrissítettem Z80-as ismereteimet (nagyon szépen köszönöm a könyvet Szipucsu!!!) írtam egy olyan rutint, ami kiolvassa a sorparaméter tábla elsõ sorának adatait, és belapozza az adatterülethez tartozó szegmenst, majd kiírja a programszámláló (PC) értékét a képernyõre hexa formában. Azt akartam tesztelni, hogy valóban a 0100h címtõl kezdõdik a programom.
 A PC adatának megszerzésére a Call majd POP utasítást használtam.

 Ekkor jöttem rá arra a Z80 hiányosságra, hogy pl. nincs relatív CALL utasítás. Egy gépi kódú progamot nem lehet úgy megírni, hogy bárhova teszem a memóriában, ugyanolyan jól mûködik. A JR utasítással a relatív ugrást még megoldja, de ha a program után elhelyezkedõ adatterületet akarom használni, akkor nem tudok rá hivatkozni, mert nem tudom az abszolút címét.
 Nincs olyan utasítás, amivel a programszámláló értékét ki tudom olvasni, sem olyan báziscím regiszter ami megmondaná merre vagyok. Adatok írásához/olvasásához pedig ez elengedhetetlen.

 Végül a referencia könyv alapján feltételezve, hogy 0100h címre fog kerülni a program, sikerült megbizonyosodnom, hogy valóban így van.

 Egy felvetõdött problémát nem sikerült megoldanom maradéktalanul, érdekelne ki hogyan oldotta volna meg:
Adott egy regiszter (HL) amiben van egy 16 bites szám. Szeretném kiírni hexidecimális alakban a négy számjegyet egy memóriacímtõl (DE) egymás után. Kérdés, hogy puszta Z80-as assembly utasítások használatával hogyan tehetem ezt meg?