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.
287 lines
5.4 KiB
Plaintext
287 lines
5.4 KiB
Plaintext
6 years ago
|
[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]
|
||
|
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
|
||
|
|
||
|
|
||
|
|
||
|
print:
|
||
|
lodsb
|
||
|
or al,al
|
||
|
jz exit
|
||
|
mov ah,0x0e
|
||
|
int 10h
|
||
|
jmp print
|
||
|
exit:
|
||
|
ret
|
||
|
|
||
|
|
||
|
goback:
|
||
|
mov dl, [bootdev]
|
||
|
jmp 0x0:0x0000
|
||
|
|
||
|
|
||
|
|
||
|
msg1 db "ARTIST / TITLE",0
|
||
|
|
||
|
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
|
||
|
|
||
|
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 Select",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
|