Last active
June 6, 2025 21:27
-
-
Save arkenidar/b8c1106b3a5828022299e7d7e646c4cd to your computer and use it in GitHub Desktop.
TASM 5.0 -- https://winworldpc.com/product/turbo-assembler/5x -- TURBO ASSEMBLER 5.0 -- TASM 5.0 -- WAP.ASM : Windows Application Example in Assembly
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
rm -rf combined | |
mkdir combined disk1 disk2 disk3 | |
sudo mount ../disk01.img disk1 | |
sudo mount ../disk02.img disk2 | |
sudo mount ../disk03.img disk3 | |
cp -r disk1/* disk2/* disk3/* combined/ | |
sudo umount disk1 disk2 disk3 | |
rmdir disk1 disk2 disk3 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
; Copyright (c) 1993 by Borland International, Inc. | |
; | |
; * Borland Turbo Assembler 4.0 * | |
; | |
; * Windows Application Example in Assembly * | |
; | |
; This example (WAP.ASM) will put up a window and beep when the | |
; right mouse button is pressed. When the left mouse button is | |
; pressed, it will put up a message box. | |
; | |
locals | |
jumps | |
.model large, WINDOWS PASCAL | |
include windows.inc | |
extrn BEGINPAINT:PROC | |
extrn CREATEWINDOW:PROC | |
extrn DEFWINDOWPROC:PROC | |
extrn DISPATCHMESSAGE:PROC | |
extrn ENDPAINT:PROC | |
extrn GETMESSAGE:PROC | |
extrn GETSTOCKOBJECT:PROC | |
extrn INITAPP:PROC | |
extrn INITTASK:PROC | |
extrn INVALIDATERECT:PROC | |
extrn LOADCURSOR:PROC | |
extrn MESSAGEBEEP:PROC | |
extrn MESSAGEBOX:PROC | |
extrn POSTQUITMESSAGE:PROC | |
extrn REGISTERCLASS:PROC | |
extrn SHOWWINDOW:PROC | |
extrn TEXTOUT:PROC | |
extrn TRANSLATEMESSAGE:PROC | |
extrn UPDATEWINDOW:PROC | |
extrn WAITEVENT:PROC | |
.data | |
db 16 dup (0) ; Filler for Windows Task manager. | |
; This *MUST* be declared, otherwise | |
; Windows will clobber part of your data | |
; segment. For additional information on | |
; Windows Task managment and what | |
; happens when Windows apps start up, see | |
; "Windows Internals" - Matt Pietrek, | |
; 1993 Addison Wesley | |
psp dw ? | |
pszCmdline dw ? | |
hPrev dw ? | |
hInstance dw ? | |
cmdShow dw ? | |
newhwnd dw 0 | |
lppaint PAINTSTRUCT <0> | |
msg MSGSTRUCT <0> | |
wc WNDCLASS <0> | |
mbx_count dw 0 | |
szTitleName db 'Windows Assembly Program',0 | |
szClassName db 'ASMCLASS',0 | |
szMsg db 'Hello there folks',0 | |
szCapt db 'Left Mouse',0 | |
szPaint db 'There are ' | |
s_num db '0 MessageBoxes waiting.',0 | |
MSG_L EQU ($-offset szPaint)-1 | |
.code | |
.286 | |
;----------------------------------------------------------------------------- | |
start: | |
mov ax, @data | |
mov ds, ax ; set up data segment | |
;Windows initialization. Sets up registers and stack. | |
;INITTASK returns: | |
; Failure: | |
; AX = zero if it failed | |
; Success: | |
; AX = 1 | |
; CX = stack limit | |
; DX = cmdShow parameter to CreateWindow | |
; ES:BX = -> DOS format command line (ES = PSP address) | |
; SI = hPrevinstance | |
; DI = hinstance | |
call INITTASK | |
or ax,ax | |
jnz @@OK | |
jmp @@Fail | |
@@OK: mov [psp],es | |
mov word ptr [pszCmdline],bx | |
mov [hPrev],si | |
mov [hInstance],di | |
mov [cmdShow],dx | |
;Initialize the Windows App | |
xor ax,ax | |
push ax | |
call WAITEVENT | |
push [hInstance] | |
call INITAPP | |
or ax,ax | |
jnz @@InitOK | |
@@Fail: | |
mov ax, 4CFFh | |
int 21h ; terminate program | |
@@InitOK: | |
;----------------------------------------------------------------------------- | |
; This is generally where WinMain is called. We won't use a WinMain, since | |
; this app is 100% assembly. | |
cmp [hPrev], 0 | |
jne already_running | |
; initialize the WndClass structure | |
mov [wc.clsStyle], CS_HREDRAW + CS_VREDRAW | |
mov word ptr [wc.clsLpfnWndProc], offset WndProc | |
mov word ptr [wc.clsLpfnWndProc+2], seg WndProc | |
mov [wc.clsCbClsExtra], 0 | |
mov [wc.clsCbWndExtra], 0 | |
mov ax, [hInstance] | |
mov [wc.clsHInstance], ax | |
mov [wc.clsHIcon], 0 | |
push 0 | |
push IDC_ARROW | |
call LOADCURSOR | |
mov [wc.clsHCursor], ax | |
push WHITE_BRUSH | |
call GETSTOCKOBJECT | |
mov [wc.clsHbrBackground], ax | |
mov word ptr [wc.clsLpszMenuName], 0 | |
mov word ptr [wc.clsLpszMenuName+2], 0 | |
mov word ptr [wc.clsLpszClassName], offset szClassName | |
mov word ptr [wc.clsLpszClassName+2], ds | |
push ds | |
push offset wc | |
call REGISTERCLASS | |
already_running: | |
push ds | |
push offset szClassName ; Class name | |
push ds | |
push offset szTitleName ; Title string | |
push WS_OVERLAPPEDWINDOW+WS_VISIBLE ; high word of Style | |
push 0 ; low word of Style | |
push CW_USEDEFAULT ; x | |
push CW_USEDEFAULT ; y | |
push CW_USEDEFAULT ; width | |
push CW_USEDEFAULT ; height | |
push 0 ; parent hwnd | |
push 0 ; menu | |
push [hInstance] ; hInstance | |
push 0 ; lpParam | |
push 0 ; lpParam | |
call CREATEWINDOW | |
mov [newhwnd], ax | |
push [newhwnd] | |
push [cmdShow] | |
call SHOWWINDOW | |
push [newhwnd] | |
call UPDATEWINDOW | |
msg_loop: | |
push ds | |
push offset msg | |
push 0 | |
push 0 | |
push 0 | |
call GETMESSAGE | |
cmp ax, 0 | |
je end_loop | |
push ds | |
push offset msg | |
call TRANSLATEMESSAGE | |
push ds | |
push offset msg | |
call DISPATCHMESSAGE | |
jmp msg_loop | |
end_loop: | |
mov ax, [msg.msWPARAM] | |
mov ah, 4Ch | |
int 21h | |
;----------------------------------------------------------------------------- | |
WndProc proc hwnd:WORD, wmsg:WORD, wparam:WORD, lparam:DWORD | |
cmp [wmsg], WM_DESTROY | |
je wmdestroy | |
cmp [wmsg], WM_LBUTTONDOWN | |
je wmlbuttondown | |
cmp [wmsg], WM_CREATE | |
je wmcreate | |
cmp [wmsg], WM_RBUTTONDOWN | |
je wmrbuttondown | |
cmp [wmsg], WM_PAINT | |
je wmpaint | |
jmp defwndproc | |
wmpaint: | |
push [hwnd] | |
push ds | |
push offset lppaint | |
call BEGINPAINT | |
push ax ; the DC | |
mov bx, [mbx_count] | |
add bl, '0' | |
mov [s_num], bl | |
push 5 ; x | |
push 5 ; y | |
push ds | |
push offset szPaint ; string | |
push MSG_L ; length of string | |
call TEXTOUT | |
push [hwnd] | |
push ds | |
push offset lppaint | |
call ENDPAINT | |
mov ax, 0 | |
jmp finish | |
wmcreate: | |
mov ax, 0 | |
jmp finish | |
defwndproc: | |
push hwnd | |
push wmsg | |
push wparam | |
push lparam | |
call DEFWINDOWPROC | |
jmp finish | |
wmdestroy: | |
push 0 | |
call POSTQUITMESSAGE | |
mov ax, 0 | |
jmp finish | |
wmlbuttondown: | |
cmp [mbx_count], 5 | |
jae finish | |
inc [mbx_count] | |
push [hwnd] | |
push 0 | |
push 0 | |
push 0 | |
call INVALIDATERECT ; repaint window | |
push 0 | |
push ds | |
push offset szMsg | |
push ds | |
push offset szCapt | |
push 0 | |
call MESSAGEBOX ; put up msgbox and wait | |
mov ax, 0 | |
dec [mbx_count] | |
push [hwnd] | |
push 0 | |
push 0 | |
push 0 | |
call INVALIDATERECT ; repaint window again | |
jmp finish | |
wmrbuttondown: | |
push 0 | |
call MESSAGEBEEP | |
jmp finish | |
finish: | |
mov dx, 0 | |
ret | |
WndProc endp | |
;----------------------------------------------------------------------------- | |
public WndProc | |
ends | |
end start | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment