aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/net.asm41
-rw-r--r--src/programs.asm7
-rw-r--r--src/syscall.asm2
3 files changed, 50 insertions, 0 deletions
diff --git a/src/net.asm b/src/net.asm
new file mode 100644
index 0000000..939b975
--- /dev/null
+++ b/src/net.asm
@@ -0,0 +1,41 @@
+; =============================================================================
+; net.asm - raw link-port serial for networking (bypasses the console/terminal).
+;
+; The Game Boy link port is one 8-bit shift register. These two calls move a
+; byte at a time: ssend transmits with the GB as clock master; srecv waits for
+; a byte with the GB as slave (external clock), yielding while it blocks. On top
+; of these, userland runs SLIP framing and talks to a host-side gateway.
+;
+; The LCD terminal + on-screen keyboard mean the console no longer needs the
+; link port, so it is free to be the network.
+; =============================================================================
+INCLUDE "include/gbos.inc"
+
+SECTION "net", ROM0
+
+; sys_ssend(E = byte) - transmit one byte (GB drives the clock).
+sys_ssend::
+ ld a, e
+ ld [rSB], a
+ ld a, $81 ; start transfer, internal clock
+ ld [rSC], a
+.wait
+ ld a, [rSC]
+ bit 7, a
+ jr nz, .wait ; bit7 clears when the byte has shifted out
+ ret
+
+; sys_srecv() -> A = received byte. GB is the slave; blocks (yields) until the
+; peer clocks a byte in.
+sys_srecv::
+.poll
+ ld a, $80 ; start transfer, external clock (receive)
+ ld [rSC], a
+ ld a, [rSC]
+ bit 7, a
+ jr z, .got ; bit7 clear => a byte arrived
+ call SchedYield
+ jr .poll
+.got
+ ld a, [rSB]
+ ret
diff --git a/src/programs.asm b/src/programs.asm
index e659cee..a0bef96 100644
--- a/src/programs.asm
+++ b/src/programs.asm
@@ -109,6 +109,9 @@ ProgCount:
SECTION "prog_ptest", ROMX[$4000], BANK[24]
ProgPtest:
INCBIN "c/ptest.bin"
+SECTION "prog_necho", ROMX[$4000], BANK[25]
+ProgNecho:
+ INCBIN "c/necho.bin"
; -----------------------------------------------------------------------------
; PROG_SH (bank 3) - the shell, now written in C (c/sh.c): parses >/</| and
@@ -197,6 +200,8 @@ ProgramTable::
dw ProgCount
db LOW(BANK(ProgPtest)), HIGH(BANK(ProgPtest))
dw ProgPtest
+ db LOW(BANK(ProgNecho)), HIGH(BANK(ProgNecho))
+ dw ProgNecho
; -----------------------------------------------------------------------------
; NameTable (ROM0) - command name -> program id, searched by sys_lookup.
@@ -249,4 +254,6 @@ NameTable::
db PROG_COUNT
db "ptest", 0
db PROG_PTEST
+ db "necho", 0
+ db PROG_NECHO
db 0
diff --git a/src/syscall.asm b/src/syscall.asm
index c602097..cb16bbe 100644
--- a/src/syscall.asm
+++ b/src/syscall.asm
@@ -63,6 +63,8 @@ SyscallTable:
dw sys_chdir ; 26 CHDIR
dw sys_opendir ; 27 OPENDIR
dw sys_pipe ; 28 PIPE
+ dw sys_ssend ; 29 SSEND
+ dw sys_srecv ; 30 SRECV
; -----------------------------------------------------------------------------
sys_nosys: