> xsum/s v1.10 15-Feb-1990 - *************************************** - * Basic Checksum * (- * (c) The Micro User * 2- * v1.00 May 1987 by Steve Turnbull * <- *************************************** F- * v1.10 Feb 1990 by J.G.Harston * P- * Runnable on either side of Tube * Z- *************************************** d init n assemble x>A$="*SAVE xsum "+~mcode%+" "+~O%+" "+~exec%+" "+~load% (warn%:P%=&480:P%=warn A$;:A$:  init  mcode% &400 load%=&404 warn%=0 osargs=&FFDA osnewl=&FFE7 oswrch=&FFEE osword=&FFF1 osbyte=&FFF4 rem=&F4 prnt_on=2  prntoff=3  return=13 page_on=14 "pageoff=15 , space=32 6quotes="""" @colon=":" Jcomma="," T lbrk="[" ^ rbrk="]" h mcom="\" rstartln=&60 |endline=&62 linecrc=&70 overcrc=&72 workcrc=&74 lineptr=&76 crc_ptr=&78 linenum=&7A linelen=&7C linetmp=&7D txt_ptr=&7E nm_base=&80 lo_numb=&81 hi_numb=&82 lo_work=&83 hi_work=&84 quotflg=&85 codeflg=&86 &savebyt=&87 0fldsize=&88 :zeroflg=&89 Dlineend=&8A Nprnting=&8B Xpageing=&8C besc_flg=&FF l vassemble  L%=4 7 3 P%=load%:O%=mcode%  [OPT L%  .exec% 0JMP check:BRK:BRK:BRK \ Header identifies 0EQUB &42:EQUB copy-exec% \ this as 6502 code EQUB &10:EQUS "xsum" &EQUB &00:EQUS "1.10 (15 Feb 1990)"  .copy EQUB 0:EQUS"(C)":EQUB 0  .\ Code to read parameters in variable area \ Later overwritten on exit .read_params  LDA #1  LDY #0  LDX #txt_ptr *JSR osargs 4JSR rdspcs >BEQ xparams H CMP #"P" RBEQ setprint \ CMP #"p" fBNE try_num p .setprint zDEC prnting JSR rdspcs BEQ xparams  .try_num CMP #comma BEQ try_num2 JSR getnum STX startln+0 STY startln+1 CMP #return BNE try_comma STX endline STY endline+1 RTS  .bad_pm LDA txt_ptr+1  CMP #8 $BCC xparams . OPT warn 8JSR way_out B)BRK:EQUB 252:EQUS "Bad parameter":BRK L OPT warn V.try_comma `CMP #comma jBNE bad_pm t .try_num2 ~JSR rdspcs BEQ xparams JSR getnum STX endline STY endline+1 CMP #return BEQ xparams CMP #space BNE bad_pm JSR rdspcs BNE bad_pm  .xparams RTS  .rdspcs  JSR getch CMP #space BEQ rdspcs (CMP #return 2RTS < .getch FTXA PPHA ZTYA dPHA nLDX #txt_ptr 256 xLDY #txt_ptr 256  LDA #5 JSR osword INC txt_ptr BNE no_carry INC txt_ptr+1  .no_carry PLA TAY PLA TAX LDA txt_ptr+4 CMP #return RTS  .getnum PHA  LDA #0 "STA lo_work ,STA hi_work 6PLA @ .num_lp JCMP #"9"+1 TBCS num_exit ^ CMP #"0" hBCC num_exit r SBC #"0" |JSR times10 CLC ADC lo_work STA lo_work LDA hi_work  ADC #0 STA hi_work  JSR getch JMP num_lp  .num_exit LDX lo_work LDY hi_work BMI num_err CMP #space  BNE num_x JSR rdspcs  .num_x &RTS 0 .times10 :PHA DLDA lo_work N ASL A XROL hi_work bTAX lLDY hi_work v ASL A ROL hi_work  ASL A ROL hi_work STA lo_work CLC TXA ADC lo_work STA lo_work TYA ADC hi_work STA hi_work PLA RTS   .rdbyte (LDX #0:LDY #255:JSR osbyte:TXA: #63  .ok *RTS 4.checkbasic >#LDA #187:JSR rdbyte:STA lineptr H*LDA #252:JSR rdbyte:CMP lineptr:BEQ ok R(BRK:EQUB 249:EQUS "Not in BASIC":BRK \ f .num_err p OPT warn zJSR way_out &BRK:EQUB 252:EQUS "Bad number":BRK  OPT warn   .check JSR checkbasic  LDA #0 STA overcrc+0 STA overcrc+1 STA startln+0 STA startln+1 STA codeflg STA prnting STA lineptr+0  LDA &18 STA lineptr+1  LDA #&7F $STA endline+1 . LDA #&FF 8STA endline BJSR read_params LBIT prnting V BMI start `LDA #page_on jJSR oswrch t .start ~ .while BIT esc_flg BMI escape LDY #1 LDA (lineptr),Y BPL do_line .way_out LDA #end 255:STA &0B LDA #end 256:STA &0C -LDA #0:STA &0A :\ ptra=> LDX #&7F .clear_lp OPT warn STA &480,X 'DEX:BMI clear_lp :\ Clear variables LDA &00:STA &02  LDA &01:STA &03 :\ VARTOP= (LDA #prntoff 2JSR oswrch <LDA #pageoff FJMP oswrch P.end Z'EQUB 13:EQUB &FF :\ d .escape nJSR way_out x!BRK:EQUB 17:EQUS "Escape":BRK .bad JSR way_out %BRK:EQUB 0:EQUS "Bad program":BRK OPT warn .do_line LDA #0 STA linecrc+0 STA linecrc+1 STA quotflg TAY LDA (lineptr),Y CMP #&0D BNE bad INY LDA (lineptr),Y STA linenum+1 "INY ,LDA (lineptr),Y 6STA linenum+0 @INY JLDA (lineptr),Y TSTA lineend ^JSR pre_scan h CPY #5 rBCC display | LDY #4 .skip_space LDA (lineptr),Y CMP #space BNE scan_line INY CPY linelen BEQ display BNE skip_space .scan_line LDA (lineptr),Y JSR do_byte INY CPY linelen BCC scan_line  .display LDA linenum+1 &CMP startln+1 0BCC update :BNE chk_high DLDA linenum NCMP startln XBCC update b .chk_high lLDA linenum+1 vCMP endline+1 BCC skip_it BNE update LDA linenum CMP endline BCC skip_it BNE update .skip_it BIT prnting BPL no_prn1 LDA #prnt_on JSR oswrch .no_prn1 LDX linenum LDY linenum+1 JSR prnt_dec LDA #space JSR oswrch * LDA #"=" 4JSR oswrch >LDA #space HJSR oswrch RLDX linecrc \LDY linecrc+1 fJSR prnt_hex pLDA overcrc zJSR last_chk LDY linelen CPY lineend BEQ newline LDA #"*" JSR oswrch .newline JSR osnewl BIT prnting BPL update LDA #prntoff JSR oswrch .update CLC LDA lineptr ADC lineend STA lineptr $BCC unwhile .INC lineptr+1 8 .unwhile B JMP while L V .pre_scan `LDY lineend j .ps_loop tDEY ~LDA (lineptr),Y  CMP #32 BEQ ps_loop INY STY linelen RTS  .do_byte STA savebyt CMP #quotes BNE notquote PHA LDA quotflg  #&FF STA quotflg  PLA  .notquote BIT quotflg (BMI skpcode 2BIT codeflg <BMI j_code F JSR basic PJMP skpcode Z .j_code d JSR mcode n .skpcode xLDA savebyt CPY linelen BEQ skipcrc STY linetmp LDX linecrc LDY linecrc+1 JSR do_crc STX linecrc STY linecrc+1 LDX overcrc LDY overcrc+1 JSR do_crc STX overcrc STY overcrc+1 LDY linetmp  .skipcrc RTS " .basic , CMP #rem 6BEQ skpline @ CMP #lbrk JBNE xbasic T LDA #&FF ^STA codeflg hRTS r .skpline |LDY linelen  .xbasic RTS  .mcode  CMP #mcom BEQ skipcom  CMP #rbrk BNE xmcode  LDA #0 STA codeflg  .xmcode RTS  .skipcom LDA quotflg PHA  LDA #0 STA quotflg & .skploop 0INY :LDA (lineptr),Y DCMP #quotes NBNE skpchk XPHA bLDA quotflg l #&FF vSTA quotflg PLA  .skpchk CPY linelen BEQ skpexit CMP #colon BNE skploop BIT quotflg BMI skploop  .skpexit PLA STA quotflg LDA (lineptr),Y STA savebyt RTS  .do_crc PHA  STX workcrc *STY workcrc+1 4 workcrc+1 >STA workcrc+1 H LDX #7 R .crc_lp \BIT workcrc+1 fCLC pBPL crc_skp zLDA workcrc  #&10 STA workcrc LDA workcrc+1  #&08 STA workcrc+1 SEC  .crc_skp ROL workcrc ROL workcrc+1 DEX BPL crc_lp LDX workcrc LDY workcrc+1 PLA RTS  .last_chk $PHA . LDA #32 8JSR oswrch BPLA L #&0F VTAX ` LDA #&FF jPHA tTXA ~JMP notzero  .prnt_dec  LDA #10 BNE prnt_num  .prnt_hex  LDA #16  .prnt_num STX lo_numb STY hi_numb STA nm_base  LDA #4 STA fldsize  LDA #255 STA zeroflg  .nbit PHA  LDA #0 (STA lo_work 2STA hi_work < LDX #16 F .next PASL lo_numb ZROL hi_numb dROL lo_work nROL hi_work xLDA lo_work SEC SBC nm_base TAY LDA hi_work  SBC #0  BCC done INC lo_numb STY lo_work STA hi_work  .done DEX  BNE next LDA lo_work DEC fldsize  BNE nbit .out "TAX ,BNE notzero 6PLA @PHA JPHP TTXA ^PLP hBMI notzero rBIT zeroflg |BPL notzero  LDA #32 BNE dig_out  .notzero  LDX #0 STX zeroflg  CMP #10  BCC add  ADC #6 .add  ADC #48  .dig_out JSR oswrch PLA  BPL out  .exit RTS &]: 0 :Zݤwarn:L%3:P%>&47F:P%<&500:"**** Warning: code overwritten on exit":warn%=warn%+1 D=L%