Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Opcodes that both read and write to IO areas that have 'side effects' do not work as hardware. #277

Open
Yazwh0 opened this issue May 19, 2024 · 3 comments

Comments

@Yazwh0
Copy link

Yazwh0 commented May 19, 2024

For opcodes like ror and inc, the CPU actually reads the memory location twice, while the emulator only does this once.

So if the location has a side effect from being read, such as DATA0, the outcome will be incorrect.

@Yazwh0
Copy link
Author

Yazwh0 commented May 19, 2024

rol version attached

FXLINE.zip

import BM="bm.bmasm";

.machine CommanderX16R42
    BM.X16Header();

    sei

    stz CTRL
    lda DC_VIDEO
    and #$0f
    ora #$10    ; just layer 0
    sta DC_VIDEO

    lda #$07
    sta L0_CONFIG   ; bitmap + 256mode
    stz L0_TILEBASE ; x320
    stz L0_MAPBASE

    lda #64
    sta DC_HSCALE
    sta DC_VSCALE

    lda #%00010000           ; ADDR1 increment: +1 byte
    sta ADDRx_H
    lda #0                   ; Setting start to $00000
    sta ADDRx_M
    lda #0                   ; Setting start to $00000
    sta ADDRx_L

    ldx #$ff
    ldy #$80
    lda #02

.loop:
    lda #$13
    stz DATA0
    lda #$2
    sta DATA0
    dex
    bne -loop
    dey
    bne -loop

    ; skip fx setup to test data port access
    jmp no_fx

    lda #%00000100           ; DCSEL=2, ADDRSEL=0
    sta CTRL

    lda #%11100000           ; ADDR0 increment: +320 bytes
    sta ADDRx_H

    lda #%00000001           ; Entering *line draw mode*
    sta $9F29

    lda #%00000101           ; DCSEL=2, ADDRSEL=1
    sta CTRL

    lda #%00010000           ; ADDR1 increment: +1 byte
    sta ADDRx_H
    lda #0                   ; Setting start to $00000
    sta ADDRx_M
    lda #0                   ; Setting start to $00000
    sta ADDRx_L


    lda #%00000110           ; DCSEL=3, ADDRSEL=0
    sta CTRL

    ; Note: 73<<1 is just a nice looking slope ;)
    ; 73<<1 (=146) means: for each x pixel-step there is 146/512th y pixel-step

    lda #<(73<<1)            ; X increment low
    sta $9F29
    lda #%01111100            ; X increment high
    lda #0
    sta $9F2A

.draw_line:

    ldx #150 ; Drawing 150 pixels to the right
    lda #1   ; White color

.draw_line_next_pixel:
    sec
    rol DATA1
    dex
    bne draw_line_next_pixel

.loop:
    jmp -loop

.no_fx:

    lda #%00000001           ; DCSEL=0, ADDRSEL=1
    sta CTRL

    lda #%00010000           ; ADDR1 increment: +1 byte
    sta ADDRx_H
    lda #0                   ; Setting start to $00000
    sta ADDRx_M
    lda #0                   ; Setting start to $00000
    sta ADDRx_L

    jmp draw_line

@Yazwh0
Copy link
Author

Yazwh0 commented Aug 17, 2024

There many other instances where reading the dataport on hardware has a different result to the emulator.

Attached is an application which demonstrates these. Use F1 - F5 to switch between different opcodes. Source is in the archive.

On the left are the values from my 65c02 based X16. On the right are the actual values from the machine its running on. Red values are different. Eg:

image

MAIN.zip

@Yazwh0
Copy link
Author

Yazwh0 commented Aug 17, 2024

Full list:

image

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant