Skip to content

Instantly share code, notes, and snippets.

@vintagechips
Created April 14, 2021 08:19
Show Gist options
  • Select an option

  • Save vintagechips/fd33131ba7f56ea29f7da5806f3e85b3 to your computer and use it in GitHub Desktop.

Select an option

Save vintagechips/fd33131ba7f56ea29f7da5806f3e85b3 to your computer and use it in GitHub Desktop.
Micro monitor for MCS8085 with assembler/disassembler.
; uMON85 SBC8085 MICRO MONITOR
;
; DEFAULT VALUE
LINSIZ EQU 26 ; SIZE OF LINE BUFFER
TXIM EQU 040H ; SIM INITIAL VALUE
;
; RESET VECTOR
ORG 0000H
RESET: LXI SP,STKBTM ; STACK SETUP
JMP MAIN ; GO MAIN
;
ORG 0008H
GETCH: JMP GETCH0
;
ORG 000CH
GETS: JMP GETS0
;
ORG 0010H
PUTCH: JMP PUTCH0
;
ORG 0014H
PUTS: JMP PUTS0
;
ORG 0018H
PUTSPC: MVI A,' '
RST PUTCH/8
RET
;
ORG 001CH
PUTB: JMP PUTB0
;
; DELAY
; D*14+25 CLKS
DELAY: DCR D ; COUNT DOWN(4CLOCKS)
JNZ DELAY ; IF NOT 0, REPEAT(10/7)
RET ; RETURN(10)+CALL(18)
;
; GET CHARACTER
; RESULT A=CHARACTER
GETCH0: PUSH B ; SAVE BC(12)
PUSH D ; SAVE DE(12)
GCST1: RIM ; READ SID(4)
ANI 80H ; MASK ALL BUT SID(7)
JZ GCST1 ; CHECK MARK(7)
GCST2: RIM ; READ SID(4)
ANI 80H ; MASK EXCEPT SID(7)
JNZ GCST2 ; WAIT FOR START(18)
;
; START 1.5BIT=469 CLKS
MVI D,29 ; DELAY CONSTANT(7/TOTAL25)
CALL DELAY ; DELAY(431/456)
MVI C,8 ; INITIAL BIT LENGS(7/463)
MVI E,0 ; INITIAL RECEIVE CHAR(7/470)
;
; RECEIVE 1BIT=312.5 CLKS
GCST3: RIM ; READ SID(4)
ANI 80H ; MASK ALL BUT SID(7/11)
MOV B,A ; TRANSMIT SID(4/15)
MOV A,E ; RESTORE CHAR IN RECEIVE(4/19)
RRC ; ROTATE RIGHT(4/23)
ORA B ; EMBED SID IN BIT7(4/27)
MOV E,A ; SAVE CHAR IN RECEIVE(4/30)
;
MVI D,16 ; DELAY CONSTANT(7/37)
CALL DELAY ; DELAY(249/286)
NOP ; DELAY(4/290)
NOP ; DELAY(4/294)
NOP ; DELAY(4/298)
DCR C ; DECREMENT BIT LENGS(4/302)
JNZ GCST3 ; REPEAT WHILE BIT LENGS!=0(10/7/312)
;
; STOP 1.5BIT=469 CLKS
MVI D,26 ; DELAY CONSTANT(7/14)
CALL DELAY ; DELAY(389/403)
MOV A,E ; RESTORE CHAR IN RECEIVE(4/407)
POP D ; RESTORE DE(10/417)
POP B ; RESTORE BC(10/427)
RET ; RETURN(10/437+45)
;
; PUT CHARACTER
; A=CHARACTER
PUTCH0: PUSH PSW ; SAVE AF
PUSH B ; SAVE BC
PUSH D ; SAVE DE
MOV B,A ; SAVE CHAR IN TRANSMIT
MVI A,TXIM OR 80H ; SET MARK
SIM ; TRANSMIT IT
MVI C,8 ; INITIAL BIT LENGS
;
; START 1BIT=312.5 CLKS
MVI A,TXIM ; START
SIM ; SEND (4)
MVI D,17 ; DELAY CONSTANT(7/11)
CALL DELAY ; DELAY(263/274)
;
; DATA 1BIT=312.5 CLKS
PCST1: MOV A,B ; RESTORE CHAR IN SEND (4/278)
RRC ; BIT0->BIT7(4/282)
MOV B,A ; SAVE CHAR(4/286)
ANI 80H ; MASK ALL BUT BIT7(7/293)
ORI TXIM ; COMBINE SIM(7/300)
NOP ; DELAY(4/304)
NOP ; DELAY(4/308)
NOP ; DELAY(4/312)
SIM ; SEND(4)
MVI D,16 ; DELAY CONSTANT(7/11)
CALL DELAY ; DELAY(249/260)
DCR C ; COUNT BIT LENGTH(4/264)
JNZ PCST1 ; REPEAT UNTIL BIT LENGTH0(10/7/274)
;
JMP $+3 ; DELAY(10/284)
JMP $+3 ; DELAY(10/294)
NOP ; DELAY(4/298)
MVI A,TXIM OR 80H ;SET MARK(4/312)
;
; STOP 1BIT=312.5 CLKS
SIM ; SEND IT(4)
MVI D,19 ; DELAY CONSTANT(7/11)
CALL DELAY ; DELAY(291/302)
JMP $+3 ; DELAY(10/312)
;
POP D ; RESTORE DE
POP B ; RESTORE BC
POP PSW ; RESTORE AF
RET
;
; MAIN ROUTINE
MAIN: LXI SP,LBUF ; STACK SETUP
MVI A,TXIM OR 80H ; SET MARK
SIM ; PUT IT
;
; OPENNING MESSAGE
LXI H,HELLO ; SET MESSAGE
CALL PUTM ; OUT IT
;
; FILL IN RAM WITH 0
LXI H,0FF00H ; START ADDRESS
INIRAM: MVI M,0 ; SET 0
INR L ; NEXT ADDRESS
JNZ INIRAM ; IF NO, THEN REPEAT
;
;LXI H,0FF00H ; INITIAL START ADDRESS
UPDADR: SHLD ADRSS ; SET IT
;
; DISPLAY PROMPT
LOOP: MVI A,'[' ; SET [
RST PUTCH/8 ; OUT IT
CALL PUTA ; OUT START ADDRESS
MVI A,']' ; SET ]
RST PUTCH/8 ; OUT IT
;
CALL GETS ; GET COMMAND LINE TO BUFFER
LXI D,LBUF ; SET DE TO BUFFER TOP
LDAX D ; GET CHAR
CPI ' ' ; SPACE?
JZ ERRCM ; THEN ERROR
ORA A ; EMPTY?
JZ LOOP ; THEN RETRY
;
; O COMMAND
COMO: CPI 'O' ; O?
JNZ COMG ; IF NOT, NEXT COMMAND
CALL GETA1 ; 第1引数取得
;
JMP UPDADR ; UPDATE START ADDRES
;
; G COMMAND
COMG: CPI 'G' ; G?
JNZ COMD ; Gでなければ次のコマンドを検査
CALL GETA1 ; 第1引数取得
;
LXI D,LOOP ; 戻りアドレスをDへ転送
PUSH D ; Dをスタックへ積む
PCHL ; ADRSSへ分岐
;
; D COMMAND
COMD: CPI 'D' ; D?
JNZ COML ; Dでなければ次のコマンドを検査
;
; CASE NO PARAMETERS
LHLD ADRSS ; 開始アドレスを取得(念のため)
INX D ; NEXT CHAR
LDAX D ; GET CHAR
CPI 0 ; NO PARAMETERS?
JZ CDST1 ; IF YES, GO CDST1
;
CALL GETA11 ; 第1引数取得
;
CDST1: MOV A,L ; 開始アドレスを16個区切りに変換1
ANI 0F0H ; 開始アドレスを16個区切りに変換2
MOV L,A ; 開始アドレスを16個区切りに変換3
SHLD ADRSS ; ADRSSを更新
SHLD ADRSE ; ADRSSを更新
CALL GETA2 ; 第2引数があれば第2引数取得
;
; DUMP
CDST2: CALL INDENT ; インデントを表示
MVI B,16
CDST21: MVI A,'+' ; '+0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F '
RST PUTCH/8
MVI A,16
SUB B
CALL PUTB1
RST PUTSPC/8
DCR B
JNZ CDST21
LXI H,ASCII ; 'ASCII'を
CALL PUTM ; 表示
;
CDST3: RST PUTSPC/8
CALL PUTA ; 先頭アドレス
PUSH H
RST PUTSPC/8
;
MVI B,16
CDST9: MOV A,M
CALL PUTB
RST PUTSPC/8
INX H
DCR B
JNZ CDST9
;
POP H
MVI B,16
CDST4: MOV A,M
SUI ' ' ; 印字不可能文字を.に置換1
CPI '~'-' '+1 ; 印字不可能文字を.に置換2
JC CDST6 ; 印字不可能文字を.に置換3
MVI A,'.'-' '; 印字不可能文字を.に置換4
CDST6: ADI ' ' ; 印字不可能文字を.に置換5
RST PUTCH/8
INX H
DCR B
JNZ CDST4
SHLD ADRSS
PUSH H
CALL PUTCRLF
LHLD ADRSE
XCHG
POP H
;
CALL CPDH
JC LOOP
MOV A,L
ORA H
JZ LOOP
JMP CDST3
;
; L COMMAND
COML: CPI 'L' ; L?
JNZ COMS ; Lでなければ次のコマンドを検査
;
; CASE NO PARAMETERS
LHLD ADRSS ; 開始アドレスを取得(念のため)
INX D ; NEXT CHAR
LDAX D ; GET CHAR
CPI 0 ; NO PARAMETERS?
JZ CLST1 ; IF YES, GO CLST1
;
CALL GETA11 ; 第1引数取得
;
CLST1: SHLD ADRSS ; ADRSSを更新
SHLD ADRSE
CALL GETA2 ; 第2引数があれば第2引数取得
;
; DIS ASSEMBLE
CLST2: CALL DASM
;
LHLD ADRSE ; DE
XCHG
LHLD ADRSS ; HL
CALL CPDH
JC LOOP
MOV A,L
ORA H
JZ LOOP
JMP CLST2
;
; S COMMAND
COMS: CPI 'S' ; S?
JNZ ASMG1 ; Sでなければ次のコマンドを検査
INX D ; 次の文字へ進む
LDAX D ; 次の文字をAに転送
CPI ' ' ; 空白?
JNZ ASMG1 ; 空白でなければASMG1へ進む
CSST8: INX D ; 次の文字へ進む
LDAX D ; GET CHAR
;
CSST1: ORA A ; 行末?
JZ LOOP ; 行末なら終了
LHLD ADRSS ; 書き込みアドレスを設定
;
; STRING
CPI 39 ; '?
JNZ CSST4 ; IF NOT, GO HEX
CSST3: INX D ; 次の文字へ進める
LDAX D ; 文字をAに取得
CPI 39 ; '?
JZ CSST2 ; 'ならこの処理を終了
ORA A ; 終端?
JZ ERRCM ; 終端ならエラー処理
MOV M,A ; HLの位置に文字を保存
INX H ; 書き込み位置を進める
SHLD ADRSS ; 開始位置を更新
JMP CSST3 ; この処理を継続
CSST2: INX D ; 'の後ろへ進める
LDAX D
CSST7: CPI ',' ; 区切り?
JZ CSST8 ; 区切りなら繰り返す
JMP LOOP ; 区切りでなければ終了
;
; HEX
CSST4: CALL GETW ; GET WORD
MOV A,L ; 16進数をAに転送
LHLD ADRSS ; 書き込み位置をHLに復帰
MOV M,A ; 書き込み位置に16進数を保存
INX H ; 書き込み位置を進める
SHLD ADRSS ; 書き込み位置を更新
LDAX D
ORA A
JZ LOOP
CPI ','
JZ CSST8
JMP ERRCM
;
; 第1引数取得
GETA1: INX D ; NEXT CHAR
GETA11: LDAX D ; GET CHAR
CPI ' ' ; SPACE?
JNZ GETA10 ; IF NOT, GO ASSEMBLER
;
INX D ; NEXT CHAR
JMP GETW ; GET WORD
GETA10: POP PSW
JMP ASMG1 ; GO ASSEMBLER
;
; 第2引数取得
GETA2: LDAX D ; 区切り文字を取得
CPI ',' ; 第2引数がある?
RNZ ; 第2引数がなければ復帰
INX D ; 次の文字へ進む
CALL GETW ; 引数の値をHLに取得
SHLD ADRSE ; ADRSEを更新
;
XCHG
LHLD ADRSS
CALL CPDH
RNC
LXI D,LBUF+2
JMP ERRCM
;
; ASSEMBLE GROUP1 OPCODE ONLY
ASMG1: LXI H,G1TBL ; SET GROUP TABLE POINTER
CALL MSRCH ; SEARCH MNEMONIC
JNC ASMG2 ; NOT FOUND? THEN NEXT GROUP
;
MOV A,M ; GET CODE
;
; SAVE SINGLE CODE IN A
SVSC: LHLD ADRSS ; GET START ADDRES
MOV M,A ; SAVE CODE
INX H ; POINT NEXT ADDRESS
JMP UPDADR ; UPDATE START ADDRES
;
; ASSEMBLE GROUP2 RST N
ASMG2: LXI H,G2TBL ; SET GROUP TABLE POINTER
CALL MSRCH ; SEARCH MNEMONIC
JNC ASMG3 ; NOT FOUND? THEN NEXT GROUP
;
CALL CHKSPC
;
LDAX D
SUI '0'
CPI 8
JNC ERRCM ; ERROR
;
A2ST1: RLC ; MOVE POSITION STEP1
RLC ; MOVE POSITION STEP2
RLC ; MOVE POSITION STEP3
ORA B ; MAKE CODE
JMP SVSC ; SAVE SINGLE CODE
;
; ASSEMBLE GROUP3 OPCODE IMM8
ASMG3: LXI H,G3TBL ; SET GROUP TABLE POINTER
CALL MSRCH ; SEARCH MNEMONIC
JNC ASMG4 ; NOT FOUND? THEN NEXT GROUP
;
CALL CHKSPC
;
SVIMM8: CALL GETW ; GET IMM16
MOV C,L ; SET IMM8
;
; SAVE 2 CODE IN BC
SV2C LHLD ADRSS ; GET START ADDRES
MOV M,B ; SAVE CODE
INX H ; POINT NEXT ADDRESS
MOV M,C ; SAVE IMM8
INX H ; POINT NEXT ADDRESS
JMP UPDADR ; UPDATE START ADDRES
;
; ASSEMBLE GROUP4 OPCODE IMM16
ASMG4: LXI H,G4TBL ; SET GROUP TABLE POINTER
CALL MSRCH ; SEARCH MNEMONIC
JNC ASMG5 ; NOT FOUND? THEN NEXT GROUP
;
CALL CHKSPC
;
SVW3C: CALL GETW ; GET IMM16
XCHG ; SET IMM16 TO DE
;
; SAVE 3 CODE IN BC
SV3C LHLD ADRSS ; GET START ADDRES
MOV M,B ; SAVE CODE
INX H ; POINT NEXT ADDRESS
MOV M,E ; SAVE IMM16 LOW
INX H ; POINT NEXT ADDRESS
MOV M,D ; SAVE IMM16 HIGH
INX H ; POINT NEXT ADDRESS
JMP UPDADR ; UPDATE START ADDRES
;
; ASSEMBLE GROUP5 OPCODE R(DDD)
ASMG5: LXI H,G5TBL ; SET GROUP TABLE POINTER
CALL MSRCH ; SEARCH MNEMONIC
JNC ASMG6 ; NOT FOUND? THEN NEXT GROUP
;
CALL CHKSPC
;
LDAX D ; GET REGISTER NAME
CALL GETR ; CONVERT TO REGISTER NUMBER
JMP A2ST1
;
; ASSEMBLE GROUP6 OPCODE R(SSS)
ASMG6: LXI H,G6TBL ; SET GROUP TABLE POINTER
CALL MSRCH ; SEARCH MNEMONIC
JNC ASMG7 ; NOT FOUND? THEN NEXT GROUP
;
CALL CHKSPC
;
SVSSS: LDAX D ; GET REGISTER NAME
CALL GETR ; CONVERT TO REGISTER NUMBER
ORA B ; MAKE CODE
JMP SVSC ; SAVE SINGLE CODE
;
; GROUP7 OPCODE R(DDD),R(SSS)
ASMG7: LXI H,G7TBL ; SET GROUP TABLE POINTER
CALL MSRCH ; SEARCH MNEMONIC
JNC ASMG8 ; NOT FOUND? THEN NEXT GROUP
;
CALL CHKSPC
;
LDAX D ; GET REGISTER NAME
CALL GETR ; CONVERT TO REGISTER NUMBER
RLC ; MOVE POSITION STEP1
RLC ; MOVE POSITION STEP2
RLC ; MOVE POSITION STEP3
ORA B ; MAKE CODE
MOV B,A ; SET IT TO B
;
INX D ; POINT REGISTER NAME
LDAX D ; GET REGISTER NAME
CPI ',' ; COMMA?
JNZ ERRCM ; IF NOT, ERROR
;
INX D
JMP SVSSS
;
; GROUP8 OPCODE R,IMM8
ASMG8: LXI H,G8TBL ; SET GROUP TABLE POINTER
CALL MSRCH ; SEARCH MNEMONIC
JNC ASMG9 ; NOT FOUND? THEN NEXT GROUP
;
CALL CHKSPC
;
LDAX D ; GET REGISTER NAME
CALL GETR ; CONVERT TO REGISTER NUMBER
RLC ; MOVE POSITION STEP1
RLC ; MOVE POSITION STEP2
RLC ; MOVE POSITION STEP3
ORA B ; MAKE CODE
MOV B,A ; SET IT TO B
;
INX D ; POINT REGISTER NAME
LDAX D ; GET REGISTER NAME
CPI ',' ; COMMA?
JNZ ERRCM ; IF NOT, ERROR
INX D
JMP SVIMM8 ; GET IMM8 AND SAVE 2 CODE IN BC
;
; GROUP9 OPCODE RP,IMM16
ASMG9: LXI H,G9TBL ; SET GROUP TABLE POINTER
CALL MSRCH ; SEARCH MNEMONIC
JNC ASMGA ; NOT FOUND? THEN NEXT GROUP
;
CALL CHKSPC
;
CALL GETRP ; CONVERT TO REGISTER PAIR NUMBER
RLC ; MOVE POSITION STEP1
RLC ; MOVE POSITION STEP2
RLC ; MOVE POSITION STEP3
RLC ; MOVE POSITION STEP4
ORA B ; MAKE CODE
MOV B,A ; SET IT TO B
;
LDAX D ; GET CHAR
CPI ',' ; COMMA?
JNZ ERRCM ; IF NOT, ERROR
;
INX D
JMP SVW3C
;
; OPCODE RP
ASMGA: LXI H,GATBL ; SET GROUP TABLE POINTER
CALL MSRCH ; SEARCH MNEMONIC
JNC ASMGB ; NOT FOUND? THEN NEXT GROUP
;
CALL CHKSPC
;
CALL GETRP ; CONVERT TO REGISTER PAIR NUMBER
SVRP: RLC ; MOVE POSITION STEP1
JMP A2ST1
;
; OPCODE RP(B OR D)
ASMGB: LXI H,GBTBL ; SET GROUP TABLE POINTER
CALL MSRCH ; SEARCH MNEMONIC
JNC ASMNG ; NOT FOUND? THEN NEXT GROUP
;
CALL CHKSPC
;
CALL GETRP ; CONVERT TO REGISTER PAIR NUMBER
;
CPI 2 ; ONLY B OR D
JNC ERRCM ; IF NOT, ERROR
JMP SVRP ; GET RP AND SAVE SINGLE CODE
;
; UNKNOWN COMMANE OR MNEMONIC
ASMNG: LXI D,LBUF ; POINT COMMAND LINE
JMP ERRCM ; ERROR
;
; PUT STRING
; HL= *STRING
PUTS0: MOV A,M ; 文字を拾う
ORA A ; もし0なら
RZ ; 終了
RST PUTCH/8 ; 文字を送信
INX H ; 次の文字を指す
JMP PUTS0 ; 繰り返す
;
; GET STRING
; BROKEN A,DE,HL
GETS0: LXI H,LBUF ; HLをバッファ内書き込み位置に設定
;
GSST5: RST GETCH/8 ; Aに文字を入れる
CPI 13 ; CR?
JZ GSST1 ; 一致なら終了処理へ分岐
;
; BSなら1文字削除
CPI 8 ; BS?
JNZ GSST4 ; 不一致なら次の処理へ
MOV A,L ; 書き込み位置を
CPI LBUF AND 0FFH ; バッファの先頭と比較
JZ GSST5 ; 文字がなければ1文字削除しない
MVI A,8 ; BSで
RST PUTCH/8 ; カーソルを戻す
RST PUTSPC/8 ; 空白で文字を消す
MVI A,8 ; BSで
RST PUTCH/8 ; カーソルを戻す
DCX H ; 書き込み位置を戻す
JMP GSST5 ; 繰り返す
;
GSST4: MOV D,A ; Aの文字を退避
MOV A,L ; 書き込み位置を
CPI LBUF+LINSIZ-1 AND 0FFH ; バッファの末尾-1と比較
JNC GSST5 ; 書き込めなければ繰り返す
;
; TABを空白に変換
MOV A,D ; 文字をAへ復帰
CPI 9 ; TAB?
JNZ GSST3 ; 不一致なら次の処理へ
MVI A,' ' ; 空白に変換
;
; 印字不可能文字をはじく
GSST3: SUI ' ' ; 印字可能文字の下限を差し引く
CPI '~'-' '+1 ; 印字可能範囲と比較
JNC GSST5 ; 超えていたら繰り返す
MOV A,D ; 文字をAへ復帰
;
; 小文字を大文字に変換
SUI 'a' ; aを差し引く
CPI 'z'-'a'+1 ; 小文字の範囲と比較
MOV A,D ; 文字をAへ復帰
JNC GSST6 ; 小文字でなければ次の処理へ
ANI 0DFH ; 大文字に変換
;
; 入力した文字を保存
GSST6: MOV M,A ; バッファに文字を保存
INX H ; 書き込み位置を進める
RST PUTCH/8 ; エコーバック
JMP GSST5 ; 繰り返す
;
GSST1:; INX H ; 行末を指す
MVI M,0 ; 行末記号を保存
JMP PUTCRLF ; 改行を出力
;
; GET REGISTOR NUMBER
; A=REGISTER NAME
; A=REGISTER NUMBER
GETR: LXI H,RNAME
CALL FINDC
RC
JMP ERRCM ; 見つからなければエラー処理
;
FINDC: PUSH B
MOV B,A
MOV C,L
FINDC0: MOV A,M
CMP B
JZ FINDC1
INX H
ORA A
JNZ FINDC0
MOV A,B
POP B
RET
FINDC1: MOV A,L
SUB C
STC
POP B
RET
;
; GET WORD
; DE=HEX STRING
; HL=WORD,A=TERM
GETW: LXI H,0
MOV C,E ; DEの下位アドレスをCに保存
SXST3: LDAX D ; DEが指す文字をAに転送
SUI '0' ; 数値に変換
CPI 9+1 ; 9?
JC SXST2 ; 9以下なら次の処理へ進む
SUI 'A'-'0' ; 数値に変換
CPI 15-9 ; F以上?
JNC GWST2 ; F以上なら戻る
ADI 10
SXST2: DAD H
DAD H
DAD H
DAD H
ORA L
MOV L,A
INX D ; DEを進める
JMP SXST3 ; 繰り返す
;
GWST2: MOV A,E ; DEの下位アドレスをAに転送
SUB C ; 文字数を計算
JZ ERRCM ; 文字数0ならエラー処理
;
LDAX D ; 区切り文字をAに転送
RET
;
; DE=RP STRING
; A=RP NUMBER,DE=LAST CHAR
GETRP: LDAX D
INX D
LXI H,RPNAME
CALL FINDC
RC
DCX D
LXI H,RPSP
CALL STRCMP
JZ GRPS0
LXI H,RPPSW
CALL STRCMP
JNZ ERRCM
GRPS0: MVI A,3
RET
;
STRCMP: MOV C,E
STRCMP0:LDAX D
INX D
XRA M
INX H
JZ STRCMP0
ANI 7FH
RZ
MOV E,C
RET
;
; COMMAND LINE ERROR
ERRCM: LXI H,ERROR ; ERROR-を
CALL PUTM ; 表示
LXI H,LBUF ; コマンドラインを
CALL PUTS ; 表示
CALL PUTCRLF ; 改行を表示
CALL INDENT ; インデントを表示
;
MOV A,E
SUI LBUF AND 0FFH
CNZ PUTSPN
MVI A,'^'
RST PUTCH/8
CALL PUTCRLF
LXI SP,STKBTM ; スタック設定
JMP LOOP
;
INDENT: MVI A,6
PUTSPN: MOV B,A
PUTSPN0:RST PUTSPC/8
DCR B
JNZ PUTSPN0
RET
;
; COMMON ROUTINE TO PERFORM UNSIGNED COMPARE
; CARRY SET IF DE < HL
; 破壊されるレジスタ-A
CPDH: MOV A,D
CMP H
RNZ
MOV A,E
CMP L
RET
;
; PUT START ADDRESS
PUTA: LHLD ADRSS ; GET START ADDRESS
;
; PUT WORD
; HL=WORD
PUTW: MOV A,H ; 上位バイトをAに転送
CALL PUTB ; 16進数1桁めを表示
MOV A,L ; 下位バイトをAに転送
;
; PUT BYTE
; A=BYTE
PUTB0: PUSH PSW ; 16進数を退避
RRC ; 16進数1桁めへ変換
RRC ; 16進数1桁めへ変換
RRC ; 16進数1桁めへ変換
RRC ; 16進数1桁めへ変換
CALL PUTB1 ; 16進数1桁めを文字に変換して表示
POP PSW ; 16進数を復帰
PUTB1: ANI 0FH ; ゴミを除去
CPI 10 ; 10?
CMC
ACI '0' ; 0~9 ⇒ 30H~39H, 10~15 ⇒ 3BH~40H
DAA ; 3BH~40H ⇒ 41H~46H
JMP PUTCH ; 16進数1桁めを表示
;
; SEARCH MNEMONIC GROUP TABLE
; HL=VECTOR TABLE
; A=0(NOT FOUND IN THIS GROUP),DE=TERM,HL=VECTOR(IF FOUND)
MSRCH: LXI D,LBUF ; POINT MNEMONIC IN BUFFER
;
; COMPARE 1 MNEMONIC
MCST1: LDAX D ; GET CHAR
INX D ; POINT NEXT CHAR
XRA M ; SAME?
INX H ; POINT NEXT CHAR
JZ MCST1 ; THEN SKIP FOLLOW
;
; CASE NOT SAME
ANI 7FH
JNZ MSST1
;
; COMPLETE DONE?
LDAX D ; GET CHAR
CPI ' ' ; SPACE?
JZ STCRET ; SURE THEN RETURN(Z)
CPI ',' ; COMMA?
JZ STCRET ; SURE THEN RETURN(Z)
ORA A ; TERM?
JZ STCRET ; SURE RETURN(Z)
MSST1: DCX H
MSST2: MOV A,M
INX H
ORA A
JP MSST2
INX H
MOV A,M
ORA A
JNZ MSRCH
RET
;
CHKSPC: CPI ' ' ; SPACE?
JNZ ERRCM ; IF NOT, ERROR
INX D ; POINT OPERAND
MOV B,M ; GET CODE
RET
;
; PUT CRLF
PUTCRLF:LXI H,CRLF
;
; PUT MNEMONIC
; HL= MNEMONIC ADDRESS
PUTM: MOV A,M ; GET CHAR
ANI 7FH ; CONVERT CAPITAL
RST PUTCH/8 ; PUT IT
MOV A,M ; GET CHAR
INX H ; NEXT CHAR
ORA A ; SEPARATOR?
JP PUTM ; IF NOT, REPEAT
RET
;
; PUT REGISTER NAME2
; B(..RRR...)=REGISTER NUMBER
PUTR2: MOV A,B
RRC
RRC
RRC
;
; PUT REGISTER NAME
; A(.....RRR)=REGISTER NUMBER
PUTR: LXI H,RNAME ; GET TOP
ANI 07H
PRST3: ADD L
MOV L,A
JNC PRST4
INR H
PRST4: MOV A,M
JMP PUTCH
;
; PUT RP NAME
; B(..RP....)=RP NUMBER
PUTRP: RST PUTSPC/8 ; OUT SPACE
MOV A,B
RRC
RRC
RRC
RRC
ANI 03H
CPI 3 ; IRREGULAR?
JNC PRST1 ; IF YES, PUT SP
PRST2: LXI H,RPNAME ; GET TOP
JMP PRST3
;
PRST1: LXI H,RPSP
JMP PUTM
;
; SEARCH CODE IN GROUP TABLE
; HL=VECTOR TABLE,B=CODE
; A=FF(NOT FOUND IN THIS GROUP),A=CODE(FOUND)
; BROKEN HL
CSRCH: MOV C,M ; GET VECTOR
CSRCH0: INX H
MOV A,M ; GET VECTOR
ORA A ; TERM?
RZ ; IF YES, RETURN
;
SHLD SVPTR ; SAVE MNEMONIQ ADDRESS
CSRCH1: MOV A,M
INX H
ORA A
JP CSRCH1
MOV A,B ; GET CODE
ANA C
CMP M ; SAME?
JNZ CSRCH0
;
LHLD SVPTR ; LOAD MNEMONIQ ADDRESS
CALL PUTM
STCRET: STC
RET
;
; DIS ASSEMBLER
DASM: RST PUTSPC/8 ; OUT SPACE
CALL PUTW ; OUT START ADDRESS
RST PUTSPC/8 ; OUT SPACE
;
MOV B,M ; GET CODE(FIRST, USE HL)
XCHG ; SET START ADDRESS TO DE
;
G1GP: LXI H,G1TBL-1 ; CODE ONRY
CALL CSRCH ; SEARCH CODE
JNC G2GP ; NOT FOUND? THEN NEXT GROUP
JC DAST1 ; NO OPERAND
;
G2GP: LXI H,G2TBL-1 ; CODE WITH NUMBER
CALL CSRCH ; SEARCH CODE
JNC G3GP ; NOT FOUND? THEN NEXT GROUP
;
; NUMBER
RST PUTSPC/8 ; OUT SPACE
MOV A,B
RRC
RRC
RRC
ANI 07H
ADI '0'
RST PUTCH/8
JMP DAST1
;
G3GP: LXI H,G3TBL-1 ; CODE+IMM8
CALL CSRCH ; SEARCH CODE
JNC G4GP ; NOT FOUND? THEN NEXT GROUP
;
; IMM8
RST PUTSPC/8 ; OUT SPACE
INX D
LDAX D
CPB: CALL PUTB
JMP DAST1
;
G4GP: LXI H,G4TBL-1 ; CODE+IMM16
CALL CSRCH ; SEARCH CODE
JNC G5GP ; NOT FOUND? THEN NEXT GROUP
;
; IMM16
RST PUTSPC/8 ; OUT SPACE
SIMM16: INX D
LDAX D
MOV L,A
INX D
LDAX D
MOV H,A
CALL PUTW
JMP DAST1
;
G5GP: LXI H,G5TBL-1 ; CODE WITH NUMBER
CALL CSRCH ; SEARCH CODE
JNC G6GP ; NOT FOUND? THEN NEXT GROUP
;
; REGISTER NAME(DDD)
RST PUTSPC/8 ; OUT SPACE
CALL PUTR2
JMP DAST1
;
G6GP: LXI H,G6TBL-1 ; CODE WITH NUMBER
CALL CSRCH ; SEARCH CODE
JNC G7GP ; NOT FOUND? THEN NEXT GROUP
;
; REGISTER NAME(SSS)
RST PUTSPC/8 ; OUT SPACE
G6GP0: MOV A,B
CALL PUTR
JMP DAST1
;
G7GP: LXI H,G7TBL-1 ; CODE WITH NUMBER
CALL CSRCH ; SEARCH CODE
JNC G8GP ; NOT FOUND? THEN NEXT GROUP
;
; REGISTER NAME(DDD,SSS)
RST PUTSPC/8 ; OUT SPACE
;
CALL PUTR2
;
MVI A,',' ; SET COMMA
RST PUTCH/8 ; OUT IT
JMP G6GP0
;
G8GP: LXI H,G8TBL-1 ; CODE WITH NUMBER
CALL CSRCH ; SEARCH CODE
JNC G9GP ; NOT FOUND? THEN NEXT GROUP
;
; REGISTER NAME(DDD),IMM8
RST PUTSPC/8 ; OUT SPACE
CALL PUTR2
;
MVI A,',' ; SET COMMA
RST PUTCH/8 ; OUT IT
INX D
LDAX D
JMP CPB
;
G9GP: LXI H,G9TBL-1 ; CODE WITH NUMBER
CALL CSRCH ; SEARCH CODE
JNC GAGP ; NOT FOUND? THEN NEXT GROUP
;
; REGISTER PAIR NAME(RP),IMM16
CALL PUTRP
;
MVI A,',' ; SET COMMA
RST PUTCH/8 ; OUT IT
JMP SIMM16
;
GAGP: LXI H,GATBL-1 ; CODE WITH NUMBER
CALL CSRCH ; SEARCH CODE
JNC GBGP ; NOT FOUND? THEN NEXT GROUP
;
; REGISTER PAIR NAME(RP)
;
MOV A,B
ANI 0C0H
JZ GAS1
MOV A,B
CPI 0F0H ; IRREGULAR?
JC GAS1
RST PUTSPC/8 ; OUT SPACE
LXI H,RPPSW
CALL PUTM
JMP DAST1
;
GBGP: LXI H,GBTBL-1 ; CODE WITH NUMBER
CALL CSRCH ; SEARCH CODE
JNC GNGP ; NOT FOUND? THEN NEXT GROUP
;
; REGISTER PAIR NAME(RP)
GAS1: CALL PUTRP
JMP DAST1
;
GNGP: MVI A,'?'
RST PUTCH/8
;
DAST1: INX D
XCHG
SHLD ADRSS
JMP PUTCRLF
;
; MESSAGE
HELLO DB 0DH,0AH,'MICRO MONITOR V2.0 FN FOR MCS8085',0DH,0AH
CRLF DB 0DH,8AH
ERROR DB 'ERROR',('-'+80H) AND 0FFH
ASCII: DB 'ASCII',0DH,8AH
;
; GROUP VECTOR TABLE
DB 0FFH
G1TBL DB 'NO',('P'+80H) AND 0FFH,00H
DB 'RL',('C'+80H) AND 0FFH,07H
DB 'RR',('C'+80H) AND 0FFH,0FH
DB 'RA',('L'+80H) AND 0FFH,17H
DB 'RA',('R'+80H) AND 0FFH,1FH
DB 'DA',('A'+80H) AND 0FFH,27H
DB 'CM',('A'+80H) AND 0FFH,2FH
DB 'ST',('C'+80H) AND 0FFH,37H
DB 'CM',('C'+80H) AND 0FFH,3FH
DB 'HL',('T'+80H) AND 0FFH,76H
DB 'RN',('Z'+80H) AND 0FFH,0C0H
DB 'R',('Z'+80H) AND 0FFH,0C8H
DB 'RE',('T'+80H) AND 0FFH,0C9H
DB 'RN',('C'+80H) AND 0FFH,0D0H
DB 'R',('C'+80H) AND 0FFH,0D8H
DB 'RP',('O'+80H) AND 0FFH,0E0H
DB 'RP',('E'+80H) AND 0FFH,0E8H
DB 'R',('P'+80H) AND 0FFH,0F0H
DB 'R',('M'+80H) AND 0FFH,0F8H
DB 'XTH',('L'+80H) AND 0FFH,0E3H
DB 'PCH',('L'+80H) AND 0FFH,0E9H
DB 'XCH',('G'+80H) AND 0FFH,0EBH
DB 'SPH',('L'+80H) AND 0FFH,0F9H
DB 'D',('I'+80H) AND 0FFH,0F3H
DB 'E',('I'+80H) AND 0FFH,0FBH
DB 'RI',('M'+80H) AND 0FFH,20H
DB 'SI',('M'+80H) AND 0FFH,30H
DB 0
;
DB 0C7H
G2TBL DB 'RS',('T'+80H) AND 0FFH,0C7H
DB 0
;
DB 0FFH
G3TBL DB 'I',('N'+80H) AND 0FFH,0DBH
DB 'OU',('T'+80H) AND 0FFH,0D3H
DB 'AD',('I'+80H) AND 0FFH,0C6H
DB 'AC',('I'+80H) AND 0FFH,0CEH
DB 'SU',('I'+80H) AND 0FFH,0D6H
DB 'SB',('I'+80H) AND 0FFH,0DEH
DB 'AN',('I'+80H) AND 0FFH,0E6H
DB 'XR',('I'+80H) AND 0FFH,0EEH
DB 'OR',('I'+80H) AND 0FFH,0F6H
DB 'CP',('I'+80H) AND 0FFH,0FEH
DB 0
;
DB 0FFH
G4TBL DB 'SHL',('D'+80H) AND 0FFH,22H
DB 'LHL',('D'+80H) AND 0FFH,2AH
DB 'ST',('A'+80H) AND 0FFH,32H
DB 'LD',('A'+80H) AND 0FFH,3AH
DB 'JN',('Z'+80H) AND 0FFH,0C2H
DB 'JM',('P'+80H) AND 0FFH,0C3H
DB 'CN',('Z'+80H) AND 0FFH,0C4H
DB 'J',('Z'+80H) AND 0FFH,0CAH
DB 'C',('Z'+80H) AND 0FFH,0CCH
DB 'CAL',('L'+80H) AND 0FFH,0CDH
DB 'JN',('C'+80H) AND 0FFH,0D2H
DB 'CN',('C'+80H) AND 0FFH,0D4H
DB 'J',('C'+80H) AND 0FFH,0DAH
DB 'C',('C'+80H) AND 0FFH,0DCH
DB 'JP',('O'+80H) AND 0FFH,0E2H
DB 'CP',('O'+80H) AND 0FFH,0E4H
DB 'JP',('E'+80H) AND 0FFH,0EAH
DB 'CP',('E'+80H) AND 0FFH,0ECH
DB 'J',('P'+80H) AND 0FFH,0F2H
DB 'C',('P'+80H) AND 0FFH,0F4H
DB 'J',('M'+80H) AND 0FFH,0FAH
DB 'C',('M'+80H) AND 0FFH,0FCH
DB 0
;
DB 0C7H
G5TBL DB 'IN',('R'+80H) AND 0FFH,04H
DB 'DC',('R'+80H) AND 0FFH,05H
DB 0
;
DB 0F8H
G6TBL DB 'AD',('D'+80H) AND 0FFH,80H
DB 'AD',('C'+80H) AND 0FFH,88H
DB 'SU',('B'+80H) AND 0FFH,90H
DB 'SB',('B'+80H) AND 0FFH,98H
DB 'AN',('A'+80H) AND 0FFH,0A0H
DB 'XR',('A'+80H) AND 0FFH,0A8H
DB 'OR',('A'+80H) AND 0FFH,0B0H
DB 'CM',('P'+80H) AND 0FFH,0B8H
DB 0
;
DB 0C0H
G7TBL DB 'MO',('V'+80H) AND 0FFH,40H
DB 0
;
DB 0C7H
G8TBL DB 'MV',('I'+80H) AND 0FFH,06H
DB 0
;
DB 0CFH
G9TBL DB 'LX',('I'+80H) AND 0FFH,01H
DB 0
;
DB 0CFH
GATBL DB 'IN',('X'+80H) AND 0FFH,03H
DB 'DA',('D'+80H) AND 0FFH,09H
DB 'DC',('X'+80H) AND 0FFH,0BH
DB 'PO',('P'+80H) AND 0FFH,0C1H
DB 'PUS',('H'+80H) AND 0FFH,0C5H
DB 0
;
DB 0CFH
GBTBL DB 'LDA',('X'+80H) AND 0FFH,0AH
DB 'STA',('X'+80H) AND 0FFH,02H
DB 0
;
; REGISTER NAME
RNAME DB 'BCDEHLMA',0
RPNAME DB 'BDH',0
RPSP DB 'S',('P'+80H) AND 0FFH
RPPSW DB 'PS',('W'+80H) AND 0FFH
;
ORG 0-LINSIZ-6
STKBTM
LBUF DS LINSIZ
SVPTR DS 2
ADRSS DS 2
ADRSE DS 2
;
END
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment