; 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