OldComp.cz

Komunitní diskuzní fórum pro fanoušky historických počítačů


Právě je 24.07.2024, 01:10

Všechny časy jsou v UTC + 1 hodina [ Letní čas ]




Odeslat nové téma Odpovědět na téma  [ Příspěvků: 121 ]  Přejít na stránku Předchozí  1 ... 5, 6, 7, 8, 9  Další
Autor Zpráva
 Předmět příspěvku: Re: Dworkinovy beeperové vypalovačky
PříspěvekNapsal: 10.07.2024, 09:48 
Offline
Pan Štábní

Registrován: 23.06.2013, 23:49
Příspěvky: 1192
Has thanked: 101 times
Been thanked: 189 times
Busy píše:
_dworkin píše:
Busy píše:
Ale aj tak nechapem, ako to ze nevies kolko ti v pameti zabera tvoj kod ?!?! Resp. kde konci ?
Protoze to neni MUJ kod, ale toho programatora a nedivam se na to JA, ale PREKLADAC. ...
A potom ten vygenerovany kod pakujes ? (ako som si vsimol v tej jednej tvojej hudbe)

Lebo ak ano, potom naozaj nemusis nic riesit, proste uloz binarku od 24200 az do 65536-24200 (alebo tusim #FF00-24200 ak si dobre pametam) a zbytocne nuly si paker aj tak stiahne na temer nic. A je to :D


Nepakuji, kod jsem jeste nepakoval. Zatim pokazde jen data, a to jen protoze jina moznost nebyla, kdyz jsem delal tu kolekci hudby.
Moznost pakovat kod, je ale stale pristupna pro toho kdo to chce. Protoze binarku ma k dispozici a predpokladam ze si sezene sam nastroje co to delaji. Je to pro me az dalsi krok, ktery nemusim resit, neco jako posilat data pres pipeline.

Ta rada je tak trosku zoufalstvi kdyz se nad tim zamyslis.
Busy píše:
Ale aj tak, mozes mi poslat nejaky priklad toho nie tvojho zdrojaku ? Rad by som si ho skusil sam skompilovat a pozriet ake su moznosti urcenia jeho dlzky. Verim, ze to dopadne tak ako pri DecLzx02, s ktorym si sa ty neuspesne trapil a mne sa to podarilo preportovat pod Pasmo raz-dva.

Jaky ma smysl posilat ti "ne muj zdrojak"? Psal jsem ze je to jako mit tu knihu zahajeni sachu od zacatku do konce. Vzdy ti budou chybet varianty.
Tady mas ukazku zdrojaku co ti ted bude produkovat rozdilnou velikost binarky podle linkeru. Protoze sjasmplus ma ted tu jednoduchou detekci ze si mysli ze posledni radek je nejvyssi adresa.
Kód:
include(`../M4/FIRST.M4')dnl
  ifdef __ORG
    org __ORG
  else
    org 0x8000
  endif

  INIT(60000)
  PUSH(1) COMMA
  PUSH(2) COMMA
  PUSH(3) COMMA
  PUSH(-4) ALLOT
  PUSH(100) COMMA
  STOP

pasmo
Kód:
      IFDEF(false)
-     org __ORG
      ELSE(true)
      ORG 8000
      ENDIF
8000:ED732580   LD(8025), SP
8004:2E1A   LD L, 1A
8006:CD0516   CALL 1605
8009:2160EA   LD HL, EA60
800C:D9      EXX
800D:E5      PUSH HL
800E:210100   LD HL, 0001
8011:222C80   LD(802C), HL
8014:2C      INC L
8015:222E80   LD(802E), HL
8018:2C      INC L
8019:223080   LD(8030), HL
801C:E1      POP HL
801D:016400   LD BC, 0064
8020:ED432E80   LD(802E), BC
8024:      label Stop
8024:310000   LD SP, 0000
8027:215827   LD HL, 2758
802A:D9      EXX
802B:C9      RET
802C:      label VARIABLE_SECTION
802C:0100   DEFW of 1 words
802E:0200   DEFW of 1 words
8030:0300   DEFW of 1 words
      ORG 802E
802E:6400   DEFW of 1 words
      IF(false)
-     .error Overflow 64k! over 0..255 bytes
      ENDIF
      IF(false)
-     .error Overflow 64k! over 256..511 bytes
      ENDIF
      IF(false)
-     .error Overflow 64k! over 512..1023 bytes
      ENDIF
      IF(false)
-     .error Overflow 64k! over 1024..2047 bytes
      ENDIF
      IF(false)
-     .error Overflow 64k! over 2048..4095 bytes
      ENDIF
      IF(false)
-     .error Overflow 64k! over 4096..8191 bytes
      ENDIF
      IF(false)
-     .error Overflow 64k! over 8192..12287 bytes
      ENDIF
      IF(false)
-     .error Overflow 64k! over 12288..16383 bytes
      ENDIF
      IF(false)
-     .warning Data ends at 0xFF00+ address!
      ENDIF
Emiting raw binary from 8000 to 8031

sjasmplus
Kód:
# file opened: allot.asm
  1   0000                ifdef __ORG
  2   0000 ~                org __ORG
  3   0000                else
  4   0000                  org 0x8000
  5   8000                endif
  6   8000
  7   8000
  8   8000
  9   8000
 10   8000
 11   8000
 12   8000
 13   8000
 14   8000
 15   8000              ;   ===  b e g i n  ===
 16   8000
 17   8000               ifdef _SJASMPLUS
 18   8000                DEVICE ZXSPECTRUM48
 19   8000                ifndef _sjasm_bin_filename
 20   8000 ~               display "warning: _sjasm_bin_filename is not defined!"
 21   8000 ~               define _sjasm_bin_filename "temp.bin"
 22   8000                endif
 23   8000                display "_sjasm_bin_filename is set to: ", "allot.bin"
 24   8000                ifndef _sjasm_tap_filename
 25   8000 ~               display "warning: _sjasm_tap_filename is not defined!"
 26   8000 ~               define _sjasm_tap_filename "temp.tap"
 27   8000                endif
 28   8000                display "_sjasm_tap_filename is set to: ", "allot.tap"
 29   8000                EMPTYTAP "allot.bin"
 30   8000                EMPTYTAP "allot.tap"
 31   8000              _sjasm_begin:
 32   8000               endif
 33   8000 ED 73 25 80      ld  [Stop+1], SP    ; 4:20      init   storing the original SP value when the "bye" word is used
 34   8004 2E 1A            ld    L, 0x1A       ; 2:7       init   Upper screen
 35   8006 CD 05 16         call 0x1605         ; 3:17      init   Open channel
 36   8009 21 60 EA         ld   HL, 0xEA60     ; 3:10      init   Return address stack = 60000
 37   800C D9               exx                 ; 1:4       init
 38   800D E5               push HL             ; 1:11      1 , 2 , ... 3 ,   default version
 39   800E 21 01 00         ld   HL, 1          ; 3:10      1 ,
 40   8011 22 2C 80         ld  [VARIABLE_SECTION],HL; 3:16      1 ,
 41   8014 2C               inc   L             ; 1:4       2 ,
 42   8015 22 2E 80         ld  [2+VARIABLE_SECTION],HL; 3:16      2 ,
 43   8018 2C               inc   L             ; 1:4       3 ,
 44   8019 22 30 80         ld  [4+VARIABLE_SECTION],HL; 3:16      3 ,
 45   801C E1               pop  HL             ; 1:10      1 , 2 , ... 3 ,
 46   801D                                      ;[16:87]    1 , 2 , ... 3 ,
 47   801D                                      ;           -4 allot
 48   801D 01 64 00         ld   BC, 0x0064     ; 3:10      100 ,
 49   8020 ED 43 2E 80      ld  [2+VARIABLE_SECTION],BC; 4:20      100 ,
 50   8024              Stop:                   ;           stop
 51   8024 31 00 00         ld   SP, 0x0000     ; 3:10      stop   restoring the original SP value when the "bye" word is used
 52   8027 21 58 27         ld   HL, 0x2758     ; 3:10      stop
 53   802A D9               exx                 ; 1:4       stop
 54   802B C9               ret                 ; 1:10      stop
 55   802C              ;   =====  e n d  =====
 56   802C
 57   802C              VARIABLE_SECTION:
 58   802C
 59   802C 01 00            dw 0x0001           ;           1 ,   = 1
 60   802E 02 00            dw 0x0002           ;           2 ,   = 2
 61   8030 03 00            dw 0x0003           ;           3 ,   = 3
 62   8032                  ORG $-4             ;           -4 allot   allocation -4 bytes from VARIABLE_SECTION
 63   802E 64 00            dw 0x0064           ;           100    = 100
 64   8030
 65   8030               ifdef _SJASMPLUS
 66   8030                ifndef _sjasm_zx_filename
 67   8030 ~               display "warning: _sjasm_zx_filename is not defined!"
 68   8030 ~               define _sjasm_zx_filename "code"
 69   8030                endif
 70   8030                display "_sjasm_zx_filename is set to: ", "allot"
 71   8030                SAVEBIN "allot.bin" ,                           _sjasm_begin, $-_sjasm_begin
 72   8030                SAVETAP "allot.tap" , CODE, "allot", _sjasm_begin, $-_sjasm_begin
 73   8030               endif
 74   8030
 75   8030              ;# ============================================================================
 76   8030                if ($<0x0100)
 77   8030 ~                .error Overflow 64k! over 0..255 bytes
 78   8030                endif
 79   8030                if ($<0x0200)
 80   8030 ~                .error Overflow 64k! over 256..511 bytes
 81   8030                endif
 82   8030                if ($<0x0400)
 83   8030 ~                .error Overflow 64k! over 512..1023 bytes
 84   8030                endif
 85   8030                if ($<0x0800)
 86   8030 ~                .error Overflow 64k! over 1024..2047 bytes
 87   8030                endif
 88   8030                if ($<0x1000)
 89   8030 ~                .error Overflow 64k! over 2048..4095 bytes
 90   8030                endif
 91   8030                if ($<0x2000)
 92   8030 ~                .error Overflow 64k! over 4096..8191 bytes
 93   8030                endif
 94   8030                if ($<0x3000)
 95   8030 ~                .error Overflow 64k! over 8192..12287 bytes
 96   8030                endif
 97   8030                if ($<0x4000)
 98   8030 ~                .error Overflow 64k! over 12288..16383 bytes
 99   8030                endif
100   8030                if ($>0xFF00)
101   8030 ~                .warning Data ends at 0xFF00+ address!
102   8030                endif
103   8030              ; M4_FORTH compiler
104   8030              ; Wed 10 Jul 08:13:09 BST 2024
105   8030              ; compilation time: 2.601255338 s
106   8030
# file closed: allot.asm

Vyresit jeden pripad nic neresi, protoze se pak otevrou dalsi dva pripady. Posunes hranici poznani a tim zvetsis chapani toho co neznas.
Ja opravdu nechci delat analyzu zdrojaku a vyvaroval se chyb jen proto, abych zjistil jakou ma velikost.
Vem si, ze ani nemusis znat nejake hodnoty, protoze to muze byt vstupni parametr, binarka, bude to chtit zarovnani a to bude zaviset i na pocatku co bude volny parametr, Takze presnou hodnotu bude znat az linker. A ja mu to budu muset predavat jako nejaky vzorec.
Dalsi pripad je ze to obsahuje vkladany assembler. Jak me zjistis kde to konci nebo zacina kdyz ti nereknu jaky assmbler tam je a co dela... kam pak umistis ten vzorec na vypocet delky? Budes analyzovat i ten assembler?

Pokud sjasmplus ma podporu lua tak by asi slo udelat nastavba co by resila kazdou instrukci kazdy org, klidne iteracne a mela nejakou tabulku pameti, kam by si zapisovala zmeny a po projeti celeho zdrojaku, by si nasla prvni a posledni zmeneny bajt a to ulozila.
Vzhledem k tomu ze ve zdrojaku jsou nejaka omezeni, aby to slo vubec skompilovat. Na rozdil od standartu Forthu musi byt ALLOT konstantni, protoze to resim uz behem kompilace a ne za chodu, nesmi byt ve smycce atd.

Ale na to Lua makro nemam kapacitu ani chut jen aby to zapsalo binarku se "spravnou" delkou, zvlast kdyz si myslim ze je to prace toho linkeru.

PS: Dodelal jsem ze sjasmplus je spusten jen jednou. Reseni je videt v tom listingu. Premyslim jak udelat abych vytvoril makro v sjasmplus co by nahradilo ".warning" a ".error" z pasma. Kdyz jsi me poradil to "display". Ale narazil jsem na to ze makra asi nemaji podporu promenliveho poctu parametru. Popripade nepovinne parametry(napriklad ze by zacinali otaznikem nebo tak neco). Takze asi jedine ze bych dal svoje .warningy do uvozovek a udelal z toho jeden jediny text.

PPS: Chvilku me trvalo nez se me podaril spravny zapis jak v "display" zobrazit retezec a i volani je pres -D_sjasm_zx_filename=\"jmeno\" a ty lomitka jsou povinne. sjasmplus nema obcas prilis jasny vypis chyb. Neco bylo definovano 2x. Ale na jakem radku a jak se to jmenovalo nevypise (v tom si muzou s pasmem podat ruce, i kdyz je pasmo asi jeste horsi, staci jedine cislo spatne formatovane a napise neco podivneho a ted hledej v 1000 radkovem kodu co to vlastne chtel).

PPPS: Ne ze by M4_FORTH nebyl v tom vypisu chyb uplne nejhorsi... :D Je to strasna prace, ale imho mam nejhorsi moznosti. .)

_________________
Z80 Forth compiler (ZX Spectrum 48kb): https://codeberg.org/DW0RKiN/M4_FORTH


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Dworkinovy beeperové vypalovačky
PříspěvekNapsal: 11.07.2024, 11:38 
Offline
Óm Nejvyšší

Registrován: 22.05.2013, 21:14
Příspěvky: 3749
Bydliště: Bratislava
Has thanked: 374 times
Been thanked: 809 times
_dworkin píše:
Busy píše:
... naozaj nemusis nic riesit, proste uloz binarku od 24200 az do 65536-24200 (alebo tusim #FF00-24200 ak si dobre pametam) a zbytocne nuly si paker aj tak stiahne na temer nic. A je to :D
Ta rada je tak trosku zoufalstvi kdyz se nad tim zamyslis.
Praveze ani nie. Bitstreamove pakery, ktore pouzivame (Lzx,Zx0) napr. 10kB samych nul stiahnu na cca 5 bajtov, co je zanedbatelne voci zvysku binarky.

Inak toto nie je z mojej hlavy, v navode na stary PackMaker sa vyslovene pise, ze uzivatel nemusi riesit kde co v pameti ma,
proste spakuje celu pamet (myslene od 24200) a paker si sam pozbiera vsetok kod rozhadzany po pameti a pekne ho spakuje.

_dworkin píše:
Busy píše:
mozes mi poslat nejaky priklad toho nie tvojho zdrojaku ?
Jaky ma smysl posilat ti "ne muj zdrojak"? ...
Tu asi doslo k urcitemu nedorozumeniu ... nemyslel som ani tak to ze ja ti v jednom konkretnom zdrojaku urcim co bude na najvyssej adrese, ale skor o to aby som vobec videl taky zdrojak a urobil si o nom predstavu, pretoze si taky zdrojak, kde nevies ohranicit rozsah pameti, kam sa skompiluje, stale nejak neviem predstavit. Ani z tych ukazok kodu co si mi sem dal.

_dworkin píše:
EMPTYTAP "allot.bin"
Toto nepotrebujes, pretoze "allot.bin" nie je tapka a okrem toho SAVEBIN ti subor priamo prepise.
Ak uz subor predtym existuje, tak ho rovno zmaze. Na rozdiel od SAVETAP, ktore su urcene na pridavanie dalsich blokov do tapky a preto je vhodne tapku najprv "vyprazdnit".

_dworkin píše:
Vyresit jeden pripad nic neresi, protoze se pak otevrou dalsi dva pripady.
Podla mna by sa dalo najst univerzalne riesenie. Som optimista :D

_dworkin píše:
Premyslim jak udelat abych vytvoril makro v sjasmplus co by nahradilo ".warning" a ".error" z pasma. Kdyz jsi me poradil to "display". Ale narazil jsem na to ze makra asi nemaji podporu promenliveho poctu parametru.
Priamo premenlivy pocet parametrov asi nie, ale makra podporuju tzv. metaparametre, co je formalne jeden parameter ale ukryva v sebe viac parametrov naraz. Priklad:
Kód:
Zobraz MACRO   all_parameters
       DISPLAY all_parameters
       ENDM

       Zobraz  <"Adresa = ",/A,65535>


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Dworkinovy beeperové vypalovačky
PříspěvekNapsal: 18.07.2024, 19:03 
Offline
Óm Nejvyšší

Registrován: 22.05.2013, 21:14
Příspěvky: 3749
Bydliště: Bratislava
Has thanked: 374 times
Been thanked: 809 times
Nedalo mi, rozmyslal som, ze ked je SjASMPlus taky vsemocny, ze by mohol vediet aj automaticky urcit interval pameti ktora sa ma ulozit.
A vymyslel som to :)
V style znameho "robme veci lepsie" sa dokonca da obmedzit interval, v ktorom sa toto bude automaticky urcovat, takze nie je problem mat aj nejaky ten kod (alebo inicializovane premenne pripravene pre test) aj pomimo.
Kód:
;; Priklad "nelinearneho" kodu,
;; kde nie je na prvy pohlad jasne
;; kde vsade je v pameti rozlezeny

        ORG     #A000
        ld      bc,#AAAA
        ORG     #BFFD
        ld      de,#BBBB
        ORG     #8000
        ld      hl,#CCCC
Kód:
;; Tu zacina cast ktora urci kde sa kod nachadza v pameti

minadd  =       #6000   ; Od tejto adresy sa bude hladat
maxadd  =       #FF00   ; Az po tuto adresu sa bude hladat

maxlen  =       maxadd-minadd
begin   =       0
length  =       0

        DEVICE  ZXSPECTRUM48  ; Definujeme pametovy model

   IF   __PASS__ = 3           ; Hladat staci az v poslednom prechode
        OPT     listmc         ; Toto je nepovinne, len aby sa nezahltil listing

        WHILE   NOT {b minadd} , maxlen
minadd  =       minadd + 1
        ENDW

        WHILE   NOT {b maxadd} , maxlen
maxadd  =       maxadd - 1
        ENDW

        OPT     listact         ; Nepovinne, len kvoli listingu

begin   =       minadd
        IF      minadd <= maxadd
length  =       maxadd + 1 - minadd
        ENDIF

; Zobrazenie najdenych vysledkov (tiez nepovinne)
        DISPLAY "Begin:  " , /A , begin
        DISPLAY "Length: " , /A , length
   ENDIF

;; Ulozenie automaticky najdenej binarky do suboru

        SAVEBIN codefile , begin , length
Zdrojak je mozne samozrejme rozdelit (ako som tu tu rozdelil ja) - prva cast s programatorovym vlastnym kodom moze byt v jednom zdrojaku a druha cast ktora urci kde sa kod nachadza v pameti moze byt v druhom samostatnom zdrojaku ktory je ako dalsi parameter v cmdline.
A samozrejme tam kde je SAVEBIN mozno pouzit aj SAVETAP a binarku si ulozit rovno do tapky. Alebo oba naraz ;)


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Dworkinovy beeperové vypalovačky
PříspěvekNapsal: 19.07.2024, 13:33 
Offline
Pan Štábní

Registrován: 23.06.2013, 23:49
Příspěvky: 1192
Has thanked: 101 times
Been thanked: 189 times
To je jeden z nejtajemnejsich skriptu co jsem videl... to by chtelo vysvetleni co to dela.

osobne bych to resil nejak tak, ze prvni uvaha je, ze potrebujes aby prekladac umel promenou. Pasmo to MOZNA umi od 0.5.5 kde by se snad dalo zneuzit opakovane DEFINE a UNDEFINE s "docasnou konstantou", ale netestoval jsem zda to zvladne.

Druha vec je predefinovat si ORG na neco...

co zjisti ze je to prvni ORG a nastavi MIN a MAX na parametr_org.

Pokud je to dalsi ORG tak prvne zajisti ze MAX = max($,MAX) a MIN=min(MIN, parametr_org)

To by mohlo fungovat, jen by se to jeste muselo upravit tak, ze to zvladne otestovat ze mezi dvema ORG se nic "nezapsalo". Tzn. $ == parametr_predchoziho_org. To by pak znamenalo ze to muzeme ignorovat. Protoze tam nebylo nic, nebo jen definice labelu.

Tohle reseni by mohlo byt pasmo i sjmasmplus kompatibilni pro zjisteni prvniho a posledni adresy ktera byla zmenena.

Ale tve reseni je uplne jine...

zaprve je to v externim souboru, takze nevim jak to propojis s predchozim, ale ma to vyhodu ze je prvni uz kompletne nacten a nikdy to neprovedes predcasne.

pouzivas WHILE, ktere na prvni pohled vypada jako neco jineho nez to dela... jako smycka OD...DO. Ale ve skutecnosti je to WHILE BOOL, MAX_ITERACI pokud jsem to spravne pochopil (existuje nejaky kompletni pruvodce sjasmplus?)

takze to WHILE NOT {b label}, cislo

vytvari u {b label} true nebo false.

Z toho, ze jednou to cte od nejnizsi adresy a postupne ji zveda a podruhe od nejvyssi a postupne ji snizuje predpokladam ze to "b" dokaze zjistit zda na te adrese je neco zapsano. Protoze pres to NOT (ktere bude teda logicke a ne binarni) se to ukonci na prvni adrese, ktera je "pouzita".

Nenasel jsem nikde popis toho "b", a ono se to i blbe hleda, protoze nevim jak to hledat. Ale tahle predstava dava smysl, ze by mohla fungovat nezavisle na obsahu prvniho souboru.

_________________
Z80 Forth compiler (ZX Spectrum 48kb): https://codeberg.org/DW0RKiN/M4_FORTH


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Dworkinovy beeperové vypalovačky
PříspěvekNapsal: 19.07.2024, 18:07 
Offline
Pan Štábní

Registrován: 23.06.2013, 23:49
Příspěvky: 1192
Has thanked: 101 times
Been thanked: 189 times
Prevedl jsem ten tvuj kod do runtime.m4.

Vsechno vypadalo ok, ale jakmile jsem se to pokusil zkompilovat pasmem tak na me zarval ze tam je znak {....
Takze z toho vypliva ze to budu muset mit jen v externim souboru...

Testoval jsem trosku dal a zjistil ze ani to nepomuze...

protoze to "b label" testuje jen zda ta adresa byla pouzita...

takze pokud kod konci...

0x8000 dw 0x1234

nebo

0x8000 db 0x12

tak bude tvrdit ze je posledni pouzita adresa 0x8000!!!

PS: Zda se ze u string retezcu definovnych jako "DB "Hello Word!" je to v poradku a najde adresu posledniho pismene. Asi to vnitrne predela na 11x DB jedno_pismeno, ale u toho DW to ma jinak...

_________________
Z80 Forth compiler (ZX Spectrum 48kb): https://codeberg.org/DW0RKiN/M4_FORTH


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Dworkinovy beeperové vypalovačky
PříspěvekNapsal: 19.07.2024, 22:23 
Offline
Óm Nejvyšší

Registrován: 22.05.2013, 21:14
Příspěvky: 3749
Bydliště: Bratislava
Has thanked: 374 times
Been thanked: 809 times
_dworkin píše:
To je jeden z nejtajemnejsich skriptu co jsem videl... to by chtelo vysvetleni co to dela.
To je uplne jednoduche. Prvy WHILE prehladava pamet odspodu smerom hore a hlada prvy nenulovy bajt a druhy WHILE zase hlada prvy nenulovy bajt odvrchu smerom dole. A ked tam mas nejaky normalny kod, tak sa tymto pekne ohranici - a je to :)
_dworkin píše:
Tohle reseni by mohlo byt pasmo i sjmasmplus kompatibilni pro zjisteni prvniho a posledni adresy ktera byla zmenena.
Celkom som nepochopil to riesenie s ORGami, musim si to este poriadne nastudovat.
Ale ! Ty nepotrebujes ziadne kompatibilne riesenie, ved Pasmo to ma defaultne vsetko toto si vie urobit sam.
Takze "najkompatibilnejsie" riesenie je:
Prikaz pre Pasmo: pasmo tvoj_zdrojak binarka.bin
Prikaz pre SjASMPlus: sjasmplus tvoj_zdrojak pomocny_zdrojak
Pricom vsetky cinnosti spojene s hladanim rozsahu kodu a ukladania do binarky a tapky zabezpeci ten pomocny_zdrojak tak ako som to popisoval v mojich predchadzajucich prispevkoch.
_dworkin píše:
zaprve je to v externim souboru, takze nevim jak to propojis s predchozim
Asi si necital moje predchadzajuce prispevky. Tam som pisal, ze do cmdline pre sjasmplus mozes napisat aj viac zdrojakov, a vsetky sa kompiluju ako keby to bol jeden dlhy zdrojak. Takze ak nieco definujes v jednom, mozes to nasledne pouzit v inom. proste take automaticke zlinkovanie :)
_dworkin píše:
existuje nejaky kompletni pruvodce sjasmplus?
Samozrejme, priamo na hlavnom githube mas dokumentaciu:
http://z00m128.github.io/sjasmplus/documentation.html
A tam sa v casti Expressions dozvies:
Kód:
{}    {x}      reads WORD from address x (in virtual device mode, in last pass)
{b}   {b x}    reads BYTE from address x (in virtual device mode, in last pass)
takze zlozene zatvorky su taky PEEK ktorym si mozes precitat co si si skompiloval. No a WHILE / ENDW funguje presne ako IF/ ENDIF len s tym, ze tuto cast zdrojaku neustale dokola kompiluje a prestane az vtedy, az vyraz bude FALSE.
_dworkin píše:
Z toho, ze jednou to cte od nejnizsi adresy a postupne ji zveda a podruhe od nejvyssi a postupne ji snizuje predpokladam ze to "b" dokaze zjistit zda na te adrese je neco zapsano. Protoze pres to NOT (ktere bude teda logicke a ne binarni) se to ukonci na prvni adrese, ktera je "pouzita".
Presne tak, len s tym rozdielom ze nejde o "pouzite" adresy, ale adresy kde je nenulovy obsah.
_dworkin píše:
Vsechno vypadalo ok, ale jakmile jsem se to pokusil zkompilovat pasmem tak na me zarval ze tam je znak {....
Ale to ta predsa mohlo napadnut, ze Pasmo operator {b x} nepozna. Ale ako som uz vyssie napisal, tato cast pre Pasmo absolutne nema zmysel, pretoze Pasmo defaultne automaticky samovolne urcuje co bude ukladat do binarky.
_dworkin píše:
takze pokud kod konci...
0x8000 dw 0x1234
nebo
0x8000 db 0x12
tak bude tvrdit ze je posledni pouzita adresa 0x8000!!!
Nie, v prvom pripade to ako poslednu nenulovu adresu najde #8001 a iba v druhom pripade to bude #8000.


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Dworkinovy beeperové vypalovačky
PříspěvekNapsal: 20.07.2024, 01:01 
Offline
Pan Štábní

Registrován: 23.06.2013, 23:49
Příspěvky: 1192
Has thanked: 101 times
Been thanked: 189 times
Tak jsem ten problem pochopil. Pokud to cte fakt ten bajt a ja testoval ve skutecnosti cisla 1,2,3 ale jako integer, tak je to tim ze to koncilo nulou (horni bajt) a ne protoze to byl DW. Takze to pak pres NOT bylo jako TRUE a pokracovalo to dal.

Proto se pak lisila ta velikost...
To je trosku neprijemne, ze by se mohla velikost lisit o jeden nebo 3 bajty. Vlastne i vic... a pak by se chovani lisilo zda uz tam neco bezelo nebo ne...

Takze teoreticky pokud dokazes rozlisit v jakem si pruchodu... tak treba pridat jako prvni soubor neco jako

Kód:
minadd  =       #6000   ; Od tejto adresy sa bude hladat
maxadd  =       #FF00   ; Az po tuto adresu sa bude hladat

maxlen  =       maxadd-minadd

if   __PASS__ = 2 
  ORG minadd

  dup maxlen
  db 0x33
  edup
 endif


a ve druhem pruchodu zjistit pocatek a konec a znovu ve tretim pruchodu a pak se nejak rozhodnout... zda se to nelisi kvuli necemu jinemu...? Popripade zvolit vzdy horsi (vetsi celkove, ale bezpecnejsi) variantu? Hmm...

PS: Mimochodem, cetl jsem co si psal. A pochopil jsem ze to muze byt jak v souboru tak externe. A mit to v souboru bylo pro me snazsi, proto me prekvapilo ze to pasmo nevezme i kdyz je to schovane za
Kód:
ifdef _SJASMPLUS
 ...{b}....
endif


PPS: Mozna misto 0x33 by bylo o mikron lepsi neco jako 0x6D "ld L,L" protoze je to celkem nesmyslny jako instrukce a jako konstanta je to to lepsi nez 0x7F "ld A,A" protoze treba tohle by mohlo byt pouzivano pro zjisteni MAX INT.

_________________
Z80 Forth compiler (ZX Spectrum 48kb): https://codeberg.org/DW0RKiN/M4_FORTH


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Dworkinovy beeperové vypalovačky
PříspěvekNapsal: 20.07.2024, 13:03 
Offline
Pan Štábní

Registrován: 23.06.2013, 23:49
Příspěvky: 1192
Has thanked: 101 times
Been thanked: 189 times
Mozna by stalo za to rozsirit sjasmplus o "{o address} kde by vracel TRUE pokud byla adresa prepsana. Mozna je misto "o" (overwrite) lepsi pismeno "w" (write), bylo by to bliz snadardum.

Hodilo by se to jak pro debugovani tak tady pro zjisteni velikosti toho kodu.

Jinak jsem chtel mluvit celou dobu o necem jinem a v jinem vlaknu... .)

Takze jak jsem se hrabal v tom ukladani pro sjasmplus tak jsem narazil na to, ze mam nejaky problem kdyz udelam "PUSH(10,20,abc) FMDIVMOD"

vracelo to nejaky nesmysl...

Po nekolika dnech debugovani jsem zjistil ze je to ve fci __EVAL.
Pak jsem zjistil ze tech chyb je jeste vic a saha to az do fce __SIMPLIFY_EXPRESSION a to byl problem, protoze to se pouziva vsude. Snazi se to rozlozit, preskupit a zjednodusit matematicky vyraz (se zavorkama a jakymykoliv operatory a i neznamyma a pointerama).
Zjednodusit pomoci...SEDu, nebo presneji opakovaneho regexpu. Takze je to trosku silene...
A protoze jsem to vic jak mesic nevidel tak to byl pro me uplne cizi kod... nejakeho blazna nebo co, normalni clovek by to takhle nepsal.
__SIMPLIFY_EXPRESSION me shazoval uplne cely preklad.
A jak jsem postupne zjednodusoval ten vyraz na kterem to padalo tak jsem se dostal do faze ze me nefungovaly ani vyrazy typu

10+(x1+x2+x3) ktere mel zjednodusit na 10+x1+x2+x3...

Ani kdyz jsem zapnul debugovaci priznak pro tu fci tak me nevypsal presne v jakem kroku to spadlo. Takze jsem rozdelil "chytre" errprint na dva, aby v prvnim bylo jen vypsano co se bude delat a spadlo to az v druhem, ktery se nikdy nevypise kvuli tomu ze tem prebyvali neuzavrene zavorky, takze to makro nerozdychalo.
+Pak me doslo ze to stacilo obalit jeste jednou vrstvou {} zavorek, takze to stale videl jako retezec a bylo jedno ze je tam neco jako {...((...}, protoze pak nejsou ty vnitrni zavorky interpretovany. Takze jsem to rozdeleni zase vratil.
A protoze ta chyba byla na dost zakladni urovni i v jednoduchych operacich, tak jsem pridal dalsi obaleni fce __SIMPLIFY_EXPRESSION kde se pocitaji ty zavorky a kdyz nesedi tak je odhalena chyba.
To me prislo jako docela dobre a smesne reseni, ze to makro dokaze odhalit obcas ze selze a ten vyraz pak vratit v puvodnim stavu. Dobra silenost...
Testoval jsem ale i vstup a ukazalo se ze nesedi i vstup. Takze jsem opravil __EVAL kde jsem zapomnel pri rozdeleni kodu na vic radku odmazat konec radku, takze ten vyraz byl na dvou radcich a kazdy radek se pak analyzoval zvlast (regexp to v M4 jinak ani neumi a stejne to byla chyba).
Ale to uz jsem vedel ze i v __SIMPLIFY_EXPRESSION je chyba taky.

Musel jsem se znova ucit co ten regexp ktery selhaval dela od zacatku, protoze mel fakt divne chovani.

kdyz je nejaky VZOR typu
+12-4-6+34+6...

tak to jde zachytit

\([-+][0-9]+\)+

kde minus je prvni a ne neco jako +- protoze ma uprostred [] zavorek jiny vyznam
[0-9]+ je jasny ze to musi byt znak 0 az 9 aspon jedno nebo vickrat (diky + na konci)
To ze je to cele v zavorce pomuze tomu ze diky plus na konci se to muze opakovat kolikrat chce...
Ma to ale jeden problem, ze si to pamatuje jen POSLEDNI vyskyt, takze za koncem napsat \1 vypise jen +6 a ne cely retezec.
Takze se to musi jeste cele obalit do dalsich zavorek.

\(\([-+][0-9]+\)+\)

takze \1 vypise vse a \2 jen ten posledni +6 nalezeny vyskyt.

Tuhle metodu ale sloziteji jsem pouzival pro nalezeni zaovrek, zanorenych zavorek... proste bylo dulezite najit odpovidajici zacatek a konec.

(x2*x1/(x3+3))+10

kdyz chci prevest na

10+(x2*x1/(x3+3))

Protoze plati ze konstanta prvni, pak promena typu "x1" a nakonec zavorky. To pomuze jak zjednodusit vyraz, protoze jsou u sebe konstanty jako 10+1 a snadno to najdes a udelas 11 nebo a1-a1 zmenis na 0. Tak to pak pomaha zjistit ze nejaky vyraz je shodny s jinym i kdyz neznam hodnotu, protoze se to pak porovnava jako retezec.

Takze "1+addr_1" je shodne s "addr_1+1" protoze se porovnaji az upravene retezece.

Sakra to jsem dost odbehl...

Muj problem byl ze co jsem mel spravne nalezl co mel nalezt. Ale nevypisoval nalezene casti vyrazu jako je ten posledni "+6".
Ale cestou znovunauceni regexpu jsem prisel stejne na efektivnejsi zpusob jak nalezat ty konce zavorek...

Puvodni byl neco jako
Kód:
;  "-+ ("         (      ) |(          (      )   ) |(          (      )  (          (      )   )   )  ")"
 \([-+](\([^()]*\|([^()]*)\|(\([^()]*\|([^()]*)\)*)\|(\([^()]*\|([^()]*)\|(\([^()]*\|([^()]*)\)*)\)*)\)*)\)


...kde jsem zvlast resil pres OR = \| varianty kdy je tam jedna zavorka, nebo zanoreni dvou ci tri...

pritom se to da resit ze je tam jedna zavorka
uvnitr se pouzije ta escapovana \( .. \)+ aby se tam mohlo opakovat donekonecna jedine 2 varianty...

a to... jen cislo nebo promena a za |\ druha varianta, ktera je zase znovu "jedna zavorka".

To pridava jen jednu uroven escapovanych \( zavorek na normalni zavorky. To je dulezite protoze maximalni pocet je 9. Protoze \9 vypise devatou zavorku a \10 vypise prvni a znak nuly za tim.

Kód:
"("           (          (          (      )   )   )    ")
 (\(\([^()]+\|(\([^()]+\|(\([^()]+\|([^()]+)\)+)\)+)\)+\))


Na a ten problem co jsem mel nastal asi tim ze jsem v nejake fazi musel editovat puvodni kod kde bylo \( ... \)+ a teda vyraz v escapovane zavorce musi byt nalezen aaspon jednou na \( ... \)*, kde muze byt vickrat nebo vubec. Bohuzel ten regexp vracel spravne NALEZENO, ale byl uz rozbity ze obsahoval obcas prazdne retezce a toho jsem si nevsimnul... Mylsel jsem si, ze jsem vyresil i spatny zapis typu 5+() a misto toho to cele rozbil a NIKDO si to doted nevsiml (taky jsem jediny kdo to pouziva...).
Ale tohle udelalo nejakou neplechu, ze si to pamatovalo asi ze na konci to naslo jeste prazdnou mnozinu a tu si ulozilo. Fakt nevim, tohle jde uz mimo me, na tohle fakt nemam.

Dobra zprava je, ze jsem to opravil, kde jsem aspon odhalil chybu a jeste to ted i nekdy vyresi i vetsi hloubku zanoreni zavorek.

Dokaze to i obcas odhalit fatalni selhani (a zotavit se z toho! protoze proste vynecha tu fci/makro na zjednoduseni) kdy vysledek nema ani odpovidajici pocet otviracich a zaviracich zavorek. To bylo mimochodem taky docela narocne udelat, protoze samotny znak "(" nebo ")" zpusobuje "nevyvazenost" a kdyz teda vyhauji z retezce znak za znakem, tak me to selze a kdyz to obalim do {} tak se me neaktivuje ta fce/makro na vytahnuti znaku... takze nakonec se to dela regexpem, ktery vraci pozici (cislo znaku od 0 kde nalezl prvni shodu) Takze to vraci 0 pro TRUE a -1 pro FALSE. Ale... jak udelat regexp co prochazi retezec znak po znaku a hleda "(" nebo ")" na konkretni pozici? .)) Proste brutalne pridam do iteracniho makra parametr typu retezec co obsahuje NIC nebo TECKY (tecka je regexp pro jako jakykoliv jeden znak) a pokazde pridam dalsi tecku, takze to preskoci na dalsi znak a ten parametr/retezec vkladam na zacatek toho regexpu.

Nevyhoda je, ze ten test spravnosti to zase o neco vic zpomaluje,

PS: A jeste posilam jednu nedodelanou tapku s "Tonight Tonight", bez bubnu a s obcas orezanymi kanaly z 10 na 8. Ale kupodivu uz ted je to poslouchatelne (pro nekoho). nod = no drums

PPS: Takze ve zkratce. Vytvoril jsem umely problem, ktery nikoho nezajima. Ten jsem pracne vyresil i kdyz to nikoho nezajima. A odchazim spokojen s pocitem dobre vykonane prace... .) i kdyz to stale nikoho nezajima.

PPPS: Premysleli jste nekdy zda hudba je spis jako hodinovy stroj nebo spis jako nedelni obed? :D Jak je mozny ze kdyz vynecham nejake zvuky tak to bude stale znit dobre... (stejne jako jsem vynechal carku pred "tak" hodinoveho stroje gramatiky), protoze nechybi kolecka stroje, ale orezal jsem mrkev, protoze se me talir nevlezl do mikrovlnky...Takze to nevypada tak dobre, ale na chuti to neni tak poznat? Hmmm... Silenstvi.
Mozna je to jako rizoto, u ktereho jsem vynechal hrasek.
...i kdyz... ono je to jeste hlubsi... to je problem zapadni hudby... ze je stavena vertikalne... :D ze na sebe sklada vrstvy, hrajici jine tony aby dosahla... "harmonickych frekvenci" o ktere usiluje. Takze kdyz odpadne vrstva tak to stale muze znit stejne. Na rozdil od stredoveku kde to bylo horizontalni. Jedina melodie, jedina vrstva. Ani asi nemuseli mit nastroje co dokazi hrat akord, treba jednu strunu. Ale hrana trosku jinak protoze se mezi tony prokladaly rychle jine prechodove tony. "ornamenty". Takze to pak zni jako nejaka muslimska, indicka hudba? (i kdyz se to tak neda oznacovat, protoze je to stale evropska stredoveka hudba, predchudce dnesni hudby vystaveny na jinych principech) Kde se hraji disharmonicke tony, protoze je jim to fuk a zalezi na necem jinem? Na rytmu atd.


Přílohy:
tonight_nod.tap [10.83 KiB]
46 krát

_________________
Z80 Forth compiler (ZX Spectrum 48kb): https://codeberg.org/DW0RKiN/M4_FORTH
Nahoru
 Profil  
 
 Předmět příspěvku: Re: Dworkinovy beeperové vypalovačky
PříspěvekNapsal: 22.07.2024, 17:49 
Offline
Óm Nejvyšší

Registrován: 22.05.2013, 21:14
Příspěvky: 3749
Bydliště: Bratislava
Has thanked: 374 times
Been thanked: 809 times
_dworkin píše:
Tak jsem ten problem pochopil. Pokud to cte fakt ten bajt a ja testoval ve skutecnosti cisla 1,2,3 ale jako integer, tak je to tim ze to koncilo nulou (horni bajt) a ne protoze to byl DW. Takze to pak pres NOT bylo jako TRUE a pokracovalo to dal.
No ale pokial potom tento subor loadujes do pameti vynulovanej po Reset/NEW, tak to vobec nevadi, lebo tie nuly tam uz mas predpripravene :D
Ine by to bolo ak by si to chcel pakovat, a nasledne depakovat s prekryvom dat, tam by sa to nemuselo strafit.
_dworkin píše:
Takze teoreticky pokud dokazes rozlisit v jakem si pruchodu...
...
Pozor, toto by nefungovalo, pretoze kod sa generuje iba v poslednom prechode (to je obecna univerzalna vlastnost platna aj pre ostatne asemblery ako Pasmo). V prechodoch pred poslednym sa vzdy iba definuju labely, aby v poslednom prechode, generujucom kod, boli ich hodnoty uz zname a mohli sa bez problemov skompilovat aj dopredne referencie (napr. skok na vyssie adresy).
_dworkin píše:
me prekvapilo ze to pasmo nevezme i kdyz je to schovane za
Kód:
ifdef _SJASMPLUS
 ...{b}....
endif
Pri kompilacii musi asembler vyhodnocovat aj riadky ktore su v nesplnenych castiach IF/ELSE/ENDIF pretoze musi hladat prave to ELSE / ENDIF. Takze ani tam nemozes napisat nieco, comu ten konkretny asembler absolutne nerozumie.
_dworkin píše:
PPS: Mozna misto 0x33 by bylo o mikron lepsi neco jako 0x6D "ld L,L" protoze je to celkem nesmyslny jako instrukce a jako konstanta je to to lepsi nez 0x7F "ld A,A" protoze treba tohle by mohlo byt pouzivano pro zjisteni MAX INT.
Pokial chces pamet vyplnit nejakym inym bajtom aby ti "detekoval" aj nuly, potom riesenie je jednoduche - v pripade pre SjASMPlus budu az tri zdrojaky:

Prikaz pre Pasmo: pasmo tvoj_zdrojak binarka.bin
Prikaz pre SjASMPlus: sjasmplus vyplnenie_pameti tvoj_zdrojak pomocny_zdrojak

Zdrojak vyplnenie_pameti bude vyzerat takto:
Kód:
ORG #4000
DS #C000 , #6D
No proste najprv si vyplnis pamet tou (najnepouzivanejsou) hodnotou a potom do tejto pameti generujes kod a nakoniec najdes prvy a posledny bajt tvojho kodu.
Co sa tyka vyberu bajtu ktorym si pamet predvyplnis, uplne staci ak to bude taky bajt ktory urcite nebude ani prvy a ani posledny bajt kodu. Ak sa bude v kode nachadzat niekde uprostred, to vobec nevadi.


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Dworkinovy beeperové vypalovačky
PříspěvekNapsal: 22.07.2024, 19:22 
Offline
Óm Nejvyšší
Uživatelský avatar

Registrován: 07.07.2019, 22:14
Příspěvky: 3940
Has thanked: 289 times
Been thanked: 472 times
_dworkin píše:
PPPS: Premysleli jste nekdy zda hudba je spis jako hodinovy stroj nebo spis jako nedelni obed? :D Jak je mozny ze kdyz vynecham nejake zvuky tak to bude stale znit dobre... (stejne jako jsem vynechal carku pred "tak" hodinoveho stroje gramatiky), protoze nechybi kolecka stroje, ale orezal jsem mrkev, protoze se me talir nevlezl do mikrovlnky...Takze to nevypada tak dobre, ale na chuti to neni tak poznat? Hmmm... Silenstvi.
Mozna je to jako rizoto, u ktereho jsem vynechal hrasek.
...i kdyz... ono je to jeste hlubsi... to je problem zapadni hudby... ze je stavena vertikalne... :D ze na sebe sklada vrstvy, hrajici jine tony aby dosahla... "harmonickych frekvenci" o ktere usiluje. Takze kdyz odpadne vrstva tak to stale muze znit stejne. Na rozdil od stredoveku kde to bylo horizontalni. Jedina melodie, jedina vrstva. Ani asi nemuseli mit nastroje co dokazi hrat akord, treba jednu strunu. Ale hrana trosku jinak protoze se mezi tony prokladaly rychle jine prechodove tony. "ornamenty". Takze to pak zni jako nejaka muslimska, indicka hudba? (i kdyz se to tak neda oznacovat, protoze je to stale evropska stredoveka hudba, predchudce dnesni hudby vystaveny na jinych principech) Kde se hraji disharmonicke tony, protoze je jim to fuk a zalezi na necem jinem? Na rytmu atd..


phpBB [video]
phpBB [video]

Ne všechna západní hudba je postavená na harmonických frekvencích :-). Vezměme si takového atonálního* Schönberga...

*) Ne, atonálnost není ani nemoc ani úchylka (teda možná) :angel:


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Dworkinovy beeperové vypalovačky
PříspěvekNapsal: 23.07.2024, 14:28 
Offline
Pan Štábní

Registrován: 23.06.2013, 23:49
Příspěvky: 1192
Has thanked: 101 times
Been thanked: 189 times
Busy píše:
_dworkin píše:
Takze teoreticky pokud dokazes rozlisit v jakem si pruchodu...
...
Pozor, toto by nefungovalo, pretoze kod sa generuje iba v poslednom prechode (to je obecna univerzalna vlastnost platna aj pre ostatne asemblery ako Pasmo). V prechodoch pred poslednym sa vzdy iba definuju labely, aby v poslednom prechode, generujucom kod, boli ich hodnoty uz zname a mohli sa bez problemov skompilovat aj dopredne referencie (napr. skok na vyssie adresy).


To zni skoro jako ze i pasmo generuje kod v "poslednim pruchodem".
Otazka je trosku co si predstavujes pod tim "generuje kod".
Pasmo se navenek tvari ze ma jeden pruchod i kdyz ma skakat dolu. Tzn ze asi vytvri pri JMP _dolu_ nejakou tabulku, kde _dolu_ nahradi v kodu nulama? a zapise si ze az zjisti adresu _dolu_ ze ma ty nuly prepsat. Je to jeden pruchod? .)
Ale jakmile dostane neco co slozitejsiho tak je videt ve vypisu "-d" ze bude podle potreby kod opakovat (i vickrat).
V kazdem pruchodu ukaze kod.

Jestli sjasmplus "generuje kod" az v tom poslednim pruchode, tak by to chtelo to {w address}, aby to tvoje reseni bylo 100% funkcni bez analyzy kodu.

Busy píše:
_dworkin píše:
me prekvapilo ze to pasmo nevezme i kdyz je to schovane za
Kód:
ifdef _SJASMPLUS
 ...{b}....
endif
Pri kompilacii musi asembler vyhodnocovat aj riadky ktore su v nesplnenych castiach IF/ELSE/ENDIF pretoze musi hladat prave to ELSE / ENDIF. Takze ani tam nemozes napisat nieco, comu ten konkretny asembler absolutne nerozumie.


Tohle ale zabiji doprednou kompatibilitu!
Forth to ma treba jinak...
Hleda jen "else" a "end" a ignoruje vsechno ostatni...
Nevyhoda je ze to klidne vezme "else" a "end" z textoveho retezce.
Imho je to chyba pasma.

Ptal ses predtim jak to myslim s tim predefinovanim ORG.
Kód:
 macro check_first _a1
  ifdef _SJASMPLUS
   ifndef __first_addr
     define __first_addr _a1
   else
    if __first_addr > _a1
     undefine __first_addr
     define __first_addr _a1     
    endif
   endif
  endif
 endm

 macro check_last _a1
  ifdef _SJASMPLUS
   ifndef __last_addr
    define __last_addr _a1
   else
    if __last_addr < $
     undefine __last_addr
     define __last_addr $ 
    endif   
   endif
  endif
 endm

 macro setorg _a1
  ifdef _SJASMPLUS
   display "new org: ", _a1, " !!!"
  endif
  check_first _a1
  check_last _a1 
  ifdef _SJASMPLUS
   display "first: ", __first_addr
   display " last: ", __last_addr
  endif

  org _a1
 endm


  setorg 0x8000
  dw 1
  dw 2
  dw 3
  setorg $-4
  dw 4

  check_last $
  ifdef _SJASMPLUS
   display __first_addr
   display __last_addr
  endif
 
  ifdef _SJASMPLUS
   display "true value is ",    1 = 1, " and false value is ", 1 = 0
   display "< and > is unsigned? --> ", 0x7FFF < 0x8000, " and ", 0x8000 > 0x7FFF
  endif

tohle je ta jednodussi varianta kde se ignoruje prazdny ORG bez kodu, nebo alokace...
ale.. stejne to nefunguje protoze se zda ze sjasmplus ma nekde chybu.
Kód:
SjASMPlus Z80 Cross-Assembler v1.20.1 (https://github.com/z00m128/sjasmplus)
Pass 1 complete (0 errors)
Pass 2 complete (0 errors)
> new org: 0x8000 !!!
> first: 0x8000
>  last: 0x8000
> new org: 0x8002 !!!
> first: 0x8000
>  last: 0x8006
> 0x8000
> 0x8004
> true value is 0xFFFFFFFF and false value is 0x0000
> < and > is unsigned? --> 0xFFFFFFFF and 0xFFFFFFFF
Pass 3 complete
Errors: 0, warnings: 0, compiled: 123 lines, work time: 0.000 seconds

kdyz zmenim testovany kod na
Kód:
  setorg 0x8000
  dw 1
  dw 2
  dw 3
  setorg $-8
  dw 4

tak to vypise
Kód:
SjASMPlus Z80 Cross-Assembler v1.20.1 (https://github.com/z00m128/sjasmplus)
Pass 1 complete (0 errors)
Pass 2 complete (0 errors)
> new org: 0x8000 !!!
> first: 0x8000
>  last: 0x8000
> new org: 0x7FFE !!!
> first: 0x7FFE
>  last: 0x8006
> 0x7FF8
> 0x8000
> true value is 0xFFFFFFFF and false value is 0x0000
> < and > is unsigned? --> 0xFFFFFFFF and 0xFFFFFFFF
Pass 3 complete
Errors: 0, warnings: 0, compiled: 125 lines, work time: 0.002 seconds

Takze jsem pridal dalsi vypisy (ve skutecnosti to co jsem ukazal je promazana cast aby to bylo jasnejsi tohohle kodu
Kód:
 macro check_first _a1
  ifdef _SJASMPLUS
   ifndef __first_addr
     define __first_addr _a1
     display "frt: ", __first_addr
   else
    if __first_addr > _a1
     display "frt: ", __first_addr, " --> ", _a1
     undefine __first_addr
     define __first_addr _a1     
    else
     display "no edit first addr: ", __first_addr, " <= ", _a1     
    endif
   endif
   display "_fa: ", __first_addr   
  endif
 endm

 macro check_last _a1
  ifdef _SJASMPLUS
   ifndef __last_addr
    define __last_addr _a1
    display "end: ", __last_addr
   else
    if __last_addr < $
     display "end: ", __last_addr, " --> ", $
     undefine __last_addr
     define __last_addr $ 
    else
     display "no edit last addr: ", __last_addr, " >= ", $, " (", _a1, ")"
    endif   
   endif
   display "_la: ", __last_addr   
  endif
 endm

 macro setorg _a1
  ifdef _SJASMPLUS
   display "new org: ", _a1, " !!!"
  endif
  check_first _a1
  check_last _a1 
  org _a1
 endm


  setorg 0x8000
  dw 1
  dw 2
  dw 3
  setorg $-4
  dw 4

  check_last $
  ifdef _SJASMPLUS
   display __first_addr
   display __last_addr
  endif
 
  ifdef _SJASMPLUS
   display "true value is ",    1 = 1, " and false value is ", 1 = 0
   display "< and > is unsigned? --> ", 0x7FFF < 0x8000, " and ", 0x8000 > 0x7FFF
  endif

A to vypise
Kód:
SjASMPlus Z80 Cross-Assembler v1.20.1 (https://github.com/z00m128/sjasmplus)
Pass 1 complete (0 errors)
Pass 2 complete (0 errors)
> new org: 0x8000 !!!
> frt: 0x8000
> _fa: 0x8000
> end: 0x8000
> _la: 0x8000
> new org: 0x8002 !!!
> no edit first addr: 0x8000 <= 0x8002
> _fa: 0x8000
> end: 0x8000 --> 0x8006
> _la: 0x8006
> no edit last addr: 0x8004 >= 0x8004 (0x8004)
> _la: 0x8004
> 0x8000
> 0x8004
> true value is 0xFFFFFFFF and false value is 0x0000
> < and > is unsigned? --> 0xFFFFFFFF and 0xFFFFFFFF
Pass 3 complete
Errors: 0, warnings: 0, compiled: 131 lines, work time: 0.001 seconds

popripade kdyz testovany kod je
Kód:
  setorg 0x8000
  dw 1
  dw 2
  dw 3
  setorg $-8
  dw 4

Kód:
SjASMPlus Z80 Cross-Assembler v1.20.1 (https://github.com/z00m128/sjasmplus)
Pass 1 complete (0 errors)
Pass 2 complete (0 errors)
> new org: 0x8000 !!!
> frt: 0x8000
> _fa: 0x8000
> end: 0x8000
> _la: 0x8000
> new org: 0x7FFE !!!
> frt: 0x8000 --> 0x7FFE
> _fa: 0x7FFE
> end: 0x8000 --> 0x8006
> _la: 0x8006
> no edit last addr: 0x8000 >= 0x8000 (0x8000)
> _la: 0x8000
> 0x7FF8
> 0x8000
> true value is 0xFFFFFFFF and false value is 0x0000
> < and > is unsigned? --> 0xFFFFFFFF and 0xFFFFFFFF
Pass 3 complete
Errors: 0, warnings: 0, compiled: 133 lines, work time: 0.000 seconds

Kde jsem si jisty ze jsem okomentoval POKAZDE kdyz se meni hodnota __first_addr nebo __last_addr.
Ale on si ji nejak nepamatuje nebo provadi neci jineho na pozadi... nebo meni poradi vyhodnoceni asm textaku?
Takze i kdyz ty adresy spravne najde, tak je pak nakonec zapomene...
Ukazuje me to jen v tretim pruchodu.

K tomu poznamka... tenhle kod pasmo spravne zkompiluje.
Ale jen kdyz prohodim slovo "macro" s nazvem makra a nebo pridam za nazev makra carku.
Pasmo umi 2 varianty..

nazev_makra MACRO parametr [, dalsi_parametr]

a

MACRO nazev_makra [, parametr]

sjasmplus umi jen tu druhou ale s tim ze za nazvem makra nesmi byt carka, ta je az pred druhym parametrem...

Takze diky tomu i kdyz je to schovane za "ifdef _SJASMPLUS" to NEJDE zkompilovat... lol...

pasmo neumi ani "undefine" takze promene fakt nepodporuje a nejdo to napsat v pasmu ani kdyz "define" zmenite na "equ".

Zkousel jsem obejit tu carku tim, ze ji pridam falesne do sjasmplus...
Kód:
 define ,xx

 macro check_first ,xx _a1

ale to selze ze to carkou nesmi zacinat
Kód:
SjASMPlus Z80 Cross-Assembler v1.20.1 (https://github.com/z00m128/sjasmplus)
org_vypis.asm(3): error: Illegal argument name: ,xx _a1
Pass 1 complete (1 errors)
Pass 2 complete (1 errors)
org_vypis.asm(1): error: [DEFINE] Illegal <id>: ,xx

...zajimave je to poradi tech chyb co to vypise... radek 3 a az pak radek 1.

Mozna ze existuje nejaky trik jak tohle obejit, ted to vypada ze pasmo a sjasmplus maji shodny vypis pro makra jen kdyz tam neni ani jeden parametr....
a sjasmplus neumi 100% automaticky ulozit binarku bez rucniho zasahu dokud neprida {o address}.

PS: kdyz dam setorg $-0x1000 a pak setorg $-256 tak vyleze
Kód:
dworkin@dw-A15:~/Programovani/ZX/Forth/Test$ sjasmplus org.asm --lst=list.txt
SjASMPlus Z80 Cross-Assembler v1.20.1 (https://github.com/z00m128/sjasmplus)
Pass 1 complete (0 errors)
Pass 2 complete (0 errors)
> new org: 0x8000 !!!
> first: 0x8000
>  last: 0x8000
> new org: 0x7006 !!!
> first: 0x7006
>  last: 0x8006
> 0x6008
> 0x7008
> true value is 0xFFFFFFFF and false value is 0x0000
> < and > is unsigned? --> 0xFFFFFFFF and 0xFFFFFFFF
Pass 3 complete
Errors: 0, warnings: 0, compiled: 151 lines, work time: 0.003 seconds
dworkin@dw-A15:~/Programovani/ZX/Forth/Test$ sjasmplus org.asm --lst=list.txt
SjASMPlus Z80 Cross-Assembler v1.20.1 (https://github.com/z00m128/sjasmplus)
Pass 1 complete (0 errors)
Pass 2 complete (0 errors)
> new org: 0x8000 !!!
> first: 0x8000
>  last: 0x8000
> new org: 0x7F06 !!!
> first: 0x7F06
>  last: 0x8006
> 0x7E08
> 0x7F08
> true value is 0xFFFFFFFF and false value is 0x0000
> < and > is unsigned? --> 0xFFFFFFFF and 0xFFFFFFFF
Pass 3 complete
Errors: 0, warnings: 0, compiled: 151 lines, work time: 0.002 seconds
dworkin@dw-A15:~/Programovani/ZX/Forth/Test$

Takze to vypada jako by to odcital 2x. Ale kde prijde k tomu ze to konci 8 netusim... a proc se prvni a posledni adresa shoduji, ale rozdil je presne ta odectena hodnota je taky zahada...

PPS: Ta nutnost misto ORG psat SETORG je stejne docela velky zasah, ktery rozbiji vsechny vlozene assemblery, takze i kdyby se tohlo nejak vyresilo tak to nebude 100% reseni.

_________________
Z80 Forth compiler (ZX Spectrum 48kb): https://codeberg.org/DW0RKiN/M4_FORTH


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Dworkinovy beeperové vypalovačky
PříspěvekNapsal: 23.07.2024, 16:44 
Offline
Pan Štábní

Registrován: 23.06.2013, 23:49
Příspěvky: 1192
Has thanked: 101 times
Been thanked: 189 times
Koukam ze na rozdil od pasma tak sjasmplus zvladne

Kód:
 macro ORG ADDR
  org ADDR
 endm

 org 0x8000
 ...


Uvnitr ORG se stale muze volat puvodni ORG...
takze ten kod muze vypadat
Kód:
 macro check_first _a1
  ifdef _SJASMPLUS
   if  __PASS__ = 3
    ifndef __first_addr
      define __first_addr _a1
    else
     if __first_addr > _a1
      undefine __first_addr
      define __first_addr _a1     
     endif
    endif
   endif
  endif
 endm

 macro check_last _a1
  ifdef _SJASMPLUS
   if  __PASS__ = 3
    ifndef __last_addr
     define __last_addr _a1
    else
     if __last_addr < $
      undefine __last_addr
      define __last_addr $ 
     endif   
    endif
   endif
  endif
 endm

 macro ORG _a1
  display "ui....."
  ifdef _SJASMPLUS
   if  __PASS__ = 3
    display "new org: ", _a1, " !!!"
   endif
  endif
  check_first _a1
  check_last _a1 
  ifdef _SJASMPLUS
   if  __PASS__ = 3
    display "first: ", __first_addr
    display " last: ", __last_addr
   endif
  endif

  org _a1
 endm

 macro print_addr
  ifdef _SJASMPLUS
   if  __PASS__ = 3
    check_last $
    display "********************"
    display __first_addr
    display __last_addr
   endif
  endif
 endm


  ORG 0x8000
  dw 1
  dw 2
  dw 3
  ORG $-0x100
  dw 4

  print_addr
 


s chybnym vysledkem...
Kód:
SjASMPlus Z80 Cross-Assembler v1.20.1 (https://github.com/z00m128/sjasmplus)
Pass 1 complete (0 errors)
Pass 2 complete (0 errors)
> ui.....
> new org: 0x8000 !!!
> first: 0x8000
>  last: 0x8000
> ui.....
> new org: 0x7F06 !!!
> first: 0x7F06
>  last: 0x8006
> ********************
> 0x7E08
> 0x7F08
Pass 3 complete
Errors: 0, warnings: 0, compiled: 166 lines, work time: 0.002 seconds

_________________
Z80 Forth compiler (ZX Spectrum 48kb): https://codeberg.org/DW0RKiN/M4_FORTH


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Dworkinovy beeperové vypalovačky
PříspěvekNapsal: 23.07.2024, 18:13 
Offline
Pan Štábní

Registrován: 23.06.2013, 23:49
Příspěvky: 1192
Has thanked: 101 times
Been thanked: 189 times
Zda se ze mozna problem je v relativnich adresach...?

Kdy "$-2" se nerozbali na "xxx-2" ale zustane "$-2" a rozbali se pozde...?

No cele je to divne.. upravil jsem teda vetsinu na absolutni, kde je videt ze u te relativni nepozna ze je to "prazdny ORG"... ale u te co to pozna to stejne neco zmeni...
Tohle mel byt komplexnejsi kod, ktery pozna i ORGy ktere ma ignorovat. Je to napsane tak aby pokazde pri zmene se to i vypsalo..
Prvni zmena zacina "1."
Dalsi zmeny zacinaji "x."
Pokud se to NEZMENI tak je to na zacatku prazdne a za tim je i ta podminka proc to zustalo...
Kód:
 macro check_first
  ifdef _SJASMPLUS
   if  __PASS__ = 3
    ifndef __first_addr
     define __first_addr __now_org
     display "   1. from: ", __first_addr
    else
     if __first_addr > __now_org
      undefine __first_addr
      define __first_addr __now_org
      display "   x. from: ", __first_addr
     else
      display "      from: ", __first_addr, " <= ", __now_org
     endif
    endif
   endif
  endif
 endm

 macro check_last
  ifdef _SJASMPLUS
   if  __PASS__ = 3
    ifndef __last_addr
     define __last_addr $
     display "   1.   to: ", __last_addr
    else
     if __last_addr < $
      undefine __last_addr
      define __last_addr $
      display "   x.   to: ", __last_addr
     else
      display "        to: ", __last_addr, " >= ", $
     endif   
    endif
   endif
  endif
 endm
 
 macro show_addr
  ifdef _SJASMPLUS
   if  __PASS__ = 3
    ifdef __first_addr
     display "first: ", __first_addr
    endif
    ifdef __last_addr
     display " last: ", __last_addr
    endif
   endif
  endif
 endm

 macro ORG _a1
  ifdef _SJASMPLUS
   if  __PASS__ = 3
    display "new org: ", _a1, " !!!"
    ifndef __now_org
     define __now_org _a1
    else
     if (__now_org) != $  ; nenulovy zapis
      display __now_org, " .. ",  $
      check_first
      check_last
     else
      display "ignore org ", __now_org
     endif
     
     undefine __now_org     
     define __now_org _a1
     
    endif
   endif
  endif
  show_addr

  org _a1
 endm

 macro print_addr
  org $
  show_addr
 endm


  ORG 0x8000
  dw 1
  dw 2
  dw 3
  ORG 0x8002
  dw 4
  ORG $+256
  ORG 0x9000
  ORG 0x8000
  dw 5

  print_addr
 

Kód:
SjASMPlus Z80 Cross-Assembler v1.20.1 (https://github.com/z00m128/sjasmplus)
Pass 1 complete (0 errors)
Pass 2 complete (0 errors)
> new org: 0x8000 !!!
> new org: 0x8002 !!!
> 0x8000 .. 0x8006
>    1. from: 0x8000
>    1.   to: 0x8006
> first: 0x8002
>  last: 0x8006
> new org: 0x8104 !!!
> 0x8002 .. 0x8004
>       from: 0x8002 <= 0x8002
>         to: 0x8004 >= 0x8004
> first: 0x8104
>  last: 0x8004
> new org: 0x9000 !!!
> 0x8204 .. 0x8104
>       from: 0x8204 <= 0x8204
>         to: 0x8104 >= 0x8104
> first: 0x9000
>  last: 0x8104
> new org: 0x8000 !!!
> ignore org 0x9000
> first: 0x8000
>  last: 0x9000
> first: 0x8000
>  last: 0x8002
Pass 3 complete
Errors: 0, warnings: 0, compiled: 331 lines, work time: 0.003 seconds

Ale je videt ze nekde se to zmenilo, bez toho ze by se to vypsalo...
uz to prvni first je 0x8002 a ne 0x8000....

to ze to nenaslo $+256 jako prazdny ORG znamena ze podminka

if (__now_org) != $ ; nenulovy zapis

se vyhodnotila nejak chybne...

Na rozdil od 0x9000...

z toho usuzuji ze prvni byla

$+256 != $ --> true
misto "0x???? != ?"

a druha

0x9000 != $ --> false takze se vypise "ignore org"...

vlastne by to mohla byt jedina chyba i predtim ze se $ ulozi jako znak a ne hodnota a aktivuje se pozde...

PS: Je to spatne...
Kód:
 org 0x8000
 define a1 $
 dw 01
 define a2 $
 dw 02
 
 display a1
 display a2

Kód:
SjASMPlus Z80 Cross-Assembler v1.20.1 (https://github.com/z00m128/sjasmplus)
Pass 1 complete (0 errors)
Pass 2 complete (0 errors)
> 0x8004
> 0x8004
Pass 3 complete
Errors: 0, warnings: 0, compiled: 9 lines, work time: 0.001 seconds

PPS: Pak teda asi existuje reseni...
Kód:
 org 0x8000
lab1:
 define a1 $
 define b1 lab1
 dw 01
lab2:
 define a2 $
 define b2 lab2
 dw 02
 
 display a1
 display a2
 display b1
 display b2

Kód:
SjASMPlus Z80 Cross-Assembler v1.20.1 (https://github.com/z00m128/sjasmplus)
Pass 1 complete (0 errors)
Pass 2 complete (0 errors)
> 0x8004
> 0x8004
> 0x8000
> 0x8002
Pass 3 complete
Errors: 0, warnings: 0, compiled: 15 lines, work time: 0.001 seconds

Jen se musi udelat nejake pocitadlo... pro automaticky generovane labely...

_________________
Z80 Forth compiler (ZX Spectrum 48kb): https://codeberg.org/DW0RKiN/M4_FORTH


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Dworkinovy beeperové vypalovačky
PříspěvekNapsal: 23.07.2024, 19:48 
Offline
Pan Štábní

Registrován: 23.06.2013, 23:49
Příspěvky: 1192
Has thanked: 101 times
Been thanked: 189 times
automaticky label funguje... s pomoci napovedy...
Kód:
 macro def_now_addr label?, suffix?
  ifdef __last_addr
   undefine __last_addr
  endif
label?_suffix? 
  display "define __last_addr _lab_now_adr_", suffix?
  define __last_addr label?_suffix?
 endm
 
 org 0x8000
lab1:
 define a1 $
 define b1 lab1
 def_now_addr _lab_now_adr, __COUNTER__
 display "__last_addr: ", __last_addr

 dw 01
lab2:
 define a2 $
 define b2 lab2
 def_now_addr _lab_now_adr, __COUNTER__
 dw 02
 
 display a1
 display a2
 display b1
 display b2
 display "__last_addr: ", __last_addr

Kód:
SjASMPlus Z80 Cross-Assembler v1.20.1 (https://github.com/z00m128/sjasmplus)
Pass 1 complete (0 errors)
Pass 2 complete (0 errors)
> define __last_addr _lab_now_adr_0x0000
> __last_addr: 0x8000
> define __last_addr _lab_now_adr_0x0001
> 0x8004
> 0x8004
> 0x8000
> 0x8002
> __last_addr: 0x8002
Pass 3 complete
Errors: 0, warnings: 0, compiled: 42 lines, work time: 0.001 seconds

...ale ve chvili co to doslova prekopiruji do meho kodu...
Kód:
 macro def_now_addr label?, suffix?
  ifdef __last_addr
   undefine __last_addr
  endif
label?_suffix? 
  display "define __last_addr _lab_now_adr_", suffix?
  define __last_addr label?_suffix?
 endm
 
 macro check_first
  ifdef _SJASMPLUS
   if  __PASS__ = 3
    ifndef __first_addr
     define __first_addr __now_org
     display "   1. from: ", __first_addr
    else
     if __first_addr > __now_org
      undefine __first_addr
      define __first_addr __now_org
      display "   x. from: ", __first_addr
     else
      display "      from: ", __first_addr, " <= ", __now_org
     endif
    endif
   endif
  endif
 endm

 macro check_last
  ifdef _SJASMPLUS
   if  __PASS__ = 3
    ifndef __last_addr
     def_now_addr _lab_now_adr, __COUNTER__
     display "   1.   to: ", __last_addr
    else
     if __last_addr < $
      def_now_addr _lab_now_adr, __COUNTER__
      display "   x.   to: ", __last_addr
     else
      display "        to: ", __last_addr, " >= ", $
     endif   
    endif
   endif
  endif
 endm
 
 macro show_addr
  ifdef _SJASMPLUS
   if  __PASS__ = 3
    ifdef __first_addr
     display "first: ", __first_addr
    endif
    ifdef __last_addr
     display " last: ", __last_addr
    endif
   endif
  endif
 endm

 macro ORG _a1
  ifdef _SJASMPLUS
   if  __PASS__ = 3
    display "new org: ", _a1, " !!!"
    ifndef __now_org
     define __now_org _a1
    else
     if (__now_org) != $  ; nenulovy zapis
      display __now_org, " .. ",  $
      check_first
      check_last
     else
      display "ignore org ", __now_org
     endif
     
     undefine __now_org     
     define __now_org _a1
     
    endif
   endif
  endif
  show_addr

  org _a1
 endm

 macro print_addr
  org $
  show_addr
 endm


  ORG 0x8000
  dw 1
  dw 2
  dw 3
  ORG 0x8002
  dw 4
  ORG $+256
  ORG 0x9000
  ORG 0x8000
  dw 5

  print_addr
 

...to selze... :D
Kód:
SjASMPlus Z80 Cross-Assembler v1.20.1 (https://github.com/z00m128/sjasmplus)
Pass 1 complete (0 errors)
Pass 2 complete (0 errors)
> new org: 0x8000 !!!
> new org: 0x8002 !!!
> 0x8000 .. 0x8006
>    1. from: 0x8000
org_x.asm(5): error: Label not found: _lab_now_adr_0
org_x.asm(33): ^ emitted from here
> define __last_addr _lab_now_adr_0x0000
org_x.asm(34): error: Label not found: _lab_now_adr_0
org_x.asm(70): ^ emitted from here
>    1.   to: 0x0000
> first: 0x8002
org_x.asm(54): error: Label not found: _lab_now_adr_0
org_x.asm(81): ^ emitted from here
>  last: 0x0000
> new org: 0x8104 !!!
> 0x8002 .. 0x8004
>       from: 0x8002 <= 0x8002
org_x.asm(36): error: Label not found: _lab_now_adr_0
org_x.asm(70): ^ emitted from here
org_x.asm(5): error: Label not found: _lab_now_adr_1
org_x.asm(37): ^ emitted from here
> define __last_addr _lab_now_adr_0x0001
org_x.asm(38): error: Label not found: _lab_now_adr_1
org_x.asm(70): ^ emitted from here
>    x.   to: 0x0000
> first: 0x8104
org_x.asm(54): error: Label not found: _lab_now_adr_1
org_x.asm(81): ^ emitted from here
>  last: 0x0000
> new org: 0x9000 !!!
> 0x8204 .. 0x8104
>       from: 0x8204 <= 0x8204
org_x.asm(36): error: Label not found: _lab_now_adr_1
org_x.asm(70): ^ emitted from here
org_x.asm(5): error: Label not found: _lab_now_adr_2
org_x.asm(37): ^ emitted from here
> define __last_addr _lab_now_adr_0x0002
org_x.asm(38): error: Label not found: _lab_now_adr_2
org_x.asm(70): ^ emitted from here
>    x.   to: 0x0000
> first: 0x9000
org_x.asm(54): error: Label not found: _lab_now_adr_2
org_x.asm(81): ^ emitted from here
>  last: 0x0000
> new org: 0x8000 !!!
> ignore org 0x9000
> first: 0x8000
org_x.asm(54): error: Label not found: _lab_now_adr_2
org_x.asm(81): ^ emitted from here
>  last: 0x0000
> first: 0x8000
org_x.asm(54): error: Label not found: _lab_now_adr_2
org_x.asm(88): ^ emitted from here
>  last: 0x0000
Pass 3 complete
Errors: 13, warnings: 0, compiled: 361 lines, work time: 0.001 seconds

_________________
Z80 Forth compiler (ZX Spectrum 48kb): https://codeberg.org/DW0RKiN/M4_FORTH


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Dworkinovy beeperové vypalovačky
PříspěvekNapsal: 23.07.2024, 21:02 
Offline
Pan Štábní

Registrován: 23.06.2013, 23:49
Příspěvky: 1192
Has thanked: 101 times
Been thanked: 189 times
Tak jsem se dostal o neco dal.. kdyz se umaze to __PASS__ = 3 tak to uz nehaze chyby... (imho nema duvod s tim neco menit! ...no mozna ma... protoze mu davam labely az v poslednim pruchodu...?)
ale stale je to nefunkcni...
Kód:
 macro def_now_addr name?, label?, suffix?
  ifdef name?
   undefine name?
  endif
label?_suffix? 
  display "define ??? __tmp_lab_", /D, suffix?
  define name? label?_suffix?
 endm
 
 macro check_first _a1
  ifdef _SJASMPLUS
    ifndef __first_addr
     define __first_addr _a1
     display "   1. from: ", __first_addr
    else
     if __first_addr > _a1
      undefine __first_addr
      define __first_addr _a1
      display "   x. from: ", __first_addr
     else
      display "      from: ", __first_addr, " <= ", _a1
     endif
    endif
   endif
 endm

 macro check_last
  ifdef _SJASMPLUS
    ifndef __last_addr
     def_now_addr __last_addr, __tmp_lab, __COUNTER__
     display "   1.   to: ", __last_addr
    else
     if __last_addr < $
      def_now_addr __last_addr, __tmp_lab, __COUNTER__
      display "   x.   to: ", __last_addr
     else
      display "        to: ", __last_addr, " >= ", $
     endif   
    endif
   endif
 endm
 
 macro show_addr
  ifdef _SJASMPLUS
    ifdef __first_addr
     display "first: ", __first_addr
    endif
    ifdef __last_addr
     display " last: ", __last_addr
    endif
   endif
 endm

 macro ORG _a1
  ifdef _SJASMPLUS
    display "new org: ", _a1, " !!!"
    ifdef __now_o_r_g
     if __now_o_r_g != $  ; nenulovy zapis
      display __now_o_r_g, " .. ",  $
      check_first __now_o_r_g
      check_last
     else
      display "...ignore org ", __now_o_r_g
     endif
    endif
   show_addr
  endif

  org _a1
  def_now_addr __now_o_r_g,__tmp_lab, __COUNTER__
  display "now_org: ", __now_o_r_g
 
 endm

 macro print_addr
  org $
  show_addr
 endm


  ORG 0x8000
  dw 1
  dw 2
  dw 3
  ORG $-16
  dw 4
  ORG $+256
  ORG 0x9000
  ORG 0x8000
  dw 5

  print_addr
 

Kód:
SjASMPlus Z80 Cross-Assembler v1.20.1 (https://github.com/z00m128/sjasmplus)
Pass 1 complete (0 errors)
Pass 2 complete (0 errors)
> new org: 0x8000 !!!
> define ??? __tmp_lab_0
> now_org: 0x8000
> new org: 0x7FF6 !!!
> 0x8000 .. 0x8006
>    1. from: 0x8000
> define ??? __tmp_lab_1
>    1.   to: 0x8006
> first: 0x8000
>  last: 0x8006
> define ??? __tmp_lab_2
> now_org: 0x7FF6
> new org: 0x80F8 !!!
> 0x7FF6 .. 0x7FF8
>       from: 0x7FF6 <= 0x7FF6
>         to: 0x8006 >= 0x7FF8
> first: 0x7FF6
>  last: 0x8006
> define ??? __tmp_lab_3
> now_org: 0x80F8
> new org: 0x9000 !!!
> ...ignore org 0x80F8
> first: 0x80F8
>  last: 0x8006
> define ??? __tmp_lab_4
> now_org: 0x9000
> new org: 0x8000 !!!
> ...ignore org 0x9000
> first: 0x9000
>  last: 0x8006
> define ??? __tmp_lab_5
> now_org: 0x8000
> first: 0x8000
>  last: 0x8006
Pass 3 complete
Errors: 0, warnings: 0, compiled: 301 lines, work time: 0.004 seconds

Ten pocatek se zase "prepise", takze jeste drzi misto hodnoty nebo nazvu konkretniho labelu nejakou "promenou".
A ani nepomuze kdyz jsou za ORG jen abs. hodnoty.
Vysledek mel byt 0x7FF6 .. 0x8006

_________________
Z80 Forth compiler (ZX Spectrum 48kb): https://codeberg.org/DW0RKiN/M4_FORTH


Nahoru
 Profil  
 
Zobrazit příspěvky za předchozí:  Seřadit podle  
Odeslat nové téma Odpovědět na téma  [ Příspěvků: 121 ]  Přejít na stránku Předchozí  1 ... 5, 6, 7, 8, 9  Další

Všechny časy jsou v UTC + 1 hodina [ Letní čas ]


Kdo je online

Uživatelé procházející toto fórum: Žádní registrovaní uživatelé a 2 návštevníků


Nemůžete zakládat nová témata v tomto fóru
Nemůžete odpovídat v tomto fóru
Nemůžete upravovat své příspěvky v tomto fóru
Nemůžete mazat své příspěvky v tomto fóru
Nemůžete přikládat soubory v tomto fóru

Hledat:
Přejít na:  
Založeno na phpBB® Forum Software © phpBB Group
Český překlad – phpBB.cz