!to "romread.prg",cbm ;-------------------------------------------------- ; 8Kbyte - 2364 ROM Read ;-------------------------------------------------- ; ; Chip Address $01 : PortA = A0-A7 ; PortB = A8-A12 ; Chip Address $00 : PortA = D0-D7 ; ; /CS - GND ;-------------------------------------------------- ; Reads ROM in something around 0,5Kbyte/s ; ; 31.1.2016 M. Sachse http://www.cbmhardware.de ;-------------------------------------------------- ioport = $df01 t_lo = $0a t_hi = $0b outbuf = $0c inbuf = $0d x_temp = $0f * = $1000 ;-------------------------------------------------- ; Setup Ports ;-------------------------------------------------- ; ;---[ Write first Init to Expanders ; lda #$93 jsr $ffd2 + ldy #$00 ; init chip sty count sty lo_addr lda #%00000000 sta ioport ; flip to low: chip selected - lda port_init,y sta outbuf jsr send_byte ; send sequence to use address-pins iny cpy #$03 ; 3 bytes: $40 (+w),registers,value bne - lda #%00000001 ; flip to high: chip deselected sta ioport ;---[ Set Direction-Register and Pullups Chip: A=0:PortA ; lda #%00000000 ; set direction-register sta ioport ; flip to low: chip selected lda #$40 sta outbuf jsr send_byte lda #$00 ; 00h: IODIRA sta outbuf jsr send_byte lda #$ff ; port input (D0-D7) sta outbuf jsr send_byte lda #%00000001 ; flip to high: chip deselected sta ioport ; Set Pullups lda #%00000000 sta ioport ; flip to low: chip selected lda #$40 sta outbuf jsr send_byte lda #$0c ; 0ch: GPPUA sta outbuf jsr send_byte lda #$ff ; pullups on port set sta outbuf jsr send_byte lda #%00000001 ; flip to high: chip deselected sta ioport ;---[ Set Direction-Register Chip: A=1:PortA and PortB ; lda #%00000000 ; set direction-register sta ioport ; flip to low: chip selected lda #$42 sta outbuf jsr send_byte lda #$00 ; 00h: IODIRA sta outbuf jsr send_byte lda #$00 ; port output (A0-A7) sta outbuf jsr send_byte lda #%00000001 ; flip to high: chip deselected sta ioport ;PortB to output lda #%00000000 ; set direction-register sta ioport ; flip to low: chip selected lda #$42 sta outbuf jsr send_byte lda #$01 ; 01h: IODIRB sta outbuf jsr send_byte lda #$00 ; port output (A8-A12) sta outbuf jsr send_byte lda #%00000001 ; flip to high: chip deselected sta ioport ;-------------------------------------------------- ; ; Address and read ROM ; ;-------------------------------------------------- sei lda #"." sta $0400 ldy #$00 lda #$30 ; storage at $3000-$4fff sta t_hi ldx #$00 stx t_lo -- txa sta lo_addr sta x_temp ; set low address-bits lda #%00000000 ; set address A0-A7 sta ioport ; flip to low: chip selected lda #$42 sta outbuf jsr send_byte lda #$14 ; 14h:OLATA sta outbuf jsr send_byte lda lo_addr sta outbuf jsr send_byte lda #%00000001 ; flip to high: chip deselected sta ioport ; get byte from port lda #%00000000 sta ioport ; flip to low: chip selected lda #$41 sta outbuf jsr send_byte lda #$12 ; 12h:GPIOA sta outbuf jsr send_byte ; read byte ldx #$00 - lda #%00000010 ; set clock sta ioport lda ioport and #%00001000 beq + ; write "0" lda inbuf ora or_table,x sta inbuf + and #%00000000 ; clock low sta ioport inx cpx #$08 bne - lda #%00000001 ; flip to high: chip deselected sta ioport lda x_temp tay tax lda inbuf sta (t_lo),y ; save ROM at $3000-$4fff and #$00 sta inbuf inx bne -- inc t_hi inc count ; set high address-bits lda #%00000000 ; set address A8-A12 sta ioport ; flip to low: chip selected lda #$42 sta outbuf jsr send_byte lda #$15 ; 15h:OLATB sta outbuf jsr send_byte lda count sta outbuf jsr send_byte lda #%00000001 ; flip to high: chip deselected sta ioport ldy count lda #"." ; drop some points ... sta $0400,y ldx #$00 cpy #$20 ; 32*256=8192 Bytes beq ++ jmp -- ++ cli rts count: !by $00 lo_addr: !by $00 ;---------------------------- ; send_byte ; ; x-reg: bit counter ; carry: bit carrier ; ;---------------------------- send_byte: ldx #$00 txa -- lda #$00 asl outbuf ; shift left: [Carry<-msb...lsb] bcc + ; --- send high bit --------- ora #%00000100 ; set bit sta ioport ora #%00000110 ; set clock sta ioport and #%00000100 ; set clock to low sta ioport clc inx cpx #$08 bne -- rts ; --- send low bit ---------- + ora #%00000000 ; set bit sta ioport ora #%00000010 ; set clock sta ioport and #%00000000 ; clock to low sta ioport ++ inx cpx #$08 bne -- ldx #$00 rts port_init: !by $40,$0a,$08 or_table: !by $80,$40,$20,$10,$08,$04,$02,$01
Letzte Änderung: 2019-01-03 12:02:35