;=----------------------------------------------------------------------------=; ; GNU GPL OS/K ; ; ; ; Authors: spectral` ; ; NeoX ; ; ; ; Desc: Kernel (second stage) Loader for OS/K INCLUDED FUNCTIONS ; ; (x86_64 architecture only) ; ;=----------------------------------------------------------------------------=; [BITS 64] clear: ;-----------------------------------------------------------------------; ; x64/LM Clear Text Screen Function ; ;-----------------------------------------------------------------------; mov qword [NextTRAM], TRAM mov edi, TRAM push rsi push rdi push rcx mov ah, 0 mov al, 0 mov rcx, 0x4000 ; traditionnal value rep stosw ; fill screen with al while cx > 0 pop rcx pop rsi pop rdi ret write: ;-----------------------------------------------------------------------; ; x64/LM Text Printing Functions ; ; bl : color code ; ; esi : string address ; ;-----------------------------------------------------------------------; mov edi, [NextTRAM] ; TRAM ADDRESS push rsi push rdi .pLoop: lodsb cmp al, 0 ; while @al, i.e. while we're not hitting '\0' je .pEnd cmp al, 0x0A ; LF je .lf cmp al, 0x0D ; CR je .cr stosb ; text subpixel mov al, bl stosb ; color subpixel add qword [NextTRAM], 0x2 ; Cursor moving add qword [VGA_X], 0x2 ; coord + 2 because 2 subpixels jmp .pLoop .pEnd: pop rdi pop rsi ret .lf: mov rax, [VGA_HEIGHT64] add [NextTRAM], rax ; Cursor moving add [NextTRAM], rax add edi, eax ; Address moving add edi, eax jmp .pLoop .cr: push rax mov rax, qword [VGA_X] sub qword [NextTRAM], rax ; pos = X + Y * VGA_HEIGHT64. Donc pos - X = début de ligne sub edi, edx mov qword [VGA_X], 0 pop rax jmp .pLoop .scroll: ; XXX I don't think I'll implement this, but never know...; jmp .pLoop dump: ;-----------------------------------------------------------------------; ; x64/LM Dump Printing Functions ; ; bl : color code ; ; esi : string address ; ;-----------------------------------------------------------------------; mov edi, [NextTRAM] ; TRAM ADDRESS push rsi push rdi push rcx mov rcx, 512 .pLoop: lodsb stosb ; text subpixel mov al, bl stosb ; color subpixel add qword [NextTRAM], 0x2 ; Cursor moving add qword [VGA_X], 0x2 ; coord + 2 because 2 subpixels loop .pLoop pop rcx pop rdi pop rsi ret ata_read: ;-----------------------------------------------------------------------; ; x64/LM ATA Reading function ; ; ; ; ; ;-----------------------------------------------------------------------; ; Technical infos about the ports (Intel Doc): ; ; Port Access Mode Misc ; ; 1f0 r/w Data register, the bytes of the disk itself ; 1f1 r Error register that can be handled ; 1f2 r/w Sector count, how many sectors to read ; 1f3 r/w Sector number, the actual sector wanted ; 1f4 r/w Cylinder low, cylinders is 0-1024 ; 1f5 r/w Cylinder high, this makes up the rest of the 1024 ; 1f6 r/w Drive/head ; bit 7 = 1 ; bit 6 = 0 ; bit 5 = 1 ; bit 4 = 0 drive 0 select ; = 1 drive 1 select ; bit 3-0 head select bits ; 1f7 r Status register ; bit 7 = 1 controller is executing a command ; bit 6 = 1 drive is ready ; bit 5 = 1 write fault ; bit 4 = 1 seek complete ; bit 3 = 1 sector buffer requires servicing ; bit 2 = 1 disk data read corrected ; bit 1 = 1 index - set to 1 each revolution ; bit 0 = 1 previous command ended in an error ; 1f7 w Command register ; commands: ; 50h format track ; 20h read sectors with retry ; 21h read sectors without retry ; 22h read long with retry ; 23h read long without retry ; 30h write sectors with retry ; 31h write sectors without retry ; 32h write long with retry ; 33h write long without retry ; push rax push rbx push rdx push rcx push rdi mov dx, 0x1f6 ;Drive and head port mov al, 0x0a0 ;Drive 0, head 0 out dx,al mov dx, 0x1f2 ;Sector count port mov al, 1 ;Read one sector out dx, al mov dx, 0x1f3 ;Sector number port mov al, 1 ;Read sector one out dx, al mov dx, 0x1f4 ;Cylinder low port mov al, 0 ;Cylinder 0 out dx, al mov dx, 0x1f5 ;Cylinder high port mov al, 0 ;The rest of the cylinder 0 out dx, al mov dx, 0x1f7 ;Command port mov al, 20 ;Read with retry. out dx, al still_going: in al, dx test al, 8 ;This means the sector buffer requires ;servicing. jz still_going ;Don't continue until the sector buffer ;is ready. mov cx, 512/2 ;One sector /2 mov rdi, buffer mov dx, 0x1f0 ;Data port - data comes in and out of here. rep insw pop rdi pop rcx pop rdx pop rbx pop rax mov bl, 0x0F mov esi, buffer call dump mov bl, 0x0A mov esi, end call write ret buffer: times 512 db "_" end: db "[End of Sector]", 0x0