VTL-09 ====== This is an exact transcription from Appendix E in the book: "The MC6809 Cookbook" by carl d. warren First Edition, Fourth printing Copyright (c) 1980 by TAB BOOKS Inc. Appendix E VTL-09 Listing 000001 *VTL-09 000002 *V 1.0: V 1.1 000003 *NOV 29, 1980-JAN 2, 1981 000004 *BASED ON AN ORIGINAL IMPLEMENTATION 000005 *FOR THE MITS 680B BY GARY SHANNON 000006 *AND FRANK MCCOY ORIGINAL COPYRIGHT 000007 *1977, THE COMPUTER STORE, SANTA MONICA, CA 000008 * 000009 *CONVERSION TO 6809 SOURCE LEVEL BY 000010 *PATRICK MCMULLEN AND CARL WARREN 000011 * 000012 *THIS VERSION OF VTL-09 EMPLOYS THE 000013 *THE FUNCTIONS OF THE MOTOROLA D4BUG 000014 *MONITOR USED ON THE 6809D4 EVALUATION 000015 *MODULE. (SEE APPENDEX A) 000016 * 000017 *ALTHOUGH THE ORIGINAL VERSION OF VTL, 000018 *EMPLOYED THE B REGISTER FOR TRANSFER 000019 *AS WAS THE CONVENTION IN THE MITS 000020 *MONITOR, THIS VERSION USES MOTOROLA'S 000021 *CONVENTION OF EMPLOYING THE A REGISTER. 000022 * 000023 *THE BASIC FEATURES OF VTL, AS DESCRIBED 000024 *ELSEWHERE IN THIS CHAPTER, HAVE BEEN 000025 *RETAINED. 000026 * 000027 *IMPORTANT TO NOTE IS THIS IS A PROGRAMMING 000028 *EXAMPLE. THE CODE WILL ASSEMBLE INTO A RUNNING 000029 *PROGRAM BUT DOES NOT EMPLOY ALL 6809 CODES. 000030 *THIS VERSION IS ORG AT 2000 HEX AND 000031 *IS MEANT TO BE ROMABLE. HOWEVER 000032 *NEITHER PATRICK MCMULLEN, OR CARL 000033 *WARREN GUARENTEE THE FUNCTIONAL 000034 *WORKING OF THIS MODEL, NOR DO THEY 000035 *ACCEPT ANY LIABILITIES THAT MAY ARISE 000036 *FROM ITS USE. 000037 * 000038 *DEFINE LOCATIONS IN MONITOR 000039 INCH EQU $F11E *D4BUG INECHO ROUTINE 000040 POLCAT EQU $F111 *D4BUG KYTST ROUTINE 000041 OUTCH EQU $F106 *D4BUG OUTCH ROUTINE 000042 OUTS EQU $F1A4 *D4BUG OUTS ROUTINE 000043 * 000044 *SET ASIDE FOUR BYTES FOR USER 000045 *DEFINED INTERUPT ROUTINE IF NEEDED 000046 ORG 0 000047 ZERO RMB 4 *INTERRUPT VECTOR 000048 AT RMB 2 *CANCEL & C-R 000049 * 000050 *GENERAL PURPOSE STORAGE 000051 VARS RMB 52 *VARIABLES (A-Z) 000052 BRAK RMB 2 *[ 000053 SAVE10 RMB 2 *BACK SLASH (\) 000054 000055 BRIK RMB 2 *] 000056 UP RMB 2 *^ 000057 SAVE11 RMB 2 000058 * 000059 * 000060 SAVE14 RMB 2 *SPACE CHARACTER 000061 EXCL RMB 2 *! 000062 QUOTE RMB 2 *" 000063 DOLR RMB 2 *# 1ST HALF 000064 *# 2ND HALF 000065 DOLLAR RMB 2 *$ 000066 REMN1 RMB 1 *% 1ST HALF 000067 REMN2 RMB 1 *% 2ND HALF 000068 AMPR RMB 2 *& 1ST HALF 000069 *& 2ND HALF 000070 QUITE RMB 2 *' 1ST HALF 000071 *' 2ND HALF 000072 PAREN RMB 2 *( 000073 PARIN RMB 2 *) 000074 STAR RMB 2 *1ST HALF 000075 *2ND HALF 000076 PLUS RMB 2 *+ 000077 COMA RMB 2 *, 000078 MINS RMB 2 *- 000079 PERD RMB 2 *. 000080 SLASH RMB 2 */ 000081 * 000082 SAVE0 RMB 2 000083 SAVE1 RMB 2 000084 000085 SAVE2 RMB 2 000086 000087 SAVE3 RMB 2 000088 000089 SAVE4 RMB 2 000090 000091 SAVE5 RMB 2 000092 SAVE6 RMB 2 000093 000094 SAVE7 RMB 2 000095 SAVE8 RMB 2 000096 SAVE9 RMB 2 000097 000098 COLN RMB 2 *: 000099 SEMI RMB 2 *; 000100 LESS RMB 2 *< 000101 EQAL RMB 2 *= 000102 GRAT RMB 1 *> 000103 DECBUF-1RMB 000104 * 000105 DECBUF RMB 4 000106 LASTD RMB 1 000107 DELIM RMB 1 000108 LINEBUF RMB 73 *LINE LENGTH +1 000109 * 000110 STACK EQU $F1 *SPACE FOR MONITOR STORAGE 000111 * 000112 ORG $100 000113 000114 000115 PRGM $ *PROGRAM STARTS HERE 000116 * 000117 ORG $2000 *BEGINNING OF VTL-09 000118 * 000119 START LDU #STACK *LOAD THE STACK 000120 CLR B 000121 LDX #OKM 000122 BSR STRGT 000123 * 000124 LOOP CLR B 000125 STB DOLR 000126 STB DOLR+1 000127 JSR CVTLN 000128 BCC STMNT *NO LINE # THEN EXECUTE 000129 BSR EXEC 000130 BEQ START 000131 * 000132 LOOP2 BSR FIND *FIND LINE 000133 EQSTRT BEQ START *IF END THEN STOP 000134 LDX 0,X *LOAD REAL LINE # 000135 STX DOLR *SAVE IT 000136 LDX SAVE11 *GET LINE 000137 LEAX 3 *BUMP PAST LINE # 000138 000139 000140 BSR EXEC *EXECUTE IT 000141 BEQ LOOP3 *IF ZERO CONTINUE 000142 LDX SAVE11 *FIND LINE # 000143 JSR CMPR *HAS IT CHANGED ? 000144 BEQ LOOP3 *IF NOT GET NEXT 000145 * 000146 LDX 0,X 000147 LEAX 1 *INCREMENT OLD LINE ## 000148 STX EXCL *SAVE FOR RETURN 000149 BCC LOOP2 *CONTINUE 000150 * 000151 LOOP3 BSR FND3 *FIND NEXT LINE 000152 BRA EQSTRT *CONTINUE 000153 * 000154 EXEC STX SAVE7 *EXECUTE LINE 000155 JSR VAR2 000156 LEAX 1 000157 * 000158 SKIP LDB 0,X *GET FIRST TERM 000159 BSR EVIL *EVALUATE EXPRESSION 000160 OUTX LDX DOLR *GET LINE # 000161 RTS 000162 * 000163 EVIL CMP B #":" *IF : THEN BRANCH 000164 BNE EVALU 000165 LEAX 1 000166 STRGT JMP STRNG *TO PRINT IT 000167 * 000168 STMNT STX SAVE8 *SAVE LINE # 000169 STD DOLR 000170 TFR D,X 000171 000172 BNE SKP2 *IF LINE# <> 0 000173 000174 * 000175 LDX #PRGM *LIST PROGRAM 000176 LST2 CMPX AMPR *END OF PROGRAM 000177 LBEQ START 000178 STX SAVE11 *LINE# FOR CVDEC 000179 BSR CMPR 000180 JSR PRNT2 000181 LDX SAVE11 000182 LEAX 2 000183 000184 JSR PNTMSG 000185 JSR CRLF 000186 BRA LST2 000187 * 000188 NXTXT LDX SAVE11 *GET POINTER 000189 LEAX 1 *BUMP PAST LINE# 000190 LOOKAG LEAX 1 000191 TST 0,X 000192 BNE LOOKAG 000193 LEAX 1 000194 SET LDB #$FF 000195 RTS 000196 * 000197 FIND LDX #$PRGM *FIND LINE# 000198 FND2 STX SAVE11 000199 CMPX AMPR 000200 BEQ RTS1 *GOES TO AN RTS 000201 BSR CMPR 000202 BCC SET 000203 FND3 BSR NXTXT 000204 BRA FND2 000205 * 000206 EVALU JSR EVAL *EVALUATE LINE 000207 PSHU A 000208 PSHU B 000209 LDX SAVE11 000210 JSR CONVP 000211 PULU B 000212 CMP A #"$" *STRING? 000213 BNE AR1 000214 PULU A 000215 JMP OUTCH *THEN PRINT IT 000216 * 000217 AR1 SUB A #"?" *PRINT ? 000218 BEQ PRNT *THEN DO IT 000219 INC A *MACHINE LANGUAGE ? 000220 PUL A 000221 BNE AR2 000222 SWI *THEN INTERRUPT 000223 AR2 STD 0,X *STORE NEW VALUE 000224 000225 ADDD QUITE *RANDOMIZER 000226 000227 STD QUITE 000228 000229 * 000230 CMPR LDD 0,X 000231 000232 CMPD DOLR 000233 000234 000235 RTS1 RTS 000236 * 000237 SKP2 BSR FIND *FIND LINE 000238 BEQ INSRT *IF NOT THERE 000239 LDX 0,X *THEN INSERT 000240 CMPX DOLR *NEW LINE 000241 BNE INSTR 000242 * 000243 BSR NXTXT *SETUP REGISTERS 000244 LDY SAVE11 *FOR DELETE 000245 DELT CMPX AMPR *DELETE OLD LINE 000246 BEQ FITIT 000247 LDB 0,X+ *AUTO INCREMENT 000248 STB 0,Y+ *AUTO INCREMENT 000249 000250 000251 000252 BRA DELT 000253 * 000254 FITIT STY AMPR *STORE NEW END 000255 * 000256 INSTR LDX SAVE8 *COUNT NEW LINE LENGTH 000257 LDA #$3 000258 TST 0,X 000259 BEQ GOTIT *IF NO LINE THEN STOP 000260 CNTLN INC A 000261 INX 000262 TST 0,X 000263 BNE CNTLN 000264 OPEN CLR B *CALCULATE NEW END 000265 000266 ADDD AMPR 000267 STD SAVE10 000268 000269 000270 SUBD STAR 000271 BCC RSTRT *IF TOO BIG THEN STOP 000272 LDX AMPR 000273 LDU SAVE10 000274 STU AMPR 000275 * 000276 LEAX 1 *SLIDE OPEN GAP 000277 SLIDE LEAX -1 000278 LDA 0,X 000279 PSHU A 000280 CMPX SAVE11 000281 BNE SLIDE 000282 * 000283 DON LDU DOLR *STORE LINE # 000284 STU 0,X 000285 LDU SAVE8 *GET NEW LINE 000286 LEAU -1 000287 * 000288 MOVL PULU A *INSERT NEW LINE 000289 000290 STA 1,X+ 000291 BNE MOVL 000292 * 000293 GOTIT LDU #STACK 000294 JMP LOOP 000295 * 000296 000297 * 000298 PRNT PULU A *PRINT DECIMAL 000299 PRNT2 LDX #DECBUF *CONVERT TO DECIMAL 000300 STX SAVE4 000301 LDX #PWRS10 000302 CVD1 STX SAVE5 000303 LDX 0,X 000304 STX SAVE6 000305 LDX #SAVE6 000306 JSR DIVIDE 000307 PSHU B 000308 LDX SAVE4 000309 LDB SAVE+1 000310 ADD B #"0" 000311 STB 0,X 000312 INX 000313 STX SAVE4 000314 LDX SAVE5 000315 PULU B 000316 000317 000318 TST 0,X++ 000319 BNE CVD1 000320 * 000321 LDX #DECBUF-1 000322 COM 5,X *ZERO SUPPRESS 000323 ZRSUP LDA #"0" 000324 LEAX 1 000325 CMP A 0,X 000326 BEQ ZRSUP 000327 COM LASTD 000328 * 000329 PNTMSG CLR B *ZERO FOR DELIM 000330 STRTMS STB DELIM *STORE DELIMITER 000331 * 000332 OUTMSG LDA 0,X+ *GENERAL PURPOSE PRINT 000333 000334 CMP A DELIM 000335 BEQ CTLC 000336 JSR OUTCH 000337 BRA OUTMSG 000338 CTLC JSR POLCAT *POL FOR CHARACTER 000339 BMI RTS2 000340 000341 CMP A #3 *CONTROL-C 000342 LBEQ START 000343 * 000344 INCH2 JMP INCH 000345 * 000346 STRNG BSR STRTMS *PRINT STRING LITERAL 000347 LDB 0,X 000348 CMP B #";" 000349 BEQ OUTD 000350 CRLF2 JMP CRLF 000351 * 000352 EVAL BSR GETVAL *EVALUATE EXPRESSION 000353 * 000354 NXTRM PSHU B 000355 LDB 0,X *END OF LINE ? 000356 BEQ OUTN 000357 CMP B #")" 000358 OUTN PULU B 000359 BEQ OUTD 000360 BSR TERM 000361 LDX SAVE0 000362 BRA NXTRM 000363 * 000364 TERM PSHU D *GET VALUE 000365 000366 LDB 0,X+ 000367 PSHU B 000368 000369 BSR GETVAL 000370 STD SAVE3 000371 000372 STX SAVE0 000373 TFR D,X 000374 PULU D 000375 000376 * 000377 CMP B #"*" *SEE IF AN ASTERISK (*) 000378 BNE EVAL2 000379 PULU B *MULTIPLY 000380 MULTIP STD SAVE2 *2'S COMPLEMENT 000381 000382 LDA #16 000383 STA SAVE1 000384 CLR B 000385 CLR A 000386 * 000387 MULT LSR SAVE2 000388 ROR SV2+1 000389 BCC NOAD 000390 MULT1 BSR ADD 000391 NOAD ASL 01,X 000392 ROL 0,X 000393 DEC SAVE1 000394 BNE MULT *LOOP TIL DONE 000395 RTS2 RTS 000396 * 000397 GETVAL JSR CVBIN *GET VALUE 000398 BCC OUTV 000399 CMP A #"?" *OF LITERAL 000400 BNE VAR 000401 STX SAVE9 *OR INPUT 000402 JSR INLN 000403 BSR EVAL 000404 LDX SAVE9 000405 OUTD LEAX 1 000406 OUTV RTS 000407 * 000408 VAR CMP A #"$" *OR STRING 000409 BNE VAR1 000410 BSR INCH2 000411 CLR B 000412 LEAX 1 000413 RTS 000414 * 000415 VAR1 CMP A #"(" 000416 BNE VAR2 000417 INX 000418 BRA EVAL 000419 * 000420 VAR2 BSR CONVP *OR VARIABLE 000421 JSR CMPR *OR ARRAY ELEMENT 000422 LDX SAVE6 *LOAD OLD INDEX 000423 RTS 000424 * 000425 ARRAY BSR EVAL *LOCATE ARRAY ELEMENT 000426 ASL A 000427 ROL B 000428 000429 ADDD AMPR 000430 BRA PACK 000431 * 000432 CONVP LDA 0,X+ *GET LOCATION 000433 000434 PSHU A 000435 CMP A #":" 000436 BEQ ARRAY *OF VARIABLE OR 000437 CLR B *ARRAY ELEMENT 000438 AND A #$3F 000439 ADD A #2 000440 ASL A 000441 * 000442 PACK STX SAVE6 *STORE OLD INDEX 000443 STD SAVE4 000444 000445 TFR D,X *LOAD NEW INDEX 000446 PULU A 000447 RTS 000448 * 000449 EVAL2 CMP B #"+" *ADDITION 000450 BNE EVAL3 000451 PULU B 000452 ADD ADDD 0,X 000453 000454 RTS 000455 * 000456 EVAL3 CMP B #"-" *SUBTRACTION 000457 BNE EVAL4 000458 PULU B 000459 SUBTR SUBD 0,X 000460 000461 RTS 000462 * 000463 EVAL4 CMPB #"/" *SEE IF IT'S DIVIDE 000464 BNE EVAL5 000465 PULU B 000466 BSR DIVIDE 000467 STD REMN1 000468 000469 LDD SAVE2 000470 000471 RTS 000472 * 000473 EVAL5 SUB B #"=" *SEE IF EQUAL TEST 000474 BNE EVAL6 000475 PULU B 000476 BSR SUBTR 000477 BNE NOTEQ 000478 TST A 000479 BEQ EQL 000480 NOTEQ LDB #$FF 000481 EQL BRA COMBOUT 000482 * 000483 EVAL6 DEC B *SEE IF LESS THAN TEST 000484 PULU B 000485 BEQ EVAL7 000486 * 000487 SUB2 BSR SUBTR 000488 ROL A 000489 COMOUT CLR B 000490 AND A #1 000491 RTS 000492 * 000493 EVAL7 BSR SUB2 *GT TEST 000494 COMBOUT COM A 000495 BRA COMOUT 000496 * 000497 PWRS10 FCB $27 *10000 000498 FCB $10 000499 FCB 3 *1000 000500 FCB $E8 000501 FCB 0 *100 000502 FCB 100 000503 FCB 0 *10 000504 FCB 10 000505 FCB 0 *1 000506 FCB 1 000507 * 000508 DIVIDE CLR SAVE1 *DIVIDE 16-BITS 000509 GOT INC SAVE1 000510 ASL 1,X 000511 ROL 0,X 000512 BCC GOT 000513 ROR 0,X 000514 ROR 1,X 000515 CLR SAVE2 000516 CLR SAVE+2 000517 DIV2 BSR SUBTR 000518 BCC OK 000519 BSR ADD 000520 ANDCC #$FE *CLEAR CARRY 000521 BRA $+2 *SKIP NEXT INSTRUCTION 000522 OK ORCC #1 000523 ROL SAVE2+1 000524 ROL SAVE2 000525 DEC SAVE1 000526 BEQ DONE 000527 LSR 0,X 000528 ROR 1,X 000529 BRA DIV2 000530 * 000531 TSTN LDA 0,X *TEST FOR NUMERIC 000532 CMP A #$3A 000533 BPL NOTDEC 000534 CMP A #"0" 000535 BGE DONE 000536 NOTDEC ORCC #1 *SET CARRY 000537 RTS 000538 DONE ANDCC #$FE *CLEAR CARRY 000539 DUN RTS 000540 * 000541 CVTLN BSR INLN 000542 * 000543 CVBIN BSR TSTN *CONVERT TO BINARY 000544 BCS DUN 000545 CONT CLR B 000546 CLR A 000547 CBLOOP ADD A 0,X 000548 ADC B 0,X 000549 SUBD #"0" 000550 000551 STD SAVE1 000552 000553 LEAX 1 000554 PSHU A 000555 BSR TSTN 000556 PULU A 000557 BCS DONE 000558 ASL A 000559 ROL B 000560 ASL A 000561 ROL B 000562 000563 ADDD SAVE1 000564 ASL A 000565 ROL B 000566 BRA CBLOOP 000567 * 000568 INLNG CMP A #$40 *CANCEL 000569 BEQ NEWLN 000570 LEAX 1 000571 CMPX #74 *LINE LENGTH +2 000572 BNE INLN2 000573 NEWLIN BSR CRLF 000574 * 000575 INLN LDX #2 *INPUT LINE FROM TERMINAL 000576 INLN5 LEAX -1 000577 BEQ NEWLIN 000578 * 000579 INLN2 BSR INCH *INPUT CHARACTER 000580 STA $87,X *STORE IT 000581 CMP A #$5F *BACKSPACE ? 000582 BEQ INLN5 000583 * 000584 INLN3 CMP A #$0D *CARRIAGE RETURN 000585 BMI INLN2 000586 BNE INLN6 000587 * 000588 INLN4 CLR $87,X *CLEAR LAST CHARACTER 000589 LDX #LINBUF 000590 BRA LF 000591 CRLF LDA #$0D *CARRIAGE RETURN 000592 BSR OUTCH2 000593 LF LDA #$0D *LINE-FEED 000594 OUTCH2 JMP OUTCH 000595 * 000596 OKM FCB $0D,$0A,"O","K",0 *OK MESSAGE 000597 END 000598 000599 * 000600 * THE CODE THAT HAS BEEN PRESENTED, REPRESENTS 000601 * THE VARIOUS METHODS OF CODING FOR A 6809. 000602 * WHAT WE HAVE ATTEMPTED TO SHOW, IS HOW 6800 000603 * TECHNIQUES, AND 6809 TECHNIQUES MAY BE 000604 * COMBINED IN A SOURCE DOCUMENT THAT CAN BE 000605 * ASSEMBLED. 000606 * 000607 *