[org 0x1000] start: mov [bootdev], dl mov bx, 0 mov [helpon], bx 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; top bar, make background xor cx, cx mov dx, 0x004F mov bh, 30h int 10h mov ah, 02h ;top bar setting the position and then write title $ mov bh, 0h mov dh, 0h mov dl, 20h int 10h mov si, title call print mov ah, 06h ;draw rect on background mov cx, 0201h mov dx, 124Dh mov bh, 3Eh int 10h call drawshadow ; 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 cmp ah, 01h je goback cmp ah, 3Bh je help 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 help: mov bx, 1 mov [helpon], bx mov ah, 06h ;draw rect on background mov cx, 040Fh mov dx, 113Eh mov bh, 70h int 10h push dx push cx mov si, helptext call printinrect pop cx pop dx call drawshadow jmp waitforkey 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, 05 ; Sector to read = 4 jmp load .two mov bx, 0x3000 ; BX = 0x1000. ES:BX=0x0:0x1000 mov cl, 06 ; Sector to read = 4 jmp load .three mov bx, 0x4000 ; BX = 0x1000. ES:BX=0x0:0x1000 mov cl, 07 ; Sector to read = 4 jmp load .four mov bx, 0x5000 ; BX = 0x1000. ES:BX=0x0:0x1000 mov cl, 08 ; Sector to read = 4 jmp load .five mov bx, 0x6000 ; BX = 0x1000. ES:BX=0x0:0x1000 mov cl, 09 ; Sector to read = 4 jmp load .six mov bx, 0x7000 ; BX = 0x1000. ES:BX=0x0:0x1000 mov cl, 10 ; 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 ;------------; ;ch=row ; ;cl=column ; ;dh=row ; ;dl=column ; ;------------; drawshadow: push cx push dx mov al, dl mov ah, ch inc ah inc al mov cx, ax mov bl, dl mov bh, dh inc bl inc bh mov dx, bx mov ah, 06h ;draw shadow mov bh, 0Ch int 10h pop dx pop cx mov al, cl mov ah, dh inc ah inc al mov cx, ax mov bl, dl mov bh, dh inc bl inc bh mov dx, bx mov ah, 06h ;draw shadow mov bh, 0Ch int 10h ret printinrect: push cx mov bx, dx push bx mov ah, 02h ;sets cursor to top to write mov bh, 0h mov dh, ch mov dl, cl int 10h .loop: lodsb ; load next char mov bh, 0 mov ah, 0x03 int 10h ;read cursor position push dx or al,al jz .exit mov ah, 0x0e mov bh, 0x00 mov cx, 0x01 int 10h pop dx pop bx cmp dl, bl je .newline push bx jmp .loop .exit: pop dx pop bx pop cx ret .newline: pop cx push bx mov dl, cl ;set column inc dh ;increment row by one, works! mov ah, 02h ;sets cursor mov bh, 0h ;page number 0 constant int 10h pop bx push cx push bx jmp .loop print: lodsb or al,al jz .exit mov ah,0x0e int 10h jmp print .exit: ret goback: mov dl, [bootdev] mov ax, [helpon] cmp ax, 1 je start jmp 0x0:0x7c00 hlt helpon dw 0 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 helptext db "NOT MY DEFAULT arises from the defaults of computers. In every application there are settings predefined by their creators, that most of the times stay untouched by us, as users. It's their default, not ours, but it's our fault when we don't change it. Society is made of similar preset frameworks that we take for granted. The graduation projects engage with these different default modes and intervene in their core structure/source/root. You are invited to become root users, active listeners, smart speakers, conscious food consumers, counter trolls, sensorial spectators!",0 menuhelp db "F1 Help", 0 menuselect db " W/S Select Item",0 menuexit db 0x0D,0x0A," ESC Exit", 0 menuenter db " Enter Select",0 title db 'NOT MY DEFAULT',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