* VTL09 * * VERY TINY LANGUAGE * V.88.06.01 BY ALEX PETERSEN * NOW AS POSITION-INDEPENDENT CODE * USE OF 6809 'MUL' 8x8 INSTRUCTION * CONSTANTS BS EQU $08 BACKSPACE CHARACTER (^H) CAN EQU $18 CANCEL INPUT CHAR. (^X) * DEFINE GENERAL STORAGES ORG 0 AT RMB 2 @ VARS RMB 52 A-Z BRAK RMB 2 [ BSLASH RMB 2 \ BRIK RMB 2 ] UP RMB 2 ^ SAVE10 RMB 2 UNDERSCORE SPACE RMB 2 SPACE EXCL RMB 2 ! QUOTE RMB 2 " POUND RMB 2 # SAVE11 RMB 2 $ REMN RMB 2 % AMPR RMB 2 & QUITE RMB 2 ' PAREN RMB 2 ( PARIN RMB 2 ) STAR RMB 2 * PLUS RMB 2 + COMA RMB 2 , MINS RMB 2 - PERD RMB 2 . SLASH RMB 2 / SAVE0 RMB 2 0 SAVE1 RMB 2 1 SAVE2 RMB 2 2 SAVE3 RMB 2 3 SAVE4 RMB 2 4 SAVE5 RMB 2 5 SAVE6 RMB 2 6 SAVE7 RMB 2 7 SAVE8 RMB 2 8 SAVE9 RMB 2 9 COLN RMB 2 COLON SEMI RMB 2 ; LESS RMB 2 < EQAL RMB 2 = GRAT RMB 2 > SAVE12 RMB 2 ? DECBUF RMB 4 LASTD RMB 1 DELIM RMB 1 LINEBUF RMB 73 STACK EQU $200 END OF STACK PRGM EQU $200 START OF PROGRAM BUFFER ORG $C100 VTL STARTS HERE START BRA START1 INCH JMP $CD15 FLEX GETCHAR POLCAT JMP $CD4E FLEX STATUS OUTCH JMP $CD18 FLEX PUTCHAR START1 LDX #PRGM STX AMPR LDX #$7FFF STX STAR CLRA TFR A,DP RSTART LDU #STACK CLRB LEAX OKM,PCR POINT TO PROMPT LBSR STRNG OUTPUT PROMPT LOOP CLR POUND CLR POUND+1 LBSR CVTLN GET INPUT INTO LINEBUFFER BCC STMNT BSR EXEC BEQ RSTART LOOP2 BSR FIND EQSTRT BEQ RSTART LDX 0,X STX POUND LDX SAVE11 LEAX 3,X BSR EXEC BEQ LOOP3 LDX SAVE11 LBSR CMPR BEQ LOOP3 LDX 0,X+ STX EXCL BCC LOOP2 LOOP3 BSR FND3 BRA EQSTRT EXEC STX SAVE7 LBSR VAR3 LEAX 1,X BSR EVIL OUTX LDX POUND RTS STMNT STX SAVE8 STD POUND TFR D,X LBNE SKP2 LDX #PRGM LST2 CMPX AMPR BEQ RSTART STX SAVE11 BSR CMPR LBSR PRNT2 LDX SAVE11 LEAX 2,X LBSR PNTMSG LBSR CRLF BRA LST2 NXTXT LDX SAVE11 LEAX 2,X LOOKAG TST 0,X+ BNE LOOKAG SET LDB #$FF RTS FIND LDX #PRGM FND2 STX SAVE11 CMPX AMPR BEQ RTS1 BSR CMPR BCC SET FND3 BSR NXTXT BRA FND2 EVIL LDB 0,X CMPB #'" BNE EVALU LEAX 1,X LBRA STRNG EVALU LBSR EVAL EVALUATE ENTIRE EXPRESSION PSHU D SAVE RESULT (D) LDX SAVE7 LBSR CONVP CMPA #'$ BNE AR0 PULU D RESTORE RESULT EXG A,B LBRA OUTCH AR0 CMPA #'_ IS IT A POKE? BNE AR1 NO, THEN PROCEED PULU D YES, THEN GET NUMBER STB [AT] POKE LSB OF ARGUMENT RTS AR1 CMPA #'^ PRINT WITHOUT CR/LF? BEQ PRNT YES, THEN BRANCH SUBA #'? PRINT WITH CR/LF? BEQ AR3 YES, THEN BRANCH INCA TEST IF CALL TO USER PROGRAM (>) PULU D FIRST RESTORE RESULT BNE AR2 NO, THEN BRANCH JSR [AT] CALL USER ROUTINE AR2 STD 0,X STORE RESULT IN VARIABLE ADDD QUITE ADD THE RANDOM NUMBER STD QUITE AND SAVE AS NEW RANDOM CMPR LDD 0,X GET RESULT INTO D CMPD POUND AND TEST AGAINST CURRENT LINE NO. RTS1 RTS AR3 PULU D GET NUMBER BACK BSR PRNT2 GO PRINT IT LBRA CRLF AND EXIT WITH A CR/LF SKP2 BSR FIND BEQ INSTR LDX 0,X CMPX POUND BNE INSTR BSR NXTXT LDY SAVE11 DELT CMPX AMPR BEQ FITIT LDB 0,X+ STB 0,Y+ BRA DELT FITIT STY AMPR INSTR LDX SAVE8 LDB #$03 TST 0,X BEQ GOTIT CNTLN INCB LEAX 1,X TST 0,X BNE CNTLN OPEN CLRA ADDD AMPR STD SAVE10 SUBD STAR LBCC RSTART LDX AMPR LDU SAVE10 STU AMPR SLIDE CMPX SAVE11 BEQ DON LDA 0,-X PSHU A BRA SLIDE DON LDU POUND STU 0,X++ LDU SAVE8 MOVL PULU A STA 0,X+ BNE MOVL GOTIT LDU #STACK LBRA LOOP PRNT PULU D PRNT2 LDX #DECBUF STX SAVE4 LEAX PWRS10+10,PCR POINT TO END OF TABLE STX SAVE12 SAVE END ADDRESS LEAX -10,X ADJUST TO START OF TABLE CVD1 STX SAVE5 LDX 0,X STX SAVE6 LDX #SAVE6 LBSR DIVIDE PSHU B LDX SAVE4 LDB SAVE2+1 ADDB #'0 STB 0,X+ STX SAVE4 LDX SAVE5 PULU B LEAX 2,X CMPX SAVE12 END OF TABLE? BNE CVD1 LDX #DECBUF-1 COM LASTD LDA #'0 ZRSUP LEAX 1,X CMPA 0,X BEQ ZRSUP COM LASTD PNTMSG CLRB STRTMSG STB DELIM OUTMSG LDA 0,X+ CMPA DELIM BEQ CTLC LBSR OUTCH BRA OUTMSG CTLC LBSR POLCAT INPUT FROM KEYBOARD? BEQ CTLCX NO, THEN EXIT LBSR INCH CMPA #$03 LBEQ RSTART CTLCX RTS NO, THEN IGNORE AND EXIT STRNG BSR STRTMSG PRINT STRING IN QUOTES LDB 0,X GET NEXT CHAR. CMPB #'; IS IT SEMICOLON? BEQ OUTD YES, THEN NO CR/LF CRLF2 LBRA CRLF NO, THEN PRINT CR/LF EVAL BSR GETVAL NXTRM PSHU B LDB 0,X BEQ OUTN CMPB #') OUTN PULU B BEQ OUTD BSR TERM LDX SAVE0 BRA NXTRM TERM PSHU D LDB 0,X+ PSHU B BSR GETVAL STD SAVE3 STX SAVE0 LDX #SAVE3 PULU B CMPB #'* LBNE EVAL2 * THE FOLLOWING 16x16 MULTIPLY ROUTINE IS TAKEN FROM * Zaks $ Labiak: Programming the 6809, p.73. * NOTE THAT THE LAST TERM, OP1HxOP2H HAS NOT BEEN * PROGRAMMED, AS ONLY THE LOWEST 16 BITS OF THE * RESULTING 32 BIT RESULT IS USED TO SAVE TIME MULTIP PULU D GET CURRENT VALUE STD SAVE2 SAVE AS OP2 CLR DECBUF+1 CLEAR BITS 16-24 OF RESULT LDA 1,X GET OP1L MUL OP1LxOP2L STD DECBUF+2 LDA 0,X OP1H LDB SAVE2+1 OP2L MUL OP1HxOP2L ADDD DECBUF+1 STD DECBUF+1 LDA 1,X OP1L LDB SAVE2 OP2H MUL OP1LxOP2H ADDD DECBUF+1 STD DECBUF+1 LDD DECBUF+2 GET 16 BIT RESULT MULTX RTS GETVAL LBSR CVBIN BCC OUTV CMPA #'? BNE VAR STX SAVE9 LBSR OUTCH LBSR INLN BSR EVAL LDX SAVE9 OUTD LEAX 1,X OUTV RTS VAR CMPA #'$ BNE VAR1 LDA #'? LBSR OUTCH LBSR INCH CLRB EXG A,B LEAX 1,X RTS VAR1 CMPA #'( BNE VAR2 LEAX 1,X BRA EVAL VAR2 CMPA #'_ IS IT A PEEK? BNE VAR3 NO, THEN BRANCH CLRA YES, FIRST CLEAR MSB LDB [AT] AND GET VALUE INTO LSB LEAX 1,X ADVANCE POINTER TO PROGRAM LINE RTS VAR3 BSR CONVP LBSR CMPR LDX SAVE6 RTS ARRAY LBSR EVAL ASLB ROLA ADDD AMPR BRA PACK CONVP LDB 0,X+ PSHU B CLRA CMPB #': BEQ ARRAY ANDB #$3F ASLB PACK STX SAVE6 TFR D,X PULU A RTS EVAL2 CMPB #'+ BNE EVAL3 PULU D ADD ADDD 0,X RTS EVAL3 CMPB #'- BNE EVAL4 PULU D SUBTR SUBD 0,X RTS EVAL4 CMPB #'/ BNE EVAL5 PULU D BSR DIVIDE STD REMN LDD SAVE2 RTS EVAL5 SUBB #'= BNE EVAL6 PULU D BSR SUBTR BEQ COMBOUT NOTEQ LDB #$FF EQL BRA COMBOUT EVAL6 DECB PULU D BEQ EVAL7 SUB2 BSR SUBTR ROLB COMOUT CLRA ANDB #$01 RTS EVAL7 BSR SUB2 COMBOUT COMB BRA COMOUT * THE FOLLOWING 16 BY 16 BIT DIVIDE ROUTINE HAS BEEN * COPIED FROM Zaks & Labiak: Programming the 6809, P.88 DIVIDE PSHU D SAVE D LDD 0,X GET DIVISOR AND TEST IT PULU D RESTORE D BNE DIV0 BRANCH IF DIVISOR ZERO LDD #$FFFF SET ALL BITS HIGH (OVERFLOW) STD SAVE2 AND SAVE VALUE BRA DIVEX DIV0 STD SAVE2 SAVE DVD LDA #16 SHIFT COUNTER IS 16 STA SAVE1 CLRA CLRB DIVD ASL SAVE2+1 SHIFT DIVIDEND AND ROL SAVE2 QUOTIENT ROLB SHIFT DIVIDEND INTO D ROLA CMPD 0,X CHECK IF DVD>DVS BLO NOSUB BRANCH IF DVD