;Copyright (c) 1990-2012 by Neil Dodwell ;Released with permission from Neil Dodwell under GPLv2 ;See LICENSE file for full license text Entercode proc near mov keypadax,ax mov keypadcx,cx call getridofreels call loadkeypad call createpanel call showicon call showouterpad call showkeypad call readmouse call showpointer call worktoscreen call delpointer mov presspointer,0 mov getback,0 keypadloop: cmp quitrequested, 0 jnz numberright call delpointer call readmouse call showkeypad call showpointer call vsync cmp presscount,0 jz nopresses dec presscount jmp afterpress nopresses: mov pressed,255 mov graphicpress,255 call vsync afterpress: call dumppointer call dumpkeypad call dumptextline mov bx,offset cs:keypadlist call checkcoords cmp getback,1 jz numberright cmp lightcount,1 jnz notendkey cmp lockstatus,0 jz numberright jmp keypadloop notendkey: cmp presscount,40 jnz keypadloop call addtopresslist cmp pressed,11 jnz keypadloop mov ax,keypadax mov cx,keypadcx call isitright jnz incorrect mov lockstatus,0 mov al,11 call playchannel1 mov lightcount,120 mov presspointer,0 jmp keypadloop incorrect: mov al,11 call playchannel1 mov lightcount,120 mov presspointer,0 jmp keypadloop numberright: mov manisoffscreen,0 call getridoftemp call restorereels call redrawmainscrn call worktoscreenm ret keypadlist: dw keypadx+9,keypadx+30,keypady+9,keypady+22,buttonone dw keypadx+31,keypadx+52,keypady+9,keypady+22,buttontwo dw keypadx+53,keypadx+74,keypady+9,keypady+22,buttonthree dw keypadx+9,keypadx+30,keypady+23,keypady+40,buttonfour dw keypadx+31,keypadx+52,keypady+23,keypady+40,buttonfive dw keypadx+53,keypadx+74,keypady+23,keypady+40,buttonsix dw keypadx+9,keypadx+30,keypady+41,keypady+58,buttonseven dw keypadx+31,keypadx+52,keypady+41,keypady+58,buttoneight dw keypadx+53,keypadx+74,keypady+41,keypady+58,buttonnine dw keypadx+9,keypadx+30,keypady+59,keypady+73,buttonnought dw keypadx+31,keypadx+74,keypady+59,keypady+73,buttonenter dw keypadx+72,keypadx+86,keypady+80,keypady+94,quitkey dw 0,320,0,200,blank dw 0ffffh endp Loadkeypad proc near mov dx,offset cs:extragraphics1 call loadintotemp ret endp Quitkey proc near cmp commandtype,222 jz alreadyqk mov commandtype,222 mov al,4 call commandonly alreadyqk: mov ax,mousebutton cmp ax,oldbutton jz notqk and ax,1 jnz doqk notqk: ret doqk: mov getback,1 ret endp Addtopresslist proc near cmp presspointer,5 jz nomorekeys mov al,pressed cmp al,10 jnz not10 mov al,0 not10: mov bx,presspointer mov dx,seg presslist mov es,dx add bx,offset es:presslist mov [es:bx],al inc presspointer nomorekeys: ret endp Buttonone proc near mov cl,1 call buttonpress ret endp Buttontwo proc near mov cl,2 call buttonpress ret endp Buttonthree proc near mov cl,3 call buttonpress ret endp Buttonfour proc near mov cl,4 call buttonpress ret endp Buttonfive proc near mov cl,5 call buttonpress ret endp Buttonsix proc near mov cl,6 call buttonpress ret endp Buttonseven proc near mov cl,7 call buttonpress ret endp Buttoneight proc near mov cl,8 call buttonpress ret endp Buttonnine proc near mov cl,9 call buttonpress ret endp Buttonnought proc near mov cl,10 call buttonpress ret endp Buttonenter proc near mov cl,11 call buttonpress ret endp Buttonpress proc near mov ch,cl add ch,100 cmp commandtype,ch jz alreadyb mov commandtype,ch mov al,cl add al,4 push cx call commandonly pop cx alreadyb: mov ax,mousebutton cmp ax,oldbutton jz notb and ax,1 jnz dob notb: ret dob: mov pressed,cl add cl,21 mov graphicpress,cl mov presscount,40 cmp cl,32 jz nonoise mov al,10 call playchannel1 nonoise: ret endp Showouterpad proc near mov di,keypadx-3 mov bx,keypady-4 mov ds,tempgraphics mov al,1 mov ah,0 call showframe mov di,keypadx+74 mov bx,keypady+76 mov ds,tempgraphics mov al,37 mov ah,0 call showframe ret endp Showkeypad proc near mov al,22 mov di,keypadx+9 mov bx,keypady+5 call singlekey mov al,23 mov di,keypadx+31 mov bx,keypady+5 call singlekey mov al,24 mov di,keypadx+53 mov bx,keypady+5 call singlekey mov al,25 mov di,keypadx+9 mov bx,keypady+23 call singlekey mov al,26 mov di,keypadx+31 mov bx,keypady+23 call singlekey mov al,27 mov di,keypadx+53 mov bx,keypady+23 call singlekey mov al,28 mov di,keypadx+9 mov bx,keypady+41 call singlekey mov al,29 mov di,keypadx+31 mov bx,keypady+41 call singlekey mov al,30 mov di,keypadx+53 mov bx,keypady+41 call singlekey mov al,31 mov di,keypadx+9 mov bx,keypady+59 call singlekey mov al,32 mov di,keypadx+31 mov bx,keypady+59 call singlekey cmp lightcount,0 jz notenter dec lightcount mov al,36 mov bx,keypady-1+63 cmp lockstatus,0 jnz changelight mov al,41 mov bx,keypady+4+63 changelight: cmp lightcount,60 jc gotlight cmp lightcount,100 jnc gotlight dec al gotlight: mov ds,tempgraphics mov ah,0 mov di,keypadx+60 call showframe notenter: ret endp Singlekey proc near cmp graphicpress,al jnz gotkey add al,11 cmp presscount,8 jnc gotkey sub al,11 ; cmp presscount,10 ; jnc gotkey ; sub al,11 gotkey: mov ds,tempgraphics sub al,20 mov ah,0 call showframe ret endp Dumpkeypad proc near mov di,keypadx-3 mov bx,keypady-4 mov cl,120 mov ch,90 call multidump ret endp ;--------------------------------- Usemenu proc near call getridofreels call loadmenu call createpanel call showpanel call showicon mov newobs,0 call drawfloor call printsprites mov al,4 mov ah,0 mov di,menux-48 mov bx,menuy-4 mov ds,tempgraphics2 call showframe call getundermenu mov al,5 mov ah,0 mov di,menux+54 mov bx,menuy+72 mov ds,tempgraphics2 call showframe call worktoscreenm mov getback,0 menuloop: call delpointer call putundermenu call showmenu call readmouse call showpointer call vsync call dumppointer call dumpmenu call dumptextline mov bx,offset cs:menulist call checkcoords cmp getback,1 jnz menuloop mov manisoffscreen,0 call redrawmainscrn call getridoftemp call getridoftemp2 call restorereels call worktoscreenm ret menulist: dw menux+54,menux+68,menuy+72,menuy+88,quitkey dw 0,320,0,200,blank dw 0ffffh ret endp Dumpmenu proc near mov di,menux mov bx,menuy mov cl,48 mov ch,48 call multidump ret endp Getundermenu proc near mov di,menux mov bx,menuy mov cl,48 mov ch,48 mov ds,buffers mov si,undertimedtext call multiget ret endp Putundermenu proc near mov di,menux mov bx,menuy mov cl,48 mov ch,48 mov ds,buffers mov si,undertimedtext call multiput ret endp Showoutermenu proc near mov al,40 mov ah,0 mov di,menux-34 mov bx,menuy-40 mov ds,tempgraphics call showframe mov al,41 mov ah,0 mov di,menux+64-34 mov bx,menuy-40 mov ds,tempgraphics call showframe mov al,42 mov ah,0 mov di,menux-26 mov bx,menuy+57-40 mov ds,tempgraphics call showframe mov al,43 mov ah,0 mov di,menux+64-26 mov bx,menuy+57-40 mov ds,tempgraphics call showframe ret endp Showmenu proc near inc menucount cmp menucount,37*2 jnz menuframeok mov menucount,0 menuframeok: mov al,menucount shr al,1 mov ah,0 mov di,menux mov bx,menuy mov ds,tempgraphics call showframe ret endp Loadmenu proc near mov dx,offset cs:spritename3 call loadintotemp mov dx,offset cs:mongraphics2 call loadintotemp2 ret endp Viewfolder proc near mov manisoffscreen,1 call getridofall call loadfolder mov folderpage,0 call showfolder call worktoscreenm mov getback,0 folderloop: call delpointer call readmouse call showpointer call vsync call dumppointer call dumptextline mov bx,offset cs:folderlist call checkcoords cmp getback,0 jz folderloop mov manisoffscreen,0 call getridoftemp call getridoftemp2 call getridoftemp3 call getridoftempcharset call restoreall call redrawmainscrn call worktoscreenm ret folderlist: dw 280,320,160,200,quitkey dw 143,300,6,194,nextfolder dw 0,143,6,194,lastfolder dw 0,320,0,200,blank dw 0ffffh endp Nextfolder proc near cmp folderpage,12 jnz cannextf call blank ret cannextf: cmp commandtype,201 jz alreadynextf mov commandtype,201 mov al,16 call commandonly alreadynextf: mov ax,mousebutton cmp ax,oldbutton jz notnextf cmp ax,1 jz donextf notnextf: ret donextf: inc folderpage call folderhints call delpointer call showfolder mov mousebutton,0 mov bx,offset cs:folderlist call checkcoords call worktoscreenm ret endp Folderhints proc near cmp folderpage,5 jnz notaideadd cmp aidedead,1 jz notaideadd mov al,13 call getlocation cmp al,1 jz notaideadd mov al,13 call setlocation call showfolder mov al,30 call findtext1 mov di,0 mov bx,86 mov dl,141 mov ah,16 call printdirect call worktoscreenm mov cx,200 call hangonp ret notaideadd: cmp folderpage,9 jnz notaristoadd mov al,7 call getlocation cmp al,1 jz notaristoadd mov al,7 call setlocation call showfolder mov al,31 call findtext1 mov di,0 mov bx,86 mov dl,141 mov ah,16 call printdirect call worktoscreenm mov cx,200 call hangonp notaristoadd: ret endp Lastfolder proc near cmp folderpage,0 jnz canlastf call blank ret canlastf: cmp commandtype,202 jz alreadylastf mov commandtype,202 mov al,17 call commandonly alreadylastf: cmp folderpage,0 jz notlastf mov ax,mousebutton cmp ax,oldbutton jz notlastf cmp ax,1 jz dolastf notlastf: ret dolastf: dec folderpage call delpointer call showfolder mov mousebutton,0 mov bx,offset cs:folderlist call checkcoords call worktoscreenm ret endp Loadfolder proc near mov dx,offset cs:foldergraphic1 call loadintotemp mov dx,offset cs:foldergraphic2 call loadintotemp2 mov dx,offset cs:foldergraphic3 call loadintotemp3 mov dx,offset cs:characterset3 call loadtempcharset mov dx,offset cs:foldertext call loadtemptext ret endp Showfolder proc near mov commandtype,255 cmp folderpage,0 jz closedfolder call usetempcharset call createpanel2 mov ds,tempgraphics mov di,0 mov bx,0 mov al,0 mov ah,0 call showframe mov ds,tempgraphics mov di,143 mov bx,0 mov al,1 mov ah,0 call showframe mov ds,tempgraphics mov di,0 mov bx,92 mov al,2 mov ah,0 call showframe mov ds,tempgraphics mov di,143 mov bx,92 mov al,3 mov ah,0 call showframe call folderexit cmp folderpage,1 jz noleftpage call showleftpage noleftpage: cmp folderpage,12 jz norightpage call showrightpage norightpage: call usecharset1 call undertextline ret closedfolder: call createpanel2 mov ds,tempgraphics3 mov di,143-28 mov bx,0 mov al,0 mov ah,0 call showframe mov ds,tempgraphics3 mov di,143-28 mov bx,92 mov al,1 mov ah,0 call showframe call folderexit call undertextline ret endp Folderexit proc near mov ds,tempgraphics2 mov di,296 mov bx,178 mov al,6 mov ah,0 call showframe ret endp Showleftpage proc near mov ds,tempgraphics2 mov di,0 mov bx,12 mov al,3 mov ah,0 call showframe mov bx,12+5 mov cx,9 leftpageloop: push cx bx mov ds,tempgraphics2 mov di,0 mov al,4 mov ah,0 call showframe pop bx cx add bx,16 loop leftpageloop mov ds,tempgraphics2 mov di,0 mov al,5 mov ah,0 call showframe mov linespacing,8 mov charshift,91 mov kerning,1 mov bl,folderpage dec bl dec bl add bl,bl mov bh,0 add bx,bx mov es,textfile1 mov si,[es:bx] add si,66*2 mov di,2 mov bx,48 mov dl,140 mov cx,2 twolotsleft: push cx contleftpage: call printdirect add bx,linespacing cmp al,0 jnz contleftpage pop cx loop twolotsleft mov kerning,0 mov charshift,0 mov linespacing,10 mov es,workspace mov ds,workspace mov di,(48*320)+2 mov si,(48*320)+2+130 mov cx,120 flipfolder: push cx di si mov cx,65 flipfolderline: mov al,[es:di] mov ah,[es:si] mov [es:di],ah mov [es:si],al dec si inc di loop flipfolderline pop si di cx add si,320 add di,320 loop flipfolder ret endp Showrightpage proc near mov ds,tempgraphics2 mov di,143 mov bx,12 mov al,0 mov ah,0 call showframe mov bx,12+37 mov cx,7 rightpageloop: push cx bx mov ds,tempgraphics2 mov di,143 mov al,1 mov ah,0 call showframe pop bx cx add bx,16 loop rightpageloop mov ds,tempgraphics2 mov di,143 mov al,2 mov ah,0 call showframe mov linespacing,8 mov kerning,1 mov bl,folderpage dec bl add bl,bl mov bh,0 add bx,bx mov es,textfile1 mov si,[es:bx] add si,66*2 mov di,152 mov bx,48 mov dl,140 mov cx,2 twolotsright: push cx contrightpage: call printdirect add bx,linespacing cmp al,0 jnz contrightpage pop cx loop twolotsright mov kerning,0 mov linespacing,10 ret endp Entersymbol proc near mov manisoffscreen,1 call getridofreels mov dx,offset cs:symbolgraphic call loadintotemp mov symboltopx,24 mov symboltopdir,0 mov symbolbotx,24 mov symbolbotdir,0 call redrawmainscrn call showsymbol call undertextline call worktoscreenm mov getback,0 symbolloop: call delpointer call updatesymboltop call updatesymbolbot call showsymbol call readmouse call showpointer call vsync call dumppointer call dumptextline call dumpsymbol mov bx,offset cs:symbollist call checkcoords cmp getback,0 jz symbolloop cmp symbolbotnum,3 jnz symbolwrong cmp symboltopnum,5 jnz symbolwrong mov al,43 call removesetobject mov al,46 call placesetobject mov ah,roomnum add ah,12 mov al,0 call turnanypathon mov manisoffscreen,0 call redrawmainscrn call getridoftemp call restorereels call worktoscreenm mov al,13 call playchannel1 ret symbolwrong: mov al,46 call removesetobject mov al,43 call placesetobject mov ah,roomnum add ah,12 mov al,0 call turnanypathoff mov manisoffscreen,0 call redrawmainscrn call getridoftemp call restorereels call worktoscreenm ret symbollist: dw symbolx+40,symbolx+64,symboly+2,symboly+16,quitsymbol dw symbolx,symbolx+52,symboly+20,symboly+50,settopleft dw symbolx+52,symbolx+104,symboly+20,symboly+50,settopright dw symbolx,symbolx+52,symboly+50,symboly+80,setbotleft dw symbolx+52,symbolx+104,symboly+50,symboly+80,setbotright dw 0,320,0,200,blank dw 0ffffh endp Quitsymbol proc near cmp symboltopx,24 jnz blank cmp symbolbotx,24 jnz blank cmp commandtype,222 jz alreadyqs mov commandtype,222 mov al,18 call commandonly alreadyqs: mov ax,mousebutton cmp ax,oldbutton jz notqs and ax,1 jnz doqs notqs: ret doqs: mov getback,1 ret endp Settopleft proc near cmp symboltopdir,0 jnz blank cmp commandtype,210 jz alreadytopl mov commandtype,210 mov al,19 call commandonly alreadytopl: cmp mousebutton,0 jz notopleft mov symboltopdir,-1 notopleft: ret endp Settopright proc near cmp symboltopdir,0 jnz blank cmp commandtype,211 jz alreadytopr mov commandtype,211 mov al,20 call commandonly alreadytopr: cmp mousebutton,0 jz notopright mov symboltopdir,1 notopright: ret endp Setbotleft proc near cmp symbolbotdir,0 jnz blank cmp commandtype,212 jz alreadybotl mov commandtype,212 mov al,21 call commandonly alreadybotl: cmp mousebutton,0 jz nobotleft mov symbolbotdir,-1 nobotleft: ret endp Setbotright proc near cmp symbolbotdir,0 jnz blank cmp commandtype,213 jz alreadybotr mov commandtype,213 mov al,22 call commandonly alreadybotr: cmp mousebutton,0 jz nobotright mov symbolbotdir,1 nobotright: ret endp Dumpsymbol proc near mov newtextline,0 mov di,symbolx mov bx,symboly+20 mov cl,104 mov ch,60 call multidump ret endp Showsymbol proc near mov al,12 mov ah,0 mov di,symbolx mov bx,symboly mov ds,tempgraphics call showframe mov al,symboltopx mov ah,0 mov di,ax add di,symbolx-44 mov al,symboltopnum mov bx,symboly+20 mov ds,tempgraphics mov ah,32 push ax di bx ds call showframe pop ds bx di ax call nextsymbol add di,49 push ax di bx ds call showframe pop ds bx di ax call nextsymbol add di,49 call showframe mov al,symbolbotx mov ah,0 mov di,ax add di,symbolx-44 mov al,symbolbotnum add al,6 mov bx,symboly+49 mov ds,tempgraphics mov ah,32 push ax di bx ds call showframe pop ds bx di ax call nextsymbol add di,49 push ax di bx ds call showframe pop ds bx di ax call nextsymbol add di,49 call showframe ret endp Nextsymbol proc near inc al cmp al,6 jz topwrap cmp al,12 jz botwrap ret topwrap: mov al,0 ret botwrap: mov al,6 ret endp Updatesymboltop proc near cmp symboltopdir,0 jz topfinished cmp symboltopdir,-1 jz backwards inc symboltopx cmp symboltopx,49 jnz notwrapfor mov symboltopx,0 dec symboltopnum cmp symboltopnum,-1 jnz topfinished mov symboltopnum,5 ret notwrapfor: cmp symboltopx,24 jnz topfinished mov symboltopdir,0 ret backwards: dec symboltopx cmp symboltopx,-1 jnz notwrapback mov symboltopx,48 inc symboltopnum cmp symboltopnum,6 jnz topfinished mov symboltopnum,0 ret notwrapback: cmp symboltopx,24 jnz topfinished mov symboltopdir,0 topfinished: ret endp Updatesymbolbot proc near cmp symbolbotdir,0 jz botfinished cmp symbolbotdir,-1 jz backwardsbot inc symbolbotx cmp symbolbotx,49 jnz notwrapforb mov symbolbotx,0 dec symbolbotnum cmp symbolbotnum,-1 jnz botfinished mov symbolbotnum,5 ret notwrapforb: cmp symbolbotx,24 jnz botfinished mov symbolbotdir,0 ret backwardsbot: dec symbolbotx cmp symbolbotx,-1 jnz notwrapbackb mov symbolbotx,48 inc symbolbotnum cmp symbolbotnum,6 jnz botfinished mov symbolbotnum,0 ret notwrapbackb: cmp symbolbotx,24 jnz botfinished mov symbolbotdir,0 botfinished: ret endp Dumpsymbox proc near cmp dumpx,-1 jz nodumpsym mov di,dumpx mov bx,dumpy mov cl,30 mov ch,77;30 call multidump mov dumpx,-1 nodumpsym: ret endp Usediary proc near call getridofreels mov dx,offset cs:diarygraphic call loadintotemp mov dx,offset cs:diarytext call loadtemptext mov dx,offset cs:characterset3 call loadtempcharset call createpanel call showicon call showdiary call undertextline call showdiarypage call readmouse call showpointer call worktoscreen call delpointer mov getback,0 diaryloop: call delpointer call readmouse call showdiarykeys call showpointer call vsync call dumppointer call dumpdiarykeys call dumptextline mov bx,offset cs:diarylist call checkcoords cmp getback,0 jz diaryloop call getridoftemp call getridoftemptext call getridoftempcharset call restorereels mov manisoffscreen,0 call redrawmainscrn call worktoscreenm ret diarylist: dw diaryx+94,diaryx+110,diaryy+97,diaryy+113,diarykeyn dw diaryx+151,diaryx+167,diaryy+71,diaryy+87,diarykeyp dw diaryx+176,diaryx+192,diaryy+108,diaryy+124,quitkey dw 0,320,0,200,blank dw 0ffffh ret endp Showdiary proc near mov al,1 mov ah,0 mov di,diaryx mov bx,diaryy+37 mov ds,tempgraphics call showframe mov al,2 mov ah,0 mov di,diaryx+176 mov bx,diaryy+108 mov ds,tempgraphics call showframe ret endp Showdiarykeys proc near cmp presscount,0 jz nokeyatall dec presscount cmp presscount,0 jz nokeyatall cmp pressed,"N" jnz nokeyn mov al,3 cmp presscount,1 jz gotkeyn mov al,4 gotkeyn: mov ah,0 mov di,diaryx+94 mov bx,diaryy+97 mov ds,tempgraphics call showframe cmp presscount,1 jnz notshown call showdiarypage notshown: ret nokeyn: mov al,5 cmp presscount,1 jz gotkeyp mov al,6 gotkeyp: mov ah,0 mov di,diaryx+151 mov bx,diaryy+71 mov ds,tempgraphics call showframe cmp presscount,1 jnz notshowp call showdiarypage notshowp: ret nokeyatall: ret endp Dumpdiarykeys proc near cmp presscount,1 jnz notdumpdiary cmp sartaindead,1 jz notsartadd cmp diarypage,5 jnz notsartadd cmp diarypage,5 jnz notsartadd mov al,6 call getlocation cmp al,1 jz notsartadd mov al,6 call setlocation call delpointer mov al,12 call findtext1 mov di,70 ;diaryx+48 mov bx,106 ;diaryy+16 mov dl,241 mov ah,16 call printdirect call worktoscreenm mov cx,200 call hangonp call createpanel call showicon call showdiary call showdiarypage call worktoscreenm call showpointer ret notsartadd: mov di,diaryx+48 mov bx,diaryy+15 mov cl,200 mov ch,16 call multidump notdumpdiary: mov di,diaryx+94 mov bx,diaryy+97 mov cl,16 mov ch,16 call multidump mov di,diaryx+151 mov bx,diaryy+71 mov cl,16 mov ch,16 call multidump ret endp Diarykeyp proc near cmp commandtype,214 jz alreadykeyp mov commandtype,214 mov al,23 call commandonly alreadykeyp: cmp mousebutton,0 jz notkeyp mov ax,oldbutton cmp ax,mousebutton jz notkeyp cmp presscount,0 jnz notkeyp mov al,16 call playchannel1 mov presscount,12 mov pressed,"P" dec diarypage cmp diarypage,-1 jnz notkeyp mov diarypage,11 notkeyp: ret endp Diarykeyn proc near cmp commandtype,213 jz alreadykeyn mov commandtype,213 mov al,23 call commandonly alreadykeyn: cmp mousebutton,0 jz notkeyn mov ax,oldbutton cmp ax,mousebutton jz notkeyn cmp presscount,0 jnz notkeyn mov al,16 call playchannel1 mov presscount,12 mov pressed,"N" inc diarypage cmp diarypage,12 jnz notkeyn mov diarypage,0 notkeyn: ret endp Showdiarypage proc near mov al,0 mov ah,0 mov di,diaryx mov bx,diaryy mov ds,tempgraphics call showframe mov al,diarypage call findtext1 mov kerning,1 call usetempcharset mov di,diaryx+48 mov bx,diaryy+16 mov dl,240 mov ah,16 mov charshift,91+91 call printdirect mov di,diaryx+129 mov bx,diaryy+16 mov dl,240 mov ah,16 call printdirect mov di,diaryx+48 mov bx,diaryy+23 mov dl,240 mov ah,16 call printdirect mov kerning,0 mov charshift,0 call usecharset1 ret endp Findtext1 proc near mov ah,0 mov si,ax add si,si mov es,textfile1 mov ax,[es:si] add ax,textstart mov si,ax ret endp