Factor out precefaces and postfixes, apm_shutdown2

This commit is contained in:
Ciro Santilli
2015-09-06 23:16:58 +02:00
parent 268977654f
commit 7cff2a3fc9
7 changed files with 101 additions and 12 deletions

View File

@@ -5,7 +5,8 @@
BITS ?= 32
IN_EXT ?= .S
LD ?= ld
MYAS ?= as
# Use gcc so that the preprocessor will run first.
MYAS ?= gcc
OBJ_EXT ?= .o
OUT_EXT ?= .img
RUN ?= bios_hello_world
@@ -22,7 +23,7 @@ all: $(OUTS)
$(LD) --oformat binary -o '$@' '$<' -T a.ld #-Ttext 0x7C00
%$(OBJ_EXT): %$(IN_EXT)
$(MYAS) -o '$@' '$<'
$(MYAS) -c -o '$@' '$<'
clean:
rm -f *$(OBJ_EXT) *$(OUT_EXT)

View File

@@ -65,6 +65,20 @@ You cannot use any libraries, so how to do IO? Some ways that this can be done:
- <https://en.wikipedia.org/wiki/VGA-compatible_text_mode>
- VBE <https://en.wikipedia.org/wiki/VESA_BIOS_Extensions>
Showdown and restart can be managed with either:
- ACPI <https://en.wikipedia.org/wiki/Advanced_Configuration_and_Power_Interface>
Newer and better.
- APM <https://en.wikipedia.org/wiki/Advanced_Power_Management>
<http://wiki.osdev.org/APM>
Older and simpler.
See also: <http://wiki.osdev.org/Shutdown>
## Bibliography
- <http://stackoverflow.com/questions/22054578/run-a-program-without-an-operating-system>

View File

@@ -1,5 +1,3 @@
.code16
/*
http://wiki.osdev.org/Shutdown
@@ -8,6 +6,10 @@ http://stackoverflow.com/questions/678458/shutdown-the-computer-using-assembly
http://stackoverflow.com/questions/3145569/how-to-power-down-the-computer-from-a-freestanding-environment
*/
#include "common.h"
BEGIN
mov $0x5301, %ax
xor %bx, %bx
int $0x15
@@ -24,5 +26,4 @@ mov $0x0001, %bx
mov $0x0003, %cx
int $0x15
.org 510
.word 0xaa55
END

70
apm_shutdown2.S Normal file
View File

@@ -0,0 +1,70 @@
/*
Example from: http://wiki.osdev.org/APM
Is all of this really needed? Compare to apm_shutdown.S.
*/
#include "common.h"
BEGIN
movb $0x53,%ah #this is an APM command
movb $0x0,%al #installation check command
xorw %bx,%bx #device id (0 = APM BIOS)
int $0x15 #call the BIOS function through interrupt 15h
jc APM_error #if the carry flag is set there was an error
#the function was successful
#AX = APM version number
#AH = Major revision number (in BCD format)
#AL = Minor revision number (also BCD format)
#BX = ASCII characters "P" (in BH) and "M" (in BL)
#CX = APM flags (see the official documentation for more details)
#disconnect from any APM interface
movb $0x53,%ah #this is an APM command
movb $0x4,%al #interface disconnect command
xorw %bx,%bx #device id (0 = APM BIOS)
int $0x15 #call the BIOS function through interrupt 15h
jc .disconnect_error #if the carry flag is set see what the fuss is about.
jmp .no_error
.disconnect_error: #the error code is in ah.
cmpb $0x3,%ah #if the error code is anything but 03h there was an error.
jne APM_error #the error code 03h means that no interface was connected in the first place.
.no_error:
#the function was successful
#Nothing is returned.
#connect to an APM interface
movb $0x53,%ah #this is an APM command
movb $0x01,%al #see above description
xorw %bx,%bx #device id (0 = APM BIOS)
int $0x15 #call the BIOS function through interrupt 15h
jc APM_error #if the carry flag is set there was an error
#the function was successful
#The return values are different for each interface.
#The Real Mode Interface returns nothing.
#See the official documentation for the
#return values for the protected mode interfaces.
#Enable power management for all devices
movb $0x53,%ah #this is an APM command
movb $0x8,%al #Change the state of power management...
movw $0x001,%bx #...on all devices to...
movw $0x001,%cx #...power management on.
int $0x15 #call the BIOS function through interrupt 15h
jc APM_error #if the carry flag is set there was an error
#Set the power state for all devices
movb $0x53,%ah #this is an APM command
movb $0x07,%al #Set the power state...
movw $0x0001,%bx #...on all devices to...
movw $0x0003,%cx #see above
int $0x15 #call the BIOS function through interrupt 15h
jc APM_error #if the carry flag is set there was an error
APM_error:
hlt
END

View File

@@ -1,4 +1,5 @@
.code16
#include "common.h"
BEGIN
cli
mov $msg, %si
mov $0x0e, %ah
@@ -12,5 +13,4 @@ halt:
hlt
msg:
.asciz "hello world"
.org 510
.word 0xaa55
END

View File

@@ -1,10 +1,10 @@
# Print a single `@` character with the BIOS.
# More minimal than the hello world.
.code16
#include "common.h"
BEGIN
cli
mov $0x40, %al
mov $0x0e, %ah
int $0x10
hlt
.org 510
.word 0xaa55
END

3
common.h Normal file
View File

@@ -0,0 +1,3 @@
#define BEGIN .code16
#define END .org 510;\
.word 0xaa55