Elvira Mistress of the Dark

Gryzor

Human RetroDatabase
Joined
8 Ιαν 2006
Μηνύματα
2.759
Αντιδράσεις
69
Ποιος την θυμάται; Ελπίζω να το τελειώσει...

[ame=http://www.youtube.com/watch?v=eHoDkgumrM0]YouTube - Elvira - Mistress of the dark - CPC Preview
 
Χεχε... το θυμάμαι στον STFM μου, είχα κολλήσει... με αυτό και με το Nightmare.

...αλλά στον CPC? Wow...
 
Το εν λόγω game το φτιάχνει ο "δικός μας" DevilMarkus ;)

Μου είχε δείξει μια πρώιμη έκδοση του Elvira , αλλα έχει κάποια προβλήματα και δεν ξέρω κατα πόσον θα συνεχίσει το project ...
 
Έχω κι εγώ παίξει μία pre-alpha έκδοση. Έλειπε προφανώς πολύ υλικό, αλλά η μηχανή που φτιάχνει είναι πολύ καλή... next-gen adventuring on the CPC!
 
Απίστευτο πραγματικά για CPC! Μακάρι να δούμε και την τελική έκδοση.
 
Ahhh yes. I was with friends when you sent the link and gathered them round to watch it... even my girlfriend was really impressed!
 
Some news:

I am still coding on Elvira!

Today I finished some routines which will be used for inventory later.

Also the GUI has been modified and some smaller things have been coded.

You can see the inventory window, which is now scrollable, here in this animation.

elvira_preview2.gif


Please notice:

This is only a "part" of Elvira. Not the game itself.

The items are set from a random list. They are not completely coded now.

I made this to show you the function.

After I have all finished, I will put the parts together.

Cheers,

Markus
 
I wonder, if this was a Plus game...?
 
New 'playable' preview is available here:

Online preview

You can also try to play it with your mouse:

Online preview

New:

- You must 'fight' against 2 enemies

- 2 large animation @ end

- Rewritten animation for the vampire-scene: Now uses sound-samples.

Missing:

Still coding inventory routines & game-logistic.

@ Gryzor: sorry, no + game is planned... too much complexity to optimize for +.
 
Devilmarkus, my sincere gratz for bringing to Amstrad this long deserved version. I really hope many ppl will follow your example and swarm the scene! Do you use disassembled Amiga info to reverse engineer the game mechanics or is everything done entirely from scratch (observation, mapping etc)?
 
AEON είπε:
Do you use disassembled Amiga info to reverse engineer the game mechanics or is everything done entirely from scratch (observation, mapping etc)?
I need to code the whole game.

For this I use assembler routines and BASIC!!!

(The CPC BASIC is very powerful)

Some news about Elvira today:

- I continued to code the game :)

- I rewrote my ASM routines and implemented an AYC-Music player, which plays music from RAM-bank &c7 :cool:

- I need to re-program the whole parts I already coded... :cry:

For the game I really use Amstrad BASIC 1.1 and RSX-routines!

For all coders:

Here's my ASM part of Elvira containing all RSX commands and Music routines:

Κώδικας:
; Elvira - Mistress of the Dark
; RSX routines
; ©2007-2009 by Demoniak & Devilmarkus
;
; AYC-music-playback done 2009 by Devilmarkus
;
;
; Addresses & locations for built-in sprites:
;
; 1, 54,&9EC0          UP-Arrow
; 7, 62,&9EF0          DOWN-Arrow
; 4, 88,&9F1D          FORWARD-Arrow
; 2,109,&9F49          TURN_AROUND-Arrow
; 1,101,&9F91          TURN_LEFT-Arrow
; 6,101,&9FB9          TURN_RIGHT-Arrow
;

       nolist
       org &9775   
;Initialise all ROMs, including AMSDOS


       LD      BC,&7F00
       LD      C,&C0
       OUT     (C),C
       LD hl,(&be7d)        ;HL contains the address containing the current drive
           ;number
        LD a,(hl)        ;Get the current drive number (A = 0, B = 1)
        push af            ;Store the current drive number

        LD de,&40
        LD hl,&abff
        call &bccb        ;Initialise all ROMs - AMSDOS will reset to drive A

        pop af            ;Get the current drive number
        LD hl,(&be7d)
        LD (hl),a        ;Set the drive number to the current drive

BankC7:
       LD      BC,&7F00
       LD      C,&C7
       OUT     (C),C

loadPlayer:
   ld hl,filename1
   ld de,&4000
   call loadfile
loadTune:
   ld hl,filename2
   ld de,&4800
   call loadfile
   call &4000
BankC0:
       LD      BC,&7F00
       LD      C,&C0
       OUT     (C),C
       LD a,&c0
       LD (&97ff),a

ReturnToBasic:
       call &9800
       RET

LoadFile:
   push de
   ld de,&c000
   ld b,12
   call &bc77
   pop hl
   call &bc83
   jp &bc7a

filename1:
   DB "PLAYER  .COD"
filename2:
   DB "   ELV10.AYC"
Wait:
   ld h,(ix+1)
       LD l,(ix+0)
aloop:   
       LD bc,#01EA
bloop:   
       call #bb09
       cp #20
       ret z
       cp #58
       ret z
       dec bc
       LD a,b
       or c
       jr nz,bloop
       dec hl
       LD a, h
       or l
       jr nz,aloop
       ret  

;Mainpart 
       org &9800
BuffSpt equ     #7C00
BuffScr equ     #4000


       call    IntOn

       LD      HL,BufferRsx
       LD      BC,PtrRsx
       JP      #BCD1

PtrRsx:
       DW      RSX_TABLE
       JP      DepkSpt
       JP      DepkShp
       JP      DepkWin
       JP      DepkScr
       JP      CursorOn
       JP      SetPosCursor
       JP      GetPosCursor
       JP      CursorOff
       JP      Bank
   JP      CLS
   JP      MusicOn
   JP      StopMusic
   JP      PauseMusic
   JP      Mode
   JP      Box
   JP      Arrow
   JP      Wait

RSX_TABLE:
       DB      "DEPKSP","T"+#80
       DB      "DEPKSH","P"+#80
       DB      "DEPKWI","N"+#80
       DB      "DEPKSC","R"+#80
       DB      "CURSORO","N"+#80
       DB      "SETCURSO","R"+#80
       DB      "GETCURSO","R"+#80
       DB      "CURSOROF","F"+#80
       DB      "BAN","K"+#80
       DB      "CL","S"+#80
       DB      "PLA","Y"+#80
       DB      "STO","P"+#80
       DB      "PAUS","E"+#80
       DB      "MOD","E"+#80
       DB      "BO","X"+#80
       DB      "ARRO","W"+#80
       DB      "WAI","T"+#80
;
; Depack sprite
;
DepkSpt: 
       LD      H,(IX+1)
       LD      L,(IX+0)
       LD      DE,
       LDI                             ; store 
       LDI                             ; store YD
       LDI                             ; stora XA
       LDI                             ; store YA
       LD      B,(IX+2)                ; New  coordinate
       LD      C,(IX+4)                ; New YD coordinate
       LD      IX,
       LD      A,(IX+2)                ; XA
       SUB     (IX+0)                  ; XA - 
       ADD     A,C                     ; XA -  + NewXD
       LD      (IX+2),A
       LD      A,(IX+3)                ; YA
       SUB     (IX+1)                  ; YA - YD
       ADD     A,B                     ; YA - YD + NewYD
       LD      (IX+3),A
       LD      (IX+0),C                ; New 
       LD      (IX+1),B                ; New YD
       LD      DE,BuffSpt              ; Temporary buffer
       CALL    DepkLzw                 ; depack
       CALL    CalcCoord
       LD      DE,BuffSpt 
NbColSpt:
       DB      #DD : LD      H,0
DrawSpt1:
       PUSH    HL
NbLigSpt:
       DB      #DD : LD      L,0
DrawSpt2:
       LD      A,(DE)                  ; Byte sprite
       LD      C,A
       LD      B,A
       RRCA
       RRCA
       RRCA
       RRCA
       OR      C                       ; Bits 0-3 | Bits 4-7 in all bits
       CPL
       LD      C,A
       LD      A,(HL)                  ; Byte screen memory
       AND     C
       OR      B                       ; Byte sprite
       LD      (HL),A
       INC     DE
       LD      A,H
       ADD     A,8
       LD      H,A
       JR      NC,DrawSpt3
       LD      BC,#C050
       ADD     HL,BC
DrawSpt3:
       DB      #DD : DEC     L
       JR      NZ,DrawSpt2
       POP     HL
       INC     HL
       DB      #DD : DEC     H
       JR      NZ,DrawSpt1 
       RET


;
; Depack sprite XOR
;
DepkShp: 
       LD      H,(IX+1)
       LD      L,(IX+0)
       LD      DE,
       LDI                             ; store 
       LDI                             ; store YD
       LDI                             ; stora XA
       LDI                             ; store YA
       LD      B,(IX+2)                ; New  coordinate
       LD      C,(IX+4)                ; New YD coordinate  
       LD      IX,
       LD      A,(IX+2)                ; XA
       SUB     (IX+0)                  ; XA - 
       ADD     A,C                     ; XA -  + NewXD
       LD      (IX+2),A
       LD      A,(IX+3)                ; YA
       SUB     (IX+1)                  ; YA - YD
       ADD     A,B                     ; YA - YD + NewYD
       LD      (IX+3),A
       LD      (IX+0),C                ; New 
       LD      (IX+1),B                ; New YD
       LD      DE,BuffSpt              ; Temporary buffer
       CALL    DepkLzw                 ; depack
       CALL    CalcCoordx
       LD      DE,BuffSpt
NbColShp:
       DB      #DD : LD      H,0
DrawSpt1x:
       PUSH    HL
NbLigShp:
       DB      #DD : LD      L,0
DrawSpt2x:
       LD      A,(DE)                  ; Byte sprite
       LD      C,A
       LD      B,A
       RRCA
       RRCA
       RRCA
       RRCA
       OR      C                       ; Bits 0-3 | Bits 4-7 in all bits
       CPL
       LD      C,A
       LD      A,(HL)                   ; Byte  screen memory
;        AND     C
;        OR      B                       ; Byte sprite
   XOR    B
       LD      (HL),A
       INC     DE
       LD      A,H
       ADD     A,8
       LD      H,A
       JR      NC,DrawSpt3x
       LD      BC,#C050
       ADD     HL,BC
DrawSpt3x:
       DB      #DD : DEC     L
       JR      NZ,DrawSpt2x
       POP     HL
       INC     HL
       DB      #DD : DEC     H
       JR      NZ,DrawSpt1x  
       RET



CalcCoord:
       LD      H,#C0                   ; Start video offset
       LD      A,()
       LD      L,A
       LD      A,(YD)
       AND     A                       ; No y offset ?
       JR      Z,CalcDebBcl
       LD      B,A
       LD      C,8
       LD      DE,#C050
CalcS1:
       LD      A,H
       ADD     A,C
       LD      H,A
       JR      NC,CalcS2
       ADD     HL,DE
CalcS2:
       DJNZ    CalcS1

;
; Calculate size in Y
;
CalcDebBcl:
       LD      A,(YD)
       LD      B,A
       LD      A,(YA)
       SUB     B
       INC     A
       LD      B,A              ; B = numbers of y
;
; Calculate numbers of X
;
       LD      A,()
       LD      C,A
       LD      A,(XA)
       SUB     C
       INC     A
       LD      (NbColSpt+2),A      ; numbers of x
       LD      A,B
       LD      (NbLigSpt+2),A
       RET





; XOR
CalcCoordx:
       LD      H,#C0                   ; Start video offset
       LD      A,()
       LD      L,A
       LD      A,(YD)
       AND     A                       ; No y offset ?
       JR      Z,CalcDebBclx
       LD      B,A
       LD      C,8
       LD      DE,#C050
CalcS1x:
       LD      A,H
       ADD     A,C
       LD      H,A
       JR      NC,CalcS2x
       ADD     HL,DE
CalcS2x:
       DJNZ    CalcS1x

;
; Calculate size in Y
;
CalcDebBclx:
       LD      A,(YD)
       LD      B,A
       LD      A,(YA)
       SUB     B
       INC     A
       LD      B,A              ; B = numbers of y
;
; Calculate numbers of X
;
       LD      A,()
       LD      C,A
       LD      A,(XA)
       SUB     C
       INC     A
       LD      (NbColShp+2),A      ; numbers of x
       LD      A,B
       LD      (NbLigShp+2),A
       RET




;
; Depack Window
;
DepkWin:    
       LD      H,(IX+1)
       LD      L,(IX+0)
       INC     HL
       INC     HL
       INC     HL
       INC     HL
       LD      DE,BuffSpt
       CALL    DepkLzw
       LD      HL,BuffSpt
       LD      DE,#D80C
       DB      #DD : LD      H,127 
DepkWin1:
       LD      A,56
       LD      BC,127
DepkWin2:
       LDI
       ADD     HL,BC
       INC     C
       DEC     A
       JR      NZ,DepkWin2
       LD      BC,#E439
       ADD     HL,BC
       EX      DE,HL
       LD      BC,#7C8                 ; #800 - 56
       ADD     HL,BC
       JR      NC,DepkWin3
       LD      BC,#C050
       ADD     HL,BC
DepkWin3:
       EX      DE,HL
       DB      #DD : DEC     H
       JR      NZ,DepkWin1 
       RET

;
; Depack Screen
;
DepkScr:
       LD      H,(IX+1)
       LD      L,(IX+0)
       LD      DE,BuffScr
       CALL    DepkLzw
       LD      HL,BuffScr
       LD      DE,#C000
       DB      #DD : LD      H,200
DepkScr1:
       LD      A,80                    ; 80 columns
       LD      BC,200
DepkScr2:
       LDI
       ADD     HL,BC
       INC     C
       DEC     A
       JR      NZ,DepkScr2
       LD      BC,#C181
       ADD     HL,BC
       EX      DE,HL
       LD      BC,#7B0                 ; #800 - 80
       ADD     HL,BC
       JR      NC,DepkScr3
       LD      BC,#C050
       ADD     HL,BC
DepkScr3:
       EX      DE,HL
       DB      #DD : DEC     H
       JR      NZ,DepkScr1
       RET

Bank:
       LD      A,(IX+0) 
       LD      (&97ff),A
       AND     7
       OR      #C0
       LD      B,#7F
       OUT     (C),A
       RET  


; Music Control
;        
MusicOn:
       LD      A,&CD
       LD      (MusicData),A
       LD      HL,PlayMusic
       LD      (MusicData+1),HL 
       LD      A,&C9
       LD      (MusicData+3),A
       RET 

StopMusic:    
       LD      BC,&7F00
       LD      C,&C7
       OUT     (C),C
       CALL    &4000
       LD      A,(&97FF)
       LD      BC,&7F00
       OUT     (C),A

PauseMusic:   
       LD      A,&C9
       LD      (MusicData),A
       RET

PlayMusic: 
       DI
       PUSH    AF
       PUSH    BC
       PUSH    DE
       PUSH    HL
       PUSH    IX
       PUSH    IY
       EX      AF,AF'
       PUSH    AF
       EX      AF,AF'
       LD      BC,&7F00
       LD      C,&C7
       OUT     (C),C
       CALL    &4003
       LD      A,(&97FF)
       LD      BC,&7F00
       OUT     (C),A
       EX      AF,AF'
       POP     AF
       EX      AF,AF'
       POP     IY
       POP     IX
       POP     HL
       POP     DE
       POP     BC
       POP     AF
       EI
       RET

; Cursor On
;     
CursorOn: 
       LD      A,&CD
       LD      (CursorData),A
       LD      HL,StartCursor
       LD      (CursorData+ 1),HL
       LD      A,&C9
       LD      (CursorData+ 3),A 
       RET

CursorOff: 
       CALL    RestoreScr    
       LD      A,&C9
       LD      (CursorData),A           
       LD      HL,#FFFF
       LD      (X1),HL                 ; Forcing cursor display
       LD      HL,0
       LD      (RestoreScr+1),HL       ; No former memory
       RET

IntOn:
       LD      A,0
       AND     A                       ; Driver already installed?
       RET     NZ                      ; If yes, does nothing
       INC     A
       LD      (IntOn+1),A             ; Indicates driver 
       LD      HL,BlocEvent
       LD      DE,InterruptLoop
       LD      BC,#8100
       JP      #BCD7

InterruptLoop:
       call cursordata
       call musicdata
       ret

;
; Set cursor position
;
SetPosCursor:
       LD      E,(IX+0)
       LD      D,(IX+1)
       LD      L,(IX+2)
       LD      H,(IX+3)
       LD      (X),HL
       EX      DE,HL
       LD      (Y),HL
       RET

;
; Get cursor position
;
GetPosCursor:
       LD      H,(IX+1)
       LD      L,(IX+0)
       LD      B,0
       LD      A,(Y)
       LD      (HL),A
       INC     HL
       LD      (HL),B
       LD      H,(IX+3)
       LD      L,(IX+2)
       LD      A,(X)
       LD      (HL),A
       INC     HL
       LD      (HL),B
       RET

StartCursor: 
       DI      

       PUSH    AF
       PUSH    BC
       PUSH    DE
       PUSH    HL
       PUSH    IX  
       EXX       

       LD      A,C
       SET     3,A                     ; cut upper ROM
       OUT     (C),A
       EXX

       LD      HL,Y1
       LD      A,(Y)
       CP      (HL)
       JR      NZ,FctAff
       LD      HL,X1
       LD      A,(X)
       CP      (HL)

       JR      Z,DeplCurseur  
       ;
       ; Move -> Display new cursor
       ;
FctAff:
       CALL    RestoreScr
       LD      A,(X)
       LD      (X1),A
       LD      E,A                     ; E = x
       LD      A,(Y)
       LD      (Y1),A
       LD      D,A                     ; D = y

       ; Adresse = #C000 + (Y/8)*80 + (Y-(Y/8)*8)*#800 + X/4
       SRL     E                       ; E = x/4
       AND     #F8
       LD      L,A                     ; HL = (y/8)*8
       LD      H,0
       LD      A,D
       LD      D,H                     ; D = 0
       SUB     L                       ; A = (y-(y/8)*8)
       ADD     HL,HL                   ; HL * 2
       LD      B,H
       LD      C,L                     ; BC = HL * 2
       ADD     HL,HL                   ; HL * 4
       ADD     HL,HL                   ; HL * 8
       ADD     HL,BC                   ; HL * 10 (y/8)*80
       ADD     HL,DE                   ; HL = HL + x/4
       RLA
       RLA
       RLA                             ; A = 8*(y-(y/8)*8)
       OR      #C0
       ADD     A,H
       LD      H,A

       LD      (RestoreScr+1),HL
       CALL    SavScrCurseur

       LD      A,(X)
       RRCA
       RRCA
       AND     #40                     ; Keep 1 bit (shifted right 2x = 40 
       LD      C,A
       LD      B,0
       LD      HL,SptCurseur1          ; Datas sprites arrow
       ADD     HL,BC                   ; Cursor 1 or 2
       EX      DE,HL
       LD      HL,(RestoreScr+1)             ; HL = address screen display
       CALL    AfficheCurseur          ; View
DeplCurseur:
       XOR     A                       ; Code UP Cursorkey
       CALL    #BB1E
       CALL    NZ,MvtHaut
       LD      A,#48                   ; Code UP Joystick
       CALL    #BB1E
       CALL    NZ,MvtHaut

       LD      A,#02                   ; Code DOWN Cursorkey
       CALL    #BB1E
       CALL    NZ,MvtBas
       LD      A,#49                   ; Code DOWN Joystick
       CALL    #BB1E
       CALL    NZ,MvtBas

       LD      A,#01                   ; Code RIGHT Cursorkey
       CALL    #BB1E
       CALL    NZ,MvtDroite
       LD      A,#4B                   ; Code RIGHT Joystick
       CALL    #BB1E
       CALL    NZ,MvtDroite

       LD      A,#08                   ; Code LEFT Cursorkey
       CALL    #BB1E
       CALL    NZ,MvtGauche
       LD      A,#4A                   ; Code LEFT Joystick
       CALL    #BB1E
       CALL    NZ,MvtGauche

       POP     IX
       POP     HL
       POP     DE
       POP     BC
       POP     AF
       EI
       RET

MvtBas:
       LD      A,(Y)
       CP      186
       RET     NC
       ADD     A,2
       LD      (Y),A
       RET
MvtHaut:
       LD      A,(Y)
       CP      2
       RET     C
       SUB     2
       LD      (Y),A
       RET
MvtGauche:
       LD      A,(X)
       AND     A
       RET     Z
       DEC     A
       LD      (X),A
       RET
MvtDroite:
       LD      A,(X)
       CP      153
       RET     NC
       INC     A
       LD      (X),A
       RET

SavScrCurseur:
       LD      DE,BuffFleche
       LD      A,14  
SavScrCurseur2:
       LDI
       LDI
       LDI
       LDI
       LD      BC,#7FC
       ADD     HL,BC
       JR      NC,SavScrCurseur3
       LD      BC,#C050
       ADD     HL,BC
SavScrCurseur3:
       DEC     A
       JR      NZ,SavScrCurseur2
       RET

RestoreScr:
       LD      HL,0
       LD      A,H
       OR      L
       RET     Z
       LD      DE,BuffFleche
       LD      A,14
RestoreScr2:
       EX      DE,HL
       LDI
       LDI
       LDI
       LDI
       EX      DE,HL
       LD      BC,#7FC
       ADD     HL,BC
       JR      NC,RestoreScr3
       LD      BC,#C050
       ADD     HL,BC
RestoreScr3:
       DEC     A
       JR      NZ,RestoreScr2
       RET

AfficheCurseur:   
       DB      #DD : LD H,14
AfficheCurseur2:
       LD      B,4
       EX      DE,HL
AfficheCurseur3:
       LD      A,(HL)                  ; Reading data sprites
       LD      C,#55
       AND     C
       JR      Z,AfficheCurseur4
       LD      C,0
AfficheCurseur4:
       LD      A,(HL)
       AND     #AA
       JR      NZ,AfficheCurseur5
       LD      A,C
       OR      #AA
       LD      C,A
AfficheCurseur5:
       LD      A,(DE)                  ; Reading mem. screen
       AND     C
       OR      (HL)
       LD      (DE),A
       INC     HL
       INC     DE
       DJNZ    AfficheCurseur3
       EX      DE,HL
       LD      BC,#7FC
       ADD     HL,BC
       JR      NC,AfficheCurseur6
       LD      BC,#C050
       ADD     HL,BC
AfficheCurseur6:
       DB      #DD : DEC H
       JR      NZ,AfficheCurseur2
       RET

DepkLzw:
       XOR     A
       LD      (BclLzw+1),A
;
TstBitLzw:
       LD      A,(HL)
       INC     HL
       RRA                         ; Turnover calculation flag C
       SET     7,A                 ; Set bit 7 keeping flag C
       LD      (BclLzw+1),A
       JR      C,TstCodeLzw
CopByteLzw:
       LDI
;
BclLzw:
       LD      A,0
       RR      A                   ; Flags rotation calculation with C and Z
       LD      (BclLzw+1),A
       JR      Z,TstBitLzw
       JR      NC,CopByteLzw

TstCodeLzw:
;
;       a = inbuffer[ inbytes ];
;
       LD      A,(HL)
       AND     A
;
; More bytes to process
; = end
;
       RET     Z

       INC     HL
       LD      B,A                     ; B = inbuffer[ inbytes ]
       RLCA
       JR      NC,TstLzw40
;
;       length = 3 + ( ( inbuffer[ inbytes ] >> 4 ) & 7 );
;       index = ( inbuffer[ inbytes++ ] & 15 ) << 8;
;       index |= inbuffer[ inbytes++ ];
;       index++;
;
       LD      C,(HL)                  ; C = low index
       RLCA
       RLCA
       RLCA
       AND     7
       ADD     A,3
       PUSH    HL
       LD      H,A                     ; H = length
       LD      A,B                     ; B = inbuffer[inbytes]
       AND     #0F
       LD      B,A                     ; B = poids fort index
       LD      A,H                     ; A = Length
       LD      H,D
       LD      L,E
       SCF                             ; Re-position flag C
       SBC     HL,BC                   ; HL=HL-(BC-1)
       LD      B,0
       LD      C,A
       LDIR
       POP     HL
       INC     HL
       JR      BclLzw
;
TstLzw40:
       RLCA
       JR      NC,TstLzw20
;
;       length = 2;
;       index = inbuffer[ inbytes++ ] & 0x3f;
;       index++;
;
       LD      C,B
       RES     6,C
       LD      B,0         ; BC = index -1, without +1 car flag C = 1
       PUSH    HL
       LD      H,D
       LD      L,E
       SBC     HL,BC
       LDI
       LDI
       POP     HL
       JR      BclLzw
;
TstLzw20:
       RLCA
       JR      NC,TstLzw10
;
;       length = 2 + ( inbuffer[ inbytes++ ] & 31 );
;       index = inbuffer[ inbytes++ ];
;       index++;
;
       PUSH    HL
       LD      A,B
       RES     5,A
       LD      C,(HL)                  ; C = index
       LD      B,0
       LD      H,D
       LD      L,E
       SBC     HL,BC
       ADD     A,2
       LD      C,A                     ; C = length
       LDIR
       POP     HL
       INC     HL
       JR      BclLzw

;
TstLzw10:
       RLCA
       JR      NC,CodeLzw0F
;
;       index = ( inbuffer[ inbytes++ ] & 15 ) << 8;
;       index |= inbuffer[ inbytes++ ];
;       length = inbuffer[ inbytes++ ] + 1;
;       index++;
;
       RES     4,B                     ; B = index(high)
       LD      C,(HL)                  ; C = index(low)
       INC     HL
       LD      A,(HL)                  ; A = length - 1
       PUSH    HL
       LD      H,D
       LD      L,E
       SBC     HL,BC                   ; Flag C=1 -> hl=hl-(bc+1)
       LD      B,0
       LD      C,A
       INC     BC                      ; BC = length
       LDIR
       POP     HL
       INC     HL
       JR      BclLzw
;
CodeLzw0F:
       LD      C,(HL)
       PUSH    HL
       LD      H,D
       LD      L,E
       LD      A,B
       CP      #0F
       JR      NZ,CodeLzw02
;
;       length = index = inbuffer[ inbytes + 1 ] + 1;
;       inbytes += 2;
;
       XOR     A
       LD      B,A
       INC     BC
       SBC     HL,BC
       LDIR
       POP     HL
       INC     HL
       JP      BclLzw
;
CodeLzw02:
       CP      2
       JR      C,CodeLzw01
;
;       length = index = inbuffer[ inbytes ];
;
       LD      C,A
       XOR     A
       LD      B,A
       SBC     HL,BC
       LDIR
       POP     HL
       JP      BclLzw
;
;       length = index = 256;
;
CodeLzw01:                              ; here, A = B = 1
       XOR     A
       LD      C,A
       DEC     H
       LDIR
       POP     HL
       JP      BclLzw


SptCurseur1:
       DB      #C0, #C0, #00, #00, #90, #60, #00, #00
       DB      #90, #65, #00, #00, #C0, #20, #00, #00
       DB      #C0, #80, #00, #00, #C0, #90, #00, #00
       DB      #C5, #C0, #00, #00, #80, #CA, #20, #00
       DB      #8A, #40, #80, #00, #00, #45, #90, #00
       DB      #00, #00, #C0, #80, #00, #00, #CA, #8A
       DB      #00, #00, #40, #00, #00, #00, #45, #00

;
; Here for 8 bytes alignment on 64 bytes
;
X:
       DB      40
Y:
       DB      100
X1:
       DB      0
Y1:
       DB      0

:
       DB      0
YD:
       DB      0
XA:
       DB      0
YA:
       DB      0

;
; Cursor shift one pixel to the right
;
       DB      #40, #C0, #80, #00, #40, #30, #80, #00
       DB      #40, #30, #8A, #00, #40, #90, #00, #00
       DB      #40, #C0, #00, #00, #40, #C0, #20, #00
       DB      #40, #CA, #80, #00, #40, #45, #90, #00
       DB      #45, #00, #C0, #00, #00, #00, #CA, #20
       DB      #00, #00, #40, #C0, #00, #00, #45, #C5
       DB      #00, #00, #00, #80, #00, #00, #00, #8A



BuffFleche:
       DS      56        

CLS:
       LD HL,&C5B0      ;HL is 'adr' variable
       LD C,51          ;Rows

clear_area:
       PUSH HL
       LD B,&30
       LD A,&0

clear_line:
       LD (HL),A
       INC HL
       DJNZ clear_line
       POP HL
       CALL &BC26      ;SCR_NEXT_LINE
       DEC C
       JR NZ,clear_area
       RET   



Box:
       LD hl,BoxSprite
       LD (ix+0),l
       LD (ix+1),h
       JP DepkShp
       RET                                  

Mode:
   LD A,1
   CALL &BC0E
   CALL &BD1C
   RET   

Arrow:
       LD hl,ArrowSprite
       LD (ix+0),l
       LD (ix+1),h
       JP DepkShp
       RET        



       ; Double Arrow & Box data

ArrowSprite:
       DB &48,&08,&4C,&2E,&0C,&00,&00,&02,&02,&44,&44,&CD,&D8,&E7,&24,&09
       DB &06,&07,&D8,&CD,&58,&26,&0B,&21,&22,&80,&C8,&9A,&90,&CF,&E5,&3C
       DB &CD,&02,&15,&02,&CC,&23,&13,&CC,&23,&0B,&3C,&E5,&CF,&08,&90,&9A
       DB &C8,&23,&2A,&88,&88,&DA,&D5,&80,&65,&E0,&30,&30,&C0,&C0,&3F,&02
       DB &55,&21,&03,&FF,&23,&26,&FF,&25,&0D,&C0,&58,&E0,&98,&65,&D5,&DA
       DB &64,&22,&14,&A0,&AA,&6A,&B0,&CF,&FF,&0A,&AA,&02,&02,&AA,&23,&26
       DB &22,&AA,&23,&0B,&0A,&FF,&CF,&62,&AA,&A0,&39,&2A,&86,&A0,&AA,&31
       DB &9B,&28,&22

BoxSprite:        
       DB &00,&A0,&06,&B9,&E0,&B0,&20,&65,&8A,&CF,&02,&04,&08,&CB,&04,&55
       DB &B0,&45,&00,&00,&02,&04,&73,&08,&06,&45,&CF,&0F,&19,&0F,&33,&0F
       DB &19,&70,&E8,&9A,&10,&CF,&45,&45,&04,&08,&04,&05,&55,&70,&00,&00



MusicData:
      ret:nop:nop:nop

Cursordata:
      ret:nop:nop:nop            

BlocEvent:
       DS      16


ArrowData:
       DB &01,&36,&04,&47,&CC,&00,&00,&02,&02,&45,&45,&24,&07,&26,&0D,&F0
       DB &CA,&CA,&C0,&CF,&45,&02,&04,&02,&80,&8A,&8A,&C5,&C5,&60,&60,&C0
       DB &44,&63,&02,&04,&C5,&CF,&CF,&22,&25,&21,&15,&CF,&03,&2A,&35,&00
       DB &07,&3E,&0A,&50,&9C,&00,&00,&02,&04,&03,&45,&45,&08,&87,&02,&04
       DB &03,&CF,&C0,&CA,&CA,&22,&16,&70,&CF,&CF,&C5,&C5,&02,&04,&02,&C0
       DB &A4,&60,&60,&44,&8A,&8A,&29,&38,&CF,&2C,&0E,&01,&00,&04,&58,&07
       DB &68,&84,&00,&00,&02,&45,&45,&CA,&CF,&22,&07,&C2,&00,&25,&0C,&CA
       DB &90,&90,&C0,&44,&02,&07,&04,&4E,&52,&8A,&8A,&C5,&C5,&C0,&FE,&CF
       DB &45,&02,&03,&26,&27,&0A,&27,&3A,&00,&02,&6D,&07,&7F,&9C,&00,&00
       DB &02,&04,&03,&45,&45,&29,&0C,&C1,&23,&0F,&45,&CF,&C0,&CA,&CA,&23
       DB &16,&49,&03,&48,&02,&CF,&CF,&C5,&C5,&C5,&C0,&64,&60,&60,&44,&8A
       DB &8A,&4B,&48,&C5,&EC,&CF,&8A,&22,&28,&55,&8A,&23,&07,&53,&5C,&FF
       DB &21,&23,&21,&37,&03,&06,&21,&14,&5B,&03,&22,&38,&0F,&03,&02,&5E
       DB &00,&01,&65,&05,&6E,&C0,&00,&00,&45,&45,&CA,&CA,&43,&47,&C0,&8A
       DB &8A,&C5,&C5,&60,&60,&43,&47,&E1,&4B,&CF,&CF,&C0,&C0,&43,&47,&0A
       DB &1D,&22,&0B,&8A,&22,&1A,&24,&0A,&00,&06,&65,&0A,&6E,&00,&00,&00
       DB &45,&45,&CA,&CA,&CF,&45,&C3,&47,&02,&CF,&CF,&C0,&C0,&43,&0A,&81
       DB &47,&8A,&8A,&C5,&C5,&60,&60,&43,&0F,&47,&22,&15,&06  

BufferRsx:
       DS      4
The rest is done in BASIC.

For this I could use help!

I need help for coding and implementing the whole inventory + it's routines (pick up items, drop them, use them, combine items etc...)

Everything of this must be coded in BASIC, too.

For those of you, who want to see "ingame music":

http://cpc-live.com/javacpc.php?system=PARADOS&disc=elvira_prev.zip&boot=elvira&title=Elvira%20-%20Preview&doubled=true&digiblaster=true

(This website uses the lastest version of JavaCPC which is still under progress, so please inform me about bugs in emulator)

Cheers,

Markus
 
The ASM part is "all Greek to me" . I don't understand a thing. :D

I remembered the computer geek guy from Matrix 1 who was seeing data flowing on his screen and when they asked him what he was seeing, he replied "I see a beautyful woman" :D :D:D
 
Πίσω
Μπλουζα