π
<-

[Projet] Générateur de cours - TI83PCE/84+CE/82Advanced

Nouveautés, projets, mises à jour.

Re: Générateur de cours - TI83PCE/84+CE/82Avanced

Unread postby Wistaro » 01 May 2017, 19:35

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 :)
Nouveau sur le site, ClaudeBot [spider] ? Avant de poster sur le chat et sur le forum, n'oublie pas de lire les règles. En cas de problème, tu peux m'envoyer un message, je réponds rapidement.

Liens utiles:
Image
Découvre mes programmes et mon site!
User avatar
WistaroSuper Modo
Niveau 15: CC (Chevalier des Calculatrices)
Niveau 15: CC (Chevalier des Calculatrices)
Level up: 88.4%
 
Posts: 3182
Images: 37
Joined: 25 Feb 2013, 16:21
Location: Toulouse
Gender: Male
Calculator(s):
MyCalcs profile
Class: Ingénieur en électronique
YouTube: Wistaro
Twitter: Wistaro
GitHub: Wistaro

Re: Générateur de cours - TI83PCE/84+CE/82Avanced

Unread postby critor » 01 May 2017, 20:37

http://www.ticalc.org/archives/files/fi ... 46771.html
J'ai pris le temps de corriger le désarchivage de SPLASHCE, et Adriweb a aidé pour la compilation.
Le programme téléchargeable avec le code modifié et compilable est sur le PB :
https://tiplanet.org/pb/?id=2043_1493647864_09371a497c

Plus aucun désarchivage, l'appvar image est lue là où elle se trouve, que ce soit en RAM ou en Flash.
Comme c'était presque toujours en Flash, en conséquence l'affichage est maintenant beaucoup plus rapide ! :bj:

Par contre, il semble y avoir un bug que j'ai même avec le programme original :
Image
A chaque fin de tiers d'image, on note 2 mauvais pixels.
Mais ça vient peut-être aussi du convertisseur fourni pour Windows, sans code source cette fois-ci.



Dans tous les cas ce n'est toujours pas adapté pour le convertisseur mViewer GX. :(
Les images sont dans un format 16-bits non compressé, chaque image-écran occupant 150Ko avec 3 appvars.
Dans les 3Mio d'archive d'une TI-83Premium CE complètement vite, il ne rentrerait donc que 20 écrans (et non 20 pages, une page prenant plusieurs écrans) - ridicule.



Le mieux à mon avis, ce serait que quelqu'un puisse porter le lecteur IViewer de la TI-84 Plus C Silver Edition :
archives_voir.php?id=19450

L'auteur a hélas disparu de la communauté et n'est plus joignable.
La seule adresse courriel que l'on avait utilisait son nom de domaine qui a hélas été repris par des escrocs publicistes (briandm82 . com)

IViewer aurait bien des avantages :
  • format d'images 8-bits au lieu de 16-bits, gaspillant moins d'espace :)
  • format d'images gérant la compression RLE, très correcte pour des documents :)
  • format d'images déjà entièrement géré dans le convertisseur mViewer GX
  • code source asm inclus dans l'archive

Si quelqu'un se sent capable (j'ignore ce qu'il faut modifier d'autre que les définitions au début), je me dépêche de gérer ça dans le convertisseur, et ça servira à mettre des PDF dans sa TI-83 Premium CE pendant quelques semaines d'ici les examens.

Show/Hide spoilerAfficher/Masquer le spoiler
Code: Select all
; ~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
Image
User avatar
critorAdmin
Niveau 19: CU (Créateur Universel)
Niveau 19: CU (Créateur Universel)
Level up: 45.9%
 
Posts: 41860
Images: 15380
Joined: 25 Oct 2008, 00:00
Location: Montpellier
Gender: Male
Calculator(s):
MyCalcs profile
YouTube: critor3000
Twitter: critor2000
GitHub: critor

Re: Générateur de cours - TI83PCE/84+CE/82Avanced

Unread postby Wistaro » 01 May 2017, 20:44

J'espère que quelqu'un réussira à prendre du temps pour ça, mais étant donné que le programme n'est destiné qu'à servir que les 2 prochains mois, ça ne donne pas très envie.
Si j'avais les connaissances je m'y serais plongé dedans...

Sinon, bonne nouvelle, j'ai reçu une réponse de Yoann, il va me donner les sources de Doc Viewer CE demain
Nouveau sur le site, ClaudeBot [spider] ? Avant de poster sur le chat et sur le forum, n'oublie pas de lire les règles. En cas de problème, tu peux m'envoyer un message, je réponds rapidement.

Liens utiles:
Image
Découvre mes programmes et mon site!
User avatar
WistaroSuper Modo
Niveau 15: CC (Chevalier des Calculatrices)
Niveau 15: CC (Chevalier des Calculatrices)
Level up: 88.4%
 
Posts: 3182
Images: 37
Joined: 25 Feb 2013, 16:21
Location: Toulouse
Gender: Male
Calculator(s):
MyCalcs profile
Class: Ingénieur en électronique
YouTube: Wistaro
Twitter: Wistaro
GitHub: Wistaro

Re: Générateur de cours - TI83PCE/84+CE/82Avanced

Unread postby Anonyme0 » 01 May 2017, 22:25

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.
Last edited by Anonyme0 on 01 May 2017, 22:47, edited 1 time in total.
Image
(17:46:41) Hayleia: ah, ce bon vieux Firefox, qu'est-ce qu'on est bien avec lui :D
User avatar
Anonyme0
Niveau 13: CU (Calculateur Universel)
Niveau 13: CU (Calculateur Universel)
Level up: 14.6%
 
Posts: 273
Images: 17
Joined: 06 Sep 2015, 17:33
Location: Pas sur TI-Planet
Gender: Not specified
Calculator(s):
MyCalcs profile

Re: Générateur de cours - TI83PCE/84+CE/82Avanced

Unread postby Adriweb » 01 May 2017, 22:31

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.

Pas forcément, j'applique "bêtement" le maximal-munch, et donc si je vois cos(, mon tokenizer encodera donc le token pour la fonction trigo.
A tester avec des exemples précis, pour voir ce qui se passe vraiment.


(PS: Je suis en train de bosser sur les bindings JS de tivars_lib_cpp, pour de vrai :P)

MyCalcs: Help the community's calculator documentations by filling out your calculators info!
MyCalcs: Aidez la communauté à documenter les calculatrices en donnant des infos sur vos calculatrices !
Inspired-Lua.org: All about TI-Nspire Lua programming (tutorials, wiki/docs...)
My calculator programs
Mes programmes pour calculatrices
User avatar
AdriwebAdmin
Niveau 16: CC2 (Commandeur des Calculatrices)
Niveau 16: CC2 (Commandeur des Calculatrices)
Level up: 78.8%
 
Posts: 14711
Images: 1119
Joined: 01 Jun 2007, 00:00
Location: France
Gender: Male
Calculator(s):
MyCalcs profile
Twitter: adriweb
GitHub: adriweb

Re: Générateur de cours - TI83PCE/84+CE/82Avanced

Unread postby Anonyme0 » 01 May 2017, 22:43

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:(PS: Je suis en train de bosser sur les bindings JS de tivars_lib_cpp, pour de vrai :P)

Soon™
Image
(17:46:41) Hayleia: ah, ce bon vieux Firefox, qu'est-ce qu'on est bien avec lui :D
User avatar
Anonyme0
Niveau 13: CU (Calculateur Universel)
Niveau 13: CU (Calculateur Universel)
Level up: 14.6%
 
Posts: 273
Images: 17
Joined: 06 Sep 2015, 17:33
Location: Pas sur TI-Planet
Gender: Not specified
Calculator(s):
MyCalcs profile

Re: Générateur de cours - TI83PCE/84+CE/82Avanced

Unread postby Adriweb » 01 May 2017, 22:48

Anonyme0 wrote:
Adriweb wrote:(PS: Je suis en train de bosser sur les bindings JS de tivars_lib_cpp, pour de vrai :P)

Soon™

Oui.
Mais il y a quand même du concret... progressivement. https://github.com/adriweb/tivars_lib_c ... f5ebe6392f

MyCalcs: Help the community's calculator documentations by filling out your calculators info!
MyCalcs: Aidez la communauté à documenter les calculatrices en donnant des infos sur vos calculatrices !
Inspired-Lua.org: All about TI-Nspire Lua programming (tutorials, wiki/docs...)
My calculator programs
Mes programmes pour calculatrices
User avatar
AdriwebAdmin
Niveau 16: CC2 (Commandeur des Calculatrices)
Niveau 16: CC2 (Commandeur des Calculatrices)
Level up: 78.8%
 
Posts: 14711
Images: 1119
Joined: 01 Jun 2007, 00:00
Location: France
Gender: Male
Calculator(s):
MyCalcs profile
Twitter: adriweb
GitHub: adriweb

Re: Générateur de cours - TI83PCE/84+CE/82Avanced

Unread postby Adriweb » 01 May 2017, 23:05

Au fait (@Wistaro etc.), ceci existe: viewtopic.php?f=12&t=18025 :P
Mais bref, je sais pas si c'est encore vraiment d'actualité.

MyCalcs: Help the community's calculator documentations by filling out your calculators info!
MyCalcs: Aidez la communauté à documenter les calculatrices en donnant des infos sur vos calculatrices !
Inspired-Lua.org: All about TI-Nspire Lua programming (tutorials, wiki/docs...)
My calculator programs
Mes programmes pour calculatrices
User avatar
AdriwebAdmin
Niveau 16: CC2 (Commandeur des Calculatrices)
Niveau 16: CC2 (Commandeur des Calculatrices)
Level up: 78.8%
 
Posts: 14711
Images: 1119
Joined: 01 Jun 2007, 00:00
Location: France
Gender: Male
Calculator(s):
MyCalcs profile
Twitter: adriweb
GitHub: adriweb

Re: Générateur de cours - TI83PCE/84+CE/82Avanced

Unread postby Wistaro » 02 May 2017, 05:58

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.


Merci de l'information.
Pour l'instant je n'ai pas rencontré de problème de ce niveau là (bon, j'ai pas encore fait des tests vraiment poussés.)

Aurais-tu un exemple concret que je puisse tester ?

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


Ou remplacer " par '', ce qui visuellement rend pareil, mais qui n'utilise pas les mêmes tokens.

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.. :D

Adriweb wrote:
Au fait (@Wistaro etc.), ceci existe: viewtopic.php?f=12&t=18025 :P
Mais bref, je sais pas si c'est encore vraiment d'actualité


J'ai vu passer ça, oui.
Mais je vois pas l'intérêt avec DOC Viewer CE.
Surtout que ça fait plus d'un an que PT_ n'a pas update ce projet :/
Nouveau sur le site, ClaudeBot [spider] ? Avant de poster sur le chat et sur le forum, n'oublie pas de lire les règles. En cas de problème, tu peux m'envoyer un message, je réponds rapidement.

Liens utiles:
Image
Découvre mes programmes et mon site!
User avatar
WistaroSuper Modo
Niveau 15: CC (Chevalier des Calculatrices)
Niveau 15: CC (Chevalier des Calculatrices)
Level up: 88.4%
 
Posts: 3182
Images: 37
Joined: 25 Feb 2013, 16:21
Location: Toulouse
Gender: Male
Calculator(s):
MyCalcs profile
Class: Ingénieur en électronique
YouTube: Wistaro
Twitter: Wistaro
GitHub: Wistaro

Re: Générateur de cours - TI83PCE/84+CE/82Avanced

Unread postby Adriweb » 02 May 2017, 18:41

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.. :D

C'est le but, oui - aucune config/installation/logiciel nécessaire, juste à aller sur le fichier .html.
J'ai bientôt un truc de base fonctionnel, je pense.
Je posterai ici et/ou sur le topic dédié à tivars_lib... vraisemblablement il y aura une page de test quelque part sur tiplanet pour essayer un peu des choses, avant une mise en avant "réelle".

MyCalcs: Help the community's calculator documentations by filling out your calculators info!
MyCalcs: Aidez la communauté à documenter les calculatrices en donnant des infos sur vos calculatrices !
Inspired-Lua.org: All about TI-Nspire Lua programming (tutorials, wiki/docs...)
My calculator programs
Mes programmes pour calculatrices
User avatar
AdriwebAdmin
Niveau 16: CC2 (Commandeur des Calculatrices)
Niveau 16: CC2 (Commandeur des Calculatrices)
Level up: 78.8%
 
Posts: 14711
Images: 1119
Joined: 01 Jun 2007, 00:00
Location: France
Gender: Male
Calculator(s):
MyCalcs profile
Twitter: adriweb
GitHub: adriweb

PreviousNext

Return to Actualités

Who is online

Users browsing this forum: ClaudeBot [spider] and 6 guests

-
Search
-
Social TI-Planet
-
Featured topics
Comparaisons des meilleurs prix pour acheter sa calculatrice !
"1 calculatrice pour tous", le programme solidaire de Texas Instruments. Reçois gratuitement et sans aucune obligation d'achat, 5 calculatrices couleur programmables en Python à donner aux élèves les plus nécessiteux de ton lycée. Tu peux recevoir au choix 5 TI-82 Advanced Edition Python ou bien 5 TI-83 Premium CE Edition Python.
Enseignant(e), reçois gratuitement 1 exemplaire de test de la TI-82 Advanced Edition Python. À demander d'ici le 31 décembre 2024.
Reprise de ton ancienne fx-92 Collège ou Graph 25/35/90 à 3€ peu importe son état. Même non fonctionnelle et donc invendable, même ancienne Graph 35 non conforme aux programmes (pas de Python), même ancienne Graph 25/35 inutilisable aux examens (pas de mode examen) et donc invendable. Etiquette de retour fournie, pas de frais de port à payer.
Aidez la communauté à documenter les révisions matérielles en listant vos calculatrices graphiques !
12345
-
Donations / Premium
For more contests, prizes, reviews, helping us pay the server and domains...
Donate
Discover the the advantages of a donor account !
JoinRejoignez the donors and/or premium!les donateurs et/ou premium !


Partner and ad
Notre partenaire Jarrety Calculatrices à acheter chez Calcuso
-
Stats.
937 utilisateurs:
>918 invités
>9 membres
>10 robots
Record simultané (sur 6 mois):
6892 utilisateurs (le 07/06/2017)
-
Other interesting websites
Texas Instruments Education
Global | France
 (English / Français)
Banque de programmes TI
ticalc.org
 (English)
La communauté TI-82
tout82.free.fr
 (Français)