felixnardella

Char Escape in Basic v2 for Commodore 64

Aug 26th, 2025 (edited)
317
0
Never
1
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.44 KB | Source Code | 0 0
  1. 5 rem 'char escape' by f. nardella (kimono)
  2. 10 rem individua il primo carattere non-spazio sullo schermo,
  3. 15 rem lo trasforma in sprite, cancella il carattere,
  4. 20 rem posiziona lo sprite e lo fa muovere.
  5. 25 rem inizializzazione variabili
  6. 30 rw=0:cl=0:of=0:cc=0:sd=704:tc=0:ms=0:tp=0
  7. 35 gosub 100:rem cerca carattere non-spazio
  8. 40 rem determina direzione movimento
  9. 45 if cl<20 then dr=-1:goto55
  10. 50 dr=1
  11. 55 gosub 150:rem copia carattere in sprite
  12. 60 gosub 255:rem configura sprite
  13. 65 gosub 230:rem cancella carattere dallo schermo
  14. 70 gosub 330:rem muove sprite
  15. 75 goto35
  16. 80 rem programma terminato
  17. 85 print"end program"
  18. 90 end
  19. 95 rem sub: cerca carattere non-spazio
  20. 100 of=rw*40+cl
  21. 105 cc=peek(1024+of)
  22. 110 if cc<>32 then return:rem carattere trovato
  23. 115 cl=cl+1
  24. 120 if cl<40 goto100
  25. 125 cl=0:rw=rw+1
  26. 130 if rw<25 goto100
  27. 135 if rw=25goto85
  28. 140 return
  29. 145 rem sub: copia carattere in sprite
  30. 150 ms=peek(1):mi=peek(56334):rem salva configurazione memoria
  31. 155 poke 56334,peek(56334)and254:rem disabilita interrupt
  32. 160 poke 1,peek(1)and251:rem abilita charset rom
  33. 165 rem azzera area sprite
  34. 170 for i=0 to 63:poke sd+i,0:next
  35. 175 rem calcola offset nel charset
  36. 180 co=cc*8
  37. 185 rem copia 8 righe del carattere
  38. 190 fori=0to7
  39. 195 tc=peek(53248+co+i):rem legge da charset rom
  40. 200 poke sd+i*3,tc:rem scrive solo prima colonna sprite
  41. 205 next
  42. 210 rem ripristina configurazione memoria
  43. 215 poke 1,ms:poke 56334,mi
  44. 220 return
  45. 225 rem sub: cancella carattere dallo schermo
  46. 230 of=rw*40+cl
  47. 235 poke 1024+of,32
  48. 240 return
  49. 245 rem sub: configura sprite
  50. 250 rem imposta puntatore sprite 0
  51. 255 poke 2040,11
  52. 260 rem abilita sprite 0
  53. 265 poke 53269,1
  54. 270 rem colore sprite 0 (bianco)
  55. 275 poke 53287,1
  56. 280 rem posizione iniziale x: 24 + col * 8
  57. 285 sx=24+cl*8
  58. 290 if sx>255 then poke53264,peek(53264)or1:sx=sx-256:goto300
  59. 295 poke 53264,peek(53264)and254
  60. 300 poke 53248,sx
  61. 305 rem posizione iniziale y: 50 + row * 8
  62. 310 sy=rw*8+50
  63. 315 poke 53249,sy
  64. 320 return
  65. 325 rem sub: muove sprite verso destra
  66. 330 sx=peek(53248)
  67. 335 ms=peek(53264)and1:rem msb corrente
  68. 340 sx=sx+8*dr:rem incrementa x
  69. 345 if sx>255 then sx=0:ms=1-ms:poke53264,(peek(53264)and254)orms
  70. 350 poke 53248,sx
  71. 355 rem controlla se sprite ha raggiunto i bordi
  72. 360 if dr=-1 and ms=0 and sx<24 then gosub380:return
  73. 365 if dr=1 and ms=1 and sx>80 then gosub380:return
  74. 370 goto340
  75. 375 rem sub: passa al prossimo carattere
  76. 380 cl=cl+1
  77. 385 if cl<40 then return
  78. 390 cl=0:rw=rw+1
  79. 395 return
Advertisement
Comments
  • AlbertHallX
    29 days
    # text 2.92 KB | 0 0
    1. Try thia one:
    2.  
    3. 5 rem 'char escape' by f. nardella (kimono)
    4. 10 rem individua il primo carattere non-spazio sullo schermo,
    5. 15 rem lo trasforma in sprite, cancella il carattere,
    6. 20 rem posiziona lo sprite e lo fa muovere.
    7. 21 rem inizializzazione variabili
    8. 22 ? chr$(147)
    9. 23 ? " **** commodore 64 basic v2 ****"
    10. 24 ? ""
    11. 27 ? " 64k ram system 38911 basic bytes free"
    12. 28 ? ""
    13. 29 ? "ready."
    14.  
    15.  
    16. 30 rw=0:cl=0:of=0:cc=0:sd=704:tc=0:ms=0:tp=0
    17. 32 x=rnd(-ti):rem inizializza random con timer
    18. 35 gosub 100:rem cerca carattere non-spazio
    19. 40 rem determina direzione movimento
    20. 45 if cl<20 then dr=-1:goto55
    21. 50 dr=1
    22. 55 gosub 150:rem copia carattere in sprite
    23. 60 gosub 255:rem configura sprite
    24. 65 gosub 230:rem cancella carattere dallo schermo
    25. 70 gosub 330:rem muove sprite
    26. 75 goto35
    27. 80 rem programma terminato
    28. 85 print"end program"
    29. 90 end
    30. 95 rem sub: cerca carattere non-spazio
    31.  
    32. 95 rem sub: scegli carattere casuale non-spazio
    33. 100 for tr=1 to 500
    34. 105 rw=int(rnd(0)*25): cl=int(rnd(0)*40)
    35. 110 of=rw*40+cl
    36. 115 cc=peek(1024+of)
    37. 120 if cc<>32 then return
    38. 125 next tr
    39. 130 rem se non trova niente, fine
    40. 135 goto 85
    41. 140 return
    42.  
    43.  
    44.  
    45. 145 rem sub: copia carattere in sprite
    46. 150 ms=peek(1):mi=peek(56334):rem salva configurazione memoria
    47. 155 poke 56334,peek(56334)and254:rem disabilita interrupt
    48. 160 poke 1,peek(1)and251:rem abilita charset rom
    49. 165 rem azzera area sprite
    50. 170 for i=0 to 63:poke sd+i,0:next
    51. 175 rem calcola offset nel charset
    52. 180 co=cc*8
    53. 185 rem copia 8 righe del carattere
    54. 190 fori=0to7
    55. 195 tc=peek(53248+co+i):rem legge da charset rom
    56. 200 poke sd+i*3,tc:rem scrive solo prima colonna sprite
    57. 205 next
    58. 210 rem ripristina configurazione memoria
    59. 215 poke 1,ms:poke 56334,mi
    60. 220 return
    61. 225 rem sub: cancella carattere dallo schermo
    62. 230 of=rw*40+cl
    63. 235 poke 1024+of,32
    64. 240 return
    65. 245 rem sub: configura sprite
    66. 250 rem imposta puntatore sprite 0
    67. 255 poke 2040,11
    68. 260 rem abilita sprite 0
    69. 265 poke 53269,1
    70. 270 rem colore sprite 0 (bianco)
    71. 275 poke 53287,1
    72. 280 rem posizione iniziale x: 24 + col * 8
    73. 285 sx=24+cl*8
    74. 290 if sx>255 then poke53264,peek(53264)or1:sx=sx-256:goto300
    75. 295 poke 53264,peek(53264)and254
    76. 300 poke 53248,sx
    77. 305 rem posizione iniziale y: 50 + row * 8
    78. 310 sy=rw*8+50
    79. 315 poke 53249,sy
    80. 320 return
    81.  
    82. 325 rem sub: muove sprite con onda sinusoidale (dx/sx + su/giu)
    83. 330 rem calcola X a 10 bit e inizializza fase
    84. 332 x10=(peek(53264)and1)*256+peek(53248)
    85. 334 ax=0: ay=peek(53249)
    86.  
    87. 338 ax=ax+0.25
    88. 340 x10=x10+4*dr
    89. 342 sy=ay+16*sin(ax)
    90. 344 ms=int(x10/256)
    91. 346 poke 53264,(peek(53264)and254) or ms
    92. 348 poke 53248,x10-ms*256
    93. 350 if sy<50 then sy=50
    94. 352 if sy>245 then sy=245
    95. 354 poke 53249,int(sy)
    96. 356 if dr=-1 and x10<32 then gosub 380:return
    97. 358 if dr=1 and x10>480 then gosub 380:return
    98. 360 goto 338
    99.  
    100.  
    101. 365 if dr=1 and ms=1 and sx>80 then gosub380:return
    102. 370 goto340
    103. 375 rem sub: passa al prossimo carattere
    104. 380 cl=cl+1
    105. 385 if cl<40 then return
    106. 390 cl=0:rw=rw+1
    107. 395 return
    108.  
Add Comment
Please, Sign In to add comment