You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
243 lines
4.5 KiB
NASM
243 lines
4.5 KiB
NASM
[org 0x1000]
|
|
|
|
start:
|
|
mov [bootdev], dl
|
|
mov ah, 01h ;make cursor invisible
|
|
mov cx, 2607h
|
|
int 10h
|
|
|
|
mov ah, 06h ; Scroll up function
|
|
xor al, al ; Clear entire screen
|
|
xor cx, cx ; Upper left corner CH=row, CL=column
|
|
mov dx, 184FH ; lower right corner DH=row, DL=column
|
|
mov bh, 1Eh ; YellowOnBlue
|
|
int 10H ; execute interrupt
|
|
|
|
mov ah, 06h ;draw rect on background
|
|
mov cx, 0101h
|
|
mov dx, 124Dh
|
|
mov bh, 3Eh
|
|
int 10h
|
|
|
|
mov ah, 06h ;draw shadow
|
|
mov cx, 1302h
|
|
mov dx, 134Eh
|
|
mov bh, 0Eh
|
|
int 10h
|
|
mov ah, 06h ;draw shadow
|
|
mov cx, 024Eh
|
|
mov dx, 134Eh
|
|
mov bh, 0Eh
|
|
int 10h
|
|
|
|
|
|
; menu bottom
|
|
mov ah, 06h ;draw rect on background
|
|
mov cx, 1700h
|
|
mov dx, 184Fh
|
|
mov bh, 3Fh
|
|
int 10h
|
|
|
|
mov ah, 02h ;sets cursor to top to write
|
|
mov bh, 0h
|
|
mov dh, 17h
|
|
mov dl, 2h
|
|
int 10h
|
|
mov si, menuhelp
|
|
call print
|
|
|
|
mov si, menuselect
|
|
call print
|
|
|
|
mov si, menuexit
|
|
call print
|
|
|
|
mov si, menuenter
|
|
call print
|
|
|
|
mov ah, 02h ;sets cursor to top to write
|
|
mov bh, 0h
|
|
mov dh, 4h
|
|
mov dl, 4h
|
|
int 10h
|
|
|
|
mov si, msg1
|
|
call print
|
|
|
|
|
|
print_projects:
|
|
mov ah, 02h ;sets cursor to top to write
|
|
mov bh, 0h
|
|
mov dh, 6h ;row
|
|
mov dl, 4h ;col
|
|
int 10h
|
|
|
|
xor bx, bx ; Starting at offset zero
|
|
lea di, [projects] ; RDI now has the address of the array
|
|
|
|
.loop
|
|
mov [storebx], bx
|
|
mov ah, 02h
|
|
;mov bh, 0h
|
|
add dh, 1h ;move cursor down
|
|
mov dl, 4h;
|
|
int 10h
|
|
|
|
mov ax, [currentselection]
|
|
cmp ax, bx
|
|
jne .normalbackground
|
|
mov ah, 06h ;draw rect on background
|
|
mov ch, dh
|
|
mov cl, 4h
|
|
mov dl, 24h
|
|
mov bh, 7Ch
|
|
int 10h
|
|
jmp .drawstring
|
|
|
|
.normalbackground
|
|
mov ah, 06h ;draw rect on background
|
|
mov ch, dh
|
|
mov cl, 4h
|
|
mov dl, 24h
|
|
mov bh, 1Eh
|
|
int 10h
|
|
jmp .drawstring
|
|
|
|
.drawstring
|
|
mov bx, [storebx]
|
|
mov si, [di+bx] ; Get the address of string1
|
|
call print
|
|
add bx, 8
|
|
cmp bx, 48
|
|
jne .loop
|
|
|
|
jmp waitforkey
|
|
|
|
|
|
waitforkey:
|
|
mov ah, 0x00
|
|
int 0x16
|
|
cmp ah, 1Fh
|
|
je .up
|
|
cmp ah, 11h
|
|
je .down
|
|
cmp ah, 1Ch
|
|
je loadproject
|
|
jmp waitforkey
|
|
|
|
.up
|
|
mov ax, [currentselection]
|
|
cmp ax, 40
|
|
je .reup
|
|
add ax, 8
|
|
mov [currentselection], ax
|
|
jmp print_projects
|
|
|
|
.reup
|
|
mov ax, 0
|
|
mov [currentselection], ax
|
|
jmp print_projects
|
|
|
|
|
|
.down
|
|
mov ax, [currentselection]
|
|
cmp ax, 0
|
|
je .redown
|
|
sub ax, 8
|
|
mov [currentselection], ax
|
|
jmp print_projects
|
|
|
|
.redown
|
|
mov ax, 40
|
|
mov [currentselection], ax
|
|
jmp print_projects
|
|
|
|
|
|
|
|
|
|
loadproject:
|
|
|
|
|
|
mov bx, [currentselection]
|
|
|
|
pushf
|
|
stc
|
|
|
|
mov ah,00
|
|
int 13h
|
|
|
|
.read_sector:
|
|
mov ax, 0x0
|
|
mov es, ax ; ES = 0
|
|
mov bx, 0x2000 ; BX = 0x1000. ES:BX=0x0:0x1000
|
|
; ES:BX = starting address to read sector(s) in$
|
|
mov ah, 02 ; Int 13h/AH=2 = Read Sectors From Drive;
|
|
mov al, 0x10 ; Sectors to read = 1
|
|
mov ch, 00 ; CH=Cylinder. Second sector of disk
|
|
; is at Cylinder 0 not 1
|
|
mov cl, 04 ; Sector to read = 2
|
|
mov dh, 00 ; Head to read = 0
|
|
|
|
mov dl, [bootdev]
|
|
int 13h
|
|
|
|
|
|
jc wolf_error
|
|
popf
|
|
jmp 0x0:0x2000
|
|
cli
|
|
hlt
|
|
|
|
|
|
wolf_error:
|
|
mov si, wolf_error_msg
|
|
call print
|
|
mov si, wolf_error_msg1
|
|
call print
|
|
mov ah,00
|
|
int 16h
|
|
xor ax,ax
|
|
int 19h
|
|
|
|
|
|
|
|
print:
|
|
lodsb
|
|
or al,al
|
|
jz exit
|
|
mov ah,0x0e
|
|
int 10h
|
|
jmp print
|
|
exit:
|
|
ret
|
|
|
|
msg1 db "ARTIST / TITLE",0
|
|
|
|
project1 db "Name / Exampletitle of this",0
|
|
project2 db "Name2 / Silence and more",0
|
|
project3 db "Name3 / C00l, new title and more", 0
|
|
project4 db "Name4 / Everyon", 0
|
|
project5 db "Name5 / Voices and more", 0
|
|
project6 db "Name6 / Examples of titles", 0
|
|
|
|
projects dq project1, project2, project3, project4, project5, project6
|
|
|
|
menuhelp db "F1 Help", 0
|
|
menuselect db " W/S Select Item",0
|
|
menuexit db 0x0D,0x0A," ESC Exit", 0
|
|
menuenter db " Enter publication",0
|
|
|
|
wolf_error_msg db 'Program not found!',0x0D,0x0A,0
|
|
wolf_error_msg1 db 'Press any key to restart..',0
|
|
|
|
currentselection dw 0
|
|
storebx dw 0
|
|
|
|
bootdev db 0x80 ; Boot device number
|
|
|
|
%assign usedMemory ($-$$)
|
|
%assign usableMemory (512*16)
|
|
%warning [usedMemory/usableMemory] Bytes used
|
|
times (512*16)-($-$$) db 0 ;kernel must have size multiple of 512 so let's pad it to the correct size
|
|
|