1 Ostatnio edytowany przez Cyprian (2023-01-01 14:16:45)

czy Mad assembler ma może taką funkcjonalność definiowania tablicy etykiet/adresów, którą mógłbym wykorzystać z REPTem?

Poniżej poglądowy kod:

.array Etykieta[Sprite0, Sprite4, Sprite8, SpriteC]

    .rept 4
        ?Sprite = #
        ldy    Etykieta[?Sprite]
        .rept 7
            ?PrzesunSpritey = #
            lda    Etykieta[?Sprite] + (?PrzesunSpritey * 8) + 8
            sta    Etykieta[?Sprite] + (?PrzesunSpritey * 8)
        .endr
        sty Etykieta[?Sprite] + 56
    .endr


Sprite0:    
    dta    $00,     $00,     $40,     $80,     $80,     $40,     $00,     $00
Sprite1:    
    dta    $00,     $00,     $40,     $80,     $80,     $40,     $00,     $00
Sprite2:    
    dta    $00,     $00,     $40,     $80,     $80,     $40,     $00,     $00
Sprite3:    
    dta    $00,     $00,     $40,     $80,     $80,     $40,     $00,     $00

---edycja----
zamieniłem 'x' na '?Sprite' w Etykieta[x]

Lynx I / Mega ST 1 / 7800 / Portfolio / Lynx II / Jaguar / TT030 / Mega STe / 800 XL / 1040 STe / Falcon030 / 65 XE / 520 STm / SM124 / SC1435
DDD HDD / AT Speed C16 / TF536 / SDrive / PAK68/3 / Lynx Multi Card / LDW Super 2000 / XCA12 / SkunkBoard / CosmosEx / SatanDisk / UltraSatan / USB Floppy Drive Emulator / Eiffel / SIO2PC / Crazy Dots / PAM Net
http://260ste.atari.org

2 Ostatnio edytowany przez pajero (2023-01-01 10:34:47)

    .rept 5,# 
    
name:1 = :1*2    
    
    .endr

co daje:

Source: REPT
     0000            NAME0 = 0*2    
     0002            NAME1 = 1*2    
     0004            NAME2 = 2*2    
     0006            NAME3 = 3*2    
     0008            NAME4 = 4*2    

Tomek, co knoce?    Ewidentnie nie można .rept   dać wewnątrz .array

      org $700
  
    
.array Etykieta[4][7]

    .rept 4,#
    
        .rept 7,:1,#
           
        Etykieta[:1*:2] = (:2 * 8) + 8   ;= ERROR: Constant expression violates subrange bounds
        Etykieta[:1][:2] = (:2 * 8) + 8  ;= ERROR: Constant expression violates subrange bounds

        .endr
     .endr    
.enda

3

poprzez makro w którym będzie rept 7

*- TeBe/Madteam
3x Atari 130XE, SDX, CPU 65816, 2x VBXE, 2x IDE Plus rev. C

4 Ostatnio edytowany przez pajero (2023-01-01 12:18:58)

.macro w .array także kaput

      org $700
      
.macro wpisz
    
    .rept 7,:1,#
           
        .print :1,:2           
    .endr  
.endm    


    wpisz 1  ; OK

.array Etykieta[4][7]
       
        wpisz 1    ;=ERROR: Undeclared label WPISZ1 (BANK=0)
        
.enda

5 Ostatnio edytowany przez Cyprian (2023-01-01 14:24:51)

dzięki za pomoc.

Na razie zrobiłem to używając IF/ELSEIF/ENDIF.

    .rept 4
        .if # = 0
            ?Sprite = Sprite0
        .elseif # = 1
            ?Sprite = Sprite4
        .elseif # = 2
            ?Sprite = Sprite8
        .elseif # = 3
            ?Sprite = SpriteC
        .endif

        .rept 8
            ?PrzesunSpriteX = #
            ldy ?Sprite + ?PrzesunSpriteX

            .rept 7
                ?PrzesunSpritey = #
                lda ?Sprite + ?PrzesunSpriteX + (?PrzesunSpritey * 8) + 8
                sta ?Sprite + ?PrzesunSpriteX + (?PrzesunSpritey * 8)
            .endr

            sty ?Sprite + ?PrzesunSpriteX + 56
        .endr

    .endr

Swoją drogą może jest szansa na dodanie do MAD Assemblera czegoś nowego?
Poniższe mogłoby robić to samo co IF/ELSEIF/ENDIF, jest krótsze i ładniejsze:

.array Etykieta[Sprite0, Sprite1, Sprite2, Sprite3]

    .rept 4
        lda    Etykieta[#]+8
        sta    Etykieta[#]
    .endr
Lynx I / Mega ST 1 / 7800 / Portfolio / Lynx II / Jaguar / TT030 / Mega STe / 800 XL / 1040 STe / Falcon030 / 65 XE / 520 STm / SM124 / SC1435
DDD HDD / AT Speed C16 / TF536 / SDrive / PAK68/3 / Lynx Multi Card / LDW Super 2000 / XCA12 / SkunkBoard / CosmosEx / SatanDisk / UltraSatan / USB Floppy Drive Emulator / Eiffel / SIO2PC / Crazy Dots / PAM Net
http://260ste.atari.org