Good day everyone,
I'm happy to make a return of another contribtion to the community. Here I had a steady state protected mode program for simple scanning data functions. The goal was to make an auxiliary compiler for novice enthusiastic (like myself haha) for parsing things like data values and word processing.
This post is showing the design state where I'm trying to add a read file function right beside the scan functions. Curiously I couldn't get the buffer values to reserve when I run beside the scan code so I tried adding a standard task state to check in the larger state machine. Here the yield is getting me mixed results when tracking the values between states. I found that keeping track of values in the standard datapipes has te closest result so I left the value in cx to (mov) into the pre-protected mode state. Here however is where I get mixed results because when I check the (cmp) gate to move to the new module it just falls through it without the logic!
I wanted to post a copy of this for review so I'm posting each part step by step and add the full reference for anyone else intrigued by this prospect.
First area is the stack functions for cmd_buffer given by cmd_prompt1 and the reference function given by cmd_prompt1.A
cmd_prompt1:
call Heap_Buffer
call Encoder
; call Paging
; call Filer
mov byte [Ref_CountA],0
call Parser.Blank
call Parser.Signature_Scan
call Parser.Assignment
call Decoder
call cmp_delta
;task segment prep code
.A:
;push cs
;push .A
push .B
pop word [Ref_Task_1]
;pop cx
;mov word [Ref_Task_1],cx
;call Domain.TaskA
jmp Domain.TaskA
.B:
jmp cmd_buffer
;qqqqqqqqqqq
;native test code skip
;task prep code area
.TaskA:
jmp poll_function
simple prep area gate for return tasking
; prep area
; prep area
Ref_Task1: dw 0
;protectedGate1:
;qqqqqqqqqqqq
;preset code
;task segment preset
mov word [Ref_Task1],cx
;cmp word [Ref_Task1],0
cmp cx,0
jz short protectedGate1
jmp TaskA
;qqqqqqqqqqqqq
protectedGate1:
mov si,String
call cmdprint
cld
cli
in al,0x92
or al,2
out 0x92,al
lgdt[gdt32Ptr]
lidt[IdtPipe]
mov eax, cr0
or eax,1
mov cr0, eax
; mov [saved_segment],ds
jmp code32_post:__protected_mode_32
%include 'file_system.inc'
TaskA:
cmp cx,0
jz protectedGate1
call Filer
jmp protectedGate1
.inc file for the read file test
;section .data
file db "text.txt",0
;section .bss
;test values
;referencer resb 4
;buffer resb 1024
;referencer db 4
;buffer db 1024
;buffer db 100
;len equ 1024
len equ 100
;
;
;section .text
global Filer
Filer:
mov eax,5
mov ebx,file
mov ecx,0
int 80h
mov [referencer],eax
; read presets
mov eax,3
mov ebx,[referencer]
mov ecx,buffer ;read to buffer
mov edx,len ;
int 80h ;read len db to buffer
mov edx,eax ;puts data counted
; write presets
mov eax,4 ;write preset
mov ebx,1 ;to primary stream
mov ecx,buffer ;from primary buffer
int 80h ;reserve all read scanned data from buffer
mov eax,6 ;close file preset
mov ebx,[referencer] ;
int 80h ;
mov eax,1
mov ebx,0
int 80h
ret
Pseudocode proof-of-concept on scan
int data1 = 12 _ int data2 = 23 _
check the page.Main values for yield
Summary
Currently I'm trying to debug this as native code. While I have experience with debuggers like gdb I sometimes run into unknowns such as when data segments jump outside of expected values in this case file_system.inc . If anyone else would like an explanation of my debug settings please let me know so I can clarify further testing.
Notice 1-
I got the machine steady but still not stable. the new file instructions stall when I (cmp) pass by exact value instead of reference. What's more curious is according to my gdb now the jump @ cmp goes into the 512 boot segment.
; ReTimerOS
; Copyright (C) 2022,2023 Christopher Hoy
;
; This file is part of ReTimerOS
; ReTimerOS is free software: you can redistribute it and/or modify
; it under the terms of the GNU General Public License as published by
; the Free Software Foundation, either version 3 of the License, or
; (at your option) any later version.
;
; This program is distributed in the hope that it will be useful,
; but WITHOUT ANY WARRANTY; without even the implied warranty of
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
; GNU General Public License for more details.
;
; You should have received a copy of the GNU General Public License
; along with this program. If not, see <https://www.gnu.org/licenses/>.
;%define REBASE_ADDRESS(A) (0x7E00 + ((A) - protectedGate1))
%define BUILD_GDT_DESC(bounds,base,access,flags) \
((( base & 0x00FFFFFF) << 16) | \
(( base & 0xFF000000) << 32) | \
( bounds & 0x0000FFFF) | \
(( bounds & 0x000F0000) << 32) | \
(( access & 0xFF) << 40) | \
(( flags & 0x0F) << 52))
;[ORG 0x7E00]
[BITS 16]
;section .text
; prep area
Ref_Task1: dw 0
;protectedGate1:
;qqqqqqqqqqqq
;preset code
;task segment preset
mov word [Ref_Task1],cx
;cmp word [Ref_Task1],0
;cmp cx,0
;jz short protectedGate1
cmp cx,0x8b76
jz TaskA
;jmp TaskA
;qqqqqqqqqqqqq
protectedGate1:
mov si,String
call cmdprint
cld
cli
in al,0x92
or al,2
out 0x92,al
lgdt[gdt32Ptr]
lidt[IdtPipe]
mov eax, cr0
or eax,1
mov cr0, eax
; mov [saved_segment],ds
jmp code32_post:__protected_mode_32
%include 'file_system.inc'
TaskA:
cmp cx,0
jz protectedGate1
call Filer
jmp protectedGate1
cmdprint:
cld
mov ah,0x0E
cmdstring:
lodsb
int 0x10
cmp al,0
jnz cmdstring
ret
;section .text
[bits 32]
; 32 bit protected mode
__protected_mode_32:use32
; mov ax, 0x10
mov ax,data32_post
mov ds, ax
mov es, ax
mov fs, ax
mov gs, ax
; mov ss, ax
; restate cr3
mov cr3, ebx
; restate esp
mov esp, edx
mov cx,[gate_voucher]
cmp word [gate_voucher],0
jnz loopcheck
mov word [gate_voucher],1
jmp BIOS32_PREP
loopcheck:
hlt
jmp loopcheck
; jmp 0x8000
BIOS32_PREP:use32
; pusha
;pushf
; save current esp to edx
mov edx, esp
; jumping to 16 bit protected mode
; disable interrupts
cli
; clear cr3 by saving cr3 data in ebx register
xor ecx, ecx
mov ebx, cr3
mov cr3, ecx
jmp code16_post:__protected_mode_16
[bits 16]
; 16 bit protected mode
__protected_mode_16:use16
; jumping to 16 bit real mode
xor eax,eax
xor ecx,ecx
; mov ax, 0x38
mov cx,data16_post
; mov ax,0
mov ds, cx
mov es, cx
mov fs, cx
mov gs, cx
mov ss, cx
; turn off protected mode
; set bit 0 to 0
;tss prep
mov bp,word [Ref_Task1]
mov eax, cr0
and al, ~0x01
mov cr0, eax
; jmp 0x0:REBASE_ADDRESS(__real_mode_16)
; jmp 0x0:REBASE_ADDRESS(0x0000_9000)
jmp 0x8000
; jmp 0x9C00
; jmp 0x9e00
; jmp 0xa000
; jmp 0xc000
; jmp 0xee00
; jmp 0xf400
; jmp 0xf000
;section .data
String: db 'platform 2',10,13,0
checkString: db 'check',10,13,0
gdt32:
dq BUILD_GDT_DESC(0,0,0,0)
gdt32code:
dq BUILD_GDT_DESC(0x0000ffff,0,10011010b,1100b)
gdt32data:
dq BUILD_GDT_DESC(0x0000ffff,0,10010010b,1100b)
gdt16code:
dq BUILD_GDT_DESC(0x0000ffff,0,10011010b,1000b)
gdt16data:
dq BUILD_GDT_DESC(0x0000ffff,0,10010010b,1000b)
.stub1:
code32_post: equ gdt32code -gdt32
data32_post: equ gdt32data -gdt32
;.stub:
code16_post: equ gdt16code -gdt32
data16_post: equ gdt16data -gdt32
; tss32_post: equ gdt32tss -gdt32
gdt32Len: equ $-gdt32
gdt32Ptr: dw gdt32Len-1
dd gdt32
save_cr0 dd 0
save_cr3 dd 0
saved_segment resd 0
gate_voucher dw 0
saved_stack resw 0
IdtPipe:
dw 0x03ff
dd 0
referencer: times 4 db 4
buffer: times 100 db 1
times 512-($-$$) db 0
;%include 'gdt.inc'
Notice 2
I managed to get to the right task area when I push and pop the value but now I'm getting stuck on the call inside the task
push cx
pop bx
cmp cx,bx
jz TaskA
Notice 3
Had to fix the bound values to fit the file segments (1024->100) and currently testing the instruction segment sequences.