diff --git a/.boot.asm.swp b/.boot.asm.swp new file mode 100644 index 0000000..415ec97 Binary files /dev/null and b/.boot.asm.swp differ diff --git a/boot.asm b/boot.asm index 5fd09d4..6cbde22 100755 --- a/boot.asm +++ b/boot.asm @@ -1,18 +1,20 @@ -[bits 16] [org 0x7c00] +[bits 16] + ; Use the boot drive number passed to us by BIOS in register DL welcome: xor ax,ax ; We want a segment of 0 for DS for this question mov ds,ax ; Set AX to appropriate segment value for your situation mov es,ax ; In this case we'll default to ES=DS mov bx,0x8000 ; Stack segment can be any usable memory - mov ss,bx ; This places it with the top of the stack @ 0x80000. mov sp,ax ; Set SP=0 so the bottom of stack will be @ 0x8FFFF + cld ; Set the direction flag to be positive direction + mov si, wolf_wel_msg call wolf_print @@ -66,10 +68,11 @@ load_it_all: int 19h wolf_print: + lodsb or al,al jz exit - mov ah,0x0e + mov ah,0x0e int 10h jmp wolf_print exit: diff --git a/disk.img b/disk.img index 9534ae1..4be6a53 100755 Binary files a/disk.img and b/disk.img differ diff --git a/program.asm b/program.asm index 1a6e841..7d86be9 100755 --- a/program.asm +++ b/program.asm @@ -1,34 +1,74 @@ [org 0x1000] +start: + mov ah, 01h ;make cursor invisible + mov cx, 2607h + int 10h -jmp start -data: - msg db ' POETIC SOFTWARE',0 + 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 -start: - mov dl,7h - mov ah,2 - int 21h - - 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 - - mov si, msg - call print ; print is a function, use CALL instead of JMP - - cli - hlt - print: - lodsb - or al, al - jz exit - mov ah,0x0e - int 10h - jmp print - exit: - ret + mov ah, 06h ;draw rect on background + mov cx, 0101h + mov dx, 164Dh + mov bh, 3Eh + int 10h + + mov ah, 06h ;draw shadow + mov cx, 1702h + mov dx, 174Eh + mov bh, 0Eh + int 10h + mov ah, 06h ;draw shadow + mov cx, 024Eh + mov dx, 174Eh + mov bh, 0Eh + int 10h + + + mov ah, 02h ;sets cursor to top to write + mov bh, 0h + mov dh, 1h + mov dl, 1h + int 10h + + mov al, 0xC9 ;draw border + mov bl, 0x03 + mov ah,0x0e + int 10h + mov al, 0xCD + mov bl, 0x03 + mov ah,0x0e + int 10h + + 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 + mov si, msg2 + + +print: + lodsb + or al,al + jz exit + mov bl, 0x03 + mov ah,0x0e + int 10h + jmp print + exit: + ret + + + +msg1 db " X P U B",0x0A,0 +msg2 db " NOT MY DEFAULT",0x0D,0x0A,0 diff --git a/program.bin b/program.bin index c6c4758..6755a2d 100644 Binary files a/program.bin and b/program.bin differ diff --git a/program_backup.asm b/program_backup.asm new file mode 100755 index 0000000..abff21e --- /dev/null +++ b/program_backup.asm @@ -0,0 +1,37 @@ +[org 0x1000] + + mov ah, 0x00 + mov al, 0x13 + int 0x10 + + +jmp start + +data: + msg db ' POETIC SOFTWARE',0 + +start: +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 + + mov si, msg + call print ; print is a function, use CALL instead of JMP + + cli + hlt + print: + lodsb + or al, al + jz exit + mov ah,0x0e + mov bh, 0x00 + mov bl, 0x07 + int 10h + jmp print + exit: + ret + diff --git a/program_graphicsmode.asm b/program_graphicsmode.asm new file mode 100755 index 0000000..b994bf5 --- /dev/null +++ b/program_graphicsmode.asm @@ -0,0 +1,190 @@ +[org 0x1000] + +push 0a000h ;Video memory graphics segment +pop es + +mov ax, 0012h ;320x200@8bpp +int 10h + + +push 0Eh ;Blue +push 10 ;cX +push 10 ;cY +push 10 ;Radius +call drawFilledCircle + +push 02h ;Blue +push 40 ;cX +push 40 ;cY +push 30 ;Radius +call drawFilledCircle + +push 06h ;Blue +push 140 ;cX +push 100 ;cY +push 70 ;Radius +call drawFilledCircle + +main: ; Label for the start of the main program + + mov ax,0x0000 ; Setup the Data Segment register + ; Location of data is DS:Offset + mov ds,ax ; This can not be loaded directly it has to be in two steps. + ; 'mov ds, 0x0000' will NOT work due to limitations on the CPU + + mov si, HelloWorld ; Load the string into position for the procedure. + call PutStr ; Call/start the procedure + +mov dx, 0C14h ;DH=12 row, DL=20 column +mov bh, 0 ;BH=0 display page +mov ah, 02h ;AH=02h set cursor position function +int 10h ;video BIOS interrupt + +mov bx, 000Ch ;BH=0 display page, BL=12 red +mov ax, 0E42h ;AH=0Eh teletype function, AL=66 capital B +int 10h ;video BIOS interrupt + + + +; Procedures +PutStr: ; Procedure label/start + ; Set up the registers for the interrupt call + mov ah,0x0E ; The function to display a chacter (teletype) + mov bh,0x00 ; Page number + mov bl,0x0C ; Normal text attribute + +.nextchar ; Internal label (needed to loop round for the next character) + lodsb ; I think of this as LOaD String Block + ; (Not sure if thats the real meaning though) + ; Loads [SI] into AL and increases SI by one + ; Check for end of string '0' + or al,al ; Sets the zero flag if al = 0 + ; (OR outputs 0's where there is a zero bit in the register) + jz .return ; If the zero flag has been set go to the end of the procedure. + ; Zero flag gets set when an instruction returns 0 as the answer. + int 0x10 ; Run the BIOS video interrupt + jmp .nextchar ; Loop back round tothe top +.return ; Label at the end to jump to when complete +ret ; Return to main program + + +;Color +;cX +;cY +;R +drawFilledCircle: + push bp + mov bp, sp + + sub sp, 02h + + mov cx, WORD [bp+04h] ;R + + mov ax, cx + mul ax ;AX = R^2 + mov WORD [bp-02h], ax ;[bp-02h] = R^2 + + + + mov ax, WORD [bp+06h] + sub ax, cx ;i = cY-R + mov bx, WORD [bp+08h] + sub bx, cx ;j = cX-R + + shl cx, 1 + mov dx, cx ;DX = Copy of 2R + +.advance_v: + push cx + push bx + + mov cx, dx + +.advance_h: + ;Save values + push bx + push ax + push dx + + ;Compute (i-y) and (j-x) + sub ax, WORD [bp+06h] + sub bx, WORD [bp+08h] + + mul ax ;Compute (i-y)^2 + + push ax + mov ax, bx + mul ax + pop bx ;Compute (j-x)^2 in ax, (i-y)^2 is in bx now + + add ax, bx ;(j-x)^2 + (i-y)^2 + cmp ax, WORD [bp-02h] ;;(j-x)^2 + (i-y)^2 <= R^2 + + ;Restore values before jump + pop dx + pop ax + pop bx + + ja .continue ;Skip pixel if (j-x)^2 + (i-y)^2 > R^2 + + ;Write pixel + push WORD [bp+0ah] + push bx + push ax + call writePx + + +.continue: + + ;Advance j + inc bx + loop .advance_h + + ;Advance i + inc ax + + + pop bx ;Restore j + pop cx ;Restore counter + +loop .advance_v + + add sp, 02h + + + pop bp + ret 08h + + + +;Color +;X +;Y +writePx: + push bp + mov bp, sp + + push ax + push bx + + mov bx, WORD [bp+04h] + mov ax, bx + shl bx, 6 + shl ax, 8 + add bx, ax ;320 = 256 + 64 + + add bx, WORD [bp+06h] + mov ax, WORD [bp+08h] + + ;TODO: Clip + + mov BYTE [es:bx], al + + pop bx + pop ax + + pop bp + ret 06h + + +HelloWorld db ' Not My Default Bootloader',0x0D,0x0A,0