Hello everybody...
For the program there asm which I realize, I need a small code to draw pixel.
I found on the forum a small routine which pleases me well.
There were some errors of labels that I corrected.
I do not performance of speed.
I use Bank3 (no need the characters).
Address Screen = $e000
The routine ' clrHiResBITMAP ' does not work.
The routine ' SetPixel ' does not work.
My code:
Code
- SCREEN = $e000
- AdrSCR = $f9
- ;-----------------------
- jmp Main
- ;-----------------------
- HIRES
- lda $dd00 ; 56576
- ora #$03
- eor #$03
- sta $dd00 ; Bank 3
- ;-----------------------
- lda $d018 ; 53272
- and #$07
- ora #$08
- ora #$30
- sta $d018 ; 53272 Mem ctrl Reg
- ;-----------------------
- lda $d011 ; 53265
- ora #$20
- sta $d011 ; Bitmap mode
- ;-----------------------
- lda $d016
- and #$ef
- sta $d016
- rts
- ;-----------------------
- ColorHires
- lda #$00 ; #Black
- ldx #$fa
- .loop8
- sta $cc00,x ; 52224
- sta $ccfa,x
- sta $cdf4,x
- sta $ceee,x
- dex
- bne .loop8
- sta $cc00
- rts
- ;-----------------------
- clrHiResBITMAP
- lda #<SCREEN
- sta AdrSCR
- lda #>SCREEN
- sta AdrSCR+1
- ldx #32 ;Schleifenzähler 32 Pages (32 * 256 = 8192 = 8KB)
- ldy #0 ;Schleifenzähler für 256 BYTES je Page
- tya ;Akku auf 0 setzen
- .loop0
- sta (AdrSCR),Y ;Akku 'ausgeben'
- dey ;Y verringern
- bne .loop0 ;solange größer 0 nochmal -> .loop
- inc AdrSCR+1 ;Adresse auf der Zeropage um eine Page erhöhen
- dex ;Pagezähler verringern
- bne .loop0 ;solange größer 0 nochmal -> .loop
- rts ;zurück zum Aufrufer
- ;-----------------------
- ;*** X-Position = Carry + X-Register
- ;*** Y-Position = Y-Register
- SetPixel
- lda #<SCREEN ;BITMAP-Adresse auf die Zero-Page
- sta AdrSCR
- lda #>SCREEN
- sta AdrSCR+1
- bcc .skip ;falls Carry gelöscht weiter -> .skip
- inc AdrSCR+1 ;sonst MSB+1
- clc ;und C wieder löschen (für ADC)
- .skip
- txa ;X in den Akku
- pha ;und für später merken
- and #%11111000 ;'Pixel'-Position ausblenden
- adc AdrSCR ;Anzahl der BYTES für X-Position addieren
- sta AdrSCR ;und speichern
- bcc .skip1 ;falls C gelöscht ist weiter -> .skip
- inc AdrSCR+1 ;sonst MSB wegen gesetztem Carry erhöhen
- .skip1
- tya ;Y in den Akku
- pha ;und merken
- lsr ;jetzt durch 8 teilen
- lsr
- lsr
- beq .skip2
- tay
- .loop5
- clc ;Für jede 'Textzeile' 320 BYTES addieren
- lda AdrSCR
- adc #64
- sta AdrSCR
- lda AdrSCR+1
- adc #1
- sta AdrSCR+1
- dey
- bne .loop5
- .skip2
- pla
- and #%00000111 ;BYTES für die 'Ziel-Textzeile'
- tay ;ins Y-Register (für Y-nach-indizierte-Adr.)
- pla ;jetzt noch die BIT-Position (X) berechnen
- and #%00000111
- tax
- lda #$00
- sec
- .loop1
- ror ;Zielpixel 'einrotieren'
- dex
- bpl .loop1 ;wiederhole, solange X positiv
- ora (AdrSCR),Y ;mit bisherigen Wert ODER-Verknüpfen
- sta (AdrSCR),Y ;und speichern
- rts ;zurück zum Aufrufer
- ;-----------------------
- Main
- jsr HIRES
- jsr clrHiResBITMAP
- jsr ColorHires
- go ;Test
- clc ;Carry Clear
- ldx #10
- ldy #10
- jsr setPixel
- sec ;Set Carry X>255
- ldx #10
- ldy #10
- jsr setPixel
- End
- jmp End