spc700.a65 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. ; All SPC700 routines in SPC700 machine code
  2. ; SPC loader & transfer routines by Shay Green <gblargg@gmail.com>
  3. loader ; .org $0002
  4. .byt $F8,$21 ; mov x,@loader_data
  5. .byt $BD ; mov sp,x
  6. .byt $CD,$22 ; mov x,#@loader_data+1
  7. ; Push PC and PSW from SPC header
  8. .byt $BF ; mov a,(x)+
  9. .byt $2D ; push a
  10. .byt $BF ; mov a,(x)+
  11. .byt $2D ; push a
  12. .byt $BF ; mov a,(x)+
  13. .byt $2D ; push a
  14. ; Set FLG to $60 rather than value from SPC
  15. .byt $E8,$60 ; mov a,#$60
  16. .byt $D4,$6C ; mov FLG+x,a
  17. ; Restore DSP registers
  18. .byt $8D,$00 ; mov y,#0
  19. .byt $BF ; next: mov a,(x)+
  20. .byt $CB,$F2 ; mov $F2,y
  21. .byt $C4,$F3 ; mov $F3,a
  22. .byt $FC ; inc y
  23. .byt $10,-8 ; bpl next
  24. .byt $8F,$6C,$F2 ; mov $F2,#FLG ; set for later
  25. ; Rerun loader
  26. .byt $5F,$C0,$FF ; jmp $FFC0
  27. ;---------------------------------------
  28. transfer ; .org $0002
  29. .byt $CD,$FE ; mov x,#$FE ; transfer 254 pages
  30. ; Transfer four-byte chunks
  31. .byt $8D,$3F ; page: mov y,#$3F
  32. .byt $E4,$F4 ; quad: mov a,$F4
  33. .byt $D6,$00,$02 ; mov0: mov !$0200+y,a
  34. .byt $E4,$F5 ; mov a,$F5
  35. .byt $D6,$40,$02 ; mov1: mov !$0240+y,a
  36. .byt $E4,$F6 ; mov a,$F6
  37. .byt $D6,$80,$02 ; mov2: mov !$0280+y,a
  38. .byt $E4,$F7 ; mov a,$F7 ; tell S-CPU we're ready for more
  39. .byt $CB,$F7 ; mov $F7,Y
  40. .byt $D6,$C0,$02 ; mov3: mov !$02C0+y,a
  41. .byt $DC ; dec y
  42. .byt $10,-25 ; bpl quad
  43. ; Increment MSBs of addresses
  44. .byt $AB,$0A ; inc mov0+2
  45. .byt $AB,$0F ; inc mov1+2
  46. .byt $AB,$14 ; inc mov2+2
  47. .byt $AB,$1B ; inc mov3+2
  48. .byt $1D ; dec x
  49. .byt $D0,-38 ; bne page
  50. ; Rerun loader
  51. .byt $5F,$C0,$FF ; jmp $FFC0