Advertisement
felixnardella

Apple Logo Jobs - Wozniak

May 16th, 2025 (edited)
789
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
6502 TASM/64TASS 13.30 KB | Source Code | 0 0
  1. ;**********************************************************************************
  2. ; Apple Logo Drawing Program for C64 - Assembly Version
  3. ;
  4. ; Description:
  5. ;   Sets VIC-II to HiRes bitmap mode and draws the Apple logo with profiles
  6. ;   of Steve Jobs and Steve Wozniak using predefined line coordinates.
  7. ;
  8. ; Original Source:
  9. ;   Converted from Applesoft BASIC listing by Ed Solie.
  10. ;   (https://www.facebook.com/groups/2057165187928233/permalink/3952619865049413/)
  11. ;   Adapted to C64 Assembly by F. Nardella (Kimono).
  12. ;
  13. ; Assembler:
  14. ;   64Tass (https://github.com/mist64/64tass)
  15. ;
  16. ; Compilation:
  17. ;   64tass -a -o applelogo.prg applelogo.asm
  18. ;
  19. ;**********************************************************************************
  20.  
  21.  
  22. * = $C000
  23. ;******************************************************
  24. ; PARAMETRI VICII
  25. ;******************************************************
  26. VICII  = $d000
  27. VICII1 = VICII + $11  ; VICII Control Register 1 - Hi Res - 53265
  28. VICII2 = VICII + $16  ; VICII Control Register 2 - Hi Res - 53270
  29. VICIIA = VICII + $18  ; VICII Start Address Graphic Ram - 53272
  30. VICIIB = VICII + $20  ; VICII Border Color Registry - 53280
  31. VICIIS = VICII + $21  ; VICII BackGround Color Registry - 53281
  32.  
  33. loc = $5a ;loc e loc+1 sono LSB e MSB della locaz. in Graphic RAM in cui accendere il pixel
  34. store = $5c
  35. bmpage = $ff
  36. FRAMEPTR = $fb     ; Puntatore al frame corrente
  37. FRAMECNT = $fd     ; Contatore dei frame
  38. PARAMS = $828
  39. xL = PARAMS + 0 ; LSB sono le coordinate per plot
  40. xH = PARAMS + 1 ; MSB sono le coordinate per plot
  41. yy = PARAMS + 2 ; sono le coordinate per plot
  42. x1  = PARAMS + 3  ; Coordinata X del primo punto
  43. y1  = PARAMS + 4  ; Coordinata Y del primo punto
  44. x2  = PARAMS + 5  ; Coordinata X del secondo punto
  45. y2  = PARAMS + 6  ; Coordinata Y del secondo punto
  46. dx  = PARAMS + 7  ; Differenza X
  47. dy  = PARAMS + 8  ; Differenza Y
  48. sx  = PARAMS + 9  ; Direzione X (-1 o +1)
  49. sy  = PARAMS + 10 ; Direzione Y (-1 o +1)
  50. err = PARAMS + 11 ; Errore accumulato
  51.  
  52.  
  53. START
  54.     ldx #11
  55.     stx VICIIB     ; Bordo grigio scuro
  56.     jsr HIRES      ; Passa in modalità hi res
  57.     jsr GRRAM      ; Imposta l'area della RAM grafica
  58.     jsr CLEARGR    ; Cancella la RAM grafica
  59.     jsr CLEARCO    ; Cancella la Color RAM
  60.     jsr DRAWAPPLE  ; Disegna la mela
  61.  
  62.     rts
  63.  
  64. DRAWAPPLE
  65.     lda #<COORD_TABLE
  66.     sta FRAMEPTR
  67.     lda #>COORD_TABLE
  68.     sta FRAMEPTR+1
  69.  
  70. next_line
  71.     ldy #0
  72.     lda (FRAMEPTR),y
  73.     beq done         ; Se trovi 0,0,0,0 la lista è finita
  74.  
  75.     sta x1
  76.     iny
  77.     lda (FRAMEPTR),y
  78.     sta y1
  79.     iny
  80.     lda (FRAMEPTR),y
  81.     sta x2
  82.     iny
  83.     lda (FRAMEPTR),y
  84.     sta y2
  85.  
  86.     jsr LINE         ; Disegna la linea
  87.  
  88.     ; Passa alla prossima riga di coordinate (4 byte)
  89.     clc
  90.     lda FRAMEPTR
  91.     adc #4
  92.     sta FRAMEPTR
  93.     lda FRAMEPTR+1
  94.     adc #0
  95.     sta FRAMEPTR+1
  96.  
  97.     jmp next_line
  98.  
  99. done
  100.     jmp done
  101.  
  102. ; --------------------------------------------------------------
  103. ; Funzione per attivare la modalità bitmap HiRes
  104. ; --------------------------------------------------------------
  105. HIRES
  106.     lda VICII1
  107.     ora #32
  108.     sta VICII1
  109.     rts
  110.  
  111. GRRAM
  112.     lda VICIIA
  113.     ora #8
  114.     sta VICIIA
  115.     rts
  116.  
  117. ; --------------------------------------------------------------
  118. ; Funzione per pulire lo schermo grafico
  119. ; --------------------------------------------------------------
  120. CLEARGR
  121.     lda #0
  122.     sta $fa
  123.     lda #$20
  124.     sta $fb
  125.     ldx #32
  126. loop
  127.     ldy #$0
  128. byte
  129.     lda #$0
  130.     sta ($fa),y
  131.     dey
  132.     bne byte
  133.     inc $fb
  134.     dex
  135.     bne loop
  136.     rts
  137.  
  138. ; --------------------------------------------------------------
  139. ; Funzione per pulire e impostare la Color RAM
  140. ; --------------------------------------------------------------
  141. CLEARCO
  142.     lda #208
  143.     ldx #0
  144.     stx $fa
  145.     ldx #4
  146.     stx $fb
  147.     ldy #0
  148. cloop
  149.     sta ($fa),y
  150.     iny
  151.     bne cloop
  152.     inc $fb
  153.     ldx $fb
  154.     cpx #8
  155.     bne cloop
  156.     rts
  157.  
  158. ; --------------------------------------------------------------
  159. ; Funzione per disegnare un punto
  160. ; --------------------------------------------------------------
  161. PLOT
  162.     lda xL
  163.     and #7
  164.     tax
  165.     lda #0
  166.     sta loc
  167.     lda xL
  168.     and #$f8
  169.     sta store
  170.     lda yy
  171.     lsr
  172.     lsr
  173.     lsr
  174.     sta loc+1
  175.     lsr
  176.     ror loc
  177.     lsr
  178.     ror loc
  179.     adc loc+1
  180.     sta loc+1
  181.     lda yy
  182.     and #7
  183.     adc loc
  184.     adc store
  185.     sta loc
  186.     lda loc+1
  187.     adc xH
  188.     adc bmpage
  189.     sta loc+1
  190.     ldy #0
  191.     lda (loc),y
  192.     ora BITMASK,x
  193.     sta (loc),y
  194.     rts
  195.  
  196. ; --------------------------------------------------------------
  197. ; Funzione per disegnare una linea tra due punti
  198. ; --------------------------------------------------------------
  199. LINE
  200.     jsr SUB_LINE
  201.    
  202.     ; Calcola error = (dx > dy ? dx : dy) / 2
  203.     lda dx
  204.     cmp dy
  205.     bcc dy_greater
  206.     lsr             ; Dividi dx per 2
  207.     sta err
  208.     jmp check_slopes
  209. dy_greater
  210.     lda dy
  211.     lsr             ; Dividi dy per 2
  212.     sta err
  213.    
  214. check_slopes
  215.     ; Decidi quale routine di loop usare
  216.     lda dx
  217.     cmp dy
  218.     bcs dx_ge_dy    ; Se dx >= dy, usa la routine x-dominant
  219.    
  220.     ; Routine y-dominant (pendenza > 1)
  221. y_loop
  222.     jsr PLOT        ; Disegna il punto
  223.    
  224.     ; Aggiorna l'errore e muovi x se necessario
  225.     lda err
  226.     clc
  227.     adc dx          ; err += dx
  228.     sta err
  229.     cmp dy          ; Se err >= dy...
  230.     bcc skip_x_step
  231.     sec
  232.     sbc dy          ; ...sottrai dy da err
  233.     sta err
  234.     lda xL          ; ...e incrementa/decrementa x
  235.     clc
  236.     adc sx
  237.     sta xL
  238.     bcc skip_x_step
  239.     inc xH          ; Gestisci il riporto se necessario
  240. skip_x_step
  241.    
  242.     ; Incrementa o decrementa y
  243.     lda yy
  244.     clc
  245.     adc sy
  246.     sta yy
  247.    
  248.     ; Controlla se abbiamo raggiunto y2
  249.     cmp y2
  250.     bne y_loop      ; Se y != y2, continua
  251.     lda xL
  252.     cmp x2
  253.     bne y_loop      ; Se x != x2, continua
  254.     rts
  255.    
  256. dx_ge_dy
  257.     ; Routine x-dominant (pendenza <= 1)
  258. x_loop
  259.     jsr PLOT        ; Disegna il punto
  260.    
  261.     ; Aggiorna l'errore e muovi y se necessario
  262.     lda err
  263.     clc
  264.     adc dy          ; err += dy
  265.     sta err
  266.     cmp dx          ; Se err >= dx...
  267.     bcc skip_y_step
  268.     sec
  269.     sbc dx          ; ...sottrai dx da err
  270.     sta err
  271.     lda yy          ; ...e incrementa/decrementa y
  272.     clc
  273.     adc sy
  274.     sta yy
  275. skip_y_step
  276.    
  277.     ; Incrementa o decrementa x
  278.     lda xL
  279.     clc
  280.     adc sx
  281.     sta xL
  282.     bcc no_carry
  283.     inc xH          ; Gestisci il riporto se necessario
  284. no_carry
  285.    
  286.     ; Controlla se abbiamo raggiunto x2
  287.     cmp x2
  288.     bne x_loop      ; Se x != x2, continua
  289.     lda yy
  290.     cmp y2
  291.     bne x_loop      ; Se y != y2, continua
  292.     rts
  293.  
  294. SUB_LINE
  295.     ; Controlla se x1 > x2 e in tal caso scambia i punti
  296.     lda x1
  297.     cmp x2
  298.     bcc no_swap_x   ; Se x1 < x2, non serve scambiare
  299.    
  300.     ; Scambia x1 e x2
  301.     lda x1
  302.     pha             ; Salva x1 nello stack
  303.     lda x2
  304.     sta x1
  305.     pla
  306.     sta x2
  307.    
  308.     ; Scambia anche y1 e y2
  309.     lda y1
  310.     pha             ; Salva y1 nello stack
  311.     lda y2
  312.     sta y1
  313.     pla
  314.     sta y2
  315.    
  316. no_swap_x
  317.  
  318.     ; Calcola dx = abs(x2 - x1)
  319.     lda x2
  320.     sec
  321.     sbc x1
  322.     bpl store_dx    ; Se è positivo, salta
  323.     eor #$FF        ; Altrimenti, negalo (complemento a 1)
  324.     clc
  325.     adc #1          ; Complemento a 2 per ottenere abs()
  326. store_dx
  327.     sta dx
  328.    
  329.     ; Calcola dy = abs(y2 - y1)
  330.     lda y2
  331.     sec
  332.     sbc y1
  333.     bpl store_dy    ; Se è positivo, salta
  334.     eor #$FF        ; Altrimenti, negalo
  335.     clc
  336.     adc #1
  337. store_dy
  338.     sta dy
  339.    
  340.     ; Determina direzione x (sx)
  341.     lda x1
  342.     cmp x2
  343.     bcc x_ascending
  344.     lda #$FF        ; sx = -1 (x1 > x2)
  345.     jmp store_sx
  346. x_ascending
  347.     lda #$01        ; sx = 1 (x1 < x2)
  348. store_sx
  349.     sta sx
  350.    
  351.     ; Determina direzione y (sy)
  352.     lda y1
  353.     cmp y2
  354.     bcc y_ascending
  355.     lda #$FF        ; sy = -1 (y1 > y2)
  356.     jmp store_sy
  357. y_ascending
  358.     lda #$01        ; sy = 1 (y1 < y2)
  359. store_sy
  360.     sta sy
  361.    
  362.     ; Imposta i valori iniziali di x e y
  363.     lda x1
  364.     sta xL
  365.     lda #0          ; Assumiamo che xH sia sempre 0 per semplicità
  366.     sta xH
  367.     lda y1
  368.     sta yy
  369.     rts
  370.  
  371. BITMASK  
  372.     .byte $80, $40, $20, $10, $08, $04, $02, $01
  373.  
  374.  
  375. COORD_TABLE
  376.  ; Coordinate della mela - modificate per una forma più riconoscibile
  377.     ; Formato: x1, y1, x2, y2
  378.     .byte 169,3,172,3
  379.     .byte 165,4,172,4
  380.     .byte 163,5,172,5
  381.     .byte 161,6,172,6
  382.     .byte 159,7,171,7
  383.     .byte 157,8,171,8
  384.     .byte 155,9,171,9
  385.     .byte 153,10,171,10
  386.     .byte 151,11,171,11
  387.     .byte 150,12,170,12
  388.     .byte 149,13,170,13
  389.     .byte 148,14,170,14
  390.     .byte 147,15,169,15
  391.     .byte 146,16,169,16
  392.     .byte 145,17,169,17
  393.     .byte 144,18,168,18
  394.     .byte 143,19,168,19
  395.     .byte 142,20,168,20
  396.     .byte 141,21,167,21
  397.     .byte 141,22,167,22
  398.     .byte 140,23,166,23
  399.     .byte 140,24,166,24
  400.     .byte 139,25,165,25
  401.     .byte 139,26,165,26
  402.     .byte 138,27,164,27
  403.     .byte 138,28,164,28
  404.     .byte 137,29,163,29
  405.     .byte 137,30,162,30
  406.     .byte 136,31,161,31
  407.     .byte 136,32,160,32
  408.     .byte 136,33,159,33
  409.     .byte 135,34,158,34
  410.     .byte 135,35,157,35
  411.     .byte 135,36,156,36
  412.     .byte 135,37,155,37
  413.     .byte 134,38,154,38
  414.     .byte 134,39,152,39
  415.     .byte 134,40,151,40
  416.     .byte 134,41,149,41
  417.     .byte 134,42,148,42
  418.     .byte 134,43,146,43
  419.     .byte 134,44,144,44
  420.     .byte 134,45,142,45
  421.     .byte 135,46,139,46
  422.     .byte 103,48,105,48,168,48,170,48
  423.     .byte 99,49,111,49,165,49,175,49
  424.     .byte 94,50,116,50,160,50,181,50
  425.     .byte 91,51,119,51,154,51,186,51
  426.     .byte 89,52,122,52,151,52,189,52
  427.     .byte 86,53,124,53,148,53,191,53
  428.     .byte 84,54,127,54,145,54,193,54
  429.     .byte 82,55,130,55,142,55,194,55
  430.     .byte 81,56,132,56,139,56,196,56
  431.     .byte 80,57,197,57
  432.     .byte 79,58,198,58
  433.     .byte 78,59,199,59
  434.     .byte 77,60,200,60
  435.     .byte 76,61,201,61
  436.     .byte 75,62,202,62
  437.     .byte 74,63,203,63
  438.     .byte 73,64,204,64
  439.     .byte 72,65,205,65
  440.     .byte 72,66,204,66
  441.     .byte 72,67,201,67
  442.     .byte 76,68,198,68
  443.     .byte 78,69,196,69
  444.     .byte 82,70,194,70
  445.     .byte 85,71,192,71
  446.     .byte 87,72,191,72
  447.     .byte 90,73,190,73
  448.     .byte 92,74,188,74
  449.     .byte 94,75,187,75
  450.     .byte 95,76,186,76
  451.     .byte 97,77,185,77
  452.     .byte 98,78,185,78
  453.     .byte 100,79,184,79
  454.     .byte 100,80,184,80
  455.     .byte 101,81,183,81
  456.     .byte 101,82,182,82
  457.     .byte 102,83,182,83
  458.     .byte 102,84,182,84
  459.     .byte 102,85,181,85
  460.     .byte 102,86,181,86
  461.     .byte 102,87,181,87
  462.  
  463.     .byte 101,88,181,88
  464.     .byte 97,89,98,89,101,89,181,89
  465.     .byte 97,90,100,90,100,90,181,90
  466.     .byte 97,91,181,91
  467.     .byte 97,92,181,92
  468.     .byte 98,93,181,93
  469.     .byte 98,94,181,94
  470.     .byte 98,95,181,95
  471.     .byte 98,96,181,96
  472.     .byte 98,97,181,97
  473.     .byte 98,98,181,98
  474.     .byte 98,99,181,99
  475.     .byte 98,100,182,100
  476.     .byte 99,101,182,101
  477.     .byte 99,102,179,102,178,101,183,102
  478.     .byte 100,103,180,103,182,103,184,103
  479.     .byte 101,104,181,104,183,104,185,104
  480.     .byte 102,105,182,105,184,105,185,105
  481.     .byte 103,106,183,106,185,106,186,106
  482.     .byte 104,107,184,107
  483.  
  484.     .byte 105,108,185,108
  485.     .byte 105,109,185,109
  486.     .byte 105,110,184,110
  487.     .byte 104,111,184,111
  488.     .byte 103,112,183,112
  489.     .byte 100,113,183,113
  490.     .byte 100,114,182,114
  491.     .byte 101,115,182,115
  492.     .byte 101,116,181,116
  493.     .byte 101,117,181,117
  494.     .byte 100,118,180,118
  495.     .byte 99,119,180,119
  496.     .byte 98,120,180,120
  497.     .byte 97,121,181,121
  498.     .byte 96,122,187,122
  499.     .byte 96,123,188,123
  500.     .byte 97,124,188,124
  501.     .byte 97,125,189,125
  502.     .byte 96,126,192,126
  503.     .byte 96,127,192,127
  504.     .byte 95,128,192,128
  505.     .byte 95,129,192,129
  506.     .byte 96,130,193,130
  507.     .byte 97,131,194,131
  508.     .byte 97,132,194,132
  509.     .byte 97,133,194,133
  510.     .byte 96,134,194,134
  511.     .byte 96,135,195,135
  512.     .byte 95,136,195,136
  513.     .byte 95,137,196,137
  514.     .byte 94,138,197,138
  515.  
  516.     .byte 94,139,199,139,209,139,211,139
  517.     .byte 66,140,73,140,93,140,211,140
  518.     .byte 66,141,75,141,92,141,210,141
  519.     .byte 67,142,76,142,90,142,210,142
  520.     .byte 68,143,83,143,87,143,209,143
  521.  
  522.     .byte 68,144,209,144
  523.     .byte 68,145,209,145
  524.     .byte 69,146,208,146
  525.     .byte 69,147,208,147
  526.     .byte 70,148,207,148
  527.     .byte 70,149,207,149
  528.     .byte 71,150,206,150
  529.     .byte 71,151,206,151
  530.     .byte 72,152,205,152
  531.     .byte 72,153,205,153
  532.     .byte 73,154,204,154
  533.     .byte 73,155,204,155
  534.     .byte 74,156,203,156
  535.     .byte 74,157,203,157
  536.     .byte 75,158,202,158
  537.     .byte 75,159,202,159
  538.     .byte 76,160,201,160
  539.     .byte 76,161,201,161
  540.     .byte 77,162,200,162
  541.     .byte 77,163,200,163
  542.     .byte 78,164,199,164
  543.     .byte 79,165,198,165
  544.     .byte 80,166,197,166
  545.     .byte 81,167,196,167
  546.     .byte 82,168,195,168
  547.     .byte 83,169,194,169
  548.     .byte 84,170,193,170
  549.     .byte 85,171,192,171
  550.     .byte 86,172,191,172
  551.     .byte 87,173,190,173
  552.     .byte 88,174,189,174
  553.     .byte 89,175,188,175
  554.     .byte 90,176,187,176
  555.     .byte 91,177,186,177
  556.     .byte 92,178,185,178
  557.     .byte 93,179,184,179
  558.     .byte 94,180,183,180
  559.     .byte 95,181,182,181
  560.     .byte 96,182,132,182,145,182,180,182
  561.     .byte 97,183,127,183,150,183,179,183
  562.     .byte 98,184,124,184,154,184,178,184
  563.     .byte 99,185,121,185,157,185,177,185
  564.     .byte 100,186,118,186,159,186,176,186
  565.     .byte 101,187,116,187,161,187,175,187
  566.     .byte 104,188,112,188,164,188,172,188
  567.    
  568.     ; Terminator (0,0,0,0)
  569.     .byte 0, 0, 0, 0
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement