MC-10でアセンブラやってみる その3

TVボーイ($F000-$FFFF)のゲームをMC-10($8000-$8FFF)にリロケートする際の変更方法。

キー入力の初期化

;    ldaa    #$7F
    ldaa    #$FF
    staa    $0000

VDGのアドレス

 clr $BFFF
;   clr $2000

    staa    $4065
;   staa    $1065

    ldaa    #$28
    staa    $BFFF
;   ldaa    #$11
;   staa    $2000

キャラクターテーブル

 ldx #$8E97
;   ldx #$FE97

    org $8e00
;   org $fe00

エミュレータデバッグしながら、キャラクタテーブルのアドレスを書き換えました。

;
;   File:       frogger.bin
;

    org $F000
START:
    clra
    staa    $0001
    staa    $0017
    coma
    staa    $0005
    ldaa    #$7F
    staa    $0000
    ldaa    #$0F
    staa    $0002
    lds #$00FF
    sei
    clra
    jsr LF9E5
LF018:
    clr $2000
    ldaa    #$20
    jsr LF9FB
    ldx #$FE97
    jsr LFA07
    ldx #$FEA8
    jsr LFA07
    ldx #$FEB2
    jsr LFA07
    ldx #$FEC2
    jsr LFA07
    ldx #$FF32
    jsr LFA07
    cli
    ldaa    #$FF
    staa    $005E
LF043:
    ldaa    $00C1
    bpl LF043
    clr $00C1
    dec $005E
    bne LF043
LF04F:
    clr $2000
    jsr LFC9E
    ldaa    #$20
    jsr LF9FB
    ldx #$FED0
    jsr LFA07
    ldx #$FEE6
    jsr LFA07
    ldx #$FEF1
    jsr LFA07
    ldaa    #$7E
    staa    $1065
    ldx #$0320
    clr $0044
LF077:
    cpx #$0300
    bpl LF0A9
    jsr LFC8C
    lsra
    lsra
    bcs LF092
    ldab    #$20
    stab    $10A5
    ldab    #$7E
    stab    $1065
    clr $0044
    bra LF0A1
;
LF092:
    lsra
    bcs LF0A1
    ldab    #$20
    stab    $1065
    ldab    #$7E
    stab    $10A5
    stab    $0044
LF0A1:
    jsr LFC81
    lsra
    lsra
    lsra
    bcc LF0B6
LF0A9:
    ldaa    $00C1
    bpl LF0A9
    clr $00C1
    dex
    bne LF077
    clra
    bra LF0B8
;
LF0B6:
    ldaa    #$FF
LF0B8:
    staa    $0043
    ldaa    #$11
    staa    $2000
    staa    $008C
    ldaa    #$55
XF0C3:
    jsr LF9FB
    clrb
    ldx #$10E0
LF0CA:
    dex
    stab    $00,x
    cpx #$1000
    bne LF0CA
    ldaa    #$08
    staa    $00A1
    staa    $00A2
    stab    $00A0
    staa    $36,x
    ldaa    #$A0
    staa    $00,x
    ldaa    #$20
    staa    $20,x
    staa    $40,x
    staa    $60,x
    staa    $2C,x
    staa    $4C,x
    staa    $6C,x
    staa    $2D,x
    staa    $6D,x
    ldaa    #$A8
    staa    $80,x
    staa    $0C,x
    staa    $8C,x
    staa    $16,x
    staa    $56,x
    staa    $96,x
    staa    $4B,x
    staa    $17,x
    staa    $57,x
    staa    $01,x
    staa    $41,x
    ldaa    #$88
    staa    $0B,x
    staa    $2B,x
    staa    $6B,x
    staa    $8B,x
    staa    $37,x
    staa    $21,x
    ldaa    #$80
    staa    $76,x
    staa    $61,x
    staa    $81,x
    staa    $77,x
    staa    $97,x
    ldaa    #$06
    staa    $0095
    ldd #$0304
    stab    $0067
    stab    $0096
    std $005E
    ldx #$10E4
    clra
LF135:
    jsr LFA20
    inx
    dec $005E
    bne LF135
    dec $005F
    beq LF14C
    ldab    #$04
    abx
    ldab    #$03
    stab    $005E
    bra LF135
;
LF14C:
    clrb
LF14D:
    ldx #$FDF7
    abx
    ldaa    $14,x
    psha
    ldaa    $0F,x
    psha
    ldaa    $0A,x
    psha
    ldaa    $05,x
    psha
    ldaa    $00,x
    psha
    ldx #$11C7
    ldaa    $005E
    cmpa    #$01
    bne LF16C
    ldx #$11D4
LF16C:
    cmpa    #$02
    bne LF173
    ldx #$1343
LF173:
    cmpa    #$03
    bne LF17A
    ldx #$1350
LF17A:
    abx
    jsr LFAA9
    incb
    cmpb    #$05
    bne LF14D
    inc $005E
    ldaa    $005E
    cmpa    #$04
    bne LF14C
    ldaa    #$FF
    ldx #$1400
LF191:
    staa    $00,x
    inx
    cpx #$14A0
    bne LF19E
    ldx #$1700
    bra LF191
;
LF19E:
    cpx #$17A0
    bne LF191
    ldx #$1285
    stx $00D2
    ldx #$FE33
    stx $00D0
    jsr LFDB5
    inx
    inx
    stx $00D2
    jsr LFDB5
    ldx #$1290
    stx $00D2
    jsr LFDB5
    inx
    inx
    stx $00D2
    jsr LFDB5
    ldx #$129B
    stx $00D2
    jsr LFDB5
    inx
    inx
    stx $00D2
    jsr LFDB5
    clrb
    stab    $005E
    stab    $005F
LF1DA:
    ldx #$FE5F
LF1DD:
    ldaa    $00,x
    psha
    dex
    cpx #$FE50
    bne LF1DD
    ldx #$14C7
    ldaa    $005F
    beq LF1F0
    ldx #$1643
LF1F0:
    abx
LF1F1:
    jsr LFAA9
    inx
    ldaa    $005E
    inca
    staa    $005E
    cmpa    #$03
    bne LF1F1
    addb    #$0A
    clr $005E
    cmpb    #$1E
    bne LF1DA
    clrb
    ldaa    $005F
    inca
    staa    $005F
    cmpa    #$02
    bne LF1DA
    clrb
    stab    $005E
LF214:
    ldx #$FE6E
LF217:
    ldaa    $00,x
    psha
    dex
    cpx #$FE5F
    bne LF217
    ldx #$1586
    abx
LF224:
    jsr LFAA9
    inx
    ldaa    $005E
    inca
    staa    $005E
    cmpa    #$03
    bne LF224
    addb    #$0A
    clr $005E
    cmpb    #$1E
    bne LF214
    ldaa    #$0A
    staa    $004E
    ldaa    #$10
    staa    $0051
    ldaa    #$06
    staa    $0054
    com $0094
    jsr LF90A
    cli
LF24D:
    ldaa    $0060
    staa    $0070
    ldd $0061
    std $0071
    jsr LF9C0
    ldx #$1003
    stx $0073
    jsr LF933
    ldaa    $0044
    bne LF273
    clra
    ldx #$1016
LF268:
    jsr LFA22
    inx
    cpx #$101F
    bne LF268
    bra LF293
;
LF273:
    ldx #$1016
    stx $00D2
    ldx #$FFAA
    stx $00D0
    jsr LFDB5
    ldaa    $0063
    staa    $0070
    ldd $0064
    std $0071
    jsr LF9C0
    ldx #$1019
    stx $0073
    jsr LF933
LF293:
    ldaa    $0040
    staa    $0070
    ldd $0041
    std $0071
    ldx #$100E
    stx $0073
    jsr LF933
    ldx #$10A0
    clr $00,x
    clr $01,x
    clr $16,x
    clr $17,x
    ldab    #$16
    ldaa    $005A
    bne LF2B5
    clrb
LF2B5:
    abx
    ldd #$FFFF
    std $00,x
    ldaa    $0069
    bmi LF2C2
    jmp LF34C
;
LF2C2:
    clr $2000
    clr $0043
    ldaa    #$20
    jsr LF9FB
    ldx #$FEFD
    jsr LFA07
    ldx #$FF09
    jsr LFA07
    ldx #$FF26
    jsr LFA07
    ldaa    $0060
    staa    $0070
    ldd $0061
    std $0071
    ldx #$11C7
    stx $0073
    jsr LFF4D
    ldaa    $0044
    beq LF309
    ldx #$FF2C
    jsr LFA07
    ldaa    $0063
    staa    $0070
    ldd $0064
    std $0071
    ldx #$11D5
    stx $0073
    jsr LFF4D
LF309:
    ldaa    $0040
    staa    $0070
    ldd $0041
    std $0071
    ldx #$1173
    stx $0073
    jsr LFF4D
    clra
    jsr LF9EF
    ldx #$0200
LF320:
    jsr LFC81
    coma
    bita    #$04
    beq LF32B
    jmp LF0B6
;
LF32B:
    bita    #$02
    beq LF332
LF32F:
    jmp LF04F
;
LF332:
    jsr LFC8C
    coma
    anda    #$1E
    bne LF32F
    cpx #$0000
    bne LF342
    jmp LF018
;
LF342:
    dex
LF343:
    ldaa    $00C1
    bpl LF343
    clr $00C1
    bra LF320
;
LF34C:
    ldaa    $0068
    bpl LF353
    jmp LF24D
;
LF353:
    ldaa    $006A
    beq LF397
LF357:
    ldaa    $00C1
    bpl LF357
    clr $00C1
    dec $006A
    bne LF357
    jsr LFC9E
    ldx #$1101
LF369:
    jsr LFA2D
    ldab    #$07
    abx
    cpx #$1124
    bne LF369
    ldaa    $0044
    beq LF381
    ldaa    $005A
    beq LF381
    clr $00C0
    bra LF384
;
LF381:
    clr $0045
LF384:
    jsr LF90A
    ldaa    #$06
    staa    $0095
    ldaa    $00A1
    cmpa    #$04
    beq LF397
    deca
    staa    $00A1
    clr $00A0
LF397:
    ldaa    $006B
    beq LF3B1
LF39B:
    ldaa    $00C1
    bpl LF39B
    clr $00C1
    dec $006B
    bne LF39B
    jsr LFC9E
    ldaa    #$06
    staa    $0095
    jsr LF90A
LF3B1:
    ldaa    $006C
    bne LF3B8
    jmp LF445
;
LF3B8:
    ldaa    $00C1
    bpl LF3B8
    clr $00C1
    dec $006C
    bne LF3B8
    jsr LFC9E
    ldx #$0089
LF3CA:
    ldaa    $00,x
    psha
    dex
    cpx #$007F
    bne LF3CA
    jsr LFA3B
    addd    #$00A0
    std $0075
LF3DB:
    pula
    staa    $00,x
    pula
    staa    $01,x
    ldab    #$20
    abx
    cpx $0075
    bne LF3DB
    ldaa    $0044
    beq LF3FC
    ldaa    $005A
    beq LF403
    dec $0067
    bpl LF403
LF3F5:
    ldaa    #$FF
    staa    $0069
    jmp LF24D
;
LF3FC:
    dec $0067
    bpl LF43E
    bmi LF3F5
LF403:
    ldaa    $0045
    com $005A
    beq LF40C
    ldaa    $00C0
LF40C:
    asla
    asla
    asla
    staa    $005E
    ldx #$1101
LF414:
    asl $005E
    bcc LF425
    stx $00D2
    ldx #$FFE6
    stx $00D0
    jsr LFDB5
    bra LF428
;
LF425:
    jsr LFA2D
LF428:
    ldab    #$07
    abx
    cpx #$1124
    bne LF414
    clra
    tab
    std $0046
    std $0049
    staa    $00A0
    ldd $00A1
    stab    $00A1
    staa    $00A2
LF43E:
    ldaa    #$06
    staa    $0095
    jsr LF90A
LF445:
    ldaa    $0047
    beq LF456
    dec $0047
    bne LF47F
    ldaa    $0048
    jsr LFA4A
    jsr LFA2D
LF456:
    ldaa    $0046
    bpl LF47F
    ldaa    $0048
    jsr LFA4A
    ldd $FE13
    std $00,x
    ldd $FE18
    std $20,x
    ldd $FE1D
    std $40,x
    ldd $FE22
    std $60,x
    ldd $FE27
    std $80,x
    ldaa    #$FF
    staa    $0047
    clr $0046
LF47F:
    ldaa    $004A
    beq LF490
    dec $004A
    bne LF4AA
    ldaa    $004B
    jsr LFA4A
    jsr LFA2D
LF490:
    ldaa    $0049
    bpl LF4AA
    ldaa    $004B
    jsr LFA4A
    stx $00D2
    ldx #$FE83
    stx $00D0
    jsr LFDB5
    ldaa    #$FF
    staa    $004A
    clr $0049
LF4AA:
    ldaa    $006D
    bpl LF50C
    cmpa    #$FF
    beq LF4B5
    jsr LFCB2
LF4B5:
    jsr LFA3B
    addd    #$0080
    std $0075
    ldab    #$20
LF4BF:
    ldaa    $00,x
    psha
    ldaa    $01,x
    psha
    cpx $0075
    beq LF4CC
    abx
    bra LF4BF
;
LF4CC:
    ldx #$0089
LF4CF:
    pula
    staa    $00,x
    cpx #$0080
    beq LF4DA
    dex
    bra LF4CF
;
LF4DA:
    ldx #$FE96
LF4DD:
    ldaa    $00,x
    psha
    dex
    cpx #$FE8C
    bne LF4DD
    ldd $0075
    subd    #$0080
    std $0077
    ldx $0077
LF4EF:
    pula
    staa    $00,x
    pula
    staa    $01,x
    cpx $0075
    beq LF4FE
    ldab    #$20
    abx
    bra LF4EF
;
LF4FE:
    ldaa    #$80
    staa    $006C
    jsr LFC97
    clra
    staa    $006D
    staa    $00CC
    bra LF546
;
LF50C:
    ldaa    $006E
    bpl LF549
    ldaa    $005D
    jsr LFA4A
    stx $00D2
    ldx #$FFE6
    stx $00D0
    jsr LFDB5
    ldaa    $006F
    bpl LF52A
    staa    $006A
    clr $006F
    bra LF52E
;
LF52A:
    ldaa    #$7F
    staa    $006B
LF52E:
    clr $006E
    jsr LFC97
    ldx #$FF81
    ldaa    $006B
    bne LF53E
    ldx #$FF6F
LF53E:
    stx $00CA
    clr $008F
    clr $00CC
LF546:
    jmp LF24D
;
LF549:
    ldaa    $0055
    bmi LF550
    jmp LF6DB
;
LF550:
    clr $0055
    ldaa    $005B
    cmpa    #$01
    bne LF570
LF559:
    inc $005C
    ldaa    $005C
    cmpa    #$1F
    bne LF56E
    dec $005C
LF565:
    jsr LFCB2
    ldaa    #$FF
    staa    $006D
    bra LF546
LF56E:
    bra LF582
;
LF570:
    cmpa    #$03
    beq LF559
    cmpa    #$02
    bne LF582
    dec $005C
    bpl LF582
    inc $005C
    bra LF565
;
LF582:
    ldaa    $004D
    beq LF59C
    dec $004D
    bne LF596
    ldab    #$04
    stab    $0094
    ldx #$FDF7
    stx $0079
    bra LF5C4
;
LF596:
    ldaa    $0094
    bmi LF5BC
    bra LF5C4
;
LF59C:
    ldab    $0094
    bpl LF5C4
    ldaa    $004C
    bpl LF5BC
    ldaa    $004E
    cmpa    #$1E
    bne LF5BC
    ldx #$FE10
    stx $0079
    ldab    #$04
    stab    $0094
    clr $004C
    ldaa    #$20
    staa    $004D
    bra LF5C4
;
LF5BC:
    ldx #$11DF
    jsr LFA55
    bra LF5E0
;
LF5C4:
    ldx $0079
    ldab    $0094
    abx
    ldaa    $00,x
    staa    $007B
    ldaa    $05,x
    staa    $007C
    ldaa    $0A,x
    staa    $007D
    ldaa    $0F,x
    staa    $007E
    ldaa    $14,x
    staa    $007F
    dec $0094
LF5E0:
    ldx #$11DF
LF5E3:
    dex
    jsr LFA7F
    cpx #$11C0
    bne LF5E3
    jsr LFA6A
    inc $004E
    ldaa    $004E
    cmpa    #$20
    bne LF5FB
    clr $004E
LF5FB:
    ldaa    $0050
    beq LF628
XF5FF:
    dec $0050
    bne LF673
    ldaa    $0051
    cmpa    #$1C
    ble LF60F
    inc $0050
    bra LF626
;
LF60F:
    ldx #$1280
    ldab    $0051
    abx
    stx $00D2
    ldx #$FE33
    stx $00D0
    jsr LFDB5
    inx
    inx
    stx $00D2
    jsr LFDB5
LF626:
    bra LF673
;
LF628:
    ldaa    $004F
    bpl LF673
    ldaa    $0051
    cmpa    #$1C
    bhi LF673
    ldaa    $005B
    cmpa    #$02
    bne LF64E
    ldaa    $005C
    inca
    inca
    suba    $0051
    bmi LF64E
    cmpa    #$04
    bgt LF64E
    ldaa    #$FF
    staa    $006D
    inc $005C
    jsr LFCB2
LF64E:
    ldx #$1280
    ldab    $0051
    abx
    stx $00D2
    ldx #$FE29
    stx $00D0
    jsr LFDB5
    inx
    inx
    stx $00D2
    jsr LFDB5
    clr $004F
    ldaa    #$2A
    staa    $0050
    ldaa    $006D
    bpl LF673
    jmp LF24D
;
LF673:
    ldx #$1280
    jsr LFA55
LF679:
    jsr LFA94
    inx
    cpx #$129F
    bne LF679
    jsr LFA6A
    dec $0051
    bpl LF68E
    ldaa    #$1F
    staa    $0051
LF68E:
    ldab    $0053
    beq LF69E
    decb
    stab    $0053
    cmpb    #$02
    bcc LF6BA
    jsr LFDDE
    bra LF6C0
;
LF69E:
    ldaa    $0052
    bpl LF6BA
    ldaa    $0054
    bne LF6BA
    ldx #$1340
    stx $00D2
    ldx #$FE79
    stx $00D0
    jsr LFDB5
    clr $0052
    ldaa    #$1F
    staa    $0053
LF6BA:
    ldx #$135F
    jsr LFA55
LF6C0:
    ldx #$135F
LF6C3:
    dex
    jsr LFA7F
    cpx #$1340
    bne LF6C3
    jsr LFA6A
    inc $0054
    ldaa    $0054
    cmpa    #$20
    bne LF6DB
    clr $0054
LF6DB:
    ldaa    $0057
    bmi LF6E2
    jmp LF762
;
LF6E2:
    clr $0057
    ldaa    $005B
    cmpa    #$04
    bne LF6F7
    ldab    $005C
    ldx #$1400
    abx
    ldd #$FFFF
    jsr LFA30
LF6F7:
    ldx #$1400
LF6FA:
    jsr LFA94
    inx
    cpx #$141F
    bne LF6FA
    ldaa    $0056
    bpl LF70D
    clr $0096
    clr $0056
LF70D:
    ldab    $0096
    cmpb    #$04
    beq LF735
    ldx #$FE3D
    abx
    ldaa    $00,x
    staa    $141F
    ldaa    $04,x
    staa    $143F
    ldaa    $08,x
    staa    $145F
    ldaa    $0C,x
    staa    $147F
    ldaa    $10,x
    staa    $149F
    inc $0096
    bra LF73D
;
LF735:
    ldaa    #$FF
    ldx #$141F
    jsr LFA22
LF73D:
    ldab    $005B
    cmpb    #$04
    bne LF762
    ldab    $005C
    ldx #$1400
    abx
    ldaa    $01,x
    cmpa    #$FF
    bne LF75B
    stx $00D2
    ldx #$FE6F
    stx $00D0
    jsr LFDB5
    bra LF762
;
LF75B:
    ldaa    #$FF
    staa    $006D
    jmp LF24D
;
LF762:
    ldaa    $0058
    bmi LF769
    jmp LF7DA
;
LF769:
    clr $0058
    ldaa    $005B
    cmpa    #$07
    bhi LF77C
    cmpa    #$05
    blt LF77C
    jsr LFA3B
    jsr LFA2D
LF77C:
    ldx #$14C0
    jsr LFA55
LF782:
    jsr LFA94
    inx
    cpx #$14DF
    bne LF782
    jsr LFA6A
    ldx #$159F
    jsr LFA55
LF794:
    dex
    jsr LFA7F
    cpx #$1580
    bne LF794
    jsr LFA6A
    ldx #$1640
    jsr LFA55
LF7A6:
    jsr LFA94
    inx
    cpx #$165F
    bne LF7A6
    jsr LFA6A
    ldaa    $005B
    cmpa    #$07
    bhi LF7DA
    cmpa    #$05
    blt LF7DA
    jsr LFA3B
    ldaa    $40,x
    anda    $41,x
    cmpa    #$55
    bne LF7D3
    stx $00D2
    ldx #$FFE6
    stx $00D0
    jsr LFDB5
    bra LF7DA
;
LF7D3:
    ldaa    #$FF
    staa    $006D
    jmp LF24D
;
LF7DA:
    jsr LF99E
    jsr LF983
    ldaa    $006D
    bpl LF7E6
    bra LF816
;
LF7E6:
    ldaa    $0043
    bne LF809
    jsr LFC81
    coma
    anda    #$06
    bne LF7FA
    jsr LFC8C
    coma
    anda    #$1E
    beq LF801
LF7FA:
    clra
    jsr LF9EF
    jmp LF04F
;
LF801:
    ldaa    $0009
    anda    $000A
    oraa    #$04
    bra LF80C
;
LF809:
    jsr LFC8C
LF80C:
    tab
    andb    #$1E
    cmpb    #$1E
    bne LF819
    clr $00BA
LF816:
    jmp LF24D
;
LF819:
    ldab    $00BA
    bpl LF81F
    bra LF816
;
LF81F:
    lsra
    lsra
    bcc LF826
    jmp LF8C8
;
LF826:
    jsr LFCB2
    dec $005B
    beq LF831
    jmp LF8D7
;
LF831:
    ldaa    $005C
    clr $005E
LF836:
    cmpa    #$07
    blt LF841
    suba    #$07
    inc $005E
    bra LF836
;
LF841:
    cmpa    #$02
    bls LF848
    jmp LF8C1
;
LF848:
    ldaa    $005E
    staa    $005D
    ldaa    #$20
    staa    $005F
LF850:
    lsr $005F
    dec $005E
    bpl LF850
    ldaa    $005F
    ldab    $0044
    beq LF866
    ldab    $005A
    beq LF866
    anda    $00C0
    bra LF868
;
LF866:
    anda    $0045
LF868:
    bne LF8C1
    ldaa    $0047
    beq LF874
    ldaa    $0048
    cmpa    $005D
    beq LF8C1
LF874:
    ldaa    $004A
    beq LF888
    ldaa    $004B
    cmpa    $005D
    bne LF888
    ldaa    #$02
    staa    $00BC
    jsr LFC5C
    clr $004A
LF888:
    ldaa    $005F
    ldab    $0044
    beq LF898
    ldab    $005A
    beq LF898
    oraa    $00C0
    staa    $00C0
    bra LF89C
;
LF898:
    oraa    $0045
    staa    $0045
LF89C:
    ldab    #$FF
    anda    #$1F
    cmpa    #$1F
    bne LF8AF
    stab    $006F
    ldaa    #$10
    staa    $00BC
    jsr LFC5C
    ldab    #$FF
LF8AF:
    stab    $006E
    clra
    staa    $006D
    staa    $0046
    staa    $0049
    ldaa    #$05
    staa    $00BC
    jsr LFC5C
    bra LF8DE
;
LF8C1:
    ldaa    #$FF
    staa    $006D
    jmp LF24D
;
LF8C8:
    lsra
    bcs LF8E1
    ldab    $005B
    cmpb    #$08
    beq LF8E1
    jsr LFCB2
    inc $005B
LF8D7:
    ldaa    #$FF
    staa    $00BA
    jsr LFCCA
LF8DE:
    jmp LF24D
;
LF8E1:
    lsra
    bcs LF8F4
    jsr LFCB2
    dec $005C
    dec $005C
    bpl LF8D7
    clr $005C
    bra LF8C1
;
LF8F4:
    lsra
    bcs LF8DE
    jsr LFCB2
    inc $005C
    inc $005C
    ldaa    #$1E
    cmpa    $005C
    bge LF8D7
    staa    $005C
    bra LF8C1
;
LF90A:
    ldx #$1710
    stx $00D2
    ldx #$FE6F
    stx $00D0
    jsr LFDB5
    ldd #$FFFF
    std $00B0
    std $00B2
    std $00B4
    std $00B6
    std $00B8
    ldaa    #$10
    staa    $005C
    ldaa    #$08
    staa    $005B
    ldaa    #$03
    staa    $00CC
    jmp LFC97
;
LF933:
    ldaa    #$01
    staa    $005E
LF937:
    ldaa    $0070
    ldx #$FFB4
    ldab    $005E
    lsrb
    cmpb    #$01
    bne LF945
    ldaa    $0071
LF945:
    cmpb    #$02
    bne LF94B
    ldaa    $0072
LF94B:
    cmpb    #$03
    beq LF982
    ldab    $005E
    lsrb
    bcs LF95A
    lsra
    lsra
    lsra
    lsra
    bra LF95C
;
LF95A:
    anda    #$0F
LF95C:
    clrb
    tsta
    beq LF965
LF960:
    addb    #$05
    deca
    bne LF960
LF965:
    abx
    ldaa    $04,x
    psha
    ldaa    $03,x
    psha
    ldaa    $02,x
    psha
    ldaa    $01,x
    psha
    ldaa    $00,x
    psha
    ldx $0073
    jsr LFAA9
    inc $005E
    inc $0074
    bra LF937
LF982:
    rts
;
LF983:
    ldaa    #$03
    staa    $005E
    ldx #$17C1
    ldab    $0067
LF98C:
    ldaa    #$A5
    decb
    bpl LF993
    ldaa    #$55
LF993:
    staa    $00,x
    staa    $20,x
    inx
    dec $005E
    bpl LF98C
    rts
;
LF99E:
    ldaa    #$07
    staa    $005E
    ldx #$17DF
    ldab    $0095
    beq LF9AB
    bpl LF9AF
LF9AB:
    ldaa    #$80
    staa    $006D
LF9AF:
    ldaa    #$AA
    decb
    bpl LF9B5
    coma
LF9B5:
    staa    $00,x
    staa    $20,x
    dex
    dec $005E
    bpl LF9AF
    rts
;
LF9C0:
    ldaa    $0043
    beq LF9E4
    ldaa    $0070
    cmpa    $0040
    bhi LF9DC
    blt LF9E4
    ldaa    $0071
    cmpa    $0041
    bhi LF9DC
    blt LF9E4
    ldaa    $0072
    cmpa    $0042
    bhi LF9DC
    bra LF9E4
;
LF9DC:
    ldaa    $0070
    staa    $0040
    ldd $0071
    std $0041
LF9E4:
    rts
;
LF9E5:
    staa    $0040
    staa    $0041
    staa    $0042
    staa    $0043
    staa    $0044
LF9EF:
    ldx #$0045
LF9F2:
    staa    $00,x
    inx
    cpx #$00E0
    bne LF9F2
    rts
;
LF9FB:
    ldx #$1000
LF9FE:
    staa    $00,x
    inx
    cpx #$1800
    bne LF9FE
    rts
;
LFA07:
    ldd $00,x
    inx
    inx
    pshb
    psha
LFA0D:
    ldaa    $00,x
    bmi LFA1D
    inx
    stx $0073
    pulx
    staa    $00,x
    inx
    pshx
    ldx $0073
    bra LFA0D
;
LFA1D:
    pulb
    pula
    rts
;
LFA20:
    staa    $A0,x
LFA22:
    staa    $20,x
    staa    $40,x
    staa    $60,x
    staa    $80,x
    staa    $00,x
    rts
;
LFA2D:
    ldd #$5555
LFA30:
    std $00,x
    std $20,x
    std $40,x
    std $60,x
    std $80,x
    rts
;
LFA3B:
    ldaa    $005B
    ldab    #$C0
    mul
    addd    #$1100
    addb    $005C
    std $0075
    ldx $0075
    rts
;
LFA4A:
    ldab    #$07
    mul
    addd    #$1101
    std $0075
    ldx $0075
    rts
;
LFA55:
    ldaa    $00,x
    staa    $007B
    ldaa    $20,x
    staa    $007C
    ldaa    $40,x
    staa    $007D
    ldaa    $60,x
    staa    $007E
    ldaa    $80,x
    staa    $007F
    rts
;
LFA6A:
    ldaa    $007B
    staa    $00,x
    ldaa    $007C
    staa    $20,x
    ldaa    $007D
    staa    $40,x
    ldaa    $007E
    staa    $60,x
    ldaa    $007F
    staa    $80,x
    rts
;
LFA7F:
    ldaa    $00,x
    staa    $01,x
    ldaa    $20,x
    staa    $21,x
    ldaa    $40,x
    staa    $41,x
    ldaa    $60,x
    staa    $61,x
    ldaa    $80,x
    staa    $81,x
    rts
;
LFA94:
    ldaa    $01,x
    staa    $00,x
    ldaa    $21,x
    staa    $20,x
    ldaa    $41,x
    staa    $40,x
    ldaa    $61,x
    staa    $60,x
    ldaa    $81,x
    staa    $80,x
    rts
;
LFAA9:
    pula
    staa    $00CE
    pula
    staa    $00CF
    pula
    staa    $00,x
    pula
    staa    $20,x
    pula
    staa    $40,x
    pula
    staa    $60,x
    pula
    staa    $80,x
    ldaa    $00CF
    psha
    ldaa    $00CE
    psha
    rts
;
    ldd $0009
    addd    #$0F8B
    std $001A
    ldaa    #$10
    oraa    $0018
    staa    $0018
    ldaa    #$FF
    staa    $0066
    rti
;
    ldaa    $0019
    bita    #$20
    beq LFAEA
    ldd $0009
    addd    $0090
    std $001C
    ldaa    $0002
    eora    #$40
    staa    $0002
    rti
;
LFAEA:
    ldd $0009
    std $001A
    cli
    ldaa    #$FF
    staa    $00C1
    jsr LFC81
    tab
    andb    #$0E
    cmpb    #$0E
    bne LFB02
LFAFD:
    clr $00C3
    bra LFB1A
;
LFB02:
    ldab    $0043
    beq LFAFD
    ldab    $00C3
    bmi LFB1A
    bita    #$08
    bne LFB1A
    ldab    #$FF
    stab    $00C3
    com $0068
    bpl LFB1A
    jsr LFC9E
LFB1A:
    ldaa    $0068
    bpl LFB21
LFB1E:
    jmp LFC54
;
LFB21:
    ldaa    $008C
    beq LFB1E
    ldaa    $006A
    oraa    $006B
    beq LFB42
    ldaa    $008F
    bne LFB3F
    ldx $00CA
    ldd $00,x
    jsr LFCA5
    ldaa    $02,x
    staa    $008F
    inx
    inx
    inx
    stx $00CA
LFB3F:
    dec $008F
LFB42:
    ldaa    $00D7
    beq LFB68
    clr $00CC
    ldaa    $008F
    bne LFB5D
    ldx $00CA
    ldd $00,x
    jsr LFCA5
    ldaa    $02,x
    staa    $008F
    inx
    inx
    inx
    stx $00CA
LFB5D:
    dec $008F
    dec $00D7
    bne LFB68
    jsr LFC9E
LFB68:
    ldaa    $006C
    beq LFB89
    clr $00D7
    cmpa    #$70
    beq LFBA5
    ldaa    $0044
    bne LFB81
    ldaa    $006C
    cmpa    #$40
    bne LFB81
    ldaa    #$01
    staa    $006C
LFB81:
    ldd #$1500
    jsr LFCA5
    bra LFBA8
;
LFB89:
    ldaa    $00CC
    beq LFBA8
    tab
    anda    #$03
    cmpa    #$03
    bne LFBA0
    lsrb
    lsrb
    aslb
    ldx #$FFA2
    abx
    ldd $00,x
    jsr LFCA5
LFBA0:
    dec $00CC
    bne LFBA8
LFBA5:
    jsr LFC9E
LFBA8:
    ldaa    $006A
    oraa    $006B
    oraa    $006C
    oraa    $006D
    oraa    $006E
    oraa    $006F
    beq LFBB9
    jmp LFC54
;
LFBB9:
    inc $008A
    bne LFBC1
    inc $008B
LFBC1:
    ldab    $008B
    ldaa    $008A
    bne LFBE5
    ldaa    #$FF
    andb    #$01
    bne LFBCF
    staa    $004C
LFBCF:
    ldab    $008B
    andb    #$03
    bne LFBD7
    staa    $004F
LFBD7:
    ldab    $008B
    andb    #$0F
    bne LFBDF
    staa    $0052
LFBDF:
    andb    #$03
    bne LFBE5
    staa    $0056
LFBE5:
    ldab    $008A
    bitb    #$01
    bne LFBF7
    ldaa    $00A0
    bne LFBF4
    coma
    staa    $0055
    ldaa    $00A1
LFBF4:
    deca
    staa    $00A0
LFBF7:
    andb    #$07
    bne LFBFF
    ldaa    #$FF
    staa    $0058
LFBFF:
    andb    #$03
    bne LFC07
    ldaa    #$FF
    staa    $0057
LFC07:
    ldaa    $008A
    bne LFC4B
    ldaa    $000A
    tab
    anda    #$03
    aslb
    adca    #$00
    staa    $00C2
    ldab    #$20
    stab    $00BE
LFC19:
    lsr $00BE
    deca
    bpl LFC19
    ldaa    $00BE
    ldab    $0044
    beq LFC2D
    ldab    $005A
    beq LFC2D
    anda    $00C0
    bra LFC2F
;
LFC2D:
    anda    $0045
LFC2F:
    bne LFC4B
    ldaa    #$FF
    ldab    $008B
    andb    #$03
    bne LFC41
    ldab    $00C2
    stab    $004B
    staa    $0049
    bra LFC4B
;
LFC41:
    cmpb    #$02
    bne LFC4B
    ldab    $00C2
    stab    $0048
    staa    $0046
LFC4B:
    ldaa    $008A
    anda    #$7F
    bne LFC54
    dec $0095
LFC54:
    clr $0066
LFC57:
    ldaa    $0066
    bpl LFC57
    rti
;
LFC5C:
    ldaa    $00BC
    ldab    $0044
    beq LFC74
    ldab    $005A
    beq LFC74
    adda    $0064
    daa
    staa    $0064
    ldaa    $0063
    adca    #$00
    daa
    staa    $0063
    bra LFC80
;
LFC74:
    adda    $0061
    daa
    staa    $0061
    ldaa    $0060
    adca    #$00
    daa
    staa    $0060
LFC80:
    rts
;
LFC81:
    ldaa    $0002
    anda    #$FE
    oraa    #$02
    staa    $0002
    ldaa    $0003
    rts
;
LFC8C:
    ldaa    $0002
    anda    #$FD
    oraa    #$01
    staa    $0002
    ldaa    $0003
    rts
;
LFC97:
    ldaa    $0002
    oraa    #$20
    staa    $0002
    rts
;
LFC9E:
    ldaa    $0002
    anda    #$DF
    staa    $0002
    rts
;
LFCA5:
    std $0090
    addd    $0009
    std $001C
    ldaa    $0018
    oraa    #$20
    staa    $0018
    rts
;
LFCB2:
    jsr LFA3B
    ldd $00B0
    std $00,x
    ldd $00B2
    std $20,x
    ldd $00B4
    std $40,x
    ldd $00B6
    std $60,x
    ldd $00B8
    std $80,x
    rts
;
LFCCA:
    jsr LFA3B
    addd    #$00A0
    std $0077
    ldab    #$20
    ldaa    $00,x
LFCD6:
    cmpa    $00,x
    bne LFCE6
    cmpa    $01,x
    bne LFCE6
    abx
    cpx $0077
    bne LFCD6
    clra
    bra LFCE8
;
LFCE6:
    ldaa    #$FF
LFCE8:
    ldab    $005B
    cmpb    #$03
    bgt LFCF3
    tsta
    bne LFCF8
    bra LFD21
;
LFCF3:
    tsta
    beq LFD65
    bra LFD21
;
LFCF8:
    cmpb    #$01
    bne LFD0E
    ldaa    $004D
    beq LFD0E
    ldaa    $005C
    inca
    suba    $004E
    bmi LFD0E
    cmpa    #$02
    bgt LFD0E
    jmp LFDB0
;
LFD0E:
    cmpb    #$02
    bne LFD24
    ldaa    $0050
    beq LFD24
    ldaa    $005C
    inca
    suba    $0051
    bmi LFD24
    cmpa    #$04
    bgt LFD24
LFD21:
    jmp LFDB0
;
LFD24:
    cmpb    #$03
    bne LFD65
    ldaa    $0053
    beq LFD65
    ldaa    $005C
    inca
    suba    $0054
    bmi LFD65
    cmpa    #$02
    bgt LFD65
    ldaa    #$02
    staa    $00BC
    jsr LFC5C
    clrb
    jsr LFDDE
    ldx #$1340
    ldab    $0054
    abx
    jsr LFA6A
    pshx
    ldab    #$01
    jsr LFDDE
    pulx
    inx
    jsr LFA6A
    clr $008F
    ldx #$FF96
    stx $00CA
    jsr LFC97
    ldaa    #$2F
    staa    $00D7
LFD65:
    ldx #$FE6F
    stx $0077
    ldx $0075
    ldd $00,x
    std $00B0
    ldd $20,x
    std $00B2
    ldd $40,x
    std $00B4
    ldd $60,x
    std $00B6
    ldd $80,x
    std $00B8
    ldd $0075
    addd    #$00A0
    std $005E
LFD87:
    ldx $0077
    ldd $00,x
    inx
    inx
    stx $0077
    ldx $0075
    anda    $00,x
    andb    $01,x
    std $00,x
    ldab    #$20
    abx
    stx $0075
    cpx $005E
    bne LFD87
    ldaa    $00CC
    beq LFDA8
    eora    #$0C
    bra LFDAA
;
LFDA8:
    ldaa    #$0F
LFDAA:
    staa    $00CC
    jsr LFC97
    rts
;
LFDB0:
    ldaa    #$FF
    staa    $006D
    rts
;
LFDB5:
    ldx $00D0
    ldd $00,x
    pshb
    psha
    ldd $02,x
    pshb
    psha
    ldd $04,x
    pshb
    psha
    ldd $06,x
    pshb
    psha
    ldd $08,x
    ldx $00D2
    std $80,x
    pula
    pulb
    std $60,x
    pula
    pulb
    std $40,x
    pula
    pulb
    std $20,x
    pula
    pulb
    std $00,x
    rts
;
LFDDE:
    ldx #$FDF7
    abx
    ldaa    $03,x
    staa    $007B
    ldaa    $08,x
    staa    $007C
    ldaa    $0D,x
    staa    $007D
    ldaa    $12,x
    staa    $007E
    ldaa    $17,x
    staa    $007F
    rts
;
;
;
    org $fdf7

    .byte $5F,$FF,$FF,$FE,$A5,$7E,$FE,$FE,$FA
;   org $fe00
    .byte $A9,$FF,$FF,$FF,$EA,$6A,$7F,$FB,$FB,$FA,$A9,$5F,$FF,$FF,$FE,$A5
    .byte $D5,$55,$55,$5D,$7F,$7D,$55,$55,$73,$F5,$5F,$FF,$F5,$FF,$D5,$57
    .byte $FF,$FF,$FF,$55,$55,$FF,$FF,$FF,$FF,$51,$51,$40,$00,$00,$00,$40
    .byte $00,$51,$51,$5D,$5D,$7F,$FF,$FF,$FF,$7F,$FF,$5D,$5D,$AA,$AF,$FF
    .byte $FF,$FE,$2F,$FF,$FF,$EA,$BF,$BF,$FF,$FF,$AE,$AF,$EF,$FE,$AA,$EA
    .byte $BF,$5A,$7F,$00,$7F,$5A,$95,$FF,$00,$FF,$95,$A5,$D5,$05,$D5,$A5
    .byte $A5,$7F,$00,$7F,$A5,$6A,$FF,$00,$FF,$6A,$55,$D5,$05,$D5,$55,$F3
    .byte $33,$F0,$03,$FC,$0F,$F3,$F3,$F0,$C3,$F2,$21,$F0,$01,$E8,$0A,$F2
    .byte $A1,$F0,$81,$56,$65,$55,$95,$56,$A5,$59,$99,$55,$95,$5A,$95,$6E
    .byte $E5,$6A,$A5,$6B,$A5,$5A,$95,$10,$68,$03,$0F,$0D,$10,$01,$03,$14
    .byte $20,$16,$09,$13,$09,$0F,$0E,$80,$10,$AC,$14,$16,$20,$20,$02,$0F
    .byte $19,$80,$11,$29,$06,$20,$12,$20,$0F,$20,$07,$20,$07,$20,$05,$20
    .byte $12,$80,$10,$2A,$07,$20,$01,$20,$0B,$20,$0B,$20,$05,$20,$0E,$80
    .byte $10,$22,$2A,$2A,$20,$10,$0C,$05,$01,$13,$05,$20,$13,$05,$0C,$05
    .byte $03,$14,$20,$2A,$2A,$80,$10,$67,$31,$20,$10,$0C,$01,$19,$05,$12
    .byte $80,$10,$A7,$32,$20,$10,$0C,$01,$19,$05,$12,$13,$80,$10,$CB,$07
    .byte $01,$0D,$05,$20,$0F,$16,$05,$12,$80,$11,$62,$2D,$2D,$2D,$20,$08
    .byte $09,$20,$20,$20,$13,$03,$0F,$12,$05,$20,$3A,$20,$20,$20,$20,$20
    .byte $20,$20,$2D,$2D,$2D,$80,$11,$C3,$31,$10,$3A,$80,$11,$D1,$32,$10
    .byte $3A,$80,$11,$A4,$03,$0F,$10,$19,$12,$09,$07,$08,$14,$20,$02,$19
;
    .byte $20,$0B,$0F,$0E,$01,$0D,$09,$20,$31,$39,$38,$31,$80

LFF4D:
    ldx $0073
    ldaa    $0070
    anda    #$0F
LFF53:
    adda    #$30
LFF55:
    staa    $00,x
    inx
    ldaa    $0071
    jsr LFF61
    inx
    inx
    ldaa    $0072
LFF61:
    tab
    lsra
    lsra
    lsra
    lsra
    adda    #$30
    andb    #$0F
    addb    #$30
    std $00,x
    rts
;
    .byte $06
    .byte $BB,$20,$02,$FF,$10,$03,$5D,$10,$03,$FE,$10,$03,$C5,$10,$03,$5D
    .byte $20,$02,$FF,$10,$03,$5D,$10,$04,$79,$10,$03,$5D,$10,$03,$8D,$10
    .byte $02,$FF,$10,$03,$5D,$20,$05,$53,$10,$05,$FE,$08,$05,$53,$08,$05
    .byte $07,$10,$03,$5D,$03,$8D,$03,$FE,$04,$79,$A8,$A8,$08,$88,$A8,$A8
    .byte $80,$80,$A8,$80,$A8,$88,$88,$88,$A8,$A0,$20,$20,$20,$A8,$A8,$08
    .byte $A8,$80,$A8,$A8,$08,$A8,$08,$A8,$08,$28,$88,$A8,$08,$A8,$80,$A8
    .byte $08,$A8,$A8,$80,$A8,$88,$A8,$A8,$08,$08,$08,$08,$A8,$88,$A8,$88
    .byte $A8,$A8,$88,$A8,$08,$A8,$51,$11,$50,$01,$54,$05,$51,$51,$50,$41
    .byte $FA,$D6,$FA,$D6,$FA,$D7,$FA,$D6,$FA,$C5,$FA,$D6,$FA,$D6,$F0,$00
;
;SCI    TOF OCF ICF IRQ1    SWI NMI
;FAD6   FAD6    FAD7    FAD6    FAC5    FAD6    FAD6
;

MC-10でアセンブラやってみる その2

TVボーイとMC-10の大きな違いは割り込みです。MC-10のBASICでは割り込みアドレスが固定されており、しかもビデオメモリと被るため利用できません。

SCI      TOF     OCF     ICF     IRQ1    SWI     NMI
FAD6    FAD6    FAD7    FAD6    FAC5    FAD6    FAD6
4200    4203    4206    4209    420C    420F    4212

TVボーイ($F000-$FFFF)のゲームをMC-10($8000-$8FFF)にリロケートして、割り込み処理が必要な部分はアドレスがずれないように、固有ルーチン($7000-$7FFF)へジャンプさせます。

;
;   File:       frogger10.c10
;

    org $7000
    jmp START

WAIT:
    ldaa    $7F
    jsr WAIT_LOOP
    rts

WAIT_LOOP:
    deca
    nop ;DUMMY
    nop ;DUMMY
    nop ;DUMMY
    nop ;DUMMY
    nop ;DUMMY
    nop ;DUMMY
    bne WAIT_LOOP
    rts

SHOT:
    ldaa    #$80
    coma            ;flip the bits
    staa    $0002       ;store in keystrobe
    ldaa    $BFFF       ;get the key group
    bita    #$08
    beq keySPC
    ldaa    #%11111110  ; check CTRL key
    staa    2
    ldaa    3   
    bita    #%00000010
    beq keyCTRL
    ldaa    #$FF
    rts

INPUT:
    ldaa    #$80
    coma            ;flip the bits
    staa    $0002       ;store in keystrobe
    ldaa    $BFFF       ;get the key group
    bita    #$04
    beq keyW
    ldaa    #$04
    coma            ;flip the bits
    staa    $0002       ;store in keystrobe
    ldaa    $BFFF       ;get the key group
    bita    #$08
    beq keyZ
    ldaa    #$02
    coma            ;flip the bits
    staa    $0002       ;store in keystrobe
    ldaa    $BFFF       ;get the key group
    bita    #$01
    beq keyA
    ldaa    #$08
    coma            ;flip the bits
    staa    $0002       ;store in keystrobe
    ldaa    $BFFF       ;get the key group
    bita    #$04
    beq keyS
    ldaa    #$FF
    rts

keyCTRL:
    ldaa    #$FB
    rts
keySPC:
    ldaa    #$FD
    rts
keyW:
    ldaa    #$FD
    rts
keyZ:
    ldaa    #$FB
    rts
keyA:
    ldaa    #$F7
    rts
keyS:
    ldaa    #$EF
    rts
;
    org $8000
START:
    clra
    staa    $0001
    staa    $0017
    coma
    staa    $0005
;   ldaa    #$7F
    ldaa    #$FF
    staa    $0000

f:id:tanam:20211211073905p:plain

MC-10でアセンブラやってみる その1

TRS-80 MC-10 & MCX32-SDでMC6801アセンブラの勉強をはじめる。

https://github.com/gregdionne/tasm6801/tree/master/tutorial

まずは学研TVボーイのゲームを逆アセンブルしました。

http://yama.ath.cx/maserati/romrom/04/04.htm

>dasmx -a -c6801 -e0xF000 -o0xF000 frogger.bin

DASMx object code disassembler
==============================
(c) Copyright 1996-2003   Conquest Consultants
Version 1.40 (Oct 18 2003)

CPU: Motorola 6801 (6801/6803 family)
Source file length: 4096 bytes
Pass 1...
Pass 2...

実行アドレスを変更して動作確認していきます。

>tasm.exe frogger10.txt
>type frogger10.txt

    org $8000

    clra
    staa    $0001
    staa    $0017
    coma
    staa    $0005
    ldaa    #$7F
    staa    $0000
    ldaa    #$0F
    staa    $0002
    lds #$00FF
    sei
    clra
    jsr LF9E5
LF018:

f:id:tanam:20211206001738p:plain

f:id:tanam:20211206001802p:plain

f:id:tanam:20211206001838p:plain

学研TV BOYエミュレータをつくる その6

TV BOYエミュレータを更新しました。とりあえず遊ぶためにパッチを当てます。

  • 市街戦200X年(ふつうに遊べる!)
  • ミスターボム(ふつうに遊べる!)
  • エキサイトインベーダー(ふつうに遊べる!)NEW
  • ロボタンウォーズ(ふつうに遊べる!)NEW
  • 地対空大作戦(サウンドが鳴らない)
  • フロッガーサウンドが鳴らない)NEW

ソースコード差分は以下になります。

takeda-toshiya.my.coocan.jp

void MEMORY::open_cart(const _TCHAR* file_path)
{
    FILEIO* fio = new FILEIO();
    if(fio->Fopen(file_path, FILEIO_READ_BINARY)) {
        fio->Fread(rom, sizeof(rom), 1);
        fio->Fclose();
        // EXCITE INVADER
        if (rom[0x0f3c]==0x96 && rom[0x0f3d]==0x02) {
            rom[0x0f3c]=0x86;
            rom[0x0f3d]=0x81;
        }
        // ROBOTAN WARS
        if (rom[0x06f0]==0x96 && rom[0x06f1]==0x19) {
            rom[0x06f0]=0x86;
            rom[0x06f1]=0x10;
        }
        inserted = true;
    }
    delete fio;
}
#ifdef _TVBOY
    // FROGGER
    if( total_icount % 2400 == 1 && d_mem->read_data8(0xfff4)==0xfa && d_mem->read_data8(0xfff5)==0xd7) {
        wai_state &= ~HD6301_SLP;
        if(!(CC & 0x10)) {
            TAKE_OCI;
        }
    }
#endif
    // check interrupt
    if(int_state & NMI_REQ_BIT) {
:

ヨコハマ忘年会2021

ファミコン以外のマイナーゲーム機、インテレビジョン、アルカディア、アタリ2800、光速船、TVボーイ、バーチャルボーイワンダースワンぴゅう太 etcなどで遊ぶイベントです。

ハッシュタグ(2021/12/18)

学研TV BOYエミュレータをつくる その5

TV BOYエミュレータを更新しました。求む!エミュレータ開発者。

ソフトは6種類(各3,800円)が発売されたそうです。

  • 市街戦200X年(ふつうに遊べる!)
  • ミスターボム(ふつうに遊べる!)
  • エキサイトインベーダー(ゲーム開始直後フリーズ)
  • ロボタンウォーズ(ゲーム開始後キー入力できない)
  • 地対空大作戦(サウンドが鳴らない)
  • フロッガー(タイトルでフリーズ)

ソースコード差分は以下になります。

takeda-toshiya.my.coocan.jp

/*
    GAKKEN TV BOY Emulator 'yaTVBOY'

    Author : tanam
    Date   : 2020.06.13

    [ memory ]
*/

#include "memory.h"

#define SET_BANK(s, e, w, r) { \
    int sb = (s) >> 10, eb = (e) >> 10; \
    for(int i = sb; i <= eb; i++) { \
        if((w) == wdmy) { \
            wbank[i] = wdmy; \
        } else { \
            wbank[i] = (w) + 0x400 * (i - sb); \
        } \
        if((r) == rdmy) { \
            rbank[i] = rdmy; \
        } else { \
            rbank[i] = (r) + 0x400 * (i - sb); \
        } \
    } \
}

void MEMORY::initialize()
{
    memset(rom, 0xff, sizeof(rom));
    memset(rdmy, 0xff, sizeof(rdmy));   
    // set memory map
    SET_BANK(0x0000, 0x0fff, ram,  ram );
    SET_BANK(0x1000, 0x1fff, vram, vram);
    SET_BANK(0x2000, 0xefff, wdmy, rdmy);
    SET_BANK(0xf000, 0xffff, wdmy, rom );
    // register event
//  register_event_by_clock(this, 0, 256, true, NULL);
    register_event_by_clock(this, 0, 4096, true, NULL);
    event = false;
    inserted = false;
}

void MEMORY::reset()
{
    memset(ram, 0, sizeof(ram));
    for (int i=0; i<sizeof(vram); i++) {
        vram[i]=rand() % 256;
    }
    d_vdp->write_signal(SIG_MC6847_AS,     0x00, 0x08);
    d_vdp->write_signal(SIG_MC6847_AG,     0x10, 0x10);
    d_vdp->write_signal(SIG_MC6847_CSS,    0x20, 0x20);
    d_vdp->write_signal(SIG_MC6847_GM,     0x00, 0x02);
    d_vdp->write_signal(SIG_MC6847_GM,     0x01, 0x01);
    d_vdp->write_signal(SIG_MC6847_INTEXT, 0x00, 0x04);
    shot1 = shot2 = up = down = left = right = 0;
}

void MEMORY::write_data8(uint32_t addr, uint32_t data)
{
    addr &= 0xffff;
    if(addr >= 0x80 && addr < 0x100) {
        d_cpu->ram[addr-0x80]=data;
    }
    if(addr == 0x2000) {
        d_vdp->write_signal(SIG_MC6847_AS,     data, 0x08);
        d_vdp->write_signal(SIG_MC6847_AG,     data, 0x10);
        d_vdp->write_signal(SIG_MC6847_CSS,    data, 0x20);
        d_vdp->write_signal(SIG_MC6847_GM,     data << 1, 0x02);
        d_vdp->write_signal(SIG_MC6847_GM,     data >> 1, 0x01);
        d_vdp->write_signal(SIG_MC6847_INTEXT, data, 0x04);
        return;
    }
    wbank[addr >> 10][addr & 0x3ff] = data;
}

uint32_t MEMORY::read_data8(uint32_t addr)
{
    addr &= 0xffff;
    if(addr >= 0x80 && addr < 0x100) {
        return d_cpu->ram[addr-0x80];
    }
    return rbank[addr >> 10][addr & 0x3ff];
}

void MEMORY::write_signal(int id, uint32_t data, uint32_t mask)
{
    d_cpu->write_signal(SIG_MC6801_PORT_2, 0x1E, 0x1E);
    if (shot2==1 && (d_cpu->port[0].wreg & 0x01)==1) {
        d_cpu->write_signal(SIG_MC6801_PORT_2, 0x00, 0x04);
    }
    if (shot1==1 && (d_cpu->port[0].wreg & 0x01)==1) {
        d_cpu->write_signal(SIG_MC6801_PORT_2, 0x00, 0x02);
    }

//  if (event) return; // speed down
    
    if (down==1 && (d_cpu->port[0].wreg & 0x01)==0) {
         d_cpu->write_signal(SIG_MC6801_PORT_2, 0x00, 0x04);
        // frogger
        if (rom[0x0ff4]==0xfa && rom[0x0ff5]==0xd7) down =0;
    }
    if (up==1 && (d_cpu->port[0].wreg & 0x01)==0) {
        d_cpu->write_signal(SIG_MC6801_PORT_2, 0x00, 0x02);
        // frogger
        if (rom[0x0ff4]==0xfa && rom[0x0ff5]==0xd7) up =0;
    }
    if (left==1 && (d_cpu->port[0].wreg & 0x01)==0) {
        d_cpu->write_signal(SIG_MC6801_PORT_2, 0x00, 0x08);
        // frogger
        if (rom[0x0ff4]==0xfa && rom[0x0ff5]==0xd7) left =0;
    }
    if (right==1 && (d_cpu->port[0].wreg & 0x01)==0) {
        d_cpu->write_signal(SIG_MC6801_PORT_2, 0x00, 0x10);
        // frogger
        if (rom[0x0ff4]==0xfa && rom[0x0ff5]==0xd7) right =0;
    }
}

void MEMORY::event_callback(int event_id, int err)
{
    if (event)  {
        d_cpu->write_signal(SIG_CPU_IRQ, 1, 1);
        event = false;
    } else {
        d_cpu->write_signal(SIG_CPU_IRQ, 0, 1);
        event = true;
    }
}

void MEMORY::key_down(int code)
{
    if (code==0x20) {
        shot1 =1;
    }
    if (code==0x11) {
        shot2 =1;
    }
    if (code==0x25) {
        left =1;
    }
    if (code==0x26) {
        up =1;
    }
    if (code==0x27) {
        right =1;
    }
    if (code==0x28) {
        down =1;
    }
}

void MEMORY::key_up(int code)
{
    if (code==0x20) {
        shot1 =0;
    }
    if (code==0x11) {
        shot2 =0;
    }
    if (code==0x25) {
        left =0;
    }
    if (code==0x26) {
        up =0;
    }
    if (code==0x27) {
        right =0;
    }
    if (code==0x28) {
        down =0;
    }
}

void MEMORY::open_cart(const _TCHAR* file_path)
{
    FILEIO* fio = new FILEIO();
    if(fio->Fopen(file_path, FILEIO_READ_BINARY)) {
        fio->Fread(rom, sizeof(rom), 1);
        fio->Fclose();
        inserted = true;
    }
    delete fio;
}

void MEMORY::close_cart()
{
    memset(rom, 0xff, sizeof(rom));
    inserted = false;
}

#define STATE_VERSION   1

bool MEMORY::process_state(FILEIO* state_fio, bool loading)
{
    if(!state_fio->StateCheckUint32(STATE_VERSION)) {
        return false;
    }
    if(!state_fio->StateCheckInt32(this_device_id)) {
        return false;
    }
    state_fio->StateArray(ram, sizeof(ram), 1);
    state_fio->StateArray(vram, sizeof(vram), 1);
    return true;
}