OldComp.cz

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


Právě je 17.04.2024, 01:01

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




Odeslat nové téma Odpovědět na téma  [ Příspěvků: 598 ]  Přejít na stránku Předchozí  1 ... 16, 17, 18, 19, 20, 21, 22 ... 40  Další
Autor Zpráva
 Předmět příspěvku: Re: Macro FORTH
PříspěvekNapsal: 09.09.2022, 12:50 
Offline
Profík

Registrován: 26.11.2018, 16:59
Příspěvky: 580
Bydliště: Holešov
Has thanked: 13 times
Been thanked: 91 times
_dworkin píše:
Z toho nejsem vubec moudry. Neznam synataxi pro AS, ale ty prvni 2 radky vypadaji ze nemaji vubec zadny vliv...
PS: Ale pokud je AS starsi jak Pasmo tak je aspon videt odkud to ma.


no tím že interně jede návěští na 32 bit hodnoty tak to pak vypadá takto:
Kód:
     630/      69 : =0FFFFFF40H         WEBIOS   EQU   0-192   ;Begin of EPROM BIOS work Area


    1416/     237 :                     BTAREA:         ;begin of transposed area
    1417/     237 :                     ;
    1418/FFFFFF40 :                        PHASE   WEBIOS
    1419/FFFFFF40 :                     ;
    1420/FFFFFF40 :                     ;-----------------------------------------------------------------------------
    1421/FFFFFF40 :                     ;
    1422/FFFFFF40 :                     ;   TIMINT routine - timer interrupt service - Motor Switch
    1423/FFFFFF40 :                     ;
    1424/FFFFFF40 : F5                  TIMINT:   PUSH   AF      ;save AF
    1425/FFFFFF41 : 3A 41 FF               LD   A,(CYCLES)   ;get no of cycles
    1426/FFFFFF44 : 3D                     DEC   A      ;one cycle less
    1427/FFFFFF45 : 32 45 FF               LD   (CYCLES),A   ;save new cycles counter
> > > bios30.asm(1428): error: jump distance too big
    1428/FFFFFF48 :                        JR   NZ,TIMIN1   ;if no last cycle - skip
    1429/FFFFFF48 :                     ;
    1430/FFFFFF48 : 3E 03                  LD   A,CTCRES   ;else stop CTC13
    1431/FFFFFF4A : D3 F7                  OUT   (CTC13),A   ;interrupts
    1432/FFFFFF4C : DB D5                  IN   A,(PIO2BD)   ;get driver mask
    1433/FFFFFF4E : EE 10                  XOR   MOTON      ;invert Motor On signal
    1434/FFFFFF50 : D3 D5                  OUT   (PIO2BD),A    ;set new driver mask
    1435/FFFFFF52 :                     ;
    1436/FFFFFF52 : F1                  TIMIN1:   POP   AF      ;restore AF
    1437/FFFFFF53 : FB                     EI         ;enable next interrupts


všimni si té adresy instrukce za číslem řádku
AS/ASW je multiplatformní, umí všechny možné i nemožné procesory proto jede ty pseudoinstrukce a výpočty ve 32 bitech


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Macro FORTH
PříspěvekNapsal: 09.09.2022, 13:21 
Offline
Pan Štábní

Registrován: 23.06.2013, 23:49
Příspěvky: 1113
Has thanked: 100 times
Been thanked: 159 times
l00k píše:
_dworkin píše:
Z toho nejsem vubec moudry. Neznam synataxi pro AS, ale ty prvni 2 radky vypadaji ze nemaji vubec zadny vliv...
PS: Ale pokud je AS starsi jak Pasmo tak je aspon videt odkud to ma.


no tím že interně jede návěští na 32 bit hodnoty tak to pak vypadá takto:
Kód:
     630/      69 : =0FFFFFF40H         WEBIOS   EQU   0-192   ;Begin of EPROM BIOS work Area


    1416/     237 :                     BTAREA:         ;begin of transposed area
    1417/     237 :                     ;
    1418/FFFFFF40 :                        PHASE   WEBIOS
    1419/FFFFFF40 :                     ;
    1420/FFFFFF40 :                     ;-----------------------------------------------------------------------------
    1421/FFFFFF40 :                     ;
    1422/FFFFFF40 :                     ;   TIMINT routine - timer interrupt service - Motor Switch
    1423/FFFFFF40 :                     ;
    1424/FFFFFF40 : F5                  TIMINT:   PUSH   AF      ;save AF
    1425/FFFFFF41 : 3A 41 FF               LD   A,(CYCLES)   ;get no of cycles
    1426/FFFFFF44 : 3D                     DEC   A      ;one cycle less
    1427/FFFFFF45 : 32 45 FF               LD   (CYCLES),A   ;save new cycles counter
> > > bios30.asm(1428): error: jump distance too big
    1428/FFFFFF48 :                        JR   NZ,TIMIN1   ;if no last cycle - skip
    1429/FFFFFF48 :                     ;
    1430/FFFFFF48 : 3E 03                  LD   A,CTCRES   ;else stop CTC13
    1431/FFFFFF4A : D3 F7                  OUT   (CTC13),A   ;interrupts
    1432/FFFFFF4C : DB D5                  IN   A,(PIO2BD)   ;get driver mask
    1433/FFFFFF4E : EE 10                  XOR   MOTON      ;invert Motor On signal
    1434/FFFFFF50 : D3 D5                  OUT   (PIO2BD),A    ;set new driver mask
    1435/FFFFFF52 :                     ;
    1436/FFFFFF52 : F1                  TIMIN1:   POP   AF      ;restore AF
    1437/FFFFFF53 : FB                     EI         ;enable next interrupts


všimni si té adresy instrukce za číslem řádku
AS/ASW je multiplatformní, umí všechny možné i nemožné procesory proto jede ty pseudoinstrukce a výpočty ve 32 bitech


Zajimave.
Dve veci me zaujaly.
Prvni je BTAREA jakoby pred urcenim od jake adresy to chci ukladat.
Pak slovo PHASE vypadajici jako ORG.
Zkusil jsem to prepsat do Pasma a ten to po nahrazeni PHASE za ORG zkompiluje.
Kód:
WEBIOS   EQU   0-192   ;Begin of EPROM BIOS work Area


BTAREA:         ;begin of transposed area
;
;    PHASE   WEBIOS
   ORG   WEBIOS
;
;-----------------------------------------------------------------------------
;
;   TIMINT routine - timer interrupt service - Motor Switch
;
TIMINT:   PUSH   AF      ;save AF
   LD   A,(CYCLES)   ;get no of cycles
   DEC   A      ;one cycle less
   LD   (CYCLES),A   ;save new cycles counter
   JR   NZ,TIMIN1   ;if no last cycle - skip
;
   LD   A,CTCRES   ;else stop CTC13
   OUT   (CTC13),A   ;interrupts
   IN   A,(PIO2BD)   ;get driver mask
   XOR   MOTON      ;invert Motor On signal
   OUT   (PIO2BD),A    ;set new driver mask
;
TIMIN1:   POP   AF      ;restore AF
   EI         ;enable next interrupts
   
CTCRES EQU 0x03
CTC13 EQU 0xF7
PIO2BD EQU 0xD5
MOTON EQU 0x10

ORG 0xFF41
CYCLES:

Kód:
dworkin@dw-A15:~/Programovani/ZX/Forth/Pasmo_test$ pasmo -d bios.asm smaz.bin
WEBIOS      EQU FF40
0000:      label BTAREA
      ORG FF40
FF40:      label TIMINT
FF40:F5      PUSH AF
FF41:3A41FF   LD A, (FF41)
FF44:3D      DEC A
FF45:3241FF   LD (FF41), A
FF48:200A   JR NZ, FF54
FF4A:3E03   LD A, 03
FF4C:D3F7   OUT (F7), A
FF4E:DBD5   IN A, (D5)
FF50:EE10   XOR 10
FF52:D3D5   OUT (D5), A
FF54:      label TIMIN1
FF54:F1      POP AF
FF55:FB      EI
CTCRES      EQU 0003
CTC13      EQU 00F7
PIO2BD      EQU 00D5
MOTON      EQU 0010
      ORG FF41
FF41:      label CYCLES
Emiting raw binary from FF40 to FF55

Je to opravdu divne ze s tim ma AS problem i kdyz si drzi adresy 32 bit. Cekal bych ze bude mit problem spis s JP, kde se bude muset nastavit nejaky segment nebo neco na ten zpusob. To je docela zajimavy problem zda by to slo napsat ve vyssim jazyce tak aby byl JP obalen tak aby si i automaticky strankoval pamet. Nejak by to melo jit, jen by ta stranka ve ktere je IP musela zustat v pameti. Nikdy jsem nic pro ZX128 nepsal, mozna bych si mel o tom neco precist, mam pocit ze se pouziva nejaky port co to prepina.
Kód:
jr nz, $+9
ld a,n
out (m),a
jp l


PS: Hmm... V manualu Pasma je ze "nazev ORG hodnota" povazuje stale za label. Takze to "WEBIOS EQU 0-192" je mozna neco jako

WEBIOS EQU 0-192
ORG WEBIOS

???

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


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Macro FORTH
PříspěvekNapsal: 09.09.2022, 15:20 
Offline
Profík

Registrován: 26.11.2018, 16:59
Příspěvky: 580
Bydliště: Holešov
Has thanked: 13 times
Been thanked: 91 times
PHASE se používá místo ORG pro uložení výsledku jinam než kde kód bude - typicky si skládáš rutiny/data někam za sebe na hromadu a pak je můžeš rozkopírovat jinam
v tomto případě kód poběží na FF40 ale je umístěný v eprom na 237h (něco ho na cílovou adresu musí samozřejmě překopírovat)
konec takového bloku je pak pomocí instrukce DEPHASE


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Macro FORTH
PříspěvekNapsal: 09.09.2022, 19:19 
Offline
Óm Nejvyšší

Registrován: 22.05.2013, 21:14
Příspěvky: 3660
Bydliště: Bratislava
Has thanked: 373 times
Been thanked: 795 times
Pokusne som tvoj text podhodil SjASMPlus-u a takyto je vysledok. 0 chyb, ale vela warningov ze hodnota sa nevojde do jedneho bajtu:
Kód:
 1    0000               ORG 0x8000
 2    8000
 3    8000               if 0
 4    8000 ~              db ""
 5    8000               endif
Test.a80(6): warning: value 0xFFFFF8F2 is truncated to 8bit value: 0xF2
 6    8000 3E F2          ld a,-1806
Test.a80(7): warning: value 0xF8F2 is truncated to 8bit value: 0xF2
 7    8002 3E F2          ld a,0xFFFC+(-1802)
 8    8004
Test.a80(9): warning: value 0xFFFFF8F2 is truncated to 8bit value: 0xF2
 9    8004 3E F2          ld a,-4+(-1802)
10    8006
Test.a80(11): warning: value 0xFFFFF8F2 is truncated to 8bit value: 0xF2
11    8006 3E F2          ld a,-1802-4
Test.a80(12): warning: value 0xFFFFF8F2 is truncated to 8bit value: 0xF2
12    8008 3E F2          ld a,-1802-3-1
Test.a80(13): warning: value 0xFFFFF8F2 is truncated to 8bit value: 0xF2
13    800A 3E F2          ld a,-1802+(-4)
Test.a80(14): warning: value 0xF8F2 is truncated to 8bit value: 0xF2
14    800C 3E F2          ld a,-1802+0xFFFC
Test.a80(15): warning: value 0xF8F2 is truncated to 8bit value: 0xF2
15    800E 3E F2          ld a,-1802+(0xFFFC)
16    8010               if 0
17    8010 ~              db "()"
18    8010               endif
19    8010 3A F2 F8       ld a,(-1806)
20    8013 3A F2 F8       ld a,(0xFFFC+(-1802))
21    8016
22    8016 3A F2 F8       ld a,(-4+(-1802))
23    8019
24    8019 3A F2 F8       ld a,(-1802-4)
25    801C 3A F2 F8       ld a,(-1802-3-1)
26    801F 3A F2 F8       ld a,(-1802+(-4))
27    8022 3A F2 F8       ld a,(-1802+0xFFFC)
28    8025 3A F2 F8       ld a,(-1802+(0xFFFC))
29    8028               if 0
30    8028 ~              db "+()"
31    8028               endif
Test.a80(32): warning: value 0xFFFFF8F2 is truncated to 8bit value: 0xF2
32    8028 3E F2          ld a,+(-1806)
Test.a80(33): warning: value 0xFFFFF8F2 is truncated to 8bit value: 0xF2
33    802A 3E F2          ld a,+((-4)+(-1802))
Test.a80(34): warning: value 0xF8F2 is truncated to 8bit value: 0xF2
34    802C 3E F2          ld a,+(0xFFFC+(-1802))
35    802E
Test.a80(36): warning: value 0xFFFFF8F2 is truncated to 8bit value: 0xF2
36    802E 3E F2          ld a,+(-4+(-1802))
37    8030
Test.a80(38): warning: value 0xFFFFF8F2 is truncated to 8bit value: 0xF2
38    8030 3E F2          ld a,+(-1802-4)
Test.a80(39): warning: value 0xFFFFF8F2 is truncated to 8bit value: 0xF2
39    8032 3E F2          ld a,+(-1802-3-1)
Test.a80(40): warning: value 0xFFFFF8F2 is truncated to 8bit value: 0xF2
40    8034 3E F2          ld a,+(-1802+(-4))
Test.a80(41): warning: value 0xF8F2 is truncated to 8bit value: 0xF2
41    8036 3E F2          ld a,+(-1802+0xFFFC)
Test.a80(42): warning: value 0xF8F2 is truncated to 8bit value: 0xF2
42    8038 3E F2          ld a,+(-1802+(0xFFFC))
43    803A               if 0
44    803A ~              db "+()-4"
45    803A               endif
Test.a80(46): warning: value 0xFFFFF8F2 is truncated to 8bit value: 0xF2
46    803A 3E F2          ld a,-1806
Test.a80(47): warning: value 0xF8F2 is truncated to 8bit value: 0xF2
47    803C 3E F2          ld a,+(-1802)+0xFFFC
Test.a80(48): warning: value 0xFFFFF8F2 is truncated to 8bit value: 0xF2
48    803E 3E F2          ld a,+(-1802)-4
Test.a80(49): warning: value 0xFFFFF8F2 is truncated to 8bit value: 0xF2
49    8040 3E F2          ld a,+(-1802)-3-1
Test.a80(50): warning: value 0xF8F2 is truncated to 8bit value: 0xF2
50    8042 3E F2          ld a,+(-1802)+0xFFFD-1
Test.a80(51): warning: value 0xFFFFF8F2 is truncated to 8bit value: 0xF2
51    8044 3E F2          ld a,+(-1802)+(-3)+(-1)
Test.a80(52): warning: value 0xFFFFF8F2 is truncated to 8bit value: 0xF2
52    8046 3E F2          ld a,+(-1802)+(-4)
Test.a80(53): warning: value 0xF8F2 is truncated to 8bit value: 0xF2
53    8048 3E F2          ld a,+(-1802)+(0xFFFC)
Test.a80(54): warning: value 0xFFFFF8F2 is truncated to 8bit value: 0xF2
54    804A 3E F2          ld a,+(-1802)-(3+1)
Test.a80(55): warning: value 0xFFFFF8F2 is truncated to 8bit value: 0xF2
55    804C 3E F2          ld a,+(-1802)+(4-8)
Test.a80(56): warning: value 0xFFFFF8F2 is truncated to 8bit value: 0xF2
56    804E 3E F2          ld a,+(-1802)+(4-4-4)
57    8050
Test.a80(58): warning: value 0xFFFFF8F2 is truncated to 8bit value: 0xF2
58    8050 3E F2          ld a,+(-1802)-(-4+8)
Test.a80(59): warning: value 0xFFFFF8F2 is truncated to 8bit value: 0xF2
59    8052 3E F2          ld a,+((-1802)-(-4+8))
60    8054
Test.a80(61): warning: value 0xFFFFF8F2 is truncated to 8bit value: 0xF2
61    8054 3E F2          ld a,+(-1802)+(-8+4)
Test.a80(62): warning: value 0xFFFFF8F2 is truncated to 8bit value: 0xF2
62    8056 3E F2          ld a,+(-1802-(-4+8))
63    8058


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Macro FORTH
PříspěvekNapsal: 10.09.2022, 03:46 
Offline
Pan Štábní

Registrován: 23.06.2013, 23:49
Příspěvky: 1113
Has thanked: 100 times
Been thanked: 159 times
Busy píše:
Pokusne som tvoj text podhodil SjASMPlus-u a takyto je vysledok. 0 chyb, ale vela warningov ze hodnota sa nevojde do jedneho bajtu:
Kód:
 1    0000               ORG 0x8000
 2    8000
 3    8000               if 0
 4    8000 ~              db ""
 5    8000               endif


To je az smutne jak to vsechno prelozil spravne... .)

Jake pouzivas prepinace? Me sjasmplus selze uz u toho "if", bere to jako label.

Kód:
  ORG 0x8000
  aa EQU 0x604
 
if 0
db "EQ"
endif
   ld bc,5=3
   ld de,5=5
   ld bc,+(5=3)
   ld de,+(5=5)
   ld bc,+((-5)=(-3))
   ld de,+((-5)=(-5))
if 0
db "NE"
endif
   ld bc,5!=3
   ld de,5!=5
   ld bc,+(5!=3)
   ld de,+(5!=5)
   ld bc,+((-5)!=(-3))
   ld de,+((-5)!=(-5))

if 0
db "ULT -5< -5 -3 3 5"
endif
   ld bc,+((-5)<(-5))
   ld de,+((-5)<(-3))
   ld bc,+((-5)<(3))
   ld de,+((-5)<(5))
if 0
db "ULT -3< -5 -3 3 5"
endif
   ld bc,+((-3)<(-5))
   ld de,+((-3)<(-3))
   ld bc,+((-3)<(3))
   ld de,+((-3)<(5))
if 0
db "ULT 3< -5 -3 3 5"
endif
   ld bc,+((3)<(-5))
   ld de,+((3)<(-3))
   ld bc,+((3)<(3))
   ld de,+((3)<(5))
if 0
db "ULT 5< -5 -3 3 5"
endif
   ld bc,+((5)<(-5))
   ld de,+((5)<(-3))
   ld bc,+((5)<(3))
   ld de,+((5)<(5))
if 0
db "LE"
endif
   ld bc,3<=5
   ld de,-1<=3
   ld bc,+(3<=5)
   ld de,+(3<=3)

if 0
db "MAX"
endif

;     ld hl, +(_n + _m + ((_n) - _m) * ( (2*((_n) - _m) + 1) % 2) ) / 2
;     ld hl, +((_n) - _m) * ((2*((_n) - _m) + 1) % 2)
MAX MACRO _n, _m
    ld hl, +(_n)*(1 xor((_n>>15)))
ENDM

_MIN MACRO _n, _m
1+_n
ENDM


_a EQU 4
_b EQU 6
_c EQU -4
_d EQU -6

   MAX _a, _a
   MAX _a, _b
   MAX _a, _c
   MAX _a, _d

   MAX _b, _a
   MAX _b, _b
   MAX _b, _c
   MAX _b, _d
   
   

   ld de, +(2*(3-6)+1) % 2
   ld de, +(2*(6-3)+1) % 2

   ld de, +(3*2-6*2+1) % 2
   ld de, +(6*2-3*2+1) % 2

   ld de, +((-3*2-4*2)+1) % 2
   ld de, +((+3*2-(-4*2))+1) % 2

   
   ld de, +(2*(-3-4)+1) % 2
   ld de, +(2*(+3-(-4))+1) % 2

   ld de, +((-3*2-4*2)+1) % 2
   ld de, +((+3*2-(-4*2))+1) % 2

   ld hl,+(_a+(_d))
   ld hl,+(_a+_d)
   ld hl,+(4+(-6))
   
   ld bc,+2*0x8000
   ld bc,-2*0x8000
   ld bc,+1*0x8000
   ld bc,-1*0x8000
   ld bc,+2*1
   ld bc,-2*1
   ld bc,+1*1
   ld bc,-1*1
   ld bc,+2*(-1)
   ld bc,-2*(-1)
   ld bc,+1*(-1)
   ld bc,-1*(-1)
   ld DE,+2/(-1)
   ld DE,-2/(-1)
   ld DE,+1/(-1)
   ld DE,-1/(-1)
   
   ld hl, -5 % 2
   ld hl, -(2-1) % 2
   ld hl, -(1-2) % 2
           
_x EQU -5

   ld de, -5 % 2
   ld de, -_x % 2
   ld de, 0xfffb % 2
   ld de, +(-5) % 2
   ld de, _x % 2
   ld de, +(_x) % 2

Kód:
dworkin@dw-A15:~/Programovani/ZX/Forth/Pasmo_test$ sjasmplus --help
SjASMPlus Z80 Cross-Assembler v1.20.1 (https://github.com/z00m128/sjasmplus)
Based on code of SjASM by Sjoerd Mastijn (http://www.xl2s.tk)
Copyright 2004-2022 by Aprisobal and all other participants

Usage:
sjasmplus [options] sourcefile(s)

Option flags as follows:
  -h or --help[=warnings]  Help information (you see it)
  --zxnext[=cspect]        Enable ZX Spectrum Next Z80 extensions (Z80N)
  --i8080                  Limit valid instructions to i8080 only (+ no fakes)
  --lr35902                Sharp LR35902 CPU instructions mode (+ no fakes)
  --outprefix=<path>       Prefix for save/output/.. filenames in directives
  -i<path> or -I<path> or --inc=<path> ( --inc without "=" to empty the list)
                           Include path (later defined have higher priority)
  --lst[=<filename>]       Save listing to <filename> (<source>.lst is default)
  --lstlab[=sort]          Append [sorted] symbol table to listing
  --sym=<filename>         Save symbol table to <filename>
  --exp=<filename>         Save exports to <filename> (see EXPORT pseudo-op)
  --raw=<filename>         Machine code saved also to <filename> (- is STDOUT)
  --sld[=<filename>]       Save Source Level Debugging data to <filename>
 Note: use OUTPUT, LUA/ENDLUA and other pseudo-ops to control output
 Logging:
  --nologo                 Do not show startup message
  --msg=[all|war|err|none|lst|lstlab]
                           Stderr messages verbosity ("all" is default)
  --fullpath               Show full path to file in errors
  --color=[on|off|auto]    Enable or disable ANSI coloring of warnings/errors
 Other:
  -D<NAME>[=<value>]       Define <NAME> as <value>
  -                        Reads STDIN as source (even in between regular files)
  --longptr                No device: program counter $ can go beyond 0x10000
  --reversepop             Enable reverse POP order (as in base SjASM version)
  --dirbol                 Enable directives from the beginning of line
  --dos866                 Encode from Windows codepage to DOS 866 (Cyrillic)
  --syntax=<...>           Adjust parsing syntax, check docs for details.
dworkin@dw-A15:~/Programovani/ZX/Forth/Pasmo_test$ sjasmplus ld_condition.asm
SjASMPlus Z80 Cross-Assembler v1.20.1 (https://github.com/z00m128/sjasmplus)
ld_condition.asm(13): error: Duplicate label: if
ld_condition.asm(14): error: Duplicate label: db
ld_condition.asm(15): error: Duplicate label: endif
ld_condition.asm(23): error: Duplicate label: if
ld_condition.asm(24): error: Duplicate label: db
ld_condition.asm(25): error: Duplicate label: endif
ld_condition.asm(30): error: Duplicate label: if
ld_condition.asm(31): error: Duplicate label: db
ld_condition.asm(32): error: Duplicate label: endif
ld_condition.asm(37): error: Duplicate label: if
ld_condition.asm(38): error: Duplicate label: db
ld_condition.asm(39): error: Duplicate label: endif
ld_condition.asm(44): error: Duplicate label: if
ld_condition.asm(45): error: Duplicate label: db
ld_condition.asm(46): error: Duplicate label: endif
ld_condition.asm(51): error: Duplicate label: if
ld_condition.asm(52): error: Duplicate label: db
ld_condition.asm(53): error: Duplicate label: endif
ld_condition.asm(59): error: Duplicate label: if
ld_condition.asm(60): error: Duplicate label: db
ld_condition.asm(61): error: Duplicate label: endif
Pass 1 complete (21 errors)
Pass 2 complete (21 errors)
ld_condition.asm(2): error: Unrecognized instruction: aa EQU 0x604
ld_condition.asm(4): warning: Label has different value in pass 3: previous value 32864 not equal 32768
ld_condition.asm(4): error: Unrecognized instruction: 0
ld_condition.asm(5): warning: Label has different value in pass 3: previous value 32864 not equal 32768
ld_condition.asm(5): error: Unrecognized instruction: "EQ"
ld_condition.asm(6): warning: Label has different value in pass 3: previous value 32864 not equal 32768
ld_condition.asm(13): warning: Label has different value in pass 3: previous value 32768 not equal 32786
ld_condition.asm(13): error: Unrecognized instruction: 0
ld_condition.asm(14): warning: Label has different value in pass 3: previous value 32768 not equal 32786
ld_condition.asm(14): error: Unrecognized instruction: "NE"
ld_condition.asm(15): warning: Label has different value in pass 3: previous value 32768 not equal 32786
ld_condition.asm(23): warning: Label has different value in pass 3: previous value 32786 not equal 32804
ld_condition.asm(23): error: Unrecognized instruction: 0
ld_condition.asm(24): warning: Label has different value in pass 3: previous value 32786 not equal 32804
ld_condition.asm(24): error: Unrecognized instruction: "ULT -5< -5 -3 3 5"
ld_condition.asm(25): warning: Label has different value in pass 3: previous value 32786 not equal 32804
ld_condition.asm(30): warning: Label has different value in pass 3: previous value 32804 not equal 32816
ld_condition.asm(30): error: Unrecognized instruction: 0
ld_condition.asm(31): warning: Label has different value in pass 3: previous value 32804 not equal 32816
ld_condition.asm(31): error: Unrecognized instruction: "ULT -3< -5 -3 3 5"
ld_condition.asm(32): warning: Label has different value in pass 3: previous value 32804 not equal 32816
ld_condition.asm(37): warning: Label has different value in pass 3: previous value 32816 not equal 32828
ld_condition.asm(37): error: Unrecognized instruction: 0
ld_condition.asm(38): warning: Label has different value in pass 3: previous value 32816 not equal 32828
ld_condition.asm(38): error: Unrecognized instruction: "ULT 3< -5 -3 3 5"
ld_condition.asm(39): warning: Label has different value in pass 3: previous value 32816 not equal 32828
ld_condition.asm(44): warning: Label has different value in pass 3: previous value 32828 not equal 32840
ld_condition.asm(44): error: Unrecognized instruction: 0
ld_condition.asm(45): warning: Label has different value in pass 3: previous value 32828 not equal 32840
ld_condition.asm(45): error: Unrecognized instruction: "ULT 5< -5 -3 3 5"
ld_condition.asm(46): warning: Label has different value in pass 3: previous value 32828 not equal 32840
ld_condition.asm(51): warning: Label has different value in pass 3: previous value 32840 not equal 32852
ld_condition.asm(51): error: Unrecognized instruction: 0
ld_condition.asm(52): warning: Label has different value in pass 3: previous value 32840 not equal 32852
ld_condition.asm(52): error: Unrecognized instruction: "LE"
ld_condition.asm(53): warning: Label has different value in pass 3: previous value 32840 not equal 32852
ld_condition.asm(59): warning: Label has different value in pass 3: previous value 32852 not equal 32864
ld_condition.asm(59): error: Unrecognized instruction: 0
ld_condition.asm(60): warning: Label has different value in pass 3: previous value 32852 not equal 32864
ld_condition.asm(60): error: Unrecognized instruction: "MAX"
ld_condition.asm(61): warning: Label has different value in pass 3: previous value 32852 not equal 32864
ld_condition.asm(66): error: ')' expected
ld_condition.asm(79): ^ emitted from here
ld_condition.asm(66): error: ')' expected
ld_condition.asm(80): ^ emitted from here
ld_condition.asm(66): error: ')' expected
ld_condition.asm(81): ^ emitted from here
ld_condition.asm(66): error: ')' expected
ld_condition.asm(82): ^ emitted from here
ld_condition.asm(66): error: ')' expected
ld_condition.asm(84): ^ emitted from here
ld_condition.asm(66): error: ')' expected
ld_condition.asm(85): ^ emitted from here
ld_condition.asm(66): error: ')' expected
ld_condition.asm(86): ^ emitted from here
ld_condition.asm(66): error: ')' expected
ld_condition.asm(87): ^ emitted from here
ld_condition.asm(111): warning: value 0x10000 is truncated to 16bit value: 0x0000
Pass 3 complete
Errors: 46, warnings: 25, compiled: 156 lines, work time: 0.003 seconds


Kód:
dworkin@dw-A15:~/Programovani/ZX/Forth/Pasmo_test$ printf "ORG 0x8000\n xor a" | sjasmplus - --lst=smaz
SjASMPlus Z80 Cross-Assembler v1.20.1 (https://github.com/z00m128/sjasmplus)
Pass 1 complete (0 errors)
Pass 2 complete (0 errors)
<stdin>(1): error: Unrecognized instruction: 0x8000
Pass 3 complete
Errors: 1, warnings: 0, compiled: 2 lines, work time: 0.001 seconds
dworkin@dw-A15:~/Programovani/ZX/Forth/Pasmo_test$ cat smaz
# file opened: <stdin>
<stdin>(1): error: Unrecognized instruction: 0x8000
1     0000              ORG 0x8000
2     0000 AF            xor a
# file closed: <stdin>

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


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Macro FORTH
PříspěvekNapsal: 10.09.2022, 08:39 
Offline
Óm Nejvyšší

Registrován: 22.05.2013, 21:14
Příspěvky: 3660
Bydliště: Bratislava
Has thanked: 373 times
Been thanked: 795 times
_dworkin píše:
Jake pouzivas prepinace?
Z hladiska kompilacie ziadne, iba --lst=... a --lstlab pre vygenerovanie listingu.
_dworkin píše:
Me sjasmplus selze uz u toho "if", bere to jako label.
Pretoze identifikatory na zaciatku riadku sa beru ako labely. Instrukcie a pseudoinstrukcie musia mat pred sebou aspon jeden biely znak. Ked som kompiloval ten tvoj zdrojak, doplnil som medzery pred if/endif.


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Macro FORTH
PříspěvekNapsal: 10.09.2022, 13:41 
Offline
Pan Štábní

Registrován: 23.06.2013, 23:49
Příspěvky: 1113
Has thanked: 100 times
Been thanked: 159 times
Busy píše:
_dworkin píše:
Jake pouzivas prepinace?
Z hladiska kompilacie ziadne, iba --lst=... a --lstlab pre vygenerovanie listingu.
_dworkin píše:
Me sjasmplus selze uz u toho "if", bere to jako label.
Pretoze identifikatory na zaciatku riadku sa beru ako labely. Instrukcie a pseudoinstrukcie musia mat pred sebou aspon jeden biely znak. Ked som kompiloval ten tvoj zdrojak, doplnil som medzery pred if/endif.

Tak na tuhle informaci bych asi nikdy sam neprisel. Tisickrat diky! Tohle me posunulo o hodne vpred. sjasmplus jinak vypada ze ma shodny syntax s pasmem, problem budou asi makra. Ty ale skoro nepouzivam, jen kdyz M4 nezna hodnotu vstupu a kod je zavisly na necem z toho vstupu. Jinak si to samozrejme generuje M4 sam.

Ted bych mel byt schopen to snad napsat tak, aby to slo prelozit obema prekladaci. Kupodivu jsem mel vetsinou vsude mezeru pred "if", ale jen pro PREHLEDNOST kvuli zanoreni atd. Pasmo to nevyzaduje.

Na sjasmplus se me libi jak dokaze nacist vstup z stdin, u pasmo se mi to nepovedlo.
Kód:
dworkin@dw-A15:~/Programovani/ZX/Forth/Pasmo_test$ printf " ORG 8000h\n sub a\n xor 0x25" | sjasmplus - --lst=smaz && cat smaz
SjASMPlus Z80 Cross-Assembler v1.20.1 (https://github.com/z00m128/sjasmplus)
Pass 1 complete (0 errors)
Pass 2 complete (0 errors)
Pass 3 complete
Errors: 0, warnings: 0, compiled: 3 lines, work time: 0.000 seconds
# file opened: <stdin>
1     0000               ORG 8000h
2     8000 97            sub a
3     8001 EE 25         xor 0x25
# file closed: <stdin>


PS: Vypada to ze "abc EQU 123" musi byt naopak na zacatku.

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


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Macro FORTH
PříspěvekNapsal: 10.09.2022, 15:57 
Offline
Kecálek

Registrován: 10.07.2014, 01:57
Příspěvky: 169
Has thanked: 25 times
Been thanked: 225 times
_dworkin píše:
Na sjasmplus se me libi jak dokaze nacist vstup z stdin, u pasmo se mi to nepovedlo.
Kód:
dworkin@dw-A15:~/Programovani/ZX/Forth/Pasmo_test$ printf " ORG 8000h\n sub a\n xor 0x25" | sjasmplus - --lst=smaz && cat smaz
SjASMPlus Z80 Cross-Assembler v1.20.1 (https://github.com/z00m128/sjasmplus)
Pass 1 complete (0 errors)
Pass 2 complete (0 errors)
Pass 3 complete
Errors: 0, warnings: 0, compiled: 3 lines, work time: 0.000 seconds
# file opened: <stdin>
1     0000               ORG 8000h
2     8000 97            sub a
3     8001 EE 25         xor 0x25
# file closed: <stdin>



nuz, mozes vyuzit process substitution bashu:
Kód:
$ pasmo -v -d <(echo -e " ORG 8000h\n sub a\n xor 0x25") /dev/null
Loading file: /dev/fd/63 in 0
Finished loading file: /dev/fd/63 in 3
Entering pass 1
Pass 1 finished
Entering pass 2
      ORG 8000
8000:97      SUB A
8001:EE25   XOR 25
Pass 2 finished
Emiting raw binary from 8000 to 8002


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Macro FORTH
PříspěvekNapsal: 10.09.2022, 21:51 
Offline
Óm Nejvyšší

Registrován: 22.05.2013, 21:14
Příspěvky: 3660
Bydliště: Bratislava
Has thanked: 373 times
Been thanked: 795 times
_dworkin píše:
sjasmplus jinak vypada ze ma shodny syntax s pasmem
Ono povodni autori SjASMPlus sa ho snazili napisat tak, aby akceptoval syntax vsetkych inych asemblerov (ktore boli v danom case zname), takze vie velku spustu roznych prikazov a pseudointrukcii a priamo (alebo len s kozmetickymi zmenani) vie kompilovat zdrojaky z tychto asemblerov.
Napriklad vela asemblerov nevyzaduje pisat dvojbodky na konci labelov, preto toto nevyzaduje ani SjASMPlus.
Jedine, co nebolo implementovane, su tie syntaxne rozsirenia, ktore su v priamom rozpore s uz implementovanou jasnou a jednoznacnou syntaxou. Napriklad nutnost odsadzovania (pseudo)instrukcii od zaciatku riadku vyplynula prave z tej nepovinnej dvojbodky za labelmi - proste akykolvek identifikator od zaciatku riadku je label, a akykolvek identifikator, oddeleny od zaciatku riadku bielym znakom, sa vyhodnoti ako (pseudo)instrukcia.


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Macro FORTH
PříspěvekNapsal: 11.09.2022, 02:28 
Offline
Pan Štábní

Registrován: 23.06.2013, 23:49
Příspěvky: 1113
Has thanked: 100 times
Been thanked: 159 times
Busy píše:
_dworkin píše:
sjasmplus jinak vypada ze ma shodny syntax s pasmem
Ono povodni autori SjASMPlus sa ho snazili napisat tak, aby akceptoval syntax vsetkych inych asemblerov (ktore boli v danom case zname), takze vie velku spustu roznych prikazov a pseudointrukcii a priamo (alebo len s kozmetickymi zmenani) vie kompilovat zdrojaky z tychto asemblerov.
Napriklad vela asemblerov nevyzaduje pisat dvojbodky na konci labelov, preto toto nevyzaduje ani SjASMPlus.
Jedine, co nebolo implementovane, su tie syntaxne rozsirenia, ktore su v priamom rozpore s uz implementovanou jasnou a jednoznacnou syntaxou. Napriklad nutnost odsadzovania (pseudo)instrukcii od zaciatku riadku vyplynula prave z tej nepovinnej dvojbodky za labelmi - proste akykolvek identifikator od zaciatku riadku je label, a akykolvek identifikator, oddeleny od zaciatku riadku bielym znakom, sa vyhodnoti ako (pseudo)instrukcia.


Pasmo nemusi mit taky dvojtecky, ani odsazeni. A navesti mohou zacinat teckama, zavinacema.
Naopak pokud se pokusim dat nazev navesti shodny s instrukci tak to pak nezachrani ani dvojtecka na konci.
Nemel jsem moc casu nez jsem sel dnes(ted uz vcera) do prace, ale proletl jsem si manualove stranky sjasmplus a doslo me, ze pokouset se to psat pro pasmo i sjasmplus bude dost opruz.

Protoze sjasmplus bere vse jako 32 bit a signed, krome >>>.
Pasmo ma vse 16 bit a v podstate je vse unsigned. Vnitrne si vse prevadi unsigned.

Takze u obou dela SHR a >> to same. Ale rozdilne mezi sebou.
sjmasm vypada na prvni pohled ze super, umi ABS takze by to melo vse klapat. Ale stacilo me 5 minut a uz vim ze to nebude fungovat jak se na prvni pohled zda. Ani jsem to jeste nezkousel.

Deleni atd. Pes je zakopany totiz v te casti ze je vse 32 bit.

-10/2 bude urcite -5 (=65531)
ale 0xfff6/2 bude podle me 0x7ffb a ne -5 (=65531)

Takze to bude chtit taky udelat nejaky (((a<<16)/(b<<16))>>>16) aby to delalo co ocekavam. A to uz nevypada tak pekne jako /.

Jinak se me podarilo prinutit Pasmo aby me dokazalo delit i signed! Ted kdyz uz vim jake ma chyby me doslo ze kdyz pouziji par IF-u a zjistit si pres nejake & 0x8000 jakou mam kombinaci znamenek na vstupu, tak pro kazdou z nich dokazi napsat spravny vzorec.
Kód:
LD_BC_DIV MACRO _a, _b
 if (((_a) | (_b)) & 0x8000) = 0
   ld bc,+(_a)/(_b)           ;++
 endif
 if (((_a) & 0x8000) = 0) & (((_a) & 0x8000) = 0x8000)
   ld bc,-(_a)/(0-(_b))       ;+-
 endif
 if (((_a) & 0x8000) = 0x8000) & (((_a) & 0x8000) = 0)
   ld bc,-(0-(_a))/(_b)       ;-+
 endif
 if (((_a) & (_b)) & 0x8000) = 0x8000
   ld bc,+(0-(_a))/(0-(_b))   ;--
 endif
ENDM


Ale po chvilce me doslo, ze tohle je naprosto k nicemu. Potrebuji to totiz na radku.

z PUSH(-10) PUSH(bbb) DIV chci udelat neco jako PUSH(-10/bbb).

Pak jsem si rekl ze jsem uplne blbej, ze kazdy IF prece dokazi nahradit vzorcem 0 nebo 1 krat ta spravna varianta.

A tady je ten "strasne pekny" vzorec pro signed deleni kdyz prekladac deli jen unsigned. Dopsal jsem to az ted a vychytal posledni mouchy(zapomel jsem odcitat a vsude scital i kdyz vysledek mel byt zaporny). V praci nebyl cas nad tim dumat, protoze je sobota a k tomu je Chester Horse Racing (i kdyz kvuli smrti kralovny zruseny) tak bylo narvano. Mimochodem nekde jsem videl ceske zpravy jak cele Anglie truchli, ale nasi zakaznici asi nectou zpravy... nebo zpravy lzou.
Kód:
+((((_a)|(_b))>>15) xor 1)*(_a)/(_b)
-(((~(_a))&(_b))>>15)*(_a)/(-(_b))
-(((_a)&(~(_b)))>>15)*(-(_a))/(_b)
+(((_a)&(_b))>>15)*(-(_a))/(-(_b))

Je to pro
++
+-
-+
--

Pasmo only vzorec i kdyby mel vas kompiler 16 bitove cisla, protoze je tam >> ktery je doplnovan nulama, takze neprovadim jeste jeden & 1.

Kód:
  ORG 0x8000

   ld bc,16
   ld de ,0-16

 if 0
db "MUL"
 endif
   ld de,+(8)*(0-1-1)
   ld de,+(0-8)*(+1+1)
   
   ld hl,+(8)*(-1-1)     ; fail
   ld hl,+(-8)*(+1+1)

   ld bc,+(8)*(+1+1)
   ld bc,+(0-8)*(0-1-1)
   ld hl,+(8)*(+1+1)
   ld hl,+(-8)*(-1-1)    ; fail

 if 0
db "DIV"
 endif

LD_DE_DIV MACRO _a, _b
    ld DE,+((((_a)|(_b))>>15) xor 1)*(_a)/(_b)-(((~(_a))&(_b))>>15)*(_a)/(-(_b))-(((_a)&(~(_b)))>>15)*(-(_a))/(_b)+(((_a)&(_b))>>15)*(-(_a))/(-(_b))
ENDM

 LD_DE_DIV  32, 2
 LD_DE_DIV  32,-2
 LD_DE_DIV -32, 2
 LD_DE_DIV -32,-2

 LD_DE_DIV  32, 2
 LD_DE_DIV  32,0xfffe
 LD_DE_DIV 0xffe0, 2
 LD_DE_DIV 0xffe0,0xfffe


label0
db 1
_label1
db 1
@label2
db 1
.label3
db 1
...@@@000label4
db 1
ld hl,label0
ld hl,_label1
ld hl,@label2
ld hl,.label3
ld hl,...@@@000label4

Nasobeni je v pohode, protoze kdyz nasobim 16bit*16bit a vysledek mam 16bit tak je to vzdy spravne, na znamenku nezalezi.
Kód:
dworkin@dw-A15:~/Programovani/ZX/Forth/Pasmo_test$ pasmo -d ld_mul.asm smaz.bin
      ORG 8000
8000:011000   LD BC, 0010
8003:11F0FF   LD DE, FFF0
      IF (false)
- db "MUL"
      ENDIF
8006:11F0FF   LD DE, FFF0
8009:11F0FF   LD DE, FFF0
800C:210000   LD HL, 0000
800F:21F0FF   LD HL, FFF0
8012:011000   LD BC, 0010
8015:011000   LD BC, 0010
8018:211000   LD HL, 0010
801B:210000   LD HL, 0000
      IF (false)
- db "DIV"
      ENDIF
Defining MACRO LD_DE_DIV
Params: _a, _b
Expanding MACRO LD_DE_DIV
_a= 0020
_b= 0002
LD DE , + ( ( ( ( _a ) | ( _b ) ) >> 000F ) XOR 0001 ) * ( _a ) / ( _b ) - ( ( ( ~ ( _a ) ) & ( _b ) ) >> 000F ) * ( _a ) / ( - ( _b ) ) - ( ( ( _a ) & ( ~ ( _b ) ) ) >> 000F ) * ( - ( _a ) ) / ( _b ) + ( ( ( _a ) & ( _b ) ) >> 000F ) * ( - ( _a ) ) / ( - ( _b ) )
801E:111000   LD DE, 0010
ENDM
      ENDM
End of MACRO LD_DE_DIV
Expanding MACRO LD_DE_DIV
_a= 0020
_b= - 0002
LD DE , + ( ( ( ( _a ) | ( _b ) ) >> 000F ) XOR 0001 ) * ( _a ) / ( _b ) - ( ( ( ~ ( _a ) ) & ( _b ) ) >> 000F ) * ( _a ) / ( - ( _b ) ) - ( ( ( _a ) & ( ~ ( _b ) ) ) >> 000F ) * ( - ( _a ) ) / ( _b ) + ( ( ( _a ) & ( _b ) ) >> 000F ) * ( - ( _a ) ) / ( - ( _b ) )
8021:11F0FF   LD DE, FFF0
ENDM
      ENDM
End of MACRO LD_DE_DIV
Expanding MACRO LD_DE_DIV
_a= - 0020
_b= 0002
LD DE , + ( ( ( ( _a ) | ( _b ) ) >> 000F ) XOR 0001 ) * ( _a ) / ( _b ) - ( ( ( ~ ( _a ) ) & ( _b ) ) >> 000F ) * ( _a ) / ( - ( _b ) ) - ( ( ( _a ) & ( ~ ( _b ) ) ) >> 000F ) * ( - ( _a ) ) / ( _b ) + ( ( ( _a ) & ( _b ) ) >> 000F ) * ( - ( _a ) ) / ( - ( _b ) )
8024:11F0FF   LD DE, FFF0
ENDM
      ENDM
End of MACRO LD_DE_DIV
Expanding MACRO LD_DE_DIV
_a= - 0020
_b= - 0002
LD DE , + ( ( ( ( _a ) | ( _b ) ) >> 000F ) XOR 0001 ) * ( _a ) / ( _b ) - ( ( ( ~ ( _a ) ) & ( _b ) ) >> 000F ) * ( _a ) / ( - ( _b ) ) - ( ( ( _a ) & ( ~ ( _b ) ) ) >> 000F ) * ( - ( _a ) ) / ( _b ) + ( ( ( _a ) & ( _b ) ) >> 000F ) * ( - ( _a ) ) / ( - ( _b ) )
8027:111000   LD DE, 0010
ENDM
      ENDM
End of MACRO LD_DE_DIV
Expanding MACRO LD_DE_DIV
_a= 0020
_b= 0002
LD DE , + ( ( ( ( _a ) | ( _b ) ) >> 000F ) XOR 0001 ) * ( _a ) / ( _b ) - ( ( ( ~ ( _a ) ) & ( _b ) ) >> 000F ) * ( _a ) / ( - ( _b ) ) - ( ( ( _a ) & ( ~ ( _b ) ) ) >> 000F ) * ( - ( _a ) ) / ( _b ) + ( ( ( _a ) & ( _b ) ) >> 000F ) * ( - ( _a ) ) / ( - ( _b ) )
802A:111000   LD DE, 0010
ENDM
      ENDM
End of MACRO LD_DE_DIV
Expanding MACRO LD_DE_DIV
_a= 0020
_b= FFFE
LD DE , + ( ( ( ( _a ) | ( _b ) ) >> 000F ) XOR 0001 ) * ( _a ) / ( _b ) - ( ( ( ~ ( _a ) ) & ( _b ) ) >> 000F ) * ( _a ) / ( - ( _b ) ) - ( ( ( _a ) & ( ~ ( _b ) ) ) >> 000F ) * ( - ( _a ) ) / ( _b ) + ( ( ( _a ) & ( _b ) ) >> 000F ) * ( - ( _a ) ) / ( - ( _b ) )
802D:11F0FF   LD DE, FFF0
ENDM
      ENDM
End of MACRO LD_DE_DIV
Expanding MACRO LD_DE_DIV
_a= FFE0
_b= 0002
LD DE , + ( ( ( ( _a ) | ( _b ) ) >> 000F ) XOR 0001 ) * ( _a ) / ( _b ) - ( ( ( ~ ( _a ) ) & ( _b ) ) >> 000F ) * ( _a ) / ( - ( _b ) ) - ( ( ( _a ) & ( ~ ( _b ) ) ) >> 000F ) * ( - ( _a ) ) / ( _b ) + ( ( ( _a ) & ( _b ) ) >> 000F ) * ( - ( _a ) ) / ( - ( _b ) )
8030:11F0FF   LD DE, FFF0
ENDM
      ENDM
End of MACRO LD_DE_DIV
Expanding MACRO LD_DE_DIV
_a= FFE0
_b= FFFE
LD DE , + ( ( ( ( _a ) | ( _b ) ) >> 000F ) XOR 0001 ) * ( _a ) / ( _b ) - ( ( ( ~ ( _a ) ) & ( _b ) ) >> 000F ) * ( _a ) / ( - ( _b ) ) - ( ( ( _a ) & ( ~ ( _b ) ) ) >> 000F ) * ( - ( _a ) ) / ( _b ) + ( ( ( _a ) & ( _b ) ) >> 000F ) * ( - ( _a ) ) / ( - ( _b ) )
8033:111000   LD DE, 0010
ENDM
      ENDM
End of MACRO LD_DE_DIV
8036:      label label0
8036:01      DEFB of 1 bytes
8037:      label _label1
8037:01      DEFB of 1 bytes
8038:      label @label2
8038:01      DEFB of 1 bytes
8039:      label .label3
8039:01      DEFB of 1 bytes
803A:      label ...@@@000label4
803A:01      DEFB of 1 bytes
803B:213680   LD HL, 8036
803E:213780   LD HL, 8037
8041:213880   LD HL, 8038
8044:213980   LD HL, 8039
8047:213A80   LD HL, 803A
Emiting raw binary from 8000 to 8049

Je to v makru, protoze bych do toho jinak nikdy nedostal znak minus. A musel bych to testovat jeste s pomoci M4.
M4 na tim vzorcem jeste musi provest kontrolu zda napriklad jeden operand neni neco jako "-10-5-5", ale to neni problem mam na to uz filtr.

To je vlastne zabavny pro zjisteni cim to prekladate.

if -1-1
Pasmo tohle nezkompiluje protoze -1-1 je nula pro nej.
endif

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


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Macro FORTH
PříspěvekNapsal: 12.09.2022, 11:04 
Offline
Óm Nejvyšší

Registrován: 22.05.2013, 21:14
Příspěvky: 3660
Bydliště: Bratislava
Has thanked: 373 times
Been thanked: 795 times
_dworkin píše:
-10/2 bude urcite -5 (=65531)
ale 0xfff6/2 bude podle me 0x7ffb a ne -5 (=65531)
Akonahle mas nejaku (zapornu) hodnotu ktoru chces interpretovat ako 16-bitove kladne cislo, tak tu hodnotu vymaskuj konstantou #FFFF. To by malo chodit univerzalne vo vsetkych asembleroch.
Kód:
1     0000 01 FB FF        ld   bc,-10/2
2     0006 01 FB 7F        ld   bc,+(0xFFFF & (-10))/2


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Macro FORTH
PříspěvekNapsal: 12.09.2022, 18:32 
Offline
Pan Štábní

Registrován: 23.06.2013, 23:49
Příspěvky: 1113
Has thanked: 100 times
Been thanked: 159 times
Busy píše:
_dworkin píše:
-10/2 bude urcite -5 (=65531)
ale 0xfff6/2 bude podle me 0x7ffb a ne -5 (=65531)
Akonahle mas nejaku (zapornu) hodnotu ktoru chces interpretovat ako 16-bitove kladne cislo, tak tu hodnotu vymaskuj konstantou #FFFF. To by malo chodit univerzalne vo vsetkych asembleroch.
Kód:
1     0000 01 FB FF        ld   bc,-10/2
2     0006 01 FB 7F        ld   bc,+(0xFFFF & (-10))/2


Myslim ze jsi uplne nepochopil co jsem rikal. Bavime se ted o deleni se znamenkem, to bude asi ten zdroj nepochopeni.

Ale ten kod co jsi poslal je uzitecny. .)

Takze predpokladal jsem ze sjasmplus zvladne -10/2.
Coz prvni instrukce ukazuje ze zvladne, protoze vysledek je skutecne 0xFFFB = -5. Jen jsem teda osobne cekal mozna nejaky warning, ale asi neni potreba.

Naopak druha instrukce ukazuje kdy je vysledek spatne, protoze ten vzorec ve skutecnosti dela abs(-10)/2 a vysledek je pak rovny 65526/2=0x7FFB=32736

To co jsem rikal ja je, ze pokud misto -10/2 tam vlozis 65526/2 nebo 0xFFF6/2 tak to zase udela 0x7FFB=32736. A to je proste spatne POKUD mame hodnoty 16bitove. Protoze -10=0xFFF6=65526.
To ti ten AND 0xFFFF nepomuze.
Proto jsem prvne delitel i delenec posouval o 16bitu "nahoru". Protoze ocekavam ze tohle si uz sjasmplus uz pohlida ze 0xFFFFFFFF je -1 atd.

(((a<<16)/(b<<16))>>>16)

Ok, asi bych mel mene mluvit a uz to i vyzkouset. .)
Kód:
dworkin@dw-A15:~/Programovani/ZX/Forth/Pasmo_test$ printf " ORG 0x8000\n ld hl,0xFFF6/2\n ld hl,65526/2\n ld hl,((0xFFF6<<16)/(2 << 16))>>>16\n ld hl,((65526<<16)/(2<<16))>>>16\n ld hl,(65526*65536/(2*65536))>>>16" | sjasmplus - --lst=smaz && cat smaz
SjASMPlus Z80 Cross-Assembler v1.20.1 (https://github.com/z00m128/sjasmplus)
Pass 1 complete (0 errors)
Pass 2 complete (0 errors)
Pass 3 complete
Errors: 0, warnings: 0, compiled: 6 lines, work time: 0.000 seconds
# file opened: <stdin>
1     0000               ORG 0x8000
2     8000 21 FB 7F      ld hl,0xFFF6/2
3     8003 21 FB 7F      ld hl,65526/2
4     8006 21 FF FF      ld hl,((0xFFF6<<16)/(2 << 16))>>>16
5     8009 21 FF FF      ld hl,((65526<<16)/(2<<16))>>>16
6     800C 21 FF FF      ld hl,(65526*65536/(2*65536))>>>16
# file closed: <stdin>

Zajimave, tak ten muj vzorec nezvladne. Takze to chce jiny trik.

Tak byla jen chyba ve vzorci, nedoslo me ze uz to nemusim posouvat nazpet, protoze nasobim i delitele. Staci jen jeden z nich, presneji delitel protoze potrebuji aby sedelo znamenko.
Kód:
dworkin@dw-A15:~/Programovani/ZX/Forth/Pasmo_test$ printf " ORG 0x8000\n ld hl,0xFFF6/2\n ld hl,65526/2\n ld hl,((0xFFF6<<16)/(2 << 16))>>>16\n ld hl,((65526<<16)/(2<<16))>>>16\n ld hl,(65526*65536/(2*65536))>>>16\n ld hl,0xFFF60000/0x00020000\n ld hl, (0xFFF6<<16)/(2<<16)\n ld hl,(65526<<16)/(2<<16)" | sjasmplus - --lst=smaz && cat smaz
SjASMPlus Z80 Cross-Assembler v1.20.1 (https://github.com/z00m128/sjasmplus)
Pass 1 complete (0 errors)
Pass 2 complete (0 errors)
Pass 3 complete
Errors: 0, warnings: 0, compiled: 9 lines, work time: 0.001 seconds
# file opened: <stdin>
1     0000               ORG 0x8000
2     8000 21 FB 7F      ld hl,0xFFF6/2
3     8003 21 FB 7F      ld hl,65526/2
4     8006 21 FF FF      ld hl,((0xFFF6<<16)/(2 << 16))>>>16
5     8009 21 FF FF      ld hl,((65526<<16)/(2<<16))>>>16
6     800C 21 FF FF      ld hl,(65526*65536/(2*65536))>>>16
7     800F 21 FB FF      ld hl,0xFFF60000/0x00020000
8     8012 21 FB FF      ld hl, (0xFFF6<<16)/(2<<16)
9     8015 21 FB FF      ld hl,(65526<<16)/(2<<16)
# file closed: <stdin>
dworkin@dw-A15:~/Program

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


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Macro FORTH
PříspěvekNapsal: 12.09.2022, 19:04 
Offline
Pan Štábní

Registrován: 23.06.2013, 23:49
Příspěvky: 1113
Has thanked: 100 times
Been thanked: 159 times
Jinak si stale hraji s FORTHem. Smycky jsou podle me uz dostatecne otestovane a spis delam neco s tim prevodem tokenu na jine tokeny.
Par novych slov jako treba:

PUSH4 - Nema to uplne nejefektivnejsi kod, duvo proc jsem to potreboval je ze po PUSH3 kdyz nasleduje PUSH se nic nedelo.
Takze kdyz pak nasledovalo neco XXX co chce 2 parametry tak videl jen jeden a misto PUSH2_XXX to udelalo PUSH_XXX.
Konkretne slo o smycku. Kdyz to dost bolelo, ze znam konec i zacatek a pritom to generovalo kod ze znam jen zacatek,
coz je zrovna nejmene dulezity parametr.
Druhy duvod byl ze samotne push je neefektivni, protoze je to licha hodnota pro ulozeni a generuje to zbytecny "ex DE,HL".
Takze pokud po PUSH4 nasleduje PUSH tak to vytvori celkem efektivni PUSH2 z prvnich dvou hodnot
a pak nasleduje PUSH3 z poslednich 2 hodnot a nove hodnoty. A PUSH3 je dostatecny pocet pro vsechny dalsi XXX
jako treba MOVE, ktery si vezme tri hodnoty FROM,TO,TIMES.

PUSH3_CMOVE, aby to "ladilo" s PUSH3_MOVE.

U te fronty tokenu se me podarilo editovat i predposledni token. To bylo docela zajimave, protoze zatim byl parametr vzdy konstantu "__TOKEN_COUNT" a ted jsem musel mit "eval(__TOKEN_COUNT-1)". A to me prestalo fungovat, protoze vstup uz nebyla konstanta, ale prvne se to muselo vypocitat, nez se to stalo vstupem. Nevim jak, ale po ruznych pokusech s obalenim do {} a nebo vyjmutim { }tohle_se_udela_drive{ }. To zacalo fungovat az jsem to vyzkousel resit az v podfunkci. Takze by to melo bezet obecne pro jakoukoliv promenou hodnotu.

Slo o tokeny jako

PUSH4 CMOVE kde lze resit pres pomocne promenne a nebo vytvorit novy token PUSH3_CMOVE. Nacist do nej hodnoty tez uz nove z predchoziho tokenu, protoze uz je zvednute __TOKEN_COUNT. A pak editovat predchozi token, v podstate ho vytvorit znovu bez poslednich 3 parametru.

No a u toho jsem zjistil ze by bylo vhodne mit neco jako je makro "shift", ktere maze prvni parametr. Ale reverzne, aby to mazalo posledni parametr. A dale mit neco jako $-1, kdy by to vypsalo zase reverzne posledni parametr. Nebo $-2 predposledni atd.

Protoze napr. pokud mam neco co ma jeden parametr a vznikne PUSH_XXX

Tak u PUSH XXX je to snadne, proste jen zmeni nazev posledniho tokenu na PUSH_XXX a upravi info na "puvodne" + " xxx", parametry zustavaji.

PUSH2 XXX uz manipuluje s poslednim parametrem predchoziho tokenu a pak ho odmaze.
PUSH3 XXX uz manipuluje s poslednim parametrem predchoziho tokenu a pak ho odmaze.
PUSH4 XXX uz manipuluje s poslednim parametrem predchoziho tokenu a pak ho odmaze.

No a pokazde jsem to psal jako
__LAST_TOKEN_ARRAY_2
__LAST_TOKEN_ARRAY_3
__LAST_TOKEN_ARRAY_4
a ted to mam vsude stejne
__LAST_TOKEN_REVERSE_1
a odmazani bylo predtim jako ze to pridam znova
__LAST_TOKEN_ARRAY_1
__LAST_TOKEN_ARRAY_1,__LAST_TOKEN_ARRAY_2
__LAST_TOKEN_ARRAY_1,__LAST_TOKEN_ARRAY_2,__LAST_TOKEN_ARRAY_3
a ted to mam vsude jako
__DROP_1(__BEFORELAST_TOKEN_ARRAY)

Manipulace s predposlednim je pres __LAST_TOKEN_REVERSE_2

__LAST_TOKEN_LAST_2 me vypise
__LAST_TOKEN_REVERSE_2,__LAST_TOKEN_REVERSE_1
tzn posledni 2 tokeny.

Je to vsude komplikovanejsi, protoze se osetruje kdyz je parametru mene. Vtipne je ze dalo docela dost prace vymyslet nazvy tech funkci aby to aspon trosku davalo smysl. A pritom byly co nejkratsi.

Bylo toho mnohem vic, ale nepamatuji si to. Delam na co zrovna narazim... .)
Kód:
dnl # u3 u2 u1 cmove
dnl # ( from_addr to_addr u -- )
dnl # If u is greater than zero, copy the contents of u consecutive characters at addr1 to the u consecutive characters at addr2.
define({PUSH3_CMOVE},{dnl
__{}__ADD_TOKEN({__TOKEN_PUSH3_CMOVE},{$1 $2 $3 cmove},$@){}dnl
}){}dnl
dnl
define({__ASM_TOKEN_PUSH3_CMOVE},{dnl
__{}define({__INFO},__COMPILE_INFO){}dnl
__{}ifelse($#,0,{
__{}  .error .error {$0}($@): Missing from_address parameter!},
$#,1,{
__{}  .error .error {$0}($@): Missing to_address parameter!},
$#,2,{
__{}  .error .error {$0}($@): Missing u_times parameter!},
eval($#>3),1,{
__{}  .error .error {$0}($@): Unexpected parameter!},
__SAVE_EVAL($3),0,{},
__SAVE_EVAL($3),1,{dnl
__{}ifelse(__IS_MEM_REF($1),1,{
__{}    ld   BC,format({%-12s},{$1}); 4:20      __INFO   ( $1 $2 $3 -- )
__{}    ld    A,(BC)        ; 1:7       __INFO},
__{}{
__{}    ld    A,format({%-12s},{($1)}); 3:13      __INFO   ( $1 $2 $3 -- )})
__{}ifelse(__IS_MEM_REF($2),1,{dnl
__{}    ld   BC,format({%-12s},{$2}); 4:20      __INFO
__{}    ld  (BC),A          ; 1:7       __INFO},
__{}{dnl
__{}    ld  format({%-16s},{($2),A}); 3:13      __INFO})},
__SAVE_EVAL($3),2,{dnl
__{}ifelse(__IS_MEM_REF($1),{1},{
__{}    push HL             ; 1:11      __INFO   ( $1 $2 $3 -- )
__{}    mov  HL,format({%-12s},{$1}); 3:16      __INFO   from_addr
__{}    mov   C,(HL)        ; 1:7       __INFO
__{}    inc  HL             ; 1:6       __INFO
__{}    mov   B,(HL)        ; 1:7       __INFO},
__IS_MEM_REF($2),{1},{
__{}    push HL             ; 1:11      __INFO   ( $1 $2 $3 -- )
__{}    ld   BC,format({%-12s},{($1)}); 4:20      __INFO},
__{}{
__{}    ld   BC,format({%-12s},{($1)}); 4:20      __INFO   ( $1 $2 $3 -- )}){}dnl
__{}ifelse(__IS_MEM_REF($2),{1},{
__{}    mov  HL,format({%-12s},{$2}); 3:16      __INFO   to_addr
__{}    mov (HL),C          ; 1:7       __INFO
__{}    inc  HL             ; 1:6       __INFO
__{}    mov (HL),B          ; 1:7       __INFO
__{}    pop  HL             ; 1:10      __INFO},
__{}__IS_MEM_REF($1),{1},{
__{}    ld  format({%-16s},{($2),BC}); 4:20      __INFO
__{}    pop  HL             ; 1:10      __INFO)},
__{}{
__{}    ld  format({%-16s},{($2),BC}); 4:20      __INFO})},
{
    push DE             ; 1:11      __INFO   ( $1 $2 $3 -- )
    push HL             ; 1:11      __INFO{}dnl
__{}define({_TMP_INFO},__INFO{   from_addr}){}__LD_REG16({HL},$1){}__CODE_16BIT{}dnl
__{}define({_TMP_INFO},__INFO{   to_addr}){}__LD_REG16({DE},$2,{HL},$1){}__CODE_16BIT{}dnl
__{}define({_TMP_INFO},__INFO{   u_times}){}__LD_REG16({BC},$3,{HL},$1,{DE},$2){}__CODE_16BIT{}dnl
__{}ifelse(__IS_NUM($3),0,{
    ld    A, C          ; 1:4       __INFO
    or    B             ; 1:4       __INFO
    jr    z, $+4        ; 2:7/12    __INFO})
    ldir                ; 2:u*21/16 __INFO
    pop  HL             ; 1:10      __INFO
    pop  DE             ; 1:10      __INFO}){}dnl
}){}dnl


Tady to mate pekne i s chybou u PUSH_CMOVE, to jsem delal taky nove.
Kód:
dworkin@dw-A15:~/Programovani/ZX/Forth/M4$ ../check_word.sh 'PUSH(0) CMOVE'
 
    pop  HL             ; 1:10      0 cmove
    pop  DE             ; 1:10      0 cmove   ( b a -- )
                       ;[ 2:20]
dworkin@dw-A15:~/Programovani/ZX/Forth/M4$ ../check_word.sh 'PUSH(aaa) CMOVE'
 
    .error  __ASM_TOKEN_PUSH_CMOVE(): Bad parameter!
                       ;[ 0:0]
dworkin@dw-A15:~/Programovani/ZX/Forth/M4$ ../check_word.sh 'PUSH(1) CMOVE'
 
                        ;[5:40]     1 cmove   ( from_addr to_addr -- )   u = 1 char
    ex   DE, HL         ; 1:4       1 cmove   HL = from_addr, DE = to_addr
    ldi                 ; 2:16      1 cmove   1x
    pop  HL             ; 1:10      1 cmove
    pop  DE             ; 1:10      1 cmove
                       ;[ 5:40]
dworkin@dw-A15:~/Programovani/ZX/Forth/M4$ ../check_word.sh 'PUSH(2) PUSH(1) CMOVE'
 
                        ;[8:42]     2 1   ( -- 2 1 )
    push DE             ; 1:11      2 1
    push HL             ; 1:11      2 1
    ld   DE, 0x0002     ; 3:10      2 1
    ld   HL, 0x0001     ; 3:10      2 1
    ld    A, H          ; 1:4       cmove   ( from_addr to_addr u_chars -- )
    or    L             ; 1:4       cmove
    ld    B, H          ; 1:4       cmove
    ld    C, L          ; 1:4       cmove BC = u_chars
    pop  HL             ; 1:10      cmove HL = from_addr
    jr    z, $+4        ; 2:7/12    cmove
    ldir                ; 2:u*21/16 cmove
    pop  HL             ; 1:10      cmove
    pop  DE             ; 1:10      cmove
                       ;[17:95]
dworkin@dw-A15:~/Programovani/ZX/Forth/M4$ ../check_word.sh 'PUSH(3) PUSH(2) PUSH(1) CMOVE'
   
    ld    A,(3)         ; 3:13      3 2 1 cmove   ( 3 2 1 -- )
    ld  (2),A           ; 3:13      3 2 1 cmove
                       ;[ 6:26]
dworkin@dw-A15:~/Programovani/ZX/Forth/M4$ ../check_word.sh 'PUSH(3) PUSH(2) PUSH(0) CMOVE'
   
                       ;[ 0:0]
dworkin@dw-A15:~/Programovani/ZX/Forth/M4$ ../check_word.sh 'PUSH(3) PUSH(2) PUSH(2) CMOVE'
   
    ld   BC,(3)         ; 4:20      3 2 2 cmove   ( 3 2 2 -- )
    ld  (2),BC          ; 4:20      3 2 2 cmove
                       ;[ 8:40]
dworkin@dw-A15:~/Programovani/ZX/Forth/M4$ ../check_word.sh 'PUSH(3) PUSH((2)) PUSH(2) CMOVE'
   
    push HL             ; 1:11      3 (2) 2 cmove   ( 3 (2) 2 -- )
    ld   BC,(3)         ; 4:20      3 (2) 2 cmove
    mov  HL,(2)         ; 3:16      3 (2) 2 cmove   to_addr
    mov (HL),C          ; 1:7       3 (2) 2 cmove
    inc  HL             ; 1:6       3 (2) 2 cmove
    mov (HL),B          ; 1:7       3 (2) 2 cmove
    pop  HL             ; 1:10      3 (2) 2 cmove
                       ;[12:77]
dworkin@dw-A15:~/Programovani/ZX/Forth/M4$ ../check_word.sh 'PUSH((3)) PUSH((2)) PUSH(2) CMOVE'
   
    push HL             ; 1:11      (3) (2) 2 cmove   ( (3) (2) 2 -- )
    mov  HL,(3)         ; 3:16      (3) (2) 2 cmove   from_addr
    mov   C,(HL)        ; 1:7       (3) (2) 2 cmove
    inc  HL             ; 1:6       (3) (2) 2 cmove
    mov   B,(HL)        ; 1:7       (3) (2) 2 cmove
    mov  HL,(2)         ; 3:16      (3) (2) 2 cmove   to_addr
    mov (HL),C          ; 1:7       (3) (2) 2 cmove
    inc  HL             ; 1:6       (3) (2) 2 cmove
    mov (HL),B          ; 1:7       (3) (2) 2 cmove
    pop  HL             ; 1:10      (3) (2) 2 cmove
                       ;[14:93]
dworkin@dw-A15:~/Programovani/ZX/Forth/M4$ ../check_word.sh 'PUSH((3)) PUSH(2) PUSH(2) CMOVE'
   
    push HL             ; 1:11      (3) 2 2 cmove   ( (3) 2 2 -- )
    mov  HL,(3)         ; 3:16      (3) 2 2 cmove   from_addr
    mov   C,(HL)        ; 1:7       (3) 2 2 cmove
    inc  HL             ; 1:6       (3) 2 2 cmove
    mov   B,(HL)        ; 1:7       (3) 2 2 cmove
    ld  (2),BC          ; 4:20      (3) 2 2 cmove
    pop  HL             ; 1:10      (3) 2 2 cmove)
                       ;[12:77]
dworkin@dw-A15:~/Programovani/ZX/Forth/M4$ ../check_word.sh 'PUSH(3) PUSH(2) PUSH(3) CMOVE'
   
    push DE             ; 1:11      3 2 3 cmove   ( 3 2 3 -- )
    push HL             ; 1:11      3 2 3 cmove
    ld   HL, 0x0003     ; 3:10      3 2 3 cmove   from_addr
    ld   DE, 0x0002     ; 3:10      3 2 3 cmove   to_addr
    ld    C, L          ; 1:4       3 2 3 cmove   u_times   C = L = 0x03
    ld    B, H          ; 1:4       3 2 3 cmove   u_times   B = H = 0x00
    ldir                ; 2:u*21/16 3 2 3 cmove
    pop  HL             ; 1:10      3 2 3 cmove
    pop  DE             ; 1:10      3 2 3 cmove
                       ;[12:70]
dworkin@dw-A15:~/Programovani/ZX/Forth/M4$ ../check_word.sh 'PUSH(aaa) PUSH(2) PUSH(3) CMOVE'
   
    push DE             ; 1:11      aaa 2 3 cmove   ( aaa 2 3 -- )
    push HL             ; 1:11      aaa 2 3 cmove
    ld   HL, aaa        ; 3:10      aaa 2 3 cmove   from_addr
    ld   DE, 0x0002     ; 3:10      aaa 2 3 cmove   to_addr
    ld   BC, 0x0003     ; 3:10      aaa 2 3 cmove   u_times
    ldir                ; 2:u*21/16 aaa 2 3 cmove
    pop  HL             ; 1:10      aaa 2 3 cmove
    pop  DE             ; 1:10      aaa 2 3 cmove
                       ;[13:72]
dworkin@dw-A15:~/Programovani/ZX/Forth/M4$ ../check_word.sh 'PUSH(aaa) PUSH((2)) PUSH(3) CMOVE'
   
    push DE             ; 1:11      aaa (2) 3 cmove   ( aaa (2) 3 -- )
    push HL             ; 1:11      aaa (2) 3 cmove
    ld   HL, aaa        ; 3:10      aaa (2) 3 cmove   from_addr
    ld   DE, (2)        ; 4:20      aaa (2) 3 cmove   to_addr
    ld   BC, 0x0003     ; 3:10      aaa (2) 3 cmove   u_times
    ldir                ; 2:u*21/16 aaa (2) 3 cmove
    pop  HL             ; 1:10      aaa (2) 3 cmove
    pop  DE             ; 1:10      aaa (2) 3 cmove
                       ;[14:82]
dworkin@dw-A15:~/Programovani/ZX/Forth/M4$ ../check_word.sh 'PUSH(aaa) PUSH((2)) PUSH(2) CMOVE'
   
    push HL             ; 1:11      aaa (2) 2 cmove   ( aaa (2) 2 -- )
    ld   BC,(aaa)       ; 4:20      aaa (2) 2 cmove
    mov  HL,(2)         ; 3:16      aaa (2) 2 cmove   to_addr
    mov (HL),C          ; 1:7       aaa (2) 2 cmove
    inc  HL             ; 1:6       aaa (2) 2 cmove
    mov (HL),B          ; 1:7       aaa (2) 2 cmove
    pop  HL             ; 1:10      aaa (2) 2 cmove
                       ;[12:77]
dworkin@dw-A15:~/Programovani/ZX/Forth/M4$ ../check_word.sh 'PUSH(aaa) PUSH(bbb) PUSH(2) CMOVE'
   
    ld   BC,(aaa)       ; 4:20      aaa bbb 2 cmove   ( aaa bbb 2 -- )
    ld  (bbb),BC        ; 4:20      aaa bbb 2 cmove
                       ;[ 8:40]
dworkin@dw-A15:~/Programovani/ZX/Forth/M4$


PS: Jedna dalsi dulezita zmena byla v makrech pro vypis cisla
__HEX_L
__HEX_H
__HEX_HL
Stavalo se mi ze tam lezly neplatne hodnoty jako "abc+5", protoze jsem to nekde spatne osetril.
Takze nove jsem zmenil uz zmenenou vlastost, kdy predtim ty makra si uz nove hlidaly prazdny vstup na cokoliv co neni cislo se meni na prazdny vystup.
To me usetri nejaky if a mohu psat neco jako

__HEX_HL($1),0x0001,{jednicka}

misto

ifelse(__IS_MEM_REF($1),1,{ukazatel},
__IS_NUM($1),0,{nezname},
{ifelse(__HEX_HL($1),0x0001,{jendicka})})

Zvolil jsem trochu blbou hodnotu u -1 je to lepe videt, protoze to chytne jak -1 tak 0xFFFF nebo cokoliv jineho jako 32768+32767.

PPS: A jeste predtim jsem zmenil __IS_NUM na to aby chytal i __IS_MEM_REF. Takze jsem si musel vsude osetrit ze nedelam vstup jako __HEX_HL(($1+1) & 0xFF) nebo ($1+1)/2 a bud prohodit za 0xFF & ($1+1) nebo pridat plus

dworkin@dw-A15:~/Programovani/ZX/Forth/M4$ grep -R "(+("
stack.m4:__{}ifelse(__HEX_H(+($1+1)/2),{0x00},,{

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


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Macro FORTH
PříspěvekNapsal: 12.09.2022, 20:47 
Offline
Pan Štábní

Registrován: 23.06.2013, 23:49
Příspěvky: 1113
Has thanked: 100 times
Been thanked: 159 times
Kód:
dworkin@dw-A15:~/Programovani/ZX/Forth/Pasmo_test$ printf " ORG 0x8000\n ld hl,abs(-10/2)\n ld hl,abs(65526)/abs(2)\n ld hl,abs(-10)/abs(2)\n ld hl,abs(65526/2)\n ld hl,abs(-10 << 16)/abs(2 << 16)\n ld hl,abs(65526<<16)/abs(2<<16)" | sjasmplus - --lst=smaz && cat smaz
SjASMPlus Z80 Cross-Assembler v1.20.1 (https://github.com/z00m128/sjasmplus)
Pass 1 complete (0 errors)
Pass 2 complete (0 errors)
Pass 3 complete
Errors: 0, warnings: 0, compiled: 7 lines, work time: 0.000 seconds
# file opened: <stdin>
1     0000               ORG 0x8000
2     8000 21 05 00      ld hl,abs(-10/2)
3     8003 21 FB 7F      ld hl,abs(65526)/abs(2)
4     8006 21 05 00      ld hl,abs(-10)/abs(2)
5     8009 21 FB 7F      ld hl,abs(65526/2)
6     800C 21 05 00      ld hl,abs(-10 << 16)/abs(2 << 16)
7     800F 21 05 00      ld hl,abs(65526<<16)/abs(2<<16)
# file closed: <stdin>
dworkin@dw-A15:~/Programovani/ZX/Forth/Pasmo_test$

Jeste ukazka unsigned 16 bitoveho deleni, taky musi byt osetreno, protoze sjasmplus nebude brat 0x8000 jako zaporne cislo.

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


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Macro FORTH
PříspěvekNapsal: 12.09.2022, 22:00 
Offline
Pan Štábní

Registrován: 23.06.2013, 23:49
Příspěvky: 1113
Has thanked: 100 times
Been thanked: 159 times
Pro zajimavost jak by vypadal kod pro deleni se znamenkem pro oba prekladace.
Premyslel jsem nad tim a sjasmplus musi pouzit kod z pasma, protoze pasmo neda 32 bit, a aby ten pro pasmo bezel i v 32 bitech tak se tam musi vhodne udelat bitove & 0xFFFF.

Vhodne je mysleno ze kdyz jsem to udelal hned tak to selhalo.
kdyz je v kodu

-(X) --> (-(X))&0xFFFF
~(X) --> (~(X))&0xFFFF

Prvni 2 radky jsou pro variantu ze znam aspon jednu hodnotu jako cislo. Treti ma stejny kod pro vse a je kdyz neznam nic.
4x se to opakuje.
Prvne se testuje ++
Pak -+
Pak +-
Nakonec --

Ke vsemu to sice funguje, ale chyby tam muzou byt, protoze jsem to delal rucne, neni to generace makra, takze tam kde se to zrovna nasobi nulou to muze byt blbe.
Kód:
 ORG 0x8000     
_a  EQU 25
_b  EQU -25
_x  EQU 5
_y  EQU -5
    ld   HL, +((((_a) & 0xFFFF)>>15) xor 1)*((_a) & 0xFFFF)/0x0005-(((_a) & 0xFFFF)>>15)*((-(_a)) & 0xFFFF)/0x0005; 3:10      _a 5 /
    ld   HL, +(((~(_x)) & 0xFFFF)>>15)*0x0019/((_x) & 0xFFFF)-(((_x) & 0xFFFF)>>15)*0x0019/((0-(_x)) & 0xFFFF); 3:10      25 _x /
    ld   HL, +(((((_a) & 0xFFFF)|((_x) & 0xFFFF))>>15) xor 1)*((_a) & 0xFFFF)/((_x) & 0xFFFF)-((((~(_a)) & 0xFFFF)&((_x) & 0xFFFF))>>15)*((_a) & 0xFFFF)/((-(_x)) & 0xFFFF)-((((_a) & 0xFFFF)&(~((_x) & 0xFFFF)))>>15)*((-(_a)) & 0xFFFF)/((_x) & 0xFFFF)+((((_a) & 0xFFFF)&((_x) & 0xFFFF))>>15)*((-(_a)) & 0xFFFF)/((-(_x)) & 0xFFFF); 3:10      _a _x /

    ld   HL, +((((_b) & 0xFFFF)>>15) xor 1)*((_b) & 0xFFFF)/0x0005-(((_b) & 0xFFFF)>>15)*((-(_b)) & 0xFFFF)/0x0005; 3:10      _b 5 /
    ld   HL, +(((_x) & 0xFFFF)>>15)*0x0019/((0-(_x)) & 0xFFFF)-(((~(_x)) & 0xFFFF)>>15)*0x0019/((_x) & 0xFFFF); 3:10      -25 _x /
    ld   HL, +(((((_b) & 0xFFFF)|((_x) & 0xFFFF))>>15) xor 1)*((_b) & 0xFFFF)/((_x) & 0xFFFF)-((((~(_b)) & 0xFFFF)&((_x) & 0xFFFF))>>15)*((_b) & 0xFFFF)/((-(_x)) & 0xFFFF)-((((_b) & 0xFFFF)&(~((_x) & 0xFFFF)))>>15)*((-(_b)) & 0xFFFF)/((_x) & 0xFFFF)+((((_b) & 0xFFFF)&((_x) & 0xFFFF))>>15)*((-(_b)) & 0xFFFF)/((-(_x)) & 0xFFFF); 3:10      _b _x /

    ld   HL, +(((_a) & 0xFFFF)>>15)*((-(_a)) & 0xFFFF)/0x0005-(((~(_a)) & 0xFFFF)>>15)*((_a) & 0xFFFF)/0x0005; 3:10      _b -5 /
    ld   HL, +(((~(_y)) & 0xFFFF)>>15)*0x0019/((_y) & 0xFFFF)-(((_y) & 0xFFFF)>>15)*0x0019/((0-(_y)) & 0xFFFF); 3:10      25 _y /
    ld   HL, +(((((_a) & 0xFFFF)|((_y) & 0xFFFF))>>15) xor 1)*((_a) & 0xFFFF)/((_y) & 0xFFFF)-((((~(_a)) & 0xFFFF)&((_y) & 0xFFFF))>>15)*((_a) & 0xFFFF)/((-(_y)) & 0xFFFF)-((((_a) & 0xFFFF)&(~((_y) & 0xFFFF)))>>15)*((-(_a)) & 0xFFFF)/((_y) & 0xFFFF)+((((_a) & 0xFFFF)&((_y) & 0xFFFF))>>15)*((-(_a)) & 0xFFFF)/((-(_y)) & 0xFFFF); 3:10      _a _y /

    ld   HL, +(((_b) & 0xFFFF)>>15)*((-(_b)) & 0xFFFF)/0x0005-(((~(_b)) & 0xFFFF)>>15)*((_b) & 0xFFFF)/0x0005; 3:10      _b -5 /
    ld   HL, +(((_y) & 0xFFFF)>>15)*0x0019/((0-(_y)) & 0xFFFF)-(((~(_y)) & 0xFFFF)>>15)*0x0019/((_y) & 0xFFFF); 3:10      -25 _y /
    ld   HL, +(((((_b) & 0xFFFF)|((_y) & 0xFFFF))>>15) xor 1)*((_b) & 0xFFFF)/((_y) & 0xFFFF)-((((~(_b)) & 0xFFFF)&((_y) & 0xFFFF))>>15)*((_b) & 0xFFFF)/((-(_y)) & 0xFFFF)-((((_b) & 0xFFFF)&(~((_y) & 0xFFFF)))>>15)*((-(_b)) & 0xFFFF)/((_y) & 0xFFFF)+((((_b) & 0xFFFF)&((_y) & 0xFFFF))>>15)*((-(_b)) & 0xFFFF)/((-(_y)) & 0xFFFF); 3:10      _b _y /


"Pekne" co? :D

Kód:
dworkin@dw-A15:~/Programovani/ZX/Forth/Pasmo_test$ sjasmplus div2.asm --lst=smaz && cat smaz
SjASMPlus Z80 Cross-Assembler v1.20.1 (https://github.com/z00m128/sjasmplus)
Pass 1 complete (0 errors)
Pass 2 complete (0 errors)
Pass 3 complete
Errors: 0, warnings: 0, compiled: 21 lines, work time: 0.002 seconds
# file opened: div2.asm
 1    0000               ORG 0x8000
 2    8000              _a  EQU 25
 3    8000              _b  EQU -25
 4    8000              _x  EQU 5
 5    8000              _y  EQU -5
 6    8000 21 05 00         ld   HL, +((((_a) & 0xFFFF)>>15) xor 1)*((_a) & 0xFFFF)/0x0005-(((_a) & 0xFFFF)>>15)*((-(_a)) & 0xFFFF)/0x0005; 3:10      _a 5 /
 7    8003 21 05 00         ld   HL, +(((~(_x)) & 0xFFFF)>>15)*0x0019/((_x) & 0xFFFF)-(((_x) & 0xFFFF)>>15)*0x0019/((0-(_x)) & 0xFFFF); 3:10      25 _x /
 8    8006 21 05 00         ld   HL, +(((((_a) & 0xFFFF)|((_x) & 0xFFFF))>>15) xor 1)*((_a) & 0xFFFF)/((_x) & 0xFFFF)-((((~(_a)) & 0xFFFF)&((_x) & 0xFFFF))>>15)*((_a) & 0xFFFF)/((-(_x)) & 0xFFFF)-((((_a) & 0xFFFF)&(~((_x) & 0xFFFF)))>>15)*((-(_a)) & 0xFFFF)/((_x) & 0xFFFF)+((((_a) & 0xFFFF)&((_x) & 0xFFFF))>>15)*((-(_a)) & 0xFFFF)/((-(_x)) & 0xFFFF); 3:10      _a _x /
 9    8009
10    8009 21 FB FF         ld   HL, +((((_b) & 0xFFFF)>>15) xor 1)*((_b) & 0xFFFF)/0x0005-(((_b) & 0xFFFF)>>15)*((-(_b)) & 0xFFFF)/0x0005; 3:10      _b 5 /
11    800C 21 FB FF         ld   HL, +(((_x) & 0xFFFF)>>15)*0x0019/((0-(_x)) & 0xFFFF)-(((~(_x)) & 0xFFFF)>>15)*0x0019/((_x) & 0xFFFF); 3:10      -25 _x /
12    800F 21 FB FF         ld   HL, +(((((_b) & 0xFFFF)|((_x) & 0xFFFF))>>15) xor 1)*((_b) & 0xFFFF)/((_x) & 0xFFFF)-((((~(_b)) & 0xFFFF)&((_x) & 0xFFFF))>>15)*((_b) & 0xFFFF)/((-(_x)) & 0xFFFF)-((((_b) & 0xFFFF)&(~((_x) & 0xFFFF)))>>15)*((-(_b)) & 0xFFFF)/((_x) & 0xFFFF)+((((_b) & 0xFFFF)&((_x) & 0xFFFF))>>15)*((-(_b)) & 0xFFFF)/((-(_x)) & 0xFFFF); 3:10      _b _x /
13    8012
14    8012 21 FB FF         ld   HL, +(((_a) & 0xFFFF)>>15)*((-(_a)) & 0xFFFF)/0x0005-(((~(_a)) & 0xFFFF)>>15)*((_a) & 0xFFFF)/0x0005; 3:10      _b -5 /
15    8015 21 FB FF         ld   HL, +(((~(_y)) & 0xFFFF)>>15)*0x0019/((_y) & 0xFFFF)-(((_y) & 0xFFFF)>>15)*0x0019/((0-(_y)) & 0xFFFF); 3:10      25 _y /
16    8018 21 FB FF         ld   HL, +(((((_a) & 0xFFFF)|((_y) & 0xFFFF))>>15) xor 1)*((_a) & 0xFFFF)/((_y) & 0xFFFF)-((((~(_a)) & 0xFFFF)&((_y) & 0xFFFF))>>15)*((_a) & 0xFFFF)/((-(_y)) & 0xFFFF)-((((_a) & 0xFFFF)&(~((_y) & 0xFFFF)))>>15)*((-(_a)) & 0xFFFF)/((_y) & 0xFFFF)+((((_a) & 0xFFFF)&((_y) & 0xFFFF))>>15)*((-(_a)) & 0xFFFF)/((-(_y)) & 0xFFFF); 3:10      _a _y /
17    801B
18    801B 21 05 00         ld   HL, +(((_b) & 0xFFFF)>>15)*((-(_b)) & 0xFFFF)/0x0005-(((~(_b)) & 0xFFFF)>>15)*((_b) & 0xFFFF)/0x0005; 3:10      _b -5 /
19    801E 21 05 00         ld   HL, +(((_y) & 0xFFFF)>>15)*0x0019/((0-(_y)) & 0xFFFF)-(((~(_y)) & 0xFFFF)>>15)*0x0019/((_y) & 0xFFFF); 3:10      -25 _y /
20    8021 21 05 00         ld   HL, +(((((_b) & 0xFFFF)|((_y) & 0xFFFF))>>15) xor 1)*((_b) & 0xFFFF)/((_y) & 0xFFFF)-((((~(_b)) & 0xFFFF)&((_y) & 0xFFFF))>>15)*((_b) & 0xFFFF)/((-(_y)) & 0xFFFF)-((((_b) & 0xFFFF)&(~((_y) & 0xFFFF)))>>15)*((-(_b)) & 0xFFFF)/((_y) & 0xFFFF)+((((_b) & 0xFFFF)&((_y) & 0xFFFF))>>15)*((-(_b)) & 0xFFFF)/((-(_y)) & 0xFFFF); 3:10      _b _y /
21    8024
# file closed: div2.asm
dworkin@dw-A15:~/Programovani/ZX/Forth/Pasmo_test$ pasmo -d div2.asm smaz.bin
      ORG 8000
_a      EQU 0019
_b      EQU FFE7
_x      EQU 0005
_y      EQU FFFB
8000:210500   LD HL, 0005
8003:210500   LD HL, 0005
8006:210500   LD HL, 0005
8009:21FBFF   LD HL, FFFB
800C:21FBFF   LD HL, FFFB
800F:21FBFF   LD HL, FFFB
8012:21FBFF   LD HL, FFFB
8015:21FBFF   LD HL, FFFB
8018:21FBFF   LD HL, FFFB
801B:210500   LD HL, 0005
801E:210500   LD HL, 0005
8021:210500   LD HL, 0005
Emiting raw binary from 8000 to 8023
dworkin@dw-A15:~/Programovani/ZX/Forth/Pasmo_test$

Predstavte si ze delate
PUSH(aaa) PUSH(bbb) DIV PUSH(ccc) DIV
a chcete kod pro oba prekladace... .)
Budu to muset rozseknout a misto "univerzalniho kodu" pouzit specificky.

Tady se uz nevyplatilo rozlisovat zda znam aspon jednu hodnotu, bylo by to jen slozitejsi.
Kód:
 ORG 0x8000     
_a  EQU 25
_b  EQU -25
_x  EQU 5
_y  EQU -5
    ld   HL, (_a<<16)/(5<<16)    ; 3:10      _a 5 /
    ld   HL, (25<<16)/(_x<<16)   ; 3:10      25 _x /
    ld   HL, (_a<<16)/(_x<<16)   ; 3:10      _a _x /

    ld   HL, (_b<<16)/(5<<16)    ; 3:10      _b 5 /
    ld   HL, (-25<<16)/(_x<<16)  ; 3:10      -25 _x /
    ld   HL, (_b<<16)/(_x<<16)   ; 3:10      _b _x /

    ld   HL, (_a<<16)/(-5<<16)   ; 3:10      _b -5 /
    ld   HL, (25<<16)/(_y<<16)   ; 3:10      25 _y /
    ld   HL, (_a<<16)/(_y<<16)   ; 3:10      _a _y /

    ld   HL, (_b<<16)/(-5<<16)   ; 3:10      _b -5 /
    ld   HL, (-25<<16)/(_y<<16)  ; 3:10      -25 _y /
    ld   HL, (_b<<16)/(_y<<16)   ; 3:10      _b _y /


Kód:
dworkin@dw-A15:~/Programovani/ZX/Forth/Pasmo_test$ sjasmplus div3.asm --lst=smaz && cat smaz
SjASMPlus Z80 Cross-Assembler v1.20.1 (https://github.com/z00m128/sjasmplus)
Pass 1 complete (0 errors)
Pass 2 complete (0 errors)
Pass 3 complete
Errors: 0, warnings: 0, compiled: 21 lines, work time: 0.001 seconds
# file opened: div3.asm
 1    0000               ORG 0x8000
 2    8000              _a  EQU 25
 3    8000              _b  EQU -25
 4    8000              _x  EQU 5
 5    8000              _y  EQU -5
 6    8000 21 05 00         ld   HL, (_a<<16)/(5<<16)    ; 3:10      _a 5 /
 7    8003 21 05 00         ld   HL, (25<<16)/(_x<<16)   ; 3:10      25 _x /
 8    8006 21 05 00         ld   HL, (_a<<16)/(_x<<16)   ; 3:10      _a _x /
 9    8009
10    8009 21 FB FF         ld   HL, (_b<<16)/(5<<16)    ; 3:10      _b 5 /
11    800C 21 FB FF         ld   HL, (-25<<16)/(_x<<16)  ; 3:10      -25 _x /
12    800F 21 FB FF         ld   HL, (_b<<16)/(_x<<16)   ; 3:10      _b _x /
13    8012
14    8012 21 FB FF         ld   HL, (_a<<16)/(-5<<16)   ; 3:10      _b -5 /
15    8015 21 FB FF         ld   HL, (25<<16)/(_y<<16)   ; 3:10      25 _y /
16    8018 21 FB FF         ld   HL, (_a<<16)/(_y<<16)   ; 3:10      _a _y /
17    801B
18    801B 21 05 00         ld   HL, (_b<<16)/(-5<<16)   ; 3:10      _b -5 /
19    801E 21 05 00         ld   HL, (-25<<16)/(_y<<16)  ; 3:10      -25 _y /
20    8021 21 05 00         ld   HL, (_b<<16)/(_y<<16)   ; 3:10      _b _y /
21    8024
# file closed: div3.asm

_________________
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ů: 598 ]  Přejít na stránku Předchozí  1 ... 16, 17, 18, 19, 20, 21, 22 ... 40  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