Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ;**********************************************************************************
- ; Apple Logo Drawing Program for C64 - Assembly Version
- ;
- ; Description:
- ; Sets VIC-II to HiRes bitmap mode and draws the Apple logo with profiles
- ; of Steve Jobs and Steve Wozniak using predefined line coordinates.
- ;
- ; Original Source:
- ; Converted from Applesoft BASIC listing by Ed Solie.
- ; (https://www.facebook.com/groups/2057165187928233/permalink/3952619865049413/)
- ; Adapted to C64 Assembly by F. Nardella (Kimono).
- ;
- ; Assembler:
- ; 64Tass (https://github.com/mist64/64tass)
- ;
- ; Compilation:
- ; 64tass -a -o applelogo.prg applelogo.asm
- ;
- ;**********************************************************************************
- * = $C000
- ;******************************************************
- ; PARAMETRI VICII
- ;******************************************************
- VICII = $d000
- VICII1 = VICII + $11 ; VICII Control Register 1 - Hi Res - 53265
- VICII2 = VICII + $16 ; VICII Control Register 2 - Hi Res - 53270
- VICIIA = VICII + $18 ; VICII Start Address Graphic Ram - 53272
- VICIIB = VICII + $20 ; VICII Border Color Registry - 53280
- VICIIS = VICII + $21 ; VICII BackGround Color Registry - 53281
- loc = $5a ;loc e loc+1 sono LSB e MSB della locaz. in Graphic RAM in cui accendere il pixel
- store = $5c
- bmpage = $ff
- FRAMEPTR = $fb ; Puntatore al frame corrente
- FRAMECNT = $fd ; Contatore dei frame
- PARAMS = $828
- xL = PARAMS + 0 ; LSB sono le coordinate per plot
- xH = PARAMS + 1 ; MSB sono le coordinate per plot
- yy = PARAMS + 2 ; sono le coordinate per plot
- x1 = PARAMS + 3 ; Coordinata X del primo punto
- y1 = PARAMS + 4 ; Coordinata Y del primo punto
- x2 = PARAMS + 5 ; Coordinata X del secondo punto
- y2 = PARAMS + 6 ; Coordinata Y del secondo punto
- dx = PARAMS + 7 ; Differenza X
- dy = PARAMS + 8 ; Differenza Y
- sx = PARAMS + 9 ; Direzione X (-1 o +1)
- sy = PARAMS + 10 ; Direzione Y (-1 o +1)
- err = PARAMS + 11 ; Errore accumulato
- START
- ldx #11
- stx VICIIB ; Bordo grigio scuro
- jsr HIRES ; Passa in modalità hi res
- jsr GRRAM ; Imposta l'area della RAM grafica
- jsr CLEARGR ; Cancella la RAM grafica
- jsr CLEARCO ; Cancella la Color RAM
- jsr DRAWAPPLE ; Disegna la mela
- rts
- DRAWAPPLE
- lda #<COORD_TABLE
- sta FRAMEPTR
- lda #>COORD_TABLE
- sta FRAMEPTR+1
- next_line
- ldy #0
- lda (FRAMEPTR),y
- beq done ; Se trovi 0,0,0,0 la lista è finita
- sta x1
- iny
- lda (FRAMEPTR),y
- sta y1
- iny
- lda (FRAMEPTR),y
- sta x2
- iny
- lda (FRAMEPTR),y
- sta y2
- jsr LINE ; Disegna la linea
- ; Passa alla prossima riga di coordinate (4 byte)
- clc
- lda FRAMEPTR
- adc #4
- sta FRAMEPTR
- lda FRAMEPTR+1
- adc #0
- sta FRAMEPTR+1
- jmp next_line
- done
- jmp done
- ; --------------------------------------------------------------
- ; Funzione per attivare la modalità bitmap HiRes
- ; --------------------------------------------------------------
- HIRES
- lda VICII1
- ora #32
- sta VICII1
- rts
- GRRAM
- lda VICIIA
- ora #8
- sta VICIIA
- rts
- ; --------------------------------------------------------------
- ; Funzione per pulire lo schermo grafico
- ; --------------------------------------------------------------
- CLEARGR
- lda #0
- sta $fa
- lda #$20
- sta $fb
- ldx #32
- loop
- ldy #$0
- byte
- lda #$0
- sta ($fa),y
- dey
- bne byte
- inc $fb
- dex
- bne loop
- rts
- ; --------------------------------------------------------------
- ; Funzione per pulire e impostare la Color RAM
- ; --------------------------------------------------------------
- CLEARCO
- lda #208
- ldx #0
- stx $fa
- ldx #4
- stx $fb
- ldy #0
- cloop
- sta ($fa),y
- iny
- bne cloop
- inc $fb
- ldx $fb
- cpx #8
- bne cloop
- rts
- ; --------------------------------------------------------------
- ; Funzione per disegnare un punto
- ; --------------------------------------------------------------
- PLOT
- lda xL
- and #7
- tax
- lda #0
- sta loc
- lda xL
- and #$f8
- sta store
- lda yy
- lsr
- lsr
- lsr
- sta loc+1
- lsr
- ror loc
- lsr
- ror loc
- adc loc+1
- sta loc+1
- lda yy
- and #7
- adc loc
- adc store
- sta loc
- lda loc+1
- adc xH
- adc bmpage
- sta loc+1
- ldy #0
- lda (loc),y
- ora BITMASK,x
- sta (loc),y
- rts
- ; --------------------------------------------------------------
- ; Funzione per disegnare una linea tra due punti
- ; --------------------------------------------------------------
- LINE
- jsr SUB_LINE
- ; Calcola error = (dx > dy ? dx : dy) / 2
- lda dx
- cmp dy
- bcc dy_greater
- lsr ; Dividi dx per 2
- sta err
- jmp check_slopes
- dy_greater
- lda dy
- lsr ; Dividi dy per 2
- sta err
- check_slopes
- ; Decidi quale routine di loop usare
- lda dx
- cmp dy
- bcs dx_ge_dy ; Se dx >= dy, usa la routine x-dominant
- ; Routine y-dominant (pendenza > 1)
- y_loop
- jsr PLOT ; Disegna il punto
- ; Aggiorna l'errore e muovi x se necessario
- lda err
- clc
- adc dx ; err += dx
- sta err
- cmp dy ; Se err >= dy...
- bcc skip_x_step
- sec
- sbc dy ; ...sottrai dy da err
- sta err
- lda xL ; ...e incrementa/decrementa x
- clc
- adc sx
- sta xL
- bcc skip_x_step
- inc xH ; Gestisci il riporto se necessario
- skip_x_step
- ; Incrementa o decrementa y
- lda yy
- clc
- adc sy
- sta yy
- ; Controlla se abbiamo raggiunto y2
- cmp y2
- bne y_loop ; Se y != y2, continua
- lda xL
- cmp x2
- bne y_loop ; Se x != x2, continua
- rts
- dx_ge_dy
- ; Routine x-dominant (pendenza <= 1)
- x_loop
- jsr PLOT ; Disegna il punto
- ; Aggiorna l'errore e muovi y se necessario
- lda err
- clc
- adc dy ; err += dy
- sta err
- cmp dx ; Se err >= dx...
- bcc skip_y_step
- sec
- sbc dx ; ...sottrai dx da err
- sta err
- lda yy ; ...e incrementa/decrementa y
- clc
- adc sy
- sta yy
- skip_y_step
- ; Incrementa o decrementa x
- lda xL
- clc
- adc sx
- sta xL
- bcc no_carry
- inc xH ; Gestisci il riporto se necessario
- no_carry
- ; Controlla se abbiamo raggiunto x2
- cmp x2
- bne x_loop ; Se x != x2, continua
- lda yy
- cmp y2
- bne x_loop ; Se y != y2, continua
- rts
- SUB_LINE
- ; Controlla se x1 > x2 e in tal caso scambia i punti
- lda x1
- cmp x2
- bcc no_swap_x ; Se x1 < x2, non serve scambiare
- ; Scambia x1 e x2
- lda x1
- pha ; Salva x1 nello stack
- lda x2
- sta x1
- pla
- sta x2
- ; Scambia anche y1 e y2
- lda y1
- pha ; Salva y1 nello stack
- lda y2
- sta y1
- pla
- sta y2
- no_swap_x
- ; Calcola dx = abs(x2 - x1)
- lda x2
- sec
- sbc x1
- bpl store_dx ; Se è positivo, salta
- eor #$FF ; Altrimenti, negalo (complemento a 1)
- clc
- adc #1 ; Complemento a 2 per ottenere abs()
- store_dx
- sta dx
- ; Calcola dy = abs(y2 - y1)
- lda y2
- sec
- sbc y1
- bpl store_dy ; Se è positivo, salta
- eor #$FF ; Altrimenti, negalo
- clc
- adc #1
- store_dy
- sta dy
- ; Determina direzione x (sx)
- lda x1
- cmp x2
- bcc x_ascending
- lda #$FF ; sx = -1 (x1 > x2)
- jmp store_sx
- x_ascending
- lda #$01 ; sx = 1 (x1 < x2)
- store_sx
- sta sx
- ; Determina direzione y (sy)
- lda y1
- cmp y2
- bcc y_ascending
- lda #$FF ; sy = -1 (y1 > y2)
- jmp store_sy
- y_ascending
- lda #$01 ; sy = 1 (y1 < y2)
- store_sy
- sta sy
- ; Imposta i valori iniziali di x e y
- lda x1
- sta xL
- lda #0 ; Assumiamo che xH sia sempre 0 per semplicità
- sta xH
- lda y1
- sta yy
- rts
- BITMASK
- .byte $80, $40, $20, $10, $08, $04, $02, $01
- COORD_TABLE
- ; Coordinate della mela - modificate per una forma più riconoscibile
- ; Formato: x1, y1, x2, y2
- .byte 169,3,172,3
- .byte 165,4,172,4
- .byte 163,5,172,5
- .byte 161,6,172,6
- .byte 159,7,171,7
- .byte 157,8,171,8
- .byte 155,9,171,9
- .byte 153,10,171,10
- .byte 151,11,171,11
- .byte 150,12,170,12
- .byte 149,13,170,13
- .byte 148,14,170,14
- .byte 147,15,169,15
- .byte 146,16,169,16
- .byte 145,17,169,17
- .byte 144,18,168,18
- .byte 143,19,168,19
- .byte 142,20,168,20
- .byte 141,21,167,21
- .byte 141,22,167,22
- .byte 140,23,166,23
- .byte 140,24,166,24
- .byte 139,25,165,25
- .byte 139,26,165,26
- .byte 138,27,164,27
- .byte 138,28,164,28
- .byte 137,29,163,29
- .byte 137,30,162,30
- .byte 136,31,161,31
- .byte 136,32,160,32
- .byte 136,33,159,33
- .byte 135,34,158,34
- .byte 135,35,157,35
- .byte 135,36,156,36
- .byte 135,37,155,37
- .byte 134,38,154,38
- .byte 134,39,152,39
- .byte 134,40,151,40
- .byte 134,41,149,41
- .byte 134,42,148,42
- .byte 134,43,146,43
- .byte 134,44,144,44
- .byte 134,45,142,45
- .byte 135,46,139,46
- .byte 103,48,105,48,168,48,170,48
- .byte 99,49,111,49,165,49,175,49
- .byte 94,50,116,50,160,50,181,50
- .byte 91,51,119,51,154,51,186,51
- .byte 89,52,122,52,151,52,189,52
- .byte 86,53,124,53,148,53,191,53
- .byte 84,54,127,54,145,54,193,54
- .byte 82,55,130,55,142,55,194,55
- .byte 81,56,132,56,139,56,196,56
- .byte 80,57,197,57
- .byte 79,58,198,58
- .byte 78,59,199,59
- .byte 77,60,200,60
- .byte 76,61,201,61
- .byte 75,62,202,62
- .byte 74,63,203,63
- .byte 73,64,204,64
- .byte 72,65,205,65
- .byte 72,66,204,66
- .byte 72,67,201,67
- .byte 76,68,198,68
- .byte 78,69,196,69
- .byte 82,70,194,70
- .byte 85,71,192,71
- .byte 87,72,191,72
- .byte 90,73,190,73
- .byte 92,74,188,74
- .byte 94,75,187,75
- .byte 95,76,186,76
- .byte 97,77,185,77
- .byte 98,78,185,78
- .byte 100,79,184,79
- .byte 100,80,184,80
- .byte 101,81,183,81
- .byte 101,82,182,82
- .byte 102,83,182,83
- .byte 102,84,182,84
- .byte 102,85,181,85
- .byte 102,86,181,86
- .byte 102,87,181,87
- .byte 101,88,181,88
- .byte 97,89,98,89,101,89,181,89
- .byte 97,90,100,90,100,90,181,90
- .byte 97,91,181,91
- .byte 97,92,181,92
- .byte 98,93,181,93
- .byte 98,94,181,94
- .byte 98,95,181,95
- .byte 98,96,181,96
- .byte 98,97,181,97
- .byte 98,98,181,98
- .byte 98,99,181,99
- .byte 98,100,182,100
- .byte 99,101,182,101
- .byte 99,102,179,102,178,101,183,102
- .byte 100,103,180,103,182,103,184,103
- .byte 101,104,181,104,183,104,185,104
- .byte 102,105,182,105,184,105,185,105
- .byte 103,106,183,106,185,106,186,106
- .byte 104,107,184,107
- .byte 105,108,185,108
- .byte 105,109,185,109
- .byte 105,110,184,110
- .byte 104,111,184,111
- .byte 103,112,183,112
- .byte 100,113,183,113
- .byte 100,114,182,114
- .byte 101,115,182,115
- .byte 101,116,181,116
- .byte 101,117,181,117
- .byte 100,118,180,118
- .byte 99,119,180,119
- .byte 98,120,180,120
- .byte 97,121,181,121
- .byte 96,122,187,122
- .byte 96,123,188,123
- .byte 97,124,188,124
- .byte 97,125,189,125
- .byte 96,126,192,126
- .byte 96,127,192,127
- .byte 95,128,192,128
- .byte 95,129,192,129
- .byte 96,130,193,130
- .byte 97,131,194,131
- .byte 97,132,194,132
- .byte 97,133,194,133
- .byte 96,134,194,134
- .byte 96,135,195,135
- .byte 95,136,195,136
- .byte 95,137,196,137
- .byte 94,138,197,138
- .byte 94,139,199,139,209,139,211,139
- .byte 66,140,73,140,93,140,211,140
- .byte 66,141,75,141,92,141,210,141
- .byte 67,142,76,142,90,142,210,142
- .byte 68,143,83,143,87,143,209,143
- .byte 68,144,209,144
- .byte 68,145,209,145
- .byte 69,146,208,146
- .byte 69,147,208,147
- .byte 70,148,207,148
- .byte 70,149,207,149
- .byte 71,150,206,150
- .byte 71,151,206,151
- .byte 72,152,205,152
- .byte 72,153,205,153
- .byte 73,154,204,154
- .byte 73,155,204,155
- .byte 74,156,203,156
- .byte 74,157,203,157
- .byte 75,158,202,158
- .byte 75,159,202,159
- .byte 76,160,201,160
- .byte 76,161,201,161
- .byte 77,162,200,162
- .byte 77,163,200,163
- .byte 78,164,199,164
- .byte 79,165,198,165
- .byte 80,166,197,166
- .byte 81,167,196,167
- .byte 82,168,195,168
- .byte 83,169,194,169
- .byte 84,170,193,170
- .byte 85,171,192,171
- .byte 86,172,191,172
- .byte 87,173,190,173
- .byte 88,174,189,174
- .byte 89,175,188,175
- .byte 90,176,187,176
- .byte 91,177,186,177
- .byte 92,178,185,178
- .byte 93,179,184,179
- .byte 94,180,183,180
- .byte 95,181,182,181
- .byte 96,182,132,182,145,182,180,182
- .byte 97,183,127,183,150,183,179,183
- .byte 98,184,124,184,154,184,178,184
- .byte 99,185,121,185,157,185,177,185
- .byte 100,186,118,186,159,186,176,186
- .byte 101,187,116,187,161,187,175,187
- .byte 104,188,112,188,164,188,172,188
- ; Terminator (0,0,0,0)
- .byte 0, 0, 0, 0
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement