Jump to content
Jagware

SCPCD

Level2
  • Content count

    1,134
  • Joined

  • Last visited

Posts posted by SCPCD


  1. anotherworld_jaguar_box.jpg


    The Retro-gaming Connexion association and Jagware is proud to announce the upcoming release of the game Another World on Atari Jaguar console using JagtopusTM technology.

    The game has been adapted by Sebastien Briais from Removers'group with the courtesy of Eric Chahi.

    The RGC association is responsible for producing this game in the truest spirit of the games of the time: Cartridge with box and manual.

    In order to fund the project through the various stages of manufacture the game is being offered by pre-order..
    Each person who reserve a copy will receive a confirmation slip numbered by mail.


    The price: 62 euros by Paypal (60 euros by check / IBAN payable to "Retro-gaming Connexion")
    For when: Output of Another World is scheduled for spring 2013.
    How: Contact the association by mail directly to RGC email_asso_rgc.gif

    Order:



    More technicals informations, screenshots and video ingame: Remover's AnotherWorld Page


  2. SCPCD : remember, you're supposed not to stop the GPU and the DSP from 68k code, but only from GPU/DSP code :P

    it's not safe only if you would like to restart it from the last instruction or if you would like to know the last instruction executed by reading the PC register.

    If you don't care about both, you can kill it this way.

    Same thing for the object list pointer, I'm not sure it's safe to write it outside of the VBL (or even from 68k code at all, even if we all do this ;))

    The object processor is forced to restart each line at OLP addr, so it's not a problem.


  3. to soft reset the jag, you need to do something like that :

    wait_blitter:
    move.l		B_CMD, d0			; Wait end last blitter cmd
    btst		#0, d0
    beq.s		.wait_blitter
    
    move.w		#$2700, sr			; 
    movea.l		#$4000, sp
    
    move.w		#$FF00, INT1		; disable all 68k jaguar interrupts
    move.w		#$FFFF, INT2		; 68k leave interrupts
    
    move.w		#$FFFF, VI			; no vbl interrupts
    
    move.l		#0, G_CTRL			; Stop GPU
    move.l		#$00070007, G_END	; Big Endian
    move.l		#%100011111000000000, G_FLAGS			; Clear Flags and interrupts
    
    move.l		#0, D_CTRL			; Stop DSP
    move.l		#$00070007, D_END	; Big Endian
    move.l		#%100011111000000000, D_FLAGS			; Clear Flags and interrupts
    
    move.l		#0, $1000			; STOP Obj High
    move.l		#4, $1004			; STOP Obj Low
    move.l		#$1000, d0
    swap		d0
    move.l		d0, OLP				; OLP pointer
    
    move.w		#0, PIT0			; disable timer
    move.w		#0, PIT1			; disable timer
    
    move.w		#0, JPIT2_W			; disable timer
    move.w		#0, JPIT1_W			; disable timer
    
    move.w		#$3F00, JINT		; disable Jerry interrupts
    move.l		#0, SMODE			; disable audio
    move.w		#0, ASICTRL			; disable juart
    move.w		#0, ASIDATA			; dummy read to clear fifo
    
    ;;;;=> reinit blitter regs
    move.l		#$00000000,A1_BASE		; 
    move.l		#$00000000,A1_FLAGS		; 
    move.l		#$00000000,A1_CLIP		; 
    move.l		#$00000000,A1_PIXEL		; 
    move.l		#$00000000,A1_STEP		; 
    move.l		#$00000000,A1_FSTEP		; 
    move.l		#$00000000,A1_FPIXEL		; 
    move.l		#$00000000,A1_INC		; 
    move.l		#$00000000,A1_FINC		; 
    move.l		#$00000000,A2_BASE		; 
    move.l		#$00000000,A2_FLAGS		; 
    move.l		#$00000000,A2_MASK		; 
    move.l		#$00000000,A2_PIXEL		; 
    move.l		#$00000000,A2_STEP		; 
    move.l		#$00000000,B_COUNT		; 
    move.l		#$00000000,B_SRCD		; 
    move.l		#$00000000,B_DSTD		; 
    move.l		#$00000000,B_DSTZ		; 
    move.l		#$00000000,B_SRCZ1		; 
    move.l		#$00000000,B_SRCZ2		; 
    move.l		#$00000000,B_PATD		; 
    move.l		#$00000000,B_IINC		; 
    move.l		#$00000000,B_ZINC		; 
    move.l		#$00000002,B_STOP		; 
    move.l		#$00000000,B_I3		; 
    move.l		#$00000000,B_I2		; 
    move.l		#$00000000,B_I1		; 
    move.l		#$00000000,B_I0		; 
    move.l		#$00000000,B_Z3		; 
    move.l		#$00000000,B_Z2		; 
    move.l		#$00000000,B_Z1		;
    move.l		#$00000000,B_Z0		;
    ;;;;<=
    
    

    and go back to your startup code


  4. Found the bug in smac :

     

    you need to change those lines in "sect.c" in the "fixup" function :

       if(*fexpr == SYMBOL && fexpr[2] == ENDEXPR)
          if((attr & 0x0F00) == FU_JR) {         // <-- correct line
          //if((attr & 0x0200) == FU_JR) {      // <-- wrong line

     

    then some lines before the end of the same function :

       if((attr & 0x0F00) == FU_JR) {         // <-- correct line
       //if((attr & 0x0200) == FU_JR) {      // <-- wrong line
          if(orgactive) *fchptr.lp++ = orgaddr;
          else *fchptr.lp++ = 0x00000000;
       }

     

    If 0x0200 is applied to "attr", there will have not only FU_JR that will be valid, those next code also :

    #define FU_JR        0x0200
    #define FU_MJR       0x0300
    #define FU_NUM31     0x0600
    #define FU_NUM32     0x0700


  5. my guess is that getting transparency is only really achieved through RMW bit and CRY coloring or can the RMW bit be used with RGB successfully?

    RMW makes :

    ADDSAT4 PIXC, LBC

    ADDSAT4 PIXR, LBR

    ADDSAT8 PIXY, LBY

     

    and if I remind correctly all composent of LB pixel (C, R and Y) are signed.

     

    On RGB pix this will have strange result :)


  6. for the OP :

    X position is relative to HDB1/2

    Y position is absolute, you can make relative value in your homemade OP List by computing YPos+VDB.

     

    the visible screen is inside the scare [HDB1/2 to HDE] and [VDB to VDE].

    If VDE is greater than VBB, then the visible screen will cut at VBB.

     

     

    The correct method to center a screen is using HDB1/2, HDE, VDB and VDE. All those values are computed depending the screen mode (NTSC/PAL)

     

    Values should be the same in all color mode (RGB16, CRY, RGB24)


  7. ABS header :

     

    - Magic Number = 0x601B

    - TEXT segment size (4 Bytes)

    - DATA segment size (4 Bytes)

    - BSS segment size (4 Bytes)

    - Symbol table size (4 Bytes)

    - ? (4 Bytes)

    - TEXT base address (4 Bytes)

    - Flags = 0xFFFF

    - DATA base address (4 Bytes)

    - BSS base address (4 Bytes)

     

    ;)

     


  8. collision:
        clr.w d0
        clr.w d1
        move.w OBJ1X,d0
        add.w OBJ1W,d0
        move.w OBJ2X,d1
        cmp.w d0,d1
        blt .none; if OBJ2X < (OBJ1X+OBJ1W) goto .none => should be if OBJ2X > (OBJ1X+OBJ1W) goto .none
    
        clr.w d0
        clr.w d1
        move.w OBJ1X,d0
        move.w OBJ2X,d1
        add.w OBJ2W,d1
        cmp.w d0,d1
        bgt .none; if (OBJ2X+OBJ2W) > OBJ1X goto .none => should be if (OBJ2X+OBJ2W) < OBJ1X goto .none
    
        clr.w d0
        clr.w d1
        move.w OBJ1Y,d0
        add.w OBJ1H,d0
        move.w OBJ2Y,d1
        cmp.w d0,d1
        blt .none; if OBJ2Y < (OBJ1Y+OBJ1H) goto .none => should be if OBJ2Y > (OBJ1Y+OBJ1H) goto .none
    
        clr.w d0
        clr.w d1
        move.w OBJ1Y,d0
        add.w OBJ1H,d0
        move.w OBJ2Y,d1
        cmp.w d0,d1
        blt .none; if OBJ2Y < (OBJ1Y+OBJ1H) goto .none (why do it again ? :p)
    
        clr.w d0
        clr.w d1
        move.w OBJ1Y,d0
        move.w OBJ2Y,d1
        add.w OBJ2H,d1
        cmp.w d0,d1
        bgt .none; if (OBJ2Y+OBJ2H) > OBJ1Y goto .none => should be if (OBJ2Y+OBJ2H) < OBJ1Y goto .none
    
        move.w #$FFFF,BG
        rts
        
    .none:
        move.w #$0000,BG
        rts

     

    "cmp" computes: destination - source => condition code.

    To check if destination > source :

        cmp src, dst
        bgt   dst_greater_than_src

    To check if destination < source :

        cmp    src, dst
        blt    dst_lower_than_src

     

    :)

×