several fixes

This commit is contained in:
2024-11-30 15:41:09 +01:00
parent 1ed6034d99
commit a5f5c6b9ef
227 changed files with 769511 additions and 94738 deletions

View File

@@ -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:

View File

@@ -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

View File

@@ -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

View File

@@ -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

View 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

View 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

View File

@@ -2,7 +2,7 @@
; BIOS Routines entry points
; Do not move in memory!!!!
;-------------------------------------
.org 0x0050
org 0x0050
B_BEEP:
jp beep