dosseg Locals .286 SCROLLWIDTH = 200 DISPLAYWIDTH = 160 stacks segment byte stack 'stack' thestak db 256 dup (0h) ;just need a marker size =500 bytes stacks ends code segment byte public 'code' assume cs:code, ds:code, es:code, ss:stacks start: mov ax,es mov ds,ax mov cs:[dseg],ax mov si,128 lodsb xor cx,cx mov cl,al cmp cx,20 jbe NotTooMuch mov cx,19 NotTooMuch: mov cs:[inputlength],cx mov ax,cs mov es,ax mov di,offset inputstring rep movsb mov ax,cs mov ds,ax mov es,ax mov bx,ss add bx,20h mov cs:[Charseg],bx add bx,4000 mov cs:[charbakseg],bx add bx,4000 mov cs:[scrollseg],bx jmp main ;===- data -=== Basex equ 10 Basey equ 20 Dseg dw 0 credits db 13,10,"TGA Palette Grabber",13,10 db " By Ben Gardner",13,10,"$" grabtitle db " Character grabber by Ben Gardner$" cwidth db " Width: 00$" Height db "Height: 00$" HitReturn db "Hit [RETURN] when done.$" TopLine db "C: B: " Charnum db "CHAR: - - 00 00x00 W-00$" ;28 chars colors db 255 properuse db 13,10,"VCH Character Editor:",13,10 db " Use: CHREDIT Filename (must be a VCH file)",13,10 db "Directory paths not supported.$",13,10,'$' inputstring db 20 dup ('~'),"$","$" inputlength dw 0 db 10 dup (0) VCHname db "default.VCH",0,0,0,0,0,0,0 ,"$" ErrorLook dw offset properuse,offset properuse,offset Nofile dw offset Nopath,offset Nohandle,OFFSET Noaccess presskey db 13,10,"Press any key to return to dos.$" nofile db 10,13,"File not found error.$" nopath db 10,13,"Path not found error.$" nohandle db 10,13,"No handles available.$" noaccess db 10,13,"Access to file denied.$" errormes db 10,13,"Program aborted.$" diskfull db 10,13,"Disk full.$" Warning db "ALL data may be messed up.",10,13 db " Resize anyway? (Y/N)$" NoPal db "File not found: " PalName db "default.Pal",0,0,0,0,0,0,"$" HEADLOAD db "VGACH" ;R" From db " " sizex db 10 sizey db 10 NumChars db 64 CHARWIDTH db 255 dup(0) Curchar db 0 xpos db 0 ypos db 0 pal db 768 dup (0) PALTMP DB 768 DUP (0) Clip db 1024 dup (0) borderx dw 0 bordery dw 0 borderxsize dw 0 borderysize dw 0 bordercolor db 0 vgaseg dw 0a000h Charseg dw 0 Scrollseg dw 0 CharbakSeg dw 0 Fadestep db 0 XYsize dw 0 Scrollcount dw DISPLAYWIDTH ;used to count current stuff scrollSpeed dw 1 ;number of bytes to scroll per update Scrollletter dw 0 ;offset in scrollmsg for next char CurrentColor db 0 BackgroundColor db 0 messoff dw offset ScrollMsg2 ScrollMsg db " HELLO, GUYS! THIS CHARACTER SET EDITOR WAS CREATED BY" DB " DRAEDEN... HERE IS A LITTLE HELP: F1: CUT, F2:PASTE, " DB "F3: SHIFT LEFT, F4: SHIFT RIGHT, F5: SHIFT UP, F6: DOWN, " DB "F7: FLIP VERTICLE, F8: FLIP HORIZONTAL, F9: GRAB COLOR UNDER CURSOR, " DB "F10: RESTORE CURRENT CHAR, CONT-F1: SAVE FONT, [ AND ] CHANGE CURRENT " DB "COLOR, CONT-[ AND ] CHANGE BACKGROUND COLOR, " DB "LEFT SHIFT: WRITES CURRENT COLOR, RIGHT SHIFT: WRITES BACKGROUND COLOR, " DB "CONT-Q: QUIT, " DB "ARROW KEYS MOVE THE CURSOR, +/- " DB "CHANGE CURRENT CHAR... SIMPLE ENOUGH... HERE'S THE CHARACTER SET: " Scrollmsg2 db 255 dup (0),0 ;========- SubRoutines -======== Waitkey proc near here: mov ah,1 int 16h ; has a key been pressed? jz HERE ; no, goto HERE mov ah,0 int 16h ; yes, get the character ret waitkey endp CaptureFilename proc near mov ax,cs mov ds,ax mov es,ax mov si,offset inputstring mov di,offset VCHname xor bl,bl Nospace: lodsb cmp al,'~' je capdone cmp al,'.' je capdone cmp al,' ' je nospace stosb inc bl cmp bl,8 jb nospace Capdone: mov al,'.' stosb mov al,'V' stosb mov al,'C' stosb mov al,'H' stosb mov al,0 stosb mov al,'$' stosb mov di,offset palname mov si,offset VCHname mov cx,14 rep movsb mov di,offset palname+1 ;+1 to get past dot xor bh,bh add di,bx ;bx = 0 thru 7 mov al,'P' stosb mov al,'A' stosb mov al,'L' stosb ret CaptureFileName endp DisplayText proc near pusha mov bl,ah ;ah=xpos xor bh,bh mov cl,[sizey] mul cl xor ch,ch imul ax,ax,320 mov di,ax mov al,[sizex] mul bl add di,ax ;screen location mov ax,cs:[vgaseg] mov es,ax mov bx,dx ;string location displayloop: mov al,cs:[bx] or al,al je Textdone sub al,cs:[From];' ' cmp al,cs:[NUmCHARS] ja skipit call putchar ;al= frame # es:di is dest mov cl,cs:[sizex] xor ch,ch add di,cx skipit: inc bx jmp displayloop TextDone: popa ret DisplayText endp ;Destroys AX, DX, CX PutChar proc near ;al has char to print push ds push si push di xor ah,ah mov dx,cs:[xysize] mul dx mov si,ax mov ax,cs:[charseg] mov ds,ax mov cl,cs:[sizex] mov ch,cs:[sizey] push di putloop: movsb dec cl jne putloop mov cl,cs:[sizex] pop di add di,SCROLLWIDTH push di dec ch jne putloop pop ax pop di pop si pop ds ret PutChar endp ;ES has segment to clear, al has byte to clear to ClearVga proc near xor di,di mov ah,al mov cx,32000 rep stosw ret ClearVga endp Scroll proc near push ds push es mov ax,cs:[scrollseg] mov es,ax mov ds,ax cld xor di,di mov si,cs:[scrollspeed] mov cl,cs:[sizey] xor ch,ch imul cx,cx,SCROLLWIDTH/2 rep movsw mov ax,cs:[scrollcount] ;scrollcount-scrollspeed sub ax,cs:[scrollspeed] push ax cmp ax,DISPLAYWIDTH ja donescroll ;dont need a new char yet mov di,ax tryagain: mov bx,cs:[scrollletter] add bx,cs:[messoff] inc cs:[scrollletter] mov al,cs:[bx] or al,al jne nozero mov cs:[scrollletter],0 nozero: sub al,' ' cmp al,cs:[numchars] jae tryagain mov bl,al xor bh,bh mov bl,cS:[CHARWIDTH+BX] pop dx add dx,bx mov cs:[scrollcount],dx call putchar jmp byescroll Donescroll: pop ax mov cs:[scrollcount],ax byescroll: mov ax,cs:[vgaseg] mov es,ax xor si,si mov di,320*150+160-8 mov bl,cs:[sizey] mov cx,160 push cx scrcopy: pop cx push cx rep movsb add si,SCROLLWIDTH-DISPLAYWIDTH add di,320-DISPLAYWIDTH dec bl jne scrcopy pop cx pop es pop ds ret scroll endp FadeOut proc near push ds push es cld mov ax,cs mov ds,ax mov es,ax mov bx,768 Foloop: cmp [paltmp+bx],0 je nodec dec [paltmp+bx] nodec: dec bx jne Foloop writetopal: mov dx,03c8h mov al,0 out dx,al inc dx xor cx,cx mov si,offset paltmp fadeem: lodsb out dx,al inc cx cmp cx,768 jbe fadeem pop es pop ds ret FadeOut endp drawdot proc near push es push ax push bx push di mov ax,0a000h mov es,ax mov al,dh xor ah,ah xor bh,bh shl ax,2 ;blocks are 4 high add ax,BASEY imul ax,ax,320 mov bl,dl shl bx,2 ;4 wide add ax,bx add ax,BASEx mov di,ax mov ah,cl mov al,ah stosw stosw add di,316 stosw stosw add di,316 stosw stosw add di,316 stosw stosw mov al,dh xor ah,ah add ax,12 imul ax,ax,320 add ax,174 mov bl,dl xor bh,bh add ax,bx mov di,ax mov al,cl stosb donedot: pop di pop bx pop ax pop es ret drawdot endp LOADDAT proc near mov dx,offset VCHname ;load in VCH set sub al,al mov ah,3dh int 21h jnc noabort22 jmp abort Noabort22: mov bx,ax push ds mov ax,cs mov ds,ax mov cx,9 mov dx,offset HEADLOAD ;read Header mov ah,3fh int 21h mov al,cs:[sizex] mov ah,cs:[sizey] mul ah mov dl,cS:[numChars] xor dh,dh mul dx mov cx,ax mov ax,cs:[Charseg] mov ds,ax xor dx,dx mov ah,3fh int 21h push es mov CL,Cs:[NUMCHARS] XOR CH,CH mov al,cs:[sizex] mov dx,cs mov es,dx mov di,offset CHARWIDTH rep stosb ;set all charwidth to data sizex mov cx,ax mov ax,cS:[charbakseg] mov es,ax xor di,di mov si,di rep movsb mov ax,cs mov ds,ax mov cl,cs:[numchars] mov ch,0 mov dx,offset CHARWIDTH ;read Header mov ah,3fh int 21h pop es pop ds mov ah,3eh ;close source file int 21h mov dx,offset Palname ;Load in Pal sub al,al mov ah,3dh int 21h jc abortpal mov bx,ax push ds mov ax,cs mov ds,ax mov cx,768 mov dx,offset pal mov ah,3fh int 21h mov ds:pal[768],63 mov ds:pal[767],63 mov ds:pal[766],63 pop ds mov ah,3eh int 21h ret abort: push ax mov ah,3eh int 21h pop ax cmp ax,6 jb displayerror pop bx ;get rid of ret address jmp noinput Abortpal: mov ax,cs mov ds,ax mov dx,offset Nopal mov ah,9 int 21h jmp byebye2 Displayerror: mov bx,ax shl bx,1 mov dx,errorlook[bx] mov ah,9 ; Print string int 21h ; mov ah,9 mov dx,offset errormes int 21h jmp noinput loaddat endp header db "VGACH 000" SaveDat proc near mov ax,cs mov es,ax mov ds,ax mov al,cs:[sizex] mov cs:[header+6],al ;xsize mov al,cs:[sizey] mov cs:[header+7],al ;ysize mov al,cs:[numchars] mov cs:[header+8],al ;number of chars mov dx,offset vChname sub cx,cx mov ah,3ch ;open file int 21h jc abort mov bx,ax mov ax,cs ;write header mov ds,ax mov dx,offset headload mov cx,9 mov ah,40h int 21h mov al,cs:[sizey] ;figure size mov ah,cs:[sizex] mul ah mov dl,cS:[numchars] xor dh,dh mul dx mov cx,ax ; the dest file push ds mov ax,cs:[charseg] mov ds,ax mov ah,40h ; load function write xor dx,dx int 21h ; write it mov ax,cs mov ds,ax mov dx,offset CHARWIDTH mov cl,cs:[numchars] mov ch,0 mov ah,40h int 21h pop ds cmp ax,cx je success mov ah,9 ; disk full error mov dx,offset diskfull ; int 21h ; success: mov ah,3eh ;close source file int 21h ret SaveDat endp Clearscreen proc near push ax push di push es push cx mov ax,0a000h mov es,ax xor di,di mov cx,32000 mov ax,dx rep stosw pop cx pop es pop di pop ax ret Clearscreen endp DisplayMain proc near push es push ds mov ax,cs mov es,ax mov ds,ax mov al,cs:[curchar] mov ah,al add ah,cs:[From] ;' ' mov cs:[charnum+7],ah xor ah,ah mov al,cs:[curchar] mov bl,10 div bl add al,'0' add ah,'0' mov cs:[charnum+10],al mov cs:[charnum+11],ah mov bl,cs:[curchar] xor bh,bh mov al,cs:[CHARWIDTH+bx] xor ah,ah mov bl,10 div bl add al,"0" add ah,"0" mov cs:[charnum+25],al mov cs:[charnum+26],ah mov ax,1300h mov dx,0000h mov bl,cs:[colors] xor bh,bh mov cx,35 push bp mov bp,offset topline int 10h ;displays "CHAR: -?- 00 ... pop bp call BigandLittle ;this puts on all the borders mov cs:[borderx],basex mov cs:[bordery],basey mov al,cs:[sizex] xor ah,ah shl ax,2 mov cs:[borderxsize],ax mov al,cs:[sizey] shl ax,2 mov cs:[borderysize],ax mov al,cs:[colors] mov cs:[bordercolor],al call borderit mov cs:[borderx],174 mov cs:[bordery],12 shr cs:[borderxsize],2 shr cs:[borderysize],2 call borderit call colorbox pop ds pop es ret Displaymain endp BigandLittle proc near push ds mov al,cs:[sizex] mov ah,cs:[sizey] mul ah mov bl,cs:[curchar] xor bh,bh imul bx mov si,ax mov ax,cs:[charseg] mov ds,ax xor dx,dx bigloop: mov cl,ds:[si] inc si call drawdot inc dl cmp dl,cs:[sizex] jb bigloop xor dl,dl inc dh cmp dh,cs:[sizey] jb bigloop pop ds ret BigandLittle endp Grabit proc near ;gets current char and puts it on the 'CLIP' push ds push es mov ax,cs:[Charseg] mov ds,ax mov ax,cs mov es,ax mov ax,cs:[xysize] mov cx,ax mov bl,cs:[curchar] xor bh,bh mul bx mov si,ax mov di,offset clip rep movsb pop es pop ds ret Grabit endp Pasteit proc near ;puts 'CLIP' in current char push ds push es mov ax,cs:[Charseg] mov es,ax mov ax,cs mov ds,ax mov ax,cs:[xysize] mov cx,ax mov bl,cs:[curchar] xor bh,bh mul bx mov di,ax mov si,offset clip rep movsb pop es pop ds ret Pasteit endp Borderit proc near push es mov ax,0a000h mov es,ax mov ax,cs:[bordery] sub ax,2 ;width of border imul ax,ax,320 add ax,cs:[borderx] mov di,ax sub di,2 ;width of border mov cx,cs:[borderxsize] mov bx,cs:[borderysize] add bx,2 add cx,4 mov al,cs:[bordercolor] push di rep stosb borloop: pop di add di,320 push di stosb add di,cs:[borderxsize] add di,2 stosb dec bx jne borloop pop di add di,320 mov cx,cs:[borderxsize] add cx,4 rep stosb pop es ret Borderit endp oldxpos db 0 oldypos db 0 oldcolor db 0 cursorcolor db 0 mOVECURSOR PROC NEAR mov dl,cs:[oldxpos] mov dh,cs:[oldypos] mov cl,cs:[oldcolor] call drawdot inc cs:[cursorcolor] cmp cs:[cursorcolor],16 jb ccok mov cs:[cursorcolor],0 ccok: mov dl,cs:[xpos] mov dh,cs:[ypos] mov cl,cs:[cursorcolor] mov cs:[oldxpos],dl mov cs:[oldypos],dh call drawdot push ds mov ax,cs:[charseg] mov ds,ax mov al,cs:[curchar] ;si= curchar*xsize*ysize+ypos*xsize+xpos mov ah,cs:[sizex] mul ah mov bl,cs:[sizey] xor bh,bh mul bx mov si,ax mov al,cs:[sizex] mov ah,cs:[ypos] mul ah add si,ax xor ah,ah mov al,cs:[xpos] add si,ax mov al,ds:[si] pop ds mov cs:[oldcolor],al ret MoveCursor endp DrawColor proc near push ds push ax mov ax,cs:[charseg] mov ds,ax mov al,cs:[curchar] ;si= curchar*xsize*ysize+ypos*xsize+xpos mov ah,cs:[sizex] mul ah mov bl,cs:[sizey] xor bh,bh mul bx mov si,ax mov al,cs:[sizex] mov ah,cs:[ypos] mul ah add si,ax xor ah,ah mov al,cs:[xpos] add si,ax pop ax mov ds:[si],al pop ds ret DrawColor endp ColorBox proc near mov ax,0a000h mov es,ax mov di,18 mov al,cs:[currentcolor] mov ah,al mov cx,4 rep stosw add di,312 mov cl,4 rep stosw add di,312 mov cl,4 rep stosw add di,312 mov cl,4 rep stosw add di,312 mov cl,4 rep stosw add di,312 mov cl,4 rep stosw add di,312 mov cl,4 rep stosw add di,312 mov cl,4 rep stosw mov di,50 mov al,cs:[backgroundcolor] mov ah,al mov cx,4 rep stosw add di,312 mov cl,4 rep stosw add di,312 mov cl,4 rep stosw add di,312 mov cl,4 rep stosw add di,312 mov cl,4 rep stosw add di,312 mov cl,4 rep stosw add di,312 mov cl,4 rep stosw add di,312 mov cl,4 rep stosw mov di,cs:[oldcpalpos] xor ax,ax stosw add di,318 stosw add di,319 stosb mov di,cs:[oldbpalpos] xor ax,ax ;stosw add di,320 stosw add di,318 stosb mov al,cs:[currentcolor] mov dl,al xor ah,ah mov bh,40 div bh ;al has ypos ah has xpos xor bh,bh mov bl,ah xor ah,ah shl bx,2 ;multiply by 4 to get real xpos shl ax,3 ;multiply by 8 to get real ypos add ax,76 imul ax,ax,320 add ax,bx add ax,160-10 mov di,ax mov cs:[oldcpalpos],di mov al,255 mov ah,al stosw add di,318 stosw add di,319 stosb mov al,cs:[Backgroundcolor] mov dl,al mov bh,40 xor ah,ah div bh ;al has ypos ah has xpos xor bh,bh mov bl,ah xor ah,ah shl bx,2 ;multiply by 4 to get real xpos shl ax,3 ;multiply by 8 to get real ypos add ax,76 imul ax,ax,320 add ax,bx add ax,160-10 mov di,ax add di,2 mov cs:[oldbpalpos],di mov al,255 mov ah,al ;stosw add di,320 stosw add di,318 stosb ret Colorbox endp oldcpalpos dw 0 oldbpalpos dw 0 DisplayPalette proc near mov ax,0a000h mov es,ax mov di,80*320+150 xor ax,ax mov bl,40 mov dx,di push di Lineit: stosw stosw add di,316 stosw stosw add di,316 stosw stosw add di,316 stosw stosw pop di add di,4 push di inc al or al,al je donepal mov ah,al dec bl jne lineit mov bl,40 pop di mov di,dx add di,320*8 mov dx,di push di jmp lineit DonePal: pop di ret DisplayPalette endp ShLEFT proc near mov ax,cs:[charseg] mov ds,ax mov es,ax mov ax,cs:[xysize] mov cl,cs:[curchar] xor ch,ch mul cx mov di,ax mov si,ax xor ch,ch mov dh,cs:[sizey] Shlit: lodsb mov dl,al mov cl,cs:[sizex] dec cx rep movsb mov al,dl stosb dec dh jne shlit ret Shleft endp ShRight proc near mov ax,cs:[charseg] mov ds,ax mov es,ax mov ax,cs:[xysize] mov cl,cs:[curchar] xor ch,ch inc cx mul cx dec ax mov di,ax mov si,ax xor ch,ch mov dh,cs:[sizey] std Shrit: lodsb mov dl,al mov cl,cs:[sizex] dec cx rep movsb mov al,dl stosb dec dh jne shrit cld ret ShRight endp Shup proc near mov ax,cs:[charseg] mov ds,ax mov ax,cs mov es,ax mov ax,cs:[xysize] mov bl,cs:[curchar] xor bh,bh mul bx push ax mov di,offset updownbuff mov si,ax mov cl,cs:[sizex] xor ch,ch rep movsb pop di mov ax,ds mov es,ax mov cx,cs:[xysize] mov bl,cs:[sizex] sub cx,bx rep movsb mov ax,cs mov ds,ax mov si,offset updownbuff mov cl,cs:[sizex] xor ch,ch rep movsb ret Shup endp upDownBuff db 32 dup (0) Shdown proc near mov ax,cs:[charseg] mov ds,ax mov ax,cs mov es,ax mov ax,cs:[xysize] mov bl,cs:[curchar] xor bh,bh inc bx mul bx dec ax ;ax points to last byte in char mov di,offset updownbuff+31 mov si,ax push ax std mov cl,cs:[sizex] xor ch,ch rep movsb ;copies bottom row pop di ;start write on bottom row mov si,di ;si points to 1st byte in 2nd from bottom mov bl,cs:[sizex] xor bh,bh sub si,bx mov ax,ds mov es,ax mov cx,cs:[xysize] mov bl,cs:[sizex] xor bh,bh sub cx,bx rep movsb ;repeat xysize-sizex times mov ax,cs mov ds,ax mov si,offset updownbuff+31 mov cl,cs:[sizex] xor ch,ch mov ax,cs:[xysize] mov bl,cs:[curchar] xor bh,bh mul bx add ax,cx mov di,ax dec di rep movsb ;end of 1st line cld ret Shdown endp FlipHorz proc near ;uses updownbuff mov ax,cs:[charseg] mov ds,ax mov ax,cs mov es,ax mov di,offset updownbuff mov ax,cs:[xysize] mov bl,cs:[curchar] xor bh,bh mul bx mov si,ax mov dl,cs:[sizey] cld revbigloop: push si mov cl,cs:[sizex] xor ch,ch push cx rep movsb pop cx pop si push si dec di revloop: mov al,es:[di] mov ds:[si],al inc si dec di dec cx jne revloop pop si mov bl,cs:[sizex] xor bh,bh add si,bx mov di,offset updownbuff dec dl jne revbigloop ret FlipHorz endp Clip2 db 1024 dup (0) FlipVert proc near call fliphorz mov ax,cs:[charseg] mov ds,ax mov ax,cs mov es,ax mov ax,cs:[xysize] mov cx,ax mov bl,cs:[curchar] xor bh,bh mul bx mov si,ax push si push cx mov di,offset clip2 cld rep movsb pop cx pop si dec di flipvloop: mov al,es:[di] mov ds:[si],al dec di inc si dec cx jne flipvloop ret Flipvert endp RestoreChar proc near pusha MOV ax,cs:[charseg] mov es,ax mov ax,cs:[charbakseg] mov ds,ax mov ax,cs:[xysize] mov cx,ax mov bl,cs:[curchar] xor bh,bh mul bx mov si,ax mov di,ax rep movsb popa ret restorechar endp Clearchar proc near pusha mov ax,cs:[charseg] mov es,ax mov ax,cs:[xysize] mov cx,ax mov bl,cs:[curchar] xor bh,bh mul bx mov di,ax xor ax,ax rep stosb popa ret Clearchar endp ;============================ Main: cmp cs:[inputlength],0 je defaultfile Gotsome: mov ax,cs mov es,ax mov ds,ax call capturefilename defaultfile: call loaddat mov al,cs:[sizex] mov ah,cs:[sizey] mul ah mov cs:[xysize],ax mov al,cs:[sizex] xor ah,ah mov bl,10 div bl add al,'0' add ah,'0' mov cs:[charnum+17],al mov cs:[charnum+18],ah mov al,cs:[sizey] xor ah,ah mov bl,10 div bl add al,'0' add ah,'0' mov cs:[charnum+20],al mov cs:[charnum+21],ah mov ax,0013h ;put in 320x200x256 VGA mode int 10h cld mov ax,cs mov ds,ax mov es,ax mov si,offset pal mov di,offset paltmp mov cx,768/2 rep movsw ;copy for fade out MOV AX,cs:[scrollseg] mov es,ax xor di,di mov cx,160*31 ;max scroll area xor ax,ax rep stosw ;clear scroll area mov ax,cs mov ds,ax mov es,ax mov dx,offset pal mov ax,1012h ; WRITE BLOCK mov bx,0 ; READ WOULD BE 1017H mov cx,256 ; int 10h ; end set up palette mov dx,0 call Clearscreen call colorbox call displaypalette push es mov ax,cs mov es,ax mov di,offset scrollmsg2 mov cl,cs:[numchars] xor ch,ch add di,cx std setupmsgloop: mov al,cl add al,cs:[From] ;" " stosb dec cl jne setupmsgloop mov al," " stosb pop es cld NormalStart: call displaymain WaitforKey: mov dx,03dah vr1: in al,dx and al,08 jz vr1 call scroll CALL MOVECURSOR xor ax,ax mov es,ax mov al,es:[417h] test al,00000010b ;checks left shift je Alton mov al,cs:[currentcolor] mov cs:[oldcolor],al call drawcolor jmp keystuff Alton: test al,00000001b ;checks right shift je keystuff mov al,cs:[backgroundcolor] mov cs:[oldcolor],al call drawcolor KeyStuff: mov ah,1 int 16h jz waitforkey mov ah,0 int 16h or al,al ;checks to see if al=0 jne notaux jmp AuxKeys NotAux: cmp al,17 ;control-Q Quit jne Chk1 mov cs:[fadestep],64 jmp byebyef Chk1: cmp al,'1' jne Chk2 inc cs:[scrollspeed] mov al,cs:[sizex] xor ah,ah cmp cs:[scrollspeed],ax jb @@s dec ax mov cs:[scrollspeed],ax @@s: jmp Waitforkey Chk2: Chk3: cmp al,'+' jne Chk4 inc cs:[curchar] mov al,cs:[numchars] cmp cs:[curchar],al jb @@s mov cs:[curchar],0 @@s: call displaymain jmp waitforkey Chk4: cmp al,'-' jne Chk5 dec cs:[curchar] mov al,cs:[numchars] cmp cs:[curchar],al jb @@s mov al,cs:[numchars] dec al mov cs:[curchar],al @@s: call displaymain jmp waitforkey Chk5: cmp al,"*" jne chk6 mov ax,cS:[messoff] mov cs:[messoff],offset scrollmsg2 cmp ax,offset scrollmsg je itsdone mov cs:[messoff],offset scrollmsg itsdone: mov cs:[scrollletter],0 jmp waitforkey chk6: cmp al,'[' jne chk7 dec cs:[currentcolor] call colorbox jmp waitforkey chk7: cmp al,']' jne chk8 inc cs:[currentcolor] call colorbox jmp waitforkey chk8: cmp al,'2' jne Chk9 dec cs:[scrollspeed] jne @@s mov cs:[scrollspeed],1 @@s: jmp Waitforkey Chk9: cmp al,27 jne chk10 dec cs:[backgroundcolor] call colorbox jmp waitforkey chk10: cmp al,29 jne chk11 inc cs:[backgroundcolor] call colorbox jmp waitforkey Chk11: cmp al,"3" jne chk12 mov bl,cs:[curchar] xor bh,bh dec cs:[CHARWIDTH+BX] CALL displaymain jmp waitforkey chk12: cmp al,"4" jne chk13 mov bl,cs:[curchar] xor bh,bh inc cs:[charwidth+bx] CALL displaymain jmp waitforkey chk13: jmp waitFORkey AuxKeys: cmp ah,72 ;up jne AChk1 dec cs:[ypos] mov al,cs:[sizey] cmp cs:[ypos],al jb @@s dec al mov cs:[ypos],al @@s: jmp waitforkey AChk1: cmp ah,80 ;down jne AChk2 inc cs:[ypos] mov al,cs:[sizey] cmp cs:[ypos],al jb @@s mov cs:[ypos],0 @@s: jmp waitforkey AChk2: cmp ah,75 ;left jne Achk3 dec cs:[xpos] mov al,cs:[sizex] cmp cs:[xpos],al jb @@s dec al mov cs:[xpos],al @@s: jmp waitforkey AChk3: cmp ah,77 ;right jne Achk4 inc cs:[xpos] mov al,cs:[sizex] cmp cs:[xpos],al jb @@s mov cs:[xpos],0 @@s: jmp waitforkey Achk4: cmp ah,94 ;c-f1 save jne Achk5 call SaveDat jmp NormalStart Achk5: cmp ah,59 ;F1 jne Achk6 call grabit jmp NormalStart Achk6: cmp ah,60 jne Achk7 call pasteit jmp Normalstart Achk7: cmp ah,61 jne Achk8 call shleft jmp Normalstart Achk8: cmp ah,62 jne Achk9 call shright jmp NormalStart Achk9: cmp ah,63 jne Achk10 call shup jmp NormalStart Achk10: cmp ah,64 jne Achk11 call shdown jmp NormalStart Achk11: cmp ah,65 jne Achk12 call FlipVert jmp NormalStart Achk12: cmp ah,66 jne Achk13 call FlipHorz jmp Normalstart Achk13: cmp ah,67 jne Achk14 mov al,cs:[oldcolor] mov cs:[currentcolor],al jmp Normalstart Achk14: cmp ah,68 ;F10 jne Achk15 call restorechar jmp normalstart Achk15: cmp ah,95 ;backspace jne Achk16 call clearchar jmp normalstart Achk16: Nokeypress: jmp waitforkey endit: Byebye: mov ax,0003h ;reset screen to text int 10h byebye2: mov ax,cs mov ds,ax mov ax,4c00h ; return control to int 21h ; DOS and exit Noinput: mov ax,cs mov ds,ax mov es,ax mov ah,9 mov dx,offset properuse int 21h jmp byebye2 byebyef: jmp ByeBye mov dx,03dah vr2: in al,dx and al,08 jz vr2 call fadeout call scroll dec cs:[fadestep] jne byebyef jmp byebye code ends end start