summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Baumann <mail@andreasbaumann.cc>2017-07-22 22:17:18 +0200
committerAndreas Baumann <mail@andreasbaumann.cc>2017-07-22 22:17:18 +0200
commit13435bfc961fd2abd5f688ce37e94d5f96b0873b (patch)
treeb295a28626d56e244215b04d71173967a4239bc6
parent107de40014ade48725b991dbe46f5d172da1078b (diff)
downloadabaos-13435bfc961fd2abd5f688ce37e94d5f96b0873b.tar.gz
abaos-13435bfc961fd2abd5f688ce37e94d5f96b0873b.tar.bz2
added 16-bit port class
-rw-r--r--src/hardware/port.asm24
-rw-r--r--src/hardware/port.c7
-rw-r--r--src/hardware/port.h10
3 files changed, 40 insertions, 1 deletions
diff --git a/src/hardware/port.asm b/src/hardware/port.asm
index 555a4e8..c7e7bc4 100644
--- a/src/hardware/port.asm
+++ b/src/hardware/port.asm
@@ -24,6 +24,30 @@ port8_read:
leave
ret
+global port16_write
+global port16_read
+
+; void port16_write( port16_t *port, uint16_t data );
+port16_write:
+ push ebp
+ mov ebp, esp
+ mov ecx, [ebp+8]
+ mov edx, DWORD [ecx]
+ mov ax, WORD [ebp+12]
+ out dx, ax
+ leave
+ ret
+
+; uint16_t port16_read( port16_t *port )
+port16_read:
+ push ebp
+ mov ebp, esp
+ mov ecx, DWORD [ebp+8]
+ mov edx, [ecx]
+ in ax, dx
+ leave
+ ret
+
global port32_write
global port32_read
diff --git a/src/hardware/port.c b/src/hardware/port.c
index 46e7f37..aa92b82 100644
--- a/src/hardware/port.c
+++ b/src/hardware/port.c
@@ -9,6 +9,13 @@ void port8_init( port8_t *port, uint16_t number )
port->number = number;
}
+void port16_init( port16_t *port, uint16_t number )
+{
+ memset( port, 0, sizeof( port16_t ) );
+
+ port->number = number;
+}
+
void port32_init( port32_t *port, uint16_t number )
{
memset( port, 0, sizeof( port32_t ) );
diff --git a/src/hardware/port.h b/src/hardware/port.h
index 8203fea..d083220 100644
--- a/src/hardware/port.h
+++ b/src/hardware/port.h
@@ -12,7 +12,15 @@ void port8_write( port8_t *port, uint8_t data );
uint8_t port8_read( port8_t *port );
typedef struct {
- uint16_t number; // port number, e.g. 0x3d4 VGA index register
+ uint16_t number;
+} port16_t;
+
+void port16_init( port16_t *port, uint16_t number );
+void port16_write( port16_t *port, uint16_t data );
+uint16_t port16_read( port16_t *port );
+
+typedef struct {
+ uint16_t number;
} port32_t;
void port32_init( port32_t *port, uint16_t number );