atari7800: display list, new memory map, logIllegal()

This commit is contained in:
Steven Hugg 2019-09-09 11:21:35 -05:00
parent 818386a5d2
commit 86e2866660
17 changed files with 751 additions and 21 deletions

View File

@ -6,7 +6,10 @@ TODO:
- confuse code/data in listing
- show memory locations hovering over lines
- don't check against ROM signatures
- DASM: macro forward refs
- DASM
- macro forward refs
- labels start with . omit timing info (isCode)
- spaces in filename don't parse code listing (DASM, maybe more)
- asm: support macro expansion
- multiple breakpoints, expression breakpoints
- watchpoints
@ -31,7 +34,6 @@ TODO:
- click to break on raster position
- restructure src/ folders
- debug bankswitching for funky formats
- spaces in filename don't parse code listing (DASM, maybe more)
- 'undefined' for bitmap replacer
- requestInterrupt needs to be disabled after breakpoint?
- C/asm source formatter
@ -123,6 +125,7 @@ TODO:
- separate Scope View
- single-stepping vector games makes screen fade
- break on stack overflow, illegal op, bad access, BRK, etc
- show in scope instead?
- nes
- replay doesn't work for nes (force background tile redraw)
- nes debug view toolbar
@ -179,6 +182,7 @@ TODO:
- can't step back twice?
- compiler bug in chase
- "shared" in URL doesn't work, leave in URL? (also importURL)
- segments disappear in memory map when binary unchanged
- TypeError: null is not an object (evaluating 'n.destination')
https://8bitworkshop.com/v3.4.1/javatari.js/release/javatari/javatari.js
@ -307,6 +311,23 @@ Assets come from:
- structured data (palette, sprites, metasprites, levels, etc)
- think about new comment format, platform-specific types
Programmatic Asset Language
- load PNG, draw image, or generate bitmap font
- split into images
- paletteize
- fit into tileset/spriteset
- NES: 8x8 or 8x16 tiles
- 7800: 256xN slice
- VCS: 24xN playfield, 8xN sprite, 32xN big sprite
- generate data file (asm/c/bin)
- generate char mapping
- tile generator (makechr-like)
- metasprites too
- RLE compression
- check constraints
---
Github Support

6
package-lock.json generated
View File

@ -1819,6 +1819,12 @@
"tough-cookie": "^2.3.3"
}
},
"rgbquant": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/rgbquant/-/rgbquant-1.1.2.tgz",
"integrity": "sha1-2V6Imo/LHmwaT6LMyL46QaL80YU=",
"dev": true
},
"rimraf": {
"version": "2.7.1",
"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",

View File

@ -26,6 +26,7 @@
"nightwatch": "^1.2.1",
"octokat": "^0.10.0",
"pngjs": "^3.3.3",
"rgbquant": "^1.1.2",
"typescript": "^3.6.2",
"typescript-formatter": "^7.2.2"
},

View File

@ -0,0 +1,518 @@
;;{w:8,h:16,bpp:2,count:128,brev:1,flip:1,remap:[0,8,9,10,11,1,2,3,4,5,6,7]};;
.segment "CHR0"
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $55,$55,$00,$00,$55,$55,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$14,$05,$50,$55,$55,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$05,$50
.byte $00,$00,$05,$50,$00,$00,$55,$55
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$15,$50
.byte $00,$00,$00,$00,$15,$40,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $14,$00,$00,$14,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$55,$00,$00,$00,$00,$00
.byte $01,$40,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $55,$55,$00,$00,$55,$55,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$14,$14,$14,$55,$55,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $01,$40,$00,$00,$00,$00,$00,$00
.byte $00,$50,$05,$00,$00,$00,$00,$00
.byte $01,$40,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$01,$40
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$14,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$05,$00
.byte $00,$00,$00,$50,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$14
.byte $00,$00,$00,$00,$00,$50,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $14,$00,$00,$14,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$01,$40,$00,$00,$00,$50
.byte $01,$40,$05,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $55,$55,$00,$00,$55,$55,$00,$00
.byte $00,$00,$00,$00,$00,$14,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$14,$00,$14,$55,$55,$15,$54
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $01,$40,$00,$54,$00,$00,$00,$00
.byte $01,$40,$01,$40,$00,$00,$00,$00
.byte $00,$50,$00,$00,$00,$00,$14,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$50
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$50,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$05,$00
.byte $00,$14,$00,$50,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$14
.byte $00,$00,$00,$00,$00,$50,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $14,$00,$00,$14,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$50,$00,$00,$01,$40
.byte $01,$40,$01,$40,$00,$00,$00,$00
.byte $00,$00,$15,$54,$15,$54,$00,$40
.byte $00,$00,$05,$54,$05,$54,$00,$00
.byte $55,$55,$00,$00,$55,$55,$15,$40
.byte $01,$40,$14,$00,$14,$55,$00,$00
.byte $14,$00,$00,$14,$01,$40,$14,$14
.byte $00,$14,$01,$50,$00,$00,$01,$40
.byte $01,$40,$01,$40,$00,$00,$00,$00
.byte $00,$00,$00,$00,$15,$54,$01,$40
.byte $00,$00,$01,$40,$00,$00,$05,$14
.byte $05,$50,$01,$45,$05,$45,$00,$00
.byte $01,$40,$01,$40,$00,$00,$00,$00
.byte $01,$50,$00,$00,$01,$50,$14,$00
.byte $01,$54,$00,$50,$15,$54,$05,$50
.byte $00,$14,$15,$40,$05,$50,$05,$00
.byte $05,$50,$05,$40,$01,$50,$01,$50
.byte $00,$14,$00,$00,$14,$00,$01,$40
.byte $15,$55,$14,$14,$15,$50,$05,$50
.byte $15,$40,$15,$54,$14,$00,$05,$54
.byte $14,$14,$05,$50,$05,$50,$14,$14
.byte $15,$54,$14,$05,$14,$05,$05,$50
.byte $14,$00,$05,$50,$14,$14,$05,$50
.byte $01,$40,$05,$50,$01,$40,$05,$14
.byte $14,$14,$01,$40,$15,$54,$05,$00
.byte $00,$14,$00,$50,$00,$00,$00,$00
.byte $00,$00,$05,$54,$15,$50,$05,$50
.byte $05,$54,$05,$50,$05,$00,$05,$54
.byte $14,$14,$15,$54,$00,$50,$14,$14
.byte $15,$54,$14,$05,$14,$14,$05,$50
.byte $15,$50,$05,$54,$14,$00,$15,$50
.byte $01,$54,$05,$54,$01,$40,$05,$14
.byte $14,$14,$05,$50,$15,$54,$01,$40
.byte $01,$40,$01,$40,$00,$00,$15,$54
.byte $00,$00,$50,$05,$55,$55,$01,$50
.byte $00,$40,$01,$50,$01,$50,$00,$00
.byte $55,$55,$05,$50,$50,$05,$50,$50
.byte $05,$50,$55,$00,$55,$15,$01,$40
.byte $15,$00,$00,$54,$05,$50,$14,$14
.byte $00,$14,$05,$50,$00,$00,$05,$50
.byte $01,$40,$05,$50,$00,$00,$00,$00
.byte $00,$00,$00,$00,$15,$54,$01,$40
.byte $00,$00,$01,$40,$00,$00,$05,$14
.byte $14,$14,$11,$45,$14,$14,$00,$00
.byte $05,$00,$00,$50,$00,$00,$00,$00
.byte $01,$50,$00,$00,$01,$50,$05,$00
.byte $05,$05,$00,$50,$14,$00,$14,$14
.byte $00,$14,$00,$50,$14,$14,$05,$00
.byte $14,$14,$01,$40,$01,$50,$01,$50
.byte $00,$50,$00,$00,$05,$00,$01,$40
.byte $50,$00,$14,$14,$14,$14,$14,$14
.byte $14,$50,$14,$00,$14,$00,$14,$14
.byte $14,$14,$01,$40,$14,$14,$14,$14
.byte $14,$00,$14,$05,$14,$05,$14,$14
.byte $14,$00,$14,$14,$14,$14,$14,$14
.byte $01,$40,$14,$14,$05,$50,$05,$14
.byte $14,$14,$01,$40,$14,$00,$05,$00
.byte $00,$50,$00,$50,$00,$00,$00,$00
.byte $00,$00,$14,$14,$14,$14,$14,$14
.byte $14,$14,$14,$00,$05,$00,$14,$14
.byte $14,$14,$01,$40,$00,$50,$14,$14
.byte $01,$40,$14,$45,$14,$14,$14,$14
.byte $14,$14,$14,$14,$14,$00,$00,$14
.byte $05,$00,$14,$14,$05,$50,$05,$14
.byte $14,$14,$14,$14,$14,$00,$01,$40
.byte $01,$40,$01,$40,$00,$00,$14,$14
.byte $00,$00,$41,$41,$54,$15,$05,$54
.byte $01,$50,$04,$44,$04,$44,$01,$40
.byte $54,$15,$14,$14,$41,$41,$50,$50
.byte $01,$40,$15,$00,$15,$05,$15,$54
.byte $15,$40,$01,$54,$15,$54,$00,$00
.byte $01,$54,$14,$14,$00,$00,$15,$54
.byte $01,$40,$15,$54,$01,$40,$01,$40
.byte $00,$00,$04,$10,$15,$54,$01,$40
.byte $00,$00,$00,$00,$00,$00,$15,$55
.byte $00,$14,$14,$54,$14,$14,$00,$00
.byte $05,$00,$00,$50,$05,$14,$01,$40
.byte $00,$00,$00,$00,$00,$00,$05,$00
.byte $05,$45,$00,$50,$05,$00,$14,$14
.byte $15,$55,$00,$14,$14,$14,$05,$00
.byte $14,$14,$00,$50,$00,$00,$00,$00
.byte $01,$40,$00,$00,$01,$40,$00,$00
.byte $50,$55,$14,$14,$14,$14,$14,$14
.byte $14,$14,$14,$00,$14,$00,$14,$14
.byte $14,$14,$01,$40,$14,$14,$14,$50
.byte $14,$00,$14,$05,$14,$05,$14,$14
.byte $14,$00,$14,$14,$14,$14,$00,$14
.byte $01,$40,$14,$14,$14,$14,$05,$14
.byte $14,$14,$01,$40,$14,$00,$05,$00
.byte $00,$50,$00,$50,$00,$00,$00,$00
.byte $00,$00,$14,$14,$14,$14,$14,$00
.byte $14,$14,$14,$00,$05,$00,$14,$14
.byte $14,$14,$01,$40,$00,$50,$14,$50
.byte $01,$40,$14,$45,$14,$14,$14,$14
.byte $14,$14,$14,$14,$14,$00,$00,$14
.byte $05,$00,$14,$14,$14,$14,$14,$45
.byte $05,$50,$14,$14,$05,$00,$05,$00
.byte $01,$40,$00,$50,$00,$00,$14,$14
.byte $00,$00,$45,$51,$50,$05,$15,$55
.byte $05,$54,$15,$15,$15,$55,$05,$50
.byte $50,$05,$50,$05,$05,$50,$50,$50
.byte $05,$50,$05,$00,$05,$05,$05,$50
.byte $15,$50,$05,$54,$01,$40,$14,$14
.byte $05,$54,$14,$14,$00,$00,$01,$40
.byte $01,$40,$01,$40,$00,$50,$05,$00
.byte $00,$00,$14,$14,$05,$50,$05,$50
.byte $00,$00,$01,$40,$00,$00,$05,$14
.byte $00,$50,$05,$00,$14,$55,$00,$00
.byte $05,$00,$00,$50,$01,$50,$01,$40
.byte $00,$00,$00,$00,$00,$00,$01,$40
.byte $05,$45,$00,$50,$01,$40,$00,$14
.byte $14,$14,$00,$14,$14,$14,$01,$40
.byte $14,$54,$05,$54,$00,$00,$00,$00
.byte $05,$00,$15,$54,$00,$50,$01,$40
.byte $51,$45,$15,$54,$14,$14,$14,$00
.byte $14,$14,$14,$00,$14,$00,$14,$54
.byte $14,$14,$01,$40,$00,$14,$14,$50
.byte $14,$00,$14,$45,$14,$15,$14,$14
.byte $14,$00,$14,$14,$14,$50,$00,$50
.byte $01,$40,$14,$14,$14,$14,$14,$45
.byte $04,$50,$01,$40,$05,$00,$05,$00
.byte $01,$40,$00,$50,$00,$00,$00,$00
.byte $00,$00,$05,$54,$14,$14,$14,$00
.byte $14,$14,$15,$54,$05,$00,$14,$14
.byte $14,$14,$01,$40,$00,$50,$15,$40
.byte $01,$40,$14,$45,$14,$14,$14,$14
.byte $14,$14,$14,$14,$14,$00,$05,$50
.byte $05,$00,$14,$14,$14,$14,$14,$45
.byte $01,$40,$14,$14,$01,$40,$14,$00
.byte $01,$40,$00,$14,$00,$00,$14,$14
.byte $00,$00,$40,$01,$55,$55,$15,$55
.byte $15,$55,$15,$15,$15,$55,$05,$50
.byte $50,$05,$50,$05,$05,$50,$50,$51
.byte $14,$14,$05,$00,$05,$05,$14,$14
.byte $15,$54,$15,$54,$01,$40,$14,$14
.byte $15,$54,$05,$50,$00,$00,$01,$40
.byte $01,$40,$01,$40,$15,$54,$15,$54
.byte $15,$54,$55,$55,$05,$50,$05,$50
.byte $00,$00,$01,$40,$00,$00,$05,$14
.byte $01,$40,$01,$40,$14,$00,$00,$00
.byte $05,$00,$00,$50,$15,$55,$15,$54
.byte $00,$00,$15,$54,$00,$00,$01,$40
.byte $05,$05,$00,$50,$00,$50,$01,$50
.byte $05,$14,$15,$50,$14,$14,$01,$40
.byte $05,$50,$14,$14,$00,$00,$00,$00
.byte $14,$00,$00,$00,$00,$14,$01,$40
.byte $51,$45,$14,$14,$15,$50,$14,$00
.byte $14,$14,$15,$50,$15,$50,$14,$00
.byte $15,$54,$01,$40,$00,$14,$15,$40
.byte $14,$00,$14,$45,$14,$55,$14,$14
.byte $15,$50,$14,$14,$15,$50,$01,$40
.byte $01,$40,$14,$14,$14,$14,$14,$45
.byte $01,$40,$05,$50,$01,$40,$05,$00
.byte $01,$40,$00,$50,$00,$00,$00,$00
.byte $00,$00,$00,$14,$14,$14,$14,$00
.byte $14,$14,$14,$14,$15,$54,$14,$14
.byte $14,$14,$01,$40,$00,$50,$14,$50
.byte $01,$40,$14,$45,$14,$14,$14,$14
.byte $14,$14,$14,$14,$15,$00,$14,$00
.byte $05,$00,$14,$14,$14,$14,$14,$45
.byte $05,$50,$14,$14,$00,$50,$05,$00
.byte $01,$40,$00,$50,$00,$00,$14,$14
.byte $00,$00,$40,$01,$55,$55,$15,$55
.byte $05,$54,$04,$44,$05,$54,$05,$50
.byte $50,$05,$50,$05,$05,$50,$15,$51
.byte $14,$14,$05,$00,$05,$05,$14,$14
.byte $15,$50,$05,$54,$01,$40,$14,$14
.byte $15,$54,$05,$40,$00,$00,$01,$40
.byte $01,$40,$01,$40,$00,$50,$05,$00
.byte $14,$00,$14,$14,$05,$50,$05,$50
.byte $00,$00,$05,$50,$00,$00,$05,$14
.byte $05,$00,$00,$50,$05,$40,$00,$00
.byte $05,$00,$00,$50,$01,$50,$01,$40
.byte $00,$00,$00,$00,$00,$00,$00,$50
.byte $05,$15,$00,$50,$00,$14,$00,$14
.byte $05,$14,$14,$00,$15,$50,$00,$50
.byte $15,$14,$14,$14,$01,$50,$01,$50
.byte $05,$00,$15,$54,$00,$50,$00,$50
.byte $50,$55,$14,$14,$14,$14,$14,$00
.byte $14,$14,$14,$00,$14,$00,$14,$00
.byte $14,$14,$01,$40,$00,$14,$14,$50
.byte $14,$00,$14,$45,$15,$45,$14,$14
.byte $14,$14,$14,$14,$14,$14,$05,$00
.byte $01,$40,$14,$14,$14,$14,$14,$45
.byte $01,$40,$14,$14,$00,$50,$05,$00
.byte $05,$00,$00,$50,$00,$00,$00,$00
.byte $00,$00,$00,$14,$14,$14,$14,$14
.byte $14,$14,$14,$14,$05,$00,$14,$14
.byte $14,$14,$01,$40,$00,$50,$14,$14
.byte $01,$40,$14,$45,$14,$14,$14,$14
.byte $14,$14,$14,$14,$14,$54,$14,$00
.byte $05,$00,$14,$14,$14,$14,$14,$45
.byte $14,$14,$14,$14,$00,$14,$01,$40
.byte $01,$40,$01,$40,$00,$00,$14,$14
.byte $00,$00,$44,$11,$51,$45,$15,$15
.byte $01,$50,$01,$50,$05,$54,$01,$40
.byte $54,$15,$14,$14,$41,$41,$00,$15
.byte $14,$14,$05,$54,$05,$55,$05,$50
.byte $15,$40,$01,$54,$15,$54,$14,$14
.byte $15,$54,$14,$00,$00,$00,$15,$54
.byte $15,$54,$01,$40,$01,$40,$01,$40
.byte $14,$00,$04,$10,$01,$40,$15,$54
.byte $00,$00,$05,$50,$14,$14,$15,$55
.byte $14,$00,$15,$14,$14,$50,$01,$40
.byte $01,$40,$01,$40,$05,$14,$01,$40
.byte $00,$00,$00,$00,$00,$00,$00,$50
.byte $05,$15,$15,$50,$14,$14,$14,$14
.byte $05,$14,$14,$00,$05,$00,$00,$50
.byte $14,$14,$14,$14,$01,$50,$01,$50
.byte $01,$40,$00,$00,$01,$40,$14,$14
.byte $50,$05,$14,$14,$14,$14,$14,$14
.byte $14,$14,$14,$00,$14,$00,$14,$14
.byte $14,$14,$01,$40,$00,$14,$14,$50
.byte $14,$00,$15,$15,$15,$05,$14,$14
.byte $14,$14,$14,$14,$14,$14,$14,$00
.byte $01,$40,$14,$14,$14,$14,$14,$05
.byte $05,$10,$14,$14,$00,$14,$05,$00
.byte $05,$00,$00,$50,$00,$00,$00,$00
.byte $00,$00,$05,$50,$15,$50,$05,$50
.byte $05,$54,$05,$50,$05,$00,$05,$54
.byte $15,$50,$15,$40,$05,$50,$14,$14
.byte $01,$40,$15,$54,$15,$50,$05,$50
.byte $15,$50,$05,$54,$14,$14,$05,$54
.byte $15,$54,$14,$14,$14,$14,$14,$05
.byte $14,$14,$14,$14,$15,$54,$01,$40
.byte $01,$40,$01,$40,$40,$54,$14,$14
.byte $00,$00,$44,$11,$51,$45,$04,$04
.byte $00,$40,$01,$50,$01,$50,$00,$00
.byte $55,$55,$05,$50,$50,$05,$00,$05
.byte $14,$14,$05,$04,$05,$05,$15,$54
.byte $15,$00,$00,$54,$05,$50,$14,$14
.byte $05,$54,$14,$14,$00,$00,$05,$50
.byte $05,$50,$01,$40,$00,$00,$00,$00
.byte $00,$00,$00,$00,$01,$40,$15,$54
.byte $00,$00,$05,$50,$14,$14,$05,$14
.byte $14,$14,$51,$44,$14,$50,$01,$40
.byte $01,$40,$01,$40,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$14
.byte $05,$05,$01,$50,$14,$14,$14,$14
.byte $05,$00,$14,$00,$01,$40,$00,$14
.byte $14,$14,$14,$14,$00,$00,$00,$00
.byte $00,$50,$00,$00,$05,$00,$14,$14
.byte $50,$05,$05,$50,$14,$14,$14,$14
.byte $14,$50,$14,$00,$14,$00,$14,$14
.byte $14,$14,$01,$40,$00,$14,$14,$14
.byte $14,$00,$14,$05,$14,$05,$14,$14
.byte $14,$14,$14,$14,$14,$14,$14,$14
.byte $01,$40,$14,$14,$14,$14,$14,$05
.byte $14,$14,$14,$14,$00,$14,$05,$00
.byte $14,$00,$00,$50,$00,$00,$00,$00
.byte $00,$00,$00,$00,$14,$00,$00,$00
.byte $00,$14,$00,$00,$05,$00,$00,$00
.byte $14,$00,$00,$00,$00,$00,$14,$00
.byte $01,$40,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $05,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$01,$40
.byte $01,$40,$01,$40,$51,$45,$05,$50
.byte $00,$00,$50,$05,$55,$55,$00,$00
.byte $00,$00,$00,$40,$00,$40,$00,$00
.byte $55,$55,$00,$00,$55,$55,$00,$55
.byte $05,$50,$05,$54,$05,$55,$01,$40
.byte $14,$00,$00,$14,$01,$40,$14,$14
.byte $01,$55,$05,$50,$00,$00,$01,$40
.byte $01,$40,$01,$40,$00,$00,$00,$00
.byte $00,$00,$00,$00,$01,$40,$15,$54
.byte $00,$00,$01,$40,$14,$14,$05,$14
.byte $05,$50,$51,$40,$05,$40,$01,$40
.byte $00,$50,$05,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$14
.byte $01,$54,$00,$50,$05,$50,$05,$50
.byte $05,$00,$15,$54,$01,$50,$15,$54
.byte $05,$50,$05,$50,$00,$00,$00,$00
.byte $00,$14,$00,$00,$14,$00,$05,$50
.byte $15,$54,$01,$40,$15,$50,$05,$50
.byte $15,$40,$15,$54,$15,$54,$05,$50
.byte $14,$14,$05,$50,$00,$14,$14,$14
.byte $14,$00,$14,$05,$14,$05,$05,$50
.byte $15,$50,$05,$50,$15,$50,$05,$50
.byte $15,$54,$14,$14,$14,$14,$14,$05
.byte $14,$14,$14,$14,$15,$54,$05,$50
.byte $14,$00,$05,$50,$14,$14,$00,$00
.byte $00,$50,$00,$00,$14,$00,$00,$00
.byte $00,$14,$00,$00,$01,$54,$00,$00
.byte $14,$00,$01,$40,$00,$50,$14,$00
.byte $15,$40,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $05,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$50
.byte $01,$40,$05,$00,$15,$01,$01,$40
.byte $00,$00,$15,$54,$15,$54,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $55,$55,$00,$00,$55,$55,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $01,$40,$15,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$05,$50,$00,$00
.byte $01,$40,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$01,$40,$00,$50,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $55,$55,$00,$00,$55,$55,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $01,$40,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$01,$40,$00,$00
.byte $05,$40,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $55,$55,$00,$00,$55,$55,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $55,$55,$00,$00,$55,$55,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
;; 4096 bytes

59
presets/atari7800/dlist.c Normal file
View File

@ -0,0 +1,59 @@
#include "atari7800.h"
#include <string.h>
byte DL[16][64];
DLLEntry DLL[16];
//#link "chr_font.s"
char* hello = "\2\4\6\0\220\222\102";
void setup_dll() {
byte i;
// set up DLL
byte* dlptr = &DL[0][0];
DLLEntry *dll = &DLL[0];
for (i=0; i<16; i++) {
dll->offset_flags = DLL_H16 | (16-1);
dll->dl_hi = (word)dlptr>>8;
dll->dl_lo = (byte)dlptr;
dlptr += sizeof(DL[0]);
dll++;
}
memset(DL, 0, sizeof(DL));
}
void main() {
setup_dll();
// set up display list
{
DL5Entry dl5;
dl5.data_hi = (word)hello>>8;
dl5.data_lo = (word)hello;
dl5.flags = DL5_INDIRECT;
dl5.width_pal = 32-8;
dl5.xpos = 32;
memcpy(DL[2], &dl5, sizeof(dl5));
}
// activate DMA
MARIA.CHARBASE = 0x80;
MARIA.DPPH = (word)DLL>>8;
MARIA.DPPL = (byte)DLL;
MARIA.CTRL = CTRL_DMA_ON | CTRL_DBLBYTE | CTRL_160AB;
MARIA.P0C1 = 0x2f;
MARIA.P0C2 = 0x1f;
MARIA.P0C3 = 0xf;
while (1) {
while ((MARIA.MSTAT & MSTAT_VBLANK) == 0) ;
while ((MARIA.MSTAT & MSTAT_VBLANK) != 0) ;
MARIA.BACKGRND = 0;
DL[2][4]++;
}
}

View File

@ -1,8 +1,8 @@
#!/bin/bash
. ./scripts/env.sh
VERSION=`git tag | tail -1`
#VERSION=`git tag -l HEAD`
#. ./scripts/env.sh
#VERSION=`git tag | tail -1`
VERSION=`git tag -l --points-at HEAD`
if [ "$VERSION" == "" ]; then
echo "No version at HEAD! Tag it first!"
exit 1

View File

@ -186,6 +186,7 @@ export interface ProbeTime {
export interface ProbeCPU {
logExecute(address:number);
logInterrupt(type:number);
logIllegal(address:number);
}
export interface ProbeBus {
@ -218,6 +219,7 @@ export class NullProbe implements ProbeAll {
logIOWrite() {}
logVRAMRead() {}
logVRAMWrite() {}
logIllegal() {}
}
/// CONVENIENCE

View File

@ -162,6 +162,8 @@ class MARIA {
}
}
readDLLEntry(bus) {
// display lists must be in RAM (TODO: probe?)
if (this.dll >= 0x4000) { return; }
let x = bus.read(this.dll);
this.offset = (x & 0xf);
this.h16 = (x & 0x40) != 0;
@ -204,6 +206,8 @@ class MARIA {
let b0 = bus.read(dlhi + ((dlofs+0) & 0x1ff));
let b1 = bus.read(dlhi + ((dlofs+1) & 0x1ff));
if (b1 == 0) break; // end of DL
// display lists must be in RAM (TODO: probe?)
if (dlhi >= 0x4000) { break; }
let b2 = bus.read(dlhi + ((dlofs+2) & 0x1ff));
let b3 = bus.read(dlhi + ((dlofs+3) & 0x1ff));
let indirect = false;
@ -335,7 +339,7 @@ export class Atari7800 extends BasicMachine implements RasterFrameBased {
[0x1800, 0x27ff, 0xffff, (a) => { return this.ram[a - 0x1800]; }],
[0x2800, 0x3fff, 0x7ff, (a) => { return this.read(a | 0x2000); }], // shadow
[0x4000, 0xffff, 0xffff, (a) => { return this.rom ? this.rom[a - 0x4000] : 0; }],
[0x0000, 0xffff, 0xffff, (a) => { return 0; }], // TODO
[0x0000, 0xffff, 0xffff, (a) => { return this.probe && this.probe.logIllegal(a); }],
]);
this.write = newAddressDecoder([
[0x0015, 0x001A, 0x1f, (a,v) => { this.xtracyc++; this.pokey1.setTIARegister(a, v); }],
@ -348,7 +352,7 @@ export class Atari7800 extends BasicMachine implements RasterFrameBased {
[0x1800, 0x27ff, 0xffff, (a,v) => { this.ram[a - 0x1800] = v; }],
[0x2800, 0x3fff, 0x7ff, (a,v) => { this.write(a | 0x2000, v); }], // shadow
[0xbfff, 0xbfff, 0xffff, (a,v) => { }], // TODO: bank switching?
[0x0000, 0xffff, 0xffff, (a,v) => { throw new EmuHalt("Write @ " + hex(a,4) + " " + hex(v,2)); }],
[0x0000, 0xffff, 0xffff, (a,v) => { this.probe && this.probe.logIllegal(a); }],
]);
this.connectCPUMemoryBus(this);
this.probeDMABus = this.probeIOBus(this);
@ -357,7 +361,14 @@ export class Atari7800 extends BasicMachine implements RasterFrameBased {
this.audioadapter = new TssChannelAdapter(this.pokey1, audioOversample, audioSampleRate);
}
readConst(a) { return this.read(a); } //TODO?
readConst(a) {
// make sure we don't log during this
let oldprobe = this.probe;
this.probe = null;
let v = this.read(a);
this.probe = oldprobe;
return v;
}
readInput(a:number) : number {
switch (a) {

View File

@ -352,10 +352,6 @@ var VerilogPlatform = function(mainElement, options) {
start() {
video = new RasterVideo(mainElement,videoWidth,videoHeight,{overscan:true});
video.create();
var ctx = video.getContext();
ctx.font = "8px TinyFont";
ctx.fillStyle = "white";
ctx.textAlign = "left";
poller = setKeyboardFromMap(video, switches, VERILOG_KEYCODE_MAP, (o,key,code,flags) => {
if (flags & KeyFlags.KeyPress) {
keycode = code | 0x80;

View File

@ -192,6 +192,7 @@ export enum ProbeFlags {
VRAM_READ = 0x06000000,
VRAM_WRITE = 0x07000000,
INTERRUPT = 0x08000000,
ILLEGAL = 0x09000000,
SCANLINE = 0x7e000000,
FRAME = 0x7f000000,
}
@ -284,6 +285,9 @@ export class ProbeRecorder implements ProbeAll {
logVRAMWrite(address:number, value:number) {
this.log(address | ProbeFlags.VRAM_WRITE);
}
logIllegal(address:number) {
this.log(address | ProbeFlags.ILLEGAL);
}
}

View File

@ -1074,6 +1074,7 @@ abstract class ProbeBitmapViewBase extends ProbeViewBase {
case ProbeFlags.VRAM_READ: s = "VRAM Read"; break;
case ProbeFlags.VRAM_WRITE: s = "VRAM Write"; break;
case ProbeFlags.INTERRUPT: s = "Interrupt"; break;
case ProbeFlags.ILLEGAL: s = "Error"; break;
default: s = ""; break;
}
return typeof addr == 'number' ? s + " " + this.addr2str(addr) : s;
@ -1100,6 +1101,7 @@ abstract class ProbeBitmapViewBase extends ProbeViewBase {
case ProbeFlags.VRAM_READ: return 0x808001;
case ProbeFlags.VRAM_WRITE: return 0x4080c0;
case ProbeFlags.INTERRUPT: return 0xcfcfcf;
case ProbeFlags.ILLEGAL: return 0x3f3fff;
default: return 0;
}
}

View File

@ -9,15 +9,24 @@ MEMORY {
HEADER: file = %O, start = $0000, size = $0080, fill = yes;
# ROM Bank
PRG: file = %O, start = $4000, size = $BFFA, fill = yes, define = yes;
PRG: file = %O, start = $4000, size = $4000, fill = yes, define = yes;
# DMA/Code Banks (interleaved for 4K Holey DMA)
CHR0: file = %O, start = $8000, size = $1000, fill = yes, define = yes;
PRG0: file = %O, start = $9000, size = $1000, fill = yes, define = yes;
CHR1: file = %O, start = $A000, size = $1000, fill = yes, define = yes;
PRG1: file = %O, start = $B000, size = $1000, fill = yes, define = yes;
CHR2: file = %O, start = $C000, size = $1000, fill = yes, define = yes;
PRG2: file = %O, start = $D000, size = $1000, fill = yes, define = yes;
CHR3: file = %O, start = $E000, size = $1000, fill = yes, define = yes;
PRG3: file = %O, start = $F000, size = $0FFA, fill = yes, define = yes;
# CPU Vectors
VECTORS: file = %O, start = $FFFA, size = $0006, fill = yes;
# standard 2k SRAM (-zeropage)
# $0140-$0200 cpu stack
# $0500-$0800 3 pages for cc65 parameter stack
RAM: file = "", start = $2200, size = __STACKSIZE__, define = yes;
RAM0: file = "", start = $1800, size = $840, define = yes;
RAM1: file = "", start = $2200, size = __STACKSIZE__, define = yes;
}
SEGMENTS {
ZEROPAGE: load = ZP, type = zp;
@ -26,9 +35,18 @@ SEGMENTS {
RODATA: load = PRG, type = ro, define = yes;
ONCE: load = PRG, type = ro, optional = yes;
CODE: load = PRG, type = ro, define = yes;
DATA: load = PRG, run = RAM, type = rw, define = yes;
DATA: load = PRG, run = RAM0, type = rw, define = yes;
CHR0: load = CHR0, type = ro, optional = yes;
PRG0: load = PRG0, type = ro, optional = yes;
CHR1: load = CHR1, type = ro, optional = yes;
PRG1: load = PRG1, type = ro, optional = yes;
CHR2: load = CHR2, type = ro, optional = yes;
PRG2: load = PRG2, type = ro, optional = yes;
CHR3: load = CHR3, type = ro, optional = yes;
PRG3: load = PRG3, type = ro, optional = yes;
VECTORS: load = VECTORS, type = ro;
BSS: load = RAM, type = bss, define = yes;
BSS: load = RAM0, type = bss, define = yes;
RAM1: load = RAM1, type = rw, optional = yes;
}
FEATURES {
CONDES: type = constructor,

Binary file not shown.

View File

@ -6,9 +6,11 @@
.export _HandyRTI
.export NMI,IRQ,START
.import initlib,push0,popa,popax,_main,zerobss,copydata
.importzp sp
; Linker generated symbols
.import __RAM_START__ ,__RAM_SIZE__
.import __RAM0_START__ ,__RAM0_SIZE__
.import __RAM1_START__ ,__RAM1_SIZE__
.import __ROM0_START__ ,__ROM0_SIZE__
.import __STARTUP_LOAD__,__STARTUP_RUN__,__STARTUP_SIZE__
.import __CODE_LOAD__ ,__CODE_RUN__ ,__CODE_SIZE__
@ -82,6 +84,15 @@ _exit:
cpx #$40
bne @3
; copy data segment
jsr copydata
; initialize cc65 stack
lda #<(__RAM1_START__+__RAM1_SIZE__)
sta sp
lda #>(__RAM1_START__+__RAM1_SIZE__)
sta sp+1
; init CC65 library
jsr initlib
; set interrupt vector in ZP
lda #<_HandyRTI
sta INTVEC

View File

@ -1 +0,0 @@
../../bitmap-fonts

View File

@ -1 +0,0 @@
../../ibmfonts

83
tools/png2a7800.js Executable file
View File

@ -0,0 +1,83 @@
#!/usr/bin/env node
var fs = require('fs'),
PNG = require('pngjs').PNG,
RgbQuant = require('rgbquant');
var data = fs.readFileSync(process.argv[2]);
var png = PNG.sync.read(data);
q = new RgbQuant();
q.colors = 4;
q.sample(png.data);
pal = q.palette(false, true);
//console.log(q);
function readfonttxt(s) {
var lines = s.split(/\r?\n/);// TODO
}
function remapBits(x, arr) {
if (!arr) return x;
var y = 0;
for (var i=0; i<arr.length; i++) {
var s = arr[i];
if (s < 0) {
s = -s-1;
y ^= 1 << s;
}
if (x & (1 << i)) {
y ^= 1 << s;
}
}
return y;
}
function reorder(arrin, remap) {
var out = [];
for (var i=0; i<arrin.length; i++) {
var j = remapBits(i, remap);
//console.log(i,j);
if (j >= arrin.length) throw i+" -> "+j+" >= "+arrin.length;
out.push(arrin[j] | 0);
}
return out;
}
function packbits(arrin, bpp, brev) {
var out = new Uint8Array((arrin.length * bpp) >> 3);
for (var i=0; i<arrin.length; i++) {
var j = (i * bpp) >> 3;
var s = (i * bpp) & 7;
if (brev) s = 8-bpp-s;
out[j] |= arrin[i] << s;
}
return out;
}
function hex(n) {
return (n < 16 ? "0" : "") + n.toString(16);
}
function dump(arr, bpl) {
var s = '';
for (var i=0; i<arr.length; i++) {
if (i % bpl == 0) {
s += '\n.byte ';
} else {
s += ',';
}
s += '$' + hex(arr[i]);
}
s += '\n';
return s;
}
idximg = q.reduce(png.data, 2);
//idximg = idximg.slice(0, 8*16*128);
//idximg = idximg.slice(8*16*64);
idx2 = reorder(idximg, [0,1,2,3,4,5,6,11,12,13,-8,-9,-10,-11]); // 8x16 font
//idx2 = reorder(idximg, [0,1,2,3,5,6,11,12,13,99,-8,-9,-10,-5]); // 8x16 CHR tileset
idx3 = packbits(idx2, 2, true);
//console.log(idximg.length, idx2.length, idx3.length);
console.log(dump(idx3, 8));
console.log(";;",idx3.length,"bytes,",pal.length/4,'colors');