25'ten fazla konu seçemezsiniz Konular bir harf veya rakamla başlamalı, kısa çizgiler ('-') içerebilir ve en fazla 35 karakter uzunluğunda olabilir.

257 satır
7.0KB

  1. ; ============================================================
  2. ; C64 HI-RES BITMAP DEMO
  3. ; Switches to 320x200 hi-res bitmap mode, draws a diagonal
  4. ; line, then waits for a key before restoring text mode.
  5. ;
  6. ; Assemble to $C000 and run with:
  7. ; LOAD"BITMAP",8,1 : SYS 49152
  8. ;
  9. ; Bitmap: $A000-$BFFF (8000 bytes, under BASIC ROM)
  10. ; Screen color RAM: $0400-$07E7 (1000 bytes)
  11. ; ============================================================
  12. * = $C000
  13. ; --- Zero-page pointers ---
  14. PTR = $FB ; 2-byte pointer
  15. BPTR = $FD ; 2-byte bitmap pointer
  16. ; --- Constants ---
  17. BITMAP = $A000 ; bitmap base
  18. SCREEN = $0400 ; color nybble RAM (foreground hi/background lo)
  19. START:
  20. JSR INIT_BITMAP
  21. JSR DRAW_DIAGONAL
  22. JSR WAIT_KEY
  23. JSR RESTORE_TEXT
  24. RTS
  25. ; ============================================================
  26. ; INIT_BITMAP
  27. ; Sets up VIC-II for hi-res bitmap mode
  28. ; ============================================================
  29. INIT_BITMAP:
  30. ; Turn off interrupts temporarily
  31. SEI
  32. ; Set VIC bank to 0 ($0000-$3FFF is default bank)
  33. ; Bitmap at $A000 requires bank 2 ($8000-$BFFF) — switch!
  34. LDA $DD00
  35. AND #$FC ; clear bits 0-1
  36. ORA #$01 ; bank 2: VIC sees $8000-$BFFF
  37. STA $DD00
  38. ; VIC memory setup: $D018
  39. ; Bitmap at $A000 = offset $2000 from bank base $8000
  40. ; $2000 >> 13 = bit 3 set → bitmap pointer bit = 1
  41. ; Screen RAM at $8400 (color nybbles) — offset $0400 >> 10 = $0 → bits 7-4 = 0001
  42. LDA #%00011000 ; screen at $8400 (bits 7-4 = 0001), bitmap at $A000 (bit 3)
  43. STA $D018
  44. ; Enable bitmap mode: $D011 bit 5 = 1
  45. LDA $D011
  46. ORA #%00100000
  47. STA $D011
  48. ; Multicolor off (hi-res): $D016 bit 4 = 0
  49. LDA $D016
  50. AND #%11101111
  51. STA $D016
  52. ; Set border color to black
  53. LDA #0
  54. STA $D020
  55. ; Set background color to black
  56. STA $D021
  57. ; Clear bitmap (8000 bytes of zeros = black pixels)
  58. LDA #<BITMAP
  59. STA PTR
  60. LDA #>BITMAP
  61. STA PTR+1
  62. LDA #0
  63. LDY #0
  64. LDX #$1F ; 32 pages = 8192 bytes (covers 8000)
  65. CLRLOOP:
  66. STA (PTR),Y
  67. INY
  68. BNE CLRLOOP
  69. INC PTR+1
  70. DEX
  71. BNE CLRLOOP
  72. ; Set all color RAM nybbles: foreground=white(1), background=black(0)
  73. ; Each byte = $10 = white fg, black bg
  74. LDA #<SCREEN
  75. STA PTR
  76. LDA #>SCREEN
  77. STA PTR+1
  78. LDA #$10
  79. LDY #0
  80. COLLOOP:
  81. STA (PTR),Y
  82. INY
  83. CPY #232 ; 1000 - 8 = 232? No: LDY loops 0-255 then second pass
  84. BNE COLLOOP
  85. ; Handle full 1000 bytes (4 pages)
  86. ; Simple approach: just fill $0400-$07E7
  87. LDX #3
  88. LDY #0
  89. COLLOOP2:
  90. STA (PTR),Y
  91. INY
  92. BNE COLLOOP2
  93. INC PTR+1
  94. DEX
  95. BNE COLLOOP2
  96. CLI
  97. RTS
  98. ; ============================================================
  99. ; DRAW_DIAGONAL
  100. ; Draws a white diagonal line from (0,0) to (199,199)
  101. ; In hi-res bitmap, pixel (x,y) is in:
  102. ; byte = bitmap + (y AND $F8)*40 + (x AND $F8) + (y AND 7)
  103. ; bit = 7 - (x AND 7)
  104. ; ============================================================
  105. DRAW_DIAGONAL:
  106. LDX #0 ; X pixel (0-199)
  107. DLOOP:
  108. TXA ; Y = X (diagonal)
  109. JSR SETPIXEL
  110. INX
  111. CPX #200
  112. BNE DLOOP
  113. RTS
  114. ; ============================================================
  115. ; SETPIXEL — set pixel (.X=x, .A=y)
  116. ; ============================================================
  117. SETPIXEL:
  118. ; Calculate byte address
  119. ; addr = $A000 + (Y>>3)*320 + (X>>3)*8 + (Y AND 7)
  120. ; Uses simple approach via table lookup or shift math
  121. STX XCOORD
  122. STA YCOORD
  123. ; Step 1: row base = (Y>>3) * 320
  124. ; Y>>3 * 320 = Y>>3 * 256 + Y>>3 * 64
  125. LSR ; Y>>1
  126. LSR ; Y>>2
  127. LSR ; Y>>3 (char row 0-24)
  128. TAX ; X = row number
  129. LDA ROWLO,X ; low byte of row base
  130. STA BPTR
  131. LDA ROWHI,X
  132. STA BPTR+1
  133. ; Step 2: add (X>>3)*8 = column offset
  134. LDA XCOORD
  135. LSR ; X>>1
  136. LSR ; X>>2
  137. LSR ; X>>3 (char col 0-39)
  138. ASL ; *2
  139. ASL ; *4
  140. ASL ; *8
  141. CLC
  142. ADC BPTR
  143. STA BPTR
  144. BCC NOINC1
  145. INC BPTR+1
  146. NOINC1:
  147. ; Step 3: add (Y AND 7) for sub-row
  148. LDA YCOORD
  149. AND #$07
  150. CLC
  151. ADC BPTR
  152. STA BPTR
  153. BCC NOINC2
  154. INC BPTR+1
  155. NOINC2:
  156. ; Step 4: add bitmap base $A000
  157. LDA BPTR+1
  158. CLC
  159. ADC #>BITMAP
  160. STA BPTR+1
  161. ; (low byte already correct)
  162. ; Step 5: set bit (7 - (X AND 7))
  163. LDA XCOORD
  164. AND #$07
  165. TAX
  166. LDA BITMASK,X
  167. LDY #0
  168. ORA (BPTR),Y
  169. STA (BPTR),Y
  170. RTS
  171. XCOORD: .BYTE 0
  172. YCOORD: .BYTE 0
  173. ; Bit masks for bit positions 7..0
  174. BITMASK:
  175. .BYTE %10000000 ; bit 7 (x mod 8 = 0)
  176. .BYTE %01000000
  177. .BYTE %00100000
  178. .BYTE %00010000
  179. .BYTE %00001000
  180. .BYTE %00000100
  181. .BYTE %00000010
  182. .BYTE %00000001 ; bit 0 (x mod 8 = 7)
  183. ; Row base address table (40*8 = 320 bytes per char row)
  184. ; Row N base = N * 320; precomputed for rows 0-24
  185. ROWLO:
  186. .BYTE <(0*320),<(1*320),<(2*320),<(3*320),<(4*320)
  187. .BYTE <(5*320),<(6*320),<(7*320),<(8*320),<(9*320)
  188. .BYTE <(10*320),<(11*320),<(12*320),<(13*320),<(14*320)
  189. .BYTE <(15*320),<(16*320),<(17*320),<(18*320),<(19*320)
  190. .BYTE <(20*320),<(21*320),<(22*320),<(23*320),<(24*320)
  191. ROWHI:
  192. .BYTE >(0*320),>(1*320),>(2*320),>(3*320),>(4*320)
  193. .BYTE >(5*320),>(6*320),>(7*320),>(8*320),>(9*320)
  194. .BYTE >(10*320),>(11*320),>(12*320),>(13*320),>(14*320)
  195. .BYTE >(15*320),>(16*320),>(17*320),>(18*320),>(19*320)
  196. .BYTE >(20*320),>(21*320),>(22*320),>(23*320),>(24*320)
  197. ; ============================================================
  198. ; WAIT_KEY — spin until any key pressed
  199. ; ============================================================
  200. WAIT_KEY:
  201. JSR $FFE4 ; GETIN
  202. BEQ WAIT_KEY
  203. RTS
  204. ; ============================================================
  205. ; RESTORE_TEXT — return to standard text mode
  206. ; ============================================================
  207. RESTORE_TEXT:
  208. ; Restore VIC bank 0
  209. LDA $DD00
  210. ORA #$03
  211. STA $DD00
  212. ; Restore VIC memory map ($D018)
  213. LDA #$15 ; screen at $0400, charset at $1000
  214. STA $D018
  215. ; Turn off bitmap mode
  216. LDA $D011
  217. AND #%11011111
  218. STA $D011
  219. ; Restore background/border
  220. LDA #14 ; light blue border (default)
  221. STA $D020
  222. LDA #6 ; blue background (default)
  223. STA $D021
  224. ; Clear screen
  225. LDA #147 ; PETSCII clear
  226. JSR $FFD2
  227. RTS

Powered by TurnKey Linux.