This is a step on the way to getting vtl-2 running on the Tandy/Radio Shack MC-10. I wasn't seeing anything that I typed in, so I inserted some debugging stores to screen area to get a look at what was happening on keyboard read. Turned out I hadn't considered that the MC-10 needs to have its input character echoed.

Format
Asm
Post date
2022-08-28 19:58
Publication Period
Unlimited
  1. OPT 6801
  2. * VTL-2 for 6801
  3. * V-3.6
  4. * 9-23-76
  5. * BY GARY SHANNON
  6. * & FRANK MCCOY
  7. * COPYWRIGHT 1976, THE COMPUTER STORE
  8. *
  9. * Modifications for 6801 fake on exorsim
  10. * and for moving variables out of direct page
  11. * by Joel Matthew Rees
  12. * Copyright 2022, Joel Matthew Rees
  13. * Starting with low-hanging fruit.
  14. * Modifications explained at
  15. * https://joels-programming-fun.blogspot.com/2022/08/programming-tandyradio-shacks-mc-10-in-assembly.html
  16. *
  17. * DEFINE LOCATIONS IN MONITOR
  18. * INCH EQU $FF00 ; per VTL.ASM
  19. * EINCH EQU $F012 ; exorsim mdos Input byte with echo unless AECHO is set
  20. * INCH EQU $F015 ; exorsim mdos Input char with echo (F012 -> strip bit 7)
  21. * POLCAT EQU $FF24 ; from VTL.ASM
  22. * OUTCH EQU $FF81 ; from VTL.ASM
  23. * EOUTCH EQU $F018 ; exorsim mdos Output character with NULs
  24. * OUTS EQU $FF82 ; from VTL.ASM
  25. * EPCRLF EQU $F021 ; Primarily for forced initialization in exorsim.
  26. *
  27. * FOR SBC6800:
  28. *BREAK EQU $1B ; BREAK KEY
  29. * For MC-10:
  30. BREAK EQU $03
  31. * For exorsim
  32. *ACIACS EQU $FCF4 ; exorcisor
  33. *ACIADA EQU $FCF5 ; exorcisor
  34. *
  35. * A few interpreter variables in the direct page won't hurt.
  36. * (Yes, I can hear voices of complaint that it's not as "tight" as it could be.)
  37. * (This allows us to save more ROM space and uses DP that would otherwise go wasted.)
  38. * (Trade-offs.)
  39. * (It also helps us understand the code, so we can do a better 6809 transliteration.)
  40. * (I hope the names are meaningful.)
  41. *
  42. * In .c10 format, the following as ORG and RMBs will cause object code output,
  43. * which will prevent the code from loading.
  44. * Changed to EQU for the MC10.
  45. * ORG $C0 ; Move this according to your environment's needs.
  46. DPBASE EQU $C0 ; Change this to move the registers.
  47. * PARSET RMB 2 ; Instead of SAVE0 in TERM/NXTRM
  48. PARSET EQU DPBASE+2
  49. * CVTSUM RMB 2 ; Instead of SAVE1 in CBLOOP
  50. CVTSUM EQU PARSET+2
  51. * MLDVCT EQU CVTSUM ; Instead of SAVE1 in mul/div (1 byte only)
  52. MLDVCT EQU CVTSUM
  53. * DIVQUO RMB 2 ; Instead of SAVE2 in DIV
  54. DIVQUO EQU MLDVCT+2
  55. * MPLIER EQU DIVQUO ; Instead of SAVE2 in MULTIP
  56. MPLIER EQU DIVQUO
  57. * EVALPT RMB 2 ; Instead of SAVE3
  58. EVALPT EQU MPLIER+2
  59. * CNVPTR RMB 2 ; Instead of SAVE4
  60. CNVPTR EQU EVALPT+2
  61. * VARADR RMB 2 ; Instead of SAVE6
  62. VARADR EQU CNVPTR+2
  63. * OPRLIN RMB 2 ; Instead of SAVE7
  64. OPRLIN EQU VARADR+2
  65. * EDTLIN RMB 2 ; Instead of SAVE8
  66. EDTLIN EQU OPRLIN+2
  67. * INSPTR RMB 2 ; Instead of SAVE10 (maybe? Will some VTL programs want it back?)
  68. INSPTR EQU EDTLIN+2
  69. * SAVLIN RMB 2 ; Instead of SAVE11
  70. SAVLIN EQU INSPTR+2
  71. * SRC RMB 2 ; For copy routine
  72. SRC EQU SAVLIN+2
  73. * DST RMB 2 ; ditto
  74. DST EQU SRC+2
  75. STKMRK EQU DST+2 ; to restore the stack on each pass.
  76. DPALLOC EQU STKMRK+2 ; total storage declared in the direct page
  77. *
  78. * SET ASIDE FOUR BYTES FOR USER
  79. * DEFINED INTERUPT ROUTINE IF NEEDED
  80. ORG $4300
  81. * ZERO must be set at even $100 boundary for address math to work.
  82. ZERO RMB 4 ; INTERUPT VECTOR
  83. AT RMB 2 ; CANCEL & C-R
  84. *
  85. * GENERAL PURPOSE STORRGE
  86. VARS RMB 52 ; VARIABLES(A-Z)
  87. BRAK RMB 2 ; [
  88. * SAVE10 has me worried about implicit linkage in VTL programs. Might need to leave it here.
  89. SAVE10 RMB 2 ; BACK SLASH
  90. BRIK RMB 2 ; ]
  91. UP RMB 2 ; ^
  92. SAVE11 RMB 2 ; Need something in each SAVE to reserve space
  93. * ; to keep the math straight.
  94. * ; Leave the SAVEs declared as they are.
  95. *
  96. SAVE14 RMB 2 ; SPACE (originally unused)
  97. EXCL RMB 2 ; !
  98. QUOTE RMB 2 ; "
  99. DOLR RMB 2 ; #
  100. DOLLAR RMB 2 ; $
  101. REMN RMB 2 ; %
  102. AMPR RMB 2 ; &
  103. QUITE RMB 2 ; '
  104. PAREN RMB 2 ; (
  105. PARIN RMB 2 ; )
  106. STAR RMB 2 ; *
  107. PLUS RMB 2 ; +
  108. COMA RMB 2 ; ,
  109. MINS RMB 2 ; -
  110. PERD RMB 2 ; .
  111. SLASH RMB 2 ; /
  112. *
  113. SAVE0 RMB 2 ; unused
  114. SAVE1 RMB 2 ; unused
  115. SAVE2 RMB 2 ; unused
  116. SAVE3 RMB 2 ; unused
  117. SAVE4 RMB 2 ; unused
  118. SAVE5 RMB 2 ; unused (PSH/PULX)
  119. SAVE6 RMB 2 ; unused
  120. SAVE7 RMB 2 ; unused
  121. SAVE8 RMB 2 ; unused
  122. SAVE9 RMB 2 ; unused (PSH/PULX)
  123. COLN RMB 2 ; :
  124. SEMI RMB 2 ; ;
  125. LESS RMB 2 ; <
  126. EQAL RMB 2 ; =
  127. GRRT RMB 1 ; >
  128. DECB_1 RMB 1
  129. *
  130. DECBUF RMB 4
  131. LASTD RMB 1
  132. DELIM RMB 1
  133. LINLEN EQU 72
  134. LINBUF RMB LINLEN+1
  135. BUFOFF EQU LINBUF-ZERO ; Unmagic 87. Some assemblers will cough at this.
  136. *
  137. ORG $43F1
  138. STACK RMB 1
  139. *
  140. ORG $4400
  141. MI RMB 4 ; INTERUPT VECTORS
  142. NMI RMB 4
  143. PRGM EQU * ; PROGRAM STARTS HERE
  144. * Must have some RAM here.
  145. *
  146. ORG $4C00
  147. *
  148. * The COLD boot can be removed or ignored to restore the original behavior,
  149. * but if you do that don't forget to set & (AMPR) and * (STAR) values
  150. * by hand immediately after STARTing.
  151. *
  152. * Also, instead of PROBEing, if you know the limits for a particular ROM
  153. * application, you can set STAR directly:
  154. * LDX #PRGM
  155. * STX AMPR
  156. * LDX #RAMLIM
  157. * STX STAR
  158. * START ...
  159. *
  160. COLD STS STKMRK ; Mark the stack,
  161. * LDS #STACK ; but use BASIC's stack. (S on 6800 points to next free byte.)
  162. * JSR TRMINI
  163. LDX #PRGM ; initialize program area base
  164. STX AMPR
  165. LDAA #$5A ; Probe RAM limit
  166. LDAB #$A5
  167. BRA PROBET
  168. PROBE STAA 0,X
  169. CMPA 0,X
  170. BNE NOTRAM
  171. STAB 0,X
  172. CMPB 0,X
  173. BNE NOTRAM
  174. INX ; all bits seem to be R/W.
  175. INC $401F ; DBG
  176. PROBET CPX #COLD
  177. BHI PROBE ; CPX on 6801 works right.
  178. NOTRAM DEX
  179. STX STAR
  180. START
  181. * LDS #STACK ; re-initialize at beginning of each evaluate
  182. LDS STKMRK ; from mark instead of constant
  183. DEC $401E ; DBG
  184. CLRA ; NUL delimiter
  185. LDX #OKM
  186. BSR STRGT
  187. *
  188. LOOP CLRA
  189. STAA DOLR
  190. STAA DOLR+1
  191. JSR CVTLN
  192. BCC STMNT ; NO LINE# THEN EXEC
  193. BSR EXEC
  194. BEQ START
  195. *
  196. LOOP2 BSR FIND ; FIND LINE
  197. EQSTRT BEQ START ; IF END THEN STOP
  198. LDX 0,X ; LOAD REAL LINE #
  199. STX DOLR ; SAVE IT
  200. LDX SAVLIN ; GET LINE
  201. INX ; BUMP PAST LINE #
  202. INX ; BUMP PAST LINE #
  203. INX ; BUMP PAST SPACE
  204. BSR EXEC ; EXECUTE IT
  205. BEQ LOOP3 ; IF ZERO, CONTINUE
  206. LDX SAVLIN ; FIND LINE
  207. LDX 0,X ; GET IT
  208. CPX DOLR ; HAS IT CHANGED?
  209. BEQ LOOP3 ; IF NOT GET NEXT
  210. *
  211. INX ; INCREMENT OLD LINE#
  212. STX EXCL ; SAVE FOR RETURN
  213. BRA LOOP2 ; CONTINUE
  214. *
  215. LOOP3 BSR FND3 ; FIND NEXT LINE
  216. BRA EQSTRT ; CONTINUE
  217. *
  218. EXEC STX OPRLIN ; EXECUTE LINE
  219. JSR VAR2
  220. INX
  221. *
  222. SKIP LDAA 0,X ; GET FIRST TERM
  223. BSR EVIL ; EVALUATE EXPRESSION
  224. OUTX LDX DOLR ; GET LINE #
  225. RTS
  226. *
  227. EVIL CMPA #$22 ; IF " THEN BRANCH
  228. BNE EVALU
  229. INX
  230. STRGT JMP STRING ; TO PRINT IT
  231. *
  232. STMNT STX EDTLIN ; SAVE LINE #
  233. STD DOLR
  234. LDX DOLR
  235. BNE SKP2 ; IF LINE# <> 0
  236. *
  237. LDX #PRGM ; LIST PROGRAM
  238. LST2 CPX AMPR ; END OF PROGRAM
  239. BEQ EQSTRT
  240. STX SAVLIN ; LINE # FOR CVDEC
  241. LDD 0,X
  242. JSR PRNT2
  243. LDX SAVLIN
  244. INX
  245. INX
  246. JSR PNTMSG
  247. JSR CRLF
  248. BRA LST2
  249. *
  250. NXTXT LDX SAVLIN ; GET POINTER
  251. INX ; BUMP PAST LINE#
  252. LOOKAG INX ; FIND END OF LINE
  253. TST 0,X
  254. BNE LOOKAG
  255. INX
  256. RTS
  257. *
  258. FIND LDX #PRGM ; FIND LINE
  259. FND2 STX SAVLIN
  260. CPX AMPR
  261. BEQ RTS1
  262. * LDAA 1,X ; almost missed this.
  263. * SUBA DOLR+1 ; This was necessary because no SUBD
  264. * LDAA 0,X ; and CPX does not affect C flag on 6800
  265. * SBCA DOLR
  266. * PSHB ; B does not seem to be in use.
  267. LDD 0,X ; Use D because we think we want to keep X.
  268. SUBD DOLR
  269. * PULB
  270. BCC SET
  271. FND3 BSR NXTXT
  272. BRA FND2
  273. *
  274. SET LDAA #$FF ; SET NOT EQUAL
  275. RTS1 RTS
  276. *
  277. EVALU JSR EVAL ; EVALUATE LINE
  278. PSHB
  279. PSHA
  280. LDX OPRLIN
  281. JSR CONVP
  282. PULA
  283. CMPB #'$ ; STRING?
  284. BNE AR1
  285. PULB
  286. JMP OUTCH ; THEN PRINT IT
  287. AR1 SUBB #'? ; PRINT?
  288. BNE AR11 ; was out of range.
  289. JMP PRNT ; THEN DO IT
  290. * BEQ PRNT ; When we bring it back within range.
  291. AR11 INCB ; MACHINE LANGUAGE?
  292. PULB
  293. BNE AR2
  294. SWI ; THEN INTERUPT
  295. *
  296. AR2 STD 0,X ; STORE NEW VALUE
  297. ADDD QUITE ; RANDOMIZER
  298. STD QUITE
  299. RTS
  300. *
  301. SKP2 BSR FIND ; FIND LINE
  302. BEQ INSRT ; IF NOT THERE
  303. LDX 0,X ; THEN INSERT
  304. CPX DOLR ; NEW LINE
  305. BNE INSRT
  306. *
  307. BSR NXTXT ; SETUP REGISTERS
  308. * LDS SAVLIN ; FOR DELETE
  309. STX SRC
  310. LDX SAVLIN
  311. STX DST
  312. *
  313. DELT LDX SRC
  314. CPX AMPR ; DELETE OLD LINE
  315. BEQ FITIT
  316. LDAA 0,X
  317. INX
  318. STX SRC
  319. * PSHA
  320. * INX
  321. * INS
  322. * INS
  323. LDX DST
  324. STA 0,X
  325. INX
  326. STX DST
  327. BRA DELT
  328. *
  329. * FITIT STS AMPR ; STORE NEW END
  330. FITIT LDX DST
  331. STX AMPR ; STORE NEW END
  332. *
  333. INSRT LDX EDTLIN ; COUNT NEW LINE LENGTH
  334. LDAB #$03
  335. TST 0,X
  336. BEQ GOTIT ; IF NO LINE THEN STOP
  337. CNTLN INCB ; count bytes
  338. INX
  339. TST 0,X ; Find trailing NUL
  340. BNE CNTLN
  341. *
  342. OPEN CLRA ; CALCULATE NEW END
  343. ADDD AMPR
  344. STD INSPTR
  345. SUBD STAR
  346. BCC RSTRT ; IF TOO BIG THEN STOP
  347. LDX AMPR
  348. * LDS INSPTR ; remember that the 6800/6801 stack is postdecrement push.
  349. * STS AMPR
  350. LDD INSPTR ; remember that the 6800/6801 stack is postdecrement push.
  351. STD AMPR
  352. *
  353. * LDS AMPR
  354. STD DST
  355. INX ; SLIDE OPEN GAP
  356. SLIDE DEX ; going down
  357. STX SRC
  358. LDAB 0,X
  359. * PSHB ; stack blast it
  360. LDX DST
  361. STAB 0,X ; mimic 6800 push
  362. DEX
  363. STX DST
  364. LDX SRC
  365. CPX SAVLIN
  366. BHI SLIDE
  367. *
  368. * DON LDS DOLR ; STORE LINE #
  369. * STS 0,X
  370. DON LDD DOLR ; STORE LINE #
  371. STD 0,X
  372. STX DST ; will skip by offset store
  373. * LDS EDTLIN ; GET NEW LINE
  374. * DES ; pre-increment
  375. LDD EDTLIN ; GET NEW LINE
  376. STD SRC
  377. *
  378. *MOVL INX ; INSERT NEW LINE (skip over LINE # hi byte)
  379. * PULB
  380. * STAB 1,X ; (skips over low byte, BTW)
  381. MOVL LDX SRC
  382. LDAB 0,X
  383. INX
  384. STX SRC
  385. LDX DST
  386. INX ; skip over what was already stored (too tricky for words).
  387. STX DST
  388. STAB 1,X ; note offset store
  389. BNE MOVL ; until NUL stored
  390. *
  391. GOTIT
  392. * LDS #STACK ; Ready for a new line of input.
  393. LDS STKMRK ; restore from mark
  394. JMP LOOP
  395. *
  396. RSTRT JMP START ; warm start over
  397. *
  398. PRNT PULB ; PRINT DECIMAL
  399. PRNT2 LDX #DECBUF ; CONVERT TO DECIMAL
  400. STX CNVPTR
  401. LDX #PWRS10
  402. CVD1 PSHX
  403. LDX 0,X
  404. STX VARADR
  405. LDX #VARADR
  406. JSR DIVIDE
  407. PSHA
  408. LDX CNVPTR
  409. LDAA DIVQUO+1
  410. ADDA #'0
  411. STAA 0,X
  412. PULA
  413. INX
  414. STX CNVPTR
  415. PULX
  416. INX
  417. INX
  418. TST 1,X
  419. BNE CVD1
  420. *
  421. LDX #DECB_1
  422. COM 5,X ; ZERO SUPPRESS
  423. ZRSUP INX
  424. LDAB 0,X
  425. CMPB #'0
  426. BEQ ZRSUP
  427. COM LASTD
  428. *
  429. PNTMSG CLRA ; ZERO FOR DELIM
  430. STRTMS STAA DELIM ; STORE DELIMTER
  431. *
  432. OUTMSG LDAB 0,X ; GENERAL PURPOSE PRINT
  433. INX
  434. CMPB DELIM
  435. BEQ CTLC
  436. JSR OUTCH
  437. BRA OUTMSG
  438. *
  439. CTLC JSR POLCAT ; POL FOR CHARACTER
  440. BCC RTS2
  441. BSR INCH2
  442. CMPB #BREAK ; BREAK KEY?
  443. BEQ RSTRT
  444. *
  445. INCH2 JMP INCH
  446. *
  447. STRING BSR STRTMS ; PRINT STRING LITERAL
  448. LDAA 0,X
  449. CMPA #';
  450. BEQ OUTD
  451. JMP CRLF
  452. *
  453. EVAL BSR GETVAL ; EVALUATE EXPRESSION
  454. *
  455. NXTRM PSHA
  456. LDAA 0,X ; END OF LINE?
  457. BEQ OUTN
  458. CMPA #')
  459. OUTN PULA
  460. BEQ OUTD
  461. BSR TERM
  462. LDX PARSET
  463. BRA NXTRM
  464. *
  465. TERM PSHA ; GET VALUE
  466. PSHB
  467. LDAA 0,X
  468. PSHA
  469. INX
  470. BSR GETVAL
  471. STD EVALPT
  472. STX PARSET
  473. LDX #EVALPT
  474. PULA
  475. PULB
  476. *
  477. CMPA #'* ; SEE IF *
  478. BNE EVAL2
  479. PULA ; MULTIPLY
  480. MULTIP STD MPLIER ; 2'S COMPLEMENT
  481. LDAB #$10
  482. STAB MLDVCT
  483. CLRA
  484. CLRB
  485. *
  486. MULT LSR MPLIER
  487. ROR MPLIER+1
  488. BCC NOAD
  489. MULTI ADDD 0,X
  490. NOAD ASL 1,X
  491. ROL 0,X
  492. DEC MLDVCT
  493. BNE MULT ; LOOP TIL DONE
  494. RTS2 RTS
  495. *
  496. GETVAL JSR CVBIN ; GET VALUE
  497. BCC OUTV
  498. CMPB #'? ; OF LITERAL
  499. BNE VAR
  500. PSHX ; OR INPUT
  501. JSR INLN
  502. BSR EVAL
  503. PULX
  504. OUTD INX
  505. OUTV RTS
  506. *
  507. VAR CMPB #'$ ; OR STRING
  508. BNE VAR1
  509. BSR INCH2
  510. CLRA
  511. INX
  512. RTS
  513. *
  514. VAR1 CMPB #'(
  515. BNE VAR2
  516. INX
  517. BRA EVAL
  518. *
  519. VAR2 BSR CONVP ; OR VARIABLE
  520. LDD 0,X ; OR ARRAY ELEMENT
  521. LDX VARADR ; LOAD OLD INDEX
  522. RTS
  523. *
  524. ARRAY JSR EVAL ; LOCATE ARRAY ELEMENT
  525. ASLD
  526. ADDD AMPR
  527. BRA PACK
  528. *
  529. CONVP LDAB 0,X ; GET LOCATION
  530. INX
  531. PSHB
  532. CMPB #':
  533. BEQ ARRAY ; OF VARIABLE OR
  534. CLRA ; ARRAY ELEMENT
  535. ANDB #$3F ; mask out-of-variable-range
  536. ADDB #$02 ; bump past "interrupt vectors"
  537. ASLB ; make into offset (would be address in DP in original)
  538. ADDD #ZERO ; The 6801 can do this right.
  539. *
  540. PACK STX VARADR ; STORE OLD INDEX
  541. STD CNVPTR
  542. LDX CNVPTR ; LOAD NEW INDEX
  543. PULB
  544. RTS
  545. *
  546. EVAL2 CMPA #'+ ; ADDITION
  547. BNE EVAL3
  548. PULA
  549. ADD ADDD 0,X
  550. RTS
  551. *
  552. EVAL3 CMPA #'- ; SUBTRACTION
  553. BNE EVAL4
  554. PULA
  555. SUBTR SUBD 0,X
  556. RTS
  557. *
  558. EVAL4 CMPA #'/ ; SEE IF IT'S DIVIDE
  559. BNE EVAL5
  560. PULA
  561. BSR DIVIDE
  562. STD REMN
  563. LDD DIVQUO
  564. RTS
  565. *
  566. EVAL5 SUBA #'= ; SEE IF EQUAL TEST
  567. BNE EVAL6
  568. PULA
  569. BSR SUBTR
  570. BNE NOTEQ
  571. TSTB
  572. BEQ EQL
  573. NOTEQ LDAB #$FF
  574. EQL BRA COMBOUT
  575. *
  576. EVAL6 DECA ; SEE IF LESS THAN TEST
  577. PULA
  578. BEQ EVAL7
  579. *
  580. SUB2 BSR SUBTR
  581. ROLB
  582. COMOUT CLRA
  583. ANDB #$01
  584. RTS
  585. *
  586. EVAL7 BSR SUB2 ; GT TEST
  587. COMBOUT COMB
  588. BRA COMOUT
  589. *
  590. PWRS10 FCB $27 ; 10000
  591. FCB $10
  592. FCB $03 ; 1000
  593. FCB $E8
  594. FCB $00 ; 100
  595. FCB $64
  596. FCB $00 ; 10
  597. FCB $0A
  598. FCB $00 ; 1
  599. FCB $01
  600. *
  601. DIVIDE CLR MLDVCT ; DEVIDE 16-BITS
  602. GOT INC MLDVCT
  603. ASL 1,X
  604. ROL 0,X
  605. BCC GOT
  606. ROR 0,X
  607. ROR 1,X
  608. CLR DIVQUO
  609. CLR DIVQUO+1
  610. DIV2 BSR SUBTR
  611. BCC OK
  612. ADDD 0,X
  613. CLC
  614. BRA DIVNOC ; instead of the trick
  615. * The 6801 CPX affects all relevant flags, can't use this trick.
  616. * FCB $9C ; CPX
  617. OK SEC ; $0D
  618. DIVNOC ROL DIVQUO+1
  619. ROL DIVQUO
  620. DEC MLDVCT
  621. BEQ DONE
  622. LSR 0,X
  623. ROR 1,X
  624. BRA DIV2
  625. *
  626. TSTN LDAB 0,X ; TEST FOR NUMERIC
  627. CMPB #$3A
  628. BPL NOTDEC
  629. CMPB #'0
  630. BGE DONE
  631. NOTDEC SEC
  632. RTS
  633. DONE CLC
  634. DUN RTS
  635. *
  636. CVTLN BSR INLN
  637. *
  638. CVBIN BSR TSTN ; CONVERT TO BINARY
  639. BCS DUN
  640. CONT CLRA
  641. CLRB
  642. CBLOOP ADDB 0,X
  643. ADCA #$00
  644. SUBB #'0
  645. SBCA #$00
  646. STD CVTSUM
  647. INX
  648. PSHB
  649. BSR TSTN
  650. PULB
  651. BCS DONE
  652. ASLD
  653. ASLD
  654. ADDD CVTSUM
  655. ASLD
  656. BRA CBLOOP
  657. *
  658. INLN6 CMPB #'@ ; CANCEL
  659. BEQ NEWLIN
  660. INX ; '.'
  661. CPX #ZERO+LINLEN+2 ; (Here's part of what we had to fix for moving the variables.)
  662. BNE INLN2
  663. NEWLIN BSR CRLF
  664. *
  665. INLN LDX #ZERO+2 ; INPUT LINE FROM TERMINAL
  666. INLN5 DEX
  667. CPX #ZERO ; Make this explicit to enable variables moved out of DP.
  668. BEQ NEWLIN ; (Was implicit zero compare X from DEX, now explicit.)
  669. INLN2 JSR INCH ; INPUT CHARACTER
  670. STAB BUFOFF-1,X ; STORE IT
  671. CMPB #$5F ; BACKSPACE?
  672. BEQ INLN5
  673. *
  674. INLIN3 CMPB #$0D ; CARRIAGE RETURN
  675. BMI INLN2
  676. BNE INLN6
  677. *
  678. INLIN4 CLR BUFOFF-1,X ; CLEAR LAST CHAR
  679. LDX #LINBUF
  680. BRA LF
  681. *
  682. * CRLF JSR EPCRLF
  683. CRLF LDAB #$0D ; CARR-RET
  684. BSR OUTCH2
  685. LF LDAB #$0A ; LINE FEED
  686. OUTCH2 BRA OUTCH
  687. *
  688. OKM FCB $0D
  689. FCB $0A
  690. FCC 'OK'
  691. FCB $00
  692. *
  693. *TRMINI LDAB #40
  694. *TRMILP JSR EPCRLF
  695. * DECB
  696. * BNE TRMILP
  697. * RTS
  698. *
  699. * MC-10 BASIC ROM vectors
  700. INCHV EQU $FFDC ; Scan keyboard
  701. OUTCHV EQU $FFDE ; Write char to screen
  702. *
  703. * RECEIVER POLLING
  704. POLCAT PSHA
  705. PSHX
  706. LDX INCHV ; at any rate, don't wait.
  707. JSR 0,X ;
  708. TAB ; MC-10 ROM says NUL is not input.
  709. SEC
  710. BNE POLCATR ; Don't wait.
  711. CLC
  712. POLCATR PULX
  713. PULA
  714. RTS
  715. *POLCAT LDAB ACIACS
  716. * ASRB
  717. * RTS
  718. *
  719. * INPUT ONE CHAR INTO B ACCUMULATOR
  720. INCH BSR POLCAT
  721. INC $400F ; DBG
  722. BCC INCH ; Wait here.
  723. INC $4010 ; DBG
  724. STAB $4011 ; DBG
  725. RTS
  726. *
  727. * OUTPUT ONE CHAR
  728. OUTCH PSHA
  729. PSHX
  730. LDX OUTCHV
  731. TBA
  732. JSR 0,X
  733. PULX
  734. PULA
  735. RTS
  736. *
  737. ORG COLD
  738. *
  739. END
다운로드 Printable view

URL of this paste

Embed with JavaScript

Embed with iframe

Raw text