Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.

491 rinda
11 KiB

pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
pirms 5 gadiem
  1. %define GDT_Paragraph 0x1000
  2. %define GDT (GDT_Paragraph*16)
  3. %define GDT_CodeSegIndex 1
  4. %define GDT_DataSegIndex 2
  5. %define GDT_CodeSeg16Index 3
  6. %define GDT_DataSeg16Index 4
  7. %define GDT_Selector(DescriptorIndex, TableIndicator, RequestorPrivLevel) ((DescriptorIndex << 3) | ((TableIndicator & 1) << 2) | (RequestorPrivLevel & 0x3))
  8. %define GDT_CodeSegSelector GDT_Selector(GDT_CodeSegIndex, 0, 0)
  9. %define GDT_DataSegSelector GDT_Selector(GDT_DataSegIndex, 0, 0)
  10. %define GDT_CodeSeg16Selector GDT_Selector(GDT_CodeSeg16Index, 0, 0)
  11. %define GDT_DataSeg16Selector GDT_Selector(GDT_DataSeg16Index, 0, 0)
  12. %define VIDEO 0xB8000
  13. %define VIDEO_X_RES 80
  14. %define VIDEO_Y_RES 25
  15. %define ScreenCoord(x, y) (2*(VIDEO_X_RES*(y)+(x)))
  16. ; GDT Stuff
  17. %define Data 0000b
  18. %define DataMutable 0010b
  19. %define DataShrink 0100b
  20. %define DataShrinkMutable 0110b
  21. %define Code 1000b
  22. %define CodeRead 1010b
  23. %define CodeOwnRing 1100b
  24. %define CodeOwnRingRead 1110b
  25. %macro GDT_NULL_ENTRY 1 ; address
  26. %assign address %1
  27. lea di, [address]
  28. xor ax, ax
  29. mov cx, 4
  30. rep stosw
  31. %assign GDT_COUNT (GDT_COUNT+1)
  32. %endmacro
  33. %macro GDT_ENTRY 6 ; address base limit type privilege bits32
  34. %assign address %1
  35. %assign base %2
  36. %assign limit %3
  37. %assign type (%4 & 0xf)
  38. %assign reserved (1<<4)
  39. %assign privilege ((%5 & 0x3) << 5)
  40. %assign present (1<<7)
  41. %assign access (present | privilege | reserved | type)
  42. %assign bits32 ((%6 & 1) << 2)
  43. %assign granularity (1<<3)
  44. %assign flags (granularity | bits32)
  45. %assign limit_0_15 (limit & 0xffff)
  46. %assign limit_16_19 ((limit >> 16) & 0xf)
  47. %assign base_0_15 (base & 0xffff)
  48. %assign base_16_23 ((base >> 16) & 0xff)
  49. %assign base_24_31 ((base >> 24) & 0xff)
  50. mov WORD [es:(address + 0)], limit_0_15
  51. mov WORD [es:(address + 2)], base_0_15
  52. mov WORD [es:(address + 4)], base_16_23 | (access << 8)
  53. mov WORD [es:(address + 6)], limit_16_19 | (flags << 4) | (base_24_31 << 8)
  54. %assign GDT_COUNT (GDT_COUNT+1)
  55. %endmacro
  56. %define IOKeyData 0x60
  57. %define InKeyStatus 0x64
  58. %define OutKeyCommand 0x64
  59. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  60. Enable_A20:
  61. ; Enables A20 gate using:the BIOS, keyboard controller, or Fast A20
  62. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  63. pushad ;Preserve registers
  64. pushfd ;Preserve EFLAGS because we might disable interrupts
  65. mov ax,0x2402 ;INT 15h AX=2402h: Query A20 status
  66. int 0x15 ;Check to see if A20 gate is enabled
  67. jc A20_No_BIOS ;Error? Don't use BIOS to enable gate
  68. test al,1 ;Test Bit 0 of AL
  69. je A20_Enabled ;A20 gate already enabled
  70. mov ax,0x2401 ;INT 15h AX=2401h: Enable A20 gate
  71. int 0x15 ;Use BIOS to enable A20 gate
  72. jc A20_No_BIOS ;Error? Don't use BIOS to enable gate
  73. or ah,ah ;Test AH
  74. jnz A20_No_BIOS ;Non-zero? A20 gate may not be enabled
  75. A20_Enabled:
  76. popfd ;Restore EFLAGS
  77. popad ;Restore registers
  78. ret ;Return
  79. A20_No_BIOS:
  80. mov ax,0x2403 ;INT 15h AX=2403h: Query A20 support
  81. int 0x15 ;Call BIOS to find out how the A20 gate can be enabled
  82. jc A20_KBD ;Error? Assume that keyboard controller is the only option
  83. test bx,1 ;Bit 0:Keyboard controller supported
  84. je A20_KBD ;BIOS indicates that keyboard controller is supported
  85. test bx,2 ;Bit 1:Fast A20 supported
  86. je FAST_A20 ;BIOS indicated that Fast A20 is supported
  87. call Check_A20 ;Test A20 gate manually
  88. jc A20_Enabled ;A20 gate already enabled
  89. A20_Fail:
  90. call A20_OUT_Wait ;"Unable to enable A20 gate!"
  91. cli ;Disable interrupts
  92. hlt ;Halt machine
  93. FAST_A20:
  94. in al,0x92 ;Read System Control Port A
  95. test al,2 ;Test Fast A20 bit
  96. jnz A20_Fail ;Bit already set, failed to enable A20 gate
  97. or al,2 ;Set Bit 1:Enable Fast A20
  98. and al,0xFE ;Always clear Bit 0 so that machine does not reboot
  99. out 0x92,al ;Write to port 92h
  100. call Check_A20 ;Check A20 gate
  101. jc A20_Enabled ;Success?
  102. cli ;No? something must have gone wrong
  103. hlt ;Clear interrupts and halt machine
  104. A20_KBD:
  105. cli ;Disable interrupts
  106. mov cx,50 ;Number of attempts to enable gate
  107. Use_KBD:
  108. call A20_OUT_Wait ;Wait for keyboard
  109. mov al,0xAD ;Disable Keyboard
  110. out 0x64,al ;Wait for Keyboard
  111. mov al,0xD0 ;Read Controller Output Port
  112. out 0x64,al
  113. call A20_IN_Wait ;Wait for Keyboard
  114. in al,0x60 ;Read Data Port
  115. push ax ;Save
  116. call A20_OUT_Wait ;Wait for Keyboard
  117. mov al,0xD1 ;Write Controller Output Port
  118. out 0x64,al
  119. call A20_OUT_Wait ;Wait for Keyboard
  120. pop ax ;Get port data back
  121. or al,10b ;Bit 1: Enable A20 gate
  122. out 0x60,al ;Write to data port
  123. call A20_OUT_Wait ;Wait for Keyboard
  124. mov al,0xAE ;Enable Keyboard
  125. out 0x64,al
  126. call A20_OUT_Wait ;Wait for Keyboard
  127. call Check_A20 ;Verify that gate is enabled
  128. jc A20_Enabled ;Yes? Return
  129. loop Use_KBD ;No? Keep trying
  130. jmp A20_Fail ;Could not enable gate after 50 tries
  131. A20_OUT_Wait:
  132. in al,0x64 ;Read status register
  133. test al,10b ;Is port ready?
  134. jnz A20_OUT_Wait ;Nope, wait
  135. ret ;Yep, continue
  136. A20_IN_Wait:
  137. in al,0x64 ;Read status register
  138. test al,1b ;Is port ready?
  139. jz A20_IN_Wait ;Nope, wait
  140. ret ;Yep, continue
  141. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  142. Check_A20:
  143. ; Test if A20 gate is enabled by comaparing the value in FFFF:7E0E
  144. ; with the VBR boot signature at 0000:7DFE
  145. ; Out: Carry flag set if A20 gate is enabled
  146. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  147. pushad ;Preserve registers
  148. push es
  149. mov ax, 0xFFFF
  150. mov es, ax ;Extra segment:FFFF
  151. cmp WORD [es:0x7DFE + 16], 0xAAFF ;See if boot signature is wrapped at FFFF:7E0E (Meaning FFFF:7E0E = 0:7DFE)
  152. stc ; Assume we didn't wrap, yes A20
  153. jne .End
  154. clc ; We did wrap, no A20
  155. .End:
  156. pop es
  157. popad
  158. ret
  159. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  160. Go32Bit:
  161. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  162. call Enable_A20
  163. ; Set screen mode
  164. mov ax, 0x0003 ; AH=0 (Change video mode), AL=13h (Mode) = 320x200 - 256 colors
  165. mov bx, 0x0000
  166. int 0x10 ; Video BIOS interrupt
  167. ;;;;;;;;;;;;;;;;;;;;;;;;;;;
  168. ; Global Descriptor Table ;
  169. ;;;;;;;;;;;;;;;;;;;;;;;;;;;
  170. mov ax, GDT_Paragraph
  171. mov es, ax
  172. mov cx, 4096
  173. lea si, [GO32_COPY_BEGIN]
  174. xor di, di
  175. rep movsb
  176. %assign GDT_COUNT 0
  177. GDT_NULL_ENTRY 0
  178. GDT_ENTRY (GDT_CodeSegIndex*8), 0x00000000, 0xffffffff, CodeRead, 0, 1
  179. GDT_ENTRY (GDT_DataSegIndex*8), 0x00000000, 0xffffffff, DataMutable, 0, 1
  180. GDT_ENTRY (GDT_CodeSeg16Index*8), 0x00000000, 0xffffffff, CodeRead, 0, 0
  181. GDT_ENTRY (GDT_DataSeg16Index*8), 0x00000000, 0xffffffff, DataMutable, 0, 0
  182. cli
  183. lgdt [GDT_Record]
  184. mov eax, cr0
  185. or al, 1 ; set PE (Protection Enable) bit in CR0 (Control Register 0)
  186. mov cr0, eax
  187. jmp ClearPrefetchQueue
  188. nop
  189. nop
  190. ClearPrefetchQueue:
  191. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  192. ;; Manually assembled long jump ;;
  193. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  194. db 0x66 ; 32bit override
  195. db 0xea ; Long jump
  196. dd ProtectedModeBaby ; Absolute address
  197. dw GDT_CodeSegSelector ; Descriptor Selector
  198. GDT_Record:
  199. dw (GDT_COUNT*8) - 1 ; Size of GDT in bytes minus 1
  200. dd 0x1000*16 ; Linear address of GDT
  201. align 512
  202. BITS 32
  203. GO32_COPY_BEGIN:
  204. segment Go32Bit vstart=GDT
  205. GDT_SPACE: times (GDT_COUNT*8) db 0
  206. ProtectedModeBaby:
  207. ; Update Other Segments
  208. mov ax, GDT_DataSegSelector
  209. mov ds, ax
  210. mov ss, ax
  211. mov es, ax
  212. mov fs, ax
  213. mov gs, ax
  214. ; Setup stack
  215. mov esp, (100 << 20) - 1 ; 100M Addressable
  216. mov ebp, esp
  217. ; Space for dynamic variables
  218. sub esp, 200*4 ; 200 32-bit integers
  219. push ebp
  220. DrawStuff:
  221. xor ecx, ecx
  222. xor edx, edx
  223. lea edi, [VIDEO]
  224. mov ebp, dword [Zoom]
  225. sar ebp, 9
  226. jnz .DrawLoop
  227. mov ebp, 0x7fffffff
  228. .DrawLoop:
  229. mov eax, [Px]
  230. shr eax, 4
  231. add eax, ecx
  232. imul eax, eax
  233. mov ebx, eax
  234. mov eax, [Py]
  235. shr eax, 4
  236. add eax, edx
  237. add eax, edx
  238. imul eax, eax
  239. add ebx, eax
  240. mov eax, [ColorOffset]
  241. push edx
  242. xor edx, edx
  243. idiv ebp
  244. pop edx
  245. xchg eax, ebx
  246. add ax, bx
  247. mov al, ah
  248. stosw
  249. inc ecx
  250. cmp ecx, VIDEO_X_RES
  251. jne .DrawLoop
  252. xor ecx, ecx
  253. inc edx
  254. cmp edx, VIDEO_Y_RES-2
  255. jne .DrawLoop
  256. pop ebp
  257. cld
  258. xor eax, eax
  259. in al, IOKeyData ; Get the scan code from the keyboard
  260. test al, 0x80
  261. jnz .ThereWasNothing
  262. cmp al, 75; left
  263. je .KeyLeft
  264. cmp al, 72; up
  265. je .KeyUp
  266. cmp al, 80; right
  267. je .KeyDown
  268. cmp al, 77; down
  269. je .KeyRight
  270. cmp al, 51; <
  271. je .KeyLess
  272. cmp al, 52; >
  273. je .KeyGreater
  274. cmp al, 1 ; Escape
  275. je .KeyEscape
  276. .ThereWasNothing:
  277. mov [Key], byte ' '
  278. jmp .PrintKeyLegend
  279. ; lea esi, [ProtectedWelcomeStr]
  280. .KeyEscape:
  281. call Reboot
  282. jmp .PrintKeyLegend
  283. .KeyLeft:
  284. mov [Key], byte 'L'
  285. add [Px], dword -1
  286. jmp .PrintKeyLegend
  287. .KeyUp:
  288. mov [Key], byte 'U'
  289. add [Py], dword -1
  290. jmp .PrintKeyLegend
  291. .KeyRight:
  292. mov [Key], byte 'R'
  293. add [Px], dword 1
  294. jmp .PrintKeyLegend
  295. .KeyDown:
  296. mov [Key], byte 'D'
  297. add [Py], dword 1
  298. jmp .PrintKeyLegend
  299. .KeyLess:
  300. mov [Key], byte '<'
  301. add [Zoom], dword -1
  302. jmp .PrintKeyLegend
  303. .KeyGreater:
  304. mov [Key], byte '>'
  305. add [Zoom], dword 1
  306. .PrintKeyLegend:
  307. lea esi, [ThereWasSomethingStr]
  308. lea edi, [VIDEO + ScreenCoord((80-11), 24)]
  309. mov ah, 0x2f
  310. .print_loop:
  311. mov al, BYTE [esi]
  312. test al, al
  313. jz .break_print_loop
  314. stosw
  315. inc esi
  316. jmp .print_loop
  317. .break_print_loop:
  318. lea esi, [VarLabels]
  319. lea edi, [ConversionBuffer]
  320. mov ecx, VarLabelsLength
  321. call CopyData
  322. lea esi, [ConversionBuffer]
  323. lea edi, [VIDEO + ScreenCoord(0, 24)]
  324. mov ah, 0x0f
  325. call PrintString
  326. ; lea esi, [ConversionBuffer]
  327. mov eax, dword [Px]
  328. sar eax, 4
  329. call IntToString
  330. ; lea esi, [ConversionBuffer]
  331. ; ecx set by IntToString
  332. mov edx, 7
  333. mov al, ' '
  334. call RightJustifyString
  335. ; esi still ConversionBuffer
  336. mov ecx, edx
  337. lea edi, [VIDEO + ScreenCoord(StrXStart, 24)]
  338. mov ah, 0x70
  339. call PrintString
  340. ; lea esi, [ConversionBuffer]
  341. mov eax, dword [Py]
  342. sar eax, 4
  343. call IntToString
  344. ; lea esi, [ConversionBuffer]
  345. ; ecx set by IntToString
  346. mov edx, 7
  347. mov al, ' '
  348. call RightJustifyString
  349. ; esi still ConversionBuffer
  350. mov ecx, edx
  351. lea edi, [VIDEO + ScreenCoord(StrYStart, 24)]
  352. mov ah, 0x70
  353. call PrintString
  354. add [ColorOffset], dword 1
  355. jmp DrawStuff
  356. %include "Strings32.nasm"
  357. Halt:
  358. cli
  359. hlt
  360. jmp Halt
  361. ; ------------------------------------------------------------------------------
  362. Reboot:
  363. in al, 0x64
  364. test al, 0x2 ; Wait for an empty Input Buffer
  365. jne Reboot
  366. mov al, 0xFE
  367. out 0x64, al ; Send the reboot call to the keyboard controller
  368. jmp Reboot
  369. ;;;;;;;;;;;;;;;;;;;;;;;;
  370. ;; Strings
  371. ;;;;;;;;;;;;;;;;;;;;;;;;
  372. VarLabels: db "X:"
  373. StrXStart equ $-VarLabels
  374. db " "
  375. db "Y:"
  376. StrYStart equ $-VarLabels
  377. db " "
  378. VarLabelsLength equ $-VarLabels
  379. ProtectedWelcomeStr: db " Placeholder for SingOS - 32 bit edition! ", 0
  380. ProtectedWelcomeStrLength equ $-ProtectedWelcomeStr
  381. TestStr: db "hello, world"
  382. TestStrLength equ $-TestStr
  383. ThereWasSomethingStr: db " KEY = '"
  384. Key: db " ' ", 0
  385. Px: dd 0
  386. Py: dd 0
  387. ColorOffset: dd 0
  388. Zoom: dd (4<<9)
  389. ConversionBuffer: times 40 db 0
  390. align 512