INCHAR EQU $ffcd OUTSTRG EQU $ffc7 OUT1BYT EQU $ffbb OUTA EQU $ffb8 ESC EQU 27 CRLF EQU 13 EOT EQU 04 BKSPC EQU 08 TAB EQU 09 DATA1 EQU $c500 OPADDR EQU $C504 DATA2 EQU $C505 DATAEND EQU $c509 RESULT EQU $c509 REND EQU $c50d PIOC EQU $1002 PORTB EQU $1004 PORTC EQU $1005 DDRC EQU $1007 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ORG $c600 PROMPT FCB #CRLF FCC "PLEASE USE THE FORM AAAAAAAA _ AAAAAAAA" FCB #CRLF FCC "WHERE _ CAN BE ANY VALID OPERATOR ( + - * / )" FCB #CRLF FCC "USE enter TO SUBMIT AND esc TO QUIT." FCB #CRLF FCB #CRLF FCC " -> " FCB #EOT QPROMPT FCC "PROGRAM ABORTED." FCB #EOT DONE FCC " = " FCB #EOT ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ORG $C000 START LDS #$CFFF ; init the stack pointer ;----------------------------------------------------------- LDX #DATA1 ; zero the data space LDAA #0 ZEROING STA 0,X INX CPX #REND BLO ZEROING ;----------------------------------------------------------- LDX #PROMPT ; prompt the user for input JSR OUTSTRG ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; LDAA #0 ; init the registers LDAB #0 LDX #DATA1 LDY #0 ;----------------------------------------------------------- GETCHAR JSR INCHAR ; try to get char CMPA #0 ; did we get a char BEQ GETCHAR ; if not, try again CMPA #TAB ; look for illegal keys BEQ QUIT CMPA #BKSPC ; look for illegal keys BEQ QUIT CMPA #ESC ; quit if they hit escape BEQ QUIT CMPA #CRLF ; finish if they hit enter BEQ EEVAL CPX #DATAEND ; check if we're done BEQ JUNK CPX #OPADDR ; check if we're getting the opcode BEQ OPEVAL CPX #DATA2 ; check for white space after the opcode BEQ WEVAL BRA GETHEX ; else we expect a hex digit ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; QUIT LDX #QPROMPT ; display the quiting prompt JSR OUTSTRG JMP START ;----------------------------------------------------------- OPEVAL CMPA #'+' ; check for valid opcodes BEQ ADDOP CMPA #'-' BEQ SUBOP CMPA #'*' BEQ MULTOP CMPA #'/' BEQ DIVOP CMPA #' ' ; allow leading spaces BEQ GETCHAR BRA JUNK ; else it is junk ADDOP LDAA #$08 ; set the opcode BRA STORE SUBOP LDAA #$09 BRA STORE MULTOP LDAA #$0a BRA STORE DIVOP LDAA #$0b BRA STORE ;----------------------------------------------------------- WEVAL CMPA #' ' ; allow leading spaces BEQ GETCHAR BRA GETHEX ; else we expect a hex digit ;----------------------------------------------------------- EEVAL CPX #DATAEND ; check if we're done BEQ OPERATE JMP QUIT ; else quit ;----------------------------------------------------------- JUNK LDAA #BKSPC JSR OUTA ; output a backspace LDAA #' ' JSR OUTA ; output a space to erase what's there LDAA #BKSPC JSR OUTA ; output a backspace JMP GETCHAR ;----------------------------------------------------------- GETHEX CMPA #'0' ; get the hex value of the char BLO JUNK CMPA #'9' BLS NUMBER CMPA #'A' BLO JUNK CMPA #'F' BLS UCASE CMPA #'a' BLO JUNK CMPA #'f' BLS LCASE BRA JUNK ; else it is junk NUMBER SUBA #$30 ; convert from ascii to hex BRA MOD UCASE SUBA #$37 BRA MOD LCASE SUBA #$57 MOD CPY #0 BEQ HIGHEND LOWEND ABA ; else we have the low-end so add high-end from B LDY #0 ; reset the flag BRA STORE HIGHEND LSLA ; move the value into the high end LSLA LSLA LSLA TAB ; store the result in B for use next cycle INY ; set the flag JMP GETCHAR ;----------------------------------------------------------- STORE STAA 0,X ; store the data INX JMP GETCHAR ; get next chunk of data ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; OPERATE JSR ALTERA LDX #DONE ; display the result message JSR OUTSTRG LDX #RESULT ; display the result OUTR JSR OUT1BYT CPX #REND BLO OUTR JMP START ; back to be begining ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; DEBUG ;PSHX ;LDX #REND ;STAA 0,X ;JSR OUT1BYT ;PULX RTS ; display the data being moved ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; WAIT LDAA PORTC ; read port C to clear STAF bit WLOOP LDAA PIOC ; check to see if PORTC data has changed ANDA #$80 BEQ WLOOP RTS ; wait for response handshaking routine ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ALTERA LDAA #$00 STAA DDRC ; set the direction of PORTC LDAA #%00010011 STAA PIOC ; configure PORTC for Handshaking LDAA PORTC ; read PORTC to clear STAF bit ;------------------------------- OPCODE LDAA OPADDR ; send op code STAA PORTB JSR DEBUG JSR WAIT ;------------------------------- LDX #DATA1 ; send first operand OP1 LDAA 0,X STAA PORTB JSR DEBUG JSR WAIT INX CPX #OPADDR BNE OP1 ;------------------------------- LDX #DATA2 ; send second operand OP2 LDAA 0,X STAA PORTB JSR DEBUG JSR WAIT INX CPX #DATAEND BNE OP2 ;------------------------------- LDX #RESULT ; receive result RES JSR WLOOP LDAA PORTC ;STRB is fired here STAA 0,X JSR DEBUG INX CPX #REND BNE RES RTS ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;