************************* * * * *cdebug* * * * * M6809 MONITOR FOR THE * * TRS-80 COLOR COMPUTER * * (C) 1983 BRUCE TOMLIN * * * * LAST UPDATE: * * 03/11/84 * * * ************************* ; this is position-independent code, but I gave it an ORG anyhow ORG $6000 ; -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- ; main entry (JSR to here) START LBRA MAIN0 ; -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- ; SWI vector SWIVEC LBRA SWI ; -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- ; ??? JMPVEC LBRA ENTRY ; -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- ; *** 'E' command *** ; this was a generic command to add external code CMDE RTS ; VECTOR RTS ; FOR THE RTS ; 'E' CMD ; -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- ; I think this is to allow external programs to use the ; disassembler. I think I even got it to work with a ; USR call from BASIC once. ; INPUT: ; X = code address ; Y = text buffer (32 bytes) ; OUTPUT: ; A = instruction length ; B = LF flag (instruction branches or returns) DISVEC LBRA DIS ; -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- ; I guess I put this here so programs could go "beep" BEEPER LBRA BEEP ; -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- ; OUT4HX/OUT4HD - print 4 hex nibbles ; INPUT: hex number in X or D register ; OUTPUT: D register not saved ; ; OUT2HX - print 2 hex nibbles ; INPUT: hex number in A register ; OUTPUT: A register not saved OUT4HX TFR X,D OUT4HD BSR OUT2HX TFR B,A OUT2HX STA ,-S RORA RORA RORA RORA BSR OUT1HX LDA ,S+ OUT1HX ANDA #$0F ADDA #'0' CMPA #'9' BLS OUTCHR ADDA #'A'-'9'-1 BRA OUTCHR ; -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- ; OUTCHX/OUTCHD - print 2 ASCII characters ; INPUT: characters in X or D register ; OUTPUT: B register not saved by OUTCHX ; ; OUTCHR - print 1 ASCII character ; INPUT: character in A register ; OUTPUT: all registers saved OUTCHX TFR X,D OUTCHD BSR OUTCHR TFR B,A OUTCHR PSHS X,B,A CMPA #$80 BCC OUTCH2 LDB #$20 CMPA #$20 BCS OUTCH1 LDB #$40 CMPA #$40 BCS OUTCH1 CMPA #$60 BCS OUTCH2 LDB #$60 OUTCH1 STB ,-S EORA ,S+ OUTCH2 LDX RTS if not ; -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- ; CMDERR - go here if error in a command CMDERR LBSR BEEPER ; beep LBRA MAIN ; and go back to main loop ; -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- ; DISOUT - display bottom half of screen DISOUT LDB " ; > = increment PC by one instruction DW CMDNXT-* DB "C" ; C = single step, over calls DW CMDC-* DB "I" ; I = single step, into calls DW CMDI-* DB 0 ; end of commands ; -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- ; *** 'A' command *** ; display memory in ASCII mode CMDA LDA #$FF BRA CMDH1 ; -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- ; *** 'H' command *** ; display memory in hex mode CMDH CLRA CMDH1 STA MODE,PCR RTS ; -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- ; CHKHEX - check for valid hex ASCII character ; INPUT: A = hex ASCII character (upper case only) ; OUTPUT: C-flag set if bad hex character ; C-flag clear if good hex character ; A = binary value (0-15) if good hex character CHKHEX SUBA #'0' BCS RTS2 ; branch if less than '0' ADDA #$E9 ; $E9 = -('F'-'0'-$FF) BCS RTS2 ; branch if greater than 'F' ADDA #$06 BCS HEXOK ; branch if 'A' through 'F' ADDA #$07 ; $07 = 'A'-'9'-1 BCS RTS2 ; branch if between '9' and 'A' HEXOK ADDA #$0A ; offset by 10 CLC ; return success RTS2 RTS ; -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- ; GETKEY - get key at current cursor position ; after making sure CURPOS is in range ; OUTPUT: key in A ; ; CURKEY: get a key at current cursor position ; OUTPUT: key in A ; ; NOTE: this probably needs to convert to upper case GETKEY STX ,--S ; make sure cursor is in screen range LDX CURPOS,PCR LBSR RANGE STX CURPOS,PCR LDX ,S++ CURKEY PSHS X,B CURKY1 BSR FLASH ; flash cursor BSR POLCAT ; poll keyboard BEQ CURKY1 ; loop if no key pressed LDB #$60 ; turn off flashing cursor? STB [CURPOS,PCR] ; (direct write to screen) POL3 PULS B,X,PC ; -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- ; FLASH - flash the cursor ; INPUT: none (uses CURPOS and FLASH0) ; OUTPUT: D,X not saved FLASH0 DB $0B ; $DATA$ - cursor flash counter FLASH DEC ' command *** ; increment PC by one instruction CMDNXT LDX 10,U ; get PC address LEAY DISBUF,PCR LBSR DISVEC ; disassemble one instruction LEAX A,X ; offset PC address by instr length STX 10,U ; update PC address RTS ; -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- ; *** 'Q' command *** CMDQ LBSR GETKEY SUBA #'0' LBLO MAIN CMPA #'9'-'0' LBHI MAIN STA NUMDIS,PCR RTS BADINS DB " illegal instruction ",0 STEPERR LDY #$05E0 STY CURPOS,PCR LBSR OUTSTR LBSR BEEPER LBSR GETKEY LBRA MAIN CIFLAG DB 0 ; $DATA$ - step into/over flag PULPC DB 0 ; $DATA$ - ; -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- ; *** 'C' command *** ; single step, over calls CMDC DB $86 lda #n ; -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- ; *** 'I' command *** ; single step, into calls CMDI CLRA CLR