several fixes
This commit is contained in:
@@ -7,6 +7,7 @@
|
||||
beep:
|
||||
push AF
|
||||
push DE
|
||||
di
|
||||
beep_loop:
|
||||
LD A,0x08
|
||||
OUT (CS_PIO_AD), A
|
||||
@@ -20,6 +21,7 @@ beep_loop:
|
||||
jr NZ, beep_loop
|
||||
pop de
|
||||
pop af
|
||||
ei
|
||||
ret
|
||||
|
||||
beep_pause:
|
||||
|
||||
@@ -23,6 +23,10 @@ COMMAND_LUT:
|
||||
db "?", 0, [OP_DUMP], [OP_DUMP]>>8 ;Print memory
|
||||
db 0xFF ;End of Table
|
||||
|
||||
COMMAND_ABORT:
|
||||
;cleanup stack
|
||||
ld sp, STACK_RAM_TOP
|
||||
; return to prompt
|
||||
COMMAND:
|
||||
call print_newLine
|
||||
ld hl,[var_dir]
|
||||
@@ -148,6 +152,8 @@ COMMAND_PROCESS_FOUND:
|
||||
_COMMAND_PROCESS_FOUND
|
||||
JP (HL)
|
||||
|
||||
|
||||
|
||||
NOT_IMPLEMENTED:
|
||||
LD HL,[_STR_NOT_IMPLEMENTED]
|
||||
CALL print_str
|
||||
|
||||
@@ -6,51 +6,19 @@
|
||||
;9600 -> 12 / 00110000
|
||||
;
|
||||
|
||||
|
||||
CONSOLE_INIT:
|
||||
CONSOLE_INIT_CTC:
|
||||
;LD A,00001111b ; Set /16 Divider, CPU Trigger, Time COnstant Follows
|
||||
LD A,01001111b ; External Trigger, Time COnstant Follows
|
||||
OUT (CS_CTC_0),A
|
||||
IN A,(CS_DIP) ; Read BAUD from DIP-Switches
|
||||
;LD A,39
|
||||
OUT (CS_CTC_0),A
|
||||
CONSOLE_INIT_SIO:
|
||||
LD A,00110000b ;write into WR0: error reset, select WR0
|
||||
OUT (CS_SIO_A_C),A
|
||||
LD a,018h ;write into WR0: channel reset
|
||||
OUT (CS_SIO_A_C),A
|
||||
LD a,004h ;write into WR0: select WR4
|
||||
OUT (CS_SIO_A_C),A
|
||||
LD a,01000100b ;write into WR4: clkx16,1 stop bit, no parity
|
||||
OUT (CS_SIO_A_C),A
|
||||
LD a,005h ;write into WR0: select WR5
|
||||
OUT (CS_SIO_A_C),A
|
||||
LD a,11101000b ;DTR inactive, TX 8bit, BREAK off, TX on, RTS inactive
|
||||
OUT (CS_SIO_A_C),A
|
||||
LD a,01h ;write into WR0: select WR1
|
||||
OUT (CS_SIO_A_C),A
|
||||
LD a,00000100b ;no interrupt in CH B, special RX condition affects vect
|
||||
OUT (CS_SIO_A_C),A
|
||||
LD a,02h ;write into WR0: select WR2
|
||||
OUT (CS_SIO_A_C),A
|
||||
LD a,0h ;write into WR2: cmd line int vect (see int vec table)
|
||||
;bits D3,D2,D1 are changed according to RX condition
|
||||
OUT (CS_SIO_A_C),A
|
||||
LD a,003h ;write into WR0: select WR3
|
||||
OUT (CS_SIO_A_C),A
|
||||
LD a,0C1h ;RX 8bit, auto enable off, RX on
|
||||
OUT (CS_SIO_A_C),A
|
||||
;Channel A RX active
|
||||
RET
|
||||
call con_rb_init; initialize ring buffer
|
||||
call consio_init_a
|
||||
ret
|
||||
|
||||
|
||||
; A contains char
|
||||
; Destroys A
|
||||
print_char:
|
||||
push af
|
||||
out (CS_SIO_A_D),a
|
||||
call print_wait_out
|
||||
call consio_tx_a
|
||||
pop af
|
||||
;call print_char
|
||||
ret
|
||||
; HL contains pointer to string
|
||||
; Destroy A, HL
|
||||
@@ -105,7 +73,7 @@ print_bcd:
|
||||
call print_char
|
||||
ret
|
||||
|
||||
read_char:
|
||||
read_char_raw:
|
||||
call A_RTS_ON
|
||||
nop
|
||||
xor a ; a = 0
|
||||
@@ -117,14 +85,8 @@ read_char:
|
||||
in a, (CS_SIO_A_D) ; read char if avail
|
||||
ret ; return
|
||||
|
||||
|
||||
read_in_sts:
|
||||
out (CS_SIO_A_C), a ; select reg 0
|
||||
in a, (CS_SIO_A_C) ; read reg 0
|
||||
and 1 ; mask D0 (recieve char available)
|
||||
ret z
|
||||
ld a, 0xFF
|
||||
ret
|
||||
read_char:
|
||||
jp consio_rx_a
|
||||
|
||||
read_bcd;
|
||||
call read_char
|
||||
@@ -158,6 +120,59 @@ print_16_hex:
|
||||
call print_a_hex
|
||||
ret
|
||||
|
||||
;input ringbuffer
|
||||
;initialize ringbuffer
|
||||
con_rb_init:
|
||||
xor a
|
||||
ld (var_buffer_conin_in),a
|
||||
ld (var_buffer_conin_out),a
|
||||
ld (var_buffer_conin_sts),a
|
||||
ret
|
||||
|
||||
con_rb_read:
|
||||
push hl
|
||||
push de
|
||||
ld a,(var_buffer_conin_in)
|
||||
ld b,a
|
||||
ld a,(var_buffer_conin_out)
|
||||
cp b ;check if equal
|
||||
jp z, con_rb_read_empty
|
||||
;if not equal, buffer contians data
|
||||
ld h, high [var_buffer_conin_data] ;load high byte for pointer
|
||||
ld l, a
|
||||
ld a,(hl)
|
||||
push af
|
||||
;move pointer
|
||||
ld a,(var_buffer_conin_out)
|
||||
inc a
|
||||
ld (var_buffer_conin_out),a
|
||||
pop af
|
||||
pop de
|
||||
pop hl
|
||||
ret
|
||||
con_rb_read_empty:
|
||||
ld a,1
|
||||
ld (var_buffer_conin_sts),a
|
||||
xor a
|
||||
pop de
|
||||
pop hl
|
||||
ret
|
||||
|
||||
con_rb_write:
|
||||
push hl
|
||||
push af
|
||||
ld h, high [var_buffer_conin_data] ;load high byte for pointer
|
||||
ld a,(var_buffer_conin_in)
|
||||
ld l,a
|
||||
pop af
|
||||
ld (hl),a
|
||||
ld a,(var_buffer_conin_in)
|
||||
inc a
|
||||
ld (var_buffer_conin_in),a
|
||||
;TODO: check for overflow
|
||||
pop hl
|
||||
ret
|
||||
|
||||
|
||||
;MSG_CRSR_0:
|
||||
; db 0x1B, "[?25h",0
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
;================================================================
|
||||
IDE_CMD_IDENT .EQU 0xEC ;Identify drive.
|
||||
IDE_CMD_READSEC .EQU 0x20 ;Read sectors.
|
||||
IDE_CMD_WRITESEC .EQU 0x30 ;Write sectors.
|
||||
|
||||
;================================================================
|
||||
; IDE Variables
|
||||
|
||||
85
OperatingSystem/monitor_v2/include/kdrv_int.s
Normal file
85
OperatingSystem/monitor_v2/include/kdrv_int.s
Normal file
@@ -0,0 +1,85 @@
|
||||
|
||||
INT_VEC_TABLE .equ [interrupt_vectors]
|
||||
INT_PIO_ADDRD .equ CS_PIO_AD
|
||||
INT_PIO_ADDRC .equ CS_PIO_AC
|
||||
|
||||
;initialize interrupt controller
|
||||
intctrl_init:
|
||||
;disable interrupt (just to make sure)
|
||||
di
|
||||
;setup interrupt table
|
||||
ld a,high [INT_VEC_TABLE]
|
||||
ld i,a
|
||||
|
||||
;setup PIO
|
||||
ld a, 10000011b ;enable interrupt
|
||||
out (INT_PIO_ADDRC), a
|
||||
ld a, 00000010b ;set interrupt vector
|
||||
out (INT_PIO_ADDRC), a
|
||||
ld a, 11001111b ;setup as controll port
|
||||
out (INT_PIO_ADDRC), a
|
||||
ld a, 11110111b ;set all as inputs
|
||||
out (INT_PIO_ADDRC), a
|
||||
ld a, 10010111b ;enable interrupt; logic or, mask follows
|
||||
out (INT_PIO_ADDRC), a
|
||||
ld a, 11000000b ;set interrupt mask
|
||||
out (INT_PIO_ADDRC), a
|
||||
|
||||
; set port
|
||||
xor a
|
||||
out (INT_PIO_ADDRD), a
|
||||
|
||||
;fill table
|
||||
ld hl,[INT_VEC_TABLE]
|
||||
ld b,128
|
||||
_intctrl_init_fill_loop:
|
||||
ld a, low [_int_invalid_int]
|
||||
ld (hl),a
|
||||
inc hl
|
||||
ld a, high [_int_invalid_int]
|
||||
ld (hl),a
|
||||
inc hl
|
||||
djnz _intctrl_init_fill_loop
|
||||
|
||||
;set int vector for PIO
|
||||
ld hl, [_isr_pio]
|
||||
ld (INT_VEC_TABLE + 2), hl
|
||||
|
||||
;enable interrupts
|
||||
im 2
|
||||
ret
|
||||
|
||||
;------------------------------------------------------------------------------
|
||||
; setup interrupt for PIO pin
|
||||
; inputs: a (interrupt pin)
|
||||
; hl (jump addr)
|
||||
;------------------------------------------------------------------------------
|
||||
initctrl_int_register:
|
||||
|
||||
;------------------------------------------------------------------------------
|
||||
; removes interrupt for PIO pin
|
||||
; inputs: a (interrupt pin)
|
||||
;------------------------------------------------------------------------------
|
||||
initctrl_int_abandon:
|
||||
|
||||
; jumps to isr. MUST be exited with RETI opcode!
|
||||
_isr_pio:
|
||||
di
|
||||
ld hl, [_str_pio_interrupt]
|
||||
call print_str
|
||||
;get int from pio
|
||||
in a,(INT_PIO_ADDRD)
|
||||
call print_a_hex
|
||||
|
||||
_int_invalid_int:
|
||||
di
|
||||
ld hl, [_str_invalid_interrupt]
|
||||
call print_str
|
||||
ei
|
||||
reti
|
||||
|
||||
_str_invalid_interrupt:
|
||||
db 10,13,"[KERNEL] INT: Invalid interrupt call! Exiting ISR.",10,13,0
|
||||
|
||||
_str_pio_interrupt:
|
||||
db 10,13,"[KERNEL] INT: (DEBUG) Interrupt call from PIO.",10,13,0
|
||||
124
OperatingSystem/monitor_v2/include/kdrv_sio.s
Normal file
124
OperatingSystem/monitor_v2/include/kdrv_sio.s
Normal file
@@ -0,0 +1,124 @@
|
||||
;----------------------------------------------------------------
|
||||
;BIOS Driver for Serial Console
|
||||
;by Dennis Gunia (07/2024)
|
||||
;
|
||||
;----------------------------------------------------------------
|
||||
|
||||
;================================================================
|
||||
; I/O access functions
|
||||
;================================================================
|
||||
;initialize SIO Port A
|
||||
|
||||
consio_init_a:
|
||||
call consio_init_ctc_a
|
||||
call consio_init_a_sio
|
||||
;call consio_init_a_int
|
||||
ret
|
||||
|
||||
consio_init_a_sio:
|
||||
ld A, 00110000b ;write into WR0: error reset, select WR0
|
||||
out (CS_SIO_A_C), a
|
||||
ld a, 018h ;write into WR0: channel reset
|
||||
out (CS_SIO_A_C), a
|
||||
ld a, 004h ;write into WR0: select WR4
|
||||
out (CS_SIO_A_C), a
|
||||
ld a, 01000100b ;write into WR4: clkx16,1 stop bit, no parity
|
||||
out (CS_SIO_A_C), a
|
||||
ld a, 005h ;write into WR0: select WR5
|
||||
out (CS_SIO_A_C), a
|
||||
ld a, 11101000b ;DTR inactive, TX 8bit, BREAK off, TX on, RTS inactive
|
||||
out (CS_SIO_A_C), a
|
||||
ld a, 01h ;write into WR0: select WR1
|
||||
out (CS_SIO_A_C), a
|
||||
ld a, 00000100b ;no interrupt in CH B, special RX condition affects vect
|
||||
out (CS_SIO_A_C), a
|
||||
ld a, 02h ;write into WR0: select WR2
|
||||
out (CS_SIO_A_C), a
|
||||
ld a, 0h ;write into WR2: cmd line int vect (see int vec table)
|
||||
;bits D3,D2,D1 are changed according to RX condition
|
||||
out (CS_SIO_A_C), a
|
||||
ld a, 003h ;write into WR0: select WR3
|
||||
out (CS_SIO_A_C), a
|
||||
ld a, 0C1h ;RX 8bit, auto enable off, RX on
|
||||
out (CS_SIO_A_C), a
|
||||
ret
|
||||
|
||||
consio_init_a_int:
|
||||
;setup SIO interrupt vector
|
||||
ld a, 2 ;write WR2
|
||||
out (CS_SIO_B_C), a
|
||||
ld a, 00000100b ;write Vector
|
||||
out (CS_SIO_B_C), a
|
||||
;setup SIO
|
||||
ld a, 1 ;write WR1
|
||||
out (CS_SIO_A_C), a
|
||||
ld a, 00011000b ;enable INT on all RX
|
||||
out (CS_SIO_A_C), a
|
||||
;set ISR addr
|
||||
ld hl, [consio_isr]
|
||||
ld (INT_VEC_TABLE + 4), hl
|
||||
ret
|
||||
|
||||
consio_init_ctc_a:
|
||||
ld a, 01001111b; External Trigger, Time COnstant Follows
|
||||
out (CS_CTC_0),a
|
||||
in a, (CS_DIP) ; Read BAUD from DIP-Switches
|
||||
out (CS_CTC_0),a
|
||||
ret
|
||||
|
||||
|
||||
consio_tx_a:
|
||||
out (CS_SIO_A_D),a
|
||||
consio_tx_a_waitout:
|
||||
; check for TX buffer empty
|
||||
sub a ;clear a, write into WR0: select RR0
|
||||
inc a ;select RR1
|
||||
out (CS_SIO_A_C),A
|
||||
in A,(CS_SIO_A_C) ;read RRx
|
||||
bit 0,A
|
||||
jr z,consio_tx_a_waitout
|
||||
ret
|
||||
|
||||
consio_rx_a:
|
||||
call consio_rx_rts_a_on
|
||||
xor a ; a = 0
|
||||
out (CS_SIO_A_C), a ; select reg 0
|
||||
in a, (CS_SIO_A_C) ; read reg 0
|
||||
and 1 ; mask D0 (recieve char available)
|
||||
call A_RTS_OFF
|
||||
ret Z ; return 0 if no char
|
||||
in a, (CS_SIO_A_D) ; read char if avail
|
||||
ret ; return
|
||||
|
||||
consio_rx_rts_a_on:
|
||||
ld a,005h ;write into WR0: select WR5
|
||||
out (CS_SIO_A_C),A
|
||||
ld a,0EAh ;DTR active, TX 8bit, BREAK off, TX on, RTS active
|
||||
out (CS_SIO_A_C),A
|
||||
ret
|
||||
|
||||
consio_rx_rts_a_off:
|
||||
ld a,005h ;write into WR0: select WR5
|
||||
out (CS_SIO_A_C),A
|
||||
ld a,068h ;DTR inactive, TX 8bit, BREAK off, TX on, RTS inactive
|
||||
out (CS_SIO_A_C),A
|
||||
ret
|
||||
|
||||
consio_rx_a_sts:
|
||||
out (CS_SIO_A_C), a ; select reg 0
|
||||
in a, (CS_SIO_A_C) ; read reg 0
|
||||
and 1 ; mask D0 (recieve char available)
|
||||
ret z
|
||||
ld a, 0xFF
|
||||
ret
|
||||
|
||||
|
||||
;Interrupt service routine
|
||||
consio_isr:
|
||||
di
|
||||
ld a, 00111000b ;RET fro INT
|
||||
out (CS_SIO_B_C), a ;read data
|
||||
in a, (CS_SIO_A_D)
|
||||
call con_rb_write ;write to ringbuffer
|
||||
ei
|
||||
reti
|
||||
@@ -2,7 +2,7 @@
|
||||
; BIOS Routines entry points
|
||||
; Do not move in memory!!!!
|
||||
;-------------------------------------
|
||||
.org 0x0050
|
||||
org 0x0050
|
||||
B_BEEP:
|
||||
jp beep
|
||||
|
||||
|
||||
Reference in New Issue
Block a user