Giter Site home page Giter Site logo

ce-programming / cemu Goto Github PK

View Code? Open in Web Editor NEW
1.0K 1.0K 77.0 11.22 MB

Third-party TI-84 Plus CE / TI-83 Premium CE emulator, focused on developer features

Home Page: https://ce-programming.github.io/CEmu

License: Other

QMake 0.94% C++ 42.53% C 35.42% Makefile 0.38% Batchfile 0.01% Assembly 8.47% CMake 1.68% Python 8.05% Shell 0.41% Objective-C++ 2.12%
calculator emulation emulator ez80 ti-83-premium-ce ti-84-plus-ce

cemu's People

Contributors

adriweb avatar alberthdev avatar calc84maniac avatar captain-calc avatar commandblockguy avatar debrouxl avatar geekbozu avatar jacobly0 avatar jerry23011 avatar lifeemu avatar logicaljoe avatar mateoconlechuga avatar melvyn2 avatar petertillema avatar runer112 avatar stephan-p avatar thelastmillennial avatar unicorn808 avatar vogtinator avatar wolfarmoon avatar zdimension avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

cemu's Issues

Can't run TI-83 Premium CE ROM

I used the ROM dumping wizard to get the rom of my (real) TI-83 Premium CE calculator, but at the end of the wizard it started CEmu with the freshly-created ROM, but it shown the console window and then "CEmu has stopped working". And if now I start CEmu, click Browse and choose the .rom file, it says "Invalid ROM image".
Also, the dump program created 12 RomData variables (from A to L) but the wizard only takes 11 (at K the progress bar is full). It may be related.

Scripting front-end(s) on top of the CEmu IPC

In issue #17 , alberthdev mentioned Lua scripting for triggering operations on CEmu instances. This is the brainstorming issue for scripting front-ends on top of the IPC (issue #16 ); the technical choices for scripting will depend on (and perhaps slightly influence ?) the choices for the IPC mechanism.

CEmu TI-nspire CX (CAS)

I thought it would be a lot of work for y'all to shoose the keypad settings, or buttons...
So ,here you go ;)
nspire cemu

suppress logging '\0'

The implementation of the the debug logging ends up writing null characters to the output buffer, which causes problems when copying and pasting into some other applications.

cd core;make doesn't work

It appears the makefile for the code defaults to some incorrect preprocessor flags.

cpu.c:1317:41: warning: implicit declaration of function 'open_debugger' is invalid in C99 [-Wimplicit-function-declaration]
open_debugger(DBG_STEP, 0);
^
cpu.c:1317:55: error: use of undeclared identifier 'DBG_STEP'
open_debugger(DBG_STEP, 0);

This code when compiled gives CEmu a white screen, but on a calculator it does not.

Here is the code:

.nolist
#include "includes\ti84pce.inc"    
.list  
.assume ADL=1  
.org userMem-2  
.db tExtTok,tAsm84CeCmp  
_ClearVRAM equ 000374h 
bufData     equ vram+(320*240)
score       equ pixelShadow2
size equ score+3
posX equ size+3
posY equ posX+3
table equ posY+3
newlineByte equ 0Dh
 di
 call _RunIndicOff
 call _clearVRAM        ; Set all of VRAM to $FF (white)
 ld a,lcdbpp8
 ld (mpLcdCtrl),a
 ld hl,50
 ld (size),hl
 ld hl,0
 ld (score),hl
create1555Palette:
 ld hl,mpLcdPalette             ; MMIO address of LCD Palette
 ld b,0
_cp1555Loop:
 ld d,b
 ld a,b
 and a,%11000000
 srl d
 rra
 ld e,a
 ld a,%00011111
 and a,b
 or a,e
 ld (hl),a
 inc hl
 ld (hl),d
 inc hl
 inc b
 jr nz,_cp1555Loop
drawFrame:  
 ld hl,DI_Mode          ; Register for keypad mode
 ld (hl),2              ; Set Single Scan mode
 xor a,a
 cp a,(hl)              ; Wait for Idle mode
 jr nz,drawFrame
 ld a,(kbdG6)
 bit kbitClear,a
 jp nz,ExitPrgm
 bit kBitEnter,a
 jp nz,enterPressed
 ld b,100
 ld c,128 
 ld de,redCircle
 call DrawSprite
 push hl
 push de
 push bc
 push af
 ;hl = cx, de = cy, bc = r, a = colour 
 ld hl,160
 ld de,112
 ld bc,(size)
 ld a,$5E
 call drawCircle 
 ld hl,(size)
 ld bc,1
 sbc hl,bc
 ld (size),hl
 ld bc,0
 sbc hl,bc
 call Z,refix

 ld hl,155
 ld (posX),hl
 ld hl,110
 ld (posY),hl
 ld hl,(score)
 call DispHL

 pop af
 pop bc
 pop de 
 pop hl
 call blitScreen
 jr drawFrame
refix:
 ld hl,50
 ld (size),hl
 ret
enterPressed:
 ld hl,(score)
 inc hl
 ld (score),hl
 ld a,(size)
 cp 25
 jp c,endGame  
 ld a,(size)
 cp 34
 jp nc,endGame  
 call refix 
waitForEnter: 
 di 
 ld hl,DI_Mode          ; Register for keypad mode 
 ld (hl),2              ; Set Single Scan mode 
 xor a,a 
scan_wait: 
 cp a,(hl)              ; Wait for Idle mode 
 jr nz,scan_wait 
 ld a,(kbdG6) 
 bit kBitEnter,a 
 jp Z,drawFrame 
 jp waitForEnter
endGame:
 ld hl,155
 ld (posX),hl
 ld hl,110
 ld (posY),hl
 ld hl,$00
 ld (BackColor),hl
 ld hl,loseGame
 call drawString
 call blitScreen
 jp ExitPrgm
 ret
blitScreen:
 ld hl,bufData
 ld de,vRam
 ld bc,(lcdWidth*lcdHeight)-1
 ldir
 ld (hl),$00
 ld hl,bufData
 ld bc,(320*240)-1
 call _MemSet
 ret
DispHL:
    ld  bc,-1000000
    call    Num1
    ld  bc,-100000
    call    Num1
    ld  bc,-10000
    call    Num1
    ld  bc,-1000
    call    Num1
    ld  bc,-100
    call    Num1
    ld  c,-10
    call    Num1
    ld  c,-1
Num1:   ld  a,'0'-1
Num2:   inc a
    add hl,bc
    jr  c,Num2
    sbc hl,bc
    call drawChar
    ret
DrawSprite:
 ld h,lcdWidth/2       ; hl=160
 mlt hl                ; 160*y
 add hl,hl             ; hl*2
 add hl,bc             ; add x
 ld bc,bufData
 add hl,bc             ; offset vRam
 ld a,(de)             ; width
 ld (SpriteWidthSMC),a
 inc de
 ld a,(de)             ; height
 inc de
 ex de,hl
drawSpriteLoop:
SpriteWidthSMC: =$+1
 ld bc,0
 push de
  ldir                 ; draw line
 pop de
 ex de,hl
  ld bc,lcdWidth
  add hl,bc             ; move down
 ex de,hl
 dec a
 jr nz,drawSpriteLoop
 ret

ExitPrgm:
 call _ClrScrn          ; Clear the screen (white)
 ld a,lcdbpp16
 ld (mpLcdCtrl),a
 call _DrawStatusBar
 call _RunIndicOn
 ei
 ret

drawCircle: 
   di 
   ; outline 
   ; hl = cx, de = cy, bc = r, a = colour 
   ; 
   push hl 
   push de 
   exx 
   pop de 
   pop hl 
   exx 
   push bc 
   push bc 
   pop de 
   pop hl 
   add hl,hl 
   push hl 
   pop bc 
   ld hl,3 
   or a 
   sbc hl,bc 
   push hl 
   pop ix 
   ld hl,0 

drawCircle_Loop: 
   ; hl = x, de = y, ix = d 
   ; 
   or a 
   sbc hl,de 
   add hl,de 
   ret nc 
   ld c,ixh 
   bit 7,c 
   jr z,_dc_else 
   push hl 
   add hl,hl 
   add hl,hl 
   ld bc,6 
   add hl,bc 
   push hl 
   pop bc 
   add ix,bc 
   pop hl 
   jr _dc_end 
_dc_else: 
   push hl 
   or a 
   sbc hl,de 
   add hl,hl 
   add hl,hl 
   ld bc,10 
   add hl,bc 
   push hl 
   pop bc 
   add ix,bc 
   pop hl 
   dec de 
_dc_end: 
   call drawCircleSection 
   inc hl 
   jr drawCircle_Loop 

drawCircleSection: 
   call drawCirclePoints 
   ex de,hl 
   call drawCirclePoints 
   ex de,hl 
   ret 
drawCirclePoints: 
   push hl 
   exx 
   pop bc 
   push hl 
   add hl,bc               ; xc+x 
   exx 
   push de 
   exx 
   pop bc 
   ex de,hl 
   push hl 
   add hl,bc 
   ex de,hl 
   call drawPixel            ; yc+y 
   pop de 
   pop hl 
   exx 
   push hl 
   exx 
   pop bc 
   push hl 
   or a 
   sbc hl,bc               ; xc-x 
   exx 
   push de 
   exx 
   pop bc 
   ex de,hl 
   push hl 
   add hl,bc 
   ex de,hl 
   call drawPixel            ; yc+y 
   pop de 
   pop hl 
   exx 
   push hl 
   exx 
   pop bc 
   push hl 
   add hl,bc               ; xc+x 
   exx 
   push de 
   exx 
   pop bc 
   ex de,hl 
   push hl 
   or a 
   sbc hl,bc 
   ex de,hl 
   call drawPixel            ; yc-y 
   pop de 
   pop hl 
   exx 
   push hl 
   exx 
   pop bc 
   push hl 
   or a 
   sbc hl,bc               ; xc-x 
   exx 
   push de 
   exx 
   pop bc 
   ex de,hl 
   push hl 
   or a 
   sbc hl,bc 
   ex de,hl 
   call drawPixel            ; yc-y 
   pop de 
   pop hl 
   exx 
   ret 

drawPixel: 
   ; hl = x, de = y, a = colour (8-bit palette) 
   ; 
   bit 7,h 
   ret nz                           ; return if negative 
   bit 7,d 
   ret nz                           ; return if negative 
   push bc 
   ld bc,320 
   or a 
   sbc hl,bc 
   add hl,bc 
   pop bc 
   ret nc                           ; return if offscreen 
   ex de,hl 
   push bc 
   ld bc,240 
   or a 
   sbc hl,bc 
   add hl,bc 
   pop bc 
   ret nc                           ; return if offscreen 
   ld h,160 
   mlt hl 
   add hl,hl 
   add hl,de 
   ld de,bufData 
   add hl,de 
   ld (hl),a 
   ret 

drawString:
 ld a,(hl)
 inc hl
 or a
 ret z
 cp newlineByte
 ret z
 call drawChar
 jr drawString

drawChar:
 ld bc,(posX)
 push hl
 push af
 push de
 push bc
 push af
  ld a,(posY)
  push bc   ; Save X
   call compute8bpp
  pop de    ; de = Y
  add hl,de ; Add X
 pop af
 push hl
  or a
  sbc hl,hl
  ld l,a
  add hl,hl
  add hl,hl
  add hl,hl
  ex de,hl
  ld hl,char000
  add hl,de ; hl -> Correct Character
 pop de     ; de -> correct place to draw
 ld b,8
_iloop:
 push bc
  ld c,(hl)
  ld b,8
  ex de,hl
  push de
   ld de,(ForeColor)
_i2loop:
   ld (hl),d
   rlc c
   jr nc,+_
   ld (hl),e
_:
   inc hl
   djnz _i2loop
NextL:
   ld bc,320-8
   add hl,bc
  pop de
  ex de,hl
  inc hl
 pop bc
 djnz _iloop
 pop bc
 pop de
 pop af     ; character
 cp 128
 jr c,+_
 xor a
_:
 ld hl,CharSpacing
 call _AddHLAndA
 ld a,(hl)  ; A holds the amount to increment per character
 or a,a
 sbc hl,hl
 ld l,a
 add hl,bc
 push hl
 pop bc
 inc bc
 ld (posX),bc
 pop hl
 ret

;Gets width of character into A
getPixelWidth:
 cp 128
 jr c,+_
 xor a
_:
 ld hl,CharSpacing
 call _AddHLAndA
 ld a,(hl)  ; A holds the amount to increment per character
 inc a
 ret
compute8bpp:
 ld de,320
 call multDEA
SwapBufferLoc_SMC: =$+1
 ld de,bufData
 add hl,de
 ret
multDEA:
 ld b,8
 or a
 sbc hl,hl
 add hl,hl
 rlca
 jr nc,$+3
 add hl,de
 djnz $-5
 ret
redCircle: 
    .db 64,64
    .db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
    .db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
    .db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
    .db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
    .db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
    .db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
    .db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
    .db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
    .db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
    .db $00,$00,$00,$00,$00,$00,$00,$00,$00,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$00,$00,$00,$00,$00,$00,$00,$00,$00
    .db $00,$00,$00,$00,$00,$00,$00,$00,$00,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$00,$00,$00,$00,$00,$00,$00,$00,$00
    .db $00,$00,$00,$00,$00,$00,$00,$00,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$00,$00,$00,$00,$00,$00,$00,$00
    .db $00,$00,$00,$00,$00,$00,$00,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$00,$00,$00,$00,$00,$00,$00
    .db $00,$00,$00,$00,$00,$00,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$00,$00,$00,$00,$00,$00
    .db $00,$00,$00,$00,$00,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$00,$00,$00,$00,$00
    .db $00,$00,$00,$00,$00,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$00,$00,$00,$00,$00
    .db $00,$00,$00,$00,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$00,$00,$00,$00
    .db $00,$00,$00,$00,$f8,$f8,$f8,$f8,$f8,$f8,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$f8,$f8,$f8,$f8,$f8,$f8,$00,$00,$00,$00
    .db $00,$00,$00,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$00,$00,$00
    .db $00,$00,$00,$f8,$f8,$f8,$f8,$f8,$f8,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$f8,$f8,$f8,$f8,$f8,$f8,$00,$00,$00
    .db $00,$00,$f8,$f8,$f8,$f8,$f8,$f8,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$f8,$f8,$f8,$f8,$f8,$f8,$00,$00
    .db $00,$00,$f8,$f8,$f8,$f8,$f8,$f8,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$f8,$f8,$f8,$f8,$f8,$f8,$00,$00
    .db $00,$00,$f8,$f8,$f8,$f8,$f8,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$f8,$f8,$f8,$f8,$f8,$00,$00
    .db $00,$f8,$f8,$f8,$f8,$f8,$f8,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$f8,$f8,$f8,$f8,$f8,$f8,$00
    .db $00,$f8,$f8,$f8,$f8,$f8,$f8,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$f8,$f8,$f8,$f8,$f8,$f8,$00
    .db $00,$f8,$f8,$f8,$f8,$f8,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$f8,$f8,$f8,$f8,$f8,$00
    .db $00,$f8,$f8,$f8,$f8,$f8,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$f8,$f8,$f8,$f8,$f8,$00
    .db $f8,$f8,$f8,$f8,$f8,$f8,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$f8,$f8,$f8,$f8,$f8,$f8
    .db $f8,$f8,$f8,$f8,$f8,$f8,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$f8,$f8,$f8,$f8,$f8,$f8
    .db $f8,$f8,$f8,$f8,$f8,$f8,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$f8,$f8,$f8,$f8,$f8,$f8
    .db $f8,$f8,$f8,$f8,$f8,$f8,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$f8,$f8,$f8,$f8,$f8,$f8
    .db $f8,$f8,$f8,$f8,$f8,$f8,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$f8,$f8,$f8,$f8,$f8,$f8
    .db $f8,$f8,$f8,$f8,$f8,$f8,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$f8,$f8,$f8,$f8,$f8,$f8
    .db $f8,$f8,$f8,$f8,$f8,$f8,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$f8,$f8,$f8,$f8,$f8,$f8
    .db $f8,$f8,$f8,$f8,$f8,$f8,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$f8,$f8,$f8,$f8,$f8,$f8
    .db $f8,$f8,$f8,$f8,$f8,$f8,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$f8,$f8,$f8,$f8,$f8,$f8
    .db $f8,$f8,$f8,$f8,$f8,$f8,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$f8,$f8,$f8,$f8,$f8,$f8
    .db $00,$f8,$f8,$f8,$f8,$f8,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$f8,$f8,$f8,$f8,$f8,$00
    .db $00,$f8,$f8,$f8,$f8,$f8,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$f8,$f8,$f8,$f8,$f8,$00
    .db $00,$f8,$f8,$f8,$f8,$f8,$f8,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$f8,$f8,$f8,$f8,$f8,$f8,$00
    .db $00,$f8,$f8,$f8,$f8,$f8,$f8,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$f8,$f8,$f8,$f8,$f8,$f8,$00
    .db $00,$00,$f8,$f8,$f8,$f8,$f8,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$f8,$f8,$f8,$f8,$f8,$00,$00
    .db $00,$00,$f8,$f8,$f8,$f8,$f8,$f8,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$f8,$f8,$f8,$f8,$f8,$00,$00
    .db $00,$00,$f8,$f8,$f8,$f8,$f8,$f8,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$f8,$f8,$f8,$f8,$f8,$f8,$00,$00
    .db $00,$00,$00,$f8,$f8,$f8,$f8,$f8,$f8,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$f8,$f8,$f8,$f8,$f8,$f8,$00,$00,$00
    .db $00,$00,$00,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$00,$00,$00
    .db $00,$00,$00,$00,$f8,$f8,$f8,$f8,$f8,$f8,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$f8,$f8,$f8,$f8,$f8,$f8,$00,$00,$00,$00
    .db $00,$00,$00,$00,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$00,$00,$00,$00
    .db $00,$00,$00,$00,$00,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$00,$00,$00,$00,$00
    .db $00,$00,$00,$00,$00,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$00,$00,$00,$00,$00
    .db $00,$00,$00,$00,$00,$00,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$00,$00,$00,$00,$00,$00
    .db $00,$00,$00,$00,$00,$00,$00,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$00,$00,$00,$00,$00,$00,$00
    .db $00,$00,$00,$00,$00,$00,$00,$00,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$00,$00,$00,$00,$00,$00,$00,$00
    .db $00,$00,$00,$00,$00,$00,$00,$00,$00,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$00,$00,$00,$00,$00,$00,$00,$00,$00
    .db $00,$00,$00,$00,$00,$00,$00,$00,$00,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$00,$00,$00,$00,$00,$00,$00,$00,$00
    .db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
    .db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
    .db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$fa,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
    .db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
    .db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
    .db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
    .db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
    .db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
    .db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$f8,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
ForeColor:
 .db $FF
BackColor:
 .db $fa
loseGame:
 .db "Game Over",0
CharSpacing:
 ;   0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F
 .db 8,8,8,7,7,7,8,8,8,8,8,8,8,1,8,8
 .db 7,7,8,8,8,8,8,8,8,8,8,8,8,8,8,8
 .db 2,3,5,7,7,7,7,4,4,4,8,6,3,6,2,7
 .db 7,6,7,7,7,7,7,7,7,7,2,3,5,6,5,6
 .db 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7
 .db 7,7,7,7,8,7,7,7,7,7,7,4,7,4,7,8
 .db 3,7,7,7,7,7,7,7,7,4,7,7,4,7,7,7
 .db 7,7,7,7,6,7,7,7,7,7,7,6,2,6,7,7
 .db 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7 ; Everything past this point will be 7.

Char000: .db $00,$00,$00,$00,$00,$00,$00,$00    ; .
Char001: .db $7E,$81,$A5,$81,$BD,$BD,$81,$7E    ; .
Char002: .db $7E,$FF,$DB,$FF,$C3,$C3,$FF,$7E    ; .
Char003: .db $6C,$FE,$FE,$FE,$7C,$38,$10,$00    ; .
Char004: .db $10,$38,$7C,$FE,$7C,$38,$10,$00    ; .
Char005: .db $38,$7C,$38,$FE,$FE,$10,$10,$7C    ; .
Char006: .db $00,$18,$3C,$7E,$FF,$7E,$18,$7E    ; .
Char007: .db $00,$00,$18,$3C,$3C,$18,$00,$00    ; .
Char008: .db $FF,$FF,$E7,$C3,$C3,$E7,$FF,$FF    ; .
Char009: .db $00,$3C,$66,$42,$42,$66,$3C,$00    ; .
Char010: .db $FF,$C3,$99,$BD,$BD,$99,$C3,$FF    ; .
Char011: .db $0F,$07,$0F,$7D,$CC,$CC,$CC,$78    ; .
Char012: .db $3C,$66,$66,$66,$3C,$18,$7E,$18    ; .
Char013: .db $3F,$33,$3F,$30,$30,$70,$F0,$E0    ; .
Char014: .db $7F,$63,$7F,$63,$63,$67,$E6,$C0    ; .
Char015: .db $99,$5A,$3C,$E7,$E7,$3C,$5A,$99    ; .
Char016: .db $80,$E0,$F8,$FE,$F8,$E0,$80,$00    ; .
Char017: .db $02,$0E,$3E,$FE,$3E,$0E,$02,$00    ; .
Char018: .db $18,$3C,$7E,$18,$18,$7E,$3C,$18    ; .
Char019: .db $66,$66,$66,$66,$66,$00,$66,$00    ; .
Char020: .db $7F,$DB,$DB,$7B,$1B,$1B,$1B,$00    ; .
Char021: .db $3F,$60,$7C,$66,$66,$3E,$06,$FC    ; .
Char022: .db $00,$00,$00,$00,$7E,$7E,$7E,$00    ; .
Char023: .db $18,$3C,$7E,$18,$7E,$3C,$18,$FF    ; .
Char024: .db $18,$3C,$7E,$18,$18,$18,$18,$00    ; .
Char025: .db $18,$18,$18,$18,$7E,$3C,$18,$00    ; .
Char026: .db $00,$18,$0C,$FE,$0C,$18,$00,$00    ; .
Char027: .db $00,$30,$60,$FE,$60,$30,$00,$00    ; .
Char028: .db $00,$00,$C0,$C0,$C0,$FE,$00,$00    ; .
Char029: .db $00,$24,$66,$FF,$66,$24,$00,$00    ; .
Char030: .db $00,$18,$3C,$7E,$FF,$FF,$00,$00    ; .
Char031: .db $00,$FF,$FF,$7E,$3C,$18,$00,$00    ; .
Char032: .db $00,$00,$00,$00,$00,$00,$00,$00    ;  
Char033: .db $C0,$C0,$C0,$C0,$C0,$00,$C0,$00    ; !
Char034: .db $D8,$D8,$D8,$00,$00,$00,$00,$00    ; "
Char035: .db $6C,$6C,$FE,$6C,$FE,$6C,$6C,$00    ; #
Char036: .db $18,$7E,$C0,$7C,$06,$FC,$18,$00    ; $
Char037: .db $00,$C6,$CC,$18,$30,$66,$C6,$00    ; %
Char038: .db $38,$6C,$38,$76,$DC,$CC,$76,$00    ; &
Char039: .db $30,$30,$60,$00,$00,$00,$00,$00    ; '
Char040: .db $30,$60,$C0,$C0,$C0,$60,$30,$00    ; (
Char041: .db $C0,$60,$30,$30,$30,$60,$C0,$00    ; )
Char042: .db $00,$66,$3C,$FF,$3C,$66,$00,$00    ; *
Char043: .db $00,$30,$30,$FC,$FC,$30,$30,$00    ; +
Char044: .db $00,$00,$00,$00,$00,$60,$60,$C0    ; ,
Char045: .db $00,$00,$00,$FC,$00,$00,$00,$00    ; -
Char046: .db $00,$00,$00,$00,$00,$C0,$C0,$00    ; .
Char047: .db $06,$0C,$18,$30,$60,$C0,$80,$00    ; /
Char048: .db $7C,$CE,$DE,$F6,$E6,$C6,$7C,$00    ; 0
Char049: .db $30,$70,$30,$30,$30,$30,$FC,$00    ; 1
Char050: .db $7C,$C6,$06,$7C,$C0,$C0,$FE,$00    ; 2
Char051: .db $FC,$06,$06,$3C,$06,$06,$FC,$00    ; 3
Char052: .db $0C,$CC,$CC,$CC,$FE,$0C,$0C,$00    ; 4
Char053: .db $FE,$C0,$FC,$06,$06,$C6,$7C,$00    ; 5
Char054: .db $7C,$C0,$C0,$FC,$C6,$C6,$7C,$00    ; 6
Char055: .db $FE,$06,$06,$0C,$18,$30,$30,$00    ; 7
Char056: .db $7C,$C6,$C6,$7C,$C6,$C6,$7C,$00    ; 8
Char057: .db $7C,$C6,$C6,$7E,$06,$06,$7C,$00    ; 9
Char058: .db $00,$C0,$C0,$00,$00,$C0,$C0,$00    ; :
Char059: .db $00,$60,$60,$00,$00,$60,$60,$C0    ; ;
Char060: .db $18,$30,$60,$C0,$60,$30,$18,$00    ; <
Char061: .db $00,$00,$FC,$00,$FC,$00,$00,$00    ; =
Char062: .db $C0,$60,$30,$18,$30,$60,$C0,$00    ; >
Char063: .db $78,$CC,$18,$30,$30,$00,$30,$00    ; ?
Char064: .db $7C,$C6,$DE,$DE,$DE,$C0,$7E,$00    ; @
Char065: .db $38,$6C,$C6,$C6,$FE,$C6,$C6,$00    ; A
Char066: .db $FC,$C6,$C6,$FC,$C6,$C6,$FC,$00    ; B
Char067: .db $7C,$C6,$C0,$C0,$C0,$C6,$7C,$00    ; C
Char068: .db $F8,$CC,$C6,$C6,$C6,$CC,$F8,$00    ; D
Char069: .db $FE,$C0,$C0,$F8,$C0,$C0,$FE,$00    ; E
Char070: .db $FE,$C0,$C0,$F8,$C0,$C0,$C0,$00    ; F
Char071: .db $7C,$C6,$C0,$C0,$CE,$C6,$7C,$00    ; G
Char072: .db $C6,$C6,$C6,$FE,$C6,$C6,$C6,$00    ; H
Char073: .db $7E,$18,$18,$18,$18,$18,$7E,$00    ; I
Char074: .db $06,$06,$06,$06,$06,$C6,$7C,$00    ; J
Char075: .db $C6,$CC,$D8,$F0,$D8,$CC,$C6,$00    ; K
Char076: .db $C0,$C0,$C0,$C0,$C0,$C0,$FE,$00    ; L
Char077: .db $C6,$EE,$FE,$FE,$D6,$C6,$C6,$00    ; M
Char078: .db $C6,$E6,$F6,$DE,$CE,$C6,$C6,$00    ; N
Char079: .db $7C,$C6,$C6,$C6,$C6,$C6,$7C,$00    ; O
Char080: .db $FC,$C6,$C6,$FC,$C0,$C0,$C0,$00    ; P
Char081: .db $7C,$C6,$C6,$C6,$D6,$DE,$7C,$06    ; Q
Char082: .db $FC,$C6,$C6,$FC,$D8,$CC,$C6,$00    ; R
Char083: .db $7C,$C6,$C0,$7C,$06,$C6,$7C,$00    ; S
Char084: .db $FF,$18,$18,$18,$18,$18,$18,$00    ; T
Char085: .db $C6,$C6,$C6,$C6,$C6,$C6,$FE,$00    ; U
Char086: .db $C6,$C6,$C6,$C6,$C6,$7C,$38,$00    ; V
Char087: .db $C6,$C6,$C6,$C6,$D6,$FE,$6C,$00    ; W
Char088: .db $C6,$C6,$6C,$38,$6C,$C6,$C6,$00    ; X
Char089: .db $C6,$C6,$C6,$7C,$18,$30,$E0,$00    ; Y
Char090: .db $FE,$06,$0C,$18,$30,$60,$FE,$00    ; Z
Char091: .db $F0,$C0,$C0,$C0,$C0,$C0,$F0,$00    ; [
Char092: .db $C0,$60,$30,$18,$0C,$06,$02,$00    ; \
Char093: .db $F0,$30,$30,$30,$30,$30,$F0,$00    ; ]
Char094: .db $10,$38,$6C,$C6,$00,$00,$00,$00    ; ^
Char095: .db $00,$00,$00,$00,$00,$00,$00,$FF    ; _
Char096: .db $C0,$C0,$60,$00,$00,$00,$00,$00    ; `
Char097: .db $00,$00,$7C,$06,$7E,$C6,$7E,$00    ; a
Char098: .db $C0,$C0,$C0,$FC,$C6,$C6,$FC,$00    ; b
Char099: .db $00,$00,$7C,$C6,$C0,$C6,$7C,$00    ; c
Char100: .db $06,$06,$06,$7E,$C6,$C6,$7E,$00    ; d
Char101: .db $00,$00,$7C,$C6,$FE,$C0,$7C,$00    ; e
Char102: .db $1C,$36,$30,$78,$30,$30,$78,$00    ; f
Char103: .db $00,$00,$7E,$C6,$C6,$7E,$06,$FC    ; g
Char104: .db $C0,$C0,$FC,$C6,$C6,$C6,$C6,$00    ; h
Char105: .db $60,$00,$E0,$60,$60,$60,$F0,$00    ; i
Char106: .db $06,$00,$06,$06,$06,$06,$C6,$7C    ; j
Char107: .db $C0,$C0,$CC,$D8,$F8,$CC,$C6,$00    ; k
Char108: .db $E0,$60,$60,$60,$60,$60,$F0,$00    ; l
Char109: .db $00,$00,$CC,$FE,$FE,$D6,$D6,$00    ; m
Char110: .db $00,$00,$FC,$C6,$C6,$C6,$C6,$00    ; n
Char111: .db $00,$00,$7C,$C6,$C6,$C6,$7C,$00    ; o
Char112: .db $00,$00,$FC,$C6,$C6,$FC,$C0,$C0    ; p
Char113: .db $00,$00,$7E,$C6,$C6,$7E,$06,$06    ; q
Char114: .db $00,$00,$FC,$C6,$C0,$C0,$C0,$00    ; r
Char115: .db $00,$00,$7E,$C0,$7C,$06,$FC,$00    ; s
Char116: .db $30,$30,$FC,$30,$30,$30,$1C,$00    ; t
Char117: .db $00,$00,$C6,$C6,$C6,$C6,$7E,$00    ; u
Char118: .db $00,$00,$C6,$C6,$C6,$7C,$38,$00    ; v
Char119: .db $00,$00,$C6,$C6,$D6,$FE,$6C,$00    ; w
Char120: .db $00,$00,$C6,$6C,$38,$6C,$C6,$00    ; x
Char121: .db $00,$00,$C6,$C6,$C6,$7E,$06,$FC    ; y
Char122: .db $00,$00,$FE,$0C,$38,$60,$FE,$00    ; z
Char123: .db $1C,$30,$30,$E0,$30,$30,$1C,$00    ; {
Char124: .db $C0,$C0,$C0,$00,$C0,$C0,$C0,$00    ; |
Char125: .db $E0,$30,$30,$1C,$30,$30,$E0,$00    ; }
Char126: .db $76,$DC,$00,$00,$00,$00,$00,$00    ; ~
Char127: .db $00,$10,$38,$6C,$C6,$C6,$FE,$00    ; .
Char128: .db $7C,$C6,$C0,$C0,$C0,$D6,$7C,$30    ; .
Char129: .db $C6,$00,$C6,$C6,$C6,$C6,$7E,$00    ; .
Char130: .db $0E,$00,$7C,$C6,$FE,$C0,$7C,$00    ; .
Char131: .db $7E,$81,$3C,$06,$7E,$C6,$7E,$00    ; .
Char132: .db $66,$00,$7C,$06,$7E,$C6,$7E,$00    ; .
Char133: .db $E0,$00,$7C,$06,$7E,$C6,$7E,$00    ; .
Char134: .db $18,$18,$7C,$06,$7E,$C6,$7E,$00    ; .
Char135: .db $00,$00,$7C,$C6,$C0,$D6,$7C,$30    ; .
Char136: .db $7E,$81,$7C,$C6,$FE,$C0,$7C,$00    ; .
Char137: .db $66,$00,$7C,$C6,$FE,$C0,$7C,$00    ; .
Char138: .db $E0,$00,$7C,$C6,$FE,$C0,$7C,$00    ; .
Char139: .db $66,$00,$38,$18,$18,$18,$3C,$00    ; .
Char140: .db $7C,$82,$38,$18,$18,$18,$3C,$00    ; .
Char141: .db $70,$00,$38,$18,$18,$18,$3C,$00    ; .
Char142: .db $C6,$10,$7C,$C6,$FE,$C6,$C6,$00    ; .
Char143: .db $38,$38,$00,$7C,$C6,$FE,$C6,$00    ; .
Char144: .db $0E,$00,$FE,$C0,$F8,$C0,$FE,$00    ; .
Char145: .db $00,$00,$7F,$0C,$7F,$CC,$7F,$00    ; .
Char146: .db $3F,$6C,$CC,$FF,$CC,$CC,$CF,$00    ; .
Char147: .db $7C,$82,$7C,$C6,$C6,$C6,$7C,$00    ; .
Char148: .db $66,$00,$7C,$C6,$C6,$C6,$7C,$00    ; .
Char149: .db $E0,$00,$7C,$C6,$C6,$C6,$7C,$00    ; .
Char150: .db $7C,$82,$00,$C6,$C6,$C6,$7E,$00    ; .
Char151: .db $E0,$00,$C6,$C6,$C6,$C6,$7E,$00    ; .
Char152: .db $66,$00,$66,$66,$66,$3E,$06,$7C    ; .
Char153: .db $C6,$7C,$C6,$C6,$C6,$C6,$7C,$00    ; .
Char154: .db $C6,$00,$C6,$C6,$C6,$C6,$FE,$00    ; .
Char155: .db $18,$18,$7E,$D8,$D8,$D8,$7E,$18    ; .
Char156: .db $38,$6C,$60,$F0,$60,$66,$FC,$00    ; .
Char157: .db $66,$66,$3C,$18,$7E,$18,$7E,$18    ; .
Char158: .db $F8,$CC,$CC,$FA,$C6,$CF,$C6,$C3    ; .
Char159: .db $0E,$1B,$18,$3C,$18,$18,$D8,$70    ; .
Char160: .db $0E,$00,$7C,$06,$7E,$C6,$7E,$00    ; .
Char161: .db $1C,$00,$38,$18,$18,$18,$3C,$00    ; .
Char162: .db $0E,$00,$7C,$C6,$C6,$C6,$7C,$00    ; .
Char163: .db $0E,$00,$C6,$C6,$C6,$C6,$7E,$00    ; .
Char164: .db $00,$FE,$00,$FC,$C6,$C6,$C6,$00    ; .
Char165: .db $FE,$00,$C6,$E6,$F6,$DE,$CE,$00    ; .
Char166: .db $3C,$6C,$6C,$3E,$00,$7E,$00,$00    ; .
Char167: .db $3C,$66,$66,$3C,$00,$7E,$00,$00    ; .
Char168: .db $18,$00,$18,$18,$30,$66,$3C,$00    ; .
Char169: .db $00,$00,$00,$FC,$C0,$C0,$00,$00    ; .
Char170: .db $00,$00,$00,$FC,$0C,$0C,$00,$00    ; .
Char171: .db $C6,$CC,$D8,$3F,$63,$CF,$8C,$0F    ; .
Char172: .db $C3,$C6,$CC,$DB,$37,$6D,$CF,$03    ; .
Char173: .db $18,$00,$18,$18,$18,$18,$18,$00    ; .
Char174: .db $00,$33,$66,$CC,$66,$33,$00,$00    ; .
Char175: .db $00,$CC,$66,$33,$66,$CC,$00,$00    ; .
Char176: .db $22,$88,$22,$88,$22,$88,$22,$88    ; .
Char177: .db $55,$AA,$55,$AA,$55,$AA,$55,$AA    ; .
Char178: .db $DD,$77,$DD,$77,$DD,$77,$DD,$77    ; .
Char179: .db $18,$18,$18,$18,$18,$18,$18,$18    ; .
Char180: .db $18,$18,$18,$18,$F8,$18,$18,$18    ; .
Char181: .db $18,$18,$F8,$18,$F8,$18,$18,$18    ; .
Char182: .db $36,$36,$36,$36,$F6,$36,$36,$36    ; .
Char183: .db $00,$00,$00,$00,$FE,$36,$36,$36    ; .
Char184: .db $00,$00,$F8,$18,$F8,$18,$18,$18    ; .
Char185: .db $36,$36,$F6,$06,$F6,$36,$36,$36    ; .
Char186: .db $36,$36,$36,$36,$36,$36,$36,$36    ; .
Char187: .db $00,$00,$FE,$06,$F6,$36,$36,$36    ; .
Char188: .db $36,$36,$F6,$06,$FE,$00,$00,$00    ; .
Char189: .db $36,$36,$36,$36,$FE,$00,$00,$00    ; .
Char190: .db $18,$18,$F8,$18,$F8,$00,$00,$00    ; .
Char191: .db $00,$00,$00,$00,$F8,$18,$18,$18    ; .
Char192: .db $18,$18,$18,$18,$1F,$00,$00,$00    ; .
Char193: .db $18,$18,$18,$18,$FF,$00,$00,$00    ; .
Char194: .db $00,$00,$00,$00,$FF,$18,$18,$18    ; .
Char195: .db $18,$18,$18,$18,$1F,$18,$18,$18    ; .
Char196: .db $00,$00,$00,$00,$FF,$00,$00,$00    ; .
Char197: .db $18,$18,$18,$18,$FF,$18,$18,$18    ; .
Char198: .db $18,$18,$1F,$18,$1F,$18,$18,$18    ; .
Char199: .db $36,$36,$36,$36,$37,$36,$36,$36    ; .
Char200: .db $36,$36,$37,$30,$3F,$00,$00,$00    ; .
Char201: .db $00,$00,$3F,$30,$37,$36,$36,$36    ; .
Char202: .db $36,$36,$F7,$00,$FF,$00,$00,$00    ; .
Char203: .db $00,$00,$FF,$00,$F7,$36,$36,$36    ; .
Char204: .db $36,$36,$37,$30,$37,$36,$36,$36    ; .
Char205: .db $00,$00,$FF,$00,$FF,$00,$00,$00    ; .
Char206: .db $36,$36,$F7,$00,$F7,$36,$36,$36    ; .
Char207: .db $18,$18,$FF,$00,$FF,$00,$00,$00    ; .
Char208: .db $36,$36,$36,$36,$FF,$00,$00,$00    ; .
Char209: .db $00,$00,$FF,$00,$FF,$18,$18,$18    ; .
Char210: .db $00,$00,$00,$00,$FF,$36,$36,$36    ; .
Char211: .db $36,$36,$36,$36,$3F,$00,$00,$00    ; .
Char212: .db $18,$18,$1F,$18,$1F,$00,$00,$00    ; .
Char213: .db $00,$00,$1F,$18,$1F,$18,$18,$18    ; .
Char214: .db $00,$00,$00,$00,$3F,$36,$36,$36    ; .
Char215: .db $36,$36,$36,$36,$FF,$36,$36,$36    ; .
Char216: .db $18,$18,$FF,$18,$FF,$18,$18,$18    ; .
Char217: .db $18,$18,$18,$18,$F8,$00,$00,$00    ; .
Char218: .db $00,$00,$00,$00,$1F,$18,$18,$18    ; .
Char219: .db $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF    ; .
Char220: .db $00,$00,$00,$00,$FF,$FF,$FF,$FF    ; .
Char221: .db $F0,$F0,$F0,$F0,$F0,$F0,$F0,$F0    ; .
Char222: .db $0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F    ; .
Char223: .db $FF,$FF,$FF,$FF,$00,$00,$00,$00    ; .
Char224: .db $00,$00,$76,$DC,$C8,$DC,$76,$00    ; .
Char225: .db $38,$6C,$6C,$78,$6C,$66,$6C,$60    ; .
Char226: .db $00,$FE,$C6,$C0,$C0,$C0,$C0,$00    ; .
Char227: .db $00,$00,$FE,$6C,$6C,$6C,$6C,$00    ; .
Char228: .db $FE,$60,$30,$18,$30,$60,$FE,$00    ; .
Char229: .db $00,$00,$7E,$D8,$D8,$D8,$70,$00    ; .
Char230: .db $00,$66,$66,$66,$66,$7C,$60,$C0    ; .
Char231: .db $00,$76,$DC,$18,$18,$18,$18,$00    ; .
Char232: .db $7E,$18,$3C,$66,$66,$3C,$18,$7E    ; .
Char233: .db $3C,$66,$C3,$FF,$C3,$66,$3C,$00    ; .
Char234: .db $3C,$66,$C3,$C3,$66,$66,$E7,$00    ; .
Char235: .db $0E,$18,$0C,$7E,$C6,$C6,$7C,$00    ; .
Char236: .db $00,$00,$7E,$DB,$DB,$7E,$00,$00    ; .
Char237: .db $06,$0C,$7E,$DB,$DB,$7E,$60,$C0    ; .
Char238: .db $38,$60,$C0,$F8,$C0,$60,$38,$00    ; .
Char239: .db $78,$CC,$CC,$CC,$CC,$CC,$CC,$00    ; .
Char240: .db $00,$7E,$00,$7E,$00,$7E,$00,$00    ; .
Char241: .db $18,$18,$7E,$18,$18,$00,$7E,$00    ; .
Char242: .db $60,$30,$18,$30,$60,$00,$FC,$00    ; .
Char243: .db $18,$30,$60,$30,$18,$00,$FC,$00    ; .
Char244: .db $0E,$1B,$1B,$18,$18,$18,$18,$18    ; .
Char245: .db $18,$18,$18,$18,$18,$D8,$D8,$70    ; .
Char246: .db $18,$18,$00,$7E,$00,$18,$18,$00    ; .
Char247: .db $00,$76,$DC,$00,$76,$DC,$00,$00    ; .
Char248: .db $38,$6C,$6C,$38,$00,$00,$00,$00    ; .
Char249: .db $00,$00,$00,$18,$18,$00,$00,$00    ; .
Char250: .db $00,$00,$00,$00,$18,$00,$00,$00    ; .
Char251: .db $0F,$0C,$0C,$0C,$EC,$6C,$3C,$1C    ; .
Char252: .db $78,$6C,$6C,$6C,$6C,$00,$00,$00    ; .
Char253: .db $7C,$0C,$7C,$60,$7C,$00,$00,$00    ; .
Char254: .db $00,$00,$3C,$3C,$3C,$3C,$00,$00    ; .
Char255: .db $00,$10,$00,$00,$00,$00,$00,$00    ; NULL

Improved keypad

If you would be so kind to commit some keypad changes, that would be fantastic :)

Emulator interaction with the outside world

Issue #15 mentions a set of use cases for cooperation inside the emulated environment; there's also a set of use cases for cooperation outside the emulated environment.

Here are several suggestions:

  • the ability to send files to the emulator, trigger keypresses, retrieve a snapshot of the console / a subset of the addressing space and MMIO / whatever, stream events to the outside in a publish-subscribe fashion (console, processor exceptions, data watches, etc.);
  • the ability to communicate with real calculators;
  • the ability to communicate with virtual calculators.

Existing practices and code bases in community code bases include:

  • TIEmu's D-Bus interface (interoperable but relatively complex and heavyweight) and OLE interface (platform-specific) make it possible to e.g. send files to the emulator;
  • the portable libti* stack takes care of lower and higher layers of communication with real and virtual calculators. TIEmu and TilEm use it.

Other technical options include, but are far from limited to:

  • ZeroMQ for transporting messages, or maybe its newer nanomsg offspring, whose future is more cloudy;
  • Cap'n Proto for message definition, serialization and deserialization, or its better-known, much more heavyweight Protocol Buffers ancestor.

Of course, I'm biased by having been the maintainer (not the creator) of both libti* and TIEmu for 6 years and a half. But libti* stack, where I'm focusing instead of the unmaintainable TIEmu mess, is the community's GPL'ed reference implementation of a calculator <-> computer communication stack. While it's not perfect, it has a significant number of good things, I / Benjamin Moody / Jonimus (mainly, plus contributors) have been improving it a lot over time, and it's not wise to shun it entirely.

Like in issue #15, more brainstorming is needed, then we'll be able to create multiple, more focused issues :)

Inaccurate cycle times on block instructions

On the EZ80, block instructions such as LDIR only fetch the opcode bytes on the first iteration, and thus all the following iterations (until the end condition is reached or an interrupt occurs) will run faster. Currently CEmu refetches the opcode bytes every iteration like on the Z80, causing a noticeable performance drop in some programs.

Breakpoints need to be easily editable

There should be a way to easily edit the address of a breakpoint, much like how it is in the port monitor view. Also, the disassembly view should only update the line in the disassembly that needs updating, rather than the whole thing, as this is pretty annoying.

LCD DMA is not implemented

This causes some games and programs that operate in higher bpp modes (even 16bpp v 8bpp) to run much too quickly.

Command-line arguments

While it's not interaction once launched, it's somewhat related to issue #16.

There was talk on #cemu-dev (especially with @alberthdev) about possible command-line arguments for CEmu when launching it. Ideas included:

  • which ROM to load,
  • which file(s) to send once ready
  • which key(s) to press after that
  • which GUI setup to use
  • etc.

Any more ideas/questions etc. welcome.

(again) screen bug

little bug / glitch,
nothing very special.
so, i was trolling aroud on CEmu and when i shoosed scale: 400% the whole screen was a mess.
( i know how to fix "easy" ;) )
schermopname 144

(here fun glitch ,
schermopname 147

(Not issue) Idea!

If the cemu comes out on android or ti-nspire cx or ...
would you be able to send programs from the ti-84ce to the nspire cx or phone ?
cemu

Core instruction issue.

For some odd reason, this executes incorrectly inside the core: (Set a breakpoint at D1AC18 to see)

The instruction in question is 'ld ix,6'. However, it executes as 'ld hl,6' in this context.

To test it, run the program Asm(pgrmGRAPHICS

Image:

USB emulation

Ths needs to be fIxd so i can calculate the os!!1111!!!1

Missing Flash handlers

Title says all. Probably need things that allow use to simulate locking and unlocking of flash sectors and memory.

Search in RAM fails

When I try to search in the RAM in the Memory console for a program name, it fails and I get the error:
Runtime Error!

Program: C:...............

This application has requested the Runtime to terminate it in an unusual way. Please contact the application's support team for more information.

http://i.imgur.com/rKKTEaK.png

I ran it under Windows 10

Unable to build on windows

I've installed the latest Qt5 SDK for windows (64bit) and attempted to build the project.
After running qmake, and then "Build All" I get the following output:

10:42:16: Running steps for project CEmu...
10:42:16: Configuration unchanged, skipping qmake step.
10:42:16: Starting: "C:\Qt\Qt5.5.1\Tools\QtCreator\bin\jom.exe" 
    C:\Qt\Qt5.5.1\Tools\QtCreator\bin\jom.exe -f Makefile.Debug
    cl -c -nologo -Zc:wchar_t -FS -W -Wall -Wno-unused-parameter -Werror=shadow -Werror=write-strings -Werror=redundant-decls -Werror=format -Werror=format-security -Werror=implicit-function-declaration -Werror=date-time -Werror=missing-prototypes -Werror=return-type -Werror=pointer-arith -fno-strict-overflow -Winit-self -ffunction-sections -fdata-sections -fno-exceptions -Zi -MDd -GR -W3 -w34100 -w34189 -w44996 -EHsc /Fddebug\CEmu.pdb -DUNICODE -DWIN32 -DWIN64 -DCEMU_VERSION=0.2 -DQT_QML_DEBUG -DQT_DECLARATIVE_DEBUG -DQT_QUICKWIDGETS_LIB -DQT_QUICK_LIB -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_QML_LIB -DQT_NETWORK_LIB -DQT_CORE_LIB -I..\CEmu -I. -IC:\Qt\Qt5.5.1\5.5\msvc2013_64\include -IC:\Qt\Qt5.5.1\5.5\msvc2013_64\include\QtQuickWidgets -IC:\Qt\Qt5.5.1\5.5\msvc2013_64\include\QtQuick -IC:\Qt\Qt5.5.1\5.5\msvc2013_64\include\QtWidgets -IC:\Qt\Qt5.5.1\5.5\msvc2013_64\include\QtGui -IC:\Qt\Qt5.5.1\5.5\msvc2013_64\include\QtANGLE -IC:\Qt\Qt5.5.1\5.5\msvc2013_64\include\QtQml -IC:\Qt\Qt5.5.1\5.5\msvc2013_64\include\QtNetwork -IC:\Qt\Qt5.5.1\5.5\msvc2013_64\include\QtCore -Idebug -I. -IC:\Qt\Qt5.5.1\5.5\msvc2013_64\mkspecs\win32-msvc2013 -Fodebug\ @C:\Users\NATHAN~1\AppData\Local\Temp\main.obj.9772.63.jom
cl : Command line error D8004 : '/W' requires an argument
jom: C:\Users\Nathaniel\Documents\GitHub\build-CEmu-Desktop_Qt_5_5_1_MSVC2013_64bit-Debug\Makefile.Debug [debug\main.obj] Error 2
    cl -c -nologo -Zc:wchar_t -FS -W -Wall -Wno-unused-parameter -Werror=shadow -Werror=write-strings -Werror=redundant-decls -Werror=format -Werror=format-security -Werror=implicit-function-declaration -Werror=date-time -Werror=missing-prototypes -Werror=return-type -Werror=pointer-arith -fno-strict-overflow -Winit-self -ffunction-sections -fdata-sections -fno-exceptions -Zi -MDd -GR -W3 -w34100 -w34189 -w44996 -EHsc /Fddebug\CEmu.pdb -DUNICODE -DWIN32 -DWIN64 -DCEMU_VERSION=0.2 -DQT_QML_DEBUG -DQT_DECLARATIVE_DEBUG -DQT_QUICKWIDGETS_LIB -DQT_QUICK_LIB -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_QML_LIB -DQT_NETWORK_LIB -DQT_CORE_LIB -I..\CEmu -I. -IC:\Qt\Qt5.5.1\5.5\msvc2013_64\include -IC:\Qt\Qt5.5.1\5.5\msvc2013_64\include\QtQuickWidgets -IC:\Qt\Qt5.5.1\5.5\msvc2013_64\include\QtQuick -IC:\Qt\Qt5.5.1\5.5\msvc2013_64\include\QtWidgets -IC:\Qt\Qt5.5.1\5.5\msvc2013_64\include\QtGui -IC:\Qt\Qt5.5.1\5.5\msvc2013_64\include\QtANGLE -IC:\Qt\Qt5.5.1\5.5\msvc2013_64\include\QtQml -IC:\Qt\Qt5.5.1\5.5\msvc2013_64\include\QtNetwork -IC:\Qt\Qt5.5.1\5.5\msvc2013_64\include\QtCore -Idebug -I. -IC:\Qt\Qt5.5.1\5.5\msvc2013_64\mkspecs\win32-msvc2013 -Fodebug\ @C:\Users\NATHAN~1\AppData\Local\Temp\lcdwidget.obj.9772.78.jom
    cl -c -nologo -Zc:wchar_t -FS -W -Wall -Wno-unused-parameter -Werror=shadow -Werror=write-strings -Werror=redundant-decls -Werror=format -Werror=format-security -Werror=implicit-function-declaration -Werror=date-time -Werror=missing-prototypes -Werror=return-type -Werror=pointer-arith -fno-strict-overflow -Winit-self -ffunction-sections -fdata-sections -fno-exceptions -Zi -MDd -GR -W3 -w34100 -w34189 -w44996 -EHsc /Fddebug\CEmu.pdb -DUNICODE -DWIN32 -DWIN64 -DCEMU_VERSION=0.2 -DQT_QML_DEBUG -DQT_DECLARATIVE_DEBUG -DQT_QUICKWIDGETS_LIB -DQT_QUICK_LIB -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_QML_LIB -DQT_NETWORK_LIB -DQT_CORE_LIB -I..\CEmu -I. -IC:\Qt\Qt5.5.1\5.5\msvc2013_64\include -IC:\Qt\Qt5.5.1\5.5\msvc2013_64\include\QtQuickWidgets -IC:\Qt\Qt5.5.1\5.5\msvc2013_64\include\QtQuick -IC:\Qt\Qt5.5.1\5.5\msvc2013_64\include\QtWidgets -IC:\Qt\Qt5.5.1\5.5\msvc2013_64\include\QtGui -IC:\Qt\Qt5.5.1\5.5\msvc2013_64\include\QtANGLE -IC:\Qt\Qt5.5.1\5.5\msvc2013_64\include\QtQml -IC:\Qt\Qt5.5.1\5.5\msvc2013_64\include\QtNetwork -IC:\Qt\Qt5.5.1\5.5\msvc2013_64\include\QtCore -Idebug -I. -IC:\Qt\Qt5.5.1\5.5\msvc2013_64\mkspecs\win32-msvc2013 -Fodebug\ @C:\Users\NATHAN~1\AppData\Local\Temp\qtkeypadbridge.obj.9772.78.jom
    cl -c -nologo -Zc:wchar_t -FS -W -Wall -Wno-unused-parameter -Werror=shadow -Werror=write-strings -Werror=redundant-decls -Werror=format -Werror=format-security -Werror=implicit-function-declaration -Werror=date-time -Werror=missing-prototypes -Werror=return-type -Werror=pointer-arith -fno-strict-overflow -Winit-self -ffunction-sections -fdata-sections -Zi -MDd -W3 /Fddebug\CEmu.pdb -DUNICODE -DWIN32 -DWIN64 -DCEMU_VERSION=0.2 -DQT_QML_DEBUG -DQT_DECLARATIVE_DEBUG -DQT_QUICKWIDGETS_LIB -DQT_QUICK_LIB -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_QML_LIB -DQT_NETWORK_LIB -DQT_CORE_LIB -I..\CEmu -I. -IC:\Qt\Qt5.5.1\5.5\msvc2013_64\include -IC:\Qt\Qt5.5.1\5.5\msvc2013_64\include\QtQuickWidgets -IC:\Qt\Qt5.5.1\5.5\msvc2013_64\include\QtQuick -IC:\Qt\Qt5.5.1\5.5\msvc2013_64\include\QtWidgets -IC:\Qt\Qt5.5.1\5.5\msvc2013_64\include\QtGui -IC:\Qt\Qt5.5.1\5.5\msvc2013_64\include\QtANGLE -IC:\Qt\Qt5.5.1\5.5\msvc2013_64\include\QtQml -IC:\Qt\Qt5.5.1\5.5\msvc2013_64\include\QtNetwork -IC:\Qt\Qt5.5.1\5.5\msvc2013_64\include\QtCore -Idebug -I. -IC:\Qt\Qt5.5.1\5.5\msvc2013_64\mkspecs\win32-msvc2013 -Fodebug\ @C:\Users\NATHAN~1\AppData\Local\Temp\asic.obj.9772.78.jom
cl : Command line error D8004 : cl : Command line error D8004 : '/W' requires an argument'/W' requires an argument

jom: C:\Users\Nathaniel\Documents\GitHub\build-CEmu-Desktop_Qt_5_5_1_MSVC2013_64bit-Debug\Makefile.Debug [debug\lcdwidget.obj] Error 2
jom: C:\Users\Nathaniel\Documents\GitHub\build-CEmu-Desktop_Qt_5_5_1_MSVC2013_64bit-Debug\Makefile.Debug [debug\qtkeypadbridge.obj] Error 2
cl : Command line error D8004 : '/W' requires an argument
jom: C:\Users\Nathaniel\Documents\GitHub\build-CEmu-Desktop_Qt_5_5_1_MSVC2013_64bit-Debug\Makefile.Debug [debug\asic.obj] Error 2
jom: C:\Users\Nathaniel\Documents\GitHub\build-CEmu-Desktop_Qt_5_5_1_MSVC2013_64bit-Debug\Makefile [debug] Error 2
10:42:16: The process "C:\Qt\Qt5.5.1\Tools\QtCreator\bin\jom.exe" exited with code 2.
Error while building/deploying project CEmu (kit: Desktop Qt 5.5.1 MSVC2013 64bit)
When executing step "Make"
10:42:16: Elapsed time: 00:00.

I seem to be getting a lot of cl : Command line error D8004 : '/W' requires an argument errors.

A way to display the back buffer / second half of the VRAM in case of 8bpp

When we're using double-buffering (so, in 8bpp mode), It'd be neat to be able to have a secondary display showing the other half of the VRAM, so as to be able to debug what's happening on the other buffer while the first is being shown on the [primary] LCD.

I guess a secondary LCDWidget in a popup would work? Or yet another dock (but created/destroyed dynamically)?

Wrong emulation of keypad scanning (?)

Something isn't getting emulated "correctly" regarding keypad scanning - at least the behaviour differs from the hardware.

Mandragore (direct download link ; online C IDE link), a C game by @critor, doesn't behave the same way on CEmu and actual hardware.
It's pretty easily noticeable, because on CEmu, key releases don't seem to be taken into account, while they are on hardware. Thus, the character keeps moving in the pressed direction on CEmu, but only moves by one step on calc, which is the intended behaviour.

I believe @mateoconlechuga mentioned something about undefined behaviour with the scanning mode, some time ago, but even if it's the cause of the issue in this case, CEmu should still implement whatever undefined/wrong behaviours and bugs that the actual calculator has, since the goal of an emulator is to have something reproducing the device as closely as possible, for accuracy's sake and proper debugging :)

Console debugging

It would be especially handy if we could have the debugger open on a certain illegal instruction, or some way to print to the console from a running program. This would make debugging C programs a lot easier.

Saving and Restoring State

So ,everytime when i start the emulator ,it says "ram cleared" is it a bug or not?
( for people who are making programs trough the emulator , and when they log on its cleared :l )

ps; how its going for the TI-nspire CX ;)

Watchdog timer is broken

Using these codes to initialize the timer and read the values is broken: (Doesn't update, maybe?)

.nolist 
#include "ti84pce.inc" 
.list 
.org userMem-2 
.db tExtTok,tAsm84CeCmp 
.assume ADL=1 


    di
    xor a,a
    ld  hl,$f1000c 
    ld  (hl),%11001
    ld  de,$ffffff 
    ld  l,$04 
    ld  (hl),de
    ld  de,$5ab9ff
    ld  l,$07
    ld  (hl),de

_:  ld  b,0
_:  djnz    -_
    dec a
    jr  nz,--_

    ld  hl,($f10000)
    jp  _DispHL

This code always prints 64897 on calc; with a slight variation of +-1, which isn't too crucial. CEmu currently does not; it returns 64950

CEmu screen issue

my screen resolution is 1366 x 768
and this is what happens :l
schermopname 94

somethimes i can't place the screen on top of the keyboard

schermopname 100

CEmu hangs/pegs CPU if throttling is disabled when the OS is in low power mode

This is probably not explicitly due to anything special about the OS's low power mode, just the emulator running too fast and metaphorically tripping over its own feet somehow.

There may simply be a way to fix something so that the emulator can run at these insane speeds without failing. But if not, a workaround could be to still perform throttling when "disabled," but limit to a very high factor, like 10,000%.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.