You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

lccgcrbin.src 5.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292
  1. .page 'gcrbin.fast'
  2. mask1=$f8
  3. mask2=$07
  4. mask2x=$c0
  5. mask3=$3e
  6. mask4=$01
  7. mask4x=$f0
  8. mask5=$0f
  9. mask5x=$80
  10. mask6=$7c
  11. mask7=$03
  12. mask7x=$e0
  13. mask8=$1f
  14. ;
  15. ;
  16. ;
  17. ;
  18. ;
  19. ; fast gcr to binary conversion
  20. ;
  21. ;
  22. get4gb ldy gcrpnt
  23. ;
  24. lda (bufpnt),y
  25. and #mask1
  26. lsr a
  27. lsr a
  28. lsr a
  29. sta gtab ; hi nibble
  30. ;
  31. lda (bufpnt),y
  32. and #mask2
  33. asl a
  34. asl a
  35. sta gtab+1
  36. ;
  37. iny ; next byte
  38. bne xx05 ; test for next buffer
  39. lda nxtbf
  40. sta bufpnt+1
  41. ldy nxtpnt
  42. ;
  43. xx05 lda (bufpnt),y
  44. and #mask2x
  45. rol a
  46. rol a
  47. rol a
  48. ora gtab+1
  49. sta gtab+1
  50. ;
  51. lda (bufpnt),y
  52. and #mask3
  53. lsr a
  54. sta gtab+2
  55. ;
  56. lda (bufpnt),y
  57. and #mask4
  58. asl a
  59. asl a
  60. asl a
  61. asl a
  62. sta gtab+3
  63. ;
  64. iny ; next
  65. ;
  66. lda (bufpnt),y
  67. and #mask4x
  68. lsr a
  69. lsr a
  70. lsr a
  71. lsr a
  72. ora gtab+3
  73. sta gtab+3
  74. ;
  75. lda (bufpnt),y
  76. and #mask5
  77. asl a
  78. sta gtab+4
  79. ;
  80. iny ; next byte
  81. ;
  82. lda (bufpnt),y
  83. and #mask5x
  84. clc
  85. rol a
  86. rol a
  87. and #1
  88. ora gtab+4
  89. sta gtab+4
  90. ;
  91. lda (bufpnt),y
  92. and #mask6
  93. lsr a
  94. lsr a
  95. sta gtab+5
  96. ;
  97. lda (bufpnt),y
  98. and #mask7
  99. asl a
  100. asl a
  101. asl a
  102. sta gtab+6
  103. ;
  104. iny
  105. ; test for overflow during write to binary conversion
  106. bne xx06
  107. lda nxtbf
  108. sta bufpnt+1
  109. ldy nxtpnt
  110. ;
  111. xx06 lda (bufpnt),y
  112. and #mask7x
  113. rol a
  114. rol a
  115. rol a
  116. rol a
  117. ora gtab+6
  118. sta gtab+6
  119. ;
  120. lda (bufpnt),y
  121. and #mask8
  122. sta gtab+7
  123. iny
  124. ;
  125. sty gcrpnt
  126. ;
  127. ;
  128. ldx gtab
  129. lda gcrhi,x
  130. ldx gtab+1
  131. ora gcrlo,x
  132. sta btab
  133. ;
  134. ldx gtab+2
  135. lda gcrhi,x
  136. ldx gtab+3
  137. ora gcrlo,x
  138. sta btab+1
  139. ;
  140. ldx gtab+4
  141. lda gcrhi,x
  142. ldx gtab+5
  143. ora gcrlo,x
  144. sta btab+2
  145. ;
  146. ldx gtab+6
  147. lda gcrhi,x
  148. ldx gtab+7
  149. ora gcrlo,x
  150. sta btab+3
  151. ;
  152. rts
  153. ;
  154. ;
  155. ;
  156. gcrhi .byte $ff ; error
  157. .byte $ff ; error
  158. .byte $ff ; error
  159. .byte $ff ; error
  160. .byte $ff ; error
  161. .byte $ff ; error
  162. .byte $ff ; error
  163. .byte $ff ; error
  164. .byte $ff ; error
  165. .byte $80
  166. .byte $00
  167. .byte $10
  168. .byte $ff ; error
  169. .byte $c0
  170. .byte $40
  171. .byte $50
  172. .byte $ff ; error
  173. .byte $ff ; error
  174. .byte $20
  175. .byte $30
  176. .byte $ff ; error
  177. .byte $f0
  178. .byte $60
  179. .byte $70
  180. .byte $ff ; error
  181. .byte $90
  182. .byte $a0
  183. .byte $b0
  184. .byte $ff ; error
  185. .byte $d0
  186. .byte $e0
  187. .byte $ff ; error
  188. ;
  189. ;
  190. ;
  191. gcrlo .byte $ff ; error
  192. .byte $ff ; error
  193. .byte $ff ; error
  194. .byte $ff ; error
  195. .byte $ff ; error
  196. .byte $ff ; error
  197. .byte $ff ; error
  198. .byte $ff ; error
  199. .byte $ff ; error
  200. .byte 8
  201. .byte $00
  202. .byte 1
  203. .byte $ff ; error
  204. .byte $c
  205. .byte 4
  206. .byte 5
  207. .byte $ff ; error
  208. .byte $ff ; error
  209. .byte 2
  210. .byte 3
  211. .byte $ff ; error
  212. .byte $f
  213. .byte 6
  214. .byte 7
  215. .byte $ff ; error
  216. .byte 9
  217. .byte $a
  218. .byte $b
  219. .byte $ff ; error
  220. .byte $d
  221. .byte $e
  222. .byte $ff ; error
  223. ;
  224. ;
  225. gcrbin lda #0 ; setup pointers
  226. sta gcrpnt
  227. sta savpnt
  228. sta bytcnt
  229. ;
  230. lda #>ovrbuf
  231. sta nxtbf
  232. ;
  233. lda #255-toprd
  234. sta nxtpnt
  235. ;
  236. lda bufpnt+1
  237. sta savpnt+1
  238. ;
  239. jsr get4gb
  240. ;
  241. lda btab
  242. sta bid ; get header id
  243. ;
  244. ldy bytcnt
  245. lda btab+1
  246. sta (savpnt),y
  247. iny
  248. ;
  249. lda btab+2
  250. sta (savpnt),y
  251. iny
  252. ;
  253. lda btab+3
  254. sta (savpnt),y
  255. iny
  256. ;
  257. gcrb10 sty bytcnt
  258. ;
  259. jsr get4gb
  260. ;
  261. ldy bytcnt
  262. ;
  263. lda btab
  264. sta (savpnt),y
  265. iny
  266. beq gcrb20 ; test if done yet
  267. ;
  268. lda btab+1
  269. sta (savpnt),y
  270. iny
  271. ;
  272. lda btab+2
  273. sta (savpnt),y
  274. iny
  275. ;
  276. lda btab+3
  277. sta (savpnt),y
  278. iny
  279. ;
  280. bne gcrb10 ; jmp
  281. ;
  282. gcrb20
  283. lda btab+1
  284. sta chksum
  285. lda savpnt+1 ; restore buffer pointer
  286. sta bufpnt+1
  287. ;
  288. rts
  289. ;
  290. ;
  291. ;
  292. ;.end