- reorganized project directory structure
[z80comp2] / rom / monitor.asm
diff --git a/rom/monitor.asm b/rom/monitor.asm
new file mode 100644 (file)
index 0000000..07dcdb4
--- /dev/null
@@ -0,0 +1,83 @@
+; vi:filetype=z80:
+
+       include "uart.inc"
+main:
+       ld sp, $0
+
+       ; --- initialize channel A ---
+       ; reset TX/RX
+       ld a, UART_CMD_RST_RX
+       out (UART_REG_CMDA), a
+       ld a, UART_CMD_RST_TX
+       out (UART_REG_CMDA), a
+       ; disable TX/RX
+       ld a, UART_CMD_TX_OFF | UART_CMD_RX_OFF
+       out (UART_REG_CMDA), a
+       ; reset MODEA pointer
+       ld a, UART_CMD_RST_MPTR
+       out (UART_REG_CMDA), a
+       ; set the MODEA register
+       ld a, UART_M1_8BIT | UART_M1_NOPAR
+       out (UART_REG_MODEA), a
+       ld a, UART_M2_STOP1
+       out (UART_REG_MODEA), a
+       ; select baud generator set 1
+       xor a
+       out (UART_REG_AUXCTL), a
+       ; set the baud rate
+       ld a, UART_CSEL_TX_9600 | UART_CSEL_RX_9600
+       out (UART_REG_CSELA), a
+       ; enable TX/RX
+       ld a, UART_CMD_TX_ON | UART_CMD_RX_ON
+       out (UART_REG_CMDA), a
+
+       ; --- initialize channel B ---
+       ; reset TX/RX
+       ld a, UART_CMD_RST_RX
+       out (UART_REG_CMDB), a
+       ld a, UART_CMD_RST_TX
+       out (UART_REG_CMDB), a
+       ; disable TX/RX
+       ld a, UART_CMD_TX_OFF | UART_CMD_RX_OFF
+       out (UART_REG_CMDB), a
+       ; reset MODEB pointer
+       ld a, UART_CMD_RST_MPTR
+       out (UART_REG_CMDB), a
+       ; write all 0 to MODEB registers to leave OP1 as a general purpose output
+       xor a
+       out (UART_REG_MODEB), a
+       out (UART_REG_MODEB), a
+       ; set the output port bit 1
+       ld a, 2
+       out (UART_REG_OSET), a
+
+       ld hl, str_hello
+       call uart_putstr
+       ld hl, str_foo
+       call uart_putstr
+
+hlt:   di
+       halt
+       jr hlt
+
+
+uart_putchar:
+       ld b, a
+.wait_txrdy:
+       in a, (UART_REG_STATA)
+       bit 2, a        ; test status bit 2 (TXRDY)
+       jr z, .wait_txrdy
+       ld a, b
+       out (UART_REG_DATAA), a
+       ret
+
+uart_putstr:
+       ld a, (hl)
+       cp a, 0
+       ret z
+       call uart_putchar
+       inc hl
+       jr uart_putstr
+
+str_hello asciiz 'The Z80 says hi!',13,10
+str_foo asciiz 'Foobar',13,10