📄 menu.s
字号:
#if 0; menu.S isCopyright 2000-2004 John Coffman.All rights reserved.Licensed under the terms contained in the file 'COPYING' in the source directory.#endif#define PAGE0;; mn_init:; enter with nothing;; return with:; AH = #columns; AL = video mode; BH = active page; CH = rows-1; CL = cols-1;; side effects:; If video mode 7 (MDA) is detected, the default attributes; are modified to those suitable for monochrome;mn_init: mov ah,#0x0f int 0x10 ; AH=cols, AL=mode, BH=page mov ch,#0x18 cmp al,#7 je mn_imono ; MDA does not use 40:84 push ds push #0x40 pop ds mov ch,[0x84] ; get rows-1 pop dsmn_imono: mov cl,ah dec cl ; CL=cols-1#ifndef PAGE0 mov [mn_page],bh ; save page#endif mov [mn_max_row_col],cx ; save max screen coord. cmp al,#7 ; test for monochrome jne mn_init9 push dword [mn_at_mono] ; move 4 bytes pop dword [mn_attrib]mn_init9: ret; mn_getcursor:; exit with:; DX = current cursor position;mn_getcursor: push ax push bx push cx mov ah,#3#ifndef PAGE0 mov bh,[mn_page]#else xor bh,bh#endif int 0x10 pop cx pop bx pop ax ret; mn_setcursor:;; enter with:; DX = row/col for cursor;mn_setcursor: push ax push bx mov ah,#2#ifndef PAGE0 mov bh,[mn_page]#else xor bh,bh#endif int 0x10 pop bx pop ax ret; mn_cursoroff:;mn_cursoroff: push dx mov dx,[mn_max_row_col] inc dh xor dl,dl call mn_setcursor pop dx ret; mn_rdcha: read character and attribute; enter with:; DX = row/col;; exit with:; AH = attribute; AL = character;mn_rdcha: push bx mov ah,#2 ;set cursor position#ifndef PAGE0 mov bh,[mn_page]#else xor bh,bh#endif int 0x10 mov ah,#8 ; read char and attr int 0x10 pop bx ret; mn_wrcha: write character and attribute; enter with:; AH = attribute; AL = character; DX = row/col; mn_wrcha: push cx push bx push ax mov ah,#2#ifndef PAGE0 mov bh,[mn_page]#else xor bh,bh#endif int 0x10 ; set cursor position pop ax push ax mov bl,ah mov cx,#1 mov ah,#9 int 0x10 pop ax pop bx pop cx ret; mn_wrstra: write string with attribute; enter with:; AL = attribute; DS:BX points at string; DX = row/col of start;mn_wrstra: push ax push bx push dx mov ah,almn_wrs1: mov al,(bx) inc bx or al,al jz mn_wrs9 call mn_wrcha inc dl jmp mn_wrs1mn_wrs9: pop dx pop bx pop ax ret ; mn_drawbox:; enter with:; AL = 0 no border; 1 single border; 2 double border; 3 single top/bot, double sides; 4 double top/bot, single sides; (if hi-bit of AL is set, expand box by 1 in horizontal); BH = attribute for area; CX = row/col of upper left; DX = delta row/delta col;mn_drawbox: push dx push cx push ax or al,al jns mn_dr01 dec cl inc dl inc dlmn_dr01: mov ax,#0x0600 add dx,cx int 0x10 pop ax pop cx pop dx test al,#0x7F jz mn_dr9 push ax push si and ax,#0x7F mov si,ax shl si,#3 lea si,[mn_box-8](si) mov ah,[mn_at_border] xchg dx,cx push cx lodsbmn_dr1: call mn_wrcha inc dl dec cl mov al,(si) jnz mn_dr1 inc si lodsbmn_dr2: call mn_wrcha inc dh dec ch mov al,(si) jnz mn_dr2 pop cx push cx inc si lodsbmn_dr3: call mn_wrcha dec dl dec cl mov al,(si) jnz mn_dr3 inc si lodsbmn_dr4: call mn_wrcha dec dh dec ch mov al,(si) jnz mn_dr4 pop cx xchg cx,dx pop si pop axmn_dr9: ret; mn_vline: vertical line;; enter with:; AL = 1 (single line), 2 (double line); CX = row/col to start; DH = delta Y;mn_vline: pusha cbw mov si,ax mov bl,[mn_ver-1](si) shl si,#3 lea si,[mn_vint-8](si) mov di,#0x100 xchg cx,dx mov cl,ch jmp mn_line00 ; join common code; mn_hline: horizontal line;; enter with:; AL = 1 (single line), 2 (double line); CX = row/col to start; DL = delta X;mn_hline: pusha cbw mov si,ax mov bl,[mn_hor-1](si) ; BL is char to write shl si,#3 lea si,[mn_hint-8](si) ; SI is intersect table mov di,#1 xchg cx,dx; do the beginning of the linemn_line00: call mn_rdcha mov ah,bl ; AH is char to write cmp al,(si) ; know intersect? jne mn_line01 mov ah,[1](si)mn_line01: cmp al,[4](si) jne mn_line02 mov ah,[5](si)mn_line02: mov al,ah mov ah,[mn_at_border] call mn_wrcha add dx,di dec cl jz mn_line20mn_line10: ;do the central part of the line call mn_rdcha mov ah,bl cmp al,(si) jne mn_line11 mov ah,[2](si)mn_line11: cmp al,[4](si) jne mn_line12 mov ah,[6](si)mn_line12: mov al,ah mov ah,[mn_at_border] call mn_wrcha add dx,di dec cl jnz mn_line10mn_line20: ;do the end of the line call mn_rdcha mov ah,bl cmp al,(si) jne mn_line21 mov ah,[3](si)mn_line21: cmp al,[4](si) jne mn_line22 mov ah,[7](si)mn_line22: mov al,ah mov ah,[mn_at_border] call mn_wrcha popa retmn_box: db SE,EW,SW,NS,NW,EW,NE,NS db SSEE,EEWW,SSWW,NNSS,NNWW,EEWW,NNEE,NNSS db SSE,EW,SSW,NNSS,NNW,EW,NNE,NNSS db SEE,EEWW,SWW,NS,NWW,EEWW,NEE,NSmn_hor: db EW,EEWWmn_hint: db NS,NSE,NSEW,NSW db NNSS,NNSSE,NNSSEW,NNSSW db NS,NSEE,NSEEWW,NSWW db NNSS,NNSSEE,NNSSEEWW,NNSSWWmn_ver: db NS,NNSSmn_vint: db EW,SEW,NSEW,NEW db EEWW,SEEWW,NSEEWW,NEEWW db EW,SSEW,NNSSEW,NNEW db EEWW,SSEEWW,NNSSEEWW,NNEEWWmn_attrib:mn_at_text: db 0x47mn_at_hilite: db 0x71mn_at_border: db 0x47mn_at_title: db 0x4Emn_at_mono: db 0x07,0x70,0x07,0x0F#ifndef PAGE0mn_page: db 0#endifmn_max_row_col: dw 0; end of menu.S
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -