Epharius wrote:Oui genre quand le mec met "## xxxx" c'est une sous-partie ou j'sais pas quoi. Bref, ce serait intéressant d'implémenter quelques balises de base du markdown (je pense aux listes etc)
Exactement, c'était l'idée
Epharius wrote:Oui genre quand le mec met "## xxxx" c'est une sous-partie ou j'sais pas quoi. Bref, ce serait intéressant d'implémenter quelques balises de base du markdown (je pense aux listes etc)
; ~assemblybandit~ http :// briandm82.com
;ImageViewer v1.0
;created using Assembly Studio 8x v4.0
;Macro definitions
#define bcall(xxxx) rst 28h \ .dw xxxx
#define bjump(xxxx) call 50h \ .dw xxxx
;ROM Routines
_Mov9ToOP1 equ $4177
_ChkFindSym equ $42e8
_DelVarArc equ $4fab
_EnoughMem equ $42f4
_CreateAppVar equ $4e4f
_JForceCmdNoChar equ $4027
;RAM Addresses
tempSwapArea equ $8b8c
progPtr equ $9e11
pTemp equ $9e0f
;Ports
KeypadPort equ $01
IntStatusPort equ $04 ;use to determine int device/ map memory/ set timer speeds/ check if on pressed
MemoryCPort equ $05 ;maps ram page to c ($c000-$ffff) ram only, bit 7 set
MemoryAPort equ $06 ;maps memory bank a ($4000-$7fff) rom bits 0-6 ram if bit 7 is set
MemoryBPort equ $07 ;maps memory bank b ($8000-$bfff)
MemoryAHPort equ $0e ;sets bit 7 for rom page in a
MemoryBHPort equ $0f ;sets bit 7 for rom page in b
SpeedPort equ $20 ;write 0=6 Mhz, write 1=15 Mhz
LCDInstPort equ $10 ;set register
LCDDataPort equ $11 ;set value
;/--LCD Registers and Bits------------------\
LCDEntry equ $03 ;max colors,color format,origin,GRAM update
LCDHBGR equ 4 ;0=BGR 1=RGB (def)
LCDLORG equ 7 ;0=absolute (def) 1=window
LCDControl equ $07 ;partial image enable, base image enable, 8 color mode
LCDHBASEE equ 0 ;0=base image off 1=base image displayed (def)
LCDLCL equ 3 ;0=full color (def) 1=8 color mode
LCDCursorY equ $20 ;cursor Y
LCDGRAM equ $22 ;read/write data to the graphics ram
LCDWinYStart equ $50 ;window y top
LCDWinXStart equ $52 ;window x left
LCDBaseCtrl equ $61 ;horizontal scrolling, color reverse
LCDLVLE equ 1 ;0=disable horizontal scrolling (def) 1=enable horizontal scrolling
LCDLREV equ 0 ;0=invert colors 1=normal colors (def)
LCDScrollCtrl equ $6a ;0-8 horizontal scroll offset (0-319)
;\--LCD Registers and Bits------------------/
;App
EXT_APP = 1
;Addresses
Stack equ $ffff
DrawFlag equ $c000 ;0-3=1bit-8bit 7=scale
Size equ $c001 ;ahl pixel count
Signal equ $c004 ;rle run signal
XIndex equ $c005 ;holds place in image width
DrawRowIndex equ $c007 ;holds offset in drawrow
DrawRowData equ $c009 ;160 bytes for double size line
DataLocation equ $c0a9 ;holds a copy of the data location that can be changed
Header equ $c0ac ;7 bytes
Palette equ $c0b3 ;256 * 2 (512 bytes)
KeyRepeat equ $c2b3 ;stores counter to slow down repeating presses
KeyFlag equ $c2b5 ;read to get keypresses
OldKey equ $c2b6 ;prevents buttons from being held down
ListIndex equ $c2b7 ;holds place in list
Selected equ $c2b8 ;currently selected file
FileIndex equ $c2b9 ;255 files max! file count (one based)
TextRow equ $c2ba ;text row position, 2 bytes
TextCol equ $c2bc ;text column position, 2 bytes
FileTable equ $c2be ;16 bytes each (3=bde,9=null terminated name,4=garbage) 4080 bytes total
TempFileIndex equ $8b8c ;(tempSwapArea) 1 byte
TempFileTable equ $8b8d ;12 bytes
TempSig equ $8b9f ;4 bytes
TempAppMemPage equ $8ba3 ;1 byte
;Keys
KDown equ $00
KLeft equ $01
KRight equ $02
KUp equ $03
KF5 equ $04
KF4 equ $05
KF2 equ $06
KF1 equ $07
.org $4000
;This code has not been particularly optimized for size or speed. Current size: 15,354 bytes
;All routines and data have been created by me and can be freely used for any purpose.
;In the future I might seperate the bit depth/compression modes out to
;have each run a little faster.
;Decided on disabling the base image during drawing.Enabled makes for a nice transition
;when slowly drawing complex images, but it looks wierd when small images draw almost
;instanly. I was thinking about pacing the drawing and having a slide show mode
;like in my program demo, maybe in a future release.
;Thanks to Dr. D'nar, Brandon Wilson, Patrick Davidson, Jeremy Goetsch,
; Benjamin Moody, Kerm Martian, and Pat Milheron.
;Thanks to everyone who has documented the ports,ram,rom,rom calls.
;Future thanks to calc84maniac for the interlace mode.
;In the ILI9325 datasheet it mentions how port $04 is used for resizing,
;I hoped that maybe there were some remnants/side effects in the 9335 and that it
;might have been possible to have it auto double the height but I didn't
;come up with anything. I didn't check it too extensively though,
;I'll go over it again soon.
;It would be nice to have a 160x120 screen with page flipping!
;Header (128 bytes)
.db 080h, 00Fh
.db 000h, 000h, 000h, 000h
.db 080h, 012h
.db 001h, 00Fh
.db 080h, 021h
.db 001h
.db 080h, 031h
.db 0A1h
.db 080h, 048h
.db "IViewer", 000h
.db 080h, 081h
.db 001h
.db 080h, 090h
.db 003h, 026h, 009h, 004h
.db 01Eh, 0FFh, 02Bh, 057h
.db 002h, 00Dh, 040h, 0A1h, 06Bh, 099h, 0F6h, 059h, 0BCh, 067h
.db 0F5h, 085h, 09Ch, 009h, 06Ch, 00Fh, 0B4h, 003h, 09Bh, 0C9h
.db 003h, 032h, 02Ch, 0E0h, 003h, 020h, 0E3h, 02Ch, 0F4h, 02Dh
.db 073h, 0B4h, 027h, 0C4h, 0A0h, 072h, 054h, 0B9h, 0EAh, 07Ch
.db 03Bh, 0AAh, 016h, 0F6h, 077h, 083h, 07Ah, 0EEh, 01Ah, 0D4h
.db 042h, 04Ch, 06Bh, 08Bh, 013h, 01Fh, 0BBh, 093h, 08Bh, 0FCh
.db 019h, 01Ch, 03Ch, 0ECh, 04Dh, 0E5h, 075h
.db 080h, 07Fh
.db 000h, 000h, 000h, 000h
.db 000h, 000h, 000h, 000h
.db 000h, 000h, 000h, 000h
.db 000h, 000h, 000h, 000h
.db 000h, 000h, 000h, 000h
;--- Init ---
;Initializes the program disabling interrupts,
;saving vital settings, sets ram page, and sets speed
Init: ;$4080
di
;initialize $c000 ram page
ld a,$82 ;change memory bank $c000-$ffff
out (MemoryCPort),a
ld hl,$c000
xor a
ld (hl),a
ld de,$c001
ld bc,$3fff ;16383
ldir
ld a,$80 ;change back to normal
out (MemoryCPort),a
;clear tempSwapArea
ld hl,tempSwapArea
xor a
ld (hl),a
ld de,tempSwapArea+1
ld bc,17
ldir
ld a,LCDEntry ;save entry
call DisplayReadHL
push hl
ld a,LCDControl ;save control
call DisplayReadHL
push hl
ld a,LCDBaseCtrl ;save base control
call DisplayReadHL
push hl
exx
push hl ;save alt hl
exx
call InitializeScroll
ld a,1
out (SpeedPort),a ;set speed to 15Mhz
call SetOrigin
in a,(MemoryAPort)
ld b,a
in a,(MemoryAHPort)
rl b
rra
rr b
ld a,b
ld (TempAppMemPage),a ;save the current flash page
;create temp var to exec findImages, stores info on all image appvars on calc
;alternatively, findImages could be reduced in size and speed if placed in tempSwapArea
; and the majority of the following code and RAM limitation wouldn't be necessary.
; included in case some one wants to use it to create a temp scrap RAM area for an app.
ld hl,VarName ;check if temp var exists
bcall(_Mov9ToOP1)
bcall(_ChkFindSym)
jp c,VarNotFound
bcall(_DelVarArc)
VarNotFound:
ld hl,FindImagesEnd-FindImagesCopy+17 ;check for available ram findimages size + max header size
bcall(_EnoughMem)
jp nc,RamAvailable
ld a,$82 ;change second memory bank $c000-$ffff
out (MemoryCPort),a
ld hl,0
add hl,sp ;get stack
ld sp,Stack ;set stack
push hl ;save stack
ld hl,0
ld (TextCol),hl
ld (TextRow),hl
ld hl,NoRam
call DisplayString
ld hl,0
ld (TextCol),hl
ld de,12
add hl,de
ld (TextRow),hl
ld hl,PressOn
call DisplayString
NoRamKeyLoop:
call UpdateKeys
ld a,(KeyFlag)
bit KF5,a
jp z,Exit
in a,(IntStatusPort) ;have on button exit out of program
bit 0,a
jp nz,Exit
jp NoRamKeyLoop
RamAvailable:
ld hl,VarName
bcall(_Mov9ToOP1)
ld hl,FindImagesEnd-FindImagesCopy ;findimages size
bcall(_CreateAppVar)
inc de ;skip over size
inc de
push de
ld hl,FindImagesCopy
ld bc,FindImagesEnd-FindImagesCopy
ldir
pop hl
jp (hl) ;execute findImages
VarName:
.db $15,"IVXYZ",0
NoRam:
.db "341 bytes of RAM are needed!",0
PressOn:
.db "Press ON to exit.",0
ReEntry: ;FindImages returns here when finished
ld hl,VarName ;delete temp program
bcall(_Mov9ToOP1)
bcall(_ChkFindSym)
bcall(_DelVarArc)
ld a,$82 ;change second memory bank $c000-$ffff
out (MemoryCPort),a
ld hl,0
add hl,sp ;get stack
ld sp,Stack ;set stack
push hl ;save stack
;--- ImageSelect ---
;lists found images on screen
;scrolls at bottom
;if no images says no images found and it is not selectable or highlighted
;if highlighted image, menu has 'display' 'exit' else just 'exit'
ImageSelect:
call SetRGBMode
call SetFullWindow
call InitializeScroll
call DisableScrolling
call DisableLowColor
call DisableReverseColor
call HideImage
call DisplayUI
call ShowImage
ld hl,272
ld (TextCol),hl
ld hl,228
ld (TextRow),hl
ld hl,ExitStr ;write exit in menu
call DisplayString
ld a,(FileIndex)
or a
jp z,NoImages ;jump if no images found
xor a
ld (ListIndex),a
ld (Selected),a
call ListImages ;list found images
call DrawSelector
ld hl,4
ld (TextCol),hl
ld hl,228
ld (TextRow),hl
ld hl,DisplayStr ;write display in menu
call DisplayString
ISKeyLoop:
call UpdateKeys
ld a,(KeyFlag)
bit KUp,a
jp z,UpImage
bit KDown,a
jp z,DownImage
bit KF1,a
jp z,DisplayImage
bit KF5,a
jp z,Exit
in a,(IntStatusPort) ;have on button exit out of program
bit 0,a
jp nz,Exit
jp ISKeyLoop
;--- UpImage ---
;Updates the selector and
;list index
UpImage:
ld a,(Selected)
or a
jp z,ISKeyLoop
call ClearSelector
ld a,(Selected)
dec a
ld (Selected),a
ld a,(ListIndex)
ld b,a
ld a,(Selected)
sub b
jp nc,SkipPageUp
ld a,(ListIndex)
dec a
ld (ListIndex),a
call ListImages
SkipPageUp:
call DrawSelector
jp ISKeyLoop
;--- DownImage ---
;Updates the selector and
;list index
DownImage:
ld a,(Selected)
ld b,a
ld a,(FileIndex)
dec a
sub b
jp z,ISKeyLoop
ld a,(Selected)
call ClearSelector
ld a,(Selected)
inc a
ld (Selected),a
inc a
ld b,a
ld a,(ListIndex)
add a,16
sub b
jp nc,SkipPageDown
ld a,(ListIndex)
inc a
ld (ListIndex),a
call ListImages
SkipPageDown:
call DrawSelector
jp ISKeyLoop
;--- DisplayImage ---
;Displays image and allows button presses
;to change graphics, select other images,
;exit, or go back
DisplayImage:
call EnableScrolling
ld de,0
or a
ld a,(Selected)
ld e,a
rl e
rl d
rl e
rl d
rl e
rl d
rl e
rl d ;mult by 16
ld hl,FileTable
add hl,de ;hl now points to selected file info
ld de,DataLocation
ldi ;copy data location to ram so that it can be edited freely
ldi
ldi
ld ix,DataLocation
ld a,(ix)
call SetMemPage
call CopyHeader ;get image info
call HideImage ;hide image while drawing
call SetWindow ;set the window and center
call CopyPalette ;store colors in ram
call View ;decompress and draw image
call ShowImage ;display the drawn image
DIKeyLoop:
call UpdateKeys
ld a,(KeyFlag)
bit KUp,a
jp z,PreviousImage
bit KDown,a
jp z,NextImage
bit KLeft,a
jp z,ScrollLeft
bit KRight,a
jp z,ScrollRight
bit KF1,a
jp z,LowColor
bit KF2,a
jp z,ReverseColors
bit KF4,a
jp z,ImageSelect
bit KF5,a
jp z,Exit
in a,(IntStatusPort) ;have on button exit out of program
bit 0,a
jp nz,Exit
jp DIKeyLoop
PreviousImage:
ld a,(Selected)
or a
jp nz,PI
ld a,(FileIndex)
dec a
ld (Selected),a ;wrap around to last file
jp DisplayImage
PI:
dec a
ld (Selected),a
jp DisplayImage
NextImage:
ld a,(Selected)
ld b,a
ld a,(FileIndex)
dec a
sub b
jp nz,NI
xor a
ld (Selected),a
jp DisplayImage
NI:
ld a,(Selected)
inc a
ld (Selected),a
jp DisplayImage
ScrollLeft:
ld a,LCDScrollCtrl
call DisplayReadHL
ld a,h
and $01
ld h,a
push hl
ld de,319
sbc hl,de
jp nz,SL
ld hl,$ffff
ex (sp),hl
SL:
pop hl
inc hl
ld a,LCDScrollCtrl
call DisplayWriteHL
jp DIKeyLoop
ScrollRight:
ld a,LCDScrollCtrl
call DisplayReadHL
ld a,h
and $01
ld h,a
ld de,1
sbc hl,de
jp nc,SR
ld hl,319
SR:
ld a,LCDScrollCtrl
call DisplayWriteHL
jp DIKeyLoop
LowColor:
ld a,LCDControl
call DisplayReadHL
bit LCDLCL,l
set LCDLCL,l
jp z,KSLC
res LCDLCL,l
KSLC:
ld a,LCDControl
call DisplayWriteHL
jp DIKeyLoop
ReverseColors:
ld a,LCDBaseCtrl
call DisplayReadHL
bit LCDLREV,l
set LCDLREV,l
jp z,KSREV
res LCDLREV,l
KSREV:
ld a,LCDBaseCtrl
call DisplayWriteHL
jp DIKeyLoop
;--- NoImages ---
;Jump to when no images are found
;displays "no images" in list
;and waits for exit
NoImages:
ld hl,11
ld (TextCol),hl
ld hl,32
ld (TextRow),hl
ld hl,NoImageStr
call DisplayString
NIKeyLoop:
call UpdateKeys
ld a,(KeyFlag)
bit KF5,a
jp z,Exit
in a,(IntStatusPort) ;have on button exit out of program
bit 0,a
jp nz,Exit
jp NIKeyLoop
;--- ListImages ---
;Writes out the found files
;according to the ListIndex
ListImages:
ld de,0
or a
ld a,(ListIndex)
ld e,a
rl e
rl d
rl e
rl d
rl e
rl d
rl e
rl d ;mult by 16
ld hl,FileTable
add hl,de
inc hl ;skip past bde
inc hl
inc hl
ld a,(FileIndex)
cp 16
jp c,CountGood ;if file index > 16 draw 16 max
ld a,16
CountGood:
push hl
ld b,a
ld hl,11
ld (TextCol),hl
ld hl,32
ld (TextRow),hl
pop hl
LILoop:
push hl
push bc
call DisplayName ;write file name
ld hl,11
ld (TextCol),hl
ld hl,(TextRow)
ld de,12
add hl,de
ld (TextRow),hl
pop bc
pop hl
ld de,16
add hl,de ;hl points to next file name
djnz LILoop
ret
;--- Mod/Clear/DrawSelector ---
;Handles the selector and the currently
;selected file
ClearSelector:
ld c,1
jp ModSelector
DrawSelector:
ld c,0
ModSelector:
ld hl,3
ld (TextCol),hl
ld a,(ListIndex)
ld b,a
ld a,(Selected)
sub b ;find distance from top element
ld b,a
add a,a
add a,a
add a,a
add a,b
add a,b
add a,b
add a,b ;mult by 12
ld hl,0
add a,32
ld l,a
ld (TextRow),hl
ld a,c
or a
jp z,DS
CS:
ld a,' ' ;space out arrow
jp DisplayChar
DS:
ld a,$7f ;selector arrow
jp DisplayChar
;--- UpdateKeys ---
;Stores pressed keys to KeyFlag
;doesnt allow repeating keypresses
UpdateKeys:
ld hl,(KeyRepeat) ;because its not being called during an int, slow it down some
dec hl
ld (KeyRepeat),hl
ld a,h
or l
jp nz,UpdateKeys
ld hl,$4000
ld (KeyRepeat),hl
ld a,$fe ; a=(||||,up,right,left,down)
out (KeypadPort),a
nop
nop
nop
nop
nop
nop
nop
nop
in a,(KeypadPort)
and $0f ; a=(||||,up,right,left,down)
ld b,a
ld a,$ff
out (KeypadPort),a
nop
nop
nop
nop
nop
nop
nop
nop
ld a,$bf ; a=(|||,f1,f2,f3,f4,f5)
out (KeypadPort),a
nop
nop
nop
nop
nop
nop
nop
nop
in a,(KeypadPort)
rra
rr c
rra
rr c
rra ; lose f3
rra
rr c
rra
rr c
ld a,c
and $f0
or b ; a=(f1,f2,f4,f5,up,right,left,down)
ld b,a
ld a,$ff
out (KeypadPort),a
ld a,(OldKey)
xor 255
and $f9
ld (KeyRepeat),hl
or b
ld (KeyFlag),a
ld a,b
ld (OldKey),a
ret
;--- Exit ---
;Exits program with everything intact
Exit: ;jp to exit, make sure nothing is left on stack!
call UpdateKeys ;wait for f5 key to be released if it was pressed
ld a,(OldKey)
bit KF5,a
jp z,Exit
pop hl ;restore stack
ld sp,hl
ld a,$80
out (MemoryCPort),a
ld a,$81
out (MemoryBPort),a
exx
pop hl ;restore alt hl
exx
pop hl
ld a,LCDBaseCtrl
call DisplayWriteHL
pop hl
ld a,LCDControl
call DisplayWriteHL
pop hl
ld a,LCDEntry
call DisplayWriteHL
;set full window
ld hl,0
ld de,239
ld a,LCDWinYStart
call DisplayWriteHLDE
ld hl,0
ld de,319
ld a,LCDWinXStart
call DisplayWriteHLDE
;set cursor
ld hl,0
ld de,0
ld a,LCDCursorY
call DisplayWriteHLDE
ld a,0 ;set speed to snail
out (SpeedPort),a
ei
bjump(_JForceCmdNoChar)
;--- Set/IncMemPage ---
;Sets or increments the current
;flash page
SetMemPage:
bit 7,a
jp z, LowSet
res 7,a
out (MemoryBPort),a
in a,(MemoryBHPort)
set 0,a
out (MemoryBHPort),a
ret
LowSet:
out (MemoryBPort),a
in a,(MemoryBHPort)
res 0,a
out (MemoryBHPort),a
ret
IncMemPort:
in a,(MemoryBPort)
inc a
bit 7,a
jp z, Low
xor a
out (MemoryBPort),a
in a,(MemoryBHPort)
set 0,a
out (MemoryBHPort),a
ret
Low:
out (MemoryBPort),a
ret
;--- HideImage ---
;Hides the base image during
;decompression/drawing
HideImage:
ld a,LCDControl
call DisplayReadHL
res LCDHBASEE,h
ld a,LCDControl
jp DisplayWriteHL
;--- ShowImage ---
;Displays the base image after drawing
ShowImage:
ld a,LCDControl
call DisplayReadHL
set LCDHBASEE,h
ld a,LCDControl
jp DisplayWriteHL
;--- SetWindow ---
;Sets the window size centering it if necessary,
;sets the BGR mode, and sets up doublesize
SetWindow:
call SetRGBMode
ld a,(Header)
rr a
rr a
jp c,RGBMode
call SetBGRMode
RGBMode:
ld de,319
ld hl,(Header+3)
ld a,(Header)
rra
jp nc,SkipDoubleWidth
inc hl ;inc so a 1x1 image can be rotated to a 2x2 else 0x0
or a
rl l
rl h
dec hl ;set it back
SkipDoubleWidth:
push hl
push hl
xor a
sbc hl,de ;check if full width
adc a,0
ld b,a ;inc b if its not full
pop hl
rr h
rr l
ld a,159
sub l
ld h,0
ld l,a
pop de
add hl,de ;hl=x end
ld d,0
ld e,a ;de=x start
push hl
push de
ld hl,(Header+1)
ld a,(Header)
rra
jp nc,SkipDoubleHeight
inc hl ;inc so a 1x1 image can be rotated to a 2x2 else 0x0
or a
rl l
rl h
dec hl ;set it back
SkipDoubleHeight:
push hl
ld a,l
sub 239
adc a,b ;inc b if its not full height
ld b,a
rr h
rr l
ld a,119
sub l
ld h,0
ld l,a
pop de
add hl,de ;hl=y end
ld d,0
ld e,a ;de=y start
push hl
push de
ld a,b
or a
call nz,ClearScreen ;clear the screen if image will not fill screen
pop hl ;flip hl and de on pops
pop de
ld a,LCDWinYStart
call DisplayWriteHLDE ;set y
pop hl ;flip hl and de on pops
pop de
ld a,LCDWinXStart
call DisplayWriteHLDE ;set x
;set cursor
ld hl,0
ld de,0
ld a,LCDCursorY
jp DisplayWriteHLDE
;--- ClearScreen ---
;Will fill the screen with black pixels
;for images that don't take up the full screen
ClearScreen: ;sets screen to black
call SetFullWindow
;set cursor
ld hl,0
ld de,0
ld a,LCDCursorY
call DisplayWriteHLDE
;draw screen
xor a
out (LCDInstPort),a
ld a,LCDGRAM
out (LCDInstPort),a
ld de,38400
DLoCLoop1:
ld a,$00
out (LCDDataPort),a
out (LCDDataPort),a
out (LCDDataPort),a
out (LCDDataPort),a
dec de
ld a,d
or e
jp nz,DLoCLoop1
ret
SetFullWindow:
;set full window
ld hl,0
ld de,239
ld a,LCDWinYStart
call DisplayWriteHLDE ;set y
ld hl,0
ld de,319
ld a,LCDWinXStart
jp DisplayWriteHLDE ;set x
;--- View ---
;Gets data from header, sets flag bits, gets size,
;and chooses compressed or uncompressed routines
View:
xor a
out (LCDInstPort),a
ld a,LCDGRAM
out (LCDInstPort),a
exx
ld hl,0
add hl,sp ;save stack so draw color can return any time
exx
ld hl,0
ld (DrawRowIndex),hl ;reset drawrowindex (for doublesize)
ld hl,0
ld (XIndex),hl ;reset xindex (for doublesize)
ld b,0
ld a,(Header)
rra
rr b ;sets scale
rra
;sets bit depth
and $03
cp 0
jp nz,S1
set 0,b
jp SGood
S1:
cp 1
jp nz,S2
set 1,b
jp SGood
S2:
cp 2
jp nz,S3
set 2,b
jp SGood
S3:
set 3,b
SGood:
ld a,b
ld (DrawFlag),a
;get pixel count
ld a,(Header+1)
ld b,a
ld hl,(Header+3)
inc hl
push hl
pop de
ld a,b
or a
jp z,SkipMult ;check if y=1
xor a
MultLoop:
add hl,de
adc a,0
djnz MultLoop
SkipMult: ;ahl=a*hl
ld (Size),a
ld (Size+1),hl
ld a,(Header)
bit 5,a
jp nz,Compressed
jp Uncompressed
;--- Uncompressed ---
;Sends bytes straight to DrawPixels
Uncompressed:
ld h,(ix+2)
ld l,(ix+1)
UCCD:
bit 6,h
jp z,UCKP
call IncMemPort
ld hl,$8000
UCKP:
ld a,(hl)
inc hl
push hl
call DrawPixels
pop hl
jp UCCD
;--- Compressed ---
;Decompresses rle encoding then DrawPixels
Compressed:
ld h,(ix+2)
ld l,(ix+1)
ld ix,Signal
inc hl ;first byte points to signal which has been copied
bit 6,h ; always check to inc page if changing hl
jp z,CD
ld a,h
sub $40; if increasing it by more than one use sub else use ld
ld h,a
call IncMemPort
CD:
bit 6,h
jp z,KP
call IncMemPort
ld hl,$8000
KP:
ld a,(hl)
inc hl
cp (ix) ;if not signal, drawcolor
jp z,Decompress ;if signal wait for other 2 bytes then loop draw
push hl
call DrawPixels
pop hl
jp CD
Decompress: ;gets next two bytes to loop draw
bit 6,h
jp z,KP2
call IncMemPort
ld hl,$8000
KP2:
ld a,(hl)
inc hl
ld b,a ; save loop count
bit 6,h
jp z,KP3
call IncMemPort
ld hl,$8000
KP3:
ld a,(hl)
ld c,a
inc hl
push hl ;save hl for main loop
DCLoop:
ld a,c
push bc
call DrawPixels ;draw color b times
pop bc
djnz DCLoop
pop hl
jp CD
;--- DrawPixels ---
;Switches image depth and draws pixels
DrawPixels: ;a=data byte
ld c,a
ld a,(DrawFlag)
bit 3,a
jp nz,Bit8
bit 2,a
jp nz,Bit4
bit 1,a
jp nz,Bit2
Bit1:
ld b,8
B1Loop:
xor a
rl c
rla
call DrawColor
djnz B1Loop
ret
Bit2:
ld b,4
B2Loop:
xor a
rl c
rla
rl c
rla
call DrawColor
djnz B2Loop
ret
Bit4:
ld b,2
B4Loop:
xor a
rl c
rla
rl c
rla
rl c
rla
rl c
rla
call DrawColor
djnz B4Loop
ret
Bit8:
ld a,c
DrawColor:
ld e,a
ld a,(DrawFlag)
rla
jp c,DrawDoubleColor ;jump if doublesize
ld a,e
ld hl,Palette
ld d,0
or a
rl a
rl d
ld e,a
add hl,de ;add color offset to palette
ld a,(hl)
out (LCDDataPort),a
inc hl
ld a,(hl)
out (LCDDataPort),a ;draw color
ld a,(Size)
ld hl,(Size+1)
ld de,1
or a
sbc hl,de
sbc a,0
ld (Size),a
ld (Size+1),hl ;dec and check size to see when finished
or h
or l
ret nz
exx
ld sp,hl ;restore the stack and return from View
exx
ret
;--- DrawDoubleColor ---
;Draws the same color twice for doublesize
;also stores row data for DrawRow
DrawDoubleColor:
ld a,e
ld hl,DrawRowData
ld de,(DrawRowIndex)
add hl,de
ld (hl),a
inc de
ld (DrawRowIndex),de
ld hl,Palette
ld d,0
or a
rl a
rl d
ld e,a
add hl,de ;add color offset to palette
ld a,(hl)
out (LCDDataPort),a
inc hl
ld a,(hl)
out (LCDDataPort),a ;draw color
dec hl
ld a,(hl)
out (LCDDataPort),a
inc hl
ld a,(hl)
out (LCDDataPort),a ;draw color again
ld hl,(XIndex)
inc hl
ld (XIndex),hl
ld de,(Header+3)
inc de
or a
sbc hl,de
call z,DrawRow
ld a,(Size)
ld hl,(Size+1)
ld de,1
or a
sbc hl,de
sbc a,0
ld (Size),a
ld (Size+1),hl
or h
or l
ret nz
exx
ld sp,hl ;restore the stack and return from View
exx
ret
;--- DrawRow ---
;Duplicates the previously drawn row for doublesize
DrawRow:
push bc
ld hl,0
ld (DrawRowIndex),hl ;reset drawrowindex
ld hl,(Header+3)
inc l
ld b,l ;loop width times
DRLoop:
ld hl,DrawRowData
ld de,(DrawRowIndex)
add hl,de
ld a,(hl)
inc de
ld (DrawRowIndex),de
ld hl,Palette
ld d,0
or a
rl a
rl d
ld e,a
add hl,de ;add color offset to palette
ld a,(hl)
out (LCDDataPort),a
inc hl
ld a,(hl)
out (LCDDataPort),a ;draw color
dec hl
ld a,(hl)
out (LCDDataPort),a
inc hl
ld a,(hl)
out (LCDDataPort),a ;draw color again
djnz DRLoop
ld hl,0
ld (DrawRowIndex),hl ;reset drawrowindex
ld hl,0
ld (XIndex),hl ;reset xindex
pop bc
ret
;--- CopyPalette/Header ---
;Copies palette and header to ram
;also stores signal for rle decompressing
CopyPalette:
ld hl,Header+5
ld c,(hl)
inc hl
ld b,(hl)
ld de,Palette
jp FlashToRam
CopyHeader:
ld de,Header
ld bc,7
FlashToRam:
ld h,(ix+2)
ld l,(ix+1)
CopyData:
bit 6,h
jp z,KeepPage
call IncMemPort
ld hl,$8000
KeepPage:
ldi
jp pe,CopyData
ld a,(hl)
ld (ix+2),h
ld (ix+1),l
ld hl,Signal ;on second run (copy palette) signal will be correct
ld (hl),a
ret
;--- DisplayWriteHLDE ---
;Writes hl to a, de to consecutive address
;inputs:
;a=start address
;hl,de
DisplayWriteHLDE:
ld c,LCDInstPort
ld b,$00
out (c),b
out (c),a
inc c
out (c),h
out (c),l
dec c
inc a
out (c),b
out (c),a
inc c
out (c),d
out (c),e
ret
;--- DisplayWriteHL ---
;Writes hl to a
;inputs:
;a=address
;hl
DisplayWriteHL:
ld c,LCDDataPort
ld b,a
xor a
out (LCDInstPort),a
ld a,b
out (LCDInstPort),a
out (c),h
out (c),l
ret
;--- DisplayReadHL ---
;read hl at a
;inputs:
;a=address
DisplayReadHL:
ld c,LCDDataPort
ld b,a
xor a
out (LCDInstPort),a
ld a,b
out (LCDInstPort),a
in h,(c)
in l,(c)
ret
InitializeScroll:
ld a,LCDScrollCtrl
call DisplayReadHL
ld a,h ;init scroll value to 0
and $fe
ld h,a
ld a,l
and $00
ld l,a
ld a,LCDScrollCtrl
jp DisplayWriteHL
SetOrigin:
ld a,LCDEntry
call DisplayReadHL
set LCDLORG,l ;set origin
ld a,LCDEntry
jp DisplayWriteHL
ResetOrigin:
ld a,LCDEntry
call DisplayReadHL
res LCDLORG,l ;reset origin
ld a,LCDEntry
jp DisplayWriteHL
DisableScrolling:
ld a,LCDBaseCtrl
call DisplayReadHL
res LCDLVLE,l ;disable horizontal scrolling
ld a,LCDBaseCtrl
jp DisplayWriteHL
DisableLowColor:
ld a,LCDControl
call DisplayReadHL
res LCDLCL,l ;disable low color
ld a,LCDControl
jp DisplayWriteHL
DisableReverseColor:
ld a,LCDBaseCtrl
call DisplayReadHL
set LCDLREV,l ;set normal colors
ld a,LCDBaseCtrl
jp DisplayWriteHL
EnableScrolling:
ld a,LCDBaseCtrl
call DisplayReadHL
set LCDLVLE,l ;enable horizontal scrolling
ld a,LCDBaseCtrl
jp DisplayWriteHL
SetRGBMode:
ld a,LCDEntry
call DisplayReadHL
set LCDHBGR,h ;set rgb
ld a,LCDEntry
jp DisplayWriteHL
SetBGRMode:
ld a,LCDEntry
call DisplayReadHL
res LCDHBGR,h ;set bgr
ld a,LCDEntry
jp DisplayWriteHL
DisplayUI: ;standard compressed display routine unrolled a bit
ld hl,0
ld de,239
ld a,LCDWinYStart
call DisplayWriteHLDE ;set window y
ld hl,0
ld de,319
ld a,LCDWinXStart
call DisplayWriteHLDE ;set window x
ld hl,0
ld de,0
ld a,LCDCursorY
call DisplayWriteHLDE ;set cursor
xor a
out (LCDInstPort),a
ld a,LCDGRAM
out (LCDInstPort),a
ld ix,UIData
ld hl,UIData+1
UIDraw:
ld a,(hl)
ld c,a
inc hl
cp (ix) ;if not signal, drawcolor
jp z,UIDecompress ;if signal wait for other 2 bytes then loop draw
push hl
xor a
rl c
rla
rl c
rla
rl c
rla
rl c
rla
ld hl,UIPalette
ld d,0
or a
rl a
rl d
ld e,a
add hl,de ;add color offset to palette
ld a,(hl)
out (LCDDataPort),a
inc hl
ld a,(hl)
out (LCDDataPort),a ;draw color
xor a
rl c
rla
rl c
rla
rl c
rla
rl c
rla
ld hl,UIPalette
ld d,0
or a
rl a
rl d
ld e,a
add hl,de ;add color offset to palette
ld a,(hl)
out (LCDDataPort),a
inc hl
ld a,(hl)
out (LCDDataPort),a ;draw color
pop hl
jp UIDraw
UIDecompress:
ld a,(hl)
or a
ret z ;return when end signal reached
inc hl
ld b,a ;store count
ld a,(hl)
ld c,a ;store color
inc hl
push hl ;store next address
xor a
rl c
rla
rl c
rla
rl c
rla
rl c
rla
ld hl,UIPalette
ld d,0
or a
rl a
rl d
ld e,a
add hl,de ;add color offset to palette
push hl ;save first color
xor a
rl c
rla
rl c
rla
rl c
rla
rl c
rla
ld hl,UIPalette
ld d,0
or a
rl a
rl d
ld e,a
add hl,de ;add color offset to palette
pop de ;pop first color
UIDLoop: ;loop between the 2 pixels that need to be drawn
ld a,(de) ;get first color
out (LCDDataPort),a
inc de
ld a,(de)
out (LCDDataPort),a ;draw color
dec de
ld a,(hl) ;get second color
out (LCDDataPort),a
inc hl
ld a,(hl)
out (LCDDataPort),a ;draw color
dec hl
djnz UIDLoop
pop hl
jp UIDraw
;Writes out up to 8 char filename padded with spaces
DisplayName:
ld b,8
CharLoop:
ld a,(hl)
or a
jp z,SpaceLoop
push bc
push hl
call DisplayChar
ld hl,(TextCol)
ld de,8
add hl,de
ld (TextCol),hl
pop hl
pop bc
inc hl
djnz CharLoop
ret
SpaceLoop:
push bc
ld a,' '
call DisplayChar
ld hl,(TextCol)
ld de,8
add hl,de
ld (TextCol),hl
pop bc
djnz SpaceLoop
ret
;Text routines to display text and chars
;inputs-hl points to null terminated string
;a-char
;set textrow,col
DisplayString:
ld a,(hl)
or a
ret z
push hl
call DisplayChar
ld hl,(TextCol)
ld de,8
add hl,de
ld (TextCol),hl
pop hl
inc hl
jp DisplayString
DisplayChar:
;dont check clipping
;get colors
ld b,a
ld hl,FontPalette
ld a,(hl)
ld e,a
inc hl
ld a,(hl)
ld d,a ;de=background color
inc hl
ld a,(hl)
inc hl
ld h,(hl)
ld l,a ;hl=char color
ld a,b
push de
push hl
;set window
push af
ld hl,(TextRow)
ld de,11
add hl,de
ex de,hl
ld hl,(TextRow)
ld a,LCDWinYStart
call DisplayWriteHLDE ;set window y
ld hl,(TextCol)
ld de,7
add hl,de
ex de,hl
ld hl,(TextCol)
ld a,LCDWinXStart
call DisplayWriteHLDE ;set window x
;set cursor
ld hl,0
ld de,0
ld a,LCDCursorY
call DisplayWriteHLDE
;get ready to draw
xor a
out (LCDInstPort),a
ld a,LCDGRAM
out (LCDInstPort),a
;check for unknown char
pop af
cp $20
jp nc,CharLowGood
ld a,$80
CharLowGood:
cp $81
jp c,CharHighGood
ld a,$80
CharHighGood:
;get font char offset
sub $20 ;subtract offset (font data starts at $20)
ld d,0
ld e,a
ld h,0
ld l,a
or a
rl l
rl h
rl l
rl h
rl l
rl h
add hl,de
add hl,de
add hl,de
add hl,de ;mult by 12
ld de,FontData
add hl,de ;point to char data
push hl
pop ix ;display char row
pop hl ;text color
pop de ;background color
ld b,12
DCLoop1:
ld a,(ix)
ld c,b
ld b,8
DCLoop2:
rla
push af
jp c,DrawTextColor
ld a,e ;get first color
out (LCDDataPort),a
ld a,d
out (LCDDataPort),a ;draw color
pop af
djnz DCLoop2
jp EndDCLoop2
DrawTextColor:
ld a,l ;get second color
out (LCDDataPort),a
ld a,h
out (LCDDataPort),a ;draw color
pop af
djnz DCLoop2
EndDCLoop2:
ld b,c
inc ix
djnz DCLoop1
ret
NoImageStr: ;default string if no images found
.db "No Images!",0
DisplayStr: ;menu string
.db "Display",0
ExitStr: ;menu string
.db "Exit",0
;draws boxes for list and menu and key info
;waste of space but I still got plenty to kill on this page
;in a regular program, probably better to just use
;set window/origin for lines and text routine only
;file size = 11180 bytes
UIHeader:
.db $2A ;image info
.dw $00EF ;image height
.dw $013F ;image width
.dw $0020 ;palette size
;palette size = 32 bytes
;palette begin (2 bytes per color)
UIPalette:
.db $42, $08, $A4, $F3, $C6, $38, $A5, $18, $63, $38, $10, $98, $80, $41, $E0, $41
.db $FF, $FF, $E7, $3C, $73, $8E, $08, $41, $4A, $49, $DD, $55, $D3, $0C, $00, $00
;data size = 11141 bytes
;data begin
UIData:
.db $02, $02, $3F, $00, $01, $02, $5F, $00, $01, $02, $3F, $00, $11, $02, $5F, $00
.db $11, $00, $02, $3E, $22, $11, $00, $02, $5E, $22, $11, $00, $02, $3E, $22, $11
.db $00, $02, $5E, $22, $11, $00, $02, $3E, $22, $11, $00, $02, $5E, $22, $11, $00
.db $02, $3E, $22, $11, $00, $02, $5E, $22, $11, $00, $02, $3E, $22, $11, $00, $02
.db $04, $22, $02, $04, $33, $32, $02, $28, $22, $23, $02, $05, $22, $23, $32, $02
.db $25, $22, $11, $00, $02, $3E, $22, $11, $00, $22, $22, $24, $02, $06, $55, $32
.db $02, $27, $22, $45, $32, $02, $04, $22, $45, $53, $02, $25, $22, $11, $00, $02
.db $3E, $22, $11, $00, $22, $22, $24, $02, $06, $55, $53, $02, $26, $22, $23, $55
.db $42, $22, $22, $22, $24, $55, $53, $02, $25, $22, $11, $00, $02, $3E, $22, $11
.db $00, $22, $22, $24, $02, $06, $55, $43, $22, $23, $02, $24, $22, $23, $55, $54
.db $22, $22, $22, $45, $55, $53, $02, $20, $22, $23, $02, $04, $22, $11, $00, $02
.db $04, $22, $66, $62, $02, $05, $22, $26, $66, $02, $0C, $22, $66, $62, $02, $07
.db $22, $26, $66, $66, $22, $22, $26, $66, $02, $15, $22, $11, $00, $22, $22, $23
.db $55, $54, $55, $54, $33, $33, $22, $23, $55, $32, $02, $04, $22, $43, $02, $05
.db $22, $44, $32, $02, $07, $22, $45, $32, $02, $05, $22, $23, $33, $44, $43, $02
.db $06, $22, $55, $55, $22, $22, $23, $55, $55, $53, $22, $35, $02, $05, $22, $33
.db $34, $44, $32, $22, $23, $32, $02, $06, $22, $23, $42, $22, $22, $22, $33, $34
.db $44, $32, $22, $22, $22, $45, $42, $22, $22, $22, $11, $00, $02, $04, $22, $67
.db $62, $02, $05, $22, $26, $66, $02, $0C, $22, $67, $62, $02, $07, $22, $66, $66
.db $66, $62, $22, $66, $66, $62, $02, $14, $22, $11, $00, $22, $22, $22, $33, $23
.db $55, $53, $22, $22, $22, $24, $55, $53, $22, $22, $22, $24, $55, $32, $22, $22
.db $22, $23, $55, $53, $02, $06, $22, $34, $55, $54, $22, $22, $22, $23, $34, $02
.db $04, $55, $42, $02, $05, $22, $55, $55, $32, $22, $35, $55, $55, $42, $23, $55
.db $32, $22, $22, $33, $45, $55, $55, $55, $54, $22, $35, $53, $22, $22, $23, $22
.db $22, $22, $24, $54, $22, $33, $45, $55, $55, $55, $54, $22, $22, $24, $55, $54
.db $22, $22, $22, $11, $00, $02, $04, $22, $67, $62, $66, $22, $26, $66, $26, $22
.db $22, $22, $26, $66, $66, $22, $26, $66, $26, $62, $22, $26, $62, $67, $62, $26
.db $66, $26, $62, $26, $62, $22, $67, $62, $67, $62, $26, $66, $26, $66, $22, $22
.db $22, $66, $66, $22, $22, $66, $66, $62, $22, $66, $62, $66, $22, $66, $02, $04
.db $22, $11, $00, $02, $04, $22, $24, $55, $53, $22, $22, $22, $35, $55, $55, $22
.db $22, $22, $35, $55, $53, $22, $22, $23, $45, $55, $54, $02, $05, $22, $34, $55
.db $55, $55, $22, $22, $22, $45, $02, $05, $55, $32, $02, $05, $22, $55, $55, $32
.db $22, $45, $55, $54, $22, $24, $55, $42, $22, $24, $02, $05, $55, $53, $22, $45
.db $55, $22, $22, $24, $53, $22, $22, $35, $55, $34, $02, $05, $55, $53, $22, $22
.db $45, $55, $55, $42, $22, $22, $11, $00, $02, $04, $22, $67, $66, $66, $62, $26
.db $76, $66, $26, $66, $22, $66, $66, $66, $62, $26, $76, $66, $66, $22, $66, $66
.db $67, $62, $26, $76, $02, $04, $66, $22, $67, $62, $67, $62, $26, $76, $26, $76
.db $22, $22, $26, $66, $66, $62, $26, $66, $66, $66, $22, $67, $02, $04, $66, $62
.db $22, $22, $22, $11, $00, $02, $04, $22, $25, $55, $52, $22, $22, $22, $55, $55
.db $55, $32, $22, $24, $55, $55, $54, $22, $22, $45, $55, $55, $54, $02, $04, $22
.db $23, $55, $55, $55, $53, $22, $22, $23, $02, $04, $55, $54, $33, $02, $06, $22
.db $55, $55, $32, $24, $55, $55, $42, $22, $24, $55, $52, $22, $35, $02, $04, $55
.db $43, $32, $23, $55, $54, $22, $22, $45, $55, $22, $22, $45, $55, $45, $02, $04
.db $55, $43, $32, $22, $23, $55, $55, $55, $53, $22, $22, $11, $00, $02, $04, $22
.db $67, $62, $67, $62, $26, $76, $66, $26, $76, $22, $67, $62, $67, $62, $26, $76
.db $26, $76, $22, $67, $62, $67, $62, $26, $76, $26, $76, $26, $76, $22, $66, $62
.db $66, $62, $26, $66, $26, $76, $22, $22, $26, $76, $26, $62, $26, $76, $26, $76
.db $22, $67, $62, $67, $62, $67, $62, $22, $22, $22, $11, $00, $02, $04, $22, $35
.db $55, $42, $22, $22, $23, $55, $55, $55, $32, $22, $45, $55, $55, $53, $22, $23
.db $02, $04, $55, $02, $04, $22, $45, $55, $55, $53, $02, $04, $22, $55, $55, $54
.db $32, $02, $08, $22, $55, $55, $42, $35, $55, $55, $32, $22, $25, $55, $52, $22
.db $25, $55, $55, $43, $22, $22, $22, $24, $55, $53, $22, $23, $55, $55, $32, $22
.db $55, $55, $35, $55, $55, $43, $22, $22, $22, $24, $45, $55, $43, $55, $54, $22
.db $22, $11, $00, $02, $04, $22, $67, $62, $67, $62, $26, $76, $22, $26, $76, $22
.db $66, $62, $67, $62, $26, $76, $26, $76, $22, $67, $62, $67, $62, $26, $76, $26
.db $76, $26, $76, $22, $26, $66, $66, $22, $22, $22, $66, $66, $22, $22, $26, $76
.db $26, $62, $26, $76, $26, $76, $22, $67, $62, $67, $62, $67, $62, $22, $22, $22
.db $11, $00, $02, $04, $22, $35, $55, $32, $22, $22, $25, $55, $55, $55, $32, $34
.db $55, $55, $55, $53, $22, $24, $55, $55, $45, $55, $32, $22, $22, $24, $55, $55
.db $54, $02, $05, $22, $45, $55, $32, $02, $09, $22, $55, $55, $42, $45, $55, $53
.db $22, $22, $35, $55, $42, $22, $24, $55, $53, $02, $04, $22, $25, $55, $52, $22
.db $24, $55, $55, $22, $23, $55, $54, $24, $55, $53, $02, $04, $22, $25, $55, $54
.db $22, $35, $55, $22, $22, $11, $00, $02, $04, $22, $67, $62, $67, $62, $26, $76
.db $22, $26, $76, $22, $22, $26, $67, $62, $26, $76, $26, $76, $22, $67, $62, $67
.db $62, $26, $76, $26, $76, $26, $76, $22, $66, $66, $66, $62, $22, $22, $67, $62
.db $22, $22, $26, $76, $22, $22, $26, $76, $26, $76, $22, $67, $62, $67, $62, $67
.db $62, $22, $22, $22, $11, $00, $02, $04, $22, $55, $55, $22, $22, $22, $35, $02
.db $08, $55, $52, $22, $35, $55, $53, $35, $55, $32, $22, $22, $45, $55, $54, $32
.db $22, $33, $22, $22, $22, $35, $55, $55, $55, $42, $02, $07, $22, $45, $55, $43
.db $55, $55, $42, $22, $22, $35, $55, $32, $22, $23, $55, $55, $55, $54, $22, $22
.db $35, $55, $42, $22, $35, $55, $54, $22, $24, $55, $53, $23, $55, $55, $55, $54
.db $22, $22, $35, $55, $52, $23, $45, $55, $32, $22, $11, $00, $02, $04, $22, $67
.db $62, $67, $62, $26, $76, $22, $26, $76, $22, $26, $66, $67, $62, $26, $76, $26
.db $76, $22, $67, $62, $67, $62, $26, $76, $26, $76, $26, $76, $22, $67, $62, $67
.db $62, $22, $26, $66, $62, $22, $22, $26, $76, $22, $22, $26, $76, $26, $76, $22
.db $67, $62, $67, $62, $67, $62, $22, $22, $22, $11, $00, $22, $22, $22, $23, $55
.db $54, $22, $22, $22, $45, $02, $06, $55, $45, $55, $52, $22, $35, $55, $42, $25
.db $55, $42, $22, $23, $55, $55, $42, $22, $24, $55, $42, $22, $22, $45, $55, $55
.db $55, $54, $02, $07, $22, $35, $55, $55, $55, $54, $22, $22, $22, $45, $55, $22
.db $22, $24, $02, $04, $55, $42, $22, $35, $55, $32, $22, $55, $55, $53, $22, $35
.db $55, $42, $24, $02, $04, $55, $42, $22, $35, $55, $44, $45, $55, $55, $22, $22
.db $11, $00, $02, $04, $22, $67, $62, $67, $62, $26, $76, $22, $26, $76, $22, $66
.db $62, $67, $62, $26, $76, $26, $76, $22, $67, $62, $67, $62, $26, $76, $26, $76
.db $26, $76, $22, $67, $62, $67, $62, $22, $26, $66, $22, $22, $22, $26, $76, $22
.db $22, $26, $76, $26, $76, $22, $67, $62, $67, $62, $67, $62, $22, $22, $22, $11
.db $00, $22, $22, $22, $24, $55, $53, $22, $22, $23, $55, $55, $45, $55, $55, $55
.db $54, $25, $55, $42, $22, $55, $55, $32, $24, $55, $55, $32, $25, $55, $54, $22
.db $22, $24, $55, $55, $32, $23, $02, $04, $55, $54, $02, $07, $22, $35, $55, $55
.db $55, $53, $22, $22, $22, $55, $54, $22, $22, $35, $02, $04, $55, $42, $22, $45
.db $55, $22, $24, $55, $55, $53, $22, $45, $55, $32, $35, $02, $04, $55, $42, $22
.db $45, $02, $04, $55, $53, $22, $22, $11, $00, $02, $04, $22, $67, $62, $67, $62
.db $26, $76, $22, $26, $76, $22, $67, $62, $67, $62, $26, $76, $26, $76, $22, $67
.db $62, $67, $62, $26, $76, $26, $76, $26, $76, $22, $67, $62, $67, $62, $22, $66
.db $62, $22, $22, $22, $26, $76, $26, $62, $26, $76, $26, $76, $22, $67, $62, $67
.db $62, $67, $62, $22, $22, $22, $11, $00, $22, $22, $22, $35, $55, $52, $22, $22
.db $24, $55, $53, $25, $55, $55, $54, $32, $35, $55, $42, $23, $55, $54, $44, $55
.db $55, $55, $53, $35, $55, $42, $22, $22, $24, $55, $55, $54, $24, $55, $54, $55
.db $54, $32, $02, $07, $22, $35, $55, $55, $55, $42, $22, $22, $23, $55, $54, $22
.db $22, $45, $55, $45, $55, $43, $22, $22, $55, $54, $22, $35, $55, $55, $53, $23
.db $55, $54, $22, $45, $55, $45, $55, $43, $22, $22, $02, $04, $55, $54, $22, $22
.db $22, $11, $00, $02, $04, $22, $67, $62, $67, $62, $26, $76, $22, $26, $76, $22
.db $67, $62, $67, $62, $26, $76, $26, $76, $22, $67, $62, $67, $62, $26, $76, $26
.db $76, $26, $76, $22, $67, $62, $67, $62, $22, $67, $62, $22, $26, $66, $26, $76
.db $26, $62, $26, $76, $26, $76, $22, $67, $62, $67, $62, $67, $62, $22, $22, $22
.db $11, $00, $22, $22, $22, $45, $55, $42, $22, $22, $35, $55, $53, $23, $45, $54
.db $32, $22, $35, $55, $42, $25, $02, $06, $55, $42, $55, $55, $32, $22, $22, $22
.db $55, $55, $55, $45, $55, $42, $02, $0A, $22, $25, $55, $55, $55, $22, $22, $22
.db $23, $55, $53, $22, $23, $55, $54, $02, $04, $22, $23, $55, $54, $23, $55, $55
.db $55, $53, $35, $55, $53, $23, $55, $54, $02, $05, $22, $55, $55, $55, $43, $02
.db $04, $22, $11, $00, $02, $04, $22, $67, $66, $66, $62, $26, $76, $22, $26, $76
.db $22, $66, $66, $67, $62, $26, $76, $26, $76, $22, $66, $66, $67, $62, $26, $76
.db $26, $76, $26, $76, $22, $66, $66, $66, $62, $26, $67, $66, $66, $26, $76, $26
.db $66, $66, $62, $26, $66, $66, $66, $22, $67, $62, $67, $62, $67, $62, $22, $22
.db $22, $11, $00, $22, $22, $23, $55, $55, $43, $22, $22, $45, $55, $42, $02, $05
.db $22, $45, $55, $32, $35, $55, $34, $55, $55, $55, $54, $22, $45, $53, $22, $22
.db $33, $45, $02, $05, $55, $32, $22, $22, $33, $02, $07, $22, $24, $55, $55, $54
.db $22, $22, $22, $23, $55, $53, $22, $24, $55, $53, $22, $22, $23, $32, $23, $55
.db $54, $45, $55, $55, $45, $55, $55, $55, $42, $24, $55, $53, $22, $22, $23, $32
.db $23, $55, $55, $55, $32, $02, $04, $22, $11, $00, $02, $04, $22, $66, $62, $66
.db $22, $26, $66, $22, $26, $66, $22, $26, $62, $66, $62, $26, $66, $26, $66, $22
.db $26, $62, $66, $62, $26, $66, $26, $66, $26, $66, $22, $26, $66, $66, $22, $26
.db $66, $66, $66, $26, $66, $22, $66, $66, $22, $22, $66, $66, $62, $22, $66, $62
.db $66, $62, $66, $62, $22, $22, $22, $11, $00, $23, $45, $02, $04, $55, $53, $22
.db $45, $55, $32, $02, $05, $22, $45, $55, $22, $45, $54, $23, $44, $33, $45, $55
.db $22, $45, $54, $44, $45, $02, $04, $55, $53, $45, $55, $33, $34, $44, $55, $42
.db $02, $06, $22, $24, $55, $55, $42, $22, $22, $22, $23, $55, $53, $22, $24, $55
.db $53, $33, $44, $45, $54, $22, $02, $04, $55, $53, $25, $55, $55, $55, $32, $24
.db $55, $53, $33, $44, $45, $54, $23, $55, $55, $55, $54, $33, $22, $22, $22, $11
.db $00, $02, $3E, $22, $11, $00, $24, $02, $06, $55, $22, $45, $54, $02, $06, $22
.db $45, $54, $23, $55, $53, $22, $22, $23, $45, $55, $22, $35, $02, $06, $55, $54
.db $32, $35, $02, $05, $55, $53, $02, $06, $22, $23, $55, $55, $32, $02, $04, $22
.db $55, $53, $22, $23, $02, $06, $55, $32, $45, $55, $55, $55, $32, $23, $55, $55
.db $54, $22, $23, $02, $06, $55, $34, $55, $53, $55, $55, $55, $54, $42, $22, $11
.db $00, $02, $3E, $22, $11, $00, $23, $02, $05, $55, $53, $22, $35, $53, $02, $06
.db $22, $35, $53, $23, $55, $53, $22, $22, $24, $55, $53, $22, $24, $02, $04, $55
.db $54, $43, $22, $22, $35, $02, $05, $55, $42, $02, $07, $22, $45, $55, $32, $02
.db $04, $22, $45, $53, $22, $23, $02, $05, $55, $54, $22, $35, $55, $55, $42, $22
.db $22, $45, $55, $42, $22, $23, $02, $05, $55, $54, $23, $55, $42, $34, $55, $55
.db $55, $53, $22, $11, $00, $02, $3E, $22, $11, $00, $23, $55, $54, $33, $33, $33
.db $22, $22, $35, $52, $02, $06, $22, $24, $32, $22, $45, $42, $22, $22, $23, $55
.db $42, $22, $22, $35, $55, $54, $43, $02, $04, $22, $23, $55, $55, $55, $54, $43
.db $02, $08, $22, $35, $53, $02, $05, $22, $35, $53, $22, $22, $35, $55, $55, $55
.db $44, $32, $22, $22, $45, $43, $22, $22, $22, $35, $54, $22, $22, $22, $35, $55
.db $55, $55, $44, $32, $22, $45, $32, $22, $34, $55, $55, $53, $22, $11, $00, $02
.db $3E, $22, $11, $00, $22, $23, $02, $06, $22, $23, $32, $02, $09, $22, $23, $02
.db $04, $22, $32, $02, $04, $22, $32, $02, $07, $22, $23, $33, $32, $02, $11, $22
.db $23, $02, $04, $22, $33, $33, $02, $10, $22, $33, $33, $02, $08, $22, $23, $45
.db $42, $22, $11, $00, $02, $3E, $22, $11, $00, $02, $5E, $22, $11, $00, $02, $3E
.db $22, $11, $00, $02, $5E, $22, $11, $00, $02, $3E, $22, $11, $00, $02, $5E, $22
.db $11, $02, $3F, $00, $01, $02, $9F, $00, $11, $02, $5F, $00, $01, $00, $02, $3E
.db $88, $11, $00, $02, $5E, $99, $11, $00, $02, $3E, $88, $11, $00, $02, $5E, $99
.db $11, $00, $02, $3E, $88, $11, $00, $02, $5E, $99, $11, $00, $02, $3E, $88, $11
.db $00, $02, $5E, $99, $11, $00, $02, $3E, $88, $11, $00, $02, $5E, $99, $11, $00
.db $02, $3E, $88, $11, $00, $02, $5E, $99, $11, $00, $02, $3E, $88, $11, $00, $02
.db $5E, $99, $11, $00, $02, $3E, $88, $11, $00, $02, $5E, $99, $11, $00, $02, $3E
.db $88, $11, $00, $02, $5E, $99, $11, $00, $02, $3E, $88, $11, $00, $02, $5E, $99
.db $11, $00, $02, $3E, $88, $11, $00, $02, $17, $99, $92, $29, $99, $99, $99, $21
.db $29, $02, $04, $99, $92, $23, $29, $99, $99, $92, $29, $02, $04, $99, $22, $23
.db $11, $A2, $99, $99, $22, $32, $92, $29, $02, $08, $99, $92, $11, $11, $39, $99
.db $93, $29, $99, $99, $13, $02, $15, $99, $11, $00, $02, $3E, $88, $11, $00, $02
.db $16, $99, $92, $AB, $BA, $99, $99, $92, $CB, $B2, $99, $99, $92, $1A, $BB, $BB
.db $C2, $99, $99, $2C, $BA, $99, $91, $AA, $AB, $02, $04, $BB, $21, $AB, $BB, $BC
.db $2A, $BA, $29, $02, $06, $99, $2A, $BB, $BB, $BB, $BA, $99, $9A, $B1, $99, $9A
.db $BB, $19, $02, $14, $99, $11, $00, $02, $3E, $88, $11, $00, $02, $16, $99, $1B
.db $BB, $BB, $29, $99, $9C, $BB, $BB, $29, $91, $02, $04, $BB, $C2, $99, $91, $CB
.db $BB, $99, $9C, $02, $09, $BB, $BC, $21, $BB, $BB, $39, $02, $04, $99, $91, $BB
.db $BB, $BB, $AA, $BB, $19, $9A, $BB, $99, $AB, $BB, $19, $02, $14, $99, $11, $00
.db $02, $3E, $88, $11, $00, $02, $15, $99, $2C, $BB, $BB, $BA, $99, $92, $AB, $BB
.db $BB, $A9, $91, $BB, $BB, $BA, $13, $99, $99, $AB, $BB, $BB, $29, $91, $BB, $BB
.db $BB, $C1, $22, $AB, $BB, $BB, $A1, $39, $9C, $BA, $BB, $BA, $02, $04, $99, $92
.db $BB, $BC, $29, $2A, $BB, $A9, $91, $BB, $23, $BB, $B1, $02, $15, $99, $11, $00
.db $02, $3E, $88, $11, $00, $02, $14, $99, $92, $BB, $BB, $C1, $29, $99, $2B, $BB
.db $19, $AB, $B9, $93, $BB, $A2, $29, $99, $99, $92, $BB, $BB, $BB, $19, $99, $22
.db $91, $BB, $19, $99, $3B, $BA, $22, $99, $99, $9A, $B2, $91, $CB, $A9, $02, $04
.db $99, $2A, $3B, $A3, $CB, $BB, $29, $93, $BB, $1C, $BB, $19, $02, $15, $99, $11
.db $00, $02, $3E, $88, $11, $00, $02, $14, $99, $2B, $BB, $B1, $99, $99, $99, $1B
.db $BA, $92, $AB, $B2, $99, $BB, $CA, $AA, $29, $99, $9A, $BB, $C2, $BB, $19, $99
.db $99, $9A, $BB, $99, $99, $9B, $BC, $AA, $A2, $99, $91, $B1, $99, $9A, $B1, $02
.db $05, $99, $1B, $BB, $BB, $B2, $99, $92, $BB, $BB, $BA, $02, $16, $99, $11, $00
.db $02, $3E, $88, $11, $00, $02, $14, $99, $AB, $BC, $29, $99, $99, $99, $AB, $BA
.db $AB, $BB, $B9, $92, $BB, $BB, $BB, $B2, $99, $2B, $BB, $29, $BB, $C2, $99, $99
.db $2B, $BA, $99, $99, $2B, $BB, $BB, $BB, $29, $91, $B1, $99, $99, $BC, $02, $05
.db $99, $AB, $BB, $BB, $A9, $99, $99, $AB, $BB, $B2, $02, $16, $99, $11, $00, $02
.db $3E, $88, $11, $00, $02, $14, $99, $BB, $C2, $02, $04, $99, $BB, $BB, $BB, $BA
.db $29, $9A, $BB, $BB, $BB, $19, $99, $AB, $BA, $21, $CB, $BB, $A9, $99, $AB, $B2
.db $99, $99, $AB, $BB, $BB, $B1, $99, $9A, $B1, $99, $91, $BB, $02, $05, $99, $BB
.db $BB, $AA, $CC, $29, $99, $2B, $BB, $19, $02, $16, $99, $11, $00, $02, $3E, $88
.db $11, $00, $02, $14, $99, $CB, $19, $99, $99, $99, $92, $BB, $BB, $B1, $29, $99
.db $2B, $BA, $22, $29, $99, $92, $02, $05, $BB, $19, $99, $BB, $A9, $99, $92, $BB
.db $A2, $22, $99, $99, $9B, $B1, $91, $CB, $BA, $02, $04, $99, $92, $BB, $A9, $99
.db $2B, $C9, $99, $1B, $BC, $02, $17, $99, $11, $00, $02, $3E, $88, $11, $00, $02
.db $14, $99, $1B, $A2, $99, $99, $99, $92, $BB, $BB, $A2, $99, $99, $AB, $B2, $99
.db $99, $22, $91, $BB, $1B, $BB, $BB, $BA, $99, $92, $BB, $29, $99, $9A, $BB, $29
.db $99, $92, $29, $2B, $B1, $CB, $BB, $A9, $02, $04, $99, $91, $BB, $29, $91, $BB
.db $B2, $99, $CB, $B2, $02, $17, $99, $11, $00, $02, $3E, $88, $11, $00, $02, $14
.db $99, $2B, $BB, $BB, $CA, $A2, $91, $BB, $BB, $BB, $11, $29, $AB, $BA, $AA, $BB
.db $BC, $2B, $BC, $92, $12, $9B, $BC, $99, $91, $BB, $99, $99, $9A, $BB, $AA, $AB
.db $BB, $C2, $1B, $BB, $BB, $B1, $02, $05, $99, $9B, $BB, $21, $BB, $BB, $C2, $91
.db $BB, $A9, $02, $17, $99, $11, $00, $02, $3E, $88, $11, $00, $02, $14, $99, $91
.db $BB, $BB, $BB, $BA, $91, $BB, $2A, $BB, $BB, $BB, $1B, $02, $04, $BB, $1B, $B1
.db $99, $99, $AB, $BA, $99, $92, $BB, $99, $99, $91, $02, $04, $BB, $B2, $1B, $BB
.db $BA, $29, $02, $05, $99, $2B, $BB, $BB, $BB, $BA, $29, $9C, $BB, $29, $02, $17
.db $99, $11, $00, $02, $3E, $88, $11, $00, $02, $15, $99, $21, $AB, $BB, $C2, $92
.db $BA, $99, $2A, $BB, $BB, $2A, $BB, $BB, $BA, $12, $9C, $C2, $99, $99, $1B, $A2
.db $99, $99, $CB, $A9, $99, $99, $AB, $BB, $BB, $A1, $29, $2B, $C1, $02, $07, $99
.db $9A, $BB, $BB, $B1, $29, $99, $9C, $BA, $02, $18, $99, $11, $00, $02, $3E, $88
.db $11, $00, $02, $17, $99, $29, $99, $99, $29, $99, $99, $21, $A1, $99, $22, $29
.db $02, $06, $99, $92, $99, $99, $99, $93, $99, $99, $99, $92, $22, $99, $99, $99
.db $92, $02, $09, $99, $39, $32, $99, $99, $99, $92, $12, $02, $18, $99, $11, $00
.db $02, $3E, $88, $11, $00, $02, $5E, $99, $11, $00, $02, $3E, $88, $11, $00, $02
.db $5E, $99, $11, $00, $02, $3E, $88, $11, $00, $02, $5E, $99, $11, $00, $02, $3E
.db $88, $11, $00, $02, $5E, $99, $11, $00, $02, $3E, $88, $11, $00, $02, $5E, $99
.db $11, $00, $02, $3E, $88, $11, $00, $02, $37, $99, $92, $22, $29, $02, $24, $99
.db $11, $00, $02, $3E, $88, $11, $00, $02, $09, $99, $DE, $D2, $02, $2A, $99, $9D
.db $DE, $77, $77, $7E, $29, $02, $23, $99, $11, $00, $02, $3E, $88, $11, $00, $02
.db $09, $99, $E7, $7E, $02, $29, $99, $9D, $02, $05, $77, $7D, $02, $23, $99, $11
.db $00, $02, $3E, $88, $11, $00, $02, $07, $99, $92, $DE, $77, $77, $29, $02, $04
.db $99, $2D, $DD, $D9, $99, $99, $2D, $DD, $D9, $99, $99, $99, $2D, $99, $99, $99
.db $D9, $99, $99, $99, $92, $99, $99, $92, $DD, $DD, $D9, $99, $99, $9D, $29, $99
.db $99, $99, $DD, $99, $99, $D7, $77, $77, $77, $66, $77, $7E, $99, $99, $99, $92
.db $02, $04, $99, $9D, $99, $99, $92, $99, $D2, $02, $05, $99, $9D, $02, $04, $99
.db $D2, $DD, $DE, $D9, $02, $07, $99, $11, $00, $02, $3E, $88, $11, $00, $02, $07
.db $99, $97, $77, $77, $77, $E9, $99, $99, $92, $DE, $77, $77, $7D, $92, $DE, $77
.db $77, $7D, $92, $DE, $77, $77, $E2, $99, $9E, $7E, $29, $99, $99, $D7, $E9, $DE
.db $77, $77, $77, $7E, $99, $99, $97, $7E, $99, $99, $99, $E7, $D9, $99, $E7, $77
.db $77, $66, $66, $77, $77, $29, $99, $99, $9E, $7E, $99, $99, $99, $D7, $E9, $99
.db $D7, $D9, $E7, $ED, $02, $04, $99, $EE, $99, $DE, $EE, $02, $04, $77, $72, $02
.db $07, $99, $11, $00, $02, $3E, $88, $11, $00, $02, $07, $99, $D7, $77, $77, $77
.db $69, $99, $9D, $E7, $02, $04, $77, $E7, $02, $08, $77, $E2, $99, $D7, $77, $E9
.db $99, $92, $E7, $02, $04, $77, $EE, $77, $D9, $99, $D7, $7E, $99, $99, $99, $E7
.db $79, $9E, $77, $77, $67, $66, $77, $77, $76, $A9, $99, $9D, $E7, $77, $99, $99
.db $99, $E7, $7E, $99, $E7, $72, $D7, $77, $7D, $99, $99, $9D, $77, $D9, $E7, $02
.db $05, $77, $7D, $02, $07, $99, $11, $00, $02, $3E, $88, $11, $00, $02, $07, $99
.db $77, $77, $67, $77, $62, $99, $D7, $77, $77, $76, $66, $67, $77, $77, $76, $66
.db $67, $77, $77, $76, $66, $6A, $29, $77, $77, $72, $99, $D7, $02, $04, $77, $66
.db $66, $77, $E9, $99, $E7, $76, $E9, $99, $99, $D7, $7E, $D7, $77, $66, $67, $77
.db $77, $77, $66, $69, $99, $E7, $77, $77, $E9, $99, $92, $77, $7E, $29, $77, $71
.db $E7, $67, $77, $E9, $99, $9D, $77, $E9, $D7, $77, $77, $77, $66, $66, $66, $29
.db $02, $06, $99, $11, $00, $02, $3E, $88, $11, $00, $02, $06, $99, $9D, $77, $76
.db $66, $77, $6D, $99, $E7, $77, $76, $66, $66, $67, $77, $76, $66, $66, $66, $77
.db $76, $66, $66, $6A, $2D, $77, $77, $7A, $9D, $77, $77, $76, $66, $67, $66, $77
.db $77, $61, $99, $77, $76, $A9, $99, $99, $D7, $76, $E7, $76, $66, $02, $04, $77
.db $66, $D9, $9D, $77, $77, $77, $69, $99, $9E, $77, $76, $12, $77, $66, $E7, $66
.db $67, $7E, $99, $9E, $77, $62, $9E, $66, $67, $76, $66, $66, $66, $D9, $02, $06
.db $99, $11, $00, $02, $3E, $88, $11, $00, $02, $06, $99, $9E, $77, $76, $6E, $77
.db $7E, $D9, $D7, $77, $77, $7E, $DD, $E7, $77, $77, $7E, $DD, $DD, $77, $76, $66
.db $E1, $D9, $97, $77, $77, $76, $E7, $77, $77, $76, $66, $67, $77, $77, $76, $61
.db $9D, $77, $66, $D9, $99, $99, $97, $77, $77, $66, $6D, $02, $04, $77, $6E, $99
.db $9E, $77, $76, $77, $62, $99, $27, $77, $76, $ED, $77, $66, $D7, $61, $66, $67
.db $D9, $97, $77, $6D, $9D, $66, $77, $76, $AD, $22, $29, $02, $07, $99, $11, $00
.db $02, $3E, $88, $11, $00, $02, $06, $99, $D7, $77, $66, $EE, $77, $77, $7D, $9E
.db $66, $77, $7E, $99, $9E, $66, $77, $7E, $99, $9D, $77, $77, $77, $7D, $99, $D7
.db $02, $06, $77, $76, $12, $E7, $77, $77, $76, $62, $9E, $77, $66, $99, $99, $99
.db $9E, $77, $77, $66, $1D, $77, $77, $66, $67, $7D, $99, $27, $77, $66, $77, $7D
.db $99, $E7, $77, $76, $DE, $77, $61, $D7, $62, $9D, $E7, $79, $D7, $76, $62, $99
.db $2D, $77, $66, $D9, $02, $09, $99, $11, $00, $02, $3E, $88, $11, $00, $02, $06
.db $99, $E7, $02, $05, $77, $7D, $91, $66, $66, $67, $D9, $91, $66, $66, $67, $D9
.db $9E, $77, $77, $77, $E2, $99, $E7, $76, $77, $77, $77, $66, $77, $76, $D9, $77
.db $77, $66, $77, $D9, $27, $77, $61, $99, $99, $99, $9D, $77, $76, $6E, $9E, $77
.db $66, $66, $66, $77, $D9, $E7, $76, $6E, $E7, $77, $E2, $77, $77, $76, $D7, $77
.db $6D, $E7, $6D, $99, $D7, $7D, $D7, $76, $69, $99, $9E, $77, $66, $02, $0A, $99
.db $11, $00, $02, $3E, $88, $11, $00, $02, $05, $99, $9D, $77, $76, $02, $04, $77
.db $66, $D9, $D1, $1A, $67, $E9, $99, $D1, $1A, $67, $E9, $D7, $77, $66, $66, $66
.db $2D, $77, $76, $67, $77, $66, $66, $77, $76, $D2, $77, $66, $66, $67, $E9, $D7
.db $76, $6D, $99, $99, $99, $9D, $77, $76, $62, $27, $77, $66, $A1, $E7, $77, $E9
.db $02, $05, $77, $DE, $77, $77, $76, $E7, $77, $62, $77, $6D, $DE, $77, $6A, $E7
.db $76, $19, $99, $97, $76, $61, $02, $0A, $99, $11, $00, $02, $3E, $88, $11, $00
.db $02, $05, $99, $9E, $77, $76, $66, $66, $67, $77, $6A, $29, $99, $2E, $77, $6D
.db $99, $99, $2E, $77, $6D, $E7, $76, $66, $66, $61, $9E, $77, $76, $1A, $66, $66
.db $6E, $77, $76, $9D, $77, $66, $6E, $77, $7D, $E7, $76, $62, $DD, $29, $99, $9E
.db $77, $66, $D9, $D7, $77, $61, $D7, $77, $77, $6E, $77, $67, $77, $77, $76, $67
.db $77, $76, $77, $77, $76, $6D, $77, $6E, $77, $7E, $66, $E7, $76, $D9, $99, $D7
.db $76, $62, $02, $0A, $99, $11, $00, $02, $3E, $88, $11, $00, $02, $05, $99, $27
.db $77, $66, $16, $66, $67, $77, $69, $9D, $DE, $77, $77, $61, $9D, $DE, $77, $77
.db $61, $E7, $76, $EE, $77, $7E, $9E, $77, $66, $22, $A6, $61, $2D, $77, $66, $97
.db $77, $6E, $77, $77, $7E, $E7, $77, $77, $77, $7E, $29, $D7, $77, $6A, $99, $E7
.db $02, $04, $77, $76, $67, $77, $66, $66, $67, $77, $67, $77, $66, $77, $77, $76
.db $AD, $77, $77, $77, $76, $6E, $D7, $76, $29, $99, $D7, $76, $E9, $02, $0A, $99
.db $11, $00, $02, $3E, $88, $11, $00, $02, $05, $99, $27, $77, $6A, $91, $1E, $77
.db $76, $69, $97, $77, $77, $E6, $61, $97, $77, $77, $E6, $61, $D7, $02, $04, $77
.db $2E, $77, $6A, $99, $92, $99, $9D, $77, $6A, $27, $02, $04, $77, $66, $D7, $02
.db $04, $77, $D9, $E7, $76, $62, $99, $E7, $02, $04, $77, $66, $67, $76, $61, $66
.db $77, $76, $EE, $77, $6A, $E7, $77, $66, $1D, $77, $77, $76, $66, $A9, $D7, $76
.db $29, $99, $27, $76, $29, $02, $0A, $99, $11, $00, $02, $3E, $88, $11, $00, $02
.db $05, $99, $9E, $76, $6D, $99, $99, $E7, $66, $62, $9E, $77, $E6, $66, $A9, $9E
.db $77, $E6, $66, $A9, $9E, $77, $77, $77, $66, $AD, $76, $62, $02, $04, $99, $E6
.db $61, $9E, $77, $77, $76, $66, $6A, $27, $77, $76, $66, $66, $E2, $E7, $66, $A9
.db $99, $D7, $77, $77, $76, $66, $66, $EE, $76, $A9, $2D, $D7, $76, $AD, $76, $6D
.db $26, $66, $6A, $92, $77, $66, $66, $61, $99, $97, $76, $29, $99, $9E, $76, $02
.db $0B, $99, $11, $00, $02, $3E, $88, $11, $00, $02, $05, $99, $92, $66, $62, $99
.db $99, $26, $66, $19, $99, $66, $66, $6A, $29, $99, $66, $66, $6A, $29, $9D, $02
.db $04, $66, $62, $E6, $A9, $02, $04, $99, $26, $62, $92, $02, $04, $66, $A2, $9D
.db $02, $04, $66, $61, $97, $66, $29, $99, $9E, $02, $04, $66, $AD, $92, $66, $19
.db $99, $9E, $66, $19, $16, $A9, $92, $66, $62, $99, $D6, $66, $61, $29, $99, $9D
.db $66, $29, $99, $92, $66, $02, $0B, $99, $11, $00, $02, $3E, $88, $11, $00, $02
.db $06, $99, $16, $D9, $99, $99, $9A, $61, $99, $99, $A6, $6A, $D9, $99, $99, $A6
.db $6A, $D9, $99, $99, $A6, $66, $66, $A1, $29, $D6, $D9, $02, $04, $99, $9E, $D9
.db $99, $A6, $66, $66, $12, $99, $99, $A6, $66, $11, $DD, $D2, $9A, $61, $99, $99
.db $92, $6A, $66, $6A, $12, $99, $99, $AA, $29, $99, $9D, $6A, $29, $26, $D9, $99
.db $21, $29, $99, $26, $AD, $02, $04, $99, $66, $29, $99, $99, $A6, $19, $02, $0A
.db $99, $11, $00, $02, $3E, $88, $11, $00, $02, $0E, $99, $92, $29, $99, $99, $99
.db $92, $29, $99, $99, $99, $92, $22, $99, $99, $99, $92, $02, $08, $99, $9D, $9D
.db $29, $99, $99, $99, $92, $29, $99, $99, $99, $92, $12, $99, $99, $99, $22, $9D
.db $29, $02, $07, $99, $29, $02, $07, $99, $92, $02, $05, $99, $29, $99, $99, $99
.db $9D, $02, $0B, $99, $11, $00, $02, $3E, $88, $11, $00, $02, $5E, $99, $11, $00
.db $02, $3E, $88, $11, $00, $02, $5E, $99, $11, $00, $02, $3E, $88, $11, $00, $02
.db $5E, $99, $11, $00, $02, $3E, $88, $11, $00, $02, $5E, $99, $11, $00, $02, $3E
.db $88, $11, $00, $02, $5E, $99, $11, $00, $02, $3E, $88, $11, $00, $02, $5E, $99
.db $11, $00, $02, $3E, $88, $11, $00, $02, $5E, $99, $11, $00, $02, $3E, $88, $11
.db $00, $02, $5E, $99, $11, $00, $02, $3E, $88, $11, $00, $02, $5E, $99, $11, $00
.db $02, $3E, $88, $11, $02, $61, $00, $02, $3E, $88, $11, $02, $5F, $00, $01, $00
.db $02, $3E, $88, $11, $00, $02, $5E, $88, $11, $00, $02, $3E, $88, $11, $00, $02
.db $5E, $88, $11, $00, $02, $3E, $88, $11, $00, $02, $5E, $88, $11, $00, $02, $3E
.db $88, $11, $00, $02, $5E, $88, $11, $00, $02, $3E, $88, $11, $00, $02, $5E, $88
.db $11, $00, $02, $3E, $88, $11, $00, $02, $5E, $88, $11, $00, $02, $3E, $88, $11
.db $00, $02, $04, $88, $89, $02, $04, $FF, $FA, $88, $88, $AF, $F1, $02, $07, $88
.db $8F, $FF, $98, $02, $12, $88, $89, $FF, $FF, $F9, $02, $30, $88, $11, $00, $02
.db $3E, $88, $11, $00, $02, $05, $88, $AF, $FF, $FF, $FF, $FA, $88, $88, $9F, $F8
.db $02, $07, $88, $81, $FA, $02, $13, $88, $AF, $FF, $FF, $FF, $C8, $02, $2F, $88
.db $11, $00, $02, $3E, $88, $11, $00, $02, $05, $88, $AF, $18, $02, $04, $88, $9F
.db $FF, $F8, $02, $07, $88, $81, $FA, $02, $05, $88, $FF, $FF, $F8, $88, $FF, $F9
.db $81, $FF, $F9, $8A, $FF, $A8, $88, $81, $FF, $A8, $88, $8A, $FF, $98, $88, $FF
.db $FF, $F8, $88, $9F, $FC, $02, $04, $88, $FF, $FF, $F8, $88, $2F, $FF, $FF, $FF
.db $18, $02, $1A, $88, $11, $00, $02, $3E, $88, $11, $00, $02, $05, $88, $AF, $18
.db $02, $04, $88, $9F, $FF, $F8, $88, $88, $9F, $FF, $FF, $FF, $F9, $81, $FA, $02
.db $04, $88, $1F, $FF, $FF, $FF, $18, $9F, $C8, $89, $FF, $C8, $82, $FA, $88, $88
.db $8F, $F1, $88, $88, $88, $22, $88, $1F, $FF, $FF, $FF, $18, $8A, $F2, $88, $88
.db $88, $1F, $FF, $FF, $FF, $18, $8C, $FF, $FF, $FF, $F9, $02, $1A, $88, $11, $00
.db $02, $3E, $88, $11, $00, $02, $05, $88, $AF, $FF, $FF, $F8, $88, $88, $88, $9F
.db $F8, $88, $88, $9F, $FF, $FF, $FF, $F9, $81, $FA, $88, $88, $88, $89, $FF, $18
.db $88, $1F, $F9, $8A, $F2, $8A, $FF, $F2, $8A, $F2, $88, $88, $9F, $F8, $02, $04
.db $88, $89, $FF, $18, $88, $1F, $F9, $8A, $F2, $88, $88, $89, $FF, $18, $88, $1F
.db $F9, $8C, $F9, $88, $8A, $F2, $02, $1A, $88, $11, $00, $02, $3E, $88, $11, $00
.db $02, $05, $88, $AF, $FF, $FF, $F8, $88, $88, $88, $9F, $F8, $02, $07, $88, $81
.db $FA, $88, $88, $88, $82, $FA, $88, $88, $8A, $F2, $89, $FC, $8F, $C2, $FA, $9F
.db $C8, $88, $88, $9F, $F8, $02, $04, $88, $82, $FA, $88, $88, $8A, $F2, $8A, $F2
.db $88, $88, $82, $FA, $88, $88, $8A, $F2, $8C, $FF, $FF, $FF, $F9, $02, $1A, $88
.db $11, $00, $02, $3E, $88, $11, $00, $02, $05, $88, $AF, $18, $02, $05, $88, $9F
.db $F8, $88, $88, $9F, $FF, $FF, $FF, $F9, $81, $FA, $88, $88, $88, $82, $FA, $88
.db $88, $8A, $F2, $88, $CF, $AF, $18, $CF, $AF, $28, $88, $88, $8F, $F1, $88, $88
.db $88, $29, $82, $FA, $88, $88, $8A, $F2, $8A, $F2, $88, $88, $82, $FA, $88, $88
.db $8A, $F2, $8C, $FF, $FF, $FF, $28, $02, $1A, $88, $11, $00, $02, $3E, $88, $11
.db $00, $02, $05, $88, $AF, $18, $02, $05, $88, $9F, $F8, $88, $88, $9F, $FF, $FF
.db $FF, $F9, $81, $FA, $88, $88, $88, $89, $FF, $18, $88, $1F, $F9, $88, $2F, $FF
.db $88, $1F, $FF, $88, $88, $88, $81, $FF, $A8, $88, $81, $FC, $89, $FF, $18, $88
.db $1F, $F9, $8A, $F2, $88, $88, $89, $FF, $18, $88, $1F, $F9, $8C, $F9, $8F, $F1
.db $02, $1B, $88, $11, $00, $02, $3E, $88, $11, $00, $02, $05, $88, $AF, $18, $02
.db $05, $88, $9F, $F8, $02, $07, $88, $81, $02, $04, $FF, $C8, $1F, $FF, $FF, $FF
.db $18, $88, $8F, $F1, $88, $8F, $F1, $02, $04, $88, $AF, $FF, $FF, $FF, $FA, $28
.db $1F, $FF, $FF, $FF, $18, $8A, $FF, $FF, $FF, $F8, $1F, $FF, $FF, $FF, $18, $8C
.db $F9, $88, $FF, $18, $02, $1A, $88, $11, $00, $02, $3E, $88, $11, $00, $02, $04
.db $88, $89, $FF, $F8, $02, $05, $88, $AF, $F1, $02, $07, $88, $8F, $02, $04, $FF
.db $C8, $88, $FF, $FF, $F8, $88, $88, $9F, $FC, $88, $2F, $FC, $02, $04, $88, $89
.db $FF, $FF, $F1, $88, $88, $88, $FF, $FF, $F8, $88, $9F, $FF, $FF, $FF, $F8, $88
.db $FF, $FF, $F8, $88, $2F, $FA, $88, $CF, $FC, $02, $1A, $88, $11, $00, $02, $3E
.db $88, $11, $00, $02, $5E, $88, $11, $00, $02, $3E, $88, $11, $00, $02, $5E, $88
.db $11, $00, $02, $3E, $88, $11, $00, $02, $5E, $88, $11, $00, $02, $3E, $88, $11
.db $00, $02, $5E, $88, $11, $00, $02, $3E, $88, $11, $00, $02, $5E, $88, $11, $00
.db $02, $3E, $88, $11, $00, $02, $5E, $88, $11, $00, $02, $3E, $88, $11, $00, $02
.db $04, $88, $89, $02, $04, $FF, $FA, $88, $8A, $FF, $FC, $02, $07, $88, $9F, $FF
.db $FF, $FF, $FC, $02, $22, $88, $9F, $FF, $FF, $98, $02, $1E, $88, $11, $00, $02
.db $3E, $88, $11, $00, $02, $05, $88, $AF, $FF, $FF, $FF, $FA, $89, $FF, $FF, $FF
.db $C8, $02, $06, $88, $8A, $02, $04, $FF, $C8, $02, $20, $88, $8A, $FF, $FF, $FF
.db $FC, $02, $1E, $88, $11, $00, $02, $3E, $88, $11, $00, $02, $05, $88, $AF, $18
.db $88, $88, $88, $9F, $F1, $88, $9F, $F9, $02, $06, $88, $8A, $F1, $88, $88, $9F
.db $F9, $9F, $FF, $FF, $FF, $F9, $FF, $F2, $88, $9F, $FF, $9F, $FF, $FF, $FF, $F9
.db $2F, $FF, $FF, $FF, $18, $88, $FF, $FF, $18, $89, $02, $04, $FF, $98, $88, $88
.db $1F, $FA, $88, $88, $AF, $F9, $88, $8F, $FF, $FF, $88, $89, $FF, $C8, $88, $88
.db $88, $8F, $FF, $FF, $88, $82, $FF, $FF, $FF, $F1, $02, $09, $88, $11, $00, $02
.db $3E, $88, $11, $00, $02, $05, $88, $AF, $18, $02, $04, $88, $A8, $88, $8F, $F9
.db $88, $9F, $FF, $FF, $FF, $F9, $8A, $F1, $88, $88, $9F, $F9, $8A, $FF, $FF, $FF
.db $F9, $9F, $F9, $88, $8F, $F9, $8A, $FF, $FF, $FF, $F9, $8C, $FF, $FF, $FF, $F9
.db $9F, $FF, $FF, $FF, $28, $AF, $FF, $FF, $FF, $98, $88, $88, $FF, $18, $88, $88
.db $82, $28, $81, $FF, $FF, $FF, $F1, $88, $AF, $28, $88, $88, $81, $FF, $FF, $FF
.db $F1, $88, $CF, $FF, $FF, $FF, $98, $02, $08, $88, $11, $00, $02, $3E, $88, $11
.db $00, $02, $05, $88, $AF, $FF, $FF, $F8, $88, $88, $88, $89, $FF, $F8, $88, $9F
.db $FF, $FF, $FF, $F9, $8A, $02, $04, $FF, $C8, $8A, $F2, $88, $88, $88, $81, $FA
.db $88, $1F, $18, $8A, $F2, $88, $88, $88, $8C, $F9, $88, $8A, $F2, $1F, $28, $88
.db $2C, $88, $AF, $28, $02, $04, $88, $89, $FF, $02, $05, $88, $9F, $F1, $88, $81
.db $FF, $98, $AF, $28, $88, $88, $9F, $F1, $88, $81, $FF, $98, $CF, $98, $88, $AF
.db $28, $02, $08, $88, $11, $00, $02, $3E, $88, $11, $00, $02, $05, $88, $AF, $FF
.db $FF, $F8, $88, $88, $82, $FF, $FF, $02, $07, $88, $8A, $02, $04, $FF, $88, $8A
.db $FF, $FF, $F2, $88, $88, $FF, $98, $FF, $88, $8A, $FF, $FF, $F2, $88, $8C, $FF
.db $FF, $FF, $F9, $2F, $FF, $FF, $18, $88, $AF, $FF, $FF, $28, $88, $88, $89, $FF
.db $02, $05, $88, $2F, $A8, $88, $88, $AF, $28, $AF, $28, $88, $88, $2F, $A8, $88
.db $88, $AF, $28, $CF, $FF, $FF, $FF, $98, $02, $08, $88, $11, $00, $02, $3E, $88
.db $11, $00, $02, $05, $88, $AF, $18, $02, $04, $88, $CF, $FF, $98, $88, $88, $9F
.db $FF, $FF, $FF, $F9, $8A, $F1, $88, $AF, $C8, $88, $8A, $FF, $FF, $F2, $88, $88
.db $1F, $A1, $F1, $88, $8A, $FF, $FF, $F2, $88, $8C, $FF, $FF, $FF, $28, $8A, $FF
.db $FF, $FF, $98, $AF, $FF, $FF, $28, $88, $88, $88, $FF, $18, $88, $88, $82, $98
.db $2F, $A8, $88, $88, $AF, $28, $AF, $28, $88, $88, $2F, $A8, $88, $88, $AF, $28
.db $CF, $FF, $FF, $F2, $02, $09, $88, $11, $00, $02, $3E, $88, $11, $00, $02, $05
.db $88, $AF, $18, $88, $88, $88, $8C, $FC, $02, $04, $88, $9F, $FF, $FF, $FF, $F9
.db $8A, $F1, $88, $8F, $FA, $88, $8A, $F2, $02, $04, $88, $8F, $FF, $F8, $88, $8A
.db $F2, $88, $88, $88, $8C, $F9, $8F, $F1, $88, $8F, $88, $88, $1F, $18, $AF, $28
.db $02, $05, $88, $1F, $FA, $88, $88, $1F, $C8, $9F, $F1, $88, $81, $FF, $98, $AF
.db $28, $88, $88, $9F, $F1, $88, $81, $FF, $98, $CF, $98, $FF, $18, $02, $09, $88
.db $11, $00, $02, $3E, $88, $11, $00, $02, $05, $88, $AF, $18, $88, $88, $88, $2F
.db $02, $04, $FF, $28, $02, $05, $88, $8A, $F1, $88, $89, $FF, $18, $8A, $FF, $FF
.db $FF, $F2, $88, $81, $FF, $28, $88, $8A, $FF, $FF, $FF, $F2, $8C, $F9, $88, $FF
.db $18, $2F, $FF, $FF, $FF, $28, $AF, $FF, $FF, $FF, $28, $88, $88, $8A, $02, $04
.db $FF, $A2, $81, $FF, $FF, $FF, $F1, $88, $AF, $FF, $FF, $FF, $81, $FF, $FF, $FF
.db $F1, $88, $CF, $98, $8F, $F1, $02, $09, $88, $11, $00, $02, $3E, $88, $11, $00
.db $02, $04, $88, $89, $FF, $F8, $88, $88, $88, $1F, $02, $04, $FF, $28, $02, $05
.db $88, $9F, $FF, $88, $88, $FF, $FA, $9F, $FF, $FF, $FF, $F2, $88, $8A, $FF, $A8
.db $88, $9F, $FF, $FF, $FF, $F2, $2F, $FA, $88, $CF, $FC, $88, $CF, $FF, $F9, $89
.db $02, $04, $FF, $28, $88, $88, $88, $9F, $FF, $FF, $18, $88, $88, $8F, $FF, $FF
.db $88, $89, $02, $04, $FF, $88, $8F, $FF, $FF, $88, $82, $FF, $A8, $8C, $FF, $C8
.db $02, $08, $88, $11, $00, $02, $3E, $88, $11, $00, $02, $5E, $88, $11, $00, $02
.db $3E, $88, $11, $00, $02, $5E, $88, $11, $00, $02, $3E, $88, $11, $00, $02, $5E
.db $88, $11, $00, $02, $3E, $88, $11, $00, $02, $5E, $88, $11, $00, $02, $3E, $88
.db $11, $00, $02, $5E, $88, $11, $00, $02, $3E, $88, $11, $00, $02, $5E, $88, $11
.db $00, $02, $3E, $88, $11, $00, $02, $04, $88, $89, $02, $04, $FF, $FA, $88, $88
.db $89, $FF, $FF, $98, $02, $05, $88, $9F, $FF, $FF, $FF, $FC, $02, $44, $88, $11
.db $00, $02, $3E, $88, $11, $00, $02, $05, $88, $AF, $FF, $FF, $FF, $FA, $88, $88
.db $82, $FF, $F2, $02, $06, $88, $8A, $02, $04, $FF, $A8, $02, $43, $88, $11, $00
.db $02, $3E, $88, $11, $00, $02, $05, $88, $AF, $18, $02, $05, $88, $9F, $FF, $F2
.db $02, $06, $88, $8A, $F1, $88, $88, $2F, $C8, $88, $8A, $FF, $18, $88, $88, $2F
.db $FF, $FC, $88, $2F, $FA, $88, $FF, $FA, $02, $34, $88, $11, $00, $02, $3E, $88
.db $11, $00, $02, $05, $88, $AF, $18, $02, $04, $88, $89, $FF, $2C, $F2, $88, $9F
.db $FF, $FF, $FF, $F9, $8A, $F1, $88, $88, $2F, $C8, $88, $82, $FF, $28, $88, $8A
.db $FF, $FF, $FF, $F2, $8C, $F9, $82, $FF, $02, $35, $88, $11, $00, $02, $3E, $88
.db $11, $00, $02, $05, $88, $AF, $FF, $FF, $F8, $88, $88, $8F, $F1, $8C, $F2, $88
.db $9F, $FF, $FF, $FF, $F9, $8A, $02, $04, $FF, $98, $88, $8F, $FF, $C8, $88, $9F
.db $F1, $88, $88, $18, $8C, $F9, $CF, $18, $02, $35, $88, $11, $00, $02, $3E, $88
.db $11, $00, $02, $05, $88, $AF, $FF, $FF, $F8, $88, $88, $FF, $18, $8C, $F2, $02
.db $06, $88, $8A, $02, $04, $FF, $A8, $88, $1F, $2C, $F2, $88, $1F, $18, $88, $88
.db $88, $8C, $FF, $FC, $02, $36, $88, $11, $00, $02, $3E, $88, $11, $00, $02, $05
.db $88, $AF, $18, $88, $88, $88, $8C, $FA, $88, $8C, $F2, $88, $9F, $FF, $FF, $FF
.db $F9, $8A, $F1, $88, $88, $8F, $F9, $88, $FA, $82, $FF, $88, $1F, $18, $88, $88
.db $98, $8C, $FC, $AF, $A8, $02, $35, $88, $11, $00, $02, $3E, $88, $11, $00, $02
.db $05, $88, $AF, $18, $88, $88, $88, $2F, $02, $04, $FF, $18, $9F, $FF, $FF, $FF
.db $F9, $8A, $F1, $88, $88, $8F, $F2, $81, $FF, $FF, $FF, $18, $9F, $F1, $88, $8A
.db $C8, $8C, $F9, $8A, $FA, $02, $35, $88, $11, $00, $02, $3E, $88, $11, $00, $02
.db $05, $88, $AF, $18, $88, $88, $88, $2F, $02, $04, $FF, $18, $02, $05, $88, $8A
.db $02, $04, $FF, $F8, $8F, $FF, $FF, $FF, $F9, $8A, $FF, $FF, $FF, $F2, $8C, $F9
.db $88, $CF, $A8, $02, $34, $88, $11, $00, $02, $3E, $88, $11, $00, $02, $04, $88
.db $89, $FF, $F8, $02, $06, $88, $2F, $FC, $02, $06, $88, $9F, $02, $04, $FF, $88
.db $FF, $C8, $88, $2F, $FF, $88, $2F, $FF, $FC, $88, $2F, $FA, $88, $AF, $FF, $02
.db $34, $88, $11, $00, $02, $3E, $88, $11, $00, $02, $5E, $88, $11, $00, $02, $3E
.db $88, $11, $00, $02, $5E, $88, $11, $00, $02, $3E, $88, $11, $00, $02, $5E, $88
.db $11, $00, $02, $3E, $88, $11, $00, $02, $5E, $88, $11, $00, $02, $3E, $88, $11
.db $00, $02, $5E, $88, $11, $00, $02, $3E, $88, $11, $00, $02, $5E, $88, $11, $00
.db $02, $3E, $88, $11, $00, $02, $04, $88, $89, $02, $04, $FF, $FA, $9F, $FF, $FF
.db $FF, $FA, $02, $06, $88, $9F, $02, $04, $FF, $98, $02, $43, $88, $11, $00, $02
.db $3E, $88, $11, $00, $02, $05, $88, $AF, $FF, $FF, $FF, $FA, $8A, $FF, $FF, $FF
.db $FA, $02, $06, $88, $8A, $02, $04, $FF, $98, $02, $43, $88, $11, $00, $02, $3E
.db $88, $11, $00, $02, $05, $88, $AF, $18, $88, $88, $88, $8A, $F9, $02, $09, $88
.db $8A, $F1, $88, $88, $88, $8C, $FF, $F9, $8F, $FF, $C1, $FF, $1F, $FF, $FF, $FF
.db $C8, $02, $38, $88, $11, $00, $02, $3E, $88, $11, $00, $02, $05, $88, $AF, $18
.db $88, $88, $88, $2F, $FC, $FF, $FF, $18, $88, $9F, $FF, $FF, $FF, $F9, $8A, $F1
.db $02, $04, $88, $2F, $F8, $8C, $F2, $88, $FF, $8F, $FF, $FF, $FF, $C8, $02, $38
.db $88, $11, $00, $02, $3E, $88, $11, $00, $02, $05, $88, $AF, $FF, $FF, $F8, $88
.db $89, $FF, $FF, $FF, $FC, $88, $9F, $FF, $FF, $FF, $F9, $8A, $FF, $FF, $FA, $88
.db $88, $81, $FF, $CF, $18, $88, $FF, $88, $89, $FC, $02, $3A, $88, $11, $00, $02
.db $3E, $88, $11, $00, $02, $05, $88, $AF, $FF, $FF, $F8, $88, $88, $81, $88, $82
.db $FF, $28, $02, $05, $88, $8A, $FF, $FF, $FA, $88, $88, $88, $AF, $F1, $88, $88
.db $FF, $88, $89, $FC, $02, $3A, $88, $11, $00, $02, $3E, $88, $11, $00, $02, $05
.db $88, $AF, $18, $02, $04, $88, $18, $88, $88, $CF, $18, $9F, $FF, $FF, $FF, $F9
.db $8A, $F1, $02, $05, $88, $AF, $FA, $88, $88, $FF, $88, $89, $FC, $02, $3A, $88
.db $11, $00, $02, $3E, $88, $11, $00, $02, $05, $88, $AF, $18, $88, $88, $88, $8A
.db $F1, $88, $82, $FF, $28, $9F, $FF, $FF, $FF, $F9, $8A, $F1, $02, $04, $88, $8A
.db $FA, $CF, $A8, $88, $FF, $88, $89, $FC, $02, $3A, $88, $11, $00, $02, $3E, $88
.db $11, $00, $02, $05, $88, $AF, $18, $88, $88, $88, $2F, $FF, $FF, $FF, $FA, $02
.db $06, $88, $8A, $02, $04, $FF, $28, $AF, $A8, $8C, $F1, $88, $FF, $88, $89, $FC
.db $02, $3A, $88, $11, $00, $02, $3E, $88, $11, $00, $02, $04, $88, $89, $FF, $F8
.db $02, $04, $88, $9F, $FF, $FF, $18, $02, $06, $88, $9F, $02, $04, $FF, $2F, $FF
.db $A8, $8C, $FF, $F1, $FF, $18, $8A, $FF, $28, $02, $39, $88, $11, $00, $02, $3E
.db $88, $11, $00, $02, $5E, $88, $11, $00, $02, $3E, $88, $11, $00, $02, $5E, $88
.db $11, $00, $02, $3E, $88, $11, $00, $02, $5E, $88, $11, $00, $02, $3E, $88, $11
.db $00, $02, $5E, $88, $11, $00, $02, $3E, $88, $11, $00, $02, $5E, $88, $11, $00
.db $02, $3E, $88, $11, $00, $02, $5E, $88, $11, $00, $02, $3E, $88, $11, $00, $02
.db $04, $88, $82, $FF, $C8, $88, $8A, $FF, $28, $02, $0A, $88, $9F, $FF, $FF, $FF
.db $F2, $02, $22, $88, $8A, $FF, $A8, $02, $1F, $88, $11, $00, $02, $3E, $88, $11
.db $00, $02, $05, $88, $CF, $28, $88, $89, $FC, $02, $0B, $88, $8A, $02, $04, $FF
.db $98, $02, $21, $88, $89, $FF, $98, $02, $1F, $88, $11, $00, $02, $3E, $88, $11
.db $00, $02, $05, $88, $CF, $28, $88, $89, $FC, $82, $FF, $FF, $FF, $F1, $02, $06
.db $88, $8A, $F1, $88, $88, $CF, $12, $FF, $FF, $FF, $F1, $89, $02, $04, $FF, $9F
.db $FF, $28, $89, $FF, $F1, $FF, $18, $88, $FF, $FF, $F8, $88, $1F, $F1, $88, $2F
.db $F1, $88, $FF, $FF, $18, $88, $88, $89, $FF, $98, $2F, $FC, $88, $8A, $FF, $28
.db $88, $8A, $FF, $18, $88, $88, $8F, $FF, $FC, $88, $89, $02, $04, $FF, $98, $02
.db $09, $88, $11, $00, $02, $3E, $88, $11, $00, $02, $05, $88, $CF, $28, $88, $89
.db $FC, $88, $CF, $FF, $FF, $FF, $18, $9F, $FF, $FF, $FF, $F9, $8A, $F1, $88, $88
.db $CF, $18, $CF, $FF, $FF, $FF, $98, $AF, $FF, $FF, $FF, $99, $FF, $98, $88, $FF
.db $98, $FF, $88, $1F, $FF, $FF, $FF, $18, $8F, $F8, $88, $8C, $F8, $9F, $FF, $FF
.db $FF, $28, $88, $89, $FF, $98, $8F, $FA, $88, $8A, $FF, $88, $88, $82, $FF, $28
.db $88, $82, $FF, $FF, $FF, $F1, $88, $AF, $FF, $FF, $FF, $98, $02, $09, $88, $11
.db $00, $02, $3E, $88, $11, $00, $02, $05, $88, $CF, $28, $88, $89, $FC, $88, $CF
.db $98, $88, $2F, $A8, $9F, $FF, $FF, $FF, $F9, $8A, $02, $04, $FF, $98, $CF, $98
.db $88, $AF, $28, $AF, $28, $88, $88, $88, $1F, $A8, $81, $F1, $88, $FF, $89, $FF
.db $18, $88, $1F, $F9, $8F, $F8, $88, $8C, $F8, $1F, $28, $88, $2C, $88, $88, $89
.db $FF, $98, $8F, $FF, $28, $9F, $FF, $88, $88, $8F, $FF, $C8, $88, $8F, $F1, $88
.db $88, $C8, $88, $AF, $28, $02, $0C, $88, $11, $00, $02, $3E, $88, $11, $00, $02
.db $05, $88, $CF, $28, $88, $89, $FC, $88, $CF, $98, $88, $2F, $A8, $02, $05, $88
.db $8A, $FF, $FF, $FF, $F2, $88, $CF, $FF, $FF, $FF, $98, $AF, $FF, $FF, $28, $88
.db $8F, $F9, $8F, $F8, $88, $FF, $82, $FA, $88, $88, $8A, $F2, $8F, $F8, $88, $8C
.db $F8, $2F, $FF, $FF, $18, $88, $88, $89, $FF, $98, $8F, $CF, $C8, $CC, $FF, $88
.db $88, $1F, $2C, $F2, $88, $2F, $A8, $8F, $FF, $FF, $28, $AF, $FF, $FF, $28, $02
.db $0A, $88, $11, $00, $02, $3E, $88, $11, $00, $02, $05, $88, $CF, $28, $88, $89
.db $FC, $88, $CF, $FF, $FF, $FF, $18, $9F, $FF, $FF, $FF, $F9, $8A, $F1, $02, $04
.db $88, $CF, $FF, $FF, $F2, $88, $AF, $FF, $FF, $28, $88, $81, $FA, $1F, $18, $88
.db $FF, $82, $FA, $88, $88, $8A, $F2, $8F, $F8, $88, $8C, $F8, $8A, $FF, $FF, $FF
.db $98, $88, $89, $FF, $98, $8F, $C1, $FA, $F2, $FF, $88, $88, $FA, $82, $FF, $88
.db $2F, $A8, $8F, $FF, $FC, $88, $AF, $FF, $FF, $28, $02, $0A, $88, $11, $00, $02
.db $3E, $88, $11, $00, $02, $05, $88, $CF, $F8, $88, $8C, $FC, $88, $CF, $FF, $FF
.db $F1, $88, $9F, $FF, $FF, $FF, $F9, $8A, $F1, $02, $04, $88, $CF, $98, $FF, $18
.db $88, $AF, $28, $02, $04, $88, $FF, $FF, $88, $88, $FF, $89, $FF, $18, $88, $1F
.db $F9, $8F, $F2, $88, $9F, $F8, $8F, $88, $88, $1F, $18, $88, $89, $FF, $98, $8F
.db $C8, $FF, $A8, $FF, $88, $81, $FF, $FF, $FF, $18, $9F, $F1, $88, $88, $AC, $88
.db $AF, $28, $02, $0C, $88, $11, $00, $02, $3E, $88, $11, $00, $02, $05, $88, $2F
.db $FF, $FF, $FF, $F2, $88, $CF, $98, $02, $08, $88, $8A, $F1, $02, $04, $88, $CF
.db $98, $8F, $F1, $88, $AF, $FF, $FF, $FF, $28, $88, $1F, $F2, $88, $88, $FF, $88
.db $1F, $FF, $FF, $FF, $18, $8C, $FF, $FF, $FF, $C8, $2F, $FF, $FF, $FF, $28, $88
.db $89, $FF, $98, $8F, $C8, $1F, $98, $FF, $88, $8F, $FF, $FF, $FF, $F9, $81, $02
.db $04, $FF, $28, $AF, $FF, $FF, $FF, $28, $02, $09, $88, $11, $00, $02, $3E, $88
.db $11, $00, $02, $05, $88, $89, $FF, $FF, $FF, $98, $82, $FF, $A8, $02, $08, $88
.db $9F, $FF, $88, $88, $88, $82, $FF, $A8, $8C, $FF, $C9, $02, $04, $FF, $28, $88
.db $AF, $FA, $88, $81, $FF, $18, $88, $FF, $FF, $F8, $88, $88, $CF, $FF, $FC, $88
.db $88, $CF, $FF, $F9, $88, $88, $8A, $FF, $A8, $2F, $F9, $81, $82, $FF, $28, $FF
.db $C8, $88, $2F, $FF, $88, $9F, $FF, $FF, $F8, $89, $02, $04, $FF, $28, $02, $09
.db $88, $11, $00, $02, $3E, $88, $11, $00, $02, $5E, $88, $11, $00, $02, $3E, $88
.db $11, $00, $02, $5E, $88, $11, $00, $02, $3E, $88, $11, $00, $02, $5E, $88, $11
.db $00, $02, $3E, $88, $11, $00, $02, $5E, $88, $11, $00, $02, $3E, $88, $11, $00
.db $02, $5E, $88, $11, $00, $02, $3E, $88, $11, $00, $02, $5E, $88, $11, $00, $02
.db $3E, $88, $11, $00, $02, $05, $88, $02, $04, $FF, $C8, $02, $18, $88, $89, $FF
.db $F2, $88, $88, $CF, $F9, $02, $10, $88, $8A, $FF, $A8, $02, $22, $88, $11, $00
.db $02, $3E, $88, $11, $00, $02, $05, $88, $1F, $02, $04, $FF, $98, $02, $18, $88
.db $AF, $F1, $88, $88, $2F, $A8, $02, $10, $88, $89, $FF, $98, $02, $22, $88, $11
.db $00, $02, $3E, $88, $11, $00, $02, $05, $88, $1F, $A8, $88, $89, $FF, $C8, $88
.db $8F, $FF, $FF, $88, $8F, $FF, $98, $1F, $FF, $98, $AF, $FF, $FF, $C8, $88, $1F
.db $F2, $02, $06, $88, $AF, $FF, $18, $88, $2F, $A8, $9F, $FF, $FF, $FF, $F9, $CF
.db $FF, $98, $FF, $FC, $FF, $FF, $FF, $FC, $88, $88, $89, $FF, $98, $2F, $FC, $88
.db $8A, $FF, $28, $88, $8A, $FF, $18, $88, $88, $8F, $FF, $FC, $88, $89, $02, $04
.db $FF, $98, $02, $0C, $88, $11, $00, $02, $3E, $88, $11, $00, $02, $05, $88, $1F
.db $A8, $88, $88, $9F, $F9, $81, $FF, $FF, $FF, $F1, $89, $FC, $88, $9F, $FC, $88
.db $2F, $A8, $CF, $F9, $88, $8F, $C8, $89, $02, $04, $FF, $98, $AF, $AF, $F1, $88
.db $2F, $A8, $8A, $FF, $FF, $FF, $F9, $82, $FF, $88, $CF, $28, $FF, $FF, $FF, $FC
.db $88, $88, $89, $FF, $98, $8F, $FA, $88, $8A, $FF, $88, $88, $82, $FF, $28, $88
.db $82, $FF, $FF, $FF, $F1, $88, $AF, $FF, $FF, $FF, $98, $02, $0C, $88, $11, $00
.db $02, $3E, $88, $11, $00, $02, $05, $88, $1F, $A8, $88, $88, $8F, $F2, $9F, $F1
.db $88, $81, $FF, $98, $AF, $28, $AF, $FF, $28, $AF, $28, $CF, $FF, $28, $8F, $C8
.db $89, $02, $04, $FF, $98, $AF, $22, $FF, $18, $2F, $A8, $8A, $F2, $02, $04, $88
.db $1F, $FC, $F1, $88, $88, $9F, $C8, $88, $88, $88, $89, $FF, $98, $8F, $FF, $28
.db $9F, $FF, $88, $88, $8F, $FF, $C8, $88, $8F, $F1, $88, $88, $C8, $88, $AF, $28
.db $02, $0F, $88, $11, $00, $02, $3E, $88, $11, $00, $02, $05, $88, $1F, $A8, $88
.db $88, $8F, $F2, $2F, $A8, $88, $88, $AF, $28, $9F, $C8, $FC, $2F, $A9, $FC, $88
.db $CF, $2F, $F2, $8F, $C8, $02, $06, $88, $AF, $28, $2F, $F1, $2F, $A8, $8A, $FF
.db $FF, $F2, $88, $88, $8A, $FF, $18, $88, $88, $9F, $C8, $88, $88, $88, $89, $FF
.db $98, $8F, $CF, $C8, $CC, $FF, $88, $88, $1F, $2C, $F2, $88, $2F, $A8, $8F, $FF
.db $FF, $28, $AF, $FF, $FF, $28, $02, $0D, $88, $11, $00, $02, $3E, $88, $11, $00
.db $02, $05, $88, $1F, $A8, $88, $88, $9F, $F9, $2F, $A8, $88, $88, $AF, $28, $8C
.db $FA, $F1, $8C, $FA, $F2, $88, $CF, $89, $FF, $1F, $C8, $89, $02, $04, $FF, $98
.db $AF, $28, $82, $FF, $CF, $A8, $8A, $FF, $FF, $F2, $88, $88, $8A, $FF, $A8, $88
.db $88, $9F, $C8, $88, $88, $88, $89, $FF, $98, $8F, $C1, $FA, $F2, $FF, $88, $88
.db $FA, $82, $FF, $88, $2F, $A8, $8F, $FF, $FC, $88, $AF, $FF, $FF, $28, $02, $0D
.db $88, $11, $00, $02, $3E, $88, $11, $00, $02, $05, $88, $1F, $A8, $88, $89, $FF
.db $C8, $9F, $F1, $88, $81, $FF, $98, $82, $FF, $F8, $81, $FF, $F8, $88, $CF, $88
.db $8F, $FF, $C8, $89, $02, $04, $FF, $98, $AF, $28, $88, $2F, $FF, $A8, $8A, $F2
.db $02, $04, $88, $AF, $AC, $FA, $88, $88, $9F, $C8, $88, $88, $88, $89, $FF, $98
.db $8F, $C8, $FF, $A8, $FF, $88, $81, $FF, $FF, $FF, $18, $9F, $F1, $88, $88, $AC
.db $88, $AF, $28, $02, $0F, $88, $11, $00, $02, $3E, $88, $11, $00, $02, $05, $88
.db $1F, $02, $04, $FF, $98, $81, $FF, $FF, $FF, $F1, $88, $88, $FF, $18, $88, $FF
.db $18, $88, $CF, $88, $88, $FF, $C8, $02, $06, $88, $AF, $28, $88, $82, $FF, $A8
.db $8A, $FF, $FF, $FF, $F2, $8A, $FA, $88, $CF, $18, $88, $9F, $C8, $88, $88, $88
.db $89, $FF, $98, $8F, $C8, $1F, $98, $FF, $88, $8F, $FF, $FF, $FF, $F9, $81, $02
.db $04, $FF, $28, $AF, $FF, $FF, $FF, $28, $02, $0C, $88, $11, $00, $02, $3E, $88
.db $11, $00, $02, $05, $88, $02, $04, $FF, $C8, $88, $88, $8F, $FF, $FF, $88, $88
.db $89, $FF, $C8, $82, $FF, $C8, $82, $FF, $18, $88, $AF, $F2, $02, $05, $88, $89
.db $FF, $C8, $88, $88, $FF, $F9, $9F, $FF, $FF, $FF, $F2, $FF, $FA, $88, $CF, $FF
.db $88, $AF, $F2, $88, $88, $88, $8A, $FF, $A8, $2F, $F9, $81, $82, $FF, $28, $FF
.db $C8, $88, $2F, $FF, $88, $9F, $FF, $FF, $F8, $89, $02, $04, $FF, $28, $02, $0C
.db $88, $11, $00, $02, $3E, $88, $11, $00, $02, $5E, $88, $11, $00, $02, $3E, $88
.db $11, $00, $02, $5E, $88, $11, $00, $02, $3E, $88, $11, $00, $02, $5E, $88, $11
.db $00, $02, $3E, $88, $11, $00, $02, $5E, $88, $11, $00, $02, $3E, $88, $11, $00
.db $02, $5E, $88, $11, $00, $02, $3E, $88, $11, $00, $02, $5E, $88, $11, $00, $02
.db $3E, $88, $11, $00, $02, $05, $88, $FF, $F9, $02, $17, $88, $82, $FF, $FF, $C8
.db $02, $1C, $88, $FF, $F9, $02, $1E, $88, $11, $00, $02, $3E, $88, $11, $00, $02
.db $05, $88, $1F, $A8, $02, $17, $88, $1F, $FF, $FF, $FF, $F8, $02, $1B, $88, $1F
.db $A8, $02, $1E, $88, $11, $00, $02, $3E, $88, $11, $00, $02, $05, $88, $1F, $A8
.db $88, $88, $88, $9F, $FF, $FF, $FF, $F9, $2F, $FF, $FF, $FF, $AF, $FF, $FF, $FF
.db $C8, $02, $06, $88, $CF, $28, $88, $2F, $18, $88, $2F, $FF, $FC, $88, $2F, $FF
.db $FF, $FF, $18, $88, $8F, $FF, $FF, $88, $89, $FF, $C8, $88, $88, $9F, $FC, $02
.db $05, $88, $1F, $A8, $88, $88, $88, $9F, $FF, $FF, $FF, $F9, $2F, $FF, $FF, $FF
.db $AF, $FF, $FF, $FF, $C8, $02, $0D, $88, $11, $00, $02, $3E, $88, $11, $00, $02
.db $05, $88, $1F, $A8, $88, $88, $88, $8A, $FF, $FF, $FF, $F9, $8C, $FF, $FF, $FF
.db $AF, $FF, $FF, $FF, $C8, $89, $02, $04, $FF, $98, $FF, $98, $88, $89, $88, $8A
.db $FF, $FF, $FF, $F2, $8C, $FF, $FF, $FF, $F9, $81, $FF, $FF, $FF, $F1, $88, $AF
.db $28, $88, $88, $8A, $F2, $02, $05, $88, $1F, $A8, $88, $88, $88, $8A, $FF, $FF
.db $FF, $F9, $8C, $FF, $FF, $FF, $AF, $FF, $FF, $FF, $C8, $02, $0D, $88, $11, $00
.db $02, $3E, $88, $11, $00, $02, $05, $88, $1F, $A8, $88, $88, $88, $8A, $F2, $88
.db $88, $88, $8C, $F9, $88, $88, $88, $89, $FC, $88, $88, $89, $02, $04, $FF, $98
.db $1F, $FF, $FF, $F1, $88, $9F, $F1, $88, $88, $18, $8C, $F9, $88, $8A, $F2, $9F
.db $F1, $88, $81, $FF, $98, $AF, $28, $88, $88, $8A, $F2, $02, $05, $88, $1F, $A8
.db $88, $88, $88, $8A, $F2, $88, $88, $88, $8C, $F9, $88, $88, $88, $89, $FC, $02
.db $0F, $88, $11, $00, $02, $3E, $88, $11, $00, $02, $05, $88, $1F, $A8, $88, $88
.db $88, $8A, $FF, $FF, $F2, $88, $8C, $FF, $FF, $C8, $88, $89, $FC, $02, $08, $88
.db $82, $FF, $FF, $FF, $C8, $1F, $18, $88, $88, $88, $8C, $FF, $FF, $FF, $F9, $2F
.db $A8, $88, $88, $AF, $28, $AF, $28, $88, $88, $8A, $F2, $02, $05, $88, $1F, $A8
.db $88, $88, $88, $8A, $FF, $FF, $F2, $88, $8C, $FF, $FF, $C8, $88, $89, $FC, $02
.db $0F, $88, $11, $00, $02, $3E, $88, $11, $00, $02, $05, $88, $1F, $A8, $88, $88
.db $88, $8A, $FF, $FF, $F2, $88, $8C, $FF, $FF, $C8, $88, $89, $FC, $88, $88, $89
.db $02, $04, $FF, $98, $82, $88, $88, $8F, $F2, $1F, $18, $88, $88, $98, $8C, $FF
.db $FF, $FF, $28, $2F, $A8, $88, $88, $AF, $28, $AF, $28, $88, $88, $8A, $F2, $02
.db $05, $88, $1F, $A8, $88, $88, $88, $8A, $FF, $FF, $F2, $88, $8C, $FF, $FF, $C8
.db $88, $89, $FC, $02, $0F, $88, $11, $00, $02, $3E, $88, $11, $00, $02, $05, $88
.db $1F, $A8, $88, $88, $88, $8A, $F2, $88, $88, $88, $8C, $F9, $88, $88, $88, $89
.db $FC, $88, $88, $89, $02, $04, $FF, $98, $1F, $18, $88, $9F, $F9, $9F, $F1, $88
.db $8A, $C8, $8C, $F9, $8F, $F1, $88, $9F, $F1, $88, $81, $FF, $98, $AF, $28, $88
.db $88, $8A, $F2, $02, $05, $88, $1F, $A8, $88, $88, $88, $8A, $F2, $88, $88, $88
.db $8C, $F9, $88, $88, $88, $89, $FC, $02, $0F, $88, $11, $00, $02, $3E, $88, $11
.db $00, $02, $05, $88, $1F, $FF, $FF, $FF, $FC, $8A, $FF, $FF, $FF, $F2, $8C, $F9
.db $88, $88, $88, $89, $FC, $02, $08, $88, $CF, $FF, $FF, $FF, $C8, $8A, $FF, $FF
.db $FF, $F2, $8C, $F9, $88, $FF, $18, $81, $FF, $FF, $FF, $F1, $88, $AF, $FF, $FF
.db $FF, $8A, $FF, $FF, $FF, $F8, $88, $88, $1F, $FF, $FF, $FF, $FC, $8A, $FF, $FF
.db $FF, $F2, $8C, $F9, $88, $88, $88, $89, $FC, $02, $0F, $88, $11, $00, $02, $3E
.db $88, $11, $00, $02, $05, $88, $02, $04, $FF, $FC, $9F, $FF, $FF, $FF, $F2, $2F
.db $FA, $88, $88, $88, $8A, $FF, $28, $02, $08, $88, $AF, $FF, $F1, $88, $88, $2F
.db $FF, $FC, $88, $2F, $FA, $88, $CF, $FC, $88, $8F, $FF, $FF, $88, $89, $02, $04
.db $FF, $9F, $FF, $FF, $FF, $F8, $88, $88, $02, $04, $FF, $FC, $9F, $FF, $FF, $FF
.db $F2, $2F, $FA, $88, $88, $88, $8A, $FF, $28, $02, $0E, $88, $11, $00, $02, $3E
.db $88, $11, $00, $02, $5E, $88, $11, $00, $02, $3E, $88, $11, $00, $02, $5E, $88
.db $11, $00, $02, $3E, $88, $11, $00, $02, $5E, $88, $11, $00, $02, $3E, $88, $11
.db $00, $02, $5E, $88, $11, $00, $02, $3E, $88, $11, $00, $02, $5E, $88, $11, $00
.db $02, $3E, $88, $11, $00, $02, $5E, $88, $11, $00, $02, $3E, $88, $11, $00, $02
.db $04, $88, $89, $02, $04, $FF, $C8, $02, $18, $88, $82, $FF, $FF, $C8, $02, $1B
.db $88, $89, $02, $04, $FF, $C8, $02, $17, $88, $11, $00, $02, $3E, $88, $11, $00
.db $02, $05, $88, $AF, $FF, $FF, $FF, $FC, $02, $18, $88, $1F, $FF, $FF, $FF, $F8
.db $02, $1B, $88, $AF, $FF, $FF, $FF, $FC, $02, $17, $88, $11, $00, $02, $3E, $88
.db $11, $00, $02, $05, $88, $AF, $18, $88, $89, $FF, $91, $FF, $18, $88, $FF, $FF
.db $C8, $88, $2F, $FA, $88, $8A, $FF, $2F, $FF, $FF, $FF, $C8, $02, $06, $88, $CF
.db $28, $88, $2F, $18, $88, $2F, $FF, $FC, $88, $2F, $FF, $FF, $FF, $18, $88, $8F
.db $FF, $FF, $88, $89, $FF, $C8, $88, $88, $9F, $FC, $02, $05, $88, $AF, $18, $88
.db $89, $FF, $91, $FF, $18, $88, $FF, $FF, $C8, $88, $2F, $FA, $88, $8A, $FF, $2F
.db $FF, $FF, $FF, $C8, $02, $05, $88, $11, $00, $02, $3E, $88, $11, $00, $02, $05
.db $88, $AF, $18, $88, $89, $FF, $98, $FF, $88, $2F, $FF, $FF, $FF, $18, $8C, $F9
.db $88, $89, $FC, $8F, $FF, $FF, $FF, $C8, $89, $02, $04, $FF, $98, $FF, $98, $88
.db $89, $88, $8A, $FF, $FF, $FF, $F2, $8C, $FF, $FF, $FF, $F9, $81, $FF, $FF, $FF
.db $F1, $88, $AF, $28, $88, $88, $8A, $F2, $02, $05, $88, $AF, $18, $88, $89, $FF
.db $98, $FF, $88, $2F, $FF, $FF, $FF, $18, $8C, $F9, $88, $89, $FC, $8F, $FF, $FF
.db $FF, $C8, $02, $05, $88, $11, $00, $02, $3E, $88, $11, $00, $02, $05, $88, $AF
.db $FF, $FF, $FF, $FC, $88, $FF, $88, $FF, $18, $88, $8C, $88, $8C, $F9, $88, $89
.db $FC, $88, $89, $FC, $88, $88, $89, $02, $04, $FF, $98, $1F, $FF, $FF, $F1, $88
.db $9F, $F1, $88, $88, $18, $8C, $F9, $88, $8A, $F2, $9F, $F1, $88, $81, $FF, $98
.db $AF, $28, $88, $88, $8A, $F2, $02, $05, $88, $AF, $FF, $FF, $FF, $FC, $88, $FF
.db $88, $FF, $18, $88, $8C, $88, $8C, $F9, $88, $89, $FC, $88, $89, $FC, $02, $07
.db $88, $11, $00, $02, $3E, $88, $11, $00, $02, $05, $88, $AF, $FF, $FF, $FF, $F8
.db $88, $FF, $82, $FA, $88, $FF, $FF, $F2, $8C, $FF, $FF, $FF, $FC, $88, $89, $FC
.db $02, $08, $88, $82, $FF, $FF, $FF, $C8, $1F, $18, $88, $88, $88, $8C, $FF, $FF
.db $FF, $F9, $2F, $A8, $88, $88, $AF, $28, $AF, $28, $88, $88, $8A, $F2, $02, $05
.db $88, $AF, $FF, $FF, $FF, $F8, $88, $FF, $82, $FA, $88, $FF, $FF, $F2, $8C, $FF
.db $FF, $FF, $FC, $88, $89, $FC, $02, $07, $88, $11, $00, $02, $3E, $88, $11, $00
.db $02, $05, $88, $AF, $18, $8A, $FC, $88, $88, $FF, $82, $FA, $88, $FF, $FF, $C8
.db $8C, $FF, $FF, $FF, $FC, $88, $89, $FC, $88, $88, $89, $02, $04, $FF, $98, $82
.db $88, $88, $8F, $F2, $1F, $18, $88, $88, $98, $8C, $FF, $FF, $FF, $28, $2F, $A8
.db $88, $88, $AF, $28, $AF, $28, $88, $88, $8A, $F2, $02, $05, $88, $AF, $18, $8A
.db $FC, $88, $88, $FF, $82, $FA, $88, $FF, $FF, $C8, $8C, $FF, $FF, $FF, $FC, $88
.db $89, $FC, $02, $07, $88, $11, $00, $02, $3E, $88, $11, $00, $02, $05, $88, $AF
.db $18, $88, $FF, $A8, $88, $FF, $89, $FF, $18, $88, $8A, $C8, $8C, $F9, $88, $89
.db $FC, $88, $89, $FC, $88, $88, $89, $02, $04, $FF, $98, $1F, $18, $88, $9F, $F9
.db $9F, $F1, $88, $8A, $C8, $8C, $F9, $8F, $F1, $88, $9F, $F1, $88, $81, $FF, $98
.db $AF, $28, $88, $88, $8A, $F2, $02, $05, $88, $AF, $18, $88, $FF, $A8, $88, $FF
.db $89, $FF, $18, $88, $8A, $C8, $8C, $F9, $88, $89, $FC, $88, $89, $FC, $02, $07
.db $88, $11, $00, $02, $3E, $88, $11, $00, $02, $05, $88, $AF, $18, $88, $9F, $F1
.db $88, $FF, $88, $1F, $FF, $FF, $FF, $F2, $8C, $F9, $88, $89, $FC, $88, $89, $FC
.db $02, $08, $88, $CF, $FF, $FF, $FF, $C8, $8A, $FF, $FF, $FF, $F2, $8C, $F9, $88
.db $FF, $18, $81, $FF, $FF, $FF, $F1, $88, $AF, $FF, $FF, $FF, $8A, $FF, $FF, $FF
.db $F8, $88, $88, $AF, $18, $88, $9F, $F1, $88, $FF, $88, $1F, $FF, $FF, $FF, $F2
.db $8C, $F9, $88, $89, $FC, $88, $89, $FC, $02, $07, $88, $11, $00, $02, $3E, $88
.db $11, $00, $02, $04, $88, $89, $FF, $F8, $88, $8F, $FF, $A1, $FF, $18, $89, $FF
.db $FF, $FF, $88, $2F, $FA, $88, $8A, $FF, $28, $8A, $FF, $28, $02, $08, $88, $AF
.db $FF, $F1, $88, $88, $2F, $FF, $FC, $88, $2F, $FA, $88, $CF, $FC, $88, $8F, $FF
.db $FF, $88, $89, $02, $04, $FF, $9F, $FF, $FF, $FF, $F8, $88, $89, $FF, $F8, $88
.db $8F, $FF, $A1, $FF, $18, $89, $FF, $FF, $FF, $88, $2F, $FA, $88, $8A, $FF, $28
.db $8A, $FF, $28, $02, $06, $88, $11, $00, $02, $3E, $88, $11, $00, $02, $5E, $88
.db $11, $00, $02, $3E, $88, $11, $00, $02, $5E, $88, $11, $00, $02, $3E, $88, $11
.db $00, $02, $5E, $88, $11, $00, $02, $3E, $88, $11, $00, $02, $5E, $88, $11, $00
.db $02, $3E, $88, $11, $00, $02, $5E, $88, $11, $01, $02, $3F, $11, $01, $02, $FF
.db $11, $02, $FF, $00, $02, $41, $00, $08, $02, $1E, $88, $80, $08, $02, $1E, $88
.db $80, $08, $02, $1E, $88, $80, $08, $02, $1E, $88, $80, $08, $02, $1E, $88, $80
.db $08, $02, $1E, $88, $80, $08, $02, $1E, $88, $80, $08, $02, $1E, $88, $80, $08
.db $02, $1E, $88, $80, $08, $02, $1E, $88, $80, $08, $02, $1E, $88, $80, $08, $02
.db $1E, $88, $80, $08, $02, $1E, $88, $80, $08, $02, $1E, $88, $80, $08, $02, $1E
.db $88, $80, $08, $02, $1E, $88, $80, $08, $02, $1E, $88, $80, $08, $02, $1E, $88
.db $80, $08, $02, $1E, $88, $80, $08, $02, $1E, $88, $80, $08, $02, $1E, $88, $80
.db $08, $02, $1E, $88, $80, $08, $02, $1E, $88, $80, $08, $02, $1E, $88, $80, $08
.db $02, $1E, $88, $80, $08, $02, $1E, $88, $80, $08, $02, $1E, $88, $80, $08, $02
.db $1E, $88, $80, $08, $02, $1E, $88, $80, $08, $02, $1E, $88, $80, $08, $02, $1E
.db $88, $80, $08, $02, $1E, $88, $80, $08, $02, $1E, $88, $80, $08, $02, $1E, $88
.db $80, $08, $02, $1E, $88, $80, $08, $02, $1E, $88, $80, $08, $02, $1E, $88, $80
.db $08, $02, $1E, $88, $80, $08, $02, $1E, $88, $80, $08, $02, $1E, $88, $80, $08
.db $02, $1E, $88, $80, $08, $02, $1E, $88, $80, $08, $02, $1E, $88, $80, $08, $02
.db $1E, $88, $80, $08, $02, $1E, $88, $80, $08, $02, $1E, $88, $80, $08, $02, $1E
.db $88, $80, $08, $02, $1E, $88, $80, $08, $02, $1E, $88, $80, $08, $02, $1E, $88
.db $80, $08, $02, $1E, $88, $80, $08, $02, $1E, $88, $80, $08, $02, $1E, $88, $80
.db $08, $02, $1E, $88, $80, $08, $02, $1E, $88, $80, $08, $02, $1E, $88, $80, $08
.db $02, $1E, $88, $80, $08, $02, $1E, $88, $80, $08, $02, $1E, $88, $80, $08, $02
.db $1E, $88, $80, $02, $00 ;*
;* Note that count is used to exit normal compression, not end signal.
;* Only DisplayUI uses it, more effecient than count, will be marked for update in future
; versions so that everything uses it, including uncompressed
;Font Data:
;*current state* 8x12 mono width (?) font (96 bits per char)
;*remove 2 null rows* 8x10 mono width (?) font (80 bits per char)
;1 bit depth
;notes: (you probably already know this but...)
;first and last rows are null to increase legibility, remove to save 194 bytes
;change background or char color for highlighting
;each char pixel row is 1 byte stored msb first
;multipy char data byte by 12 and add to FontData - $20 to get char
;add offset to char data or set limit to print just bottom or top half of char
;manipulate rr/rl count of each row to print partial width chars
;if char or string data byte is <$20 || >$80 display char $80
;palette size = 4 bytes
;palette begin (2 bytes per color)
; |background| |char color|
FontPalette:
.db $FF, $FF, $00, $00
;data size = 1164 bytes
;data begin
FontData:
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00; ' ' $20
.db $00, $30, $78, $78, $78, $30, $30, $00, $30, $30, $00, $00; '!'
.db $00, $CC, $CC, $CC, $00, $00, $00, $00, $00, $00, $00, $00; '"'
.db $00, $6C, $6C, $FE, $6C, $6C, $6C, $FE, $6C, $6C, $00, $00; '#'
.db $00, $7C, $D6, $D0, $70, $38, $1C, $16, $D6, $7C, $00, $00; '$'
.db $00, $E0, $A4, $EC, $18, $30, $60, $DC, $94, $1C, $00, $00; '%'
.db $00, $70, $D8, $D8, $70, $C0, $DE, $CC, $CC, $76, $00, $00; '&'
.db $00, $30, $30, $30, $00, $00, $00, $00, $00, $00, $00, $00; '''
.db $00, $18, $30, $30, $60, $60, $60, $30, $30, $18, $00, $00; '('
.db $00, $60, $30, $30, $18, $18, $18, $30, $30, $60, $00, $00; ')'
.db $00, $00, $00, $6C, $38, $FE, $38, $6C, $00, $00, $00, $00; '*'
.db $00, $00, $00, $30, $30, $FC, $30, $30, $00, $00, $00, $00; '+'
.db $00, $00, $00, $00, $00, $00, $00, $38, $38, $18, $30, $00; ','
.db $00, $00, $00, $00, $00, $FC, $00, $00, $00, $00, $00, $00; '-'
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $38, $38, $00; '.'
.db $00, $00, $0C, $18, $18, $30, $30, $60, $60, $C0, $00, $00; '/'
.db $00, $78, $CC, $DC, $DC, $CC, $EC, $EC, $CC, $78, $00, $00; '0' $30
.db $00, $18, $38, $F8, $18, $18, $18, $18, $18, $18, $00, $00; '1'
.db $00, $78, $CC, $CC, $0C, $18, $30, $60, $C0, $FC, $00, $00; '2'
.db $00, $78, $CC, $CC, $0C, $38, $0C, $CC, $CC, $78, $00, $00; '3'
.db $00, $60, $60, $6C, $6C, $6C, $CC, $FE, $0C, $0C, $00, $00; '4'
.db $00, $FC, $C0, $C0, $C0, $F8, $0C, $0C, $18, $F0, $00, $00; '5'
.db $00, $38, $30, $60, $F8, $CC, $CC, $CC, $CC, $78, $00, $00; '6'
.db $00, $FC, $0C, $18, $18, $30, $30, $60, $60, $60, $00, $00; '7'
.db $00, $78, $CC, $CC, $EC, $78, $DC, $CC, $CC, $78, $00, $00; '8'
.db $00, $78, $CC, $CC, $CC, $CC, $7C, $18, $30, $70, $00, $00; '9'
.db $00, $00, $38, $38, $00, $00, $00, $38, $38, $00, $00, $00; ':'
.db $00, $00, $38, $38, $00, $00, $00, $38, $38, $18, $30, $00; ';'
.db $00, $0C, $18, $30, $60, $C0, $60, $30, $18, $0C, $00, $00; '<'
.db $00, $00, $00, $00, $FC, $00, $FC, $00, $00, $00, $00, $00; '='
.db $00, $C0, $60, $30, $18, $0C, $18, $30, $60, $C0, $00, $00; '>'
.db $00, $78, $CC, $CC, $18, $30, $30, $00, $30, $30, $00, $00; '?'
.db $00, $FC, $86, $86, $9E, $B6, $B6, $9E, $80, $FE, $00, $00; '@'
.db $00, $30, $78, $CC, $CC, $CC, $FC, $CC, $CC, $CC, $00, $00; 'A' $41
.db $00, $F8, $CC, $CC, $CC, $F8, $CC, $CC, $CC, $F8, $00, $00; 'B'
.db $00, $78, $CC, $CC, $C0, $C0, $C0, $CC, $CC, $78, $00, $00; 'C'
.db $00, $F0, $D8, $CC, $CC, $CC, $CC, $CC, $D8, $F0, $00, $00; 'D'
.db $00, $FC, $C0, $C0, $C0, $F8, $C0, $C0, $C0, $FC, $00, $00; 'E'
.db $00, $FC, $C0, $C0, $C0, $F8, $C0, $C0, $C0, $C0, $00, $00; 'F'
.db $00, $78, $CC, $CC, $C0, $C0, $DC, $CC, $CC, $7C, $00, $00; 'G'
.db $00, $CC, $CC, $CC, $CC, $FC, $CC, $CC, $CC, $CC, $00, $00; 'H'
.db $00, $78, $30, $30, $30, $30, $30, $30, $30, $78, $00, $00; 'I'
.db $00, $0C, $0C, $0C, $0C, $0C, $0C, $CC, $CC, $78, $00, $00; 'J'
.db $00, $CC, $CC, $D8, $D8, $F0, $D8, $D8, $CC, $CC, $00, $00; 'K'
.db $00, $C0, $C0, $C0, $C0, $C0, $C0, $C0, $C0, $FC, $00, $00; 'L'
.db $00, $C6, $C6, $EE, $D6, $D6, $D6, $C6, $C6, $C6, $00, $00; 'M'
.db $00, $C6, $C6, $E6, $F6, $DE, $CE, $C6, $C6, $C6, $00, $00; 'N'
.db $00, $78, $CC, $CC, $CC, $CC, $CC, $CC, $CC, $78, $00, $00; 'O'
.db $00, $F8, $CC, $CC, $CC, $F8, $C0, $C0, $C0, $C0, $00, $00; 'P'
.db $00, $78, $CC, $CC, $CC, $CC, $CC, $CC, $DC, $78, $1C, $00; 'Q'
.db $00, $F8, $CC, $CC, $CC, $F8, $D8, $CC, $CC, $CC, $00, $00; 'R'
.db $00, $78, $CC, $C0, $60, $30, $18, $0C, $CC, $78, $00, $00; 'S'
.db $00, $FC, $30, $30, $30, $30, $30, $30, $30, $30, $00, $00; 'T'
.db $00, $CC, $CC, $CC, $CC, $CC, $CC, $CC, $CC, $78, $00, $00; 'U'
.db $00, $CC, $CC, $CC, $CC, $CC, $CC, $CC, $78, $30, $00, $00; 'V'
.db $00, $C6, $C6, $C6, $D6, $D6, $D6, $6C, $6C, $6C, $00, $00; 'W'
.db $00, $CC, $CC, $68, $30, $30, $58, $CC, $CC, $CC, $00, $00; 'X'
.db $00, $CC, $CC, $CC, $CC, $78, $30, $30, $30, $30, $00, $00; 'Y'
.db $00, $FC, $0C, $0C, $18, $30, $60, $C0, $C0, $FC, $00, $00; 'Z'
.db $00, $78, $60, $60, $60, $60, $60, $60, $60, $78, $00, $00; '['
.db $00, $00, $C0, $60, $60, $30, $30, $18, $18, $0C, $00, $00; '\'
.db $00, $78, $18, $18, $18, $18, $18, $18, $18, $78, $00, $00; ']'
.db $00, $30, $78, $CC, $00, $00, $00, $00, $00, $00, $00, $00; '^'
.db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $FE, $00; '_'
.db $00, $70, $30, $18, $00, $00, $00, $00, $00, $00, $00, $00; '`'
.db $00, $00, $00, $78, $0C, $0C, $7C, $CC, $CC, $7C, $00, $00; 'a' $61
.db $00, $C0, $C0, $F8, $CC, $CC, $CC, $CC, $CC, $F8, $00, $00; 'b'
.db $00, $00, $00, $78, $CC, $C0, $C0, $C0, $CC, $78, $00, $00; 'c'
.db $00, $0C, $0C, $7C, $CC, $CC, $CC, $CC, $CC, $7C, $00, $00; 'd'
.db $00, $00, $00, $78, $CC, $CC, $FC, $C0, $C0, $78, $00, $00; 'e'
.db $00, $3C, $60, $60, $60, $FC, $60, $60, $60, $60, $00, $00; 'f'
.db $00, $00, $00, $7C, $CC, $CC, $CC, $CC, $7C, $0C, $78, $00; 'g'
.db $00, $C0, $C0, $F8, $CC, $CC, $CC, $CC, $CC, $CC, $00, $00; 'h'
.db $00, $30, $30, $00, $F0, $30, $30, $30, $30, $FC, $00, $00; 'i'
.db $00, $18, $18, $00, $78, $18, $18, $18, $18, $18, $F0, $00; 'j'
.db $00, $C0, $C0, $CC, $CC, $D8, $F0, $D8, $CC, $CC, $00, $00; 'k'
.db $00, $F0, $30, $30, $30, $30, $30, $30, $30, $FC, $00, $00; 'l'
.db $00, $00, $00, $FC, $D6, $D6, $D6, $D6, $D6, $C6, $00, $00; 'm'
.db $00, $00, $00, $F8, $CC, $CC, $CC, $CC, $CC, $CC, $00, $00; 'n'
.db $00, $00, $00, $78, $CC, $CC, $CC, $CC, $CC, $78, $00, $00; 'o'
.db $00, $00, $00, $F8, $CC, $CC, $CC, $CC, $F8, $C0, $C0, $00; 'p'
.db $00, $00, $00, $7C, $CC, $CC, $CC, $CC, $7C, $0C, $0C, $00; 'q'
.db $00, $00, $00, $CC, $DC, $E0, $C0, $C0, $C0, $C0, $00, $00; 'r'
.db $00, $00, $00, $7C, $C0, $C0, $78, $0C, $0C, $F8, $00, $00; 's'
.db $00, $60, $60, $FC, $60, $60, $60, $60, $60, $3C, $00, $00; 't'
.db $00, $00, $00, $CC, $CC, $CC, $CC, $CC, $CC, $7C, $00, $00; 'u'
.db $00, $00, $00, $CC, $CC, $CC, $CC, $CC, $78, $30, $00, $00; 'v'
.db $00, $00, $00, $C6, $D6, $D6, $D6, $D6, $6C, $6C, $00, $00; 'w'
.db $00, $00, $00, $CC, $CC, $78, $30, $78, $CC, $CC, $00, $00; 'x'
.db $00, $00, $00, $CC, $CC, $CC, $CC, $CC, $78, $18, $F0, $00; 'y'
.db $00, $00, $00, $FC, $0C, $18, $30, $60, $C0, $FC, $00, $00; 'z'
.db $00, $18, $30, $30, $60, $C0, $60, $30, $30, $18, $00, $00; '{'
.db $00, $30, $30, $30, $30, $30, $30, $30, $30, $30, $00, $00; '|'
.db $00, $60, $30, $30, $18, $0C, $18, $30, $30, $60, $00, $00; '}'
.db $00, $E2, $B6, $1C, $00, $00, $00, $00, $00, $00, $00, $00; '~'
.db $00, $E0, $B0, $D8, $AC, $D6, $AC, $D8, $B0, $E0, $00, $00; '>' $7f (special-selector)
.db $00, $FE, $C6, $BA, $BA, $F6, $EE, $EE, $FE, $EE, $FE, $00; '?' $80 (special-unknown char)
;--- FindImages ---
;This routine is a little crazy. All this does is list locations and names of every
;image appvar found on the calc. I decided to create a variable in ram to execute this
;code. Its necessary for this code to be on page 0 or 1 to free memA for page swapping
;between RAM page 2 and flash RAM.
;Originally I wrote it to be placed in tempSwapArea, but then changed it. I removed
;jps and calls, relocated some code blocks so that everything could use relative addressing
;to be completely relocatable, thats why it jumps around everywhere. Using calls to get rid
;of repeated lines of code it can be reduced down to 284 bytes or less.
;Will be moved to tempSwapArea again in the next version.
;324 bytes used
;Goes through vat and locates archived appvars and checks for signature
;File Index contains number of images
;FileTable contains 16 byte image info (3=bde,9=null terminated name,4=garbage)
FindImagesCopy:
jr FindImages
FIDone:
UpdateFileIndex: ;write 1 byte fileindex to $82
ld a,$82
out (MemoryAPort),a
ld hl,FileIndex-$8000 ;since fileindex is currently in memA (normally memC)
ld a,(TempFileIndex) ;get current fileindex
ld (hl),a ;update fileindex
ld a,(TempAppMemPage)
FISetMemPage:
bit 7,a
jr z, FILowSet
res 7,a
out (MemoryAPort),a
in a,(MemoryAHPort)
jr FISB1
FILowSet:
out (MemoryAPort),a
in a,(MemoryAHPort)
res 0,a
jr FISB2
FISB1:
set 0,a
FISB2:
out (MemoryAHPort),a
jp ReEntry
FindImages:
ld hl,(progPtr)
FISearchLoop:
ld de,(pTemp)
or a
sbc hl,de
jr c, FIDone ; after vat search done
jr z, FIDone
add hl,de
ld a,(hl) ;check type
and $1f
cp $15
jr z,FIArchiveCheck ;if appvar check if archived
or a
ld de,6
sbc hl,de
FIUnarchived:
ld e,(hl)
inc e
sbc hl,de
jr FISearchLoop
FIArchiveCheck:
or a
ld de,5
sbc hl,de
ld a,(hl) ;check mem page
dec hl
or a
jr z,FIUnarchived ;skip if not archived
;copy name to file table
push hl
pop ix ;ix points to name length
ld a,(TempFileIndex)
inc a
or a
jr z, FIDone ;max file count reached already
ld (TempFileIndex),a
ld hl,TempFileTable
ld a,(ix) ;name length
ld c,a
;add real data offset and store
ld a,(ix+3) ;data low byte
add a,12
add a,c ;real data offset = 12+name length
ld e,a ;save low byte
ld a,(ix+2) ;data high byte
adc a,0 ;inc if necessary
ld d,a ;save high byte
ld a,(ix+1) ;mem page
bit 7,d ;check for high byte overflow (>$7fff)
jr z,FIPageGood
inc a ;inc mem page
ld b,a ;save mem page
ld a,d ;get high byte
sub $40 ;fix overflow
ld d,a ;save it again
ld a,b ;get mem page
jr FIPageGood
RelativeHelp1:
jr FISearchLoop
FIPageGood:
push hl ;save start of current file
ld (hl),a ;save mem page
inc hl
ld a,e ;get low byte
ld (hl),a ;save low byte
inc hl
ld a,d ;get high byte
ld (hl),a ;save high byte
inc hl
ex de,hl
push ix
pop hl
dec hl ;hl points to name
ld b,c
FIName:
ld a,(hl)
ld (de),a
dec hl
inc de
djnz FIName
xor a
ld (de),a
ex (sp),hl ;save spot in VAT, get start of file
FIFindSig:
;$84CBAB1E
ld a,(hl) ;hl points to bde
push hl ;store location
FISetMemPage2:
bit 7,a
jr z, FILowSet2
res 7,a
out (MemoryAPort),a
in a,(MemoryAHPort)
jr FISB12
FILowSet2:
out (MemoryAPort),a
in a,(MemoryAHPort)
res 0,a
jr FISB22
FISB12:
set 0,a
FISB22:
out (MemoryAHPort),a
ld de,TempSig
inc hl ;point to data offset
ld a,(hl)
inc hl
ld h,(hl)
ld l,a
ld bc,4
FICopyData:
bit 7,h
jr z,FIKeepPage
FIIncMemPort:
in a,(MemoryAPort)
inc a
bit 7,a
jr z, FILow
xor a
out (MemoryAPort),a
in a,(MemoryAHPort)
set 0,a
out (MemoryAHPort),a
jr FIIMPDone
FILow:
out (MemoryAPort),a
FIIMPDone:
ld hl,$4000
jr FIKeepPage
SigDone:
pop hl ;restore spot in VAT
jr RelativeHelp1 ;jp FISearchLoop
FIKeepPage:
ldi
ld a,b
or c
jr nz,FICopyData
pop de ;restore location
in a,(MemoryAPort) ;get values after sig
ld b,a
in a,(MemoryAHPort)
rl b
rra
rr b ;get full memory page value
ld a,b
ld (de),a
inc de
ld a,l
ld (de),a
inc de
ld a,h
add a,$40 ;offset it by $4000 because it will be at $8000 not $4000
ld (de),a ;will still have to check offset for overflow
or a
ld hl,(TempSig)
ld de,$84cb
sbc hl,de
jr nz,SkipWrite
ld hl,(TempSig+2)
ld de,$ab1e
sbc hl,de
jr nz,SkipWrite
SaveFileInfo: ;write 16 bytes to next file location
ld a,$82
out (MemoryAPort),a
ld d,0
ld a,(TempFileIndex) ;get offset for file location
dec a ;one based
ld e,a
or a
ld b,4
SFILoop:
rl e
rl d
djnz SFILoop ;mult by 16
ld hl,FileTable-$8000 ;since filetable is currently in memA (normally memC)
add hl,de
ld de,TempFileTable
ex de,hl
ld bc,16
ldir ;copy 16 bytes from tempfiletable to real filetable
jr SigDone
SkipWrite:
ld a,(TempFileIndex)
dec a
ld (TempFileIndex),a
jr SigDone
FindImagesEnd:
.end
Anonyme0 wrote:Comme le problème était du côté de TI Connect CE, je pense que tu n'auras pas de soucis avec les libs de Adriweb, mais c'est à vérifier.
cos(
, mon tokenizer encodera donc le token pour la fonction trigo.Adriweb wrote:(PS: Je suis en train de bosser sur les bindings JS de tivars_lib_cpp, pour de vrai )
Anonyme0 wrote:Adriweb wrote:(PS: Je suis en train de bosser sur les bindings JS de tivars_lib_cpp, pour de vrai )
Soon™
Anonyme0 wrote:Concernant le TI-Basic, il faut faire attention à la "tokénisation". C'est ce qui m'a fait arrêter String Viewer (et aussi la non-popularité du truc qui fait que j'avais pas envie d'utiliser autre chose que TI Connect CE pour former les strings), qui fonctionnait à merveille, sauf que certains textes ne passaient pas. Je me suis rendu compte que lorsque je rentrais le texte dans une string sur TI Connect CE, certains mots étaient changés en fonction (cos par exemple) donc le système de page ne fonctionnait plus (on ne voyait rien à l'affichage sauf pour certains mots).
Comme le problème était du côté de TI Connect CE, je pense que tu n'auras pas de soucis avec les libs de Adriweb, mais c'est à vérifier.
Il suffirait de faire une exception lorsque deux guillemets encadrent un texte, mais ça ralentirait sûrement de vérifier à chaque fois si il y a un guillemet
Adriweb wrote:Oui.
Mais il y a quand même du concret... progressivement. https://github.com/adriweb/tivars_lib_c ... f5ebe6392f
Adriweb wrote:
Au fait (@Wistaro etc.), ceci existe: viewtopic.php?f=12&t=18025
Mais bref, je sais pas si c'est encore vraiment d'actualité
Wistaro wrote:Adriweb wrote:Oui.
Mais il y a quand même du concret... progressivement. https://github.com/adriweb/tivars_lib_c ... f5ebe6392f
Ah,cool.
J'ai hâte de pouvoir sortir une version standalone, va expliquer au gens comment installer wampserver, le configurer, s'en servir et utiliser l'application..
Users browsing this forum: ClaudeBot [spider] and 2 guests