2013-02-16 56 views
0

我有这个代码将年份输入(转换为chari)并将其输出为十进制。我的问题是,如果错误地输入了一个字母或空格,程序将输出错误信息,但不会重新输入新的输入。例如,如果输入ABCD,它会给你4次错误信息并退出。PEP8要求一个新的输入,如果不是数字

输入年份必须在1900年和2049年之间(含)。

要重现错误,请尝试19a0或abcd每个示例。

我在哪里错了?

STRO welcome,d 

entyear:STRO inptyear,d 
readnomb:NOP1     

initread:LDA  -1,i   
     STA  pos,d  
     LDA  0,i 
     STA  integer,d   

readchar:LDA  0,i   
     CHARI ascii,d  
     LDBYTEA ascii,d  
     CPA  0x000A,i 
     BREQ exitentr  
     CPA  0x002F,i 
     BRLE errlect  
     CPA  0x003A,i 
     BRGE errlect  
     SUBA 48,i  
     STA  valint,d  
     LDX  pos,d  
     ADDX 1,i  
     STX  pos,d  
     BR  convint  

errlect: STRO msgerr,d 
     LDX  0,i 
     STX  ascii,d 
     BR  readnomb 

multdix: LDA  integer,d 
     ASLA     
     STA  inttemp,d 
     ASLA     
     ASLA     
     ADDA inttemp,d 
     STA  integer,d 
     LDX  pos,d  
     SUBX 1,i   
     STX  pos,d  

convint: LDX  pos,d  
     CPX  0,i   
     BRGT multdix  
     LDA  integer,d 
     ADDA valint,d  
     STA  integer,d 
     BR  readchar  

exitentr:LDX  pos,d  
     CPX  0,i   
     BRLT end   

dispint:LDA  integer,d 
     CPA  datemin,i 
     BRLT errlect 
     CPA  datemax,i 
     BRGT errlect 
     DECO integer,d 
     STRO msgspace,d 
     BR  entyear 
end:  STOP     


welcome: .ASCII "Enter a year to convert to decimal\n" 
     .BYTE 0 
inptyear: .ASCII "Year ?: " 
     .BYTE 0   
msgerr: .ASCII "\nWrong caracter detected, please enter a new year: " 
     .BYTE 0   
msgspace:.WORD 0x0A0A  
     .BYTE 0     

inttemp: .WORD 0 
valint: .WORD 0 
pos:  .WORD 0 
datemin: .EQUATE 1900 
datemax: .EQUATE 2049 
integer: .WORD 0 
ascii: .BYTE 0 
     .END 

回答

0

如果按数字输入后,这些: CPA 0x000A,我
BREQ exitentr
可能使程序终止。实际上,在每一个无效键之后,阅读都是从一开始就开始的。 当然,除非checker读取被缓存 - 终端收集字符直到换行,然后向程序提供整个缓冲区以便使用CHARI读取字符。

我有点猜测,没有这种缓冲。

相关问题