145 lines
3 KiB
NASM
145 lines
3 KiB
NASM
arch nes.cpu
|
|
|
|
output "decode.bin", create
|
|
fill 65536
|
|
origin 0
|
|
|
|
macro align(size) { // Align Byte Amount
|
|
while (pc() % {size}) {
|
|
db 0
|
|
}
|
|
}
|
|
|
|
macro nops(new_pc) {
|
|
if (pc() > {new_pc}) {
|
|
error "PC is already past the point specified"
|
|
}
|
|
while (pc() < {new_pc}) {
|
|
print "adding a byte of padding at "
|
|
print pc()
|
|
print "\n"
|
|
nop
|
|
}
|
|
}
|
|
|
|
define version(6)
|
|
|
|
fill 8, $02 // jams
|
|
|
|
start:
|
|
cld // clear BCD flag
|
|
clc // clear carry
|
|
clv // clear overflow
|
|
// TODO: what i actually should be doing is an RTI
|
|
pla
|
|
pla
|
|
tax
|
|
tay
|
|
nop //php // push processor status just to advance stack a bit
|
|
|
|
macro when_to_stop() {
|
|
if 1 {
|
|
lda $02
|
|
cmp #(name1 & 0xFF)
|
|
beq decode_begin_next
|
|
cmp #(name2 & 0xFF)
|
|
beq decode_begin_next
|
|
cmp #(name3 & 0xFF)
|
|
beq decode_begin_next
|
|
cmp #(name4 & 0xFF)
|
|
beq decode_begin_next
|
|
cmp #(name5 & 0xFF)
|
|
beq decode_exit
|
|
} else {
|
|
// FIXME: doesn't work because output has already advanced to a null byte.
|
|
ldy #0
|
|
lda #$20 // ascii space
|
|
eor ($00),y // load from output
|
|
beq decode_begin_next
|
|
lda $02
|
|
cmp #(name5 & 0xFF)
|
|
beq decode_exit
|
|
}
|
|
}
|
|
|
|
// decode subroutine arguments:
|
|
lda #(names_out)
|
|
sta $00
|
|
lda #(names_out >> 8)
|
|
sta $01
|
|
lda #(names)
|
|
sta $02
|
|
lda #(names >> 8)
|
|
sta $03
|
|
jsr decode
|
|
db $D2 // jam (D for Done, i guess)
|
|
|
|
align(16)
|
|
// reorder() { python3 -c 's=__import__("sys").argv[1];print("".join(s[int(bin(len(s)|i)[-1:2:-1],2)] for i in range(len(s))))' "$@"; }
|
|
decode_lut0xxx:
|
|
db "ETAOINSH"
|
|
//db "EIASTNOH"
|
|
decode_lut10xx:
|
|
db "RDLU"
|
|
//db "RDLU"
|
|
if {version} >= 3 && {version} <= 6 {
|
|
db "????"
|
|
}
|
|
decode_lut11xxxx:
|
|
db "CMFPGWYBVKXJQZ. "
|
|
//db "CVGQFXY.MKWZPJB "
|
|
|
|
//origin 0x100 - 6 * 5 * 2
|
|
align(16)
|
|
names_out:
|
|
fill 6 * 5 * 2
|
|
|
|
db $FF
|
|
|
|
origin 0x200
|
|
names:
|
|
name0:
|
|
// FIXME: names are truncated unless they end in a padding byte!
|
|
db $0A,$4F,$4B,$70,$17,$FF // Elizabeth
|
|
name1:
|
|
db $C4,$A3,$6F,$FF,$FF,$FF // Mary 110001 00.10 1000 11.0110
|
|
name2:
|
|
db $CC,$86,$13,$04,$2F,$FF // Patricia
|
|
name3:
|
|
db $EC,$B1,$06,$FF,$FF,$FF // James 111011 00.10 110001. 0000 0110.
|
|
name4:
|
|
db $83,$DC,$20,$7F,$FF,$FF // Robert
|
|
name5:
|
|
|
|
origin 0x300
|
|
if {version} == 1 { ; include "decode_v1.asm"
|
|
} else if {version} == 2 { ;include "decode_v2.asm"
|
|
} else if {version} == 3 { ;include "decode_v3.asm"
|
|
} else if {version} == 4 { ;include "decode_v4.asm"
|
|
} else if {version} == 5 { ;include "decode_v5.asm"
|
|
} else if {version} == 6 { ;include "decode_v6.asm"
|
|
}
|
|
|
|
align(16)
|
|
db "DONE: "
|
|
dw done
|
|
|
|
origin 0xFFFC
|
|
db start
|
|
db start >> 8
|
|
|
|
//macro revbit(variable x) {
|
|
// evaluate lo(((x&(1<<7))>>7)|((x&(1<<6))>>5)|((x&(1<<5))>>3)|((x&(1<<4))>>1))
|
|
// evaluate hi(((x&(1<<3))<<1)|((x&(1<<2))<<3)|((x&(1<<1))<<5)|((x&(1<<0))<<7))
|
|
// db {lo}|{hi}
|
|
//}
|
|
//macro makename(variable a, variable b, variable c, variable d, variable e) {
|
|
// revbit(a)
|
|
// revbit(b)
|
|
// revbit(c)
|
|
// revbit(d)
|
|
// revbit(e)
|
|
//}
|
|
//makename($01,$23,$45,$67,$89)
|
|
|
|
// vim:ft=snes_bass
|