a shadow :D

master
Your Name 6 years ago
parent 94e293ab0f
commit 20e2e1a88c

Binary file not shown.

@ -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:

Binary file not shown.

@ -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

Binary file not shown.

@ -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

@ -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
Loading…
Cancel
Save