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.

288 lines
5.4 KiB
NASM

[org 0x1000]
5 years ago
start:
mov [bootdev], dl
5 years ago
mov ah, 01h ;make cursor invisible
mov cx, 2607h
int 10h
5 years ago
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
5 years ago
mov ah, 06h ;draw rect on background
mov cx, 0101h
mov dx, 124Dh
5 years ago
mov bh, 3Eh
int 10h
mov ah, 06h ;draw shadow
mov cx, 1302h
mov dx, 134Eh
5 years ago
mov bh, 0Eh
int 10h
mov ah, 06h ;draw shadow
mov cx, 024Eh
mov dx, 134Eh
5 years ago
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
5 years ago
mov ah, 02h ;sets cursor to top to write
mov bh, 0h
mov dh, 17h
mov dl, 2h
5 years ago
int 10h
mov si, menuhelp
call print
5 years ago
mov si, menuselect
call print
mov si, menuexit
call print
mov si, menuenter
call print
5 years ago
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
5 years ago
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
5 years ago
mov [storebx], bx
5 years ago
mov ah, 02h
;mov bh, 0h
add dh, 1h ;move cursor down
5 years ago
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
5 years ago
int 10h
5 years ago
jmp .drawstring
5 years ago
5 years ago
.drawstring
mov bx, [storebx]
5 years ago
mov si, [di+bx] ; Get the address of string1
call print
add bx, 8
cmp bx, 48
jne .loop
5 years ago
jmp waitforkey
waitforkey:
mov ah, 0x00
int 0x16
cmp ah, 1Fh
je .up
cmp ah, 11h
je .down
cmp ah, 1Ch
je loadproject
5 years ago
cmp ah, 01h
je goback
5 years ago
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
5 years ago
loadproject:
mov bx, [currentselection]
cmp bx, 0
je .one
cmp bx, 8
je .two
cmp bx, 16
je .three
cmp bx, 24
je .four
cmp bx, 32
je .five
cmp bx, 40
je .six
jmp waitforkey
.one
mov bx, 0x2000 ; BX = 0x1000. ES:BX=0x0:0x1000
mov cl, 04 ; Sector to read = 4
jmp load
.two
mov bx, 0x3000 ; BX = 0x1000. ES:BX=0x0:0x1000
mov cl, 05 ; Sector to read = 4
jmp load
.three
mov bx, 0x4000 ; BX = 0x1000. ES:BX=0x0:0x1000
mov cl, 06 ; Sector to read = 4
jmp load
.four
mov bx, 0x5000 ; BX = 0x1000. ES:BX=0x0:0x1000
mov cl, 07 ; Sector to read = 4
jmp load
.five
mov bx, 0x6000 ; BX = 0x1000. ES:BX=0x0:0x1000
mov cl, 08 ; Sector to read = 4
jmp load
.six
mov bx, 0x7000 ; BX = 0x1000. ES:BX=0x0:0x1000
mov cl, 09 ; Sector to read = 4
jmp load
load:
pushf
stc
mov ah,00
int 13h
.read_sector:
mov ax, 0x0
mov es, ax ; ES = 0
; ES:BX = starting address to read sector(s) in$
mov ah, 02 ; Int 13h/AH=2 = Read Sectors From Drive;
mov al, 0x01 ; Sectors to read = 1
mov ch, 00 ; CH=Cylinder. Second sector of disk
; is at Cylinder 0 not 1
mov dh, 00 ; Head to read = 0
mov dl, [bootdev]
int 13h
jc wolf_error
popf
jmp bx
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
5 years ago
print:
lodsb
or al,al
jz exit
mov ah,0x0e
int 10h
jmp print
exit:
ret
5 years ago
goback:
mov dl, [bootdev]
jmp 0x0:0x7c00
hlt
msg1 db "ARTIST / TITLE",0
5 years ago
project1 db "Alex / Poetic Software",0
project2 db "Alice / f00d",0
project3 db "Angeliki / Voices", 0
project4 db "Joca / Ghost in the Speaker", 0
project5 db "Tash / Silence making", 0
project6 db "Zalan / Phantasmagoria", 0
5 years ago
projects dq project1, project2, project3, project4, project5, project6
5 years ago
menuhelp db "F1 Help", 0
5 years ago
menuselect db " W/S Select Item",0
menuexit db 0x0D,0x0A," ESC Exit", 0
5 years ago
menuenter db " Enter Select",0
wolf_error_msg db 'Program not found!',0x0D,0x0A,0
wolf_error_msg1 db 'Press any key to restart..',0
5 years ago
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