home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / cpm / c64 / term-v2.c1 < prev    next >
Text File  |  1985-06-21  |  20KB  |  1,029 lines

  1. 1000 rem  save "@0:newprot.src.1200",8
  2. 1010 :
  3. 1020 open2,8,2,"@0:newprot1200,p,w"
  4. 1030 :
  5. 1040 sys700
  6. 1050 ;
  7. 1060 .opt o2
  8. 1070 ;
  9. 1080 differ = $0000
  10. 1090 startloc = $c000
  11. 1100 c64 = 1
  12. 1110 pnta = $62
  13. 1120 pntb = $64
  14. 1130 stat = $96
  15. 1140 defto = $009a ;default output device (kernal)
  16. 1150 ptr1 = $009e ;tape pass1 error log (kernal)
  17. 1160 bufpntr = $a6 ;pointer to tape i/o buffer (kernal) [2]
  18. 1170 tape1 = $b2 ;pointer to start of tape buffer (kernal) [2]
  19. 1180 robuf = $00f9 ;pointer to rs232 output buffer (kernal)
  20. 1190 lastch = $0200 ;last used character
  21. 1200 ridbe = $029b
  22. 1210 ridbs = $029c
  23. 1220 rodbs = $029d ;start position of rs232 output buffer (kernal)
  24. 1230 rodbe = $029e ;end position of rs232 output buffer (kernal)
  25. 1240 rs232enb = $02a1 ;rs232 enable=128, disable=255
  26. 1250 ibsout = $0326 ;chrout routine vector (kernal) [2]
  27. 1260 codebuf  = $c800-differ ;buffer for incoming 3 chr codes
  28. 1270 bitpnt   = $c803-differ ;bit pointer for allowable matches
  29. 1280 bitcnt   = $c804-differ ;bit counter (0 to 4)
  30. 1290 bitpat   = $c805-differ ;bit pattern for searches
  31. 1300 timer1   = $c806-differ ;timer for non-received characters (2)
  32. 1310 gbsave   = $c808-differ ;location to save good bad signal needed
  33. 1320 bufcount = $c809-differ ;number of chrs to buffer into block
  34. 1330 delay    = $c80b-differ ;delay for wait period
  35. 1340 skpdelay = $c80c-differ ;delay skip counter
  36. 1350 endflag  = $c80d-differ ;flag to indicate last block
  37. 1360 check    = $c80e-differ ;save place for checksum (4)
  38. 1370 check1   = $c812-differ ;secondary checksum holding place (4)
  39. 1380 bufpnt   = $c816-differ ;pointer to current buffer
  40. 1390 recsize  = $c817-differ ;size of received buffer
  41. 1400 maxsize  = $c818-differ ;maximum block size
  42. 1410 blocknum = $c819-differ ;block number (2)
  43. 1420 filetype = $c81b-differ ;file type (from basic)
  44. 1430 stack    = $c81c-differ ;stack pointer at entry
  45. 1440 dontdash = $c81d-differ ;flag to suppress dashes and colons
  46. 1450 specmode = $c81e-differ ;flag to send special start code
  47. 1460 buffer   = $c900-differ ;buffer for block
  48. 1470 ;
  49. 1480 ;buffer positions
  50. 1490 ;
  51. 1500 sizepos = 4
  52. 1510 numpos = 5
  53. 1520 datapos = 7
  54. 1530 ;
  55. 1540 xmit = $cb00
  56. 1550 oldout = $cb02
  57. 1560 basic4 = $ef06 ;basic call from chrout
  58. 1570 basic3 = $ef3b ;basic call from chrout
  59. 1580 setup = $ef7e  ;set up rs232 to receive again
  60. 1590 ;
  61. 1600 ;kernal locations
  62. 1610 ;
  63. 1620 basic1 = $f80d ;basic call from chrout
  64. 1630 basic2 = $f864 ;basic call from chrout
  65. 1640 readst = $ffb7
  66. 1650 chkin  = $ffc6 ;open channel for input
  67. 1660 chkout = $ffc9 ;open channel for output
  68. 1670 clrchn = $ffcc ;close input and output channels
  69. 1680 chrin  = $ffcf ;input character from channel
  70. 1690 chrout = $ffd2 ;output character to channel
  71. 1700 getin  = $ffe4 ;get a character from keyboard queue
  72. 1710 zfffe = $fffe
  73. 1720 ;
  74. 1730 *=startloc
  75. 1740 ;
  76. 1750 lda #00   ;sys 49152
  77. 1760 .byt $2c
  78. 1770 lda #03   ;sys 49155
  79. 1780 .byt $2c
  80. 1790 lda #06   ;sys 49158
  81. 1800 .byt $2c
  82. 1810 lda #09   ;sys 49161
  83. 1820 .byt $2c
  84. 1830 lda #12   ;sys 49164
  85. 1840 .byt $2c
  86. 1850 lda #15   ;sys 49167
  87. 1860 nop
  88. 1870 jmp over
  89. 1880 jmp reset
  90. 1890 jmp init
  91. 1900 ;
  92. 1910 over sta pnta
  93. 1920 tsx 
  94. 1930 stx stack
  95. 1940 lda #<table
  96. 1950 clc 
  97. 1960 adc pnta
  98. 1970 sta jmppoint+1
  99. 1980 lda #>table
  100. 1990 adc #$00
  101. 2000 sta jmppoint+2
  102. 2010 jmppoint jmp table
  103. 2020 ;
  104. 2030 table jmp accept
  105. 2040 jmp receive
  106. 2050 jmp transmit
  107. 2060 jmp rectype
  108. 2070 jmp trantype
  109. 2080 jmp terminal
  110. 2090 jmp init
  111. 2100 ;
  112. 2110 codes .asc "goo"
  113. 2120 .asc "bad"
  114. 2130 .asc "ack"
  115. 2140 .asc "s/b"
  116. 2150 .asc "syn"
  117. 2160 ;
  118. 2170 ;accept characters and check for codes
  119. 2180 ;
  120. 2190 accept sta bitpat ;save required bit pattern
  121. 2200 lda #$00
  122. 2210 sta codebuf
  123. 2220 sta codebuf+1
  124. 2230 sta codebuf+2
  125. 2240 cd1 lda #$00
  126. 2250 sta timer1 ;clear timer
  127. 2260 sta timer1+1
  128. 2270 cd2 jsr exit
  129. 2280 jsr getnum ;get#5,a$
  130. 2290 lda stat
  131. 2300 bne cd3 ;if no chr, do timer check
  132. 2310 lda codebuf+1
  133. 2320 sta codebuf
  134. 2330 lda codebuf+2
  135. 2340 sta codebuf+1
  136. 2350 lda lastch
  137. 2360 sta codebuf+2
  138. 2370 lda #$00
  139. 2380 sta bitcnt ;clear bit counter
  140. 2390 lda #$01
  141. 2400 sta bitpnt ;initialize bit pointer
  142. 2410 cd4 lda bitpat ;look at bit pattern
  143. 2420 bit bitpnt ;is bit set
  144. 2430 beq cd5 ;no, don't check this code word
  145. 2440 ldy bitcnt
  146. 2450 ldx #$00
  147. 2460 cd6 lda codebuf,x
  148. 2470 cmp codes,y
  149. 2480 bne cd5
  150. 2490 iny 
  151. 2500 inx 
  152. 2510 cpx #$03
  153. 2520 bne cd6
  154. 2530 jmp cd7
  155. 2540 ;
  156. 2550 cd5 asl bitpnt ;shift bit pointer
  157. 2560 lda bitcnt
  158. 2570 clc 
  159. 2580 adc #$03
  160. 2590 sta bitcnt
  161. 2600 cmp #15
  162. 2610 bne cd4
  163. 2620 jmp cd1
  164. 2630 ;
  165. 2640 cd7 lda #255
  166. 2650 sta timer1
  167. 2660 sta timer1+1
  168. 2670 jmp cd2
  169. 2680 ;
  170. 2690 cd3 inc timer1
  171. 2700 bne cd9
  172. 2710 inc timer1+1
  173. 2720 cd9 lda timer1+1
  174. 2730 ora timer1
  175. 2740 beq cd8
  176. 2750 lda timer1
  177. 2760 cmp #$07
  178. 2770 .if c64:lda timer1+1
  179. 2780 .if c64:cmp #20
  180. 2790 bcc cd2
  181. 2800 lda #$01
  182. 2810 sta stat
  183. 2820 jmp dodelay
  184. 2830 ;
  185. 2840 cd8 lda #$00
  186. 2850 sta stat
  187. 2860 rts 
  188. 2870 ;
  189. 2880 ;
  190. 2890 .if c64:.goto 3210
  191. 2900 ;
  192. 2910 ;do a get# for pet
  193. 2920 ;
  194. 2930 getnum ldx #5
  195. 2940 jsr chkin
  196. 2950 jsr chrin
  197. 2960 sta lastch
  198. 2970 jsr clrchn
  199. 2980 rts
  200. 2990 ;
  201. 3000 ;do a get# for pet terminal mode
  202. 3010 ;
  203. 3020 getnum1 lda $e823
  204. 3030 bpl gt1
  205. 3040 ldx #5
  206. 3050 jsr chkin
  207. 3060 jsr chrin
  208. 3070 sta lastch
  209. 3080 jsr clrchn
  210. 3090 lda $e822
  211. 3100 lda #0
  212. 3110 sta stat
  213. 3120 rts
  214. 3130 ;
  215. 3140 gt1 lda #0
  216. 3150 sta lastch
  217. 3160 lda #2
  218. 3170 sta stat
  219. 3180 rts
  220. 3190 ;
  221. 3200 .goto 3540
  222. 3210 ;
  223. 3220 ;get# for c64
  224. 3230 ;
  225. 3240 getnum1 nop 
  226. 3250 getnum tya 
  227. 3260 pha 
  228. 3270 lda ridbe
  229. 3280 cmp ridbs
  230. 3290 beq get1
  231. 3300 ldy ridbs
  232. 3310 lda ($f7),y
  233. 3320 pha 
  234. 3330 inc ridbs
  235. 3340 lda #$00
  236. 3350 sta stat
  237. 3360 pla 
  238. 3370 sta lastch
  239. 3380 pla 
  240. 3390 tay 
  241. 3400 jmp dorts
  242. 3410 ;
  243. 3420 get1 lda #$02
  244. 3430 sta stat
  245. 3440 lda #$00
  246. 3450 sta lastch
  247. 3460 pla 
  248. 3470 tay 
  249. 3480 ;
  250. 3490 dorts pha 
  251. 3500 lda #$03
  252. 3510 sta $ba
  253. 3520 pla 
  254. 3530 rts 
  255. 3540 ;
  256. 3550 ;send a code
  257. 3560 ;
  258. 3570 sendcode ldx #$05
  259. 3580 jsr chkout
  260. 3590 ldx #$00
  261. 3600 sn1 lda codes,y
  262. 3610 jsr chrout
  263. 3620 iny 
  264. 3630 inx 
  265. 3640 cpx #$03
  266. 3650 bne sn1
  267. 3660 jmp clrchn
  268. 3670 ;
  269. 3680 ;do handshaking for reception end
  270. 3690 ;
  271. 3700 rechand sta gbsave ;save good or bad signal as needed
  272. 3710 lda #$00
  273. 3720 sta delay ;no delay
  274. 3730 rc1 lda #$02
  275. 3740 sta pnta
  276. 3750 ldy gbsave
  277. 3760 jsr sendcode ;send g/b signal
  278. 3770 rc9 lda #%00100 ;allow "ack" signals
  279. 3780 jsr accept ;wait for code
  280. 3790 lda stat
  281. 3800 beq rc2 ;if ok, send g/b signal again
  282. 3810 dec pnta
  283. 3820 bne rc9
  284. 3830 jmp rc1
  285. 3840 ;
  286. 3850 rc2 ldy #$09
  287. 3860 jsr sendcode ;send "s/b" code
  288. 3870 lda endflag
  289. 3880 beq rc5
  290. 3890 lda gbsave
  291. 3900 beq rc6
  292. 3910 rc5 lda buffer+sizepos
  293. 3920 sta bufcount
  294. 3930 sta recsize
  295. 3940 jsr recmodem ;wait for block
  296. 3950 lda stat
  297. 3960 cmp #%0001 ;check for good block
  298. 3970 beq rc4
  299. 3980 cmp #%0010 ;check for blank input
  300. 3990 beq rc2
  301. 4000 cmp #%0100 ;check for loss of signal
  302. 4010 beq rc4
  303. 4020 cmp #%1000 ;check for "ack" signal
  304. 4030 beq rc2
  305. 4040 rc4 rts 
  306. 4050 ;
  307. 4060 rc6 lda #%10000 ;wait for "syn" signal
  308. 4070 jsr accept
  309. 4080 lda stat
  310. 4090 bne rc2 ;if not, send "s/b" again
  311. 4100 lda #10
  312. 4110 sta bufcount
  313. 4120 rc8 ldy #12 ;send "syn" signal
  314. 4130 jsr sendcode
  315. 4140 lda #%01000 ;wait for "s/b" signal
  316. 4150 jsr accept
  317. 4160 lda stat
  318. 4170 beq rc7
  319. 4180 dec bufcount
  320. 4190 bne rc8
  321. 4200 rc7 rts 
  322. 4210 ;
  323. 4220 ;do handshaking for transmission end
  324. 4230 ;
  325. 4240 tranhand lda #$01
  326. 4250 sta delay ;use delay
  327. 4260 tx2 lda specmode
  328. 4270 beq tx20
  329. 4280 ldy #$00
  330. 4290 jsr sendcode ;send a "goo" signal
  331. 4300 tx20 lda #%01011 ;allow "goo", "bad", and "s/b"
  332. 4310 jsr accept ;wait for codes
  333. 4320 lda stat
  334. 4330 bne tx2 ;if no signal, wait again
  335. 4340 lda #$00
  336. 4350 sta specmode
  337. 4360 lda bitcnt
  338. 4370 cmp #$00 ;"good" signal
  339. 4380 bne tx10 ;no, resend old block
  340. 4390 lda endflag
  341. 4400 bne tx4
  342. 4410 inc blocknum
  343. 4420 bne tx7
  344. 4430 inc blocknum+1
  345. 4440 tx7 jsr thisbuf
  346. 4450 ldy #numpos ;block number high order part
  347. 4460 iny 
  348. 4470 lda (pntb),y
  349. 4480 cmp #255
  350. 4490 bne tx3
  351. 4500 lda #$01
  352. 4510 sta endflag
  353. 4520 lda bufpnt
  354. 4530 eor #$01
  355. 4540 sta bufpnt
  356. 4550 jsr thisbuf
  357. 4560 jsr dummybl1
  358. 4570 jmp tx1
  359. 4580 ;
  360. 4590 tx3 jsr dummyblk ;yes, get new block
  361. 4600 tx1 lda #"-"
  362. 4610 .byt $2c
  363. 4620 tx10 lda #":"
  364. 4630 jsr prtdash
  365. 4640 ldy #$06
  366. 4650 jsr sendcode ;send "ack" code
  367. 4660 lda #%01000 ;allow only "s/b" code
  368. 4670 jsr accept ;wait for code
  369. 4680 lda stat
  370. 4690 bne tx1
  371. 4700 jsr thisbuf
  372. 4710 ldy #sizepos ;block size
  373. 4720 lda (pntb),y
  374. 4730 sta bufcount
  375. 4740 jsr altbuf
  376. 4750 ldx #$05
  377. 4760 jsr chkout
  378. 4770 ldy #$00
  379. 4780 tx6 lda (pntb),y ;transmit alternate buffer
  380. 4790 jsr chrout
  381. 4800 iny 
  382. 4810 cpy bufcount
  383. 4820 bne tx6
  384. 4830 jsr clrchn
  385. 4840 lda #$00
  386. 4850 rts 
  387. 4860 ;
  388. 4870 tx4 lda #"*"
  389. 4880 jsr prtdash
  390. 4890 ldy #$06
  391. 4900 jsr sendcode ;send "ack" signal
  392. 4910 lda #%01000
  393. 4920 jsr accept ;wait for "s/b" signal
  394. 4930 lda stat
  395. 4940 bne tx4 ;if not, resend "ack" signal
  396. 4950 lda #10
  397. 4960 sta bufcount
  398. 4970 tx5 ldy #12
  399. 4980 jsr sendcode ;send "syn" signal
  400. 4990 lda #%10000
  401. 5000 jsr accept ;wait for "syn" signal back
  402. 5010 lda stat
  403. 5020 beq tx8
  404. 5030 dec bufcount
  405. 5040 bne tx5
  406. 5050 tx8 lda #$03
  407. 5060 sta bufcount
  408. 5070 tx9 ldy #$09
  409. 5080 jsr sendcode ;send "s/b" signal
  410. 5090 lda #$00000
  411. 5100 jsr accept ;just wait
  412. 5110 dec bufcount
  413. 5120 bne tx9
  414. 5130 lda #$01
  415. 5140 rts 
  416. 5150 ;
  417. 5160 ;receive a block from the modem
  418. 5170 ;
  419. 5180 ; stat returns with:
  420. 5190 ;
  421. 5200 ;  bit 0 - buffered all characters successfully
  422. 5210 ;  bit 1 - no characters received at all
  423. 5220 ;  bit 2 - insufficient characters received
  424. 5230 ;  bit 3 - "ack" signal received
  425. 5240 ;
  426. 5250 recmodem ldy #$00 ;start index
  427. 5260 rcm5 lda #$00 ;clear timers
  428. 5270 sta timer1
  429. 5280 sta timer1+1
  430. 5290 rcm1 jsr exit
  431. 5300 jsr getnum ;get a chr from the modem
  432. 5310 lda stat
  433. 5320 bne rcm2 ;no character received
  434. 5330 lda lastch
  435. 5340 sta buffer,y ;save chr in buffer
  436. 5350 cpy #$03 ;chr one of the first 3
  437. 5360 bcs rcm3 ;no, skip code check
  438. 5370 sta codebuf,y ;save chr in code buffer
  439. 5380 cpy #$02 ;on the 3rd chr
  440. 5390 bne rcm3 ;no, don't look at chrs yet
  441. 5400 lda codebuf ;check for a "ack" signal
  442. 5410 cmp #"a"
  443. 5420 bne rcm3
  444. 5430 lda codebuf+1
  445. 5440 cmp #"c"
  446. 5450 bne rcm3
  447. 5460 lda codebuf+2
  448. 5470 cmp #"k"
  449. 5480 beq rcm4 ;"ack" found
  450. 5490 rcm3 iny ;inc index
  451. 5500 cpy bufcount ;buffered all chrs
  452. 5510 bne rcm5 ;no, buffer next
  453. 5520 lda #%0001 ;yes, return bit 0 set
  454. 5530 sta stat
  455. 5540 rts 
  456. 5550 ;
  457. 5560 rcm4 lda #$ff ;"syn" found, set timer to -1
  458. 5570 sta timer1
  459. 5580 sta timer1+1
  460. 5590 jmp rcm1 ;see if there is another chr
  461. 5600 ;
  462. 5610 rcm2 inc timer1 ;inc timer
  463. 5620 bne rcm6
  464. 5630 inc timer1+1
  465. 5640 rcm6 lda timer1
  466. 5650 ora timer1+1 ;timer now at zero
  467. 5660 beq rcm7 ;"syn" found with no following chrs
  468. 5670 lda timer1
  469. 5680 cmp #$06
  470. 5690 .if c64:lda timer1+1
  471. 5700 .if c64:cmp #16 ;time out yet
  472. 5710 bne rcm1 ;no, get next chr
  473. 5720 lda #%0010 ;yes, set bit 1
  474. 5730 sta stat
  475. 5740 cpy #$00
  476. 5750 beq rcm9
  477. 5760 lda #%0100 ;but if chrs received, set bit 2
  478. 5770 sta stat
  479. 5780 rcm9 jmp dodelay
  480. 5790 ;
  481. 5800 rcm7 lda #%1000 ;"ack" found, set bit 2
  482. 5810 sta stat
  483. 5820 rts 
  484. 5830 ;
  485. 5840 ;create dummy block for transmission
  486. 5850 ;
  487. 5860 dummyblk lda bufpnt
  488. 5870 eor #$01
  489. 5880 sta bufpnt
  490. 5890 jsr thisbuf ;read block into "this" buffer
  491. 5900 ldy #numpos ;block number
  492. 5910 lda blocknum
  493. 5920 clc 
  494. 5930 adc #$01
  495. 5940 sta (pntb),y ;set block number low part
  496. 5950 iny 
  497. 5960 lda blocknum+1
  498. 5970 adc #$00
  499. 5980 sta (pntb),y ;set block number high part
  500. 5990 ldx #$02
  501. 6000 jsr chkin
  502. 6010 ldy #datapos ;actual block
  503. 6020 db1 jsr chrin
  504. 6030 sta (pntb),y
  505. 6040 iny 
  506. 6050 jsr readst
  507. 6060 bne db4
  508. 6070 cpy maxsize
  509. 6080 bne db1
  510. 6090 tya 
  511. 6100 pha 
  512. 6110 jmp db5
  513. 6120 ;
  514. 6130 db4 tya 
  515. 6140 pha 
  516. 6150 ldy #numpos ;block number
  517. 6160 iny ;high part
  518. 6170 lda #255
  519. 6180 sta (pntb),y
  520. 6190 jmp db5
  521. 6200 ;
  522. 6210 dummybl1 pha ;save size of just read block
  523. 6220 db5 jsr clrchn
  524. 6230 .if c64:jsr reset
  525. 6240 .if c64:jsr dod2
  526. 6250 .if c64:jsr reset
  527. 6260 ldy #sizepos ;block size
  528. 6270 lda (pntb),y
  529. 6280 sta bufcount ;set bufcount for checksum
  530. 6290 jsr altbuf
  531. 6300 pla 
  532. 6310 ldy #sizepos ;block size
  533. 6320 sta (pntb),y
  534. 6330 jsr checksum
  535. 6340 rts 
  536. 6350 ;
  537. 6360 ;set pointers for current buffer
  538. 6370 ;
  539. 6380 thisbuf lda #<buffer
  540. 6390 sta pntb
  541. 6400 lda bufpnt
  542. 6410 clc 
  543. 6420 adc #>buffer
  544. 6430 sta pntb+1
  545. 6440 rts 
  546. 6450 ;
  547. 6460 ;set pointer b for alternate buffer
  548. 6470 ;
  549. 6480 altbuf lda #<buffer
  550. 6490 sta pntb
  551. 6500 lda bufpnt
  552. 6510 eor #$01
  553. 6520 clc 
  554. 6530 adc #>buffer
  555. 6540 sta pntb+1
  556. 6550 rts 
  557. 6560 ;
  558. 6570 ;calculate checksum
  559. 6580 ;
  560. 6590 checksum lda #$00
  561. 6600 sta check1
  562. 6610 sta check1+1
  563. 6620 sta check1+2
  564. 6630 sta check1+3
  565. 6640 ldy #sizepos
  566. 6650 cks1 lda check1
  567. 6660 clc 
  568. 6670 adc (pntb),y
  569. 6680 sta check1
  570. 6690 bcc cks2
  571. 6700 inc check1+1
  572. 6710 cks2 lda check1+2
  573. 6720 eor (pntb),y
  574. 6730 sta check1+2
  575. 6740 lda check1+3
  576. 6750 rol a ;set or clear carry flag
  577. 6760 rol check1+2
  578. 6770 rol check1+3
  579. 6780 iny 
  580. 6790 cpy bufcount
  581. 6800 bne cks1
  582. 6810 ldy #$00
  583. 6820 lda check1
  584. 6830 sta (pntb),y
  585. 6840 iny 
  586. 6850 lda check1+1
  587. 6860 sta (pntb),y
  588. 6870 iny 
  589. 6880 lda check1+2
  590. 6890 sta (pntb),y
  591. 6900 iny 
  592. 6910 lda check1+3
  593. 6920 sta (pntb),y
  594. 6930 rts 
  595. 6940 ;
  596. 6950 ;transmit a program
  597. 6960 ;
  598. 6970 transmit lda #$00
  599. 6980 sta endflag
  600. 6990 sta skpdelay
  601. 7000 sta dontdash
  602. 7010 lda #$01
  603. 7020 sta bufpnt
  604. 7030 lda #$ff
  605. 7040 sta blocknum
  606. 7050 sta blocknum+1
  607. 7060 jsr altbuf
  608. 7070 ldy #sizepos ;block size
  609. 7080 lda #datapos
  610. 7090 sta (pntb),y
  611. 7100 jsr thisbuf
  612. 7110 ldy #numpos ;block number
  613. 7120 lda #$00
  614. 7130 sta (pntb),y
  615. 7140 iny 
  616. 7150 sta (pntb),y
  617. 7160 trm1 jsr tranhand
  618. 7170 beq trm1
  619. 7180 rec3 lda #$00
  620. 7190 sta lastch
  621. 7200 rts 
  622. 7210 ;
  623. 7220 ;receive a file
  624. 7230 ;
  625. 7240 receive lda #$01
  626. 7250 sta blocknum
  627. 7260 lda #$00
  628. 7270 sta blocknum+1
  629. 7280 sta endflag
  630. 7290 sta bufpnt
  631. 7300 sta buffer+numpos ;block number
  632. 7310 sta buffer+numpos+1
  633. 7320 sta skpdelay
  634. 7330 lda #datapos
  635. 7340 sta buffer+sizepos ;block size
  636. 7350 lda #$00
  637. 7360 rec1 jsr rechand
  638. 7370 lda endflag
  639. 7380 bne rec3
  640. 7390 jsr match ;do checksums match
  641. 7400 bne rec2 ;no
  642. 7410 jsr clrchn
  643. 7420 lda bufcount
  644. 7430 cmp #datapos
  645. 7440 beq rec7
  646. 7450 ldx #$02
  647. 7460 jsr chkout
  648. 7470 ldy #datapos
  649. 7480 rec6 lda buffer,y
  650. 7490 jsr chrout
  651. 7500 iny 
  652. 7510 cpy bufcount
  653. 7520 bne rec6
  654. 7530 jsr clrchn
  655. 7540 rec7 lda buffer+numpos+1 ;block number high order part
  656. 7550 cmp #$ff
  657. 7560 bne rec4
  658. 7570 lda #$01
  659. 7580 sta endflag
  660. 7590 lda #"*"
  661. 7600 .byt $2c
  662. 7610 rec4 lda #"-"
  663. 7620 jsr chrout
  664. 7630 .if c64:jsr reset
  665. 7640 lda #$00
  666. 7650 jmp rec1
  667. 7660 ;
  668. 7670 rec2 jsr clrchn
  669. 7680 lda #":"
  670. 7690 jsr chrout
  671. 7700 lda recsize
  672. 7710 sta buffer+sizepos
  673. 7720 lda #$03
  674. 7730 jmp rec1
  675. 7740 ;
  676. 7750 ;see if checksums match
  677. 7760 ;
  678. 7770 match lda buffer
  679. 7780 sta check
  680. 7790 lda buffer+1
  681. 7800 sta check+1
  682. 7810 lda buffer+2
  683. 7820 sta check+2
  684. 7830 lda buffer+3
  685. 7840 sta check+3
  686. 7850 jsr thisbuf
  687. 7860 lda recsize
  688. 7870 sta bufcount
  689. 7880 jsr checksum
  690. 7890 lda buffer
  691. 7900 cmp check
  692. 7910 bne mtc1
  693. 7920 lda buffer+1
  694. 7930 cmp check+1
  695. 7940 bne mtc1
  696. 7950 lda buffer+2
  697. 7960 cmp check+2
  698. 7970 bne mtc1
  699. 7980 lda buffer+3
  700. 7990 cmp check+3
  701. 8000 bne mtc1
  702. 8010 lda #$00
  703. 8020 rts 
  704. 8030 ;
  705. 8040 mtc1 lda #$01
  706. 8050 rts 
  707. 8060 ;
  708. 8070 ;receive file type block
  709. 8080 ;
  710. 8090 rectype lda #$00
  711. 8100 sta blocknum
  712. 8110 sta blocknum+1
  713. 8120 sta endflag
  714. 8130 sta bufpnt
  715. 8140 sta skpdelay
  716. 8150 lda #datapos
  717. 8160 clc 
  718. 8170 adc #$01
  719. 8180 sta buffer+sizepos
  720. 8190 lda #$00
  721. 8200 rct3 jsr rechand
  722. 8210 lda endflag
  723. 8220 bne rct1
  724. 8230 jsr match
  725. 8240 bne rct2
  726. 8250 lda buffer+datapos
  727. 8260 sta filetype
  728. 8270 lda #$01
  729. 8280 sta endflag
  730. 8290 lda #$00
  731. 8300 jmp rct3
  732. 8310 ;
  733. 8320 rct2 lda recsize
  734. 8330 sta buffer+sizepos
  735. 8340 lda #$03
  736. 8350 jmp rct3
  737. 8360 ;
  738. 8370 rct1 lda #$00
  739. 8380 sta lastch
  740. 8390 rts 
  741. 8400 ;
  742. 8410 ;transmit file type
  743. 8420 ;
  744. 8430 trantype lda #$00
  745. 8440 sta endflag
  746. 8450 sta skpdelay
  747. 8460 lda #$01
  748. 8470 sta bufpnt
  749. 8480 sta dontdash
  750. 8490 lda #255
  751. 8500 sta blocknum
  752. 8510 sta blocknum+1
  753. 8520 jsr altbuf
  754. 8530 ldy #sizepos ;block size
  755. 8540 lda #datapos
  756. 8550 clc 
  757. 8560 adc #$01
  758. 8570 sta (pntb),y
  759. 8580 jsr thisbuf
  760. 8590 ldy #numpos ;block number
  761. 8600 lda #255
  762. 8610 sta (pntb),y
  763. 8620 iny 
  764. 8630 sta (pntb),y
  765. 8640 ldy #datapos
  766. 8650 lda filetype
  767. 8660 sta (pntb),y
  768. 8670 lda #$01
  769. 8680 sta specmode
  770. 8690 trf1 jsr tranhand
  771. 8700 beq trf1
  772. 8710 lda #$00
  773. 8720 sta lastch
  774. 8730 rts 
  775. 8740 ;
  776. 8750 ;do delay for timing
  777. 8760 ;
  778. 8770 dodelay inc skpdelay
  779. 8780 lda skpdelay
  780. 8790 cmp #$03
  781. 8800 bcc dod1
  782. 8810 lda #$00
  783. 8820 sta skpdelay
  784. 8830 lda delay
  785. 8840 beq dod2
  786. 8850 bne dod3
  787. 8860 ;
  788. 8870 dod1 lda delay
  789. 8880 beq dod3
  790. 8890 ;
  791. 8900 dod2 ldx #$00
  792. 8910 lp1 ldy #$00
  793. 8920 lp2 iny 
  794. 8930 bne lp2
  795. 8940 inx 
  796. 8950 cpx #120
  797. 8960 bne lp1
  798. 8970 dod3 rts 
  799. 8980 ;
  800. 8990 ;print dash, colon, or star
  801. 9000 ;
  802. 9010 prtdash pha 
  803. 9020 lda blocknum
  804. 9030 ora blocknum+1
  805. 9040 beq prtd1
  806. 9050 lda dontdash
  807. 9060 bne prtd1
  808. 9070 pla 
  809. 9080 jsr chrout
  810. 9090 pha 
  811. 9100 prtd1 pla 
  812. 9110 rts 
  813. 9120 ;
  814. 9130 ;reset rs232 port
  815. 9140 ;
  816. 9150 reset jsr setup
  817. 9160 lda rs232enb
  818. 9170 cmp #$80
  819. 9180 beq reset
  820. 9190 cmp #$92
  821. 9200 beq reset
  822. 9210 rts 
  823. 9220 ;
  824. 9230 ;terminal emulation routine
  825. 9240 ;
  826. 9250 terminal jsr cursor
  827. 9260 term jsr getnum1
  828. 9270 lda stat
  829. 9280 bne keybj
  830. 9290 lda lastch
  831. 9300 and #$7f
  832. 9310 sta lastch
  833. 9320 cmp #$08
  834. 9330 beq ok1
  835. 9340 cmp #$0d
  836. 9350 beq ok1
  837. 9360 cmp #$20
  838. 9370 bpl ok1
  839. 9380 keybj jmp keyboard
  840. 9390 ;
  841. 9400 ok1 cmp #"a"+$20
  842. 9410 bcc ok2
  843. 9420 cmp #"z"+$21
  844. 9430 bcs ok2
  845. 9440 sec 
  846. 9450 sbc #$20
  847. 9460 sta lastch
  848. 9470 jmp ok3
  849. 9480 ;
  850. 9490 ok2 cmp #$41
  851. 9500 bcc ok3
  852. 9510 cmp #"z"+1
  853. 9520 bcs ok3
  854. 9530 clc 
  855. 9540 adc #$80
  856. 9550 sta lastch
  857. 9560 ;
  858. 9570 ok3 cmp #$08
  859. 9580 bne ok4
  860. 9590 lda #$14
  861. 9600 sta lastch
  862. 9610 ok4 cmp #34 ;quote
  863. 9620 bne ok5
  864. 9630 jsr chrout
  865. 9640 lda #20
  866. 9650 jsr chrout
  867. 9660 lda #34
  868. 9670 ok5 lda lastch
  869. 9680 cmp #$0d
  870. 9690 bne ok6
  871. 9700 lda #$20
  872. 9710 jsr chrout
  873. 9720 lda #$0d
  874. 9730 ok6 jsr chrout
  875. 9740 jsr cursor
  876. 9750 ;
  877. 9760 keyboard jsr getin
  878. 9770 beq term
  879. 9780 sta lastch
  880. 9790 cmp #$13      ;clr/home key
  881. 9800 beq termout
  882. 9810 cmp #"a"
  883. 9820 bcc ok7       ;<"a"
  884. 9830 cmp #"z"+1
  885. 9840 bcs ok7       ;>"z"
  886. 9850 clc
  887. 9860 adc #$20      ;to lowercase ascii
  888. 9870 sta lastch
  889. 9880 jmp ok8
  890. 9890 ;
  891. 9900 ok7 lda lastch
  892. 9910 cmp #"a"+$80
  893. 9920 bcc ok8       ;<"a"
  894. 9930 cmp #"z"+$81
  895. 9940 bcs ok8       ;>"z"
  896. 9950 sec
  897. 9960 sbc #$80      ;to uppercase ascii
  898. 9970 sta lastch
  899. 9980 ;
  900. 9990 ok8 cmp #20   ;backspace
  901. 10000 bne ok9
  902. 10010 lda #$08
  903. 10020 sta lastch
  904. 10030 ok9 cmp #$83  ;shift r/s
  905. 10040 bne oka
  906. 10050 lda #$10      ;ctrl p
  907. 10060 sta lastch
  908. 10070 oka ldx #$05
  909. 10080 jsr chkout
  910. 10090 lda lastch
  911. 10100 jsr chrout
  912. 10110 jsr clrchn
  913. 10120 jmp terminal
  914. 10130 ;
  915. 10140 termout rts   ;with clr/home
  916. 10150 ;
  917. 10160 cursor lda #$12
  918. 10170 jsr chrout
  919. 10180 lda #$20
  920. 10190 jsr chrout
  921. 10200 lda #$9d
  922. 10210 jsr chrout
  923. 10220 lda #$92
  924. 10230 jsr chrout
  925. 10240 ;
  926. 10250 ;check for commodore key
  927. 10260 ;
  928. 10270 exit lda $028d   ;is commodore
  929. 10280 cmp #$02         ;key down
  930. 10290 bne exit1
  931. 10300 exit2 pla 
  932. 10310 tsx 
  933. 10320 cpx stack
  934. 10330 bne exit2
  935. 10340 exit1 lda #$01
  936. 10350 sta lastch
  937. 10360 rts 
  938. 10370 ;
  939. 10380 ;move chrout vector if necessary
  940. 10390 ;
  941. 10400 init lda ibsout  ;been moved yet
  942. 10410 cmp #<newout
  943. 10420 bne init1        ;no, change it
  944. 10430 lda ibsout+1
  945. 10440 cmp #>newout
  946. 10450 beq init2        ;yes, leave it
  947. 10460 init1 lda ibsout ;store old chrout vector
  948. 10470 sta oldout
  949. 10480 lda ibsout+1
  950. 10490 sta oldout+1
  951. 10500 lda #<newout     ;set new chrout vector
  952. 10510 sta ibsout
  953. 10520 lda #>newout
  954. 10530 sta ibsout+1
  955. 10540 init2 rts 
  956. 10550 ;
  957. 10560 ;new chrout routine to correct for 1200 baud speed problems
  958. 10570 ;
  959. 10580 newout pha ;dupliciaton of original kernal routines
  960. 10590 lda defto  ;test dfault output device for
  961. 10600 cmp #$03   ;screen, and...
  962. 10610 bne newout1
  963. 10620 pla        ;if so, go back to original rom routines
  964. 10630 jmp (oldout)
  965. 10640 ;
  966. 10650 newout1 bcc newout2 ;if device number less than 3,
  967. 10660 pla ;also go back to original kernal routines
  968. 10670 jmp (oldout)
  969. 10680 ;
  970. 10690 newout2 lsr a
  971. 10700 pla 
  972. 10710 sta ptr1
  973. 10720 txa 
  974. 10730 pha 
  975. 10740 tya 
  976. 10750 pha 
  977. 10760 bcc newout9
  978. 10770 jsr basic1
  979. 10780 bne newout5
  980. 10790 jsr basic2
  981. 10800 bcs newout7
  982. 10810 lda #$02
  983. 10820 ldy #$00
  984. 10830 sta (tape1),y
  985. 10840 iny 
  986. 10850 sty bufpntr
  987. 10860 newout5 lda ptr1
  988. 10870 sta (tape1),y
  989. 10880 newout6 clc 
  990. 10890 newout7 pla 
  991. 10900 tay 
  992. 10910 pla 
  993. 10920 tax 
  994. 10930 lda ptr1
  995. 10940 bcc newout8
  996. 10950 lda #$00
  997. 10960 newout8 rts 
  998. 10970 ;
  999. 10980 newout9 jsr newout10
  1000. 10990 jmp newout6
  1001. 11000 ;
  1002. 11010 newout11 jsr newout12
  1003. 11020 newout10 ldy rodbe
  1004. 11030 iny 
  1005. 11040 cpy rodbs
  1006. 11050 beq newout11
  1007. 11060 sty rodbe
  1008. 11070 dey 
  1009. 11080 lda ptr1
  1010. 11090 sta (robuf),y
  1011. 11100 ;
  1012. 11110 newout12 lda rs232enb
  1013. 11120 lsr a
  1014. 11130 bcs newout13
  1015. 11140 lda #$10
  1016. 11150 sta $dd0e
  1017. 11160 lda xmit
  1018. 11170 sta $dd04
  1019. 11180 lda xmit+1
  1020. 11190 sta $dd05
  1021. 11200 lda #$81
  1022. 11210 jsr basic3
  1023. 11220 jsr basic4
  1024. 11230 lda #$11
  1025. 11240 sta $dd0e
  1026. 11250 newout13 rts
  1027. 11260 ;
  1028. 11270 .end
  1029.