;Copyright (c) 1990-2012 by Neil Dodwell ;Released with permission from Neil Dodwell under GPLv2 ;See LICENSE file for full license text Usemon proc near mov lasttrigger,0 push cs ;start off with no file name pop es mov di,offset cs:currentfile+1 mov cx,12 mov al,32 rep stosb push cs ;start off with no file name pop es mov di,offset cs:operand1+1 mov cx,12 mov al,32 rep stosb push cs ;clear all keys pop es mov di,offset cs:keys mov byte ptr [es:di],1 add di,26 mov cx,3 keyloop: mov byte ptr [es:di],0 add di,26 loop keyloop call createpanel call showpanel call showicon call drawfloor call getridofall ;reels mov dx,offset cs:mongraphicname call loadintotemp call loadpersonal call loadnews call loadcart mov dx,offset cs:characterset2 call loadtempcharset call printoutermon call initialmoncols call printlogo call worktoscreen call turnonpower call fadeupyellows call fadeupmonfirst mov monadx,76 mov monady,141 mov al,1 call monmessage mov cx,120 call hangoncurs mov al,2 call monmessage mov cx,60 call randomaccess mov al,3 call monmessage mov cx,100 call hangoncurs call printlogo call scrollmonitor mov bufferin,0 mov bufferout,0 moreinput: mov di,monadx mov bx,monady push di bx call input pop bx di mov monadx,di mov monady,bx call execcommand cmp al,0 jz moreinput endmon: call getridoftemp call getridoftempcharset mov es,textfile1 call deallocatemem mov es,textfile2 call deallocatemem mov es,textfile3 call deallocatemem mov getback,1 mov al,26 call playchannel1 mov manisoffscreen,0 call restoreall ;reels call redrawmainscrn call worktoscreenm ret endp Printoutermon proc near mov di,40 mov bx,32 mov ds,tempgraphics mov al,1 mov ah,0 call showframe mov di,264 mov bx,32 mov ds,tempgraphics mov al,2 mov ah,0 call showframe mov di,40 mov bx,12 mov ds,tempgraphics mov al,3 mov ah,0 call showframe mov di,40 mov bx,164 mov ds,tempgraphics mov al,4 mov ah,0 call showframe ret endp Loadpersonal proc near mov al,location mov dx,offset cs:monitorfile1 cmp al,0 jz foundpersonal cmp al,42 jz foundpersonal mov dx,offset cs:monitorfile2 cmp al,2 jz foundpersonal foundpersonal: call openfile call readheader mov bx,[es:di] push bx mov cl,4 shr bx,cl call allocatemem mov textfile1,ax mov ds,ax pop cx mov dx,0 call readfromfile call closefile ret endp Loadnews proc near ;textfile2 holds information ;accessable by anyone mov al,newsitem mov dx,offset cs:monitorfile10 cmp al,0 jz foundnews mov dx,offset cs:monitorfile11 cmp al,1 jz foundnews mov dx,offset cs:monitorfile12 cmp al,2 jz foundnews mov dx,offset cs:monitorfile13 foundnews: call openfile call readheader mov bx,[es:di] push bx mov cl,4 shr bx,cl call allocatemem mov textfile2,ax mov ds,ax pop cx mov dx,0 call readfromfile call closefile ret endp Loadcart proc near call lookininterface mov dx,offset cs:monitorfile20 cmp al,0 jz gotcart mov dx,offset cs:monitorfile21 cmp al,1 jz gotcart mov dx,offset cs:monitorfile22 cmp al,2 jz gotcart mov dx,offset cs:monitorfile23 cmp al,3 jz gotcart mov dx,offset cs:monitorfile24 gotcart: call openfile call readheader mov bx,[es:di] push bx mov cl,4 shr bx,cl call allocatemem mov textfile3,ax mov ds,ax pop cx mov dx,0 call readfromfile call closefile ret endp Lookininterface proc near mov al,"I" mov ah,"N" mov cl,"T" mov ch,"F" call findsetobject ;this bit searches set obs ;until the interface is found ;al holds object number mov ah,1 ;ah holds type, 1=set object call checkinside ;this searches for any extra ;object inside the interface.. cmp cl,numexobjects jz emptyinterface mov al,[es:bx+15] ;get the last letter of ID code inc al ret emptyinterface: mov al,0 ret endp Turnonpower proc near mov cx,3 powerloop: push cx call powerlighton mov cx,30 call hangon call powerlightoff mov cx,30 call hangon pop cx loop powerloop call powerlighton ret endp Randomaccess proc near accessloop: push cx call vsync call vsync call randomnum1 and al,15 cmp al,10 jc off call accesslighton jmp chosenaccess off: call accesslightoff chosenaccess: pop cx loop accessloop call accesslightoff ret endp Powerlighton proc near mov di,257+4 mov bx,182 mov ds,tempgraphics mov al,6 mov ah,0 push di bx call showframe pop bx di mov cl,12 mov ch,8 call multidump ret endp Powerlightoff proc near mov di,257+4 mov bx,182 mov ds,tempgraphics mov al,5 mov ah,0 push di bx call showframe pop bx di mov cl,12 mov ch,8 call multidump ret endp Accesslighton proc near mov di,74 mov bx,182 mov ds,tempgraphics mov al,8 mov ah,0 push di bx call showframe pop bx di mov cl,12 mov ch,8 call multidump ret endp Accesslightoff proc near mov di,74 mov bx,182 mov ds,tempgraphics mov al,7 mov ah,0 push di bx call showframe pop bx di mov cl,12 mov ch,8 call multidump ret endp Locklighton proc near mov di,56 mov bx,182 mov ds,tempgraphics mov al,10 mov ah,0 push di bx call showframe pop bx di mov cl,12 mov ch,8 call multidump ret endp Locklightoff proc near mov di,56 mov bx,182 mov ds,tempgraphics mov al,9 mov ah,0 push di bx call showframe pop bx di mov cl,12 mov ch,8 call multidump ret endp Input proc near push cs pop es mov di,offset cs:inputline mov cx,64 mov al,0 rep stosb mov curpos,0 mov al,">" mov di,monadx mov bx,monady mov ds,tempcharset mov ah,0 call printchar mov di,monadx mov bx,monady mov cl,6 mov ch,8 call multidump add monadx,6 mov ax,monadx mov curslocx,ax mov ax,monady mov curslocy,ax waitkey: call printcurs call vsync call delcurs call readkey mov al,currentkey cmp al,0 jz waitkey cmp al,13 jz endofinput cmp al,8 jnz notdel cmp curpos,0 jz waitkey call delchar jmp waitkey notdel: cmp curpos,28 jz waitkey cmp currentkey,32 jnz notleadingspace cmp curpos,0 jz waitkey notleadingspace: call makecaps push cs pop es mov si,curpos add si,si add si,offset cs:inputline mov [es:si],al cmp al,"Z"+1 jnc waitkey push ax es si mov di,monadx mov bx,monady mov ds,mapstore mov ax,curpos xchg al,ah mov si,ax mov cl,8 mov ch,8 call multiget pop si es ax push es si mov di,monadx mov bx,monady mov ds,tempcharset mov ah,0 call printchar pop si es ;dec cx mov [es:si+1],cl mov ch,0 add monadx,cx inc curpos add curslocx,cx jmp waitkey endofinput: ret endp Makecaps proc near cmp al,"a" jc notupperc sub al,32 notupperc: ret endp Delchar proc near dec curpos mov si,curpos add si,si push cs pop es add si,offset cs:inputline mov byte ptr [es:si],0 mov al,[es:si+1] mov ah,0 sub monadx,ax sub curslocx,ax mov di,monadx mov bx,monady mov ds,mapstore mov ax,curpos xchg al,ah mov si,ax mov cl,8 mov ch,8 call multiput mov di,monadx mov bx,monady mov cl,al mov ch,8 call multidump ret endp Execcommand proc near push cs pop es mov bx,offset cs:comlist push cs pop ds mov si,offset cs:inputline mov al,[si] cmp al,0 jnz notblankinp call scrollmonitor ret notblankinp: mov cl,0 comloop: push bx si comloop2: mov al,[si] add si,2 mov ah,[es:bx] inc bx cmp ah,32 jz foundcom cmp al,ah jz comloop2 pop si bx add bx,10 inc cl cmp cl,6 jnz comloop call neterror mov al,0 ret foundcom: pop si bx cmp cl,1 jz testcom cmp cl,2 jz directory cmp cl,3 jz accesscom cmp cl,4 jz signoncom cmp cl,5 jz keyscom jmp quitcom directory: call dircom mov al,0 ret signoncom: call signon mov al,0 ret accesscom: call read mov al,0 ret keyscom: call showkeys mov al,0 ret testcom: mov al,6 call monmessage mov al,0 ret quitcom: mov al,1 ret comlist: db "EXIT " db "HELP " db "LIST " db "READ " db "LOGON " db "KEYS " keys: db 1,0,"PUBLIC PUBLIC ",0 db 0,0,"BLACKDRAGON RYAN ",0 db 0,0,"HENDRIX LOUIS ",0 db 0,0,"SEPTIMUS BECKETT ",0 db 255,255 operand1: db " ",0 rootdir: db 34,"ROOT ",0 currentfile db 34," ",0 endp Neterror proc near mov al,5 call monmessage call scrollmonitor ret endp Dircom proc near mov cx,30 call randomaccess call parser cmp byte ptr [es:di+1],0 jz dirroot call dirfile ret dirroot: mov logonum,0 push cs pop ds mov si,offset cs:rootdir inc si push cs pop es mov di,offset cs:currentfile inc di mov cx,12 rep movsb call monitorlogo call scrollmonitor mov al,9 call monmessage mov es,textfile1 call searchforfiles mov es,textfile2 call searchforfiles mov es,textfile3 call searchforfiles call scrollmonitor ret endp Searchforfiles proc near mov bx,textstart directloop1: mov al,[es:bx] inc bx cmp al,"*" jz endofdir cmp al,34 jnz directloop1 call monprint jmp directloop1 endofdir: ret endp Signon proc near call parser inc di push cs pop ds mov si,offset cs:keys mov cx,4 signonloop: push cx si di add si,14 mov cx,11 signonloop2: lodsb cmp al,32 jz foundsign call makecaps mov ah,[es:di] inc di cmp al,ah jnz nomatch loop signonloop2 nomatch: pop di si cx add si,26 loop signonloop mov al,13 call monmessage ret foundsign: pop di si cx ;ds:si contains ad of key matched mov bx,si push ds pop es ;now ds:si is in es:bx cmp byte ptr [es:bx],0 jz notyetassigned mov al,17 call monmessage ret notyetassigned: push es bx call scrollmonitor mov al,15 call monmessage mov di,monadx mov bx,monady push di bx call input pop bx di mov monadx,di mov monady,bx pop bx es push es bx add bx,2 push cs pop ds mov si,offset cs:inputline checkpass: lodsw mov ah,[es:bx] inc bx ;cmp al,0 cmp ah,32 jz passpassed cmp al,ah jz checkpass passerror: pop bx es call scrollmonitor mov al,16 call monmessage ret passpassed: mov al,14 call monmessage pop bx es push es bx add bx,14 call monprint call scrollmonitor pop bx es mov byte ptr [es:bx],1 ret endp Showkeys proc near mov cx,10 call randomaccess call scrollmonitor mov al,18 call monmessage push cs pop es mov bx,offset cs:keys mov cx,4 keysloop: push cx bx cmp byte ptr [es:bx],0 jz notheld add bx,14 call monprint notheld: pop bx cx add bx,26 loop keysloop call scrollmonitor ret endp Read proc near mov cx,40 call randomaccess call parser cmp byte ptr [es:di+1],0 jnz okcom call neterror ret okcom: push cs pop es mov di,offset cs:currentfile mov ax,textfile1 mov monsource,ax mov ds,ax mov si,textstart call searchforstring cmp al,0 jz foundfile2 mov ax,textfile2 mov monsource,ax mov ds,ax mov si,textstart call searchforstring cmp al,0 jz foundfile2 mov ax,textfile3 mov monsource,ax mov ds,ax mov si,textstart call searchforstring cmp al,0 jz foundfile2 mov al,7 call monmessage ret foundfile2: call getkeyandlogo cmp al,0 jz keyok1 ret keyok1: push cs pop es mov di,offset cs:operand1 mov ds,monsource call searchforstring cmp al,0 jz findtopictext mov al,oldlogonum mov logonum,al mov al,11 call monmessage ret findtopictext: inc bx push es bx call monitorlogo call scrollmonitor pop bx es moretopic: call monprint mov al,[es:bx] cmp al,34 jz endoftopic cmp al,"=" jz endoftopic cmp al,"*" jz endoftopic push es bx call processtrigger mov cx,24 call randomaccess pop bx es jmp moretopic endoftopic: call scrollmonitor ret endp Dirfile proc near mov al,34 mov [es:di],al push es di ;save start point held in es:di mov ds,textfile1 mov si,textstart call searchforstring cmp al,0 jz foundfile pop di es push es di mov ds,textfile2 mov si,textstart call searchforstring cmp al,0 jz foundfile pop di es push es di mov ds,textfile3 mov si,textstart call searchforstring cmp al,0 jz foundfile pop di es mov al,7 call monmessage ret foundfile: pop ax ax ;discard old values of es:di call getkeyandlogo cmp al,0 jz keyok2 ret keyok2: push es bx push cs pop ds mov si,offset cs:operand1+1 push cs pop es mov di,offset cs:currentfile+1 mov cx,12 rep movsb call monitorlogo call scrollmonitor mov al,10 call monmessage pop bx es directloop2: mov al,[es:bx] inc bx cmp al,34 jz endofdir2 cmp al,"*" jz endofdir2 cmp al,"=" jnz directloop2 call monprint jmp directloop2 endofdir2: call scrollmonitor ret endp Getkeyandlogo proc near inc bx mov al,[es:bx] sub al,48 mov newlogonum,al add bx,2 mov al,[es:bx] sub al,48 mov keynum,al inc bx push es bx mov al,keynum mov ah,0 mov cx,26 mul cx push cs pop es mov bx,offset cs:keys add bx,ax mov al,[es:bx] cmp al,1 jz keyok push bx es mov al,12 call monmessage pop es bx add bx,14 call monprint call scrollmonitor pop bx es mov al,1 ret keyok: pop bx es mov al,newlogonum mov logonum,al mov al,0 ret endp Searchforstring proc near ;finds string at es:di in ;text at ds:si mov dl,[es:di] ;needs to know first character ;if it's an equals then we must ;stop at the next quotation mark mov cx,di ;need to remember starting point restartlook: mov di,cx mov bx,si mov dh,0 ;dh holds count of brackets ;brackets are either " or = keeplooking: lodsb call makecaps cmp al,"*" jz notfound cmp dl,"=" jnz nofindingtopic ;are we looking for a topic? cmp al,34 ;if YES, check we haven't reached jz notfound ;the end of this file. nofindingtopic: mov ah,[es:di] cmp al,dl ;all searches bracketed by same thing jnz notbracket inc dh cmp dh,2 jz complete notbracket: cmp al,ah jnz restartlook inc di jmp keeplooking complete: push ds ;es:bx returns found string pop es mov al,0 mov bx,si ret notfound: mov al,1 ret endp Parser proc near push cs pop es mov di,offset cs:operand1 mov cx,13 mov al,0 rep stosb mov di,offset cs:operand1 mov al,"=" stosb push cs pop ds mov si,offset cs:inputline notspace1: lodsw cmp al,32 jz stillspace1 cmp al,0 jnz notspace1 jmp finishpars stillspace1: lodsw cmp al,32 jz stillspace1 copyin1: stosb lodsw cmp al,0 jz finishpars cmp al,32 jnz copyin1 finishpars: mov di,offset cs:operand1 ret endp Scrollmonitor proc near push ax bx cx dx di si es ds call printlogo mov di,monadx mov bx,monady call printundermon mov ax,monady call worktoscreen mov al,25 call playchannel1 pop ds es si di dx cx bx ax ret endp Lockmon proc near cmp lasthardkey,57 jnz notlock call locklighton lockloop: cmp lasthardkey,57 jz lockloop call locklightoff notlock: ret endp Monitorlogo proc near mov al,logonum cmp al,oldlogonum jz notnewlogo mov oldlogonum,al ;call fadedownmon call printlogo call printundermon call worktoscreen call printlogo ;call fadeupmon call printlogo mov al,26 call playchannel1 mov cx,20 call randomaccess ret notnewlogo: call printlogo ret endp Printlogo proc near mov di,56 mov bx,32 mov ds,tempgraphics mov al,0 mov ah,0 call showframe call showcurrentfile ret endp Showcurrentfile proc near mov di,178 ;99 mov bx,37 mov si,offset cs:currentfile+1 curfileloop: mov al,[cs:si] cmp al,0 jz finishfile inc si push si if foreign call modifychar endif mov ds,tempcharset mov ah,0 call printchar pop si jmp curfileloop finishfile: ret endp Monmessage proc near mov es,textfile1 mov bx,textstart mov cl,al mov ch,0 monmessageloop: mov al,[es:bx] inc bx cmp al,"+" jnz monmessageloop loop monmessageloop call monprint ret endp Processtrigger proc near cmp lasttrigger,"1" jnz notfirsttrigger mov al,8 call setlocation mov al,45 call triggermessage ret notfirsttrigger: cmp lasttrigger,"2" jnz notsecondtrigger mov al,9 call setlocation mov al,55 call triggermessage ret notsecondtrigger: cmp lasttrigger,"3" jnz notthirdtrigger mov al,2 call setlocation mov al,59 call triggermessage notthirdtrigger: ret endp Triggermessage proc near push ax mov di,174 mov bx,153 mov cl,200 mov ch,63 mov ds,mapstore mov si,0 call multiget pop ax call findpuztext mov di,174 mov bx,156 mov dl,141 mov ah,16 call printdirect mov cx,140 call hangon call worktoscreen mov cx,340 call hangon mov di,174 mov bx,153 mov cl,200 mov ch,63 mov ds,mapstore mov si,0 call multiput call worktoscreen mov lasttrigger,0 ret endp Printcurs proc near push si di ds dx bx es mov di,curslocx mov bx,curslocy mov cl,6 mov ch,8 cmp foreignrelease, 0 jz $1 sub bx,3 mov ch,11 $1: mov ds,buffers mov si,textunder push di bx call multiget pop bx di push bx di inc maintimer mov ax,maintimer and al,16 jnz flashcurs mov al,"/" sub al,32 mov ah,0 mov ds,tempcharset call showframe flashcurs: pop di bx sub di,6 mov cl,12 mov ch,8 cmp foreignrelease, 0 jz $2 mov ch,11 $2: call multidump pop es bx dx ds di si ret endp Delcurs proc near push es bx di ds dx si mov di,curslocx mov bx,curslocy mov cl,6 mov ch,8 cmp foreignrelease, 0 jz $1 sub bx,3 mov ch,11 $1: push di bx cx mov ds,buffers mov si,textunder call multiput pop cx bx di call multidump finishcurdel: pop si dx ds di bx es ret endp