The graphics themselves - so not the tilemap - could be created by making graphics in a blank file in Tile Molester - 8bpp linear codec -, and saving and incbin'ing it.
You have to use DMA to transport those graphics to the VRAM. Instead of storing #$18 to $43x1 and #$01 to $43x0, you have to store #$19 and #$00. So, something such as this:
CodeLDA #$80 ; \ Increase on $2119 write.
STA $2115 ; /
STZ $2116 ; \ VRAM addr = $0000
STZ $2117 ; /
LDX #$06
DMALoop:
LDA.l DMATbl,x
STA $4300,x ; Channel
DEX
BPL DMALoop
LDA #$01
STA $420B
; whatever code goes here
DMATbl:
db $00,$19
dl pwvram ; note: ONLY CHARACTER DATA
dw $4000 ; all bytes. If you have a file smaller than 16kb, choose that. You can also put beginning and end labels and use that, such as pwvramend-pwvrambegin
After that - at least, this is what I'd do -, change all tiles to zero with the following DMA routine:
CodeSTZ $2115 ; Increase on $2118 write.
STZ $2116 ; \ VRAM addr = $0000.
STZ $2117 ; /
LDX #$06
DMALoop2:
LDA.l DMATbl2,x
STA $4300,x
DEX
BPL DMALoop2
LDA #$01
STA $420B
; whatever code goes here
Zero:
db $00 ; note: you don't have to make a seperate table, you can choose whichever zero in the routine you want. But make sure that value remains zero.
DMATbl2:
db $08,$18
dl Zero
dw $4000 ; affects all tiles
Then, upload the tilemap. You could do this with another tilemap file - I myself created a small sort of 'Mode 7 specific' stripe image code that does that, though.
This was pretty much what peaceful house mentioned, but put into a routine. Sure, it's probably a bit slower, but the extra lag is minimal and not noticable when put into an area with force blank (and if you hijack the level load routine, you're doing just that).
I do not know if Tile Molester has any option to select only odd or even bytes. If it does, then you could include character data and tilemap in the same file and edit the graphics easily.
--------> Don't follow "Find Roy's Dignity",
my hack. Because it's pretty outdated.
<--------