home *** CD-ROM | disk | FTP | other *** search
/ APDL Public Domain 1 / APDL_PD1A.iso / file_trans / bbctape / !BBCTape / BBCLoadBT < prev    next >
Encoding:
Text File  |  1991-08-25  |  6.8 KB  |  324 lines

  1. MODE 7
  2. *TAPE
  3. PAGE = &E00
  4. 40REM
  5. 50REM BBC end of !BBCTape application
  6. 60REM
  7. 70REM (C) S. Burke, 26/2/91
  8. 80REM
  9. 90REM The next few lines define where the buffers are, where the
  10. 100REM code goes and where the file loads to.
  11. 110REM
  12. 120:
  13. 130name       = &0B00
  14. 140name_high  = &0B
  15. 150name_low   = &00
  16. 160block      = &0B10
  17. 170block_high = &0B
  18. 180block_low  = &10
  19. 190code_start = &0B30
  20. 200load_page  = &0E
  21. 210:
  22. 220osfind = &FFCE
  23. 230osbget = &FFD7
  24. 240osfile = &FFDD  :REM Page 335 of the Advanced User Guide is wrong!
  25. 250osbyte = &FFF4
  26. 260:
  27. 270FOR opt%=0 TO 3 STEP 3
  28. 280P% = code_start
  29. 290[OPT opt%
  30. 300.go
  31. 310LDX #0
  32. 320LDA #2
  33. 330JSR osbyte        \ disable RS423
  34. 340LDX #0
  35. 350LDA #15
  36. 360JSR osbyte        \ flush all buffers
  37. 370LDX #2
  38. 380TXA
  39. 390JSR osbyte        \ enable RS423 receive
  40. 400.mainloop
  41. 410LDA #&0D
  42. 420STA name          \ null name
  43. 430JSR handshake
  44. 440:
  45. 450JSR get           \ get command
  46. 460CPY #&C0
  47. 470BEQ end           \ quit
  48. 480:
  49. 490CPY #&30
  50. 500BNE load
  51. 510JSR put_ok        \ confirm command
  52. 520JSR get_name      \ get filename
  53. 530JSR handshake
  54. 540JSR get
  55. 550.load
  56. 560CPY #&0C
  57. 570BNE load_byte
  58. 580JSR put_ok        \ confirm command
  59. 590JSR load_file
  60. 600JSR send_file
  61. 610JMP mainloop
  62. 620.load_byte
  63. 630CPY #&03
  64. 640BNE command_error
  65. 650JSR put_ok        \ confirm command
  66. 660JSR load_bget
  67. 670JSR send_file
  68. 680JMP mainloop
  69. 690.command_error
  70. 700LDA #0
  71. 710JSR put           \ command error
  72. 720JMP mainloop
  73. 730.end
  74. 740RTS
  75. 750.load_file
  76. 760LDA #name_low     \ set up parameter block
  77. 770STA block
  78. 780LDA #name_high
  79. 790STA block+1
  80. 800LDA #0
  81. 810STA block+2
  82. 820STA block+6
  83. 830LDA #load_page
  84. 840STA block+3
  85. 850LDA #&FF
  86. 860STA block+4
  87. 870STA block+5
  88. 880LDX #block_low
  89. 890LDY #block_high
  90. 900JSR osfile        \ load file
  91. 910LDA block+10
  92. 920STA &71
  93. 930LDA block+11
  94. 940STA &72           \ put file length in &71, &72
  95. 950JSR read_load_exec
  96. 960JMP read_name     \ get load/exec address and name
  97. 970.load_bget
  98. 980LDA #0
  99. 990STA &71:STA &72   \ file length in &71, &72
  100. 1000STA &73
  101. 1010LDA #load_page
  102. 1020STA &74           \ load address in &73, &74
  103. 1030:
  104. 1040LDX #name_low
  105. 1050LDY #name_high
  106. 1060LDA #&40
  107. 1070JSR osfind        \ open file
  108. 1080CMP #0
  109. 1090BEQ end           \ open failed?
  110. 1100STA &70           \ file handle
  111. 1110LDY #0
  112. 1120.loop
  113. 1130JSR escape        \ check for escape
  114. 1140TYA:TAX           \ no TYX instruction!
  115. 1150LDY &70
  116. 1160JSR osbget        \ get byte
  117. 1170PHA:TXA:TAY:PLA   \ just TXY!
  118. 1180BCS eof           \ end of file?
  119. 1190STA (&73),Y       \ can't use X register
  120. 1200INY
  121. 1210BNE loop          \ done 256 bytes?
  122. 1220INC &72:LDA #23:CMP &72:BCS loop:INC &74
  123. 1230BPL loop          \ should always be taken
  124. 1240.eof
  125. 1250STY &71:STY &73   \ set low bytes of counters
  126. 1260JSR read_load_exec
  127. 1270JSR read_name     \ get load/exec address and name
  128. 1280LDY &70
  129. 1290LDA #0
  130. 1300JMP osfind        \ close file
  131. 1310.read_name
  132. 1320LDX #&FF
  133. 1330.nameloop
  134. 1340INX
  135. 1350CPX #&C
  136. 1360BEQ too_far
  137. 1370LDA &3B2,X        \ pull filename out of cassette workspace
  138. 1380STA name,X        \ see AUG p. 279
  139. 1390BNE nameloop
  140. 1400.too_far
  141. 1410LDA #&0D
  142. 1420STA name,X
  143. 1430RTS
  144. 1440.get_name
  145. 1450LDX #&FF
  146. 1460STX &81           \ "get" corrupts registers
  147. 1470.get_char
  148. 1480CPX #&B
  149. 1490BEQ too_far
  150. 1500JSR get           \ get filename from Arc
  151. 1510TYA
  152. 1520INC &81   
  153. 1530LDX &81
  154. 1540STA name,X
  155. 1550CMP #&0D
  156. 1560BNE get_char
  157. 1570RTS
  158. 1580.read_load_exec
  159. 1590LDX #8
  160. 1600.load_exec_loop
  161. 1610LDA &3BD,X        \ load/exec address from cassette workspace
  162. 1620STA &81,X
  163. 1630DEX
  164. 1640BNE load_exec_loop
  165. 1650RTS
  166. 1660.handshake
  167. 1670LDA #ASC("S")
  168. 1680JSR put
  169. 1690LDA #ASC("B")
  170. 1700JSR put           \ send "SB" ...
  171. 1710JSR get
  172. 1720CPY #ASC("s")
  173. 1730BNE handshake
  174. 1740JSR get
  175. 1750CPY #ASC("b")
  176. 1760BNE handshake     \ ... and receive "sb" to handshake
  177. 1770RTS
  178. 1780.send_file
  179. 1790LDA &71
  180. 1800JSR put
  181. 1810LDA &72
  182. 1820JSR put           \ send file length
  183. 1830:
  184. 1840LDA #load_page
  185. 1850STA &74
  186. 1860LDA #0 
  187. 1870STA &73           \ reset load address
  188. 1880DEC &72           \ need this for test below
  189. 1890BMI last_block    \ file length < 256 bytes?
  190. 1900STA &80           \ block length = 0 ( = 256)
  191. 1910.send_block
  192. 1920JSR put_ok        \ not eof
  193. 1930LDA #3            \ send length 3 times
  194. 1940STA &76           \ use CRC low byte as counter
  195. 1950.lenout
  196. 1960LDA &80
  197. 1970JSR put           \ output block length
  198. 1980DEC &76
  199. 1990BNE lenout        \ CRC low byte zero at exit
  200. 2000LDY #0
  201. 2010STY &75           \ initialise CRC high byte
  202. 2020.send_byte
  203. 2030STY &70           \ save offset
  204. 2040LDA (&73),Y       \ load next byte ...
  205. 2050PHA
  206. 2060JSR put
  207. 2070PLA               \ get character back
  208. 2080JSR crc           \ update crc
  209. 2090LDY &70
  210. 2100INY               \ increment offset
  211. 2110CPY &80
  212. 2120BNE send_byte     \ end of block?
  213. 2130:
  214. 2140LDA &75
  215. 2150JSR put           \ output CRC high byte
  216. 2160LDA &76
  217. 2170JSR put           \ output CRC low byte
  218. 2180:
  219. 2190JSR get           \ look for confirmation
  220. 2200TYA
  221. 2210BEQ send_block    \ zero means error, so do again
  222. 2220:
  223. 2230INC &74           \ increment address high byte
  224. 2240DEC &72           \ decrement length high byte
  225. 2250BPL send_block    \ are we finished?
  226. 2260.last_block
  227. 2270LDY #0
  228. 2280LDA &71           \ length of last block
  229. 2290STY &71           \ set length to zero
  230. 2300STA &80
  231. 2310BNE send_block    \ output if non-zero
  232. 2320LDA #0
  233. 2330JSR put           \ zero marks eof
  234. 2340JSR put_load_exec \ send the load/exec adress
  235. 2350.put_name                   \ fall through to put_name ...
  236. 2360LDX #&FF
  237. 2370STX &81           \ "put" corrupts registers
  238. 2380.put_char                   \ output file name
  239. 2390INC &81
  240. 2400LDX &81
  241. 2410LDA name,X
  242. 2420PHA
  243. 2430JSR put
  244. 2440PLA
  245. 2450CMP #&0D
  246. 2460BNE put_char
  247. 2470RTS
  248. 2480.put_load_exec              \ put out load/exec address
  249. 2490LDX #0
  250. 2500STX &81           \ "put" corrupts registers
  251. 2510.put_load_exec_loop
  252. 2520LDA &82,X
  253. 2530JSR put
  254. 2540INC &81
  255. 2550LDX &81
  256. 2560CPX #8
  257. 2570BNE put_load_exec_loop
  258. 2580RTS
  259. 2590.put_ok
  260. 2600LDA #&FF
  261. 2610.put
  262. 2620PHA               \ save value to output
  263. 2630JSR escape
  264. 2640LDX #&FD
  265. 2650LDA #&80
  266. 2660JSR osbyte        \ get # empty bytes in RS423 output buffer
  267. 2670CPX #9
  268. 2680PLA
  269. 2690BCC put           \ if < 9 bytes remain, wait ...
  270. 2700:
  271. 2710LDX #2
  272. 2720TAY
  273. 2730LDA #&8A
  274. 2740JMP osbyte        \ ... and send it
  275. 2750.get
  276. 2760JSR escape
  277. 2770LDX #1
  278. 2780LDA #&91
  279. 2790JSR osbyte        \ read a byte
  280. 2800BCS get
  281. 2810RTS
  282. 2820.crc
  283. 2830EOR &75           \ calculate CRC in &75, &76
  284. 2840STA &75           \ algorithm from Advanced User Guide
  285. 2850LDX #8            \ I hope it's right!
  286. 2860.crc_loop
  287. 2870LDA &75
  288. 2880ROL A
  289. 2890BCC b7z
  290. 2900LDA &75
  291. 2910EOR #8
  292. 2920STA &75
  293. 2930LDA &76
  294. 2940EOR #&10
  295. 2950STA &76
  296. 2960.b7z
  297. 2970ROL &76
  298. 2980ROL &75
  299. 2990DEX
  300. 3000BNE crc_loop
  301. 3010RTS
  302. 3020.escape
  303. 3030LDA &FF
  304. 3040BMI error
  305. 3050RTS
  306. 3060.error
  307. 3070LDA #&7E
  308. 3080JSR osbyte        \ acknowledge escape
  309. 3090LDX #0
  310. 3100LDA #&0F
  311. 3110JSR osbyte        \ flush buffers (just in case)
  312. 3120LDY #0
  313. 3130LDA #0
  314. 3140JSR &FFCE         \ close all files
  315. 3150BRK
  316. 3160]
  317. 3170?P% = &11
  318. 3180P%  = P% + 1
  319. 3190$P% = "Escape" + CHR$0
  320. 3200NEXT opt%
  321. *OPT 1,2
  322. RUN
  323. CALL go
  324.