Ich haette mal ein Problem fuer die ASM-Programmierer. Ich habe mich (mal wieder) an einer REU 1700, 1764 und 1750 Erkennung versucht. Die 1700 wird erkannt. Bei der Unterscheidung zwischen der 1764 und der 1750 (und erw. Eigenbauten) habe ich ein Problem.
Grundlegende Idee war : Beschreiben und Auslesen der ersten 4 Baenke (0-3), Bank 4 wird dann erst ausgelesen und mit den vorher schon in den anderen Baenken verwendeten Fuellbytes verglichen. Falls diese in der Bank schon drin waren, muss es wohl eine 1764, ansonsten eine 1750 oder erweiterter Typ sein. Und da bin ich wohl gescheitert.
Die Routine "bankcheck" hat scheinbar einen Fehler und "bigger" war noch die letzte Verzweiflungstat.
Habe ich da grobe Fehler drin, veielicht auch einen Denkfehler oder ist die REU-Emulation im Vice so "banane" ?
Ist alles ein bischen schnell zusammen getippt. Zur Erklaerung : Zuerst die Erkennung der REU ueber die Register, dann Erkennung der 1700 ueber $DF00 Bit4, Beschreiben mit 16 Byte von $1100 in REU Bank 1-3, Auslesen und Vergleichen, dann Auslesen von Bank 4 und der erwaehnte Murks.
Jemand eine Idee in Opcodes und Bytes an der passenden Stelle ?
Laesst sich mit dem ACME kompilieren.
- !to "reudetect"
- *= $1000
- reubase = $df00
- reucommand = $df01
- banks = $1100
- tries = $fa
- ;--------------------------------------------------
- ; Detect REU 1700 or 1764/50
- ;--------------------------------------------------
- reudetect
- lda #0
- sta reubase
- cmp reubase
- beq unsafe ; we are not safe
- unsafe ldx #2
- loop1 txa
- sta $df00,x ; write to registers 2-5
- inx
- cpx #5
- bne loop1
- ldx #02
- loop2 txa ; compare regs
- cmp $df00,x
- bne noreu1
- inx
- cpx #5
- bne loop2
- lda #0
- sta reubase
- lda reubase
- and #16 ; check bit 4 for REU mem
- beq r1700 ; 0 = REU 1700
- sta banks
- action ldx #$00
- check
- lda #128 ; stash
- sta config
- lda #$11
- sta c64hi+1
- jsr main
- lda #129 ; transfer to C64 : $1200
- sta config
- lda #$12
- sta c64hi+1
- jsr main
- jsr bankcheck
- inx
- cpx #03
- bne check
- jmp reu1750
- jsr bigger
- rts
- noreu1 jmp noreu
- rts
- ;--------------------------------------------------
- ; Bank Check
- ;--------------------------------------------------
- bankcheck
- ldy #$00
- l2 lda $1100,y
- l6 cmp $1200,y
- bcc l4
- beq l3
- l3 iny
- cpy #16
- bne l2
- end sty tries
- rts
- l4 jmp l5
- l5 inc $d021
- rts
- r1700 jmp reu1700
- config !byte 252
- bigger lda #13
- sta c64hi+1
- sta l6+1
- lda #129
- sta config
- lda #4
- sta bank+1
- jsr main
- jsr bankcheck
- rts
- ;--------------------------------------------------
- ; REU TRANSFER ROUTINE
- ;--------------------------------------------------
- main
- lda config
- sta reubase+1
- lda #$00
- sta reubase+2
- c64hi lda #$11 ; $1100
- sta reubase+3
- lda #$00
- sta reubase+4
- sta reubase+5
- bank lda #0
- sta reubase+6 ; Bank
- lda #16
- sta reubase+7 ; 16 Bytes
- lda #$00
- sta reubase+8
- lda #$00
- sta reubase+9
- lda #$00
- sta reubase+10
- lda $1
- pha
- lda #$30 ; RAM
- sei
- sta $1
- sta $ff00
- pla
- sta $1
- cli
- rts
- ;--------------------------------------------------
- ; dummy bytes and text
- ;--------------------------------------------------
- *=$1100
- !byte $00,$01,$02,$03,$04,$05,$06,$07,$08,$09,$0a,$0b,$0c,$0d,$0e,$0f
- reutext: !text "REU 1700 DETECTED",0
- text1750: !text "REU 1764/1750 DETECTED",0
- notext: !text "NO REU",0
- ;--------------------------------------------------
- ; Text
- ;--------------------------------------------------
- noreu lda #<notext
- ldy #>notext
- jmp $ab1e
- reu1700 lda #2 ; REU 1700 found: 2 banks
- sta banks
- lda #<reutext
- ldy #>reutext
- jmp $ab1e
- rts
- reu1750 lda #4 ; REU 17x0 found: 4 banks (in use)
- sta banks
- lda #<text1750
- ldy #>text1750
- jmp $ab1e
- rts