To może inaczej, polecenia settrack, setsector, setdma są bardzo proste, polegają na przepisaniu z rejestrów BC do zdefiniowanych w BIOS komórek pamięci przekazanych przez BDOS parametrów, więc debugowanie tych elementów jest tak naprawdę kontrolą jądra systemu operacyjnego który na pewno działa (no chyba że został zmodyfikowany BDOS, ale tego się nie robi).
BDOS-a oczywiście nie modyfikowałem. Printy debugowe w tych pomniejszych procedurach dodałem tylko po to żeby mieć pewność, że wszystkie parametry są poprawnie ustawianie - wygląda na to, że tak.
Zastanawia mnie tutaj tylko wywalanie się systemu po dodaniu debugów do SETDMA - robię to dokładnie w taki sam sposób, jak we wszystkich innych procedurach, a tylko tutaj skutkuje to zawieszeniem systemu. Opcja z nadpisaniem jakiegoś rejestru odpada, bo robię pełne zrzucenie kontekstu na stos. Stos także nie jest nadpisywany, bo robię jego podmianę na czas wykonywania operacji i printuję wartość SP - nawet nie zbliżam się do końca stosu. Na pierwszy rzut oka nie widzę niczego, co mogłoby być nie tak w tym fragmencie kodu, a jednak dopuszczenie do jego warunkowego budowania wywala system...
BIOS_SETDMA_PROC:
PUSH H ; Save content of HL on original stack
MOV L, C
MOV H, B
SHLD DISK_DMA
LXI H, 0000H ; then switch to bios stack
DAD SP ; HL = HL + SP
SHLD ORIGINAL_SP
LXI H, BIOS_STACK
SPHL ; Bios stack set.
IF DEBUG > 1
PUSH PSW
PUSH B
PUSH D
PUSH H
CALL IPUTS_RS232
DB 'SETDMA procedure entered: '
DB 00H
CALL PRINT_DISK_DEBUG
POP H
POP D
POP B
POP PSW
ENDIF
LHLD ORIGINAL_SP; Restore original stack
SPHL
POP H ; Restore original content of HL
RET
Jedyne miejsce które powinno być sprawdzane to polecenia read i write (na tym etapie niekoniecznie, bo problem jest z odczytem i to najpierw należy rozwiązać) i tam też można odczytać te przygotowane informacje.
Na chwilę obecną dodałem dodatkowe logi, które sprawdzają obliczanie wskaźnika na miejsce w buforze karty CF w zależności od obsługiwanego sektora:
sector=0x0000, calculated source address in CF bufffer = 0x447C
sector=0x0001, calculated source address in CF bufffer = 0x44FC
sector=0x0002, calculated source address in CF bufffer = 0x457C
sector=0x0003, calculated source address in CF bufffer = 0x45FC
Wygląda to ok. Teraz chyba jeszcze dodam robienie pełnego hexdumpa 128 bajtów spod tego adresu przed i po skopiowaniu do bufora wskazywanego w SETDMA, a potem upewnię się czy dane te są konsystentne z obszarem DIR w obrazie dysku.
W tej chwili system korzystania z karty CF nie jest zbyt optymalny, bo zawartość bufora jest odczytywana za każdym razem, nawet jeśli kolejny potrzebny sektor został już pobrany w poprzednim cyklu. Jeśli już uda mi się rozwiązać obecne problemy, zabiorę się za optymalizację.
Kolejna sprawa, czy wszystkie sektory odczytywane w trakcie wykonywania polecenia DIR mają poprawną strukturę katalogów? Brak zdefiniowania tego obszaru może skutkować zapętleniem (wystarczy wypełnić ten obszar wartością 0xE5).
Tego też nie jestem pewien. Swój kod opieram na przykładach z filmów na Youtube, w których gość portuje CP/M 2.2 na swój komputer retro (np.
https://www.youtube.com/watch?v=EtcjFWUOVQw).
Konfiguracja dysku wygląda u mnie następująco:
; Plan:
; - Put 4 128-byte CP/M sectors into each 512-byte CF card block
; - Treat each CF card block as a CP/M track
;
; This filesystem has:
; 128 bytes/sector (CP/M requirement)
; 4 sectors/track (BIOS designer's choice)
; 65536 total sectors (CP/M limit)
; 65536*128 = 8388608 gross bytes (max CP/M limit)
; 65536/4 = 16384 tracks
; 2048 allocation block size BLS (BIOS designer's choice)
; 8388608/2048 = 4096 totalal allocation blocks
; 512 directory entries (BIOS designer's choice)
; 512*32 = 16384 total bytes in the directory
; ceiling(16384/2048) = 8 allocation blocks for the directory
; BLS BSH BLM ------EXM------
; DSM<256 DSM>255
; 1024 3 7 0 x
; 2048 4 15 1 0 <--------- This is what we are using
; 4096 5 31 3 1
; 8192 6 63 7 3
; 16384 7 127 15 7
;
; ** NOTE: This filesystem design is inefficient because it is unlikely
; that ALL of the allocation blocks will ultimately get used!
DISKA_DPH:
DW 0000H ; XLT
DW 0000H ; SCRPAD
DW 0000H
DW 0000H
DW DIRBUF ; DIRBUF
DW DISKA_DPB ; DPB
DW 0000H ; CSV
DW DISKA_ALV ; ALV
DISKA_DPB:
DW 4 ; SPT (four 128 bytes per 512 byte track)
DB 4 ; BSH (for BLS 2048)
DB 15 ; BLM (for BLS 2048)
DB 00H ; EXM
DW 4063 ; DSM (max allocation number)
DW 511 ; DRM
DB 0FFH ; AL0
DB 00H ; AL1
DW 0000H ; CKS
DW 0020H ; OFF
DISKA_ALV:
DS (4065/8)+1
DISKA_ALV_END
DIRBUF DS 128
Obraz jest budowany na komputerze za pomocą cpmtools, w Makefile:
mkfs.cpm -f polon-2k-8m -b cpm22.bin poloncpm.img
cpmcp -f polon-2k-8m poloncpm.img ./filesystem/* 0:
Definicja polon-2k-8m wygląda następująco:
diskdef polon-2k-8m
seclen 128
tracks 16384
sectrk 4
blocksize 2048
maxdir 512
skew 1
boottrk 32
os 2.2
end