* This program runs under DDT and allows direct reads and * writes to any sector on a floppy drive. DBOOT EQU 0E000H ;DJ2D BOOT ADDRESS BOOT EQU 00H ;BDOS COLD BOOT BDOS EQU 05H ;BDOS ENTRY CONIN EQU 01 ;CONSOLE IN CONOUT EQU 02 ;CONSOLE OUT printf equ 9 ;print string readf equ 10 ;read string CONSTAT EQU 11 ;RETURNS CONSOLE STATUS TKZERO EQU 0E009H TRKSET EQU 0E00CH SETSEC EQU 0E00FH SETDMA EQU 0E012H DREAD EQU 0E015H DWRITE EQU 0E018H SELDRV EQU 0E01BH TPANIC EQU 0E024H TSTAT EQU 0E029H DMAST EQU 0E02CH STATUS EQU 0E02FH DSKERR EQU 0E034H SETDEN EQU 0E037H SETSIDE EQU 0E03CH ALF EQU 0AH ACR EQU 0DH * ORG 100H LXI SP,STACK LXI B,DBUFF CALL SETDMA start call getins call crlf LDA CONSIZ ORA A JZ DBOOT LDA CONLIN DCR A MOV C,A LDA CONLIN+1 CPI ':' JNZ TBUFRD CALL SELDRV tbufrd call tkzero LDA CONSIZ MOV C,A LXI H,CONLIN BUFRD MOV A,M CPI '/' JZ TKSEC INX H DCR C JNZ BUFRD JMP START TKSEC DCX H MOV A,M ANI 0FH MOV C,A DCX H MOV A,M CPI ' ' JZ TSET CALL DOTENS DCX H MOV A,M CPI ' ' JNZ START TSET CALL TRKSET lxi d,nosutk jc finis DSEC LXI H,CONLIN LDA CONSIZ ADD L MOV L,A JNC NOCRY INR H NOCRY DCX H MOV A,M ANI 0FH MOV C,A DCX H MOV A,M CPI '/' JZ SECTOR CALL DOTENS DCX H MOV A,M CPI '/' JNZ START SECTOR CALL SETSEC lxi d,nosuch jc finis LXI H,CONLIN+1 MOV A,M CPI ':' JNZ NODR INX H INX H MOV A,M JMP RWSEL NODR DCX H MOV A,M RWSEL CPI 'W' JZ WRITE CPI 'R' JNZ START LXI D,1024 LXI H,DBUFF CLRBUF MVI A,0 MOV M,A INX H DCX D MOV A,E ORA D JNZ CLRBUF CALL DREAD jnc endrd sta dbuff lxi d,rderr jmp finis endrd RST 7 WRITE CALL DWRITE jnc endwr sta dbuff lxi d,wrerr jmp finis endwr RST 7 * getins lxi d,intro call print lxi d,conbuf mvi c,readf call bdos ret DOTENS ANI 0FH MOV B,A ADTEN MVI A,0AH ADD C MOV C,A DCR B JNZ ADTEN RET numck ldax d cpi 3ah jp notnum cpi 30h jm notnum ani 0fh mov c,a ret notnum mvi a,0ffh ret CRLF LXI D,LINE PRINT MVI C,PRINTF JMP BDOS FINIS MVI C,PRINTF CALL BDOS RST 7 rderr db acr,alf db 'Read error. Status is first byte of buffer.$' wrerr db acr,alf db 'Write error. Status is first byte of buffer.$' nosuch db acr,alf db 'No such sector on this track.$' nosutk db acr,alf db 'Track number out of range.$' * LINE DB ACR,ALF,'$' intro db acr,alf DB 'ENTER COMMAND LINE IN THIS FORMAT:' DB ACR,ALF DB 'B: (OPTIONAL) R (OR W) TRK/SEC' DB ACR,ALF,'BUFFER AT 0325H' DB ACR,ALF,'$' * savsp dw 0 DS 32 STACK EQU $ DBUFF EQU $ ds 1024 conbuf db conlen consiz ds 1 conlin ds 12 conlen equ $-conlin END