├── gif.inc ├── draw.asm ├── play ├── mrex ├── play ├── eqex2 ├── mrex2 ├── readme.txt ├── wfc.inc ├── stream.inc ├── sinc.inc ├── fftcv.inc ├── play.asm ├── sc.inc ├── eq.inc └── mrex2.asm ├── tube.asm ├── wall.img ├── wall.jpg ├── wall4.img ├── wall6.img ├── wall7.img ├── fftsinc.zip ├── end.asm ├── e64.asm ├── magnify.asm ├── thread.asm ├── textbox.asm ├── e64-2.asm ├── test.asm ├── cache2fd.asm ├── info.asm ├── textbox.inc ├── fire.asm ├── rtdata.asm ├── smp.asm ├── mixer.asm ├── ethstat.asm ├── audio.asm ├── board.asm ├── recycle.asm ├── drv.asm ├── screen.asm ├── transp.asm ├── setup.asm ├── boot64hd.asm ├── launcher.asm ├── usage.asm └── fract.asm /gif.inc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suxinde2009/MenuetOS-64/HEAD/gif.inc -------------------------------------------------------------------------------- /draw.asm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suxinde2009/MenuetOS-64/HEAD/draw.asm -------------------------------------------------------------------------------- /play/mrex: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suxinde2009/MenuetOS-64/HEAD/play/mrex -------------------------------------------------------------------------------- /play/play: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suxinde2009/MenuetOS-64/HEAD/play/play -------------------------------------------------------------------------------- /tube.asm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suxinde2009/MenuetOS-64/HEAD/tube.asm -------------------------------------------------------------------------------- /wall.img: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suxinde2009/MenuetOS-64/HEAD/wall.img -------------------------------------------------------------------------------- /wall.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suxinde2009/MenuetOS-64/HEAD/wall.jpg -------------------------------------------------------------------------------- /wall4.img: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suxinde2009/MenuetOS-64/HEAD/wall4.img -------------------------------------------------------------------------------- /wall6.img: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suxinde2009/MenuetOS-64/HEAD/wall6.img -------------------------------------------------------------------------------- /wall7.img: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suxinde2009/MenuetOS-64/HEAD/wall7.img -------------------------------------------------------------------------------- /fftsinc.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suxinde2009/MenuetOS-64/HEAD/fftsinc.zip -------------------------------------------------------------------------------- /play/eqex2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suxinde2009/MenuetOS-64/HEAD/play/eqex2 -------------------------------------------------------------------------------- /play/mrex2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/suxinde2009/MenuetOS-64/HEAD/play/mrex2 -------------------------------------------------------------------------------- /play/readme.txt: -------------------------------------------------------------------------------- 1 | Example code 2 | 3 | play.asm - Equalizer and Spectrum analyzer 4 | eqex2.asm - Equalizer 5 | mrex.asm - Resampler 6 | mrex2.asm - Resampler 7 | -------------------------------------------------------------------------------- /play/wfc.inc: -------------------------------------------------------------------------------- 1 | 2 | ; THIS FILE IS PART OF THE 'WAVE FORMAT CONVERTER' LIBRARY SOURCE CODE 3 | ; COPYRIGHT (C) 2010 Akos Mogyorosi 4 | ; FOR DETAILS SEE THE FILE README 5 | 6 | WFC_INFO_FORMAT = 0 7 | WFC_INFO_FORMAT_TAG = 4 8 | WFC_INFO_CHANNELS = 8 9 | WFC_INFO_RATE = 12 10 | WFC_INFO_BITSPERSAMP = 16 11 | WFC_INFO_SAMPSIZE = 20 12 | WFC_INFO_SCFORMAT = 24 13 | WFC_INFO_SIZE = 28 14 | WFC_INFOSIZE = 32 15 | 16 | ;------------------------------------------------------------------------------------ 17 | WFC_FORMAT_RAW = 0 18 | WFC_FORMAT_WAV = 1 19 | 20 | WFC_FORMAT_TAG_PCM = 1 21 | WFC_FORMAT_TAG_IEEE_FLOAT = 3 22 | ;------------------------------------------------------------------------------------ 23 | ;error codes 24 | WFC_ERR_OK = 0 25 | WFC_ERR_NOT_ENOUGH_MEMORY = -40 26 | WFC_ERR_SSE2_NOT_SUPPORTED = -41 27 | ;------------------------------------------------------------------------------------ 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | -------------------------------------------------------------------------------- /play/stream.inc: -------------------------------------------------------------------------------- 1 | 2 | ; COPYRIGHT (C) 2008-2010 Akos Mogyorosi 3 | ; FOR DETAILS SEE THE FILE README 4 | 5 | DEF_STREAMBUFFSIZE = 4096 ;stream buffer size 6 | DEF_MEMORY_STREAM = 1 ;1=enable 0=disable stream type 7 | DEF_FILE_STREAM = 0 ; 8 | DEF_CALLBACK_STREAM = 0 ; 9 | 10 | STREAM_TYPE_MEM = 1 11 | STREAM_TYPE_FILE = 2 12 | STREAM_TYPE_CALLBACK = 3 13 | STREAM_SEEK_BEGIN = 0 14 | STREAM_SEEK_CURRENT = 1 15 | STREAM_SEEK_FORCECURRENT = 3 16 | STREAM_ERR_OK = 0 17 | STREAM_ERR_NOT_ENOUGH_MEMORY = 1 18 | STREAM_ERR_FILE_NOT_FOUND = 2 19 | STREAM_ERR_STREAM_READ = 3 20 | STREAM_ERR_STREAM_SEEK = 4 21 | STREAM_ERR_STREAM_BUFFER = 5 22 | 23 | ;memory stream: param1=rsi param2=r15 24 | ;file stream: param1=filename param2=0 (filehndl) 25 | ;callback stream: param1=*callbackproc param2=id 26 | ; (id, *mem, size, filepointer, *numberofbytesread) ret zero on error 27 | ; if *mem is zero, filesize or zero should be returned 28 | 29 | ;error codes 30 | macro setlasterror a 31 | { 32 | if a<256 33 | mov [rbp+lasterror], B a 34 | else 35 | mov [rbp+lasterror], D a 36 | end if 37 | } 38 | 39 | lasterror = 8 40 | streamtype = 12 41 | streamparam1 = 16 42 | streamparam2 = 24 43 | streambuff = 32 44 | streamfileptr = 40 45 | streambuffsize = 48 46 | 47 | INVALID_HANDLE_VALUE = -1 48 | 49 | -------------------------------------------------------------------------------- /play/sinc.inc: -------------------------------------------------------------------------------- 1 | 2 | ; THIS FILE IS PART OF THE 'SINC RESAMPLING KERNEL' LIBRARY SOURCE CODE 3 | ; COPYRIGHT (C) 2008-2010 Akos Mogyorosi 4 | ; FOR DETAILS SEE THE FILE README 5 | 6 | SINC_CONVBUFFSIZE = 1024 7 | 8 | SINC_TABLE_VERY_HIGH_QUALITY = 0 9 | SINC_TABLE_HIGH_QUALITY = 1 10 | SINC_TABLE_MEDIUM_QUALITY = 2 11 | SINC_TABLE_LOW_QUALITY = 3 12 | SINC_TABLE_VERY_LOW_QUALITY = 4 13 | 14 | ;------------------------------------------------------------------------------------ 15 | ;state 16 | SINC_ST_LEADING_DELAY = 1 17 | SINC_ST_FETCH = 2 18 | SINC_ST_DECIMATION = 4 19 | SINC_ST_FIRST_START = 8 20 | 21 | ;sample formats 22 | SINC_FORMAT_8B_M = (4 ) 23 | SINC_FORMAT_8B_ST_L = (4+2+0 ) 24 | SINC_FORMAT_8B_ST_R = (4+2+1 ) 25 | SINC_FORMAT_16B_M = (8 ) 26 | SINC_FORMAT_16B_ST_L = (8+2+0 ) 27 | SINC_FORMAT_16B_ST_R = (8+2+1 ) 28 | SINC_FORMAT_32B_M = (16 ) 29 | SINC_FORMAT_32B_ST_L = (16+2+0) 30 | SINC_FORMAT_32B_ST_R = (16+2+1) 31 | SINC_FORMAT_FLOAT32_M = (32 ) 32 | SINC_FORMAT_FLOAT32_ST_L = (32+2+0) 33 | SINC_FORMAT_FLOAT32_ST_R = (32+2+1) 34 | SINC_TRAILING_DELAY = -1 35 | SINC_TRAILING_DELAY_LENGTH = -2 36 | ;------------------------------------------------------------------------------------ 37 | ;error codes 38 | SINC_ERR_OK = 0 39 | SINC_ERR_NOT_ENOUGH_MEMORY = -1 40 | SINC_ERR_SSE2_NOT_SUPPORTED = -2 41 | SINC_ERR_INVALID_FORMAT = -3 42 | ;------------------------------------------------------------------------------------ 43 | 44 | -------------------------------------------------------------------------------- /play/fftcv.inc: -------------------------------------------------------------------------------- 1 | 2 | ; THIS FILE IS PART OF THE 'FFT CONVOLUTION KERNEL' LIBRARY SOURCE CODE 3 | ; COPYRIGHT (C) 2010 Akos Mogyorosi 4 | ; FOR DETAILS SEE THE FILE README 5 | 6 | FFTCV_CONVBUFFSIZE = 1024 7 | 8 | ;------------------------------------------------------------------------------------ 9 | ;eq 10 | FFTCV_EQ_64BANDS = -1 11 | FFTCV_EQ_64BANDSV1 = -3 12 | FFTCV_EQ_32BANDS = -2 13 | FFTCV_EQ_32BANDSV1 = -4 14 | FFTCV_LENGTH_64BANDS = 16384+1 15 | FFTCV_LENGTH_64BANDSV1 = 4096+1 16 | FFTCV_LENGTH_32BANDS = 8192+1 17 | FFTCV_LENGTH_32BANDSV1 = 2048+1 18 | 19 | ;states 20 | FFTCV_ST_LEADING_DELAY = 1 21 | FFTCV_ST_LD_APPLIED = 2 22 | 23 | ;wave formats 24 | FFTCV_FORMAT_8B_M = (4 ) 25 | FFTCV_FORMAT_8B_ST_L = (4+2+0 ) 26 | FFTCV_FORMAT_8B_ST_R = (4+2+1 ) 27 | FFTCV_FORMAT_16B_M = (8 ) 28 | FFTCV_FORMAT_16B_ST_L = (8+2+0 ) 29 | FFTCV_FORMAT_16B_ST_R = (8+2+1 ) 30 | FFTCV_FORMAT_32B_M = (16 ) 31 | FFTCV_FORMAT_32B_ST_L = (16+2+0) 32 | FFTCV_FORMAT_32B_ST_R = (16+2+1) 33 | FFTCV_FORMAT_FLOAT32_M = (32 ) 34 | FFTCV_FORMAT_FLOAT32_ST_L = (32+2+0) 35 | FFTCV_FORMAT_FLOAT32_ST_R = (32+2+1) 36 | FFTCV_TRAILING_DELAY = -1 37 | FFTCV_TRAILING_DELAY_LENGTH = -2 38 | ;------------------------------------------------------------------------------------ 39 | ;error codes 40 | FFTCV_ERR_OK = 0 41 | FFTCV_ERR_NOT_ENOUGH_MEMORY = -11 42 | FFTCV_ERR_SSE2_NOT_SUPPORTED = -12 43 | FFTCV_ERR_INVALID_FORMAT = -13 44 | FFTCV_ERR_INVALID_OPERATION = -14 45 | ;------------------------------------------------------------------------------------ 46 | 47 | -------------------------------------------------------------------------------- /play/play.asm: -------------------------------------------------------------------------------- 1 | use64 2 | 3 | define B byte 4 | define W word 5 | define D dword 6 | define Q qword 7 | 8 | inwav equ (stacktop+0x100000) 9 | buffer equ (stacktop+0x200000) 10 | memm equ (stacktop+0x300000) 11 | 12 | macro push [arg] ;push - pop 13 | { ; 14 | reverse push arg ; 15 | } ; 16 | ; 17 | macro pop [arg] ; 18 | { ; 19 | reverse pop arg ; 20 | } ; 21 | 22 | 23 | org 0x0 24 | 25 | db "MENUET64" 26 | dq 0x01 27 | dq main 28 | dq image_end ;size of image 29 | dq memm+0x100000*12 ;memory size 30 | dq stacktop-16 ;*stack 31 | dq 0 32 | dq 0x0 33 | 34 | align 16 35 | 36 | include "fftcv.inc" ; 37 | include "sc.inc" ; 38 | 39 | include "play.inc" 40 | include "spa.inc" 41 | include "eq.inc" 42 | 43 | image_end: 44 | 45 | align 16 46 | spa_sciface: dq ? ;spa variables 47 | spa_ffttab: dq ? ; 48 | fmchiface: dq ? 49 | fftcvif: dq ? 50 | success: dq ? 51 | errcode: dq ? 52 | spa_type: dq ? 53 | 54 | align 16 55 | spa_fftbuff0: times 4096 dd ? 56 | spa_fftbuff1: times 4096 dd ? 57 | spa_fftbuff2: times 4096*2 dq ? 58 | 59 | dragndrop: times 512 db ? 60 | wavname: times 512 db ? 61 | 62 | cblock: times 0x10000 db ? 63 | wave: times 0xf0000 db ? 64 | playlist: times 0x10000 db ? 65 | 66 | fftcvifaces: times 48 dq ? 67 | 68 | spectrumimage: times 205*65 dd ? 69 | 70 | buffer0: times frsize*7*512 db ? 71 | buffer1: times frsize*7*512 db ? 72 | 73 | dispblock: times (8192+8192) db ? ;; kept as a pair 74 | dispblock2: times (8192+8192) db ? ;; 75 | 76 | 77 | times 4096 dd ? 78 | readbufstack: 79 | times 4096 dd ? 80 | stacktop: 81 | 82 | -------------------------------------------------------------------------------- /play/sc.inc: -------------------------------------------------------------------------------- 1 | 2 | ; THIS FILE IS PART OF THE 'SAMPLE CONVERTER' LIBRARY SOURCE CODE 3 | ; COPYRIGHT (C) 2009-2010 Akos Mogyorosi 4 | ; FOR DETAILS SEE THE FILE README 5 | 6 | ;------------------------------------------------------------------------------------ 7 | ;sample formats 8 | ; 9 | ; bits 63-16 : reserved 10 | ; bits 15-8 : number of channels (1-255) 11 | ; bits 7-4 : format descriptor (+16=float +128=unsigned) 12 | ; bits 3-0 : sample type (1=8-bit 2=16-bit 3=24-bit 4=32-bit) 13 | 14 | SC_FORMAT_8B = (1 ) ; signed 8-bit 15 | SC_FORMAT_U8B = (1+128) ;unsigned 8-bit 16 | SC_FORMAT_16B = (2 ) ; signed 16-bit 17 | SC_FORMAT_U16B = (2+128) ;unsigned 16-bit 18 | SC_FORMAT_24B = (3 ) ; signed 24-bit 19 | SC_FORMAT_U24B = (3+128) ;unsigned 24-bit 20 | SC_FORMAT_32B = (4 ) ; signed 32-bit 21 | SC_FORMAT_U32B = (4+128) ;unsigned 32-bit 22 | SC_FORMAT_FLOAT32 = (4+16 ) ; signed 32-bit float 23 | SC_FORMAT_M = (1 shl 8) 24 | SC_FORMAT_ST = (2 shl 8) 25 | define SC_FORMAT_8B_M (SC_FORMAT_U8B or SC_FORMAT_M ) 26 | define SC_FORMAT_8B_ST (SC_FORMAT_U8B or SC_FORMAT_ST) 27 | define SC_FORMAT_16B_M (SC_FORMAT_16B or SC_FORMAT_M ) 28 | define SC_FORMAT_16B_ST (SC_FORMAT_16B or SC_FORMAT_ST) 29 | define SC_FORMAT_24B_M (SC_FORMAT_24B or SC_FORMAT_M ) 30 | define SC_FORMAT_24B_ST (SC_FORMAT_24B or SC_FORMAT_ST) 31 | define SC_FORMAT_32B_M (SC_FORMAT_32B or SC_FORMAT_M ) 32 | define SC_FORMAT_32B_ST (SC_FORMAT_32B or SC_FORMAT_ST) 33 | define SC_FORMAT_FLOAT32_M (SC_FORMAT_FLOAT32 or SC_FORMAT_M ) 34 | define SC_FORMAT_FLOAT32_ST (SC_FORMAT_FLOAT32 or SC_FORMAT_ST) 35 | ;------------------------------------------------------------------------------------ 36 | ;error codes 37 | SC_ERR_OK = 0 38 | SC_ERR_NOT_ENOUGH_MEMORY = -30 39 | SC_ERR_SSE2_NOT_SUPPORTED = -31 40 | ;------------------------------------------------------------------------------------ 41 | 42 | -------------------------------------------------------------------------------- /end.asm: -------------------------------------------------------------------------------- 1 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 2 | ; 3 | ; Exit for Menuet64 4 | ; 5 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 6 | 7 | use64 8 | 9 | org 0x0 10 | 11 | db 'MENUET64' ; Header identifier 12 | dq 0x01 ; Version 13 | dq START ; Start of code 14 | dq image_end ; Size of image 15 | dq 0x100000 ; Memory for app 16 | dq 0xffff0 ; Rsp 17 | dq 0x00 ; Prm 18 | dq 0x00 ; Icon 19 | 20 | START: 21 | 22 | mov rax , 141 23 | mov rbx , 1 24 | mov rcx , 1 25 | mov rdx , 5 shl 32 + 5 26 | mov r8 , 9 shl 32 + 12 27 | int 0x60 28 | 29 | call draw_window 30 | 31 | still: 32 | 33 | mov rax , 10 34 | int 0x60 35 | 36 | test rax , 0x1 ; Window redraw 37 | jnz window_event 38 | test rax , 0x2 ; Keyboard press 39 | jnz keyboard_event 40 | test rax , 0x4 ; Button press 41 | jnz button_event 42 | 43 | jmp still 44 | 45 | window_event: 46 | 47 | call draw_window 48 | jmp still 49 | 50 | keyboard_event: 51 | 52 | mov rax , 0x2 53 | int 0x60 54 | jmp still 55 | 56 | button_event: 57 | 58 | mov rax , 17 59 | int 0x60 60 | 61 | ; rax = status 62 | ; rbx = button id 63 | 64 | cmp rbx , 0x1 65 | jne no_reboot 66 | mov rax , 500 ; System 67 | mov ebx , 1 ; Reboot 68 | int 0x60 69 | no_reboot: 70 | 71 | ; Any other -> close window 72 | 73 | mov rax , 512 74 | int 0x60 75 | 76 | 77 | draw_window: ; draw window 78 | 79 | mov rax , 0xC 80 | mov rbx , 0x1 81 | int 0x60 82 | 83 | mov rax , 26 84 | mov rbx , 3 85 | mov rcx , image_end 86 | mov rdx , 30*8 87 | int 0x60 88 | 89 | ; Middle of screen 90 | 91 | mov rbx , [image_end+0x20] 92 | shr rbx , 1 93 | sub rbx , 0xc2/2 94 | shl rbx , 32 95 | add rbx , 0xc3 96 | 97 | mov rax , 0x0 ; draw window 98 | mov rcx , 0x000000800000005E ; y start & size 99 | mov rdx , 0xFFFFFF ; type & border color 100 | mov r8 , 0x1 ; draw flags 101 | mov r9 , window_label ; 0 or label - asciiz 102 | mov r10 , 0x0 ; pointer to menu struct or 0 103 | int 0x60 104 | 105 | mov rax , 8 ; button 106 | mov rbx , 25 * 0x100000000 + 70 ; x start & size 107 | mov rcx , 53 * 0x100000000 + 18 ; y start & size 108 | mov rdx , 0x1 ; button id 109 | mov r8 , 0x0 ; ignored 110 | mov r9 , button_label_1 ; button_text 111 | int 0x60 112 | 113 | mov rax , 8 ; button 114 | mov rbx , 100 * 0x100000000 + 70 ; x start & size 115 | mov rcx , 053 * 0x100000000 + 18 ; y start & size 116 | mov rdx , 0x2 ; button id 117 | mov r8 , 0 ; ignored 118 | mov r9 , button_label_2 ; button_text 119 | int 0x60 120 | 121 | mov rax , 0xC 122 | mov rbx , 0x2 123 | int 0x60 124 | 125 | ret ; 126 | 127 | ; Data area 128 | 129 | button_label_1: 130 | 131 | db 'YES',0 132 | 133 | button_label_2: 134 | 135 | db 'NO',0 136 | 137 | window_label: 138 | 139 | db 'EXIT MENUET ?',0 140 | 141 | image_end: 142 | 143 | -------------------------------------------------------------------------------- /e64.asm: -------------------------------------------------------------------------------- 1 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 2 | ; 3 | ; 64 bit Menuet example 4 | ; 5 | ; Compile with FASM 1.60 or above 6 | ; 7 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 8 | 9 | use64 10 | 11 | org 0x0 12 | 13 | db 'MENUET64' ; Header identifier 14 | dq 0x01 ; Version 15 | dq START ; Start of code 16 | dq image_end ; Size of image 17 | dq 0x100000 ; Memory for app 18 | dq 0xffff0 ; Rsp 19 | dq 0x00 ; Prm 20 | dq 0x00 ; Icon 21 | 22 | 23 | START: 24 | 25 | call draw_window ; At first, draw the window 26 | 27 | still: 28 | 29 | mov rax , 10 ; Wait here for event 30 | int 0x60 31 | 32 | test rax , 1 ; Window redraw 33 | jnz window_event 34 | test rax , 2 ; Keyboard press 35 | jnz key_event 36 | test rax , 4 ; Button press 37 | jnz button_event 38 | 39 | jmp still 40 | 41 | window_event: 42 | 43 | call draw_window 44 | jmp still 45 | 46 | key_event: 47 | 48 | mov rax , 2 ; Read the key and ignore 49 | int 0x60 50 | 51 | jmp still 52 | 53 | button_event: 54 | 55 | mov rax , 17 56 | int 0x60 57 | 58 | ; rax = status 59 | ; rbx = button id 60 | 61 | cmp rbx , 0x10000001 62 | jne no_application_terminate_button 63 | mov rax , 0x200 64 | int 0x60 65 | no_application_terminate_button: 66 | 67 | cmp rbx , 0x106 68 | jne no_application_terminate_menu 69 | mov rax , 0x200 70 | int 0x60 71 | no_application_terminate_menu: 72 | 73 | jmp still 74 | 75 | 76 | draw_window: 77 | 78 | mov rax , 12 ; Beginning of window draw 79 | mov rbx , 1 80 | int 0x60 81 | 82 | mov rax , 0 ; Draw window 83 | mov rbx , 256 shl 32 + 256 ; X start & size 84 | mov rcx , 128 shl 32 + 192 ; Y start & size 85 | mov rdx , 0x0000000000FFFFFF ; Type & border color 86 | mov r8 , 0x0000000000000001 ; Flags (set as 1) 87 | mov r9 , window_label ; 0 or label - asciiz 88 | mov r10 , menu_struct ; 0 or pointer to menu struct 89 | int 0x60 90 | 91 | mov rax , 4 ; Display text 92 | mov rbx , text ; Pointer to text 93 | mov rcx , 32 ; X position 94 | mov rdx , 64 ; Y position 95 | mov rsi , 0x000000 ; Color 96 | mov r9 , 1 ; Font 97 | newline: 98 | int 0x60 99 | add rdx , 16 100 | add rbx , 31 101 | cmp [rbx],byte ' ' 102 | jae newline 103 | 104 | mov rax , 12 ; End of window draw 105 | mov rbx , 2 106 | int 0x60 107 | 108 | ret 109 | 110 | 111 | ; Data area 112 | 113 | window_label: 114 | 115 | db 'EXAMPLE',0 ; Window label 116 | 117 | text: 118 | 119 | db 'HELLO WORLD FROM 64 BIT MENUET',0 120 | db 'Second line ',0 121 | db 'Third line ',0 122 | db 0 123 | 124 | menu_struct: ; Menu Struct 125 | 126 | dq 0 ; Version 127 | 128 | dq 0x100 ; Start value of ID to return ( ID + Line ) 129 | 130 | ; Returned when menu closes and 131 | ; user made no selections. 132 | 133 | db 0,'FILE',0 ; ID = 0x100 + 1 134 | db 1,'New',0 ; ID = 0x100 + 2 135 | db 1,'Open..',0 ; ID = 0x100 + 3 136 | db 1,'Save..',0 ; ID = 0x100 + 4 137 | db 1,'-',0 ; ID = 0x100 + 5 138 | db 1,'Quit',0 ; ID = 0x100 + 6 139 | 140 | db 0,'HELP',0 ; ID = 0x100 + 7 141 | db 1,'Contents..',0 ; ID = 0x100 + 8 142 | db 1,'About..',0 ; ID = 0x100 + 9 143 | 144 | db 255 ; End of Menu Struct 145 | 146 | image_end: 147 | 148 | -------------------------------------------------------------------------------- /magnify.asm: -------------------------------------------------------------------------------- 1 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 2 | ; 3 | ; Magnify for Menuet64 4 | ; 5 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 6 | 7 | use64 8 | 9 | org 0x0 10 | 11 | db 'MENUET64' ; 8 byte id 12 | dq 0x01 ; header version 13 | dq START ; start of code 14 | dq I_END ; size of image 15 | dq 0x100000 ; memory for app 16 | dq 0xffff0 ; rsp 17 | dq 0x0,0x0 ; Parameter, Icon 18 | 19 | x_size equ 50 20 | y_size equ 40 21 | 22 | rex equ r8 23 | rfx equ r9 24 | rgx equ r10 25 | rhx equ r11 26 | rix equ r12 27 | rjx equ r13 28 | rkx equ r14 29 | rlx equ r15 30 | 31 | START: 32 | 33 | call draw_window 34 | call draw_magnify 35 | 36 | still: 37 | 38 | mov rax , 11 39 | int 0x60 40 | 41 | test rax , 1b ; Window redraw 42 | jnz red 43 | 44 | test rax , 10b ; Key press 45 | jnz key 46 | 47 | test rax , 100b ; Button press 48 | jnz button 49 | 50 | mov rax , 5 51 | mov rbx , 20 52 | int 0x60 53 | 54 | call draw_magnify 55 | 56 | jmp still 57 | 58 | red: 59 | 60 | call draw_window 61 | jmp still 62 | 63 | key: 64 | 65 | mov rax , 2 66 | int 0x60 67 | 68 | mov rax , 512 69 | int 0x60 70 | 71 | jmp still 72 | 73 | button: 74 | 75 | mov rax , 17 76 | int 0x60 77 | 78 | ; rax = status 79 | ; rbx = button id 80 | 81 | cmp rbx , 0x10000001 82 | jne no_application_terminate 83 | mov rax , 512 84 | int 0x60 85 | no_application_terminate: 86 | 87 | jmp still 88 | 89 | 90 | draw_window: 91 | 92 | mov rax , 12 93 | mov rbx , 1 94 | int 0x60 95 | 96 | mov rax , 0 ; draw window 97 | mov rbx , 50 *0x100000000 + 252 ; x start & size 98 | mov rcx , 50 *0x100000000 + 230 ; y start & size 99 | mov rdx , 1 *0x100000000 + 0xffffff ; type & border color 100 | mov rex , 1b ; draw buttons - close,full,minimize 101 | mov rfx , window_label ; 0 or label - asciiz 102 | mov rgx , 0 ; pointer to menu struct or 0 103 | int 0x60 104 | 105 | ; Left and right lines 106 | 107 | mov rbx , 0 108 | mov rfx , 0x848484 109 | mov rax , 38 110 | mov rcx , 0 111 | mov rex , 230 112 | mov rdx , rbx 113 | int 0x60 114 | add rbx , 50*5+1 115 | add rdx , 50*5+1 116 | int 0x60 117 | 118 | ; Up and Down lines 119 | 120 | mov rcx , 0 121 | mov rfx , 0xe0e0e0 122 | newup: 123 | mov rax , 38 124 | mov rbx , 0 125 | mov rdx , 280 126 | mov rex , rcx 127 | int 0x60 128 | push rcx 129 | add rcx , 40*5 +15 130 | add rex , 40*5 +15 131 | int 0x60 132 | pop rcx 133 | mov rex , rcx 134 | sub rfx , 0x0a0a0a 135 | inc rcx 136 | cmp rcx , 15 137 | jb newup 138 | 139 | ; 140 | 141 | mov rax , 12 142 | mov rbx , 2 143 | int 0x60 144 | 145 | ret 146 | 147 | 148 | draw_magnify: 149 | 150 | mov rax , 26 151 | mov rbx , 1 152 | mov rcx , sys_data 153 | mov rdx , 256 154 | int 0x60 155 | 156 | mov rkx , 0 157 | mov rlx , 0 158 | 159 | newpix: 160 | 161 | mov rax , 35 162 | mov rbx , 1 163 | mov rcx , rkx 164 | mov rdx , rlx 165 | add rcx ,[sys_data+6*8] 166 | add rdx ,[sys_data+7*8] 167 | sub rcx , x_size 168 | sub rdx , y_size 169 | int 0x60 170 | 171 | mov rdx , rax 172 | 173 | mov rax , 13 174 | mov rbx , rkx 175 | imul rbx , 5 176 | inc rbx 177 | shl rbx , 32 178 | add rbx , 5 179 | mov rcx , rlx 180 | imul rcx , 5 181 | add rcx , 15 182 | shl rcx , 32 183 | add rcx , 5 184 | int 0x60 185 | 186 | inc rkx 187 | cmp rkx , x_size 188 | jb newpix 189 | 190 | mov rkx , 0 191 | 192 | inc rlx 193 | cmp rlx , y_size 194 | jb newpix 195 | 196 | ret 197 | 198 | 199 | ; Data 200 | 201 | window_label: 202 | 203 | db 'MAGNIFIER',0 204 | 205 | sys_data: 206 | 207 | 208 | I_END: 209 | 210 | -------------------------------------------------------------------------------- /thread.asm: -------------------------------------------------------------------------------- 1 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 2 | ; 3 | ; 64 bit Menuet thread example 4 | ; 5 | ; Compile with FASM 1.60 or above 6 | ; 7 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 8 | 9 | use64 10 | 11 | org 0x0 12 | 13 | db 'MENUET64' ; Header identifier 14 | dq 0x01 ; Version 15 | dq START ; Start of code 16 | dq image_end ; Size of image 17 | dq 0x100000 ; Memory for app 18 | dq 0x10000 ; Rsp 19 | dq 0x00 ; Prm 20 | dq 0x00 ; Icon 21 | 22 | 23 | START: 24 | 25 | mov rax , 141 ; Enable system font 26 | mov rbx , 1 27 | mov rcx , 1 28 | mov rdx , 5 shl 32 + 5 29 | mov r8 , 9 shl 32 + 12 30 | int 0x60 31 | 32 | call draw_window ; At first, draw the window 33 | 34 | still: 35 | 36 | mov rax , 0xA ; Wait here for event 37 | int 0x60 38 | 39 | test rax , 0x1 ; Window redraw 40 | jnz window_event 41 | test rax , 0x2 ; Keyboard press 42 | jnz key_event 43 | test rax , 0x4 ; Button press 44 | jnz button_event 45 | 46 | jmp still 47 | 48 | window_event: 49 | 50 | call draw_window 51 | jmp still 52 | 53 | key_event: 54 | 55 | mov rax , 0x2 ; Read the key and ignore 56 | int 0x60 57 | 58 | jmp still 59 | 60 | stackposition: dq 0x10000 61 | 62 | button_event: 63 | 64 | mov rax , 0x11 65 | int 0x60 66 | 67 | ; rax = status 68 | ; rbx = button id 69 | 70 | cmp rbx , 0x10000001 71 | jne no_application_terminate_button 72 | mov rax , 0x200 73 | int 0x60 74 | no_application_terminate_button: 75 | 76 | cmp rbx , 0x106 77 | jne no_application_terminate_menu 78 | mov rax , 0x200 79 | int 0x60 80 | no_application_terminate_menu: 81 | 82 | cmp rbx , 10 83 | jne no_thread_create 84 | 85 | add [stackposition],dword 0x10000 86 | cmp [stackposition],dword 0x100000 87 | jae no_thread_create 88 | 89 | mov rax , 51 90 | mov rbx , 1 91 | mov rcx , START 92 | mov rdx , [stackposition] 93 | int 0x60 94 | 95 | no_thread_create: 96 | 97 | jmp still 98 | 99 | 100 | draw_window: 101 | 102 | mov rax , 0xC ; Beginning of window draw 103 | mov rbx , 0x1 104 | int 0x60 105 | 106 | mov rbx , rsp 107 | shr rbx , 16 108 | imul rbx , 20 109 | add rbx , 100 110 | shl rbx , 32 111 | mov rcx , rbx 112 | 113 | mov rax , 0x0 ; Draw window 114 | add rbx , 300 ; x start & size 115 | add rcx , 150 ; y start & size 116 | mov rdx , 0x0000000000FFFFFF ; type & border color 117 | mov r8 , 0x0000000000000001 ; draw flags 118 | mov r9 , window_label ; 0 or label - asciiz 119 | mov r10 , 0 ; 0 or pointer to menu struct 120 | int 0x60 121 | 122 | mov rax , 111 123 | mov rbx , 1 124 | int 0x60 125 | mov rcx , rax 126 | mov rax , 9 127 | mov rbx , 2 128 | mov rdx , image_end 129 | mov r8 , 2000 130 | int 0x60 131 | 132 | mov rax , 'Parent ' 133 | cmp [image_end+1040],byte 1 134 | jne no_child 135 | mov rax , 'Child ' 136 | no_child: 137 | mov [text+14],rax 138 | 139 | mov rax , 0x4 ; Display text 140 | mov rbx , text 141 | mov rcx , 30 142 | mov rdx , 50 143 | mov rsi , 0x0 144 | mov r9 , 0x1 145 | mov r8 , 0x2 146 | newline: 147 | int 0x60 148 | add rbx , 41 149 | add rdx , 16 150 | dec r8 151 | jnz newline 152 | 153 | mov rax , 8 154 | mov rbx , 30 shl 32 + 100 155 | mov rcx , 100 shl 32 + 20 156 | mov rdx , 10 157 | mov r8 , 0 158 | mov r9 , button 159 | int 0x60 160 | 161 | mov rax , 0xC ; End of window draw 162 | mov rbx , 0x2 163 | int 0x60 164 | 165 | ret 166 | 167 | 168 | ; Data area 169 | 170 | window_label: 171 | 172 | db 'THREAD.ASM',0 ; Window label 173 | 174 | text: 175 | 176 | db 'Process type: Parent ',0 177 | db 'Closing parent closes all threads. ',0 178 | 179 | 180 | button: db 'CREATE THREAD',0 181 | 182 | image_end: 183 | 184 | -------------------------------------------------------------------------------- /textbox.asm: -------------------------------------------------------------------------------- 1 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 2 | ; 3 | ; 64 bit Menuet textbox example 4 | ; 5 | ; Compile with FASM 1.60 or above 6 | ; 7 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 8 | 9 | use64 10 | 11 | org 0x0 12 | 13 | db 'MENUET64' ; Header identifier 14 | dq 0x01 ; Version 15 | dq START ; Start of code 16 | dq image_end ; Size of image 17 | dq 0x100000 ; Memory for app 18 | dq 0xffff0 ; Esp 19 | dq 0x00 ; Prm 20 | dq 0x00 ; Icon 21 | 22 | include "textbox.inc" 23 | 24 | START: 25 | 26 | mov rax , 141 ; Enable system font 27 | mov rbx , 1 28 | mov rcx , 1 29 | mov rdx , 5 shl 32 + 5 30 | mov r8 , 9 shl 32 + 12 31 | int 0x60 32 | 33 | call draw_window ; At first, draw the window 34 | 35 | still: 36 | 37 | mov rax , 10 ; Wait here for event 38 | int 0x60 39 | 40 | test rax , 1 ; Window redraw 41 | jnz window_event 42 | test rax , 2 ; Keyboard press 43 | jnz key_event 44 | test rax , 4 ; Button press 45 | jnz button_event 46 | 47 | jmp still 48 | 49 | window_event: 50 | 51 | call draw_window 52 | jmp still 53 | 54 | key_event: 55 | 56 | mov rax , 2 ; Read the key and ignore 57 | int 0x60 58 | 59 | jmp still 60 | 61 | button_event: 62 | 63 | mov rax , 17 64 | int 0x60 65 | 66 | ; rax = status 67 | ; rbx = button id 68 | 69 | cmp rbx , 11 70 | jne no_textbox1 71 | mov r14 , textbox1 72 | call read_textbox 73 | jmp still 74 | no_textbox1: 75 | 76 | cmp rbx , 12 77 | jne no_textbox2 78 | mov r14 , textbox2 79 | call read_textbox 80 | jmp still 81 | no_textbox2: 82 | 83 | cmp rbx , 0x10000001 84 | jne no_application_terminate_button 85 | mov rax , 512 86 | int 0x60 87 | jmp still 88 | no_application_terminate_button: 89 | 90 | cmp rbx , 0x106 91 | jne no_application_terminate_menu 92 | mov rax , 512 93 | int 0x60 94 | no_application_terminate_menu: 95 | 96 | jmp still 97 | 98 | 99 | draw_window: 100 | 101 | mov rax , 12 ; Beginning of window draw 102 | mov rbx , 1 103 | int 0x60 104 | 105 | mov rax , 0x0 ; Draw window 106 | mov rbx , 0x0000004000000120 ; x start & size 107 | mov rcx , 0x00000040000000A0 ; y start & size 108 | mov rdx , 0x0000000000FFFFFF ; type & border color 109 | mov r8 , 0x0000000000000001 ; draw flags 110 | mov r9 , window_label ; 0 or label - asciiz 111 | mov r10 , menu_struct ; 0 or pointer to menu struct 112 | int 0x60 113 | 114 | mov r14 , textbox1 115 | call draw_textbox 116 | 117 | mov r14 , textbox2 118 | call draw_textbox 119 | 120 | mov rax , 12 ; End of window draw 121 | mov rbx , 2 122 | int 0x60 123 | 124 | ret 125 | 126 | 127 | ; Data area 128 | 129 | window_label: 130 | 131 | db 'TEXTBOX EXAMPLE',0 132 | 133 | textbox1: 134 | 135 | dq 0 ; Type 136 | dq 20 ; X position 137 | dq 140 ; X size 138 | dq 50 ; Y position 139 | dq 11 ; Button ID 140 | dq 0 ; Current text length 141 | times 50 db 0 ; Text 142 | 143 | textbox2: 144 | 145 | dq 0 ; 146 | dq 20 ; 147 | dq 140 ; 148 | dq 80 ; 149 | dq 12 ; 150 | dq 0 ; 151 | times 50 db 0 ; 152 | 153 | menu_struct: ; Menu Struct 154 | 155 | dq 0 ; Version 156 | 157 | dq 0x100 ; Start value of ID to return ( ID + Line ) 158 | 159 | ; Returned when menu closes and 160 | ; user made no selections. 161 | 162 | db 0,'FILE',0 ; ID = 0x100 + 1 163 | db 1,'New',0 ; ID = 0x100 + 2 164 | db 1,'Open..',0 ; ID = 0x100 + 3 165 | db 1,'Save..',0 ; ID = 0x100 + 4 166 | db 1,'-',0 ; ID = 0x100 + 5 167 | db 1,'Quit',0 ; ID = 0x100 + 6 168 | 169 | db 0,'HELP',0 ; ID = 0x100 + 7 170 | db 1,'Contents..',0 ; ID = 0x100 + 8 171 | db 1,'About..',0 ; ID = 0x100 + 9 172 | 173 | db 255 ; End of Menu Struct 174 | 175 | image_end: 176 | 177 | -------------------------------------------------------------------------------- /e64-2.asm: -------------------------------------------------------------------------------- 1 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 2 | ; 3 | ; 64 bit Menuet controls example 4 | ; 5 | ; Compile with FASM 1.60 or above 6 | ; 7 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 8 | 9 | use64 10 | 11 | org 0x0 12 | 13 | db 'MENUET64' ; Header identifier 14 | dq 0x01 ; Version 15 | dq START ; Start of code 16 | dq image_end ; Size of image 17 | dq 0x100000 ; Memory for app 18 | dq 0xffff0 ; Rsp 19 | dq 0x00 ; Prm 20 | dq 0x00 ; Icon 21 | 22 | 23 | START: 24 | 25 | call draw_window ; At first, draw the window 26 | 27 | still: 28 | 29 | mov rax , 10 ; Wait here for event 30 | int 0x60 31 | 32 | test rax , 1 ; Window redraw 33 | jnz window_event 34 | test rax , 2 ; Keyboard press 35 | jnz key_event 36 | test rax , 4 ; Button press 37 | jnz button_event 38 | 39 | jmp still 40 | 41 | window_event: 42 | 43 | call draw_window 44 | jmp still 45 | 46 | key_event: 47 | 48 | mov rax , 2 ; Read the key and ignore 49 | int 0x60 50 | 51 | jmp still 52 | 53 | button_event: 54 | 55 | mov rax , 17 ; Get data 56 | int 0x60 57 | 58 | ; rax = status 59 | ; rbx = button id 60 | 61 | cmp rbx , 300 ; Vertical scroll 300-319 62 | jb no_vertical_scroll 63 | cmp rbx , 319 64 | ja no_vertical_scroll 65 | mov [vscroll_value], rbx 66 | call draw_vertical_scroll 67 | jmp still 68 | no_vertical_scroll: 69 | 70 | cmp rbx , 0x10000001 ; Terminate button 71 | jne no_application_terminate_button 72 | mov rax , 512 73 | int 0x60 74 | no_application_terminate_button: 75 | 76 | cmp rbx , 0x106 ; Menu 77 | jne no_application_terminate_menu 78 | mov rax , 512 79 | int 0x60 80 | no_application_terminate_menu: 81 | 82 | cmp rbx , 20 ; Clickme button 83 | jne no_clickme 84 | mov rax , 111 85 | mov rbx , 1 86 | int 0x60 87 | mov rcx , rax 88 | mov rax , 9 89 | mov rbx , 2 90 | mov rdx , image_end 91 | mov r8 , 1024 92 | int 0x60 93 | mov rax , 256 94 | mov rbx , image_end+408 ; path/name 95 | mov rcx , 0 96 | int 0x60 97 | jmp still 98 | no_clickme: 99 | 100 | jmp still 101 | 102 | 103 | draw_window: 104 | 105 | mov rax , 12 ; Beginning of window draw 106 | mov rbx , 1 107 | int 0x60 108 | 109 | ; Window position 110 | 111 | mov rax , 3 112 | mov rbx , 1 113 | int 0x60 114 | shr rax , 16 115 | imul rax , 4 116 | shl rax , 32 117 | mov rbx , rax 118 | mov rcx , rax 119 | 120 | mov rax , 0 ; Draw window 121 | add rbx , 280 122 | add rcx , 219 123 | mov rdx , 0xffffff 124 | mov r8 , 1 125 | mov r9 , window_label 126 | mov r10 , menu_struct 127 | int 0x60 128 | 129 | ; Define button 130 | 131 | mov rax , 8 132 | mov rbx , 020 shl 32 + 65 133 | mov rcx , 110 shl 32 + 20 134 | mov rdx , 20 135 | mov r8 , 0 136 | mov r9 , button_text 137 | int 0x60 138 | 139 | ; Vertical scroll 140 | 141 | call draw_vertical_scroll 142 | 143 | mov rax , 12 144 | mov rbx , 2 145 | int 0x60 146 | 147 | ret 148 | 149 | 150 | draw_vertical_scroll: 151 | 152 | ; Vertical scroll 153 | 154 | mov rax , 113 155 | mov rbx , 1 156 | mov rcx , 300 157 | mov rdx , 20 158 | mov r8 , [vscroll_value] 159 | mov r9 , 250 160 | mov r10 , 50 161 | mov r11 , 150 162 | int 0x60 163 | 164 | ret 165 | 166 | 167 | ; Data area 168 | 169 | window_label: ; Window label 170 | 171 | db 'EXAMPLE',0 172 | 173 | button_text: ; Button text 174 | 175 | db 'CLICK ME',0 176 | 177 | vscroll_value: ; Scroll value 178 | 179 | dq 305 180 | 181 | menu_struct: ; Menu Struct 182 | 183 | dq 0 ; Version 184 | 185 | dq 0x100 ; Start value of ID to return ( ID + Line ) 186 | 187 | ; Returned when menu closes and 188 | ; user made no selections. 189 | 190 | db 0,'FILE',0 ; ID = 0x100 + 1 191 | db 1,'New',0 ; ID = 0x100 + 2 192 | db 1,'Open..',0 ; ID = 0x100 + 3 193 | db 1,'Save..',0 ; ID = 0x100 + 4 194 | db 1,'-',0 ; ID = 0x100 + 5 195 | db 1,'Quit',0 ; ID = 0x100 + 6 196 | 197 | db 0,'HELP',0 ; ID = 0x100 + 7 198 | db 1,'Contents..',0 ; ID = 0x100 + 8 199 | db 1,'About..',0 ; ID = 0x100 + 9 200 | 201 | db 255 ; End of Menu Struct 202 | 203 | image_end: 204 | 205 | -------------------------------------------------------------------------------- /test.asm: -------------------------------------------------------------------------------- 1 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 2 | ; 3 | ; Menuet protection tests 4 | ; 5 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 6 | 7 | use64 8 | 9 | org 0x0 10 | 11 | db 'MENUET64' ; 8 byte id 12 | dq 0x01 ; header version 13 | dq START ; start of code 14 | dq I_END ; size of image 15 | dq 0x200000 ; memory for app 16 | dq 0x1ffff0 ; rsp 17 | dq 0x0,0x0 ; I_Param , I_Icon 18 | 19 | START: ; start of execution 20 | 21 | mov rax , 141 22 | mov rbx , 1 23 | mov rcx , 1 24 | mov rdx , 5 shl 32 + 5 25 | mov r8 , 9 shl 32 + 12 26 | int 0x60 27 | 28 | call draw_window ; at first, draw the window 29 | 30 | still: 31 | 32 | mov rax,10 ; wait here for event 33 | int 0x60 34 | 35 | test eax,1 ; redraw request ? 36 | jnz red 37 | test eax,2 ; key in buffer ? 38 | jnz key 39 | test eax,4 ; button in buffer ? 40 | jnz button 41 | 42 | jmp still 43 | 44 | red: ; redraw 45 | call draw_window 46 | 47 | jmp still 48 | 49 | key: ; key 50 | mov eax,2 ; just read it and ignore 51 | int 0x40 52 | 53 | jmp still 54 | 55 | button: ; button 56 | mov eax,17 57 | int 0x40 58 | 59 | shr rax , 8 60 | 61 | cmp rax , 0x10000001 ; button id=1 ? 62 | jnz noclose 63 | mov eax,512 ; close this program 64 | int 0x60 65 | noclose: 66 | 67 | cmp rax , 2 68 | jnz notest2 69 | cli 70 | notest2: 71 | 72 | cmp rax , 3 73 | jnz notest3 74 | sti 75 | notest3: 76 | 77 | cmp rax , 4 78 | jnz notest4 79 | mov [0x200000],byte 1 80 | notest4: 81 | 82 | cmp rax , 5 83 | jnz notest5 84 | jmp qword 0x200000 85 | notest5: 86 | 87 | cmp rax , 6 88 | jnz notest6 89 | mov rsp,0 90 | push rax 91 | notest6: 92 | 93 | cmp rax , 7 94 | jnz notest7 95 | in al,0x60 96 | notest7: 97 | 98 | cmp rax , 8 99 | jnz notest8 100 | out 0x60,al 101 | notest8: 102 | 103 | cmp rax , 9 104 | jnz notest9 105 | int 0x5f 106 | notest9: 107 | 108 | jmp still 109 | 110 | 111 | draw_window: 112 | 113 | mov eax,12 ; function 12:tell os about windowdraw 114 | mov ebx,1 ; 1, start of draw 115 | int 0x40 116 | 117 | ; DRAW WINDOW 118 | mov rax,0 ; function 0 : define and draw window 119 | mov rbx,100 shl 32 + 300 ; [x start] *65536 + [x size] 120 | mov rcx,100 shl 32 + 255 ; [y start] *65536 + [y size] 121 | mov rdx, 0xffffff ; color of work area RRGGBB 122 | mov r8 , 0 123 | mov r9 , window_label ; color of grab bar RRGGBB,8->color glid 124 | mov r10, 0 ; color of frames RRGGBB 125 | int 0x60 126 | 127 | mov eax,8 ; function 8 : define and draw button 128 | mov ebx,25*65536+11 ; [x start] *65536 + [x size] 129 | mov ecx,80*65536+11 ; [y start] *65536 + [y size] 130 | mov edx,2 ; button id 131 | mov esi,0x4466bb ; button color RRGGBB 132 | newb: 133 | int 0x40 134 | add ecx,20*65536 135 | inc edx 136 | cmp edx,10 137 | jb newb 138 | 139 | mov ebx,25*65536+42 ; draw info text with function 4 140 | mov ecx,0x000000 141 | mov edx,text 142 | mov esi,41 143 | newline: 144 | mov eax,4 145 | int 0x40 146 | add ebx,10 147 | add edx,41 148 | cmp [edx],byte 'x' 149 | jnz newline 150 | 151 | mov eax,12 ; function 12:tell os about windowdraw 152 | mov ebx,2 ; 2, end of draw 153 | int 0x40 154 | 155 | ret 156 | 157 | 158 | ; DATA AREA 159 | 160 | 161 | text: 162 | 163 | db 'APPLICATION USES 0x200000 BYTES OF MEMORY' 164 | db ' ' 165 | db 'OPEN DEBUG BOARD FOR PARAMETERS ' 166 | db ' ' 167 | db ' CLI ' 168 | db ' ' 169 | db ' STI ' 170 | db ' ' 171 | db ' MOV [0x200000],BYTE 1 ' 172 | db ' ' 173 | db ' JMP DWORD 0x200000 ' 174 | db ' ' 175 | db ' MOV RSP,0 & PUSH RAX ' 176 | db ' ' 177 | db ' IN AL,0x60 ' 178 | db ' ' 179 | db ' OUT 0x60,AL ' 180 | db ' ' 181 | db ' INT 0x5F ' 182 | db 'x ' 183 | 184 | 185 | window_label: 186 | 187 | db 'PROTECTION TEST',0 188 | 189 | I_END: 190 | 191 | -------------------------------------------------------------------------------- /cache2fd.asm: -------------------------------------------------------------------------------- 1 | ;WARNING! Spaghetti code, size optimized 2 | 3 | use64 4 | 5 | org 0x0 6 | 7 | db 'MENUET64' ; 8 byte id 8 | dq 0x01 ; header version 9 | dq START ; start of code 10 | dq I_END ; size of image 11 | dq 0x100000 ; memory for app 12 | dq 0x0ffff0 ; rsp 13 | dq 0x0,0x0 ; I_Param , I_Icon 14 | 15 | START: 16 | 17 | mov rax , 141 18 | mov rbx , 1 19 | mov rcx , 1 20 | mov rdx , 5 shl 32 + 5 21 | mov r8 , 9 shl 32 + 12 22 | int 0x60 23 | 24 | call draw_window 25 | 26 | still: 27 | 28 | mov rax,10 ; wait here for event 29 | int 0x60 30 | 31 | test rax,1 ; redraw request ? 32 | jnz red 33 | test rax,2 ; key in buffer ? 34 | jnz key 35 | test rax,4 ; button in buffer ? 36 | jnz button 37 | 38 | jmp still 39 | 40 | red: ; redraw 41 | 42 | call draw_window 43 | jmp still 44 | 45 | key: ; key 46 | ; just read it and ignore 47 | mov rax , 2 48 | int 0x40 49 | jmp still 50 | 51 | button: ; button 52 | 53 | mov eax,17 ; get id 54 | int 0x40 55 | 56 | cmp ah,1 ; button id=1 ? 57 | je close 58 | cmp ah,2 59 | je ramdiskcopy 60 | cmp ah,3 61 | je ramdiskupdate 62 | cmp ah,4 63 | je togglewrite 64 | 65 | jmp still 66 | 67 | close: 68 | 69 | mov rax , 512 70 | int 0x60 71 | 72 | ramdiskcopy: 73 | 74 | mov eax,16 75 | xor ebx,ebx 76 | inc ebx 77 | jmp callsys 78 | 79 | ramdiskupdate: 80 | 81 | mov eax,16 82 | xor ebx,ebx 83 | inc ebx 84 | inc ebx 85 | jmp callsys 86 | 87 | callsys: 88 | 89 | int 0x60 90 | jmp still 91 | 92 | ; get fdc settings for writing & invert them. 93 | 94 | togglewrite: 95 | 96 | mov rax,16 97 | mov ebx,4 98 | int 0x60 99 | xchg ecx,eax 100 | xor ecx,1 101 | mov rax,16 102 | dec ebx 103 | int 0x60 104 | call draw_window 105 | jmp still 106 | 107 | 108 | draw_window: 109 | 110 | mov eax,12 ; function 12:tell os about windowdraw 111 | xor ebx,ebx ; 1, start of draw 112 | inc ebx 113 | int 0x40 114 | 115 | mov rax , 0 116 | mov rbx , 100 shl 32 + 250 117 | mov rcx , 100 shl 32 + 120 118 | mov rdx , 0xffffff 119 | mov r8 , 1 120 | mov r9 , 0 121 | mov r10 , 0 122 | int 0x60 123 | 124 | ;The important part, the buttons & text. 125 | 126 | mov ebx,9*65536+28 127 | mov ecx,41*65536+14 128 | xor edx,edx 129 | inc edx 130 | inc edx 131 | call clickbox 132 | 133 | mov ebx,57*65536+40 134 | inc edx 135 | call clickbox 136 | 137 | mov ebx,12*65536+12 138 | mov ecx,81*65536+12 139 | inc edx 140 | call clickbox 141 | 142 | mov ecx,96*65536+12 143 | xor edx,edx 144 | call clickbox 145 | 146 | mov edi,0x10000000 147 | mov edx,titlebar 148 | mov ebx,9*65536+9 149 | mov ecx,0x10ffffff 150 | call print 151 | 152 | mov ebx,11*65536+28 153 | mov ecx,0x10808080 154 | call print 155 | 156 | add ebx,15 157 | xchg ecx,edi 158 | call print 159 | 160 | add ebx,25 161 | xchg ecx,edi 162 | call print 163 | 164 | add ebx,15 165 | xchg ecx,edi 166 | call print 167 | 168 | add ebx,15 169 | xchg ecx,edi 170 | call print 171 | 172 | mov eax,16 173 | mov ebx,4 174 | int 0x60 175 | test al,1 176 | je nowritex 177 | mov ebx,15*65536+83 178 | xchg ecx,edi 179 | call print 180 | nowritex: 181 | 182 | mov eax,12 ; function 12:tell os about windowdraw 183 | xor ebx,ebx ; 1, start of draw 184 | inc ebx 185 | inc ebx 186 | int 0x40 187 | 188 | ret 189 | 190 | 191 | clickbox: 192 | 193 | push rax rbx rcx rdx rsi rdi 194 | 195 | mov edi,edx 196 | cmp edx, 0 197 | je .disabledbox 198 | mov eax,8 ; function 8 : define and draw button 199 | int 0x40 200 | .disabledbox: 201 | inc ecx 202 | inc ebx 203 | mov eax,13 204 | mov edx, 0x808080 205 | int 0x40 206 | cmp edi,0 207 | je .grayed 208 | mov edx,0x80 209 | .grayed: 210 | sub ebx,65536 211 | sub ecx,65536 212 | int 0x40 213 | add ebx,65534 214 | add ecx,65534 215 | mov edx,0xffffff 216 | int 0x40 217 | 218 | pop rdi rsi rdx rcx rbx rax 219 | 220 | ret 221 | 222 | print: 223 | 224 | mov eax,edx 225 | xor esi,esi 226 | addchar: 227 | inc eax 228 | inc esi 229 | cmp [eax],byte 0 230 | jne addchar 231 | mov eax,4 232 | int 0x40 233 | add edx,esi 234 | inc edx 235 | 236 | ret 237 | 238 | 239 | ; Data 240 | 241 | titlebar: db 'CACHE2FD',0 242 | h1: db 'Commands',0 243 | comtext: db 'Copy or Update cache to floppy',0 244 | h2: db 'Settings',0 245 | setwrite: db ' Write directly to floppy',0 246 | setread: db ' Read directly from floppy',0 247 | xsign: db 'X',0 248 | 249 | I_END: 250 | 251 | -------------------------------------------------------------------------------- /info.asm: -------------------------------------------------------------------------------- 1 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 2 | ; 3 | ; Info for Menuet64 4 | ; 5 | ; Compile with FASM 1.60 or above 6 | ; 7 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 8 | 9 | use64 10 | 11 | org 0x0 12 | 13 | db 'MENUET64' ; Header identifier 14 | dq 0x01 ; Version 15 | dq START ; Start of code 16 | dq image_end ; Size of image 17 | dq 0x100000 ; Memory for app 18 | dq 0xffff0 ; Esp 19 | dq 0x00 ; Prm 20 | dq 0x00 ; Icon 21 | 22 | START: 23 | 24 | mov rax , 141 25 | mov rbx , 1 26 | mov rcx , 1 27 | mov rdx , 5 shl 32 + 5 28 | mov r8 , 9 shl 32 + 12 29 | int 0x60 30 | 31 | call draw_window ; At first, draw the window 32 | 33 | still: 34 | 35 | mov rax , 0xA ; Wait here for event 36 | int 0x60 37 | 38 | test rax , 0x1 ; Window redraw 39 | jnz window_event 40 | test rax , 0x2 ; Keyboard press 41 | jnz key_event 42 | test rax , 0x4 ; Button press 43 | jnz button_event 44 | 45 | jmp still 46 | 47 | window_event: 48 | 49 | call draw_window 50 | jmp still 51 | 52 | key_event: 53 | 54 | mov rax , 0x2 ; Read the key and ignore 55 | int 0x60 56 | 57 | jmp still 58 | 59 | button_event: 60 | 61 | mov rax , 0x11 62 | int 0x60 63 | 64 | ; rax = status 65 | ; rbx = button id 66 | 67 | cmp rbx , 0x10000001 68 | jne no_application_terminate_button 69 | mov rax , 0x200 70 | int 0x60 71 | no_application_terminate_button: 72 | 73 | cmp rbx , 0x106 74 | jne no_application_terminate_menu 75 | mov rax , 0x200 76 | int 0x60 77 | no_application_terminate_menu: 78 | 79 | jmp still 80 | 81 | 82 | draw_window: 83 | 84 | mov rax , 0xC ; Beginning of window draw 85 | mov rbx , 0x1 86 | int 0x60 87 | 88 | mov rax , 0x0 ; Draw window 89 | mov rbx , 0x000000D000000148 ; x start & size 90 | mov rcx , 0x00000060000000BC+194 ; y start & size 91 | mov rdx , 0x0000000000FFFFFF ; type & border color 92 | mov r8 , 0x0000000000000001 ; draw flags 93 | mov r9 , window_label ; 0 or label - asciiz 94 | mov r10 , menu_struct ; 0 or pointer to menu struct 95 | int 0x60 96 | 97 | mov rax , 0x4 ; Display text 98 | mov rbx , text 99 | mov rcx , 32 100 | mov rdx , 53 101 | mov rsi , 0 102 | mov r9 , 1 103 | mov r8 , 26 104 | newline: 105 | int 0x60 106 | add rbx , 46 107 | add rdx , 12 108 | dec r8 109 | jnz newline 110 | 111 | mov rax , 0xC ; End of window draw 112 | mov rbx , 0x2 113 | int 0x60 114 | 115 | ret 116 | 117 | 118 | ; Data area 119 | 120 | window_label: 121 | 122 | db 'M64',0 ; Window label 123 | 124 | text: 125 | 126 | db 'MENUET 64 bit ',0 127 | db ' ',0 128 | db 'Config.mnt - Setup and graphics acceleration ',0 129 | db 'Icon.mnt - Desktop icons ',0 130 | db 'Menu.mnt - Menu applications ',0 131 | db 'Stack.txt - Network info ',0 132 | db '/Driver - Driver examples ',0 133 | db 'E64.asm - Example application ',0 134 | db ' ',0 135 | db 'Credits: ',0 136 | db ' ',0 137 | db 'Ville Turjanmaa - Process management, Gui ',0 138 | db 'Jarek Pelczar - Quake, Doom, Dosbox ports',0 139 | db 'Mike Hibbett - Networking ',0 140 | db 'Madis Kalme - Graphic functions ',0 141 | db 'Tom Tollet - Floppy driver ',0 142 | db 'Akos Mogyorosi - Image/audio decoders ',0 143 | db ' ',0 144 | db 'Thomas Mathys - C4 ',0 145 | db 'Dieter Marfurt - 3dmaze ',0 146 | db 'Ivan Poddubny - MineSweeper ',0 147 | db 'baze@stonline.sk - Tube ',0 148 | db 'trans397@yahoo.com - Hunter ',0 149 | db 'www.crown-s-soft.com - Crownscr ',0 150 | db ' ',0 151 | db 'Contact : vmt@menuetos.net ',0 152 | 153 | 154 | menu_struct: ; Menu Struct 155 | 156 | dq 0 ; Version 157 | 158 | dq 0x100 ; Start value of ID to return ( ID + Line ) 159 | 160 | db 0,'FILE',0 ; ID = 0x100 + 1 161 | db 1,'New',0 ; ID = 0x100 + 2 162 | db 1,'Open..',0 ; ID = 0x100 + 3 163 | db 1,'Save..',0 ; ID = 0x100 + 4 164 | db 1,'-',0 ; ID = 0x100 + 5 165 | db 1,'Quit',0 ; ID = 0x100 + 6 166 | 167 | db 0,'HELP',0 ; ID = 0x100 + 7 168 | db 1,'Contents..',0 ; ID = 0x100 + 8 169 | db 1,'About..',0 ; ID = 0x100 + 9 170 | 171 | db 255 ; End of Menu Struct 172 | 173 | image_end: 174 | 175 | -------------------------------------------------------------------------------- /textbox.inc: -------------------------------------------------------------------------------- 1 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 2 | ; 3 | ; Textbox.inc for Menuet 4 | ; 5 | ; Compile with FASM 1.60 or above 6 | ; 7 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 8 | 9 | use64 10 | 11 | read_textbox: 12 | 13 | ;mov [r14+32],dword 0 ; Clears textbox 14 | ;mov [r14+40],byte 0 15 | 16 | mov rbp , [r14+40] ; Cursor position 17 | 18 | ;mov rax , 37 ; Cursor equals mouse position 19 | ;mov rbx , 1 20 | ;int 0x60 21 | ;shr rax , 32 22 | ;sub rax , [r14+8] 23 | ;xor rdx , rdx 24 | ;mov rbx , 6 25 | ;div rbx 26 | ;cmp rax , rbp 27 | ;jge no_cursor_position 28 | ;mov rbp , rax 29 | ;no_cursor_position: 30 | 31 | read_more_print: 32 | 33 | call draw_textbox 34 | 35 | mov rax , 38 36 | mov rbx , [r14+40] 37 | mov rbx , rbp 38 | imul rbx , 6 39 | add rbx , [r14+8] 40 | add rbx , 4 41 | mov rcx , [r14+24] 42 | add rcx , 2 43 | mov rdx , rbx 44 | mov r8 , rcx 45 | add r8 , 12 46 | mov r9 , 0x000000 47 | int 0x60 48 | 49 | read_more_keys: 50 | 51 | mov rax , 10 52 | int 0x60 53 | 54 | cmp rax , 2 55 | je continue 56 | call draw_textbox 57 | ret 58 | continue: 59 | 60 | mov rax , 2 61 | int 0x60 62 | 63 | cmp rbx , 10b 64 | jne no_special 65 | 66 | mov r8 , 'Delete ' 67 | cmp rcx , r8 68 | jne no_delete 69 | cmp rbp , [r14+40] 70 | je no_delete 71 | inc rbp 72 | jmp backspace 73 | no_delete: 74 | 75 | mov r8 , 'Backspc ' 76 | cmp rcx , r8 77 | jne no_backspc 78 | 79 | backspace: 80 | cmp rbp , 0 81 | je read_more_keys 82 | 83 | dec dword [r14+40] 84 | 85 | mov rdi , rbp 86 | add rdi , r14 87 | add rdi , 48 88 | 89 | mov rax , [r14+16] 90 | imul rax , 6 91 | xor rdx , rdx 92 | mov rbx , 6 93 | div rbx 94 | 95 | mov rcx , [r14+40] 96 | sub rcx , rbp 97 | inc rcx 98 | mov rsi , rdi 99 | dec rdi 100 | cld 101 | rep movsb 102 | 103 | dec rbp 104 | 105 | mov rax , [r14+40] 106 | mov [r14+48 +rax],byte 0 107 | skipthis: 108 | jmp read_more_print 109 | no_backspc: 110 | 111 | mov r8 , 'Esc ' 112 | cmp rcx , r8 113 | je exit_textbox 114 | 115 | mov r8 , 'Enter ' 116 | cmp rcx , r8 117 | je exit_textbox 118 | 119 | mov r8 , 'Left-A ' 120 | cmp rcx , r8 121 | jne no_left 122 | cmp rbp , 0 123 | je read_more_keys 124 | dec rbp 125 | jmp read_more_print 126 | no_left: 127 | 128 | mov r8 , 'Right-A ' 129 | cmp rcx , r8 130 | jne no_right 131 | cmp rbp , [r14+40] 132 | jae read_more_keys 133 | inc rbp 134 | jmp read_more_print 135 | no_right: 136 | 137 | no_special: 138 | 139 | cmp rbx , 0 140 | jne read_more_keys 141 | 142 | and cx , 0xff 143 | mov rax , [r14+40] 144 | mov rax , rbp 145 | mov rdi , rax 146 | add rdi , r14 147 | add rdi , 48 148 | 149 | mov rax , [r14+16] 150 | sub rax , 6 151 | mov rbx , 6 152 | xor rdx , rdx 153 | div rbx 154 | cmp rax , [r14+40] 155 | jbe nomoretext 156 | inc dword [r14+40] 157 | inc rbp 158 | push rcx 159 | push rdi 160 | mov rcx , rax 161 | sub rcx , rbp 162 | mov rsi , rdi 163 | inc rdi 164 | add rdi , rcx 165 | add rsi , rcx 166 | inc rcx 167 | std 168 | rep movsb 169 | pop rdi 170 | pop rcx 171 | mov [rdi],cl 172 | cmp rbp , [r14+40] 173 | jne nomoretext 174 | mov [rdi+1],byte 0 175 | nomoretext: 176 | 177 | jmp read_more_print 178 | 179 | exit_textbox: 180 | 181 | push rcx 182 | call draw_textbox 183 | pop rcx 184 | 185 | ret 186 | 187 | draw_textbox: 188 | 189 | mov rax , [r14+8] 190 | mov r15 , [r14+16] 191 | 192 | push rax 193 | 194 | ; Black frames 195 | 196 | mov rax , 38 197 | mov rbx , [r14+8] 198 | mov rdx , [r14+16] 199 | add rdx , rbx 200 | mov rcx , [r14+24] 201 | mov r8 , 16 202 | add r8 , rcx 203 | mov r9 , 0x202020 204 | push rbx 205 | mov rbx , rdx 206 | int 0x60 207 | pop rbx 208 | push rdx 209 | mov rdx , rbx 210 | int 0x60 211 | pop rdx 212 | push rcx 213 | mov rcx , r8 214 | int 0x60 215 | pop rcx 216 | push r8 217 | mov r8 , rcx 218 | int 0x60 219 | pop r8 220 | 221 | ; White 222 | 223 | mov rax , 13 224 | mov rbx , [rsp] 225 | add rbx , 1 226 | shl rbx , 32 227 | add rbx , r15 228 | sub rbx , 2 229 | mov rcx , [r14+24] 230 | add rcx , 1 231 | shl rcx , 32 232 | add rcx , 15 233 | mov rdx , 0xffffff 234 | int 0x60 235 | 236 | ; Text 237 | 238 | mov rax , 4 239 | mov rbx , r14 240 | add rbx , 48 241 | mov rcx , 25 242 | mov rcx , [rsp+0] 243 | add rcx , 4 244 | mov rdx , [r14+24] 245 | add rdx , 5 246 | mov rsi , 0x000000 247 | mov r9 , 1 248 | int 0x60 249 | 250 | ; Button 251 | 252 | mov rbx , [rsp] 253 | shl rbx , 32 254 | mov rax , 8 255 | add rbx , r15 256 | inc rbx 257 | mov rcx , [r14+24] 258 | shl rcx , 32 259 | add rcx , 17 260 | mov rdx , [r14+32] 261 | mov r8 , 0 262 | bts r8 , 63 263 | ;bts r8 , 61 264 | mov r9 , 0 265 | int 0x60 266 | 267 | pop rax 268 | 269 | ret 270 | 271 | -------------------------------------------------------------------------------- /fire.asm: -------------------------------------------------------------------------------- 1 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 2 | ; 3 | ; Fire for Menuet 4 | ; 5 | ; Compile with FASM 6 | ; 7 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 8 | 9 | use64 10 | 11 | org 0x0 12 | 13 | db 'MENUET64' ; 8 byte id 14 | dq 0x01 ; required os 15 | dq START ; program start 16 | dq I_END ; image size 17 | dq 0x100000 ; reguired amount of memory 18 | dq 0x07fff0 19 | dq 0,0 20 | 21 | START: 22 | 23 | call draw_window 24 | 25 | still: 26 | 27 | mov eax,11 28 | int 0x40 29 | 30 | cmp eax,1 31 | jz red 32 | cmp eax,3 33 | jz button 34 | 35 | call fire_image 36 | 37 | jmp still 38 | 39 | red: ; Draw window 40 | call draw_window 41 | jmp still 42 | 43 | button: ; Get button id 44 | 45 | mov rax,17 46 | int 0x60 47 | 48 | cmp rbx,0x10000001 ; Close program 49 | jne noclose 50 | mov rax,512 51 | int 0x60 52 | noclose: 53 | 54 | cmp rbx,0x102 ; Change fire type 55 | jne nob2 56 | mov eax,[type] 57 | add eax,1 58 | and eax,1 59 | mov [type],eax 60 | jmp still 61 | nob2: 62 | 63 | cmp rbx,0x103 ; Change delay 64 | jne nob3 65 | mov eax,[delay] 66 | sub eax,1 67 | and eax,1 68 | mov [delay],eax 69 | jmp still 70 | nob3: 71 | 72 | cmp rbx,0x104 ; Change color 73 | jne nob4 74 | mov eax,[fcolor] 75 | add eax,1 76 | cmp eax,2 77 | jbe fcfine 78 | mov eax,0 79 | fcfine: 80 | mov [fcolor],eax 81 | mov eax,0 82 | mov ecx,0x10000 83 | mov edi,0x80000 84 | cld 85 | rep stosd 86 | jmp still 87 | nob4: 88 | 89 | cmp rbx,0x106 ; Quit 90 | jne nob6 91 | mov rax,512 92 | int 0x60 93 | nob6: 94 | 95 | jmp still 96 | 97 | 98 | fire_image: 99 | 100 | mov esi, FireScreen 101 | add esi, 0x2300 102 | sub esi, 80 103 | mov ecx, 80 104 | xor edx, edx 105 | 106 | NEWLINE: 107 | 108 | mov eax , [FireSeed] 109 | mov edx , 0x8405 110 | mul edx 111 | inc eax 112 | mov dword [FireSeed], eax 113 | 114 | mov [esi], dl 115 | inc esi 116 | dec ecx 117 | jnz NEWLINE 118 | 119 | mov ecx, 0x2300 120 | sub ecx, 80 121 | mov esi, FireScreen 122 | add esi, 80 123 | 124 | FIRELOOP: 125 | 126 | xor eax,eax 127 | 128 | cmp [type],0 129 | jnz notype1 130 | mov al, [esi] 131 | add al, [esi + 2] 132 | adc ah, 0 133 | add al, [esi + 1] 134 | adc ah, 0 135 | add al, [esi + 81] 136 | adc ah, 0 137 | notype1: 138 | 139 | cmp [type],1 140 | jnz notype2 141 | mov al, [esi] 142 | add al, [esi - 1] 143 | adc ah, 0 144 | add al, [esi - 1] 145 | adc ah, 0 146 | add al, [esi + 79] 147 | adc ah,0 148 | notype2: 149 | 150 | cmp [type],2 151 | jnz notype3 152 | mov al, [esi] 153 | add al, [esi - 1] 154 | adc ah,0 155 | add al, [esi + 1] 156 | adc ah, 0 157 | add al, [esi + 81] 158 | adc ah,0 159 | notype3: 160 | 161 | shr eax, 2 162 | jz ZERO 163 | dec eax 164 | 165 | ZERO: 166 | 167 | mov [esi - 80], al 168 | inc esi 169 | dec ecx 170 | jnz FIRELOOP 171 | 172 | push rax rbx rcx rdx rsi rdi 173 | 174 | mov eax,5 175 | mov ebx,[delay] 176 | int 0x40 177 | 178 | mov al,byte [calc] 179 | inc al 180 | mov byte [calc],al 181 | cmp al,byte 2 182 | jz pdraw 183 | 184 | jmp nodrw 185 | 186 | pdraw: 187 | 188 | mov byte [calc],byte 0 189 | 190 | mov edi,0x80000 191 | add edi,[fcolor] 192 | mov esi,FireScreen 193 | xor edx,edx 194 | 195 | newc: 196 | 197 | movzx eax,byte [esi] 198 | mov ebx,eax 199 | mov ecx,eax 200 | shl ax,8 201 | shr bx,1 202 | mov al,bl 203 | add ecx,eax 204 | shl ax,8 205 | mov ch,ah 206 | 207 | mov [edi+0],cx 208 | mov [edi+3],cx 209 | mov [edi+6],cx 210 | mov [edi+9],cx 211 | mov [edi+0+320*3],cx 212 | mov [edi+3+320*3],cx 213 | mov [edi+6+320*3],cx 214 | mov [edi+9+320*3],cx 215 | 216 | add edi,12 217 | inc edx 218 | cmp edx,80 219 | jnz nnl 220 | xor edx,edx 221 | add edi,320*3 222 | nnl: 223 | inc esi 224 | cmp esi,FireScreen+0x2000 225 | jnz newc 226 | 227 | mov eax,7 ; display image 228 | mov ebx,0x80000 229 | mov ecx,4*80*65536+200 230 | mov edx,5*65536+39 231 | int 0x40 232 | 233 | nodrw: 234 | 235 | pop rdi rsi rdx rcx rbx rax 236 | 237 | ret 238 | 239 | 240 | draw_window: 241 | 242 | mov eax,12 243 | mov ebx,1 244 | int 0x40 245 | 246 | mov rax , 0 247 | mov rbx , 100 * 0x100000000 + 330 248 | mov rcx , 100 * 0x100000000 + 244 249 | mov rdx , 0x000000 250 | mov r8 , 0 251 | mov r9 , window_label 252 | mov r10 , menu_struct 253 | int 0x60 254 | 255 | mov eax,12 256 | mov ebx,2 257 | int 0x40 258 | 259 | ret 260 | 261 | 262 | ; Data area 263 | 264 | calc dd 0 265 | fcolor dd 2 266 | type dd 0 267 | delay dd 1 268 | 269 | FireSeed dd 0x1234 270 | 271 | window_label: 272 | 273 | db 'FIRE',0 274 | 275 | menu_struct: 276 | 277 | dq 0x000 278 | 279 | dq 0x100 280 | 281 | db 0,'FILE',0 282 | db 1,'Type',0 283 | db 1,'Speed',0 284 | db 1,'Color',0 285 | db 1,'-',0 286 | db 1,'Quit',0 287 | 288 | db 255 289 | 290 | FireScreen: 291 | 292 | I_END: 293 | 294 | -------------------------------------------------------------------------------- /rtdata.asm: -------------------------------------------------------------------------------- 1 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 2 | ; 3 | ; Real-Time data fetch from com1 modem 4 | ; 5 | ; Compile with FASM 1.60 or above 6 | ; 7 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 8 | 9 | use64 10 | 11 | org 0x0 12 | 13 | db 'MENUET64' ; Header identifier 14 | dq 0x01 ; Version 15 | dq START ; Start of code 16 | dq image_end ; Size of image 17 | dq 0x100000 ; Memory for app 18 | dq 0xffff0 ; Rsp 19 | dq 0x00 ; Prm 20 | dq 0x00 ; Icon 21 | 22 | 23 | START: 24 | 25 | mov rax , 141 ; Enable system font 26 | mov rbx , 1 27 | mov rcx , 1 28 | mov rdx , 5 shl 32 + 5 29 | mov r8 , 9 shl 32 + 12 30 | int 0x60 31 | 32 | call Reserve_IRQ_Ports 33 | 34 | call draw_window 35 | 36 | still: 37 | 38 | mov rax , 10 ; Wait here for event 39 | int 0x60 40 | 41 | test rax , 0x1 ; Window redraw 42 | jnz window_event 43 | test rax , 0x2 ; Keyboard press 44 | jnz key_event 45 | test rax , 0x4 ; Button press 46 | jnz button_event 47 | 48 | ; IRQ 4 event 49 | 50 | mov rbx , 10000b shl 32 51 | test rax , rbx 52 | jnz IRQ4_event 53 | 54 | jmp still 55 | 56 | window_event: 57 | 58 | call draw_window 59 | jmp still 60 | 61 | key_event: 62 | 63 | mov rax , 0x2 ; Read the key and ignore 64 | int 0x60 65 | 66 | test rbx , 1 67 | jnz no_key_down 68 | 69 | mov rax , 'Enter ' 70 | cmp rcx , rax 71 | jne no_enter 72 | mov cl , 13 73 | no_enter: 74 | 75 | mov al , cl 76 | mov dx , 0x3f8 77 | out dx , al 78 | 79 | no_key_down: 80 | 81 | jmp still 82 | 83 | button_event: 84 | 85 | mov rax , 0x11 86 | int 0x60 87 | 88 | ; rax = status 89 | ; rbx = button id 90 | 91 | cmp rbx , 0x10000001 ; Terminte button 92 | je application_terminate 93 | cmp rbx , 0x106 ; Menu quit 94 | je application_terminate 95 | 96 | jmp still 97 | 98 | application_terminate: 99 | 100 | mov rax , 512 101 | int 0x60 102 | 103 | IRQ4_event: 104 | 105 | ; Read data 106 | 107 | mov rax , 42 108 | mov rbx , 4 109 | int 0x60 110 | 111 | cmp rax , 1 112 | je read_done 113 | 114 | ; Set to text area 115 | 116 | mov rax , [xpos] 117 | inc rax 118 | and rax , 31 119 | mov [xpos], rax 120 | 121 | mov [text+38*2+rax], bl 122 | 123 | jmp IRQ4_event 124 | 125 | read_done: 126 | 127 | call display_text 128 | 129 | jmp still 130 | 131 | 132 | Reserve_IRQ_Ports: 133 | 134 | ; Reserve IRQ 4 135 | 136 | mov rax , 45 137 | mov rbx , 0 138 | mov rcx , 4 139 | int 0x60 140 | 141 | ; Reserve ports 0x3f8-0x3ff 142 | 143 | mov rcx , 0x3f8 144 | resport: 145 | mov rax , 46 146 | mov rbx , 0 147 | int 0x60 148 | inc rcx 149 | cmp rcx , 0x3ff 150 | jbe resport 151 | 152 | ; Ports to read at IRQ 4 153 | 154 | mov rax , 44 155 | mov rbx , 4 156 | mov rcx , irq_table 157 | int 0x60 158 | 159 | ; Program COM 1 port 160 | 161 | call program_com1 162 | 163 | ; Enable event for IRQ 4 164 | 165 | mov rax , 40 166 | mov rbx , 10000b shl 32 + 111b 167 | int 0x60 168 | 169 | ret 170 | 171 | 172 | irq_table: 173 | 174 | dd 0x3f8 , 0x1 ; Read from port 0x3f0 : read byte ( 0x1 ) 175 | dd 0x000 , 0x0 ; End marker 176 | 177 | 178 | baudrate_9600 equ 12 179 | baudrate_57600 equ 2 180 | baudrate_115200 equ 1 181 | 182 | program_com1: ; Set Baudrate 183 | 184 | mov dx , 0x3f8+3 185 | mov al , 0x80 186 | out dx , al 187 | 188 | mov dx , 0x3f8+1 189 | mov al , 0x00 190 | out dx , al 191 | 192 | mov dx , 0x3f8+0 193 | mov al , baudrate_9600 194 | out dx , al 195 | 196 | mov dx , 0x3f8+3 197 | mov al , 0x3 198 | out dx , al 199 | 200 | mov dx , 0x3f8+4 201 | mov al , 0xb 202 | out dx , al 203 | 204 | mov dx , 0x3f8+1 205 | mov al , 0x1 206 | out dx , al 207 | 208 | ret 209 | 210 | 211 | draw_window: 212 | 213 | mov rax , 0xC ; Beginning of window draw 214 | mov rbx , 0x1 215 | int 0x60 216 | 217 | mov rax , 0x0 ; Draw window 218 | mov rbx , 0x6000000000 + 6*46 + 10 219 | mov rcx , 0x5000000000 + 12*10 + 50 220 | mov rdx , 0xffffff 221 | mov r8 , 0x0 222 | mov r9 , window_label 223 | mov r10 , 0 224 | int 0x60 225 | 226 | call display_text 227 | 228 | mov rax , 0xC ; End of window draw 229 | mov rbx , 0x2 230 | int 0x60 231 | 232 | ret 233 | 234 | 235 | display_text: 236 | 237 | ; Clear area 238 | 239 | mov rax , 13 240 | mov rbx , 20*0x100000000 + 40*6 241 | mov rcx , 98*0x100000000 + 10 242 | mov rdx , 0xffffff 243 | int 0x60 244 | 245 | ; Text 246 | 247 | mov rax , 4 248 | mov rbx , text 249 | mov rcx , 20 250 | mov rdx , 50 251 | mov r9 , 1 252 | mov rsi , 0x000000 253 | newtext: 254 | int 0x60 255 | add rdx , 24 256 | add rbx , 38 257 | cmp rbx , text+38*3 258 | jb newtext 259 | 260 | ret 261 | 262 | 263 | ; Data area 264 | 265 | window_label: 266 | 267 | db 'RTDATA.ASM',0 268 | 269 | xpos: 270 | 271 | dq 0x0 272 | 273 | text: 274 | 275 | db 'Real-Time data fetch from COM1 modem.',0 276 | db 'Type a few letters. Echo from COM1: ',0 277 | db ' ',0 278 | 279 | 280 | image_end: 281 | 282 | -------------------------------------------------------------------------------- /play/eq.inc: -------------------------------------------------------------------------------- 1 | ;------------------------------------------------------------------------------------ 2 | ; 3 | ; Equalizer 4 | ; 5 | ;------------------------------------------------------------------------------------ 6 | 7 | ;------------------------------------------------------------------------------------ 8 | ; IN: r15 - wave position 9 | ; OUT: [r15+] 10 | 11 | apply_equalizer: 12 | 13 | push rax rbx rcx rdx rsi rdi r8 r9 r10 r11 r12 r13 r14 r15 rbp 14 | 15 | mov rax , 150 ;work memory init 16 | mov rbx , 1 17 | mov rcx , memm 18 | mov rdx , 0x100000*6 19 | int 0x60 20 | 21 | push r15 ;copy source 22 | mov rsi , r15 23 | mov rdi , inwav 24 | mov rcx , asize+65536 25 | cld 26 | rep movsb 27 | 28 | mov rcx , fftcvif ;create empty FFTCV interface for coeffs calculation 29 | mov rdx , FFTCV_LENGTH_32BANDS 30 | ;fftcv_init 31 | mov rax , 150 32 | mov rbx , 31 33 | int 0x60 34 | 35 | test rax , rax 36 | mov [errcode], rax 37 | jnz .end 38 | 39 | mov rcx , [fftcvif] ;calculate 32-band equalizer coefficients 40 | mov rdx , FFTCV_EQ_32BANDS 41 | mov r8 , 0 42 | mov r9 , gaintable 43 | mov r10 , phasetable 44 | ;fftcv_calc_coeffs 45 | mov rax , 150 46 | mov rbx , 33 47 | int 0x60 48 | 49 | test rax , rax 50 | mov [errcode], rax 51 | jnz .end 52 | 53 | mov rdi , fftcvifaces ;init fftcvifaces list (see documentation on this) 54 | mov rax , [fftcvif] 55 | mov ecx , 48 56 | rep stosq 57 | 58 | mov rcx , fmchiface ;init multi-ch interface 59 | mov rdx , FFTCV_LENGTH_32BANDS 60 | mov r8 , (SC_FORMAT_16B_ST shl 32) + SC_FORMAT_16B_ST ;format can be obtained by "wfc" too 61 | ;fftcv_init_mch 62 | mov rax , 150 63 | mov rbx , 41 64 | int 0x60 65 | 66 | test rax , rax 67 | mov [errcode], rax 68 | jnz .end 69 | 70 | mov rcx , [fmchiface] ;set coeffs multi-ch 71 | mov rdx , fftcvifaces 72 | ;fftcv_set_coeffs_mch 73 | mov rax , 150 74 | mov rbx , 44 75 | int 0x60 76 | 77 | test rax , rax 78 | mov [errcode], rax 79 | jnz .end 80 | 81 | mov rdx , inwav ;init in/out buffer and size 82 | mov r8 , buffer 83 | mov r9 , (asize+65536)/2/2 84 | mov rcx , [fmchiface] ;process 85 | ;fftcv_process_mch 86 | mov rax , 150 87 | mov rbx , 43 88 | int 0x60 89 | 90 | mov ecx , SC_FORMAT_16B_ST ;update output position 91 | and ecx , 15 ;bits 3-0 is the sample type or "size" 92 | imul rax , rcx 93 | mov ecx , SC_FORMAT_16B_ST ;bits 15-8 is the number of channels 94 | shr ecx , 8 95 | and ecx , 255 ;(see "scextern.inc") 96 | imul rax , rcx 97 | add r8 , rax 98 | 99 | mov rcx , [fmchiface] ;get trailing delay 100 | mov r9 , FFTCV_TRAILING_DELAY 101 | ;fftcv_process_mch 102 | mov rax , 150 103 | mov rbx , 43 104 | int 0x60 105 | 106 | mov ecx , SC_FORMAT_16B_ST ;update output position 107 | and ecx , 15 ;bits 3-0 is the sample type or "size" 108 | imul rax , rcx 109 | mov ecx , SC_FORMAT_16B_ST ;bits 15-8 is the number of channels 110 | shr ecx , 8 111 | and ecx , 255 ;(see "scextern.inc") 112 | imul rax , rcx 113 | add r8 , rax 114 | 115 | mov rcx , [fmchiface] ;deinit iface 116 | ;fftcv_deinit_mch 117 | mov rax , 150 118 | mov rbx , 42 119 | int 0x60 120 | 121 | mov rcx , [fftcvif] ;deinit iface 122 | ;fftcv_deinit 123 | mov rax , 150 124 | mov rbx , 32 125 | int 0x60 126 | 127 | .end: 128 | 129 | pop r15 ;copy result 130 | mov rsi , buffer+16384 131 | mov rdi , r15 132 | mov rcx , asize 133 | cld 134 | rep movsb 135 | 136 | pop rbp r15 r14 r13 r12 r11 r10 r9 r8 rdi rsi rdx rcx rbx rax 137 | 138 | ret 139 | 140 | align 4 141 | 142 | gaintable: times 32 dd 1.0 143 | 144 | phasetable: times 32 dd 00.0 145 | 146 | ;------------------------------------------------------------------------------------ 147 | 148 | -------------------------------------------------------------------------------- /smp.asm: -------------------------------------------------------------------------------- 1 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 2 | ; 3 | ; SMP for Menuet64 4 | ; 5 | ; Compile with FASM 1.60 or above 6 | ; 7 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 8 | 9 | use64 10 | 11 | org 0x0 12 | 13 | db 'MENUET64' ; Header identifier 14 | dq 0x01 ; Version 15 | dq START ; Start of code 16 | dq image_end ; Size of image 17 | dq 0x100000 ; Memory for app 18 | dq 0xffff0 ; Esp 19 | dq 0x00 ; Prm 20 | dq 0x00 ; Icon 21 | 22 | 23 | START: 24 | 25 | mov rax , 141 26 | mov rbx , 1 27 | mov rcx , 1 28 | mov rdx , 5 shl 32 + 5 29 | mov r8 , 9 shl 32 + 12 30 | int 0x60 31 | 32 | call draw_window ; At first, draw the window 33 | 34 | still: 35 | 36 | mov rax , 23 ; Wait here for event 37 | mov rbx , 100 38 | int 0x60 39 | 40 | test rax , 0x1 ; Window redraw 41 | jnz window_event 42 | test rax , 0x2 ; Keyboard press 43 | jnz key_event 44 | test rax , 0x4 ; Button press 45 | jnz button_event 46 | 47 | mov rax , 140 48 | mov rbx , 1 49 | int 0x60 50 | cmp rbx , [smp_state] 51 | jne window_event 52 | 53 | jmp still 54 | 55 | 56 | window_event: 57 | 58 | call draw_window 59 | jmp still 60 | 61 | key_event: 62 | 63 | mov rax , 0x2 ; Read the key and ignore 64 | int 0x60 65 | 66 | jmp still 67 | 68 | button_event: 69 | 70 | mov rax , 0x11 71 | int 0x60 72 | 73 | ; rax = status 74 | ; rbx = button id 75 | 76 | cmp rbx , 0x10000001 77 | jne no_application_terminate_button 78 | mov rax , 0x200 79 | int 0x60 80 | no_application_terminate_button: 81 | 82 | cmp rbx , 0x106 83 | jne no_application_terminate_menu 84 | mov rax , 0x200 85 | int 0x60 86 | no_application_terminate_menu: 87 | 88 | cmp rbx , 11 89 | jne noprocessliststart 90 | mov rax , 256 91 | mov rbx , string_cad 92 | mov rcx , 0 93 | int 0x60 94 | jmp still 95 | noprocessliststart: 96 | 97 | jmp still 98 | 99 | 100 | draw_window: 101 | 102 | mov rax , 0xC ; Beginning of window draw 103 | mov rbx , 0x1 104 | int 0x60 105 | 106 | ; SMP status 107 | 108 | mov rax , 140 109 | mov rbx , 1 110 | int 0x60 111 | mov [smp_state],rbx 112 | 113 | mov rax , rbx 114 | xor rdx , rdx 115 | mov rbx , 10 116 | div rbx 117 | add al , 48 118 | add dl , 48 119 | mov [text+11],al 120 | mov [text+12],dl 121 | 122 | ; CPUs available 123 | 124 | mov rax , 140 125 | mov rbx , 2 126 | int 0x60 127 | mov rax , rbx 128 | xor rdx , rdx 129 | mov rbx , 10 130 | div rbx 131 | add al , 48 132 | add dl , 48 133 | mov [text2+18],al 134 | mov [text2+19],dl 135 | 136 | ; 137 | 138 | mov rax , 0x0 ; Draw window 139 | mov rbx , 0x0000006000000110 ; x start & size 140 | mov rcx , 0x000000600000010C ; y start & size 141 | mov rdx , 0x0000000000FFFFFF ; type & border color 142 | mov r8 , 0x0000000000000001 ; draw flags 143 | mov r9 , window_label ; 0 or label - asciiz 144 | mov r10 , menu_struct ; 0 or pointer to menu struct 145 | int 0x60 146 | 147 | mov rax , 141 148 | mov rbx , 3 149 | int 0x60 150 | and rax , 0xff 151 | mov r14 , rax 152 | mov r15 , rax 153 | sub r14 , 9 154 | shr r14 , 1 155 | add r14 , 9 156 | add r14 , 3 157 | 158 | sub r15 , 9 159 | shr r15 , 1 160 | imul r15 , 6 161 | mov r12 , 0x40 162 | sub r12 , r15 163 | 164 | mov rax , 0x4 ; Display text 165 | mov rbx , text 166 | mov rcx , 0x20 167 | mov rdx , r12 168 | mov rsi , 0x0 169 | mov r9 , 0x1 170 | newline: 171 | int 0x60 172 | add rbx , 0x1F+30 173 | add rdx , r14 174 | cmp [rbx],byte 'x' 175 | jne newline 176 | 177 | mov rax , 8 178 | mov rbx , 87 shl 32 + 100 179 | mov rcx , 225 shl 32 + 20 180 | mov rdx , 11 181 | mov r8 , 0 182 | mov r9 , string_button 183 | int 0x60 184 | 185 | mov rax , 0xC ; End of window draw 186 | mov rbx , 0x2 187 | int 0x60 188 | 189 | ret 190 | 191 | 192 | ; Data area 193 | 194 | window_label: 195 | 196 | db 'SMP',0 ; Window label 197 | 198 | text: 199 | 200 | db 'SMP state: xx ',0 201 | db ' ',0 202 | db '00 - Not initialized ',0 203 | db '01 - Initialized successfully ',0 204 | db '10 - BSP APIC ID fail ',0 205 | db '11 - No Virtual Wire mode available ',0 206 | db '12 - No MP/PCMP table available ',0 207 | db '13 - MP table APIC ID/EN fail ',0 208 | db '14 - No response from second CPU ',0 209 | db '15 - Disabled with Ctrl-Alt-PageUp ',0 210 | db ' ',0 211 | text2: 212 | db 'CPU(s) available: xx ',0 213 | db 'x' 214 | 215 | string_cad: 216 | 217 | db '/FD/1/CAD',0 218 | 219 | string_button: 220 | 221 | db 'PROCESS LIST',0 222 | 223 | menu_struct: ; Menu Struct 224 | 225 | dq 0 ; Version 226 | 227 | dq 0x100 ; Start value of ID to return ( ID + Line ) 228 | 229 | ; Returned when menu closes and 230 | ; user made no selections. 231 | 232 | db 0,'FILE',0 ; ID = 0x100 + 1 233 | db 1,'New',0 ; ID = 0x100 + 2 234 | db 1,'Open..',0 ; ID = 0x100 + 3 235 | db 1,'Save..',0 ; ID = 0x100 + 4 236 | db 1,'-',0 ; ID = 0x100 + 5 237 | db 1,'Quit',0 ; ID = 0x100 + 6 238 | 239 | db 0,'HELP',0 ; ID = 0x100 + 7 240 | db 1,'Contents..',0 ; ID = 0x100 + 8 241 | db 1,'About..',0 ; ID = 0x100 + 9 242 | 243 | db 255 ; End of Menu Struct 244 | 245 | smp_state: dq 0x0 246 | 247 | image_end: 248 | 249 | -------------------------------------------------------------------------------- /mixer.asm: -------------------------------------------------------------------------------- 1 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 2 | ; 3 | ; Mixer for Menuet64 4 | ; 5 | ; Compile with FASM 1.60 or above 6 | ; 7 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 8 | 9 | use64 10 | 11 | org 0x0 12 | 13 | db 'MENUET64' ; Header identifier 14 | dq 0x01 ; Version 15 | dq START ; Start of code 16 | dq image_end ; Size of image 17 | dq 0x100000 ; Memory for app 18 | dq 0xffff0 ; Esp 19 | dq 0x00 ; Prm 20 | dq 0x00 ; Icon 21 | 22 | 23 | START: 24 | 25 | mov rax , 141 26 | mov rbx , 1 27 | mov rcx , 1 28 | mov rdx , 5 shl 32 + 5 29 | mov r8 , 9 shl 32 + 12 30 | int 0x60 31 | 32 | call read_mixer_values 33 | 34 | call draw_window ; At first, draw the window 35 | 36 | still: 37 | 38 | mov rax , 23 ; Wait here for event 39 | mov rbx , 2 40 | int 0x60 41 | 42 | test rax , 0x1 ; Window redraw 43 | jnz window_event 44 | test rax , 0x2 ; Keyboard press 45 | jnz key_event 46 | test rax , 0x4 ; Button press 47 | jnz button_event 48 | 49 | call read_mixer_values 50 | call draw_scrolls 51 | 52 | jmp still 53 | 54 | window_event: 55 | 56 | call draw_window 57 | jmp still 58 | 59 | key_event: 60 | 61 | mov rax , 0x2 ; Read the key and ignore 62 | int 0x60 63 | 64 | jmp still 65 | 66 | button_event: 67 | 68 | mov rax , 0x11 69 | int 0x60 70 | 71 | ; rax = status 72 | ; rbx = button id 73 | 74 | cmp rbx , 0x10000001 75 | jne no_application_terminate_button 76 | mov rax , 0x200 77 | int 0x60 78 | no_application_terminate_button: 79 | 80 | cmp rbx , 0x106 81 | jne no_application_terminate_menu 82 | mov rax , 0x200 83 | int 0x60 84 | no_application_terminate_menu: 85 | 86 | cmp rbx , 1000 87 | jb noscroll 88 | mov rax , rbx 89 | mov rcx , 1000 90 | xor rdx , rdx 91 | div rcx 92 | dec rax 93 | imul rax , 8 94 | add rax , sc 95 | mov [rax+4*8],rbx 96 | call draw_scrolls 97 | call set_values 98 | jmp still 99 | noscroll: 100 | 101 | jmp still 102 | 103 | 104 | draw_window: 105 | 106 | mov rax , 0xC ; Beginning of window draw 107 | mov rbx , 0x1 108 | int 0x60 109 | 110 | mov rax , 0x0 ; Draw window 111 | mov rbx , 0x0000010A00000000+240 ; x start & size 112 | mov rcx , 0x0000008000000000+202 ; y start & size 113 | mov rdx , 0x0000000000FFFFFF ; type & border color 114 | mov r8 , 0x0000000000000001 ; draw flags 115 | mov r9 , window_label ; 0 or label - asciiz 116 | mov r10 , menu_struct ; 0 or pointer to menu struct 117 | int 0x60 118 | 119 | mov rax , 0x4 ; Display text 120 | mov rbx , text 121 | mov rcx , 16 122 | mov rdx , 180 123 | mov rsi , 0x0 124 | mov r9 , 0x1 125 | int 0x60 126 | mov rbx , text2 127 | add rcx , 3 128 | int 0x60 129 | 130 | mov rdi , sc 131 | mov rax , 0 132 | mov rcx , 4 133 | cld 134 | rep stosq 135 | 136 | call draw_scrolls 137 | 138 | mov rax , 0xC ; End of window draw 139 | mov rbx , 0x2 140 | int 0x60 141 | 142 | ret 143 | 144 | 145 | draw_scrolls: 146 | 147 | mov r15 , 0 148 | 149 | newmixer: 150 | 151 | mov rax , 113 152 | mov rbx , 1 153 | mov rcx , r15 154 | imul rcx , 1000 155 | add rcx , 1000 156 | mov rdx , 32 157 | mov r8 , r15 158 | imul r8 , 8 159 | add r8 , sc 160 | mov r14 , [r8+4*8] 161 | cmp r14 , [r8] 162 | je no_scroll_change 163 | mov [r8], r14 164 | mov r8 , r14 165 | mov r9 , r15 166 | imul r9 , 54 167 | add r9 , 33 168 | mov r10 , 51 169 | mov r11 , 117 170 | int 0x60 171 | no_scroll_change: 172 | 173 | inc r15 174 | cmp r15 , 3 175 | jbe newmixer 176 | 177 | ret 178 | 179 | 180 | set_values: 181 | 182 | mov r15 , 0 183 | 184 | newsetvalue: 185 | 186 | mov rax , 117 187 | mov rbx , 6 188 | mov rcx , r15 189 | mov r9 , r15 190 | imul r9 , 8 191 | mov r9 , [sc+r9] 192 | 193 | mov r8 , r15 194 | inc r8 195 | imul r8 , 1000 196 | 197 | sub r9 , r8 ; 31-0 -> 0-255,0-255 198 | imul r9 , 0x08 199 | mov rdx , 0xff 200 | and r9 , 0xff 201 | sub rdx , r9 202 | imul rdx , 0x0101 203 | int 0x60 204 | 205 | inc r15 206 | cmp r15 , 3 207 | jbe newsetvalue 208 | 209 | ret 210 | 211 | 212 | read_mixer_values: 213 | 214 | mov r15 , 0 215 | 216 | readnext: 217 | 218 | mov rax , 117 219 | mov rbx , 6 220 | mov rcx , 0x1000 221 | add rcx , r15 222 | int 0x60 223 | 224 | cmp rax , 0 225 | jne no_set_values 226 | 227 | mov rax , rbx ; 0-255,0-255 -> 31-0 228 | mov rbx , 0xff 229 | and rax , 0xff 230 | sub rbx , rax 231 | shr rbx , 3 232 | 233 | mov rax , r15 234 | imul rax , 1000 235 | add rax , 1000 236 | add rbx , rax 237 | 238 | mov rax , r15 239 | imul rax , 8 240 | add rax , sc+4*8 241 | 242 | mov [rax],rbx 243 | 244 | inc r15 245 | cmp r15 , 3 246 | jbe readnext 247 | 248 | no_set_values: 249 | 250 | ret 251 | 252 | 253 | 254 | ; Data area 255 | 256 | window_label: 257 | 258 | db 'MIXER',0 259 | 260 | sc: 261 | 262 | dq 0x0 ; Values 263 | dq 0x0 264 | dq 0x0 265 | dq 0x0 266 | dq 1023 ; Change 267 | dq 2023 268 | dq 3023 269 | dq 4023 270 | 271 | menu_struct: ; Menu Struct 272 | 273 | dq 0 ; Version 274 | 275 | dq 0x100 ; Start value of ID to return ( ID + Line ) 276 | 277 | db 0,'FILE',0 ; ID = 0x100 + 1 278 | db 1,'New',0 ; ID = 0x100 + 2 279 | db 1,'Open..',0 ; ID = 0x100 + 3 280 | db 1,'Save..',0 ; ID = 0x100 + 4 281 | db 1,'-',0 ; ID = 0x100 + 5 282 | db 1,'Quit',0 ; ID = 0x100 + 6 283 | 284 | db 0,'HELP',0 ; ID = 0x100 + 7 285 | db 1,'Contents..',0 ; ID = 0x100 + 8 286 | db 1,'About..',0 ; ID = 0x100 + 9 287 | 288 | db 255 ; End of Menu Struct 289 | 290 | text: db ' MAIN CD WAVE ',0 291 | text2: db ' MIC ',0 292 | 293 | image_end: 294 | 295 | -------------------------------------------------------------------------------- /ethstat.asm: -------------------------------------------------------------------------------- 1 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 2 | ; 3 | ; Stack Status Monitor 4 | ; 5 | ; Compile with FASM for Menuet 6 | ; 7 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 8 | 9 | use64 10 | 11 | org 0x0 12 | 13 | db 'MENUET64' ; Header identifier 14 | dq 0x01 ; Version 15 | dq START ; Start of code 16 | dq I_END ; Size of image 17 | dq 0x100000 ; Memory for app 18 | dq 0xffff0 ; Esp 19 | dq 0x00 ; Prm 20 | dq 0x00 ; Icon 21 | 22 | START: 23 | 24 | mov rax , 141 25 | mov rbx , 1 26 | mov rcx , 1 27 | mov rdx , 5 shl 32 + 5 28 | mov r8 , 9 shl 32 + 12 29 | int 0x60 30 | 31 | call draw_window ; at first, draw the window 32 | 33 | still: 34 | 35 | mov eax,23 ; Wait here for event 36 | mov ebx,200 37 | int 0x40 38 | 39 | cmp eax,1 ; Redraw request 40 | jz red 41 | cmp eax,2 ; Key in buffer 42 | jz key 43 | cmp eax,3 ; Button in buffer 44 | jz button 45 | 46 | call draw_info 47 | 48 | jmp still 49 | 50 | 51 | draw_info: 52 | 53 | ; Read the stack status data, and write it to the screen buffer 54 | 55 | mov eax, 53 56 | mov ebx, 255 57 | mov ecx, 6 58 | int 0x40 59 | 60 | mov ebx, text + 24 61 | call printhex 62 | 63 | mov eax, 53 64 | mov ebx, 255 65 | mov ecx, 2 66 | int 0x40 67 | 68 | mov ebx, text + 107 69 | call printhex 70 | 71 | mov eax, 53 72 | mov ebx, 255 73 | mov ecx, 5 74 | int 0x40 75 | 76 | mov ebx, text + 107 + 40 77 | call printhex 78 | 79 | mov eax, 53 80 | mov ebx, 255 81 | mov ecx, 4 82 | int 0x40 83 | 84 | mov ebx, text + 107 + 80 85 | call printhex 86 | 87 | mov eax, 53 88 | mov ebx, 255 89 | mov ecx, 3 90 | int 0x40 91 | 92 | mov ebx, text + 107 + 120 93 | call printhex 94 | 95 | mov eax, 53 96 | mov ebx, 255 97 | mov ecx, 100 98 | int 0x40 99 | 100 | mov ebx, text + 258 + 40 101 | call printhex 102 | 103 | mov eax, 53 104 | mov ebx, 255 105 | mov ecx, 101 106 | int 0x40 107 | 108 | mov ebx, text + 258 + 80 109 | call printhex 110 | 111 | mov eax, 53 112 | mov ebx, 255 113 | mov ecx, 102 114 | int 0x40 115 | 116 | mov ebx, text + 258 + 120 117 | call printhex 118 | 119 | mov eax, 53 120 | mov ebx, 255 121 | mov ecx, 103 122 | int 0x40 123 | 124 | mov ebx, text + 258 + 160 125 | call printhex 126 | 127 | call draw_entries 128 | 129 | ret 130 | 131 | 132 | red: ; Redraw 133 | call draw_window 134 | jmp still 135 | 136 | key: ; Keys are not valid at this part of the 137 | mov eax,2 ; loop. Just read it and ignore 138 | int 0x40 139 | jmp still 140 | 141 | button: ; Button 142 | 143 | mov rax,17 144 | int 0x60 145 | 146 | cmp rbx , 0x10000001 147 | jne no_button_close 148 | mov rax,512 149 | int 0x60 150 | no_button_close: 151 | 152 | cmp rbx , 0x106 153 | jne no_menu_close 154 | mov rax,512 155 | int 0x60 156 | no_menu_close: 157 | 158 | jmp still 159 | 160 | ; Window definitions and draw 161 | 162 | draw_window: 163 | 164 | mov eax,12 165 | mov ebx,1 166 | int 0x40 167 | 168 | mov rax , 0x0 ; Draw window 169 | mov rbx, 100*0x100000000+265 170 | mov rcx, 100*0x100000000+210 171 | 172 | push rax rbx 173 | mov rax , 141 174 | mov rbx , 3 175 | int 0x60 176 | and rax , 0xff 177 | sub rax , 9 178 | imul rax , 9 179 | add rcx , rax 180 | pop rbx rax 181 | 182 | mov rdx , 0xFFFFFF 183 | mov r8 , 0x1 184 | mov r9 , window_label 185 | mov r10 , menu_struct 186 | int 0x60 187 | 188 | call draw_info 189 | 190 | mov eax,12 191 | mov ebx,2 192 | int 0x40 193 | 194 | ret 195 | 196 | 197 | draw_entries: 198 | 199 | ; Draw background 200 | 201 | mov rax , 13 202 | mov rbx , 25*0x100000000+37*6 203 | mov rcx , 53*0x100000000+12*11 204 | mov rdx , 0xffffff 205 | int 0x60 206 | 207 | push rax rbx 208 | mov rax , 141 209 | mov rbx , 3 210 | int 0x60 211 | and rax , 0xff 212 | add rax , 3 213 | mov r12 , rax 214 | pop rbx rax 215 | 216 | ; Redraw the screen text 217 | 218 | mov ebx,25*65536+53 219 | mov ecx,0x000000 220 | mov edx,text 221 | mov esi,40 222 | newline: 223 | mov eax,4 224 | int 0x40 225 | add ebx,r12d 226 | add edx,40 227 | cmp [edx],byte 'x' 228 | jnz newline 229 | 230 | ret 231 | 232 | 233 | printhex: 234 | 235 | ; number in eax 236 | ; print to ebx 237 | ; xlat from hextable 238 | 239 | mov esi, ebx 240 | add esi, 8 241 | mov ebx, hextable 242 | mov ecx, 8 243 | phex_loop: 244 | mov edx, eax 245 | and eax, 15 246 | xlatb 247 | mov [esi], al 248 | mov eax, edx 249 | shr eax, 4 250 | dec esi 251 | loop phex_loop 252 | 253 | ret 254 | 255 | 256 | ; Data area 257 | 258 | text: 259 | 260 | db ' Ethernet card status: 0xxxxxxxxx ' 261 | db ' ' 262 | db ' IP packets received : 0xxxxxxxxx ' 263 | db ' ARP packets received : 0xxxxxxxxx ' 264 | db ' Dumped received packets: 0xxxxxxxxx ' 265 | db ' Sent packets : 0xxxxxxxxx ' 266 | db ' ' 267 | db ' Empty queue : 0xxxxxxxxx ' 268 | db ' IPout queue : 0xxxxxxxxx ' 269 | db ' IPin queue : 0xxxxxxxxx ' 270 | db ' Net1out queue : 0xxxxxxxxx ' 271 | db 'x <- END MARKER, DONT DELETE ' 272 | 273 | window_label: 274 | 275 | db 'STACK STATUS',0 276 | 277 | hextable: 278 | 279 | db '0123456789ABCDEF' 280 | 281 | menu_struct: ; Menu Struct 282 | 283 | dq 0 ; Version 284 | 285 | dq 0x100 ; Start value of ID to return ( ID + Line ) 286 | 287 | ; Returned when menu closes and 288 | ; user made no selections. 289 | 290 | db 0,'FILE',0 ; ID = 0x100 + 1 291 | db 1,'New',0 ; ID = 0x100 + 2 292 | db 1,'Open..',0 ; ID = 0x100 + 3 293 | db 1,'Save..',0 ; ID = 0x100 + 4 294 | db 1,'-',0 ; ID = 0x100 + 5 295 | db 1,'Quit',0 ; ID = 0x100 + 6 296 | 297 | db 0,'HELP',0 ; ID = 0x100 + 7 298 | db 1,'Contents..',0 ; ID = 0x100 + 8 299 | db 1,'About..',0 ; ID = 0x100 + 9 300 | 301 | db 255 ; End of Menu Struct 302 | 303 | I_END: 304 | 305 | -------------------------------------------------------------------------------- /audio.asm: -------------------------------------------------------------------------------- 1 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 2 | ; 3 | ; 64 bit Menuet audio example 4 | ; 5 | ; Compile with FASM 1.60 or above 6 | ; 7 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 8 | 9 | use64 10 | 11 | org 0x0 12 | 13 | db 'MENUET64' ; Header identifier 14 | dq 0x01 ; Version 15 | dq START ; Start of code 16 | dq image_end ; Size of image 17 | dq 0x100000 ; Memory for app 18 | dq 0x0ffff0 ; Rsp 19 | dq 0x00 ; Prm 20 | dq 0x00 ; Icon 21 | 22 | 23 | block equ 0x0E0000 24 | 25 | 26 | START: 27 | 28 | mov rax , 141 ; Enable system font 29 | mov rbx , 1 30 | mov rcx , 1 31 | mov rdx , 5 shl 32 + 5 32 | mov r8 , 9 shl 32 + 12 33 | int 0x60 34 | 35 | call draw_window ; At first, draw the window 36 | 37 | still: 38 | 39 | mov rax , 10 ; Wait here for event 40 | int 0x60 41 | 42 | test rax , 0x1 ; Window redraw 43 | jnz window_event 44 | test rax , 0x2 ; Keyboard press 45 | jnz key_event 46 | test rax , 0x4 ; Button press 47 | jnz button_event 48 | 49 | jmp still 50 | 51 | window_event: 52 | 53 | call draw_window 54 | jmp still 55 | 56 | key_event: 57 | 58 | mov rax , 0x2 ; Read the key and ignore 59 | int 0x60 60 | 61 | jmp still 62 | 63 | 64 | playaudio: 65 | 66 | call check_output_device 67 | 68 | cmp [cardhz],dword 0 69 | je playsongret 70 | 71 | ; Precalculate both buffers 72 | 73 | mov rdx , 0 74 | call calculate_block 75 | 76 | mov rdx , 1 77 | call calculate_block 78 | 79 | ; Play command 80 | 81 | mov rax , 117 82 | mov rbx , 3 83 | int 0x60 84 | 85 | ; Wait for first buffer to finish 86 | 87 | waitmore1: 88 | call delay 89 | call getindex 90 | cmp rbx , 0 91 | je waitmore1 92 | 93 | ; Recalculate first buffer 94 | 95 | mov rdx , 0 96 | call calculate_block 97 | 98 | ; Wait for second buffer to finish 99 | 100 | waitmore2: 101 | call delay 102 | call getindex 103 | cmp rbx , 1 104 | je waitmore2 105 | 106 | ; Recalculate second buffer 107 | 108 | mov rdx , 1 109 | call calculate_block 110 | 111 | mov rax , 11 112 | int 0x60 113 | test rax , 4 114 | jnz stop 115 | 116 | inc byte [tune] 117 | and [tune], byte 1 118 | 119 | jmp waitmore1 120 | 121 | stop: 122 | 123 | ; Stop playing at button press 124 | 125 | mov rax , 117 126 | mov rbx , 5 127 | int 0x60 128 | 129 | ; Free device 130 | 131 | mov rax , 117 132 | mov rbx , 255 133 | int 0x60 134 | 135 | playsongret: 136 | 137 | ret 138 | 139 | 140 | check_output_device: 141 | 142 | ; Device available 143 | 144 | mov rax , 117 145 | mov rbx , 1 146 | int 0x60 147 | cmp rax , 0 148 | jne device_not_available 149 | 150 | ; Audio format 151 | 152 | mov rax , 117 153 | mov rbx , 7 154 | mov rcx , 0 155 | int 0x60 156 | 157 | mov rdx , 0xffffffffff shl 24 158 | mov rcx , rbx 159 | and rcx , rdx 160 | mov rdx , 0x4000010210 shl 24 161 | cmp rcx , rdx ; buffer 16384 : sign extended lsb : 2 channel : 16bit/ch 162 | jne not_supported_output 163 | 164 | mov [cardhz],bx 165 | ret 166 | 167 | not_supported_output: 168 | device_not_available: 169 | 170 | mov rax , 4 171 | mov rbx , unsupported 172 | mov rcx , 30 173 | mov rdx , 55 174 | mov r9 , 1 175 | mov rsi , 0x000000 176 | int 0x60 177 | 178 | mov [cardhz],dword 0 179 | ret 180 | 181 | 182 | 183 | calculate_block: 184 | 185 | push rdx 186 | 187 | mov rdi , block 188 | mov rcx , 0 189 | mov ebx , 0 190 | 191 | mov rdx , [tune] 192 | inc rdx 193 | imul rdx , 0x01000100 194 | 195 | newbyte: 196 | 197 | mov [rdi], ebx 198 | 199 | add rbx , rdx 200 | 201 | add rdi , 4 202 | inc rcx 203 | cmp rcx , 4095 204 | jbe newbyte 205 | 206 | ; Give block 207 | 208 | mov rax , 117 209 | mov rbx , 2 210 | mov rcx , block 211 | pop rdx 212 | int 0x60 213 | 214 | ret 215 | 216 | 217 | delay: 218 | 219 | mov rax , 11 220 | int 0x60 221 | cmp rax , 1 222 | jne delayl1 223 | call draw_window 224 | delayl1: 225 | 226 | mov rax , 5 227 | mov rbx , 2 228 | int 0x60 229 | 230 | ret 231 | 232 | 233 | getindex: 234 | 235 | mov rax , 117 236 | mov rbx , 4 237 | int 0x60 238 | 239 | ret 240 | 241 | 242 | button_event: 243 | 244 | mov rax , 0x11 245 | int 0x60 246 | 247 | ; rax = status 248 | ; rbx = button id 249 | 250 | cmp rbx , 1 ; Play audio 251 | jne no_play 252 | call playaudio 253 | jmp still 254 | no_play: 255 | 256 | cmp rbx , 0x10000001 ; Close button 257 | je terminate_program 258 | cmp rbx , 0x104 ; Menu selection 259 | je terminate_program 260 | 261 | jmp still 262 | 263 | 264 | terminate_program: 265 | 266 | mov rax , 512 267 | int 0x60 268 | 269 | 270 | draw_window: 271 | 272 | mov rax , 0xC ; Beginning of window draw 273 | mov rbx , 0x1 274 | int 0x60 275 | 276 | mov rax , 0x0 ; Draw window 277 | mov rbx , 0x0000010000000000 + 193 ; x start & size 278 | mov rcx , 0x0000008000000000 + 120 ; y start & size 279 | mov rdx , 0x0000000000FFFFFF ; type & border color 280 | mov r8 , 0x0000000000000001 ; draw flags 281 | mov r9 , window_label ; 0 or label - asciiz 282 | mov r10 , menu_struct ; 0 or pointer to menu struct 283 | int 0x60 284 | 285 | mov rax , 8 286 | mov rbx , 20 * 0x100000000 + 70 287 | mov rcx , 80 * 0x100000000 + 20 288 | mov rdx , 1 289 | mov r8 , 0 290 | mov r9 , button1 291 | int 0x60 292 | 293 | mov rax , 8 294 | mov rbx , 100* 0x100000000 + 70 295 | mov rcx , 80 * 0x100000000 + 20 296 | mov rdx , 2 297 | mov r8 , 0 298 | mov r9 , button2 299 | int 0x60 300 | 301 | mov rax , 0xC 302 | mov rbx , 0x2 303 | int 0x60 304 | 305 | ret 306 | 307 | 308 | ; Data area 309 | 310 | window_label: 311 | 312 | db 'AUDIO EXAMPLE',0 313 | 314 | button1: 315 | 316 | db 'PLAY',0 317 | 318 | button2: 319 | 320 | db 'STOP',0 321 | 322 | cardhz: 323 | 324 | dq 0x0 325 | 326 | tune: 327 | 328 | dq 0x0 329 | 330 | unsupported: 331 | 332 | db 'Unable to detect audio.',0 333 | 334 | menu_struct: ; Menu Struct 335 | 336 | dq 0 ; Version 337 | 338 | dq 0x100 ; Start value of ID to return ( ID + Line ) 339 | 340 | ; Returned when menu closes and 341 | ; user made no selections. 342 | 343 | db 0,'FILE',0 ; ID = 0x100 + 1 344 | db 1,'Open..',0 345 | db 1,'-',0 346 | db 1,'Quit',0 ; ID = 0x100 + 2 347 | 348 | db 255 ; End of Menu Struct 349 | 350 | image_end: 351 | 352 | 353 | -------------------------------------------------------------------------------- /board.asm: -------------------------------------------------------------------------------- 1 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 2 | ; 3 | ; Debug board for Menuet64 4 | ; 5 | ; Compile with FASM 1.60 or above 6 | ; 7 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 8 | 9 | use64 10 | 11 | org 0x0 12 | 13 | db 'MENUET64' ; 8 byte id 14 | dq 0x01 ; header version 15 | dq START ; start of code 16 | dq IMAGE_END ; size of image 17 | dq 0x200000 ; memory for app 18 | dq 0xffff0 ; rsp 19 | dq 0x0,0x0 ; I_Param , I_Icon 20 | 21 | lines equ 260 22 | 23 | START: 24 | 25 | mov rdi , text_area 26 | mov rcx , 81*(lines+20) 27 | mov rax , 0 28 | cld 29 | rep stosb 30 | 31 | mov rax , 141 32 | mov rbx , 1 33 | mov rcx , 1 34 | mov rdx , 5 shl 32 + 5 35 | mov r8 , 9 shl 32 + 12 36 | int 0x60 37 | 38 | call draw_window 39 | 40 | still: 41 | 42 | call read_debug_board 43 | 44 | mov rax , 23 45 | mov rbx , 5 46 | int 0x60 47 | 48 | test rax , 1b ; Window redraw 49 | jnz redraw 50 | 51 | test rax , 10b ; Key press 52 | jnz keypress 53 | 54 | test rax , 100b ; Button press 55 | jnz buttonpress 56 | 57 | jmp still 58 | 59 | redraw: 60 | 61 | call draw_window 62 | jmp still 63 | 64 | keypress: 65 | 66 | mov rax , 2 67 | int 0x60 68 | 69 | jmp still 70 | 71 | buttonpress: 72 | 73 | mov rax , 17 74 | int 0x60 75 | 76 | ; rax = status 77 | ; rbx = button id 78 | 79 | cmp rbx , 0x10000001 80 | jne no_application_terminate 81 | mov rax , 512 82 | int 0x60 83 | no_application_terminate: 84 | 85 | cmp rbx , 1000 86 | jb no_scroll 87 | cmp rbx , 1400 88 | ja no_scroll 89 | mov [scroll_value], rbx 90 | call draw_scroll 91 | call draw_text 92 | jmp still 93 | no_scroll: 94 | 95 | jmp still 96 | 97 | 98 | read_debug_board: 99 | 100 | mov rax , 63 101 | mov rbx , 2 102 | int 0x60 103 | 104 | ; rax = 0 : success 105 | ; rbx = character 106 | ; rcx = bytes left 107 | ; rax = 1 : no characters at board 108 | 109 | cmp rax , 0 110 | jne rdbl1 111 | 112 | rdbl2: 113 | 114 | mov rax , [board_x] ; x 115 | mov rsi , [board_y] ; y 116 | 117 | cmp rbx , 15 118 | jb no_character 119 | 120 | push rax rsi 121 | imul rsi , 81 122 | add rax , rsi 123 | add rax , text_area 124 | mov [rax], bl 125 | pop rsi rax 126 | 127 | ; Adjust X 128 | 129 | add rax , 1 130 | 131 | no_character: 132 | 133 | cmp rbx , 13 ; linefeed 134 | je dolf 135 | 136 | cmp rax , 79 137 | jb xok 138 | dolf: 139 | mov rax , 0 140 | add rsi , 1 141 | xok: 142 | 143 | cmp rsi , lines 144 | jbe yok 145 | 146 | push rbx rcx rsi 147 | mov rdi , text_area 148 | mov rsi , text_area+81 149 | mov rcx , 81*(lines+1) 150 | cld 151 | rep movsb 152 | pop rsi rcx rbx 153 | 154 | mov rsi , 1000+lines 155 | sub rsi , [displaylines] 156 | 157 | cmp [scroll_value],rsi 158 | je noscrollsub 159 | cmp [scroll_value],dword 1000 160 | jbe noscrollsub 161 | sub [scroll_value],dword 1 162 | noscrollsub: 163 | 164 | mov rsi , lines 165 | 166 | yok: 167 | 168 | mov [board_x], rax ; x 169 | mov [board_y], rsi ; y 170 | 171 | ; Read next character 172 | 173 | mov rax , 63 174 | mov rbx , 2 175 | int 0x60 176 | mov rdx , 0 177 | cmp rax , rdx 178 | je rdbl2 179 | 180 | call draw_text 181 | call draw_scroll 182 | 183 | rdbl1: 184 | 185 | ret 186 | 187 | 188 | draw_window: 189 | 190 | mov rax , 12 191 | mov rbx , 1 192 | int 0x60 193 | 194 | mov rax , 141 195 | mov rbx , 3 196 | int 0x60 197 | and rax , 0xff 198 | mov [fontsize],rax 199 | 200 | mov rax , 0 201 | mov rbx , 15 *0x100000000 + 518 202 | mov rcx , 280 *0x100000000 + 143 203 | mov rdx , [fontsize] 204 | sub rdx , 9 205 | imul rdx , 9 206 | cmp [fontsize],dword 9 207 | jne nosubrcx 208 | sub cx , 1 209 | nosubrcx: 210 | add rcx , rdx 211 | mov rdx , 0xffffff ; type & border color 212 | mov r8 , 1b ; draw buttons - close,full,minimize 213 | mov r9 , window_label ; 0 or label - asciiz 214 | mov r10 , 0 ; pointer to menu struct or 0 215 | int 0x60 216 | 217 | mov rax , 111 218 | mov rbx , 1 219 | int 0x60 220 | mov rcx , rax 221 | mov rax , 9 222 | mov rbx , 2 223 | mov rdx , process_info 224 | mov r8 , 1000 225 | int 0x60 226 | 227 | call calculate_displaylines 228 | call draw_text 229 | call draw_scroll 230 | 231 | mov rax , 12 232 | mov rbx , 2 233 | int 0x60 234 | 235 | ret 236 | 237 | 238 | calculate_displaylines: 239 | 240 | mov rax , [process_info+24] 241 | sub rax , 40 242 | xor rdx , rdx 243 | mov rbx , [fontsize] 244 | add rbx , 1 245 | div rbx 246 | cmp rax , [displaylines] 247 | je nodlchange 248 | mov [displaylines],rax 249 | mov rax , 1000+lines 250 | sub rax , [displaylines] 251 | mov [scroll_value],rax 252 | nodlchange: 253 | 254 | ret 255 | 256 | 257 | draw_text: 258 | 259 | cmp [process_info+16],dword 150 260 | jb nodtext 261 | cmp [process_info+24],dword 100 262 | jb nodtext 263 | 264 | mov rax , 4 265 | mov rbx , [scroll_value] 266 | sub rbx , 1000 267 | imul rbx , 81 268 | add rbx , text_area 269 | mov rcx , 10 270 | mov rdx , 35-3 271 | mov rsi , 0x000000 272 | mov r9 , 1 273 | 274 | mov rdi , [displaylines] 275 | imul rdi , 81 276 | add rdi , rbx 277 | 278 | newline: 279 | 280 | push rax rbx rcx rdx r8 r9 r10 rdi 281 | 282 | mov rax , 13 283 | mov rbx , [process_info+16] 284 | sub rbx , 10+25 285 | mov rcx , 10 shl 32 286 | add rbx , rcx 287 | mov rcx , rdx 288 | sub rcx , 1 289 | shl rcx , 32 290 | add rcx , 12 291 | mov rdx , 0xffffff 292 | int 0x60 293 | 294 | pop rdi r10 r9 r8 rdx rcx rbx rax 295 | 296 | push rax rbx rcx rdx 297 | mov rax , [process_info+16] 298 | sub rax , 10+26 299 | xor rdx , rdx 300 | mov rbx , 6 301 | div rbx 302 | mov r11 , rax 303 | pop rdx rcx rbx rax 304 | 305 | push qword [rbx+r11] 306 | mov [rbx+r11],byte 0 307 | int 0x60 308 | pop qword [rbx+r11] 309 | 310 | add rbx , 81 311 | add rdx , [fontsize] 312 | add rdx , 1 313 | 314 | cmp rbx , rdi 315 | jb newline 316 | 317 | nodtext: 318 | 319 | ret 320 | 321 | 322 | draw_scroll: 323 | 324 | cmp [process_info+16],dword 150 325 | jb nodscroll 326 | cmp [process_info+24],dword 100 327 | jb nodscroll 328 | 329 | mov rax , 113 330 | mov rbx , 1 331 | mov rcx , 1000 332 | mov rdx , lines+1 333 | sub rdx , [displaylines] 334 | mov r8 , [scroll_value] 335 | mov r9 , [process_info+16] 336 | sub r9 , 23 337 | mov r10 , 29 338 | mov r11 , [fontsize] 339 | add r11 , 1 340 | imul r11 , [displaylines] 341 | add r11 , 1 342 | int 0x60 343 | 344 | nodscroll: 345 | 346 | ret 347 | 348 | 349 | ; 350 | ; Data area 351 | ; 352 | 353 | window_label: 354 | 355 | db 'DEBUG BOARD',0 356 | 357 | board_x: dq 0 358 | board_y: dq lines 359 | fontsize: dq 0 360 | 361 | displaylines: dq 20 362 | scroll_value: dq 1000 363 | 364 | process_info: times 1024 db ? 365 | 366 | text_area: 367 | 368 | 369 | IMAGE_END: 370 | 371 | -------------------------------------------------------------------------------- /recycle.asm: -------------------------------------------------------------------------------- 1 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 2 | ; 3 | ; Recyclebin for Menuet64 4 | ; 5 | ; Compile with FASM 1.60 or above 6 | ; 7 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 8 | 9 | use64 10 | 11 | org 0x0 12 | 13 | db 'MENUET64' ; Header identifier 14 | dq 0x01 ; Version 15 | dq START ; Start of code 16 | dq image_end ; Size of image 17 | dq 0x500000 ; Memory for app 18 | dq 0xffff0 ; Esp 19 | dq Parameter ; Prm 20 | dq 0x00 ; Icon 21 | 22 | START: 23 | 24 | mov rax , 141 25 | mov rbx , 1 26 | mov rcx , 1 27 | mov rdx , 5 shl 32 + 5 28 | mov r8 , 9 shl 32 + 12 29 | int 0x60 30 | 31 | cmp [Parameter+8],byte 0 32 | je startfbrowser 33 | 34 | mov rax , 5 35 | mov rbx , 5 36 | int 0x60 37 | 38 | call get_filename 39 | 40 | ; 41 | ; File in recycle bin -> delete 42 | ; 43 | cmp [Parameter+8+1],word 'fd' 44 | je yesfdrb 45 | cmp [Parameter+8+1],word 'Fd' 46 | je yesfdrb 47 | cmp [Parameter+8+1],word 'FD' 48 | je yesfdrb 49 | jmp nofdrb 50 | yesfdrb: 51 | mov rax , 'recycleb' 52 | cmp [Parameter+8+6],rax 53 | je deletefileinrecyclebin 54 | mov rax , 'Recycleb' 55 | cmp [Parameter+8+6],rax 56 | je deletefileinrecyclebin 57 | mov rax , 'RECYCLEB' 58 | cmp [Parameter+8+6],rax 59 | je deletefileinrecyclebin 60 | nofdrb: 61 | 62 | ; Read 63 | mov rax , 58 64 | mov rbx , 0 65 | mov rcx , 0 66 | mov rdx , -1 67 | mov r8 , 0x100000 68 | mov r9 , Parameter+8 69 | int 0x60 70 | push rbx 71 | ; Write 72 | mov rax , 58 73 | mov rbx , 1 74 | mov rcx , 0 75 | pop rdx 76 | mov r8 , 0x100000 77 | mov r9 , writefile 78 | int 0x60 79 | cmp rax , 0 80 | jne binfull 81 | 82 | deletefileinrecyclebin: 83 | 84 | ; Delete original file 85 | mov rax , 58 86 | mov rbx , 2 87 | mov r9 , Parameter+8 88 | int 0x60 89 | cmp rax , 0 90 | je terminate 91 | 92 | jmp draw_window 93 | 94 | terminate: 95 | 96 | mov rax , 5 97 | mov rbx , 50 98 | int 0x60 99 | 100 | mov rax , 512 101 | int 0x60 102 | 103 | binfull: 104 | 105 | jmp draw_window_full 106 | 107 | 108 | get_filename: 109 | 110 | mov r10 , 0 111 | 112 | mov rsi , Parameter+8 113 | fnl0: 114 | cmp [rsi],byte 0 115 | je fnl1 116 | inc rsi 117 | jmp fnl0 118 | fnl1: 119 | cmp [rsi],byte '/' 120 | je fnl2 121 | inc r10 122 | dec rsi 123 | jmp fnl1 124 | fnl2: 125 | inc rsi 126 | mov rdi , filename 127 | mov rcx , 20 128 | cld 129 | rep movsb 130 | 131 | ret 132 | 133 | 134 | startfbrowser: 135 | 136 | mov rax , 5 137 | mov rbx , 10 138 | int 0x60 139 | 140 | mov rax , 256 141 | mov rbx , fbrowser 142 | mov rcx , path 143 | int 0x60 144 | 145 | mov rax , 5 146 | mov rbx , 20 147 | int 0x60 148 | 149 | mov rax , 512 150 | int 0x60 151 | 152 | 153 | draw_window: 154 | 155 | mov rax , 0xC ; Beginning of window draw 156 | mov rbx , 0x1 157 | int 0x60 158 | 159 | mov rax , 61 160 | mov rbx , 1 161 | int 0x60 162 | shr rax , 32 163 | shr rax , 1 164 | sub rax , 0x118/2 165 | mov rbx , rax 166 | shl rbx , 32 167 | add rbx , 0x118 168 | 169 | mov rax , 0x0 ; Draw window 170 | mov rcx , 0x0000008000000069 ; y start & size 171 | mov rdx , 0x0000000000FFFFFF ; type & border color 172 | mov r8 , 0x0000000000000001 ; draw flags 173 | mov r9 , window_label ; 0 or label - asciiz 174 | mov r10 , 0 ; 0 or pointer to menu struct 175 | int 0x60 176 | 177 | mov rax , 0x4 178 | mov rbx , denied 179 | mov rcx , 30-12 180 | mov rdx , 41+3 181 | mov rsi , 0x0 182 | mov r9 , 0x1 183 | mov r8 , 0x3 184 | int 0x60 185 | 186 | mov rax , 8 187 | mov rbx , (110-12) shl 32 + 80 188 | mov rcx , 68 shl 32 + 18 189 | mov rdx , 10 190 | mov r8 , 0 191 | mov r9 , text1 192 | int 0x60 193 | 194 | mov rax , 0xC ; End of window draw 195 | mov rbx , 0x2 196 | int 0x60 197 | 198 | mov rax , 5 199 | mov rbx , 50 200 | int 0x60 201 | 202 | waitmore: 203 | 204 | mov rax , 10 205 | int 0x60 206 | 207 | test rax , 2 208 | jnz readkey 209 | 210 | mov rax , 512 211 | int 0x60 212 | 213 | readkey: 214 | 215 | mov rax , 2 216 | int 0x60 217 | 218 | cmp ecx , 'Dele' 219 | je waitmore 220 | 221 | mov rax , 512 222 | int 0x60 223 | 224 | 225 | 226 | draw_window_full: 227 | 228 | mov rax , 0xC ; Beginning of window draw 229 | mov rbx , 0x1 230 | int 0x60 231 | 232 | mov rax , 61 233 | mov rbx , 1 234 | int 0x60 235 | shr rax , 32 236 | shr rax , 1 237 | sub rax , 0x0e6/2 238 | mov rbx , rax 239 | shl rbx , 32 240 | add rbx , 0x0e6 241 | 242 | mov rax , 0x0 ; Draw window 243 | mov rcx , 0x0000008000000073 ; y start & size 244 | mov rdx , 0x0000000000FFFFFF ; type & border color 245 | mov r8 , 0x0000000000000001 ; draw flags 246 | mov r9 , window_label ; 0 or label - asciiz 247 | mov r10 , 0 ; 0 or pointer to menu struct 248 | int 0x60 249 | 250 | mov rax , 0x4 251 | mov rbx , binfulltext1 252 | mov rcx , 40 253 | mov rdx , 40 254 | mov rsi , 0x0 255 | mov r9 , 0x1 256 | mov r8 , 0x3 257 | int 0x60 258 | mov rax , 0x4 259 | mov rbx , binfulltext2 260 | mov rcx , 40 261 | mov rdx , 40+16 262 | mov rsi , 0x0 263 | mov r9 , 0x1 264 | mov r8 , 0x3 265 | int 0x60 266 | 267 | mov rax , 8 268 | mov rbx , 115 shl 32 + 80 269 | mov rcx , 079 shl 32 + 18 270 | mov rdx , 10 271 | mov r8 , 0 272 | mov r9 , text1 273 | int 0x60 274 | mov rax , 8 275 | mov rbx , 031 shl 32 + 80 276 | mov rcx , 079 shl 32 + 18 277 | mov rdx , 11 278 | mov r8 , 0 279 | mov r9 , text2 280 | int 0x60 281 | 282 | mov rax , 0xC ; End of window draw 283 | mov rbx , 0x2 284 | int 0x60 285 | 286 | mov rax , 5 287 | mov rbx , 50 288 | int 0x60 289 | 290 | waitmore2: 291 | 292 | mov rax , 10 293 | int 0x60 294 | 295 | test rax , 2 296 | jnz readkey2 297 | test rax , 4 298 | jnz permdelete 299 | 300 | mov rax , 512 301 | int 0x60 302 | 303 | readkey2: 304 | 305 | mov rax , 2 306 | int 0x60 307 | 308 | cmp ecx , 'Dele' 309 | je waitmore2 310 | 311 | mov rax , 512 312 | int 0x60 313 | 314 | permdelete: 315 | 316 | mov rax , 0x11 317 | int 0x60 318 | 319 | cmp rbx , 10 320 | jne endapp 321 | 322 | mov rax , 58 323 | mov rbx , 2 324 | mov r9 , Parameter+8 325 | int 0x60 326 | 327 | endapp: 328 | 329 | mov rax , 5 330 | mov rbx , 20 331 | int 0x60 332 | 333 | mov rax , 512 334 | int 0x60 335 | 336 | 337 | 338 | 339 | ; Data area 340 | 341 | window_label: 342 | 343 | db 'RECYCLE BIN',0 ; Window label 344 | 345 | text1: 346 | 347 | db 'OK',0 348 | 349 | text2: 350 | 351 | db 'CANCEL',0 352 | 353 | 354 | writefile: db '/fd/1/recycleb/' 355 | filename: times 256 db 0 356 | 357 | fbrowser: db '/fd/1/fbrowser',0 358 | path: db '/fd/1/recycleb',0 359 | 360 | denied: 361 | 362 | db 'Access denied to file and/or recycle bin.',0 363 | 364 | binfulltext1: 365 | 366 | db ' Recycle Bin full. ',0 367 | 368 | binfulltext2: 369 | 370 | db 'Delete file permanently ?',0 371 | 372 | Parameter: 373 | 374 | dq 100 375 | dq 0 376 | 377 | image_end: 378 | 379 | -------------------------------------------------------------------------------- /drv.asm: -------------------------------------------------------------------------------- 1 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 2 | ; 3 | ; 64 bit Menuet Driver info 4 | ; 5 | ; Compile with FASM 1.60 or above 6 | ; 7 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 8 | 9 | use64 10 | 11 | org 0x0 12 | 13 | db 'MENUET64' ; Header identifier 14 | dq 0x01 ; Version 15 | dq START ; Start of code 16 | dq image_end ; Size of image 17 | dq 0x100000 ; Memory for app 18 | dq 0xffff0 ; Esp 19 | dq 0x00 ; Prm 20 | dq 0x00 ; Icon 21 | 22 | 23 | START: 24 | 25 | mov rax , 141 26 | mov rbx , 1 27 | mov rcx , 1 28 | mov rdx , 5 shl 32 + 5 29 | mov r8 , 9 shl 32 + 12 30 | int 0x60 31 | 32 | call draw_window ; At first, draw the window 33 | 34 | still: 35 | 36 | mov rax , 23 ; Wait here for event 37 | mov rbx , 100 38 | int 0x60 39 | 40 | test rax , 0x1 ; Window redraw 41 | jnz window_event 42 | test rax , 0x2 ; Keyboard press 43 | jnz key_event 44 | test rax , 0x4 ; Button press 45 | jnz button_event 46 | 47 | call draw_drivers 48 | 49 | jmp still 50 | 51 | window_event: 52 | 53 | call draw_window 54 | jmp still 55 | 56 | key_event: 57 | 58 | mov rax , 0x2 ; Read the key and ignore 59 | int 0x60 60 | 61 | jmp still 62 | 63 | button_event: 64 | 65 | mov rax , 0x11 66 | int 0x60 67 | 68 | ; rax = status 69 | ; rbx = button id 70 | 71 | cmp rbx , 0x10000001 72 | jne no_application_terminate_button 73 | mov rax , 0x200 74 | int 0x60 75 | no_application_terminate_button: 76 | 77 | cmp rbx , 0x106 78 | jne no_application_terminate_menu 79 | mov rax , 0x200 80 | int 0x60 81 | no_application_terminate_menu: 82 | 83 | cmp rbx , 1000 84 | jb noscroll 85 | cmp rbx , 1900 86 | ja noscroll 87 | mov [sc],rbx 88 | call draw_scroll 89 | call draw_drivers 90 | jmp still 91 | noscroll: 92 | 93 | jmp still 94 | 95 | 96 | draw_window: 97 | 98 | mov rax , 0xC ; Beginning of window draw 99 | mov rbx , 0x1 100 | int 0x60 101 | 102 | mov rax , 141 103 | mov rbx , 3 104 | int 0x60 105 | and rax , 0xff 106 | sub rax , 9 107 | shr rax , 1 108 | mov r12 , rax 109 | imul r12 , 18 110 | add rax , 9+3 111 | mov [stepping],rax 112 | 113 | mov rax , 0x0 ; Draw window 114 | mov rbx , 0x0000002000000000 +556 ; +24 ; x start & size 115 | mov rcx , 0x0000002000000000 +276 ; y start & size 116 | add rcx , r12 117 | mov rdx , 0x0000000000FFFFFF ; type & border color 118 | mov r8 , 0x0000000000000001 ; draw flags 119 | mov r9 , window_label ; 0 or label - asciiz 120 | mov r10 , menu_struct ; 0 or pointer to menu struct 121 | int 0x60 122 | 123 | call draw_scroll 124 | call draw_drivers 125 | 126 | mov rax , 0xC ; End of window draw 127 | mov rbx , 0x2 128 | int 0x60 129 | 130 | ret 131 | 132 | 133 | xstep equ [stepping] 134 | 135 | draw_drivers: 136 | 137 | mov rax , 4 138 | mov rbx , infotext 139 | mov rcx , 20 140 | mov rdx , 50 141 | mov r9 , 1 142 | mov rsi , 0x000000 143 | int 0x60 144 | 145 | mov r14 , 0 146 | 147 | newdriver: 148 | 149 | mov rax , 13 150 | mov rbx , 10* 0x100000000 + 535 151 | mov rcx , r14 152 | imul rcx , xstep 153 | add rcx , 70 154 | dec rcx 155 | shl rcx , 32 156 | add rcx , 10+2 157 | mov rdx , 0xffffff 158 | int 0x60 159 | 160 | mov rax , 47 161 | mov rbx , 2*65536 162 | mov rcx , r14 163 | add rcx , [sc] 164 | sub rcx , 1000 165 | inc rcx 166 | mov rdx , r14 167 | imul rdx , xstep 168 | add rdx , 70 169 | add rdx , 20*65536 170 | mov rsi , 0x000000 171 | int 0x40 172 | 173 | mov rax , 116 174 | mov rbx , 1 175 | mov rcx , r14 176 | add rcx , [sc] 177 | sub rcx , 1000 178 | mov rdx , driver_type 179 | mov r8 , 100 180 | int 0x60 181 | 182 | cmp rax , 0 183 | je yesdriver 184 | 185 | mov rax , 4 186 | mov rbx , driver_no 187 | mov rcx , 20 188 | mov rdx , r14 189 | imul rdx , xstep 190 | add rdx , 70 191 | mov r9 , 1 192 | mov rsi , 0x000000 193 | int 0x60 194 | 195 | jmp nodriver 196 | 197 | yesdriver: 198 | 199 | mov rax , 4 200 | mov rbx , driver_type 201 | mov rcx , 44 202 | mov rdx , r14 203 | imul rdx , xstep 204 | add rdx , 70 205 | mov r9 , 1 206 | mov rsi , 0x000000 207 | int 0x60 208 | 209 | mov rax , 116 210 | mov rbx , 2 211 | mov rcx , r14 212 | add rcx , [sc] 213 | sub rcx , 1000 214 | mov rdx , driver_type 215 | mov r8 , 100 216 | int 0x60 217 | mov rax , 4 218 | mov rbx , driver_type 219 | mov rcx , 182 220 | mov rdx , r14 221 | imul rdx , xstep 222 | add rdx , 70 223 | mov r9 , 1 224 | mov rsi , 0x000000 225 | int 0x60 226 | 227 | ; Device status 228 | 229 | mov rax , 116 230 | mov rbx , 5 231 | mov rcx , r14 232 | add rcx , [sc] 233 | sub rcx , 1000 234 | int 0x60 235 | 236 | and rbx , 3 237 | 238 | imul rbx , 8 239 | add rbx , device_status 240 | mov rbx ,[rbx] 241 | 242 | mov rax , 4 243 | mov rcx , 278 244 | mov rdx , r14 245 | imul rdx , xstep 246 | add rdx , 70 247 | mov r9 , 1 248 | mov rsi , 0x000000 249 | int 0x60 250 | 251 | ; 252 | 253 | mov r15 , 0 254 | 255 | newn: 256 | 257 | mov rax , 116 258 | mov rbx , r15 259 | add rbx , 3 260 | mov rcx , r14 261 | add rcx , [sc] 262 | sub rcx , 1000 263 | int 0x60 264 | 265 | mov rcx , rbx 266 | mov rax , 47 267 | mov rbx , 10* 65536 268 | mov rdx , r15 269 | imul rdx , 78 270 | add rdx , 399 271 | shl rdx , 16 272 | mov dx , r14w 273 | imul dx , xstep 274 | add rdx , 70 275 | mov rbp , 0 276 | mov rsi , 0 277 | mov rdi , 0 278 | int 0x40 279 | 280 | inc r15 281 | cmp r15 , 1 282 | jbe newn 283 | 284 | nodriver: 285 | 286 | inc r14 287 | cmp r14 , 16 288 | jb newdriver 289 | 290 | ret 291 | 292 | 293 | draw_scroll: 294 | 295 | mov rax , 113 296 | mov rbx , 1 297 | mov rcx , 1000 298 | mov rdx , 49 299 | mov r8 , [sc] 300 | mov r9 , 550 301 | mov r10 , 69 302 | mov r11 , 190 303 | ;int 0x60 304 | 305 | ret 306 | 307 | 308 | 309 | ; Data area 310 | 311 | window_label: 312 | 313 | db 'DRIVERS',0 314 | 315 | infotext: 316 | 317 | db ' Driver type Manufacturer Status ' 318 | db 'In Out ',0 319 | 320 | device_status: 321 | 322 | dq not_init 323 | dq working 324 | dq unknown 325 | dq unknown 326 | 327 | not_init: db 'Not initialized',0 328 | working: db 'Working properly',0 329 | unknown: db 'Unknown error',0 330 | driver_no: db ' ',0 331 | 332 | sc: dq 1000 333 | stepping: dq 0x0 334 | 335 | driver_type: 336 | 337 | times 256 db 0 338 | 339 | menu_struct: ; Menu Struct 340 | 341 | dq 0 ; Version 342 | 343 | dq 0x100 ; Start value of ID to return ( ID + Line ) 344 | 345 | ; Returned when menu closes and 346 | ; user made no selections. 347 | 348 | db 0,'FILE',0 ; ID = 0x100 + 1 349 | db 1,'New',0 ; ID = 0x100 + 2 350 | db 1,'Open..',0 ; ID = 0x100 + 3 351 | db 1,'Save..',0 ; ID = 0x100 + 4 352 | db 1,'-',0 ; ID = 0x100 + 5 353 | db 1,'Quit',0 ; ID = 0x100 + 6 354 | 355 | db 0,'HELP',0 ; ID = 0x100 + 7 356 | db 1,'Contents..',0 ; ID = 0x100 + 8 357 | db 1,'About..',0 ; ID = 0x100 + 9 358 | 359 | db 255 ; End of Menu Struct 360 | 361 | 362 | image_end: 363 | 364 | -------------------------------------------------------------------------------- /screen.asm: -------------------------------------------------------------------------------- 1 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 2 | ; 3 | ; Screen.asm for Menuet 4 | ; 5 | ; Compile with FASM 1.60 or above 6 | ; 7 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 8 | 9 | use64 10 | 11 | org 0x0 12 | 13 | db 'MENUET64' ; Header identifier 14 | dq 0x01 ; Version 15 | dq START ; Start of code 16 | dq image_end ; Size of image 17 | dq 0x800000 ; Memory for app 18 | dq 0x7ffff0 ; Esp 19 | dq 0x00 ; Prm 20 | dq 0x00 ; Icon 21 | 22 | START: 23 | 24 | mov rax , 141 25 | mov rbx , 1 26 | mov rcx , 1 27 | mov rdx , 5 shl 32 + 5 28 | mov r8 , 9 shl 32 + 12 29 | int 0x60 30 | 31 | mov rax , 26 32 | mov rbx , 3 33 | mov rcx , image_end 34 | mov rdx , 256 35 | int 0x60 36 | 37 | mov rax ,[image_end+4*8] 38 | mov [resolution_x] , rax 39 | 40 | mov rax ,[image_end+5*8] 41 | mov [resolution_y] , rax 42 | 43 | call draw_window ; At first, draw the window 44 | 45 | still: 46 | 47 | mov rax , 23 ; Wait here for event 48 | mov rbx , 100 49 | int 0x60 50 | 51 | test rax , 0x1 ; Window redraw 52 | jnz window_event 53 | test rax , 0x2 ; Keyboard press 54 | jnz key_event 55 | test rax , 0x4 ; Button press 56 | jnz button_event 57 | 58 | call draw_screen 59 | 60 | jmp still 61 | 62 | window_event: 63 | 64 | call draw_window 65 | jmp still 66 | 67 | key_event: 68 | 69 | mov rax , 0x2 ; Read the key and ignore 70 | int 0x60 71 | 72 | jmp still 73 | 74 | button_event: 75 | 76 | mov rax , 0x11 77 | int 0x60 78 | 79 | ; rax = status 80 | ; rbx = button id 81 | 82 | cmp rbx , 0x10000001 83 | jne no_application_terminate_button 84 | mov rax , 0x200 85 | int 0x60 86 | no_application_terminate_button: 87 | 88 | cmp rbx , 0x102 89 | jne no_application_terminate_menu 90 | mov rax , 0x200 91 | int 0x60 92 | no_application_terminate_menu: 93 | 94 | cmp rbx , 0x10 95 | je save_screen 96 | 97 | 98 | jmp still 99 | 100 | 101 | draw_window: 102 | 103 | mov rax , 0xC ; Beginning of window draw 104 | mov rbx , 0x1 105 | int 0x60 106 | 107 | mov rax , 0x0 ; Draw window 108 | mov rbx , 0x0000009000000000 ; x start & size 109 | mov rcx , 0x0000006000000000 ; y start & size 110 | 111 | mov rsi ,[resolution_x] 112 | shr rsi , 2 113 | add rsi , 20+21 114 | add rbx , rsi 115 | 116 | mov rsi ,[resolution_y] 117 | shr rsi , 2 118 | add rsi , 50+20+21 119 | add rcx , rsi 120 | 121 | mov rdx , 0x0000000000FFFFFF ; type & border color 122 | mov r8 , 0x0000000000000001 ; draw flags 123 | mov r9 , window_label ; 0 or label - asciiz 124 | mov r10 , menu_struct ; 0 or pointer to menu struct 125 | int 0x60 126 | 127 | mov rax , 8 128 | mov rbx ,[resolution_x] 129 | shr rbx , 2 130 | mov r8 , 20 * 0x100000000 131 | add rbx , r8 132 | mov rcx ,[resolution_y] 133 | shr rcx , 2 134 | add rcx , 60 135 | shl rcx , 32 136 | add rcx , 16 137 | 138 | push rax rbx 139 | mov rax , 141 140 | mov rbx , 3 141 | int 0x60 142 | cmp ax , 9 143 | je nobinc 144 | add rcx , 2 145 | nobinc: 146 | pop rbx rax 147 | 148 | mov rdx , 0x10 149 | mov r8 , 0 150 | mov r9 , button_text 151 | int 0x60 152 | 153 | call draw_screen 154 | 155 | mov rax , 0xC ; End of window draw 156 | mov rbx , 0x2 157 | int 0x60 158 | 159 | ret 160 | 161 | save_screen: 162 | 163 | mov rax , 111 164 | mov rbx , 1 165 | int 0x60 166 | 167 | mov rcx , rax 168 | push rcx 169 | mov rax , 124 170 | mov rbx , 1 171 | int 0x60 172 | 173 | mov rax , 5 174 | mov rbx , 100 175 | int 0x60 176 | 177 | mov rsi , bmpheader 178 | mov rdi , 0x100000 179 | mov rcx , 60 180 | cld 181 | rep movsb 182 | 183 | mov eax , [resolution_x] 184 | mov [0x100000+0x12],eax 185 | mov eax , [resolution_y] 186 | mov [0x100000+0x16],eax 187 | 188 | mov rcx , 0 189 | mov rdx , 0 190 | 191 | mov rdi , [resolution_x] 192 | imul rdi , [resolution_y] 193 | imul rdi , 3 194 | add rdi , 0x100000+54 195 | 196 | getpixely: 197 | 198 | sub rdi , [resolution_x] 199 | sub rdi , [resolution_x] 200 | sub rdi , [resolution_x] 201 | 202 | push rdi 203 | 204 | getpixel: 205 | 206 | mov rax , 35 207 | mov rbx , 1 208 | int 0x60 209 | 210 | mov [rdi],ax 211 | shr rax , 16 212 | mov [rdi+2],al 213 | add rdi ,3 214 | inc rcx 215 | cmp rcx ,[resolution_x] 216 | jb getpixel 217 | 218 | pop rdi 219 | 220 | mov rcx , 0 221 | inc rdx 222 | cmp rdx ,[resolution_y] 223 | jb getpixely 224 | 225 | mov rax , 124 226 | mov rbx , 2 227 | pop rcx 228 | int 0x60 229 | 230 | call draw_window 231 | 232 | ; Delete 233 | 234 | mov rax , 58 235 | mov rbx , 2 236 | mov rcx , 0 237 | mov rdx , 1024*768*3 238 | mov r8 , 0x100000 239 | mov r9 , path 240 | int 0x60 241 | 242 | ; Save 243 | 244 | mov rax , 58 245 | mov rbx , 1 246 | mov rcx , 0 247 | mov rdx ,[resolution_x] 248 | imul rdx ,[resolution_y] 249 | imul rdx , 3 250 | add rdx , 54 251 | mov r8 , 0x100000 252 | mov r9 , path 253 | int 0x60 254 | 255 | jmp still 256 | 257 | 258 | draw_screen: 259 | 260 | mov rcx , 0 261 | mov rdx , 0 262 | 263 | newpix: 264 | 265 | push rcx 266 | push rdx 267 | imul rcx , 4 268 | imul rdx , 4 269 | mov rax , 35 270 | mov rbx , 1 271 | int 0x60 272 | pop rdx 273 | pop rcx 274 | 275 | push rcx 276 | push rdx 277 | push rax 278 | mov rbx , rcx 279 | mov rcx , rdx 280 | pop rdx 281 | mov rax , 1 ; End of Menu Struct 282 | add rbx , 20 283 | add rcx , 50 284 | int 0x60 285 | pop rdx 286 | pop rcx 287 | 288 | add rcx , 1 289 | mov rsi ,[resolution_x] 290 | shr rsi , 2 291 | cmp rcx , rsi 292 | jb newpix 293 | mov rcx , 0 294 | 295 | add rdx , 1 296 | mov rsi,[resolution_y] 297 | shr rsi , 2 298 | cmp rdx , rsi 299 | jb newpix 300 | 301 | ret 302 | 303 | 304 | ; Data area 305 | 306 | resolution_x: 307 | 308 | dq 1024 309 | 310 | resolution_y: 311 | 312 | dq 768 313 | 314 | 315 | button_text: 316 | 317 | db 'Save as ' 318 | 319 | path: 320 | 321 | db '/usb/1/screen.bmp',0 322 | 323 | window_label: 324 | 325 | db 'SCREEN',0 ; Window label 326 | 327 | menu_struct: ; Menu Struct 328 | 329 | dq 0 ; Version 330 | 331 | dq 0x100 ; Start value of ID to return ( ID + Line ) 332 | 333 | db 0,'FILE',0 ; ID = 0x100 + 1 334 | db 1,'Quit',0 335 | db 255 336 | 337 | bmpheader: 338 | 339 | db 66 ; 01 340 | db 77 341 | db 54 342 | db 12 343 | db 0 344 | db 0 345 | db 0 346 | db 0 347 | db 0 348 | db 0 ; 10 349 | db 54 350 | db 0 351 | db 0 352 | db 0 353 | db 40 354 | db 0 355 | db 0 356 | db 0 357 | db 32 ; x 358 | db 0 ; 20 359 | db 0 360 | db 0 361 | db 32 ; y 362 | db 0 363 | db 0 364 | db 0 365 | db 1 366 | db 0 367 | db 24 368 | db 0 ; 30 369 | db 0 370 | db 0 371 | db 0 372 | db 0 373 | db 0 374 | db 12 375 | db 0 376 | db 0 377 | db 0 378 | db 0 ; 40 379 | db 0 380 | db 0 381 | db 0 382 | db 0 383 | db 0 384 | db 0 385 | db 0 386 | db 0 387 | db 0 388 | db 0 ; 50 389 | db 0 390 | db 0 391 | db 0 392 | db 0 ; 54 393 | 394 | bmpheader_end: 395 | 396 | 397 | image_end: 398 | 399 | -------------------------------------------------------------------------------- /play/mrex2.asm: -------------------------------------------------------------------------------- 1 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 2 | ; 3 | ; Audio 4 | ; 5 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 6 | 7 | 8 | use64 9 | 10 | define B byte 11 | define W word 12 | define D dword 13 | define Q qword 14 | 15 | 16 | org 0x0 17 | 18 | db "MENUET64" 19 | dq 0x01 20 | dq _main 21 | dq image_end ;size of image 22 | dq stacktop+0x100000*30 ;memory size 23 | dq stacktop-16 ;*stack 24 | dq 0 25 | dq 0x0 26 | 27 | inwav equ stacktop 28 | buffer equ (stacktop+0x400000) 29 | memm equ (stacktop+0x800000) 30 | 31 | include "sinc.inc" ;variable definitions 32 | include "sc.inc" ; 33 | include "stream.inc" ; 34 | include "wfc.inc" ; 35 | 36 | 37 | ;------------------------------------------------------------------------------------ 38 | _main: 39 | call draw_window 40 | ;------------------------------------------------------------------------------------ 41 | still: 42 | mov eax , 10 43 | int 0x60 44 | 45 | test al ,1 ;event handler 46 | jnz event_win 47 | test al ,2 48 | jnz event_key 49 | test al ,4 50 | jnz event_button 51 | 52 | jmp still 53 | ;------------------------------------------------------------------------------------ 54 | ;WINDOW EVENT 55 | event_win: 56 | call draw_window 57 | jmp still 58 | ;------------------------------------------------------------------------------------ 59 | 60 | 61 | ;------------------------------------------------------------------------------------ 62 | ;KEY EVENT 63 | event_key: 64 | mov eax , 2 ;get key 65 | int 0x60 66 | jmp still 67 | ;------------------------------------------------------------------------------------ 68 | 69 | 70 | ;------------------------------------------------------------------------------------ 71 | ;BUTTON EVENT 72 | event_button: 73 | mov eax , 17 74 | int 0x60 75 | test rax , rax 76 | jnz .end 77 | 78 | cmp rbx,0x10000001 79 | jnz .noex 80 | mov eax,512 81 | int 0x60 82 | .noex: 83 | cmp rbx , 100 84 | jnz .end 85 | 86 | ;define work area 87 | mov rax , 150 88 | mov rbx , 1 89 | mov rcx , memm 90 | mov rdx , 0x100000*20 91 | int 0x60 92 | 93 | ;read file 94 | mov rax , 58 95 | mov rbx , 0 96 | mov rcx , 0 97 | mov rdx , 0x3F0000/512 98 | mov r8 , inwav 99 | mov r9 , inname 100 | int 0x60 101 | mov [errcode],byte 0xff 102 | cmp rbx , 0x2c 103 | jbe .endw 104 | mov [errcode],byte 0x00 105 | mov rax , 0x3F0000 106 | cmp rbx , rax 107 | cmova rbx , rax 108 | mov [filesize],rbx 109 | 110 | ;stream resampling interface follows: 111 | 112 | mov eax , 150 ;audio processing syscall 113 | mov ebx , 65 ;65 - Sinc resampling stream get info 114 | mov rcx , STREAM_TYPE_MEM 115 | mov rdx , inwav 116 | mov r8 , [filesize] 117 | sub r8 , 0x2c 118 | lea r9 , [wfcinfos] ;wfcinfos structure, see "wave format converter" 119 | int 0x60 120 | test rax , rax 121 | mov [errcode], rax 122 | jnz .endw 123 | 124 | mov eax , 150 ;audio processing syscall 125 | mov ebx , 66 ;66 - Sinc resampling stream process 126 | mov rcx , SINC_TABLE_HIGH_QUALITY shl 32 + STREAM_TYPE_MEM 127 | mov rdx , inwav 128 | mov r8 , [filesize] 129 | sub r8 , 0x2c 130 | mov r10d, [wfcinfos + WFC_INFO_SCFORMAT] ;the input format must be obtained 131 | mov r9 , r10 ;and pass it in the high dword 132 | shl r9 , 32 ; 133 | and r10d, (255 shl 8) ;the output format is constructed by 134 | or r10d, SC_FORMAT_16B ;using the channel info of the input format 135 | or r9 , r10 ;and pass it in the low dword 136 | mov r10d, [wfcinfos + WFC_INFO_RATE] ;r10 - sample rate 137 | shl r10 , 32 ;high dword - in rate 138 | or r10 , 48000 ; low dword - out rate 139 | lea r11 , [output] 140 | int 0x60 141 | test rax , rax 142 | mov [errcode], rax 143 | jnz .endw 144 | 145 | lea rdx , [buffer] ;you can calculate the number of bytes 146 | sub rdx , [output] ;processed after "stream process" 147 | neg rdx 148 | 149 | mov rax , 58 ;write resampled file (no wav header) 150 | mov rbx , 1 151 | mov r8 , buffer 152 | mov r9 , outname 153 | int 0x60 154 | 155 | inc D [success] 156 | .endw: 157 | call draw_window 158 | .end: 159 | jmp still 160 | ;------------------------------------------------------------------------------------ 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | ;------------------------------------------------------------------------------------ 170 | ;DRAW WINDOW 171 | draw_window: 172 | mov eax , 12 173 | mov ebx , 1 174 | int 0x60 175 | 176 | xor ebx , ebx ;define window 177 | shl rbx , 32 178 | or rbx , 400 179 | xor ecx , ecx 180 | shl rcx , 32 181 | or rcx , 200 182 | xor edx , edx 183 | mov r8 , 1 184 | lea r9 , [windowlabel] 185 | xor r10 , r10 186 | xor eax , eax 187 | int 0x60 188 | 189 | mov rax , 8 ;draw button 190 | mov rbx , (40 shl 32) + 300 191 | mov rcx , (40 shl 32) + 40 192 | mov edx , 100 193 | xor r8 , r8 194 | lea r9 , [button] 195 | int 0x60 196 | 197 | cmp D [success],0 ;write text on success 198 | jz .sk 199 | mov eax , 4 200 | mov rbx , str1 201 | mov rcx , 40 202 | mov rdx , 80 203 | mov r9 , 1 204 | mov rsi , 0x00ff00ff 205 | int 0x60 206 | .sk: 207 | mov eax , 47 ;display error code 208 | mov ebx , 0x00100100 209 | mov rcx , [errcode] 210 | mov rdx , (40 shl 32) + 100 211 | mov rsi , 0x00ff00ff 212 | int 0x60 213 | 214 | mov eax , 12 215 | mov ebx , 2 216 | int 0x60 217 | ret 218 | ;------------------------------------------------------------------------------------ 219 | 220 | align 16 221 | 222 | output dq buffer 223 | 224 | windowlabel db "resample ex 2 (stream)",0 225 | button db "resample from 44khz to 48khz (out3.raw!)",0 226 | str1 db "successful!",0 227 | 228 | inname db "/fd/1/in.wav",0 229 | outname db "/fd/1/out3.raw",0 230 | 231 | image_end: 232 | 233 | align 16 234 | 235 | success: dq ? 236 | errcode: dq ? 237 | filesize: dq ? 238 | wfcinfos: times WFC_INFOSIZE dd ? ;32 bytes 239 | 240 | times 4096 db ? 241 | stacktop: 242 | 243 | -------------------------------------------------------------------------------- /transp.asm: -------------------------------------------------------------------------------- 1 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 2 | ; 3 | ; Window transparency for Menuet 4 | ; 5 | ; Compile with FASM 1.60 or above 6 | ; 7 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 8 | 9 | use64 10 | 11 | org 0x0 12 | 13 | db 'MENUET64' ; Header identifier 14 | dq 0x01 ; Version 15 | dq START ; Start of code 16 | dq image_end ; Size of image 17 | dq 0x100000 ; Memory for app 18 | dq 0xffff0 ; Esp 19 | dq 0x00 ; Prm 20 | dq 0x00 ; Icon 21 | 22 | START: 23 | 24 | mov rax , 141 25 | mov rbx , 1 26 | mov rcx , 1 27 | mov rdx , 5 shl 32 + 5 28 | mov r8 , 9 shl 32 + 12 29 | int 0x60 30 | 31 | ; Get current update interval 32 | 33 | mov rax , 125 34 | mov rbx , 1 35 | int 0x60 36 | xor rdx , rdx 37 | mov rbx , 10 38 | div rbx 39 | add rax , 300 40 | dec rax 41 | mov [hscroll_value],rax 42 | 43 | ; Get current opacity 44 | 45 | mov rax , 125 46 | mov rbx , 5 47 | int 0x60 48 | add rax , 400 49 | mov [hscroll_value2],rax 50 | 51 | ; Get current window type 52 | 53 | mov rax , 125 54 | mov rbx , 7 55 | int 0x60 56 | mov [window_move_type],rax 57 | 58 | ; Get current update interval 59 | 60 | mov rax , 125 61 | mov rbx , 9 62 | int 0x60 63 | sub rax , 5 64 | cmp rax , 25 65 | jbe intervalfine 66 | mov rax , 25 67 | intervalfine: 68 | add rax , 500 69 | mov [hscroll_value3],rax 70 | 71 | call draw_window ; At first, draw the window 72 | 73 | still: 74 | 75 | mov rax , 10 ; Wait here for event 76 | int 0x60 77 | 78 | test rax , 0x1 ; Window redraw 79 | jnz window_event 80 | test rax , 0x2 ; Keyboard press 81 | jnz key_event 82 | test rax , 0x4 ; Button press 83 | jnz button_event 84 | 85 | jmp still 86 | 87 | window_event: 88 | 89 | call draw_window 90 | jmp still 91 | 92 | key_event: 93 | 94 | mov rax , 0x2 ; Read the key and ignore 95 | int 0x60 96 | 97 | jmp still 98 | 99 | button_event: 100 | 101 | mov rax , 0x11 ; Get data 102 | int 0x60 103 | 104 | ; rax = status 105 | ; rbx = button id 106 | 107 | cmp rbx , 300 ; Horizontal scroll 300-319 108 | jb no_horizontal_scroll 109 | cmp rbx , 319 110 | ja no_horizontal_scroll 111 | mov [hscroll_value], rbx 112 | call draw_horizontal_scroll 113 | mov rax , 125 114 | mov rbx , 2 115 | mov rcx , [hscroll_value] 116 | sub rcx , 300 117 | imul rcx , 10 118 | add rcx , 10 119 | int 0x60 120 | jmp still 121 | no_horizontal_scroll: 122 | 123 | cmp rbx , 400 ; Horizontal scroll 400-402 124 | jb no_horizontal_scroll2 125 | cmp rbx , 402 126 | ja no_horizontal_scroll2 127 | mov [hscroll_value2], rbx 128 | call draw_horizontal_scroll2 129 | mov rax , 125 130 | mov rbx , 6 131 | mov rcx , [hscroll_value2] 132 | sub rcx , 400 133 | int 0x60 134 | jmp still 135 | no_horizontal_scroll2: 136 | 137 | cmp rbx , 500 ; Horizontal scroll 500-524 138 | jb no_horizontal_scroll3 139 | cmp rbx , 525 140 | ja no_horizontal_scroll3 141 | mov [hscroll_value3], rbx 142 | call draw_window_interval 143 | mov rax , 125 144 | mov rbx , 10 145 | mov rcx , [hscroll_value3] 146 | sub rcx , 500-5 147 | int 0x60 148 | jmp still 149 | no_horizontal_scroll3: 150 | 151 | cmp rbx , 50 152 | jne no_windowmove 153 | inc dword [window_move_type] 154 | and dword [window_move_type],dword 1 155 | mov rax , 125 156 | mov rbx , 8 157 | mov rcx , [window_move_type] 158 | int 0x60 159 | ; Get current window type 160 | mov rax , 125 161 | mov rbx , 7 162 | int 0x60 163 | mov [window_move_type],rax 164 | call draw_window_move 165 | jmp still 166 | no_windowmove: 167 | 168 | cmp rbx , 0x10000001 ; Terminate button 169 | jne no_application_terminate_button 170 | mov rax , 512 171 | int 0x60 172 | no_application_terminate_button: 173 | 174 | cmp rbx , 0x106 ; Menu 175 | jne no_application_terminate_menu 176 | mov rax , 0x200 177 | int 0x60 178 | no_application_terminate_menu: 179 | 180 | jmp still 181 | 182 | 183 | draw_window: 184 | 185 | mov rax , 0xC ; Beginning of window draw 186 | mov rbx , 0x1 187 | int 0x60 188 | 189 | ; Window position 190 | 191 | mov rax , 0x0 ; Draw window 192 | mov rbx , 0x00000090000001AB-10 193 | mov rcx , 0x0000004800000117+90 194 | mov rdx , 0xffffff 195 | mov r8 , 0x1 196 | mov r9 , window_label 197 | mov r10 , menu_struct 198 | int 0x60 199 | 200 | mov rax , 125 201 | mov rbx , 3 202 | int 0x60 203 | 204 | add rax , 48 205 | mov [text+20],al 206 | 207 | mov rax , 0x4 ; Display text 208 | mov rbx , text 209 | mov rcx , 0x20 210 | mov rdx , 0x40 211 | mov rsi , 0x0 212 | mov r9 , 0x1 213 | 214 | newline: 215 | 216 | cmp [rbx],byte '_' 217 | je lineskip 218 | 219 | int 0x60 220 | 221 | add rbx , 60 222 | lineskip: 223 | add rbx , 1 224 | add rdx , 14 225 | cmp [rbx],byte 0 226 | jne newline 227 | 228 | ; Scroll 229 | 230 | call draw_horizontal_scroll 231 | 232 | call draw_horizontal_scroll2 233 | 234 | call draw_window_move 235 | 236 | call draw_window_interval 237 | 238 | mov rax , 0xc 239 | mov rbx , 2 240 | int 0x60 241 | 242 | ret 243 | 244 | 245 | draw_horizontal_scroll: 246 | 247 | mov rax , 113 248 | mov rbx , 2 249 | mov rcx , 300 250 | mov rdx , 10 251 | mov r8 ,[hscroll_value] 252 | mov r9 , 193 253 | mov r10 , 32 254 | mov r11 , 230 255 | int 0x60 256 | 257 | ret 258 | 259 | draw_horizontal_scroll2: 260 | 261 | mov rax , 113 262 | mov rbx , 2 263 | mov rcx , 400 264 | mov rdx , 3 265 | mov r8 ,[hscroll_value2] 266 | mov r9 , 235 267 | mov r10 , 32 268 | mov r11 , 230 269 | int 0x60 270 | 271 | ret 272 | 273 | 274 | draw_window_move: 275 | 276 | mov rax , 8 277 | mov rbx , 32 shl 32 + 230 278 | mov rcx , (235+31) shl 32 + 18 279 | mov rdx , 50 280 | mov r8 , 0 281 | mov r9 , button_text_off 282 | cmp [window_move_type],byte 1 283 | jne nowmt1 284 | mov r9 , button_text_on 285 | nowmt1: 286 | int 0x60 287 | 288 | ret 289 | 290 | 291 | draw_window_interval: 292 | 293 | mov rax , 113 294 | mov rbx , 2 295 | mov rcx , 500 296 | mov rdx , 26 297 | mov r8 , [hscroll_value3] 298 | mov r9 , 235+84 299 | mov r10 , 32 300 | mov r11 , 230 301 | int 0x60 302 | 303 | ret 304 | 305 | 306 | ; Data area 307 | 308 | window_label: ; Window label 309 | 310 | db 'TRANSPARENCY',0 311 | 312 | text: 313 | 314 | db 'Transparency state: 0 ',0 315 | db '_0 - Disabled ',0 316 | db '1 - Enabled for window title and frames ',0 317 | db '2 - Enabled for window title, menu and frames ',0 318 | db '_Modify transparency state in Config.mnt and reboot. ',0 319 | db '_Set transparency update interval (10-100ms) ',0 320 | db '__Set transparency opacity (75:25,50:50,25:75) ',0 321 | db '_____Set window content move interval (5-30) ',0 322 | db 0 323 | 324 | hscroll_value: ; Scroll value 325 | 326 | dq 300 327 | 328 | hscroll_value2: ; Scroll value 2 329 | 330 | dq 400 331 | 332 | hscroll_value3: 333 | 334 | dq 500 335 | 336 | window_move_type: 337 | 338 | dq 0x0 339 | 340 | button_text_on: db 'Display window content when moving',0 341 | button_text_off: db 'Display window frames when moving',0 342 | 343 | menu_struct: ; Menu Struct 344 | 345 | dq 0 ; Version 346 | 347 | dq 0x100 ; Start value of ID to return ( ID + Line ) 348 | 349 | ; Returned when menu closes and 350 | ; user made no selections. 351 | 352 | db 0,'FILE',0 ; ID = 0x100 + 1 353 | db 1,'New',0 ; ID = 0x100 + 2 354 | db 1,'Open..',0 ; ID = 0x100 + 3 355 | db 1,'Save..',0 ; ID = 0x100 + 4 356 | db 1,'-',0 ; ID = 0x100 + 5 357 | db 1,'Quit',0 ; ID = 0x100 + 6 358 | 359 | db 0,'HELP',0 ; ID = 0x100 + 7 360 | db 1,'Contents..',0 ; ID = 0x100 + 8 361 | db 1,'About..',0 ; ID = 0x100 + 9 362 | 363 | db 255 ; End of Menu Struct 364 | 365 | image_end: 366 | 367 | -------------------------------------------------------------------------------- /setup.asm: -------------------------------------------------------------------------------- 1 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 2 | ; 3 | ; Drivers, background, skin for Menuet 4 | ; 5 | ; Compile with FASM 1.60 or above 6 | ; 7 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 8 | 9 | use64 10 | 11 | org 0x0 12 | 13 | db 'MENUET64' ; Header identifier 14 | dq 0x01 ; Version 15 | dq START ; Start of code 16 | dq image_end ; Size of image 17 | dq 0x200000 ; Memory for app 18 | dq 0x1ffff0 ; Esp 19 | dq 0x00 ; Prm 20 | dq 0x00 ; Icon 21 | 22 | START: 23 | 24 | mov rax , 141 25 | mov rbx , 1 26 | mov rcx , 1 27 | mov rdx , 5 shl 32 + 5 28 | mov r8 , 9 shl 32 + 12 29 | int 0x60 30 | 31 | ; IPC 32 | 33 | mov rax , 60 34 | mov rbx , 1 35 | mov rcx , ipc_memory 36 | mov rdx , 100 37 | int 0x60 38 | 39 | call draw_window ; At first, draw the window 40 | 41 | still: 42 | 43 | mov rax , 23 ; Wait here for event 44 | mov rbx , 10 45 | int 0x60 46 | 47 | test rax , 0x1 ; Window redraw 48 | jnz window_event 49 | test rax , 0x2 ; Keyboard press 50 | jnz key_event 51 | test rax , 0x4 ; Button press 52 | jnz button_event 53 | 54 | cmp [ipc_memory+16],byte 0 55 | je still 56 | 57 | mov rdi , [waiting] 58 | imul rdi , (textbox2-textbox1) 59 | add rdi , textbox1+48 60 | mov rax , rdi 61 | mov rsi , ipc_memory+16 62 | mov rcx , 48 63 | cld 64 | rep movsb 65 | 66 | mov rcx , 0 67 | dec rcx 68 | nextlen: 69 | inc rcx 70 | cmp [ipc_memory+16+rcx],byte 0 71 | jne nextlen 72 | mov [rax-8],rcx 73 | 74 | mov r14 , [waiting] 75 | imul r14 , 8 76 | mov r14 , [textbox_list+r14] 77 | call draw_textbox 78 | 79 | mov [waiting],dword 0 80 | mov [ipc_memory+16],byte 0 81 | mov [ipc_memory+8],dword 16 82 | 83 | jmp still 84 | 85 | window_event: 86 | 87 | call draw_window 88 | jmp still 89 | 90 | key_event: 91 | 92 | mov rax , 0x2 ; Read the key and ignore 93 | int 0x60 94 | 95 | cmp rbx , 0 96 | je still 97 | 98 | jmp still 99 | 100 | 101 | button_event: 102 | 103 | mov rax , 0x11 104 | int 0x60 105 | 106 | cmp rbx , 21 107 | jb no_read_textbox 108 | cmp rbx , 29 109 | ja no_read_textbox 110 | sub rbx , 21 111 | imul rbx , 8 112 | mov r14 , [textbox_list+rbx] 113 | call read_textbox 114 | jmp still 115 | no_read_textbox: 116 | 117 | cmp rbx , 31 118 | jb no_browse 119 | cmp rbx , 39 120 | ja no_browse 121 | sub rbx , 31 122 | mov [waiting],rbx 123 | mov rax , 111 124 | mov rbx , 1 125 | int 0x60 126 | mov rdi , parameter+6 127 | newdec: 128 | mov rbx , 10 129 | xor rdx , rdx 130 | div rbx 131 | add rdx , 48 132 | mov [rdi],dl 133 | dec rdi 134 | cmp rdi , parameter + 1 135 | jg newdec 136 | mov rax , 256 137 | mov rbx , file_search 138 | mov rcx , parameter 139 | int 0x60 140 | jmp still 141 | no_browse: 142 | 143 | cmp rbx , 0x10000001 144 | jne no_application_terminate_button 145 | mov rax , 512 146 | int 0x60 147 | no_application_terminate_button: 148 | 149 | cmp rbx , 0x105 ; Menu 150 | jne no_application_terminate_menu 151 | mov rax , 0x200 152 | int 0x60 153 | no_application_terminate_menu: 154 | 155 | ; Load new background 156 | 157 | cmp rbx , 15+1 158 | jne no_new_background 159 | mov rsi , textbox6+48 160 | mov rdi , param+1 161 | mov rcx , 50 162 | cld 163 | rep movsb 164 | mov rax , 256 165 | mov rbx , draw 166 | mov rcx , param 167 | int 0x60 168 | jmp still 169 | no_new_background: 170 | 171 | ; Load new skin 172 | 173 | cmp rbx , 14+1 174 | jne no_new_skin 175 | mov rax , 120 176 | mov rbx , 1 177 | mov rcx , textbox5+48 178 | int 0x60 179 | mov rax , 120 180 | mov rbx , 2 181 | mov rcx , 1 182 | int 0x60 183 | mov rax , 120 184 | mov rbx , 3 185 | int 0x60 186 | jmp still 187 | no_new_skin: 188 | 189 | ; Load new driver 190 | 191 | cmp rbx , 11 192 | jb no_new_driver 193 | cmp rbx , 13+1 194 | ja no_new_driver 195 | mov rcx , rbx 196 | sub rcx , 11 197 | imul rcx , 8 198 | mov rcx , [textbox_list+rcx] 199 | add rcx , 48 200 | mov rax , 116 201 | mov rbx , 101 202 | mov rdx , 1 203 | int 0x60 204 | no_new_driver: 205 | 206 | jmp still 207 | 208 | 209 | draw_window: 210 | 211 | mov rax , 0xC ; Beginning of window draw 212 | mov rbx , 0x1 213 | int 0x60 214 | 215 | mov rax , 0x0 ; Draw window 216 | mov rbx , 72*0x100000000+443 ; x start & size 217 | mov rcx , 55*0x100000000+305+50 ; y start & size 218 | mov rdx , 0x0000000000ffffff ; type & border color 219 | mov r8 , 0x0000000000000001 ; draw flags 220 | mov r9 , window_label ; 0 or label - asciiz 221 | mov r10 , menu_struct ; 0 or pointer to menu struct 222 | int 0x60 223 | 224 | ; Browse 225 | 226 | mov rax , 8 227 | mov rbx , 255 * 0x100000000 + 80 228 | mov rcx , 65 * 0x100000000 + 17 229 | mov rdx , 31 230 | mov r8 , 0 231 | mov r9 , browse 232 | mov r10 , 50 * 0x100000000 233 | newbrowse: 234 | int 0x60 235 | add rcx , r10 236 | inc rdx 237 | cmp rdx , 35+1 238 | jbe newbrowse 239 | 240 | ; Apply 241 | 242 | mov rax , 8 243 | mov rbx , 340* 0x100000000 + 80 244 | mov rcx , 65 * 0x100000000 + 17 245 | mov rdx , 11 246 | mov r8 , 0x0 247 | mov r9 , apply 248 | mov r10 , 50 * 0x100000000 249 | newapply: 250 | int 0x60 251 | add rcx , r10 252 | inc rdx 253 | cmp rdx , 15+1 254 | jbe newapply 255 | 256 | call draw_textboxes 257 | 258 | mov rax , 4 259 | mov rbx , text 260 | mov rcx , 20 261 | mov rdx , 50 262 | mov rsi , 0x000000 263 | mov r9 , 1 264 | newtext: 265 | int 0x60 266 | add rdx , 50 267 | add rbx , 19 268 | cmp rbx , text+19*6 269 | jb newtext 270 | 271 | mov rax , 12 272 | mov rbx , 2 273 | int 0x60 274 | 275 | ret 276 | 277 | 278 | draw_textboxes: 279 | 280 | mov r14 , textbox1 281 | call draw_textbox 282 | mov r14 , textbox2 283 | call draw_textbox 284 | mov r14 , textbox3 285 | call draw_textbox 286 | mov r14 , textbox4 287 | call draw_textbox 288 | mov r14 , textbox5 289 | call draw_textbox 290 | mov r14 , textbox6 291 | call draw_textbox 292 | 293 | ret 294 | 295 | ; Data area 296 | 297 | textbox1: 298 | 299 | dq 0 300 | dq 20 301 | dq 230 302 | dq 65 303 | dq 21 304 | dq 19 305 | db '/FD/1/DRIVER/I8254X' 306 | times 50-19 db 0 307 | 308 | textbox2: 309 | 310 | dq 0 311 | dq 20 312 | dq 230 313 | dq 115 314 | dq 22 315 | dq 21 316 | db '/FD/1/DRIVER/INTELHDA' 317 | times 50-21 db 0 318 | 319 | textbox3: 320 | 321 | dq 0 322 | dq 20 323 | dq 230 324 | dq 165 325 | dq 23 326 | dq 16 327 | db '/FD/1/DRIVER/GRX' 328 | times 50-16 db 0 329 | 330 | textbox4: 331 | 332 | dq 0 333 | dq 20 334 | dq 230 335 | dq 215 336 | dq 24 337 | dq 19 338 | db '/FD/1/DRIVER/MPU401' 339 | times 50-19 db 0 340 | 341 | textbox5: 342 | 343 | dq 0 344 | dq 20 345 | dq 230 346 | dq 265 347 | dq 25 348 | dq 14 349 | db '/FD/1/SKIN.BMP' 350 | times 50-14 db 0 351 | 352 | textbox6: 353 | 354 | dq 0 355 | dq 20 ; X start 356 | dq 230 ; X size 357 | dq 315 ; Y start 358 | dq 26 ; Button ID 359 | dq 13 ; Text length 360 | db '/FD/1/BGR.JPG' 361 | times 50-13 db 0 362 | 363 | 364 | window_label: 365 | 366 | db 'SETUP',0 367 | 368 | apply: 369 | 370 | db 'APPLY',0 371 | 372 | browse: 373 | 374 | db 'BROWSE',0 375 | 376 | draw: db '/FD/1/DRAW',0 377 | param: db 'B' 378 | times 256 db 0 379 | 380 | textbox_list: dq textbox1,textbox2,textbox3,textbox4,textbox5,textbox6 381 | file_search: db '/FD/1/FBROWSER',0 382 | parameter: db '[000000]',0 383 | waiting: dq 0x0 384 | 385 | startx: dw 100 386 | starty: dw 000 387 | 388 | sx: dw 0 389 | sy: dw 0 390 | 391 | text: 392 | 393 | db 'Network driver ',0 394 | db 'Audio driver ',0 395 | db 'Graphics driver ',0 396 | db 'Midi driver ',0 397 | db 'Window skinning ',0 398 | db 'Background picture',0 399 | 400 | menu_struct: ; Menu Struct 401 | 402 | dq 0 ; Version 403 | 404 | dq 0x100 ; Start value of ID to return ( ID + Line ) 405 | 406 | ; Returned when menu closes and 407 | ; user made no selections. 408 | 409 | db 0,'FILE',0 ; ID = 0x100 + 1 410 | db 1,'New',0 ; ID = 0x100 + 2 411 | db 1,'Open..',0 ; ID = 0x100 + 3 412 | db 1,'-',0 ; ID = 0x100 + 4 413 | db 1,'Quit',0 ; ID = 0x100 + 5 414 | 415 | db 255 ; End of Menu Struct 416 | 417 | include 'textbox.inc' 418 | 419 | ipc_memory: 420 | 421 | dq 0x0 422 | dq 16 423 | times 100 db 0 424 | 425 | image_end: 426 | 427 | -------------------------------------------------------------------------------- /boot64hd.asm: -------------------------------------------------------------------------------- 1 | ; 2 | ; Menuet64 HD boot 0.4 3 | ; 4 | ; Bootloader is distributed with ABSOLUTELY NO WARRANTY. 5 | ; See file /fd/1/license for details. 6 | ; Youre free to modify this file for use with Menuet64. 7 | ; Copyright 2005-2013 V.Turjanmaa 8 | ; 9 | ; Instructions for Menuet 64 HD boot 10 | ; 11 | ; 00) This procedure is experimental. Backup HDs. 12 | ; 01) Menuet64 is able to boot from first partition of fat32 hd. 13 | ; 02) Create menuet system directory to hd root, eg 'MSYS' 14 | ; 03) Copy all files from M64 floppy to 'MSYS' 15 | ; 04) Copy kernel.mnt and config.mnt to root directory of hd, /hd/1/. 16 | ; 05) Set system_directory in /hd/1/config.mnt to "/HD/1/MSYS/" 17 | ; 06) Define hd parameters in /hd/1/config.mnt according to your hd. 18 | ; 07) You might want to disable floppy in /hd/1/config.mnt 19 | ; by setting 'fd_1_enable' to zero. 20 | ; 08) Set hdbase and hdid in this file according to your hd. 21 | ; 09) Try the bootsector first with fd: set header in this file for fat12. 22 | ; 10) Compile this file and copy the binary to floppy's bootsector. 23 | ; 11) Boot your system from floppy, and all files should be 24 | ; loaded from hd. 25 | ; 12) Retry the above instructions until applications etc. work fine. 26 | ; 13) You can use this configuration to quickly boot from hd with only 27 | ; inserting the bootup floppy. 28 | ; 13) Modify the bytes in Fat32 _header_ in this file according to 29 | ; your current harddisks fat32 header. The bytes must be modified, or 30 | ; you'll end up with complete harddisk data loss, yes really. 31 | ; 14) Compile this file with a Fat32 header and copy the binary to HD. 32 | 33 | partition_start_cluster equ data_area+0 34 | fat_start_cluster equ data_area+4 35 | root_start_block equ data_area+8 36 | number_of_fats equ data_area+12 37 | fat_size equ data_area+16 38 | block_start_cluster equ data_area+20 39 | sectors_per_cluster equ data_area+24 40 | in_cache equ data_area+28 41 | 42 | Debug equ 0 43 | Fat12 equ 1 44 | Fat32 equ 2 45 | 46 | ; SETUP 47 | ; Load image from: 48 | ; 49 | hdbase equ 0x1f0 ; 0x1f0 - primary device 50 | ; 0x170 - secondary device 51 | ; 52 | hdid equ 0x00 ; 0x00 - master hd 53 | ; 0x10 - slave hd 54 | 55 | ; Install bootsector to: 56 | ; 57 | Header equ Fat12 ; Fat12: 58 | ; Floppy installation can be used as such. 59 | ; 60 | ; Fat32: 61 | ; Harddisk installation requires modification 62 | ; of the Fat32 header, or you'll lose all data 63 | ; on the target partition. 64 | ; 65 | ; Debug: 66 | ; No Header. Use for debugging with floppy only! 67 | ; Messages at low left corner during boot: 68 | ; 1 : bootsector loaded 69 | ; 2 : file not found 70 | ; 3 : file found - load starts 71 | ; 4 : jump to kernel 72 | 73 | 74 | jmp start_program 75 | nop 76 | 77 | if Header = Fat12 78 | 79 | oemname db 'MENUETOS' 80 | bytespersector dw 512 81 | sectorspercluster db 1 82 | ressectors dw 1 83 | numcopiesfat db 2 84 | maxallocrootdir dw 224 85 | maxsectors dw 2880 ;for 1.44 mbytes disk 86 | mediadescriptor db 0f0h ;fd = 2 sides 18 sectors 87 | sectorsperfat dw 9 88 | sectorspertrack dw 18 89 | heads dw 2 90 | hiddensectors dd 0 91 | hugesectors dd 0 ;if sectors > 65536 92 | drivenumber db 0 93 | db 0 94 | bootsignature db 029h ;extended boot signature 95 | volumeid dd 0 96 | volumelabel db 'TEST ' 97 | filesystemtype db 'FAT12 ' 98 | 99 | end if 100 | 101 | 102 | if Header = Fat32 103 | 104 | Id db 'MSWIN4.1' ; Modify header or all hd-data 105 | BytesPerSector dw 200h ; will be lost 106 | SectorsPerCluster db 8 107 | ReservedSector dw 20h 108 | NumberOfFATs db 2 109 | RootEntries dw 0 110 | TotalSectors dw 0 111 | MediaDescriptor db 0F8h ; hd 112 | SectorsPerFAT dw 0 113 | SectorsPerTrack dw 63 114 | Heads dw 255 115 | HiddenSectors dd 63 116 | BigTotalSectors db 0xbf,0x64,0x9c,0x00 117 | BigSectorsPerFat db 0x10,0x27,0x00,0x00 118 | ExtFlags dw 0 119 | FS_Version dw 0 120 | RootDirStrtClus dd 2 121 | FSInfoSec dw 0x01 ; at 0x30 122 | BkUpBootSec dw 0x06 123 | Reserved dw 0,0,0,0,0,0 124 | Drive db 80h ; at 0x40 125 | HeadTemp db 0 126 | Signature db 29h 127 | SerialNumber db 0x07,0x16,0x1a,0x39 128 | VolumeLabel db 'TEST ' 129 | FileSystemID db 'FAT32 ' 130 | 131 | end if 132 | 133 | ; 0x4000:0xfff0 - stack set at start 134 | ; 0x1000:0+ - kernel.mnt 135 | ; 0x5400:0+ - config.mnt 136 | 137 | start_program: 138 | 139 | cli 140 | cld 141 | 142 | mov ax,0x4000 143 | mov ss,ax 144 | mov sp,0xfff0 145 | 146 | push word 0x1000 147 | pop es 148 | 149 | push cs 150 | pop ds 151 | 152 | if Header = Debug 153 | 154 | mov ax,0xb800 155 | mov gs,ax 156 | mov [gs:80*24*2],byte '1' 157 | 158 | end if 159 | 160 | xor eax,eax 161 | call hd_read 162 | 163 | mov eax,[es:0x1c6] 164 | mov [partition_start_cluster],eax 165 | 166 | call hd_read 167 | 168 | mov [in_cache],dword 0 ; clear fat cache 169 | 170 | mov cx,word [es:0xe] ; fat start cluster 171 | mov [fat_start_cluster],cx 172 | 173 | mov cl,byte [es:0x10] ; number of fats 174 | mov [number_of_fats],cl 175 | 176 | mov ecx,[es:0x24] ; fat size 177 | mov [fat_size],ecx 178 | 179 | mov eax,[number_of_fats] ; block start cluster = 180 | imul eax,[fat_size] ; number_of_fats*fat_size 181 | add eax,[fat_start_cluster] ; +fat_start_cluster 182 | mov [block_start_cluster],eax 183 | 184 | mov cl,byte [es:0xd] ; sectors per cluster 185 | mov [sectors_per_cluster],cl 186 | 187 | mov bx , 0x1000 188 | mov ebp , 'KERN' 189 | call read_file 190 | 191 | mov bx , 0x5400 ; 0x8000 to 0x5400 (0.99.25) 192 | mov ebp , 'CONF' 193 | call read_file 194 | 195 | if Header = Fat12 196 | 197 | mov dx , 0x3f2 ; turn floppy motor off 198 | xor al , al 199 | out dx , al 200 | 201 | end if 202 | 203 | jmp 0x1000:0000 204 | 205 | 206 | read_file: 207 | 208 | mov es , bx 209 | 210 | mov eax , 0 ; cluster 2 211 | 212 | new_file_cluster_search: 213 | 214 | push eax 215 | 216 | imul eax,[sectors_per_cluster] 217 | add eax,[block_start_cluster] 218 | add eax,[partition_start_cluster] 219 | 220 | mov ecx,[sectors_per_cluster] 221 | 222 | new_file_search: 223 | 224 | call hd_read 225 | 226 | mov esi,0 227 | .newn: 228 | cmp [es:esi],ebp 229 | jne .not_found 230 | cmp [es:esi+8],word 'MN' 231 | jne .not_found 232 | jmp .found 233 | .not_found: 234 | add esi,32 235 | cmp esi,512 236 | jne .newn 237 | 238 | inc eax 239 | 240 | loop new_file_search 241 | 242 | pop eax 243 | call find_next_cluster_from_fat 244 | 245 | cmp eax,0xf000000 246 | jb new_file_search 247 | 248 | if Header = Debug 249 | mov [gs:80*24*2],byte '2' 250 | end if 251 | 252 | jmp $ 253 | 254 | .found: 255 | 256 | pop eax 257 | 258 | if Header = Debug 259 | mov [gs:80*24*2],byte '3' 260 | end if 261 | 262 | mov ax,[es:esi+20] ; first cluster of file data 263 | shl eax,16 264 | mov ax,[es:esi+26] 265 | 266 | sub eax,2 ; eax has the first cluster of file 267 | 268 | new_cluster_of_file: 269 | 270 | push eax 271 | 272 | imul eax,[sectors_per_cluster] 273 | add eax,[block_start_cluster] 274 | add eax,[partition_start_cluster] 275 | 276 | mov ecx,[sectors_per_cluster] 277 | newbr: 278 | call hd_read 279 | 280 | mov dx,es 281 | add dx,512 / 16 282 | mov es,dx 283 | 284 | inc eax 285 | 286 | loop newbr 287 | 288 | pop eax 289 | call find_next_cluster_from_fat 290 | 291 | cmp eax,0xf000000 292 | jb new_cluster_of_file 293 | 294 | ret 295 | 296 | 297 | find_next_cluster_from_fat: 298 | 299 | push es 300 | mov bx,0x1000-512/16 301 | mov es,bx 302 | 303 | add eax,2 304 | shl eax,2 305 | 306 | mov ebx,eax 307 | shr eax,9 ; cluster no 308 | 309 | add eax,[fat_start_cluster] 310 | add eax,[partition_start_cluster] 311 | 312 | cmp eax,[in_cache] ; check cache 313 | je no_read 314 | call hd_read 315 | mov [in_cache],eax 316 | no_read: 317 | 318 | and ebx,511 ; in cluster 319 | mov eax,[es:ebx] 320 | sub eax,2 321 | 322 | pop es 323 | 324 | ret 325 | 326 | 327 | 328 | hd_read: ; eax block to read 329 | 330 | pushad 331 | push eax 332 | 333 | newhdread: 334 | 335 | mov dx,hdbase 336 | inc dx 337 | mov al,0 338 | out dx,al 339 | 340 | inc dx 341 | mov al,1 342 | out dx,al 343 | 344 | inc dx 345 | pop ax 346 | out dx,al 347 | 348 | inc dx 349 | shr ax,8 350 | out dx,al 351 | 352 | inc dx 353 | pop ax 354 | out dx,al 355 | 356 | inc dx 357 | shr ax,8 358 | and al,1+2+4+8 359 | add al,hdid 360 | add al,128+64+32 361 | out dx,al 362 | 363 | inc dx 364 | mov al,0x20 365 | out dx,al 366 | 367 | .hdwait: 368 | 369 | in al,dx 370 | test al,128 371 | jnz .hdwait 372 | 373 | mov edi,0x0 374 | mov ecx,256 375 | mov dx,hdbase 376 | cld 377 | rep insw 378 | 379 | popad 380 | 381 | ret 382 | 383 | times ((0x1fe-$) and 0xff) db 00h 384 | 385 | db 55h,0aah ;boot signature 386 | 387 | data_area: 388 | 389 | 390 | -------------------------------------------------------------------------------- /launcher.asm: -------------------------------------------------------------------------------- 1 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 2 | ; 3 | ; Launcher for Menuet64 4 | ; 5 | ; Compile with FASM 64 bit 6 | ; 7 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 8 | 9 | use64 10 | 11 | org 0x0 12 | 13 | db 'MENUET64' ; 8 byte id 14 | dq 0x01 ; header version 15 | dq START ; start of code 16 | dq image_end ; size of image 17 | dq 0x100000 ; memory for app 18 | dq 0xffff0 ; rsp 19 | dq Param,0x0 ; I_Param,I_Icon 20 | 21 | 22 | window_enable equ 01 23 | delay_count equ 50 24 | delay_time equ 14 25 | applications equ 03 26 | 27 | 28 | START: 29 | 30 | ; System fonts 31 | 32 | mov rax , 141 33 | mov rbx , 1 34 | mov rcx , 1 35 | mov rdx , 5 shl 32 + 5 36 | mov r8 , 9 shl 32 + 12 37 | int 0x60 38 | 39 | call get_sysdir 40 | call make_table 41 | call draw_background 42 | call draw_window 43 | call start_applications 44 | 45 | still: 46 | 47 | mov rax , 11 48 | int 0x60 49 | test rax , 1b ; Redraw 50 | jnz red 51 | test rax , 100b ; Button 52 | jnz button 53 | jmp still 54 | 55 | red: 56 | 57 | call draw_window 58 | jmp still 59 | 60 | button: 61 | 62 | mov rax , 17 63 | int 0x60 64 | 65 | ; rax = status 66 | ; rbx = button id 67 | 68 | jmp still 69 | 70 | 71 | draw_background: 72 | 73 | ; 74 | ; Desktop redraw 75 | ; 76 | cmp [Param+8],dword 'DESK' 77 | jne startdesktop 78 | mov rax , 15 79 | mov rbx , 1 80 | int 0x60 81 | mov rax , 5 82 | mov rbx , 50 83 | int 0x60 84 | mov rax , 15 85 | mov rbx , 1 86 | int 0x60 87 | mov rax , 5 88 | mov rbx , 50 89 | int 0x60 90 | ; Start only menu and icons 91 | mov r8 , app_pointers+8 92 | mov rdi , 2 93 | ; 94 | ret 95 | startdesktop: 96 | 97 | ; 98 | ; 2x2 image for emulator start 99 | ; 100 | 101 | mov rax , 5 102 | mov rbx , 10 103 | int 0x60 104 | 105 | mov rax , 15 106 | mov rbx , 3 107 | mov rcx , 2 108 | mov rdx , 2 109 | int 0x60 110 | 111 | mov rax , 15 112 | mov rbx , 2 113 | mov rcx , bgr2x2 114 | mov rdx , 0 115 | mov r8 , 2*2*3 116 | int 0x60 117 | 118 | ; Wait for bgr ( emulators ) 119 | 120 | mov rax , 40 121 | mov rbx , 10111b 122 | int 0x60 123 | 124 | mov rax , 15 125 | mov rbx , 1 126 | int 0x60 127 | 128 | mov rax , 23 129 | mov rbx , 500 130 | int 0x60 131 | 132 | mov rax , 40 133 | mov rbx , 111b 134 | int 0x60 135 | 136 | mov rax , 5 137 | mov rbx , 30 138 | int 0x60 139 | 140 | ; 141 | ; Background picture 142 | ; 143 | 144 | mov r8 , app_pointers 145 | mov rdi , applications 146 | 147 | mov rsi,[r8] 148 | call start_app 149 | 150 | mov rax , 5 151 | mov rbx , 70 152 | int 0x60 153 | 154 | ret 155 | 156 | 157 | start_applications: 158 | 159 | mov r8 , app_pointers 160 | mov rdi , applications 161 | 162 | add r8 , 8 163 | dec rdi 164 | 165 | newlaunch: 166 | 167 | mov rax , delay_count 168 | call start_delay 169 | 170 | mov rsi,[r8] 171 | call start_app 172 | 173 | add r8 , 8 174 | 175 | dec rdi 176 | jnz newlaunch 177 | 178 | ; Wait for wallpaper to be drawn (emulators) 179 | 180 | mov rax , 40 181 | mov rbx , 10110b 182 | int 0x60 183 | 184 | no_close_app: 185 | 186 | mov rax , 15 187 | mov rbx , 13 188 | int 0x60 189 | mov rbx , 0x0000000200000002 190 | cmp rax , rbx 191 | jne close_app 192 | 193 | mov rax , 11 194 | int 0x60 195 | 196 | cmp rax , 0 197 | jne close_app 198 | 199 | mov rax , delay_count 200 | call start_delay 201 | 202 | jmp no_close_app 203 | 204 | close_app: 205 | 206 | mov rax , delay_count 207 | call start_delay 208 | 209 | ; Close 210 | 211 | mov rax , 512 212 | int 0x60 213 | 214 | 215 | start_app: 216 | 217 | push rsi 218 | push rdi 219 | 220 | mov rdi , [sysdirend] 221 | mov rcx , 12 222 | cld 223 | rep movsb 224 | 225 | mov rax , 256 226 | mov rbx , sysdir 227 | mov rcx , boot 228 | int 0x60 229 | 230 | pop rdi 231 | pop rsi 232 | 233 | ret 234 | 235 | 236 | start_delay: 237 | 238 | push rax 239 | push rbx 240 | push rcx 241 | 242 | mov rcx , rax 243 | 244 | push rcx 245 | call update_candy 246 | pop rcx 247 | 248 | sdl1: 249 | 250 | push rcx 251 | call delay 252 | call update_candy 253 | pop rcx 254 | 255 | loop sdl1 256 | 257 | pop rcx 258 | pop rbx 259 | pop rax 260 | 261 | ret 262 | 263 | 264 | if window_enable=0 265 | 266 | update_candy: 267 | 268 | ret 269 | 270 | end if 271 | 272 | 273 | if window_enable=1 274 | 275 | update_candy: 276 | 277 | cmp [Param+8],dword 'DESK' 278 | je noupdatecandy 279 | 280 | push rax 281 | push rbx 282 | push rcx 283 | push rdx 284 | push r8 285 | push r9 286 | push r10 287 | 288 | sub [cstate],dword 1 289 | and [cstate],dword 63 290 | 291 | mov rdx, [cstate] 292 | imul rdx, 3 293 | add rdx, 0x80000+32*3 294 | 295 | mov rbx, 18*0x100000000 + 221 296 | mov rcx, 73*0x100000000 + 12 297 | mov r8 , 512*3 - 221*3 298 | mov r9 , 0x1000000 299 | mov r10 , 3 300 | 301 | mov rax , 7 302 | int 0x60 303 | 304 | pop r10 305 | pop r9 306 | pop r8 307 | pop rdx 308 | pop rcx 309 | pop rbx 310 | pop rax 311 | 312 | noupdatecandy: 313 | 314 | ret 315 | 316 | end if 317 | 318 | delay: 319 | 320 | push rax rbx 321 | 322 | mov rax , 105 323 | mov rbx , delay_time 324 | int 0x60 325 | 326 | if window_enable=1 327 | mov rax , 11 328 | int 0x60 329 | test rax , 1 330 | jz nodrawwin 331 | call draw_window 332 | nodrawwin: 333 | end if 334 | 335 | pop rbx rax 336 | 337 | ret 338 | 339 | 340 | get_sysdir: 341 | 342 | mov rax , 112 343 | mov rbx , 1 344 | mov rcx , sys_parameter 345 | mov rdx , 256 346 | mov r8 , sysdir 347 | int 0x60 348 | 349 | mov rsi , sysdir 350 | newsearch: 351 | inc rsi 352 | cmp [rsi],byte 0 353 | jne newsearch 354 | 355 | mov [sysdirend],rsi 356 | 357 | ret 358 | 359 | 360 | if window_enable=0 361 | 362 | make_table: 363 | 364 | ret 365 | 366 | end if 367 | 368 | 369 | if window_enable=1 370 | 371 | make_table: 372 | 373 | mov rdi,0x80000 374 | mov eax,0xffffff 375 | 376 | mov ecx,12 377 | newgg: 378 | push rcx 379 | mov ecx,512 380 | newg: 381 | mov [ebp+edi],eax 382 | add edi,3 383 | loop newg 384 | sub eax,0x040404 385 | pop rcx 386 | loop newgg 387 | 388 | mov edi,0x80000+64*3 389 | 390 | mov eax,0x808890 391 | 392 | mov ecx,12 393 | newgg2: 394 | push rcx 395 | mov ecx,32 396 | newg2: 397 | mov r10 , 0 398 | call addeax 399 | mov r10 , 64 400 | call addeax 401 | mov r10 , 128 402 | call addeax 403 | mov r10 , 192 404 | call addeax 405 | mov r10 , 256 406 | call addeax 407 | mov r10 , 256+64 408 | call addeax 409 | mov r10 , 256+128 410 | call addeax 411 | mov r10 , 256+192 412 | call addeax 413 | 414 | add edi,3 415 | loop newg2 416 | sub eax,0x040404 417 | pop rcx 418 | add edi,3+224*3+256*3 419 | loop newgg2 420 | 421 | ret 422 | 423 | addeax: 424 | 425 | push rax 426 | imul r10 , 3 427 | add r10 , rbp 428 | add r10 , rdi 429 | mov [r10],ax 430 | shr rax , 16 431 | mov [r10+2],al 432 | pop rax 433 | ret 434 | 435 | end if 436 | 437 | 438 | if window_enable=0 439 | 440 | draw_window: 441 | 442 | ret 443 | 444 | end if 445 | 446 | 447 | if window_enable=1 448 | 449 | draw_window: 450 | 451 | cmp [Param+8],dword 'DESK' 452 | je nodrawwindow 453 | 454 | push rax rbx rcx rdx r8 r9 r10 r11 r12 r13 r14 r15 rsi rdi rbp 455 | 456 | mov rax , 12 457 | mov rbx , 1 458 | int 0x60 459 | 460 | mov rax , 26 461 | mov rbx , 3 462 | mov rcx , image_end 463 | mov rdx , 30*8 464 | int 0x60 465 | 466 | ; Middle of screen 467 | 468 | mov rbx , [image_end+0x20] 469 | shr rbx , 1 470 | sub rbx , 128 471 | shl rbx , 32 472 | add rbx , 257 473 | 474 | mov rax , 0 ; draw window 475 | mov rcx , 150 *0x100000000 + 103 476 | mov rdx , 0 *0x100000000 + 0xffffff ; type & border color 477 | mov r8 , 1b ; draw buttons 478 | mov r9 , window_label ; 0 or label - asciiz 479 | mov r10 , 0 ; pointer to menu struct or 0 480 | int 0x60 481 | 482 | mov rax , 4 483 | mov rbx , string_desktop 484 | mov rcx , 69 485 | mov rdx , 48 486 | mov r9 , 1 487 | mov rsi , 0x000000 488 | int 0x60 489 | 490 | call update_candy 491 | 492 | mov rax , 12 493 | mov rbx , 2 494 | int 0x60 495 | 496 | pop rbp rdi rsi r15 r14 r13 r12 r11 r10 r9 r8 rdx rcx rbx rax 497 | 498 | nodrawwindow: 499 | 500 | ret 501 | 502 | end if 503 | 504 | 505 | ; Data area 506 | 507 | window_label: db 'LAUNCHER',0 508 | string_desktop: db 'Setting up desktop..',0 509 | sys_parameter: db 'system_directory',0 510 | 511 | cstate: dq 0x0 512 | sysdirend: dq 0x0 513 | 514 | Param: dq 8 515 | dq 0 516 | 517 | bgr2x2: db 0x0,0x0,0x0 518 | db 0x0,0x0,0x0 519 | db 0x0,0x0,0x0 520 | db 0x0,0x0,0x0 521 | 522 | app_pointers: dq app_string_1 523 | dq app_string_2 524 | dq app_string_3 525 | app_string_1: db 'BGR ',0 526 | app_string_2: db 'MENU ',0 527 | app_string_3: db 'DESKTOP ',0 528 | boot: db 'BOOT',0 529 | 530 | sysdir: times 128 db 0 531 | 532 | image_end: 533 | 534 | -------------------------------------------------------------------------------- /usage.asm: -------------------------------------------------------------------------------- 1 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 2 | ; 3 | ; CPU usage for Menuet 4 | ; 5 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 6 | 7 | ;1218 bytes original => 956 8 | ; BUGS: 9 | ; #0 - only accurate to 2% 10 | ; #1 - TSC per second is for BSP only 11 | ; #2 - idle TSC per second is for BSP only 12 | HISTORY_LEN = 200 13 | 14 | ; format binary as "" 15 | 16 | use64 17 | 18 | db 'MENUET64' ; Header identifier 19 | dq 0x01 ; Version 20 | dq START ; Start of code 21 | dq IMG_END ; Size of image 22 | dq 0x100000 ; Memory for app 23 | dq 0x100000 ; Rsp 24 | dq 0x00 ; Prm 25 | dq 0x00 ; Icon 26 | 27 | START: 28 | 29 | mov rax , 141 30 | mov rbx , 1 31 | mov rcx , 1 32 | mov rdx , 5 shl 32 + 5 33 | mov r8 , 9 shl 32 + 12 34 | int 0x60 35 | 36 | mov rax , 140 37 | mov rbx , 2 38 | int 0x60 39 | mov [cpus],ebx 40 | 41 | mov eax,100 42 | imul ecx,[cpus],HISTORY_LEN 43 | mov edi,cpu_usage 44 | rep stosb 45 | 46 | call read_cpu_usage 47 | call drawwindow 48 | 49 | mov ecx,100 50 | 51 | still: 52 | 53 | mov eax,11 54 | int 60h 55 | 56 | test eax,1 ; Window redraw 57 | jnz redraw 58 | test eax,2 ; Keyboard press 59 | jnz keypress 60 | test eax,4 ; Button press 61 | jnz buttonpress 62 | 63 | mov eax,5 64 | movzx ebx,byte [speed] 65 | int 60h 66 | 67 | dec ecx 68 | jnz still 69 | 70 | call read_cpu_usage 71 | call draw_usage 72 | 73 | mov ecx,100 74 | 75 | jmp still 76 | 77 | redraw: 78 | 79 | call drawwindow 80 | 81 | jmp still 82 | 83 | keypress: 84 | 85 | push rcx 86 | mov eax,0x2 87 | int 60h 88 | pop rcx 89 | 90 | jmp still 91 | 92 | buttonpress: 93 | 94 | push rcx 95 | mov eax,17 96 | int 60h 97 | pop rcx 98 | 99 | ; rax = status 100 | ; rbx = button id 101 | 102 | cmp ebx,0x10000001 103 | jne L005 104 | mov eax,0x200 105 | int 60h 106 | L005: 107 | 108 | mov eax,speed 109 | cmp ebx,0x102 110 | jne @f 111 | mov [upd1+1],byte '>' 112 | mov [upd2+1],byte ' ' 113 | mov [upd3+1],byte ' ' 114 | mov byte[rax],1 115 | @@: 116 | cmp ebx,0x103 117 | jne @f 118 | mov [upd1+1],byte ' ' 119 | mov [upd2+1],byte '>' 120 | mov [upd3+1],byte ' ' 121 | mov byte[rax],2 122 | @@: 123 | cmp ebx,0x104 124 | jne @f 125 | mov [upd1+1],byte ' ' 126 | mov [upd2+1],byte ' ' 127 | mov [upd3+1],byte '>' 128 | mov byte[rax],4 129 | @@: 130 | 131 | cmp ebx,0x106 132 | jne @f 133 | mov [prs1+1],byte '>' 134 | mov [prs2+1],byte ' ' 135 | @@: 136 | cmp ebx,0x107 137 | jne @f 138 | mov [prs1+1],byte ' ' 139 | mov [prs2+1],byte '>' 140 | @@: 141 | 142 | cmp ebx,0x109 143 | jne @f 144 | mov [tbr1+1],byte '>' 145 | mov [tbr2+1],byte ' ' 146 | @@: 147 | cmp ebx,0x10a 148 | jne @f 149 | mov [tbr1+1],byte ' ' 150 | mov [tbr2+1],byte '>' 151 | @@: 152 | 153 | cmp ebx,0x100 154 | jb no_menu_selection 155 | cmp ebx,0x110 156 | jg no_menu_selection 157 | push rcx 158 | call draw_usage 159 | pop rcx 160 | jmp still 161 | no_menu_selection: 162 | 163 | jmp still 164 | 165 | drawwindow: 166 | 167 | push rcx 168 | 169 | mov eax,12 170 | mov ebx,1 171 | int 60h 172 | 173 | xor eax,eax 174 | mov rbx, 11Dh shl 32 + HISTORY_LEN+10 175 | mov ecx , [cpus] 176 | cmp ecx , 3 177 | jb noincwidth 178 | cmp ecx , 4 179 | jbe cpumaxfine 180 | mov ecx , 4 181 | cpumaxfine: 182 | sub rcx , 2 183 | imul rcx , (HISTORY_LEN/2) 184 | add bx , cx 185 | noincwidth: 186 | 187 | mov rcx, 18h shl 32 + 92h 188 | mov edx,0FFFFFFh 189 | mov r8d,1 190 | mov r9d,title 191 | mov r10d,menu_struct 192 | int 60h 193 | 194 | mov eax,111 195 | mov ebx,1 196 | int 60h 197 | 198 | mov ecx,eax 199 | mov eax,9 200 | mov ebx,2 201 | mov edx,process_p 202 | mov r8d,32 203 | int 60h 204 | sub [process_p+16],10 205 | 206 | xor edx,edx 207 | mov ebx,[cpus] 208 | mov eax,dword[process_p+16] 209 | div ebx 210 | cmp eax,HISTORY_LEN 211 | jc @f 212 | mov eax,HISTORY_LEN 213 | @@: 214 | mov [width_cpu],eax 215 | 216 | call draw_usage 217 | 218 | mov eax,12 219 | mov ebx,2 220 | int 60h 221 | 222 | pop rcx 223 | ret 224 | 225 | 226 | read_cpu_usage: 227 | 228 | cld 229 | imul ecx,[cpus],HISTORY_LEN 230 | sub ecx,1 231 | mov esi,cpu_usage+1 232 | mov edi,cpu_usage 233 | rep movsb 234 | 235 | mov eax,26; return system info 236 | mov ebx,1 ; 237 | mov ecx,sys_info; - where to return 238 | mov edx,256; - bytes to return 239 | int 60h 240 | 241 | ; TSC/second/100 242 | ; BUG#1: 243 | 244 | mov rax ,[sys_info+184] ; @184: TSC per second 245 | xor edx,edx 246 | mov ebx,100 247 | div rbx 248 | mov r15,rax 249 | 250 | ; idle TSC/second 251 | ; BUG#2: 252 | 253 | mov rax ,[sys_info+168] 254 | xor edx,edx 255 | div r15 ;idle/TSC_per_sec 256 | 257 | mov ecx,1 258 | imul ebx,ecx,HISTORY_LEN 259 | mov [cpu_usage+ebx-2],al 260 | mov [cpu_usage+ebx-1],byte 100 261 | 262 | cmp byte [cpus],byte 1 263 | jbe counted 264 | 265 | mov ecx, 2 266 | tsc: 267 | mov eax,9 268 | mov ebx,1 269 | mov edx,prc_info 270 | mov r8d,728 271 | int 60h 272 | 273 | xor edx,edx 274 | mov rax,[prc_info+720] 275 | mov rbx,rax 276 | div r15 277 | cmp al,100 278 | jc @f 279 | mov al,100 280 | @@: 281 | imul ebx,ecx,HISTORY_LEN 282 | mov [cpu_usage+ebx-2],al 283 | mov [cpu_usage+ebx-1],byte 100 284 | 285 | add ecx , 1 286 | cmp ecx , [cpus] 287 | jbe tsc 288 | 289 | counted: 290 | 291 | ret 292 | 293 | 294 | draw_usage: 295 | 296 | xor r13,r13 297 | cpu_n: 298 | mov ebx,r13d 299 | imul ebx,[width_cpu] 300 | add ebx,5 301 | add r13,1 302 | 303 | push rbx 304 | mov eax,38 305 | mov ebx,r13d 306 | imul ebx,[width_cpu] 307 | add ebx,5 308 | mov edx,ebx 309 | mov ecx,38 ;Y1 310 | mov r8d,139 ;Y2 311 | mov r9d,0CCCCCCh 312 | 313 | cmp r13d , [cpus] 314 | je novertical 315 | int 60h ;Vertical line 316 | novertical: 317 | 318 | imul r11d,r13d,HISTORY_LEN 319 | add r11,cpu_usage 320 | lea r12,[r11-1] ;cache graph end 321 | cmp [tbr2+1],byte '>' 322 | jne @f 323 | dec r12 324 | @@: 325 | sub r11d,[width_cpu] ;r11=cpu_usage+HISTORY_LEN*CPU#-w_cpu 326 | pop rbx 327 | 328 | inc r11 329 | inc rbx 330 | 331 | ; Clear first vertical line 332 | 333 | push rdx 334 | mov rdx , rbx 335 | call clear_to_white 336 | pop rdx 337 | 338 | ; Place (x) to display prosentage 339 | 340 | mov rbp , r11 341 | add rbp , 20 342 | 343 | lea edx,[rbx+1] 344 | newline: 345 | mov ecx,39 ;Y1 346 | mov r8d,ecx 347 | movzx r10, byte [r11] 348 | add rcx,r10 349 | movzx r10, byte [r11+1] 350 | add r8,r10 351 | xor r9,r9 352 | push rdx 353 | cmp [tbr1+1],byte '>' 354 | jne nobar 355 | dec rdx 356 | mov r8d, 139 357 | nobar: 358 | ; Clear vertical line 359 | push rbx 360 | mov rbx , rdx 361 | call clear_to_white 362 | pop rbx 363 | ; 364 | int 60h ; draw one graph tick 365 | pop rdx 366 | 367 | cmp r11, rbp 368 | je draw_prosentage 369 | return_prosentage: 370 | 371 | add r11,1 372 | add ebx,1 373 | add edx,1 374 | cmp r11,r12 ; read to the end of history 375 | jb newline 376 | cmp r13d,[cpus] 377 | jc cpu_n 378 | 379 | mov eax,38 380 | mov ebx,5 381 | mov ecx,140 382 | sub edx,1 ; use tick-loop's side-effect 383 | mov r8d,ecx 384 | mov r9d,0CCCCCCh 385 | int 60h ; horizontal line below graph 386 | 387 | ret 388 | 389 | 390 | draw_prosentage: 391 | 392 | push rax rbx rcx rdx rsi 393 | 394 | mov rcx , r13 395 | 396 | imul ebx,ecx,HISTORY_LEN 397 | mov al,[cpu_usage+ebx-2] 398 | and eax,0xff 399 | 400 | push rcx 401 | mov ecx,100 402 | sub ecx,eax 403 | cmp ecx,99 404 | jbe @f 405 | mov ecx,99 406 | @@: 407 | mov eax,47 408 | mov ebx,2 shl 16 + 0 shl 8 + 0 409 | mov edx,[rsp] 410 | sub edx,1 411 | imul edx,[width_cpu] 412 | add edx,10 413 | shl rdx,32 414 | add rdx,43 415 | 416 | mov esi,0CCCCCCh 417 | 418 | cmp [prs1+1],byte '>' 419 | jne @f 420 | push rax rbx rcx rdx 421 | mov rax , 13 422 | mov rbx , rdx 423 | mov rcx , rdx 424 | shr rbx , 32 425 | sub rbx , 2 426 | shl rbx , 32 427 | add rbx , 13+2 428 | sub rcx , 2 429 | shl rcx , 32 430 | add rcx , 9+2 431 | mov rdx , 0xffffff 432 | int 0x60 433 | pop rdx rcx rbx rax 434 | int 60h 435 | @@: 436 | pop rcx 437 | 438 | pop rsi rdx rcx rbx rax 439 | 440 | jmp return_prosentage 441 | 442 | 443 | clear_to_white: 444 | 445 | push rcx r8 r9 446 | mov ecx , 38 447 | mov r8d , 139 448 | mov r9d , 0xffffff 449 | int 0x60 450 | pop r9 r8 rcx 451 | 452 | ret 453 | 454 | 455 | ; Data area 456 | 457 | title db 'CPU USAGE',0 458 | speed db 1 459 | 460 | menu_struct: 461 | 462 | dq 0 ; Menu Struct -version 463 | 464 | dq 0x100 ; Start value of ID to return ( ID + Line ) 465 | 466 | db 0,'SETUP',0 467 | upd1: db 1,'> Update 1s',0 468 | upd2: db 1,' Update 2s',0 469 | upd3: db 1,' Update 4s',0 470 | db 1,'-',0 471 | prs1: db 1,' Show percentage',0 472 | prs2: db 1,'> Hide percentage',0 473 | db 1,'-',0 474 | tbr1: db 1,'> Bar',0 475 | tbr2: db 1,' Line',0 476 | 477 | db 255 ; End of Menu 478 | 479 | cpus rd 1 480 | width_cpu rd 1 481 | process_p rq 16 482 | sys_info: rb 256 483 | prc_info: rb 728 484 | cpu_usage rb HISTORY_LEN*8 ; max 8 CPUs 485 | 486 | IMG_END: 487 | 488 | -------------------------------------------------------------------------------- /fract.asm: -------------------------------------------------------------------------------- 1 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 2 | ; 3 | ; Mandelbrot fractal 4 | ; 5 | ; Compile with FASM 1.60 or above 6 | ; 7 | ; Based on TinyDemo by Andreas Agorander 8 | ; 9 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 10 | 11 | use64 12 | 13 | org 0x0 14 | 15 | db 'MENUET64' ; Header identifier 16 | dq 0x01 ; Version 17 | dq START ; Start of code 18 | dq image_end ; Size of image 19 | dq 0x200000 ; Memory for app 20 | dq 0x1ffff0 ; Esp 21 | dq 0x00 ; Prm 22 | dq 0x00 ; Icon 23 | 24 | START: 25 | 26 | mov rax , 141 27 | mov rbx , 1 28 | mov rcx , 1 29 | mov rdx , 5 shl 32 + 5 30 | mov r8 , 9 shl 32 + 12 31 | int 0x60 32 | 33 | call draw_window ; At first, draw the window 34 | 35 | call calculate_fractal 36 | 37 | still: 38 | 39 | mov rax , 10 ; Wait here for event 40 | int 0x60 41 | 42 | test rax , 0x1 ; Window redraw 43 | jnz window_event 44 | test rax , 0x2 ; Keyboard press 45 | jnz key_event 46 | test rax , 0x4 ; Button press 47 | jnz button_event 48 | 49 | jmp still 50 | 51 | window_event: 52 | 53 | call draw_window 54 | jmp still 55 | 56 | key_event: 57 | 58 | mov rax , 0x2 ; Read the key and ignore 59 | int 0x60 60 | 61 | jmp still 62 | 63 | 64 | sprite equ 32768 65 | 66 | mandel_calculate: 67 | 68 | finit 69 | 70 | ; First, calculate the floating point value of the current 71 | ; pixel -2 to 2 for 0-127 72 | 73 | sub [curx],word 128 74 | sub [cury],word 128 75 | 76 | fld1 ;ST0 = 1 77 | fidiv word [fdivc];ST0 = 1/32 78 | fst ST1;ST1 = 1/32 79 | fimul word [curx];ST0 = 1/32*curx 80 | fisub word [two];ST0 = 1/32*curx-2 81 | fst ST6;ST6 = --- " --- 82 | fxch;ST0 = 1/32 , ST1 = 1/16*curx-4 83 | fimul word [cury];ST0 = 1/32*cury 84 | fisub word [two];ST0 = 1/32*cury-2 85 | fst ST7;ST7 = --- " --- 86 | 87 | ; cury is now in ST0 and curx in ST1 88 | 89 | add [curx],word 128 90 | add [cury],word 128 91 | 92 | mov cx,[numiter] 93 | 94 | iteration: 95 | 96 | ; The new values for the pixel is calculated 97 | ; curx is the real part and cury the imaginary part 98 | ; 99 | ; Formula: 100 | ; 101 | ; curx = curx^2 - cury^2 + curx 102 | ; cury = 2*curx*cury + cury 103 | ; ST0 = ST7 = cury 104 | ; ST1 = ST6 = curx 105 | 106 | fst ST2;cury 107 | fxch 108 | fst ST3;curx 109 | 110 | ;ST0 = ST3 = ST6 = curx 111 | ;ST1 = ST2 = ST7 = cury 112 | 113 | fmul st0 , st0 ; 114 | fxch ;ST0 = cury , ST1 = curx^2 115 | fmul ST0 , st0 116 | fxch ;ST0 = curx^2 , ST1 = cury^2 117 | fsub st0 , st1 ;curx^2 - cury^2 118 | fadd st0 , st6 ;curx^2 - cury^2 + curx 119 | fst ST4;ST4 = curx^2 - cury^2 + curx 120 | 121 | ;ST0 = ST4 = curx^2 - cury^2 + curx 122 | ;ST1 = curx^2 123 | ;ST2 = ST7 = cury 124 | ;ST3 = ST6 = curx 125 | ; 126 | ; Now for the imaginary part 127 | 128 | fxch ST2 ;cury -> ST0 129 | fmul st0 , st3 ; urx 130 | fimul word [two] ; 2*cury*curx 131 | fadd st0 , st7 ; *curx + cury 132 | 133 | ;ST0 = 2*cury*curx + cury 134 | ;ST1 = curx^2 135 | ;ST2 = curx^2 - cury^2 + curx 136 | ;ST3 = ST6 = curx 137 | ;ST4 = curx^2 - cury^2 + curx 138 | ;ST7 = cury 139 | ; 140 | ; Now ST0 contains the new cury and ST4 contains the new curx 141 | ; Time to check if the distance from origo is more than 2 142 | 143 | fst ST2;cury -> ST2 144 | fabs 145 | fxch ST4 146 | fst ST3;curx -> ST3 147 | fabs 148 | fadd st0 , st4 149 | ficom word [two] 150 | fstsw ax 151 | 152 | test ax , 0000000000000001b 153 | jnz enditer 154 | 155 | fxch ST3 156 | fxch ST1 157 | fxch ST2 158 | 159 | ; Next iteration 160 | 161 | loop iteration 162 | 163 | enditer: 164 | 165 | ; Calculate pixel position in sprite 166 | 167 | mov esi , 0 168 | 169 | mov ax, [cury] 170 | sub ax, [starty] 171 | shl ax, 8 172 | add si, ax 173 | mov bx, [curx] 174 | sub bx, [startx] 175 | add si, bx 176 | 177 | ; Paint pixel 178 | 179 | and esi , 0xffff 180 | 181 | and ecx , 0xff 182 | shl ecx , 3+16 183 | 184 | imul esi , 3 185 | mov [sprite+esi],ecx 186 | 187 | ; Now increase curx and cury to correct values 188 | 189 | mov ax , [cury] 190 | mov bx , [curx] 191 | 192 | inc ax 193 | 194 | mov cx , [starty] 195 | add cx , 256 196 | 197 | cmp ax , cx 198 | jb contx 199 | 200 | mov ax,[starty] 201 | 202 | inc bx 203 | 204 | contx: 205 | 206 | mov [curx], bx 207 | mov [cury], ax 208 | 209 | ret 210 | 211 | 212 | calculate_fractal: 213 | 214 | mov ax , [scroll2] 215 | sub ax , 2000 216 | mov [sx],ax 217 | 218 | mov ax , [scroll3] 219 | sub ax , 3000 220 | mov [sy],ax 221 | 222 | mov ax , [scroll1] 223 | sub ax , 999 224 | mov bx , 64 225 | imul bx , ax 226 | mov [fdivc],bx 227 | 228 | newpicture: 229 | 230 | mov rax , [fdivc] 231 | and rax , 0xffff 232 | xor rdx , rdx 233 | mov rbx , 64 234 | div rbx 235 | 236 | mov bx , [sx] 237 | imul bx , ax 238 | add bx , dx 239 | mov [startx],bx 240 | 241 | mov bx , [sy] 242 | imul bx , ax 243 | mov [starty],bx 244 | 245 | mov ax , [startx] 246 | mov bx , [starty] 247 | 248 | mov [curx],ax 249 | mov [cury],bx 250 | 251 | call draw_pic 252 | 253 | ; 254 | 255 | mov rcx , 256*256 256 | 257 | il0: 258 | 259 | push rcx 260 | 261 | call mandel_calculate 262 | 263 | pop rcx 264 | 265 | loop il0 266 | 267 | nomore: 268 | 269 | call draw_pic 270 | 271 | ;mov ax , [fdivc] 272 | ;add ax , 64 273 | ;mov [fdivc],ax 274 | 275 | ret 276 | 277 | 278 | draw_pic: 279 | 280 | mov rax , 7 281 | mov rbx , 22 * 0x100000000 + 256 282 | mov rcx , 60 * 0x100000000 + 256 283 | mov rdx , 32768 284 | mov r8 , 0 285 | mov r9 , 0x1000000 286 | mov r10 , 3 287 | int 0x60 288 | 289 | ret 290 | 291 | 292 | button_event: 293 | 294 | mov rax , 0x11 295 | int 0x60 296 | 297 | ; rax = status 298 | ; rbx = button id 299 | 300 | cmp rbx , 1000 ; Vertical scroll values 300-319 301 | jb no_vertical_scroll 302 | cmp rbx , 1999 303 | ja no_vertical_scroll 304 | mov [scroll1], rbx 305 | call draw_scroll1 306 | call calculate_fractal 307 | jmp still 308 | no_vertical_scroll: 309 | 310 | cmp rbx , 2000 311 | jb nosc2 312 | cmp rbx , 2999 313 | ja nosc2 314 | mov [scroll2],rbx 315 | call draw_scroll2 316 | call calculate_fractal 317 | jmp still 318 | nosc2: 319 | 320 | cmp rbx , 3000 321 | jb nosc3 322 | cmp rbx , 3999 323 | ja nosc3 324 | mov [scroll3],rbx 325 | call draw_scroll3 326 | call calculate_fractal 327 | jmp still 328 | nosc3: 329 | 330 | cmp rbx , 0x10000001 331 | jne no_application_terminate_button 332 | mov rax , 512 333 | int 0x60 334 | no_application_terminate_button: 335 | 336 | cmp rbx , 0x105 ; Menu 337 | jne no_application_terminate_menu 338 | mov rax , 0x200 339 | int 0x60 340 | no_application_terminate_menu: 341 | 342 | jmp still 343 | 344 | 345 | draw_window: 346 | 347 | mov rax , 0xC ; Beginning of window draw 348 | mov rbx , 0x1 349 | int 0x60 350 | 351 | mov rax , 0x0 ; Draw window 352 | mov rbx , 125*0x100000000+300 ; x start & size 353 | mov rcx , 40*0x100000000+410 ; y start & size 354 | mov rdx , 0x0000000000ffffff ; type & border color 355 | mov r8 , 0x0000000000000001 ; draw flags 356 | mov r9 , window_label ; 0 or label - asciiz 357 | mov r10 , menu_struct ; 0 or pointer to menu struct 358 | int 0x60 359 | 360 | call draw_pic 361 | 362 | call draw_scroll1 363 | call draw_scroll2 364 | call draw_scroll3 365 | 366 | mov rax , 12 367 | mov rbx , 2 368 | int 0x60 369 | 370 | ret 371 | 372 | 373 | draw_scroll1: 374 | 375 | mov rcx , 1000 376 | mov r9 , 335 377 | mov r8 , [scroll1] 378 | 379 | jmp scroll 380 | 381 | draw_scroll2: 382 | 383 | mov rcx , 2000 384 | mov r9 , 355 385 | mov r8 , [scroll2] 386 | 387 | jmp scroll 388 | 389 | draw_scroll3: 390 | 391 | mov rcx , 3000 392 | mov r9 , 375 393 | mov r8 , [scroll3] 394 | 395 | jmp scroll 396 | 397 | scroll: 398 | 399 | mov rax , 113 400 | mov rbx , 2 401 | mov rdx , 180 402 | mov r10 , 22 403 | mov r11 , 235 404 | int 0x60 405 | 406 | mov rax , 13 407 | mov rbx , 261*0x100000000+3*6 408 | mov rcx , r9 409 | shl rcx , 32 410 | add rcx , 3+10 411 | mov rdx , 0xffffff 412 | int 0x60 413 | 414 | mov rax , 47 415 | mov rbx , 3 * 65536 416 | mov rcx , r8 417 | mov rdx , 261 * 65536 418 | add rdx , r9 419 | add rdx , 3 420 | mov rsi , 0x000000 421 | int 0x40 422 | 423 | ret 424 | 425 | 426 | window_label: 427 | 428 | db 'MANDELBROT FRACTAL',0 429 | 430 | scroll1: 431 | 432 | dq 1000 + 6 433 | 434 | scroll2: 435 | 436 | dq 2000 + 120 437 | 438 | scroll3: 439 | 440 | dq 3000 + 70 441 | 442 | fdivc: dw 64 443 | two: dw 2 444 | curx: dw 0 445 | cury: dw 0 446 | numiter: dw 255 447 | 448 | startx: dw 0 449 | starty: dw 0 450 | 451 | sx: dw 0 452 | sy: dw 0 453 | 454 | menu_struct: ; Menu Struct 455 | 456 | dq 0 ; Version 457 | 458 | dq 0x100 ; Start value of ID to return ( ID + Line ) 459 | 460 | ; Returned when menu closes and 461 | ; user made no selections. 462 | 463 | db 0,'FILE',0 ; ID = 0x100 + 1 464 | db 1,'New',0 ; ID = 0x100 + 2 465 | db 1,'Open..',0 ; ID = 0x100 + 3 466 | db 1,'-',0 ; ID = 0x100 + 4 467 | db 1,'Quit',0 ; ID = 0x100 + 5 468 | 469 | db 255 ; End of Menu Struct 470 | 471 | image_end: 472 | 473 | --------------------------------------------------------------------------------