VGAClock = $C ; C is for Clock! NMI pin on CPU connected to VGA V-sync. NMI routine does a DEC $C zp_sd_cmd_address = $A2 zp_sd_cmd_addressH = $A3 Screen = $B1 ScreenH = $B2 DummyZP = $A8 DummyZPH = $A9 VIA_PORTA_Ind = $AA VIA_PORTA_IndH = $AB AudioBuffer = $1F00 ; 256 byte rolling buffer for audio samples VIA = $6000 VIA_PORTB = VIA ;$6000 ; Control and manual read port of SD card VIA_PORTA = VIA+1 ;$6001 ; SD byte reads here with pulse gen-shift register VIA_DDRB = VIA+2 ;$6002 VIA_DDRA = VIA+3 ;$6003 VIA_T1CL = VIA+4 ;$6004 VIA_T1CH = VIA+5 ;$6005 VIA_T1LL = VIA+6 ;$6006 VIA_T1LH = VIA+7 ;$6007 VIA_T2CL = VIA+8 ;$6008 VIA_T2CH = VIA+9 ;$6009 VIA_SHIFT = VIA+10;$600A ; CB2 on VIA is connected to speaker with a resistor and capacitor to reduce current and another capacitor to act as lowpass audio filter. VIA_AUX = VIA+11;$600B VIA_PCR = VIA+12;$600C VIA_IFR = VIA+13;$600D VIA_IER = VIA+14;$600E VIA_IORA = VIA+15;$600F ;FrameRate = 20 ;VGARate = 60 ; Actually it is more like 60.31Hz. Adjust video conversion for this. FPSClock = 3 ; VGARate/FrameRate TossBits = $813C TossBitsCardReadyLoop = $815E Line500_Odd = $8166 Line499 = $816C Line498 = $8172 Line497 = $8178 Line496 = $817E Line495 = $8184 Line494 = $818A Line493 = $8190 Line492 = $8196 Line491 = $819C Line490 = $81A2 Line489 = $81A8 Line488 = $81AE Line487 = $81B4 Line486 = $81BA Line485 = $81C0 Line484 = $81C6 Line483 = $81CC Line482 = $81D2 Line481 = $81D8 Line480 = $81DE Line479 = $81E4 Line478 = $81EA Line477 = $81F0 Line476 = $81F6 Line475 = $81FC Line474 = $8202 Line473 = $8208 Line472 = $820E Line471 = $8214 Line470 = $821A Line469 = $8220 Line468 = $8226 Line467 = $822C Line466 = $8232 Line465 = $8238 Line464 = $823E Line463 = $8244 Line462 = $824A Line461 = $8250 Line460 = $8256 Line459 = $825C Line458 = $8262 Line457 = $8268 Line456 = $826E Line455 = $8274 Line454 = $827A Line453 = $8280 Line452 = $8286 Line451 = $828C Line450 = $8292 Line449 = $8298 Line448 = $829E Line447 = $82A4 Line446 = $82AA Line445 = $82B0 Line444 = $82B6 Line443 = $82BC Line442 = $82C2 Line441 = $82C8 Line440 = $82CE Line439 = $82D4 Line438 = $82DA Line437 = $82E0 Line436 = $82E6 Line435 = $82EC Line434 = $82F2 Line433 = $82F8 Line432 = $82FE Line431 = $8304 Line430 = $830A Line429 = $8310 Line428 = $8316 Line427 = $831C Line426 = $8322 Line425 = $8328 Line424 = $832E Line423 = $8334 Line422 = $833A Line421 = $8340 Line420 = $8346 Line419 = $834C Line418 = $8352 Line417 = $8358 Line416 = $835E Line415 = $8364 Line414 = $836A Line413 = $8370 Line412 = $8376 Line411 = $837C Line410 = $8382 Line409 = $8388 Line408 = $838E Line407 = $8394 Line406 = $839A Line405 = $83A0 Line404 = $83A6 Line403 = $83AC Line402 = $83B2 Line401 = $83B8 Line400_Even = $83C0 Line399 = $83C6 Line398 = $83CC Line397 = $83D2 Line396 = $83D8 Line395 = $83DE Line394 = $83E4 Line393 = $83EA Line392 = $83F0 Line391 = $83F6 Line390 = $83FC Line389 = $8402 Line388 = $8408 Line387 = $840E Line386 = $8414 Line385 = $841A Line384 = $8420 Line383 = $8426 Line382 = $842C Line381 = $8432 Line380 = $8438 Line379 = $843E Line378 = $8444 Line377 = $844A Line376 = $8450 Line375 = $8456 Line374 = $845C Line373 = $8462 Line372 = $8468 Line371 = $846E Line370 = $8474 Line369 = $847A Line368 = $8480 Line367 = $8486 Line366 = $848C Line365 = $8492 Line364 = $8498 Line363 = $849E Line362 = $84A4 Line361 = $84AA Line360 = $84B0 Line359 = $84B6 Line358 = $84BC Line357 = $84C2 Line356 = $84C8 Line355 = $84CE Line354 = $84D4 Line353 = $84DA Line352 = $84E0 Line351 = $84E6 Line350 = $84EC Line349 = $84F2 Line348 = $84F8 Line347 = $84FE Line346 = $8504 Line345 = $850A Line344 = $8510 Line343 = $8516 Line342 = $851C Line341 = $8522 Line340 = $8528 Line339 = $852E Line338 = $8534 Line337 = $853A Line336 = $8540 Line335 = $8546 Line334 = $854C Line333 = $8552 Line332 = $8558 Line331 = $855E Line330 = $8564 Line329 = $856A Line328 = $8570 Line327 = $8576 Line326 = $857C Line325 = $8582 Line324 = $8588 Line323 = $858E Line322 = $8594 Line321 = $859A Line320 = $85A0 Line319 = $85A6 Line318 = $85AC Line317 = $85B2 Line316 = $85B8 Line315 = $85BE Line314 = $85C4 Line313 = $85CA Line312 = $85D0 Line311 = $85D6 Line310 = $85DC Line309 = $85E2 Line308 = $85E8 Line307 = $85EE Line306 = $85F4 Line305 = $85FA Line304 = $8600 Line303 = $8606 Line302 = $860C Line301 = $8612 Line300_Odd = $861C Line299 = $8622 Line298 = $8628 Line297 = $862E Line296 = $8634 Line295 = $863A Line294 = $8640 Line293 = $8646 Line292 = $864C Line291 = $8652 Line290 = $8658 Line289 = $865E Line288 = $8664 Line287 = $866A Line286 = $8670 Line285 = $8676 Line284 = $867C Line283 = $8682 Line282 = $8688 Line281 = $868E Line280 = $8694 Line279 = $869A Line278 = $86A0 Line277 = $86A6 Line276 = $86AC Line275 = $86B2 Line274 = $86B8 Line273 = $86BE Line272 = $86C4 Line271 = $86CA Line270 = $86D0 Line269 = $86D6 Line268 = $86DC Line267 = $86E2 Line266 = $86E8 Line265 = $86EE Line264 = $86F4 Line263 = $86FA Line262 = $8700 Line261 = $8706 Line260 = $870C Line259 = $8712 Line258 = $8718 Line257 = $871E Line256 = $8724 Line255 = $872A Line254 = $8730 Line253 = $8736 Line252 = $873C Line251 = $8742 Line250 = $8748 Line249 = $874E Line248 = $8754 Line247 = $875A Line246 = $8760 Line245 = $8766 Line244 = $876C Line243 = $8772 Line242 = $8778 Line241 = $877E Line240 = $8784 Line239 = $878A Line238 = $8790 Line237 = $8796 Line236 = $879C Line235 = $87A2 Line234 = $87A8 Line233 = $87AE Line232 = $87B4 Line231 = $87BA Line230 = $87C0 Line229 = $87C6 Line228 = $87CC Line227 = $87D2 Line226 = $87D8 Line225 = $87DE Line224 = $87E4 Line223 = $87EA Line222 = $87F0 Line221 = $87F6 Line220 = $87FC Line219 = $8802 Line218 = $8808 Line217 = $880E Line216 = $8814 Line215 = $881A Line214 = $8820 Line213 = $8826 Line212 = $882C Line211 = $8832 Line210 = $8838 Line209 = $883E Line208 = $8844 Line207 = $884A Line206 = $8850 Line205 = $8856 Line204 = $885C Line203 = $8862 Line202 = $8868 Line201 = $886E Line200_Even = $8876 Line199 = $887C Line198 = $8882 Line197 = $8888 Line196 = $888E Line195 = $8894 Line194 = $889A Line193 = $88A0 Line192 = $88A6 Line191 = $88AC Line190 = $88B2 Line189 = $88B8 Line188 = $88BE Line187 = $88C4 Line186 = $88CA Line185 = $88D0 Line184 = $88D6 Line183 = $88DC Line182 = $88E2 Line181 = $88E8 Line180 = $88EE Line179 = $88F4 Line178 = $88FA Line177 = $8900 Line176 = $8906 Line175 = $890C Line174 = $8912 Line173 = $8918 Line172 = $891E Line171 = $8924 Line170 = $892A Line169 = $8930 Line168 = $8936 Line167 = $893C Line166 = $8942 Line165 = $8948 Line164 = $894E Line163 = $8954 Line162 = $895A Line161 = $8960 Line160 = $8966 Line159 = $896C Line158 = $8972 Line157 = $8978 Line156 = $897E Line155 = $8984 Line154 = $898A Line153 = $8990 Line152 = $8996 Line151 = $899C Line150 = $89A2 Line149 = $89A8 Line148 = $89AE Line147 = $89B4 Line146 = $89BA Line145 = $89C0 Line144 = $89C6 Line143 = $89CC Line142 = $89D2 Line141 = $89D8 Line140 = $89DE Line139 = $89E4 Line138 = $89EA Line137 = $89F0 Line136 = $89F6 Line135 = $89FC Line134 = $8A02 Line133 = $8A08 Line132 = $8A0E Line131 = $8A14 Line130 = $8A1A Line129 = $8A20 Line128 = $8A26 Line127 = $8A2C Line126 = $8A32 Line125 = $8A38 Line124 = $8A3E Line123 = $8A44 Line122 = $8A4A Line121 = $8A50 Line120 = $8A56 Line119 = $8A5C Line118 = $8A62 Line117 = $8A68 Line116 = $8A6E Line115 = $8A74 Line114 = $8A7A Line113 = $8A80 Line112 = $8A86 Line111 = $8A8C Line110 = $8A92 Line109 = $8A98 Line108 = $8A9E Line107 = $8AA4 Line106 = $8AAA Line105 = $8AB0 Line104 = $8AB6 Line103 = $8ABC Line102 = $8AC2 Line101 = $8AC8 Line100_Odd = $8AD2 LineFill_Odd = $8AD2 Line99_Odd = $8AD8 Line98_Odd = $8ADE Line97_Odd = $8AE4 Line96_Odd = $8AEA Line95_Odd = $8AF0 Line94_Odd = $8AF6 Line93_Odd = $8AFC Line92_Odd = $8B02 Line91_Odd = $8B08 Line90_Odd = $8B0E Line89_Odd = $8B14 Line88_Odd = $8B1A Line87_Odd = $8B20 Line86_Odd = $8B26 Line85_Odd = $8B2C Line84_Odd = $8B32 Line83_Odd = $8B38 Line82_Odd = $8B3E Line81_Odd = $8B44 Line80_Odd = $8B4A Line79_Odd = $8B50 Line78_Odd = $8B56 Line77_Odd = $8B5C Line76_Odd = $8B62 Line75_Odd = $8B68 Line74_Odd = $8B6E Line73_Odd = $8B74 Line72_Odd = $8B7A Line71_Odd = $8B80 Line70_Odd = $8B86 Line69_Odd = $8B8C Line68_Odd = $8B92 Line67_Odd = $8B98 Line66_Odd = $8B9E Line65_Odd = $8BA4 Line64_Odd = $8BAA Line63_Odd = $8BB0 Line62_Odd = $8BB6 Line61_Odd = $8BBC Line60_Odd = $8BC2 Line59_Odd = $8BC8 Line58_Odd = $8BCE Line57_Odd = $8BD4 Line56_Odd = $8BDA Line55_Odd = $8BE0 Line54_Odd = $8BE6 Line53_Odd = $8BEC Line52_Odd = $8BF2 Line51_Odd = $8BF8 Line50_Odd = $8BFE Line49_Odd = $8C04 Line48_Odd = $8C0A Line47_Odd = $8C10 Line46_Odd = $8C16 Line45_Odd = $8C1C Line44_Odd = $8C22 Line43_Odd = $8C28 Line42_Odd = $8C2E Line41_Odd = $8C34 Line40_Odd = $8C3A Line39_Odd = $8C40 Line38_Odd = $8C46 Line37_Odd = $8C4C Line36_Odd = $8C52 Line35_Odd = $8C58 Line34_Odd = $8C5E Line33_Odd = $8C64 Line32_Odd = $8C6A Line31_Odd = $8C70 Line30_Odd = $8C76 Line29_Odd = $8C7C Line28_Odd = $8C82 Line27_Odd = $8C88 Line26_Odd = $8C8E Line25_Odd = $8C94 Line24_Odd = $8C9A Line23_Odd = $8CA0 Line22_Odd = $8CA6 Line21_Odd = $8CAC Line20_Odd = $8CB2 Line19_Odd = $8CB8 Line18_Odd = $8CBE Line17_Odd = $8CC4 Line16_Odd = $8CCA Line15_Odd = $8CD0 Line14_Odd = $8CD6 Line13_Odd = $8CDC Line12_Odd = $8CE2 Line11_Odd = $8CE8 Line10_Odd = $8CEE Line9_Odd = $8CF4 Line8_Odd = $8CFA Line7_Odd = $8D00 Line6_Odd = $8D06 Line5_Odd = $8D0C Line4_Odd = $8D12 Line3_Odd = $8D18 Line2_Odd = $8D1E Line1_Odd = $8D24 Line0_Odd = $8D29 LineNone = $8D2B Line500_Even = $8D2C Line2_499 = $8D32 Line2_498 = $8D38 Line2_497 = $8D3E Line2_496 = $8D44 Line2_495 = $8D4A Line2_494 = $8D50 Line2_493 = $8D56 Line2_492 = $8D5C Line2_491 = $8D62 Line2_490 = $8D68 Line2_489 = $8D6E Line2_488 = $8D74 Line2_487 = $8D7A Line2_486 = $8D80 Line2_485 = $8D86 Line2_484 = $8D8C Line2_483 = $8D92 Line2_482 = $8D98 Line2_481 = $8D9E Line2_480 = $8DA4 Line2_479 = $8DAA Line2_478 = $8DB0 Line2_477 = $8DB6 Line2_476 = $8DBC Line2_475 = $8DC2 Line2_474 = $8DC8 Line2_473 = $8DCE Line2_472 = $8DD4 Line2_471 = $8DDA Line2_470 = $8DE0 Line2_469 = $8DE6 Line2_468 = $8DEC Line2_467 = $8DF2 Line2_466 = $8DF8 Line2_465 = $8DFE Line2_464 = $8E04 Line2_463 = $8E0A Line2_462 = $8E10 Line2_461 = $8E16 Line2_460 = $8E1C Line2_459 = $8E22 Line2_458 = $8E28 Line2_457 = $8E2E Line2_456 = $8E34 Line2_455 = $8E3A Line2_454 = $8E40 Line2_453 = $8E46 Line2_452 = $8E4C Line2_451 = $8E52 Line2_450 = $8E58 Line2_449 = $8E5E Line2_448 = $8E64 Line2_447 = $8E6A Line2_446 = $8E70 Line2_445 = $8E76 Line2_444 = $8E7C Line2_443 = $8E82 Line2_442 = $8E88 Line2_441 = $8E8E Line2_440 = $8E94 Line2_439 = $8E9A Line2_438 = $8EA0 Line2_437 = $8EA6 Line2_436 = $8EAC Line2_435 = $8EB2 Line2_434 = $8EB8 Line2_433 = $8EBE Line2_432 = $8EC4 Line2_431 = $8ECA Line2_430 = $8ED0 Line2_429 = $8ED6 Line2_428 = $8EDC Line2_427 = $8EE2 Line2_426 = $8EE8 Line2_425 = $8EEE Line2_424 = $8EF4 Line2_423 = $8EFA Line2_422 = $8F00 Line2_421 = $8F06 Line2_420 = $8F0C Line2_419 = $8F12 Line2_418 = $8F18 Line2_417 = $8F1E Line2_416 = $8F24 Line2_415 = $8F2A Line2_414 = $8F30 Line2_413 = $8F36 Line2_412 = $8F3C Line2_411 = $8F42 Line2_410 = $8F48 Line2_409 = $8F4E Line2_408 = $8F54 Line2_407 = $8F5A Line2_406 = $8F60 Line2_405 = $8F66 Line2_404 = $8F6C Line2_403 = $8F72 Line2_402 = $8F78 Line2_401 = $8F7E Line400_Odd = $8F88 Line2_399 = $8F8E Line2_398 = $8F94 Line2_397 = $8F9A Line2_396 = $8FA0 Line2_395 = $8FA6 Line2_394 = $8FAC Line2_393 = $8FB2 Line2_392 = $8FB8 Line2_391 = $8FBE Line2_390 = $8FC4 Line2_389 = $8FCA Line2_388 = $8FD0 Line2_387 = $8FD6 Line2_386 = $8FDC Line2_385 = $8FE2 Line2_384 = $8FE8 Line2_383 = $8FEE Line2_382 = $8FF4 Line2_381 = $8FFA Line2_380 = $9000 Line2_379 = $9006 Line2_378 = $900C Line2_377 = $9012 Line2_376 = $9018 Line2_375 = $901E Line2_374 = $9024 Line2_373 = $902A Line2_372 = $9030 Line2_371 = $9036 Line2_370 = $903C Line2_369 = $9042 Line2_368 = $9048 Line2_367 = $904E Line2_366 = $9054 Line2_365 = $905A Line2_364 = $9060 Line2_363 = $9066 Line2_362 = $906C Line2_361 = $9072 Line2_360 = $9078 Line2_359 = $907E Line2_358 = $9084 Line2_357 = $908A Line2_356 = $9090 Line2_355 = $9096 Line2_354 = $909C Line2_353 = $90A2 Line2_352 = $90A8 Line2_351 = $90AE Line2_350 = $90B4 Line2_349 = $90BA Line2_348 = $90C0 Line2_347 = $90C6 Line2_346 = $90CC Line2_345 = $90D2 Line2_344 = $90D8 Line2_343 = $90DE Line2_342 = $90E4 Line2_341 = $90EA Line2_340 = $90F0 Line2_339 = $90F6 Line2_338 = $90FC Line2_337 = $9102 Line2_336 = $9108 Line2_335 = $910E Line2_334 = $9114 Line2_333 = $911A Line2_332 = $9120 Line2_331 = $9126 Line2_330 = $912C Line2_329 = $9132 Line2_328 = $9138 Line2_327 = $913E Line2_326 = $9144 Line2_325 = $914A Line2_324 = $9150 Line2_323 = $9156 Line2_322 = $915C Line2_321 = $9162 Line2_320 = $9168 Line2_319 = $916E Line2_318 = $9174 Line2_317 = $917A Line2_316 = $9180 Line2_315 = $9186 Line2_314 = $918C Line2_313 = $9192 Line2_312 = $9198 Line2_311 = $919E Line2_310 = $91A4 Line2_309 = $91AA Line2_308 = $91B0 Line2_307 = $91B6 Line2_306 = $91BC Line2_305 = $91C2 Line2_304 = $91C8 Line2_303 = $91CE Line2_302 = $91D4 Line2_301 = $91DA Line300_Even = $91E2 Line2_299 = $91E8 Line2_298 = $91EE Line2_297 = $91F4 Line2_296 = $91FA Line2_295 = $9200 Line2_294 = $9206 Line2_293 = $920C Line2_292 = $9212 Line2_291 = $9218 Line2_290 = $921E Line2_289 = $9224 Line2_288 = $922A Line2_287 = $9230 Line2_286 = $9236 Line2_285 = $923C Line2_284 = $9242 Line2_283 = $9248 Line2_282 = $924E Line2_281 = $9254 Line2_280 = $925A Line2_279 = $9260 Line2_278 = $9266 Line2_277 = $926C Line2_276 = $9272 Line2_275 = $9278 Line2_274 = $927E Line2_273 = $9284 Line2_272 = $928A Line2_271 = $9290 Line2_270 = $9296 Line2_269 = $929C Line2_268 = $92A2 Line2_267 = $92A8 Line2_266 = $92AE Line2_265 = $92B4 Line2_264 = $92BA Line2_263 = $92C0 Line2_262 = $92C6 Line2_261 = $92CC Line2_260 = $92D2 Line2_259 = $92D8 Line2_258 = $92DE Line2_257 = $92E4 Line2_256 = $92EA Line2_255 = $92F0 Line2_254 = $92F6 Line2_253 = $92FC Line2_252 = $9302 Line2_251 = $9308 Line2_250 = $930E Line2_249 = $9314 Line2_248 = $931A Line2_247 = $9320 Line2_246 = $9326 Line2_245 = $932C Line2_244 = $9332 Line2_243 = $9338 Line2_242 = $933E Line2_241 = $9344 Line2_240 = $934A Line2_239 = $9350 Line2_238 = $9356 Line2_237 = $935C Line2_236 = $9362 Line2_235 = $9368 Line2_234 = $936E Line2_233 = $9374 Line2_232 = $937A Line2_231 = $9380 Line2_230 = $9386 Line2_229 = $938C Line2_228 = $9392 Line2_227 = $9398 Line2_226 = $939E Line2_225 = $93A4 Line2_224 = $93AA Line2_223 = $93B0 Line2_222 = $93B6 Line2_221 = $93BC Line2_220 = $93C2 Line2_219 = $93C8 Line2_218 = $93CE Line2_217 = $93D4 Line2_216 = $93DA Line2_215 = $93E0 Line2_214 = $93E6 Line2_213 = $93EC Line2_212 = $93F2 Line2_211 = $93F8 Line2_210 = $93FE Line2_209 = $9404 Line2_208 = $940A Line2_207 = $9410 Line2_206 = $9416 Line2_205 = $941C Line2_204 = $9422 Line2_203 = $9428 Line2_202 = $942E Line2_201 = $9434 Line200_Odd = $943E Line2_199 = $9444 Line2_198 = $944A Line2_197 = $9450 Line2_196 = $9456 Line2_195 = $945C Line2_194 = $9462 Line2_193 = $9468 Line2_192 = $946E Line2_191 = $9474 Line2_190 = $947A Line2_189 = $9480 Line2_188 = $9486 Line2_187 = $948C Line2_186 = $9492 Line2_185 = $9498 Line2_184 = $949E Line2_183 = $94A4 Line2_182 = $94AA Line2_181 = $94B0 Line2_180 = $94B6 Line2_179 = $94BC Line2_178 = $94C2 Line2_177 = $94C8 Line2_176 = $94CE Line2_175 = $94D4 Line2_174 = $94DA Line2_173 = $94E0 Line2_172 = $94E6 Line2_171 = $94EC Line2_170 = $94F2 Line2_169 = $94F8 Line2_168 = $94FE Line2_167 = $9504 Line2_166 = $950A Line2_165 = $9510 Line2_164 = $9516 Line2_163 = $951C Line2_162 = $9522 Line2_161 = $9528 Line2_160 = $952E Line2_159 = $9534 Line2_158 = $953A Line2_157 = $9540 Line2_156 = $9546 Line2_155 = $954C Line2_154 = $9552 Line2_153 = $9558 Line2_152 = $955E Line2_151 = $9564 Line2_150 = $956A Line2_149 = $9570 Line2_148 = $9576 Line2_147 = $957C Line2_146 = $9582 Line2_145 = $9588 Line2_144 = $958E Line2_143 = $9594 Line2_142 = $959A Line2_141 = $95A0 Line2_140 = $95A6 Line2_139 = $95AC Line2_138 = $95B2 Line2_137 = $95B8 Line2_136 = $95BE Line2_135 = $95C4 Line2_134 = $95CA Line2_133 = $95D0 Line2_132 = $95D6 Line2_131 = $95DC Line2_130 = $95E2 Line2_129 = $95E8 Line2_128 = $95EE Line2_127 = $95F4 Line2_126 = $95FA Line2_125 = $9600 Line2_124 = $9606 Line2_123 = $960C Line2_122 = $9612 Line2_121 = $9618 Line2_120 = $961E Line2_119 = $9624 Line2_118 = $962A Line2_117 = $9630 Line2_116 = $9636 Line2_115 = $963C Line2_114 = $9642 Line2_113 = $9648 Line2_112 = $964E Line2_111 = $9654 Line2_110 = $965A Line2_109 = $9660 Line2_108 = $9666 Line2_107 = $966C Line2_106 = $9672 Line2_105 = $9678 Line2_104 = $967E Line2_103 = $9684 Line2_102 = $968A Line2_101 = $9690 LineFill_Even = $9698 Line100_Even = $9698 Line99_Even = $969E Line98_Even = $96A4 Line97_Even = $96AA Line96_Even = $96B0 Line95_Even = $96B6 Line94_Even = $96BC Line93_Even = $96C2 Line92_Even = $96C8 Line91_Even = $96CE Line90_Even = $96D4 Line89_Even = $96DA Line88_Even = $96E0 Line87_Even = $96E6 Line86_Even = $96EC Line85_Even = $96F2 Line84_Even = $96F8 Line83_Even = $96FE Line82_Even = $9704 Line81_Even = $970A Line80_Even = $9710 Line79_Even = $9716 Line78_Even = $971C Line77_Even = $9722 Line76_Even = $9728 Line75_Even = $972E Line74_Even = $9734 Line73_Even = $973A Line72_Even = $9740 Line71_Even = $9746 Line70_Even = $974C Line69_Even = $9752 Line68_Even = $9758 Line67_Even = $975E Line66_Even = $9764 Line65_Even = $976A Line64_Even = $9770 Line63_Even = $9776 Line62_Even = $977C Line61_Even = $9782 Line60_Even = $9788 Line59_Even = $978E Line58_Even = $9794 Line57_Even = $979A Line56_Even = $97A0 Line55_Even = $97A6 Line54_Even = $97AC Line53_Even = $97B2 Line52_Even = $97B8 Line51_Even = $97BE Line50_Even = $97C4 Line49_Even = $97CA Line48_Even = $97D0 Line47_Even = $97D6 Line46_Even = $97DC Line45_Even = $97E2 Line44_Even = $97E8 Line43_Even = $97EE Line42_Even = $97F4 Line41_Even = $97FA Line40_Even = $9800 Line39_Even = $9806 Line38_Even = $980C Line37_Even = $9812 Line36_Even = $9818 Line35_Even = $981E Line34_Even = $9824 Line33_Even = $982A Line32_Even = $9830 Line31_Even = $9836 Line30_Even = $983C Line29_Even = $9842 Line28_Even = $9848 Line27_Even = $984E Line26_Even = $9854 Line25_Even = $985A Line24_Even = $9860 Line23_Even = $9866 Line22_Even = $986C Line21_Even = $9872 Line20_Even = $9878 Line19_Even = $987E Line18_Even = $9884 Line17_Even = $988A Line16_Even = $9890 Line15_Even = $9896 Line14_Even = $989C Line13_Even = $98A2 Line12_Even = $98A8 Line11_Even = $98AE Line10_Even = $98B4 Line9_Even = $98BA Line8_Even = $98C0 Line7_Even = $98C6 Line6_Even = $98CC Line5_Even = $98D2 Line4_Even = $98D8 Line3_Even = $98DE Line2_Even = $98E4 Line1_Even = $98EA Line0_Even = $98EF LineNone_Even = $98F3 Line100 = $98F4 LineFill = $98F4 Line99 = $98FA Line98 = $9900 Line97 = $9906 Line96 = $990C Line95 = $9912 Line94 = $9918 Line93 = $991E Line92 = $9924 Line91 = $992A Line90 = $9930 Line89 = $9936 Line88 = $993C Line87 = $9942 Line86 = $9948 Line85 = $994E Line84 = $9954 Line83 = $995A Line82 = $9960 Line81 = $9966 Line80 = $996C Line79 = $9972 Line78 = $9978 Line77 = $997E Line76 = $9984 Line75 = $998A Line74 = $9990 Line73 = $9996 Line72 = $999C Line71 = $99A2 Line70 = $99A8 Line69 = $99AE Line68 = $99B4 Line67 = $99BA Line66 = $99C0 Line65 = $99C6 Line64 = $99CC Line63 = $99D2 Line62 = $99D8 Line61 = $99DE Line60 = $99E4 Line59 = $99EA Line58 = $99F0 Line57 = $99F6 Line56 = $99FC Line55 = $9A02 Line54 = $9A08 Line53 = $9A0E Line52 = $9A14 Line51 = $9A1A Line50 = $9A20 Line49 = $9A26 Line48 = $9A2C Line47 = $9A32 Line46 = $9A38 Line45 = $9A3E Line44 = $9A44 Line43 = $9A4A Line42 = $9A50 Line41 = $9A56 Line40 = $9A5C Line39 = $9A62 Line38 = $9A68 Line37 = $9A6E Line36 = $9A74 Line35 = $9A7A Line34 = $9A80 Line33 = $9A86 Line32 = $9A8C Line31 = $9A92 Line30 = $9A98 Line29 = $9A9E Line28 = $9AA4 Line27 = $9AAA Line26 = $9AB0 Line25 = $9AB6 Line24 = $9ABC Line23 = $9AC2 Line22 = $9AC8 Line21 = $9ACE Line20 = $9AD4 Line19 = $9ADA Line18 = $9AE0 Line17 = $9AE6 Line16 = $9AEC Line15 = $9AF2 Line14 = $9AF8 Line13 = $9AFE Line12 = $9B04 Line11 = $9B0A Line10 = $9B10 Line9 = $9B16 Line8 = $9B1C Line7 = $9B22 Line6 = $9B28 Line5 = $9B2E Line4 = $9B34 Line3 = $9B3A Line2 = $9B40 Line1 = $9B46 Line0 = $9B4C sd_init = $9B4D .org $200 LDA #$20 ; Screen starts at $2000 STA ScreenH STZ Screen STZ DummyZP ;Make sure Dummy Reads for SD card Toss Bits routine don't hit VIA or ACIA ; Cycle count Indirect pointers for TossBits LDA #>VIA_PORTA STA VIA_PORTA_IndH LDA #cmd0_bytes ; ; sta zp_sd_cmd_address+1 ; ; jsr sd_sendcommand ; ; ; Expect status response $01 (not initialized) ; ; cmp #$01 ; ; bne initfailed ; ; jsr longdelay ; ; cmd8 ; SEND_IF_COND - tell the card how we want it to operate (33V, etc) ; ; lda #cmd8_bytes ; ; sta zp_sd_cmd_address+1 ; ; jsr sd_sendcommand ; ; ; Expect status response $01 (not initialized) ; ; cmp #$01 ; ; bne initfailed ; ; ; Read 32-bit return value, but ignore it ; ; jsr sd_readbyte ; ; jsr sd_readbyte ; ; jsr sd_readbyte ; ; jsr sd_readbyte ; ; jsr longdelay ; ; cmd55 ; APP_CMD - required prefix for ACMD commands ; ; lda #cmd55_bytes ; ; sta zp_sd_cmd_address+1 ; ; jsr sd_sendcommand ; ; ; Expect status response $01 (not initialized) ; ; cmp #$01 ; ; bne initfailed ; ; jsr longdelay ; ; cmd41 ; APP_SEND_OP_COND - send operating conditions, initialize card ; ; lda #cmd41_bytes ; ; sta zp_sd_cmd_address+1 ; ; jsr sd_sendcommand ; ; ; Status response $00 means initialised ; ; cmp #$00 ; ; beq initialized ; ; ; Otherwise expect status response $01 (not initialized) ; ; cmp #$01 ; ; bne initfailed ; ; ; Not initialized yet, so wait a while then try again. ; ; ; This retry is important, to give the card time to initialize. ; ; jsr longdelay ; ; jsr longdelay ; ; jmp cmd55 ; ; jsr longdelay ; ; initialized ; ; ; Setup SD card to read forever ; ; lda #SD_MOSI ;| SD_CLK ; ; sta VIA_PORTB ; ; lda #$52 ; CMD18 - READ_MULTI_BLOCK ; ; ; WOW, that easy! Change $51 to $52 and I can stream ; ; ; bytes off the SD card forrever! Yea! ; ; ;Just have to remember to throw away the 10 byte ; ; ; CRC every 512 bytes Other than that, the bits stream forever Yea! ; ; jsr sd_writebyte ; ; ; Start at the beginning of the SD card. IE RAW mode. ; ; ; Write binary data directly to the card with HxD or another Hex editor that can directly open SD cards ; ; lda #$00 ; sector 24:31 ; ; jsr sd_writebyte ; ; lda #$00 ; sector 16:23 ; ; jsr sd_writebyte ; ; lda #$00 ; sector 8:15 ; ; jsr sd_writebyte ; ; lda #$00 ; sector 0:7 ; ; jsr sd_writebyte ; ; lda #77;RLECount ; crc (not checked, random data sent) ; ; jsr sd_writebyte ; ; jsr sd_waitresult ; ; cmp #$00 ; ; beq readsuccess ; ; rts ;jmp BadAppleStart;reset ;This change makes it pretty reliable after a reboot ; ; readsuccess ; ; ; wait for data ; ; jsr sd_waitresult ; ; cmp #$fe ; ; beq SdBooted ; ; ;Retry until it works ; ; rts ;jmp BadAppleStart;reset ; ; SdBooted ; ; ;SD card booted, setup some values ; ; lda #SD_MOSI ;| SD_CLK ; enable card (CS low), set MOSI (resting state), SCK low ; ; sta VIA_PORTB ; ; ; Port A is in Clock pulse mode ; ; ; A read will pulse the clock on pin CA2 of the 6522 ; ; ; We will stream forever after that ; ; ;\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/ ; ; ;******************************************************************************* ; ; ;****************************** XX DECODE XX ********************************** ; ; ;****************************** - START - ********************************** ; ; ;******************************************************************************* ; ; ; One pulse to start bits to shift register? Nope, not needed. ; ; ;lda VIA_PORTA ; Dummy Read to prime the shift register? Nope, not needed. ; ; ;********************* XX Jump to video stream decode now! XX ****************** ; ; ;******************************************************************************* ; ; ;/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\ ; ; rts ; ; sd_readbyte: ; Used by SD INIT ; ; ; Enable the card and tick the clock 8 times with MOSI high, ; ; ; capturing bits from MISO and returning them ; ; ldx #8 ; we'll read 8 bits ; ; readbyteloop: ; ; lda #SD_MOSI ; enable card (CS low), set MOSI (resting state), SCK low ; ; sta VIA_PORTB ; ; lda #SD_MOSI | SD_SCK ; toggle the clock high ; ; sta VIA_PORTB ; ; lda VIA_PORTB ; read next bit ; ; and #SD_MISO ; ; clc ; default to clearing the bottom bit ; ; beq readbytebitnotset ; unless MISO was set ; ; sec ; in which case get ready to set the bottom bit ; ; readbytebitnotset: ; ; tya ; transfer partial result from Y ; ; rol ; rotate carry bit into read result ; ; tay ; save partial result back to Y ; ; dex ; decrement counter ; ; bne readbyteloop ; loop if we need to read more bits ; ; rts ; ; sd_writebyte: ; ; ; Tick the clock 8 times with descending bits on MOSI ; ; ; SD communication is mostly half-duplex so we ignore anything it sends back here ; ; ldx #8 ; send 8 bits ; ; writebyteloop: ; ; asl ; shift next bit into carry ; ; tay ; save remaining bits for later ; ; lda #0 ; ; bcc writebytesendbit ; if carry clear, don't set MOSI for this bit ; ; ora #SD_MOSI ; ; writebytesendbit: ; ; sta VIA_PORTB ; set MOSI (or not) first with SCK low ; ; eor #SD_SCK ; ; sta VIA_PORTB ; raise SCK keeping MOSI the same, to send the bit ; ; tya ; restore remaining bits to send ; ; dex ; ; bne writebyteloop ; loop if there are more bits to send ; ; rts ; ; sd_waitresult: ; ; ; Wait for the SD card to return something other than $ff ; ; jsr sd_readbyte ; ; cmp #$ff ; ; beq sd_waitresult ; ; rts ; ; sd_sendcommand: ; ; ldx #0 ; ; lda (zp_sd_cmd_address,x) ; ; lda #SD_MOSI ;| SD_CLK ; pull CS low to begin command ?? Debug, not sure ; ; sta VIA_PORTB ; ; ldy #0 ; ; lda (zp_sd_cmd_address),y ; command byte ; ; jsr sd_writebyte ; ; ldy #1 ; ; lda (zp_sd_cmd_address),y ; data 1 ; ; jsr sd_writebyte ; ; ldy #2 ; ; lda (zp_sd_cmd_address),y ; data 2 ; ; jsr sd_writebyte ; ; ldy #3 ; ; lda (zp_sd_cmd_address),y ; data 3 ; ; jsr sd_writebyte ; ; ldy #4 ; ; lda (zp_sd_cmd_address),y ; data 4 ; ; jsr sd_writebyte ; ; ldy #5 ; ; lda (zp_sd_cmd_address),y ; crc ; ; jsr sd_writebyte ; ; jsr sd_waitresult ; ; pha ; ; ; End command ; ; lda #SD_CS | SD_MOSI ;| SD_CLK ; set CS high again, no spi mode 0? Debug ; ; sta VIA_PORTB ; ; pla ; restore result code ; ; rts ; ; ; .byte 'NormalLuser' ; ; delay: ; ; RTS ; Faster boot without the delay and still works on my SD card ; ; ; ldx #0 ; ; ; ldy #0 ; ; ; delayloop ; ; ; dey ; ; ; bne delayloop ; ; ; dex ; ; ; bne delayloop ; ; ; rts ; ; longdelay: ; ; RTS ; Faster boot without the delay and still works on my SD card ; ; ; jsr mediumdelay ; ; ; jsr mediumdelay ; ; ; jsr mediumdelay ; ; mediumdelay: ; ; RTS ; Faster boot without the delay and still works on my SD card ; ; ; jsr delay ; ; ; jsr delay ; ; ; jsr delay ; ; ; jmp delay ; ; ;.org $2600 ; ; cmd0_bytes ; ; .byte $40, $00, $00, $00, $00, $95 ; ; cmd8_bytes ; ; .byte $48, $00, $00, $01, $aa, $87 ; ; cmd55_bytes ; ; .byte $77, $00, $00, $00, $00, $01 ; ; cmd41_bytes ; ; .byte $69, $40, $00, $00, $00, $01