dlseg segment code unit rseg dlseg public download doneflag bit psw.5 download: mov r2,sp ;--------------------------------------- mov dptr,#readystr lcall prtstr clr doneflag waitcolon: lcall getchar cjne a,#':',waitcolon gotcolon: clr a mov r1,a lcall getbyt mov r0,a lcall getbyt mov dph,a lcall getbyt mov dpl,a lcall getbyt jz getdata cjne a,#1,typerr setb doneflag sjmp getdata typerr: mov dptr,#rectyperr ljmp prtstr getdata: mov a,r0 jz getcsum bytloop: lcall getbyt movx @dptr,a inc dptr djnz r0,bytloop getcsum: lcall getbyt mov a,r1 jz csum_ok mov dptr,#csumerr ljmp prtstr csum_ok: mov a,#'.' lcall putchar end_loop: lcall getchar cjne a,#10,notlf jb doneflag,done sjmp end_loop notlf: cjne a,#13,notcr jb doneflag,done sjmp end_loop notcr: cjne a,#' ',notspc sjmp end_loop notspc: cjne a,#':',notcol ljmp gotcolon notcol: mov dptr,#garberr ljmp prtstr done: mov dptr,#donemsg ljmp prtstr getbyt: lcall getdigit swap a anl a,#0f0h mov r3,a lcall getdigit anl a,#0fh orl a,r3 mov r3,a add a,r1 mov r1,a mov a,r3 ret getdigit: lcall getchar lcall toupper cjne a,#'0',check_zero check_zero: jc bad_digit cjne a,#3ah,check_9plus1 check_9plus1: jnc check_alpha clr c subb a,#'0' ret check_alpha: cjne a,#41h,check_ten check_ten: jc bad_digit cjne a,#47h,check_fifteen check_fifteen: jnc bad_digit clr c subb a,#37h ret bad_digit: mov sp,r2 mov dptr,#digerr ljmp prtstr ;--------------------------------------- getchar: jnb scon.0,getchar mov a,sbuf clr scon.0 clr acc.7 ret toupper: push acc clr c subb a,#'a' jc notlower subb a,#26 jnc notlower pop acc subb a,#1fh ret notlower: pop acc ret putchar: jnb scon.1,putchar mov sbuf,a clr scon.1 ret prtstr: movx a,@dptr jz prtdone prtwait: jnb scon.1,prtwait mov sbuf,a clr scon.1 inc dptr sjmp prtstr prtdone: ret readystr: db 13,10,'Ready to download.',13,10,0 csumerr: db 13,10,'Checksum error.',13,10,0 garberr: db 13,10,'Error: Garbage at end of record.',13,10,0 digerr: db 13,10,'Error: Invalid hex digit received.',13,10,0 rectyperr: db 13,10,'Error: Invalid record type.',13,10,0 donemsg: db 13,10,'Download complete.',13,10,0 end