📄 main.asm
字号:
;*
USERMEM2: ;****
LDA #$81 ;Decode For<RTS>
STA BUFF+3
LDHX BUFF+1
CPHX #RAM_END ;RAM_END=$0240
BHS M_NOT_RAM
BRA MC1 ;Inputed Address Is RAM Address
;*
M_INVALID_ADD:
JSR CRLF
LDHX #$00
M_IA_MSG:
LDA MIA_MSG,X ;Output String MIA_MSG
CMP #$04
BEQ MCX
JSR OUTCH
AIX #1
BRA M_IA_MSG
MC1: JSR CRLF ;****
LDA FLAG
CMP #$FF
BEQ MEMUSER1
LDX BUFF+1
LDA BUFF+2
JSR OUT4H ;Output The Address
JSR OUT1SP ;Output '.'
LDA #$C6 ;Opcode for<LDA addr16>
STA BUFF
JSR BUFF
JSR OUT2H ;Output What In The Address
JSR OUTDOT ;Output '.'
JSR IN2H ;Input The New Code
BCC CHANGE ;While C=0,Change
CMP #BKSP ;While <BACKSPACE>,To Repeat
BEQ MC1
CMP #QUIT ;While '.',To Quit
BNE FWD
MCX: RTS
MEMUSER1: ;****
LDA BUFF
CHANGE: LDX #$C7 ;****Opcode for<STA addr16>
STX BUFF
JSR BUFF ;Change The Code In The Address
LDA FLAG
CLR FLAG
CMP #$FF
BEQ MCX
JSR CRLF
LDX BUFF+1 ;Display The Address And The New Code
LDA BUFF+2
JSR OUT4H
JSR OUT1SP
LDA #$C6 ;Opcode for<LDA addr16>
STA BUFF
JSR BUFF
JSR OUT2H
;*
FWD: JSR INCADDR ;****
LDHX BUFF+1
CPHX #RAM_END
BEQ M_INVALID_ADD
BRA MC1
;*
INCADDR:
LDA BUFF+2
INCA
BNE IA1
LDX BUFF+1
INCX
STX BUFF+1
IA1: STA BUFF+2 ;****
INCADDR_X:
RTS
MIA_MSG:
FCB "Address Invalid (Not in RAM or FLASH)'
FCB $4
;***************************************************************
;* COMMAND 'B':Set BreakPoint
;***************************************************************
IN_BKPT:
JSR IN4H
BCS CL_BKPT
STX BRKH
STA BRKH+1
LDA #%10000000
STA BRKSCR
CLI
RTS
CL_BKPT:
LDA #0
STA BRKSCR
RTS
;**************************************************************
;* COMMAND 'G':Execute Program From Address Specified By PC
;**************************************************************
CMD_GO: ;****
JSR FINDSP ;#TEMP=SP0
LDA #$FF
STA FLAG ;FLAG=#FF
STA GO_FLAG ;GO_FLAG=$FF
SWI ;Take A Software Interrupt
GO1: LDA #$00 ;****
STA GO_FLAG
LDHX TEMP ;Change The Code In The Stack
AIX #-3 ;Change PC To Execute Program
LDA MIRR_PC+1
STA 4,X
LDA MIRR_PC
STA 3,X
LDA MIRR_X
STA 2,X
LDA MIRR_A
STA 1,X
LDA MIRR_CC
STA 0,X
JSR FINDSP ;****
LDHX TEMP
AIX #2
TXS
NOBKPT: ;****
LDHX MIRR_H ;Restore H:X,And Return
RTI
;*==============================================================
;* Routine To Find Out Position Of The Stack Pointer
;* Return Value:(H:X)=TEMP =SP
;*==============================================================
FINDSP: ;****
TSX ;H:X<-(SP)+0001
AIX #2
STHX TEMP
RTS
PRT_A: LDHX #$00
PA1: LDA MSG2,X ;****Output String MSG2
CMP #$04
BEQ PA2
JSR OUTCH
INCX
BRA PA1
PA2: LDA MIRR_A
JMP OUT2H
PRT_X: LDHX #$00 ;****
PX1: LDA MSG3,X ;****Output String MSG3
CMP #$04
BEQ PX2
JSR OUTCH
INCX
BRA PX1
PX2: LDA MIRR_H
LDA MIRR_X
JMP OUT4H
;*
PRT_PC: LDHX #$00 ;****
PPC1: LDA MSG4,X ;****Output String MSG4
CMP #$04
BEQ PPC2
JSR OUTCH
INCX
BRA PPC1
PPC2: LDX MIRR_PC
LDA MIRR_PC+1
JMP OUT4H
;*
PRT_CC: LDHX #$00 ;****
PCC1: LDA MSG5,X ;Output String MSG5
CMP #$04
BEQ PCC2
JSR OUTCH
INCX
BRA PCC1
PCC2: LDA MIRR_PC ;****
JMP OUT2H
;*
PRT_SP: LDHX #$00 ;****
PSP1: LDA MSG6,X ;****Output String MSG6
CMP #$04
BEQ PSP2
JSR OUTCH
INCX
BRA PSP1
PSP2: LDX MIRR_SP ;****
LDA MIRR_SP+1
JMP OUT4H
;*
MSG2: FCB "A=" ;****
FCB $04
MSG3: FCB "H:X=" ;****
FCB $04
MSG4: FCB "PC=" ;****
FCB $04
MSG5: FCB "CC=" ;****
FCB $04
MSG6: FCB "SP="
FCB $04
;*=============================================================
;* COMMAND'R': Display Value Of Registers
;*=============================================================
REGDSP:
JSR CRLF ;CR And LF
JSR PRT_A ;Output 'A=*'
JSR PRT_X ;Output 'H:X=*'
JSR PRT_PC ;Output 'PC=*'
JSR PRT_CC ;Output 'CC=*'
BRA PRT_SP ;Output 'SP=*'
;*============================================================
;* COMMAND 'D':Dump Memory in HEX and ASCII
;*============================================================
MDUMP: JSR IN4H ;Receive Lower Address
BCS MDX
STX BUFF+1
STA BUFF+2
LDHX BUFF+1
CPHX #ROM_END ;ROM_END=$E000
BHS D_INVALID_ADD
LDA #'-'
JSR OUTCH
JSR IN4H ;Receive Higher Address
BCS MDX
STX BUFF+4
STA BUFF+5
LDHX BUFF+4
CPHX #ROM_END
BHS D_INVALID_ADD
LDX BUFF+4
CMPX BUFF+1 ;Check The Lower Address Lower Than The Higher
BEQ LOWDG1
BCC ADJ
BRA MDX
LOWDG1:
CMP BUFF+2
BCC ADJ
MDX: RTS
;*
D_INVALID_ADD:
JSR CRLF ;CR And LF
LDHX #$00
D_IA_MSG:
LDA MIA_MSG,X ;Output String MSG
CMP #$04
BEQ MDX
JSR OUTCH
AIX #1
BRA D_IA_MSG
;*
ADJ: ADD #$10 ;Adjust Higher Address To
AND #$F0 ;The First Address Of Next Page
STA BUFF+5
LDA BUFF+4
ADC #$00
STA BUFF+4
LDA BUFF+2 ;Adjust Lower Address To
AND #$F0 ;The First Address Of This Page
STA BUFF+2
;*
LDA #$D6 ;Opcode For<LDA X,Addr16>
STA BUFF+0
LDA #$81 ;Opcode For<RTS>
STA BUFF+3
DLINE: ;****
JSR CRLF
LDX BUFF+1 ;Display Address
LDA NUFF+2
JSR OUT4H
JSR OUT4SP
CLRX
CLRH
DHEX: ;****Display Code inthe Next 16 Addresses Using HEX
JSR BUFF
JSR OUT2H
JSR OUT1SP
INCX
CMPX #$10
BNE DHEX
JSR OUT4SP
CLRX
CLRH
DASC: ;Display Code In The Next 16 Addresses Using ASCII
JSR BUFF
JSR OUTASC
INCX
CMPX #$10 ;Add $10, If Lower Than Higher Address,Loop
ADD BUFF+2
STA BUFF+2
LDA #$00
ADC BUFF+1
STA BUFF+1
CMP BUFF+4
BCS DLINE
BEQ LOWDG2
LOWDG2:
LDA BUFF+2
CMP BUFF+5
BCC MDX
BRA DLINE
;*===============================================================
;* Display Contents In A ASCII
;*===============================================================
OUTASC: ;If <=$20 Or>=$7E,Display '.'
CMP #$20
BCS PERIOD
CMP #$7E
BLS PRTASC
PERIOD: ;****
LDA #'.'
PRTASC: ;****
JSR OUTCH
RTS
;*===============================================================
;* COMMAND 'E':Erase A Range Of FLASH
;*===============================================================
ERASE:
JSR IN4H ;Receive Lower Addres
BCS MIDJMP_ERAX
STX BUFF+1
STA BUFF+2
LDHX BUFF+1
CPHX #ROM_END
BHS E_INVALID_ADD
LDA #'-'
JSR OUTCH
JSR IN4H ;Receive Higher Address
BCS MIDJMP_ERAX
STX BUFF+4
STA BUFF+5
;*
USER_ERASE:
JSR SET_TIME_TABLE
CLR FLASHFLAG ;FLASHFLAG=0
LDA #$C7 ;Opcode For<STA Addr16>
STA BUFF+0
LDA #$81 ;Opcode For<RTS>
STA BUFF+3
LDX BUFF+1
STX ERASEBEGIN
LDA BUFF+2
STA ERASEBEGIN+1
AND #%10000000 ;Change BUFF+2 To Begin Of Each Erasing
;Page xx00 or xx80
STA BUFF+2
LDHX BUFF+1
CPHX #ROM_END
BHS E_INVALID_ADD
;Make Sure Lower Address Lower Than The Higher
LDHX BUFF+4
CPHX #ROM_END
BHS E_INVALID_ADD
;*
LDX BUFF+4
CMPX BUFF+1
BLO MIDJMP_ERAX
BHI INPUTVALID
LDA BUFF+5
CMP ERASEBEGIN+1
BLO MIDJMP_ERAX
BRA INPUTVALID
MIDJMP_ERAX:
JMP ERAX
E_INVALID_ADD:
JSR CRLF
LDHX #$00
E_IA_MSG:
LDA MIA_MSG,X ;Output String 'Address Invalid
;(Not in RAM or FLASH'
CMP #$04
BEQ MEX
JSR OUTCH
AIX #1
BRA E_IA_MAG
MEX: RTS
INPUTVALID: ;ERASE THE FIRST PAGE
LDHX BUFF+1
JSR SUB_LOAD_80 ;FLASH->RAM
MOV #$FF,TEMP ;While Not In The Same Page
LDA BUFF+4
CMP BUFF+1
BNE E_END_FF
;*;Whether The Two Addresses In The Same Page
LDA BUFF+2
ORA #$7F
CMP BUFF+5
BLS E_END_FF
LDA BUFF+5
ORA #$80
STA TEMP ;While In The Same Page
E_END_FF:
LDA ERASEBEGIN+1
ORA #$80
LDHX #0100
TAX
LDA #$FF
E_CLR_RAM: ;Store $FF To The RAM Area To Erase
STA ,X
AIX #1
CPX #0
BEQ E_OVERFLOW
CPX TEMP
BLS E_CLR_RAM
E_OVERFLOW:
JSR BUB_RESTORE_80 ;RAM->FLASH
;*
LDA BUFF+2
ADD #$80 ;Prepare To Erase Next Page
STA BUFF+2
LDA BUFF+1
ADC #0
STA BUFF+1
LDA BUFF+5
LDX BUFF+4
;*
LDHX #PROG_BEGIN
STHX TEMPHX
LDHX #SUB_ERASE ;Move The Program From Flash To RAM
NXTMOVE: ;****
MOV X+,TEMP2
PSHH
PSHX
LDHX TEMPH
MOV TEMP2,X+
NXT: STHX TEMPH ;****
PULX
PULH
CPHX #SUB_PROGRAM
BNE NXTMOVE
;*
LDA BUFF+5
LDX BUFF+4
ERAREP: ;Whether The Two Addresses In The Same Page
CMPX BUFF+1
BEQ LOWBYTE
BCC ERAPAGE
BRA ERAX1 ;If Lower>Higher,Return,(X=BUFF+4)
LOWBYTE:
AND #$80
CMP BUFF+2
BLO ERAX1
BHI ERAPAGE ;If Not In The Same Page,ERAPAGE
;*
LDHX BUFF+1 ;If In The Same Page
JSR SUB_LOAD_80 ;FLASH->RAM
LDA BUFF+5
ORA #$80
STA TEMP
LDHX #$0180
LDA #$FF
E_ERA_RAM:
STA ,X
AIX #1
CPX #0
BEQ E_OVERFLOW_1
BLS E_ERA_RAM
;*
E_OVERFLOW_1:
JSR SUB_RESTORE_80 ;RAM->FLASH
;*
ERAX1: JSR CRLF ;Display '****-****'
LDX ERASEBEGIN
LDA ERASEBEGIN+1
JSR OUT4H
LDA #'-'
JSR OUTCH
LDX BUFF+4
LDA BUFF+5
JSR OUT4H
;*
LDHX ERASEBEGIN
E_CON_VR: ;Check Erasing Is Successful
LDA ,X
COMA ;If Every Code In The Area Is $FF
BNE E_ERROR_ERA ;It Is Successful
AIX #1
CPHX BUFF+4
BLS E_CON_VR
BRA E_DISP_RESULT
E_ERROR_ERA:
BSET B_ERROR,FLASHFLAG ;Wrong,Set B_ERROR Of FLASGFLAG
;*
E_DISP_RESULT: ;Display MSG
LDHX #0
BRSET B_ERROR,FLASHFLAG,ERAERROR
LDHX #{ERA_SUC_MSG-ERA_ERR_MSG}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -