M@*dTD 4 $|l\L ډvD|J摴P앺V$\*ƞb0̢h6ҦNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN6?NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNCNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN%VNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN+uNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN&NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN`NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNCNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN&NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN,#NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN 0NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNS.NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNp!NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN!NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN'0NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN-NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNclNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN @cNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN}NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN",NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN( NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN.ANNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNP]NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN sRNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN5LNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNڇNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN#NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN)NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN/pNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNʹNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN%rNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN$eNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN*FNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN0=NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNpNNNNNNNˁg5хm; ׉sAݍyG㑱M長S!Y'Þ_-ɢe3ϦNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNθNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN!sNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN%aNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN+BNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN1NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNW/NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNt NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN ~NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN&4NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN,NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN "NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNdNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNGNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN!ONNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN'NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN-"NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNT\NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN wSNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN1MNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNކNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN"NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN(NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN.qNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNgmNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN DbNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN|NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN#-NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN)$NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN/@NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN2>NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNBNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN$RNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN*qNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN0 NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNN΁h6҅n< ։r@ۍwEᑯ}K啳O뙹U#񝿞\+Ƣb0˦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNENNNNNNNNNNNNNNNNNNNNN!HBIO300 Z80 HBIO300 Z80 HBIO305 Z80HBIO305 Z80 !NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNHBIO310 Z80HBIO310 Z80wHBIO311 Z80HBIO311 Z80TkNNNNNNNNNNNNNNNN B(NNNNNNNNNNNNNNNNNNNNN!FBIO306 Z80STUVWXYZFBIO306 Z80[\]^_`abFBIO306 Z80cdefghijFBIO306 Z800klmz!NNNNNNNNNNNNNNNNbTNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN'9NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN%gNNNNNNNNNNNNNNNNNNNNNNENTIAL CODE) LSTINC EQU FALSE ;LIST INCLUDE FILES HARDBT EQU TRUE ;HARD DISK BOOT (FALSE= FLOPPY BOOT) USEMON EQU TRUE ;US=nNNNNNNNNNNNNNNNNN+hNNNNNNNNNNNNNNNNNNNNNN3 OF HARD DISK PHYSICAL DRIVE 0 ; C SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 1 ; D SIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 1 S'NNNNNNNNNNNNNNNNNRNNNNNNNNNNNNNNNNNNNNNNHBIO305 Z80n"#$%&'(BIOSFUNSDOC)*HBIO314 Z80+,-./01uHBIO313 Z8023456789TiNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNHBIO311 Z80UFBIO305 Z80FBIO305 Z80FBIO305 Z80nNNNNNNNNNNNNNNNN{NNNNNNNNNNNNNNNNNNNNNNBFTST C hnopqrstHBIO314 Z80vwxyz{|}HBIO314 Z80~HBIO314 Z80' NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN 2NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN&4NNNNNNNNNNNNNNNNNNNNNNE MONITOR ROM I/O ROUTINES IF TRUE INTRPTS EQU TRUE ;ENABLE INTERRUPT PROCESSING WHISTLE INTCPTS EQU TRUE ;ENABLE SYSTEM CAL+NNNNNNNNNNNNNNNNNN,wNNNNNNNNNNNNNNNNNNNNN! ; E JADE 8" FLOPPY PHYSICAL DRIVE 0 ; F JADE 8" FLOPPY PHYSICAL DRIVE 1 ; G JADE 5" FLOPPY PHYSICAL DRIVE 0 ; H JADEerNNNNNNNNNNNNNNNa'NNNNNNNNNNNNNNNNNNNNNNHBIO313 Z80:;<=>?@AHBIO313 Z80BCDEFGHIHBIO313 Z80&JKLHBIO315 Z80MNOPQRSTNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNFBIO313 Z80FBIO313 Z80FBIO313 Z80FBIO313 Z80/ANNNNNNNNNNNNNNNNN$JNNNNNNNNNNNNNNNNNNNNN!HBIO302 Z80HBIO302 Z80HBIO302 Z80lFBIO301 Z80HBIO309 Z80?@ABCDEFHBIO309 Z80tGHIJKLMNHBIO300 Z80^OPQRY_NNNNNNNNNNNNNNNNQeNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN$VNNNNNNNNNNNNNNNNNNNNN!AGS ; ;============================================================================ SHORT EQU TRUE ;SHORT BIOS (REMOVES UNESANNNNNNNNNNNNNNNN*YNNNNNNNNNNNNNNNNNNNNNN; CPM ; DRIVE USAGE IF BOOT = 'H' ;HARD DISK BOOT CONFIG. ; A SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 0 ; B SIDE 2 & 7|NNNNNNNNNNNNNNNN01NNNNNNNNNNNNNNNNNNNNNN PHYSICAL DRIVE 1 ENDIF IF BOOT = 5 ; G JADE 8" FLOPPY PHYSICAL DRIVE 0 ; H JADE 8" FLOPPY PHYSICAL DRIVE 1 ; As+NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN8NNNNNNNˁg5хm; ׉q@܍yG㑰M長S!X&\*Ţa.ʦNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN0uNNNNNNNNNNNNNNNNNNNNNN JADE 5" FLOPPY PHYSICAL DRIVE 0 ; B JADE 5" FLOPPY PHYSICAL DRIVE 1 ; C SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 0 ; D SVrNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNORT BITS. ; ; 2.2.7 - 8 MAR 83 GRH ; ADDED CLOCK/CALENDAR DRIVER, SYSTEM CALL INTERCEPT, ; ILLEGAL SYSTEM CALL MESSAGE, CHAN\_NNNNNNNNNNNNNNNNN uNNNNNNNNNNNNNNNNNNNNNNy ; ; 2.02 - 2 JUN 84 GRH ; Change floppy disk drivers to relate to ISASI control of JADE ; FDC. ; Change IOPB sector 5BINNNNNNNNNNNNNNNNUdNNNNNNNNNNNNNNNNNNNNNNoppy firmware support. ; Implemented disk drive driver tables and new function to return ; a ptr to a drive table. ; RemovedQHNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN3C00H ;ADDRESS OF BDOS BIOS: EQU CPMBS + 4A00H ;ADDRESS OF BDOS BIOSR: EQU 1000H - BIOS ; PAGE0: EQU 0 ;START OF CP/M RAM NNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNOOT = 'H' LASTSEC EQU 46 + 1 ;LAST BOOT SECTOR ; STHD EQU 0 ;START LOGICAL DRIVE OF HARD DISK NDHD EQU 3 ;LAST LOGICAL DRNNNNNNNNNNNNNNNNN%WNNNNNNNNNNNNNNNNNNNNNNGICAL DRIVE OF HARD DISK NDHD EQU 3 ;LAST LOGICAL DRIVE OF HARD DISK ST8FD EQU 4 ;START LOGICAL DRIVE OF 8" FLOPPY ND8FD EQ}NNNNNNNNNNNNNNNNN+XNNNNNNNNNNNNNNNNNNNNNN;============================================================================ CALROM EQU 7 ;CALENDAR ROM SELECT # RDBENT EQU e9NNNNNNNNNNNNNNNNe&NNNNNNNNNNNNNNNNNNNNNNIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 0 ; E SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 1 ; F SIDE 2 & 3 OF HARD DISK PHYSICAL KNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNGED BIOS SIZE TO END ; OF INITIALIZED DATA AREA. RESTRUCTURE MODULES. ; ; 2.28 - 22 APR 83 GRH ; CHANGED DEFINITIONS TO ALJDNNNNNNNNNNNNNNNN KNNNNNNNNNNNNNNNNNNNNNNvalue from physical sector (1..n) to logical ; sector value (0..n-1). This maintains more uniformity in ; parameter pass8rNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN! init of IOBYTE. ; Implemented 5" floppy driver. ; Implemented use of ROM primitives. ; Moved system down to 60k. ; VERSN E$NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!IOBYTE: EQU PAGE0 + 3 ;IOBYTE ADDR DEFDRV: EQU PAGE0 + 4 ;DEFAULT DRIVE PARAM ADDR DKPROM EQU PAGE0 + 40H ;DISK PRIMITIVES PROarNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNIVE OF HARD DISK ST8FD EQU 4 ;START LOGICAL DRIVE OF 8" FLOPPY ND8FD EQU 5 ;LAST LOGICAL DRIVE OF 8" FLOPPY ST5FD EQU 6 ;SJNNNNNNNNNNNNNNNNN&NNNNNNNNNNNNNNNNNNNNNNU 5 ;LAST LOGICAL DRIVE OF 8" FLOPPY ST5FD EQU 6 ;START LOGICAL DRIVE OF 5" FLOPPY ND5FD EQU 7 ;LAST LOGICAL DRIVE OF 5" FL[NNNNNNNNNNNNNNNNNN,@NNNNNNNNNNNNNNNNNNNNN!0F800H ;READ CLOCK BUFFER ENTRY SETENT EQU RDBENT + 3 ;SET CLOCK ENTRY CALENT EQU RDBENT + 6 ;RETURN CALENDAR ENTRY TIMENT EENNNNNNNNNNNNNNNNVNNNNNNNNNNNNNNNNNNNNNNDRIVE 1 ENDIF ; ;************************************************************* ; REVISIONS: ; ; 2.2.0 - RELEASE ; PNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNLOW BIG DIRECTORIES. ; DISALLOWED DRIVES C & D. ; ; 2.29 - 3 SEP 83 GRH ; Changed Rev # for blocked DCM. Enables IBM systeNNNNNNNNNNNNNNNNzNNNNNNNNNNNNNNNNNNNNNNing between hard disk & JADE floppy IOPBs. ; Vector I/O routines to monitor rom routines. ; ; 2.03 - 4 JUN 84 GRH ; Add beNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNQU '00' ; ;**************************************************************************** SUBTTL SYSTEM DECLARATIONS ;=====mrNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNM # (STORED BY DKBOOT) DEFBFR EQU PAGE0 + 80H ;DEFAULT BUFFER TPA: EQU 100H ;============================================{NNNNNNNNNNNNNNNNN!6NNNNNNNNNNNNNNNNNNNNN!TART LOGICAL DRIVE OF 5" FLOPPY ND5FD EQU 7 ;LAST LOGICAL DRIVE OF 5" FLOPPY ENDIF IF BOOT = 8 LASTSEC EQU 45 ;LAST qzNNNNNNNNNNNNNNNN'5NNNNNNNNNNNNNNNNNNNNNNOPPY ENDIF ;============================================================================ ; ; THE FOLLOWING 2 PARAMETE2UNNNNNNNNNNNNNNNNN-sNNNNNNNNNNNNNNNNNNNNNNQU RDBENT + 9 ;RETURN TIME ENTRY DKPENT EQU RDBENT + 0CH ;DISK PRIMITIVES ENTRY ;=========================================NNNNNNNNNNNNNNNNNπNNNNNNNNNNNNNNNNNNNNNN ; 2.2.3 - SWAPPED DCM & BIOS SECTORS ON DISK, ALLOWING A ; LARGER BIOS ALLOCATION ON THE DISK. ; ; 2.2.4 - ADDED NAKED T/NNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNN!m 34 ; 256 bytes per sector disks to be read. ; ; 1.10 - 23 SEP 83 GRH ; Move clock-calendar routines to ROM. Add Interrup[^NNNNNNNNNNNNNNNN7NNNNNNNNNNNNNNNNNNNNNNlls & whistles again. ; Move to 61k system. ; ; 2.04 - 30 MAR 85 GRH ; Implemented hard disk drive 1 as C: & D:. ; ImplemsWNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN======================================================================= ; ; DISK OPERATING SYSTEM ADDRESSES ; ;===========NNNNNNNNNNNNNNNNNEZNNNNNNNNNNNNNNNNNNNNNN================================ ; ; OTHER DECLARATIONS ; ;=================================================================`NNNNNNNNNNNNNNNNN"cNNNNNNNNNNNNNNNNNNNNNNBOOT SECTOR ; STHD EQU 0 ;START LOGICAL DRIVE OF HARD DISK NDHD EQU 3 ;LAST LOGICAL DRIVE OF HARD DISK ST8FD EQU 4 ;STARTjNNNNNNNNNNNNNNNNNN( NNNNNNNNNNNNNNNNNNNNNNRS MUST REFLECT THE MAX DISK SIZE & ; THE MAX DIRECTORY SIZE. ; ;============================================================NNNNNNNNNNNNNNNN.&NNNNNNNNNNNNNNNNNNNNNN=================================== ; ; ASCII CHARS ; ;===================================================================== ~NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNERMINAL DRIVERS & IOBYTE IN ; ANTICIPATION OF THE MONITOR. ALSO, ALL REFERENCES ; REQUIRING THE I/O PROMS TO BOOT HAS !NNNNNNNNNNNNNNNN ߾NNNNNNNNNNNNNNNNNNNNNNt handler ; (Mode 2). Change Revision display of sign-on (separate CBIOS rev). ; ; 2.00 - 24 MAR 84 GRH ; Modify for hard B NNNNNNNNNNNNNNNNN3NNNNNNNNNNNNNNNNNNNNNNented the Logon function for the hard disk. ; Implemented user friendly disk error options: Abort, Retry, Ignore. ; Solved warrNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN================================================================= NKSYS: EQU 60 ;SYSTEM SIZE IN K BYTES KBYTE: EQU 1024 CPMSqNNNNNNNNNNNNNNNNNvkNNNNNNNNNNNNNNNNNNNNNN=========== DEFIOB: EQU 80H ;INITIAL IOBYTE VALUE (LPT ON) DFDRV: EQU 0 ;INITIAL DEFAULT DRIVE SECSZ: EQU 128 NDRVS: EQU 8sNNNNNNNNNNNNNNNN#PNNNNNNNNNNNNNNNNNNNNNN LOGICAL DRIVE OF 8" FLOPPY ND8FD EQU 5 ;LAST LOGICAL DRIVE OF 8" FLOPPY ST5FD EQU 6 ;START LOGICAL DRIVE OF 5" FLOPPY ND5FBNNNNNNNNNNNNNNNN):NNNNNNNNNNNNNNNNNNNNNN================ ALLSIZ EQU 33 ;ALLOCATION BIT MAP SIZE (1 BYTE PER 8 CLUSTERS) CHKSIZ EQU 32 ;DIRECTORY CHECKSUMS ARRAY SIZNNNNNNNNNNNNNNNN/NNNNNNNNNNNNNNNNNNNNNN======= LF: EQU 0AH CR: EQU 0DH CTRLZ: EQU 1AH ;==========================================================================NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNBEEN REMOVED. ; ; 2.2.5 - RECONFIGURE FOR 62K SYSTEM. ; ; 2.2.6 - 20 FEB 83 ; DOUBLE D REV C UPGRADE. CHANGE BOARD STATUS PINNNNNNNNNNNNNNNN F)NNNNNNNNNNNNNNNNNNNNNNdisk ; ; 2.01 - 28 APR 84 GRH ; Change hard disk DPB to reflect half size directory, but keep ; allocation for 1k directorC NNNNNNNNNNNNNNNNfUNNNNNNNNNNNNNNNNNNNNNNm boot hang problem by reseting host adapter if busy. ; ; 3.00 - 26 JAN 87 GRH ; Implemented new common IOPB code & Jade flDNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNZ: EQU KBYTE * NKSYS CPMBS: EQU CPMSZ - (20 * KBYTE) ; CP/M BIAS VALUE CCP: EQU CPMBS + 3400H ;ADDR OF CCP BDOS: EQU CPMBS + hANNNNNNNNNNNNNNNNN#8NNNNNNNNNNNNNNNNNNNNNN BTDIRS EQU 2 + 1 ;HARD DISK SYSTEM TRACKS DIRECTORY SECTOR BTCCPO EQU 3 ;OFFSET TO CCP ENTRY IN SYS TRKS DIRECTORY IF BNNNNNNNNNNNNNNNN$fNNNNNNNNNNNNNNNNNNNNNND EQU 7 ;LAST LOGICAL DRIVE OF 5" FLOPPY ENDIF IF BOOT = 5 LASTSEC EQU 19 ;LAST BOOT SECTOR ; STHD EQU 0 ;START LO NNNNNNNNNNNNNNNNN*iNNNNNNNNNNNNNNNNNNNNNNE (1 BYTE PER DIR. SECTOR) ;============================================================================ ; ; ADDRESSES ; NNNNNNNNNNNNNNNNN0NNNNNNNNNNNNNNNNNNNNNN== ; ; INCLUDE JDDCONT.DEF ; INCLUDE COMIOPB.DEF ; INCLUDE JDDDISK.DEF ; INCLUDE MONBOARD.DEF ; INCLUDE IOBOARD.DEF ; INCz~NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN@NNNNNNNNNρk9Յp= ډuD}K葵R V%[)Şa0ˢg5ѦNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNqNNNNNNNNNNNNNNNNNNNNN!LUDE NAKEDT.DEF ; INCLUDE ISHA.DEF ; INCLUDE CLOCK.DEF ; ;==================================================================]NNNNNNNNNNNNNNNNNWNNNNNNNNNNNNNNNNNNNNN!RFLOW NXTSEC DL NXTSEC - #SECTORS ;; IF NXTSEC <= LOWEST ;CHECK FOR REPEAT NXTSEC DL LOWEST + 1 LOWEST DL NXTSEC ENDNNNNNNNNNNNNNNNNN 4NNNNNNNNNNNNNNNNNNNNNNISKWR ;PERFORM DISK WRITE JP LISTST ;RETURN LIST STATUS JP SECTRN ;TRANSLATE SECTOR JP RETDVRT ;RETURN DRIVER TABLE ADnNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNSECTOR BUFFER STARTS HERE AFTER CRUNCHING COLD START ; CODE. THIS BUFFER IS USED BY THE CP/M DIRECTORY CHECK ROUTINES THAT ; NNNNNNNNNNNNNNNN+NNNNNNNNNNNNNNNNNNNNN!O: LD HL,MSGSO CALL EDITOR ; ; MODIFY COLD START VECTOR TO WARM START ; LD HL,(BIOS+4) LD (BIOS+1),HL ; ; BOOT CCtNNNNNNNNNNNNNNNNNQNNNNNNNNNNNNNNNNNNNNNN- ; ; WARM REBOOT ENTRY LOADS CCP,BDOS FROM DISK & ; SETS UP VARIABLES ; ;-------------------------------------------------1NNNNNNNNNNNNNNNNN%NNNNNNNNNNNNNNNNNNNNNNPTER TO CLEAR HANG OUT (HCMD),A XOR A,A OUT (HCMD),A ; EX (SP),HL ; DELAY FOR HOST ADAPTER TO CATCH UP EX (SP),HL NNNNNNNNNNNNNNNNN+NNNNNNNNNNNNNNNNNNNNN!C,2 ;START WITH SECTOR #2 ENDIF LD B,0 CALL SETSEC ; ; READ CCP/BDOS ; WREAD: CALL DISKRD JR NZ,WEROR ;IF ERRORfNNNNNNNNNNNNNNNN$NNNNNNNNNNNNNNNNNNNNN!========== LIST OFF *INCLUDE JDDCONT.DEF *INCLUDE COMIOPB.DEF *INCLUDE JDDDISK.DEF *INCLUDE MONBOARD.DEF *INCLUDE IOBOARDFNNNNNNNNNNNNNNNNiNNNNNNNNNNNNNNNNNNNNNNIF ENDIF ;; ENDM LIST ON ENDM SUBTTL BIOS CODE ORG BIOS ;-----------------------------------------------------c NNNNNNNNNNNNNNNNaNNNNNNNNNNNNNNNNNNNNN!DR INDEXED BY C FUNC ;############################################################################ ; ; THESE BOOT PARAMS MUNNNNNNNNNNNNNNNNNNwNNNNNNNNNNNNNNNNNNNNN! CHECK FOR DISK CHANGE. ; ;############################################################################ DIRBF: EQU $ ;BUFFERsHNNNNNNNNNNNNNNNNxNNNNNNNNNNNNNNNNNNNNNNP & BDOS ; JR WARM ;############################################################################ ; ; SIGN-ON MESSAGE _uNNNNNNNNNNNNNNNN D&NNNNNNNNNNNNNNNNNNNNNN--------- WARM: IF INTRPTS ; ; SET INTERRUPT VECTOR TABLE BASE ; LD A,HIGH INTABL LD I,A ; ; SET INTERRUPT MODEPnNNNNNNNNNNNNNNNNN&NNNNNNNNNNNNNNNNNNNNNN; CALL HDXWT ; WHILE BUSY THEN WAIT NTHUNG: ENDIF ; ; LOG ON DRIVE TO INIT TABLES ; LD A,(DKPROM + 1) AND A,3 ONNNNNNNNNNNNNNNNNN,KNNNNNNNNNNNNNNNNNNNNNN THEN EXIT ; LD A,(BTSEC) ;IF LAST SECTOR THEN DONE CP A,LASTSEC JR NC,WZRPG ; INC A ;NEXT SECTOR LD (BTSEC),A ; NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN.DEF *INCLUDE NAKEDT.DEF *INCLUDE ISHA.DEF *INCLUDE CLOCK.DEF LIST ON ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@'dHNNNNNNNNNNNNNNNNN XNNNNNNNNNNNNNNNNNNNNNN----------------------- ; ; BIOS JUMP VECTOR TABLE ; ;--------------------------------------------------------------------HNNNNNNNNNNNNNNNNRNNNNNNNNNNNNNNNNNNNNNNST RESIDE AS DEFINED RIGHT BEFORE THE COLD ; INIT ROUTINE START AND MUST BE IN THE 1ST SECTOR. ; THESE 2 WORDS ARE REFERENCENNNNNNNNNNNNNNNNNFNNNNNNNNNNNNNNNNNNNNN! BEGINNING ;---------------------------------------------------------------------------- ; ; INIT - COLD START ENTRY VNNNNNNNNNNNNNNNNNINNNNNNNNNNNNNNNNNNNNNN; ;############################################################################ MSGSO: DB CR,LF DB CPMSZ / (KBYTE * 10) + '0NNNNNNNNNNNNNNNNN!wNNNNNNNNNNNNNNNNNNNNNN TO 2 ; IM 2 ; ; ENABLE INTERRUPT VECTOR 7 ; IN A,(INTMSK) AND A,7FH OUT (INTMSK),A ; ; FINALLY ENABLE VECTORENNNNNNNNNNNNNNNN'ݱNNNNNNNNNNNNNNNNNNNNNN ;MODULO 4 LD C,A LD E,0 CALL SELDSK LD A,L ;IF ERROR THEN ABORT OR A,H JR Z,WEROR IF BOOT = 'H' ; ; READ B6#NNNNNNNNNNNNNNNNN-2zNNNNNNNNNNNNNNNNNNNNNN LD DE,SECSZ ;DMA := DMA + SECTOR SIZE LD HL,(BTDMA) ADD HL,DE LD (BTDMA),HL JR WREAD ; ; ; WARM BOOT ERROR, OUTPUTVNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; GENERATE THE TRANSLATION TABLE MACRO ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@/nNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN-------- JP INIT1 ;COLD START ENTRY JP WARM ;RELOAD CCP/BDOS JP CNSCK ;GET CONSOLE STATUS JP CI ;CONSOLE INPUT JP \NNNNNNNNNNNNNNNNNNANNNNNNNNNNNNNNNNNNNNNND BY THE BOOT CODE IN ; ORDER TO FIND THE LOAD ADDRESS FOR THE BIOS & IT'S LENGTH. ; ;######################################sO@NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNFROM BOOT MUST SET ALL BIOS PARAMS ; ;---------------------------------------------------------------------------- INIT: ; gNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN' DB (CPMSZ MOD (KBYTE * 10)) / KBYTE + '0' DB 'K CP/M-80 Vers 2.2',CR,LF DB 'M5b CBIOS Vers 3.' DM HIGH VERSN , LOW1zNNNNNNNNNNNNNNN""DNNNNNNNNNNNNNNNNNNNNNND INTERRUPTS ; IN A,(MONSTS) OR A,MONIE OUT (MONSTS),A EI ENDIF ; ; SET TEMPORARY STACK ; LD SP,DEFBFR ; ; {qNNNNNNNNNNNNNNNNN(͏NNNNNNNNNNNNNNNNNNNNNNOOT DIRECTORY ; LD BC,DEFBFR CALL SETDMA LD BC,BTDIRS CALL SETSEC LD BC,0 ELSE LD BC,1 ENDIF CALL SETTR"_NNNNNNNNNNNNNNNN.g)NNNNNNNNNNNNNNNNNNNNNN MSG & HALT ; WEROR: LD HL,MSGLE ;OUTPUT ERROR MESSAGE CALL EDITOR HALT ; ; ; BOOT OK, INIT PAGE 0 ; WZRPG: ; ; NNNNNNNNNNNNNNNNN5NNNNNNNNNNNNNNNNNNNNNN@@@@@@@@@@@@@@@@@@@@@@@@@@ GXLATE MACRO #SECTORS, #SKEW LIST OFF NXTSEC DL 1 ;;START WITH SECTOR 1 LOWEST DL 1 ;; REPT 9NNNNNNNNNNNNNNNN :NNNNNNNNNNNNNNNNNNNNN!COC ;CONSOLE OUTPUT JP LO ;PRINTER OUTPUT JP PUNCH JP READER JP HOME ;HOME SELECTED DRIVE JP SELDSK ;SELECT DISK DNNNNNNNNNNNNNNNNrNNNNNNNNNNNNNNNNNNNNNN###################################### BIOSSZ: DW BIOSND - BIOS ;BIOS MODULE SIZE IN BYTES BIOSST: DW BIOS ;BIOS MODULE LOAD NNNNNNNNNNNNNNNN$NNNNNNNNNNNNNNNNNNNNNN; SET TEMPORARY STACK ; LD SP,DEFBFR ;USE PAGE 0 FOR STACK ; ; MAKE SURE ROM IS ENABLED ; CALL GETMON ; ; INIT DNNNNNNNNNNNNNNNNNN7NNNNNNNNNNNNNNNNNNNNNN VERSN,CR,LF IF $ > (DIRBF + SECSZ) CONMSG **** WARNING! COLD INIT CODE BIGGER THAN DIR BUFFER **** ELSE DS DIRNNNNNNNNNNNNNNNN#uNNNNNNNNNNNNNNNNNNNNNN INSURE MONITOR ROM STILL ENABLED ; CALL GETMON ; IF BOOT = 'H' ; TEST ISHA HOST ADAPTER FOR A HUNG CONDITION AND CL #SECTORS ;CHECK FOR OVEdNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNRIVE JP SETTRK ;SET TRACK # JP SETSEC ;SET SECTOR # JP SETDMA ;SET TRANSFER ADDR JP DISKRD ;PERFORM DISK READ JP DNNNNNNNNNNNNNNNN'NNNNNNNNNNNNNNNNNNNNNNADDR FOR SBD INIT1: JR INIT ;############################################################################ ; ; DIRECTORY NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNEFAULT DRIVE ; LD A,(DKPROM + 1) ;USE DRIVE # PASSED IN PAGE 0 AND A,3 LD (DEFDRV),A ; ; SEND SYSTEM SIGN-ON ; CLOGNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNBF+SECSZ-$ ;FILL OUT DIRECTORY BUFFER TO 1 SECTOR SIZE ENDIF ;---------------------------------------------------------NNNNNNNNNNNNNNNNNN$NNNNNNNNNNNNNNNNNNNNN!EAR IF TRUE ; IN A,(HSTATUS) ;IF HOST ADAPTER BUSY THEN BIT HBUSYB,A JR Z,NTHUNG ; LD A,1 SHL HRESET ; RESET HOST ADA5lNNNNNNNNNNNNNNNNN*NNNNNNNNNNNNNNNNNNNNNN LD A,(DEFBFR + BTCCPO) ;GET START OF CP/M IMAGE FROM DIRECTORY INC A ;MAKE SECTOR {0..N} -> {1..N+1} LD C,A ELSE LD *NNNNNNNNNNNNNNNNN0GUNNNNNNNNNNNNNNNNNNNNNN IN PAGE 0 ; LD HL,BDOS + 6 LD (PAGE0 + 5),A LD (PAGE0 + 6),HL ; ; SET DEFAULT SECTOR BUFFER ; LD BC,DEFBFR CALL}NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN NNNNNNˁg5Ѕk8։q?ۍwE|J䕲N陷S W&]+ƦNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNFNNNNNNNNNNNNNNNNNNNNNN SETDMA ; IF INTCPTS ; ; PUT BDOS VECTOR INTO INTERCEPT CODE ; LD HL,(BDOS + 7) LD (BDOSV),HL ; ; NOW PUT INTERNNNNNNNNNNNNNNNNNgNNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++++++++++++++++ DISKRD: LD A,DDRDS ;SELECT READ OP JR DISKOP ;+++++++++++++++NNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNO),HL ; LD A,DDLOG JR DISKOP2 ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; CO2'NNNNNNNNNNNNNNNN#NNNNNNNNNNNNNNNNNNNNNNER RETURNS HERE ; DKOPRET: POP IY ; ; IF NO ERRORS THEN RETURN ZF ; RET Z ;IF NO_ERROR THEN RETURN ; ; PRINT ERNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNRN TO CALLER JR Z,DKOPLP ; ; ELSE IF ABORT THEN DO WARM BOOT ; CP A,'A' ;IF ABORT THEN RE-BOOT JP Z,0 ; ; ELSE I_;(NNNNNNNNNNNNNNNNNfNNNNNNNNNNNNNNNNNNNNNN LOGICAL DRIVE ; LD A,(BTDRV) ;IF EVEN THEN ADD 0 ELSE ADD 128 RRCA AND A,80H LD E,A ;COMPUTE SECTOR LD D,0 LD HLWNNNNNNNNNNNNNNNN%NNNNNNNNNNNNNNNNNNNNNN******************************************* HDXWT: IN A,(HSTATUS) BIT HBUSYB,A RET Z JR HDXWT ;+++++++++++++++++++++#!NNNNNNNNNNNNNNNN+NNNNNNNNNNNNNNNNNNNNNN FETCH DRIVER EXECUTION ADDRESS ; CALL RETDVRT ;DRIVE IS STILL IN C REGISTER LD (DVRTPTR),HL ; ; PREFETCH DRIVER EXEC+HNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNCEPT VECTOR INTO BDOS CODE ; LD HL,INTCPT LD (BDOS + 7),HL ; ; INITIALIZE CLOCK VECTORS IF CLOCK INSTALLED ; IN A,(CdNNNNNNNNNNNNNNNNYNNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; WRITE A DISK SECTOR ; EXIT - A= 0: OK; /0: ERROR ; ;+++NNNNNNNNNNNNNNNNNVNNNNNNNNNNNNNNNNNNNNNNMMON DISK I/O CODE ; EXIT - A= 0: OK; /0: ERROR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ΣNNNNNNNNNNNNNNNNNNGNNNNNNNNNNNNNNNNNNNNNNROR ; LD HL,DSKEM ;OUTPUT PREFIX CALL EDITOR ; LD DE,IOPB + PBSTATO ;POINT TO ERROR BYTE LD B,6 ;OUTPUT 6 BYTES DSKEAJNNNNNNNNNNNNNNNNHNNNNNNNNNNNNNNNNNNNNNNF IGNORE THEN RETURN NO ERROR ; SUB A,'I' ;IF IGNORE THEN RETURN NO ERROR RET Z ; ; ELSE RETURN ERROR TO BDOS ; FDSKNNNNNNNNNNNNNNNN sNNNNNNNNNNNNNNNNNNNNNN,(IOPB + PBSECO) ADD HL,DE LD (IOPB + PBSECO),HL ; ; FINISH SETTING UP THE IOPB ; XPRIM: XOR A,A LD (IOPB + PBFLGO),NNNNNNNNNNNNNNNNN&ٰNNNNNNNNNNNNNNNNNNNNN!+++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; SELECT DRIVE FUNCTION ; LOG-ON - SET DISK PARAMETER BLOCK ; ENTRJVNNNNNNNNNNNNNNNNNN,6{NNNNNNNNNNNNNNNNNNNNNNUTION ADDRESS ; LD E,(HL) ;STORE ADDRESS INC HL LD D,(HL) INC HL LD (DVRXADR),DE ; ; FETCH FLAGS ; LD C,(HL) JNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNLKDAT) ;IF CLOCK NOT PRESENT THEN TURN OFF CLOCK DRIVE AND A,11000000B ;TEST UNUSED BUT DRIVEN BITS (1S IF NOT THERE) LD A,3qBNNNNNNNNNNNNNNNN hNNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ DISKWR: LD A,DDWRS ;SELECT WRITE OP JR DISKOP uNNNNNNNNNNNNNNNNeNNNNNNNNNNNNNNNNNNNNNN++ DISKOP: ; ; SET UP IOPB ; LD HL,BTTRK LD DE,IOPB + PBTRKO LD BC,PBSTATO - PBTRKO LDIR ; DISKOP2: LD (IOPB +NNNNNNNNNNNNNNNNNvNNNNNNNNNNNNNNNNNNNNNNR1: LD A,(DE) ;FETCH ERROR BYTE PUSH DE ;SAVE REGS PUSH BC CALL PRHEX ;OUTPUT ERROR CODE ; LD C,' ' CALL COC ;  NNNNNNNNNNNNNNNNyNNNNNNNNNNNNNNNNNNNNNNER: LD HL,0 ;RETURN DPB_PTR = 0 FOR SELECT FUNCTION LD A,-1 ;RETURN -1 TO BDOS OR A,A RET ;++++++++++++++++++++++++eBNNNNNNNNNNNNNNNN!@'NNNNNNNNNNNNNNNNNNNNNNA ;NO FLAGS FOR NOW ; LD HL,SECSZ ;SET XFER COUNT LD (IOPB + PBST4O),HL ; ; EXECUTE THE PRIMITIVE IN ROM ; PUSH IX NNNNNNNNNNNNNNNN'NNNNNNNNNNNNNNNNNNNNNNY- C= DRIVE # ; E= 0 IF NEVER LOGGED BEFORE ; EXIT - HL= PTR TO DPT OR 0 FOR ERROR ; ;+++++++++++++++++++++++++++++++++++++aNNNNNNNNNNNNNNNNN-JNNNNNNNNNNNNNNNNNNNNNN ; ; COMPUTE DISK PARAMETER TABLE ADDRESS ; LD HL,(BTDRV) LD H,0 ADD HL,HL ;DISK # * 16 ADD HL,HL ADD HL,HL ADDNNNNNNNNNNNNNNNNN4NNNNNNNNNNNNNNNNNNNNN!8H ;COND. JR (ON) JR Z,CLKON ; LD A,18H ;UNCOND. JR (OFF) (CAUSES JUMP TO ILLEGAL) ; CLKON: LD (INHCLK),A ; ENDIF !NNNNNNNNNNNNNNNN ;NNNNNNNNNNNNNNNNNNNNNN ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; LOGON DISK FUNCTION ; EXIT - A= 0: OK;SBNNNNNNNNNNNNNNNNvNNNNNNNNNNNNNNNNNNNNNN PBCMDO),A ; ; DOUBLE CHECK DRIVE VALIDITY ; LD A,(BTDRV) CP A,NDRVS ;IF RANGE ERROR THEN ABORT JR NC,FDSKER ; ; NNNNNNNNNNNNNNNNNN%NNNNNNNNNNNNNNNNNNNNNN POP BC ;RESTORE REGS POP DE INC DE ;NEXT ERROR BYTE DJNZ DSKER1 ;IF NOT DONE THEN LOOP ; LD HL,DSKEB ;OUTPUT ERRORNNNNNNNNNNNNNNNNN3NNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; HARD DISK DRIVER ; ENTRY- IY= DRIVER TABLE PTR ; EXIT - A= 0: OK; /mNNNNNNNNNNNNNNNN"tNNNNNNNNNNNNNNNNNNNNNN LD IX,IOPB ;PASS PTR TO IOPB LD HL,DKPENT ;PRIMITIVE ENTRY LD A,(DKPROM) ;FETCH PROM # CALL EXROM ;EXECUTE THE PRIMITI| ډtCߍ|L葵R 핻W%]*ƞb0ˢg4ЦNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNBST2O),A ; CALL DISKLOG JP NZ,FDSKER ; ; IF NO ID SECTOR THEN USE DEFAULTS ; LD A,(IOPB + PBST2O) CP A,-2 ;0: NO &NNNNNNNNNNNNNNNNzNNNNNNNNNNNNNNNNNNNNNN,(DVRTPTR) LD DE,DVRFLG ADD HL,DE EX DE,HL POP HL LD BC,DVRSIZ - DVRFLG LDIR ; ; RETURN DRIVE TABLE PTR ; LD 3NNNNNNNNNNNNNNNNN eNNNNNNNNNNNNNNNNNNNNNNR SEL2 ;**************************************************************************** ; ; SET 3740 SECTOR TRANSLATION ;NNNNNNNNNNNNNNNNENNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ DPBAD: LD HL,(DTPTR) ;FETCH BASE ADDR LD DE,10 ;ADD OFFSETQHNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN SET SECTOR ; ENTRY- BC= SECTOR # ; ;**************************************************************************** SETSEC: PNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN+++++++ SECTRN: LD A,D ;IF TABLE ADDR = 0 THEN NO TRANSLATION OR E JR Z,NOTRAN ; EX DE,HL ADD HL,BC LD L,(HL) ; Lg2NNNNNNNNNNNNNNNNN%NNNNNNNNNNNNNNNNNNNNNN LD A,(IY + DVRPDRV) LD (IOPB + PBDRVO),A ; ; IF LOGON THEN SKIP SIDE SELECT BECAUSE SECTOR DATA MAY NOT BE VALID ; LD TNNNNNNNNNNNNNNNNN+NNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN DRIVER TABLE PTR FUNCTION ; ENTRY- C= DRIVE # ; EXIT - HL= DRIVER NNNNNNNNNNNNNNNNuNNNNNNNNNNNNNNNNNNNNNNID, -1: JADE ID, -2: EXTENDED ID JR NZ,LGDEF ; ; DISKETTE CONTAINS ID. XFER ID SECTOR DATA ; CALL TRNONE ;ASSUME NO TR[NNNNNNNNNNNNNNNNNNDNNNNNNNNNNNNNNNNNNNNNNHL,(DTPTR) XOR A,A RET ; ; ; SELECT PROPER DEFAULT TABLES ; LGDEF: LD A,(BTDRV) IF STHD <> 0 CP A,STHD JR C,LJDNNNNNNNNNNNNNNNN0NNNNNNNNNNNNNNNNNNNNNN EXIT - DE, HL= ? ; ;**************************************************************************** TR5: LD DE,SD5TRAN JR SET~NNNNNNNNNNNNNNNNNZNNNNNNNNNNNNNNNNNNNNNN OF DPB PTR ADD HL,DE LD E,(HL) ;FETCH DPB PTR INC HL LD D,(HL) RET ;*******************************************INNNNNNNNNNNNNNNNUNNNNNNNNNNNNNNNNNNNNNNLD (BTSEC),BC RET ;**************************************************************************** ; ; SET TRANSFER ADDR %RNNNNNNNNNNNNNNNN  NNNNNNNNNNNNNNNNNNNNNND H,0 RET ; ; NOTRAN: LD HL,1 ADD HL,BC RET ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++YNNNNNNNNNNNNNNNNN&NNNNNNNNNNNNNNNNNNNNNNA,(IOPB + PBCMDO) SUB A,DDLOG JR Z,FD8X1 ; ; SELECT SIDE ; LD A,(IOPB + PBTRKO) CP A,1 LD A,(IOPB + PBSECO) JR NNNNNNNNNNNNNNNNNN,PfNNNNNNNNNNNNNNNNNNNNNNTABLE BASE PTR ; A, C= 0 ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ RETDVRT: LD HL,Dx'NNNNNNNNNNNNNNNNFNNNNNNNNNNNNNNNNNNNNNNANSLATION ; ; TEST FOR SECTOR XLATION ; LD A,(DEFBFR + IDFLGO) AND A,[1 SHL DFDTDB] OR [1 SHL DFHARDB] JR NZ,NOX ; nNNNNNNNNNNNNNNNNN uNNNNNNNNNNNNNNNNNNNNNNGCKFD ENDIF CP A,NDHD + 1 JR NC,LGCKFD ; ; HARD DISK DEFAULTS ; CALL TRNONE ; NO XLATE LD HL,HDPBK ; ; COU7NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNTR ; TR8: TR3740: LD DE,SDTRAN ; SETTR LD HL,(DTPTR) LD (HL),E INC HL LD (HL),D RET ;*************************tNNNNNNNNNNNNNNNNNNkNNNNNNNNNNNNNNNNNNNNNN********************************* ; ; HOME DRIVE - TREAT AS SEEK TRK 0 ; EXIT - BC= 0 ; ;********************************rNNNNNNNNNNNNNNNNdNNNNNNNNNNNNNNNNNNNNNN; ENTRY- BC= ADDRESS ; EXIT - A= 0 ; ;**************************************************************************** SETDMA: LͭNNNNNNNNNNNNNNNNN!&:NNNNNNNNNNNNNNNNNNNNNN+++++++ ; ; JADE 5" FLOPPY DISK DRIVER FUNCTION ; ENTRY- IY= DRIVER TABLE PTR ; EXIT - A= 0: OK; /0: ERROR ; ;++++++++++++QNNNNNNNNNNNNNNNN'NNNNNNNNNNNNNNNNNNNNNNC,FD8X20 JR Z,FD8X21 ; ; DATA TRACKS ; LD C,(IY + DVRDSPT) ; ; COMMON SIDE SELECT CODE ; FD8X2: INC C SUB A,C INNNNNNNNNNNNNNNNN-cWNNNNNNNNNNNNNNNNNNNNN!VR0 ;START AT 1ST TABLE ; ; TEST FOR DONE ; RETDVL: LD A,C OR A,A RET Z ; ; COMPUTE NEXT TABLE ENTRY ; LD A,DVt>NNNNNNNNNNNNNNNNN)NNNNNNNNNNNNNNNNNNNNNN; SELECT SIZE OF XLATE TABLE ; LD A,(DEFBFR + IDSPTDO) CP A,26 JR NZ,LGNT8X ; ; SELECT 8" XLATE TABLE ; CALL TR8NNNNNNNNNNNNNNNN &NNNNNNNNNNNNNNNNNNNNNNMMON CODE ; SEL2: PUSH HL CALL DPBAD ; USE DEFAULT TABLE POP HL LD BC,DPBSZ LDIR JR SEL1 ; ; CHECK FOR 8" FLOP,@dNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN*************************************************** ; ; SET NO SECTOR TRANSLATION ; EXIT - HL, DE= ? ; ;*******************~_NNNNNNNNNNNNNNNNN8NNNNNNNNNNNNNNNNNNNNNN******************************************** HOME: LD BC,0 ;**************************************************************&NNNNNNNNNNNNNNNNNUNNNNNNNNNNNNNNNNNNNNNND (BTDMA),BC XOR A,A LD (BTDMAX),A RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ NNNNNNNNNNNNNNNNN"siNNNNNNNNNNNNNNNNNNNNN!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ FD5EXEC: ;+++++++++++++++++++++++++++++++++++++++++++++++4yNNNNNNNNNNNNNNNNN(NNNNNNNNNNNNNNNNNNNNNN JR C,SPTOK ; INC A ;MUST START AT 1 LD (IOPB + PBSECO),A ; ; SELECT SIDE 1 ; LD A,80H FD8X1: LD (IOPB + PBSECO + H-NNNNNNNNNNNNNNNN.6NNNNNNNNNNNNNNNNNNNNNNRSIZ ADD A,L LD L,A LD A,0 ADC A,H LD H,A DEC C JR RETDVL SUBTTL NON-DISK PROCEDURES ;***********************NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN! JR NOX ; ; SELECT 5" XLATE TABLE ; LGNT8X: CALL TR5 ; NOX: CALL DPBAD ;GET ADDR OF DPB & MOVE DOWN DISK INFO TO IT {NNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNPY DEFAULTS ; LGCKFD: IF ST8FD <> 0 CP A,ST8FD JR C,LGCKFD5 ENDIF CP A,ND8FD + 1 JR NC,LGCKFD5 ; ; USE 8" tNNNNNNNNNNNNNNNNN#NNNNNNNNNNNNNNNNNNNNN!********************************************************* TRNONE: LD DE,0 JR SETTR ;++++++++++++++++++++++++++++++++++++INNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNN!************** ; ; SET TRACK # ; ENTRY- BC= TRACK # ; ;********************************************************************RNNNNNNNNNNNNNNNNNfNNNNNNNNNNNNNNNNNNNNNN ; ; SECTOR TRANSLATION FUNCTION ; ENTRY- DE= 0: NO XLATE, ELSE PTR TO XLATE TABLE ; BC= SECTOR # TO XLATE ; EXIT - HL= XLANNNNNNNNNNNNNNNN#@XNNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++ ; ; JADE 8" FLOPPY DISK DRIVER FUNCTION ; ENTRY- IY= DRIVER TABLE PTR ; EXIT - A= 0: OK; /0: E[BNNNNNNNNNNNNNNNN)NNNNNNNNNNNNNNNNNNNNNN1),A ; ; EXECUTE THE IOPB ; JP XPRIM ; ; ; TRACK 0 ; FD8X20: LD C,(IY + DVR0SPT) JP FD8X2 ; ; ; TRACK 1 ; NNNNNNNNNNNNNNNN/5NNNNNNNNNNNNNNNNNNNNNN***************************************************** ; ; OUTPUT HEX DATA TO CONSOLE SUBR ; ENTRY- A= DATA ; EXIT - A, C= ? w4NNNNNNNNNNNNNNNNNKNNNNNNNNNNNNNNNNNNNNN! LD HL,DEFBFR + IDSPTO LD BC,DPBSZ LDIR ; LD HL,DEFBFR + IDFLGO ; ; XFER DISK PHYSICAL DATA ; SEL1: PUSH HL LD HLgNNNNNNNNNNNNNNNN VNNNNNNNNNNNNNNNNNNNNNNFLOPPY DEFAULTS ; CALL TR8 LD HL,SD8PBK JR SEL2 ; ; USE 5" FLOPPY DEFAULTS ; LGCKFD5: CALL TR5 LD HL,SD5PBK J{ NNNNNNNNNNNNNNNNvNNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++ ; ; GET DRIVE PARAMETER BLOCK ADDR ; EXIT - DE= DPB PTR ; HL= ? ; ;+++++++++++NNNNNNNNNNNNNNNNN7NNNNNNNNNNNNNNNNNNNNNN******** SETTRK: LD (BTTRK),BC RET ;**************************************************************************** ; ;NNNNNNNNNNNNNNNNN3NNNNNNNNNNNNNNNNNNNNN!TED SECTOR OR (BC) + 1 ; BC= UNCHANGED ; A, DE= ? ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++NNNNNNNNNNNNNNNN$NNNNNNNNNNNNNNNNNNNNNNRROR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ FD8EXEC: ; ; SET PHYSICAL DRIVE ; ;yNNNNNNNNNNNNNNNN*NNNNNNNNNNNNNNNNNNNNNN FD8X21: LD C,(IY + DVR1SPT) JP FD8X2 ; ; ; SECTORS OK ; SPTOK: XOR A,A JP FD8X1 ;++++++++++++++++++++++++++++++"GNNNNNNNNNNNNNNNNN0xNNNNNNNNNNNNNNNNNNNNNN ; ;**************************************************************************** PRHEX: CALL PRDIG ;DO HIGH NIBBLE ; PRDIG:K|NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNLNNNNNNNˁg5хk8ԉo= ٍvDߑ|J啳N뙹U"񝾞Y(¢_,ɦNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN! RLCA ;POSITION NIBBLE INTO LOW 4 BITS RLCA RLCA RLCA ; PUSH AF ;SAVE DATA ; AND A,0FH ;MASK OFF OTHER NIBBLE NNNNNNNNNNNNNNNNNJNNNNNNNNNNNNNNNNNNNNNN BOOT RTN ; ; THE FOLLOWING CONDITIONAL JUMP IS MODIFIED TO AN UNCONDITIONAL JUMP BY ; THE WARM BOOT ROUTINE IF THE CLOCK/C0NNNNNNNNNNNNNNNNN RNNNNNNNNNNNNNNNNNNNNN!++++++++++++++++++++++++++++++++++++++++++++++ ; ; CDOS RETURN VERSION FUNCTION ; MAKES CLOCK/CALENDAR WORK. ; EXIT - B= 1 ^^NNNNNNNNNNNNNNNNrNNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ CLKTIM: LD HL,TIMENT JR CLK1 ;+++++++++++NNNNNNNNNNNNNNNNN6NNNNNNNNNNNNNNNNNNNNN!F ;**************************************************************************** ; ; EXECUTE ROM ROUTINE ; ENTRY- HL= ENT:bNNNNNNNNNNNNNNNNN7NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ CI: IF USEMON CALL GETMON ;SWITCH IN MONITOR`NNNNNNNNNNNNNNNNN%NNNNNNNNNNNNNNNNNNNNNN**** ; ; CONSOLE OUTPUT ; ENTRY- C= CHAR TO OUTPUT ; ;*********************************************************************Au!NNNNNNNNNNNNNNNN+NNNNNNNNNNNNNNNNNNNNN!++++++++++++++++++++++++++++++++++++++++++ READER: LD A,CTRLZ ;FAKE EOF ;************************************************]NNNNNNNNNNNNNNNNBNNNNNNNNNNNNNNNNNNNNNNADD A,90H ;CONVERT TO ASCII DAA ADC A,40H DAA ; LD C,A ;STORE CHAR CALL COC ; POP AF ;DATA RET IF INTCNNNNNNNNNNNNNNNNtNNNNNNNNNNNNNNNNNNNNNNALENDAR BOARD IS NOT PRESENT ; IF NOT MODIFIED, THEN IT IS ALLWAYS FALSE (NOP). ; INHCLK: JR C,ILLEGC ; ; NOW CHECK FOR E9SNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ RETVER: LD B,1 RET SUBTTL CLOCK ROUTINEːxNNNNNNNNNNNNNNNNNNjNNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; READ CLOCK TIME FUNCTION 93H ; ENTRY- DE= PTR TO 13 BYT@NNNNNNNNNNNNNNNNeNNNNNNNNNNNNNNNNNNNNN!RY ADDRESS ; A= ROM # ; EXIT - ? ; ;**************************************************************************** EXROM: -$NNNNNNNNNNNNNNNN ";NNNNNNNNNNNNNNNNNNNNNN ROM JP 0F803H ;USE MONITOR ELSE CALL CNSCK ;IF NO CHAR RDY THEN WAIT JR Z,CI IN A,(NTD) ;ELSE RETURN CHAR RET 4NNNNNNNNNNNNNNNNN&NNNNNNNNNNNNNNNNNNNNNN******* COC: IF USEMON CALL GETMON JP 0F809H ELSE CALL NTOST ;IF BUSY THEN WAIT OR A,A JR Z,COC LD A,C ˵NNNNNNNNNNNNNNNNNN,gVNNNNNNNNNNNNNNNNNNNNNN**************************** ; ; PUNCH DRIVER ; ENTRY- C= CHAR TO OUTPUT ; ;***********************************************$NNNNNNNNNNNNNNNNqNNNNNNNNNNNNNNNNNNNNNNPTS SUBTTL ADDITIONAL FUNCTIONS TO SUPPORT CDOS PROGRAMS ;*******************************************************************w NNNNNNNNNNNNNNNNN ENNNNNNNNNNNNNNNNNNNNNNXTENDED CALLS ; CP A,8DH ;IF RETURN VERSION THEN RETURN IT JR Z,RETVER ; CP A,90H ;IF NOT CLOCK THEN ERR JR C,ILLEGCCNNNNNNNNNNNNNNNNN4NNNNNNNNNNNNNNNNNNNNN!S ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN CALENDAR FUNCTION 90H ; EXIT - A=?NNNNNNNNNNNNNNNNN[NNNNNNNNNNNNNNNNNNNNNNE BUFFER FOR CLOCK DATA ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ CLKRDC: LD C,E ;SENNNNNNNNNNNNNNNNTNNNNNNNNNNNNNNNNNNNNNNAND A,ROMSMK ;MASK OUT UNUSED BITS OUT (ROMSEL),A ; PUSH HL ;SAVE ROM ENTRY VECTOR ; LD HL,EXROMR ;PUT RETURN ADDR ON SI NNNNNNNNNNNNNNNNN! NNNNNNNNNNNNNNNNNNNNNN ENDIF ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN CONSOLE STATUS ; EXIT|NNNNNNNNNNNNNNNN'NNNNNNNNNNNNNNNNNNNNNN OUT (NTD),A RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN CONSOLE OUTPUNNNNNNNNNNNNNNNNN-TgNNNNNNNNNNNNNNNNNNNNNN***************************** PUNCH: RET ;**************************************************************************** ; w$NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN******** ; ; SYSTEM CALL INTERCEPT ROUTINE CHECKS FOR ILLEGAL BDOS CALLS & ; PRINTS MESSAGE IF ILLEGAL. ALSO IMPLEMENTS CDOS$NNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN ; JR Z,CLKCAL ;IF CALENDAR THEN GET IT ; CP A,92H JR C,CLKSET ;IF SET FUNCTION THEN SET CLOCK ; JR Z,CLKTIM ;IF TIMEJBNNNNNNNNNNNNNNNN'NNNNNNNNNNNNNNNNNNNNNN DAY ; B= MONTH ; C= YEAR ; L= DAY OF WEEK ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++A`NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNT UP PARAMETERS LD B,D LD HL,RDBENT JR CLK2 ;************************************************************************ SNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNTACK EX (SP),HL ;SWAP RETURN ADDRESS WITH ROM ENTRY VECTOR JP (HL) ;EXECUTE ROM ; ; ROM PROCEDURE RETURNS HERE ; EXRgNNNNNNNNNNNNNNN"DYNNNNNNNNNNNNNNNNNNNNNN - A= 0: NOT READY ; FFH: CHAR READY ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ CNS/NNNNNNNNNNNNNNNNN(NNNNNNNNNNNNNNNNNNNNNNT READY STATUS ; EXIT - A= 0: BUSY, FFH: READY ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++|NNNNNNNNNNNNNNNN.4NNNNNNNNNNNNNNNNNNNNNN ; PRINTER DRIVER ; ENTRY- C= CHAR TO OUTPUT ; ;**************************************************************************** vHNNNNNNNNNNNNNNNNN(NNNNNNNNNNNNNNNNNNNNN! CLOCK/CALENDAR ; SYSTEM CALLS FOR ASMB. ; ;*************************************************************************** INTNNNNNNNNNNNNNNNN 'NNNNNNNNNNNNNNNNNNNNN! THEN GET IT ; CP A,93H JR Z,CLKRDC ;IF READ CLOCK THEN GET IT ; ; ILLEGAL SYSTEM CALL ; ILLEGC: LD HL,ISCMSG ;OUTPUT ]NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN++ CLKCAL: LD HL,CALENT ;ROM ENTRY POINT ; CLK1: LD BC,CLKBFR ;READ CLOCK JR CLK2 ;+++++++++++++++++++++++++++++++++ NNNNNNNNNNNNNNNN9NNNNNNNNNNNNNNNNNNNNNN**** ; ; CLOCK SET FUNCTION 91H ; ENTRY- DE= CLOCK IMAGE BUFR PTR (13 BYTES LONG) ; ;**************************************NNNNNNNNNNNNNNNNNNQNNNNNNNNNNNNNNNNNNNNNNOMR: PUSH AF ;SAVE RETURN VALUE CALL GETMON ;RESELECT MONITOR ROM ; POP AF ;RETURN VALUE RET SUBTTL CHAR I/O ROUTNNNNNNNNNNNNNNNN#whNNNNNNNNNNNNNNNNNNNNNNCK: IF USEMON CALL GETMON JP 0F812H ELSE IN A,(NTS) ;IF DATA NOT READY THEN RETURN 0 AND A,1 SHL NTRDY TTOST1:TNNNNNNNNNNNNNNNN)NNNNNNNNNNNNNNNNNNNNNN+ NTOST: IN A,(NTS) CPL ;REVERSE SENSE AND A,1 SHL NTBSY JR TTOST1 ENDIF ;++++++++++++++++++++++++++++++++++++jNNNNNNNNNNNNNNNN/2NNNNNNNNNNNNNNNNNNNNNN LO: IF USEMON CALL GETMON JP 0F80FH ELSE CALL LISTST ;IF BUSY THEN WAIT JR Z,LO ; LD A,C ;OUTPUT CHAR SEX'NNNNNNNNNNNNNNNNNN{NNNNNNNNNNNNNNNNNNNNNNCPT: LD A,C ;CHECK CALL VALIDITY CP A,41 ;IF <= 40 THEN OK ; BDOSV EQU $ + 1 JP C,BDOS + 11H ;THIS ADDR MODIFIED BY WARMyNNNNNNNNNNNNNNNN aNNNNNNNNNNNNNNNNNNNNNNWARNING CALL EDITOR XOR A,A ;BC = HL = A = 0 LD L,A LD H,A LD C,A LD B,A RET ;++++++++++++++++++++++++++++++.^BNNNNNNNNNNNNNNNNANNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN TIME FUNCTION 92H ; EXIT - A= SECONDS ; B= MINITS ; C= HOURS ; ;NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN************************************** CLKSET: LD C,E ;SET UP PARAMETERS LD B,D LD HL,SETENT CLK2: LD A,CALROM ENDI)NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNINES ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; CONSOLE INPUT ; EXIT - A= CHAR ; ;+^NNNNNNNNNNNNNNNN$NNNNNNNNNNNNNNNNNNNNNN RET Z LD A,-1 ;ELSE RETURN -1 RET ENDIF ;************************************************************************$NNNNNNNNNNNNNNNNN*NNNNNNNNNNNNNNNNNNNNN!++++++++++++++++++++++++++++++++++++++++ ; ; READER DRIVER - DUMMY ; EXIT - A= CTRL-Z ; ;++++++++++++++++++++++++++++++++++{NNNNNNNNNNNNNNNNN0!HNNNNNNNNNNNNNNNNNNNNNNT 7,A OUT (CENTOUT),A ; RES 7,A ;OUTPUT LOW TRUE STROBE OUT (CENTOUT),A SET 7,A OUT (CENTOUT),A RET ENDIF ;zNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNŃh6хn< ؉sAލzI摴P핻W%]+Ǟb0͢h6ѦNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNVhNNNNNNNNNNNNNNNNNNNNNN TITLE CUSTOMIZED BIOS FOR M5B LIST NOCOND ;============================================================================ ; ^rNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNY, 20H: 5" FLOPPY DEBUG EQU FALSE ;TRUE TO DUMP THE IOPB DATA TO PRINTER FORM ;******************************************NNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNN! PHYSICAL DRIVE 1 ; C SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 0 ; D SIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 0 ; E SIDE 0 BNNNNNNNNNNNNNNNN3yNNNNNNNNNNNNNNNNNNNNNN LARGER BIOS ALLOCATION ON THE DISK. ; ; 2.2.4 - ADDED NAKED TERMINAL DRIVERS & IOBYTE IN ; ANTICIPATION OF THE MONITOR. bL!NNNNNNNNNNNNNNNNNܲNNNNNNNNNNNNNNNNNNNNNNEP 83 GRH ; Move clock-calendar routines to ROM. Add Interrupt handler ; (Mode 2). Change Revision display of sign-on (separsNNNNNNNNNNNNNNNNvNNNNNNNNNNNNNNNNNNNNNN 85 GRH ; Implemented hard disk drive 1 as C: & D:. ; Implemented the Logon function for the hard disk. ; Implemented user %uNNNNNNNNNNNNNNNN%JNNNNNNNNNNNNNNNNNNNNNNOGON to specify the ID sector & track. At same time, fix bug ; which did not specify the logon track. ; ; 3.02 7 JUL 88 GNNNNNNNNNNNNNNNNN+ENNNNNNNNNNNNNNNNNNNNNN********************************** SUBTTL SYSTEM DECLARATIONS ;========================================================== NNNNNNNNNNNNNNNNNN;NNNNNNNNNNNNNNNNNNNNNN; ASSEMBLY PARAMETERS ; ;============================================================================ FALSE EQU 0 TRUE EQU N7'NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN********************************** ; ; CUSTOMIZED BIOS FOR M5B ; (c) 1981 GRH Electronics, CUPERTINO, CA ; ;**********NNNNNNNNNNNNNNNNFVNNNNNNNNNNNNNNNNNNNNNN& 1 OF HARD DISK PHYSICAL DRIVE 1 ; F SIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 1 ENDIF IF BOOT = 20H ; A JADE 5" FLOxNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNALSO, ALL REFERENCES ; REQUIRING THE I/O PROMS TO BOOT HAS BEEN REMOVED. ; ; 2.2.5 - RECONFIGURE FOR 62K SYSTEM. ; ; 2. NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNate CBIOS rev). ; ; 2.00 - 24 MAR 84 GRH ; Modify for hard disk ; ; 2.01 - 28 APR 84 GRH ; Change hard disk DPB to refcNNNNNNNNNNNNNNNNN cNNNNNNNNNNNNNNNNNNNNNNfriendly disk error options: Abort, Retry, Ignore. ; Solved warm boot hang problem by reseting host adapter if busy. ; ; 3.00lNNNNNNNNNNNNNNNN&NNNNNNNNNNNNNNNNNNNNNNRH ; Add '?' to include file names. ; Change hard disk system tracks directory reference to new format. ; Correct bug in drivzNNNNNNNNNNNNNNNNN,&NNNNNNNNNNNNNNNNNNNNNN================== ; ; INCLUDE JDDCONT.DEF ; INCLUDE COMIOPB.DEF ; INCLUDE DISKS.DEF ; INCLUDE MONBOARD.DEF ; INCLUDE ZMON|0NNNNNNNNNNNNNNNNNN0 NNNNNNNNNNNNNNNNNNNNNNOT FALSE ;============================================================================ ; ; CONDITIONAL ASSEMBLY FLAGS ; ; NNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN****************************************************************** ; ; CONFIGURATION: ; ; CPM ; DRIVE USAGE IF BOOT = 1PNNNNNNNNNNNNNNNNugNNNNNNNNNNNNNNNNNNNNNNPPY PHYSICAL DRIVE 0 ; B JADE 5" FLOPPY PHYSICAL DRIVE 1 ; C SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 0 ; D SIDE 2 & 3 OFW~NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!2.6 - 20 FEB 83 ; DOUBLE D REV C UPGRADE. CHANGE BOARD STATUS PORT BITS. ; ; 2.2.7 - 8 MAR 83 GRH ; ADDED CLOCK/CALENDAR DRI9NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNlect half size directory, but keep ; allocation for 1k directory ; ; 2.02 - 2 JUN 84 GRH ; Change floppy disk drivers to r NNNNNNNNNNNNNNNNN!PNNNNNNNNNNNNNNNNNNNNNN - 26 JAN 87 GRH ; Implemented new common IOPB code & Jade floppy firmware support. ; Implemented disk drive driver tables a:&NNNNNNNNNNNNNNNN'(NNNNNNNNNNNNNNNNNNNNNNers which caused retry to fail. (sector remained ; corrupted) ; Stubbed out new Clock routines for present. ; ; 3.03 31 JUNNNNNNNNNNNNNNNN-NNNNNNNNNNNNNNNNNNNNNNROM.DEF ; INCLUDE DKBTROM.DEF ; INCLUDE NAKEDT.DEF ; INCLUDE ISHA.DEF ; INCLUDE CLOKROM.DEF ; ;===========================NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN============================================================================ SHORT EQU FALSE ;SHORT BIOS (REMOVES UNESENTIAL CNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN0H ;HARD DISK BOOT CONFIG. ; A SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 0 ; B SIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 0 ; SNNNNNNNNNNNNNNNNNf*NNNNNNNNNNNNNNNNNNNNNN HARD DISK PHYSICAL DRIVE 0 ; E SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 1 ; F SIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 1 ; ,NNNNNNNNNNNNNNNŇNNNNNNNNNNNNNNNNNNNNNNVER, SYSTEM CALL INTERCEPT, ; ILLEGAL SYSTEM CALL MESSAGE, CHANGED BIOS SIZE TO END ; OF INITIALIZED DATA AREA. RESTRUCTURE MOnNNNNNNNNNNNNNNNNN#GNNNNNNNNNNNNNNNNNNNNNNelate to ISASI control of JADE ; FDC. ; Change IOPB sector value from physical sector (1..n) to logical ; sector value $NNNNNNNNNNNNNNNNN"NNNNNNNNNNNNNNNNNNNNNNnd new function to return ; a ptr to a drive table. ; Removed init of IOBYTE. ; Implemented 5" floppy driver. ; ImplementedbNNNNNNNNNNNNNNNNN(NNNNNNNNNNNNNNNNNNNNNNL 88 GRH ; Unstub Clock routines. ; ; 3.04 6 AUG 88 GRH ; Remove floppy side select from BIOS & move to controller. ; I frNNNNNNNNNNNNNNN.@NNNNNNNNNNNNNNNNNNNNNN================================================= LIST OFF *INCLUDE JDDCONT.DEF *INCLUDE COMIOPB.DEF *INCLUDE DISKS.DEF *I4BrNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNODE) LSTINC EQU FALSE ;LIST INCLUDE FILES USEMON EQU TRUE ;USE MONITOR ROM I/O ROUTINES IF TRUE INTRPTS EQU TRUE ;ENABLE INNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN C SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 1 ; D SIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 1 ; E JADE 8" FLOPPY PHYSICAL DRIVErNNNNNNNNNNNNNNNNNUNNNNNNNNNNNNNNNNNNNNNN G JADE 8" FLOPPY PHYSICAL DRIVE 0 ; H JADE 8" FLOPPY PHYSICAL DRIVE 1 ENDIF ; ;***************************************eNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNDULES. ; ; 2.28 - 22 APR 83 GRH ; CHANGED DEFINITIONS TO ALLOW BIG DIRECTORIES. ; DISALLOWED DRIVES C & D. ; ; 2.29 - 3 NNNNNNNNNNNNNNNNNvNNNNNNNNNNNNNNNNNNNNNN(0..n-1). This maintains more uniformity in ; parameter passing between hard disk & JADE floppy IOPBs. ; Vector I/O routineGNNNNNNNNNNNNNNNNN#6NNNNNNNNNNNNNNNNNNNNNN use of ROM primitives. ; Moved system down to 60k. ; ; 3.01 26 JUN 88 GRH ; Remove 5" floppy support. Implement in CP/M-86vNNNNNNNNNNNNNNNNN)'NNNNNNNNNNNNNNNNNNNNNNmplement new ID sector format. ; Implement CP/M 3.0 DPB structure in preparation for deblocking. ; ; 3.05 11-3-88 GRH ; ChorNNNNNNNNNNNNNNNN/sNNNNNNNNNNNNNNNNNNNNNNNCLUDE MONBOARD.DEF *INCLUDE ZMONROM.DEF *INCLUDE DKBTROM.DEF *INCLUDE NAKEDT.DEF *INCLUDE ISHA.DEF *INCLUDE CLOKROM.DEF *SNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNTERRUPT PROCESSING WHISTLE INTCPTS EQU TRUE ;ENABLE SYSTEM CALL INTERCEPT WHISTLE BOOT EQU 10H ;10H: HARD DISK, 3: 8" FLOPP/!NNNNNNNNNNNNNNNN 4NNNNNNNNNNNNNNNNNNNNNN 0 ; F JADE 8" FLOPPY PHYSICAL DRIVE 1 ENDIF IF BOOT = 3 ; A JADE 8" FLOPPY PHYSICAL DRIVE 0 ; B JADE 8" FLOPPYNNNNNNNNNNNNNNNNNHNNNNNNNNNNNNNNNNNNNNN!********************** ; REVISIONS: ; ; 2.2.0 - RELEASE ; ; 2.2.3 - SWAPPED DCM & BIOS SECTORS ON DISK, ALLOWING A ; #rNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNSEP 83 GRH ; Changed Rev # for blocked DCM. Enables IBM system 34 ; 256 bytes per sector disks to be read. ; ; 1.10 - 23 SNNNNNNNNNNNNNNNNE%NNNNNNNNNNNNNNNNNNNNNNs to monitor rom routines. ; ; 2.03 - 4 JUN 84 GRH ; Add bells & whistles again. ; Move to 61k system. ; ; 2.04 - 30 MAR=urNNNNNNNNNNNNNNNNN${NNNNNNNNNNNNNNNNNNNNN! BIOS. ; Change single function to return drive table ptr into a BIOS function ; call using restart instruction. ; Change LވNNNNNNNNNNNNNNNNN*tNNNNNNNNNNNNNNNNNNNNNNange included data to update IOPB.PBSTAT to new configuration. ; VERSN EQU 305 ; ;******************************************rNNNNNNNNNNNNNNNN0`NNNNNNNNNNNNNNNNNNNNNNLIST ON ;============================================================================ ; ; DISK OPERATING SYSTEM ADDRESS_0NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNʁf4υk8ԉo= ٍuD|J畵Q왺W$[)Ţ`.ɦNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNaXNNNNNNNNNNNNNNNNNNNNNNES ; ;============================================================================ NKSYS: EQU 60 ;SYSTEM SIZE IN K BYTES KBNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN================================================= ; ; OTHER DECLARATIONS ; ;================================================vNNNNNNNNNNNNNNNN $5NNNNNNNNNNNNNNNNNNNNNN ; ASCII CHARS ; ;============================================================================ LF: EQU 0AH CR: EQU 0DH CTRLNNNNNNNNNNNNNNNNINNNNNNNNNNNNNNNNNNNNN!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; INITIALIZE VERSION TEXT IN RAM MACRO ; ;@@@@@@@@@@@@@@@@@@@@iNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNSOLE INPUT JP COC ;CONSOLE OUTPUT JP LO ;PRINTER OUTPUT JP PUNCH JP READER JP HOME ;HOME SELECTED DRIVE JP SELDSBNNNNNNNNNNNNNNNNA$NNNNNNNNNNNNNNNNNNNNNN#################################### BIOSSZ: DW BIOSND - BIOS ;BIOS MODULE SIZE IN BYTES BIOSST: DW BIOS ;BIOS MODULE LOAD AD$NNNNNNNNNNNNNNNN%zNNNNNNNNNNNNNNNNNNNNN!------------------- INIT: ; ; SET TEMPORARY STACK ; LD SP,DEFBFR ;USE PAGE 0 FOR STACK ; ; MAKE SURE ROM IS ENABLED rNNNNNNNNNNNNNNNNN+uNNNNNNNNNNNNNNNNNNNNNN Vers ' PVERS VERSN DM CR,LF IF $ > (DIRBF + SECSZ) CONMSG **** WARNING! COLD INIT CODE BIGGER THAN DIR BUFFER *NNNNNNNNNNNNNNNNN4 NNNNNNNNNNNNNNNNNNNNNNYTE: EQU 1024 CPMSZ: EQU KBYTE * NKSYS CPMBS: EQU CPMSZ - (20 * KBYTE) ; CP/M BIAS VALUE CCP: EQU CPMBS + 3400H ;ADDR OF CCP 7NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN============================ SECSZ: EQU 128 NDRVS: EQU 6 IF BOOT = 10H ; ; 8" HARD DISK BOOT DATA ; STHD EQU 0 ;STAtNNNNNNNNNNNNNNNNqfNNNNNNNNNNNNNNNNNNNNN!Z: EQU 1AH ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; GENERATE THE TRANSLATION TAB+NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ PVERS MACRO #VERS DD DL #VERS IF DD > 9999 DB (DD / 10000) + '0WNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNK ;SELECT DISK DRIVE JP SETTRK ;SET TRACK # JP SETSEC ;SET SECTOR # JP SETDMA ;SET TRANSFER ADDR JP DISKRD ;PERFORM 9NNNNNNNNNNNNNNNNN TNNNNNNNNNNNNNNNNNNNNNNDR FOR SBD ; ; CONTINUE ON WITH INIT ; INIT1: JR INIT ;##############################################################A9NNNNNNNNNNNNNNNN&)NNNNNNNNNNNNNNNNNNNNN! ; CALL GETMON ; ; INIT DEFAULT DRIVE ; LD A,(DK_PROM + 1) ;USE DRIVE # PASSED IN PAGE 0 AND A,3 LD (DEFDRV),A ; NNNNNNNNNNNNNNNNN,NNNNNNNNNNNNNNNNNNNNN!*** ELSE DS DIRBF+SECSZ-$ ;FILL OUT DIRECTORY BUFFER TO 1 SECTOR SIZE ENDIF ;------------------------------------{NNNNNNNNNNNNNNNNN:NNNNNNNNNNNNNNNNNNNNN! BDOS: EQU CPMBS + 3C00H ;ADDRESS OF BDOS BIOS: EQU CPMBS + 4A00H ;ADDRESS OF BDOS BIOSR: EQU 1000H - BIOS ; ; PAGE 0 LOCAvNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNRT LOGICAL DRIVE OF HARD DISK NDHD EQU 3 ;LAST LOGICAL DRIVE OF HARD DISK ST8FD EQU 4 ;START LOGICAL DRIVE OF 8" FLOPPY ND8NNNNNNNNNNNNNNNNBWNNNNNNNNNNNNNNNNNNNNNNLE MACRO ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ GXLATE MACRO #SECTORS, #SKEW LIST 'NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN' DD DL DD % 10000 ENDIF IF DD > 999 DB (DD / 1000) + '0' DD DL DD % 1000 ENDIF DB (DD / 100) + '0' DB '.' :aNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN DISK READ JP DISKWR ;PERFORM DISK WRITE JP LISTST ;RETURN LIST STATUS JP SECTRN ;TRANSLATE SECTOR JP BIOFUNC ;EXECUINNNNNNNNNNNNNNNNN!gNNNNNNNNNNNNNNNNNNNNNN############## ; ; DIRECTORY SECTOR BUFFER STARTS HERE AFTER CRUNCHING COLD START ; CODE. THIS BUFFER IS USED BY THE CP/M DINNNNNNNNNNNNNNNNN'NNNNNNNNNNNNNNNNNNNNNN; SEND SYSTEM SIGN-ON ; CLOGO: LD HL,MSGSO CALL EDITOR ; ; MODIFY COLD START VECTOR TO WARM START ; LD HL,(BIOS+4) ENNNNNNNNNNNNNNNNN-"NNNNNNNNNNNNNNNNNNNNNN---------------------- ; ; WARM REBOOT ENTRY LOADS CCP,BDOS FROM DISK & ; SETS UP VARIABLES ; ;----------------------------ًNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNTIONS ; PAGE0: EQU 0 ;START OF CP/M RAM IOBYTE: EQU PAGE0 + 3 ;IOBYTE ADDR DEFDRV: EQU PAGE0 + 4 ;DEFAULT DRIVE PARAM ADDR FNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNFD EQU 5 ;LAST LOGICAL DRIVE OF 8" FLOPPY ENDIF IF BOOT = 3 ; ; 8" FLOPPY BOOT DATA ; STHD EQU 2 ;START LOGICAL NNNNNNNNNNNNNNNNNQNNNNNNNNNNNNNNNNNNNNNNOFF NXTSEC DL 1 ;;START WITH SECTOR 1 LOWEST DL 1 ;; REPT #SECTORS LIST ON DB NXTSEC LIST OFF NXTSEC DL NXTSEC + #SldNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN! DB ((DD % 100) / 10) + '0' DB (DD % 10) + '0' ENDM SUBTTL BIOS CODE ORG BIOS ;------------------------------------ NNNNNNNNNNNNNNNNNwNNNNNNNNNNNNNNNNNNNNN!TE FUNCTION CALL ;############################################################################ ; ; THESE BOOT PARAMS MUSTxzNNNNNNNNNNNNNNNNN"2NNNNNNNNNNNNNNNNNNNNNNRECTORY CHECK ROUTINES THAT ; CHECK FOR DISK CHANGE. ; ;####################################################################>\NNNNNNNNNNNNNNNNN(&NNNNNNNNNNNNNNNNNNNNNN LD (BIOS+1),HL ; ; BOOT CCP & BDOS ; JR WARM ;####################################################################rNNNNNNNNNNNNNNN.wNNNNNNNNNNNNNNNNNNNNN!------------------------------ WARM: IF INTRPTS ; ; SET INTERRUPT VECTOR TABLE BASE ; LD A,HIGH INTABL LD I,A ; ; _NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN BDOSJV EQU PAGE0 + 5 ;BDOS SYSTEM CALL ENTRY DEFBFR EQU PAGE0 + 80H ;DEFAULT BUFFER ; ; BIOS FUNCTION CALL RESTART VECTOR 'NNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNDRIVE OF HARD DISK NDHD EQU 5 ;LAST LOGICAL DRIVE OF HARD DISK ST8FD EQU 0 ;START LOGICAL DRIVE OF 8" FLOPPY ND8FD EQU 1 ;=DNNNNNNNNNNNNNNNNNb+NNNNNNNNNNNNNNNNNNNNNNKEW ;ADD SKEW FACTOR ;; IF NXTSEC > #SECTORS ;CHECK FOR OVERFLOW NXTSEC DL NXTSEC - #SECTORS ;; IF NXTSEC <= LOWEST ;cBNNNNNNNNNNNNNNNȍNNNNNNNNNNNNNNNNNNNNNN---------------------------------------- ; ; BIOS JUMP VECTOR TABLE ; ;---------------------------------------------------'NNNNNNNNNNNNNNNNN'FNNNNNNNNNNNNNNNNNNNNNN RESIDE AS DEFINED RIGHT BEFORE THE COLD INIT ; ROUTINE START AND MUST BE IN THE 1ST SECTOR. THESE 2 WORDS ARE REFERENCED ; *rNNNNNNNNNNNNNNNN#NNNNNNNNNNNNNNNNNNNNNN######## DIRBF: EQU $ ;BUFFER BEGINNING ;---------------------------------------------------------------------------- ; ÇNNNNNNNNNNNNNNNNN)NNNNNNNNNNNNNNNNNNNNNN######## ; ; SIGN-ON MESSAGE ; ;############################################################################ MSGSO: DB CR,L9NNNNNNNNNNNNNNNN/DNNNNNNNNNNNNNNNNNNNNNN SET INTERRUPT MODE TO 2 ; IM 2 ; ; ENABLE INTERRUPT VECTOR 7 ; IN A,(M2_IMASK) AND A,7FH OUT (M2_IMASK),A ; ;1NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN ; BFUNRST EQU 28H BFUNRSV EQU PAGE0 + BFUNRST BFUNRSI EQU 0C7H + BFUNRST ; TPA: EQU 100H ;===========================NNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNLAST LOGICAL DRIVE OF 8" FLOPPY ENDIF ;============================================================================ ; AHNNNNNNNNNNNNNNNNNN7xNNNNNNNNNNNNNNNNNNNNNNCHECK FOR REPEAT NXTSEC DL LOWEST + 1 LOWEST DL NXTSEC ENDIF ENDIF ;; ENDM LIST ON ENDM ;@@@@@@@@@@@@@@@@@=NNNNNNNNNNNNNNNNسNNNNNNNNNNNNNNNNNNNNNN------------------------- JP INIT1 ;COLD START ENTRY JP WARM ;RELOAD CCP/BDOS JP CNSCK ;GET CONSOLE STATUS JP CI ;CO$NNNNNNNNNNNNNNNNrNNNNNNNNNNNNNNNNNNNNNNBY THE BOOT CODE IN ORDER TO FIND THE LOAD ADDRESS FOR THE BIOS & IT'S ; LENGTH. ; ;########################################v9NNNNNNNNNNNNNNNNN$KNNNNNNNNNNNNNNNNNNNNNN ; INIT - COLD START ENTRY FROM BOOT MUST SET ALL BIOS PARAMS ; ;---------------------------------------------------------9NNNNNNNNNNNNNNNNN*DNNNNNNNNNNNNNNNNNNNNNNF DB CPMSZ / (KBYTE * 10) + '0' DB (CPMSZ MOD (KBYTE * 10)) / KBYTE + '0' DB 'K CP/M-80 Vers 2.2',CR,LF DB 'M5b CBIOS  NNNNNNNNNNNNNNNN0WNNNNNNNNNNNNNNNNNNNNNN FINALLY ENABLE VECTORED INTERRUPTS ; IN A,(M2_STAT) OR A,M2_IEN OUT (M2_STAT),A EI ENDIF ; ; SET TEMPORARY ST$NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN΁j9ԅp> ډvCߍ{I呲NꕷS!Y&ž]+Ǣb0˦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNʹNNNNNNNNNNNNNNNNNNNNNNACK ; LD SP,DEFBFR ; ; INSURE MONITOR ROM STILL ENABLED ; CALL GETMON ; IF BOOT = 10H ; TEST ISHA HOST ADAPTER5 NNNNNNNNNNNNNNNNgNNNNNNNNNNNNNNNNNNNNNN A,(DEFBFR) CP A,86H JR C,WEROR ; ; SET UP TO LOAD CCP/BDOS ; LD HL,(DEFBFR + BD_SBDSS) ;PREFETCH BDOS TRK/SECTOR PdjBNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNND ; ; ELSE DONE READING SYSTEM ; JP WZRPG ; ; ; ELSE SET UP & READ BDOS ; RDBDOS: POP HL ;RESTORE BDOS TRK/SECTORNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNINTCPTS ; ; PUT BDOS VECTOR INTO INTERCEPT CODE ; LD HL,(BDOS + 7) LD (BDOSV),HL ; ; NOW PUT INTERCEPT VECTOR INTO BNNNNNNNNNNNNNNNNNGnNNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ DISKRD: LD A,PB_READC ;SELECT READ OP JP DISKOP ;yNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNUPPORTED DRIVE REQUESTED THEN RETURN 0 (ERROR) ; LD A,C CP A,NDRVS RET NC ; ; STORE DRIVE # FOR FUTURE USE ; LD (B(HNNNNNNNNNNNNNNNN%NNNNNNNNNNNNNNNNNNNNNNDRIVE ; LD (DTPTR),HL ;SAVE DRIVE TABLE PTR ; ; ATTEMPT TO READ ID SECTOR ; XOR A,A ;INIT FLAG BYTE UNTIL FIRMWARE RE=NNNNNNNNNNNNNNNNN+$NNNNNNNNNNNNNNNNNNNNNNO ; SEL1: PUSH HL LD HL,(DVRTPTR) LD DE,DVRFLG ADD HL,DE EX DE,HL POP HL LD BC,DVRSIZ - DVRFLG LDIR ; ; RETUE!NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN FOR A HUNG CONDITION AND CLEAR IF TRUE ; IN A,(ISH_STATUS) ;IF HOST ADAPTER BUSY THEN BIT ISH_BSYB,A JR Z,NTHUNG ; LDNNNNNNNNNNNNNNNNNw,NNNNNNNNNNNNNNNNNNNNNNUSH HL ; LD HL,(DEFBFR + BD_SCCPS) ;FETCH CCP TRK/SECTOR LD C,L LD B,0 CALL SETSEC ; LD C,H CALL SETTRK ; LD BCIdNNNNNNNNNNNNNNNN݊NNNNNNNNNNNNNNNNNNNNNN FROM DIRECTORY LD C,L LD B,A ;A STILL CONTAINS 0 CALL SETSEC ; LD C,H CALL SETTRK ; JR WREAD ; ; ; WARM BOO NNNNNNNNNNNNNNNNN12NNNNNNNNNNNNNNNNNNNNN!BDOS CODE ; LD HL,INTCPT LD (BDOS + 7),HL ; ; INITIALIZE CLOCK VECTORS IF CLOCK INSTALLED ; LD C,CLK_F7 ;TEST FOR BONNNNNNNNNNNNNNNN=NNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; WRITE A DISK SECTOR ; EXIT - A= 0: OK; /0: ENNNNNNNNNNNNNNNNN cNNNNNNNNNNNNNNNNNNNNN!TDRV),A ; ; SAVE LOGON REQUEST FLAG ; LD A,E LD (LOGRQ),A ; ; COMPUTE DISK DRIVER TABLE PTR ; CALL RETDVRT ;DRI|RNNNNNNNNNNNNNNNN&RNNNNNNNNNNNNNNNNNNNNNNVISED LD (IOPB + PB_ST2O),A ; CALL DISKLOG JP NZ,FDSKER ; ; IF NO ID SECTOR THEN USE DEFAULTS ; LD A,(IOPB + PB_ST8NNNNNNNNNNNNNNNNN,NNNNNNNNNNNNNNNNNNNNNNRN DRIVE TABLE PTR ; LD HL,(DTPTR) XOR A,A RET ; ; ; IF NOT HARD DISK THEN GO DO FLOPPY TEST ; LGDEF: LD A,(BTDRV)NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN A,PB_CLRC LD (IOPB + PB_CMDO),A CALL XPRIM ; NTHUNG: ENDIF ; ; LOG ON DRIVE TO INIT TABLES ; LD A,(DK_PROM + 1KyNNNNNNNNNNNNNNNNN DNNNNNNNNNNNNNNNNNNNNNN,CCP CALL SETDMA ; ; READ CCP/BDOS ; WREAD: CALL DISKRD JR NZ,WEROR ;IF ERROR THEN EXIT ; ; NEXT SECTOR ; LD HLNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNT ERROR, OUTPUT MSG & HALT ; WEROR: LD HL,MSGLE ;OUTPUT ERROR MESSAGE CALL EDITOR HALT ; ; ; BOOT OK, INIT PAGE 0 ; HyNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNARD PRESENT CALL CLK1 ; ; IF CLOCK PRESENT THEN TURN ON CLOCK DRIVE ; OR A,A LD A,38H ;COND. JR (ON) JR NZ,CLKON 9NNNNNNNNNNNNNNNNN! NNNNNNNNNNNNNNNNNNNNNNRROR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ DISKWR: LD A,PB_WRITC ;SELECT WRITE OPޖrNNNNNNNNNNNNNNNNN!RNNNNNNNNNNNNNNNNNNNNNNVE IS STILL IN C REGISTER LD (DVRTPTR),HL ; ; PREFETCH DRIVER EXECUTION ADDRESS FROM TABLE ; LD E,(HL) ;STORE ADDRESS '!NNNNNNNNNNNNNNN'aNNNNNNNNNNNNNNNNNNNNNN2O) CP A,-2 ;0: NO ID, -1: JADE ID, -2: EXTENDED ID JR NZ,LGDEF ; ; ELSE XFER ID SECTOR DATA TO TABLES ; CALL TRNONEBNNNNNNNNNNNNNNNN-?NNNNNNNNNNNNNNNNNNNNNN IF STHD <> 0 CP A,STHD JR C,LGCKFD ENDIF CP A,NDHD + 1 JR NC,LGCKFD ; ; ELSE USE HARD DISK DEFAULTS ; CA='NNNNNNNNNNNNNNNNN2ANNNNNNNNNNNNNNNNNNNNNN) AND A,3 ;MODULO 4 LD C,A LD E,0 CALL SELDSK LD A,L ;IF ERROR THEN ABORT OR A,H JR Z,WEROR ; ; READ BOOT DIWHNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN!,BTSEC INC (HL) ; LD DE,SECSZ ;DMA := DMA + SECTOR SIZE LD HL,(BTDMA) ADD HL,DE LD (BTDMA),HL ; ; IF NOT INTO BDOBNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN WZRPG: ; ; INIT BIOS WARM START IN PAGE 0 ; LD A,0C3H LD HL,BIOS + 3 LD (PAGE0),A LD (PAGE0 + 1),HL ; ; INIT B-NNNNNNNNNNNNNNNNWPNNNNNNNNNNNNNNNNNNNNNN; ; ELSE TURN OFF CLOCK DRIVE ; LD A,18H ;UNCOND. JR (OFF) (CAUSES JUMP TO ILLEGAL) ; CLKON: LD (INHCLK),A ; ENDIF NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN! JP DISKOP ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; SELECT DRIVE FUNCTION ; LNNNNNNNNNNNNNNNNN"NNNNNNNNNNNNNNNNNNNNNN INC HL LD D,(HL) INC HL LD (DVRXADR),DE ; ; FETCH FLAGS ; LD C,(HL) ; ; COMPUTE DISK PARAMETER TABLE ADDRESS 2NNNNNNNNNNNNNNNNN(qNNNNNNNNNNNNNNNNNNNNNN ;ASSUME NO TRANSLATION ; ; IF HARD DISK OR DOUBLE DENSITY THEN NO TRANSLATION ; LD A,(DEFBFR + ID_FLGO) AND A,[1 SHL BrNNNNNNNNNNNNNNN.lNNNNNNNNNNNNNNNNNNNNN!LL TRNONE ; NO XLATE LD HL,HDPBK ; ; XFER DATA TO TABLES ; SEL2: PUSH HL CALL DPBAD ; USE DEFAULT TABLE POP HL NNNNNNNNNNNNNNNNNpNNNNNNNNNNNNNNNNNNNNN!RECTORY ; LD BC,DEFBFR ;SET XFER ADDRESS (USE DEFAULT BUFFER) CALL SETDMA ; LD BC,BD_SEC ;SET DIRECTORY SECTOR CALL T'NNNNNNNNNNNNNNNNNN "NNNNNNNNNNNNNNNNNNNNNNS THEN READ NEXT SECTOR ; LD DE,BDOS XOR A,A SBC HL,DE JR C,WREAD ; ; ELSE IF AT BEGINNING OF BDOS THEN SET UP NEW DeNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNDOS CALL VECTOR IN PAGE 0 ; LD HL,BDOS + 6 LD (BDOSJV),A LD (BDOSJV + 1),HL ; ; INIT BIOS CALL VECTOR IN PAGE 0 ; g!NNNNNNNNNNNNNNNdaNNNNNNNNNNNNNNNNNNNNNN ; ; PASS DEFAULT DISK TO CCP ; LD A,(DEFDRV) LD C,A JP CCP SUBTTL BIOS DISK FUNCTION ROUTINES ;+++++++++++++++++ 'NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOG-ON - SET DISK PARAMETER BLOCK ; ENTRY- C= DRIVE # ; E= 0 IF NEW SELECT ; EXIT - HL= PTR TO DPT OR 0 FOR ERROR ; ;++++++UNNNNNNNNNNNNNNNN#0NNNNNNNNNNNNNNNNNNNNNN ; LD HL,(BTDRV) LD H,0 ADD HL,HL ;DISK # * 16 ADD HL,HL ADD HL,HL ADD HL,HL LD DE,D0DPH ADD HL,DE ; ; IF NnNNNNNNNNNNNNNNNNN)BNNNNNNNNNNNNNNNNNNNNNNDF_DTDB] OR [1 SHL DF_HARDB] ; ; ELSE SET TRANSLATION ; CALL Z,TR8 ; ; XFER DISK DATA TO DPB ; NOX: CALL DPBAD ;GorNNNNNNNNNNNNNNNN/]NNNNNNNNNNNNNNNNNNNNNN LD BC,DPBSZ LDIR JR SEL1 ; ; ; USE 8" FLOPPY DEFAULTS ; LGCKFD: CALL TR8 LD HL,SD8PBK JR SEL2 ;************~BNNNNNNNNNNNNNNNNT#NNNNNNNNNNNNNNNNNNNNNNSETSEC ; LD BC,0 ;SET TRACK TO 0 CALL SETTRK ; CALL DISKRD JR NZ,WEROR ; ; CHECK FOR VALID BOOT DIRECTORY ; LD-NNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNN!TRACK & SECTOR ; JR Z,RDBDOS ; ; ELSE IF NOT AT BIOS THEN READ NEXT SECTOR ; LD DE,BIOS - BDOS SBC HL,DE JP C,WREANNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNLD HL,BIOFUNC LD (BFUNRSV),A LD (BFUNRSV + 1),HL ; ; SET DEFAULT SECTOR BUFFER ; LD BC,DEFBFR CALL SETDMA ; IF NNNNNNNNNNNNNNNNt_NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; READ A DISK SECTOR ; EXIT - A= 0: OK; /0: ERROR ; ;++++++++mNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ SELDSK: ; ; ASSUME ERROR ; LD HL,0 ; ; IF UNStdNNNNNNNNNNNNNNNNN$4NNNNNNNNNNNNNNNNNNNNNNOT FIRST SELECT OR LOGON INHIBITED THEN RETURN TABLE PTR ; LD A,(LOGRQ) OR A,C CPL AND A,1 RET Z ; ; ELSE LOG ON NNNNNNNNNNNNNNNNN*NNNNNNNNNNNNNNNNNNNNNNET ADDR OF DPB LD HL,DEFBFR + ID_SPTO LD BC,DPBSZ LDIR ; ; XFER DISK PHYSICAL DATA TO TABLE ; LD HL,DEFBFR + ID_FLGrNNNNNNNNNNNNNNNN0NNNNNNNNNNNNNNNNNNNNNN**************************************************************** ; ; HOME DRIVE - TREAT AS SEEK TRK 0 ; EXIT - BC= 0 ; ;*HNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNˁe4υl9Չp> ٍuCߑ{I整P뙹V$\)Ƣa/ʦNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN*************************************************************************** HOME: LD BC,0 ;*******************************qNNNNNNNNNNNNNNNNNNP"NNNNNNNNNNNNNNNNNNNNN!******************** SETDMA: LD (BTDMA),BC XOR A,A LD (BTDMAX),A RET ;++++++++++++++++++++++++++++++++++++++++++++++J!NNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNC RET SUBTTL DISK SUPPORT ROUTINES ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; 2NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN CODE ; ENTRY- A= IOPB COMMAND ; EXIT - A= 0: OK; /0: ERROR ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++DrNNNNNNNNNNNNNNNNNp^NNNNNNNNNNNNNNNNNNNNNND A,(DE) ;FETCH BYTE PUSH DE ;SAVE REGS PUSH BC CALL PRHEX ;OUTPUT ERROR CODE ; LD C,' ' CALL COC ; POP BC ;RE3NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN;RETURN DPB_PTR = 0 FOR SELECT FUNCTION LD A,-1 ;RETURN -1 TO BDOS OR A,A RET ;*************************************5$NNNNNNNNNNNNNNNN%0NNNNNNNNNNNNNNNNNNNNNN+++++++++++++ ; ; RETURN DRIVE PARAMETER BLOCK ADDR FUNCTION ; EXIT - DE= DPB PTR ; HL= ? ; ;++++++++++++++++++++++++++++NNNNNNNNNNNNNNNNN+NNNNNNNNNNNNNNNNNNNNNNH LOGICAL DRIVE ; LD A,(BTDRV) ;IF EVEN THEN ADD 0 ELSE ADD 128 RRCA AND A,80H LD E,A ;COMPUTE SECTOR LD D,0 LD H'NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN********************************************* ; ; SET TRACK # ; ENTRY- BC= TRACK # ; ;*************************************L9NNNNNNNNNNNNNNNN@NNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++ ; ; SECTOR TRANSLATION FUNCTION ; ENTRY- DE= 0: NO XLATE, ELSE PTR TO XLATE TABLE ; BC= SECT(NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNLOGON DISK FUNCTION ; EXIT - A= 0: OK; /0: ERROR ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++Q$NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN+++++++++++++++ DISKOP: ; ; SET UP IOPB ; LD HL,BTTRK LD DE,IOPB + PB_TRKO LD BC,PB_BCNTO - PB_TRKO LDIR ; DISKONNNNNNNNNNNNNNNN% NNNNNNNNNNNNNNNNNNNNNNSTORE REGS POP DE INC DE ;NEXT ERROR BYTE DJNZ DSKER1 ;IF NOT DONE THEN LOOP ; LD HL,DSKEB ;OUTPUT ERROR MESSAGE CAa NNNNNNNNNNNNNNNNN SNNNNNNNNNNNNNNNNNNNNNN*************************************** ; ; SET 3740 SECTOR TRANSLATION PROCEDURE ; ENTRY- (DTPTR)= MUST BE PTR TO DTP ; EXIrNNNNNNNNNNNNNNNN&eNNNNNNNNNNNNNNNNNNNNN!++++++++++++++++++++++++++++++++++++++++++++++++ DPBAD: LD HL,(DTPTR) ;FETCH BASE ADDR LD DE,10 ;ADD OFFSET OF DPB PTR ADDۧNNNNNNNNNNNNNNNNN,>NNNNNNNNNNNNNNNNNNNNN!L,(IOPB + PB_SECO) ; PUSH HL ;SAVE SECTOR TO RESTORE LATER ; ADD HL,DE LD (IOPB + PB_SECO),HL ; ; EXECUTE IOPB ; NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!*************************************** SETTRK: LD (BTTRK),BC RET ;***************************************************/NNNNNNNNNNNNNNNNNN s-NNNNNNNNNNNNNNNNNNNNNNOR # TO XLATE ; EXIT - HL= XLATED SECTOR OR (BC) + 1 ; BC= UNCHANGED ; A, DE= ? ; ;++++++++++++++++++++++++++++++++++++++NNNNNNNNNNNNNNNNًNNNNNNNNNNNNNNNNNNNNN!+++ DISKLOG: ; ; SET DESCRIPTOR SECTOR XFER ADDRESS TO DEFAULT BUFFER ; LD HL,DEFBFR LD (IOPB + PB_DMAO),HL XOR A,A d^NNNNNNNNNNNNNNNNN53NNNNNNNNNNNNNNNNNNNNNNP2: LD (IOPB + PB_CMDO),A ; ; FETCH DRIVER VECTOR & EXECUTE DISK DRIVER ; DKOPLP: PUSH IY ;SAVE IY LD IY,(DVRTPTR) /NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN######## ; ; BIOS FUNCTION TABLE ; ;############################################################################ BFUNTBL: NNNNNNNNNNNNNNNNNGNNNNNNNNNNNNNNNNNNNNNN DRIVER TABLE BASE PTR ; A, C= 0 ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; BIOrNNNNNNNNNNNNNNNNdNNNNNNNNNNNNNNNNNNNNNN+++ EXIOPB: ; ; SET UP FOR CALL ; LD HL,DK_DSKX LD A,(DK_PROM) CALL EXROM ; ; FETCH & RETURN RESULT STATUS ; *NNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNOC ; ; RETURN DATA ; POP AF RET ;*************************************************************************** ; ;NNNNNNNNNNNNNNNN&$qNNNNNNNNNNNNNNNNNNNNNN11H ;THIS ADDR MODIFIED BY WARM BOOT RTN ; ; THE FOLLOWING CONDITIONAL JUMP IS MODIFIED TO AN UNCONDITIONAL JUMP BY ; THE W {INNNNNNNNNNNNNNNNN,˺NNNNNNNNNNNNNNNNNNNNNNUT FUNCTION # ; POP HL LD A,L CALL PRHEX ; ; OUTPUT NEW LINE ; CALL CRLF ; ; RETURN NULLS ; XOR A,A ;BC = Y6!NNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNPPY DRIVER ROUTINES ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; JADE 8" FLOPPY DISK DRIKYNNNNNNNNNNNNNNNNN 2NNNNNNNNNNNNNNNNNNNNN!SPATCHER ; EXIT - A= -1: ERROR, 0: OK ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ BIOFUNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN DW RETVERS ;0:RETURN VERSION # DW RETDVRTF ;1:RETURN DISK PHYSICAL CONFIGURATION TABLE PTR DW EXIOPB ;2:EXECUTE THE IOPB NNNNNNNNNNNNNNNNNtNNNNNNNNNNNNNNNNNNNNNNS CALL ENTRY (E= DRIVE #) ; RETDVRTF: LD C,E ; RETDVRT: LD HL,DVR0 ;START AT 1ST TABLE ; ; IF DRIVE == 0 THEN ALREA;pNNNNNNNNNNNNNNNNNWNNNNNNNNNNNNNNNNNNNNNNLD A,(IX + PB_STATO) OR A,A ;TEST RESULT FOR RETURN RET SUBTTL NON-DISK PROCEDURES ;*******************************TNNNNNNNNNNNNNNNNN!NNNNNNNNNNNNNNNNNNNNNN NEWLINE PROCEDURE ; ;*************************************************************************** CRLF: LD C,CR CALL COC 'NNNNNNNNNNNNNNNN'@NNNNNNNNNNNNNNNNNNNNNNARM BOOT ROUTINE IF THE CLOCK/CALENDAR BOARD IS NOT PRESENT ; IF NOT MODIFIED, THEN IT IS ALLWAYS FALSE (NOP). ; INHCLK: JR .NNNNNNNNNNNNNNNNNN-NNNNNNNNNNNNNNNNNNNNNNHL = A = 0 LD L,A LD H,A LD C,A LD B,A RET ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++,NNNNNNNNNNNNNNNNNDNNNNNNNNNNNNNNNNNNNNNNVER FUNCTION ; ENTRY- IY= DRIVER TABLE PTR ; EXIT - A= 0: OK; /0: ERROR ; ;+++++++++++++++++++++++++++++++++++++++++++++++++4!NNNNNNNNNNNNNNNNN gNNNNNNNNNNNNNNNNNNNNN!C: ; ; IF FUNCTION # NOT IN TABLE THEN RETURN -1 ; LD A,C CP A,MAXFUNCS LD A,-1 RET NC ; ; ELSE COMPUTE TABLE ENNNNNNNNNNNNNNNNNBNNNNNNNNNNNNNNNNNNNNNN MAXFUNCS EQU ($ - BFUNTBL) / 2 ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN xNNNNNNNNNNNNNNNN!NNNNNNNNNNNNNNNNNNNNNNDY THERE ; LD A,C OR A,A RET Z ; ; ELSE IF ILLEGAL DRIVE THEN RETURN ERROR ; CP A,NDRVS JR C,RETDV2 ; OR A,A NNNNNNNNNNNNNNNNN/NNNNNNNNNNNNNNNNNNNNNN********************************************* ; ; OUTPUT HEX DATA TO CONSOLE SUBR ; ENTRY- A= DATA ; EXIT - A, C= ? ; ;***$@NNNNNNNNNNNNNNNNN"NNNNNNNNNNNNNNNNNNNNNNLD C,LF JP COC IF INTCPTS SUBTTL ADDITIONAL FUNCTIONS TO SUPPORT CDOS PROGRAMS ;************************************bNNNNNNNNNNNNNNNNN(~NNNNNNNNNNNNNNNNNNNNNNC,ILLEGC ; ; NOW CHECK FOR EXTENDED CALLS ; CP A,8DH ;IF RETURN VERSION THEN RETURN IT JR Z,RETCVER ; CP A,90H ;IF ߝrNNNNNNNNNNNNNNN.NNNNNNNNNNNNNNNNNNNNNN+++++++ ; ; CDOS RETURN VERSION FUNCTION ; MAKES CLOCK/CALENDAR WORK. ; EXIT - B= 1 ; ;++++++++++++++++++++++++++++++++++ONNNNNNNNNNNNNNNNNwNNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++ FD8EXEC: ; ; CONVERT LOGICAL DRIVE TO PHYSICAL DRIVE ; LD A,(IY + DVRPDRV) LD (IOPB + PB_DNNNNNNNNNNNNNNNNNN TNNNNNNNNNNNNNNNNNNNNN!NTRY ; PUSH HL ;SAVE POSSIBLE DATA ; LD HL,BFUNTBL LD A,C ADD A,A ADD A,L LD L,A LD A,0 ADC A,H LD H,A ; NNNNNNNNNNNNNNNNNsNNNNNNNNNNNNNNNNNNNNNNBIOS VERSION # ; EXIT - HL= VERSION # IN BINARY {0.00,..655.35} ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN RET ; ; ; ELSE COMPUTE TABLE PTR ; RETDV2: LD B,C LD DE,DVRSIZ ; RETDVL: ADD HL,DE DJNZ RETDVL ; ; RETURN NO |NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN************************************************************************* PRHEX: ; ; PROCESS HIGH NIBBLE 1ST ; CALL PRDINNNNNNNNNNNNNNNN#ۄNNNNNNNNNNNNNNNNNNNNNN*************************************** ; ; SYSTEM CALL INTERCEPT ROUTINE CHECKS FOR ILLEGAL BDOS CALLS & ; PRINTS MESSAGE I+CrNNNNNNNNNNNNNNNNN)4ONNNNNNNNNNNNNNNNNNNNNNNOT CLOCK THEN ERR JR C,ILLEGC ; JR Z,CLKCAL ;IF CALENDAR THEN GET IT ; CP A,92H JR C,CLKSET ;IF SET FUNCTION THEN SETNNNNNNNNNNNNNNNN/NNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++++ RETCVER: LD B,1 RET SUBTTL CLOCK ROUTINES ;++++++++++++++++++++++++++++++++!NNNNNNNNNNNNNNNN"NNNNNNNNNNNNNNNNNNNNN!RVO),A ; ; FETCH SECTOR DATA ; LD HL,(IOPB + PB_SECO) PUSH HL ;SAVE FOR XPRIM RESTORE ; ; ; EXECUTE THE IOPB ; mNNNNNNNNNNNNNNNNN \NNNNNNNNNNNNNNNNNNNNNN; EXECUTE TABLE ADDRESS ; LD A,(HL) INC HL LD H,(HL) LD L,A ; EX (SP),HL ;PUT CALLER'S DATA IN HL, FUNCTION ADDR NNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++ RETVERS: LD HL,VERSN XOR A,A ;RETURN NO ERROR RET ;++++++++++++++++++++++++++++++++++++++++++++GrNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNERROR ; XOR A,A RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EXECUTE IOPB F`NNNNNNNNNNNNNNNNMNNNNNNNNNNNNNNNNNNNNN!G ; ; SWAP HIGH & LOW NIBBLES ; PRDIG: RLCA RLCA RLCA RLCA ; ; SAVE DATA FOR RETURN ; PUSH AF ; ; CONVERTNNNNNNNNNNNNNNNNN$BNNNNNNNNNNNNNNNNNNNNNNF ILLEGAL. ALSO IMPLEMENTS CDOS CLOCK/CALENDAR ; SYSTEM CALLS FOR ASMB. ; ;*************************************************{rNNNNNNNNNNNNNNNNN*aNNNNNNNNNNNNNNNNNNNNNN CLOCK ; JR Z,CLKTIM ;IF TIME THEN GET IT ; CP A,93H JR Z,CLKRDC ;IF READ CLOCK THEN GET IT ; ; ILLEGAL SYSTEM CALL NNNNNNNNNNNNNNNN0NNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN CALENDAR FUNCTION 90H ; EXIT - A= DAY ; B= MONTH ; C= YEAR ; L=UHNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNHNNNNNNʁe4υk8Ӊn; ֍r@ܑwEᕯ}K晴QW%¢]+ƦNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN0NNNNNNNNNNNNNNNNNNNNN! DAY OF WEEK ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ CLKCAL: LD HL,CLK_CAL ;ROM ENTNNNNNNNNNNNNNNNN&NNNNNNNNNNNNNNNNNNNNNN************************* ; ; CLOCK SET FUNCTION 91H ; ENTRY- DE= CLOCK IMAGE BUFR PTR (13 BYTES LONG) ; ;*****************šNNNNNNNNNNNNNNNN ]NNNNNNNNNNNNNNNNNNNNNNROM ; ; ROM PROCEDURE RETURNS HERE ; EXROMR: PUSH AF ;SAVE RETURN VALUE CALL GETMON ;RESELECT MONITOR ROM ; POP AF NNNNNNNNNNNNNNNN!NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++++++ CNSCK: IF USEMON CALL GETMON JP MR_CONSTS ELSE IN A,(NT_STAT) ;IF DaBNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ NTOST: IN A,(NT_STAT) CPL ;REVERSE SENSE AND A,1 SHL rNNNNNNNNNNNNNNNNLNNNNNNNNNNNNNNNNNNNNNN*********************************************************************** LO: IF USEMON CALL GETMON JP MR_LSTOUT ELSENNNNNNNNNNNNNNNN%FNNNNNNNNNNNNNNNNNNNNNN******************************* ; ; MESSAGE EDITOR ; ENTRY- HL= TEXT PTR (BIT 7= 1: TERMINATOR) ; EXIT - REGS= ? ; ;******?fNNNNNNNNNNNNNNNNN+eNNNNNNNNNNNNNNNNNNNNNNSAV),A CALL GETMON ; ; PRINT PROMPT ; LD HL,ITMSG IQCONT: CALL EDITOR ; LD HL,IQMSG ;QUERY USER CALL EDITOR ; ;K^!NNNNNNNNNNNNNNNNNcNNNNNNNNNNNNNNNNNNNNNNRY POINT JR CLK2 ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN TIME FUNCTIONNNNNNNNNNNNNNNNN6NNNNNNNNNNNNNNNNNNNNNN*********************************************************** CLKSET: LD C,CLK_F2 ; CLK1: LD HL,CLK_FUN ; CLK2: LD A,CLK_RO;NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN ;RETURN VALUE RET SUBTTL CHAR I/O ROUTINES ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++>INNNNNNNNNNNNNNNNNpNNNNNNNNNNNNNNNNNNNNNNATA NOT READY THEN RETURN 0 AND A,1 SHL NT_READY TTOST1: RET Z LD A,-1 ;ELSE RETURN -1 RET ENDIF ;*************9NNNNNNNNNNNNNNNNSNNNNNNNNNNNNNNNNNNNNN!NT_BUSY JR TTOST1 ENDIF ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; READER DRNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN RET ENDIF ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN LIST DEVICE STAQ9NNNNNNNNNNNNNNNN&ANNNNNNNNNNNNNNNNNNNNNN********************************************************************** EDITOR: LD C,(HL) ;MESSAGE EDIT LOOP PUSH HL ;SAVE PHHNNNNNNNNNNNNNNNNN,NNNNNNNNNNNNNNNNNNNNNN GET & ECHO USER INPUT ; CALL CI ; PUSH AF LD C,A CALL COC POP AF ; ; IF OPTION IS CTRL-C THEN WARM BOOT ; &BNNNNNNNNNNNNNNNNRNNNNNNNNNNNNNNNNNNNNNN 92H ; EXIT - A= SECONDS ; B= MINITS ; C= HOURS ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++!NNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNM ; ; FALL INTO ROM EXECUTER ; ENDIF ;****************************************************************************CFNNNNNNNNNNNNNNNNN?NNNNNNNNNNNNNNNNNNNNN!+ ; ; CONSOLE INPUT ; EXIT - A= CHAR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ CI: (NNNNNNNNNNNNNNNNNCNNNNNNNNNNNNNNNNNNNNNN*************************************************************** ; ; CONSOLE OUTPUT ; ENTRY- C= CHAR TO OUTPUT ; ;**********]BNNNNNNNNNNNNNNNNN`NNNNNNNNNNNNNNNNNNNNNNIVER - DUMMY ; EXIT - A= CTRL-Z ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ READER: LD A NNNNNNNNNNNNNNNNN!NNNNNNNNNNNNNNNNNNNNNNTUS ; EXIT - A= 0: BUSY, FFH:READY ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ LISTST: !NNNNNNNNNNNNNNN' pNNNNNNNNNNNNNNNNNNNNNNTR RES 7,C ;CLEAR BIT 7 FOR OUTPUT CALL COC ; POP HL BIT 7,(HL) ;IF BIT 7 SET THEN RETURN RET NZ ; INC HL ;ELSEI!NNNNNNNNNNNNNNNN-ϻNNNNNNNNNNNNNNNNNNNNNNCP A,3 ;IF CTRL-C THEN WARM BOOT JP Z,PAGE0 ; ; IF OPTION IS YES THEN WARM BOOT ; AND A,5FH ;IGNORE CASE ; CP A,'YNNNNNNNNNNNNNNNNNsNNNNNNNNNNNNNNNNNNNNNN++++++ CLKTIM: LD HL,CLK_TIM JR CLK2 ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ;S$NNNNNNNNNNNNNNNNN PNNNNNNNNNNNNNNNNNNNNNN ; ; EXECUTE ROM ROUTINE ; ENTRY- HL= ENTRY ADDRESS ; A= ROM # ; EXIT - ? ; ;*******************************************NNNNNNNNNNNNNNNNrNNNNNNNNNNNNNNNNNNNNNN IF USEMON CALL GETMON ;SWITCH IN MONITOR ROM JP MR_CONIN ;USE MONITOR ELSE CALL CNSCK ;IF NO CHAR RDY THEN WAIT xINNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN****************************************************************** COC: IF USEMON CALL GETMON JP MR_CONOUT ELSE CrNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN,CTRLZ ;FAKE EOF ;**************************************************************************** ; ; PUNCH DRIVER ; ENTRYGNNNNNNNNNNNNNNNNN"߅NNNNNNNNNNNNNNNNNNNNN! IF USEMON CALL GETMON JP MR_LSTSTS ELSE LD A,-1 RET ENDIF ;*********************************************NNNNNNNNNNNNNNNNN(0NNNNNNNNNNNNNNNNNNNNNNN PRINT NEXT CHAR JR EDITOR IF INTRPTS SUBTTL INTERRUPTS ;-------------------------------------------------------------3NNNNNNNNNNNNNNN.NNNNNNNNNNNNNNNNNNNNN!' JP Z,PAGE0 ; ; IF OPTION IS INTERRUPT THEN EXECUTE RESTART 7 ; CP A,'I' JR NZ,ITRAP1 ; POP BC ;RESTORE REGS 1STi NNNNNNNNNNNNNNNNN@NNNNNNNNNNNNNNNNNNNNNN ; READ CLOCK TIME FUNCTION 93H ; ENTRY- DE= PTR TO 13 BYTE BUFFER FOR CLOCK DATA ; ;+++++++++++++++++++++++++++++++++++++++NNNNNNNNNNNNNNNNNN cNNNNNNNNNNNNNNNNNNNNNN********************************* EXROM: AND A,M2_RSMK ;MASK OUT UNUSED BITS OUT (M2_RSEL),A ; PUSH HL ;SAVE ROM ENTRY NNNNNNNNNNNNNNNNNCNNNNNNNNNNNNNNNNNNNNNN JR Z,CI IN A,(NT_DATA) ;ELSE RETURN CHAR RET ENDIF ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++NNNNNNNNNNNNNNNNN%NNNNNNNNNNNNNNNNNNNNNNALL NTOST ;IF BUSY THEN WAIT OR A,A JR Z,COC LD A,C OUT (NT_DATA),A RET ;+++++++++++++++++++++++++++++++++++++,cNNNNNNNNNNNNNNNNN.NNNNNNNNNNNNNNNNNNNNNN- C= CHAR TO OUTPUT ; ;**************************************************************************** PUNCH: RET ;********mBNNNNNNNNNNNNNNNN#NNNNNNNNNNNNNNNNNNNNNN******************************* ; ; GET MONITOR PROM SUBR ; EXIT - A= ? ; ;************************************************}NNNNNNNNNNNNNNNNN)NNNNNNNNNNNNNNNNNNNNNN--------------- ; ; USER INTERRUPT ; ;---------------------------------------------------------------------------- ITRAP: TBNNNNNNNNNNNNNNNN/NNNNNNNNNNNNNNNNNNNNNN POP HL POP AF JP 0038H ; ; IF OPTION IS MONITOR THEN EXECUTE MONITOR TRAP ; ITRAP1: CP A,'M' JR NZ,ITRAPR ; PO9NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++ CLKRDC: LD C,CLK_F1 JR CLK1 ;***************************************************NNNNNNNNNNNNNNNNN lNNNNNNNNNNNNNNNNNNNNNNVECTOR ; LD HL,EXROMR ;PUT RETURN ADDR ON STACK EX (SP),HL ;SWAP RETURN ADDRESS WITH ROM ENTRY VECTOR JP (HL) ;EXECUTE s!NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!++++++++++++++ ; ; RETURN CONSOLE STATUS ; EXIT - A= 0: NOT READY ; FFH: CHAR READY ; ;+++++++++++++++++++++++++++++++ NNNNNNNNNNNNNNNN5NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++ ; ; RETURN CONSOLE OUTPUT READY STATUS ; EXIT - A= 0: BUSY, FFH: READY ; ;+++++++++NNNNNNNNNNNNNNNN}NNNNNNNNNNNNNNNNNNNNNN******************************************************************** ; ; PRINTER DRIVER ; ENTRY- C= CHAR TO OUTPUT ; ;*****fKNNNNNNNNNNNNNNNNN$u#NNNNNNNNNNNNNNNNNNNNNN**************************** GETMON: LD A,MR_RNUM OUT (M2_RSEL),A RET ;*********************************************(pBNNNNNNNNNNNNNNNNN*V,NNNNNNNNNNNNNNNNNNNNNN; ; SAVE REGS FIRST ; PUSH AF PUSH HL PUSH BC ; ; SAVE CURRENT ROM & GET MONITOR ROM ; IN A,(M2_RSEL) LD (ROMAMNNNNNNNNNNNNNNNN0NNNNNNNNNNNNNNNNNNNNNNP BC POP HL POP AF JP 0F824H ; ; ELSE RESTORE REGS & RETURN ; ITRAPR: LD A,(ROMSAV) ;RESTORE ROM # OUT (M2_RSEL)S$NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN΁i7҅n;։q> ۍxF⑰~L長S!Y&Þ^,ʢe3ΦNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNoNNNNNNNNNNNNNNNNNNNNNN,A ; POP BC POP HL POP AF EI ;RE-ENABLE INTERRUPTS RET ;------------------------------------------------------ NNNNNNNNNNNNNNNNHNNNNNNNNNNNNNNNNNNNNNN################################################### ; ; COMMON I/O PARAMETER BLOCK ; ;######################################yNNNNNNNNNNNNNNNN *NNNNNNNNNNNNNNNNNNNNNNS 1 DVRDTYP DS 1 ;RESERVED FOR DISK TYPE DVRCYLS DS 2 ;DISK CYLINDERS DVRHDS DS 1 ;HEADS ; ; DEFINE THE STRUCTURE SIZE ;XNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNN!YPE DW #CY ;;CYLS DB #HD ;;HEADS LIST OFF ENDM DVR0: IF BOOT = 10H ALLDRV HDEXEC,4,60H,32,1,32,1,32,1,10H,256,4nNNNNNNNNNNNNNNNNN4NNNNNNNNNNNNNNNNNNNNNNAULT 8" FLOPPY DISK PARAMETER BLOCK ; IBM 3740 SINGLE DENSITY FORMAT ; ;#####################################################NNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNN###################################################### HDPBK: DW 128 ;SECTORS PER TRACK (LOGICAL) (SPT) DB 5 ;BLOCK SHIFT FgNNNNNNNNNNNNNNNN%NNNNNNNNNNNNNNNNNNNNNNE BOUNDARY ; IF $ AND 0FFH DS 100H - ($ AND 0FFH) ENDIF INTABL: REPT 7 ;1ST 7 ARE UNSUPPORTED LIST OFF DW ILLINT zrNNNNNNNNNNNNNNNNN+NNNNNNNNNNNNNNNNNNNNN!###################################################### ; ; DRIVE PARAMETER HEADER AREA ; 1 PER DRIVE ; ;###################NNNNNNNNNNNNNNNNN:NNNNNNNNNNNNNNNNNNNNNN---------------------- ; ; UNSUPPORTED INTERRUPT ; ;------------------------------------------------------------------------pNNNNNNNNNNNNNNNNvNNNNNNNNNNNNNNNNNNNNNN###################################### IOPB: REPT PB_SIZE LIST OFF DB 0 LIST ON ENDM ;############################NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN DVRSIZ DS 0 ENDM ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; MACRO TO DEFINE THE mNNNNNNNNNNNNNNNNNhNNNNNNNNNNNNNNNNNNNNN! ALLDRV HDEXEC,4,60H,32,1,32,1,32,1,10H,256,4 ALLDRV HDEXEC,5,60H,32,1,32,1,32,1,10H,256,4 ALLDRV HDEXEC,5,60H,32,1,32,1,3NNNNNNNNNNNNNNNNgNNNNNNNNNNNNNNNNNNNNNN####################### SD8PBK: DW 26 ;SECTORS PER TRACK DB 3 ;BLOCK SHIFT FACTOR DB 7 ;BLOCK MASK DB 0 ;NULL MASK 6NNNNNNNNNNNNNNNNN Z9NNNNNNNNNNNNNNNNNNNNN!ACTOR (BSH) DB 31 ;BLOCK MASK (BLM) DB 1 ;NULL MASK (EXM) DW 1015 ;DISK SIZE (CLUSTERS -1) (DSM) DW 1152 / 2 ;DI*NNNNNNNNNNNNNNNN&NNNNNNNNNNNNNNNNNNNNNN LIST ON ENDM ; DW ITRAP ;INT 8 IS USER INTERRUPT ENDIF ;########################################################^HNNNNNNNNNNNNNNNNN,TNNNNNNNNNNNNNNNNNNNNNN######################################################### ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@NNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN---- ILLINT: PUSH AF ;SAVE ALL 8080 REGS PUSH HL PUSH BC LD HL,ILLIM ;NOTIFY USER OF INT JR IQCONT SUBTTL INITNNNNNNNNNNNNNNNNNN GNNNNNNNNNNNNNNNNNNNNNN################################################ ; ; DISK DRIVER TABLES ; ;#################################################]NNNNNNNNNNNNNNNNLNNNNNNNNNNNNNNNNNNNNNNDRIVER TABLE RECORD ; ENTRY- #DADD= DRIVER ADDRESS ; #PD= PHYSICAL DRIVE # ; #FG= DRIVE FLAGS (IDFLGO) ; #S0= TRK 0 SPT NNNNNNNNNNNNNNNNYNNNNNNNNNNNNNNNNNNNNNN2,1,10H,256,4 ALLDRV FD8EXEC,0,0,26,0,26,0,26,0,0,77,1 ALLDRV FD8EXEC,1,0,26,0,26,0,26,0,0,77,1 ENDIF IF BOOT = 3 NNNNNNNNNNNNNNNNNVNNNNNNNNNNNNNNNNNNNNNNDW 242 ;DISK SIZE -1 DW 63 ;DIRECTORY MAX DB 11000000B ;ALLOC 0 DB 0 ;ALLOC 1 DW 16 ;CHECK SIZE DW 2 ;TRACK OFFSEENNNNNNNNNNNNNNNNN!iNNNNNNNNNNNNNNNNNNNNNNRECTORY MAX (DRM) DB 0FFH ;ALLOCATION 0 (AL0) DB 10000000B ;ALLOCATION 1 (AL1) DW 0 ;CHECK SIZE (CKS) DW 2 ;TMNNNNNNNNNNNNNNNN'îNNNNNNNNNNNNNNNNNNNNNN#################### ; ; MESSAGES ; ;############################################################################ MSGLE: Dg!NNNNNNNNNNNNNNNN-,eNNNNNNNNNNNNNNNNNNNNNN@@@@@@@@@@@ ; ; GENERATE A DISK PARAMETER TABLE MACRO ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNIALIZED DATA ;############################################################################ ; ; 3740 SECTOR TRANSLATION TABLE 4HNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN########################### STRUCT 0 DVRADD DS 2 ;START ADDRESS OF DISK DRIVER DVRFG DS 1 ;FLAGS (BIT 0= 1: INHIBIT LOGON) F_BNNNNNNNNNNNNNNNN_NNNNNNNNNNNNNNNNNNNNNN; #Z0= TRK 0 SIZE ; #S1= TRK 1 SPT ; #Z1= TRK 1 SIZE ; #SD= DATA TRKS SPT ; #ZD= DATA TRKS SIZE ; ;@@@@@@@@@@@@@@@@@@1dNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNN!ALLDRV FD8EXEC,0,0,26,0,26,0,26,0,0,77,1 ALLDRV FD8EXEC,1,0,26,0,26,0,26,0,0,77,1 ALLDRV HDEXEC,4,60H,32,1,32,1,32,1,10H,256NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNT DB 0 ;PHYSICAL RECORD SHIFT FACTOR DB 0 ;PHYSICAL RECORD MASK ; ; DEFAULT DISK PHYSICAL PARAMETERS ; DB 0 ;FLAGS#NNNNNNNNNNNNNNNNN"<[NNNNNNNNNNNNNNNNNNNNNNRACK OFFSET (OFF) ; ; ; DB 01100000B ;FLAGS 256 BPS, HARD, SSSD DB 32,1,32,1,32,1 ;32 SPT, 256 BPS DB 10H ;TYPE DW$NNNNNNNNNNNNNNNNN(ӐNNNNNNNNNNNNNNNNNNNNNNDM CR,LF,'LOAD ERROR' ; DSKEM: DB CR,LF,'Disk Error Status:' DM CR,LF,'CM DR TL TH SL SH FG AL AH AX CL CH ST S1 S2 S3',CR,L^NNNNNNNNNNNNNNN.y6NNNNNNNNNNNNNNNNNNNNN!@@@@@@@@@ ALLDPH: MACRO #D LIST ON D#D(DD)DPH: ;DRIVE PARAMETER HEADER FOR DRIVE #D(DD) DW 0 ;;SECTOR TRAN TBL (OR 0 IFNNNNNNNNNNNNNNNNN*NNNNNNNNNNNNNNNNNNNNNN ; **** CP/M SINGLE DENSITY **** ; ;############################################################################ SDTRAN: GXLANNNNNNNNNNNNNNNNNN %NNNNNNNNNNNNNNNNNNNNNNDVRPDRV DS 1 ;PHYSICAL DRIVE ; ; THE FOLLOWING MAY BE BROUGHT OFF DISK DESCRIPTOR OR FROM DEFAULT TABLES ; DVRFLG DS 1 ;DI#INNNNNNNNNNNNNNNNNlNNNNNNNNNNNNNNNNNNNNNN@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ALLDRV MACRO #DADD,#PD,#FG,#S0,#Z0,#S1,#Z1,#SD,#ZD,#DT,#CY,#HD L@NNNNNNNNNNNNNNN;NNNNNNNNNNNNNNNNNNNNNN,4 ALLDRV HDEXEC,4,60H,32,1,32,1,32,1,10H,256,4 ALLDRV HDEXEC,5,60H,32,1,32,1,32,1,10H,256,4 ALLDRV HDEXEC,5,60H,32,1,32,1sNNNNNNNNNNNNNNNNN)NNNNNNNNNNNNNNNNNNNNNN DB 26,0,26,0,26,0 ;SECTORS PER TRACK, SECTOR SIZE (128) DB 0 ;TYPE DW 77 ;CYLS DB 1 ;HEADS ;###################NNNNNNNNNNNNNNNN#jNNNNNNNNNNNNNNNNNNNNNN 256 ;CYLS DB 4 ;HEADS ;############################################################################ ; ; MODE 2 INTERNNNNNNNNNNNNNNNNN)NNNNNNNNNNNNNNNNNNNNN!F DSKEB: DM CR,LF,'Abort, Ignore, Retry, (BDOS) - ' ; IF INTCPTS ISCMSG: DM CR,LF,'ILL SYS CALL, #= ' ENDIF IF IN?rNNNNNNNNNNNNNNNN/JNNNNNNNNNNNNNNNNNNNNNN NO XLATE) DW 0 ;;SCRATCH AREA DW 0 ;;" DW 0 ;;" DW DIRBF ;;DIRECTORY BUFFER PTR DW D#D(DD)DPB ;;DRIVE PARAMETER B<9NNNNNNNNNNNNNNNNyNNNNNNNNNNNNNNNNNNNNNNTE 26,6 ; DB 1,7,13,19,25,5,11,17,23,3,9,15 ; DB 21,2,8,14,20,26,6,12,18,24,4,10 ; DB 16,22 ;#########################CNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNSK FLAGS DVR0SPT DS 1 ;TRK 0 SECTORS PER TRK DVR0SZ DS 1 ;TRK 0 SECTOR SIZE DVR1SPT DS 1 DVR1SZ DS 1 DVRDSPT DS 1 DVRDSZ D$NNNNNNNNNNNNNNNNNN9NNNNNNNNNNNNNNNNNNNNNNIST ON DW #DADD DB 0 ;;LOGON INHIBIT FLAG (LOGON ENABLED) DB #PD DB #FG DB #S0,#Z0,#S1,#Z1,#SD,#ZD DB #DT ;;DISK Tʋ NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN,32,1,10H,256,4 ENDIF LIST ON ;############################################################################ ; ; DEFTNNNNNNNNNNNNNNNN|NNNNNNNNNNNNNNNNNNNNNN######################################################### ; ; DEFAULT 8" HARD DISK PARAMETER BLOCK ; ;######################trNNNNNNNNNNNNNNNNN$NNNNNNNNNNNNNNNNNNNNNNRUPT VECTOR TABLE ; ;############################################################################ ; ; START ON AN EVEN PAGzNNNNNNNNNNNNNNNNN*NNNNNNNNNNNNNNNNNNNNNNTRPTS ITMSG DM CR,LF,'User' ILLIM DM CR,LF,'Ill.' IQMSG DM ' Int. Abort? (Y/N/I/M) - ' ENDIF ;######################IrNNNNNNNNNNNNNNNN0YJNNNNNNNNNNNNNNNNNNNNNNLK PTR IF ((DD - 1) <= NDHD) AND ((DD - 1) >= STHD) DW 0 ;;NO CHECKS ON HARD DISK ELSE DW D#D(DD)CHK ;;DRIVE DISK CTLNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN$NNNNNNʁf4υk8ԉo= ٍtCߑ{H䕲O뙹V$^,Ȣc1̦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNXNNNNNNNNNNNNNNNNNNNNN!HECKSUMS ARRAY PTR ENDIF DW D#D(DD)ALL ;;DRIVE CLUSTER ALLOCATION BIT MAP PTR LIST OFF ENDM ; ; DEFINE THE DATA ;`NNNNNNNNNNNNNNNNxNNNNNNNNNNNNNNNNNNNNNN############################# ; ; VARIABLES ; ;########################################################################### oNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN #D LIST ON IF ((DD - 1) >= STHD) AND ((DD - 1) <= NDHD) D#D(DD)ALL: DS 127 ;ALLOCATION BIT MAP FOR 8" HARD DRIVE #D(DD) NNNNNNNNNNNNNNNN=NNNNNNNNNNNNNNNNNNNNNNY CLUSTER SIZE ; 1K= 3, 2K= 4, 4K= 5, 8K= 6, 16K= 7 DPBBLM DS 1 ;BLM- BLOCK MASK ; 1K = 7, 2K= 15, 4K= 31, 8K= 63, 16K=ONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN/SEC ; 0: 128, 1: 256, 2: 512, 3: 1024 DPBPHM DS 1 ;PHM- PHYSICAL RECORD MASK BASED ON BYTES/SEC ; 0: 128, 1: 256, 3: 5aNNNNNNNNNNNNNNNNxNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN%NNNNNNNNNNNNNNNNNNNNN! FUNCTION DEFINITIONS Th M5 BIO function allo program t modif BIO privat dat withou knowin wherNNNNNNNNNNNNNNNNN+NNNNNNNNNNNNNNNNNNNNN! -1 th functio i no implemente (illegal I th erro cod i - the on o mor argument ar i error. NNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN DD DL 1 REPT NDRVS LIST OFF ALLDPH 0123456789ABCDEF DD DL DD + 1 LIST ON ENDM ; ; LAST OF INITIALIZED CODE RENNNNNNNNNNNNNNNNFNNNNNNNNNNNNNNNNNNNNNN# DTPTR: DS 2 ;DRIVE TABLE PTR LOGRQ: DS 1 ;LOG ON REQUEST REG. DVRTPTR DS 2 ;DRIVE DRIVER TABLE BASE ADDRESS PTR DVRXADR DSNNNNNNNNNNNNNNNNHNNNNNNNNNNNNNNNNNNNNN! ENDIF IF ((DD - 1) >= ST8FD) AND ((DD - 1) <= ND8FD) D#D(DD)ALL: DS 57 ;ALLOCATION BIT MAP FOR 8" DRIVE #D(DD) D#D(DD)NNNNNNNNNNNNNNNNNXNNNNNNNNNNNNNNNNNNNNNN 127 DPBEXM DS 1 ;EXM- EXTENT MASK ; DSM < 256 : 1K= 0, 2K= 1, 4K= 3, 8K= 7, 16K= 15 ; DSM > 255 : 2K= 0, 4K= 1, 8K= 3,!NNNNNNNNNNNNNNNNWNNNNNNNNNNNNNNNNNNNNNN12, 7: 1024 DPBSZ DS 0 ENDM ; ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; GENERANNNNNNNNNNNNNNNNN m NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN&ǯNNNNNNNNNNNNNNNNNNNNNN th dat i locate withi th BIOS Thes function ar accesse vi th RESTAR 28 vecto i lo memor (0028H) T,GNNNNNNNNNNNNNNNN,(dNNNNNNNNNNNNNNNNNNNNNNNo. Description  0 Return BIOS Version Number Entry- A= 0 Exit - HL= Version Number in hundredthNNNNNNNNNNNNNNNN>NNNNNNNNNNNNNNNNNNNNNNAD FROM DISK ; BIOSND EQU $ SUBTTL UNINITIALIZED DATA AREA ;#############################################################NNNNNNNNNNNNNNNNN wNNNNNNNNNNNNNNNNNNNNN! 2 ;DRIVE DRIVER EXECUTION ADDRESS ROMSAV DS 1 ;ROM SWAP SAVE OF ORIGINAL ROM ;###########################################gNNNNNNNNNNNNNNNN{NNNNNNNNNNNNNNNNNNNNNNCHK DS 32 ;DIRECTORY CHECKSUMS STORAGE (1 BYTE PER SECTOR) ENDIF LIST OFF ENDM ; ; RESERVE THE DATA SPACE ; DD iNNNNNNNNNNNNNNNNNiNNNNNNNNNNNNNNNNNNNNNN 16K= 7 DPBDSM DS 2 ;DSM- DRIVE STORAGE SIZE (IN CLUSTERS) ; INT(((#_TRACKS - OFF) * SPT * BYTES PER SECTOR) / CLUSTER SIZE)i9NNNNNNNNNNNNNNNNNfNNNNNNNNNNNNNNNNNNNNNNTE THE DPB FOR DRIVE MACRO ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ALLDPB: MACRO #D BNNNNNNNNNNNNNNNNN!^8NNNNNNNNNNNNNNNNNNNNNN M5b BIOS v3.16 FUNCTIONS INTERFACE SPECIFICAzNNNNNNNNNNNNNNNNN'NNNNNNNNNNNNNNNNNNNNNNhi vecto i initialize t Jum instructio b th BIO War Boo code Th function ar use b puttin th functio Q4NNNNNNNNNNNNNNNN-UNNNNNNNNNNNNNNNNNNNNNNs {0.00 to 655.35} 1 Return Monitor Drive Number for CP/M Drive Number Entry- A= 1 C= CP/M driv}!NNNNNNNNNNNNNNNN+NNNNNNNNNNNNNNNNNNNNN!############### ; ; THE FOLLOWING DATA MUST RESIDE IN THIS ORDER TO MATCH THE IOPB DATA ; ;################################LNNNNNNNNNNNNNNNNN $NNNNNNNNNNNNNNNNNNNNNN################################# ; ; DRIVE ALLOCATION AREAS ; ;##########################################################HNNNNNNNNNNNNNNNNNhNNNNNNNNNNNNNNNNNNNNNNDL 1 REPT NDRVS LIST OFF ALLDAL 0123456789ABCDEF DD DL DD + 1 LIST ON ENDM ;####################################NNNNNNNNNNNNNNNN:NNNNNNNNNNNNNNNNNNNNNN -1 DPBDRM DS 2 ;DRM- DIRECTORY SIZE -1 DPBAL0 DS 2 ;AL0,1- DIRECTORY ALLOCATION ; 1 MSB PER DIRECTORY CLUSTER ALLOCATED -NNNNNNNNNNNNNNNNN-NNNNNNNNNNNNNNNNNNNNNN LIST ON D#D(DD)DPB: DS DPBSZ ;ALLOCATION FOR DRIVE #D(DD) LIST OFF ENDM ; ; RESERVE THE DATA SPACE ; DD DL 1 REPTNNNNNNNNNNNNNNNNN" kNNNNNNNNNNNNNNNNNNNNNNTION May 1,1992 REV. NC NNNNNNNNNNNNNNNNN(NNNNNNNNNNNNNNNNNNNNNNnumbe i th A-register an othe require argument i th specifie registers an executin eithe RESTARԠ 28 in4aNNNNNNNNNNNNNNNN.NNNNNNNNNNNNNNNNNNNNNNNe number {0..15} Exit - A= {0..254}: Monitor drive number -2: Drive error BC,DE,HL7NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!############################################# BTDRV: DS 1 ;DRIVE # BTTRK DS 2 ;TRACK # BTSEC DS 2 ;SECTOR # BTFLG DS 1 ;RESENNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN################## ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; MACRO TO DEFINE THE DR7 $NNNNNNNNNNNNNNNNN[NNNNNNNNNNNNNNNNNNNNNN######################################## ; ; RESERVE DRIVE PARAMETER BLOCKS ; ;###########################################/NNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNDPBCKS DS 2 ;CKS- # DIRECTORY SECTORS CHECKED ; (DRM +1) / 4 DPBOFF DS 2 ;OFF- # RESERVED TRACKS (USUALLY 2) ; ; ADDITI INNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN NDRVS LIST OFF ALLDPB 0123456789ABCDEF DD DL DD + 1 LIST ON ENDM IF (($ - 8000H) > 07800H) OR ($ < 8000H) CONNNNNNNNNNNNNNNN#8ZNNNNNNNNNNNNNNNNNNNNNN GRH Enterprises 1129 Stonylake Ct Sunnyvale, CA .PA .JHNNNNNNNNNNNNNNNNN)בNNNNNNNNNNNNNNNNNNNNNNstructio o Callin (executing th locatio a 0028H Al function retur valu i th A-registe an flags I th ZNNNNNNNNNNNNNNNNN/}7NNNNNNNNNNNNNNNNNNNNNN= ? 2 Disable Logon Entry- A= 2 C= CP/M drive number {0..15} Exit - A= 0: Ok, /0: Ille`NNNNNNNNNNNNNNNNINNNNNNNNNNNNNNNNNNNNNNRVED FOR FLAGS BTDMA DS 2 ;DMA ADDRESS BTDMAX DS 1 ;DMA EXTENDED ADDRESS ;###############################################Ջ'NNNNNNNNNNNNNNNNN .NNNNNNNNNNNNNNNNNNNNNNIVE ALLOCATION & CHECKSUMS AREA ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ALLDAL: MACRONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN################################# STRUCT 0 DPBSPT DS 2 ;SPT- SECTORS/TRACK DPBBSH DS 1 ;BSH- BLOCK SHIFT FACTOR DETERMINED B;NNNNNNNNNNNNNNNN5NNNNNNNNNNNNNNNNNNNNNNONAL CP/M 3.0 DATA (ALSO COULD BE USED BY CP/M 2.2 DEBLOCKING) ; DPBPSH DS 1 ;PSH- PHYSICAL RECORD SHIFT FACTOR BASED ON BYTES$NNNNNNNNNNNNNNNNKNNNNNNNNNNNNNNNNNNNNNNNMSG **** BIOS TOO BIG, USE MOVCPM & RE-ADJUST! **** ENDIF END ÖNNNNNNNNNNNNNNNNN$NNNNNNNNNNNNNNNNNNNNNNHE REVISION HISTORY REV DATE COMMENT NC 5-1-92 Initial release. .PA .HE k!NNNNNNNNNNNNNNNN*NNNNNNNNNNNNNNNNNNNNN!er fla i set the n erro ha occured i cleared the th A- registe contain a erro code I th erro cod iINNNNNNNNNNNNNNNNN0nzNNNNNNNNNNNNNNNNNNNNNNgal drive BC,DE,HL= ? 3 Enable Logon Entry- A= 3 C= CP/M drive number {0..15} мNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNnNNNNNNNN΁j7҅m; ؉tBݍyH味N핻W%]+Ǟc1͢h6ҦNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN ZNNNNNNNNNNNNNNNNNNNNNN Exit - A= 0: Ok, /0: Illegal drive BC,DE,HL= ? 4 Set Disk Format Entry- A= 4 ?HNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNFile Control Block */ struct fcb *srch_fst(), *srch_nxt(), f_cb, *fcb_ptr; /* farcall registers */ struct regs NNNNNNNNNNNNNNNNN \7NNNNNNNNNNNNNNNNNNNNNN { puts("\nInsufficient Memory...Aborting!"); exit(1); } (BYTE *) fmt_buf = ((BYTE *) fov_file) + 5976)NNNNNNNNNNNNNNNNN |KNNNNNNNNNNNNNNNNNNNNNNNO, CA ; ;**************************************************************************** ; ; CONFIGURATION: ; ; CPM ; DRIVENNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN20H ; A JADE 5" FLOPPY PHYSICAL DRIVE 0 ; B JADE 5" FLOPPY PHYSICAL DRIVE 1 ; C SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE INNNNNNNNNNNNNNNNN 9&NNNNNNNNNNNNNNNNNNNNNN system down to 60k. ; 3.01 26 JUN 88 GRH ; Remove 5" floppy support. Implement in CP/M-86 BIOS. ; Change single function to4prNNNNNNNNNNNNNNNN %xNNNNNNNNNNNNNNNNNNNNNNCP/M 3.0 DPB structure in preparation for deblocking. ; 3.05 11-3-88 GRH ; Change included data to update IOPB.PBSTAT to newNNNNNNNNNNNNNNNNN +wNNNNNNNNNNNNNNNNNNNNNNrupted PB_FLG. ; 3.08 2-22-91 GRH ; Remove references to THIS_BNK & use monitor function #7 instead. ; Add track-head shift6!NNNNNNNNNNNNNNNN L NNNNNNNNNNNNNNNNNNNNNN C= CP/M drive number {0..15} E:HL= Disk descriptor sector image ptr Exit - A= 0: Ok, /0: Illegal 'mNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN cpui, cpuo; /**************************************************************************** main program *****NNNNNNNNNNNNNNNN  dNNNNNNNNNNNNNNNNNNNNNN; /* Allocate format overlay buffer */ /* Top of command loop */ while (TRUE) { /**** Display Options */ printfNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN USAGE IF BOOT = 10H ;HARD DISK BOOT CONFIG. ; A SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 0 ; B SIDE 2 & 3 OF HARD DISKv NNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN0 ; D SIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 0 ; E SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 1 ; F SIDE 2 & 3 OF HARD DISK;CrNNNNNNNNNNNNNNNNN ,NNNNNNNNNNNNNNNNNNNNN! return drive table ptr into a BIOS function ; call using restart instruction. ; Change LOGON to specify the ID sector & traM NNNNNNNNNNNNNNNNN &+NNNNNNNNNNNNNNNNNNNNNN configuration. ; 3.06 1-28-89 GRH ; Revised primitive calling procedures to use the monitor rom function ; rather than swGBNNNNNNNNNNNNNNNN ,iNNNNNNNNNNNNNNNNNNNNNN factor to DPBs for future use. ; 3.09 5-15-91 GRH ; Change 8" floppy side select to track bit 0. Move calculation from ; NNNNNNNNNNNNNNNN 8NNNNNNNNNNNNNNNNNNNNNNdrive BC,DE,HL= ? )MNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN***********************************************************************/ main () { /* Display signon */ printf(signon); $NNNNNNNNNNNNNNNNN :UNNNNNNNNNNNNNNNNNNNNNN("\n\n\ Command Options:\n\ 0 Display BIOS Version\n\ 1 Display monitor drive number assigned to CP/M drive\n\ 2 DisabįNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN PHYSICAL DRIVE 0 ; C SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 1 ; D SIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 1 ; E JADE 8"NNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN PHYSICAL DRIVE 1 ; G JADE 8" FLOPPY PHYSICAL DRIVE 0 ; H JADE 8" FLOPPY PHYSICAL DRIVE 1 ENDIF ; ;*****************u9NNNNNNNNNNNNNNNNN !NNNNNNNNNNNNNNNNNNNNNNck. At same time, fix bug ; which did not specify the logon track. ; 3.02 7 JUL 88 GRH ; Add '?' to include file names. _^NNNNNNNNNNNNNNNNN 'NNNNNNNNNNNNNNNNNNNNNNapping Roms itself. ; 3.07 11-25-90 GRH ; Modify for Ver. 1.22 Monitor. ; Fix bug in 8" Hard Disk table which benignly (at !NNNNNNNNNNNNNNNN -ZNNNNNNNNNNNNNNNNNNNNNNDCM8 to CBIOS. ; Remove IOPB ptr passing in IX redundancy. ; Change DPB track-head shift factor to Sector Offset like track ;lDNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN } *fmt_buf, /* Ptr to the structure */ *fov_p; /* Format overlay file data ptrs */ struct { BYTE fil_name[11]; bnNNNNNNNNNNNNNNNNNN ŠNNNNNNNNNNNNNNNNNNNNNN /* Initialize data */ cpui.AF = (MF_GBNK) << 8; /* get current bank # */ farcall( (WORD) MR_FUN, 0, &cpui, &cpui); NNNNNNNNNNNNNNNNNN )NNNNNNNNNNNNNNNNNNNNNNle dynamic format selection (LOGON)\n\ 3 Enable dynamic format selection\n\ 4 Set disk format\n\ \n\ ^C Exit to DOS\n\ NNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN FLOPPY PHYSICAL DRIVE 0 ; F JADE 8" FLOPPY PHYSICAL DRIVE 1 ENDIF IF BOOT = 3 ; A JADE 8" FLOPPY PHYSICAL DRIVE 0NNNNNNNNNNNNNNNNN luNNNNNNNNNNNNNNNNNNNNNN*********************************************************** ; ; REVISION HISTORY: ; ; 3.00 - 26 JAN 87 GRH ; ImplementeBNNNNNNNNNNNNNNNN "JNNNNNNNNNNNNNNNNNNNNNN; Change hard disk system tracks directory reference to new format. ; Correct bug in drivers which caused retry to fail. (sectorNNNNNNNNNNNNNNNNN ($NNNNNNNNNNNNNNNNNNNNNNcurrent level) ; caused the drive table to have bad data (default table was missing ; the 2 deblocking extension bytes). ; zNNNNNNNNNNNNNNNN .NNNNNNNNNNNNNNNNNNNNNN offset. Disk partitioning will add this value to sector word. It ; will be stored in the ID sector data to be dynamic. ; 3.HNNNNNNNNNNNNNNNNN ՞NNNNNNNNNNNNNNNNNNNNNN/* FCB filename */ char fil_txt[]; /* File text description */ } *fov_file, /* Base ptr to array */ *fov_ptr[64]; /* PojNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNN! this_bnk = cpui.AF >> 8; /* drive = -1; Assume no controller */ cmd_blk.pb_sts = -1; /* Force error if not access_NNNNNNNNNNNNNNNNNN )NNNNNNNNNNNNNNNNNNNNN! TITLE CUSTOMIZED BIOS FOR M5B LIST NOCOND BOOT EQU 10H ;10H: HARD DISK, 3: 8" FLOPPY, 20H: 5" FLOPPY ;********************R[NNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN ; B JADE 8" FLOPPY PHYSICAL DRIVE 1 ; C SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 0 ; D SIDE 2 & 3 OF HARD DISK PHYSICAL PrNNNNNNNNNNNNNNNN _DNNNNNNNNNNNNNNNNNNNNNNd new common IOPB code & Jade floppy firmware support. ; Implemented disk drive driver tables and new function to return ; a 8NNNNNNNNNNNNNNNN #yNNNNNNNNNNNNNNNNNNNNNNr remained ; corrupted) ; Stubbed out new Clock routines for present. ; 3.03 31 JUL 88 GRH ; Unstub Clock routines. ; 3NNNNNNNNNNNNNNNNN )NNNNNNNNNNNNNNNNNNNNN!Implement data xfer inhibit schemes with PB_FLG & PB_BCNT. ; Add pick-up of THIS_BNK data in all iopb cases. ; Remove clock buNNNNNNNNNNNNNNNNN / ڍvCߑ{J敳P왻X&^,Ƣa/˦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN .jNNNNNNNNNNNNNNNNNNNNNNd r/ls & move to 59k system. ; 9-19-91 GRH Fix bug which destroyed my root directories! ; BUF_RD was writing. ; Patch HNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN================== ; ; ASSEMBLY PARAMETERS ; ;============================================================================ NNNNNNNNNNNNNNNN  kNNNNNNNNNNNNNNNNNNNNNN BDIR.DEF *INCLUDE B:M5ZF2.DEF LIST ON ;=========================================================================3RNNNNNNNNNNNNNNNNN K{NNNNNNNNNNNNNNNNNNNNN!TACK FRAME PTR DK_BDRV EQU 0041H ;BOOT DRIVE # FROM PROM DEFBFR EQU PAGE0 + 80H ;DEFAULT BUFFER ; ; BIOS FUNCTION CALL RE=ArNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNN!IVE OF HARD DISK NDHD EQU 5 ;LAST LOGICAL DRIVE OF HARD DISK ST8FD EQU 0 ;START LOGICAL DRIVE OF 8" FLOPPY ND8FD EQU 1 ;LANNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; GENERATE THE TRANSLATION TABLE MACRO ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@'rNNNNNNNNNNNNNNNN %HNNNNNNNNNNNNNNNNNNNNNNS MACRO #VERS DD DL #VERS IF DD > 9999 DB (DD / 10000) + '0' DD DL DD % 10000 ENDIF IF DD > 999 DB (DD / 1000)QNNNNNNNNNNNNNNNNN +GNNNNNNNNNNNNNNNNNNNNNN ;SET SECTOR # JP SETDMA ;SET TRANSFER ADDR JP DISKRD ;PERFORM DISK READ JP DISKWR ;PERFORM DISK WRITE JP LISTST ;R(NNNNNNNNNNNNNNNNN {9NNNNNNNNNNNNNNNNNNNNNNproblems with partitioning until 20MB drive installed. ; Fix TPA corruption by LOGON problem by using ROMBNK sector buffer fo˒NNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNN!; FALSE EQU 0 TRUE EQU NOT FALSE ;============================================================================ ; ; CONDNNNNNNNNNNNNNNNN >TNNNNNNNNNNNNNNNNNNNNNN=== ; ; DISK OPERATING SYSTEM ADDRESSES ; ;============================================================================ ;=%NNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNSTART VECTOR ; BFUNRST EQU 28H BFUNRSV EQU PAGE0 + BFUNRST BFUNRSI EQU 0C7H + BFUNRST ;================================#rNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNST LOGICAL DRIVE OF 8" FLOPPY ENDIF ;============================================================================ ; ;I'NNNNNNNNNNNNNNNNN  NNNNNNNNNNNNNNNNNNNNNN@@@@@@@@@@@@@@@@@@@@@@ ; GXLATE MACRO #SECTORS, #SKEW LIST OFF NXTSEC DL 1 ;;START WITH SECTOR 1 LOWEST DL 1 ;; REPT #SNNNNNNNNNNNNNNNN &NNNNNNNNNNNNNNNNNNNNNN + '0' DD DL DD % 1000 ENDIF DB (DD / 100) + '0' DB '.' DB ((DD % 100) / 10) + '0' DB (DD % 10) + '0' ENDM ^NNNNNNNNNNNNNNNN ,^NNNNNNNNNNNNNNNNNNNNN!ETURN LIST STATUS JP SECTRN ;TRANSLATE SECTOR JP BIOFUNC ;EXECUTE FUNCTION CALL ;####################################\NNNNNNNNNNNNNNNN HNNNNNNNNNNNNNNNNNNNNNNr ; ID sector read. ; 9-20-91 GRH Fold in redlines. ; 10-21-91 GRH Fix bugs ; 10-22-91 GRH Fix bugs ; 10-23-91 NNNNNNNNNNNNNNNNN  NNNNNNNNNNNNNNNNNNNNNNITIONAL ASSEMBLY FLAGS ; ;============================================================================ ; INTCPTS EQU TRUE ;NNNNNNNNNNNNNNNNN  eNNNNNNNNNNNNNNNNNNNNNN SYS EQU 2 ;CP/M VERSION {2,3} ; NKSYS: EQU 59 ;SYSTEM SIZE IN K BYTES KBYTE: EQU 1024 CPMSZ: EQU KBYTE * NKSYS CPMBS: EBNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNN!============================================ ; ; OTHER DECLARATIONS ; ;=====================================================%NNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN BDOS CONSTANTS ON ENTRY TO WRITE ; ;============================================================================ ; W"gNNNNNNNNNNNNNNNNNN !(NNNNNNNNNNNNNNNNNNNNNNSECTORS LIST ON DB NXTSEC LIST OFF NXTSEC DL NXTSEC + #SKEW ;ADD SKEW FACTOR ;; IF NXTSEC > #SECTORS ;CHECK FOR OVERoNNNNNNNNNNNNNNNNN '*NNNNNNNNNNNNNNNNNNNNNNSUBTTL BIOS CODE ORG BIOS ;---------------------------------------------------------------------------- ; ; BIOS JUMP VEC"NNNNNNNNNNNNNNNN -mNNNNNNNNNNNNNNNNNNNNNN######################################## ; ; THE FOLLOWING BOOT DATA MUST RESIDE AS DEFINED RIGHT BEFORE THE COLD ; INIT ROUTMNNNNNNNNNNNNNNNNNN џNNNNNNNNNNNNNNNNNNNNNN GRH Fix bugs ; 3.13 1-15-92 GRH ; Change hard disk translation to Monitor disks 4 & 5 from 6 & 7. ; ; 3.14 2-9-92 GRHBNNNNNNNNNNNNNNNN  NNNNNNNNNNNNNNNNNNNNNNENABLE SYSTEM CALL INTERCEPT WHISTLE ;============================================================================ ; ; IN\rNNNNNNNNNNNNNNNNN (NNNNNNNNNNNNNNNNNNNNNNQU CPMSZ - (20 * KBYTE) ;CP/M BIAS VALUE CCP: EQU CPMBS + 3400H ;ADDR OF CCP BDOS: EQU CPMBS + 3C00H ;ADDRESS OF BDOS BIOSdBNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNN!======================= ; SECSZ: EQU 128 NDRVS: EQU 6 IF BOOT = 10H ; ; 8" HARD DISK BOOT DATA ; STHD EQU 0 ;START'NNNNNNNNNNNNNNNNN [ENNNNNNNNNNNNNNNNNNNNNNRALL EQU 0 ;WRITE TO ALLOCATED WRDIR EQU 1 ;WRITE TO DIRECTORY WRUAL EQU 2 ;WRITE TO UNALLOCATED ;=======================NNNNNNNNNNNNNNNN "}NNNNNNNNNNNNNNNNNNNNN!FLOW NXTSEC DL NXTSEC - #SECTORS ;; IF NXTSEC <= LOWEST ;CHECK FOR REPEAT NXTSEC DL LOWEST + 1 LOWEST DL NXTSEC ENDINNNNNNNNNNNNNNNNN (NNNNNNNNNNNNNNNNNNNNNNTOR TABLE ; ;---------------------------------------------------------------------------- ; JP INIT1 ;COLD START ENTRY JNNNNNNNNNNNNNNNNN .8NNNNNNNNNNNNNNNNNNNNNNINE START AND MUST BE IN THE 1ST SECTOR. THESE 2 WORDS ARE ; REFERENCED BY THE BOOT LOADER CODE IN ORDER TO DETERMINE THE LOAD փNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN ; Add additional floppy disk allocation size for 1.22Mb disks. ; VERSN EQU 314 ; ;****************************************B$NNNNNNNNNNNNNNNNN  NNNNNNNNNNNNNNNNNNNNNNCLUDE COMIOPB3.DEF ; INCLUDE DISKS3.DEF ; INCLUDE BDIR.DEF ; INCLUDE M5ZF2.DEF ; ;========================)NNNNNNNNNNNNNNNNN -NNNNNNNNNNNNNNNNNNNNNN: EQU CPMBS + 4A00H ;ADDRESS OF BDOS BIOSR: EQU 1000H - BIOS ; ; PAGE 0 LOCATIONS ; PAGE0: EQU 0 ;START OF CP/M RAM DE@~NNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNN! LOGICAL DRIVE OF HARD DISK NDHD EQU 3 ;LAST LOGICAL DRIVE OF HARD DISK ST8FD EQU 4 ;START LOGICAL DRIVE OF 8" FLOPPY ND8FDrNNNNNNNNNNNNNNNN htNNNNNNNNNNNNNNNNNNNNN!===================================================== ; ; ASCII CHARS ; ;===================================================V-NNNNNNNNNNNNNNNN #NNNNNNNNNNNNNNNNNNNNNN!F ENDIF ;; ENDM LIST ON ENDM ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ;s$NNNNNNNNNNNNNNNNN )%NNNNNNNNNNNNNNNNNNNNNNP WARM ;RELOAD CCP/BDOS JP CNSCK ;GET CONSOLE STATUS JP CI ;CONSOLE INPUT JP COC ;CONSOLE OUTPUT JP LO ;PRINTER OUT1{NNNNNNNNNNNNNNNNN / NNNNNNNNNNNNNNNNNNNNNNADDRESS ; AND LENGTH OF THE BIOS. ; ;############################################################################ ; DB 0 fgNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN************************************ SUBTTL SYSTEM DECLARATIONS ;==========================================================SBNNNNNNNNNNNNNNNN  X6NNNNNNNNNNNNNNNNNNNNNN==================================================== ; LIST OFF *INCLUDE COMIOPB3.DEF *INCLUDE DISKS3.DEF *INCLUDE NNNNNNNNNNNNNNNN xJNNNNNNNNNNNNNNNNNNNNNNFDRV: EQU PAGE0 + 4 ;DEFAULT DRIVE PARAM ADDR BDOSJV EQU PAGE0 + 5 ;BDOS SYSTEM CALL ENTRY THIS_STK EQU PAGE0 + 1CH ;CURRENT S-NNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN EQU 5 ;LAST LOGICAL DRIVE OF 8" FLOPPY ENDIF IF BOOT = 3 ; ; 8" FLOPPY BOOT DATA ; STHD EQU 2 ;START LOGICAL DRBNNNNNNNNNNNNNNNN ='NNNNNNNNNNNNNNNNNNNNNN========================= ; LF: EQU 0AH CR: EQU 0DH CTRLZ: EQU 1AH ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@kNNNNNNNNNNNNNNNNN $yNNNNNNNNNNNNNNNNNNNNNN INITIALIZE VERSION TEXT IN RAM MACRO ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; PVERENNNNNNNNNNNNNNNN *vNNNNNNNNNNNNNNNNNNNNNNPUT JP PUNCH JP READER JP HOME ;HOME SELECTED DRIVE JP SELDSK ;SELECT DISK DRIVE JP SETTRK ;SET TRACK # JP SETSEC (DIRBF + SECSZ) CONMSG **** WARNING! COLD INIT CODE BIGGER THAN DIR BUFFER **** ELSE DS DIRBF+SECSZ-$ ;FI7!BNNNNNNNNNNNNNNNN M1NNNNNNNNNNNNNNNNNNNNN! LD E,0 CALL SELDSK LD A,L ;IF ERROR THEN ABORT OR A,H JR Z,WEROR ; ; READ BOOT DIRECTORY ; LD BC,DEFBFR ;SEsNNNNNNNNNNNNNNNNN n>NNNNNNNNNNNNNNNNNNNNNN128 ;DMA += SECTOR SIZE LD HL,(CPM_DMA) ADD HL,DE LD (CPM_DMA),HL ; ; IF NOT INTO BDOS THEN READ NEXT SECTOR ; LD NNNNNNNNNNNNNNNNNN !`NNNNNNNNNNNNNNNNNNNNNN TITLE CUSTOMIZED BIOS FOR M5B LIST NOCOND BOOT EQU 10H ;10H: HARD DISK, 3: 8" FLOPPY, 20H: 5" FLOPPY ;********************R[NNNNNNNNNNNNNNNNN '.NNNNNNNNNNNNNNNNNNNNN! ; B JADE 8" FLOPPY PHYSICAL DRIVE 1 ; C SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 0 ; D SIDE 2 & 3 OF HARD DISK PHYSICAL PNNNNNNNNNNNNNNNN - NNNNNNNNNNNNNNNNNNNNNNd new common IOPB code & Jade floppy firmware support. ; Implemented disk drive driver tables and new function to return ; a 8NNNNNNNNNNNNNNNN }sNNNNNNNNNNNNNNNNNNNNNNDIRBF: EQU $ ;BUFFER BEGINNING ;---------------------------------------------------------------------------- ; ; INIT3NNNNNNNNNNNNNNNN ^|NNNNNNNNNNNNNNNNNNNNNNNT CALL XMROM ; ; IF CLOCK PRESENT THEN TURN ON CLOCK DRIVE ; OR A,A LD A,38H ;COND. JR (ON) JR Z,CLKON ; ; ELCNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNN!LL OUT DIRECTORY BUFFER TO 1 SECTOR SIZE ENDIF ;---------------------------------------------------------- ; ; WARM R\BNNNNNNNNNNNNNNNN bNNNNNNNNNNNNNNNNNNNNN!T XFER ADDRESS (USE DEFAULT BUFFER) CALL SETDMA ; LD BC,BD_SEC ;SET DIRECTORY SECTOR CALL SETSEC ; LD BC,0 ;SET TRACKm|HNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNN!DE,BDOS XOR A,A SBC HL,DE JR C,WREAD ; ; ELSE IF AT BEGINNING OF BDOS THEN SET UP NEW TRACK & SECTOR ; JR Z,RDBDOS UNNNNNNNNNNNNNNNN "3NNNNNNNNNNNNNNNNNNNNNN******************************************************** ; ; CUSTOMIZED BIOS FOR M5B ; (c) 1981 GRH Electronics, CUPERTI5NNNNNNNNNNNNNNNNN (>NNNNNNNNNNNNNNNNNNNNNNDRIVE 0 ; E SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 1 ; F SIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 1 ENDIF IF BOOT = o\NNNNNNNNNNNNNNNN .^NNNNNNNNNNNNNNNNNNNNN!ptr to a drive table. ; Removed init of IOBYTE. ; Implemented 5" floppy driver. ; Implemented use of ROM primitives. ; MovedGNNNNNNNNNNNNNNNNN NBNNNNNNNNNNNNNNNNNNNNNN - COLD START ENTRY FROM BOOT MUST SET ALL BIOS PARAMS ; ;-------------------------------------------------------------------QINNNNNNNNNNNNNNNNN mMNNNNNNNNNNNNNNNNNNNNN!SE TURN OFF CLOCK DRIVE ; LD A,18H ;UNCOND. JR (OFF) (CAUSES JUMP TO ILLEGAL) ; CLKON: LD (INHCLK),A ; ; BOOT CCP & BDk@NNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNN!EBOOT ENTRY LOADS CCP,BDOS FROM DISK & ; SETS UP VARIABLES ; ;---------------------------------------------------------- ; ANNNNNNNNNNNNNNNNN +SNNNNNNNNNNNNNNNNNNNNNN TO 0 CALL SETTRK ; CALL DISKRD JR NZ,WEROR ; ; CHECK FOR VALID BOOT DIRECTORY ; LD A,(DEFBFR) CP A,86H JR C,W} NNNNNNNNNNNNNNNN ĘNNNNNNNNNNNNNNNNNNNNNN ; ; ELSE IF NOT AT BIOS THEN READ NEXT SECTOR ; LD DE,BIOS - BDOS SBC HL,DE JP C,WREAD ; ; ELSE DONE READING SYSTrNNNNNNNNNNNNNNNN #NNNNNNNNNNNNNNNNNNNNNNNO, CA ; ;**************************************************************************** ; ; CONFIGURATION: ; ; CPM ; DRIVENNNNNNNNNNNNNNNNN ) NNNNNNNNNNNNNNNNNNNNNN20H ; A JADE 5" FLOPPY PHYSICAL DRIVE 0 ; B JADE 5" FLOPPY PHYSICAL DRIVE 1 ; C SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE NNNNNNNNNNNNNNNNN /oNNNNNNNNNNNNNNNNNNNNNN system down to 60k. ; 3.01 26 JUN 88 GRH ; Remove 5" floppy support. Implement in CP/M-86 BIOS. ; Change single function to4pNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNN!--------- ; INIT: ; ; SET TEMPORARY STACK ; DI LD SP,DEFBFR ;USE PAGE 0 FOR STACK LD (THIS_STK),SP EI ; ; INI@z9NNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNOS ; JR WARM ;############################################################################ ; ; SIGN-ON MESSAGE ; ;###BNNNNNNNNNNNNNNNN ԦNNNNNNNNNNNNNNNNNNNNNNWARM: ; ; SET TEMPORARY STACK ; DI LD SP,DEFBFR LD (THIS_STK),SP EI ; ; INIT OUR STUFF ; XOR A,A LD (BUF_A tNNNNNNNNNNNNNNNNN ;mNNNNNNNNNNNNNNNNNNNNNNEROR ; ; SET UP TO LOAD CCP/BDOS ; LD HL,(DEFBFR + BD_SBDSS) ;PREFETCH BDOS TRK/SECTOR PUSH HL ; LD HL,(DEFBFR + BD_BNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNN!EM ; JR WZRPG ; ; ; ELSE SET UP & READ BDOS ; RDBDOS: POP HL ;RESTORE BDOS TRK/SECTOR FROM DIRECTORY LD C,L LD B,?NNNNNNNNNNNNNNNNN ${NNNNNNNNNNNNNNNNNNNNN! USAGE IF BOOT = 10H ;HARD DISK BOOT CONFIG. ; A SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 0 ; B SIDE 2 & 3 OF HARD DISKvNNNNNNNNNNNNNNNNN *XNNNNNNNNNNNNNNNNNNNNNN0 ; D SIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 0 ; E SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 1 ; F SIDE 2 & 3 OF HARD DISK;C$NNNNNNNNNNNNNNNNN 0"NNNNNNNNNNNNNNNNNNNNNN return drive table ptr into a BIOS function ; call using restart instruction. ; Change LOGON to specify the ID sector & traM NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNnNNNNNˁg5хm;։r? ۍxE⑰~L畴OꙸU"𝾞[)â^-ɦNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNck. At same time, fix bug ; which did not specify the logon track. ; 3.02 7 JUL 88 GRH ; Add '?' to include file names. _^NNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNapping Roms itself. ; 3.07 11-25-90 GRH ; Modify for Ver. 1.22 Monitor. ; Fix bug in 8" Hard Disk table which benignly (at !rNNNNNNNNNNNNNNNN  NNNNNNNNNNNNNNNNNNNNNNDCM8 to CBIOS. ; Remove IOPB ptr passing in IX redundancy. ; Change DPB track-head shift factor to Sector Offset like track ;lDNNNNNNNNNNNNNNNN ЧNNNNNNNNNNNNNNNNNNNNNNbuffer for ; ID sector read. ; 9-20-91 GRH Fold in redlines. ; 10-21-91 GRH Fix bugs ; 10-22-91 GRH Fix bugs ; (+NNNNNNNNNNNNNNNN ?lNNNNNNNNNNNNNNNNNNNNNN============================ ; INTCPTS EQU TRUE ;ENABLE SYSTEM CALL INTERCEPT WHISTLE ;=================================HNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN KBYTE: EQU 1024 CPMSZ: EQU KBYTE * NKSYS CPMBS: EQU CPMSZ - (20 * KBYTE) ;CP/M BIAS VALUE CCP: EQU CPMBS + 3400H ;ADDR OF {c NNNNNNNNNNNNNNNN %NNNNNNNNNNNNNNNNNNNNNN=========================================================================== ; SECSZ: EQU 128 NDRVS: EQU 6 IF BOOT = 10H NNNNNNNNNNNNNNNNN +\NNNNNNNNNNNNNNNNNNNNNN============================================== ; WRALL EQU 0 ;WRITE TO ALLOCATED WRDIR EQU 1 ;WRITE TO DIRECTORY WRUAL EQU 2NNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN; Change hard disk system tracks directory reference to new format. ; Correct bug in drivers which caused retry to fail. (sectoNNNNNNNNNNNNNNNNN .NNNNNNNNNNNNNNNNNNNNN!current level) ; caused the drive table to have bad data (default table was missing ; the 2 deblocking extension bytes). ; zNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN offset. Disk partitioning will add this value to sector word. It ; will be stored in the ID sector data to be dynamic. ; ; NNNNNNNNNNNNNNNN I0NNNNNNNNNNNNNNNNNNNNN!10-23-91 GRH Fix bugs ; ; 3.13 1-15-92 GRH ; Change hard disk translation to Monitor disks 4 & 5 from 6 & 7. ; VERSN E}NNNNNNNNNNNNNNNN j?NNNNNNNNNNNNNNNNNNNNNN=========================================== ; ; INCLUDE COMIOPB3.DEF ; INCLUDE DISKS3.DEF ; INCLUDE BDIR.DEF ; PNNNNNNNNNNNNNNNNN  aNNNNNNNNNNNNNNNNNNNNNNCCP BDOS: EQU CPMBS + 3C00H ;ADDRESS OF BDOS BIOS: EQU CPMBS + 4A00H ;ADDRESS OF BDOS BIOSR: EQU 1000H - BIOS ; ; PAGE !NNNNNNNNNNNNNNNN &*NNNNNNNNNNNNNNNNNNNNNN; ; 8" HARD DISK BOOT DATA ; STHD EQU 0 ;START LOGICAL DRIVE OF HARD DISK NDHD EQU 3 ;LAST LOGICAL DRIVE OF HARD DISK SBNNNNNNNNNNNNNNNN , NNNNNNNNNNNNNNNNNNNNN! ;WRITE TO UNALLOCATED ;============================================================================ ; ; ASCII CHARS ; KNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNr remained ; corrupted) ; Stubbed out new Clock routines for present. ; 3.03 31 JUL 88 GRH ; Unstub Clock routines. ; 3NNNNNNNNNNNNNNNNN  <NNNNNNNNNNNNNNNNNNNNN!Implement data xfer inhibit schemes with PB_FLG & PB_BCNT. ; Add pick-up of THIS_BNK data in all iopb cases. ; Remove clock bu$NNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN 3.10 5-20-91 GRH ; Change LOGON to attempt to recover from old disks better, using ; DCM8301 version controller firmware. yNNNNNNNNNNNNNNNN zNNNNNNNNNNNNNNNNNNNNNNQU 313 ; ;**************************************************************************** SUBTTL SYSTEM DECLARATIONS ;======ܟNNNNNNNNNNNNNNNNNN YNNNNNNNNNNNNNNNNNNNNNNINCLUDE M5ZF2.DEF ; ;============================================================================ ; LIST OFF *INCLUDENNNNNNNNNNNNNNNNN !PNNNNNNNNNNNNNNNNNNNNNN0 LOCATIONS ; PAGE0: EQU 0 ;START OF CP/M RAM DEFDRV: EQU PAGE0 + 4 ;DEFAULT DRIVE PARAM ADDR BDOSJV EQU PAGE0 + 5 ;BDOS SYNNNNNNNNNNNNNNNNN 'NNNNNNNNNNNNNNNNNNNNN!T8FD EQU 4 ;START LOGICAL DRIVE OF 8" FLOPPY ND8FD EQU 5 ;LAST LOGICAL DRIVE OF 8" FLOPPY ENDIF IF BOOT = 3 ; ; 8\NNNNNNNNNNNNNNNN -=NNNNNNNNNNNNNNNNNNNNNN;============================================================================ ; LF: EQU 0AH CR: EQU 0DH CTRLZ: EQU 1AH NNNNNNNNNNNNNNNNN JCNNNNNNNNNNNNNNNNNNNNNN.04 6 AUG 88 GRH ; Remove floppy side select from BIOS & move to controller. ; Implement new ID sector format. ; Implement BNNNNNNNNNNNNNNNN  iLNNNNNNNNNNNNNNNNNNNNNNffer set/read system calls. ; 12-5-90 GRH ; Remove IX IOPB ptr passing to disk drivers. ; 1-13-91 GRH ; Fix bug which cor| NNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN ; ; 3.11 9-2-91 GRH ; Add redlines & change for M5ZMON v.2.00. ; ; 3.12 9-11-91 GRH ; Add deblocking code. ; 9-17-91 |NNNNNNNNNNNNNNNN /RNNNNNNNNNNNNNNNNNNNNN!====================================================================== ; ; ASSEMBLY PARAMETERS ; ;==========================NNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNN! COMIOPB3.DEF *INCLUDE DISKS3.DEF *INCLUDE BDIR.DEF *INCLUDE M5ZF2.DEF LIST ON ;=====================NNNNNNNNNNNNNNNN "NNNNNNNNNNNNNNNNNNNNN!STEM CALL ENTRY THIS_STK EQU PAGE0 + 1CH ;CURRENT STACK FRAME PTR DK_BDRV EQU 0041H ;BOOT DRIVE # FROM PROM DEFBFR EQU PAGE0mqNNNNNNNNNNNNNNNNN ( NNNNNNNNNNNNNNNNNNNNNN" FLOPPY BOOT DATA ; STHD EQU 2 ;START LOGICAL DRIVE OF HARD DISK NDHD EQU 5 ;LAST LOGICAL DRIVE OF HARD DISK ST8FD EQU 0 NNNNNNNNNNNNNNNN .nNNNNNNNNNNNNNNNNNNNNN!;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; GENERATE THE TRANSLATION TABLE MACRO ; ;@@'NNNNNNNNNNNNNNNNN yrNNNNNNNNNNNNNNNNNNNNNNCP/M 3.0 DPB structure in preparation for deblocking. ; 3.05 11-3-88 GRH ; Change included data to update IOPB.PBSTAT to newHNNNNNNNNNNNNNNNNN  Z}NNNNNNNNNNNNNNNNNNNNNNrupted PB_FLG. ; 3.08 2-22-91 GRH ; Remove references to THIS_BNK & use monitor function #7 instead. ; Add track-head shift6rNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN GRH Add r/ls & move to 59k system. ; 9-19-91 GRH Fix bug which destroyed my root directories! ; BUF_RD was writing. ;[NNNNNNNNNNNNNNNN cNNNNNNNNNNNNNNNNNNNNNN================================================== ; FALSE EQU 0 TRUE EQU NOT FALSE ;===================================ٜNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNN!======================================================= ; ; DISK OPERATING SYSTEM ADDRESSES ; ;===========================NNNNNNNNNNNNNNNNN #2NNNNNNNNNNNNNNNNNNNNNN + 80H ;DEFAULT BUFFER ; ; BIOS FUNCTION CALL RESTART VECTOR ; BFUNRST EQU 28H BFUNRSV EQU PAGE0 + BFUNRST BFUNRSI EQU 0rNNNNNNNNNNNNNNNNN ):NNNNNNNNNNNNNNNNNNNNNN ;START LOGICAL DRIVE OF 8" FLOPPY ND8FD EQU 1 ;LAST LOGICAL DRIVE OF 8" FLOPPY ENDIF ;==============================INNNNNNNNNNNNNNNNN /_NNNNNNNNNNNNNNNNNNNNNN@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; GXLATE MACRO #SECTORS, #SKEW LIST OFF NXTSEC DXNNNNNNNNNNNNNNNN ,!NNNNNNNNNNNNNNNNNNNNNN configuration. ; 3.06 1-28-89 GRH ; Revised primitive calling procedures to use the monitor rom function ; rather than swGNNNNNNNNNNNNNNNN  NNNNNNNNNNNNNNNNNNNNNN factor to DPBs for future use. ; 3.09 5-15-91 GRH ; Change 8" floppy side select to track bit 0. Move calculation from ; NNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN Patch problems with partitioning until 20MB drive installed. ; Fix TPA corruption by LOGON problem by using ROMBNK sector LNNNNNNNNNNNNNNNNN  ]NNNNNNNNNNNNNNNNNNNNNN========================================= ; ; CONDITIONAL ASSEMBLY FLAGS ; ;================================================ļrNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN================================================= ; SYS EQU 2 ;CP/M VERSION {2,3} ; NKSYS: EQU 59 ;SYSTEM SIZE IN K BYTES XNNNNNNNNNNNNNNNNN $LNNNNNNNNNNNNNNNNNNNNN!C7H + BFUNRST ;============================================================================ ; ; OTHER DECLARATIONS ; ;=NNNNNNNNNNNNNNNN *oNNNNNNNNNNNNNNNNNNNNN!============================================== ; ; BDOS CONSTANTS ON ENTRY TO WRITE ; ;==============================NNNNNNNNNNNNNNNNNN 0NNNNNNNNNNNNNNNNNNNNNNL 1 ;;START WITH SECTOR 1 LOWEST DL 1 ;; REPT #SECTORS LIST ON DB NXTSEC LIST OFF NXTSEC DL NXTSEC + #SKEW ;ADD SKEW]INNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN^NNNNNNNN΁i7҅n< ׉sA܍yG㑱L畴O뙹U"X%򡿢Z(ĦNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN 2NNNNNNNNNNNNNNNNNNNNNN FACTOR ;; IF NXTSEC > #SECTORS ;CHECK FOR OVERFLOW NXTSEC DL NXTSEC - #SECTORS ;; IF NXTSEC <= LOWEST ;CHECK FOR REPHNNNNNNNNNNNNNNNNN ^NNNNNNNNNNNNNNNNNNNNN!------------------------------ ; ; BIOS JUMP VECTOR TABLE ; ;-------------------------------------------------------------NNNNNNNNNNNNNNNN _NNNNNNNNNNNNNNNNNNNNN!RESIDE AS DEFINED RIGHT BEFORE THE COLD ; INIT ROUTINE START AND MUST BE IN THE 1ST SECTOR. THESE 2 WORDS ARE ; REFERENCED BY NNNNNNNNNNNNNNNN #NNNNNNNNNNNNNNNNNNNNNN############################################### ; DIRBF: EQU $ ;BUFFER BEGINNING ;--------------------------------------YrNNNNNNNNNNNNNNNN ~NNNNNNNNNNNNNNNNNNNNNNCK INSTALLED ; LD A,MF_CSYN ;TEST FOR BOARD PRESENT CALL XMROM ; ; IF CLOCK PRESENT THEN TURN ON CLOCK DRIVE ; OR A,NNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNNTHAN DIR BUFFER **** ELSE DS DIRBF+SECSZ-$ ;FILL OUT DIRECTORY BUFFER TO 1 SECTOR SIZE ENDIF ;-------------------"NNNNNNNNNNNNNNNN %>NNNNNNNNNNNNNNNNNNNNNN ; ; READ BOOT DIRECTORY ; LD BC,DEFBFR ;SET XFER ADDRESS (USE DEFAULT BUFFER) CALL SETDMA ; LD BC,BD_SEC ;SET DIRuHNNNNNNNNNNNNNNNNN +NNNNNNNNNNNNNNNNNNNNNN ; IF NOT INTO BDOS THEN READ NEXT SECTOR ; LD DE,BDOS XOR A,A SBC HL,DE JR C,WREAD ; ; ELSE IF AT BEGINNING OF BNNNNNNNNNNNNNNNNN aNNNNNNNNNNNNNNNNNNNNNNEAT NXTSEC DL LOWEST + 1 LOWEST DL NXTSEC ENDIF ENDIF ;; ENDM LIST ON ENDM ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@yYNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNN--------------- ; JP INIT1 ;COLD START ENTRY JP WARM ;RELOAD CCP/BDOS JP CNSCK ;GET CONSOLE STATUS JP CI ;CONSOLE IHHNNNNNNNNNNNNNNNN  NNNNNNNNNNNNNNNNNNNNNNTHE BOOT LOADER CODE IN ORDER TO DETERMINE THE LOAD ADDRESS ; AND LENGTH OF THE BIOS. ; ;####################################c rNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNN!-------------------------------------- ; ; INIT - COLD START ENTRY FROM BOOT MUST SET ALL BIOS PARAMS ; ;---------------NNNNNNNNNNNNNNNN +NNNNNNNNNNNNNNNNNNNNNNA LD A,38H ;COND. JR (ON) JR Z,CLKON ; ; ELSE TURN OFF CLOCK DRIVE ; LD A,18H ;UNCOND. JR (OFF) (CAUSES JUMP TO ILLQNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN--------------------------------------- ; ; WARM REBOOT ENTRY LOADS CCP,BDOS FROM DISK & ; SETS UP VARIABLES ; ;-----------BNNNNNNNNNNNNNNNN &kCNNNNNNNNNNNNNNNNNNNNNNECTORY SECTOR CALL SETSEC ; LD BC,0 ;SET TRACK TO 0 CALL SETTRK ; CALL DISKRD JR NZ,WEROR ; ; CHECK FOR VALID B7NNNNNNNNNNNNNNNN ,NNNNNNNNNNNNNNNNNNNNNNDOS THEN SET UP NEW TRACK & SECTOR ; JR Z,RDBDOS ; ; ELSE IF NOT AT BIOS THEN READ NEXT SECTOR ; LD DE,BIOS - BDOS S NNNNNNNNNNNNNNNN PNNNNNNNNNNNNNNNNNNNNNN@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; INITIALIZE VERSION TEXT IN RAM MACRO ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@'NNNNNNNNNNNNNNNNN }NNNNNNNNNNNNNNNNNNNNN!NPUT JP COC ;CONSOLE OUTPUT JP LO ;PRINTER OUTPUT JP PUNCH JP READER JP HOME ;HOME SELECTED DRIVE JP SELDSK ;SEL XNNNNNNNNNNNNNNNNN =NNNNNNNNNNNNNNNNNNNNNN######################################## ; DB 0 ;Z80 CPU DB 0 ;SPARE BIOSSZ: DW BIOSND - BIOS ;BIOS MODULE SIZE IN BYTESNNNNNNNNNNNNNNNN ;NNNNNNNNNNNNNNNNNNNNN!------------------------------------------------------------- ; INIT: ; ; SET TEMPORARY STACK ; DI LD SP,DEFBFR ;USE ~NNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNN!EGAL) ; CLKON: LD (INHCLK),A ; ; BOOT CCP & BDOS ; JR WARM ;######################################################J6NNNNNNNNNNNNNNNNN !NNNNNNNNNNNNNNNNNNNNNN----------------------------------------------- ; WARM: ; ; SET TEMPORARY STACK ; DI LD SP,DEFBFR LD (THIS_STK),SP zHNNNNNNNNNNNNNNNNN 'XrNNNNNNNNNNNNNNNNNNNNNNOOT DIRECTORY ; LD A,(DEFBFR) CP A,86H JR C,WEROR ; ; SET UP TO LOAD CCP/BDOS ; LD HL,(DEFBFR + BD_SBDSS) ;PREFETC0NNNNNNNNNNNNNNNN -NNNNNNNNNNNNNNNNNNNNNNBC HL,DE JP C,WREAD ; ; ELSE DONE READING SYSTEM ; JR WZRPG ; ; ; ELSE SET UP & READ BDOS ; RDBDOS: POP HL ;RESNNNNNNNNNNNNNNNN  NNNNNNNNNNNNNNNNNNNNNN@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; PVERS MACRO #VERS DD DL #VERS IF DD > 9999 DB (DD / 10000) + '0' DD DL D?BNNNNNNNNNNNNNNNN (NNNNNNNNNNNNNNNNNNNNNNECT DISK DRIVE JP SETTRK ;SET TRACK # JP SETSEC ;SET SECTOR # JP SETDMA ;SET TRANSFER ADDR JP DISKRD ;PERFORM DISK RNNNNNNNNNNNNNNNNN pNNNNNNNNNNNNNNNNNNNNN! BIOSST: DW BIOS ;BIOS MODULE LOAD ADDR FOR SBD ; ; CONTINUE ON WITH INIT ; INIT1: JR INIT ;#######################%NNNNNNNNNNNNNNNN nNNNNNNNNNNNNNNNNNNNNNNPAGE 0 FOR STACK LD (THIS_STK),SP EI ; ; INIT DEFAULT DRIVE ; LD A,(DK_BDRV) ;USE DRIVE # PASSED IN PAGE 0 AND A,3 9HNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN###################### ; ; SIGN-ON MESSAGE ; ;############################################################################ $rNNNNNNNNNNNNNNNN "NNNNNNNNNNNNNNNNNNNNNN EI ; ; INIT OUR STUFF ; XOR A,A LD (BUF_ACT),A ;ASSUME NO DATA IN BUFFER ; LD (UNA_CNT),A ;CLEAR UNALLOCATED SECTONNNNNNNNNNNNNNNNN (HLNNNNNNNNNNNNNNNNNNNNNNH BDOS TRK/SECTOR PUSH HL ; LD HL,(DEFBFR + BD_SCCPS) ;FETCH CCP TRK/SECTOR LD C,L LD B,0 CALL SETSEC ; LD C,H CJBNNNNNNNNNNNNNNNN .NNNNNNNNNNNNNNNNNNNNNNTORE BDOS TRK/SECTOR FROM DIRECTORY LD C,L LD B,A ;A STILL CONTAINS 0 CALL SETSEC ; LD C,H CALL SETTRK ; JR WREAD$NNNNNNNNNNNNNNNNN 8NNNNNNNNNNNNNNNNNNNNNND % 10000 ENDIF IF DD > 999 DB (DD / 1000) + '0' DD DL DD % 1000 ENDIF DB (DD / 100) + '0' DB '.' DB ((DD %FlNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNEAD JP DISKWR ;PERFORM DISK WRITE JP LISTST ;RETURN LIST STATUS JP SECTRN ;TRANSLATE SECTOR JP BIOFUNC ;EXECUTE FUNCNrNNNNNNNNNNNNNNNNN ANNNNNNNNNNNNNNNNNNNNNN##################################################### ; ; DIRECTORY SECTOR BUFFER STARTS HERE AFTER CRUNCHING COLD START ; C4lNNNNNNNNNNNNNNNN ]NNNNNNNNNNNNNNNNNNNNNN LD (DEFDRV),A ; ; SEND SYSTEM SIGN-ON ; LD HL,MSGSO CALL EDITOR ; ; MODIFY COLD START VECTOR TO WARM START ; L_rNNNNNNNNNNNNNNNN ,NNNNNNNNNNNNNNNNNNNNN!; MSGSO: DB CR,LF DB CPMSZ / (KBYTE * 10) + '0' DB (CPMSZ MOD (KBYTE * 10)) / KBYTE + '0' DB 'K CP/M-80 Vers 2.2',CR,LF b,NNNNNNNNNNNNNNNN #NNNNNNNNNNNNNNNNNNNNNNR COUNT ; LD (BUF_MOD),A ;CLEAN BUFFER ; LD HL,BLKBUF ;INIT BUFFER PTR LD (BUF_DMA),HL ; ; LOG ON DRIVE TO INIT TABL;lNNNNNNNNNNNNNNNNN ){}NNNNNNNNNNNNNNNNNNNNN!ALL SETTRK ; LD BC,CCP CALL SETDMA ; ; READ CCP/BDOS ; WREAD: CALL DISKRD JR NZ,WEROR ;IF ERROR THEN EXIT ; ; N]NNNNNNNNNNNNNNNNN /NNNNNNNNNNNNNNNNNNNNNN ; ; ; WARM BOOT ERROR, OUTPUT MSG & GO TO DEBUGGER ; WEROR: LD HL,MSGLE ;OUTPUT ERROR MESSAGE CALL EDITOR CALL MR_BRִNNNNNNNNNNNNNNNN mNNNNNNNNNNNNNNNNNNNNNN 100) / 10) + '0' DB (DD % 10) + '0' ENDM SUBTTL BIOS CODE ORG BIOS ;----------------------------------------------@NNNNNNNNNNNNNNNN nNNNNNNNNNNNNNNNNNNNNNNTION CALL ;############################################################################ ; ; THE FOLLOWING BOOT DATA MUST ~9NNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNODE. THIS BUFFER IS USED BY THE CP/M DIRECTORY CHECK ROUTINES THAT ; CHECK FOR DISK CHANGE. ; ;#############################dNNNNNNNNNNNNNNNNN MNNNNNNNNNNNNNNNNNNNNN!D HL,(BIOS+4) LD (BIOS+1),HL ; ; INIT OUR STUFF ; CALL GETBNK LD (BUF_DMAB),A ; ; INITIALIZE CLOCK VECTORS IF CLONNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN DB 'M5b CBIOS Vers ' PVERS VERSN DM CR,LF IF $ > (DIRBF + SECSZ) CONMSG **** WARNING! COLD INIT CODE BIGGER jHNNNNNNNNNNNNNNNNN $ !NNNNNNNNNNNNNNNNNNNNN!ES ; LD A,(DK_BDRV) AND A,3 ;MODULO 4 LD C,A LD E,0 CALL SELDSK LD A,L ;IF ERROR THEN ABORT OR A,H JR Z,WERORNNNNNNNNNNNNNNNNN *..NNNNNNNNNNNNNNNNNNNNNNEXT SECTOR ; LD HL,CPM_SEC INC (HL) ; LD DE,128 ;DMA += SECTOR SIZE LD HL,(CPM_DMA) ADD HL,DE LD (CPM_DMA),HL ; ANNNNNNNNNNNNNNNNN 0–NNNNNNNNNNNNNNNNNNNNNNK HALT ; ; ; BOOT OK, INIT PAGE 0 ; WZRPG: ; ; INIT BIOS WARM START IN PAGE 0 ; LD A,0C3H LD HL,BIOS + 3 LD ($NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN$NNNNNNˁh6҅o= ىtAݍ{I味N镶Q Z(Þ_-Ǣb0˦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNN!(PAGE0),A LD (PAGE0 + 1),HL ; ; INIT BDOS CALL VECTOR IN PAGE 0 ; LD HL,BDOS + 6 LD (BDOSJV),A LD (BDOSJV + 1),HL $NNNNNNNNNNNNNNNNN iNNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++++ ; DISKRD: ; ; SET UP DATA TABLE PTRS ; PUSH IX LD IX,(CUR_DDT) ; PUSH I -> BITS <14..8> LD H,A ; LD A,0 ;BIT 0 -> BIT 7 RRA LD L,A ; ; HL |NNNNNNNNNNNNNNNN `NNNNNNNNNNNNNNNNNNNNN!ER ; LD BC,DEFBFR CALL SETDMA ; IF INTCPTS ; ; PUT BDOS VECTOR INTO INTERCEPT CODE ; LD HL,(BDOS + 7) LD (BDOSNNNNNNNNNNNNNNNNNN  JNNNNNNNNNNNNNNNNNNNNNNDN ; ; READS DON'T NEED ALLOCATION ; XOR A,A LD (UNA_CNT),A ; ; READ_OPERATION_FLAG = TRUE (1) ; INC A LD (REAwNNNNNNNNNNNNNNNNN  NNNNNNNNNNNNNNNNNNNNNNOOT WRITE PROTECTION ; XOR A,A LD (WR_PROT),A ; ; SET PTRS TO DISK DATA ; PUSH IX LD IX,(CUR_DDT) ; PUSH IY LE9NNNNNNNNNNNNNNNN  NNNNNNNNNNNNNNNNNNNNNNCPM_SEC) LD (UNA_SEC),HL ; ; IF NO UNALLOCATED SECTORS REMAIN THEN PREREAD ; CHKUNA: LD A,(UNA_CNT) OR A,A JP Z,ALLO^NNNNNNNNNNNNNNNN /NNNNNNNNNNNNNNNNNNNNNN LD (UNA_SEC),HL ; LD HL,(UNA_TRK) ;TRACK++ INC HL LD (UNA_TRK),HL ; NOOVF: ; ; MATCH FOUND, MARK AS UNNECESSARY REENNNNNNNNNNNNNNNNN !NNNNNNNNNNNNNNNNNNNNNNF ;IF ALREADY 0 THEN SECTOR SIZE IS 128 ; SECSHFLP: SRL H ;ELSE SHIFT OVER TO PHYSICAL SECTOR RR L DEC A JP NZ,SECSigNNNNNNNNNNNNNNNNN 'oBNNNNNNNNNNNNNNNNNNNNNNNG NEW ONE ; CALL BUF_FLSH ;CLEAR HOST BUFF ; JR NZ,RW_RET ;IF ERROR THEN ABORT ; FILHST: ; ; READ THE SECTOR BUFFER^NNNNNNNNNNNNNNNN -NNNNNNNNNNNNNNNNNNNNNNHAS RELATIVE HOST BUFFER ADDRESS ; LD DE,BLKBUF ADD HL,DE ;HL = HOST ADDRESS ; LD DE,(CPM_DMA) ;GET/PUT CP/M DATA LD BNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNN!******************************************************************** ; SETDMA: LD (CPM_DMA),BC ; LD A,(BUF_DMAB) ;FETCH BANNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN RET ; ; ; CONVERT FROM CP/M'S LOGICAL SECTOR {0..N-1} TO PHYSICAL SECTOR {1..N} ; NOTRAN: LD HL,1 ADD HL,BC RET4HNNNNNNNNNNNNNNNNN SNNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; LL_READ: ; ; ENABLE UPLOAD ; XOR A,A LD (IOPB + PaNNNNNNNNNNNNNNNN %X NNNNNNNNNNNNNNNNNNNNNNTOR {0:128, 1:256, 2:512, 3:1024} LD HL,128 ;START WITH 128 BYTES ; AND A,3 ;LIMIT TO 1024-BYTE SECTORS ; JR Z,LL_WR2 NNNNNNNNNNNNNNNNN +{NNNNNNNNNNNNNNNNNNNNNN+ PB_SECO),HL ; ; SET PHYSICAL DRIVE ; LL_DO: LD A,(IX + DDT_DRV) LD (IOPB + PB_DRVO),A ; ; FETCH DRIVER VECTOR & EXNNNNNNNNNNNNNNNNN |NNNNNNNNNNNNNNNNNNNNNN DJNZ PADIDL ; ; ELSE XFER ID SECTOR DATA TO TABLES ; IDOK: CALL TRNONE ;ASSUME NO TRANSLATION ; ; IF HARD DISK OR DONNNNNNNNNNNNNNNNN (NNNNNNNNNNNNNNNNNNNNNN ; XFER DATA TO TABLES ; SEL2: LD DE,(CUR_DPB) ; USE DEFAULT TABLE LD BC,DPB_SZ LDIR ; LD A,(HL) ;HEADS VALUE JR NNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN ;**************************************************************************** ; ; SET TRACK # ; ENTRY- BC= TRACK # ; rNNNNNNNNNNNNNNNN nNNNNNNNNNNNNNNNNNNNNNNK ADDRESS SET BY COLD START LD (CPM_DMAB),A ; ; DONE ; RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++%rNNNNNNNNNNNNNNNN MNNNNNNNNNNNNNNNNNNNNNN SUBTTL DISK SUPPORT ROUTINES ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; LOGON DTdNNNNNNNNNNNNNNNNN  NNNNNNNNNNNNNNNNNNNNNNB_FLGO),A ; ; DISABLE DOWNLOAD ; LD HL,0 LD (IOPB + PB_BCNTO),HL ; ; PASS READ SECTOR COMMAND ; LD A,PB_READC -BNNNNNNNNNNNNNNNN & ^NNNNNNNNNNNNNNNNNNNNNN;IF SHIFT_FACTOR == 0 THEN DONE ; LL_WR3: ADD HL,HL ;DOUBLE COUNT DEC A JP NZ,LL_WR3 ; LL_WR2: LD (IOPB + PB_BCNTO),HL #NNNNNNNNNNNNNNNN ,NNNNNNNNNNNNNNNNNNNNNNECUTE DISK DRIVER ; LL_OPLP: LD HL,LL_OPRET ;PUT RETURN ADDRESS ON STACK PUSH HL ; LD L,(IX + DDT_EXE) ;FETCH DRIVER ANNNNNNNNNNNNNNNN MNNNNNNNNNNNNNNNNNNNNN!UBLE DENSITY THEN NO TRANSLATION ; LD A,(BLKBUF + ID_FLGO) AND A,[1 SHL DF_DTDB] OR [1 SHL DF_HARDB] ; ; ELSE SET TRANSNNNNNNNNNNNNNNNNN  NNNNNNNNNNNNNNNNNNNNNNSEL1 ; ; ; USE 8" FLOPPY DEFAULTS ; LGCKFD: CALL TR8 LD HL,SD8PBK JR SEL2 ; ; ERROR EXIT ; LOGERR: LD HL,0 ; FNNNNNNNNNNNNNNNNN  NNNNNNNNNNNNNNNNNNNNNN;**************************************************************************** ; SETTRK: LD (CPM_TRK),BC RET ;********9NNNNNNNNNNNNNNNN ]NNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++ ; ; SECTOR TRANSLATION FUNCTION ; ENTRY- DE= 0: NO XLATE, ELSE PTR TO XLATE TABLE ; BC= SECTOR # TO NNNNNNNNNNNNNNNNN ~NNNNNNNNNNNNNNNNNNNNN!ISK FUNCTION ; EXIT - A= 0: OK; /0: ERROR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; NNNNNNNNNNNNNNNNNN !NNNNNNNNNNNNNNNNNNNNNNJP LL_RW ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; LOW LEVEL WRITE ; ENTRY- IX= hNNNNNNNNNNNNNNNNN '>oNNNNNNNNNNNNNNNNNNNNNN ; ; PASS WRITE COMMAND ; LD A,PB_WRITC ; ; FALL INTO COMMON CODE ; ;+++++++++++++++++++++++++++++++++++++++++++NNNNNNNNNNNNNNNN -ѤNNNNNNNNNNNNNNNNNNNNNNDDRESS FROM TABLE LD H,(IX + DDT_EXE + 1) JP (HL) ; ; DRIVER RETURNS HERE ; LL_OPRET: ; ; IF NO ERRORS THEN RETURNwNNNNNNNNNNNNNNNN mNNNNNNNNNNNNNNNNNNNNN!LATION ; CALL Z,TR8 ; ; XFER DISK DATA TO DPB ; LD DE,(CUR_DPB) ;GET ADDR OF DPB LD HL,BLKBUF + ID_SPTO LD BC,DPBBNNNNNNNNNNNNNNNN  NNNNNNNNNNNNNNNNNNNNNNN; DONE ; LGDONE: POP IY ;RESTORE REGS POP IX RET ;*****************************************************************1NNNNNNNNNNNNNNNNN mNNNNNNNNNNNNNNNNNNNNNN******************************************************************** ; ; SET SECTOR ; ENTRY- BC= SECTOR # ; ;**************19NNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNN!XLATE ; EXIT - HL= XLATED SECTOR OR BC + 1 ; BC= UNCHANGED ; A, DE= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++$NNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN DISKLOG: ; ; SET UP READ IOPB ; LD A,(BUF_DMAB) LD (LOGIOPB + PB_DMAXO),A ; LD HL,LOGIOPB LD DE,IOPB LD BC,PB_SNNNNNNNNNNNNNNNN "NNNNNNNNNNNNNNNNNNNNNNDDT PTR ; IY= DPB PTR ; EXIT - IOPB.PB_STATO, A= STATUS ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++!NNNNNNNNNNNNNNNNN (.QNNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++ ; ; COMMON IOPB EXECUTER ; ENTRY- A= COMMAND ; IX= DRIVE TABLE PTR ; IY= DPB PTR ; ;+2UNNNNNNNNNNNNNNNNN .NNNNNNNNNNNNNNNNNNNNNN ZF ; RET Z ;IF NO_ERROR THEN RETURN ; ; PRINT ERROR ; IOPBDMP: LD A,(BUF_DMAB) ;SET BANK LD E,A ; LD HL,IOPB NNNNNNNNNNNNNNNNN ^NNNNNNNNNNNNNNNNNNNNNN_SZ LDIR ; ; XFER DISK PHYSICAL DATA TO TABLE ; LD A,(BLKBUF + ID_HEADS) ; SEL1: LD (IX + DDT_HDS),A ; ; RETURN DNNNNNNNNNNNNNNNNN  }NNNNNNNNNNNNNNNNNNNNN!*********** ; ; HOME DRIVE - TREAT AS SEEK TRK 0 ; EXIT - BC= 0 ; ;******************************************************NNNNNNNNNNNNNNNNN \NNNNNNNNNNNNNNNNNNNNNN************************************************************** ; SETSEC: LD (CPM_SEC),BC RET ;***********************VNNNNNNNNNNNNNNNN ;NNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++ ; SECTRN: ; ; IF NO TRANSLATION THEN RETURN SECTOR++ ; LD A,D ;IF TABLE ADDR = 0 THEN NO TrNNNNNNNNNNNNNNNN 1NNNNNNNNNNNNNNNNNNNNNNTATO LDIR ; ; EXECUTE WITHOUT COMPENSATION ; JR LL_DO ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++HNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNNTBL: DW RETVERS ;0:RETURN VERSION # DW RETDVRTF ;1:RETURN DISK PHYSICAL CONFIGURATION TABLE PTR MAXFUNCS EQU ($ - BFUNTBLtNNNNNNNNNNNNNNNN %NNNNNNNNNNNNNNNNNNNNNN++ ; RETDVRTF: ; ; ADJUST REGISTER ; LD C,E ; ; FALL INTO LOCAL ENTRY ; ;++++++++++++++++++++++++++++++++++++'NNNNNNNNNNNNNNNNN +:NNNNNNNNNNNNNNNNNNNNN!BUF_DMAB) LD E,A ; ; RETURN NO ERROR ; XOR A,A RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++UnNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNR Z,LL_OPLP ; ; ELSE IF ABORT THEN DO WARM BOOT ; CP A,'A' ;IF ABORT THEN RE-BOOT JP Z,0 ; ; ELSE IF DEBUGGER THEN,'NNNNNNNNNNNNNNNNN i3NNNNNNNNNNNNNNNNNNNNNN LD (HL),E INC HL LD (HL),D RET ;**************************************************************************** ; ;j NNNNNNNNNNNNNNNN ÕNNNNNNNNNNNNNNNNNNNNNNRESULTS STATUS ; LD A,(IOPB + PB_STATO) OR A,A RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++rNNNNNNNNNNNNNNNN /-NNNNNNNNNNNNNNNNNNNNNNROM TRACK BIT 0 ; LD HL,(IOPB + PB_TRKO) PUSH HL ;SAVE ORIGINAL DATA ; LD A,(IOPB + PB_SECO + 1) ADD A,A ;BIT 15 -9 NNNNNNNNNNNNNNNN  "NNNNNNNNNNNNNNNNNNNNNNOFUNC: ; ; IF FUNCTION # NOT IN TABLE THEN RETURN -1 ; LD A,C CP A,MAXFUNCS LD A,-1 RET NC ; ; ELSE COMPUTE TAB NNNNNNNNNNNNNNNNN |NNNNNNNNNNNNNNNNNNNNNN) / 2 ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN BIOS VERSION # FUNCTION #0lBNNNNNNNNNNNNNNNN &LNNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++ ; ; RETURN DRIVER TABLE PTR FUNCTION ; ENTRY- C= DRIVE # ; EXIT - E:HL= DRIVER TABL7NNNNNNNNNNNNNNNN ,NNNNNNNNNNNNNNNNNNNNNN++++++++++++++++ ; ; GET BANK NUMBER FUNCTION ; EXIT - A= BANK # ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++"J NNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN EXECUTE IT ; CP A,'M' JP Z,MR_BRK ; ; ELSE IF IGNORE THEN RETURN NO ERROR ; SUB A,'I' ;IF IGNORE THEN RETURN NO ERNNNNNNNNNNNNNNNNN ZNNNNNNNNNNNNNNNNNNNNN! SET NO SECTOR TRANSLATION PROCEDURE ; EXIT - HL, DE= ? ; ;******************************************************************NNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN++++++++++++ ; ; HARD DISK DRIVER FUNCTION ; ENTRY- IX= DRIVER TABLE PTR ; EXIT - A= 0: OK; /0: ERROR ; ;+++++++++++++++++rNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN> BIT_BUCKET ; SRL H RR L RRA ;TRK BIT 0 -> SECTOR BIT 15 LD (IOPB + PB_SECO + 1),A ; LD (IOPB + PB_TRKO),HL ;TRA7BNNNNNNNNNNNNNNNN ?NNNNNNNNNNNNNNNNNNNNN!LE ENTRY ; PUSH HL ;SAVE POSSIBLE DATA ; LD HL,BFUNTBL LD A,C ADD A,A ADD A,L LD L,A LD A,0 ADC A,H LD H,A nNNNNNNNNNNNNNNNNN !MNNNNNNNNNNNNNNNNNNNNNN ; EXIT - HL= VERSION # IN BINARY {0.00,..655.35} ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++]NNNNNNNNNNNNNNNNN 'NNNNNNNNNNNNNNNNNNNNNNE BASE PTR ; NZ= ILLEGAL DRIVE (HL= 0) ; A, B, C= ? ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ NNNNNNNNNNNNNNNN - NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++ ; GETBNK: LD A,MF_GBNK JP MR_FUN SUBTTL NON-DISK PROCEDURES ;*******************************HNNNNNNNNNNNNNNNN ,^NNNNNNNNNNNNNNNNNNNNN!ROR RET Z ; ; ELSE RETURN ERROR TO BDOS ; LD A,-1 ;RETURN -1 TO BDOS OR A,A RET ; ; ; DISPLAY WRITE PROTECT ENNNNNNNNNNNNNNNN QNNNNNNNNNNNNNNNNNNNNNN********** ; TRNONE: LD DE,0 JR SETTR SUBTTL HARD DISK ROUTINES ;++++++++++++++++++++++++++++++++++++++++++++++++++++lNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; HDEXEC: EQU XPRIM SUBTTL JADE FLOPPY DRIVER ROUTINES ;+++kBNNNNNNNNNNNNNNNN IONNNNNNNNNNNNNNNNNNNNNNCK = RESIDUAL ; ; EXECUTE THE IOPB ; CALL XPRIM ; ; RESTORE THE MODIFIED IOPB SO RETRY WILL WORK ; POP HL ;TRACKNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNN! ; ; EXECUTE TABLE ADDRESS ; LD A,(HL) INC HL LD H,(HL) LD L,A ; EX (SP),HL ;PUT CALLER'S DATA IN HL, FUNCTION ANNNNNNNNNNNNNNNN "NNNNNNNNNNNNNNNNNNNNNN++++ ; RETVERS: LD HL,VERSN XOR A,A ;RETURN NO ERROR RET ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++NNNNNNNNNNNNNNNNN (oNNNNNNNNNNNNNNNNNNNNN!+++++++++ ; RETDVRT: ; ; ASSUME DRIVE 0 ; LD HL,DDT_0 ;START AT 1ST TABLE ; ; IF DRIVE == 0 THEN ALREADY THERE ; NNNNNNNNNNNNNNNNNN .sNNNNNNNNNNNNNNNNNNNNN!******************************************** ; ; NEWLINE PROCEDURE ; ;******************************************************ʾNNNNNNNNNNNNNNNNN oNNNNNNNNNNNNNNNNNNNNNNRROR MESSAGE ; DO_ERR: LD HL,WP_ERM CALL EDITOR JR IOPBDMP ;*********************************************************:NNNNNNNNNNNNNNNNN <`NNNNNNNNNNNNNNNNNNNNN!++++++++++++++++++++++++ ; ; EXECUTE THE IOPB PRIMITIVE ; EXIT - A= 0: OK, /0: ERROR ; ;+++++++++++++++++++++++++++++++++++^yNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNN!+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; JADE 8" FLOPPY DISK DRIVER FUNCTION ; ENTRY- IYNNNNNNNNNNNNNNNN z~NNNNNNNNNNNNNNNNNNNNNN LD (IOPB + PB_TRKO),HL ; LD HL,IOPB + PB_SECO +1 ;CLEAR BIT 15 RES 7,(HL) ; ; DONE ; RET SUBTTL BIOS FUNCTIhNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNDDR ON RET ; STACK, EXECUTE FUNCTION ADDRESS ON STACK ;################################################################MNNNNNNNNNNNNNNNN #/NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++ ; ; RETURN DRIVER TABLE PTR FUNCTION #1 ; ENTRY- E= DRIVE # ; EXIT - E:HL= DRIVER TABLE BASE PTR ; NNNNNNNNNNNNNNNNNN )\NNNNNNNNNNNNNNNNNNNNNN LD A,C OR A,A RET Z ; ; ELSE IF ILLEGAL DRIVE THEN RETURN ERROR ; CP A,NDRVS JR C,RETDV2 ; LD HL,0 OR A,A ;SlNNNNNNNNNNNNNNNNN /BNNNNNNNNNNNNNNNNNNNNNN********************* ; CRLF: LD C,CR CALL COC LD C,LF JP COC IF INTCPTS SUBTTL ADDITIONAL FUNCTIONS TO SUPPORT NNNNNNNNNNNNNNNN JrNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNN! ; ;**************************************************************************** ; LO: LD A,MF_LO JP XMROM ;+++++++'NNNNNNNNNNNNNNNNN $NNNNNNNNNNNNNNNNNNNNNN################################ ; ; 3740 SECTOR TRANSLATION TABLE ; **** CP/M SINGLE DENSITY **** ; ;#####################ݽNNNNNNNNNNNNNNNNN *>NNNNNNNNNNNNNNNNNNNNNNLOGON ; 1..3 PARTITION # {0,..7} ; 4 1: HARD DISK DRIVE ; DDT_DRV DS 1 ;PHYSICAL DRIVE # DDT_DPB DS 2 ;DPB ADDRES`-$NNNNNNNNNNNNNNNNN 0?NNNNNNNNNNNNNNNNNNNNNNO #DADD,#PD,#FLG,#DPB,#DPH,#HDS,#SOF DW #DADD ;DRIVER EXECUTION ADDR DB #FLG ;FLAGS DB #PD ;MONITOR PHYSICAL DRIVE # NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN΁i6хm; ։q> ڍvCߑzH䕱NꙸT!X&\+ǦNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNHwNNNNNNNNNNNNNNNNNNNNN!DW #DPB ;DISK PARAMETER BLOCK PTR DW #DPH ;DISK PARAMETER HEADER PTR DB #HDS ;HEADS DW #SOF ;SECTOR OFFSET ; ENDM NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNEC,5,12H,D5DPB,D5DPH,4,8000H ENDIF ;############################################################################ ; ; rNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN ;DISK SIZE -1 DW 63 ;DIRECTORY MAX DB 11000000B ;ALLOC 0 DB 0 ;ALLOC 1 DW 16 ;CHECK SIZE DW 2 ;TRACK OFFSET DBRNNNNNNNNNNNNNNNN-fNNNNNNNNNNNNNNNNNNNNN!;ALLOCATION 1 (AL1) DW 0 ;CHECK SIZE (CKS) DW 2 ;TRACK OFFSET (OFF) DB 1 ;PHYSICAL RECORD SHIFT FACTOR (PSH) DBӚNNNNNNNNNNNNNNNN­NNNNNNNNNNNNNNNNNNNNN! IF NO XLATE) DW 0 ;;SCRATCH AREA DW 0 ;;" DW 0 ;;" DW DIRBF ;;DIRECTORY BUFFER PTR DW D#D(DD)DPB ;;DRIVE PARAMETEnNNNNNNNNNNNNNNNNNh NNNNNNNNNNNNNNNNNNNNNNDW BLKBUF ;DMA DB 0 ;BANK DW 0 ;COUNT ; WR_PROT DB -1 ;/0: WRITE PROTECTION ENABLED ; ; LAST OF INITIALIZED CODE RWNNNNNNNNNNNNNNNN%UNNNNNNNNNNNNNNNNNNNNNNDS 1 ;FLAGS BUF_DMA DS 2 BUF_DMAB DS 1 ;BANK # ; ; ; BLOCKING BUFFER MAINTENANCE ; BUF_PSEC DS 2 ;BUFFER PHYSICAL SECTONNNNNNNNNNNNNNNNN+ZNNNNNNNNNNNNNNNNNNNNNN: DS 2 ;LAST UNALLOC SECTOR ;############################################################################ ; ; VARIABLES-NNNNNNNNNNNNNNNNN$NNNNNNNNNNNNNNNNNNNNNN IF BOOT = 10H ; A DDT_0: ALLDRV HDEXEC,4,10H,D0DPB,D0DPH,4,0 ; B DDT_1: ALLDRV HDEXEC,4,12H,D1DPB,D1DPH,4,8000H ; NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN MESSAGES ; ;############################################################################ ; MSGLE: DM CR,LF,'LOAD ERROR' ;;NNNNNNNNNNNNNNNNXINNNNNNNNNNNNNNNNNNNNNN 0 ;PHYSICAL RECORD SHIFT FACTOR DB 0 ;PHYSICAL RECORD MASK DW 0 ;LOGICAL DRIVE SECTOR OFFSET ; ; DEFAULT DISK PHYSIC{NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN! 1 ;PHYSICAL RECORD MASK (PRM) DW 0 ;LOGICAL DRIVE SECTOR OFFSET (SOF) ; ; ; DB 4 ;HEADS ;######################a9rNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!R BLK PTR IF ((DD - 1) <= NDHD) AND ((DD - 1) >= STHD) DW 0 ;;NO CHECKS ON HARD DISK ELSE DW D#D(DD)CHK ;;DRIVE DISz8NNNNNNNNNNNNNNNNN }NNNNNNNNNNNNNNNNNNNNNNEAD FROM DISK ; BIOSND EQU $ SUBTTL UNINITIALIZED DATA AREA ;############################################################BNNNNNNNNNNNNNNNN&NNNNNNNNNNNNNNNNNNNNNNR BUF_ACT DS 1 ;0: BUFFER FLUSHED, /0: DATA IN BUFFER BUF_MOD DS 1 ;0: BUFFER CLEAN, /0: BUFFER DIRTY (MODIFIED) ; BUF_DDT DjNNNNNNNNNNNNNNNN,8NNNNNNNNNNNNNNNNNNNNNN ; ;############################################################################ ; CUR_DPB DS 2 ;DRIVE TABLE PTR CUR_DDT DS+NNNNNNNNNNNNNNNNNNNNN!############## ; SD8PBK: DW 26 ;SECTORS PER TRACK DB 3 ;BLOCK SHIFT FACTOR DB 7 ;BLOCK MASK DB 0 ;NULL MASK DW 242!NNNNNNNNNNNNNNNNWNNNNNNNNNNNNNNNNNNNNNN DW 1015 ;DISK SIZE (CLUSTERS -1) (DSM) DW 1152 / 2 ;DIRECTORY MAX (DRM) DB 0FFH ;ALLOCATION 0 (AL0) DB 10000000B #NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN@@@@@@@@@ ; ALLDPH: MACRO #D LIST ON D#D(DD)DPH: ;DRIVE PARAMETER HEADER FOR DRIVE #D(DD) DW 0 ;;SECTOR TRAN TBL (OR 0>nNNNNNNNNNNNNNNNN[:NNNNNNNNNNNNNNNNNNNNNN########################### ; LOGIOPB: DB PB_LOGC ;COMMAND DB 0 ;DRIVE DW 0 ;TRACK DW ID_SECT ;SECTOR DB 0 ;FLAGS NNNNNNNNNNNNNNNNN$dNNNNNNNNNNNNNNNNNNNNNNFFER IOPB OVERLAY ; BUF_DSK DS 1 ;BUFFER DISK NUMBER BUF_TRK DS 2 ;BUFFER TRACK NUMBER BUF_SEC DS 2 ;BUFFER SECTOR NUMBER H*NNNNNNNNNNNNNNNNN*kNNNNNNNNNNNNNNNNNNNNN!_CNT: DS 1 ;# SECTORS REMAINING IN BLOCK (CLUSTER) UNA_DSK: DS 1 ;LAST UNALLOC DISK UNA_TRK: DS 2 ;LAST UNALLOC TRACK UNA_SECpNNNNNNNNNNNNNNNNN0~NNNNNNNNNNNNNNNNNNNNNNMACRO TO DEFINE THE DRIVE ALLOCATION & CHECKSUMS AREA ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ZHNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNˁe2΅j8Ӊn< ؍uCޑzH㕰MꙸT"]+Ƣb0̦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNGNNNNNNNNNNNNNNNNNNNNNN@@@@@@@ ; ; ALL = (DSM / 8) + 1 ; CHK = DPB.CKS ; ALLDAL: MACRO #D LIST ON IF ((DD - 1) >= STHD) AND ((DD - 1) <= NDHNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN2 ;SPT- SECTORS/TRACK DPB_BSH DS 1 ;BSH- BLOCK SHIFT FACTOR DETERMINED BY CLUSTER SIZE ; 1K= 3, 2K= 4, 4K= 5, 8K= 6, 16K= 7NNNNNNNNNNNNNNNN :*NNNNNNNNNNNNNNNNNNNNNN.2 DEBLOCKING) ; DPB_PSH DS 1 ;PSH- PHYSICAL RECORD SHIFT FACTOR BASED ON BYTES/SEC ; 0: 128, 1: 256, 2: 512, 3: 1024 DPB%!NNNNNNNNNNNNNNNNVNNNNNNNNNNNNNNNNNNNNNN@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ALLDPB: MACRO #D LIST ON D#D(DD)DPB: DS DPB_SZ ;ALLOCATION FOR DRIVE #D(DD) erNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN_;NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN%eNNNNNNNNNNNNNNNNNNNNN!ARD DISK PHYSICAL DRIVE 0 ; C SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 1 ; D SIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 1 ; E2NNNNNNNNNNNNNNNNN+jNNNNNNNNNNNNNNNNNNNNNNARD DISK PHYSICAL DRIVE 1 ; G JADE 8" FLOPPY PHYSICAL DRIVE 0 ; H JADE 8" FLOPPY PHYSICAL DRIVE 1 ENDIF ; ;*********NNNNNNNNNNNNNNNNN*NNNNNNNNNNNNNNNNNNNNN!D) D#D(DD)ALL: DS 128 ;ALLOCATION BIT MAP FOR 8" HARD DRIVE #D(DD) ENDIF IF ((DD - 1) >= ST8FD) AND ((DD - 1) <= ND8FD)SHNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN DPB_BLM DS 1 ;BLM- BLOCK MASK ; 1K = 7, 2K= 15, 4K= 31, 8K= 63, 16K= 127 DPB_EXM DS 1 ;EXM- EXTENT MASK ; DSM < 256 :ЫNNNNNNNNNNNNNNNNoyNNNNNNNNNNNNNNNNNNNNNN_PHM DS 1 ;PHM- PHYSICAL RECORD MASK BASED ON BYTES/SEC ; 0: 128, 1: 256, 3: 512, 7: 1024 ; ; ADDITIONAL DISK PARTITIONI NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN LIST OFF ENDM ; ; RESERVE THE DATA SPACE ; DD DL 1 REPT NDRVS LIST OFF ALLDPB 0123456789ABCDEF DD DL DD + 1 LInrNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN JNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN&6NNNNNNNNNNNNNNNNNNNNNN JADE 8" FLOPPY PHYSICAL DRIVE 0 ; F JADE 8" FLOPPY PHYSICAL DRIVE 1 ENDIF IF BOOT = 3 ; A JADE 8" FLOPPY PHYSICALhNNNNNNNNNNNNNNNN,NNNNNNNNNNNNNNNNNNNNNN******************************************************************* ; ; REVISION HISTORY: ; ; 3.00 - 26 JAN 87 GRH ; Im4rNNNNNNNNNNNNNNNN%NNNNNNNNNNNNNNNNNNNNNN D#D(DD)ALL: DS 57 ;ALLOCATION BIT MAP FOR 8" DRIVE #D(DD) D#D(DD)CHK DS 32 ;DIRECTORY CHECKSUMS STORAGE (1 BYTE PER SECTORHNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN 1K= 0, 2K= 1, 4K= 3, 8K= 7, 16K= 15 ; DSM > 255 : 2K= 0, 4K= 1, 8K= 3, 16K= 7 DPB_DSM DS 2 ;DSM- DRIVE STORAGE SIZE (IN CL'NNNNNNNNNNNNNNNNN\HNNNNNNNNNNNNNNNNNNNNNNNG DATA FOR THE LOGICAL DRIVE SELECTION. ; PARTITIONING BY TRACKS ARE IMPLIMENTED THRU BDOS USING DPBOFF ABOVE. ; PARTITIONINGS NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!ST ON ENDM ; ; BLOCKING BUFFER ; BLKBUF: DS 1024 ;HOST BUFFER IF (($ - 8000H) > 07700H) OR ($ < 8000H) CONMSsNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNN!yNNNNNNNNNNNNNNNNNNNNNN TITLE CUSTOMIZED BIOS FOR M5B LIST NOCOND BOOT EQU 10H ;10H: SA1004, 11H: PYX27, 3: 8" FLOPPY, 20H: 5" FLOPPY ;************NNNNNNNNNNNNNNNNN'NNNNNNNNNNNNNNNNNNNNN! DRIVE 0 ; B JADE 8" FLOPPY PHYSICAL DRIVE 1 ; C SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 0 ; D SIDE 2 & 3 OF HARD DISK PHNNNNNNNNNNNNNNNN-NNNNNNNNNNNNNNNNNNNNNNor & track. At same time, fix bug ; which did not specify the logon track. ; 3.02 7 JUL 88 GRH ; Add '?' to include file NNNNNNNNNNNNNNNNNeNNNNNNNNNNNNNNNNNNNNNN than swapping Roms itself. ; 3.07 11-25-90 GRH ; Modify for Ver. 1.22 Monitor. ; Fix bug in 8" Hard Disk table which benig@frNNNNNNNNNNNNNNNN {NNNNNNNNNNNNNNNNNNNNN!rom ; DCM8 to CBIOS. ; Remove IOPB ptr passing in IX redundancy. ; Change DPB track-head shift factor to Sector Offset like cBNNNNNNNNNNNNNNNN[NNNNNNNNNNNNNNNNNNNNNNuffer for ; ID sector read. ; 9-20-91 GRH Fold in redlines. ; 10-21-91 GRH Fix bugs ; 10-22-91 GRH Fix bugs ; 1NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN ;============================================================================ ; ; CONDITIONAL ASSEMBLY FLAGS ; ;=========7oNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNRESSES ; ;============================================================================ ; SYS EQU 2 ;CP/M VERSION {2,3} ; NъNNNNNNNNNNNNNNNN%NNNNNNNNNNNNNNNNNNNNNNNRSV EQU PAGE0 + BFUNRST BFUNRSI EQU 0C7H + BFUNRST ;=====================================================================uNNNNNNNNNNNNNNNNN+NNNNNNNNNNNNNNNNNNNNNN;E DSK_5 EQU 10H ;F NDRVS: EQU 6 ENDIF IF BOOT = 11H ; ; 5.25" PYX-27 BOOT ; DSK_0 EQU 11H ;A DSK_1 EQU 10H ;B  NNNNNNNNNNNNNNNNTNNNNNNNNNNNNNNNNNNNNNNT to new configuration. ; 3.06 1-28-89 GRH ; Revised primitive calling procedures to use the monitor rom function ; ratherSNNNNNNNNNNNNNNNN HNNNNNNNNNNNNNNNNNNNNNNad shift factor to DPBs for future use. ; 3.09 5-15-91 GRH ; Change 8" floppy side select to track bit 0. Move calculation f?NNNNNNNNNNNNNNNNNhNNNNNNNNNNNNNNNNNNNNNN Patch problems with partitioning until 20MB drive installed. ; Fix TPA corruption by LOGON problem by using ROMBNK sector b&`dNNNNNNNNNNNNNNNNN(NNNNNNNNNNNNNNNNNNNNNNAMETERS ; ;============================================================================ ; FALSE EQU 0 TRUE EQU NOT FALSE odNNNNNNNNNNNNNNNN-NNNNNNNNNNNNNNNNNNNNN!F LIST ON ;============================================================================ ; ; DISK OPERATING SYSTEM ADDxNNNNNNNNNNNNNNNNN$NNNNNNNNNNNNNNNNNNNNNNOOT DRIVE # FROM PROM DEFBFR EQU PAGE0 + 80H ;DEFAULT BUFFER ; ; BIOS FUNCTION CALL RESTART VECTOR ; BFUNRST EQU 28H BFU(NNNNNNNNNNNNNNNNN*NNNNNNNNNNNNNNNNNNNNN! BOOT = 20H ; ; 5.25" FLOPPY BOOT ; DSK_0 EQU 20H ;A DSK_1 EQU 20H ;B DSK_2 EQU 20H ;C DSK_3 EQU 20H ;D DSK_4 EQU 10H mNNNNNNNNNNNNNNNNN0gNNNNNNNNNNNNNNNNNNNNNN============================================================ ; LF: EQU 0AH CR: EQU 0DH CTRLZ: EQU 1AH ;@@@@@@@@@@@@@@@@NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNˁe3΅i7҉m;֍sAܑxF╯~L虶R W%\+ƦNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; GENERATE THE TRANSLATION TABLE MACRO ; ;@@@@@@@@@@@@@@@@@@@@NNNNNNNNNNNNNNNNNUNNNNNNNNNNNNNNNNNNNNNN@@@@@@@@@@@@@@@@@@@@@@@@@@ ; PVERS MACRO #VERS DD DL #VERS IF DD > 9999 DB (DD / 10000) + '0' DD DL DD % 10000 END3BNNNNNNNNNNNNNNNN LNNNNNNNNNNNNNNNNNNNNNNJP SETTRK ;SET TRACK # JP SETSEC ;SET SECTOR # JP SETDMA ;SET TRANSFER ADDR JP DISKRD ;PERFORM DISK READ JP DISKWR SNNNNNNNNNNNNNNNNlNNNNNNNNNNNNNNNNNNNNNN ;BIOS MODULE LOAD ADDR FOR SBD ; ; CONTINUE ON WITH INIT ; INIT1: JR INIT ;########################################LNNNNNNNNNNNNNNNN)NNNNNNNNNNNNNNNNNNNNNN LD (THIS_STK),SP EI ; ; INIT DEFAULT DRIVE ; LD A,(DK_BDRV) ;USE DRIVE # PASSED IN PAGE 0 AND A,3 LD (DEFDRV),A 2NNNNNNNNNNNNNNNNN)NNNNNNNNNNNNNNNNNNNNN!##### ; ; SIGN-ON MESSAGE ; ;############################################################################ ; MSGSO: DB CR,LgQNNNNNNNNNNNNNNNN%NNNNNNNNNNNNNNNNNNNNNND (THIS_STK),SP EI ; ; INIT OUR STUFF ; XOR A,A LD (BUF_ACT),A ;ASSUME NO DATA IN BUFFER ; LD (UNA_CNT),A ;CLEAR UpNNNNNNNNNNNNNNNNNN+NNNNNNNNNNNNNNNNNNNNNN_SBDSS) ;PREFETCH BDOS TRK/SECTOR PUSH HL ; LD HL,(DEFBFR + BD_SCCPS) ;FETCH CCP TRK/SECTOR LD C,L LD B,0 CALL SETSECBNNNNNNNNNNNNNNNN\NNNNNNNNNNNNNNNNNNNNN!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; GXLATE MACRO #SECTORS, #SKEW LIST OFF NXTSEC DL 1 ;;START WITHPHNNNNNNNNNNNNNNNNNkNNNNNNNNNNNNNNNNNNNNNNIF IF DD > 999 DB (DD / 1000) + '0' DD DL DD % 1000 ENDIF DB (DD / 100) + '0' DB '.' DB ((DD % 100) / 10) + '0'$NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN;PERFORM DISK WRITE JP LISTST ;RETURN LIST STATUS JP SECTRN ;TRANSLATE SECTOR JP BIOFUNC ;EXECUTE FUNCTION CALL ;#rNNNNNNNNNNNNNNNNuNNNNNNNNNNNNNNNNNNNNN!#################################### ; ; DIRECTORY SECTOR BUFFER STARTS HERE AFTER CRUNCHING COLD START ; CODE. THIS BUFFER 9NNNNNNNNNNNNNNNNzNNNNNNNNNNNNNNNNNNNNN!; ; SEND SYSTEM SIGN-ON ; LD HL,MSGSO CALL EDITOR ; ; MODIFY COLD START VECTOR TO WARM START ; LD HL,(BIOS+4) L9*NNNNNNNNNNNNNNNNN <$NNNNNNNNNNNNNNNNNNNNNNF DB CPMSZ / (KBYTE * 10) + '0' DB (CPMSZ MOD (KBYTE * 10)) / KBYTE + '0' DB 'K CP/M-80 Vers 2.2',CR,LF DB 'M5b CBIOS NNNNNNNNNNNNNNNNNN&NNNNNNNNNNNNNNNNNNNNNNNALLOCATED SECTOR COUNT ; LD (BUF_MOD),A ;CLEAN BUFFER ; LD HL,BLKBUF ;INIT BUFFER PTR LD (BUF_DMA),HL ; ; LOG ON DRNNNNNNNNNNNNNNNN,yINNNNNNNNNNNNNNNNNNNNNN ; LD C,H CALL SETTRK ; LD BC,CCP CALL SETDMA ; ; READ CCP/BDOS ; WREAD: CALL DISKRD JR NZ,WEROR ;IF ERROR THEgrNNNNNNNNNNNNNNNNoNNNNNNNNNNNNNNNNNNNNN! SECTOR 1 LOWEST DL 1 ;; REPT #SECTORS LIST ON DB NXTSEC LIST OFF NXTSEC DL NXTSEC + #SKEW ;ADD SKEW FACTOR ;; I&NNNNNNNNNNNNNNNNN ZNNNNNNNNNNNNNNNNNNNNNN DB (DD % 10) + '0' ENDM SUBTTL BIOS CODE ORG BIOS ;---------------------------------------------------------------UNNNNNNNNNNNNNNNNN*NNNNNNNNNNNNNNNNNNNNN!########################################################################### ; ; THE FOLLOWING BOOT DATA MUST RESIDE AS DEFINEDG$ NNNNNNNNNNNNNNNNDNNNNNNNNNNNNNNNNNNNNN!IS USED BY THE CP/M DIRECTORY CHECK ROUTINES THAT ; CHECK FOR DISK CHANGE. ; ;##############################################rBNNNNNNNNNNNNNNNNKNNNNNNNNNNNNNNNNNNNNN!D (BIOS+1),HL ; ; INIT OUR STUFF ; CALL GETBNK LD (BUF_DMAB),A ; ; INITIALIZE CLOCK VECTORS IF CLOCK INSTALLED ; NNNNNNNNNNNNNNNNN!NNNNNNNNNNNNNNNNNNNNNN Vers ' PVERS VERSN DM CR,LF IF $ > (DIRBF + 128) CONMSG **** WARNING! COLD INIT CODE BIGGER THAN DIR BUFFER ***NNNNNNNNNNNNNNNNN'NNNNNNNNNNNNNNNNNNNNNNIVE TO INIT TABLES ; LD A,(DK_BDRV) AND A,3 ;MODULO 4 LD C,A LD E,0 CALL SELDSK LD A,L ;IF ERROR THEN ABORT OR "NNNNNNNNNNNNNNNN-JxNNNNNNNNNNNNNNNNNNNNNNN EXIT ; ; NEXT SECTOR ; LD HL,CPM_SEC INC (HL) ; LD DE,128 ;DMA += SECTOR SIZE LD HL,(CPM_DMA) ADD HL,DE LD NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNF NXTSEC > #SECTORS ;CHECK FOR OVERFLOW NXTSEC DL NXTSEC - #SECTORS ;; IF NXTSEC <= LOWEST ;CHECK FOR REPEAT NXTSEC DL LOtNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN------------- ; ; BIOS JUMP VECTOR TABLE ; ;---------------------------------------------------------------------------- 99NNNNNNNNNNNNNNNNN9NNNNNNNNNNNNNNNNNNNNN! RIGHT BEFORE THE COLD ; INIT ROUTINE START AND MUST BE IN THE 1ST SECTOR. THESE 2 WORDS ARE ; REFERENCED BY THE BOOT LOADER CHNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN############################## ; DIRBF: EQU $ ;BUFFER BEGINNING ;-------------------------------------------------------HNNNNNNNNNNNNNNNNN|NNNNNNNNNNNNNNNNNNNNNN LD A,MF_CSYN ;TEST FOR BOARD PRESENT CALL XMROM ; ; IF CLOCK PRESENT THEN TURN ON CLOCK DRIVE ; OR A,A LD A,38H ;CO[rNNNNNNNNNNNNNNNN"ZFNNNNNNNNNNNNNNNNNNNNN!* ELSE DS DIRBF + 128 - $ ;FILL OUT DIRECTORY BUFFER TO 1 SECTOR SIZE ENDIF ;------------------------------------]NNNNNNNNNNNNNNNNN(NNNNNNNNNNNNNNNNNNNNNNA,H JR Z,WEROR ; ; READ BOOT DIRECTORY ; LD BC,DEFBFR ;SET XFER ADDRESS (USE DEFAULT BUFFER) CALL SETDMA ; LD BC,NNNNNNNNNNNNNNNNNN.+NNNNNNNNNNNNNNNNNNNNN!(CPM_DMA),HL ; ; IF NOT INTO BDOS THEN READ NEXT SECTOR ; LD DE,BDOS XOR A,A SBC HL,DE JR C,WREAD ; ; ELSE IF A{HNNNNNNNNNNNNNNNNN7NNNNNNNNNNNNNNNNNNNNNNWEST + 1 LOWEST DL NXTSEC ENDIF ENDIF ;; ENDM LIST ON ENDM ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@HNNNNNNNNNNNNNNNNN 8NNNNNNNNNNNNNNNNNNNNN!; JP INIT1 ;COLD START ENTRY JP WARM ;RELOAD CCP/BDOS JP CNSCK ;GET CONSOLE STATUS JP CI ;CONSOLE INPUT JP COC ;C'NNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNODE IN ORDER TO DETERMINE THE LOAD ADDRESS ; AND LENGTH OF THE BIOS. ; ;#####################################################}NNNNNNNNNNNNNNNN&NNNNNNNNNNNNNNNNNNNNN!--------------------- ; ; INIT - COLD START ENTRY FROM BOOT MUST SET ALL BIOS PARAMS ; ;--------------------------------NNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNNND. JR (ON) JR Z,CLKON ; ; ELSE TURN OFF CLOCK DRIVE ; LD A,18H ;UNCOND. JR (OFF) (CAUSES JUMP TO ILLEGAL) ; CLKON: NNNNNNNNNNNNNNNN#iwNNNNNNNNNNNNNNNNNNNNNN---------------------------------------- ; ; WARM REBOOT ENTRY LOADS CCP,BDOS FROM DISK & SETS UP VARIABLES ; ;-------------"INNNNNNNNNNNNNNNNN)NNNNNNNNNNNNNNNNNNNNNN,BD_SEC ;SET DIRECTORY SECTOR CALL SETSEC ; LD BC,0 ;SET TRACK TO 0 CALL SETTRK ; CALL DISKRD JR NZ,WEROR ; ; CNNNNNNNNNNNNNNNNN/,NNNNNNNNNNNNNNNNNNNNNNT BEGINNING OF BDOS THEN SET UP NEW TRACK & SECTOR ; JR Z,RDBDOS ; ; ELSE IF NOT AT BIOS THEN READ NEXT SECTOR ; LD DEMrNNNNNNNNNNNNNNNNdNNNNNNNNNNNNNNNNNNNNNN@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; INITIALIZE VERSION TEXT IN RAM MACRO ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@gBNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNONSOLE OUTPUT JP LO ;PRINTER OUTPUT JP PUNCH JP READER JP HOME ;HOME SELECTED DRIVE JP SELDSK ;SELECT DISK DRIVE =NNNNNNNNNNNNNNNNNN_NNNNNNNNNNNNNNNNNNNNNN####################### ; DB 0 ;Z80 CPU DB 0 ;SPARE BIOSSZ: DW BIOSND - BIOS ;BIOS MODULE SIZE IN BYTES BIOSST: DW BIOSNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!-------------------------------------------- ; INIT: ; ; SET TEMPORARY STACK ; DI LD SP,DEFBFR ;USE PAGE 0 FOR STACK *NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNLD (INHCLK),A ; ; BOOT CCP & BDOS ; JR WARM ;#######################################################################־NNNNNNNNNNNNNNNNN$NNNNNNNNNNNNNNNNNNNNNN--------------------------------------------------------------- ; WARM: ; ; SET TEMPORARY STACK ; DI LD SP,DEFBFR L\NNNNNNNNNNNNNNNN*NNNNNNNNNNNNNNNNNNNNN!HECK FOR VALID BOOT DIRECTORY ; LD A,(DEFBFR) CP A,86H JR C,WEROR ; ; SET UP TO LOAD CCP/BDOS ; LD HL,(DEFBFR + BDasNNNNNNNNNNNNNNNNN0?WNNNNNNNNNNNNNNNNNNNNNN,BIOS - BDOS SBC HL,DE JP C,WREAD ; ; ELSE DONE READING SYSTEM ; JR WZRPG ; ; ; ELSE SET UP & READ BDOS ; RDBD'NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN΁h6҅o= ؉s@ۍxF⑰~L蕶R Y&^,Ǣb0̦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOS: POP HL ;RESTORE BDOS TRK/SECTOR FROM DIRECTORY LD C,L LD B,A ;A STILL CONTAINS 0 CALL SETSEC ; LD C,H CALL SETTdFNNNNNNNNNNNNNNNNN[,NNNNNNNNNNNNNNNNNNNNNN + 7) LD (BDOSV),HL ; ; NOW PUT INTERCEPT VECTOR INTO BDOS CODE ; LD HL,INTCPT LD (BDOS + 7),HL ENDIF ; ; PASSrNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN INC A LD (READOP),A ; ; PRE-READ_OF_DATA_FLAG = TRUE ; LD (RSFLAG),A ; ; TREAT AS UNALLOCATED BLOCK ; LD A,WRUANNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN ; PUSH IY LD IY,(CUR_DPB) ; ; IF NOT BLOCKED THEN USE CPM WRITE ; LD A,(IY + DPB_PSH) ;0= 128-BYTE SECTORS OR A,A 9rNNNNNNNNNNNNNNNN{PNNNNNNNNNNNNNNNNNNNNNN A,A JP Z,ALLOC ; ; ELSE MORE UNALLOCATED RECORDS REMAIN, COUNT-- ; DEC A LD (UNA_CNT),A ; ; IF REQUESTED SECTOR -NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNS UNNECESSARY READ ; XOR A,A ;PREREAD FLAG = FALSE LD (RSFLAG),A JP RWOPER ; ; ; NORMAL NON-BLOCKED WRITE ; DISKWr!rNNNNNNNNNNNNNNNN%;NNNNNNNNNNNNNNNNNNNNNNC A JP NZ,SECSHFLP ; NOSECSHF: INC HL ;SET BACK TO PHYSICAL SECTOR LD (BUF_PSEC),HL ;BUFFER PHYSICAL SECTOR TO ACCESS {HNNNNNNNNNNNNNNNNN+NNNNNNNNNNNNNNNNNNNNN!HE SECTOR BUFFER ; LD A,(CPM_DSK) ;BUFFER SECTOR = PHYSICAL SECTOR LD (BUF_DSK),A ; LD HL,(CPM_TRK) LD (BUF_TRK),HL ;NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNRK ; JR WREAD ; ; ; WARM BOOT ERROR, OUTPUT MSG & GO TO DEBUGGER ; WEROR: LD HL,MSGLE ;OUTPUT ERROR MESSAGE CALL EDINNNNNNNNNNNNNNNNNKNNNNNNNNNNNNNNNNNNNNNN DEFAULT DISK TO CCP ; LD A,(DEFDRV) LD C,A JP CCP SUBTTL BIOS DISK FUNCTION ROUTINES ;+++++++++++++++++++++++++++NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNL LD (WRTYPE),A ; JP RWOPER ;TO PERFORM THE READ ; ; ; NORMAL NON-BLOCKED READ ; DISKRDN: CALL CPM_RD JP RW_RETNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNN! JP Z,DISKWRN ; ; READ_OP_FLAG = FALSE ; XOR A,A LD (READOP),A ; ; SAVE WRITE TYPE ; LD A,C LD (WRTYPE),A ; NNNNNNNNNNNNNNNN.NNNNNNNNNNNNNNNNNNNNNN!= UNALLOCATED SECTOR THEN PURGE ; LD A,(CPM_DSK) ;SAME DISK? LD HL,UNA_DSK CP A,(HL) JR NZ,ALLOC ; LD HL,(UNA_TRK) 2NNNNNNNNNNNNNNNNN ]NNNNNNNNNNNNNNNNNNNNNNRN: CALL CPM_WR JP RW_RET ; ; ; NOT AN UNALLOCATED RECORD, REQUIRES PRE-READ ; ALLOC: XOR A,A ;COUNT = 0 LD (UNA#NNNNNNNNNNNNNNNN&nNNNNNNNNNNNNNNNNNNNNNN; ; IF BUFFER == EMPTY THEN READ THE PHYSICAL SECTOR ; LD HL,BUF_ACT LD A,(HL) ; LD (HL),1 ;BUFFER = ACTIVE IN ANY CDNNNNNNNNNNNNNNNN,0NNNNNNNNNNNNNNNNNNNNNN LD HL,(BUF_PSEC) LD (BUF_SEC),HL ; ; IF REQUIRED TO READ THEN READ ; LD A,(RSFLAG) ;NEED TO READ? OR A,A CALL NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNTOR CALL MR_BRK HALT ; ; ; BOOT OK, INIT PAGE 0 ; WZRPG: ; ; INIT BIOS WARM START IN PAGE 0 ; LD A,0C3H LD HZNNNNNNNNNNNNNNNNN x#NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++++++++++ ; ; READ A DISK SECTOR ; EXIT - A= 0: OK; /0: ERROR ; ;++++++++++++++++++tHNNNNNNNNNNNNNNNNN҅NNNNNNNNNNNNNNNNNNNNNN ;**************************************************************************** ; ; WRITE DISK SECTOR FUNCTION ; ENTRY- CrNNNNNNNNNNNNNNNN>=NNNNNNNNNNNNNNNNNNNNNN ; IF 1ST WRITE TO UNALLOCATED (NEW, UNUSED) BLOCK THEN SET PARAMETERS ; CP A,WRUAL JP NZ,CHKUNA ; ; COUNT = NUMBER_ONNNNNNNNNNNNNNNNN2NNNNNNNNNNNNNNNNNNNNNN;SAME TRACK? LD DE,(CPM_TRK) SBC HL,DE JR NZ,ALLOC ; LD HL,(CPM_SEC) LD DE,(UNA_SEC) SBC HL,DE JR NZ,ALLOC ; ; NNNNNNNNNNNNNNNNN!lNNNNNNNNNNNNNNNNNNNNNN_CNT),A ; INC A ;PREREAD FLAG = TRUE LD (RSFLAG),A ; ; ; ; COMMON CODE FOR READ AND WRITE FOLLOWS ; RWOPER: ; ; gNNNNNNNNNNNNNNNNN']NNNNNNNNNNNNNNNNNNNNNNASE ; OR A,A JR Z,FILHST ; ; HOST BUFFER ACTIVE, SAME AS SEEK BUFFER? ; LD A,(CPM_DSK) LD HL,BUF_DSK ;SAME DISK? =NNNNNNNNNNNNNNNN-NNNNNNNNNNNNNNNNNNNNNNZ,BUF_RD ;YES, IF 1 ; ; BUFFER = CLEAN ; XOR A,A LD (BUF_MOD),A ; MATCH: ; ; COPY DATA TO OR FROM BUFFER ; LD;>NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNL,BIOS + 3 LD (PAGE0),A LD (PAGE0 + 1),HL ; ; INIT BDOS CALL VECTOR IN PAGE 0 ; LD HL,BDOS + 6 LD (BDOSJV),A LD (>NNNNNNNNNNNNNNNNN -pNNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; DISKRD: ; ; SET UP DATA TABLE PTRS ; PUSH IX LD IX,(CUR_wNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN= WRITE TYPE: ; 0: WRITE TO ALLOCATED BLOCK (UPDATE) ; 1: WRITE TO DIRECTORY BLOCK (ALLWAYS WRITE) ; 2: WRITE TO UNALLONNNNNNNNNNNNNNNNknNNNNNNNNNNNNNNNNNNNNNNF_SECTORS_IN_BLOCK ; LD A,(IY + DPB_BLM) ;CUR_DPB.DPBBLM + 1 ::= (BLKSIZ/128) INC A LD (UNA_CNT),A ; ; SET DISK TO SE9eNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN MATCH, MOVE TO NEXT SECTOR FOR FUTURE REF ; EX DE,HL ;UNASEC += 1 INC HL LD (UNA_SEC),HL ; ; IF PAST LAST SECTOR O{NNNNNNNNNNNNNNNN"?NNNNNNNNNNNNNNNNNNNNNN ASSUME NO ERRORS ; XOR A,A LD (IOPB + PB_STATO),A ; ; COMPUTE BUFFER SECTOR ; LD HL,(CPM_SEC) DEC HL ;CONVERT *NNNNNNNNNNNNNNNNN(MNNNNNNNNNNNNNNNNNNNNNN CP A,(HL) JR NZ,NOMATCH ; LD HL,(BUF_TRK) ;SAME TRACK? LD DE,(CPM_TRK) SBC HL,DE JR NZ,NOMATCH ; LD DE,(BUF_PSEC)#NNNNNNNNNNNNNNNNNN.RNNNNNNNNNNNNNNNNNNNNNN HL,(CPM_SEC) ;CALCULATE INDEX INTO BUFFER DEC HL ;CONVERT TO LOGICAL SECTOR (0..N-1) LD A,L ; AND A,(IY + DPB_PHM) ;UUNNNNNNNNNNNNNNNNN=NNNNNNNNNNNNNNNNNNNNNNNBDOSJV + 1),HL ; ; INIT BIOS CALL VECTOR IN PAGE 0 ; LD HL,BIOFUNC LD (BFUNRSV),A LD (BFUNRSV + 1),HL ; ; SET DEF}NNNNNNNNNNNNNNNNN ANNNNNNNNNNNNNNNNNNNNNNDDT) ; PUSH IY LD IY,(CUR_DPB) ; ; IF NOT BLOCKED THEN USE CPM READ ; LD A,(IY + DPB_PSH) ;0= 128-BYTE SECTORS OR k[NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNCATED BLOCK (NO NEED TO PRE-READ) ; ;**************************************************************************** ; DISKWR: NNNNNNNNNNNNNNNNX_NNNNNNNNNNNNNNNNNNNNNNEK ; LD A,(CPM_DSK) LD (UNA_DSK),A ; ; SET TRACK TO SEEK ; LD HL,(CPM_TRK) LD (UNA_TRK),HL ; ; SET SECTOR TO SNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN TRACK THEN USE 1ST SECTOR OF NEXT TRACK ; LD E,(IY + DPB_SPT) LD D,(IY + DPB_SPT +1) SBC HL,DE JP C,NOOVF ; LD HL, -> BITS <14..8> LD H,A ; LD A,0 ;BIT 0 -> BIT 7 RRA LD;NNNNNNNNNNNNNNNNhNNNNNNNNNNNNNNNNNNNNN!AULT SECTOR BUFFER ; LD BC,DEFBFR CALL SETDMA ; IF INTCPTS ; ; PUT BDOS VECTOR INTO INTERCEPT CODE ; LD HL,(BDOSNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNA,A JP Z,DISKRDN ; ; READS DON'T NEED ALLOCATION ; XOR A,A LD (UNA_CNT),A ; ; READ_OPERATION_FLAG = TRUE (1) ; BNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN ; ; REMOVE BOOT WRITE PROTECTION ; XOR A,A LD (WR_PROT),A ; ; SET PTRS TO DISK DATA ; PUSH IX LD IX,(CUR_DDT) dNNNNNNNNNNNNNNNNNHaNNNNNNNNNNNNNNNNNNNNN!EEK ; LD HL,(CPM_SEC) LD (UNA_SEC),HL ; ; IF NO UNALLOCATED SECTORS REMAIN THEN PREREAD ; CHKUNA: LD A,(UNA_CNT) ORrNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!0 ;SECTOR = 1 LD (UNA_SEC),HL ; LD HL,(UNA_TRK) ;TRACK++ INC HL LD (UNA_TRK),HL ; NOOVF: ; ; MATCH FOUND, MARK AbNNNNNNNNNNNNNNNNN$NNNNNNNNNNNNNNNNNNNNN!S JP Z,NOSECSHF ;IF ALREADY 0 THEN SECTOR SIZE IS 128 ; SECSHFLP: SRL H ;ELSE SHIFT OVER TO PHYSICAL SECTOR RR L DENNNNNNNNNNNNNNNNN*+NNNNNNNNNNNNNNNNNNNNNNOUT BEFORE READING NEW ONE ; CALL BUF_FLSH ;CLEAR HOST BUFF ; JR NZ,RW_RET ;IF ERROR THEN ABORT ; FILHST: ; ; READ TNNNNNNNNNNNNNNNNN0.NNNNNNNNNNNNNNNNNNNNNN L,A ; ; HL HAS RELATIVE HOST BUFFER ADDRESS ; LD DE,BLKBUF ADD HL,DE ;HL = HOST ADDRESS ; LD DE,(CPM_DMA) ;GET/PUT$NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNˁe2΅j9ԉo< ׍tBߑzG╯}J晴Q읹V$򡿢[)ŦNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNƺNNNNNNNNNNNNNNNNNNNNN! CP/M DATA LD BC,128 ;LENGTH OF MOVE ; LD A,(READOP) ;WHICH WAY? OR A,A JP NZ,RWMOVE ;SKIP IF READ ; ; WRITE OPERAIHNNNNNNNNNNNNNNNNNlNNNNNNNNNNNNNNNNNNNNN! ;WRITE TO DISK ; LD A,(IOPB + PB_STATO) ;RETURN ANY ERRORS ; ; DONE, RESTORE & RETURN ; RW_RET: OR A,A ;SET RESULT S6lNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNN!YSICAL READ FROM THE DISK INTO CPM_DMA, ; WITHOUT BLOCKING. ; ENTRY- (CPM_DSK)= DISK # TO READ FROM ; (CPM_TRK)= TRACK # TO ~NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNCTOR # TO READ FROM ; (CPM_DMA)= XFER ADDRESS ; IX= DDT PTR ; IY= DPB PTR ; EXIT - (IOPB.PB_STATO)= 0: OK, /0: ERROR ; NNNNNNNNNNNNNNNNL`NNNNNNNNNNNNNNNNNNNNNN ; RET ;**************************************************************************** ; ; BUF_FLSH FLUSHES THE BUFFER DA#+NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNLEAN BUFFER ; LD (BUF_MOD),A RET ;**************************************************************************** ; ; B>jNNNNNNNNNNNNNNNN% NNNNNNNNNNNNNNNNNNNNN!ROM ; IX= DDT PTR ; IY= DPB PTR ; EXIT - (IOPB.PB_STATO)= 0: OK, /0: ERROR ; ;*******************************************Ҙ'NNNNNNNNNNNNNNNNN+/NNNNNNNNNNNNNNNNNNNNNN;DRIVE IS STILL IN C REGISTER ; ; IF DRIVE ERROR THEN RETURN (HL= 0) ; RET NZ ; ; ELSE SAVE PTR ; LD (CUR_DDT),HL dNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNTION, MARK AND SWITCH DIRECTION ; LD A,1 ;BUFFER = DIRTY LD (BUF_MOD),A ; ; SAVE BUFFER DATA PTRS FOR LATER FLUSHES ;'NNNNNNNNNNNNNNNNN|"NNNNNNNNNNNNNNNNNNNNNNTATUS FLAG POP IY POP IX ; RET ;**************************************************************************** ; ; CNNNNNNNNNNNNNNNNքNNNNNNNNNNNNNNNNNNNNNNREAD FROM ; (CPM_SEC)= SECTOR # TO READ FROM ; (CPM_DMA)= XFER ADDRESS ; EXIT - (IOPB.PB_STATO)= 0: OK, /0: ERROR ; ;****srNNNNNNNNNNNNNNNN:NNNNNNNNNNNNNNNNNNNNNND (IY + DPB_SKT),0 ;ASSUME NO SKEW ; ; ATTEMPT TO READ ID SECTOR ; CALL BUF_FLSH ;FLUSH BUFFER 1ST JR NZ,LOGERR ; CAdNNNNNNNNNNNNNNNNN-NNNNNNNNNNNNNNNNNNNNNNFLOPPY THEN ASSUME 3740 TRANSLATION ; LD A,(BLKBUF + ID_FLGO) AND A,[1 SHL DF_DTDB] OR [1 SHL DF_HARDB] CALL Z,TR8 ; ; /PrNNNNNNNNNNNNNNNN SNNNNNNNNNNNNNNNNNNNNNNIX + DDT_HDS),A ; ; RETURN DRIVE TABLE PTR ; LD HL,(CUR_DPH) XOR A,A ;RETURN NO-ERROR JR LGDONE ; ; ; NO ID SECNNNNNNNNNNNNNNNNNN/NNNNNNNNNNNNNNNNNNNNN! TRK 0 ; EXIT - BC= 0 ; ;**************************************************************************** ; HOME: ; ; IF PE)rNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNN!**************** ; SETSEC: LD (CPM_SEC),BC RET ;*********************************************************************p;dNNNNNNNNNNNNNNNNNBNNNNNNNNNNNNNNNNNNNNNN IF NO TRANSLATION THEN RETURN SECTOR++ ; LD A,D ;IF TABLE ADDR = 0 THEN NO TRANSLATION OR A,E JP Z,NOTRAN ; ; ELSENNNNNNNNNNNNNNNN%MNNNNNNNNNNNNNNNNNNNNN!DIR ; ; EXECUTE WITHOUT COMPENSATION ; JR LL_DO ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++!NNNNNNNNNNNNNNNNN+nNNNNNNNNNNNNNNNNNNNNNN++++ ; LL_WRIT: ; ; IF STILL PROTECTED THEN ERROR ; LD A,(WR_PROT) OR A,A JR NZ,DO_ERR ; ; INHIBIT UPLOAD ; 'PBNNNNNNNNNNNNNNNNmNNNNNNNNNNNNNNNNNNNNNNLL DISKLOG JR NZ,LOGERR ; ; IF NO ID SECTOR THEN USE DEFAULT DPB ; (NOTE: CONTROLLER HAS SET IT'S DISK DEFAULTS IN DEFBFR^HNNNNNNNNNNNNNNNNN=NNNNNNNNNNNNNNNNNNNNNN IF NO DYNAMIC SKEW TABLE SPECIFIED THEN TRANSLATION IS DONE ; LD A,(BLKBUF + ID_SKWO) LD (IY + DPB_SKT),A ;IF 0 THEN DISARHNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNTOR, USE DEFAULT DATA ; LGDEF: ; ; IF NOT HARD DISK THEN GO DO FLOPPY TEST ; BIT DDT_HDB,(IX + DDT_FLG) JR Z,LGCKFD !WBNNNNNNNNNNNNNNNN{NNNNNNNNNNNNNNNNNNNNNNNDING WRITE (BUFFER DIRTY) THEN IGNORE ; LD A,(BUF_MOD) OR A,A JR NZ,HOME2 ; ; ELSE PURGE BUFFER ; LD (BUF_ACT),A NNNNNNNNNNNNNNNNXNNNNNNNNNNNNNNNNNNNNNN******* ; ; SET TRANSFER ADDR ; ENTRY- BC= ADDRESS ; EXIT - A= ? ; ;******************************************************cNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN CALCULATE NEW SECTOR FROM TABLE ; EX DE,HL ADD HL,BC LD L,(HL) ; LD H,0 RET ; ; ; CONVERT FROM CP/M'S LOGICAL NNNNNNNNNNNNNNNN&ONNNNNNNNNNNNNNNNNNNNN!+++++++++ ; ; LOW LEVEL READ ; ENTRY- IX= DDT PTR ; IY= DPB PTR ; EXIT - IOPB.PB_STATO, A= STATUS ; ;+++++++++++++++++++.NNNNNNNNNNNNNNNN,NNNNNNNNNNNNNNNNNNNNN!LD A,1 SHL PB_INHX LD (IOPB + PB_FLGO),A ; ; CALCULATE DOWNLOAD BYTE COUNT ; LD A,(IY + DPB_PSH) ;USE SHIFT FACTOR {0:1NNNNNNNNNNNNNNNN\NNNNNNNNNNNNNNNNNNNNNN IN ALL CASES) ; ID SECTOR TYPES ARE: ; -1: NONE 0: OLD JADE DD ; 2: EXTENDED 3: PARTITIONED, 0-FILLED ; LD A,(IOPB + LNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNBLES SKEW ADDITION OR A,A JR Z,NO_SKW ; ; ELSE VALID SKEW TABLE ON DISK, TRANSFER TO SKEW BUFFER ; LD HL,BLKBUF ;CALCNNNNNNNNNNNNNNNNN1NNNNNNNNNNNNNNNNNNNNN!; ; ELSE USE HARD DISK DEFAULTS ; CALL TRNONE ; NO XLATE LD HL,HDPBK ; ; XFER DATA TO TABLES ; SEL2: LD DE,(CUR_:rNNNNNNNNNNNNNNNNHNNNNNNNNNNNNNNNNNNNNNN ; HOME2: ; ; JUST SET TRACK TO 0 ; LD BC,0 ; ; FALL INTO SET TRACK ; ;***************************************"NNNNNNNNNNNNNNNNNNkNNNNNNNNNNNNNNNNNNNNNN********************** ; SETDMA: LD (CPM_DMA),BC ; LD A,(BUF_DMAB) ;FETCH BANK ADDRESS SET BY COLD START LD (CPM_DMAB),A JNNNNNNNNNNNNNNNN!NNNNNNNNNNNNNNNNNNNNNNSECTOR {0..N-1} TO PHYSICAL SECTOR {1..N} ; NOTRAN: LD HL,1 ADD HL,BC RET SUBTTL DISK SUPPORT ROUTINES ;++++++++6gNNNNNNNNNNNNNNNNN'+~NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; LL_READ: ; ; ENABLE UPLOAD ; XOR A,A LD (IOPB + PB_FLGO),*J'NNNNNNNNNNNNNNNN-ĵNNNNNNNNNNNNNNNNNNNNNN28, 1:256, 2:512, 3:1024} LD HL,128 ;START WITH 128 BYTES ; AND A,3 ;LIMIT TO 1024-BYTE SECTORS ; JR Z,LL_WR2 ;IF SHIFBNNNNNNNNNNNNNNNNxNNNNNNNNNNNNNNNNNNNNNNPB_ST2O) CP A,-1 JR Z,LGDEF ; ; ELSE IF TYPE == 3 THEN OK ; CP A,3 JR NC,TYPE3_ID ; ; ELSE PAD UNINITIALIZED DANNNNNNNNNNNNNNNNN [NNNNNNNNNNNNNNNNNNNNNNULATE PTR TO TABLE LD E,A LD D,0 ADD HL,DE ; EX DE,HL ;CALCULATE BUFFER PTR LD HL,(CUR_DPB) LD BC,DPB_SKT ADD HLɰNNNNNNNNNNNNNNNNN|NNNNNNNNNNNNNNNNNNNNNNDPB) ; USE DEFAULT TABLE LD BC,DPB_SZ LDIR ; LD A,(HL) ;HEADS VALUE JR SEL1 ; ; ; USE 8" FLOPPY DEFAULTS ; LGCqD9NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN************************************* ; ; SET TRACK # ; ENTRY- BC= TRACK # ; ;*********************************************='NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN ; ; DONE ; RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; SECTOR TRANSLATIOdNNNNNNNNNNNNNNNN"ԋNNNNNNNNNNNNNNNNNNNNN!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; LOGON DISK FUNCTION ; ENTRY- IX= DDT PTR ; IY= DPBYNNNNNNNNNNNNNNNNN(;@NNNNNNNNNNNNNNNNNNNNN!A ; ; DISABLE DOWNLOAD ; LD HL,0 LD (IOPB + PB_BCNTO),HL ; ; PASS READ SECTOR COMMAND ; LD A,PB_READC JP LL_RWNNNNNNNNNNNNNNNNNN.NNNNNNNNNNNNNNNNNNNNNNT_FACTOR == 0 THEN DONE ; LL_WR3: ADD HL,HL ;DOUBLE COUNT DEC A JP NZ,LL_WR3 ; LL_WR2: LD (IOPB + PB_BCNTO),HL ; ; PHNNNNNNNNNNNNNNNNNKNNNNNNNNNNNNNNNNNNNNN!TA TO 0 ; LD HL,BLKBUF + ID_PSHO ;FILL DATA WITH 0S LD B,ID_FLGO - ID_PSHO ; PADIDL: LD (HL),0 INC HL DJNZ PADIDL ; ֨NNNNNNNNNNNNNNNNN hNNNNNNNNNNNNNNNNNNNNNN,BC EX DE,HL ; LD BC,SKTSZ LDIR ; NO_SKW: ; ; XFER DISK DATA TO DPB ; LD DE,(CUR_DPB) ;GET ADDR OF DPB LD HL,8NNNNNNNNNNNNNNNNNMNNNNNNNNNNNNNNNNNNNNN!KFD: CALL TR8 LD HL,SD8PBK JR SEL2 ; ; ERROR EXIT ; LOGERR: LD HL,0 ; ; DONE ; LGDONE: POP IY ;RESTORE REGS PONNNNNNNNNNNNNNNN.NNNNNNNNNNNNNNNNNNNNNN******************************* ; SETTRK: LD (CPM_TRK),BC RET ;******************************************************qNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNN FUNCTION ; ENTRY- DE= 0: NO XLATE, ELSE PTR TO XLATE TABLE ; BC= SECTOR # TO XLATE ; EXIT - HL= XLATED SECTOR OR BC + 1 ;NNNNNNNNNNNNNNNNN#NNNNNNNNNNNNNNNNNNNNNN PTR ; EXIT - A= 0: OK; /0: ERROR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; DISKLOG%NNNNNNNNNNNNNNNNN)qNNNNNNNNNNNNNNNNNNNNNN ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; LOW LEVEL WRITE ; ENTRY- IX= DDT PTR j$NNNNNNNNNNNNNNNNN/NNNNNNNNNNNNNNNNNNNNNNPASS WRITE COMMAND ; LD A,PB_WRITC ; ; FALL INTO COMMON CODE ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++D[ NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN ; PROCESS TYPE-3 ID SECTOR ; TYPE3_ID: ; ; ASSUME NO TRANSLATION AS DEFAULT ; CALL TRNONE ; ; IF SINGLE-DENSITY ՟NNNNNNNNNNNNNNNNN bNNNNNNNNNNNNNNNNNNNNNNBLKBUF + ID_SPTO LD BC,DPB_SZ - 1 LDIR ; ; XFER DISK PHYSICAL DATA TO TABLE ; LD A,(BLKBUF + ID_HEADS) ; SEL1: LD (ȻNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNP IX RET ;**************************************************************************** ; ; HOME DRIVE - TREAT AS SEEK@NNNNNNNNNNNNNNNNN>NNNNNNNNNNNNNNNNNNNNN!********************** ; ; SET SECTOR ; ENTRY- BC= SECTOR # ; ;************************************************************ NNNNNNNNNNNNNNNNsNNNNNNNNNNNNNNNNNNNNN! BC= UNCHANGED ; A, DE= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; SECTRN: ; ;7NNNNNNNNNNNNNNNNN$~-NNNNNNNNNNNNNNNNNNNNN!: ; ; SET UP READ IOPB ; LD A,(BUF_DMAB) LD (LOGIOPB + PB_DMAXO),A ; LD HL,LOGIOPB LD DE,IOPB LD BC,PB_STATO LHNNNNNNNNNNNNNNNNNN*]"NNNNNNNNNNNNNNNNNNNNNN ; IY= DPB PTR ; EXIT - IOPB.PB_STATO, A= STATUS ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++NNNNNNNNNNNNNNNNN0NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++ ; ; COMMON IOPB EXECUTER ; ENTRY- A= COMMAND ; IX= DRIVE TABLE PTR ; IY= DPB PTR ; ;+++++++++ޑNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNˁf3΅i7҉m;Սr?ܑyG╯~K虷S!Y'â^-ɦNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; LL_RW: LD (IOPB + PB_CMDO),A ; ; OFFSET SECTOR ; ʹNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!DIOB ;USE DISPLAY IOPB DATA FUNCTION CALL XMROM ; ; QUERY USER FOR OPTION ; LD HL,DSKEB CALL EDITOR ; ; GET USER 9NNNNNNNNNNNNNNNN cNNNNNNNNNNNNNNNNNNNNN!SAGE ; DO_ERR: LD HL,WP_ERM CALL EDITOR JR IOPBDMP ;*****************************************************************ZNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN++++++++++++++++ ; ; EXECUTE THE IOPB PRIMITIVE ; EXIT - A= 0: OK, /0: ERROR ; ;+++++++++++++++++++++++++++++++++++++++++++~NNNNNNNNNNNNNNNN:NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; JADE 8" FLOPPY DISK DRIVER FUNCTION ; ENTRY- IY= DRIVERNNNNNNNNNNNNNNNNNrNNNNNNNNNNNNNNNNNNNNNN POP HL LD DE,DPB_SKT ADD HL,DE ; LD DE,(IOPB + PB_SECO) ;SAVE CURRENT SECTOR FOR RESTORATION PUSH DE ; LD A,(IY + ]NNNNNNNNNNNNNNNN%z,NNNNNNNNNNNNNNNNNNNNN!TION DISPATCHER ; ENTRY- C= FUNCTION # ; EXIT - A= -1: ERROR, 0: OK ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++S!NNNNNNNNNNNNNNNNNN+Y#NNNNNNNNNNNNNNNNNNNNNN################################### ; ; BIOS FUNCTION TABLE ; ;#############################################################yzBNNNNNNNNNNNNNNNN]NNNNNNNNNNNNNNNNNNNNNNLD HL,(IOPB + PB_SECO) LD A,L ADD A,(IX + DDT_SOF) LD L,A LD A,H ADC A,(IX + DDT_SOF + 1) LD H,A LD (IOPB + PB_SECSNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNRESPONSE ; CALL CI ;GET USER RESPONSE ; PUSH AF ;SAVE CHAR LD C,A ;ECHO CHAR CALL COC CALL CRLF ;NEW LINE POP 2$NNNNNNNNNNNNNNNN0NNNNNNNNNNNNNNNNNNNNNN*********** ; ; SET 3740 SECTOR TRANSLATION PROCEDURE ; ENTRY- (CUR_DPH)= MUST BE PTR TO DPH ; EXIT - DE, HL= ? ; ;*******[rNNNNNNNNNNNNNNNNLNNNNNNNNNNNNNNNNNNNNN!+++++++++++++++++++++++++++++++++ ; XPRIM: ; ; EXECUTE THE PRIMITIVE IN ROM ; LD A,(BUF_DMAB) ;PRESET IOPB BANK LD E,gnrNNNNNNNNNNNNNNNNoNNNNNNNNNNNNNNNNNNNNN! TABLE PTR ; EXIT - A= 0: OK; /0: ERROR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; F# NNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNDPB_SKT) ;IF 1ST ENTRY == 0 THEN NONE OR A,A ; (ILLEGAL SECTOR) JR Z,NOSKEW ; DEC DE ;ELSE USE SECTOR TO INDEX INTO NNNNNNNNNNNNNNNN&/NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++ ; BIOFUNC: ; ; SELECT FUNCTION ; LD A,C CP A,1 JR C,RETVERS ; JR Z,RETDVRTF ; ; ERRO3$BNNNNNNNNNNNNNNNN,NNNNNNNNNNNNNNNNNNNNN!############### ; BFUNTBL: DW RETVERS ;0:RETURN VERSION # DW RETDVRTF ;1:RETURN DISK PHYSICAL CONFIGURATION TABLE PTR MA NNNNNNNNNNNNNNNNlNNNNNNNNNNNNNNNNNNNNNNO),HL ; ; SET PHYSICAL DRIVE ; LL_DO: LD A,(IX + DDT_DRV) LD (IOPB + PB_DRVO),A ; ; FETCH DRIVER VECTOR & EXECUTE DIUNNNNNNNNNNNNNNNNNN 9NNNNNNNNNNNNNNNNNNNNNNAF ; AND A,5FH ;INSURE UPPER CASE ; ; IF RETRY THEN TRY AGAIN ; CP A,'R' ;IF RETRY THEN RETURN TO CALLER JR Z,LL_ONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN********************************************************************* ; TR8: LD DE,SDTRAN ; SETTR: LD HL,(CUR_DPH) LD (H3rNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNA ; LD HL,IOPB CALL MR_XIOB ;EXECUTE THE FUNCTION ; OR A,A ;FUNCTION ERR? RET NZ ; ; RETURN THE COMMAND RESULTS NNNNNNNNNNNNNNNNNN\NNNNNNNNNNNNNNNNNNNNNND8EXEC: ; ; SELECT SIDE FROM TRACK BIT 0 ; LD HL,(IOPB + PB_TRKO) ;FETCH CURRENT TRACK PUSH HL ;SAVE CURRENT TRACK FOHNNNNNNNNNNNNNNNNN!NNNNNNNNNNNNNNNNNNNNNNTABLE LD D,0 ADD HL,DE LD A,(HL) ;FETCH TRANSLATED SECTOR # FROM TABLE LD (IOPB + PB_SECO),A ; NOSKEW: ; ; EXECUciNNNNNNNNNNNNNNNNN'NNNNNNNNNNNNNNNNNNNNNN!R ; LD A,-1 RET IF 0 ; ; IF FUNCTION # NOT IN TABLE THEN RETURN -1 ; LD A,C CP A,MAXFUNCS LD A,-1 RET NC CNNNNNNNNNNNNNNNN-NNNNNNNNNNNNNNNNNNNNNNXFUNCS EQU ($ - BFUNTBL) / 2 ENDIF ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; (rNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNN!SK DRIVER ; LL_OPLP: LD HL,LL_OPRET ;PUT RETURN ADDRESS ON STACK PUSH HL ; LD L,(IX + DDT_EXE) ;FETCH DRIVER ADDRESS FNNNNNNNNNNNNNNNN lNNNNNNNNNNNNNNNNNNNNN!PLP ; ; ELSE IF ABORT THEN DO WARM BOOT ; CP A,'A' ;IF ABORT THEN RE-BOOT JP Z,0 ; ; ELSE IF DEBUGGER THEN EXECUTEBNNNNNNNNNNNNNNNNNLNNNNNNNNNNNNNNNNNNNNN!L),E INC HL LD (HL),D RET ;**************************************************************************** ; ; SET NO BNNNNNNNNNNNNNNNN*NNNNNNNNNNNNNNNNNNNNNNSTATUS ; LD A,(IOPB + PB_STATO) OR A,A RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}NNNNNNNNNNNNNNNNN!NNNNNNNNNNNNNNNNNNNNN!R RESTORATION ; LD A,(IX + DDT_HDS) ;IF HEADS == 1 THEN SKIP MODIFICATION DEC A JR Z,FD8SNGL ; LD A,(IOPB + PB_SECO + rNNNNNNNNNNNNNNNN"NNNNNNNNNNNNNNNNNNNNNNTE THE IOPB ; CALL XPRIM ; ; RESTORE THE MODIFIED IOPB SO RETRY WILL WORK ; POP HL ;RESTORE ORIGINAL SECTOR RES 7,NNNNNNNNNNNNNNNNN( pNNNNNNNNNNNNNNNNNNNNNN; ; ELSE COMPUTE TABLE ENTRY ; PUSH HL ;SAVE POSSIBLE DATA ; LD HL,BFUNTBL LD A,C ADD A,A ADD A,L LD L,A LD 1NNNNNNNNNNNNNNNNN.NNNNNNNNNNNNNNNNNNNNN!RETURN BIOS VERSION # FUNCTION #0 ; EXIT - HL= VERSION # IN BINARY {0.00,..655.35} ; ;+++++++++++++++++++++++++++++++++++++++ dNNNNNNNNNNNNNNNNN|NNNNNNNNNNNNNNNNNNNNNNROM TABLE LD H,(IX + DDT_EXE + 1) JP (HL) ; ; DRIVER RETURNS HERE ; LL_OPRET: ; ; IF NO ERRORS THEN RETURN ZF ; RHNNNNNNNNNNNNNNNNN _NNNNNNNNNNNNNNNNNNNNNN IT ; CP A,'M' JP Z,MR_BRK ; ; ELSE IF IGNORE THEN RETURN NO ERROR ; SUB A,'I' ;IF IGNORE THEN RETURN NO ERROR RE$NNNNNNNNNNNNNNNNN}NNNNNNNNNNNNNNNNNNNNNNSECTOR TRANSLATION PROCEDURE ; EXIT - HL, DE= ? ; ;***************************************************************************NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!++++ ; ; HARD DISK DRIVER FUNCTION ; ENTRY- IX= DRIVER TABLE PTR ; EXIT - A= 0: OK; /0: ERROR ; ;+++++++++++++++++++++++++Q[ NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!1) ADD A,A ;BIT 15 -> BIT_BUCKET ; SRL H RR L RRA ;TRK BIT 0 -> SECTOR BIT 15 LD (IOPB + PB_SECO + 1),A ; LD NNNNNNNNNNNNNNNN#ЊNNNNNNNNNNNNNNNNNNNNNNH ;CLEAR SIDE BIT 1ST LD (IOPB + PB_SECO),HL ; POP HL ;RESTORE ORIGINAL TRACK LD (IOPB + PB_TRKO),HL ; ; DONE ; ONNNNNNNNNNNNNNNNN)?ANNNNNNNNNNNNNNNNNNNNNNA,0 ADC A,H LD H,A ; ; EXECUTE TABLE ADDRESS ; LD A,(HL) INC HL LD H,(HL) LD L,A ; EX (SP),HL ;PUT CALLER'SNNNNNNNNNNNNNNNNN/NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++ ; RETVERS: LD HL,VERSN XOR A,A ;RETURN NO ERROR RET ;++++++++++++++++++++++SNNNNNNNNNNNNNNNN)NNNNNNNNNNNNNNNNNNNNNN RET Z ;IF NO_ERROR THEN RETURN ; ; PRINT ERROR ; IOPBDMP: LD A,(BUF_DMAB) ;SET BANK LD E,A ; LD HL,IOPB LD A,MF_BNNNNNNNNNNNNNNNNN RNNNNNNNNNNNNNNNNNNNNN!T Z ; ; ELSE RETURN ERROR TO BDOS ; LD A,-1 ;RETURN -1 TO BDOS OR A,A RET ; ; ; DISPLAY WRITE PROTECT ERROR MES(NNNNNNNNNNNNNNNN.NNNNNNNNNNNNNNNNNNNNNN** ; TRNONE: LD DE,0 JR SETTR SUBTTL HARD DISK ROUTINES ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++qNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++++++++++++ ; HDEXEC: EQU XPRIM SUBTTL JADE FLOPPY DRIVER ROUTINES ;+++++++++++EfBNNNNNNNNNNNNNNNNCNNNNNNNNNNNNNNNNNNNNNN(IOPB + PB_TRKO),HL ;TRACK = RESIDUAL ; ; IF SKEW ENABLED THEN TRANSLATE IT ; FD8SNGL: PUSH IY ;CALCULATE PTR TO TABLE RNNNNNNNNNNNNNNNNN$INNNNNNNNNNNNNNNNNNNNNN RET SUBTTL BIOS FUNCTION CALLS ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; FUNCNNNNNNNNNNNNNNNNN*jNNNNNNNNNNNNNNNNNNNNNN DATA IN HL, FUNCTION ADDR ON RET ; STACK, EXECUTE FUNCTION ADDRESS ON STACK ;#########################################NNNNNNNNNNNNNNNNNN0NNNNNNNNNNNNNNNNNNNNN!++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN DRIVER TABLE PTR FUNCTION #1 ; ENTRY- E= DRIVE # ; EXIT - ,NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN΁h6҅n= ىtAۍwE㑱M蕵P홼X%\*Ţ`.ʦNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!E:HL= DRIVER TABLE BASE PTR ; NZ= ILLEGAL DRIVE REQUESTED (HL=0) ; A, B, C= ? ; ;+++++++++++++++++++++++++++++++++++++++++2QdNNNNNNNNNNNNNNNNNDNNNNNNNNNNNNNNNNNNNNNN,RETDV2 ; LD HL,0 OR A,A ;SET NZ RET ; ; ; ELSE COMPUTE TABLE PTR ; RETDV2: LD B,C LD DE,DDT_SIZ ; RETDVL: AD;NNNNNNNNNNNNNNNN YNNNNNNNNNNNNNNNNNNNNNNL ADDITIONAL FUNCTIONS TO SUPPORT CDOS PROGRAMS ;*************************************************************************** ;NNNNNNNNNNNNNNNNyNNNNNNNNNNNNNNNNNNNNNNLS ; CP A,8DH ;IF RETURN VERSION THEN RETURN IT JR Z,RETCVER ; CP A,90H ;IF NOT CLOCK THEN ERR JR C,ILLEGC ; JR Z~rNNNNNNNNNNNNNNNN8NNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++ ; RETCVER: LD B,1 RET SUBTTL CLOCK ROUTINES ;+++++++++++++++++++++++++++++++++++++++++PNNNNNNNNNNNNNNNNN.NNNNNNNNNNNNNNNN'NNNNNNNNNNNNNNNNNNNNN!###################################################### ; IOPB: REPT PB_SIZE LIST OFF DB 0 LIST ON ENDM ;#########0NNNNNNNNNNNNNNNN (NNNNNNNNNNNNNNNNNNNNNNCTURE SIZE ; DDT_SIZ DS 0 ENDM ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; MACR9NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNLDRV HDEXEC,4,12H,D1DPB,D1DPH,4,8000H ; C DDT_2: ALLDRV HDEXEC,5,10H,D2DPB,D2DPH,4,0 ; D DDT_3: ALLDRV HDEXEC,5,12H,D3DP^BNNNNNNNNNNNNNNNN6NNNNNNNNNNNNNNNNNNNNN! DDT_4: ALLDRV HDEXEC,5,10H,D4DPB,D4DPH,4,0 ; F DDT_5: ALLDRV HDEXEC,5,12H,D5DPB,D5DPH,4,8000H ENDIF ;#############NNNNNNNNNNNNNNNNNN^NNNNNNNNNNNNNNNNNNNNNN3 ;BLOCK SHIFT FACTOR DB 7 ;BLOCK MASK DB 0 ;NULL MASK DW 242 ;DISK SIZE -1 DW 63 ;DIRECTORY MAX DB 11000000B ;ALz NNNNNNNNNNNNNNNN"xgNNNNNNNNNNNNNNNNNNNNN!M) DW 1152 / 2 ;DIRECTORY MAX (DRM) DB 0FFH ;ALLOCATION 0 (AL0) DB 10000000B ;ALLOCATION 1 (AL1) DW 0 ;CHECK SIZ$NNNNNNNNNNNNNNNNN(NNNNNNNNNNNNNNNNNNNNNNMACRO #D LIST ON D#D(DD)DPH: ;DRIVE PARAMETER HEADER FOR DRIVE #D(DD) DW 0 ;;SECTOR TRAN TBL (OR 0 IF NO XLATE) DW 0 NNNNNNNNNNNNNNNNN.= NNNNNNNNNNNNNNNNNNNNNNOPB: DB PB_LOGC ;COMMAND DB 0 ;DRIVE DW 0 ;TRACK DW ID_SECT ;SECTOR DB 0 ;FLAGS DW BLKBUF ;DMA DB 0 ;BANK DW 0 ;NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN################################################################### ; ; DISK DRIVER TABLES (DDT) ; ;########################*NNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNO TO DEFINE THE DRIVER TABLE RECORD ; ENTRY- #DADD= DRIVER ADDRESS ; #PD= PHYSICAL DRIVE # ; #FLG= DRIVE FLAGS ; #DPB= DPdNNNNNNNNNNNNNNNNN(NNNNNNNNNNNNNNNNNNNNNNB,D3DPH,4,8000H ; E DDT_4: ALLDRV FD8EXEC,0,0,D4DPB,D4DPH,1,0 ; F DDT_5: ALLDRV FD8EXEC,1,0,D5DPB,D5DPH,1,0 ENDIF bNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!############################################################### ; ; MESSAGES ; ;##########################################.NNNNNNNNNNNNNNNNmNNNNNNNNNNNNNNNNNNNNNNLOC 0 DB 0 ;ALLOC 1 DW 16 ;CHECK SIZE DW 2 ;TRACK OFFSET DB 0 ;PHYSICAL RECORD SHIFT FACTOR DB 0 ;PHYSICAL RECORD3BNNNNNNNNNNNNNNNN#KVNNNNNNNNNNNNNNNNNNNNNNE (CKS) DW 2 ;TRACK OFFSET (OFF) DB 1 ;PHYSICAL RECORD SHIFT FACTOR (PSH) DB 1 ;PHYSICAL RECORD MASK (PRM) DW 0 v$NNNNNNNNNNNNNNNNN)NNNNNNNNNNNNNNNNNNNNNN;;SCRATCH AREA DW 0 ;;" DW 0 ;;" DW DIRBF ;;DIRECTORY BUFFER PTR DW D#D(DD)DPB ;;DRIVE PARAMETER BLK PTR IF (DSK_NNNNNNNNNNNNNNNNN/;NNNNNNNNNNNNNNNNNNNNNNCOUNT ; WR_PROT DB -1 ;/0: WRITE PROTECTION ENABLED ; ; LAST OF INITIALIZED CODE READ FROM DISK ; BIOSND EQU $ S9NNNNNNNNNNNNNNNNENNNNNNNNNNNNNNNNNNNNNN#################################################### ; STRUCT 0 DDT_EXE DS 2 ;START ADDRESS OF DISK DRIVER DDT_FLG DS 1 ;FL2BNNNNNNNNNNNNNNNN ]NNNNNNNNNNNNNNNNNNNNNNB ADDRESS ; #DPH= DPH ADDRESS ; #HDS= HEADS ; #SOF= SECTOR OFFSET ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@R1BNNNNNNNNNNNNNNNN}NNNNNNNNNNNNNNNNNNNNN! IF BOOT = 11H ; A DDT_0: ALLDRV HDEXEC,6,10H,D0DPB,D0DPH,4,0 ; B DDT_1: ALLDRV HDEXEC,6,12H,D1DPB,D1DPH,4,8000H ; C@lNNNNNNNNNNNNNNNNN9NNNNNNNNNNNNNNNNNNNNNN################################## ; MSGLE: DM CR,LF,'LOAD ERROR' ; DSKEB: DM CR,LF,'Abort, Ignore, Retry, (BDOS) - ' ; WPOrNNNNNNNNNNNNNNNN8NNNNNNNNNNNNNNNNNNNNNN MASK DW 0 ;LOGICAL DRIVE SECTOR OFFSET DB 0 ;SKEW = 0 ; ; DEFAULT DISK PHYSICAL PARAMETERS ; DB 1 ;HEADS ;##NNNNNNNNNNNNNNNNN$NNNNNNNNNNNNNNNNNNNNNN ;LOGICAL DRIVE SECTOR OFFSET (SOF) DB 0 ;SKEW = 0 ; ; ; DB 4 ;HEADS ;############################################gNNNNNNNNNNNNNNNNNN*NNNNNNNNNNNNNNNNNNNNN!#D(DD) AND 0F0H) = 10H DW 0 ;;NO CHECKS ON HARD DISK ELSE DW D#D(DD)CHK ;;DRIVE DISK CHECKSUMS ARRAY PTR ENDIF DWNNNNNNNNNNNNNNNNN0vNNNNNNNNNNNNNNNNNNNNN!UBTTL UNINITIALIZED DATA AREA ;############################################################################ ; ; THE FOLLOWINNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNρi7҅m< ׉r@ۍxF㑱M镶R!Y'Þ`.ʢe4ЦNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNjVNNNNNNNNNNNNNNNNNNNNNNNG DATA MUST RESIDE IN THIS ORDER TO MATCH THE IOPB DATA ; ;##################################################################NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!UFFER DPB PTR ; RSFLAG: DS 1 ;0: NO PREREAD REQ'D, /0: PREREAD REQ'D READOP: DS 1 ;0: WRITE OPERATION, 1: READ OPERATION WRTNNNNNNNNNNNNNNNN /;NNNNNNNNNNNNNNNNNNNNNNPTR CUR_DPH DS 2 ;DPH PTR ; LOGRQ: DS 1 ;LOG ON REQUEST REG. ;##########################################################NNNNNNNNNNNNNNNNGNNNNNNNNNNNNNNNNNNNNN!_#D(DD) AND 0F0H) = 0 D#D(DD)ALL: DS 75 ;ALLOCATION BIT MAP FOR 8" FLOPPY DRIVE #D(DD) D#D(DD)CHK DS 64 ;DIRECTORY CHECKSUM+NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNXTENT MASK ; DSM < 256 : 1K= 0, 2K= 1, 4K= 3, 8K= 7, 16K= 15 ; DSM > 255 : 2K= 0, 4K= 1, 8K= 3, 16K= 7 DPB_DSM DS 2 ;DSJNNNNNNNNNNNNNNNNNJ*NNNNNNNNNNNNNNNNNNNNN! ADDITIONAL DISK PARTITIONING DATA FOR THE LOGICAL DRIVE SELECTION. ; PARTITIONING BY TRACKS ARE IMPLIMENTED THRU BDOS USING D8NNNNNNNNNNNNNNNN%tNNNNNNNNNNNNNNNNNNNNN!AL DRIVE 0 ; B SIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 0 ; C SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 1 ; D SIDE 2 & 3 OF NNNNNNNNNNNNNNNNNN+{NNNNNNNNNNNNNNNNNNNNNNAL DRIVE 1 ; F SIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 1 ; G JADE 8" FLOPPY PHYSICAL DRIVE 0 ; H JADE 8" FLOPPY PHYSICAL8NNNNNNNNNNNNNNNN?NNNNNNNNNNNNNNNNNNNNNN########## ; ; CP/M IOPB OVERLAY ; CPM_DSK DS 1 ;LOGICAL DRIVE CPM_TRK DS 2 ;LOGICAL TRACK NUMBER CPM_SEC DS 2 ;LOGICAL HNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNYPE: DS 1 ;WRITE OPERATION TYPE FROM BDOS: ; 0: WRITE TO ALLOCATED (USED) BLOCK (PREREAD) ; 1: WRITE TO DIRECTORY (PRERE+KNNNNNNNNNNNNNNNNzhNNNNNNNNNNNNNNNNNNNNNN################## ; ; DRIVE ALLOCATION AREAS ; ;#########################################################################o9NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNS STORAGE (1 BYTE PER SECTOR) ENDIF LIST OFF ENDM ; ; RESERVE THE DATA SPACE ; DD DL 1 REPT NDRVS LIST OFF ArNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNM- DRIVE STORAGE SIZE (IN CLUSTERS) ; INT(((#_TRACKS - OFF) * SPT * BYTES PER SECTOR) / CLUSTER SIZE) -1 DPB_DRM DS 2 ;DRM- 3NNNNNNNNNNNNNNNNN _NNNNNNNNNNNNNNNNNNNNNNPBOFF ABOVE. ; PARTITIONING BY HEADS ARE IMPLIMENTED BY USING THE FOLLOWING DATA. ; (HEAD BITS ARE INCLUDED IN SECTOR WORD U5NNNNNNNNNNNNNNNN&'NNNNNNNNNNNNNNNNNNNNNNHARD DISK PHYSICAL DRIVE 1 ; E JADE 8" FLOPPY PHYSICAL DRIVE 0 ; F JADE 8" FLOPPY PHYSICAL DRIVE 1 ENDIF IF BOOT =NNNNNNNNNNNNNNNN,NNNNNNNNNNNNNNNNNNNNNN DRIVE 1 ENDIF ; ;************************************************************* ; ; REVISION HISTORY: ; ; 3.00 - 26 NNNNNNNNNNNNNNNN 4NNNNNNNNNNNNNNNNNNNNNNSECTOR NUMBER DS 1 ;FLAGS CPM_DMA DS 2 ;XFER ADDR CPM_DMAB DS 1 ;XFER BANK ; ; ; BUFFER IOPB OVERLAY ; BUF_DSK DS 1 ; NNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNN!AD & WRITE) ; 2: WRITE TO UNALLOCATED (UNUSED) BLOCK (NO ; PREREAD REQ'D) ; ; UNA_CNT: DS 1 ;# SECTORS REMAINING IN BNNNNNNNNNNNNNNNNNIYNNNNNNNNNNNNNNNNNNNNN!### ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; MACRO TO DEFINE THE DRIVE ALLOCATIONZrNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!LLDAL 0123456789ABCDEF DD DL DD + 1 LIST ON ENDM ;####################################################################ƧNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNDIRECTORY SIZE -1 DPB_AL0 DS 2 ;AL0,1- DIRECTORY ALLOCATION ; 1 MSB PER DIRECTORY CLUSTER ALLOCATED DPB_CKS DS 2 ;CKS- # DNNNNNNNNNNNNNNNNN!lNNNNNNNNNNNNNNNNNNNNNN TITLE CUSTOMIZED BIOS FOR M5B LIST NOCOND BOOT EQU 3H ;10H: HARD DISK, 3: 8" FLOPPY, 20H: 5" FLOPPY ;*********************NNNNNNNNNNNNNNNNN'NNNNNNNNNNNNNNNNNNNNNN 3 ; A JADE 8" FLOPPY PHYSICAL DRIVE 0 ; B JADE 8" FLOPPY PHYSICAL DRIVE 1 ; C SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 0ɛNNNNNNNNNNNNNNNN-)NNNNNNNNNNNNNNNNNNNNNNJAN 87 GRH ; Implemented new common IOPB code & Jade floppy firmware support. ; Implemented disk drive driver tables and new' 9NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!BUFFER DISK NUMBER BUF_TRK DS 2 ;BUFFER TRACK NUMBER BUF_SEC DS 2 ;BUFFER SECTOR NUMBER DS 1 ;FLAGS BUF_DMA DS 2 BUF_DMAB &=NNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNLOCK (CLUSTER) UNA_DSK: DS 1 ;LAST UNALLOC DISK UNA_TRK: DS 2 ;LAST UNALLOC TRACK UNA_SEC: DS 2 ;LAST UNALLOC SECTOR ;##NNNNNNNNNNNNNNNNNZNNNNNNNNNNNNNNNNNNNNNN & CHECKSUMS AREA ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; ALL = (DSM / 8) + 1 ; #SECTORS ;CHECK FOR OVERFLOW NXTSEC DL NXTSEC - #SECTORS ;; IF NXTSEC <= LOWEST ;CHECK FOR REPEAT NHNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN------------------------ ; ; BIOS JUMP VECTOR TABLE ; ;-------------------------------------------------------------------#'NNNNNNNNNNNNNNNN+ENNNNNNNNNNNNNNNNNNNNNN AS DEFINED RIGHT BEFORE THE COLD ; INIT ROUTINE START AND MUST BE IN THE 1ST SECTOR. THESE 2 WORDS ARE ; REFERENCED BY THE BOONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!#################################################### ; DIRBF: EQU $ ;BUFFER BEGINNING ;---------------------------------fLNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!FY COLD START VECTOR TO WARM START ; LD HL,(BIOS+4) LD (BIOS+1),HL ; ; INIT OUR STUFF ; CALL GETBNK LD (BUF_DMAB),$NNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNN!E + '0' DB 'K CP/M-80 Vers 2.2',CR,LF DB 'M5b CBIOS Vers ' PVERS VERSN DM CR,LF IF $ > (DIRBF + SECSZ) CONZNNNNNNNNNNNNNNNNN& NNNNNNNNNNNNNNNNNNNNNNDMA),HL ; ; LOG ON DRIVE TO INIT TABLES ; LD A,(BTARG) AND A,3 ;MODULO 4 LD C,A LD E,0 CALL SELDSK LD A,L ;IF9NNNNNNNNNNNNNNNN,KNNNNNNNNNNNNNNNNNNNNNN LD D,(HL) LD (IOPB + PB_SECO),DE ; INC HL ;FETCH SEGMENT SECTOR COUNT LD A,(HL) LD (SECCNT),A ; INC HL ;SAVE C[RNNNNNNNNNNNNNNNN]NNNNNNNNNNNNNNNNNNNNNNXTSEC DL LOWEST + 1 LOWEST DL NXTSEC ENDIF ENDIF ;; ENDM LIST ON ENDM ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@)NNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN--------- ; JP INIT1 ;COLD START ENTRY JP WARM ;RELOAD CCP/BDOS JP CNSCK ;GET CONSOLE STATUS JP CI ;CONSOLE INPUT 36NNNNNNNNNNNNNNNNNtNNNNNNNNNNNNNNNNNNNNNNOT LOADER CODE IN ORDER TO DETERMINE THE LOAD ADDRESS ; AND LENGTH OF THE BIOS. ; ;##########################################rNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN------------------------------------------- ; ; INIT - COLD START ENTRY FROM BOOT MUST SET ALL BIOS PARAMS ; ;----------mNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNA ; ; INITIALIZE CLOCK VECTORS IF CLOCK INSTALLED ; LD A,MF_CSYN ;TEST FOR BOARD PRESENT CALL XMROM ; ; IF CLOCK PR_NNNNNNNNNNNNNNNNN!=NNNNNNNNNNNNNNNNNNNNNNMSG **** WARNING! COLD INIT CODE BIGGER THAN DIR BUFFER **** ELSE DS DIRBF+SECSZ-$ ;FILL OUT DIRECTORY BUFFER TO 1 SECTOR6NNNNNNNNNNNNNNNNN';NNNNNNNNNNNNNNNNNNNNNN ERROR THEN ABORT OR A,H JR Z,W_EROR ; ; SETUP IOPB ; LD A,PB_READC LD (IOPB + PB_CMDO),A ; LD A,(BTARG) LD (I*NNNNNNNNNNNNNNNN-xNNNNNNNNNNNNNNNNNNNNNNURRENT DATA PTR LD (LDRPTR),HL ; ; READ SYSTEM ; W_READ: CALL XPRIM LD A,2 JR NZ,W_EROR ;IF ERROR THEN EXIT ; ; NNNNNNNNNNNNNNNNĎNNNNNNNNNNNNNNNNNNNNNN@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; INITIALIZE VERSION TEXT IN RAM MACRO ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@r 9999 DB (DD / 10000) + '0' DD DL DD % 10NNNNNNNNNNNNNNNNN ԰NNNNNNNNNNNNNNNNNNNNNNSK DRIVE JP SETTRK ;SET TRACK # JP SETSEC ;SET SECTOR # JP SETDMA ;SET TRANSFER ADDR JP DISKRD ;PERFORM DISK READ NNNNNNNNNNNNNNNNN8NNNNNNNNNNNNNNNNNNNNNNBYTES BIOSST: DW BIOS ;BIOS MODULE LOAD ADDR FOR SBD ; ; CONTINUE ON WITH INIT ; INIT1: JR INIT ;##################NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN;USE PAGE 0 FOR STACK LD (THIS_STK),SP EI ; ; UPLOAD BOOT DIRECTORY DATA FOR WARM BOOT ; LD HL,0080H LD A,(HL) ;IF:zyNNNNNNNNNNNNNNNN}eNNNNNNNNNNNNNNNNNNNNNN8H ;UNCOND. JR (OFF) (CAUSES JUMP TO ILLEGAL) ; CLKON: LD (INHCLK),A ; ; BOOT CCP & BDOS ; JR WARM ;#############8NNNNNNNNNNNNNNNN#[NNNNNNNNNNNNNNNNNNNNNNK & ; SETS UP VARIABLES ; ;---------------------------------------------------------- ; WARM: ; ; SET TEMPORARY STACK NNNNNNNNNNNNNNNNN)4NNNNNNNNNNNNNNNNNNNNNN),HL ; ; IF NO SYSTEM THEN ERROR ; LD HL,BT_DATA LD A,(HL) ;FETCH SEGMENT COUNT OR A,A LD A,1 JR Z,W_EROR ; ; HNNNNNNNNNNNNNNNNN/NNNNNNNNNNNNNNNNNNNNNN HL,(IOPB + PB_DMAO) ADD HL,DE LD (IOPB + PB_DMAO),HL ; ; IF INTO BIOS THEN EXIT ; LD A,H CP A,HIGH BIOS JR NC,WZ NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN000 ENDIF IF DD > 999 DB (DD / 1000) + '0' DD DL DD % 1000 ENDIF DB (DD / 100) + '0' DB '.' DB ((DD % 100) NNNNNNNNNNNNNNNN M'NNNNNNNNNNNNNNNNNNNNNNJP DISKWR ;PERFORM DISK WRITE JP LISTST ;RETURN LIST STATUS JP SECTRN ;TRANSLATE SECTOR JP BIOFUNC ;EXECUTE FUNCTION C&BNNNNNNNNNNNNNNNNm[NNNNNNNNNNNNNNNNNNNNNN########################################################## ; ; DIRECTORY SECTOR BUFFER STARTS HERE AFTER CRUNCHING COLD START WNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN > MAX THEN ERROR CP A,6 JP NC,W_EROR ; LD DE,BT_DATA LD BC,BD_SIZE LDIR ; ; INIT DEFAULT DRIVE ; LD A,(BTARG).rNNNNNNNNNNNNNNNN(6NNNNNNNNNNNNNNNNNNNNN!############################################################### ; ; SIGN-ON MESSAGE ; ;#####################################'NNNNNNNNNNNNNNNNN$hNNNNNNNNNNNNNNNNNNNNNN; DI LD SP,DEFBFR LD (THIS_STK),SP EI ; ; INIT OUR STUFF ; XOR A,A LD (BUF_ACT),A ;ASSUME NO DATA IN BUFFER ; 8NNNNNNNNNNNNNNNNN*gNNNNNNNNNNNNNNNNNNNNNN ELSE USE DATA TO LOAD SYSTEM ; LD A,(HL) LD (SEGCNT),A ; INC HL ;POINT TO TRACK ; ; TOP OF SEGMENT LOOP ; W_NXŦINNNNNNNNNNNNNNNNN0 NNNNNNNNNNNNNNNNNNNNN!RPG ; ; ELSE IF SEGMENT_SECTOR_COUNT != EXHAUSTED THEN READ_NEXT_SECTOR ; LD A,(SECCNT) DEC A LD (SECCNT),A JR NZ,WF.HNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNˁf4хm< ؉s@ۍyF䑲NꕷQ Y'ž_-ɢd2ΦNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN KNNNNNNNNNNNNNNNNNNNNNN_READ ; ; ELSE IF SEGMENTS == COMPLETE THEN DONE ; LD A,(SEGCNT) DEC A LD (SEGCNT),A JP Z,WZRPG ; ; ELSE DO NEXkNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN JR C,W_LOK ; LD A,L CP A,LOW BIOS LD A,3 JR NZ,W_EROR ; W_LOK: ; ; INIT BIOS WARM START IN PAGE 0 ; LD A,0NNNNNNNNNNNNNNNN I&NNNNNNNNNNNNNNNNNNNNN!+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; READ A DISK SECTOR ; EXIT - A= 0: OK; /0: ERROR ; ;++++++++mNNNNNNNNNNNNNNNNiZNNNNNNNNNNNNNNNNNNNNN! JP RW_RET ;**************************************************************************** ; ; WRITE DISK SECTOR FUNCTION rNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNYPE),A ; ; IF 1ST WRITE TO UNALLOCATED (NEW, UNUSED) BLOCK THEN SET PARAMETERS ; CP A,WRUAL JP NZ,CHKUNA ; ; COUNT $NNNNNNNNNNNNNNNNN,7NNNNNNNNNNNNNNNNNNNNNN(UNA_TRK) ;SAME TRACK? LD DE,(CPM_TRK) SBC HL,DE JR NZ,ALLOC ; LD HL,(CPM_SEC) LD DE,(UNA_SEC) SBC HL,DE JR NZ,ALZ NNNNNNNNNNNNNNNN%iNNNNNNNNNNNNNNNNNNNNN! LD (UNA_CNT),A ; INC A ;PREREAD FLAG = TRUE LD (RSFLAG),A ; ; ; ; COMMON CODE FOR READ AND WRITE FOLLOWS ; RWOPNNNNNNNNNNNNNNNNN+fNNNNNNNNNNNNNNNNNNNNNNE IN ANY CASE ; OR A,A JR Z,FILHST ; ; HOST BUFFER ACTIVE, SAME AS SEEK BUFFER? ; LD A,(CPM_DSK) LD HL,BUF_DSK ;SAVBNNNNNNNNNNNNNNNNYNNNNNNNNNNNNNNNNNNNNNNT SEGMENT ; LD HL,(LDRPTR) JR W_NXTSEG ; ; ; WARM BOOT ERROR, OUTPUT MSG & GO TO DEBUGGER ; ENTRY- A= ERROR CODE: ; NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNC3H LD HL,BIOS + 3 LD (PAGE0),A LD (PAGE0 + 1),HL ; ; INIT BDOS CALL VECTOR IN PAGE 0 ; LD HL,BDOS + 6 LD (BDOSJV}X$NNNNNNNNNNNNNNNNuNNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; DISKRD: ; ; SET UP DATA TABLE PTRS ; PUSH IX LqNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN; ENTRY- C= WRITE TYPE: ; 0: WRITE TO ALLOCATED BLOCK (UPDATE) ; 1: WRITE TO DIRECTORY BLOCK (ALLWAYS WRITE) ; 2: WRITENNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!= NUMBER_OF_SECTORS_IN_BLOCK ; LD A,(IY + DPB_BLM) ;CUR_DPB.DPBBLM + 1 ::= (BLKSIZ/128) INC A LD (UNA_CNT),A ; ; SET NNNNNNNNNNNNNNNNN 9NNNNNNNNNNNNNNNNNNNNN!LOC ; ; MATCH, MOVE TO NEXT SECTOR FOR FUTURE REF ; EX DE,HL ;UNASEC += 1 INC HL LD (UNA_SEC),HL ; ; IF PAST LASrRNNNNNNNNNNNNNNNN&:NNNNNNNNNNNNNNNNNNNNNNER: ; ; ASSUME NO ERRORS ; XOR A,A LD (IOPB + PB_STATO),A ; ; COMPUTE BUFFER SECTOR ; LD HL,(CPM_SEC) DEC HL BNNNNNNNNNNNNNNNN,|NNNNNNNNNNNNNNNNNNNNNNME DISK? CP A,(HL) JR NZ,NOMATCH ; LD HL,(BUF_TRK) ;SAME TRACK? LD DE,(CPM_TRK) SBC HL,DE JR NZ,NOMATCH ; LD DE, NNNNNNNNNNNNNNNNj)NNNNNNNNNNNNNNNNNNNNNN 0: SELECT DISK ERROR ; 1: NO SYSTEM SEGMENTS IN BOOT DIRECTORY ; 2: READ ERROR ; 3: BIOS OVERWRITTEN ; 4,5: SPARESBNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN),A LD (BDOSJV + 1),HL ; ; INIT BIOS CALL VECTOR IN PAGE 0 ; LD HL,BIOFUNC LD (BFUNRSV),A LD (BFUNRSV + 1),HL ; ;x'NNNNNNNNNNNNNNNNN/DNNNNNNNNNNNNNNNNNNNNNND IX,(CUR_DDT) ; PUSH IY LD IY,(CUR_DPB) ; ; IF NOT BLOCKED THEN USE CPM READ ; LD A,(IY + DPB_PSH) ;0= 128-BYTE SECrNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN TO UNALLOCATED BLOCK (NO NEED TO PRE-READ) ; ;**************************************************************************** ;NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNDISK TO SEEK ; LD A,(CPM_DSK) LD (UNA_DSK),A ; ; SET TRACK TO SEEK ; LD HL,(CPM_TRK) LD (UNA_TRK),HL ; ; SET S[NNNNNNNNNNNNNNNNN! NNNNNNNNNNNNNNNNNNNNNNT SECTOR ON TRACK THEN USE 1ST SECTOR OF NEXT TRACK ; LD E,(IY + DPB_SPT) LD D,(IY + DPB_SPT +1) SBC HL,DE JP C,NOOVF ~NNNNNNNNNNNNNNNNN' NNNNNNNNNNNNNNNNNNNNNN ;CONVERT PHYSICAL SECTOR TO LOGICAL ; LD A,(IY + DPB_PSH) ;USE PHYSICAL SHIFT FACTOR (CP/M 3.X) AND A,3 ;LIMIT TO 1024 B}FNNNNNNNNNNNNNNNN-ONNNNNNNNNNNNNNNNNNNNNN(BUF_PSEC) ;SAME SECTOR? LD HL,(BUF_SEC) SBC HL,DE JR Z,MATCH ;SKIP IF MATCH ; NOMATCH: ; ; IF BUFFER == DIRTY THENf1NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN ; 6..255: SEGMENT COUNT (TOO MANY SEGMENTS) ; W_EROR: PUSH AF ;SAVE ERROR CODE ; LD HL,MSGLE ;OUTPUT ERROR MESSAGE CeNNNNNNNNNNNNNNNN бNNNNNNNNNNNNNNNNNNNNNN SET DEFAULT SECTOR BUFFER ; LD BC,DEFBFR CALL SETDMA ; IF INTCPTS ; ; PUT BDOS VECTOR INTO INTERCEPT CODE ; L>NNNNNNNNNNNNNNNNN< NNNNNNNNNNNNNNNNNNNNNNTORS OR A,A JP Z,DISKRDN ; ; READS DON'T NEED ALLOCATION ; XOR A,A LD (UNA_CNT),A ; ; READ_OPERATION_FLAG = TRU2CrNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN DISKWR: ; ; REMOVE BOOT WRITE PROTECTION ; XOR A,A LD (WR_PROT),A ; ; SET PTRS TO DISK DATA ; PUSH IX LD IX,ҧNNNNNNNNNNNNNNNNydNNNNNNNNNNNNNNNNNNNNNNECTOR TO SEEK ; LD HL,(CPM_SEC) LD (UNA_SEC),HL ; ; IF NO UNALLOCATED SECTORS REMAIN THEN PREREAD ; CHKUNA: LD A,(UNA^NNNNNNNNNNNNNNNN"_NNNNNNNNNNNNNNNNNNNNNN; LD HL,0 ;SECTOR = 1 LD (UNA_SEC),HL ; LD HL,(UNA_TRK) ;TRACK++ INC HL LD (UNA_TRK),HL ; NOOVF: ; ; MATCH FOUX$NNNNNNNNNNNNNNNNN(5NNNNNNNNNNNNNNNNNNNNNNYTE SECTORS JP Z,NOSECSHF ;IF ALREADY 0 THEN SECTOR SIZE IS 128 ; SECSHFLP: SRL H ;ELSE SHIFT OVER TO PHYSICAL SECTOR _NNNNNNNNNNNNNNNNN.NNNNNNNNNNNNNNNNNNNNN! WRITE IT OUT BEFORE READING NEW ONE ; CALL BUF_FLSH ;CLEAR HOST BUFF ; JR NZ,RW_RET ;IF ERROR THEN ABORT ; FILHST: ; `NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNALL EDITOR ; ; DISPLAY ERROR CODE ; POP AF LD C,A LD A,MF_PHXB CALL MR_FUN ; ; EXECUTE DEBUGGER ; CALL MR_BR-gNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNN!D HL,(BDOS + 7) LD (BDOSV),HL ; ; NOW PUT INTERCEPT VECTOR INTO BDOS CODE ; LD HL,INTCPT LD (BDOS + 7),HL ENDIF ;QNNNNNNNNNNNNNNNNN8NNNNNNNNNNNNNNNNNNNNN!E (1) ; INC A LD (READOP),A ; ; PRE-READ_OF_DATA_FLAG = TRUE ; LD (RSFLAG),A ; ; TREAT AS UNALLOCATED BLOCK ; eNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!(CUR_DDT) ; PUSH IY LD IY,(CUR_DPB) ; ; IF NOT BLOCKED THEN USE CPM WRITE ; LD A,(IY + DPB_PSH) ;0= 128-BYTE SECTORSNNNNNNNNNNNNNNNNJUNNNNNNNNNNNNNNNNNNNNNN_CNT) OR A,A JP Z,ALLOC ; ; ELSE MORE UNALLOCATED RECORDS REMAIN, COUNT-- ; DEC A LD (UNA_CNT),A ; ; IF REQUESTBNNNNNNNNNNNNNNNN#lNNNNNNNNNNNNNNNNNNNNNNND, MARK AS UNNECESSARY READ ; XOR A,A ;PREREAD FLAG = FALSE LD (RSFLAG),A JP RWOPER ; ; ; NORMAL NON-BLOCKED WRITE;NNNNNNNNNNNNNNNNN)NNNNNNNNNNNNNNNNNNNNNN RR L DEC A JP NZ,SECSHFLP ; NOSECSHF: INC HL ;SET BACK TO PHYSICAL SECTOR LD (BUF_PSEC),HL ;BUFFER PHYSICAL SECTOR TNNNNNNNNNNNNNNNNN/)NNNNNNNNNNNNNNNNNNNNNN; READ THE SECTOR BUFFER ; LD A,(CPM_DSK) ;BUFFER SECTOR = PHYSICAL SECTOR LD (BUF_DSK),A ; LD HL,(CPM_TRK) LD (BUF_7NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNK HALT ; ; ; BOOT OK, INIT PAGE 0 ; WZRPG: ; ; IF FRONT OF BIOS OVERWRITTEN THEN ERROR ; LD A,H CP A,HIGH BIOSNNNNNNNNNNNNNNNNNN zNNNNNNNNNNNNNNNNNNNNNN ; PASS DEFAULT DISK TO CCP ; LD A,(DEFDRV) LD C,A JP CCP SUBTTL BIOS DISK FUNCTION ROUTINES ;+++++++++++++++++JNNNNNNNNNNNNNNNNZkNNNNNNNNNNNNNNNNNNNNNN LD A,WRUAL LD (WRTYPE),A ; JP RWOPER ;TO PERFORM THE READ ; ; ; NORMAL NON-BLOCKED READ ; DISKRDN: CALL CPM_RD 9INNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN OR A,A JP Z,DISKWRN ; ; READ_OP_FLAG = FALSE ; XOR A,A LD (READOP),A ; ; SAVE WRITE TYPE ; LD A,C LD (WRTNrNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNED SECTOR != UNALLOCATED SECTOR THEN PURGE ; LD A,(CPM_DSK) ;SAME DISK? LD HL,UNA_DSK CP A,(HL) JR NZ,ALLOC ; LD HL,YNNNNNNNNNNNNNNNNN$XNNNNNNNNNNNNNNNNNNNNNN ; DISKWRN: CALL CPM_WR JP RW_RET ; ; ; NOT AN UNALLOCATED RECORD, REQUIRES PRE-READ ; ALLOC: XOR A,A ;COUNT = 0)'NNNNNNNNNNNNNNNNN*WNNNNNNNNNNNNNNNNNNNNNNO ACCESS ; ; IF BUFFER == EMPTY THEN READ THE PHYSICAL SECTOR ; LD HL,BUF_ACT LD A,(HL) ; LD (HL),1 ;BUFFER = ACTIVulINNNNNNNNNNNNNNNNN0:NNNNNNNNNNNNNNNNNNNNN!TRK),HL ; LD HL,(BUF_PSEC) LD (BUF_SEC),HL ; ; IF REQUIRED TO READ THEN READ ; LD A,(RSFLAG) ;NEED TO READ? OR A,fHNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN΁i6хk9Չp= ؍vDᑯ}K敳M陸U"𝽞Z(¢]+ǦNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNMNNNNNNNNNNNNNNNNNNNNN!A CALL NZ,BUF_RD ;YES, IF 1 ; ; BUFFER = CLEAN ; XOR A,A LD (BUF_MOD),A ; MATCH: ; ; COPY DATA TO OR FROM BUFF[NNNNNNNNNNNNNNNNNiNNNNNNNNNNNNNNNNNNNNNNFLUSHES ; LD (BUF_DDT),IX LD (BUF_DPB),IY ; EX DE,HL ;SOURCE/DEST SWAP ; RWMOVE: ; ; BC INITIALLY 128, DE IS SOURANNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN** ; ; CPM_WR PERFORMS THE PHYSICAL WRITE FROM CPM_DMA TO THE DISK. ; ENTRY- (CPM_DSK)= DISK # TO WRITE TO ; (CPM_TRK)= TRA|NNNNNNNNNNNNNNNN(NNNNNNNNNNNNNNNNNNNNNN ; ;**************************************************************************** ; CPM_RD2: ; ; SET UP PTRS ; PUSH IXNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!OMMON CODE ; CPM_RW: PUSH HL LD HL,CPM_TRK ; ; FALL INTO COMMON XFER CODE ; ;*************************************WNNNNNNNNNNNNNNNNNmNNNNNNNNNNNNNNNNNNNNNNWRITE TO ; (BUF_DDT)= DDT PTR ; (BUF_DPB)= DPB PTR ; EXIT - (IOPB.PB_STATO)= 0: OK, /0: ERROR ; ;************************# NNNNNNNNNNNNNNNN%NNNNNNNNNNNNNNNNNNNNNN TRACK # TO WRITE TO ; (BUF_SEC)= SECTOR # TO WRITE TO ; IX= DDT PTR ; IY= DPB PTR ; EXIT - (IOPB.PB_STATO)= 0: OK, /0: EX!NNNNNNNNNNNNNNNN+NNNNNNNNNNNNNNNNNNNNNNRK JP RD_WR ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; SELECT DRIVE FUNCTION ; *NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!ER ; LD HL,(CPM_SEC) ;CALCULATE INDEX INTO BUFFER DEC HL ;CONVERT TO LOGICAL SECTOR (0..N-1) LD A,L ; AND A,(IY + DPBLNNNNNNNNNNNNNNNNNWNNNNNNNNNNNNNNNNNNNNNNCE, HL IS DEST ; LDIR ; ; DATA HAS BEEN MOVED TO/FROM HOST BUFFER, IF NOT DIRECTORY THEN DELAY WRITE ; LD A,(WRTYPE) PNNNNNNNNNNNNNNNN]NNNNNNNNNNNNNNNNNNNNNNCK # TO WRITE TO ; (CPM_SEC)= SECTOR # TO WRITE TO ; (CPM_DMA)= XFER ADDRESS ; IX= DDT PTR ; IY= DPB PTR ; EXIT - (IOPBdNNNNNNNNNNNNNNNNINNNNNNNNNNNNNNNNNNNNN! PUSH IY LD IX,(CUR_DDT) LD IY,(CUR_DPB) ; ; EXECUTE READ SECTOR ; CALL CPM_RD ; ; RESTORE PTRS & RETURN ; Pb NNNNNNNNNNNNNNNNFNNNNNNNNNNNNNNNNNNNNNN*************************************** ; ; SET UP IOPB FOR EXECUTION ; ENTRY- HL= PTR TO IOPB IMAGE TRACK DATA ; IX= DDT PGPNNNNNNNNNNNNNNNNN xNNNNNNNNNNNNNNNNNNNNNN**************************************************** ; BUF_FLSH: ; ; IF UNMODIFIED THEN RETURN ; LD A,(BUF_MOD) OR A,NNNNNNNNNNNNNNNN&ҾNNNNNNNNNNNNNNNNNNNNNNRROR ; ;**************************************************************************** ; BUF_WR: ; LD HL,LL_WRIT JP BUF_RTNNNNNNNNNNNNNNNN,=uNNNNNNNNNNNNNNNNNNNNNNLOG-ON - SET DISK PARAMETER BLOCK ; ENTRY- C= DRIVE # ; E= 0 IF NEW SELECT ; EXIT - HL= PTR TO DPT OR 0 FOR ERROR ; ;+++++NNNNNNNNNNNNNNNN+NNNNNNNNNNNNNNNNNNNNNN_PHM) ;USE PHYSICAL RECORD MASK DATA (CP/M 3.X) ; RRA ;BITS <7..1> -> BITS <14..8> LD H,A ; LD A,0 ;BIT 0 -> BIT 7 NNNNNNNNNNNNNNNNN fNNNNNNNNNNNNNNNNNNNNNN;IF NOT DIRECTORY THEN DELAY WRITE CP A,WRDIR LD A,(IOPB + PB_STATO) ;RETURN ANY ERRORS ANYWAY JR NZ,RW_RET ; ; IF ERR'NNNNNNNNNNNNNNNNNnNNNNNNNNNNNNNNNNNNNNNN.PB_STATO)= 0: OK, /0: ERROR ; ;**************************************************************************** ; CPM_WR: ; rNNNNNNNNNNNNNNNNxNNNNNNNNNNNNNNNNNNNNN!OP IY POP IX RET ;**************************************************************************** ; ; CPM_RD PERFORMS TH!NNNNNNNNNNNNNNNNNwNNNNNNNNNNNNNNNNNNNNNNTR ; IY= DPB PTR ; (SP)= ADDRESS {LL_READ, LLWRIT} OF EXECUTOR ; ;********************************************************WGNNNNNNNNNNNNNNNNN!K)NNNNNNNNNNNNNNNNNNNNNNA RET Z ; ; ELSE SET PTRS TO BUFFER DATA ; PUSH IX PUSH IY LD IX,(BUF_DDT) LD IY,(BUF_DPB) ; ; WRITE THE BUFFNNNNNNNNNNNNNNNNN'NNNNNNNNNNNNNNNNNNNNNNW ;**************************************************************************** ; ; RDBUF PERFORMS THE PHYSICAL READ FROMYNNNNNNNNNNNNNNNN-DNNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; SELDSK: ; ; STORE DRIVE # FOR FUTURE USE ; LDNNNNNNNNNNNNNNNN:NNNNNNNNNNNNNNNNNNNNN! RRA LD L,A ; ; HL HAS RELATIVE HOST BUFFER ADDRESS ; LD DE,BLKBUF ADD HL,DE ;HL = HOST ADDRESS ; LD DE,(CPM_DMAAf!NNNNNNNNNNNNNNNN 5NNNNNNNNNNNNNNNNNNNNNNOR THEN ABORT ; OR A,A JR NZ,RW_RET ; ; NO ERROR/DIRECTORY WRITE ; XOR A,A ;BUFFER = CLEAN LD (BUF_MOD),A ; CNNNNNNNNNNNNNNNNN}NNNNNNNNNNNNNNNNNNNNNNLD HL,LL_WRIT JP CPM_RW ;**************************************************************************** ; ; CPM_RD2 PERFOtMrNNNNNNNNNNNNNNNN+NNNNNNNNNNNNNNNNNNNNNNE PHYSICAL READ FROM THE DISK INTO CPM_DMA. ; ENTRY- (CPM_DSK)= DISK # TO READ FROM ; (CPM_TRK)= TRACK # TO READ FROM ; (CPNNNNNNNNNNNNNNNN8NNNNNNNNNNNNNNNNNNNNNN******************** ; RD_WR: LD DE,IOPB + PB_TRKO LD BC,PB_BCNTO - PB_TRKO LDIR ; ; EXECUTE LOW LEVEL READ OR WRITE (s NNNNNNNNNNNNNNNN"zNNNNNNNNNNNNNNNNNNNNN!ER DATA ; CALL BUF_WR ; ; RESTORE THE PTRS ; POP IY POP IX ; ; IF ERROR THEN RETURN IT ; OR A,A RET NZ ; nNNNNNNNNNNNNNNNNN(NNNNNNNNNNNNNNNNNNNNNN THE HOST DISK INTO BLKBUF. ; ENTRY- (BUF_DSK)= DISK # TO READ FROM ; (BUF_TRK)= TRACK # TO READ FROM ; (BUF_SEC)= SECTOR #m5^NNNNNNNNNNNNNNNNN.[NNNNNNNNNNNNNNNNNNNNNN A,C LD (CPM_DSK),A ; ; SAVE LOGON REQUEST FLAG ; LD A,E LD (LOGRQ),A ; ; COMPUTE DISK DRIVER TABLE PTR ; CALLHNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN) ;GET/PUT CP/M DATA LD BC,128 ;LENGTH OF MOVE ; LD A,(READOP) ;WHICH WAY? OR A,A JP NZ,RWMOVE ;SKIP IF READ ; ; WJNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNALL BUF_WR ;WRITE TO DISK ; LD A,(IOPB + PB_STATO) ;RETURN ANY ERRORS ; ; DONE, RESTORE & RETURN ; RW_RET: OR A,A ;SE NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNRMS THE PHYSICAL READ FROM THE DISK INTO CPM_DMA, ; WITHOUT BLOCKING. ; ENTRY- (CPM_DSK)= DISK # TO READ FROM ; (CPM_TRK)= TNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNM_SEC)= SECTOR # TO READ FROM ; (CPM_DMA)= XFER ADDRESS ; IX= DDT PTR ; IY= DPB PTR ; EXIT - (IOPB.PB_STATO)= 0: OK, /0: 9NNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNN!ON STACK) ; RET ;**************************************************************************** ; ; BUF_FLSH FLUSHES THEINNNNNNNNNNNNNNNN#-KNNNNNNNNNNNNNNNNNNNNN!; ELSE CLEAN BUFFER ; LD (BUF_MOD),A RET ;**************************************************************************NNNNNNNNNNNNNNNNN)€NNNNNNNNNNNNNNNNNNNNN! TO READ FROM ; IX= DDT PTR ; IY= DPB PTR ; EXIT - (IOPB.PB_STATO)= 0: OK, /0: ERROR ; ;*********************************aHNNNNNNNNNNNNNNNNN/h&NNNNNNNNNNNNNNNNNNNNNN RETDVRT ;DRIVE IS STILL IN C REGISTER ; ; IF DRIVE ERROR THEN RETURN (HL= 0) ; RET NZ ; ; ELSE SAVE PTR ; LD (CUErNNNNNNNNNNNNNNNNXNNNNNNNNNNNNNNNNNNNNNNRITE OPERATION, MARK AND SWITCH DIRECTION ; LD A,1 ;BUFFER = DIRTY LD (BUF_MOD),A ; ; SAVE BUFFER DATA PTRS FOR LATER ] NNNNNNNNNNNNNNNN ;NNNNNNNNNNNNNNNNNNNNN!T RESULT STATUS FLAG POP IY POP IX ; RET ;**************************************************************************NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNRACK # TO READ FROM ; (CPM_SEC)= SECTOR # TO READ FROM ; (CPM_DMA)= XFER ADDRESS ; EXIT - (IOPB.PB_STATO)= 0: OK, /0: ERRORlNNNNNNNNNNNNNNNNN$NNNNNNNNNNNNNNNNNNNNNNERROR ; ;**************************************************************************** ; CPM_RD: ; LD HL,LL_READ ; ; CʟrNNNNNNNNNNNNNNNN^NNNNNNNNNNNNNNNNNNNNN! BUFFER DATA IF MODIFIED ; ENTRY- (BUF_DSK)= DISK # TO WRITE TO ; (BUF_TRK)= TRACK # TO WRITE TO ; (BUF_PSEC)= SECTOR # TO .NNNNNNNNNNNNNNNNN$NNNNNNNNNNNNNNNNNNNNNN** ; ; BUF_WR PERFORMS THE PHYSICAL WRITE FROM BLKBUF TO THE HOST DISK. ; ENTRY- (BUF_DSK)= DISK # TO WRITE TO ; (BUF_TRK)=8NNNNNNNNNNNNNNNNN*NNNNNNNNNNNNNNNNNNNNNN******************************************* ; BUF_RD: ; LD HL,LL_READ ; ; COMMON CODE ; BUF_RW: PUSH HL LD HL,BUF_TNNNNNNNNNNNNNNNNN0{kNNNNNNNNNNNNNNNNNNNNN!R_DDT),HL ; ; FETCH FLAGS ; INC HL ;EXE +1 INC HL ;FLGS LD C,(HL) ; ; FETCH DISK PARAMETER BLOCK ADDRESS ; I;g'NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNˁg4Ѕl:ԉo< ׍tBޑyG䕲O뙹U#񝾞[)Ţ`.ʦNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNzNNNNNNNNNNNNNNNNNNNNNNNC HL ;DRV INC HL ;DPB_PTR LD E,(HL) INC HL LD D,(HL) LD (CUR_DPB),DE ; ; FETCH DISK PARAMETER HEADER ADDRESS ;NNNNNNNNNNNNNNNNNYNNNNNNNNNNNNNNNNNNNNNN+ PB_ST2O) CP A,-1 ;-1:NONE, 0:JADE, 1:DESCRIPTOR, 2: EXTENDED, ; 3: PARTITIONED, ID JR Z,LGDEF ; ; ELSE IF OLD FNNNNNNNNNNNNNNNN ?NNNNNNNNNNNNNNNNNNNNNNDT_HDS),A ; ; RETURN DRIVE TABLE PTR ; LD HL,(CUR_DPH) XOR A,A ;RETURN NO-ERROR JR LGDONE ; ; ; IF NOT HARD DISdNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!************************************************ ; HOME: ; ; IF PENDING WRITE (BUFFER DIRTY) THEN IGNORE ; LD A,(BUF_MOBNNNNNNNNNNNNNNNN%NNNNNNNNNNNNNNNNNNNNNN ;**************************************************************************** ; ; SET TRANSFER ADDR ; ENTRY- BC= ADDRESS ;(NNNNNNNNNNNNNNNNNZNNNNNNNNNNNNNNNNNNNNNNF TABLE ADDR = 0 THEN NO TRANSLATION OR A,E JP Z,NOTRAN ; ; ELSE CALCULATE NEW SECTOR FROM TABLE ; EX DE,HL ADD HL, NNNNNNNNNNNNNNNN%NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++++ ; ; LOW LEVEL READ ; ENTRY- IX= DDT PTR ; IY= DPB PTR ; EXIT - IOPB.PB_STATO, pBNNNNNNNNNNNNNNNN+NNNNNNNNNNNNNNNNNNNNNNO_ERR ; ; INHIBIT UPLOAD ; LD A,1 SHL PB_INHX LD (IOPB + PB_FLGO),A ; ; CALCULATE DOWNLOAD BYTE COUNT ; LD A,(IYV1NNNNNNNNNNNNNNNN/NNNNNNNNNNNNNNNNNNNNN! INC HL ;DPH PTR LD E,(HL) INC HL LD D,(HL) LD (CUR_DPH),DE EX DE,HL ;PUT DPH PTR IN HL FOR RETURN ; ; IF NOT SNNNNNNNNNNNNNNNNNgNNNNNNNNNNNNNNNNNNNNNNORMATS THEN PAD DPB DATA ; CP A,3 JR NC,IDOK ; LD HL,BLKBUF + ID_PSHO ;FILL DATA WITH 0S LD B,ID_FLGO - ID_PSHO ; PAc$NNNNNNNNNNNNNNNNjNNNNNNNNNNNNNNNNNNNNNNK THEN GO DO FLOPPY TEST ; LGDEF: BIT 4,(IX + DDT_FLG) JR Z,LGCKFD ; ; ELSE USE HARD DISK DEFAULTS ; CALL TRNONE ; rNNNNNNNNNNNNNNNNyNNNNNNNNNNNNNNNNNNNNNND) OR A,A JR NZ,HOME2 ; ; ELSE PURGE BUFFER ; LD (BUF_ACT),A ; HOME2: ; ; JUST SET TRACK TO 0 ; LD BC,0 ; oANNNNNNNNNNNNNNNNvNNNNNNNNNNNNNNNNNNNNNN EXIT - A= ? ; ;**************************************************************************** ; SETDMA: LD (CPM_DMA),BC ; 7NNNNNNNNNNNNNNNNN O(NNNNNNNNNNNNNNNNNNNNNNBC LD L,(HL) ; LD H,0 RET ; ; ; CONVERT FROM CP/M'S LOGICAL SECTOR {0..N-1} TO PHYSICAL SECTOR {1..N} ; NOTRAN:I!NNNNNNNNNNNNNNNN&NNNNNNNNNNNNNNNNNNNNN!A= STATUS ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; LL_READ: ; ; ENABLE UPLOAD !NNNNNNNNNNNNNNNN, ENNNNNNNNNNNNNNNNNNNNNN + DPB_PSH) ;USE SHIFT FACTOR {0:128, 1:256, 2:512, 3:1024} LD HL,128 ;START WITH 128 BYTES ; AND A,3 ;LIMIT TO 1024-BYTE}{NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNFIRST SELECT OR LOGON INHIBITED THEN RETURN TABLE PTR ; LD A,(LOGRQ) ;0: LOGON, 1:INHIBIT OR A,C ;0: NORMAL, 1: INHIBIT NNNNNNNNNNNNNNNNNN VNNNNNNNNNNNNNNNNNNNNNNDIDL: LD (HL),0 INC HL DJNZ PADIDL ; ; ELSE XFER ID SECTOR DATA TO TABLES ; IDOK: CALL TRNONE ;ASSUME NO TRANSLATION NNNNNNNNNNNNNNNNNYNNNNNNNNNNNNNNNNNNNNN!NO XLATE LD HL,HDPBK ; ; XFER DATA TO TABLES ; SEL2: LD DE,(CUR_DPB) ; USE DEFAULT TABLE LD BC,DPB_SZ LDIR ; LD ; NNNNNNNNNNNNNNNNHNNNNNNNNNNNNNNNNNNNNNN; FALL INTO SET TRACK ; ;**************************************************************************** ; ; SET TRACK # NNNNNNNNNNNNNNNNNNGNNNNNNNNNNNNNNNNNNNNN!LD A,(BUF_DMAB) ;FETCH BANK ADDRESS SET BY COLD START LD (CPM_DMAB),A ; ; DONE ; RET ;++++++++++++++++++++++++++++TNNNNNNNNNNNNNNNNN!|NNNNNNNNNNNNNNNNNNNNNN LD HL,1 ADD HL,BC RET SUBTTL DISK SUPPORT ROUTINES ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++NNNNNNNNNNNNNNNNN'ֿNNNNNNNNNNNNNNNNNNNNN!; XOR A,A LD (IOPB + PB_FLGO),A ; ; DISABLE DOWNLOAD ; LD HL,0 LD (IOPB + PB_BCNTO),HL ; ; PASS READ SECTOR COMNNNNNNNNNNNNNNNN-9tNNNNNNNNNNNNNNNNNNNNNN SECTORS ; JR Z,LL_WR2 ;IF SHIFT_FACTOR == 0 THEN DONE ; LL_WR3: ADD HL,HL ;DOUBLE COUNT DEC A JP NZ,LL_WR3 ; LL_WR2NNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNCPL AND A,1 RET Z ; ; ELSE LOG ON DRIVE ; PUSH IX ;SAVE REGS PUSH IY ; LD IX,(CUR_DDT) ;SET REGS LD IY,(CUR_DNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN ; ; IF HARD DISK OR DOUBLE DENSITY THEN NO TRANSLATION ; LD A,(BLKBUF + ID_FLGO) AND A,[1 SHL DF_DTDB] OR [1 SHL DF_HAR2rNNNNNNNNNNNNNNNNNJNNNNNNNNNNNNNNNNNNNNNNA,(HL) ;HEADS VALUE JR SEL1 ; ; ; USE 8" FLOPPY DEFAULTS ; LGCKFD: CALL TR8 LD HL,SD8PBK JR SEL2 ; ; ERROR EXINNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN ; ENTRY- BC= TRACK # ; ;**************************************************************************** ; SETTRK: LD (CPM_TRfNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++++++++++ ; ; SECTOR TRANSLATION FUNCTION ; ENTRY- DE= 0: NO XLATE, ELSE PTR TO XLATE IErNNNNNNNNNNNNNNNN")JNNNNNNNNNNNNNNNNNNNNNN++++++++++++ ; ; LOGON DISK FUNCTION ; EXIT - A= 0: OK; /0: ERROR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++7NNNNNNNNNNNNNNNNN(ƁNNNNNNNNNNNNNNNNNNNNNNMAND ; LD A,PB_READC JP LL_RW ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; LOW 'NNNNNNNNNNNNNNNNN.l'NNNNNNNNNNNNNNNNNNNNNN: LD (IOPB + PB_BCNTO),HL ; ; PASS WRITE COMMAND ; LD A,PB_WRITC ; ; FALL INTO COMMON CODE ; ;+++++++++++++++++ !NNNNNNNNNNNNNNNN;NNNNNNNNNNNNNNNNNNNNN!PB) ; ; ATTEMPT TO READ ID SECTOR ; CALL BUF_FLSH ;FLUSH BUFFER 1ST JR NZ,LOGERR ; CALL DISKLOG JR NZ,LOGERR ; ;&NNNNNNNNNNNNNNNNNN 4NNNNNNNNNNNNNNNNNNNNNNDB] ; ; ELSE SET TRANSLATION ; CALL Z,TR8 ; ; XFER DISK DATA TO DPB ; LD DE,(CUR_DPB) ;GET ADDR OF DPB LD HL,BLNNNNNNNNNNNNNNNNNyNNNNNNNNNNNNNNNNNNNNNNT ; LOGERR: LD HL,0 ; ; DONE ; LGDONE: POP IY ;RESTORE REGS POP IX RET ;***************************************ΑNNNNNNNNNNNNNNNNN*NNNNNNNNNNNNNNNNNNNNNNK),BC RET ;**************************************************************************** ; ; SET SECTOR ; ENTRY- BC= SEpNNNNNNNNNNNNNNNN ٍuB{I啳M陸T"𝾞Z(â_-ɦNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNMDO),A ; ; OFFSET SECTOR ; LD HL,(IOPB + PB_SECO) LD A,L ADD A,(IX + DDT_SOF) LD L,A LD A,H ADC A,(IX + DDT_SOFNNNNNNNNNNNNNNNNN|NNNNNNNNNNNNNNNNNNNNN!EB CALL EDITOR ; ; GET USER RESPONSE ; CALL CI ;GET USER RESPONSE ; PUSH AF ;SAVE CHAR LD C,A ;ECHO CHAR CALLNNNNNNNNNNNNNNNN ~NNNNNNNNNNNNNNNNNNNNN!********************************************* ; ; SET 3740 SECTOR TRANSLATION PROCEDURE ; ENTRY- (CUR_DPH)= MUST BE PTR TO DPR9NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; XPRIM: ; ; EXECUTE THE PRIMITIVE IN ROM ; LD A,(B+rNNNNNNNNNNNNNNNN\NNNNNNNNNNNNNNNNNNNNNNIVER FUNCTION ; ENTRY- IY= DRIVER TABLE PTR ; EXIT - A= 0: OK; /0: ERROR ; ;++++++++++++++++++++++++++++++++++++++++++++++++INNNNNNNNNNNNNNNNNoNNNNNNNNNNNNNNNNNNNNN!T SUBTTL BIOS FUNCTION CALLS ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; FUNCTIONNNNNNNNNNNNNNNNN%1NNNNNNNNNNNNNNNNNNNNNN###################################### ; ; BIOS FUNCTION TABLE ; ;##########################################################J !NNNNNNNNNNNNNNNN+?>NNNNNNNNNNNNNNNNNNNNNNRIVER TABLE BASE PTR ; NZ= ILLEGAL DRIVE REQUESTED (HL=0) ; A, B, C= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++WBNNNNNNNNNNNNNNNN@NNNNNNNNNNNNNNNNNNNNNN + 1) LD H,A LD (IOPB + PB_SECO),HL ; ; SET PHYSICAL DRIVE ; LL_DO: LD A,(IX + DDT_DRV) LD (IOPB + PB_DRVO),A ; ; hNNNNNNNNNNNNNNNNNlNNNNNNNNNNNNNNNNNNNNNN COC CALL CRLF ;NEW LINE POP AF ; AND A,5FH ;INSURE UPPER CASE ; ; IF RETRY THEN TRY AGAIN ; CP A,'R' ;IF RETRYXdNNNNNNNNNNNNNNNN-NNNNNNNNNNNNNNNNNNNNNNH ; EXIT - DE, HL= ? ; ;**************************************************************************** ; TR8: LD DE,SDTRAN TBNNNNNNNNNNNNNNNN*NNNNNNNNNNNNNNNNNNNNNNUF_DMAB) ;PRESET IOPB BANK LD E,A ; LD HL,IOPB CALL MR_XIOB ;EXECUTE THE FUNCTION ; OR A,A ;FUNCTION ERR? RET NZ \ NNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNN!++++++++++++++++++++++++++++ ; FD8EXEC: ; ; IF HEADS == 1 THEN EXECUTE IOPB ; LD A,(IX + DDT_HDS) DEC A JP Z,XPRIM INNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN DISPATCHER ; ENTRY- C= FUNCTION # ; EXIT - A= -1: ERROR, 0: OK ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++aNNNNNNNNNNNNNNNN&IbNNNNNNNNNNNNNNNNNNNNN!################## ; BFUNTBL: DW RETVERS ;0:RETURN VERSION # DW RETDVRTF ;1:RETURN DISK PHYSICAL CONFIGURATION TABLE PTR "NNNNNNNNNNNNNNNN,NNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++ ; RETDVRTF: ; ; ADJUST REGISTER ; LD C,E ; ; FALL INTO LOCAL ENTRY ; ;++++++++++NNNNNNNNNNNNNNNNqNNNNNNNNNNNNNNNNNNNNN! FETCH DRIVER VECTOR & EXECUTE DISK DRIVER ; LL_OPLP: LD HL,LL_OPRET ;PUT RETURN ADDRESS ON STACK PUSH HL ; LD L,(IX NNNNNNNNNNNNNNNN _NNNNNNNNNNNNNNNNNNNNNN THEN RETURN TO CALLER JR Z,LL_OPLP ; ; ELSE IF ABORT THEN DO WARM BOOT ; CP A,'A' ;IF ABORT THEN RE-BOOT JP Z,0 ; 3NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN ; SETTR: LD HL,(CUR_DPH) LD (HL),E INC HL LD (HL),D RET ;********************************************************RNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN; ; RETURN THE COMMAND RESULTS STATUS ; LD A,(IOPB + PB_STATO) OR A,A RET ;++++++++++++++++++++++++++++++++++++++9NNNNNNNNNNNNNNNNN:NNNNNNNNNNNNNNNNNNNNNN ; ; ELSE SELECT SIDE FROM TRACK BIT 0 ; LD HL,(IOPB + PB_TRKO) PUSH HL ;SAVE ORIGINAL DATA ; LD A,(IOPB + PB_SECO t'NNNNNNNNNNNNNNNNN!NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++ ; BIOFUNC: ; ; IF FUNCTION # NOT IN TABLE THEN RETURN -1 ; LD A,C CP A,MAXFUNCS LD A,-1 RET N+NNNNNNNNNNNNNNNNN'zSNNNNNNNNNNNNNNNNNNNNNN MAXFUNCS EQU ($ - BFUNTBL) / 2 ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN xHNNNNNNNNNNNNNNNN-NNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN DRIVER TABLE PTR FUNCTION ; ENTRY- C= DRIVE # CWBNNNNNNNNNNNNNNNN)NNNNNNNNNNNNNNNNNNNNNN+ DDT_EXE) ;FETCH DRIVER ADDRESS FROM TABLE LD H,(IX + DDT_EXE + 1) JP (HL) ; ; DRIVER RETURNS HERE ; LL_OPRET: ; ; .NNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNN! ; ELSE IF DEBUGGER THEN EXECUTE IT ; CP A,'M' JP Z,MR_BRK ; ; ELSE IF IGNORE THEN RETURN NO ERROR ; SUB A,'I' ;IriNNNNNNNNNNNNNNNNNQNNNNNNNNNNNNNNNNNNNNNN******************** ; ; SET NO SECTOR TRANSLATION PROCEDURE ; EXIT - HL, DE= ? ; ;****************************************,VNNNNNNNNNNNNNNNNLNNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++ ; ; HARD DISK DRIVER FUNCTION ; ENTRY- IX= DRIVER TABLE PTR ; EXIT - A= 0: OK; /0: ERmNNNNNNNNNNNNNNNN BIT_BUCKET ; SRL H RR L RRA ;TRK BIT 0 -> SECTOR BIT 15 LD (IOPB + PB_SECO + 1),A ; LNNNNNNNNNNNNNNNN"NNNNNNNNNNNNNNNNNNNNN!C ; ; ELSE COMPUTE TABLE ENTRY ; PUSH HL ;SAVE POSSIBLE DATA ; LD HL,BFUNTBL LD A,C ADD A,A ADD A,L LD L,A XNNNNNNNNNNNNNNNNN(jmNNNNNNNNNNNNNNNNNNNNN!BIOS VERSION # FUNCTION #0 ; EXIT - HL= VERSION # IN BINARY {0.00,..655.35} ; ;++++++++++++++++++++++++++++++++++++++++++++++.NNNNNNNNNNNNNNNNN.NNNNNNNNNNNNNNNNNNNNNN; EXIT - E:HL= DRIVER TABLE BASE PTR ; NZ= ILLEGAL DRIVE (HL= 0) ; A, B, C= ? ; ;+++++++++++++++++++++++++++++++++++++++++NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN IF NO ERRORS THEN RETURN ZF ; RET Z ;IF NO_ERROR THEN RETURN ; ; PRINT ERROR ; IOPBDMP: LD A,(BUF_DMAB) ;SET BANK NNNNNNNNNNNNNNNNN 9NNNNNNNNNNNNNNNNNNNNNNF IGNORE THEN RETURN NO ERROR RET Z ; ; ELSE RETURN ERROR TO BDOS ; LD A,-1 ;RETURN -1 TO BDOS OR A,A RET ; ; ;NNNNNNNNNNNNNNNNN`NNNNNNNNNNNNNNNNNNNNNN************************************ ; TRNONE: LD DE,0 JR SETTR SUBTTL HARD DISK ROUTINES ;++++++++++++++++++++++++++.NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNROR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; HDEXEC: EQU XPRIM SUBTTL JADE FLpQNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNND (IOPB + PB_TRKO),HL ;TRACK = RESIDUAL ; ; EXECUTE THE IOPB ; CALL XPRIM ; ; RESTORE THE MODIFIED IOPB SO RETRY WILLNNNNNNNNNNNNNNNN#NNNNNNNNNNNNNNNNNNNNN!LD A,0 ADC A,H LD H,A ; ; EXECUTE TABLE ADDRESS ; LD A,(HL) INC HL LD H,(HL) LD L,A ; EX (SP),HL ;PUT CALLEHNNNNNNNNNNNNNNNNN)Y\NNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++ ; RETVERS: LD HL,VERSN XOR A,A ;RETURN NO ERROR RET ;+++++++++++++++++++++++++++++I@NNNNNNNNNNNNNNNNN/NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++ ; RETDVRT: ; ; ASSUME DRIVE 0 ; LD HL,DDT_0 ;START AT 1ST TABLE ; ; IF DRIVE ==U#NNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNN! LD E,A ; LD HL,IOPB LD A,MF_DIOB ;USE DISPLAY IOPB DATA FUNCTION CALL XMROM ; ; QUERY USER FOR OPTION ; LD HL,DSKJNNNNNNNNNNNNNNNN ONNNNNNNNNNNNNNNNNNNNNN DISPLAY WRITE PROTECT ERROR MESSAGE ; DO_ERR: LD HL,WP_ERM CALL EDITOR JR IOPBDMP ;*******************************]NNNNNNNNNNNNNNNN3NNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EXECUTE THE IOPB PRIMITIVE ; EXIT - A= 0: OK, /0: ERROR ; ;+++++++++`NNNNNNNNNNNNNNNNNoNNNNNNNNNNNNNNNNNNNNN!OPPY DRIVER ROUTINES ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; JADE 8" FLOPPY DISK DRNNNNNNNNNNNNNNNN^NNNNNNNNNNNNNNNNNNNNNN WORK ; POP HL ;TRACK LD (IOPB + PB_TRKO),HL ; LD HL,IOPB + PB_SECO +1 ;CLEAR BIT 15 RES 7,(HL) ; ; DONE ; RENNNNNNNNNNNNNNNNN$/NNNNNNNNNNNNNNNNNNNNNNR'S DATA IN HL, FUNCTION ADDR ON RET ; STACK, EXECUTE FUNCTION ADDRESS ON STACK ;######################################DNNNNNNNNNNNNNNNNNN* NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN DRIVER TABLE PTR FUNCTION #1 ; ENTRY- E= DRIVE # ; EXIT - E:HL= Dh$NNNNNNNNNNNNNNNNN0NNNNNNNNNNNNNNNNNNNNN! 0 THEN ALREADY THERE ; LD A,C OR A,A RET Z ; ; ELSE IF ILLEGAL DRIVE THEN RETURN ERROR ; CP A,NDRVS JR C,RETDV2S)NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNrNNNNNNˁf3Ѕl:Չp= ؍tBߑ{H䕱NꙹU#𝽞Z(Ģ_-ɦNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN#NNNNNNNNNNNNNNNNNNNNNN ; LD HL,0 OR A,A ;SET NZ RET ; ; ; ELSE COMPUTE TABLE PTR ; RETDV2: LD B,C LD DE,DDT_SIZ ; RETDVL: ADD HL,DEe\NNNNNNNNNNNNNNNNNKNNNNNNNNNNNNNNNNNNNNNNIONAL FUNCTIONS TO SUPPORT CDOS PROGRAMS ;*************************************************************************** ; ; SYS{NNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN! CP A,8DH ;IF RETURN VERSION THEN RETURN IT JR Z,RETCVER ; CP A,90H ;IF NOT CLOCK THEN ERR JR C,ILLEGC ; JR Z,CLKCAL|y9NNNNNNNNNNNNNNNN2NNNNNNNNNNNNNNNNNNNNN!+++++++++++++++++++++++ ; RETCVER: LD B,1 RET SUBTTL CLOCK ROUTINES ;++++++++++++++++++++++++++++++++++++++++++++++++WNNNNNNNNNNNNNNNNkNNNNNNNNNNNNNNNNNNNNNNXECUTER ; ENTRY- A= FUNCTION # ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; XMROM: EQUY(NNNNNNNNNNNNNNNNN_NNNNNNNNNNNNNNNNNNNNNNSOLE OUTPUT ; ENTRY- C= CHAR TO OUTPUT ; ;**************************************************************************** ; COQ NNNNNNNNNNNNNNNN%+NNNNNNNNNNNNNNNNNNNNNN; ENTRY- C= CHAR TO OUTPUT ; ;**************************************************************************** ; LO: LD A,MF_LY!NNNNNNNNNNNNNNNN+NNNNNNNNNNNNNNNNNNNNNN########################################################## ; ; 3740 SECTOR TRANSLATION TABLE ; **** CP/M SINGLE DENSITY **** NNNNNNNNNNNNNNNNpNNNNNNNNNNNNNNNNNNNNNN DJNZ RETDVL ; LD A,(BUF_DMAB) LD E,A ; ; RETURN NO ERROR ; XOR A,A RET ;++++++++++++++++++++++++++++++++++NNNNNNNNNNNNNNNNN[NNNNNNNNNNNNNNNNNNNNNNTEM CALL INTERCEPT ROUTINE CHECKS FOR ILLEGAL BDOS CALLS & ; PRINTS MESSAGE IF ILLEGAL. ALSO IMPLEMENTS CDOS CLOCK/CALENDAR ;NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN ;IF CALENDAR THEN GET IT ; CP A,92H JR Z,CLKTIM ;IF TIME THEN GET IT ; ; ILLEGAL SYSTEM CALL ; ILLEGC: PUSH BC ;SAVENNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++ ; ; RETURN CALENDAR FUNCTION 90H ; EXIT - A= DAY ; B= MONTH ; C= YEAR ; L= DAY OF WEEK ; R+dNNNNNNNNNNNNNNNN>NNNNNNNNNNNNNNNNNNNNN! MR_FUN SUBTTL CHAR I/O ROUTINES ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; CONSKNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNC: LD A,MF_CO JP XMROM ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; READER DRIVEzkBNNNNNNNNNNNNNNNN&~RNNNNNNNNNNNNNNNNNNNNNNO JP XMROM ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN LIST DEVICE STATUS ihNNNNNNNNNNNNNNNNN,NNNNNNNNNNNNNNNNNNNNNN ; ;############################################################################ ; SDTRAN: GXLATE 26,6 ;################LNNNNNNNNNNNNNNNNANNNNNNNNNNNNNNNNNNNNN!++++++++++++++++++++++++++++++++++++++++++ ; ; GET BANK NUMBER FUNCTION ; EXIT - A= BANK # ; ;+++++++++++++++++++++++++++++RNNNNNNNNNNNNNNNNN hNNNNNNNNNNNNNNNNNNNNNN SYSTEM CALLS FOR ASMB. ; ;*************************************************************************** INTCPT: LD A,C ;CHECP?NNNNNNNNNNNNNNNNN,NNNNNNNNNNNNNNNNNNNNNN FUNCTION # ; ; OUTPUT WARNING MESSAGE ; LD HL,ISCMSG ;OUTPUT WARNING CALL EDITOR ; ; OUTPUT FUNCTION # ; POP BC5NNNNNNNNNNNNNNNN.NNNNNNNNNNNNNNNNNNNNNN ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; CLKCAL: LD A,MF_GCAL JP XMROM ;+++++NNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNOLE INPUT ; EXIT - A= CHAR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; CI: LD A,MF_VNNNNNNNNNNNNNNNNN!NNNNNNNNNNNNNNNNNNNNNNR - DUMMY ; EXIT - A= CTRL-Z ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; READER: LD AMSNNNNNNNNNNNNNNNNN'McNNNNNNNNNNNNNNNNNNNNN! ; EXIT - A= 0: BUSY, FFH:READY ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; LISTST: tNNNNNNNNNNNNNNNN-NNNNNNNNNNNNNNNNNNNNNN############################################################ ; ; COMMON I/O PARAMETER BLOCK ; ;#############################CaBNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++++++++ ; GETBNK: LD A,MF_GBNK JP MR_FUN SUBTTL NON-DISK PROCEDURES ;*****'!NNNNNNNNNNNNNNNN =NNNNNNNNNNNNNNNNNNNNNNK CALL VALIDITY CP A,41 ;IF <= 40 THEN OK ; BDOSV EQU $ + 1 JP C,BDOS + 11H ;THIS ADDR MODIFIED BY WARM BOOT RTN ; ; TQ?NNNNNNNNNNNNNNNNNaNNNNNNNNNNNNNNNNNNNNNN LD A,MF_PHXB CALL XMROM ; ; OUTPUT NEW LINE ; CALL CRLF ; ; RETURN NULLS ; XOR A,A ;BC = HL = A = 0 LD L,A6rNNNNNNNNNNNNNNNN{NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN TIME FUNCTION 92H ; EXIT - A= SECONDS ; NNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNCI JP XMROM ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN CONSOLE STATUS ; %]yNNNNNNNNNNNNNNNN"NNNNNNNNNNNNNNNNNNNNNN,CTRLZ ;FAKE EOF ; ; FALL INTO PUNCH RETURN ; ;**********************************************************************ErNNNNNNNNNNNNNNNNN(]]NNNNNNNNNNNNNNNNNNNNN!LD A,MF_LOS JP XMROM ;**************************************************************************** ; ; MESSAGE EDITOR NNNNNNNNNNNNNNNNN.NNNNNNNNNNNNNNNNNNNNN!############################################### ; IOPB: REPT PB_SIZE LIST OFF DB 0 LIST ON ENDM ;################_NNNNNNNNNNNNNNNNNN-NNNNNNNNNNNNNNNNNNNNNN********************************************************************** ; ; NEWLINE PROCEDURE ; ;****************************NNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNN!HE FOLLOWING CONDITIONAL JUMP IS MODIFIED TO AN UNCONDITIONAL JUMP BY ; THE WARM BOOT ROUTINE IF THE CLOCK/CALENDAR BOARD IS N+NNNNNNNNNNNNNNNNNPNNNNNNNNNNNNNNNNNNNNN! LD H,A LD C,A LD B,A RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; CDOS lNNNNNNNNNNNNNNNNNHNNNNNNNNNNNNNNNNNNNNNNB= MINUTES ; C= HOURS ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; CLKTIM: LD A,MF_vrNNNNNNNNNNNNNNNN=NNNNNNNNNNNNNNNNNNNNN!EXIT - A= 0: NOT READY ; FFH: CHAR READY ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ VNNNNNNNNNNNNNNNN#NNNNNNNNNNNNNNNNNNNNNN****** ; ; PUNCH DRIVER ; ENTRY- C= CHAR TO OUTPUT ; ;*********************************************************************"NNNNNNNNNNNNNNNNN)nlNNNNNNNNNNNNNNNNNNNNN!; ENTRY- HL= TEXT PTR (BIT 7= 1: TERMINATOR) ; EXIT - REGS= ? ; ;************************************************************O[NNNNNNNNNNNNNNNNN/NNNNNNNNNNNNNNNNNNNNNN############################################################ ; ; DISK DRIVER TABLES (DDT) ; ;###############################KNNNNNNNNNNNNNNNNxNNNNNNNNNNNNNNNNNNNNN!*********************************************** ; CRLF: LD C,CR CALL COC LD C,LF JP COC IF INTCPTS SUBTTL ADDITk NNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNOT PRESENT ; IF NOT MODIFIED, THEN IT IS ALLWAYS FALSE (NOP). ; INHCLK: JR C,ILLEGC ; ; NOW CHECK FOR EXTENDED CALLS ; NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!RETURN VERSION FUNCTION ; MAKES CLOCK/CALENDAR WORK. ; EXIT - B= 1 ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++[HNNNNNNNNNNNNNNNNNXNNNNNNNNNNNNNNNNNNNNN!GTIM JP XMROM ENDIF ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; MONITOR ROM EZ(rNNNNNNNNNNNNNNNNnNNNNNNNNNNNNNNNNNNNNN! ; CNSCK: LD A,MF_CIS JP XMROM ;**************************************************************************** ; ; CON@HNNNNNNNNNNNNNNNNN$0NNNNNNNNNNNNNNNNNNNNN!******* ; PUNCH: RET ;**************************************************************************** ; ; PRINTER DRIVER }]NNNNNNNNNNNNNNNNN*;?NNNNNNNNNNNNNNNNNNNNNN**************** ; EDITOR: CALL GETBNK LD E,A LD A,MF_PUTS JP XMROM SUBTTL INITIALIZED DATA ;##################q$NNNNNNNNNNNNNNNNN0ׇNNNNNNNNNNNNNNNNNNNNNN############################################# ; STRUCT 0 DDT_EXE DS 2 ;START ADDRESS OF DISK DRIVER DDT_FLG DS 1 ;FLAGS BIRNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN&NNNNNNNNNρi6хk9Ӊn; ׍r@ܑwEᕮ}K癵Q읹U"񡾢Z(ĦnNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!T DEF. ; 0 1: INHIBIT LOGON ; 1..3 PARTITION # {0,..7} ; 4 1: HARD DISK DRIVE ; DDT_DRV DS 1 ;PHYSICAL DRIVE #NNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN@@@@@@@@@@ ; ALLDRV MACRO #DADD,#PD,#FLG,#DPB,#DPH,#HDS,#SOF DW #DADD ;DRIVER EXECUTION ADDR DB #FLG ;FLAGS DB #PD ;M-{NNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNN!6,10H,D2DPB,D2DPH,4,0 ; D DDT_3: ALLDRV HDEXEC,6,12H,D3DPB,D3DPH,4,8000H ; E DDT_4: ALLDRV HDEXEC,7,10H,D4DPB,D4DPH,4,0 j*NNNNNNNNNNNNNNNNŶNNNNNNNNNNNNNNNNNNNNNN########################################## ; SD8PBK: DW 26 ;SECTORS PER TRACK DB 3 ;BLOCK SHIFT FACTOR DB 7 ;BLOCK MASKyNNNNNNNNNNNNNNNN*}NNNNNNNNNNNNNNNNNNNNNN) DB 1 ;NULL MASK (EXM) DW 1015 ;DISK SIZE (CLUSTERS -1) (DSM) DW 1152 / 2 ;DIRECTORY MAX (DRM) DB 0FFH ;ALLOCATIDINNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ALLDPH: MACRO #D LIST ON D#D(DD)DPH: ;DRIVE PARAMETER HEADER FOR DRIVE #D(DD) DNNNNNNNNNNNNNNNN%jNNNNNNNNNNNNNNNNNNNNNN####################################################### ; LOGIOPB: DB PB_LOGC ;COMMAND DB 0 ;DRIVE DW 0 ;TRACK DW ID_SlNNNNNNNNNNNNNNNN+INNNNNNNNNNNNNNNNNNNNNNS 1 ;XFER BANK ; ; ; BUFFER IOPB OVERLAY ; BUF_DSK DS 1 ;BUFFER DISK NUMBER BUF_TRK DS 2 ;BUFFER TRACK NUMBER BUF_SEC DINNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN! DDT_DPB DS 2 ;DPB ADDRESS FOR THIS DRIVE DDT_DPH DS 2 ;DPH ADDRESS FOR THIS DRIVE ; ; THE FOLLOWING MAY BE BROUGHT OFF DIHNNNNNNNNNNNNNNNNN?NNNNNNNNNNNNNNNNNNNNNNONITOR PHYSICAL DRIVE # DW #DPB ;DISK PARAMETER BLOCK PTR DW #DPH ;DISK PARAMETER HEADER PTR DB #HDS ;HEADS DW #SOF HNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN ; F DDT_5: ALLDRV HDEXEC,7,12H,D5DPB,D5DPH,4,8000H ENDIF ;#########################################################5NNNNNNNNNNNNNNNN\!NNNNNNNNNNNNNNNNNNNNNN DB 0 ;NULL MASK DW 242 ;DISK SIZE -1 DW 63 ;DIRECTORY MAX DB 11000000B ;ALLOC 0 DB 0 ;ALLOC 1 DW 16 ;CHECK SIZ1NNNNNNNNNNNNNNNN.NNNNNNNNNNNNNNNNNNNNNNON 0 (AL0) DB 10000000B ;ALLOCATION 1 (AL1) DW 0 ;CHECK SIZE (CKS) DW 2 ;TRACK OFFSET (OFF) DB 1 ;PHYSICAL REHNNNNNNNNNNNNNNNNN pNNNNNNNNNNNNNNNNNNNNN!W 0 ;;SECTOR TRAN TBL (OR 0 IF NO XLATE) DW 0 ;;SCRATCH AREA DW 0 ;;" DW 0 ;;" DW DIRBF ;;DIRECTORY BUFFER PTR DW2aNNNNNNNNNNNNNNNN&?NNNNNNNNNNNNNNNNNNNNNNECT ;SECTOR DB 0 ;FLAGS DW BLKBUF ;DMA DB 0 ;BANK DW 0 ;COUNT ; WR_PROT DB -1 ;/0: WRITE PROTECTION ENABLED ; ; XNNNNNNNNNNNNNNNNN,NNNNNNNNNNNNNNNNNNNNNNS 2 ;BUFFER SECTOR NUMBER DS 1 ;FLAGS BUF_DMA DS 2 BUF_DMAB DS 1 ;BANK # ; ; ; BLOCKING BUFFER MAINTENANCE ; BUF_PSEC NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!SK DESCRIPTOR OR FROM DEFAULT TABLES ; DDT_HDS DS 1 ;HEADS DDT_SOF DS 2 ;SECTOR OFFSET ; ; DEFINE THE STRUCTURE SIZE ; s NNNNNNNNNNNNNNNNNN )NNNNNNNNNNNNNNNNNNNNN!;SECTOR OFFSET ; ENDM IF BOOT = 10H ; A DDT_0: ALLDRV HDEXEC,6,10H,D0DPB,D0DPH,4,0 ; B DDT_1: ALLDRV HDEXEC,6,1͑NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN################### ; ; MESSAGES ; ;############################################################################ ; MSGLEfNNNNNNNNNNNNNNNNoNNNNNNNNNNNNNNNNNNNNNNE DW 2 ;TRACK OFFSET DB 0 ;PHYSICAL RECORD SHIFT FACTOR DB 0 ;PHYSICAL RECORD MASK DW 0 ;LOGICAL DRIVE SECTOR OFFSET(NNNNNNNNNNNNNNNNNLNNNNNNNNNNNNNNNNNNNNNNCORD SHIFT FACTOR (PSH) DB 1 ;PHYSICAL RECORD MASK (PRM) DW 0 ;LOGICAL DRIVE SECTOR OFFSET (SOF) ; ; ; DB 4 ;HEADS NNNNNNNNNNNNNNNNN!ANNNNNNNNNNNNNNNNNNNNNN D#D(DD)DPB ;;DRIVE PARAMETER BLK PTR IF ((DD - 1) <= NDHD) AND ((DD - 1) >= STHD) DW 0 ;;NO CHECKS ON HARD DISK ELSE=1NNNNNNNNNNNNNNNNN' NNNNNNNNNNNNNNNNNNNNNN LAST OF INITIALIZED CODE READ FROM DISK ; BIOSND EQU $ SUBTTL UNINITIALIZED DATA AREA ;################################'NNNNNNNNNNNNNNNN-,NNNNNNNNNNNNNNNNNNNNNN DS 2 ;BUFFER PHYSICAL SECTOR BUF_ACT DS 1 ;0: BUFFER FLUSHED, /0: DATA IN BUFFER BUF_MOD DS 1 ;0: BUFFER CLEAN, /0: BUFFER DItNNNNNNNNNNNNNNNN_RNNNNNNNNNNNNNNNNNNNNNNDDT_SIZ DS 0 ENDM ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; MACRO TO DEFINE THEY NNNNNNNNNNNNNNNNNN |]NNNNNNNNNNNNNNNNNNNNNN2H,D1DPB,D1DPH,4,8000H ; C DDT_2: ALLDRV HDEXEC,7,10H,D2DPB,D2DPH,4,0 ; D DDT_3: ALLDRV HDEXEC,7,12H,D3DPB,D3DPH,4,8000HBNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!: DM CR,LF,'LOAD ERROR: ' ; DSKEB: DM CR,LF,'Abort, Ignore, Retry, (BDOS) - ' ; WP_ERM: DM CR,LF,'W-PROT Error!' ; IF IԱ9NNNNNNNNNNNNNNNN:CNNNNNNNNNNNNNNNNNNNNNN ; ; DEFAULT DISK PHYSICAL PARAMETERS ; DB 1 ;HEADS ;##############################################################@NNNNNNNNNNNNNNNNNNՈNNNNNNNNNNNNNNNNNNNNNN ;############################################################################ ; ; DRIVE PARAMETER HEADER AREA ; 1 PER DRmNNNNNNNNNNNNNNNN"NNNNNNNNNNNNNNNNNNNNNN DW D#D(DD)CHK ;;DRIVE DISK CHECKSUMS ARRAY PTR ENDIF DW D#D(DD)ALL ;;DRIVE CLUSTER ALLOCATION BIT MAP PTR LIST OFF NNNNNNNNNNNNNNNNN(NNNNNNNNNNNNNNNNNNNNNN############################################ ; ; THE FOLLOWING DATA MUST RESIDE IN THIS ORDER TO MATCH THE IOPB DATA ; ;##NNNNNNNNNNNNNNNNNN.NNNNNNNNNNNNNNNNNNNNN!RTY (MODIFIED) ; BUF_DDT DS 2 ;BUFFER DDT PTR BUF_DPB DS 2 ;BUFFER DPB PTR ; RSFLAG: DS 1 ;0: NO PREREAD REQ'D, /0: PREREADB'NNNNNNNNNNNNNNNNNlcNNNNNNNNNNNNNNNNNNNNNN DRIVER TABLE RECORD ; ENTRY- #DADD= DRIVER ADDRESS ; #PD= PHYSICAL DRIVE # ; #FLG= DRIVE FLAGS ; #DPB= DPB ADDRESS ; #zNNNNNNNNNNNNNNNNN OlNNNNNNNNNNNNNNNNNNNNN! ; E DDT_4: ALLDRV FD8EXEC,0,0,D4DPB,D4DPH,1,0 ; F DDT_5: ALLDRV FD8EXEC,1,0,D5DPB,D5DPH,1,0 ENDIF IF BOOT = 3 WINNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!NTCPTS ISCMSG: DM CR,LF,'ILL SYS CALL, #= ' ENDIF ;###################################################################INNNNNNNNNNNNNNNN rNNNNNNNNNNNNNNNNNNNNNN############## ; ; DEFAULT 8" HARD DISK PARAMETER BLOCK ; ;################################################################# NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNIVE ; ;############################################################################ ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@BNNNNNNNNNNNNNNNN##NNNNNNNNNNNNNNNNNNNNN!ENDM ; ; DEFINE THE DATA ; DD DL 1 REPT NDRVS LIST OFF ALLDPH 0123456789ABCDEF DD DL DD + 1 LIST ON ENDM ;NNNNNNNNNNNNNNNNNN)/NNNNNNNNNNNNNNNNNNNNNN########################################################################## ; ; CP/M IOPB OVERLAY ; CPM_DSK DS 1 ;LOGICAL DINNNNNNNNNNNNNNNNN/NNNNNNNNNNNNNNNNNNNNNNN REQ'D READOP: DS 1 ;0: WRITE OPERATION, 1: READ OPERATION WRTYPE: DS 1 ;WRITE OPERATION TYPE FROM BDOS: ; 0: WRITE TO ALL 9NNNNNNNNNNNNNNNN90NNNNNNNNNNNNNNNNNNNNNNDPH= DPH ADDRESS ; #HDS= HEADS ; #SOF= SECTOR OFFSET ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@NNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN; A DDT_0: ALLDRV FD8EXEC,0,0,D0DPB,D0DPH,1,0 ; B DDT_1: ALLDRV FD8EXEC,1,0,D1DPB,D1DPH,1,0 ; C DDT_2: ALLDRV HDEXEC,BNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN######### ; ; DEFAULT 8" FLOPPY DISK PARAMETER BLOCK ; IBM 3740 SINGLE DENSITY FORMAT ; ;##################################1NNNNNNNNNNNNNNNNNLNNNNNNNNNNNNNNNNNNNNNN########### ; HDPBK: DW 128 ;SECTORS PER TRACK (LOGICAL) (SPT) DB 5 ;BLOCK SHIFT FACTOR (BSH) DB 31 ;BLOCK MASK (BLMNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; GENERATE A DISK PARAMETER TABLE MACRO ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@HgNNNNNNNNNNNNNNNNN$YNNNNNNNNNNNNNNNNNNNNNN############################################################################ ; ; LOGON IOPB OVERLAY ; ;#####################.NNNNNNNNNNNNNNNNN*zNNNNNNNNNNNNNNNNNNNNNNRIVE CPM_TRK DS 2 ;LOGICAL TRACK NUMBER CPM_SEC DS 2 ;LOGICAL SECTOR NUMBER DS 1 ;FLAGS CPM_DMA DS 2 ;XFER ADDR CPM_DMAB D"BNNNNNNNNNNNNNNNNN0NNNNNNNNNNNNNNNNNNNNNNOCATED (USED) BLOCK (PREREAD) ; 1: WRITE TO DIRECTORY (PREREAD & WRITE) ; 2: WRITE TO UNALLOCATED (UNUSED) BLOCK (NO ; NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNŃh5Ѕl:Չp= ׍tAݑyG䕱M陸T!Y'â_-ʦnNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN PREREAD REQ'D) ; ; UNA_CNT: DS 1 ;# SECTORS REMAINING IN BLOCK (CLUSTER) UNA_DSK: DS 1 ;LAST UNALLOC DISK UNA_TRK: DS 2 NNNNNNNNNNNNNNNNN=1NNNNNNNNNNNNNNNNNNNNNN########################################################### ; ; DRIVE ALLOCATION AREAS ; ;################################NNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNECTOR) ENDIF LIST OFF ENDM ; ; RESERVE THE DATA SPACE ; DD DL 1 REPT NDRVS LIST OFF ALLDAL 0123456789ABCDEF 9NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNIN CLUSTERS) ; INT(((#_TRACKS - OFF) * SPT * BYTES PER SECTOR) / CLUSTER SIZE) -1 DPB_DRM DS 2 ;DRM- DIRECTORY SIZE -1 DPB_m|NNNNNNNNNNNNNNNNMNNNNNNNNNNNNNNNNNNNNNNONING BY HEADS ARE IMPLIMENTED BY USING THE FOLLOWING DATA. ; (HEAD BITS ARE INCLUDED IN SECTOR WORD UPPER BITS) ; DPB_SECOiNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNCONMSG **** BIOS TOO BIG, USE MOVCPM & RE-ADJUST! **** ENDIF END ]TrNNNNNNNNNNNNNNNN%]NNNNNNNNNNNNNNNNNNNNNNARD DISK PHYSICAL DRIVE 0 ; C SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 1 ; D SIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 1 ; E2NNNNNNNNNNNNNNNN+~NNNNNNNNNNNNNNNNNNNNNNARD DISK PHYSICAL DRIVE 1 ; G JADE 8" FLOPPY PHYSICAL DRIVE 0 ; H JADE 8" FLOPPY PHYSICAL DRIVE 1 ENDIF ; ;*********NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN;LAST UNALLOC TRACK UNA_SEC: DS 2 ;LAST UNALLOC SECTOR ;##################################################################^$NNNNNNNNNNNNNNNNN-NNNNNNNNNNNNNNNNNNNNNN############################################ ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN DD DL DD + 1 LIST ON ENDM ;############################################################################ ; ; RESERVǵNNNNNNNNNNNNNNNNkNNNNNNNNNNNNNNNNNNNNNNAL0 DS 2 ;AL0,1- DIRECTORY ALLOCATION ; 1 MSB PER DIRECTORY CLUSTER ALLOCATED DPB_CKS DS 2 ;CKS- # DIRECTORY SECTORS CHECKEؚdNNNNNNNNNNNNNNNNHNNNNNNNNNNNNNNNNNNNNNN DS 2 ;SOF- SECTOR OFFSET (FOR LOGICAL DRIVE) ; 0: NONE, 1..65535: OFFSET DPB_SZ DS 0 ENDM ; ; ;@@@@@@@@@@@@@@@@@@@@@@nINNNNNNNNNNNNNNNNN @NNNNNNNNNNNNNNNNNNNNNNPBOFF ABOVE. ; PARTITIONING BY HEADS ARE IMPLIMENTED BY USING THE FOLLOWING DATA. ; (HEAD BITS ARE INCLUDED IN SECTOR WORD U5BNNNNNNNNNNNNNNNN&NNNNNNNNNNNNNNNNNNNNNN JADE 8" FLOPPY PHYSICAL DRIVE 0 ; F JADE 8" FLOPPY PHYSICAL DRIVE 1 ENDIF IF BOOT = 3 ; A JADE 8" FLOPPY PHYSICALh!NNNNNNNNNNNNNNNN,-NNNNNNNNNNNNNNNNNNNNN!******************************************************************* ; ; REVISION HISTORY: ; ; 3.00 - 26 JAN 87 GRH ; Im4NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!########## ; ; VARIABLES ; ;############################################################################ ; CUR_DPB DS 2 NNNNNNNNNNNNNNNNNN >NNNNNNNNNNNNNNNNNNNNNN; ; MACRO TO DEFINE THE DRIVE ALLOCATION & CHECKSUMS AREA ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 'NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNE DRIVE PARAMETER BLOCKS ; ;############################################################################ ; STRUCT 0 DPB_SPNNNNNNNNNNNNNNNNX NNNNNNNNNNNNNNNNNNNNNND ; (DRM +1) / 4 DPB_OFF DS 2 ;OFF- # RESERVED TRACKS (USUALLY 2) ; ; ADDITIONAL CP/M 3.0 DATA (ALSO COULD BE USED BY C%NNNNNNNNNNNNNNNNN{/NNNNNNNNNNNNNNNNNNNNNN@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; GENERATE THE DPB FOR DRIVE MACRO ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@xNNNNNNNNNNNNNNNNN!qNNNNNNNNNNNNNNNNNNNNNN TITLE CUSTOMIZED BIOS FOR M5B LIST NOCOND BOOT EQU 10H ;10H: SA1004, 11H: PYX27, 3: 8" FLOPPY, 20H: 5" FLOPPY ;************NNNNNNNNNNNNNNNNN';NNNNNNNNNNNNNNNNNNNNN! DRIVE 0 ; B JADE 8" FLOPPY PHYSICAL DRIVE 1 ; C SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 0 ; D SIDE 2 & 3 OF HARD DISK PHNNNNNNNNNNNNNNNN-NNNNNNNNNNNNNNNNNNNNNNplemented new common IOPB code & Jade floppy firmware support. ; Implemented disk drive driver tables and new function to retur:BNNNNNNNNNNNNNNNNhbNNNNNNNNNNNNNNNNNNNNNN;DRIVE TABLE PTR CUR_DDT DS 2 ;DRIVE DRIVER TABLE BASE ADDRESS PTR CUR_DPH DS 2 ;DPH PTR ; LOGRQ: DS 1 ;LOG ON REQUEST REG. ЃNNNNNNNNNNNNNNNNN KmNNNNNNNNNNNNNNNNNNNNNN@@@@@@@@@@@@ ; ; ALL = (DSM / 8) + 1 ; CHK = DPB.CKS ; ALLDAL: MACRO #D LIST ON IF ((DD - 1) >= STHD) AND ((DD - 1) = ST8FD) AND ((DD - 1) <= N^,rNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN6K= 7 DPB_BLM DS 1 ;BLM- BLOCK MASK ; 1K = 7, 2K= 15, 4K= 31, 8K= 63, 16K= 127 DPB_EXM DS 1 ;EXM- EXTENT MASK ; DSM < aNNNNNNNNNNNNNNNN>BNNNNNNNNNNNNNNNNNNNNNN DPB_PHM DS 1 ;PHM- PHYSICAL RECORD MASK BASED ON BYTES/SEC ; 0: 128, 1: 256, 3: 512, 7: 1024 ; ; ADDITIONAL DISK PARTIVrNNNNNNNNNNNNNNNNщNNNNNNNNNNNNNNNNNNNNN!DD) LIST OFF ENDM ; ; RESERVE THE DATA SPACE ; DD DL 1 REPT NDRVS LIST OFF ALLDPB 0123456789ABCDEF DD DL DD + 1vNNNNNNNNNNNNNNNN#NNNNNNNNNNNNNNNNNNNNN! CUPERTINO, CA ; ;**************************************************************************** ; ; CONFIGURATION: ; ; CPM rWHNNNNNNNNNNNNNNNNN)NNNNNNNNNNNNNNNNNNNNNN BOOT = 20H ; A JADE 5" FLOPPY PHYSICAL DRIVE 0 ; B JADE 5" FLOPPY PHYSICAL DRIVE 1 ; C SIDE 0 & 1 OF HARD DISK PHYSICANNNNNNNNNNNNNNNNN/~NNNNNNNNNNNNNNNNNNNNNN ; Moved system down to 60k. ; 3.01 26 JUN 88 GRH ; Remove 5" floppy support. Implement in CP/M-86 BIOS. ; Change single funNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN1 ;NUMBER OF BOOT DIRECTORY SEGMENTS SECCNT DS 1 ;SEGMENT SECTOR COUNT LDRPTR DS 2 ;SYSTEM DATA PTR ;#################NNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNND8FD) D#D(DD)ALL: DS 57 ;ALLOCATION BIT MAP FOR 8" DRIVE #D(DD) D#D(DD)CHK DS 32 ;DIRECTORY CHECKSUMS STORAGE (1 BYTE PER SUrNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN256 : 1K= 0, 2K= 1, 4K= 3, 8K= 7, 16K= 15 ; DSM > 255 : 2K= 0, 4K= 1, 8K= 3, 16K= 7 DPB_DSM DS 2 ;DSM- DRIVE STORAGE SIZE (NNNNNNNNNNNNNNNNN.|NNNNNNNNNNNNNNNNNNNNNNTIONING DATA FOR THE LOGICAL DRIVE SELECTION. ; PARTITIONING BY TRACKS ARE IMPLIMENTED THRU BDOS USING DPBOFF ABOVE. ; PARTITI^NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN LIST ON ENDM ; ; BLOCKING BUFFER ; BLKBUF: DS 1024 ;HOST BUFFER IF (($ - 8000H) > 07700H) OR ($ < 8000H) NNNNNNNNNNNNNNNNN$nNNNNNNNNNNNNNNNNNNNNNN ; DRIVE USAGE IF BOOT = 10H ;HARD DISK BOOT CONFIG. ; A SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 0 ; B SIDE 2 & 3 OF HNNNNNNNNNNNNNNNNNN*MNNNNNNNNNNNNNNNNNNNNNNL DRIVE 0 ; D SIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 0 ; E SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 1 ; F SIDE 2 & 3 OF H[NNNNNNNNNNNNNNNNN03NNNNNNNNNNNNNNNNNNNNNNction to return drive table ptr into a BIOS function ; call using restart instruction. ; Change LOGON to specify the ID sect,NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNρj8Ӆn< ׉r@܍xE⑰}J敳O뙺V#񝾞[)Ģ_-ɦNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNtINNNNNNNNNNNNNNNNNNNNNNor & track. At same time, fix bug ; which did not specify the logon track. ; 3.02 7 JUL 88 GRH ; Add '?' to include file dNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN than swapping Roms itself. ; 3.07 11-25-90 GRH ; Modify for Ver. 1.22 Monitor. ; Fix bug in 8" Hard Disk table which benig@fNNNNNNNNNNNNNNNN 1$NNNNNNNNNNNNNNNNNNNNN!rom ; DCM8 to CBIOS. ; Remove IOPB ptr passing in IX redundancy. ; Change DPB track-head shift factor to Sector Offset like cBNNNNNNNNNNNNNNNNXNNNNNNNNNNNNNNNNNNNNNNuffer for ; ID sector read. ; 9-20-91 GRH Fold in redlines. ; 10-21-91 GRH Fix bugs ; 10-22-91 GRH Fix bugs ; 1BNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN======================================= ; FALSE EQU 0 TRUE EQU NOT FALSE ;==============================================!NNNNNNNNNNNNNNNNNT5NNNNNNNNNNNNNNNNNNNNN!============================================ ; ; DISK OPERATING SYSTEM ADDRESSES ; ;======================================E NNNNNNNNNNNNNNNN%kNNNNNNNNNNNNNNNNNNNNNNAULT BUFFER ; ; BIOS FUNCTION CALL RESTART VECTOR ; BFUNRST EQU 28H BFUNRSV EQU PAGE0 + BFUNRST BFUNRSI EQU 0C7H + BFUNRNNNNNNNNNNNNNNNN+dNNNNNNNNNNNNNNNNNNNNN!U 20H ;A DSK_1 EQU 20H ;B DSK_2 EQU 20H ;C DSK_3 EQU 20H ;D DSK_4 EQU 10H ;E DSK_5 EQU 10H ;F NDRVS: EQU 6 ENDIF ISNNNNNNNNNNNNNNNN!NNNNNNNNNNNNNNNNNNNNNNnames. ; Change hard disk system tracks directory reference to new format. ; Correct bug in drivers which caused retry to fail,$NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNnly (at current level) ; caused the drive table to have bad data (default table was missing ; the 2 deblocking extension byt$NNNNNNNNNNNNNNNNdwNNNNNNNNNNNNNNNNNNNNNNtrack ; offset. Disk partitioning will add this value to sector word. It ; will be stored in the ID sector data to be dynamišNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!0-23-91 GRH Fix bugs ; 3.13 1-15-92 GRH ; Change hard disk translation to Monitor disks 4 & 5 from 6 & 7. ; 3.14 2-9-92 pNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN============================== ; ; CONDITIONAL ASSEMBLY FLAGS ; ;===========================================================NNNNNNNNNNNNNNNNN ANNNNNNNNNNNNNNNNNNNNNN====================================== ; SYS EQU 2 ;CP/M VERSION {2,3} ; NKSYS: EQU 59 ;SYSTEM SIZE IN K BYTES KBYTE: EQUyNNNNNNNNNNNNNNNNN&8NNNNNNNNNNNNNNNNNNNNNNST ;============================================================================ ; ; OTHER DECLARATIONS ; ;============3nNNNNNNNNNNNNNNNNN,NNNNNNNNNNNNNNNNNNNNNNF BOOT = 11H ; ; 5.25" PYX-27 BOOT ; DSK_0 EQU 11H ;A DSK_1 EQU 10H ;B DSK_2 EQU 10H ;C DSK_3 EQU 0H ;D DSK_4 EQU 0 ;ENNNNNNNNNNNNNNNN+NNNNNNNNNNNNNNNNNNNNNN. (sector remained ; corrupted) ; Stubbed out new Clock routines for present. ; 3.03 31 JUL 88 GRH ; Unstub Clock routine!NNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNes). ; Implement data xfer inhibit schemes with PB_FLG & PB_BCNT. ; Add pick-up of THIS_BNK data in all iopb cases. ; Remove NNNNNNNNNNNNNNNNNWFNNNNNNNNNNNNNNNNNNNNN!c. ; 3.10 5-20-91 GRH ; Change LOGON to attempt to recover from old disks better, using ; DCM8301 version controller firmwONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN GRH ; Add additional floppy disk allocation size for 1.22Mb disks. ; ; 3.15 3-17-92 GRH ; Add dynamic sector skew table NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!================= ; INTCPTS EQU TRUE ;ENABLE SYSTEM CALL INTERCEPT WHISTLE ;============================================iNNNNNNNNNNNNNNNNN!rNNNNNNNNNNNNNNNNNNNNN! 1024 CPMSZ: EQU KBYTE * NKSYS CPMBS: EQU CPMSZ - (20 * KBYTE) ;CP/M BIAS VALUE CCP: EQU CPMBS + 3400H ;ADDR OF CCP BDOS: NNNNNNNNNNNNNNNNN' NNNNNNNNNNNNNNNNNNNNNN================================================================ ; SKTSZ EQU 26 ;SKEW TABLE SIZE IF BOOT = 10H ; ; 8" NNNNNNNNNNNNNNNN-7NNNNNNNNNNNNNNNNNNNNNN NDRVS: EQU 5 ENDIF ;============================================================================ ; ; BDOS CO NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!es. ; 3.04 6 AUG 88 GRH ; Remove floppy side select from BIOS & move to controller. ; Implement new ID sector format. ; ImNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNclock buffer set/read system calls. ; 12-5-90 GRH ; Remove IX IOPB ptr passing to disk drivers. ; 1-13-91 GRH ; Fix bug wFbNNNNNNNNNNNNNNNNND NNNNNNNNNNNNNNNNNNNNNNare. ; 3.11 9-2-91 GRH ; Add redlines & change for M5ZMON v.2.00. ; 3.12 9-11-91 GRH ; Add deblocking code. ; 9-17-91 mNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!selection to login code. ; ; 3.16 5-1-92 GRH ; Add bios functions to allow 'fix'ing the disk format. ; VERSN EQU 316 ; nNNNNNNNNNNNNNNNNNfNNNNNNNNNNNNNNNNNNNNNN================================ ; ; INCLUDE COMIOPB3.DEF ; INCLUDE DISKS3.DEF ; INCLUDE BDIR.DEF ; INCLUDE NNNNNNNNNNNNNNNN"'NNNNNNNNNNNNNNNNNNNNNNEQU CPMBS + 3C00H ;ADDRESS OF BDOS BIOS: EQU CPMBS + 4A00H ;ADDRESS OF BDOS BIOSR: EQU 1000H - BIOS ; ; PAGE 0 LOCATIONSNNNNNNNNNNNNNNNNN(7NNNNNNNNNNNNNNNNNNNNNNHARD DISK BOOT DATA ; DSK_0 EQU 10H ;A DSK_1 EQU 10H ;B DSK_2 EQU 10H ;C DSK_3 EQU 10H ;D DSK_4 EQU 0 ;E DSK_5 EQU 0 ;F 3NNNNNNNNNNNNNNNNN.bNNNNNNNNNNNNNNNNNNNNNNNSTANTS ON ENTRY TO WRITE ; ;============================================================================ ; WRALL EQU 0 ;WRI{gNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNplement CP/M 3.0 DPB structure in preparation for deblocking. ; 3.05 11-3-88 GRH ; Change included data to update IOPB.PBSTANNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNhich corrupted PB_FLG. ; 3.08 2-22-91 GRH ; Remove references to THIS_BNK & use monitor function #7 instead. ; Add track-hePdNNNNNNNNNNNNNNNNNw:NNNNNNNNNNNNNNNNNNNNNN GRH Add r/ls & move to 59k system. ; 9-19-91 GRH Fix bug which destroyed my root directories! ; BUF_RD was writing. ; CNNNNNNNNNNNNNNNNݜNNNNNNNNNNNNNNNNNNNNNN;**************************************************************************** SUBTTL SYSTEM DECLARATIONS ;=================NNNNNNNNNNNNNNNN2WNNNNNNNNNNNNNNNNNNNNNN M5ZF2.DEF ; ;============================================================================ ; LIST OFF *INCLUDE COMIOPB34hyNNNNNNNNNNNNNNNN#NNNNNNNNNNNNNNNNNNNNNN ; PAGE0: EQU 0 ;START OF CP/M RAM DEFDRV: EQU PAGE0 + 4 ;DEFAULT DRIVE PARAM ADDR BDOSJV EQU PAGE0 + 5 ;BDOS SYSTEM CALL ENNNNNNNNNNNNNNNNN)NNNNNNNNNNNNNNNNNNNNNNNDRVS: EQU 6 ENDIF IF BOOT = 3 ; ; 8" FLOPPY BOOT DATA ; DSK_0 EQU 0H ;A DSK_1 EQU 0H ;B DSK_2 EQU 10H ;C DSK_3NNNNNNNNNNNNNNNNN/QNNNNNNNNNNNNNNNNNNNNN!TE TO ALLOCATED WRDIR EQU 1 ;WRITE TO DIRECTORY WRUAL EQU 2 ;WRITE TO UNALLOCATED ;======================================YNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNT to new configuration. ; 3.06 1-28-89 GRH ; Revised primitive calling procedures to use the monitor rom function ; ratherS!NNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNad shift factor to DPBs for future use. ; 3.09 5-15-91 GRH ; Change 8" floppy side select to track bit 0. Move calculation f?NNNNNNNNNNNNNNNN"iNNNNNNNNNNNNNNNNNNNNN! Patch problems with partitioning until 20MB drive installed. ; Fix TPA corruption by LOGON problem by using ROMBNK sector b&`NNNNNNNNNNNNNNNNN͢NNNNNNNNNNNNNNNNNNNNN!=========================================================== ; ; ASSEMBLY PARAMETERS ; ;=====================================BNNNNNNNNNNNNNNNNgNNNNNNNNNNNNNNNNNNNNNN.DEF *INCLUDE DISKS3.DEF *INCLUDE BDIR.DEF *INCLUDE B:M5ZF2.DEF LIST ON ;================================THNNNNNNNNNNNNNNNNN$ZNNNNNNNNNNNNNNNNNNNNN!NTRY THIS_STK EQU PAGE0 + 1CH ;CURRENT STACK FRAME PTR DK_BDRV EQU 0041H ;BOOT DRIVE # FROM PROM DEFBFR EQU PAGE0 + 80H ;DEFNNNNNNNNNNNNNNNNN*UNNNNNNNNNNNNNNNNNNNNN! EQU 10H ;D DSK_4 EQU 10H ;E DSK_5 EQU 10H ;F NDRVS: EQU 6 ENDIF IF BOOT = 20H ; ; 5.25" FLOPPY BOOT ; DSK_0 EQQNNNNNNNNNNNNNNNNN0BNNNNNNNNNNNNNNNNNNNNNN====================================== ; ; ASCII CHARS ; ;==================================================================wNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNŃi7Ӆm;Չq> ڍxE⑰~K整O왻X&^+Ǣb0̦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNCyNNNNNNNNNNNNNNNNNNNNNN========== ; LF: EQU 0AH CR: EQU 0DH CTRLZ: EQU 1AH ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ (NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNSION TEXT IN RAM MACRO ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; PVERS MACRO #VERS dNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN JP READER JP HOME ;HOME SELECTED DRIVE JP SELDSK ;SELECT DISK DRIVE JP SETTRK ;SET TRACK # JP SETSEC ;SET SECTOR #BNNNNNNNNNNNNNNNN&hNNNNNNNNNNNNNNNNNNNNNN ;SPARE BIOSSZ: DW BIOSND - BIOS ;BIOS MODULE SIZE IN BYTES BIOSST: DW BIOS ;BIOS MODULE LOAD ADDR FOR SBD ; ; CONTINUE NNNNNNNNNNNNNNNNɣNNNNNNNNNNNNNNNNNNNNNNNIT: ; ; SET TEMPORARY STACK ; DI LD SP,DEFBFR ;USE PAGE 0 FOR STACK LD (THIS_STK),SP EI ; ; INIT DEFAULT DRIVENNNNNNNNNNNNNNNNNcNNNNNNNNNNNNNNNNNNNNNN ;############################################################################ ; ; SIGN-ON MESSAGE ; ;#################N~NNNNNNNNNNNNNNNN%[NNNNNNNNNNNNNNNNNNNNNN------------- ; WARM: ; ; SET TEMPORARY STACK ; DI LD SP,DEFBFR LD (THIS_STK),SP EI ; ; INIT OUR STUFF ; X0NNNNNNNNNNNNNNNN+TNNNNNNNNNNNNNNNNNNNNN! CP A,86H JR C,WEROR ; ; SET UP TO LOAD CCP/BDOS ; LD HL,(DEFBFR + BD_SBDSS) ;PREFETCH BDOS TRK/SECTOR PUSH HL ; LJ9NNNNNNNNNNNNNNNN*NNNNNNNNNNNNNNNNNNNNNN@@@@@@@@@@ ; ; GENERATE THE TRANSLATION TABLE MACRO ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@HNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNDD DL #VERS IF DD > 9999 DB (DD / 10000) + '0' DD DL DD % 10000 ENDIF IF DD > 999 DB (DD / 1000) + '0' DD DL DNNNNNNNNNNNNNNNNSGNNNNNNNNNNNNNNNNNNNNN! JP SETDMA ;SET TRANSFER ADDR JP DISKRD ;PERFORM DISK READ JP DISKWR ;PERFORM DISK WRITE JP LISTST ;RETURN LIST STATrNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!ON WITH INIT ; INIT1: JR INIT ;############################################################################ ; ; DIRECTOd0dNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN ; LD A,(DK_BDRV) ;USE DRIVE # PASSED IN PAGE 0 AND A,3 LD (DEFDRV),A ; ; SEND SYSTEM SIGN-ON ; LD HL,MSGSO CALLNNNNNNNNNNNNNNNNN vNNNNNNNNNNNNNNNNNNNNNN########################################################### ; MSGSO: DB CR,LF DB CPMSZ / (KBYTE * 10) + '0' DB (CPMSZ MOD BNNNNNNNNNNNNNNNN&NNNNNNNNNNNNNNNNNNNNNNOR A,A LD (BUF_ACT),A ;ASSUME NO DATA IN BUFFER ; LD (UNA_CNT),A ;CLEAR UNALLOCATED SECTOR COUNT ; LD (BUF_MOD),A ;CLEANy5NNNNNNNNNNNNNNNN,3NNNNNNNNNNNNNNNNNNNNN!D HL,(DEFBFR + BD_SCCPS) ;FETCH CCP TRK/SECTOR LD C,L LD B,0 CALL SETSEC ; LD C,H CALL SETTRK ; LD BC,CCP CALL SP[NNNNNNNNNNNNNNNN%NNNNNNNNNNNNNNNNNNNNNN@@@@@@@ ; GXLATE MACRO #SECTORS, #SKEW LIST OFF NXTSEC DL 1 ;;START WITH SECTOR 1 LOWEST DL 1 ;; REPT #SECTORS LIST 93NNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNND % 1000 ENDIF DB (DD / 100) + '0' DB '.' DB ((DD % 100) / 10) + '0' DB (DD % 10) + '0' ENDM SUBTTL BIOS COD<NNNNNNNNNNNNNNNNN`vNNNNNNNNNNNNNNNNNNNNN!US JP SECTRN ;TRANSLATE SECTOR JP BIOFUNC ;EXECUTE FUNCTION CALL ;###################################################3BNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNRY SECTOR BUFFER STARTS HERE AFTER CRUNCHING COLD START ; CODE. THIS BUFFER IS USED BY THE CP/M DIRECTORY CHECK ROUTINES THAT B'NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN EDITOR ; ; MODIFY COLD START VECTOR TO WARM START ; LD HL,(BIOS+4) LD (BIOS+1),HL ; ; INIT OUR STUFF ; CALL GET (NNNNNNNNNNNNNNNNNN'9NNNNNNNNNNNNNNNNNNNNNN BUFFER ; LD HL,BLKBUF ;INIT BUFFER PTR LD (BUF_DMA),HL ; ; LOG ON DRIVE TO INIT TABLES ; LD A,(DK_BDRV) AND A,3 NNNNNNNNNNNNNNNN-NNNNNNNNNNNNNNNNNNNNN!ETDMA ; ; READ CCP/BDOS ; WREAD: CALL DISKRD JR NZ,WEROR ;IF ERROR THEN EXIT ; ; NEXT SECTOR ; LD HL,CPM_SEC INzNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNON DB NXTSEC LIST OFF NXTSEC DL NXTSEC + #SKEW ;ADD SKEW FACTOR ;; IF NXTSEC > #SECTORS ;CHECK FOR OVERFLOW NXTSEC DL!NNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNE ORG BIOS ;---------------------------------------------------------------------------- ; ; BIOS JUMP VECTOR TABLE ; ;i NNNNNNNNNNNNNNNNNs;NNNNNNNNNNNNNNNNNNNNNN######################### ; ; THE FOLLOWING BOOT DATA MUST RESIDE AS DEFINED RIGHT BEFORE THE COLD ; INIT ROUTINE START AND Mi NNNNNNNNNNNNNNNNٝNNNNNNNNNNNNNNNNNNNNNN ; CHECK FOR DISK CHANGE. ; ;############################################################################ ; DIRBF: EQU $ ;oNNNNNNNNNNNNNNNNNN6VNNNNNNNNNNNNNNNNNNNNNNBNK LD (BUF_DMAB),A ; ; INITIALIZE CLOCK VECTORS IF CLOCK INSTALLED ; LD A,MF_CSYN ;TEST FOR BOARD PRESENT CALL XMROMjNNNNNNNNNNNNNNNN"NNNNNNNNNNNNNNNNNNNNN!DIRBF + 128) CONMSG **** WARNING! COLD INIT CODE BIGGER THAN DIR BUFFER **** ELSE DS DIRBF + 128 - $ ;FILL OUT DIRECTORPrNNNNNNNNNNNNNNNNN(NNNNNNNNNNNNNNNNNNNNN!;MODULO 4 LD C,A LD E,0 CALL SELDSK LD A,L ;IF ERROR THEN ABORT OR A,H JR Z,WEROR ; ; READ BOOT DIRECTORY ; ąNNNNNNNNNNNNNNNNN.UNNNNNNNNNNNNNNNNNNNNNNC (HL) ; LD DE,128 ;DMA += SECTOR SIZE LD HL,(CPM_DMA) ADD HL,DE LD (CPM_DMA),HL ; ; IF NOT INTO BDOS THEN READ NE$NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN NXTSEC - #SECTORS ;; IF NXTSEC <= LOWEST ;CHECK FOR REPEAT NXTSEC DL LOWEST + 1 LOWEST DL NXTSEC ENDIF ENDIF ;;'NNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN---------------------------------------------------------------------------- ; JP INIT1 ;COLD START ENTRY JP WARM ;RELOAD9 NNNNNNNNNNNNNNNNN@ NNNNNNNNNNNNNNNNNNNNNNUST BE IN THE 1ST SECTOR. THESE 2 WORDS ARE ; REFERENCED BY THE BOOT LOADER CODE IN ORDER TO DETERMINE THE LOAD ADDRESS ; AND NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!BUFFER BEGINNING ;---------------------------------------------------------------------------- ; ; INIT - COLD START NNNNNNNNNNNNNNNNgNNNNNNNNNNNNNNNNNNNNN! ; ; IF CLOCK PRESENT THEN TURN ON CLOCK DRIVE ; OR A,A LD A,38H ;COND. JR (ON) JR Z,CLKON ; ; ELSE TURN OFF CLOrNNNNNNNNNNNNNNNN##NNNNNNNNNNNNNNNNNNNNNNY BUFFER TO 1 SECTOR SIZE ENDIF ;---------------------------------------------------------------------------- ; ; WARNNNNNNNNNNNNNNNNN)6NNNNNNNNNNNNNNNNNNNNN! LD BC,DEFBFR ;SET XFER ADDRESS (USE DEFAULT BUFFER) CALL SETDMA ; LD BC,BD_SEC ;SET DIRECTORY SECTOR CALL SETSEC ; LvNNNNNNNNNNNNNNNNN/fNNNNNNNNNNNNNNNNNNNNNNXT SECTOR ; LD DE,BDOS XOR A,A SBC HL,DE JR C,WREAD ; ; ELSE IF AT BEGINNING OF BDOS THEN SET UP NEW TRACK & SECTOREoNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN ENDM LIST ON ENDM ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; INITIALIZE VER$NNNNNNNNNNNNNNNNNN 5%NNNNNNNNNNNNNNNNNNNNNN CCP/BDOS JP CNSCK ;GET CONSOLE STATUS JP CI ;CONSOLE INPUT JP COC ;CONSOLE OUTPUT JP LO ;PRINTER OUTPUT JP PUNCH zBNNNNNNNNNNNNNNNNYNNNNNNNNNNNNNNNNNNNNN!LENGTH OF THE BIOS. ; ;############################################################################ ; DB 0 ;Z80 CPU DB 0INNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNENTRY FROM BOOT MUST SET ALL BIOS PARAMS ; ;---------------------------------------------------------------------------- ; I7BNNNNNNNNNNNNNNNNP4NNNNNNNNNNNNNNNNNNNNNNCK DRIVE ; LD A,18H ;UNCOND. JR (OFF) (CAUSES JUMP TO ILLEGAL) ; CLKON: LD (INHCLK),A ; ; BOOT CCP & BDOS ; JR WARMP0NNNNNNNNNNNNNNNNN$jNNNNNNNNNNNNNNNNNNNNNNM REBOOT ENTRY LOADS CCP,BDOS FROM DISK & SETS UP VARIABLES ; ;---------------------------------------------------------------^NNNNNNNNNNNNNNNNN*eNNNNNNNNNNNNNNNNNNNNNND BC,0 ;SET TRACK TO 0 CALL SETTRK ; CALL DISKRD JR NZ,WEROR ; ; CHECK FOR VALID BOOT DIRECTORY ; LD A,(DEFBFR) hNNNNNNNNNNNNNNNNN0uNNNNNNNNNNNNNNNNNNNNNN ; JR Z,RDBDOS ; ; ELSE IF NOT AT BIOS THEN READ NEXT SECTOR ; LD DE,BIOS - BDOS SBC HL,DE JP C,WREAD ; ; ELSE'NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNρi6хm;։q> ڍwEᑯ}J敳OꙹU"𝾞[)Ģ_-˦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN DONE READING SYSTEM ; JR WZRPG ; ; ; ELSE SET UP & READ BDOS ; RDBDOS: POP HL ;RESTORE BDOS TRK/SECTOR FROM DIRECTOR+NNNNNNNNNNNNNNNNN[NNNNNNNNNNNNNNNNNNNNNN ; IF INTCPTS ; ; PUT BDOS VECTOR INTO INTERCEPT CODE ; LD HL,(BDOS + 7) LD (BDOSV),HL ; ; NOW PUT INTERCEPT VEZNNNNNNNNNNNNNNNN GNNNNNNNNNNNNNNNNNNNNN!TION ; XOR A,A LD (UNA_CNT),A ; ; READ_OPERATION_FLAG = TRUE (1) ; INC A LD (READOP),A ; ; PRE-READ_OF_DATA_FLwNNNNNNNNNNNNNNNNgNNNNNNNNNNNNNNNNNNNNNN LD (WR_PROT),A ; ; SET PTRS TO DISK DATA ; PUSH IX LD IX,(CUR_DDT) ; PUSH IY LD IY,(CUR_DPB) ; ; IF NOT BLOCsBNNNNNNNNNNNNNNNN'NNNNNNNNNNNNNNNNNNNNNN IF NO UNALLOCATED SECTORS REMAIN THEN PREREAD ; CHKUNA: LD A,(UNA_CNT) OR A,A JP Z,ALLOC ; ; ELSE MORE UNALLOCATED RE:NNNNNNNNNNNNNNNNN"NNNNNNNNNNNNNNNNNNNNNNRK) ;TRACK++ INC HL LD (UNA_TRK),HL ; NOOVF: ; ; MATCH FOUND, MARK AS UNNECESSARY READ ; XOR A,A ;PREREAD FLAG = FdNNNNNNNNNNNNNNNN%NNNNNNNNNNNNNNNNNNNNNNIS 128 ; SECSHFLP: SRL H ;ELSE SHIFT OVER TO PHYSICAL SECTOR RR L DEC A JP NZ,SECSHFLP ; NOSECSHF: INC HL ;SET :NNNNNNNNNNNNNNNN+NNNNNNNNNNNNNNNNNNNNNNAR HOST BUFF ; JR NZ,RW_RET ;IF ERROR THEN ABORT ; FILHST: ; ; READ THE SECTOR BUFFER ; LD A,(CPM_DSK) ;BUFFER SECTOjNNNNNNNNNNNNNNNNNWNNNNNNNNNNNNNNNNNNNNN!Y LD C,L LD B,A ;A STILL CONTAINS 0 CALL SETSEC ; LD C,H CALL SETTRK ; JR WREAD ; ; ; WARM BOOT ERROR, OUTPUNNNNNNNNNNNNNNNNNeNNNNNNNNNNNNNNNNNNNNNNCTOR INTO BDOS CODE ; LD HL,INTCPT LD (BDOS + 7),HL ENDIF ; ; PASS DEFAULT DISK TO CCP ; LD A,(DEFDRV) LD C,A NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNAG = TRUE ; LD (RSFLAG),A ; ; TREAT AS UNALLOCATED BLOCK ; LD A,WRUAL LD (WRTYPE),A ; JP RWOPER ;TO PERFORM THE NNNNNNNNNNNNNNNN{NNNNNNNNNNNNNNNNNNNNNNKED THEN USE CPM WRITE ; LD A,(IY + DPB_PSH) ;0= 128-BYTE SECTORS OR A,A JP Z,DISKWRN ; ; READ_OP_FLAG = FALSE ; X& NNNNNNNNNNNNNNNNtNNNNNNNNNNNNNNNNNNNNN!CORDS REMAIN, COUNT-- ; DEC A LD (UNA_CNT),A ; ; IF REQUESTED SECTOR != UNALLOCATED SECTOR THEN PURGE ; LD A,(CPM_DSHNNNNNNNNNNNNNNNNN 7*NNNNNNNNNNNNNNNNNNNNNNALSE LD (RSFLAG),A JP RWOPER ; ; ; NORMAL NON-BLOCKED WRITE ; DISKWRN: CALL CPM_WR JP RW_RET ; ; ; NOT AN UNNNNNNNNNNNNNNNNN&NNNNNNNNNNNNNNNNNNNNNNBACK TO PHYSICAL SECTOR LD (BUF_PSEC),HL ;BUFFER PHYSICAL SECTOR TO ACCESS ; ; IF BUFFER == EMPTY THEN READ THE PHYSICAL SRFNNNNNNNNNNNNNNNN,rGNNNNNNNNNNNNNNNNNNNNNNR = PHYSICAL SECTOR LD (BUF_DSK),A ; LD HL,(CPM_TRK) LD (BUF_TRK),HL ; LD HL,(BUF_PSEC) LD (BUF_SEC),HL ; ; IF RNNNNNNNNNNNNNNNNdNNNNNNNNNNNNNNNNNNNNNNT MSG & GO TO DEBUGGER ; WEROR: LD HL,MSGLE ;OUTPUT ERROR MESSAGE CALL EDITOR CALL MR_BRK HALT ; ; ; BOOT OK, INIT TNNNNNNNNNNNNNNNNN TNNNNNNNNNNNNNNNNNNNNN! JP CCP SUBTTL BIOS DISK FUNCTION ROUTINES ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ NNNNNNNNNNNNNNNNNN!NNNNNNNNNNNNNNNNNNNNNNREAD ; ; ; NORMAL NON-BLOCKED READ ; DISKRDN: CALL CPM_RD JP RW_RET ;*******************************************JNNNNNNNNNNNNNNNNJNNNNNNNNNNNNNNNNNNNNNNOR A,A LD (READOP),A ; ; SAVE WRITE TYPE ; LD A,C LD (WRTYPE),A ; ; IF 1ST WRITE TO UNALLOCATED (NEW, UNUSED) BLONNNNNNNNNNNNNNNNNENNNNNNNNNNNNNNNNNNNNN!K) ;SAME DISK? LD HL,UNA_DSK CP A,(HL) JR NZ,ALLOC ; LD HL,(UNA_TRK) ;SAME TRACK? LD DE,(CPM_TRK) SBC HL,DE JR NZNNNNNNNNNNNNNNNNN!NNNNNNNNNNNNNNNNNNNNNNALLOCATED RECORD, REQUIRES PRE-READ ; ALLOC: XOR A,A ;COUNT = 0 LD (UNA_CNT),A ; INC A ;PREREAD FLAG = TRUE LD (RSFA=NNNNNNNNNNNNNNNNN'NNNNNNNNNNNNNNNNNNNNN!ECTOR ; LD HL,BUF_ACT LD A,(HL) ; LD (HL),1 ;BUFFER = ACTIVE IN ANY CASE ; OR A,A JR Z,FILHST ; ; HOST BUFFER QNNNNNNNNNNNNNNNN-AvNNNNNNNNNNNNNNNNNNNNNNEQUIRED TO READ THEN READ ; LD A,(RSFLAG) ;NEED TO READ? OR A,A CALL NZ,BUF_RD ;YES, IF 1 ; ; BUFFER = CLEAN ; XsNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!PAGE 0 ; WZRPG: ; ; INIT BIOS WARM START IN PAGE 0 ; LD A,0C3H LD HL,BIOS + 3 LD (PAGE0),A LD (PAGE0 + 1),HL ; DyNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNN! ; ; READ A DISK SECTOR ; EXIT - A= 0: OK; /0: ERROR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++rNNNNNNNNNNNNNNNNN2NNNNNNNNNNNNNNNNNNNNN!********************************* ; ; WRITE DISK SECTOR FUNCTION ; ENTRY- C= WRITE TYPE: ; 0: WRITE TO ALLOCATED BLOCK (UP NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNCK THEN SET PARAMETERS ; CP A,WRUAL JP NZ,CHKUNA ; ; COUNT = NUMBER_OF_SECTORS_IN_BLOCK ; LD A,(IY + DPB_BLM) ;CUR_D NNNNNNNNNNNNNNNNNNwNNNNNNNNNNNNNNNNNNNNNN,ALLOC ; LD HL,(CPM_SEC) LD DE,(UNA_SEC) SBC HL,DE JR NZ,ALLOC ; ; MATCH, MOVE TO NEXT SECTOR FOR FUTURE REF ; ENNNNNNNNNNNNNNNN"QHNNNNNNNNNNNNNNNNNNNNNNLAG),A ; ; ; ; COMMON CODE FOR READ AND WRITE FOLLOWS ; RWOPER: ; ; ASSUME NO ERRORS ; XOR A,A LD (IOPB + PB_STJNNNNNNNNNNNNNNNNN(NNNNNNNNNNNNNNNNNNNNNNACTIVE, SAME AS SEEK BUFFER? ; LD A,(CPM_DSK) LD HL,BUF_DSK ;SAME DISK? CP A,(HL) JR NZ,NOMATCH ; LD HL,(BUF_TRK) ;S`NNNNNNNNNNNNNNNN.%NNNNNNNNNNNNNNNNNNNNNNOR A,A LD (BUF_MOD),A ; MATCH: ; ; COPY DATA TO OR FROM BUFFER ; LD HL,(CPM_SEC) ;CALCULATE INDEX INTO BUFFER DEC HlHNNNNNNNNNNNNNNNNN9NNNNNNNNNNNNNNNNNNNNNN; INIT BDOS CALL VECTOR IN PAGE 0 ; LD HL,BDOS + 6 LD (BDOSJV),A LD (BDOSJV + 1),HL ; ; INIT BIOS CALL VECTOR IN PANNNNNNNNNNNNNNNNNN 6NNNNNNNNNNNNNNNNNNNNN!++++++++ ; DISKRD: ; ; SET UP DATA TABLE PTRS ; PUSH IX LD IX,(CUR_DDT) ; PUSH IY LD IY,(CUR_DPB) ; ; IF NOTrNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNDATE) ; 1: WRITE TO DIRECTORY BLOCK (ALLWAYS WRITE) ; 2: WRITE TO UNALLOCATED BLOCK (NO NEED TO PRE-READ) ; ;***********'cNNNNNNNNNNNNNNNN(NNNNNNNNNNNNNNNNNNNNNNPB.DPBBLM + 1 ::= (BLKSIZ/128) INC A LD (UNA_CNT),A ; ; SET DISK TO SEEK ; LD A,(CPM_DSK) LD (UNA_DSK),A ; ; SE NNNNNNNNNNNNNNNNDNNNNNNNNNNNNNNNNNNNNNNX DE,HL ;UNASEC += 1 INC HL LD (UNA_SEC),HL ; ; IF PAST LAST SECTOR ON TRACK THEN USE 1ST SECTOR OF NEXT TRACK ; LD 9NNNNNNNNNNNNNNNN#byNNNNNNNNNNNNNNNNNNNNNNATO),A ; ; COMPUTE BUFFER SECTOR ; LD HL,(CPM_SEC) DEC HL ;CONVERT PHYSICAL SECTOR TO LOGICAL ; LD A,(IY + DPB_PSHNHNNNNNNNNNNNNNNNNN)NNNNNNNNNNNNNNNNNNNNNNAME TRACK? LD DE,(CPM_TRK) SBC HL,DE JR NZ,NOMATCH ; LD DE,(BUF_PSEC) ;SAME SECTOR? LD HL,(BUF_SEC) SBC HL,DE JR 6dINNNNNNNNNNNNNNNNN/'NNNNNNNNNNNNNNNNNNNNNNL ;CONVERT TO LOGICAL SECTOR (0..N-1) LD A,L ; AND A,(IY + DPB_PHM) ;USE PHYSICAL RECORD MASK DATA (CP/M 3.X) ; RRA m NNNNNNNNNNNNNNNNjNNNNNNNNNNNNNNNNNNNNNNGE 0 ; LD HL,BIOFUNC LD (BFUNRSV),A LD (BFUNRSV + 1),HL ; ; SET DEFAULT SECTOR BUFFER ; LD BC,DEFBFR CALL SETDMAcNNNNNNNNNNNNNNNN tNNNNNNNNNNNNNNNNNNNNN! BLOCKED THEN USE CPM READ ; LD A,(IY + DPB_PSH) ;0= 128-BYTE SECTORS OR A,A JP Z,DISKRDN ; ; READS DON'T NEED ALLOCAr9NNNNNNNNNNNNNNNNTNNNNNNNNNNNNNNNNNNNNN!***************************************************************** ; DISKWR: ; ; REMOVE BOOT WRITE PROTECTION ; XOR A,A ,NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNT TRACK TO SEEK ; LD HL,(CPM_TRK) LD (UNA_TRK),HL ; ; SET SECTOR TO SEEK ; LD HL,(CPM_SEC) LD (UNA_SEC),HL ; ; ~BNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!E,(IY + DPB_SPT) LD D,(IY + DPB_SPT +1) SBC HL,DE JP C,NOOVF ; LD HL,0 ;SECTOR = 1 LD (UNA_SEC),HL ; LD HL,(UNA_TdNNNNNNNNNNNNNNNNN$NNNNNNNNNNNNNNNNNNNNNN) ;USE PHYSICAL SHIFT FACTOR (CP/M 3.X) AND A,3 ;LIMIT TO 1024 BYTE SECTORS JP Z,NOSECSHF ;IF ALREADY 0 THEN SECTOR SIZE PNNNNNNNNNNNNNNNNNN*NNNNNNNNNNNNNNNNNNNNNNZ,MATCH ;SKIP IF MATCH ; NOMATCH: ; ; IF BUFFER == DIRTY THEN WRITE IT OUT BEFORE READING NEW ONE ; CALL BUF_FLSH ;CLEYNNNNNNNNNNNNNNNNN04YNNNNNNNNNNNNNNNNNNNNNN ;BITS <7..1> -> BITS <14..8> LD H,A ; LD A,0 ;BIT 0 -> BIT 7 RRA LD L,A ; ; HL HAS RELATIVE HOST BUFFER ADDRESS sNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNŃf4υj8Ӊn< ׍s@ݑxEzG䙲N靶S U#񥿦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN5NNNNNNNNNNNNNNNNNNNNNN; LD DE,BLKBUF ADD HL,DE ;HL = HOST ADDRESS ; LD DE,(CPM_DMA) ;GET/PUT CP/M DATA LD BC,128 ;LENGTH OF MOVE ; LD A,?NNNNNNNNNNNNNNNNNkNNNNNNNNNNNNNNNNNNNNNNRECTORY WRITE ; XOR A,A ;BUFFER = CLEAN LD (BUF_MOD),A ; CALL BUF_WR ;WRITE TO DISK ; LD A,(IOPB + PB_STATO) ;RETNNNNNNNNNNNNNNNN pNNNNNNNNNNNNNNNNNNNNNN************************************************ ; ; CPM_RD2 PERFORMS THE PHYSICAL READ FROM THE DISK INTO CPM_DMA, ; WITHOUTBdNNNNNNNNNNNNNNNNPNNNNNNNNNNNNNNNNNNNNNNSK)= DISK # TO READ FROM ; (CPM_TRK)= TRACK # TO READ FROM ; (CPM_SEC)= SECTOR # TO READ FROM ; (CPM_DMA)= XFER ADDRESS ;,:NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN,PB_BCNTO - PB_TRKO LDIR ; ; EXECUTE LOW LEVEL READ OR WRITE (ON STACK) ; RET ;***********************************NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNY POP IX ; ; IF ERROR THEN RETURN IT ; OR A,A RET NZ ; ; ELSE CLEAN BUFFER ; LD (BUF_MOD),A RET ;******NNNNNNNNNNNNNNNN%NNNNNNNNNNNNNNNNNNNNNNEAD FROM ; (BUF_TRK)= TRACK # TO READ FROM ; (BUF_SEC)= SECTOR # TO READ FROM ; IX= DDT PTR ; IY= DPB PTR ; EXIT - (IOPBNNNNNNNNNNNNNNNN+NNNNNNNNNNNNNNNNNNNNN!D A,E LD (LOGRQ),A ; ; COMPUTE DISK DRIVER TABLE PTR ; CALL RETDVRT ;DRIVE IS STILL IN C REGISTER ; ; IF DRIVE ERR7BNNNNNNNNNNNNNNNN`NNNNNNNNNNNNNNNNNNNNNN(READOP) ;WHICH WAY? OR A,A JP NZ,RWMOVE ;SKIP IF READ ; ; WRITE OPERATION, MARK AND SWITCH DIRECTION ; LD A,1 ;BUFFNNNNNNNNNNNNNNNNNUNNNNNNNNNNNNNNNNNNNNNNURN ANY ERRORS ; ; DONE, RESTORE & RETURN ; RW_RET: OR A,A ;SET RESULT STATUS FLAG POP IY POP IX ; RET ;******"NNNNNNNNNNNNNNNN%NNNNNNNNNNNNNNNNNNNNNN BLOCKING. ; ENTRY- (CPM_DSK)= DISK # TO READ FROM ; (CPM_TRK)= TRACK # TO READ FROM ; (CPM_SEC)= SECTOR # TO READ FROM ; drNNNNNNNNNNNNNNNNKNNNNNNNNNNNNNNNNNNNNN! IX= DDT PTR ; IY= DPB PTR ; EXIT - (IOPB.PB_STATO)= 0: OK, /0: ERROR ; ;*************************************************.|NNNNNNNNNNNNNNNNDNNNNNNNNNNNNNNNNNNNNN!***************************************** ; ; BUF_FLSH FLUSHES THE BUFFER DATA IF MODIFIED ; ENTRY- (BUF_DSK)= DISK # TO WRIT[NNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN********************************************************************** ; ; BUF_WR PERFORMS THE PHYSICAL WRITE FROM BLKBUF TO T \NNNNNNNNNNNNNNNNNN&NNNNNNNNNNNNNNNNNNNNN!B.PB_STATO)= 0: OK, /0: ERROR ; ;**************************************************************************** ; BUF_RD: ; }NNNNNNNNNNNNNNNN,EwNNNNNNNNNNNNNNNNNNNNNNOR THEN RETURN (HL= 0) ; RET NZ ; ; ELSE SAVE PTR ; LD (CUR_DDT),HL ; ; FETCH FLAGS ; INC HL ;EXE +1 INC HL zNNNNNNNNNNNNNNNNSNNNNNNNNNNNNNNNNNNNNN!ER = DIRTY LD (BUF_MOD),A ; ; SAVE BUFFER DATA PTRS FOR LATER FLUSHES ; LD (BUF_DDT),IX LD (BUF_DPB),IY ; EX DE,HLrNNNNNNNNNNNNNNNNN dNNNNNNNNNNNNNNNNNNNNN!********************************************************************** ; ; CPM_WR PERFORMS THE PHYSICAL WRITE FROM CPM_DMA TO TNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN! (CPM_DMA)= XFER ADDRESS ; EXIT - (IOPB.PB_STATO)= 0: OK, /0: ERROR ; ;******************************************************NNNNNNNNNNNNNNNNzNNNNNNNNNNNNNNNNNNNNNN*************************** ; CPM_RD: ; LD HL,LL_READ ; ; COMMON CODE ; CPM_RW: PUSH HL LD HL,CPM_TRK ; ; FALL ]NNNNNNNNNNNNNNNNNuNNNNNNNNNNNNNNNNNNNNN!E TO ; (BUF_TRK)= TRACK # TO WRITE TO ; (BUF_PSEC)= SECTOR # TO WRITE TO ; (BUF_DDT)= DDT PTR ; (BUF_DPB)= DPB PTR ; EXgNNNNNNNNNNNNNNNNN!3+NNNNNNNNNNNNNNNNNNNNNNHE HOST DISK. ; ENTRY- (BUF_DSK)= DISK # TO WRITE TO ; (BUF_TRK)= TRACK # TO WRITE TO ; (BUF_SEC)= SECTOR # TO WRITE TO ; |NNNNNNNNNNNNNNNNNN'NNNNNNNNNNNNNNNNNNNNNN LD HL,LL_READ ; ; COMMON CODE ; BUF_RW: PUSH HL LD HL,BUF_TRK JP RD_WR ;++++++++++++++++++++++++++++++++++++++++͝NNNNNNNNNNNNNNNN-vFNNNNNNNNNNNNNNNNNNNNN! ;FLGS LD C,(HL) ; ; FETCH DISK PARAMETER BLOCK ADDRESS ; INC HL ;DRV INC HL ;DPB_PTR LD E,(HL) INC HL LD D,(@BNNNNNNNNNNNNNNNN8NNNNNNNNNNNNNNNNNNNNNN ;SOURCE/DEST SWAP ; RWMOVE: ; ; BC INITIALLY 128, DE IS SOURCE, HL IS DEST ; LDIR ; ; DATA HAS BEEN MOVED TO/FROMNNNNNNNNNNNNNNNN 7NNNNNNNNNNNNNNNNNNNNNNTHE DISK. ; ENTRY- (CPM_DSK)= DISK # TO WRITE TO ; (CPM_TRK)= TRACK # TO WRITE TO ; (CPM_SEC)= SECTOR # TO WRITE TO ; (CPް NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN********************** ; CPM_RD2: ; ; SET UP PTRS ; PUSH IX PUSH IY LD IX,(CUR_DDT) LD IY,(CUR_DPB) ; ; EXECU NNNNNNNNNNNNNNNN)NNNNNNNNNNNNNNNNNNNNNNINTO COMMON XFER CODE ; ;**************************************************************************** ; ; SET UP IOPB FOk:NNNNNNNNNNNNNNNN@NNNNNNNNNNNNNNNNNNNNNNIT - (IOPB.PB_STATO)= 0: OK, /0: ERROR ; ;**************************************************************************** ; BUFNNNNNNNNNNNNNNNN"fxNNNNNNNNNNNNNNNNNNNNNN IX= DDT PTR ; IY= DPB PTR ; EXIT - (IOPB.PB_STATO)= 0: OK, /0: ERROR ; ;**************************************************jHNNNNNNNNNNNNNNNNN(NNNNNNNNNNNNNNNNNNNNN!++++++++++++++++++++++++++++++++++++ ; ; SELECT DRIVE FUNCTION ; LOG-ON - SET DISK PARAMETER BLOCK ; ENTRY- C= DRIVE # ; Eb2NNNNNNNNNNNNNNNNN.#NNNNNNNNNNNNNNNNNNNNNNHL) LD (CUR_DPB),DE ; ; FETCH DISK PARAMETER HEADER ADDRESS ; INC HL ;DPH PTR LD E,(HL) INC HL LD D,(HL) LD (C!NNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNN! HOST BUFFER, IF NOT DIRECTORY THEN DELAY WRITE ; LD A,(WRTYPE) ;IF NOT DIRECTORY THEN DELAY WRITE CP A,WRDIR LD A,(IOPB9,NNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNM_DMA)= XFER ADDRESS ; IX= DDT PTR ; IY= DPB PTR ; EXIT - (IOPB.PB_STATO)= 0: OK, /0: ERROR ; ;**************************rNNNNNNNNNNNNNNNNN6NNNNNNNNNNNNNNNNNNNNNNTE READ SECTOR ; CALL CPM_RD ; ; RESTORE PTRS & RETURN ; POP IY POP IX RET ;*********************************EzNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNR EXECUTION ; ENTRY- HL= PTR TO IOPB IMAGE TRACK DATA ; IX= DDT PTR ; IY= DPB PTR ; (SP)= ADDRESS {LL_READ, LLWRIT} OF EXrNNNNNNNNNNNNNNNNsNNNNNNNNNNNNNNNNNNNNNN_FLSH: ; ; IF UNMODIFIED THEN RETURN ; LD A,(BUF_MOD) OR A,A RET Z ; ; ELSE SET PTRS TO BUFFER DATA ; PUSH IX NNNNNNNNNNNNNNNN#UINNNNNNNNNNNNNNNNNNNNN!************************** ; BUF_WR: ; LD HL,LL_WRIT JP BUF_RW ;****************************************************qNNNNNNNNNNNNNNNNN)NNNNNNNNNNNNNNNNNNNNN!= 0 IF NEW SELECT ; EXIT - HL= PTR TO DPT OR 0 FOR ERROR ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++NNNNNNNNNNNNNNNNN/$NNNNNNNNNNNNNNNNNNNNNNUR_DPH),DE EX DE,HL ;PUT DPH PTR IN HL FOR RETURN ; ; IF NOT FIRST SELECT OR LOGON INHIBITED THEN RETURN TABLE PTR ; L}$NNNNNNNNNNNNNNNNZNNNNNNNNNNNNNNNNNNNNN! + PB_STATO) ;RETURN ANY ERRORS ANYWAY JR NZ,RW_RET ; ; IF ERROR THEN ABORT ; OR A,A JR NZ,RW_RET ; ; NO ERROR/DIX,NNNNNNNNNNNNNNNN CNNNNNNNNNNNNNNNNNNNNN!************************************************** ; CPM_WR: ; LD HL,LL_WRIT JP CPM_RW ;****************************2NNNNNNNNNNNNNNNNcNNNNNNNNNNNNNNNNNNNNN!******************************************* ; ; CPM_RD PERFORMS THE PHYSICAL READ FROM THE DISK INTO CPM_DMA. ; ENTRY- (CPM_DNNNNNNNNNNNNNNNNN&NNNNNNNNNNNNNNNNNNNNNNECUTOR ; ;**************************************************************************** ; RD_WR: LD DE,IOPB + PB_TRKO LD BCNNNNNNNNNNNNNNNN&NNNNNNNNNNNNNNNNNNNNN! PUSH IY LD IX,(BUF_DDT) LD IY,(BUF_DPB) ; ; WRITE THE BUFFER DATA ; CALL BUF_WR ; ; RESTORE THE PTRS ; POP IdNNNNNNNNNNNNNNNNN$NNNNNNNNNNNNNNNNNNNNN!************************ ; ; RDBUF PERFORMS THE PHYSICAL READ FROM THE HOST DISK INTO BLKBUF. ; ENTRY- (BUF_DSK)= DISK # TO RHNNNNNNNNNNNNNNNNN*NNNNNNNNNNNNNNNNNNNNN!+++++++++++ ; SELDSK: ; ; STORE DRIVE # FOR FUTURE USE ; LD A,C LD (CPM_DSK),A ; ; SAVE LOGON REQUEST FLAG ; L,$NNNNNNNNNNNNNNNNN0iNNNNNNNNNNNNNNNNNNNNNND A,(LOGRQ) ;0: LOGON, 1:INHIBIT OR A,C ;0: NORMAL, 1: INHIBIT CPL AND A,1 RET Z ; ; ELSE LOG ON DRIVE ; PUSH IXhFHNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNρi7҅l;։q? ٍtBޑyFᕮ}J噴P읹V$񡿢Z)ŦNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!NNNNNNNNNNNNNNNNNNNNNN ;SAVE REGS PUSH IY ; LD IX,(CUR_DDT) ;SET REGS LD IY,(CUR_DPB) ; LD (IY + DPB_SKT),0 ;ASSUME NO SKEW ; ; ATTEMPTNNNNNNNNNNNNNNNNN3NNNNNNNNNNNNNNNNNNNNN! ASSUME NO TRANSLATION AS DEFAULT ; CALL TRNONE ; ; IF SINGLE-DENSITY FLOPPY THEN ASSUME 3740 TRANSLATION ; LD A,(BLKNNNNNNNNNNNNNNNN LNNNNNNNNNNNNNNNNNNNNN! XFER DISK PHYSICAL DATA TO TABLE ; LD A,(BLKBUF + ID_HEADS) ; SEL1: LD (IX + DDT_HDS),A ; ; RETURN DRIVE TABLE PTR ; [VBNNNNNNNNNNNNNNNN0NNNNNNNNNNNNNNNNNNNNNN******************************************* ; ; HOME DRIVE - TREAT AS SEEK TRK 0 ; EXIT - BC= 0 ; ;**********************r`BNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!BC= SECTOR # ; ;**************************************************************************** ; SETSEC: LD (CPM_SEC),BC RZINNNNNNNNNNNNNNNNN]NNNNNNNNNNNNNNNNNNNNN!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; SECTRN: ; ; IF NO TRANSLATION THEN RETURN SECTOR++ ; LD NNNNNNNNNNNNNNNN%SNNNNNNNNNNNNNNNNNNNNNNLD (LOGIOPB + PB_DMAXO),A ; LD HL,LOGIOPB LD DE,IOPB LD BC,PB_STATO LDIR ; ; EXECUTE WITHOUT COMPENSATION ; JR LBNNNNNNNNNNNNNNNN+p NNNNNNNNNNNNNNNNNNNNNN ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; LL_WRIT: ; ; IF STILL PROTECTED THEN 3NNNNNNNNNNNNNNNNrNNNNNNNNNNNNNNNNNNNNNN TO READ ID SECTOR ; CALL BUF_FLSH ;FLUSH BUFFER 1ST JR NZ,LOGERR ; CALL DISKLOG JR NZ,LOGERR ; ; IF NO ID SECTOR *MNNNNNNNNNNNNNNNNN#NNNNNNNNNNNNNNNNNNNNNNBUF + ID_FLGO) AND A,[1 SHL DF_DTDB] OR [1 SHL DF_HARDB] CALL Z,TR8 ; ; IF NO DYNAMIC SKEW TABLE SPECIFIED THEN TRANSLATVNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN LD HL,(CUR_DPH) XOR A,A ;RETURN NO-ERROR JR LGDONE ; ; ; NO ID SECTOR, USE DEFAULT DATA ; LGDEF: ; ; IF NOT HANNNNNNNNNNNNNNNNeNNNNNNNNNNNNNNNNNNNNNN****************************************************** ; HOME: ; ; IF PENDING WRITE (BUFFER DIRTY) THEN IGNORE ; LD A,(NNNNNNNNNNNNNNNNFNNNNNNNNNNNNNNNNNNNNNNET ;**************************************************************************** ; ; SET TRANSFER ADDR ; ENTRY- BC= ADDR0NNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNN!A,D ;IF TABLE ADDR = 0 THEN NO TRANSLATION OR A,E JP Z,NOTRAN ; ; ELSE CALCULATE NEW SECTOR FROM TABLE ; EX DE,HL A~@NNNNNNNNNNNNNNNNN&PNNNNNNNNNNNNNNNNNNNNNNL_DO ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; LOW LEVEL READ ; ENTRY- IX= DDT P"BNNNNNNNNNNNNNNNN,NNNNNNNNNNNNNNNNNNNNNNERROR ; LD A,(WR_PROT) OR A,A JR NZ,DO_ERR ; ; INHIBIT UPLOAD ; LD A,1 SHL PB_INHX LD (IOPB + PB_FLGO),A ; ; INNNNNNNNNNNNNNNNCNNNNNNNNNNNNNNNNNNNNNNTHEN USE DEFAULT DPB ; (NOTE: CONTROLLER HAS SET IT'S DISK DEFAULTS IN DEFBFR IN ALL CASES) ; ID SECTOR TYPES ARE: ; -1: NON#NNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNION IS DONE ; LD A,(BLKBUF + ID_SKWO) LD (IY + DPB_SKT),A ;IF 0 THEN DISABLES SKEW ADDITION OR A,A JR Z,NO_SKW ; ; j~NNNNNNNNNNNNNNNNNN.NNNNNNNNNNNNNNNNNNNNNNRD DISK THEN GO DO FLOPPY TEST ; BIT DDT_HDB,(IX + DDT_FLG) JR Z,LGCKFD ; ; ELSE USE HARD DISK DEFAULTS ; CALL TRNONMNNNNNNNNNNNNNNNNVNNNNNNNNNNNNNNNNNNNNNNBUF_MOD) OR A,A JR NZ,HOME2 ; ; ELSE PURGE BUFFER ; LD (BUF_ACT),A ; HOME2: ; ; JUST SET TRACK TO 0 ; LD BC,hNNNNNNNNNNNNNNNNNuNNNNNNNNNNNNNNNNNNNNNNESS ; EXIT - A= ? ; ;**************************************************************************** ; SETDMA: LD (CPM_DMA),BCNNNNNNNNNNNNNNNN!NNNNNNNNNNNNNNNNNNNNNNDD HL,BC LD L,(HL) ; LD H,0 RET ; ; ; CONVERT FROM CP/M'S LOGICAL SECTOR {0..N-1} TO PHYSICAL SECTOR {1..N} ; NHNNNNNNNNNNNNNNNNN'5aNNNNNNNNNNNNNNNNNNNNN!TR ; IY= DPB PTR ; EXIT - IOPB.PB_STATO, A= STATUS ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++NNNNNNNNNNNNNNNN-ڪNNNNNNNNNNNNNNNNNNNNN! CALCULATE DOWNLOAD BYTE COUNT ; LD A,(IY + DPB_PSH) ;USE SHIFT FACTOR {0:128, 1:256, 2:512, 3:1024} LD HL,128 ;START WITH\NNNNNNNNNNNNNNNNfNNNNNNNNNNNNNNNNNNNNN!E 0: OLD JADE DD ; 2: EXTENDED 3: PARTITIONED, 0-FILLED ; LD A,(IOPB + PB_ST2O) CP A,-1 JR Z,LGDEF ; ; ELSE IF TY8NNNNNNNNNNNNNNNN ENNNNNNNNNNNNNNNNNNNNN!ELSE VALID SKEW TABLE ON DISK, TRANSFER TO SKEW BUFFER ; LD HL,BLKBUF ;CALCULATE PTR TO TABLE LD E,A LD D,0 ADD HL,DE 1NNNNNNNNNNNNNNNNNcNNNNNNNNNNNNNNNNNNNNN!E ; NO XLATE LD HL,HDPBK ; ; XFER DATA TO TABLES ; SEL2: LD DE,(CUR_DPB) ; USE DEFAULT TABLE LD BC,DPB_SZ LDIR ;|YrNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN0 ; ; FALL INTO SET TRACK ; ;**************************************************************************** ; ; SET TRNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN ; LD A,(BUF_DMAB) ;FETCH BANK ADDRESS SET BY COLD START LD (CPM_DMAB),A ; ; DONE ; RET ;++++++++++++++++++++++1XNNNNNNNNNNNNNNNN"ʔNNNNNNNNNNNNNNNNNNNNN!OTRAN: LD HL,1 ADD HL,BC RET SUBTTL DISK SUPPORT ROUTINES ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++NNNNNNNNNNNNNNNNN(%_NNNNNNNNNNNNNNNNNNNNNN+++++++ ; LL_READ: ; ; ENABLE UPLOAD ; XOR A,A LD (IOPB + PB_FLGO),A ; ; DISABLE DOWNLOAD ; LD HL,0 LD (IOPBqBNNNNNNNNNNNNNNNN.NNNNNNNNNNNNNNNNNNNNNN 128 BYTES ; AND A,3 ;LIMIT TO 1024-BYTE SECTORS ; JR Z,LL_WR2 ;IF SHIFT_FACTOR == 0 THEN DONE ; LL_WR3: ADD HL,HL ;DOCNNNNNNNNNNNNNNNNNNUNNNNNNNNNNNNNNNNNNNNNNPE == 3 THEN OK ; CP A,3 JR NC,TYPE3_ID ; ; ELSE PAD UNINITIALIZED DATA TO 0 ; LD HL,BLKBUF + ID_PSHO ;FILL DATA WITp NNNNNNNNNNNNNNNNN vNNNNNNNNNNNNNNNNNNNNNN; EX DE,HL ;CALCULATE BUFFER PTR LD HL,(CUR_DPB) LD BC,DPB_SKT ADD HL,BC EX DE,HL ; LD BC,SKTSZ LDIR ; NO_SKW: NNNNNNNNNNNNNNNNNRNNNNNNNNNNNNNNNNNNNNNN LD A,(HL) ;HEADS VALUE JR SEL1 ; ; ; USE 8" FLOPPY DEFAULTS ; LGCKFD: CALL TR8 LD HL,SD8PBK JR SEL2 ; ; ERRr+NNNNNNNNNNNNNNNNN0NNNNNNNNNNNNNNNNNNNNN!ACK # ; ENTRY- BC= TRACK # ; ;**************************************************************************** ; SETTRK: LD ( NNNNNNNNNNNNNNNN?NNNNNNNNNNNNNNNNNNNNN!++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; SECTOR TRANSLATION FUNCTION ; ENTRY- DE= 0: NO XLATE, ELSE PTR TO 2DBNNNNNNNNNNNNNNNN#NNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++ ; ; LOGON DISK FUNCTION ; ENTRY- IX= DDT PTR ; IY= DPB PTR ; EXIT - A= 0: OK; /0: ERROR ; ;++++++++++NNNNNNNNNNNNNNNNN)nNNNNNNNNNNNNNNNNNNNNNN + PB_BCNTO),HL ; ; PASS READ SECTOR COMMAND ; LD A,PB_READC JP LL_RW ;+++++++++++++++++++++++++++++++++++++++++++UNNNNNNNNNNNNNNNNN/NNNNNNNNNNNNNNNNNNNNNNUBLE COUNT DEC A JP NZ,LL_WR3 ; LL_WR2: LD (IOPB + PB_BCNTO),HL ; ; PASS WRITE COMMAND ; LD A,PB_WRITC ; ; FALLNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNH 0S LD B,ID_FLGO - ID_PSHO ; PADIDL: LD (HL),0 INC HL DJNZ PADIDL ; ; PROCESS TYPE-3 ID SECTOR ; TYPE3_ID: ; ; NNNNNNNNNNNNNNNN }NNNNNNNNNNNNNNNNNNNNNN ; ; XFER DISK DATA TO DPB ; LD DE,(CUR_DPB) ;GET ADDR OF DPB LD HL,BLKBUF + ID_SPTO LD BC,DPB_SZ - 1 LDIR ; ; ߜNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOR EXIT ; LOGERR: LD HL,0 ; ; DONE ; LGDONE: POP IY ;RESTORE REGS POP IX RET ;*********************************$NNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNCPM_TRK),BC RET ;**************************************************************************** ; ; SET SECTOR ; ENTRY- n!NNNNNNNNNNNNNNNNlNNNNNNNNNNNNNNNNNNNNNNXLATE TABLE ; BC= SECTOR # TO XLATE ; EXIT - HL= XLATED SECTOR OR BC + 1 ; BC= UNCHANGED ; A, DE= ? ; ;++++++++++++++++VNNNNNNNNNNNNNNNNN$`2NNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; DISKLOG: ; ; SET UP READ IOPB ; LD A,(BUF_DMAB) 2NNNNNNNNNNNNNNNN*C=NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++ ; ; LOW LEVEL WRITE ; ENTRY- IX= DDT PTR ; IY= DPB PTR ; EXIT - IOPB.PB_STATO, A= STATUS{NNNNNNNNNNNNNNNNN0NNNNNNNNNNNNNNNNNNNNNN INTO COMMON CODE ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; COMMON IOPB EXECUT5HNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNŃg5Ѕk9Չp> ؍tBޑzH䕲M陷S!Z(â_-ɦNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNER ; ENTRY- A= COMMAND ; IX= DRIVE TABLE PTR ; IY= DPB PTR ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ $NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNR ; IOPBDMP: LD A,(BUF_DMAB) ;SET BANK LD E,A ; LD HL,IOPB LD A,MF_DIOB ;USE DISPLAY IOPB DATA FUNCTION CALL XMROM fNNNNNNNNNNNNNNNN |NNNNNNNNNNNNNNNNNNNNNN ;RETURN -1 TO BDOS OR A,A RET ; ; ; DISPLAY WRITE PROTECT ERROR MESSAGE ; DO_ERR: LD HL,WP_ERM CALL EDITOR JR ILBNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNND DISK ROUTINES ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EXECUTE THE IOPB PRIMITIVE BNNNNNNNNNNNNNNNN$NNNNNNNNNNNNNNNNNNNNNN+ ; HDEXEC: EQU XPRIM SUBTTL JADE FLOPPY DRIVER ROUTINES ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++PNNNNNNNNNNNNNNNNNmNNNNNNNNNNNNNNNNNNNNNNKEW ENABLED THEN TRANSLATE IT ; FD8SNGL: PUSH IY ;CALCULATE PTR TO TABLE POP HL LD DE,DPB_SKT ADD HL,DE ; LD DE,(INNNNNNNNNNNNNNNN%d3NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; FUNCTION DISPATCHER ; ENTRY- A= FUNCTION # ; EXIT - vNNNNNNNNNNNNNNNN+GNNNNNNNNNNNNNNNNNNNNNNLD HL,(IOPB + PB_TRKO) ;FETCH CURRENT TRACK PUSH HL ;SAVE CURRENT TRACK FOR RESTORATION ; LD A,(IX + DDT_HDS) ;IF HEADS =|NNNNNNNNNNNNNNNN"NNNNNNNNNNNNNNNNNNNNN!ANSLATED SECTOR # FROM TABLE LD (IOPB + PB_SECO),A ; NOSKEW: ; ; EXECUTE THE IOPB ; CALL XPRIM ; ; RESTORE THE MOd NNNNNNNNNNNNNNNNN(oNNNNNNNNNNNNNNNNNNNNN!,-1 RET ; BF_OK: ; ; ELSE COMPUTE TABLE ENTRY ; PUSH HL ;SAVE POSSIBLE DATA ; LD HL,BFUNTBL ADD A,A ADD A,L |NNNNNNNNNNNNNNNNN.NNNNNNNNNNNNNNNNNNNNN!TBL) / 2 ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN BIOS VERSION # - FUNCTI-\NNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNRN ADDRESS ON STACK PUSH HL ; LD L,(IX + DDT_EXE) ;FETCH DRIVER ADDRESS FROM TABLE LD H,(IX + DDT_EXE + 1) JP (HL) ; NNNNNNNNNNNNNNNNN ANNNNNNNNNNNNNNNNNNNNNNP A,'A' ;IF ABORT THEN RE-BOOT JP Z,0 ; ; ELSE IF DEBUGGER THEN EXECUTE IT ; CP A,'M' JP Z,MR_BRK ; ; ELSE IF IGrNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNN**************************************************************** ; ; SET NO SECTOR TRANSLATION PROCEDURE ; EXIT - HL, DE= ? NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN! ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; HARD DISK DRIVER FUNCTION ; ENTRY- IX=3NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN= 1 THEN SKIP MODIFICATION DEC A JR Z,FD8SNGL ; LD A,(IOPB + PB_SECO + 1) ADD A,A ;BIT 15 -> BIT_BUCKET ; SRL H ʲNNNNNNNNNNNNNNNN#ΕNNNNNNNNNNNNNNNNNNNNNNDIFIED IOPB SO RETRY WILL WORK ; POP HL ;RESTORE ORIGINAL SECTOR RES 7,H ;CLEAR SIDE BIT 1ST LD (IOPB + PB_SECO),HL HNNNNNNNNNNNNNNNNN)!^NNNNNNNNNNNNNNNNNNNNNN LD L,A LD A,0 ADC A,H LD H,A ; ; EXECUTE TABLE ADDRESS ; LD A,(HL) INC HL LD H,(HL) LD L,A ; EX (SP),HL z8NNNNNNNNNNNNNNNNN/NNNNNNNNNNNNNNNNNNNNNNON #0 ; EXIT - HL= VERSION # IN BINARY {0.00,..655.35} ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++N9NNNNNNNNNNNNNNNN7NNNNNNNNNNNNNNNNNNNNNN; DRIVER RETURNS HERE ; LL_OPRET: ; ; IF NO ERRORS THEN RETURN ZF ; RET Z ;IF NO_ERROR THEN RETURN ; ; PRINT ERRONNNNNNNNNNNNNNNN MNNNNNNNNNNNNNNNNNNNNNNNORE THEN RETURN NO ERROR ; SUB A,'I' ;IF IGNORE THEN RETURN NO ERROR RET Z ; ; ELSE RETURN ERROR TO BDOS ; LD A,-1{NNNNNNNNNNNNNNNN1NNNNNNNNNNNNNNNNNNNNNN; ;**************************************************************************** ; TRNONE: LD DE,0 JR SETTR SUBTTL HARhNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN DRIVER TABLE PTR ; EXIT - A= 0: OK; /0: ERROR ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++JaNNNNNNNNNNNNNNNN\NNNNNNNNNNNNNNNNNNNNN!RR L RRA ;TRK BIT 0 -> SECTOR BIT 15 LD (IOPB + PB_SECO + 1),A ; LD (IOPB + PB_TRKO),HL ;TRACK = RESIDUAL ; ; IF SNNNNNNNNNNNNNNNNN$WNNNNNNNNNNNNNNNNNNNNNN; POP HL ;RESTORE ORIGINAL TRACK LD (IOPB + PB_TRKO),HL ; ; DONE ; RET SUBTTL BIOS FUNCTION CALLS ;+++++++++ NNNNNNNNNNNNNNNNNN*t NNNNNNNNNNNNNNNNNNNNN!;PUT CALLER'S DATA IN HL, FUNCTION ADDR ON RET ; STACK, EXECUTE FUNCTION ADDRESS ON STACK ;############################vNNNNNNNNNNNNNNNNN0NNNNNNNNNNNNNNNNNNNNNN+++++++++ ; BF_RVERS: ; ; RETURN VERSION ; LD HL,VERSN ; ; RETURN NO ERROR ; XOR A,A RET ;+++++++++++++++HNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNρk9ԅn< ׉r? ڍwE⑰}J啲M虷S!Y'],ȦNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN MONITOR DRIVE # - FUNCTION #1 ; ENTRY- C= CP/M DRIVENNNNNNNNNNNNNNNNNE3NNNNNNNNNNNNNNNNNNNNNN 0: OK, /0: ERROR ; BC,DE,HL= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; BF_DLOG:gNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN; ELSE ENABLE LOGON ; LD DE,DDT_FLG ;OFFSET TO FLAGS ADD HL,DE RES 0,(HL) ; ; RETURN NO ERROR ; XOR A,A RET .NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNF LOGON DID IT ; EX DE,HL ;HL=SRC LD DE,BLKBUF ;DEST LD BC,128 ;MUST BE IN 1ST 128 BYTES LDIR ; ; IF ID-TYPE NOT PNNNNNNNNNNNNNNNNeONNNNNNNNNNNNNNNNNNNNN!+++++++++++++++++++++ ; RETDVRT: ; ; ASSUME DRIVE 0 ; LD HL,DDT_0 ;START AT 1ST TABLE ; ; IF DRIVE == 0 THEN ALREAD$NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN******************************************************** ; ; NEWLINE PROCEDURE ; ;******************************************v NNNNNNNNNNNNNNNN%%NNNNNNNNNNNNNNNNNNNNNNONDITIONAL JUMP IS MODIFIED TO AN UNCONDITIONAL JUMP BY ; THE WARM BOOT ROUTINE IF THE CLOCK/CALENDAR BOARD IS NOT PRESENT ; BNNNNNNNNNNNNNNNN+NNNNNNNNNNNNNNNNNNNNNN C,A LD B,A RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; CDOS RETURN VERSION8NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN # {0..15} ; EXIT - A= {0..253}: MONITOR DRIVE # ; -2: DRIVE ERROR ; BC,DE,HL= ? ; ;++++++++++++++++++++++++++++++++++[3INNNNNNNNNNNNNNNNNU NNNNNNNNNNNNNNNNNNNNNN ; ; FETCH TABLE PTR ; CALL RETDVRT ; ; IF ILLEGAL DRIVE THEN RETURN ERROR ; JR NZ,ARGERR ; ; ELSE SET LOGON DNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; SET DISK FORMAT - FUNCTION #4 ; ENTRY- CNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!3 THEN ERROR ; LD A,(BLKBUF + 1FH) ;FETCH TYPE SUB A,'3' RET C ; ; SET DATA USING LOGON CODE ; LD HL,BF_SRET ;FAKED` NNNNNNNNNNNNNNNN0NNNNNNNNNNNNNNNNNNNNNNY THERE ; LD A,C OR A,A RET Z ; ; ELSE IF ILLEGAL DRIVE THEN RETURN ERROR ; CP A,NDRVS JR C,RETDV2 ; LD HL,0 .dNNNNNNNNNNNNNNNNN BNNNNNNNNNNNNNNNNNNNNNN********************************* ; CRLF: LD C,CR CALL COC LD C,LF JP COC IF INTCPTS SUBTTL ADDITIONAL FUNCTIONtONNNNNNNNNNNNNNNN&pNNNNNNNNNNNNNNNNNNNNNN IF NOT MODIFIED, THEN IT IS ALLWAYS FALSE (NOP). ; INHCLK: JR C,ILLEGC ; ; NOW CHECK FOR EXTENDED CALLS ; CP A,8DH ;IF;2yNNNNNNNNNNNNNNNN,/NNNNNNNNNNNNNNNNNNNNNN FUNCTION ; MAKES CLOCK/CALENDAR WORK. ; EXIT - B= 1 ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ bNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++++ ; BF_RDRV: ; ; FETCH TABLE PTR ; CALL RETDVRT ; ; IF ILLEGAL DRIVE THEN gNNNNNNNNNNNNNNNNNN f$NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNR TABLE RECORD ; ENTRY- #DADD= DRIVER ADDRESS ; #PD= PHYSICAL DRIVE # ; #FLG= DRIVE FLAGS ; #DPB= DPB ADDRESS ; #DPH= DNNNNNNNNNNNNNNNN%NNNNNNNNNNNNNNNNNNNNNNE DDT_4: ALLDRV FD8EXEC,0,0,D4DPB,D4DPH,1,0 ; F DDT_5: ALLDRV FD8EXEC,1,0,D5DPB,D5DPH,1,0 ENDIF IF BOOT = 11H ; NNNNNNNNNNNNNNNN+1NNNNNNNNNNNNNNNNNNNNNN########################################## ; ; MESSAGES ; ;###############################################################{9NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!M ENDIF ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; MONITOR ROM EXECUTER ; ENTT$NNNNNNNNNNNNNNNNNb=NNNNNNNNNNNNNNNNNNNNNND A,MF_CIS JP XMROM ;**************************************************************************** ; ; CONSOLE OUTPUT ;gQ$NNNNNNNNNNNNNNNNțNNNNNNNNNNNNNNNNNNNNNNNCH: RET ;**************************************************************************** ; ; PRINTER DRIVER ; ENTRY- C= CHWrNNNNNNNNNNNNNNNN$#NNNNNNNNNNNNNNNNNNNNN!** ; EDITOR: CALL GETBNK LD E,A LD A,MF_PUTS JP XMROM SUBTTL INITIALIZED DATA ;################################YdrNNNNNNNNNNNNNNNN,NNNNNNNNNNNNNNNNNNNNNN############################### ; STRUCT 0 DDT_EXE DS 2 ;START ADDRESS OF DISK DRIVER DDT_FLG DS 1 ;FLAGS BIT DEF. ; 0dNNNNNNNNNNNNNNNNN rNNNNNNNNNNNNNNNNNNNNNNPH ADDRESS ; #HDS= HEADS ; #SOF= SECTOR OFFSET ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@6NNNNNNNNNNNNNNNNN&GNNNNNNNNNNNNNNNNNNNNNNA DDT_0: ALLDRV HDEXEC,6,10H,D0DPB,D0DPH,4,0 ; B DDT_1: ALLDRV HDEXEC,6,12H,D1DPB,D1DPH,4,8000H ; C DDT_2: ALLDRV HDEXENNNNNNNNNNNNNNNN,NNNNNNNNNNNNNNNNNNNNNN############# ; MSGLE: DM CR,LF,'LOAD ERROR' ; DSKEB: DM CR,LF,'Abort, Ignore, Retry, (BDOS) - ' ; WP_ERM: DM CR,LF,'W-PROqNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNRY- A= FUNCTION # ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; XMROM: EQU MR_FUN 3BNNNNNNNNNNNNNNNN Q NNNNNNNNNNNNNNNNNNNNNN ENTRY- C= CHAR TO OUTPUT ; ;**************************************************************************** ; COC: LD A,MF_CݽNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNAR TO OUTPUT ; ;**************************************************************************** ; LO: LD A,MF_LO JP XMROM `%BNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN############################################ ; ; 3740 SECTOR TRANSLATION TABLE ; **** CP/M SINGLE DENSITY **** ; ;#########J^NNNNNNNNNNNNNNNNNN4NNNNNNNNNNNNNNNNNNNNNN 1: INHIBIT LOGON ; 1..3 PARTITION # {0,..7} DDT_HDB EQU 4 ;1: HARD DISK DRIVE ; DDT_DRV DS 1 ;PHYSICAL DRIVE # DDT_NNNNNNNNNNNNNNNNNN!CNNNNNNNNNNNNNNNNNNNNNN@@@@ ; ALLDRV MACRO #DADD,#PD,#FLG,#DPB,#DPH,#HDS,#SOF DW #DADD ;DRIVER EXECUTION ADDR DB #FLG ;FLAGS DB #PD ;MONITOR#NNNNNNNNNNNNNNNNN'tNNNNNNNNNNNNNNNNNNNNNNC,4,10H,D2DPB,D2DPH,4,0 ; D DDT_4: ALLDRV FD8EXEC,0,0,D4DPB,D4DPH,1,0 ; E DDT_5: ALLDRV FD8EXEC,1,0,D5DPB,D5DPH,1,0 9HNNNNNNNNNNNNNNNN-.NNNNNNNNNNNNNNNNNNNNN!T Error!' ; IF INTCPTS ISCMSG: DM CR,LF,'ILL SYS CALL, #= ' ENDIF ;##############################################NNNNNNNNNNNNNNNN'PNNNNNNNNNNNNNNNNNNNNNNSUBTTL CHAR I/O ROUTINES ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; CONSOLE INPUT ; E\NNNNNNNNNNNNNNNN _NNNNNNNNNNNNNNNNNNNNNNO JP XMROM ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; READER DRIVER - DUMMY ; E:NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN LIST DEVICE STATUS ; EXIT - A= 0 NNNNNNNNNNNNNNNNBANNNNNNNNNNNNNNNNNNNNNN################################################################### ; SDTRAN: GXLATE 26,6 ;##############################GNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNDPB DS 2 ;DPB ADDRESS FOR THIS DRIVE DDT_DPH DS 2 ;DPH ADDRESS FOR THIS DRIVE ; ; THE FOLLOWING MAY BE BROUGHT OFF DISK DESyNNNNNNNNNNNNNNNN"NNNNNNNNNNNNNNNNNNNNN! PHYSICAL DRIVE # DW #DPB ;DISK PARAMETER BLOCK PTR DW #DPH ;DISK PARAMETER HEADER PTR DB #HDS ;HEADS DW #SOF ;SECTONNNNNNNNNNNNNNNNN(dNNNNNNNNNNNNNNNNNNNNNNENDIF IF BOOT = 3 ; A DDT_0: ALLDRV FD8EXEC,0,0,D0DPB,D0DPH,1,0 ; B DDT_1: ALLDRV FD8EXEC,1,0,D1DPB,D1DPH,1,0 ; CaNNNNNNNNNNNNNNNN.}NNNNNNNNNNNNNNNNNNNNNN############################## ; ; DEFAULT 8" FLOPPY DISK PARAMETER BLOCK ; IBM 3740 SINGLE DENSITY FORMAT ; ;#############VNNNNNNNNNNNNNNNNaNNNNNNNNNNNNNNNNNNNNN!XIT - A= CHAR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; CI: LD A,MF_CI JP XMROM d'NNNNNNNNNNNNNNNNN 7nNNNNNNNNNNNNNNNNNNNNNNXIT - A= CTRL-Z ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; READER: LD A,CTRLZ ;FAKE 8rNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN: BUSY, FFH:READY ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; LISTST: LD A,MF_LOS ,NNNNNNNNNNNNNNNNNqpNNNNNNNNNNNNNNNNNNNNNN############################################## ; ; COMMON I/O PARAMETER BLOCK ; ;###########################################jYNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNCRIPTOR OR FROM DEFAULT TABLES ; DDT_HDS DS 1 ;HEADS DDT_SOF DS 2 ;SECTOR OFFSET ; ; DEFINE THE STRUCTURE SIZE ; DDT_SINNNNNNNNNNNNNNNN#!NNNNNNNNNNNNNNNNNNNNN!R OFFSET ; ENDM IF BOOT = 10H ; A DDT_0: ALLDRV HDEXEC,4,10H,D0DPB,D0DPH,4,0 ; B DDT_1: ALLDRV HDEXEC,4,12H,D1Dr NNNNNNNNNNNNNNNNN)WNNNNNNNNNNNNNNNNNNNNNN DDT_2: ALLDRV HDEXEC,4,10H,D2DPB,D2DPH,4,0 ; D DDT_3: ALLDRV HDEXEC,4,12H,D3DPB,D3DPH,4,8000H ; E DDT_4: ALLDRV HDEXECNNNNNNNNNNNNNNNNN/LNNNNNNNNNNNNNNNNNNNNNN############################################################### ; SD8PBK: DW 26 ;SECTORS PER TRACK DB 3 ;BLOCK SHIFT FACTONNNNNNNNNNNNNNNNA2NNNNNNNNNNNNNNNNNNNNN! ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN CONSOLE STATUS ; EXIT - A= 0: N9NNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNEOF ; ; FALL INTO PUNCH RETURN ; ;**************************************************************************** ; ; P9NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNJP XMROM ;**************************************************************************** ; ; MESSAGE EDITOR ; ENTRY- HL= T]DNNNNNNNNNNNNNNNNNaNNNNNNNNNNNNNNNNNNNNNNN################################# ; IOPB: REPT PB_SIZE LIST OFF DB 0 LIST ON ENDM ;##############################G9NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNZ DS 0 ENDM ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; MACRO TO DEFINE THE DRIVE~P'NNNNNNNNNNNNNNNNN$!NNNNNNNNNNNNNNNNNNNNNNPB,D1DPH,4,8000H ; C DDT_2: ALLDRV HDEXEC,5,10H,D2DPB,D2DPH,4,0 ; D DDT_3: ALLDRV HDEXEC,5,12H,D3DPB,D3DPH,4,8000H ; NNNNNNNNNNNNNNNN*NNNNNNNNNNNNNNNNNNNNN!,5,10H,D4DPB,D4DPH,4,0 ; F DDT_5: ALLDRV HDEXEC,5,12H,D5DPB,D5DPH,4,8000H ENDIF ;##################################.iNNNNNNNNNNNNNNNNN0NNNNNNNNNNNNNNNNNNNNNNR DB 7 ;BLOCK MASK DB 0 ;NULL MASK DW 242 ;DISK SIZE -1 DW 63 ;DIRECTORY MAX DB 11000000B ;ALLOC 0 DB 0 ;ALLOC NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNρj8ԅn< ։q? ۍvD{I啲N陸V#񝿞[(¢^,ǦNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN1 DW 16 ;CHECK SIZE DW 2 ;TRACK OFFSET DB 0 ;PHYSICAL RECORD SHIFT FACTOR DB 0 ;PHYSICAL RECORD MASK DW 0 ;LOGICANNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!ACK OFFSET (OFF) DB 1 ;PHYSICAL RECORD SHIFT FACTOR (PSH) DB 1 ;PHYSICAL RECORD MASK (PRM) DW 0 ;LOGICAL DRIVE SECTO@pNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN ;;" DW 0 ;;" DW DIRBF ;;DIRECTORY BUFFER PTR DW D#D(DD)DPB ;;DRIVE PARAMETER BLK PTR IF (DSK_#D(DD) AND 0F0H) = 10NNNNNNNNNNNNNNNN۩NNNNNNNNNNNNNNNNNNNNNNB -1 ;/0: WRITE PROTECTION ENABLED ; ; LAST OF INITIALIZED CODE READ FROM DISK ; BIOSND EQU $ SUBTTL UNINITIALIZED DnrNNNNNNNNNNNNNNNN4bNNNNNNNNNNNNNNNNNNNNNN BLOCKING BUFFER MAINTENANCE ; BUF_PSEC DS 2 ;BUFFER PHYSICAL SECTOR BUF_ACT DS 1 ;0: BUFFER FLUSHED, /0: DATA IN BUFFER BNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN##################################################### ; ; VARIABLES ; ;###################################################ONNNNNNNNNNNNNNNN%tNNNNNNNNNNNNNNNNNNNNN!ODE) LSTINC EQU FALSE ;LIST INCLUDE FILES USEMON EQU TRUE ;USE MONITOR ROM I/O ROUTINES IF TRUE INTRPTS EQU TRUE ;ENABLE INNNNNNNNNNNNNNNN+WNNNNNNNNNNNNNNNNNNNNN! C SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 1 ; D SIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 1 ; E JADE 8" FLOPPY PHYSICAL DRIVErNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNL DRIVE SECTOR OFFSET DB 0 ;SKEW = 0 ; ; DEFAULT DISK PHYSICAL PARAMETERS ; DB 1 ;HEADS ;#######################3NNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNR OFFSET (SOF) DB 0 ;SKEW = 0 ; ; ; DB 4 ;HEADS ;#################################################################)INNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!H DW 0 ;;NO CHECKS ON HARD DISK ELSE DW D#D(DD)CHK ;;DRIVE DISK CHECKSUMS ARRAY PTR ENDIF DW D#D(DD)ALL ;;DRIVE CrNNNNNNNNNNNNNNNNB>NNNNNNNNNNNNNNNNNNNNNNATA AREA ;############################################################################ ; ; THE FOLLOWING DATA MUST RESIDE IPrNNNNNNNNNNNNNNNNa1NNNNNNNNNNNNNNNNNNNNNNUF_MOD DS 1 ;0: BUFFER CLEAN, /0: BUFFER DIRTY (MODIFIED) ; BUF_DDT DS 2 ;BUFFER DDT PTR BUF_DPB DS 2 ;BUFFER DPB PTR ; RSF&NNNNNNNNNNNNNNNNN oNNNNNNNNNNNNNNNNNNNNNN######################### ; CUR_DPB DS 2 ;DRIVE TABLE PTR CUR_DDT DS 2 ;DRIVE DRIVER TABLE BASE ADDRESS PTR CUR_DPH DS 2 ;DPNNNNNNNNNNNNNNNNN&!NNNNNNNNNNNNNNNNNNNNNNNTERRUPT PROCESSING WHISTLE INTCPTS EQU TRUE ;ENABLE SYSTEM CALL INTERCEPT WHISTLE BOOT EQU 10H ;10H: HARD DISK, 3: 8" FLOPP/rNNNNNNNNNNNNNNNN,NNNNNNNNNNNNNNNNNNNNN! 0 ; F JADE 8" FLOPPY PHYSICAL DRIVE 1 ENDIF IF BOOT = 3 ; A JADE 8" FLOPPY PHYSICAL DRIVE 0 ; B JADE 8" FLOPPYNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN##################################################### ; ; DEFAULT 8" HARD DISK PARAMETER BLOCK ; ;##########################VNNNNNNNNNNNNNNNN 7NNNNNNNNNNNNNNNNNNNNN!########### ; ; DRIVE PARAMETER HEADER AREA ; 1 PER DRIVE ; ;##############################################################(NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNLUSTER ALLOCATION BIT MAP PTR LIST OFF ENDM ; ; DEFINE THE DATA ; DD DL 1 REPT NDRVS LIST OFF ALLDPH 0123456789A/rNNNNNNNNNNNNNNNNqNNNNNNNNNNNNNNNNNNNNNNN THIS ORDER TO MATCH THE IOPB DATA ; ;############################################################################ ; ; CPaCNNNNNNNNNNNNNNNNRNNNNNNNNNNNNNNNNNNNNNNLAG: DS 1 ;0: NO PREREAD REQ'D, /0: PREREAD REQ'D READOP: DS 1 ;0: WRITE OPERATION, 1: READ OPERATION WRTYPE: DS 1 ;WRITE OPEReBNNNNNNNNNNNNNNNN!^NNNNNNNNNNNNNNNNNNNNNN TITLE CUSTOMIZED BIOS FOR M5B LIST NOCOND ;============================================================================ ; ^NNNNNNNNNNNNNNNNN'NNNNNNNNNNNNNNNNNNNNN!Y, 20H: 5" FLOPPY DEBUG EQU FALSE ;TRUE TO DUMP THE IOPB DATA TO PRINTER FORM ;******************************************NNNNNNNNNNNNNNNN-3NNNNNNNNNNNNNNNNNNNNNN PHYSICAL DRIVE 1 ; C SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 0 ; D SIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 0 ; E SIDE 0 NNNNNNNNNNNNNNNNNAMNNNNNNNNNNNNNNNNNNNNNN################################################## ; HDPBK: DW 128 ;SECTORS PER TRACK (LOGICAL) (SPT) DB 5 ;BLOCK SHIFT FANNNNNNNNNNNNNNNNN bBNNNNNNNNNNNNNNNNNNNNNN############## ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; GENERATE A DISK PARAMETER XNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!BCDEF DD DL DD + 1 LIST ON ENDM ;############################################################################ ; ; LONNNNNNNNNNNNNNNN$\NNNNNNNNNNNNNNNNNNNNNN/M IOPB OVERLAY ; CPM_DSK DS 1 ;LOGICAL DRIVE CPM_TRK DS 2 ;LOGICAL TRACK NUMBER CPM_SEC DS 2 ;LOGICAL SECTOR NUMBER DS 1 ٻNNNNNNNNNNNNNNNNN˗NNNNNNNNNNNNNNNNNNNNNNATION TYPE FROM BDOS: ; 0: WRITE TO ALLOCATED (USED) BLOCK (PREREAD) ; 1: WRITE TO DIRECTORY (PREREAD & WRITE) ; 2: NNNNNNNNNNNNNNNN" NNNNNNNNNNNNNNNNNNNNN!; ASSEMBLY PARAMETERS ; ;============================================================================ FALSE EQU 0 TRUE EQU N7NNNNNNNNNNNNNNNNN(NNNNNNNNNNNNNNNNNNNNNN********************************** ; ; CUSTOMIZED BIOS FOR M5B ; (c) 1981 GRH Electronics, CUPERTINO, CA ; ;**********BNNNNNNNNNNNNNNNN.`NNNNNNNNNNNNNNNNNNNNNN& 1 OF HARD DISK PHYSICAL DRIVE 1 ; F SIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 1 ENDIF IF BOOT = 20H ; A JADE 5" FLOxNNNNNNNNNNNNNNNNNr|NNNNNNNNNNNNNNNNNNNNNNCTOR (BSH) DB 31 ;BLOCK MASK (BLM) DB 1 ;NULL MASK (EXM) DW 1015 ;DISK SIZE (CLUSTERS -1) (DSM) DW 1152 / 2 ;DIR'NNNNNNNNNNNNNNNNN QsNNNNNNNNNNNNNNNNNNNNNN TABLE MACRO ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ALLDPH: MACRO #D LIST ON D$NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNGON IOPB OVERLAY ; ;############################################################################ ; LOGIOPB: DB PB_LOGC ;CO!]NNNNNNNNNNNNNNNNmNNNNNNNNNNNNNNNNNNNNNN;FLAGS CPM_DMA DS 2 ;XFER ADDR CPM_DMAB DS 1 ;XFER BANK ; ; ; BUFFER IOPB OVERLAY ; BUF_DSK DS 1 ;BUFFER DISK NUMBER BNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNWRITE TO UNALLOCATED (UNUSED) BLOCK (NO ; PREREAD REQ'D) ; ; UNA_CNT: DS 1 ;# SECTORS REMAINING IN BLOCK (CLUSTER) UNA_DNNNNNNNNNNNNNNNN# (DIRBF + SECSZ) CONMSG **** NNNNNNNNNNNNNNNN+!!NNNNNNNNNNNNNNNNNNNNNNERRUPTS ; IN A,(M2_STAT) OR A,M2_IEN OUT (M2_STAT),A EI ENDIF ; ; LOG ON DRIVE TO INIT TABLES ; LD A,(DK_BDRVTNNNNNNNNNNNNNNNN_NNNNNNNNNNNNNNNNNNNNNN ; MR_RNUM EQU 0 ;INTERIM DEFINITION FOR INTERRUPT ROM SWAP ; SECSZ: EQU 128 NDRVS: EQU 6 IF BOOT = 10H ; ; 8" HARD7"NNNNNNNNNNNNNNNNNrNNNNNNNNNNNNNNNNNNNNNN==== ; LF: EQU 0AH CR: EQU 0DH CTRLZ: EQU 1AH ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@$NNNNNNNNNNNNNNNN2NNNNNNNNNNNNNNNNNNNNNNEXT IN RAM MACRO ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; PVERS MACRO #VERS DD DL NNNNNNNNNNNNNNNN4NNNNNNNNNNNNNNNNNNNNNNEADER JP HOME ;HOME SELECTED DRIVE JP SELDSK ;SELECT DISK DRIVE JP SETTRK ;SET TRACK # JP SETSEC ;SET SECTOR # JP NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!RE BIOSSZ: DW BIOSND - BIOS ;BIOS MODULE SIZE IN BYTES BIOSST: DW BIOS ;BIOS MODULE LOAD ADDR FOR SBD ; ; CONTINUE ON WITNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN; ; SET TEMPORARY STACK ; LD SP,DEFBFR ;USE PAGE 0 FOR STACK ; ; INIT DEFAULT DRIVE ; LD A,(DK_BDRV) ;USE DRIVE # PNNNNNNNNNNNNNNNNN&W}NNNNNNNNNNNNNNNNNNNNNNWARNING! COLD INIT CODE BIGGER THAN DIR BUFFER **** ELSE DS DIRBF+SECSZ-$ ;FILL OUT DIRECTORY BUFFER TO 1 SECTOR SIZE +NNNNNNNNNNNNNNNN,NNNNNNNNNNNNNNNNNNNNNN) AND A,3 ;MODULO 4 LD C,A LD E,0 CALL SELDSK LD A,L ;IF ERROR THEN ABORT OR A,H JR Z,WEROR ; ; READ BOOT DIWNNNNNNNNNNNNNNNNnNNNNNNNNNNNNNNNNNNNNN! DISK BOOT DATA ; STHD EQU 0 ;START LOGICAL DRIVE OF HARD DISK NDHD EQU 3 ;LAST LOGICAL DRIVE OF HARD DISK ST8FD EQU 4 ;SNNNNNNNNNNNNNNNN ANNNNNNNNNNNNNNNNNNNNNN@@@@ ; ; GENERATE THE TRANSLATION TABLE MACRO ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ޯHNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN#VERS IF DD > 9999 DB (DD / 10000) + '0' DD DL DD % 10000 ENDIF IF DD > 999 DB (DD / 1000) + '0' DD DL DD % 109NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNSETDMA ;SET TRANSFER ADDR JP DISKRD ;PERFORM DISK READ JP DISKWR ;PERFORM DISK WRITE JP LISTST ;RETURN LIST STATUS J5NNNNNNNNNNNNNNNN$NNNNNNNNNNNNNNNNNNNNN!H INIT ; INIT1: JR INIT ;############################################################################ ; ; DIRECTORY SECNNNNNNNNNNNNNNNN!NNNNNNNNNNNNNNNNNNNNN!ASSED IN PAGE 0 AND A,3 LD (DEFDRV),A ; ; SEND SYSTEM SIGN-ON ; CLOGO: LD HL,MSGSO CALL EDITOR ; ; MODIFY COLD SNNNNNNNNNNNNNNNNNN'dLNNNNNNNNNNNNNNNNNNNNN! ENDIF ;---------------------------------------------------------- ; ; WARM REBOOT ENTRY LOADS CCP,BDOS FROM DISK & ; SE4HNNNNNNNNNNNNNNNN-NNNNNNNNNNNNNNNNNNNNNNRECTORY ; LD BC,DEFBFR ;SET XFER ADDRESS (USE DEFAULT BUFFER) CALL SETDMA ; LD BC,BD_SEC ;SET DIRECTORY SECTOR CALL TNNNNNNNNNNNNNNNN7NNNNNNNNNNNNNNNNNNNNNNTART LOGICAL DRIVE OF 8" FLOPPY ND8FD EQU 5 ;LAST LOGICAL DRIVE OF 8" FLOPPY ENDIF IF BOOT = 3 ; ; 8" FLOPPY BOOT NNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN@ ; GXLATE MACRO #SECTORS, #SKEW LIST OFF NXTSEC DL 1 ;;START WITH SECTOR 1 LOWEST DL 1 ;; REPT #SECTORS LIST ON DNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN00 ENDIF DB (DD / 100) + '0' DB '.' DB ((DD % 100) / 10) + '0' DB (DD % 10) + '0' ENDM SUBTTL BIOS CODE ORrNNNNNNNNNNNNNNNNRNNNNNNNNNNNNNNNNNNNNNNP SECTRN ;TRANSLATE SECTOR JP BIOFUNC ;EXECUTE FUNCTION CALL ;#########################################################$HNNNNNNNNNNNNNNNNN#NNNNNNNNNNNNNNNNNNNNNNTOR BUFFER STARTS HERE AFTER CRUNCHING COLD START ; CODE. THIS BUFFER IS USED BY THE CP/M DIRECTORY CHECK ROUTINES THAT ; CHNNNNNNNNNNNNNNNN"NNNNNNNNNNNNNNNNNNNNN!TART VECTOR TO WARM START ; LD HL,(BIOS+4) LD (BIOS+1),HL ; ; BOOT CCP & BDOS ; JR WARM ;######################.NNNNNNNNNNNNNNNNN(trNNNNNNNNNNNNNNNNNNNNN!TS UP VARIABLES ; ;---------------------------------------------------------- ; WARM: ; ; SET TEMPORARY STACK ; LD SPUcBNNNNNNNNNNNNNNNN.NNNNNNNNNNNNNNNNNNNNNNSETSEC ; LD BC,0 ;SET TRACK TO 0 CALL SETTRK ; CALL DISKRD JR NZ,WEROR ; ; CHECK FOR VALID BOOT DIRECTORY ; LD-'NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNDATA ; STHD EQU 2 ;START LOGICAL DRIVE OF HARD DISK NDHD EQU 5 ;LAST LOGICAL DRIVE OF HARD DISK ST8FD EQU 0 ;START LOGICANNNNNNNNNNNNNNNNN 'NNNNNNNNNNNNNNNNNNNNNNB NXTSEC LIST OFF NXTSEC DL NXTSEC + #SKEW ;ADD SKEW FACTOR ;; IF NXTSEC > #SECTORS ;CHECK FOR OVERFLOW NXTSEC DL NXTSErNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!G BIOS ;---------------------------------------------------------------------------- ; ; BIOS JUMP VECTOR TABLE ; ;------{ NNNNNNNNNNNNNNNNNaNNNNNNNNNNNNNNNNNNNNN!################### ; ; THE FOLLOWING BOOT DATA MUST RESIDE AS DEFINED RIGHT BEFORE THE COLD ; INIT ROUTINE START AND MUST BE :NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!ECK FOR DISK CHANGE. ; ;############################################################################ ; DIRBF: EQU $ ;BUFFERTrNNNNNNNNNNNNNNNN#NNNNNNNNNNNNNNNNNNNNNN###################################################### ; ; SIGN-ON MESSAGE ; ;##############################################[NNNNNNNNNNNNNNNNN)GCNNNNNNNNNNNNNNNNNNNNNN,DEFBFR IF INTRPTS ; ; SET INTERRUPT VECTOR TABLE BASE ; LD A,HIGH INTABL LD I,A ; ; SET INTERRUPT MODE TO 2 ; v NNNNNNNNNNNNNNNNN/NNNNNNNNNNNNNNNNNNNNN! A,(DEFBFR) CP A,86H JR C,WEROR ; ; SET UP TO LOAD CCP/BDOS ; LD HL,(DEFBFR + BD_SBDSS) ;PREFETCH BDOS TRK/SECTOR PdjNNNNNNNNNNNNNNNNQNNNNNNNNNNNNNNNNNNNNNNL DRIVE OF 8" FLOPPY ND8FD EQU 1 ;LAST LOGICAL DRIVE OF 8" FLOPPY ENDIF ;============================================Q!NNNNNNNNNNNNNNNN PNNNNNNNNNNNNNNNNNNNNNNC - #SECTORS ;; IF NXTSEC <= LOWEST ;CHECK FOR REPEAT NXTSEC DL LOWEST + 1 LOWEST DL NXTSEC ENDIF ENDIF ;; ENDߜNNNNNNNNNNNNNNNN,NNNNNNNNNNNNNNNNNNNNNN---------------------------------------------------------------------- ; JP INIT1 ;COLD START ENTRY JP WARM ;RELOAD CCP/Bq^NNNNNNNNNNNNNNNNNqNNNNNNNNNNNNNNNNNNNNN! IN THE 1ST SECTOR. THESE 2 WORDS ARE ; REFERENCED BY THE BOOT LOADER CODE IN ORDER TO DETERMINE THE LOAD ADDRESS ; AND LENGTHӰ9NNNNNNNNNNNNNNNNANNNNNNNNNNNNNNNNNNNNNN BEGINNING ;---------------------------------------------------------------------------- ; ; INIT - COLD START ENTRY VNNNNNNNNNNNNNNNNN$1NNNNNNNNNNNNNNNNNNNNN!############################## ; MSGSO: DB CR,LF DB CPMSZ / (KBYTE * 10) + '0' DB (CPMSZ MOD (KBYTE * 10)) / KBYTE + '0' NNNNNNNNNNNNNNNN*NNNNNNNNNNNNNNNNNNNNN! IM 2 ; ; ENABLE INTERRUPT VECTOR 7 ; IN A,(M2_IMASK) AND A,7FH OUT (M2_IMASK),A ; ; FINALLY ENABLE VECTORED INT,'NNNNNNNNNNNNNNNNN0NNNNNNNNNNNNNNNNNNNNNNUSH HL ; LD HL,(DEFBFR + BD_SCCPS) ;FETCH CCP TRK/SECTOR LD C,L LD B,0 CALL SETSEC ; LD C,H CALL SETTRK ; LD BCINNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNŃg4Ѕj8Ӊn< ؍uCߑzG㕰L陷S 흺W$񡿢[)ŦNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN 0 CP A,STHD JR C,LGCKFD ENDIF CP A,NDHD + 1 NNNNNNNNNNNNNNNNN0ɘNNNNNNNNNNNNNNNNNNNNNN********* ; ; SET TRACK # ; ENTRY- BC= TRACK # ; ;*************************************************************************-@HNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN^NNNNNNNNρi7Ӆm< ׉r? ۍwEᑯ}J啲M虶S Y&\*ŦnNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNSNNNNNNNNNNNNNNNNNNNNNN*** ; SETTRK: LD (BTTRK),BC RET ;**************************************************************************** ; ; SdNNNNNNNNNNNNNNNNNvNNNNNNNNNNNNNNNNNNNNNN; BC= SECTOR # TO XLATE ; EXIT - HL= XLATED SECTOR OR BC + 1 ; BC= UNCHANGED ; A, DE= ? ; ;+++++++++++++++++++++++++++++cNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++ ; DISKLOG: ; ; SET DESCRIPTOR SECTOR XFER ADDRESS TO DEFAULT BUFFER ; LD HL,DEFBFR LD (IOPB + PB_DMAONNNNNNNNNNNNNNNN6NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++ ; DISKOP: ; ; SET UP IOPB ; LD HL,BTTRK LD DE,IOPB + PB_TRKO LD BC,PB_BCNTO - PB_TRKO LNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN GET USER RESPONSE ; CALL CI ;GET USER RESPONSE ; PUSH AF ;SAVE CHAR LD C,A ;ECHO CHAR CALL COC POP AF ; AND NNNNNNNNNNNNNNNNNsNNNNNNNNNNNNNNNNNNNNNN ;**************************************************************************** ; TR8: TR3740: LD DE,SDTRAN ; SETTR: LD HL,]NNNNNNNNNNNNNNNN%NNNNNNNNNNNNNNNNNNNNNN LD E,(HL) ;FETCH DPB PTR INC HL LD D,(HL) RET SUBTTL HARD DISK ROUTINES ;+++++++++++++++++++++++++++++++++++++++NNNNNNNNNNNNNNNN+NNNNNNNNNNNNNNNNNNNNN!LL XPRIM ; ; RESTORE SECTOR ; POP HL LD (IOPB + PB_SECO),HL ; ; DONE ; RET ;+++++++++++++++++++++++++++++NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNET SECTOR ; ENTRY- BC= SECTOR # ; ;**************************************************************************** ; SETSEC: CNNNNNNNNNNNNNNNNNHNNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++++++++ ; SECTRN: ; ; IF NO TRANSLATION THEN RETURN SECTOR++ ; LD A,D ;IF TABLE_NNNNNNNNNNNNNNNNCNNNNNNNNNNNNNNNNNNNNNN),HL CALL GETBNK LD (IOPB + PB_DMAXO),A ; ; SET DESCRIPTOR SECTOR SECTOR ; LD HL,ID_SECT LD (IOPB + PB_SECO),HL ; ?ONNNNNNNNNNNNNNNNVNNNNNNNNNNNNNNNNNNNNNNDIR ; DISKOP2: LD (IOPB + PB_CMDO),A ; ; FETCH DRIVER VECTOR & EXECUTE DISK DRIVER ; DKOPLP: PUSH IY ;SAVE IY LD LNNNNNNNNNNNNNNNNYNNNNNNNNNNNNNNNNNNNNN!A,5FH ;INSURE UPPER CASE ; ; IF RETRY THEN RETURN TO CALLER ; CP A,'R' ;IF RETRY THEN RETURN TO CALLER JR Z,DKOPLP ;ZrNNNNNNNNNNNNNNNNN fNNNNNNNNNNNNNNNNNNNNNN(DTPTR) LD (HL),E INC HL LD (HL),D RET ;***************************************************************************.!NNNNNNNNNNNNNNNN&̡NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++ ; ; HARD DISK DRIVER FUNCTION ; ENTRY- IY= DRIVER TABLE PTR ; EXIT - A= 0: OK; /0: ERRHyNNNNNNNNNNNNNNNN,#jNNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++++++++ ; ; EXECUTE THE IOPB PRIMITIVE ; EXIT - A= 0: OK, /0: ERROR ; ;++++++++++++7rNNNNNNNNNNNNNNNN5NNNNNNNNNNNNNNNNNNNNNN LD (BTSEC),BC RET ;**************************************************************************** ; ; SET TRANSFER ADDR QaNNNNNNNNNNNNNNNN yNNNNNNNNNNNNNNNNNNNNNN ADDR = 0 THEN NO TRANSLATION OR A,E JP Z,NOTRAN ; ; ELSE CALCULATE NEW SECTOR FROM TABLE ; EX DE,HL ADD HL,BC LDHNNNNNNNNNNNNNNNNNpNNNNNNNNNNNNNNNNNNNNNN ; SET DESCRIPTOR SECTOR TRACK ; LD L,H ;H == 0 FROM LAST OPERATION (HL= 0) LD (IOPB + PB_TRKO),HL ; ; ENABLE UPLOADSNNNNNNNNNNNNNNNNgNNNNNNNNNNNNNNNNNNNNNNIY,(DVRTPTR) ;FETCH TABLE BASE ; LD HL,DKOPRET ;PUT RETURN ADDRESS ON STACK PUSH HL ; LD HL,(DVRXADR) ;FETCH DRIVER ADDRPnNNNNNNNNNNNNNNNNhNNNNNNNNNNNNNNNNNNNNNN ; ELSE IF ABORT THEN DO WARM BOOT ; CP A,'A' ;IF ABORT THEN RE-BOOT JP Z,0 ; ; ELSE IF IGNORE THEN RETURN NO ERRORNNNNNNNNNNNNNNNN!U6NNNNNNNNNNNNNNNNNNNNN!* ; ; SET NO SECTOR TRANSLATION PROCEDURE ; EXIT - HL, DE= ? ; ;***********************************************************NNNNNNNNNNNNNNNNN'NNNNNNNNNNNNNNNNNNNNNNOR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; HDEXEC: ; ; CONVERT LOGICAL DRIVE TcNNNNNNNNNNNNNNNN-[NNNNNNNNNNNNNNNNNNNNN!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; XPRIM: ; ; SET BANK ADDRESS TO THIS BANK FOR NOW ; C$NNNNNNNNNNNNNNNN%NNNNNNNNNNNNNNNNNNNNNN ; ENTRY- BC= ADDRESS ; EXIT - A= ? ; ;**************************************************************************** ; SETDM]NNNNNNNNNNNNNNNN *NNNNNNNNNNNNNNNNNNNNNN L,(HL) ; LD H,0 RET ; ; ; CONVERT FROM CP/M'S LOGICAL SECTOR {0..N-1} TO PHYSICAL SECTOR {1..N} ; NOTRAN: LD HL, rNNNNNNNNNNNNNNNNNcNNNNNNNNNNNNNNNNNNNNNN ; LD A,L ;L= 0 LD (IOPB + PB_FLGO),A ; ; DISABLE DOWNLOAD ; LD (IOPB + PB_BCNTO),HL ; ; PASS COMMAND TO EXECUTbNNNNNNNNNNNNNNNN4NNNNNNNNNNNNNNNNNNNNNNESS PREFETCHED FROM TABLE JP (HL) ; ; DRIVER RETURNS HERE ; DKOPRET: POP IY ; ; IF NO ERRORS THEN RETURN ZF ; RNNNNNNNNNNNNNNNNN&NNNNNNNNNNNNNNNNNNNNNN ; SUB A,'I' ;IF IGNORE THEN RETURN NO ERROR RET Z ; ; ELSE RETURN ERROR TO BDOS ; FDSKER: LD HL,0 ;RETURN DPB_PTR 4BNNNNNNNNNNNNNNNN"eNNNNNNNNNNNNNNNNNNNNNN***************** ; TRNONE: LD DE,0 JR SETTR ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++^>NNNNNNNNNNNNNNNNN(NNNNNNNNNNNNNNNNNNNNN!O PHYSICAL DRIVE ; LD A,(IY + DVRPDRV) ;0,1: DRV 0, 2,3: DRV 1 LD (IOPB + PB_DRVO),A ; ; OFFSET LOGICAL ADDRESS WITH LONNNNNNNNNNNNNNNN.ENNNNNNNNNNNNNNNNNNNNN!ALL GETBNK LD E,A ;PRESET IOPB BANK LD (IOPB + PB_DMAXO),A ; ; EXECUTE THE PRIMITIVE IN ROM ; LD HL,IOPB ;BANKED CO܊NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!A: LD (BTDMA),BC CALL GETBNK ;FETCH BANK ADDRESS FROM MONITOR LD (BTDMAX),A RET ;+++++++++++++++++++++++++++++++++++NNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN1 ADD HL,BC RET SUBTTL DISK SUPPORT ROUTINES ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++NNNNNNNNNNNNNNNNNPNNNNNNNNNNNNNNNNNNNNNNOR ; LD A,PB_LOGC JR DISKOP2 ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; COMMOBNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNET Z ;IF NO_ERROR THEN RETURN ; ; PRINT ERROR ; CALL GETBNK ;SETUP BANK FOR FUTURE COMPATABILITY LD E,A LD HL,IOPBsNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN= 0 FOR SELECT FUNCTION LD A,-1 ;RETURN -1 TO BDOS OR A,A RET ;*****************************************************RNNNNNNNNNNNNNNNN#3TNNNNNNNNNNNNNNNNNNNNNN+++ ; ; RETURN DRIVE PARAMETER BLOCK ADDR FUNCTION ; EXIT - DE= DPB PTR ; HL= ? ; ;++++++++++++++++++++++++++++++++++++++*NNNNNNNNNNNNNNNNN)ܟNNNNNNNNNNNNNNNNNNNNN!GICAL DRIVE ; LD A,(BTDRV) ;IF EVEN THEN ADD 0 ELSE ADD 128 RRCA AND A,80H LD E,A ;COMPUTE SECTOR LD D,0 LD HL,(I;NNNNNNNNNNNNNNNNN/v9NNNNNNNNNNNNNNNNNNNNNNMPATABILITY LD DE,(THIS_BNK) LD A,MF_XIOB ;SET MONITOR FUNCTION # CALL XMROM ;EXECUTE THE FUNCTION ; OR A,A ;FUNCTION2.NNNNNNNNNNNNNNNNGNNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++ ; ; SECTOR TRANSLATION FUNCTION ; ENTRY- DE= 0: NO XLATE, ELSE PTR TO XLATE TABLE /NNNNNNNNNNNNNNNN %NNNNNNNNNNNNNNNNNNNNNN+++++ ; ; LOGON DISK FUNCTION ; EXIT - A= 0: OK; /0: ERROR ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN DISK I/O CODE ; ENTRY- A= IOPB COMMAND ; EXIT - A= 0: OK; /0: ERROR ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++QNNNNNNNNNNNNNNNNN;NNNNNNNNNNNNNNNNNNNNNN LD A,MF_DIOB ;USE DISPLAY IOPB DATA FUNCTION CALL XMROM ; ; QUERY USER FOR OPTION ; LD HL,DSKEB CALL EDITOR ; ; uCyNNNNNNNNNNNNNNNN@NNNNNNNNNNNNNNNNNNNNNN*********************** ; ; SET 3740 SECTOR TRANSLATION PROCEDURE ; ENTRY- (DTPTR)= MUST BE PTR TO DTP ; EXIT - DE, HL= ? ;'NNNNNNNNNNNNNNNNN$NNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++ ; DPBAD: LD HL,(DTPTR) ;FETCH BASE ADDR LD DE,10 ;ADD OFFSET OF DPB PTR ADD HL,DE gZNNNNNNNNNNNNNNNN*NNNNNNNNNNNNNNNNNNNNNNOPB + PB_SECO) ; PUSH HL ;SAVE SECTOR TO RESTORE LATER ; ADD HL,DE LD (IOPB + PB_SECO),HL ; ; EXECUTE IOPB ; CANNNNNNNNNNNNNNNNN0etNNNNNNNNNNNNNNNNNNNNNN ERR? RET NZ ; ; RETURN THE COMMAND RESULTS STATUS ; LD A,(IOPB + PB_STATO) OR A,A RET SUBTTL JADE FLOPPY DRIyNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNnNNNŃh5хk9ԉo= ؍tBߑzG㕰~K癵Q띸U"X'¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNdNNNNNNNNNNNNNNNNNNNNN!VER ROUTINES ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; JADE 8" FLOPPY DISK DRIVER FUNARHNNNNNNNNNNNNNNNNNFNNNNNNNNNNNNNNNNNNNNNNTO SECTOR BIT 15 LD (IOPB + PB_SECO +1),A ; LD (IOPB + PB_TRKO),HL ;STORE SHIFTED TRACK ; ; EXECUTE THE IOPB ; CALL rNNNNNNNNNNNNNNNN !NNNNNNNNNNNNNNNNNNNNNNADD A,A ADD A,L LD L,A LD A,0 ADC A,H LD H,A ; ; EXECUTE TABLE ADDRESS ; LD A,(HL) INC HL LD H,(HL) LD L,lNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; RETVERS: LD HL,VERSN XOR A,A ;RETURN N NNNNNNNNNNNNNNNN:NNNNNNNNNNNNNNNNNNNNNN DE,DVRSIZ ; RETDVL: ADD HL,DE DJNZ RETDVL ; ; RETURN NO ERROR ; XOR A,A RET ;++++++++++++++++++++++++++++++++rHNNNNNNNNNNNNNNNNNDNNNNNNNNNNNNNNNNNNNNNN+++++++++ ; ; GET BANK NUMBER FUNCTION ; EXIT - A= BANK # ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++dcNNNNNNNNNNNNNNNN%NNNNNNNNNNNNNNNNNNNNNNL FUNCTIONS TO SUPPORT CDOS PROGRAMS ;*************************************************************************** ; ; SYSTEM @BNNNNNNNNNNNNNNNN+NNNNNNNNNNNNNNNNNNNNNNA,8DH ;IF RETURN VERSION THEN RETURN IT JR Z,RETCVER ; CP A,90H ;IF NOT CLOCK THEN ERR JR C,ILLEGC ; JR Z,CLKCAL ;IF~BNNNNNNNNNNNNNNNN1NNNNNNNNNNNNNNNNNNNNNNCTION ; ENTRY- IY= DRIVER TABLE PTR ; EXIT - A= 0: OK; /0: ERROR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++$NNNNNNNNNNNNNNNNNxNNNNNNNNNNNNNNNNNNNNNNXPRIM ; ; RESTORE THE MODIFIED IOPB SO RETRY WILL WORK ; POP HL ;TRACK LD (IOPB + PB_TRKO),HL ; LD HL,IOPB + PB_SEǫNNNNNNNNNNNNNNNNNtNNNNNNNNNNNNNNNNNNNNNNA ; EX (SP),HL ;PUT CALLER'S DATA IN HL, FUNCTION ADDR ON RET ; STACK, EXECUTE FUNCTION ADDRESS ON STACK ;#########I1NNNNNNNNNNNNNNNNfNNNNNNNNNNNNNNNNNNNNNNO ERROR RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN DRIVER TABLE PTR lNNNNNNNNNNNNNNNNiNNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++++++ ; ; EXECUTE IOPB FUNCTION ; ENTRY- IX= IOPB PTR ; EXIT - A= 0: OK ; ;++++++++οNNNNNNNNNNNNNNNNN Q7NNNNNNNNNNNNNNNNNNNNNN++++++++++++++ ; GETBNK: LD A,MF_GBNK JP MR_FUN SUBTTL NON-DISK PROCEDURES ;**************************************>NNNNNNNNNNNNNNNNN&NNNNNNNNNNNNNNNNNNNNNNCALL INTERCEPT ROUTINE CHECKS FOR ILLEGAL BDOS CALLS & ; PRINTS MESSAGE IF ILLEGAL. ALSO IMPLEMENTS CDOS CLOCK/CALENDAR ; SY>NNNNNNNNNNNNNNNN,ZNNNNNNNNNNNNNNNNNNNNNN CALENDAR THEN GET IT ; CP A,92H JR Z,CLKTIM ;IF TIME THEN GET IT ; ; ILLEGAL SYSTEM CALL ; ILLEGC: PUSH BC ;SAVE FUNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!++++++++++++++++++++ ; FD8EXEC: ; ; CONVERT LOGICAL DRIVE TO PHYSICAL DRIVE ; LD A,(IY + DVRPDRV) LD (IOPB + PB_DRVO)NNNNNNNNNNNNNNNNNN INNNNNNNNNNNNNNNNNNNNNNCO +1 ;CLEAR BIT 15 RES 7,(HL) ; ; DONE ; RET SUBTTL BIOS FUNCTION CALLS ;++++++++++++++++++++++++++++++++++++++HNNNNNNNNNNNNNNNNNGNNNNNNNNNNNNNNNNNNNNN!################################################################### ; ; BIOS FUNCTION TABLE ; ;#############################jNNNNNNNNNNNNNNNNWNNNNNNNNNNNNNNNNNNNNNNFUNCTION ; ENTRY- C= DRIVE # (E FOR FUNCTION CALL) ; EXIT - HL= DRIVER TABLE BASE PTR ; A, C= 0 ; ;+++++++++++++++++++++++NNNNNNNNNNNNNNNNNNXNNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; EXIOPB: ; ; SET UP FOR CALL ; CALL GETBNK ;E= IBNNNNNNNNNNNNNNNN!bNNNNNNNNNNNNNNNNNNNNNN************************************** ; ; OUTPUT HEX DATA TO CONSOLE SUBR ; ENTRY- A= DATA ; EXIT - A, C= ? ; ;**********yBNNNNNNNNNNNNNNNN'ȠNNNNNNNNNNNNNNNNNNNNNNSTEM CALLS FOR ASMB. ; ;*************************************************************************** INTCPT: LD A,C ;CHECK CAHNNNNNNNNNNNNNNNN-'kNNNNNNNNNNNNNNNNNNNNN!CTION # ; ; OUTPUT WARNING MESSAGE ; LD HL,ISCMSG ;OUTPUT WARNING CALL EDITOR ; ; OUTPUT FUNCTION # ; POP HL LNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN,A ; ; IF HEADS == 1 THEN EXECUTE IOPB ; LD A,(IY + DVRHDS) DEC A JP Z,XPRIM ; ; ELSE SELECT SIDE FROM TRACK BIT NNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++ ; ; FUNCTION DISPATCHER ; EXIT - A= -1: ERROR, 0: OK ; ;++++++++++++++++++++++++++++NNNNNNNNNNNNNNNNNTNNNNNNNNNNNNNNNNNNNNNN############################################### ; BFUNTBL: DW RETVERS ;0:RETURN VERSION # DW RETDVRTF ;1:RETURN DISK PHYSM=NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; BIOS CALL ENTRY (E= DRIVE #) ; RETDVRTF: LD C,E ; RETDVRT: BNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!OPB PTR IS IN THIS BANK LD E,A PUSH IX ;MAKE HL = IX FOR NOW POP HL ; LD A,MF_XIOB ;MONITOR FUNCTION # (DISK FUNCTION)#NNNNNNNNNNNNNNNN"7UNNNNNNNNNNNNNNNNNNNNN!****************************************************************** ; PRHEX: LD C,A LD A,MF_PHXB JP XMROM ;*********NNNNNNNNNNNNNNNNN(؞NNNNNNNNNNNNNNNNNNNNNNLL VALIDITY CP A,41 ;IF <= 40 THEN OK ; BDOSV EQU $ + 1 JP C,BDOS + 11H ;THIS ADDR MODIFIED BY WARM BOOT RTN ; ; THE FONNNNNNNNNNNNNNNNN.r8NNNNNNNNNNNNNNNNNNNNN!D A,L CALL PRHEX ; ; OUTPUT NEW LINE ; CALL CRLF ; ; RETURN NULLS ; XOR A,A ;BC = HL = A = 0 LD L,A LD H,A G>NNNNNNNNNNNNNNNNN$NNNNNNNNNNNNNNNNNNNNNN0 ; LD HL,(IOPB + PB_TRKO) PUSH HL ;SAVE FOR ERROR RESTORE ; LD A,(IOPB + PB_SECO +1) ;FETCH SIDE SELECT BYTE ADD A,JgNNNNNNNNNNNNNNNNN +NNNNNNNNNNNNNNNNNNNNN!++++++++++++++++++++++++++++++++++++++++++++++++ ; BIOFUNC: ; ; IF FUNCTION # NOT IN TABLE THEN RETURN -1 ; LD A,C CPBbNNNNNNNNNNNNNNNNNgNNNNNNNNNNNNNNNNNNNNN!ICAL CONFIGURATION TABLE PTR DW EXIOPB ;2:EXECUTE THE IOPB MAXFUNCS EQU ($ - BFUNTBL) / 2 ;++++++++++++++++++++++++++++RNNNNNNNNNNNNNNNN5NNNNNNNNNNNNNNNNNNNNNN LD HL,DVR0 ;START AT 1ST TABLE ; ; IF DRIVE == 0 THEN ALREADY THERE ; LD A,C OR A,A RET Z ; ; ELSE IF ILLEGAL DvNNNNNNNNNNNNNNNN"NNNNNNNNNNNNNNNNNNNNNN CALL XMROM ;EXECUTE MONITOR FUNCTION ; OR A,A ;FUNCTION ERROR? RET NZ ; ; FETCH & RETURN RESULT STATUS ; LD A,(nNNNNNNNNNNNNNNNN#dNNNNNNNNNNNNNNNNNNNNNN****************************************************************** ; ; NEWLINE PROCEDURE ; ;********************************֫HNNNNNNNNNNNNNNNNN)NNNNNNNNNNNNNNNNNNNNNNOLLOWING CONDITIONAL JUMP IS MODIFIED TO AN UNCONDITIONAL JUMP BY ; THE WARM BOOT ROUTINE IF THE CLOCK/CALENDAR BOARD IS NOT P 4dNNNNNNNNNNNNNNNNN/A NNNNNNNNNNNNNNNNNNNNNN LD C,A LD B,A RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; CDOS RETURN VERh rNNNNNNNNNNNNNNNNwNNNNNNNNNNNNNNNNNNNNNNA ;SHIFT OUT BIT 7 ; SRL H ;SHIFT TRACK HIGH BYTE RR L ;ROTATE BIT 8 TO 7 AND 0 TO CF RRA ;ROTATE TRACK BIT 0 INNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN A,MAXFUNCS LD A,-1 RET NC ; ; ELSE COMPUTE TABLE ENTRY ; PUSH HL ;SAVE POSSIBLE DATA ; LD HL,BFUNTBL LD A,C R+NNNNNNNNNNNNNNNN2NNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN BIOS VERSION # ; EXIT - HL= VERSION # IN BINARY {0.00,..655.35} K< NNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNRIVE THEN RETURN ERROR ; CP A,NDRVS JR C,RETDV2 ; OR A,A RET ; ; ; ELSE COMPUTE TABLE PTR ; RETDV2: LD B,C LDNNNNNNNNNNNNNNNNwNNNNNNNNNNNNNNNNNNNNNNIX + PB_STATO) OR A,A ;TEST RESULT FOR RETURN RET ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++lHNNNNNNNNNNNNNNNNN$NNNNNNNNNNNNNNNNNNNNNN******************************************* ; CRLF: LD C,CR CALL COC LD C,LF JP COC IF INTCPTS SUBTTL ADDITIONA?!NNNNNNNNNNNNNNNN*NNNNNNNNNNNNNNNNNNNNN!RESENT ; IF NOT MODIFIED, THEN IT IS ALLWAYS FALSE (NOP). ; INHCLK: JR C,ILLEGC ; ; NOW CHECK FOR EXTENDED CALLS ; CP cNNNNNNNNNNNNNNNNN0RDNNNNNNNNNNNNNNNNNNNNNNSION FUNCTION ; MAKES CLOCK/CALENDAR WORK. ; EXIT - B= 1 ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++7NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN^NNNNNNNNρi6҅m< ؉sAݍ{I䑲L畴P홼Y&ž_-Ȣc1̦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN%dNNNNNNNNNNNNNNNNNNNNNN+++++++++++++ ; RETCVER: LD B,1 RET SUBTTL CLOCK ROUTINES ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN ENTRY- A= FUNCTION # ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; XMROM: ; ; SWITNNNNNNNNNNNNNNNNN ` NNNNNNNNNNNNNNNNNNNNN!++++++++++++++++++++++++++++++++++++++++++++++++ ; CNSCK: LD A,MF_CIS JR XMROM ;*************************************9NNNNNNNNNNNNNNNN@uNNNNNNNNNNNNNNNNNNNNNN******************************************************** ; PUNCH: RET ;**************************************************hNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN***************************************************************** ; EDITOR: CALL GETBNK LD E,A LD A,MF_PUTS JR XMROM &$NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNLL MR_FUN POP AF ; ; IF OPTION IS CTRL-C THEN WARM BOOT ; CP A,3 ;IF CTRL-C THEN WARM BOOT JP Z,PAGE0 ; ; IF OPTjNNNNNNNNNNNNNNNN%FNNNNNNNNNNNNNNNNNNNNNN ; ; UNSUPPORTED INTERRUPT ; ;---------------------------------------------------------------------------- ; ILLINT: PUSHWyNNNNNNNNNNNNNNNN+INNNNNNNNNNNNNNNNNNNNN! ;############################################################################ ; ; DISK DRIVER TABLES ; ;##############qNNNNNNNNNNNNNNNNp7NNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++ ; ; RETURN CALENDAR FUNCTION 90H ; EXIT - A= DAY ; B= MONTH ; C= YEAR ; L= DAY OF WEEK ; ;++++++++8HNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNCH TO LOCAL (LARGER) STACK ; LD (SPSAV),SP LD SP,LSTACK ; ; EXECUTE THE FUNCTION ; CALL MR_FUN ;EXECUTE MONITOR FUNoNNNNNNNNNNNNNNNN5ZNNNNNNNNNNNNNNNNNNNNNN*************************************** ; ; CONSOLE OUTPUT ; ENTRY- C= CHAR TO OUTPUT ; ;**********************************NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN************************** ; ; PRINTER DRIVER ; ENTRY- C= CHAR TO OUTPUT ; ;***********************************************rNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN! IF INTRPTS SUBTTL INTERRUPTS ;---------------------------------------------------------------------------- ; ; USER INTENNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNION IS YES THEN WARM BOOT ; AND A,5FH ;IGNORE CASE ; CP A,'Y' JP Z,PAGE0 ; ; IF OPTION IS INTERRUPT THEN EXECUTE RE{NNNNNNNNNNNNNNNNNN&NNNNNNNNNNNNNNNNNNNNNN AF ;SAVE ALL 8080 REGS PUSH HL PUSH BC PUSH DE LD HL,ILLIM ;NOTIFY USER OF INT JR IQCONT SUBTTL INITIALIZED DANNNNNNNNNNNNNNNN,UNNNNNNNNNNNNNNNNNNNNNN############################################################## ; STRUCT 0 DVRADD DS 2 ;START ADDRESS OF DISK DRIVER DVRFG DgdNNNNNNNNNNNNNNNNCNNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; CLKCAL: LD A,MF_GCAL JR XMROM ;+++++++++++++++NNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNCTION ; ; RESTORE THE STACK ; LD SP,(SPSAV) RET SUBTTL CHAR I/O ROUTINES ;++++++++++++++++++++++++++++++++++++++NNNNNNNNNNNNNNNNNkNNNNNNNNNNNNNNNNNNNNN!****************************************** ; COC: LD A,MF_CO JR XMROM ;++++++++++++++++++++++++++++++++++++++++++++++NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN***************************** ; LO: LD A,MF_LO JR XMROM ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNERRUPT ; ;---------------------------------------------------------------------------- ; ITRAP: ; ; SAVE REGS FIRST ; {BNNNNNNNNNNNNNNNN!#NNNNNNNNNNNNNNNNNNNNN!START 7 ; CP A,'I' JR NZ,ITRAP1 ; POP DE POP BC ;RESTORE REGS 1ST POP HL POP AF JP 0038H ; ; ; IF OPTION INNNNNNNNNNNNNNNNNN'$NNNNNNNNNNNNNNNNNNNNNNTA ;############################################################################ ; ; 3740 SECTOR TRANSLATION TABLE ; **** CP$\NNNNNNNNNNNNNNNN-fNNNNNNNNNNNNNNNNNNNNN!S 1 ;FLAGS (BIT 0= 1: INHIBIT LOGON) DVRPDRV DS 1 ;PHYSICAL DRIVE ;DVRLDRV DS 1 ;LOGICAL DRIVE {0..N-1} ; ; THE FOLLOWING NNNNNNNNNNNNNNNNڑNNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN TIME FUNCTION 92H ; EXIT - A= SECONDS ; B= MINUTESFNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++ ; ; CONSOLE INPUT ; EXIT - A= CHAR ; ;++++++++++++++++++++++++++++++++++++++++++++++rNNNNNNNNNNNNNNNNN&NNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++ ; ; READER DRIVER - DUMMY ; EXIT - A= CTRL-Z ; ;++++++++++++++++++++++++++++++++++++++++++++`HrNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!++++++++++++++++ ; ; RETURN LIST DEVICE STATUS ; EXIT - A= 0: BUSY, FFH:READY ; ;++++++++++++++++++++++++++++++++++++++++++'NNNNNNNNNNNNNNNNNPKNNNNNNNNNNNNNNNNNNNNNN PUSH AF PUSH HL PUSH BC PUSH DE ; ; SAVE CURRENT ROM & GET MONITOR ROM ; IN A,(M2_RSEL) LD (ROMSAV),A LD A,MR_srNNNNNNNNNNNNNNNN"vNNNNNNNNNNNNNNNNNNNNNNS MONITOR THEN EXECUTE MONITOR BREAKPOINT ; ITRAP1: CP A,'M' JR NZ,ITRAPR ; POP DE POP BC POP HL POP AF JP 0008H jh$NNNNNNNNNNNNNNNNN(NNNNNNNNNNNNNNNNNNNNNN/M SINGLE DENSITY **** ; ;############################################################################ ; SDTRAN: GXLATE 26,6NNNNNNNNNNNNNNNN.3NNNNNNNNNNNNNNNNNNNNN!MAY BE BROUGHT OFF DISK DESCRIPTOR OR FROM DEFAULT TABLES ; DVRFLG DS 1 ;DISK FLAGS DVR0SPT DS 1 ;TRK 0 SECTORS PER TRK DVR0®NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN! ; C= HOURS ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; CLKTIM: LD A,MF_GTIM JR HNNNNNNNNNNNNNNNNN ʯNNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++ ; CI: LD A,MF_CI JR XMROM ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ NNNNNNNNNNNNNNNNN&NNNNNNNNNNNNNNNNNNNNN!++++++++++++++++++++++++++++++++ ; READER: LD A,CTRLZ ;FAKE EOF ; ; FALL INTO PUNCH RETURN ; ;*********************\NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!++++++++++++++++++++++++++++++++++ ; LISTST: LD A,MF_LOS JR XMROM ;**************************************************dNNNNNNNNNNNNNNNNczNNNNNNNNNNNNNNNNNNNNNNRNUM OUT (M2_RSEL),A ; ; PRINT PROMPT ; LD HL,ITMSG IQCONT: LD A,MF_PUTS CALL MR_FUN ; LD HL,IQMSG ;QUERY USER !%yNNNNNNNNNNNNNNNN#ENNNNNNNNNNNNNNNNNNNNNN ; ; ; ELSE RESTORE REGS & RETURN ; ITRAPR: LD A,(ROMSAV) ;RESTORE ROM # OUT (M2_RSEL),A ; POP DE POP BC POP HLNNNNNNNNNNNNNNNNN)+NNNNNNNNNNNNNNNNNNNNNN ;############################################################################ ; ; COMMON I/O PARAMETER BLOCK ; ;######2NNNNNNNNNNNNNNNNN/NNNNNNNNNNNNNNNNNNNNNNSZ DS 1 ;TRK 0 SECTOR SIZE DVR1SPT DS 1 DVR1SZ DS 1 DVRDSPT DS 1 DVRDSZ DS 1 DVRDTYP DS 1 ;RESERVED FOR DISK TYPE DVRCYLS 9NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNXMROM ENDIF ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; MONITOR ROM EXECUTER ;NNNNNNNNNNNNNNNN S8NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++ ; ; RETURN CONSOLE STATUS ; EXIT - A= 0: NOT READY ; FFH: CHAR READY ; ;++++++++++++++++++++++++++++;YBNNNNNNNNNNNNNNNNsDNNNNNNNNNNNNNNNNNNNNN!******************************************************* ; ; PUNCH DRIVER ; ENTRY- C= CHAR TO OUTPUT ; ;********************NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!************************** ; ; MESSAGE EDITOR ; ENTRY- HL= TEXT PTR (BIT 7= 1: TERMINATOR) ; EXIT - REGS= ? ; ;***********BNNNNNNNNNNNNNNNN6)NNNNNNNNNNNNNNNNNNNNNN LD A,MF_PUTS CALL MR_FUN ; ; GET & ECHO USER INPUT ; LD A,MF_CI CALL MR_FUN ; PUSH AF LD C,A LD A,MF_CO CAB HNNNNNNNNNNNNNNNNN$wNNNNNNNNNNNNNNNNNNNNNN POP AF EI ;RE-ENABLE INTERRUPTS RET ;---------------------------------------------------------------------------- BNNNNNNNNNNNNNNNN*xNNNNNNNNNNNNNNNNNNNNNN###################################################################### ; IOPB: REPT PB_SIZE LIST OFF DB 0 LIST ON ENDMQHNNNNNNNNNNNNNNNNN0NNNNNNNNNNNNNNNNNNNNNNDS 2 ;DISK CYLINDERS DVRHDS DS 1 ;HEADS ; ; DEFINE THE STRUCTURE SIZE ; DVRSIZ DS 0 ENDM ;@@@@@@@@@@@@@@@@@@@@@@@@ NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN NNNNŃh6҅m;։q? ۍwDߑ{H㕰~L癵Q띸U"𡽢X'¦^NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNTNNNNNNNNNNNNNNNNNNNNNN@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; MACRO TO DEFINE THE DRIVER TABLE RECORD ; ENTRY- #DADD= DRIVER ADDRE&HNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN LIST OFF ENDM IF BOOT = 10H DVR0: ;A ALLDRV HDEXEC,4,60H,32,1,32,1,32,1,10H,256,4 DVR1: ;B ALLDRV HDEXEC,4,60H,3@NNNNNNNNNNNNNNNN W9NNNNNNNNNNNNNNNNNNNNNN################################################################## ; ; DEFAULT 8" FLOPPY DISK PARAMETER BLOCK ; IBM 3740 SING!NNNNNNNNNNNNNNNNNNwENNNNNNNNNNNNNNNNNNNNNN############################################# ; ; DEFAULT 8" HARD DISK PARAMETER BLOCK ; ;##################################[NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN DB 4 ;HEADS ;############################################################################ ; ; MODE 2 INTERRUPT VECTOR Tv HNNNNNNNNNNNNNNNNN2(NNNNNNNNNNNNNNNNNNNNN!DIF IF INTRPTS ITMSG DM CR,LF,'User' ILLIM DM CR,LF,'Ill.' IQMSG DM ' Int. Abort? (Y/N/I/M) - ' ENDIF ;#########=INNNNNNNNNNNNNNNN%vNNNNNNNNNNNNNNNNNNNNNNRIVE PARAMETER BLK PTR IF ((DD - 1) <= NDHD) AND ((DD - 1) >= STHD) DW 0 ;;NO CHECKS ON HARD DISK ELSE DW D#D(DD)CHBNNNNNNNNNNNNNNNN+yNNNNNNNNNNNNNNNNNNNNN!# BTFLG DS 1 ;RESERVED FOR FLAGS BTDMA DS 2 ;DMA ADDRESS BTDMAX DS 1 ;DMA EXTENDED ADDRESS ;############################^BNNNNNNNNNNNNNNNNGNNNNNNNNNNNNNNNNNNNNN!SS ; #PD= PHYSICAL DRIVE # ; #FG= DRIVE FLAGS (IDFLGO) ; #S0= TRK 0 SPT ; #Z0= TRK 0 SIZE ; #S1= TRK 1 SPT ; #Z1= TR!HNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!2,1,32,1,32,1,10H,256,4 DVR2: ;C ALLDRV HDEXEC,5,60H,32,1,32,1,32,1,10H,256,4 DVR3: ;D ALLDRV HDEXEC,5,60H,32,1,32,1,32,1,NNNNNNNNNNNNNNNNjNNNNNNNNNNNNNNNNNNNNNNLE DENSITY FORMAT ; ;############################################################################ ; SD8PBK: DW 26 ;SECTORS NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!########################################## ; HDPBK: DW 128 ;SECTORS PER TRACK (LOGICAL) (SPT) DB 5 ;BLOCK SHIFT FACTOR (BNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNABLE ; ;############################################################################ ; ; START ON AN EVEN PAGE BOUNDARY ;MrNNNNNNNNNNNNNNNNN 'NNNNNNNNNNNNNNNNNNNNN!################################################################### ; ; DRIVE PARAMETER HEADER AREA ; 1 PER DRIVE ; ;######!*NNNNNNNNNNNNNNNNN&%NNNNNNNNNNNNNNNNNNNNNNK ;;DRIVE DISK CHECKSUMS ARRAY PTR ENDIF DW D#D(DD)ALL ;;DRIVE CLUSTER ALLOCATION BIT MAP PTR LIST OFF ENDM ; ; DENNNNNNNNNNNNNNNN,bNNNNNNNNNNNNNNNNNNNNNN################################################ ; ; VARIABLES ; ;########################################################NNNNNNNNNNNNNNNNt6NNNNNNNNNNNNNNNNNNNNNNK 1 SIZE ; #SD= DATA TRKS SPT ; #ZD= DATA TRKS SIZE ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.NNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN10H,256,4 DVR4: ;E ALLDRV FD8EXEC,0,0,26,0,26,0,26,0,0,77,1 DVR5: ;F ALLDRV FD8EXEC,1,0,26,0,26,0,26,0,0,77,1 ENDIF HNNNNNNNNNNNNNNNNN1[NNNNNNNNNNNNNNNNNNNNNNPER TRACK DB 3 ;BLOCK SHIFT FACTOR DB 7 ;BLOCK MASK DB 0 ;NULL MASK DW 242 ;DISK SIZE -1 DW 63 ;DIRECTORY MAX DHrNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNSH) DB 31 ;BLOCK MASK (BLM) DB 1 ;NULL MASK (EXM) DW 1015 ;DISK SIZE (CLUSTERS -1) (DSM) DW 1152 / 2 ;DIRECTORY MNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN IF $ AND 0FFH DS 100H - ($ AND 0FFH) ENDIF INTABL: REPT 7 ;1ST 7 ARE UNSUPPORTED LIST OFF DW ILLINT LIST ON E#VNNNNNNNNNNNNNNNN!NNNNNNNNNNNNNNNNNNNNNN###################################################################### ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@NNNNNNNNNNNNNNNN'NNNNNNNNNNNNNNNNNNNNNNFINE THE DATA ; DD DL 1 REPT NDRVS LIST OFF ALLDPH 0123456789ABCDEF DD DL DD + 1 LIST ON ENDM ; ; LAST OF INIkHNNNNNNNNNNNNNNNN-QNNNNNNNNNNNNNNNNNNNNNN#################### ; DTPTR: DS 2 ;DRIVE TABLE PTR LOGRQ: DS 1 ;LOG ON REQUEST REG. DVRTPTR DS 2 ;DRIVE DRIVER TABLE BASE A:NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!@@@@@@@@@ ; ALLDRV MACRO #DADD,#PD,#FG,#S0,#Z0,#S1,#Z1,#SD,#ZD,#DT,#CY,#HD LIST ON DW #DADD ;DRIVER EXECUTION ADDR DB 0vNNNNNNNNNNNNNNNN ήNNNNNNNNNNNNNNNNNNNNNN IF BOOT = 3 DVR0: ;A ALLDRV FD8EXEC,0,0,26,0,26,0,26,0,0,77,1 DVR1: ;B ALLDRV FD8EXEC,1,0,26,0,26,0,26,0,0,77,1 DVR2: ;VNNNNNNNNNNNNNNNNN"NNNNNNNNNNNNNNNNNNNNNNB 11000000B ;ALLOC 0 DB 0 ;ALLOC 1 DW 16 ;CHECK SIZE DW 2 ;TRACK OFFSET DB 0 ;PHYSICAL RECORD SHIFT FACTOR DB 0 ;;9NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!AX (DRM) DB 0FFH ;ALLOCATION 0 (AL0) DB 10000000B ;ALLOCATION 1 (AL1) DW 0 ;CHECK SIZE (CKS) DW 2 ;TRACK OFFS+NNNNNNNNNNNNNNNNNg{NNNNNNNNNNNNNNNNNNNNN!NDM ; DW ITRAP ;INT 8 IS USER INTERRUPT ENDIF ;#####################################################################9NNNNNNNNNNNNNNNN"ANNNNNNNNNNNNNNNNNNNNNN@@@@@@@@@@@@@@@@@@@@@@@@ ; ; GENERATE A DISK PARAMETER TABLE MACRO ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\NNNNNNNNNNNNNNNNN(*NNNNNNNNNNNNNNNNNNNNNNTIALIZED CODE READ FROM DISK ; BIOSND EQU $ SUBTTL UNINITIALIZED DATA AREA ;#############################################BNNNNNNNNNNNNNNNN.NNNNNNNNNNNNNNNNNNNNN!DDRESS PTR DVRXADR DS 2 ;DRIVE DRIVER EXECUTION ADDRESS SECOFF DS 2 ;LOGICAL DRIVE SECTOR OFFSET (ADD TO SECTOR) ; ROMSAV EQ&NNNNNNNNNNNNNNNNNސNNNNNNNNNNNNNNNNNNNNNN ;LOGON INHIBIT FLAG (LOGON ENABLED) DB #PD ;MONITOR PHYSICAL DRIVE # DB #FG ;DISK FLAGS DB #S0,#Z0 ;T0 SECTORS, SIZE HNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNC ALLDRV HDEXEC,4,60H,32,1,32,1,32,1,10H,256,4 DVR3: ;D ALLDRV HDEXEC,4,60H,32,1,32,1,32,1,10H,256,4 DVR4: ;E ALLDRV HDE2NNNNNNNNNNNNNNNNN'NNNNNNNNNNNNNNNNNNNNNNPHYSICAL RECORD MASK DW 0 ;LOGICAL DRIVE SECTOR OFFSET ; ; DEFAULT DISK PHYSICAL PARAMETERS ; DB 0 ;FLAGS DB 26,0,2;NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNET (OFF) DB 1 ;PHYSICAL RECORD SHIFT FACTOR (PSH) DB 1 ;PHYSICAL RECORD MASK (PRM) DW 0 ;LOGICAL DRIVE SECTOR OFFSET*NNNNNNNNNNNNNNNNTJNNNNNNNNNNNNNNNNNNNNN!####### ; ; MESSAGES ; ;############################################################################ ; MSGLE: DM CR,LF,'/NNNNNNNNNNNNNNNN#rNNNNNNNNNNNNNNNNNNNNNN@@@@@@@@@@@@@@@@@@@@@@ ; ALLDPH: MACRO #D LIST ON D#D(DD)DPH: ;DRIVE PARAMETER HEADER FOR DRIVE #D(DD) DW 0 ;;SECTOR THNNNNNNNNNNNNNNNNN)NNNNNNNNNNNNNNNNNNNNNN############################### ; ; THE FOLLOWING DATA MUST RESIDE IN THIS ORDER TO MATCH THE IOPB DATA ; ;###############\dNNNNNNNNNNNNNNNNN/7NNNNNNNNNNNNNNNNNNNNNNU 0048H ;DS 1 ;ROM SWAP SAVE OF ORIGINAL ROM SPSAV DS 2 ;USER SP SAVE WHILE USING LOCAL STACK DS 64 ;LOCAL STACK (32 ENTRIES)ErNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN DB #S1,#Z1 ;T1 SECTORS, SIZE DB #SD,#ZD ;DATA TRKS SECTORS, SIZE DB #DT ;DISK TYPE DW #CY ;CYLS DB #HD ;HEADS ; NNNNNNNNNNNNNNNN dNNNNNNNNNNNNNNNNNNNNNNXEC,5,60H,32,1,32,1,32,1,10H,256,4 DVR5: ;F ALLDRV HDEXEC,5,60H,32,1,32,1,32,1,10H,256,4 ENDIF LIST ON ;##########oNNNNNNNNNNNNNNNNDtNNNNNNNNNNNNNNNNNNNNN!6,0,26,0 ;SECTORS PER TRACK, SECTOR SIZE (128) DB 0 ;TYPE DW 77 ;CYLS DB 1 ;HEADS ;###############################IyNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN (SOF) ; ; ; DB 01100000B ;FLAGS 256 BPS, HARD, SSSD DB 32,1,32,1,32,1 ;32 SPT, 256 BPS DB 10H ;TYPE DW 256 ;CYLS 'BNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNLOAD ERROR' ; DSKEB: DM CR,LF,'Abort, Ignore, Retry, (BDOS) - ' ; IF INTCPTS ISCMSG: DM CR,LF,'ILL SYS CALL, #= ' EN:gNNNNNNNNNNNNNNNNN$GNNNNNNNNNNNNNNNNNNNNNNRAN TBL (OR 0 IF NO XLATE) DW 0 ;;SCRATCH AREA DW 0 ;;" DW 0 ;;" DW DIRBF ;;DIRECTORY BUFFER PTR DW D#D(DD)DPB ;;D?NNNNNNNNNNNNNNNN*HNNNNNNNNNNNNNNNNNNNNNN############################################################# ; BTDRV: DS 1 ;DRIVE # BTTRK DS 2 ;TRACK # BTSEC DS 2 ;SECTOR FNNNNNNNNNNNNNNNNN0$NNNNNNNNNNNNNNNNNNNNNN LSTACK EQU $ ;############################################################################ ; ; DRIVE ALLOCATION AREASRHNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNρi6ԅo= ىvD|J瑵OꕷT"Z'ž_-Ǣc2ΦNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN cNNNNNNNNNNNNNNNNNNNNN! ; ;############################################################################ ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@$NNNNNNNNNNNNNNNNN wNNNNNNNNNNNNNNNNNNNNNNL DD + 1 LIST ON ENDM ;############################################################################ ; ; RESERVE DRIbNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN0,1- DIRECTORY ALLOCATION ; 1 MSB PER DIRECTORY CLUSTER ALLOCATED DPBCKS DS 2 ;CKS- # DIRECTORY SECTORS CHECKED ; (DRM CBNNNNNNNNNNNNNNNN rNNNNNNNNNNNNNNNNNNNNN! OFFSET (FOR LOGICAL DRIVE) ; 0: NONE, 1..65535: OFFSET DPBSZ DS 0 ENDM ; ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@gNNNNNNNNNNNNNNNN WNNNNNNNNNNNNNNNNNNNNN!############################################## ; ; DISK DRIVER TABLES (DDT) ; ;#############################################>NNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNR TABLE RECORD ; ENTRY- #DADD= DRIVER ADDRESS ; #PD= PHYSICAL DRIVE # ; #FLG= DRIVE FLAGS ; #DPB= DPB ADDRESS ; #DPH= DNNNNNNNNNNNNNNNNN %ANNNNNNNNNNNNNNNNNNNNNNODE) LSTINC EQU FALSE ;LIST INCLUDE FILES USEMON EQU TRUE ;USE MONITOR ROM I/O ROUTINES IF TRUE INTRPTS EQU TRUE ;ENABLE INNNNNNNNNNNNNNNNN +4NNNNNNNNNNNNNNNNNNNNNNN C SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 1 ; D SIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 1 ; E JADE 8" FLOPPY PHYSICAL DRIVErBNNNNNNNNNNNNNNNN 0NNNNNNNNNNNNNNNNNNNNN!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; MACRO TO DEFINE THE DRIVE ALLOCATION & CHECKSUMS AREA ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@[NNNNNNNNNNNNNNNNN gNNNNNNNNNNNNNNNNNNNNNNVE PARAMETER BLOCKS ; ;############################################################################ ; STRUCT 0 DPBSPT DS 2%NNNNNNNNNNNNNNNN ]NNNNNNNNNNNNNNNNNNNNNN+1) / 4 DPBOFF DS 2 ;OFF- # RESERVED TRACKS (USUALLY 2) ; ; ADDITIONAL CP/M 3.0 DATA (ALSO COULD BE USED BY CP/M 2.2 DEBLOCRNNNNNNNNNNNNNNNN !NNNNNNNNNNNNNNNNNNNNNN@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; GENERATE THE DPB FOR DRIVE MACRO ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*NNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN############################### ; STRUCT 0 DDT_EXE DS 2 ;START ADDRESS OF DISK DRIVER DDT_FLG DS 1 ;FLAGS BIT DEF. ; 0NNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNPH ADDRESS ; #HDS= HEADS ; #SOF= SECTOR OFFSET ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@6NNNNNNNNNNNNNNNNN &BNNNNNNNNNNNNNNNNNNNNNNNTERRUPT PROCESSING WHISTLE INTCPTS EQU TRUE ;ENABLE SYSTEM CALL INTERCEPT WHISTLE BOOT EQU 10H ;10H: HARD DISK, 3: 8" FLOPP/NNNNNNNNNNNNNNNN ,NNNNNNNNNNNNNNNNNNNNNN 0 ; F JADE 8" FLOPPY PHYSICAL DRIVE 1 ENDIF IF BOOT = 3 ; A JADE 8" FLOPPY PHYSICAL DRIVE 0 ; B JADE 8" FLOPPYNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ALLDAL: MACRO #D LIST ON IF ((DD - 1) >= STHD) AND ((DD - 1) <= NDHi{aNNNNNNNNNNNNNNNN TNNNNNNNNNNNNNNNNNNNNN! ;SPT- SECTORS/TRACK DPBBSH DS 1 ;BSH- BLOCK SHIFT FACTOR DETERMINED BY CLUSTER SIZE ; 1K= 3, 2K= 4, 4K= 5, 8K= 6, 16K= 7 ǡHNNNNNNNNNNNNNNNNN lNNNNNNNNNNNNNNNNNNNNNNKING) ; DPBPSH DS 1 ;PSH- PHYSICAL RECORD SHIFT FACTOR BASED ON BYTES/SEC ; 0: 128, 1: 256, 2: 512, 3: 1024 DPBPHM DS 1 ;xNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ALLDPB: MACRO #D LIST ON D#D(DD)DPB: DS DPBSZ ;ALLOCATION FOR DRIVE #D(DD) LIST OFF ENDBNNNNNNNNNNNNNNNN 1NNNNNNNNNNNNNNNNNNNNN! 1: INHIBIT LOGON ; 1..3 PARTITION # {0,..7} DDT_HDB EQU 4 ;1: HARD DISK DRIVE ; DDT_DRV DS 1 ;PHYSICAL DRIVE # DDT_NNNNNNNNNNNNNNNNNNN !ۅNNNNNNNNNNNNNNNNNNNNNN TITLE CUSTOMIZED BIOS FOR M5B LIST NOCOND ;============================================================================ ; ^NNNNNNNNNNNNNNNNN 'q#NNNNNNNNNNNNNNNNNNNNNNY, 20H: 5" FLOPPY DEBUG EQU FALSE ;TRUE TO DUMP THE IOPB DATA TO PRINTER FORM ;******************************************INNNNNNNNNNNNNNNN -NNNNNNNNNNNNNNNNNNNNN! PHYSICAL DRIVE 1 ; C SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 0 ; D SIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 0 ; E SIDE 0 !NNNNNNNNNNNNNNNN "NNNNNNNNNNNNNNNNNNNNNND) D#D(DD)ALL: DS 127 ;ALLOCATION BIT MAP FOR 8" HARD DRIVE #D(DD) ENDIF IF ((DD - 1) >= ST8FD) AND ((DD - 1) <= ND8FD)4NNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNDPBBLM DS 1 ;BLM- BLOCK MASK ; 1K = 7, 2K= 15, 4K= 31, 8K= 63, 16K= 127 DPBEXM DS 1 ;EXM- EXTENT MASK ; DSM < 256 : 1K=%rNNNNNNNNNNNNNNNNN !NNNNNNNNNNNNNNNNNNNNNNPHM- PHYSICAL RECORD MASK BASED ON BYTES/SEC ; 0: 128, 1: 256, 3: 512, 7: 1024 ; ; ADDITIONAL DISK PARTITIONING DATA FORNNNNNNNNNNNNNNNN GNNNNNNNNNNNNNNNNNNNNNNM ; ; RESERVE THE DATA SPACE ; DD DL 1 REPT NDRVS LIST OFF ALLDPB 0123456789ABCDEF DD DL DD + 1 LIST ON ENDM NNNNNNNNNNNNNNNNN LNNNNNNNNNNNNNNNNNNNNNNDPB DS 2 ;DPB ADDRESS FOR THIS DRIVE DDT_DPH DS 2 ;DPH ADDRESS FOR THIS DRIVE ; ; THE FOLLOWING MAY BE BROUGHT OFF DISK DESnNNNNNNNNNNNNNNNNN "NNNNNNNNNNNNNNNNNNNNNN; ASSEMBLY PARAMETERS ; ;============================================================================ FALSE EQU 0 TRUE EQU N7NNNNNNNNNNNNNNNNN (aNNNNNNNNNNNNNNNNNNNNNN********************************** ; ; CUSTOMIZED BIOS FOR M5B ; (c) 1981 GRH Electronics, CUPERTINO, CA ; ;**********NNNNNNNNNNNNNNNN .˻NNNNNNNNNNNNNNNNNNNNNN& 1 OF HARD DISK PHYSICAL DRIVE 1 ; F SIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 1 ENDIF IF BOOT = 20H ; A JADE 5" FLOxNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNN! D#D(DD)ALL: DS 57 ;ALLOCATION BIT MAP FOR 8" DRIVE #D(DD) D#D(DD)CHK DS 32 ;DIRECTORY CHECKSUMS STORAGE (1 BYTE PER SECTORNNNNNNNNNNNNNNNNN 2NNNNNNNNNNNNNNNNNNNNN! 0, 2K= 1, 4K= 3, 8K= 7, 16K= 15 ; DSM > 255 : 2K= 0, 4K= 1, 8K= 3, 16K= 7 DPBDSM DS 2 ;DSM- DRIVE STORAGE SIZE (IN CLUSTER:)NNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN THE LOGICAL DRIVE SELECTION. ; PARTITIONING BY TRACKS ARE IMPLIMENTED THRU BDOS USING DPBOFF ABOVE. ; PARTITIONING BY HEADS ABNNNNNNNNNNNNNNNN tNNNNNNNNNNNNNNNNNNNNNN IF (($ - 8000H) > 07700H) OR ($ < 8000H) CONMSG **** BIOS TOO BIG, USE MOVCPM & RE-ADJUST! **** ENDIF END _9INNNNNNNNNNNNNNNN }NNNNNNNNNNNNNNNNNNNNNNCRIPTOR OR FROM DEFAULT TABLES ; DDT_HDS DS 1 ;HEADS DDT_SOF DS 2 ;SECTOR OFFSET ; ; DEFINE THE STRUCTURE SIZE ; DDT_SIBNNNNNNNNNNNNNNNN #NNNNNNNNNNNNNNNNNNNNNNOT FALSE ;============================================================================ ; ; CONDITIONAL ASSEMBLY FLAGS ; ;NNNNNNNNNNNNNNNNN )R,NNNNNNNNNNNNNNNNNNNNNN****************************************************************** ; ; CONFIGURATION: ; ; CPM ; DRIVE USAGE IF BOOT = 1PNNNNNNNNNNNNNNNNN /NNNNNNNNNNNNNNNNNNNNNNPPY PHYSICAL DRIVE 0 ; B JADE 5" FLOPPY PHYSICAL DRIVE 1 ; C SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 0 ; D SIDE 2 & 3 OFW~rNNNNNNNNNNNNNNNN DNNNNNNNNNNNNNNNNNNNNNN) ENDIF LIST OFF ENDM ; ; RESERVE THE DATA SPACE ; DD DL 1 REPT NDRVS LIST OFF ALLDAL 0123456789ABCDEF DD DNNNNNNNNNNNNNNNN ?NNNNNNNNNNNNNNNNNNNNNNS) ; INT(((#_TRACKS - OFF) * SPT * BYTES PER SECTOR) / CLUSTER SIZE) -1 DPBDRM DS 2 ;DRM- DIRECTORY SIZE -1 DPBAL0 DS 2 ;ALNNNNNNNNNNNNNNNN CNNNNNNNNNNNNNNNNNNNNNNRE IMPLIMENTED BY USING THE FOLLOWING DATA. ; (HEAD BITS ARE INCLUDED IN SECTOR WORD UPPER BITS) ; DPBSOF DS 2 ;SOF- SECTORcdNNNNNNNNNNNNNNNNN dNNNNNNNNNNNNNNNNNNNNN!################################# ; IOPB: REPT PB_SIZE LIST OFF DB 0 LIST ON ENDM ;##############################GNNNNNNNNNNNNNNNNN .NNNNNNNNNNNNNNNNNNNNN!Z DS 0 ENDM ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; MACRO TO DEFINE THE DRIVE~PNNNNNNNNNNNNNNNNNN $$pNNNNNNNNNNNNNNNNNNNNNN============================================================================ SHORT EQU FALSE ;SHORT BIOS (REMOVES UNESENTIAL CNNNNNNNNNNNNNNNNN *NNNNNNNNNNNNNNNNNNNNNN0H ;HARD DISK BOOT CONFIG. ; A SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 0 ; B SIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 0 ; SNNNNNNNNNNNNNNNNN 0NNNNNNNNNNNNNNNNNNNNN! HARD DISK PHYSICAL DRIVE 0 ; E SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 1 ; F SIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 1 ; ,NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNŃh6хm;Չp> ٍvDᑯ}K敳O뙹U#񝾞Z(â^,ǦNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN SNNNNNNNNNNNNNNNNNNNNNN G JADE 8" FLOPPY PHYSICAL DRIVE 0 ; H JADE 8" FLOPPY PHYSICAL DRIVE 1 ENDIF ; ;***************************************eNNNNNNNNNNNNNNNNN @NNNNNNNNNNNNNNNNNNNNNNdid not specify the logon track. ; 3.02 7 JUL 88 GRH ; Add '?' to include file names. ; Change hard disk system tracks direTrNNNNNNNNNNNNNNNN  >NNNNNNNNNNNNNNNNNNNNNN GRH ; Modify for Ver. 1.22 Monitor. ; Fix bug in 8" Hard Disk table which benignly (at current level) ; caused the drive tNNNNNNNNNNNNNNNN BNNNNNNNNNNNNNNNNNNNNNNsing in IX redundancy. ; Change DPB track-head shift factor to Sector Offset like track ; offset. Disk partitioning will add NNNNNNNNNNNNNNNN `NNNNNNNNNNNNNNNNNNNNN!00.DEF ; ;============================================================================ ; LIST OFF *INCLUDE JDDCONT3.DEF HNNNNNNNNNNNNNNNNN /NNNNNNNNNNNNNNNNNNNNNNCATIONS ; PAGE0: EQU 0 ;START OF CP/M RAM IOBYTE: EQU PAGE0 + 3 ;IOBYTE ADDR DEFDRV: EQU PAGE0 + 4 ;DEFAULT DRIVE PARAM ADDwdNNNNNNNNNNNNNNNN % qNNNNNNNNNNNNNNNNNNNNN!ISK BOOT DATA ; STHD EQU 0 ;START LOGICAL DRIVE OF HARD DISK NDHD EQU 3 ;LAST LOGICAL DRIVE OF HARD DISK ST8FD EQU 4 ;STAtNNNNNNNNNNNNNNNNNN +~NNNNNNNNNNNNNNNNNNNNNN@@ ; ; GENERATE THE TRANSLATION TABLE MACRO ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ NNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN********************** ; ; REVISION HISTORY: ; ; 3.00 - 26 JAN 87 GRH ; Implemented new common IOPB code & Jade floppy -NNNNNNNNNNNNNNNNN PNNNNNNNNNNNNNNNNNNNNNNctory reference to new format. ; Correct bug in drivers which caused retry to fail. (sector remained ; corrupted) ; StubbedNNNNNNNNNNNNNNNN mNNNNNNNNNNNNNNNNNNNNNNable to have bad data (default table was missing ; the 2 deblocking extension bytes). ; Implement data xfer inhibit schemes wddNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNthis value to sector word. It ; will be stored in the ID sector data to be dynamic. ; ; 3.10 5-20-91 GRH ; Change LOGON tNNNNNNNNNNNNNNNN 5NNNNNNNNNNNNNNNNNNNNN! *INCLUDE COMIOPB3.DEF *INCLUDE DISKS3.DEF *INCLUDE BDIR.DEF *INCLUDE ISHA.DEF *INCLUDE B:M5ZF200.DEF LNNNNNNNNNNNNNNNNN  ߄NNNNNNNNNNNNNNNNNNNNNNR BDOSJV EQU PAGE0 + 5 ;BDOS SYSTEM CALL ENTRY THIS_STK EQU PAGE0 + 1CH ;CURRENT STACK FRAME PTR DK_BDRV EQU 0041H ;BOOT DRINNNNNNNNNNNNNNNNNN &u"NNNNNNNNNNNNNNNNNNNNNNRT LOGICAL DRIVE OF 8" FLOPPY ND8FD EQU 5 ;LAST LOGICAL DRIVE OF 8" FLOPPY ENDIF IF BOOT = 3 ; ; 8" FLOPPY BOOT DAG 9NNNNNNNNNNNNNNNN ,NNNNNNNNNNNNNNNNNNNNN! ; GXLATE MACRO #SECTORS, #SKEW LIST OFF NXTSEC DL 1 ;;START WITH SECTOR 1 LOWEST DL 1 ;; REPT #SECTORS LIST ON DB J|dNNNNNNNNNNNNNNNN 1NNNNNNNNNNNNNNNNNNNNN!firmware support. ; Implemented disk drive driver tables and new function to return ; a ptr to a drive table. ; Removed init!NNNNNNNNNNNNNNNNNN  cNNNNNNNNNNNNNNNNNNNNNN out new Clock routines for present. ; 3.03 31 JUL 88 GRH ; Unstub Clock routines. ; 3.04 6 AUG 88 GRH ; Remove floppy sNNNNNNNNNNNNNNNNN \NNNNNNNNNNNNNNNNNNNNNNith PB_FLG & PB_BCNT. ; Add pick-up of THIS_BNK data in all iopb cases. ; Remove clock buffer set/read system calls. ; 12-5-9߉NNNNNNNNNNNNNNNN %NNNNNNNNNNNNNNNNNNNNNNo attempt to recover from old disks better, using ; DCM8301 version controller firmware. ; ; 3.11 9-2-91 GRH ; Add redlinNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNIST ON ;============================================================================ ; ; DISK OPERATING SYSTEM ADDRESSEWNNNNNNNNNNNNNNNNNN !NNNNNNNNNNNNNNNNNNNNNNVE # FROM PROM DEFBFR EQU PAGE0 + 80H ;DEFAULT BUFFER ; ; BIOS FUNCTION CALL RESTART VECTOR ; BFUNRST EQU 28H BFUNRSV EQ+NNNNNNNNNNNNNNNNNN 'FNNNNNNNNNNNNNNNNNNNNN!TA ; STHD EQU 2 ;START LOGICAL DRIVE OF HARD DISK NDHD EQU 5 ;LAST LOGICAL DRIVE OF HARD DISK ST8FD EQU 0 ;START LOGICAL HNNNNNNNNNNNNNNNN -NNNNNNNNNNNNNNNNNNNNNNNXTSEC LIST OFF NXTSEC DL NXTSEC + #SKEW ;ADD SKEW FACTOR ;; IF NXTSEC > #SECTORS ;CHECK FOR OVERFLOW NXTSEC DL NXTSEC NNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN of IOBYTE. ; Implemented 5" floppy driver. ; Implemented use of ROM primitives. ; Moved system down to 60k. ; 3.01 26 JUN [WNNNNNNNNNNNNNNNN  6NNNNNNNNNNNNNNNNNNNNN!ide select from BIOS & move to controller. ; Implement new ID sector format. ; Implement CP/M 3.0 DPB structure in preparation_NNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNN0 GRH ; Remove IX IOPB ptr passing to disk drivers. ; 1-13-91 GRH ; Fix bug which corrupted PB_FLG. ; 3.08 2-22-91 GRH R9NNNNNNNNNNNNNNNN pNNNNNNNNNNNNNNNNNNNNN!es & change for M5ZMON v.2.00. ; VERSN EQU 311 ; ;**************************************************************************xNNNNNNNNNNNNNNNNN |NNNNNNNNNNNNNNNNNNNNNNS ; ;============================================================================ ; NKSYS: EQU 60 ;SYSTEM SIZE IN K BYTES PYNNNNNNNNNNNNNNNN "NNNNNNNNNNNNNNNNNNNNNNU PAGE0 + BFUNRST BFUNRSI EQU 0C7H + BFUNRST ; TPA: EQU 100H ;==========================================================NNNNNNNNNNNNNNNNN (V-NNNNNNNNNNNNNNNNNNNNNNDRIVE OF 8" FLOPPY ND8FD EQU 1 ;LAST LOGICAL DRIVE OF 8" FLOPPY ENDIF ;==============================================kNNNNNNNNNNNNNNNN .NNNNNNNNNNNNNNNNNNNNNN- #SECTORS ;; IF NXTSEC <= LOWEST ;CHECK FOR REPEAT NXTSEC DL LOWEST + 1 LOWEST DL NXTSEC ENDIF ENDIF ;; ENDM $NNNNNNNNNNNNNNNNN &NNNNNNNNNNNNNNNNNNNNNN88 GRH ; Remove 5" floppy support. Implement in CP/M-86 BIOS. ; Change single function to return drive table ptr into a BIOS fHNNNNNNNNNNNNNNNNN  NNNNNNNNNNNNNNNNNNNNN! for deblocking. ; 3.05 11-3-88 GRH ; Change included data to update IOPB.PBSTAT to new configuration. ; 3.06 1-28-89 GRH9NNNNNNNNNNNNNNNNN  NNNNNNNNNNNNNNNNNNNNNN ; Remove references to THIS_BNK & use monitor function #7 instead. ; Add track-head shift factor to DPBs for future use. ; 3.NNNNNNNNNNNNNNNN CNNNNNNNNNNNNNNNNNNNNNN** SUBTTL SYSTEM DECLARATIONS ;============================================================================ ; ; INCLUDE^cdNNNNNNNNNNNNNNNN MNNNNNNNNNNNNNNNNNNNNN!KBYTE: EQU 1024 CPMSZ: EQU KBYTE * NKSYS CPMBS: EQU CPMSZ - (20 * KBYTE) ; CP/M BIAS VALUE CCP: EQU CPMBS + 3400H ;ADDR OF CC5ENNNNNNNNNNNNNNNN #NNNNNNNNNNNNNNNNNNNNNN================== ; ; OTHER DECLARATIONS ; ;============================================================================ ;NNNNNNNNNNNNNNNNN )eNNNNNNNNNNNNNNNNNNNNN!============================== ; ; ASCII CHARS ; ;==========================================================================l NNNNNNNNNNNNNNNNN /ϺNNNNNNNNNNNNNNNNNNNNN! LIST ON ENDM ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; INITIALIZE VERSION TEX$NNNNNNNNNNNNNNNN sNNNNNNNNNNNNNNNNNNNNNNunction ; call using restart instruction. ; Change LOGON to specify the ID sector & track. At same time, fix bug ; which `lNNNNNNNNNNNNNNNN  NNNNNNNNNNNNNNNNNNNNNN ; Revised primitive calling procedures to use the monitor rom function ; rather than swapping Roms itself. ; 3.07 11-25-90 bNNNNNNNNNNNNNNNN sNNNNNNNNNNNNNNNNNNNNNN09 5-15-91 GRH ; Change 8" floppy side select to track bit 0. Move calculation from ; DCM8 to CBIOS. ; Remove IOPB ptr paskNNNNNNNNNNNNNNNNN SNNNNNNNNNNNNNNNNNNNNNN JDDCONT3.DEF ; INCLUDE COMIOPB3.DEF ; INCLUDE DISKS3.DEF ; INCLUDE BDIR.DEF ; INCLUDE ISHA.DEF ; INCLUDE B:M5ZF2BNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNP BDOS: EQU CPMBS + 3C00H ;ADDRESS OF BDOS BIOS: EQU CPMBS + 4A00H ;ADDRESS OF BDOS BIOSR: EQU 1000H - BIOS ; ; PAGE 0 LONNNNNNNNNNNNNNNNN $@NNNNNNNNNNNNNNNNNNNNNN MR_RNUM EQU 0 ;INTERIM DEFINITION FOR INTERRUPT ROM SWAP ; SECSZ: EQU 128 NDRVS: EQU 6 IF BOOT = 10H ; ; 8" HARD D]fNNNNNNNNNNNNNNNN *0ONNNNNNNNNNNNNNNNNNNNNN== ; LF: EQU 0AH CR: EQU 0DH CTRLZ: EQU 1AH ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@9NNNNNNNNNNNNNNNNN 0NNNNNNNNNNNNNNNNNNNNNNT IN RAM MACRO ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; PVERS MACRO #VERS DD DL #V^NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNρj7҅m< ׉r? ٍvD}K整OꙸT!Z'\*ŦNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN!NNNNNNNNNNNNNNNNNNNNNNERS IF DD > 9999 DB (DD / 10000) + '0' DD DL DD % 10000 ENDIF IF DD > 999 DB (DD / 1000) + '0' DD DL DD % 1000NNNNNNNNNNNNNNNNN!qNNNNNNNNNNNNNNNNNNNNNNTDMA ;SET TRANSFER ADDR JP DISKRD ;PERFORM DISK READ JP DISKWR ;PERFORM DISK WRITE JP LISTST ;RETURN LIST STATUS JP :rNNNNNNNNNNNNNNNN! NNNNNNNNNNNNNNNNNNNNNNINIT ; INIT1: JR INIT ;############################################################################ ; ; DIRECTORY SECTOBNNNNNNNNNNNNNNNN!NNNNNNNNNNNNNNNNNNNNN! A,(DK_BDRV) ;USE DRIVE # PASSED IN PAGE 0 AND A,3 LD (DEFDRV),A ; ; SEND SYSTEM SIGN-ON ; CLOGO: LD HL,MSGSO CALL EvNNNNNNNNNNNNNNNN!! NNNNNNNNNNNNNNNNNNNNN!BUFFER TO 1 SECTOR SIZE ENDIF ;---------------------------------------------------------- ; ; WARM REBOOT ENTRY LOADS^NNNNNNNNNNNNNNNNN!NNNNNNNNNNNNNNNNNNNNNN) CP A,86H JR C,WEROR ; ; SET UP TO LOAD CCP/BDOS ; LD HL,(DEFBFR + BD_SBDSS) ;PREFETCH BDOS TRK/SECTOR PUSH HL ; NNNNNNNNNNNNNNNN!%aNNNNNNNNNNNNNNNNNNNNNNJP C,WREAD ; ; ELSE DONE READING SYSTEM ; JP WZRPG ; ; ; ELSE SET UP & READ BDOS ; RDBDOS: POP HL ;RESTORE BDOS TvNNNNNNNNNNNNNNNNNN!+BNNNNNNNNNNNNNNNNNNNNNN ; IF INTCPTS ; ; PUT BDOS VECTOR INTO INTERCEPT CODE ; LD HL,(BDOS + 7) LD (BDOSV),HL ; ; NOW PUT INTERCEPT VEC8BNNNNNNNNNNNNNNNN!NNNNNNNNNNNNNNNNNNNNNN ENDIF DB (DD / 100) + '0' DB '.' DB ((DD % 100) / 10) + '0' DB (DD % 10) + '0' ENDM SUBTTL BIOS CODE ORG ֳNNNNNNNNNNNNNNNNNN!ONNNNNNNNNNNNNNNNNNNNNNSECTRN ;TRANSLATE SECTOR JP BIOFUNC ;EXECUTE FUNCTION CALL ;###########################################################hNNNNNNNNNNNNNNNNN!NNNNNNNNNNNNNNNNNNNNNNR BUFFER STARTS HERE AFTER CRUNCHING COLD START ; CODE. THIS BUFFER IS USED BY THE CP/M DIRECTORY CHECK ROUTINES THAT ; CHEC~tNNNNNNNNNNNNNNNN!WQNNNNNNNNNNNNNNNNNNNNNNDITOR ; ; MODIFY COLD START VECTOR TO WARM START ; LD HL,(BIOS+4) LD (BIOS+1),HL ; ; BOOT CCP & BDOS ; JR WARM NNNNNNNNNNNNNNNN!t^NNNNNNNNNNNNNNNNNNNNNN CCP,BDOS FROM DISK & ; SETS UP VARIABLES ; ;---------------------------------------------------------- ; WARM: ; ; SETWrNNNNNNNNNNNNNNNNN! NNNNNNNNNNNNNNNNNNNNNN LD HL,(DEFBFR + BD_SCCPS) ;FETCH CCP TRK/SECTOR LD C,L LD B,0 CALL SETSEC ; LD C,H CALL SETTRK ; LD BC,CCP CALNNNNNNNNNNNNNNNN!&4NNNNNNNNNNNNNNNNNNNNNNRK/SECTOR FROM DIRECTORY LD C,L LD B,A ;A STILL CONTAINS 0 CALL SETSEC ; LD C,H CALL SETTRK ; JR WREAD ; ; ; WNNNNNNNNNNNNNNNN!,mNNNNNNNNNNNNNNNNNNNNN!TOR INTO BDOS CODE ; LD HL,INTCPT LD (BDOS + 7),HL ; ; INITIALIZE CLOCK VECTORS IF CLOCK INSTALLED ; LD A,MF_CSYN ;TNNNNNNNNNNNNNNNN!͵NNNNNNNNNNNNNNNNNNNNNNBIOS ;---------------------------------------------------------------------------- ; ; BIOS JUMP VECTOR TABLE ; ;--------QgNNNNNNNNNNNNNNNNN! "~NNNNNNNNNNNNNNNNNNNNNN################# ; ; THE FOLLOWING BOOT DATA MUST RESIDE AS DEFINED RIGHT BEFORE THE COLD ; INIT ROUTINE START AND MUST BE INNNNNNNNNNNNNNNNN!NNNNNNNNNNNNNNNNNNNNN!K FOR DISK CHANGE. ; ;############################################################################ ; DIRBF: EQU $ ;BUFFER BNNNNNNNNNNNNNNNN!d`NNNNNNNNNNNNNNNNNNNNNN ;############################################################################ ; ; SIGN-ON MESSAGE ; ;###################NNNNNNNNNNNNNNNN!GoNNNNNNNNNNNNNNNNNNNNNN TEMPORARY STACK ; DI LD SP,DEFBFR LD (THIS_STK),SP EI ; ; LOG ON DRIVE TO INIT TABLES ; LD A,(DK_BDRV) AND A,>BNNNNNNNNNNNNNNNN!!1NNNNNNNNNNNNNNNNNNNNNNL SETDMA ; ; READ CCP/BDOS ; WREAD: CALL DISKRD JR NZ,WEROR ;IF ERROR THEN EXIT ; ; NEXT SECTOR ; LD HL,BTSEC I7lNNNNNNNNNNNNNNNNN!'NNNNNNNNNNNNNNNNNNNNNN WARM BOOT ERROR, OUTPUT MSG & HALT ; WEROR: LD HL,MSGLE ;OUTPUT ERROR MESSAGE CALL EDITOR HALT ; ; ; BOOT OK, INIT P~ (DI0NNNNNNNNNNNNNNNN!NNNNNNNNNNNNNNNNNNNNNN LD BC,DEFBFR ;SET XFER ADDRESS (USE DEFAULT BUFFER) CALL SETDMA ; LD BC,BD_SEC ;SET DIRECTORY SECTOR CALL SETSEC ; T{rNNNNNNNNNNNNNNNN!#SNNNNNNNNNNNNNNNNNNNNNN INTO BDOS THEN READ NEXT SECTOR ; LD DE,BDOS XOR A,A SBC HL,DE JR C,WREAD ; ; ELSE IF AT BEGINNING OF BDOS THEN SENNNNNNNNNNNNNNNNN!)$NNNNNNNNNNNNNNNNNNNNN! INIT BDOS CALL VECTOR IN PAGE 0 ; LD HL,BDOS + 6 LD (BDOSJV),A LD (BDOSJV + 1),HL ; ; INIT BIOS CALL VECTOR IN PAGj.$NNNNNNNNNNNNNNNNN!/>NNNNNNNNNNNNNNNNNNNNN! ENDIF ; ; PASS DEFAULT DISK TO CCP ; LD A,(DEFDRV) LD C,A JP CCP SUBTTL BIOS DISK FUNCTION ROUTINES ;+++++ҫNNNNNNNNNNNNNNNN!2@NNNNNNNNNNNNNNNNNNNNNNDER JP HOME ;HOME SELECTED DRIVE JP SELDSK ;SELECT DISK DRIVE JP SETTRK ;SET TRACK # JP SETSEC ;SET SECTOR # JP SEO!NNNNNNNNNNNNNNNN! ݋NNNNNNNNNNNNNNNNNNNNNN BIOSSZ: DW BIOSND - BIOS ;BIOS MODULE SIZE IN BYTES BIOSST: DW BIOS ;BIOS MODULE LOAD ADDR FOR SBD ; ; CONTINUE ON WITH .NNNNNNNNNNNNNNNN!NNNNNNNNNNNNNNNNNNNNNN ; SET TEMPORARY STACK ; DI LD SP,DEFBFR ;USE PAGE 0 FOR STACK LD (THIS_STK),SP EI ; ; INIT DEFAULT DRIVE ; LDrNNNNNNNNNNNNNNNNN! 0 CP A,STHD JR C,LGCKFD ENDIF CP A,NDHD + 1 JR NC,,NNNNNNNNNNNNNNNNN! 0NNNNNNNNNNNNNNNNNNNNNN* ; ; SET TRACK # ; ENTRY- BC= TRACK # ; ;**************************************************************************** ; NNNNNNNNNNNNNNNNN!&NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++ ; ; SECTOR TRANSLATION FUNCTION ; ENTRY- DE= 0: NO XLATE, ELSE PTR TO XLATE TABLE ; BC= SvNNNNNNNNNNNNNNNN!,]NNNNNNNNNNNNNNNNNNNNNN ; LOGON DISK FUNCTION ; EXIT - A= 0: OK; /0: ERROR ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++NNNNNNNNNNNNNNNN!NNNNNNNNNNNNNNNNNNNNNN PASS READ COMMAND ; LD A,PB_READC ;SELECT READ OP JP DISKOP ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++2NNNNNNNNNNNNNNNNN! NNNNNNNNNNNNNNNNNNNNNN!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; SELDSK: ; ; ASSUME ERROR ; LD HL,0 ; ; NNNNNNNNNNNNNNNNN!NNNNNNNNNNNNNNNNNNNNNN IF NOT FIRST SELECT OR LOGON INHIBITED THEN RETURN TABLE PTR ; LD A,(LOGRQ) OR A,C CPL AND A,1 RET Z ; ; ELSE (9NNNNNNNNNNNNNNNN!SPNNNNNNNNNNNNNNNNNNNNNNFER ID SECTOR DATA TO TABLES ; IDOK: CALL TRNONE ;ASSUME NO TRANSLATION ; ; IF HARD DISK OR DOUBLE DENSITY THEN NO TRANSL~!NNNNNNNNNNNNNNNN!p_NNNNNNNNNNNNNNNNNNNNNNLGCKFD ; ; ELSE USE HARD DISK DEFAULTS ; CALL TRNONE ; NO XLATE LD HL,HDPBK ; ; XFER DATA TO TABLES ; SEL2: PUSuBNNNNNNNNNNNNNNNN!!NNNNNNNNNNNNNNNNNNNNNNSETTRK: LD (BTTRK),BC RET ;**************************************************************************** ; ; SET SECTO NNNNNNNNNNNNNNNNNN!'0NNNNNNNNNNNNNNNNNNNNNNECTOR # TO XLATE ; EXIT - HL= XLATED SECTOR OR BC + 1 ; BC= UNCHANGED ; A, DE= ? ; ;+++++++++++++++++++++++++++++++++++++NHNNNNNNNNNNNNNNNN!-lNNNNNNNNNNNNNNNNNNNNNN+++++++ ; DISKLOG: ; ; SET DESCRIPTOR SECTOR XFER ADDRESS TO DEFAULT BUFFER ; LD HL,DEFBFR LD (IOPB + PB_DMAO),HL C1NNNNNNNNNNNNNNNN!cNNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++ ; ; WRITE A DISK SECTOR ; EXIT - A= 0: OK; /0: ERROR ; ;+++++++++++++++++++++++++++++++++++++++++++++NNNNNNNNNNNNNNNN! @NNNNNNNNNNNNNNNNNNNNNN IF UNSUPPORTED DRIVE REQUESTED THEN RETURN 0 (ERROR) ; LD A,C CP A,NDRVS RET NC ; ; STORE DRIVE # FOR FUTURE USE ; 3NNNNNNNNNNNNNNNNN!NNNNNNNNNNNNNNNNNNNNNNLOG ON DRIVE ; LD (DTPTR),HL ;SAVE DRIVE TABLE PTR ; ; ATTEMPT TO READ ID SECTOR ; XOR A,A ;INIT FLAG BYTE UNTIL FIRM_NNNNNNNNNNNNNNNN!NNNNNNNNNNNNNNNNNNNNNNATION ; LD A,(DEFBFR + ID_FLGO) AND A,[1 SHL DF_DTDB] OR [1 SHL DF_HARDB] ; ; ELSE SET TRANSLATION ; CALL Z,TR8 ; NNNNNNNNNNNNNNNNN!NNNNNNNNNNNNNNNNNNNNNNH HL CALL DPBAD ; USE DEFAULT TABLE POP HL LD BC,DPBSZ LDIR JR SEL1 ; ; ; USE 8" FLOPPY DEFAULTS ; LGCKFD: CArNNNNNNNNNNNNNNNN!"RNNNNNNNNNNNNNNNNNNNNNNR ; ENTRY- BC= SECTOR # ; ;**************************************************************************** ; SETSEC: LD (BTS*INNNNNNNNNNNNNNNNN!( NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++ ; SECTRN: ; ; IF NO TRANSLATION THEN RETURN SECTOR++ ; LD A,D ;IF TABLE ADDR = jNNNNNNNNNNNNNNNN!.?NNNNNNNNNNNNNNNNNNNNN!ALL GETBNK LD (IOPB + PB_DMAXO),A ; ; SET DESCRIPTOR SECTOR SECTOR ; LD HL,ID_SECT LD (IOPB + PB_SECO),HL ; ; SET NNNNNNNNNNNNNNNNN!P#NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++ ; DISKWR: ; ; DISABLE UPLOAD (READ DATA) ; LD A,1 SHL PB_INHX LD (BTFLG),A ; ; ENHNNNNNNNNNNNNNNNNN! s,NNNNNNNNNNNNNNNNNNNNNN LD (BTDRV),A ; ; SAVE LOGON REQUEST FLAG ; LD A,E LD (LOGRQ),A ; ; COMPUTE DISK DRIVER TABLE PTR ; CALL RETDVRINNNNNNNNNNNNNNNNN!NNNNNNNNNNNNNNNNNNNNNNWARE REVISED LD (IOPB + PB_ST2O),A ; CALL DISKLOG JP NZ,FDSKER ; ; IF NO ID SECTOR THEN USE DEFAULT DPB ; (NOTE: CONjdNNNNNNNNNNNNNNNN!52NNNNNNNNNNNNNNNNNNNNNN; XFER DISK DATA TO DPB ; NOX: CALL DPBAD ;GET ADDR OF DPB LD HL,DEFBFR + ID_SPTO LD BC,DPBSZ LDIR ; ; XFER DISKINNNNNNNNNNNNNNNN!NNNNNNNNNNNNNNNNNNNNNNLL TR8 LD HL,SD8PBK JR SEL2 ;**************************************************************************** ; ; HOME sNNNNNNNNNNNNNNNN!#cNNNNNNNNNNNNNNNNNNNNN!EC),BC RET ;**************************************************************************** ; ; SET TRANSFER ADDR ; ENTRY4NNNNNNNNNNNNNNNNN!)NNNNNNNNNNNNNNNNNNNNNN0 THEN NO TRANSLATION OR A,E JP Z,NOTRAN ; ; ELSE CALCULATE NEW SECTOR FROM TABLE ; EX DE,HL ADD HL,BC LD L,(HL) NNNNNNNNNNNNNNNNN!/NNNNNNNNNNNNNNNNNNNNNN DESCRIPTOR SECTOR TRACK ; LD L,H ;H == 0 FROM LAST OPERATION (HL= 0) LD (IOPB + PB_TRKO),HL ; ; ENABLE UPLOAD ; LDNNNNNNNNNNNNNNNN!pNNNNNNNNNNNNNNNNNNNNN!ABLE DOWNLOAD (WRITE DATA) ; LD HL,SECSZ LD (IOPB + PB_BCNTO),HL ; ; PASS WRITE COMMAND ; LD A,PB_WRITC ;SELECT WRIT,NNNNNNNNNNNNNNNN! NNNNNNNNNNNNNNNNNNNNN!T ;DRIVE IS STILL IN C REGISTER LD (DVRTPTR),HL ; ; PREFETCH DRIVER EXECUTION ADDRESS FROM TABLE ; LD E,(HL) ;STORE AdDNNNNNNNNNNNNNNNNN!NNNNNNNNNNNNNNNNNNNNNNTROLLER HAS SET IT'S DISK DEFAULTS IN DEFBFR IN ALL CASES) ; LD A,(IOPB + PB_ST2O) CP A,-1 ;-1:NONE, 0:JADE, 1:DESCRIPTOR,eFNNNNNNNNNNNNNNNNN!% NNNNNNNNNNNNNNNNNNNNN! PHYSICAL DATA TO TABLE ; LD HL,DEFBFR + ID_FLGO ; SEL1: PUSH HL LD HL,(DVRTPTR) LD DE,DVRFLG ADD HL,DE EX DE,HL &NNNNNNNNNNNNNNNN!NNNNNNNNNNNNNNNNNNNNNNDRIVE - TREAT AS SEEK TRK 0 ; EXIT - BC= 0 ; ;**************************************************************************** ;:@NNNNNNNNNNNNNNNNN!$eNNNNNNNNNNNNNNNNNNNNNN- BC= ADDRESS ; EXIT - A= ? ; ;**************************************************************************** ; SETDMA: LD (BhbBNNNNNNNNNNNNNNNN!*FNNNNNNNNNNNNNNNNNNNNN! ; LD H,0 RET ; ; ; CONVERT FROM CP/M'S LOGICAL SECTOR {0..N-1} TO PHYSICAL SECTOR {1..N} ; NOTRAN: LD HL,1 ADD xNNNNNNNNNNNNNNNNN!0CNNNNNNNNNNNNNNNNNNNNN! A,L ;L= 0 LD (IOPB + PB_FLGO),A ; ; DISABLE DOWNLOAD ; LD (IOPB + PB_BCNTO),HL ; ; PASS COMMAND TO EXECUTOR ; NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNρi7Ӆn= ؉s@ ڍwDޑyFᕮ|I䙳O靶S!V$NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN"0 NNNNNNNNNNNNNNNNNNNNNNLD A,PB_LOGC JR DISKOP2 ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; COMMON DISK INNNNNNNNNNNNNNNNN"NNNNNNNNNNNNNNNNNNNNNNIF NO_ERROR THEN RETURN ; ; PRINT ERROR ; CALL GETBNK ;SETUP BANK FOR FUTURE COMPATABILITY LD E,A LD HL,IOPB LD A,mNNNNNNNNNNNNNNNN" ufNNNNNNNNNNNNNNNNNNNNNNSELECT FUNCTION LD A,-1 ;RETURN -1 TO BDOS OR A,A RET ;*************************************************************ZBNNNNNNNNNNNNNNNN"UNNNNNNNNNNNNNNNNNNNNNN; RETURN DRIVE PARAMETER BLOCK ADDR FUNCTION ; EXIT - DE= DPB PTR ; HL= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++RdNNNNNNNNNNNNNNNN"NNNNNNNNNNNNNNNNNNNNN!IVE ; LD A,(BTDRV) ;IF EVEN THEN ADD 0 ELSE ADD 128 RRCA AND A,80H LD E,A ;COMPUTE SECTOR LD D,0 LD HL,(IOPB + PBHNNNNNNNNNNNNNNNNN"wNNNNNNNNNNNNNNNNNNNNNNITY LD A,MF_XIOB ;SET MONITOR FUNCTION # CALL XMROM ;EXECUTE THE FUNCTION ; OR A,A ;FUNCTION ERR? RET NZ ; ; RETUŔNNNNNNNNNNNNNNNN"%)NNNNNNNNNNNNNNNNNNNNNNO) PUSH HL ;SAVE FOR ERROR RESTORE ; LD A,(IOPB + PB_SECO +1) ;FETCH SIDE SELECT BYTE ADD A,A ;SHIFT OUT BIT 7 ; S<NNNNNNNNNNNNNNNN"+&NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++++++ ; BIOFUNC: ; ; IF FUNCTION # NOT IN TABLE THEN RETURN -1 ; LD A,C CP A,BNNNNNNNNNNNNNNNN"eXNNNNNNNNNNNNNNNNNNNNN!/O CODE ; ENTRY- A= IOPB COMMAND ; EXIT - A= 0: OK; /0: ERROR ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++~NNNNNNNNNNNNNNNNN"NNNNNNNNNNNNNNNNNNNNNNMF_DIOB ;USE DISPLAY IOPB DATA FUNCTION CALL XMROM ; ; QUERY USER FOR OPTION ; LD HL,DSKEB CALL EDITOR ; ; GET USmXHNNNNNNNNNNNNNNNN" 5NNNNNNNNNNNNNNNNNNNNNN*************** ; ; SET 3740 SECTOR TRANSLATION PROCEDURE ; ENTRY- (DTPTR)= MUST BE PTR TO DTP ; EXIT - DE, HL= ? ; ;*****NNNNNNNNNNNNNNNN"̍NNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++ ; DPBAD: LD HL,(DTPTR) ;FETCH BASE ADDR LD DE,10 ;ADD OFFSET OF DPB PTR ADD HL,DE LD E,(9NNNNNNNNNNNNNNNN"NNNNNNNNNNNNNNNNNNNNNN_SECO) ; PUSH HL ;SAVE SECTOR TO RESTORE LATER ; ADD HL,DE LD (IOPB + PB_SECO),HL ; ; EXECUTE IOPB ; CALL XPRIMSrNNNNNNNNNNNNNNNNN" NNNNNNNNNNNNNNNNNNNNN!RN THE COMMAND RESULTS STATUS ; LD A,(IOPB + PB_STATO) OR A,A RET SUBTTL JADE FLOPPY DRIVER ROUTINES ;++++++++++++nNNNNNNNNNNNNNNNN"&zNNNNNNNNNNNNNNNNNNNNNNRL H ;SHIFT TRACK HIGH BYTE RR L ;ROTATE BIT 8 TO 7 AND 0 TO CF RRA ;ROTATE TRACK BIT 0 INTO SECTOR BIT 15 LD (IOPBNNNNNNNNNNNNNNNN",@NNNNNNNNNNNNNNNNNNNNN!MAXFUNCS LD A,-1 RET NC ; ; ELSE COMPUTE TABLE ENTRY ; PUSH HL ;SAVE POSSIBLE DATA ; LD HL,BFUNTBL LD A,C ADDdNNNNNNNNNNNNNNNN"ViNNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++ ; DISKOP: ; ; SET UP IOPB ; LD HL,BTTRK LD DE,IOPB + PB_TRKO LD BC,PB_BCNTO - PB_TRKO LDIR ; $NNNNNNNNNNNNNNNNNN" NNNNNNNNNNNNNNNNNNNNNNER RESPONSE ; CALL CI ;GET USER RESPONSE ; PUSH AF ;SAVE CHAR LD C,A ;ECHO CHAR CALL COC POP AF ; AND A,5FH ;7NNNNNNNNNNNNNNNNN"NNNNNNNNNNNNNNNNNNNNNN*********************************************************************** ; TR8: TR3740: LD DE,SDTRAN ; SETTR: LD HL,(DTPTR) RNNNNNNNNNNNNNNNN"NNNNNNNNNNNNNNNNNNNNNNHL) ;FETCH DPB PTR INC HL LD D,(HL) RET SUBTTL HARD DISK ROUTINES ;+++++++++++++++++++++++++++++++++++++++++++++++VBNNNNNNNNNNNNNNNN"ܳNNNNNNNNNNNNNNNNNNNNNN ; ; RESTORE SECTOR ; POP HL LD (IOPB + PB_SECO),HL ; ; DONE ; RET ;+++++++++++++++++++++++++++++++++++++6NNNNNNNNNNNNNNNN"!6NNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; JADE 8" FLOPPY DISK DRIVER FUNCTION ; ENTRY- IY= DRIVER IHNNNNNNNNNNNNNNNNN"'KNNNNNNNNNNNNNNNNNNNNN! + PB_SECO +1),A ; LD (IOPB + PB_TRKO),HL ;STORE SHIFTED TRACK ; ; EXECUTE THE IOPB ; CALL XPRIM ; ; RESTORE THE MNNNNNNNNNNNNNNNN"-sNNNNNNNNNNNNNNNNNNNNNN A,A ADD A,L LD L,A LD A,0 ADC A,H LD H,A ; ; EXECUTE TABLE ADDRESS ; LD A,(HL) INC HL LD H,(HL) LD L,A m1!NNNNNNNNNNNNNNNN"NNNNNNNNNNNNNNNNNNNNNNDISKOP2: LD (IOPB + PB_CMDO),A ; ; FETCH DRIVER VECTOR & EXECUTE DISK DRIVER ; DKOPLP: PUSH IY ;SAVE IY LD IY,(DVRTUNNNNNNNNNNNNNNNN" NNNNNNNNNNNNNNNNNNNNNNINSURE UPPER CASE ; ; IF RETRY THEN RETURN TO CALLER ; CP A,'R' ;IF RETRY THEN RETURN TO CALLER JR Z,DKOPLP ; ; EL NNNNNNNNNNNNNNNNN"INNNNNNNNNNNNNNNNNNNNN! LD (HL),E INC HL LD (HL),D RET ;**************************************************************************** ; ; NNNNNNNNNNNNNNNN"NNNNNNNNNNNNNNNNNNNNN!+++++++++++++++++++++++++++++ ; ; HARD DISK DRIVER FUNCTION ; ENTRY- IY= DRIVER TABLE PTR ; EXIT - A= 0: OK; /0: ERROR ; ;/NNNNNNNNNNNNNNNNN"E$NNNNNNNNNNNNNNNNNNNNN!+++++++++++++++++++++++++++++++++++++++ ; ; EXECUTE THE IOPB PRIMITIVE ; EXIT - A= 0: OK, /0: ERROR ; ;++++++++++++++++++++xqrNNNNNNNNNNNNNNNN""cNNNNNNNNNNNNNNNNNNNNNNTABLE PTR ; EXIT - A= 0: OK; /0: ERROR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; FDn)$NNNNNNNNNNNNNNNNN"(uNNNNNNNNNNNNNNNNNNNNNNODIFIED IOPB SO RETRY WILL WORK ; POP HL ;TRACK LD (IOPB + PB_TRKO),HL ; LD HL,IOPB + PB_SECO +1 ;CLEAR BIT 15 RES 7BNNNNNNNNNNNNNNNN".&NNNNNNNNNNNNNNNNNNNNNN; EX (SP),HL ;PUT CALLER'S DATA IN HL, FUNCTION ADDR ON RET ; STACK, EXECUTE FUNCTION ADDRESS ON STACK ;############G'NNNNNNNNNNNNNNNNN"NNNNNNNNNNNNNNNNNNNNN!PTR) ;FETCH TABLE BASE ; LD HL,DKOPRET ;PUT RETURN ADDRESS ON STACK PUSH HL ; LD HL,(DVRXADR) ;FETCH DRIVER ADDRESS PREFNNNNNNNNNNNNNNNNNN" NNNNNNNNNNNNNNNNNNNNNNSE IF ABORT THEN DO WARM BOOT ; CP A,'A' ;IF ABORT THEN RE-BOOT JP Z,0 ; ; ELSE IF IGNORE THEN RETURN NO ERROR ; SU dNNNNNNNNNNNNNNNNN"3xNNNNNNNNNNNNNNNNNNNNNNSET NO SECTOR TRANSLATION PROCEDURE ; EXIT - HL, DE= ? ; ;*******************************************************************TNNNNNNNNNNNNNNNN"NNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; HDEXEC: ; ; CONVERT LOGICAL DRIVE TO PHYSIC8rNNNNNNNNNNNNNNNN"vNNNNNNNNNNNNNNNNNNNNN!++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; XPRIM: ; ; SET BANK ADDRESS TO THIS BANK FOR NOW ; CALL GETBBNNNNNNNNNNNNNNNN"#PNNNNNNNNNNNNNNNNNNNNNN8EXEC: ; ; CONVERT LOGICAL DRIVE TO PHYSICAL DRIVE ; LD A,(IY + DVRPDRV) LD (IOPB + PB_DRVO),A ; ; IF HEADS == 1 THgNNNNNNNNNNNNNNNNN")DNNNNNNNNNNNNNNNNNNNNN!,(HL) ; ; DONE ; RET SUBTTL BIOS FUNCTION CALLS ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++INNNNNNNNNNNNNNNNN"/NNNNNNNNNNNNNNNNNNNNNN################################################################ ; ; BIOS FUNCTION TABLE ; ;################################fNNNNNNNNNNNNNNNN"NNNNNNNNNNNNNNNNNNNNNNETCHED FROM TABLE JP (HL) ; ; DRIVER RETURNS HERE ; DKOPRET: POP IY ; ; IF NO ERRORS THEN RETURN ZF ; RET Z ;r`NNNNNNNNNNNNNNNN" FWNNNNNNNNNNNNNNNNNNNNNNB A,'I' ;IF IGNORE THEN RETURN NO ERROR RET Z ; ; ELSE RETURN ERROR TO BDOS ; FDSKER: LD HL,0 ;RETURN DPB_PTR = 0 FOR yNNNNNNNNNNNNNNNN"f+NNNNNNNNNNNNNNNNNNNNN!********* ; TRNONE: LD DE,0 JR SETTR ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; NNNNNNNNNNNNNNNNN"NNNNNNNNNNNNNNNNNNNNNNAL DRIVE ; LD A,(IY + DVRPDRV) ;0,1: DRV 0, 2,3: DRV 1 LD (IOPB + PB_DRVO),A ; ; OFFSET LOGICAL ADDRESS WITH LOGICAL DR[NNNNNNNNNNNNNNNN"#FNNNNNNNNNNNNNNNNNNNNNNNK LD E,A ;PRESET IOPB BANK LD (IOPB + PB_DMAXO),A ; ; EXECUTE THE PRIMITIVE IN ROM ; LD HL,IOPB ;BANKED COMPATABILENNNNNNNNNNNNNNNNN"$NNNNNNNNNNNNNNNNNNNNN!EN EXECUTE IOPB ; LD A,(IY + DVRHDS) DEC A JP Z,XPRIM ; ; ELSE SELECT SIDE FROM TRACK BIT 0 ; LD HL,(IOPB + PB_TRKDJNNNNNNNNNNNNNNNNN"*NNNNNNNNNNNNNNNNNNNNN!+++++++++++ ; ; FUNCTION DISPATCHER ; ENTRY- C= FUNCTION # ; EXIT - A= -1: ERROR, 0: OK ; ;+++++++++++++++++++++++++++++++\ $NNNNNNNNNNNNNNNNN"0NNNNNNNNNNNNNNNNNNNNNN############################################ ; BFUNTBL: DW RETVERS ;0:RETURN VERSION # DW RETDVRTF ;1:RETURN DISK PHYSICANNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNŃg5Ѕm; ׉sAۍxF㑱M蕵QY&^,Ƣa/˦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN";NNNNNNNNNNNNNNNNNNNNNNL CONFIGURATION TABLE PTR DW EXIOPB ;2:EXECUTE THE IOPB MAXFUNCS EQU ($ - BFUNTBL) / 2 ;+++++++++++++++++++++++++++++++(ANNNNNNNNNNNNNNNNN"NNNNNNNNNNNNNNNNNNNNNNSTART AT 1ST TABLE ; ; IF DRIVE == 0 THEN ALREADY THERE ; LD A,C OR A,A RET Z ; ; ELSE IF ILLEGAL DRIVE THEN RETUONNNNNNNNNNNNNNNN" BVNNNNNNNNNNNNNNNNNNNNNNCTION # (DISK FUNCTION) CALL XMROM ;EXECUTE MONITOR FUNCTION POP HL ; OR A,A ;FUNCTION ERROR? RET NZ ; ; FETCH & 5NNNNNNNNNNNNNNNN"b*NNNNNNNNNNNNNNNNNNNNNN*************************************** ; PRHEX: LD C,A LD A,MF_PHXB JP XMROM ;************************************7rNNNNNNNNNNNNNNNN"NNNNNNNNNNNNNNNNNNNNNN<= 40 THEN OK ; BDOSV EQU $ + 1 JP C,BDOS + 11H ;THIS ADDR MODIFIED BY WARM BOOT RTN ; ; THE FOLLOWING CONDITIONAL JUMP INNNNNNNNNNNNNNNNN"'GNNNNNNNNNNNNNNNNNNNNNNOUTPUT NEW LINE ; CALL CRLF ; ; RETURN NULLS ; XOR A,A ;BC = HL = A = 0 LD L,A LD H,A LD C,A LD B,A RET ǥNNNNNNNNNNNNNNNN"%NNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++ ; ; RETURN TIME FUNCTION 92H ; EXIT - A= SECONDS ; B= MINUTES ; C= HOURS ; ;++++++++(YNNNNNNNNNNNNNNNNNN"+NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN CONSOLE STATUS ; EXIT - A= 0: NOT READY ; FFH: CHBNNNNNNNNNNNNNNNN"RhNNNNNNNNNNNNNNNNNNNNN!+++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN BIOS VERSION # ; EXIT - HL= VERSION # IN BINARY {0.00,..655.35} ; NNNNNNNNNNNNNNNNN"NNNNNNNNNNNNNNNNNNNNNNRN ERROR ; CP A,NDRVS JR C,RETDV2 ; OR A,A RET ; ; ; ELSE COMPUTE TABLE PTR ; RETDV2: LD B,C LD DE,DVRSIZ ; NNNNNNNNNNNNNNNN"NNNNNNNNNNNNNNNNNNNNNNRETURN RESULT STATUS ; LD A,PB_STATO ;FETCH STATUS ADD A,L LD L,A LD A,0 ADC A,H LD H,A LD A,(HL) ; OR A,A ;T3NNNNNNNNNNNNNNNN"NNNNNNNNNNNNNNNNNNNNNN*************************************** ; ; NEWLINE PROCEDURE ; ;***********************************************************,NNNNNNNNNNNNNNNN"زNNNNNNNNNNNNNNNNNNNNNNS MODIFIED TO AN UNCONDITIONAL JUMP BY ; THE WARM BOOT ROUTINE IF THE CLOCK/CALENDAR BOARD IS NOT PRESENT ; IF NOT MODIFIED,*NNNNNNNNNNNNNNNNN" 2NNNNNNNNNNNNNNNNNNNNNN ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; CDOS RETURN VERSION FUNCTION ; MAKES CLO#eNNNNNNNNNNNNNNNNNN"&JNNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; CLKTIM: LD A,MF_GTIM JP XMROM ENDIF ;+++++o NNNNNNNNNNNNNNNN",wNNNNNNNNNNNNNNNNNNNNN!AR READY ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; CNSCK: LD A,MF_CIS JP XMROM xNNNNNNNNNNNNNNNN"aYNNNNNNNNNNNNNNNNNNNNNN;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; RETVERS: LD HL,VERSN XOR A,A ;RETURN NO E~NNNNNNNNNNNNNNNNN" NNNNNNNNNNNNNNNNNNNNNN RETDVL: ADD HL,DE DJNZ RETDVL ; PUSH HL CALL GETBNK LD E,A POP HL ; ; RETURN NO ERROR ; XOR A,A RET ;+HNNNNNNNNNNNNNNNNN"$4NNNNNNNNNNNNNNNNNNNNN!EST RESULT FOR RETURN RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; GET BANK NUyNNNNNNNNNNNNNNNN"ȌNNNNNNNNNNNNNNNNNNNNNN**************** ; CRLF: LD C,CR CALL COC LD C,LF JP COC IF INTCPTS SUBTTL ADDITIONAL FUNCTIONS TO SUPPORT CDOS\NNNNNNNNNNNNNNNNNN"NNNNNNNNNNNNNNNNNNNNN! THEN IT IS ALLWAYS FALSE (NOP). ; INHCLK: JR C,ILLEGC ; ; NOW CHECK FOR EXTENDED CALLS ; CP A,8DH ;IF RETURN VERSION T,NNNNNNNNNNNNNNNNNN"!NNNNNNNNNNNNNNNNNNNNNNCK/CALENDAR WORK. ; EXIT - B= 1 ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; RETCVER: NNNNNNNNNNNNNNNNNN"'{NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; MONITOR ROM EXECUTER ; ENTRY- A= FUNCTION # ; ;NNNNNNNNNNNNNNNN"-DNNNNNNNNNNNNNNNNNNNNNN ;**************************************************************************** ; ; CONSOLE OUTPUT ; ENTRY- C= CHAR TO OUTP'r9NNNNNNNNNNNNNNNN"NNNNNNNNNNNNNNNNNNNNNNRROR RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN DRIVER TABLE PTR FUN NNNNNNNNNNNNNNNN" NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EXECUTE IOPB FUNCTION ; ENTRY- HL= IOPB PTR $ NNNNNNNNNNNNNNNNN"7yNNNNNNNNNNNNNNNNNNNNNNMBER FUNCTION ; EXIT - A= BANK # ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; GETBNK: #NNNNNNNNNNNNNNNN"NNNNNNNNNNNNNNNNNNNNNN PROGRAMS ;*************************************************************************** ; ; SYSTEM CALL INTERCEPT ROUTINE CHEC#oNNNNNNNNNNNNNNNNN"rNNNNNNNNNNNNNNNNNNNNNNHEN RETURN IT JR Z,RETCVER ; CP A,90H ;IF NOT CLOCK THEN ERR JR C,ILLEGC ; JR Z,CLKCAL ;IF CALENDAR THEN GET IT ; ;NNNNNNNNNNNNNNNN""TNNNNNNNNNNNNNNNNNNNNNN LD B,1 RET SUBTTL CLOCK ROUTINES ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; REdNNNNNNNNNNNNNNNNN"(ENNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; XMROM: EQU MR_FUN SUBTTL CHAR I/O ROUTINESNNNNNNNNNNNNNNNNN".NNNNNNNNNNNNNNNNNNNNNNUT ; ;**************************************************************************** ; COC: LD A,MF_CO JP XMROM ;++++S'HNNNNNNNNNNNNNNNNN"NNNNNNNNNNNNNNNNNNNNNNCTION ; ENTRY- E= DRIVE # ; EXIT - E:HL= DRIVER TABLE BASE PTR ; A, C= 0 ; B= ? ; ;+++++++++++++++++++++++++++++++++++++HNNNNNNNNNNNNNNNNN" NNNNNNNNNNNNNNNNNNNNNN; EXIT - A= 0: OK ; HL= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; EXIOPB: ; ; QNNNNNNNNNNNNNNNNN"HNNNNNNNNNNNNNNNNNNNNNN LD A,MF_GBNK JP MR_FUN SUBTTL NON-DISK PROCEDURES ;*****************************************************************{NNNNNNNNNNNNNNNN"NNNNNNNNNNNNNNNNNNNNNNKS FOR ILLEGAL BDOS CALLS & ; PRINTS MESSAGE IF ILLEGAL. ALSO IMPLEMENTS CDOS CLOCK/CALENDAR ; SYSTEM CALLS FOR ASMB. ; ;*iNNNNNNNNNNNNNNNN"A%NNNNNNNNNNNNNNNNNNNNNNCP A,92H JR Z,CLKTIM ;IF TIME THEN GET IT ; ; ILLEGAL SYSTEM CALL ; ILLEGC: PUSH BC ;SAVE FUNCTION # ; ; OUTPUT WARNQBNNNNNNNNNNNNNNNN"#gNNNNNNNNNNNNNNNNNNNNNNTURN CALENDAR FUNCTION 90H ; EXIT - A= DAY ; B= MONTH ; C= YEAR ; L= DAY OF WEEK ; ;+++++++++++++++++++++++++++++++++++=NNNNNNNNNNNNNNNNN")tNNNNNNNNNNNNNNNNNNNNNNS ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; CONSOLE INPUT ; EXIT - A= CHAR ; ;++++(INNNNNNNNNNNNNNNNN"/"NNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; READER DRIVER - DUMMY ; EXIT - A= CTRL-Z ; ;++?NNNNNNNNNNNNNNNN"NNNNNNNNNNNNNNNNNNNNN!+++++++++++++++++++++++++++++++++++++++ ; ; BIOS CALL ENTRY (E= DRIVE #) ; RETDVRTF: LD C,E ; RETDVRT: LD HL,DVR0 ;NNNNNNNNNNNNNNNN" qgNNNNNNNNNNNNNNNNNNNNNN SET UP FOR CALL ; PUSH HL ;SAVE PTR ; CALL GETBNK ;E= IOPB PTR IS IN THIS BANK LD E,A ; LD A,MF_XIOB ;MONITOR FUNNNNNNNNNNNNNNNNN"QNNNNNNNNNNNNNNNNNNNNNN*********** ; ; OUTPUT HEX DATA TO CONSOLE SUBR ; ENTRY- A= DATA ; EXIT - A, C= ? ; ;*************************************_mNNNNNNNNNNNNNNNNN"NNNNNNNNNNNNNNNNNNNNNN************************************************************************** INTCPT: LD A,C ;CHECK CALL VALIDITY CP A,41 ;IF BNNNNNNNNNNNNNNNN"vNNNNNNNNNNNNNNNNNNNNN!ING MESSAGE ; LD HL,ISCMSG ;OUTPUT WARNING CALL EDITOR ; ; OUTPUT FUNCTION # ; POP HL LD A,L CALL PRHEX ; ; #NNNNNNNNNNNNNNNNN"$(NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++ ; CLKCAL: LD A,MF_GCAL JP XMROM ;++++++++++++++++++++++++++++++++++++++++++McNNNNNNNNNNNNNNNN"*'NNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; CI: LD A,MF_CI JP XMROM ;+++++++++++++++++μNNNNNNNNNNNNNNNNN"01NNNNNNNNNNNNNNNNNNNNN!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; READER: LD A,CTRLZ ;FAKE EOF ; ; FALL INTO P NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNρi7Ӆm< ؉tBݍ{H㑱~L畴P홻W$򝿞[(¢]+ƦNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN#FNNNNNNNNNNNNNNNNNNNNN!UNCH RETURN ; ;**************************************************************************** ; ; PUNCH DRIVER ; ENTRY- C NNNNNNNNNNNNNNNNN#NNNNNNNNNNNNNNNNNNNNN!******************************************************************** ; ; MESSAGE EDITOR ; ENTRY- HL= TEXT PTR (BIT 7= 1: TERMqrNNNNNNNNNNNNNNNN# NNNNNNNNNNNNNNNNNNNNNN########## ; IOPB: REPT PB_SIZE LIST OFF DB 0 LIST ON ENDM ;#####################################################1yNNNNNNNNNNNNNNNN##NNNNNNNNNNNNNNNNNNNNN!RS DVRHDS DS 1 ;HEADS ; ; DEFINE THE STRUCTURE SIZE ; DVRSIZ DS 0 ENDM ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@!NNNNNNNNNNNNNNNN#eNNNNNNNNNNNNNNNNNNNNNNSECTORS, SIZE DB #SD,#ZD ;DATA TRKS SECTORS, SIZE DB #DT ;DISK TYPE DW #CY ;CYLS DB #HD ;HEADS ; LIST OFF ENDM NNNNNNNNNNNNNNNNN#fNNNNNNNNNNNNNNNNNNNNNN1,32,1,10H,256,4 DVR5: ;F ALLDRV HDEXEC,5,60H,32,1,32,1,32,1,10H,256,4 ENDIF LIST ON ;############################HNNNNNNNNNNNNNNNN#%NNNNNNNNNNNNNNNNNNNNNNNULL MASK DW 242 ;DISK SIZE -1 DW 63 ;DIRECTORY MAX DB 11000000B ;ALLOC 0 DB 0 ;ALLOC 1 DW 16 ;CHECK SIZE DW 2 NNNNNNNNNNNNNNNN#+NNNNNNNNNNNNNNNNNNNNNN15 ;DISK SIZE (CLUSTERS -1) (DSM) DW 1152 / 2 ;DIRECTORY MAX (DRM) DB 0FFH ;ALLOCATION 0 (AL0) DB 10000000B ;ALLOCAT5NNNNNNNNNNNNNNNN#NNNNNNNNNNNNNNNNNNNNNN= CHAR TO OUTPUT ; ;**************************************************************************** ; PUNCH: RET ;********NNNNNNNNNNNNNNNNN#'NNNNNNNNNNNNNNNNNNNNNNINATOR) ; EXIT - REGS= ? ; ;**************************************************************************** ; EDITOR: CALL GHNNNNNNNNNNNNNNNN#VNNNNNNNNNNNNNNNNNNNNNN####################### ; ; DISK DRIVER TABLES ; ;##########################################################################UNNNNNNNNNNNNNNNN#9NNNNNNNNNNNNNNNNNNNNNN@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; MACRO TO DEFINE THE DRIVER TABLE RECORD ; ENTRY- #DADD= DRIVER ADDRESS ; #PD= PHYSICͪNNNNNNNNNNNNNNNN#6NNNNNNNNNNNNNNNNNNNNNN IF BOOT = 10H DVR0: ;A ALLDRV HDEXEC,4,60H,32,1,32,1,32,1,10H,256,4 DVR1: ;B ALLDRV HDEXEC,4,60H,32,1,32,1,32,1,10H, NNNNNNNNNNNNNNNNN# shNNNNNNNNNNNNNNNNNNNNNN################################################ ; ; MESSAGES ; ;#########################################################NNNNNNNNNNNNNNNNN#&NNNNNNNNNNNNNNNNNNNNNN;TRACK OFFSET DB 0 ;PHYSICAL RECORD SHIFT FACTOR DB 0 ;PHYSICAL RECORD MASK DW 0 ;LOGICAL DRIVE SECTOR OFFSET ; ; DNNNNNNNNNNNNNNNN#,6NNNNNNNNNNNNNNNNNNNNN!ION 1 (AL1) DW 0 ;CHECK SIZE (CKS) DW 2 ;TRACK OFFSET (OFF) DB 1 ;PHYSICAL RECORD SHIFT FACTOR (PSH) DB 1 ;PHY,NNNNNNNNNNNNNNNN# NNNNNNNNNNNNNNNNNNNNN!******************************************************************** ; ; PRINTER DRIVER ; ENTRY- C= CHAR TO OUTPUT ; ;*****fKNNNNNNNNNNNNNNNNN# NNNNNNNNNNNNNNNNNNNNNNETBNK LD E,A LD A,MF_PUTS JP XMROM SUBTTL INITIALIZED DATA ;#######################################################NNNNNNNNNNNNNNNNN#eNNNNNNNNNNNNNNNNNNNNN!## ; STRUCT 0 DVRADD DS 2 ;START ADDRESS OF DISK DRIVER DVRFG DS 1 ;FLAGS (BIT 0= 1: INHIBIT LOGON) DVRPDRV DS 1 ;PHYSICALQHNNNNNNNNNNNNNNNN#NNNNNNNNNNNNNNNNNNNNNNAL DRIVE # ; #FG= DRIVE FLAGS (IDFLGO) ; #S0= TRK 0 SPT ; #Z0= TRK 0 SIZE ; #S1= TRK 1 SPT ; #Z1= TRK 1 SIZE ; #SD= BNNNNNNNNNNNNNNNN#NNNNNNNNNNNNNNNNNNNNN!256,4 DVR2: ;C ALLDRV HDEXEC,5,60H,32,1,32,1,32,1,10H,256,4 DVR3: ;D ALLDRV HDEXEC,5,60H,32,1,32,1,32,1,10H,256,4 DVR4: ;k!NNNNNNNNNNNNNNNN#!@YNNNNNNNNNNNNNNNNNNNNNN################### ; MSGLE: DM CR,LF,'LOAD ERROR' ; DSKEB: DM CR,LF,'Abort, Ignore, Retry, (BDOS) - ' ; IF INTCPTS ISoNNNNNNNNNNNNNNNNN#'NNNNNNNNNNNNNNNNNNNNN!EFAULT DISK PHYSICAL PARAMETERS ; DB 0 ;FLAGS DB 26,0,26,0,26,0 ;SECTORS PER TRACK, SECTOR SIZE (128) DB 0 ;TYPE DW 73INNNNNNNNNNNNNNNN#-4NNNNNNNNNNNNNNNNNNNNNNSICAL RECORD MASK (PRM) DW 0 ;LOGICAL DRIVE SECTOR OFFSET (SOF) ; ; ; DB 01100000B ;FLAGS 256 BPS, HARD, SSSD DB 32,1NNNNNNNNNNNNNNNN#JNNNNNNNNNNNNNNNNNNNNN!*********************************************************************** ; LO: LD A,MF_LO JP XMROM ;++++++++++++++++++(NNNNNNNNNNNNNNNN# ENNNNNNNNNNNNNNNNNNNNNN##################### ; ; 3740 SECTOR TRANSLATION TABLE ; **** CP/M SINGLE DENSITY **** ; ;################################dNNNNNNNNNNNNNNNNN#vNNNNNNNNNNNNNNNNNNNNNN DRIVE # ; ; THE FOLLOWING MAY BE BROUGHT OFF DISK DESCRIPTOR OR FROM DEFAULT TABLES ; DVRFLG DS 1 ;DISK FLAGS DVR0SPT DS8oNNNNNNNNNNNNNNNN#[NNNNNNNNNNNNNNNNNNNNNNDATA TRKS SPT ; #ZD= DATA TRKS SIZE ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ALLD9NNNNNNNNNNNNNNNNN#3NNNNNNNNNNNNNNNNNNNNNNE ALLDRV FD8EXEC,0,0,26,0,26,0,26,0,0,77,1 DVR5: ;F ALLDRV FD8EXEC,1,0,26,0,26,0,26,0,0,77,1 ENDIF IF BOOT = 3 DVRPrNNNNNNNNNNNNNNNN#" NNNNNNNNNNNNNNNNNNNNNNCMSG: DM CR,LF,'ILL SYS CALL, #= ' ENDIF ;############################################################################ PNNNNNNNNNNNNNNNNN#(NNNNNNNNNNNNNNNNNNNNNN7 ;CYLS DB 1 ;HEADS ;############################################################################ ; ; DEFAULT 8" HARDNNNNNNNNNNNNNNNN#.PgNNNNNNNNNNNNNNNNNNNNNN,32,1,32,1 ;32 SPT, 256 BPS DB 10H ;TYPE DW 256 ;CYLS DB 4 ;HEADS ;###############################################GBNNNNNNNNNNNNNNNNN#{NNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN LIST DEVICE STATUS ; EXIT - A= 0: BUSY, FFH:READY ; ;HNNNNNNNNNNNNNNNNN# tNNNNNNNNNNNNNNNNNNNNNN############################################ ; SDTRAN: GXLATE 26,6 ;#####################################################NNNNNNNNNNNNNNNNN#ENNNNNNNNNNNNNNNNNNNNNN 1 ;TRK 0 SECTORS PER TRK DVR0SZ DS 1 ;TRK 0 SECTOR SIZE DVR1SPT DS 1 ;TRK 1 SECTORS PER TRK DVR1SZ DS 1 ;TRK 1 SECTOR SIZE dNNNNNNNNNNNNNNNN#jNNNNNNNNNNNNNNNNNNNNNNRV MACRO #DADD,#PD,#FG,#S0,#Z0,#S1,#Z1,#SD,#ZD,#DT,#CY,#HD LIST ON DW #DADD ;DRIVER EXECUTION ADDR DB 0 ;LOGON INHIBIT FNNNNNNNNNNNNNNNN#NNNNNNNNNNNNNNNNNNNNN!0: ;A ALLDRV FD8EXEC,0,0,26,0,26,0,26,0,0,77,1 DVR1: ;B ALLDRV FD8EXEC,1,0,26,0,26,0,26,0,0,77,1 DVR2: ;C ALLDRV HDEXEC,9cBNNNNNNNNNNNNNNNN##&;NNNNNNNNNNNNNNNNNNNNNN ; ; DEFAULT 8" FLOPPY DISK PARAMETER BLOCK ; IBM 3740 SINGLE DENSITY FORMAT ; ;############################################SNNNNNNNNNNNNNNNNN#)NNNNNNNNNNNNNNNNNNNNN! DISK PARAMETER BLOCK ; ;############################################################################ ; HDPBK: DW 128 ;SECTINNNNNNNNNNNNNNNNN#/cVNNNNNNNNNNNNNNNNNNNNNN############################# ; ; DRIVE PARAMETER HEADER AREA ; 1 PER DRIVE ; ;############################################CNNNNNNNNNNNNNNNN#(NNNNNNNNNNNNNNNNNNNNN!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; LISTST: LD A,MF_LOS JP XMROM ;********qBNNNNNNNNNNNNNNNN# 0NNNNNNNNNNNNNNNNNNNNN!####################### ; ; COMMON I/O PARAMETER BLOCK ; ;##################################################################lfBNNNNNNNNNNNNNNNN#NNNNNNNNNNNNNNNNNNNNNNDVRDSPT DS 1 ;DATA TRKS SECTORS PER TRK DVRDSZ DS 1 ;DATA TRKS SECTOR SIZE DVRDTYP DS 1 ;DISK TYPE DVRCYLS DS 2 ;DISK CYLINDETNNNNNNNNNNNNNNNNN#TNNNNNNNNNNNNNNNNNNNNNNLAG (LOGON ENABLED) DB #PD ;MONITOR PHYSICAL DRIVE # DB #FG ;DISK FLAGS DB #S0,#Z0 ;T0 SECTORS, SIZE DB #S1,#Z1 ;T1 NNNNNNNNNNNNNNNN#UNNNNNNNNNNNNNNNNNNNNNN4,60H,32,1,32,1,32,1,10H,256,4 DVR3: ;D ALLDRV HDEXEC,4,60H,32,1,32,1,32,1,10H,256,4 DVR4: ;E ALLDRV HDEXEC,5,60H,32,1,32,vNNNNNNNNNNNNNNNNNN#$NNNNNNNNNNNNNNNNNNNNNN################################ ; SD8PBK: DW 26 ;SECTORS PER TRACK DB 3 ;BLOCK SHIFT FACTOR DB 7 ;BLOCK MASK DB 0 ;*NNNNNNNNNNNNNNNN#*NNNNNNNNNNNNNNNNNNNNNNORS PER TRACK (LOGICAL) (SPT) DB 5 ;BLOCK SHIFT FACTOR (BSH) DB 31 ;BLOCK MASK (BLM) DB 1 ;NULL MASK (EXM) DW 10NNNNNNNNNNNNNNNNN#0pNNNNNNNNNNNNNNNNNNNNNN################################ ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; GENERATm>NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNŃg5Ѕk9ԉo= ٍuBߑ|J敳NꙹU"𝽞Z)Ģ_-ɦNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN#qNNNNNNNNNNNNNNNNNNNNN!E A DISK PARAMETER TABLE MACRO ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ALLDPH: MACNNNNNNNNNNNNNNNNN#)NNNNNNNNNNNNNNNNNNNNNND EQU $ SUBTTL UNINITIALIZED DATA AREA ;############################################################################ ; ; NNNNNNNNNNNNNNNN# 4NNNNNNNNNNNNNNNNNNNNNN EXECUTION ADDRESS SECOFF DS 2 ;LOGICAL DRIVE SECTOR OFFSET (ADD TO SECTOR) ;#############################################ϸBNNNNNNNNNNNNNNNN#NNNNNNNNNNNNNNNNNNNNNND)CHK DS 32 ;DIRECTORY CHECKSUMS STORAGE (1 BYTE PER SECTOR) ENDIF LIST OFF ENDM ; ; RESERVE THE DATA SPACE ; DfrNNNNNNNNNNNNNNNN#UNNNNNNNNNNNNNNNNNNNNN!K= 3, 16K= 7 DPBDSM DS 2 ;DSM- DRIVE STORAGE SIZE (IN CLUSTERS) ; INT(((#_TRACKS - OFF) * SPT * BYTES PER SECTOR) / CLUSTER NNNNNNNNNNNNNNNNN#QNNNNNNNNNNNNNNNNNNNNN!ENTED THRU BDOS USING DPBOFF ABOVE. ; PARTITIONING BY HEADS ARE IMPLIMENTED BY USING THE FOLLOWING DATA. ; (HEAD BITS ARE ININNNNNNNNNNNNNNNN#%NNNNNNNNNNNNNNNNNNNNNNTOO BIG, USE MOVCPM & RE-ADJUST! **** ENDIF END aNNNNNNNNNNNNNNNN#+NNNNNNNNNNNNNNNNNNNNNNERRUPT ; ;---------------------------------------------------------------------------- ; ITRAP: ; ; SAVE REGS FIRST ; {NNNNNNNNNNNNNNNNN#$NNNNNNNNNNNNNNNNNNNNNNRO #D LIST ON D#D(DD)DPH: ;DRIVE PARAMETER HEADER FOR DRIVE #D(DD) DW 0 ;;SECTOR TRAN TBL (OR 0 IF NO XLATE) DW 0 ;;S|NNNNNNNNNNNNNNNNN#NNNNNNNNNNNNNNNNNNNNN! THE FOLLOWING DATA MUST RESIDE IN THIS ORDER TO MATCH THE IOPB DATA ; ;#####################################################MNNNNNNNNNNNNNNNN#aNNNNNNNNNNNNNNNNNNNNNN############################### ; ; DRIVE ALLOCATION AREAS ; ;############################################################rNNNNNNNNNNNNNNNN# NNNNNNNNNNNNNNNNNNNNNND DL 1 REPT NDRVS LIST OFF ALLDAL 0123456789ABCDEF DD DL DD + 1 LIST ON ENDM ;##################################VrNNNNNNNNNNNNNNNN#NNNNNNNNNNNNNNNNNNNNNNSIZE) -1 DPBDRM DS 2 ;DRM- DIRECTORY SIZE -1 DPBAL0 DS 2 ;AL0,1- DIRECTORY ALLOCATION ; 1 MSB PER DIRECTORY CLUSTER ALLOCAeNNNNNNNNNNNNNNNNN# DXNNNNNNNNNNNNNNNNNNNNNNCLUDED IN SECTOR WORD UPPER BITS) ; DPBSOF DS 2 ;SOF- SECTOR OFFSET (FOR LOGICAL DRIVE) ; 0: NONE, 1..65535: OFFSET DPBSZ.MNNNNNNNNNNNNNNNNN#&NNNNNNNNNNNNNNNNNNNNNN++++++++++++++++ ; ; RETURN LIST DEVICE STATUS ; EXIT - A= 0: BUSY, FFH:READY ; ;++++++++++++++++++++++++++++++++++++++++++NNNNNNNNNNNNNNNNNN#,5NNNNNNNNNNNNNNNNNNNNN! PUSH AF PUSH HL PUSH BC PUSH DE ; ; SAVE CURRENT ROM & GET MONITOR ROM ; IN A,(M2_RSEL) LD (ROMSAV),A LD A,MR_sNNNNNNNNNNNNNNNN#NNNNNNNNNNNNNNNNNNNNNNCRATCH AREA DW 0 ;;" DW 0 ;;" DW DIRBF ;;DIRECTORY BUFFER PTR DW D#D(DD)DPB ;;DRIVE PARAMETER BLK PTR IF ((DD - 1NNNNNNNNNNNNNNNNNN# &NNNNNNNNNNNNNNNNNNNNN!####################### ; BTDRV: DS 1 ;DRIVE # BTTRK DS 2 ;TRACK # BTSEC DS 2 ;SECTOR # BTFLG DS 1 ;RESERVED FOR FLAGS BTD:CNNNNNNNNNNNNNNNNNN#RNNNNNNNNNNNNNNNNNNNNN!################ ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; MACRO TO DEFINE THE DRIm0 NNNNNNNNNNNNNNNN#8NNNNNNNNNNNNNNNNNNNNNN########################################## ; ; RESERVE DRIVE PARAMETER BLOCKS ; ;#########################################wBNNNNNNNNNNNNNNNN#7NNNNNNNNNNNNNNNNNNNNNNTED DPBCKS DS 2 ;CKS- # DIRECTORY SECTORS CHECKED ; (DRM +1) / 4 DPBOFF DS 2 ;OFF- # RESERVED TRACKS (USUALLY 2) ; ; A jNNNNNNNNNNNNNNNNN#!wiNNNNNNNNNNNNNNNNNNNNNN DS 0 ENDM ; ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; GENERATE THE DPB FOR DRINNNNNNNNNNNNNNNNN#'NNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++ ; LISTST: LD A,MF_LOS JR XMROM ;**************************************************NNNNNNNNNNNNNNNNN#-2NNNNNNNNNNNNNNNNNNNNN!RNUM OUT (M2_RSEL),A ; ; PRINT PROMPT ; LD HL,ITMSG IQCONT: LD A,MF_PUTS CALL MR_FUN ; LD HL,IQMSG ;QUERY USER !%NNNNNNNNNNNNNNNNN#zNNNNNNNNNNNNNNNNNNNNNN) <= NDHD) AND ((DD - 1) >= STHD) DW 0 ;;NO CHECKS ON HARD DISK ELSE DW D#D(DD)CHK ;;DRIVE DISK CHECKSUMS ARRAY PTR NBNNNNNNNNNNNNNNNN# uNNNNNNNNNNNNNNNNNNNNNNMA DS 2 ;DMA ADDRESS BTDMAX DS 1 ;DMA EXTENDED ADDRESS ;##################################################################}NNNNNNNNNNNNNNNNN#ANNNNNNNNNNNNNNNNNNNNNNVE ALLOCATION & CHECKSUMS AREA ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ALLDAL: MAC^NNNNNNNNNNNNNNNN#kNNNNNNNNNNNNNNNNNNNNNN################################### ; STRUCT 0 DPBSPT DS 2 ;SPT- SECTORS/TRACK DPBBSH DS 1 ;BSH- BLOCK SHIFT FACTOR DETERMI9NNNNNNNNNNNNNNNNN#NNNNNNNNNNNNNNNNNNNNNNDDITIONAL CP/M 3.0 DATA (ALSO COULD BE USED BY CP/M 2.2 DEBLOCKING) ; DPBPSH DS 1 ;PSH- PHYSICAL RECORD SHIFT FACTOR BASED ON xNNNNNNNNNNNNNNNN#"":NNNNNNNNNNNNNNNNNNNNNNVE MACRO ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ALLDPB: MACRO #D LIST ON D#D(DscHNNNNNNNNNNNNNNNNN#(NNNNNNNNNNNNNNNNNNNNNN************************** ; ; MESSAGE EDITOR ; ENTRY- HL= TEXT PTR (BIT 7= 1: TERMINATOR) ; EXIT - REGS= ? ; ;***********NNNNNNNNNNNNNNNNN#.gWNNNNNNNNNNNNNNNNNNNNNN LD A,MF_PUTS CALL MR_FUN ; ; GET & ECHO USER INPUT ; LD A,MF_CI CALL MR_FUN ; PUSH AF LD C,A LD A,MF_CO CAB rNNNNNNNNNNNNNNNNNN#KNNNNNNNNNNNNNNNNNNNNNN ENDIF DW D#D(DD)ALL ;;DRIVE CLUSTER ALLOCATION BIT MAP PTR LIST OFF ENDM ; ; DEFINE THE DATA ; DD DL 1 REPT NDRVSHNNNNNNNNNNNNNNNNN# DNNNNNNNNNNNNNNNNNNNNNN########## ; ; VARIABLES ; ;############################################################################ ; DTPTR: DS 2 ;*INNNNNNNNNNNNNNNNN#rNNNNNNNNNNNNNNNNNNNNNNRO #D LIST ON IF ((DD - 1) >= STHD) AND ((DD - 1) <= NDHD) D#D(DD)ALL: DS 127 ;ALLOCATION BIT MAP FOR 8" HARD DRIVE #D(DD;NNNNNNNNNNNNNNNN#ZNNNNNNNNNNNNNNNNNNNNNNNED BY CLUSTER SIZE ; 1K= 3, 2K= 4, 4K= 5, 8K= 6, 16K= 7 DPBBLM DS 1 ;BLM- BLOCK MASK ; 1K = 7, 2K= 15, 4K= 31, 8K= 63,& NNNNNNNNNNNNNNNN#7NNNNNNNNNNNNNNNNNNNNNNBYTES/SEC ; 0: 128, 1: 256, 2: 512, 3: 1024 DPBPHM DS 1 ;PHM- PHYSICAL RECORD MASK BASED ON BYTES/SEC ; 0: 128, 1: 256,lNNNNNNNNNNNNNNNN## NNNNNNNNNNNNNNNNNNNNNND)DPB: DS DPBSZ ;ALLOCATION FOR DRIVE #D(DD) LIST OFF ENDM ; ; RESERVE THE DATA SPACE ; DD DL 1 REPT NDRVS LIST OiINNNNNNNNNNNNNNNNN#)NNNNNNNNNNNNNNNNNNNNNN***************************************************************** ; EDITOR: CALL GETBNK LD E,A LD A,MF_PUTS JR XMROM &NNNNNNNNNNNNNNNNN#/TfNNNNNNNNNNNNNNNNNNNNN!LL MR_FUN POP AF ; ; IF OPTION IS CTRL-C THEN WARM BOOT ; CP A,3 ;IF CTRL-C THEN WARM BOOT JP Z,PAGE0 ; ; IF OPTjrNNNNNNNNNNNNNNNNN#NNNNNNNNNNNNNNNNNNNNNN LIST OFF ALLDPH 0123456789ABCDEF DD DL DD + 1 LIST ON ENDM ; ; LAST OF INITIALIZED CODE READ FROM DISK ; BIOSN9NNNNNNNNNNNNNNNN# NNNNNNNNNNNNNNNNNNNNNNDRIVE TABLE PTR LOGRQ: DS 1 ;LOG ON REQUEST REG. DVRTPTR DS 2 ;DRIVE DRIVER TABLE BASE ADDRESS PTR DVRXADR DS 2 ;DRIVE DRIVER;BNNNNNNNNNNNNNNNN#'NNNNNNNNNNNNNNNNNNNNNN) ENDIF IF ((DD - 1) >= ST8FD) AND ((DD - 1) <= ND8FD) D#D(DD)ALL: DS 57 ;ALLOCATION BIT MAP FOR 8" DRIVE #D(DD) D#D(DNNNNNNNNNNNNNNNNN#dNNNNNNNNNNNNNNNNNNNNNN 16K= 127 DPBEXM DS 1 ;EXM- EXTENT MASK ; DSM < 256 : 1K= 0, 2K= 1, 4K= 3, 8K= 7, 16K= 15 ; DSM > 255 : 2K= 0, 4K= 1, 8ONNNNNNNNNNNNNNNN#bNNNNNNNNNNNNNNNNNNNNN! 3: 512, 7: 1024 ; ; ADDITIONAL DISK PARTITIONING DATA FOR THE LOGICAL DRIVE SELECTION. ; PARTITIONING BY TRACKS ARE IMPLIM/+NNNNNNNNNNNNNNNNNN#$NNNNNNNNNNNNNNNNNNNNNNFF ALLDPB 0123456789ABCDEF DD DL DD + 1 LIST ON ENDM IF (($ - 8000H) > 07700H) OR ($ < 8000H) CONMSG **** BIOS BNNNNNNNNNNNNNNNN#*NNNNNNNNNNNNNNNNNNNNNN IF INTRPTS SUBTTL INTERRUPTS ;---------------------------------------------------------------------------- ; ; USER INTENNNNNNNNNNNNNNNNNN#0G+NNNNNNNNNNNNNNNNNNNNN!ION IS YES THEN WARM BOOT ; AND A,5FH ;IGNORE CASE ; CP A,'Y' JP Z,PAGE0 ; ; IF OPTION IS INTERRUPT THEN EXECUTE RE{NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNсk8Ӆn< ؉s@ ڍwDߑzG╯~K癶R X&\*Ǧ NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN$NNNNNNNNNNNNNNNNNNNNNN TITLE CUSTOMIZED BIOS FOR M5B LIST NOCOND ;============================================================================ ; ^NNNNNNNNNNNNNNNNN$4NNNNNNNNNNNNNNNNNNNNNN 20H: 5" FLOPPY DEBUG EQU FALSE ;TRUE TO DUMP THE IOPB DATA TO PRINTER FORM ;********************************************/rNNNNNNNNNNNNNNNN$ RNNNNNNNNNNNNNNNNNNNNNNHYSICAL DRIVE 1 ; C SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 0 ; D SIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 0 ; E SIDE 0 & NNNNNNNNNNNNNNNN$rNNNNNNNNNNNNNNNNNNNNNNARGER BIOS ALLOCATION ON THE DISK. ; ; 2.2.4 - ADDED NAKED TERMINAL DRIVERS & IOBYTE IN ; ANTICIPATION OF THE MONITOR. ALNNNNNNNNNNNNNNNN$HNNNNNNNNNNNNNNNNNNNNNN 83 GRH ; Move clock-calendar routines to ROM. Add Interrupt handler ; (Mode 2). Change Revision display of sign-on (separatCNNNNNNNNNNNNNNNNN$7NNNNNNNNNNNNNNNNNNNNN!5 GRH ; Implemented hard disk drive 1 as C: & D:. ; Implemented the Logon function for the hard disk. ; Implemented user fr?rNNNNNNNNNNNNNNNN$%ݰNNNNNNNNNNNNNNNNNNNNN!ON to specify the ID sector & track. At same time, fix bug ; which did not specify the logon track. ; ; 3.02 7 JUL 88 GRH^NNNNNNNNNNNNNNNNN$+NNNNNNNNNNNNNNNNNNNNN!******************************** SUBTTL SYSTEM DECLARATIONS ;============================================================NNNNNNNNNNNNNNNN$BNNNNNNNNNNNNNNNNNNNNNN; ASSEMBLY PARAMETERS ; ;============================================================================ FALSE EQU 0 TRUE EQU N7NNNNNNNNNNNNNNNNN$ NNNNNNNNNNNNNNNNNNNNNN******************************** ; ; CUSTOMIZED BIOS FOR M5B ; (c) 1981 GRH Electronics, CUPERTINO, CA ; ;************QNNNNNNNNNNNNNNNN$NNNNNNNNNNNNNNNNNNNNN!1 OF HARD DISK PHYSICAL DRIVE 1 ; F SIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 1 ENDIF IF BOOT = 20H ; A JADE 5" FLOPPNNNNNNNNNNNNNNNN$NNNNNNNNNNNNNNNNNNNNN!SO, ALL REFERENCES ; REQUIRING THE I/O PROMS TO BOOT HAS BEEN REMOVED. ; ; 2.2.5 - RECONFIGURE FOR 62K SYSTEM. ; ; 2.2.rNNNNNNNNNNNNNNNN$NNNNNNNNNNNNNNNNNNNNNNe CBIOS rev). ; ; 2.00 - 24 MAR 84 GRH ; Modify for hard disk ; ; 2.01 - 28 APR 84 GRH ; Change hard disk DPB to refleNNNNNNNNNNNNNNNNN$ "ENNNNNNNNNNNNNNNNNNNNNNiendly disk error options: Abort, Retry, Ignore. ; Solved warm boot hang problem by reseting host adapter if busy. ; ; 3.00 -h=NNNNNNNNNNNNNNNN$&NNNNNNNNNNNNNNNNNNNNNN ; Add '?' to include file names. ; Change hard disk system tracks directory reference to new format. ; Correct bug in driver9NNNNNNNNNNNNNNNN$,g(NNNNNNNNNNNNNNNNNNNNNN================ ; ; INCLUDE JDDCONT.DEF ; INCLUDE COMIOPB.DEF ; INCLUDE DISKS.DEF ; INCLUDE MONBOARD.DEF ; INCLUDE ZMONRO/NNNNNNNNNNNNNNNN$qNNNNNNNNNNNNNNNNNNNNNNOT FALSE ;============================================================================ ; ; CONDITIONAL ASSEMBLY FLAGS ; ;HNNNNNNNNNNNNNNNNN$ ;NNNNNNNNNNNNNNNNNNNNN!**************************************************************** ; ; CONFIGURATION: ; ; CPM ; DRIVE USAGE IF BOOT = 10HNNNNNNNNNNNNNNNNN$4NNNNNNNNNNNNNNNNNNNNNNY PHYSICAL DRIVE 0 ; B JADE 5" FLOPPY PHYSICAL DRIVE 1 ; C SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 0 ; D SIDE 2 & 3 OF HNNNNNNNNNNNNNNNN$%NNNNNNNNNNNNNNNNNNNNNN6 - 20 FEB 83 ; DOUBLE D REV C UPGRADE. CHANGE BOARD STATUS PORT BITS. ; ; 2.2.7 - 8 MAR 83 GRH ; ADDED CLOCK/CALENDAR DRIVENNNNNNNNNNNNNNNN$*NNNNNNNNNNNNNNNNNNNNNNct half size directory, but keep ; allocation for 1k directory ; ; 2.02 - 2 JUN 84 GRH ; Change floppy disk drivers to relhmNNNNNNNNNNNNNNNN$!tNNNNNNNNNNNNNNNNNNNNNN 26 JAN 87 GRH ; Implemented new common IOPB code & Jade floppy firmware support. ; Implemented disk drive driver tables andNNNNNNNNNNNNNNNNN$'NNNNNNNNNNNNNNNNNNNNNNs which caused retry to fail. (sector remained ; corrupted) ; Stubbed out new Clock routines for present. ; ; 3.03 31 JUL 7NNNNNNNNNNNNNNNN$-TNNNNNNNNNNNNNNNNNNNNNNM.DEF ; INCLUDE DKBTROM.DEF ; INCLUDE NAKEDT.DEF ; INCLUDE ISHA.DEF ; INCLUDE CLOKROM.DEF ; ;=============================ttyNNNNNNNNNNNNNNNN$gNNNNNNNNNNNNNNNNNNNNNN============================================================================ SHORT EQU FALSE ;SHORT BIOS (REMOVES UNESENTIAL CBNNNNNNNNNNNNNNNN$ hNNNNNNNNNNNNNNNNNNNNNN ;HARD DISK BOOT CONFIG. ; A SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 0 ; B SIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 0 ; C9 NNNNNNNNNNNNNNNNN$'NNNNNNNNNNNNNNNNNNNNNNARD DISK PHYSICAL DRIVE 0 ; E SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 1 ; F SIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 1 ; G rNNNNNNNNNNNNNNNN$vNNNNNNNNNNNNNNNNNNNNNNR, SYSTEM CALL INTERCEPT, ; ILLEGAL SYSTEM CALL MESSAGE, CHANGED BIOS SIZE TO END ; OF INITIALIZED DATA AREA. RESTRUCTURE MODU>NNNNNNNNNNNNNNNNN$bNNNNNNNNNNNNNNNNNNNNNNate to ISASI control of JADE ; FDC. ; Change IOPB sector value from physical sector (1..n) to logical ; sector value (0cNNNNNNNNNNNNNNNN$"D'NNNNNNNNNNNNNNNNNNNNN! new function to return ; a ptr to a drive table. ; Removed init of IOBYTE. ; Implemented 5" floppy driver. ; Implemented usNNNNNNNNNNNNNNNNN$(NNNNNNNNNNNNNNNNNNNNNN88 GRH ; Unstub Clock routines. ; ; 3.04 6 AUG 88 GRH ; Remove floppy side select from BIOS & move to controller. ; ImpLNNNNNNNNNNNNNNNNNN$.JNNNNNNNNNNNNNNNNNNNNNN=============================================== LIST OFF *INCLUDE JDDCONT.DEF *INCLUDE COMIOPB.DEF *INCLUDE DISKS.DEF *INCrNNNNNNNNNNNNNNNNN$VNNNNNNNNNNNNNNNNNNNNNNODE) LSTINC EQU FALSE ;LIST INCLUDE FILES USEMON EQU TRUE ;USE MONITOR ROM I/O ROUTINES IF TRUE INTRPTS EQU TRUE ;ENABLE IHNNNNNNNNNNNNNNNNN$ YNNNNNNNNNNNNNNNNNNNNN! SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 1 ; D SIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 1 ; E JADE 8" FLOPPY PHYSICAL DRIVE 0NNNNNNNNNNNNNNNNN$NNNNNNNNNNNNNNNNNNNNNN JADE 8" FLOPPY PHYSICAL DRIVE 0 ; H JADE 8" FLOPPY PHYSICAL DRIVE 1 ENDIF ; ;*****************************************.NNNNNNNNNNNNNNNN$GNNNNNNNNNNNNNNNNNNNNNNLES. ; ; 2.28 - 22 APR 83 GRH ; CHANGED DEFINITIONS TO ALLOW BIG DIRECTORIES. ; DISALLOWED DRIVES C & D. ; ; 2.29 - 3 SEɦNNNNNNNNNNNNNNNN$QNNNNNNNNNNNNNNNNNNNNNN..n-1). This maintains more uniformity in ; parameter passing between hard disk & JADE floppy IOPBs. ; Vector I/O routines {NNNNNNNNNNNNNNNN$#wNNNNNNNNNNNNNNNNNNNNNNse of ROM primitives. ; Moved system down to 60k. ; ; 3.01 26 JUN 88 GRH ; Remove 5" floppy support. Implement in CP/M-86 B7@HNNNNNNNNNNNNNNNNN$)NNNNNNNNNNNNNNNNNNNNNNlement new ID sector format. ; Implement CP/M 3.0 DPB structure in preparation for deblocking. ; ; 3.05 11-3-88 GRH ; ChanNNNNNNNNNNNNNNNNN$/2{NNNNNNNNNNNNNNNNNNNNNNLUDE MONBOARD.DEF *INCLUDE ZMONROM.DEF *INCLUDE DKBTROM.DEF *INCLUDE NAKEDT.DEF *INCLUDE ISHA.DEF *INCLUDE CLOKROM.DEF LINNNNNNNNNNNNNNNN$NNNNNNNNNNNNNNNNNNNNNNNTERRUPT PROCESSING WHISTLE INTCPTS EQU TRUE ;ENABLE SYSTEM CALL INTERCEPT WHISTLE BOOT EQU 3 ;10H: HARD DISK, 3: 8" FLOPPY,NNNNNNNNNNNNNNNNN$ aNNNNNNNNNNNNNNNNNNNNN! ; F JADE 8" FLOPPY PHYSICAL DRIVE 1 ENDIF IF BOOT = 3 ; A JADE 8" FLOPPY PHYSICAL DRIVE 0 ; B JADE 8" FLOPPY PNNNNNNNNNNNNNNNN$ANNNNNNNNNNNNNNNNNNNNNN******************** ; REVISIONS: ; ; 2.2.0 - RELEASE ; ; 2.2.3 - SWAPPED DCM & BIOS SECTORS ON DISK, ALLOWING A ; L NNNNNNNNNNNNNNNNN$yNNNNNNNNNNNNNNNNNNNNNNP 83 GRH ; Changed Rev # for blocked DCM. Enables IBM system 34 ; 256 bytes per sector disks to be read. ; ; 1.10 - 23 SEP(NNNNNNNNNNNNNNNN$NNNNNNNNNNNNNNNNNNNNNNto monitor rom routines. ; ; 2.03 - 4 JUN 84 GRH ; Add bells & whistles again. ; Move to 61k system. ; ; 2.04 - 30 MAR 8m|HNNNNNNNNNNNNNNNNN$$NNNNNNNNNNNNNNNNNNNNN!IOS. ; Change single function to return drive table ptr into a BIOS function ; call using restart instruction. ; Change LOGQNNNNNNNNNNNNNNNNNN$*͎NNNNNNNNNNNNNNNNNNNNNNge included data to update IOPB.PBSTAT to new configuration. ; VERSN EQU 305 ; ;********************************************WNNNNNNNNNNNNNNNNN$0!6NNNNNNNNNNNNNNNNNNNNNNST ON ;============================================================================ ; ; DISK OPERATING SYSTEM ADDRESSES%NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNŃg4υj9ԉo< ׍tAܑwE{H㙱M蝵QV$^NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN$ NNNNNNNNNNNNNNNNNNNNNN ; ;============================================================================ NKSYS: EQU 60 ;SYSTEM SIZE IN K BYTES KBYTYINNNNNNNNNNNNNNNNN$NNNNNNNNNNNNNNNNNNNNN!=============================================== ; ; OTHER DECLARATIONS ; ;==================================================#NNNNNNNNNNNNNNNN$ eNNNNNNNNNNNNNNNNNNNNN! ASCII CHARS ; ;============================================================================ LF: EQU 0AH CR: EQU 0DH CTRLZ:ܓNNNNNNNNNNNNNNNNN$ENNNNNNNNNNNNNNNNNNNNNN@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; INITIALIZE VERSION TEXT IN RAM MACRO ; ;@@@@@@@@@@@@@@@@@@@@@@KNNNNNNNNNNNNNNNN$xNNNNNNNNNNNNNNNNNNNNNNOLE INPUT JP COC ;CONSOLE OUTPUT JP LO ;PRINTER OUTPUT JP PUNCH JP READER JP HOME ;HOME SELECTED DRIVE JP SELDSK 5NNNNNNNNNNNNNNNNN$NNNNNNNNNNNNNNNNNNNNNN################################## BIOSSZ: DW BIOSND - BIOS ;BIOS MODULE SIZE IN BYTES BIOSST: DW BIOS ;BIOS MODULE LOAD ADDRNNNNNNNNNNNNNNNN$%NNNNNNNNNNNNNNNNNNNNN!----------------- INIT: ; ; SET TEMPORARY STACK ; LD SP,DEFBFR ;USE PAGE 0 FOR STACK ; ; MAKE SURE ROM IS ENABLED ;"NNNNNNNNNNNNNNNNN$+ɏNNNNNNNNNNNNNNNNNNNNNNVers ' PVERS VERSN DM CR,LF IF $ > (DIRBF + SECSZ) CONMSG **** WARNING! COLD INIT CODE BIGGER THAN DIR BUFFER ***E*BNNNNNNNNNNNNNNNN$uNNNNNNNNNNNNNNNNNNNNNNE: EQU 1024 CPMSZ: EQU KBYTE * NKSYS CPMBS: EQU CPMSZ - (20 * KBYTE) ; CP/M BIAS VALUE CCP: EQU CPMBS + 3400H ;ADDR OF CCP BrNNNNNNNNNNNNNNNNNN$:NNNNNNNNNNNNNNNNNNNNNN========================== SECSZ: EQU 128 NDRVS: EQU 6 IF BOOT = 10H ; ; 8" HARD DISK BOOT DATA ; STHD EQU 0 ;STARTҡNNNNNNNNNNNNNNNNN$0NNNNNNNNNNNNNNNNNNNNNN EQU 1AH ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; GENERATE THE TRANSLATION TABLE\NNNNNNNNNNNNNNNN$$NNNNNNNNNNNNNNNNNNNNNN@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ PVERS MACRO #VERS DD DL #VERS IF DD > 9999 DB (DD / 10000) + '0' NNNNNNNNNNNNNNNN$+NNNNNNNNNNNNNNNNNNNNNN ;SELECT DISK DRIVE JP SETTRK ;SET TRACK # JP SETSEC ;SET SECTOR # JP SETDMA ;SET TRANSFER ADDR JP DISKRD ;PERFORM D;^NNNNNNNNNNNNNNNNN$ uNNNNNNNNNNNNNNNNNNNNNN FOR SBD ; ; CONTINUE ON WITH INIT ; INIT1: JR INIT ;################################################################٥NNNNNNNNNNNNNNNN$&NNNNNNNNNNNNNNNNNNNNN! CALL GETMON ; ; INIT DEFAULT DRIVE ; LD A,(DK_PROM + 1) ;USE DRIVE # PASSED IN PAGE 0 AND A,3 LD (DEFDRV),A ; ; jrNNNNNNNNNNNNNNNN$,PNNNNNNNNNNNNNNNNNNNNN!* ELSE DS DIRBF+SECSZ-$ ;FILL OUT DIRECTORY BUFFER TO 1 SECTOR SIZE ENDIF ;--------------------------------------7NNNNNNNNNNNNNNNN$FNNNNNNNNNNNNNNNNNNNNNNDOS: EQU CPMBS + 3C00H ;ADDRESS OF BDOS BIOS: EQU CPMBS + 4A00H ;ADDRESS OF BDOS BIOSR: EQU 1000H - BIOS ; ; PAGE 0 LOCATIn HNNNNNNNNNNNNNNNNN$ NNNNNNNNNNNNNNNNNNNNNN LOGICAL DRIVE OF HARD DISK NDHD EQU 3 ;LAST LOGICAL DRIVE OF HARD DISK ST8FD EQU 4 ;START LOGICAL DRIVE OF 8" FLOPPY ND8FDHNNNNNNNNNNNNNNNNN$NNNNNNNNNNNNNNNNNNNNN! MACRO ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ GXLATE MACRO #SECTORS, #SKEW LIST OF"NNNNNNNNNNNNNNNN$NNNNNNNNNNNNNNNNNNNNNN DD DL DD % 10000 ENDIF IF DD > 999 DB (DD / 1000) + '0' DD DL DD % 1000 ENDIF DB (DD / 100) + '0' DB '.' DN6NNNNNNNNNNNNNNNN$NNNNNNNNNNNNNNNNNNNNN!ISK READ JP DISKWR ;PERFORM DISK WRITE JP LISTST ;RETURN LIST STATUS JP SECTRN ;TRANSLATE SECTOR JP BIOFUNC ;EXECUTENNNNNNNNNNNNNNNNN$!&DNNNNNNNNNNNNNNNNNNNNN!############ ; ; DIRECTORY SECTOR BUFFER STARTS HERE AFTER CRUNCHING COLD START ; CODE. THIS BUFFER IS USED BY THE CP/M DIRE:GNNNNNNNNNNNNNNNNN$'NNNNNNNNNNNNNNNNNNNNNN SEND SYSTEM SIGN-ON ; CLOGO: LD HL,MSGSO CALL EDITOR ; ; MODIFY COLD START VECTOR TO WARM START ; LD HL,(BIOS+4) jNNNNNNNNNNNNNNNN$-c)NNNNNNNNNNNNNNNNNNNNNN-------------------- ; ; WARM REBOOT ENTRY LOADS CCP,BDOS FROM DISK & ; SETS UP VARIABLES ; ;------------------------------NNNNNNNNNNNNNNNN$WNNNNNNNNNNNNNNNNNNNNNNONS ; PAGE0: EQU 0 ;START OF CP/M RAM IOBYTE: EQU PAGE0 + 3 ;IOBYTE ADDR DEFDRV: EQU PAGE0 + 4 ;DEFAULT DRIVE PARAM ADDR BÓrNNNNNNNNNNNNNNNN$ XNNNNNNNNNNNNNNNNNNNNNN EQU 5 ;LAST LOGICAL DRIVE OF 8" FLOPPY ENDIF IF BOOT = 3 ; ; 8" FLOPPY BOOT DATA ; STHD EQU 2 ;START LOGICAL DRNNNNNNNNNNNNNNNNN$NNNNNNNNNNNNNNNNNNNNN!F NXTSEC DL 1 ;;START WITH SECTOR 1 LOWEST DL 1 ;; REPT #SECTORS LIST ON DB NXTSEC LIST OFF NXTSEC DL NXTSEC + #SKEBNNNNNNNNNNNNNNNN$FNNNNNNNNNNNNNNNNNNNNN!B ((DD % 100) / 10) + '0' DB (DD % 10) + '0' ENDM SUBTTL BIOS CODE ORG BIOS ;--------------------------------------NNNNNNNNNNNNNNNNN$UNNNNNNNNNNNNNNNNNNNNNN FUNCTION CALL ;############################################################################ ; ; THESE BOOT PARAMS MUST R&NNNNNNNNNNNNNNNN$"sNNNNNNNNNNNNNNNNNNNNNNCTORY CHECK ROUTINES THAT ; CHECK FOR DISK CHANGE. ; ;######################################################################NNNNNNNNNNNNNNNNN$(NNNNNNNNNNNNNNNNNNNNNNLD (BIOS+1),HL ; ; BOOT CCP & BDOS ; JR WARM ;######################################################################NNNNNNNNNNNNNNNN$.6zNNNNNNNNNNNNNNNNNNNNNN---------------------------- WARM: IF INTRPTS ; ; SET INTERRUPT VECTOR TABLE BASE ; LD A,HIGH INTABL LD I,A ; ; HNNNNNNNNNNNNNNNNN$fNNNNNNNNNNNNNNNNNNNNNNDOSJV EQU PAGE0 + 5 ;BDOS SYSTEM CALL ENTRY DEFBFR EQU PAGE0 + 80H ;DEFAULT BUFFER ; ; BIOS FUNCTION CALL RESTART VECTOR ;3NNNNNNNNNNNNNNNNN$ iNNNNNNNNNNNNNNNNNNNNN!IVE OF HARD DISK NDHD EQU 5 ;LAST LOGICAL DRIVE OF HARD DISK ST8FD EQU 0 ;START LOGICAL DRIVE OF 8" FLOPPY ND8FD EQU 1 ;LANNNNNNNNNNNNNNNNN$#NNNNNNNNNNNNNNNNNNNNNNW ;ADD SKEW FACTOR ;; IF NXTSEC > #SECTORS ;CHECK FOR OVERFLOW NXTSEC DL NXTSEC - #SECTORS ;; IF NXTSEC <= LOWEST ;CHZNNNNNNNNNNNNNNNN$wNNNNNNNNNNNNNNNNNNNNN!-------------------------------------- ; ; BIOS JUMP VECTOR TABLE ; ;-----------------------------------------------------NNNNNNNNNNNNNNNN$fNNNNNNNNNNNNNNNNNNNNNNESIDE AS DEFINED RIGHT BEFORE THE COLD INIT ; ROUTINE START AND MUST BE IN THE 1ST SECTOR. THESE 2 WORDS ARE REFERENCED ; BY*QBNNNNNNNNNNNNNNNN$#@&NNNNNNNNNNNNNNNNNNNNN!###### DIRBF: EQU $ ;BUFFER BEGINNING ;---------------------------------------------------------------------------- ; ;NNNNNNNNNNNNNNNNN$)NNNNNNNNNNNNNNNNNNNNN!###### ; ; SIGN-ON MESSAGE ; ;############################################################################ MSGSO: DB CR,LF bllNNNNNNNNNNNNNNNNN$/KNNNNNNNNNNNNNNNNNNNNNN SET INTERRUPT MODE TO 2 ; IM 2 ; ; ENABLE INTERRUPT VECTOR 7 ; IN A,(M2_IMASK) AND A,7FH OUT (M2_IMASK),A ; ; ) NNNNNNNNNNNNNNNN$5NNNNNNNNNNNNNNNNNNNNNN BFUNRST EQU 28H BFUNRSV EQU PAGE0 + BFUNRST BFUNRSI EQU 0C7H + BFUNRST ; TPA: EQU 100H ;=============================BNNNNNNNNNNNNNNNN$ VNNNNNNNNNNNNNNNNNNNNNNST LOGICAL DRIVE OF 8" FLOPPY ENDIF ;============================================================================ ; ;I'NNNNNNNNNNNNNNNNNN$vNNNNNNNNNNNNNNNNNNNNNNECK FOR REPEAT NXTSEC DL LOWEST + 1 LOWEST DL NXTSEC ENDIF ENDIF ;; ENDM LIST ON ENDM ;@@@@@@@@@@@@@@@@@@@ߣNNNNNNNNNNNNNNNNN$INNNNNNNNNNNNNNNNNNNNNN----------------------- JP INIT1 ;COLD START ENTRY JP WARM ;RELOAD CCP/BDOS JP CNSCK ;GET CONSOLE STATUS JP CI ;CONSYBNNNNNNNNNNNNNNNN$3NNNNNNNNNNNNNNNNNNNNNN THE BOOT CODE IN ORDER TO FIND THE LOAD ADDRESS FOR THE BIOS & IT'S ; LENGTH. ; ;##########################################HNNNNNNNNNNNNNNNNN$$ٱNNNNNNNNNNNNNNNNNNNNNN INIT - COLD START ENTRY FROM BOOT MUST SET ALL BIOS PARAMS ; ;-----------------------------------------------------------NNNNNNNNNNNNNNNNN$*NNNNNNNNNNNNNNNNNNNNNN DB CPMSZ / (KBYTE * 10) + '0' DB (CPMSZ MOD (KBYTE * 10)) / KBYTE + '0' DB 'K CP/M-80 Vers 2.2',CR,LF DB 'M5b CBIOS {K$NNNNNNNNNNNNNNNNN$0NNNNNNNNNNNNNNNNNNNNN! FINALLY ENABLE VECTORED INTERRUPTS ; IN A,(M2_STAT) OR A,M2_IEN OUT (M2_STAT),A EI ENDIF ; ; SET TEMPORARY STACwKNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNρk9Յq? ډuB܍yFᑯ|J啲M虶S Y'\+ƦNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN%a&NNNNNNNNNNNNNNNNNNNNN!K ; LD SP,DEFBFR ; ; INSURE MONITOR ROM STILL ENABLED ; CALL GETMON ; IF BOOT = 10H ; TEST ISHA HOST ADAPTER F9? NNNNNNNNNNNNNNNNN%ˀNNNNNNNNNNNNNNNNNNNNNN,(DEFBFR) CP A,86H JR C,WEROR ; ; SET UP TO LOAD CCP/BDOS ; LD HL,(DEFBFR + BD_SBDSS) ;PREFETCH BDOS TRK/SECTOR PUS NNNNNNNNNNNNNNNN% $KNNNNNNNNNNNNNNNNNNNNNN ; ; ELSE DONE READING SYSTEM ; JP WZRPG ; ; ; ELSE SET UP & READ BDOS ; RDBDOS: POP HL ;RESTORE BDOS TRK/SECTOR FNNNNNNNNNNNNNNNN%7NNNNNNNNNNNNNNNNNNNNNNTCPTS ; ; PUT BDOS VECTOR INTO INTERCEPT CODE ; LD HL,(BDOS + 7) LD (BDOSV),HL ; ; NOW PUT INTERCEPT VECTOR INTO BD.6NNNNNNNNNNNNNNNN%NNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ DISKRD: LD A,PB_READC ;SELECT READ OP JP DISKOP ;++HNNNNNNNNNNNNNNNNN%AZNNNNNNNNNNNNNNNNNNNNNNPORTED DRIVE REQUESTED THEN RETURN 0 (ERROR) ; LD A,C CP A,NDRVS RET NC ; ; STORE DRIVE # FOR FUTURE USE ; LD (BTDyNNNNNNNNNNNNNNNN%%NNNNNNNNNNNNNNNNNNNNNNIVE ; LD (DTPTR),HL ;SAVE DRIVE TABLE PTR ; ; ATTEMPT TO READ ID SECTOR ; XOR A,A ;INIT FLAG BYTE UNTIL FIRMWARE REVINNNNNNNNNNNNNNNNNN%+ NNNNNNNNNNNNNNNNNNNNNN ; SEL1: PUSH HL LD HL,(DVRTPTR) LD DE,DVRFLG ADD HL,DE EX DE,HL POP HL LD BC,DVRSIZ - DVRFLG LDIR ; ; RETURN1NNNNNNNNNNNNNNNN%4uNNNNNNNNNNNNNNNNNNNNN!OR A HUNG CONDITION AND CLEAR IF TRUE ; IN A,(ISH_STATUS) ;IF HOST ADAPTER BUSY THEN BIT ISH_BSYB,A JR Z,NTHUNG ; LD A`bNNNNNNNNNNNNNNNNN%۾NNNNNNNNNNNNNNNNNNNNNNH HL ; LD HL,(DEFBFR + BD_SCCPS) ;FETCH CCP TRK/SECTOR LD C,L LD B,0 CALL SETSEC ; LD C,H CALL SETTRK ; LD BC,CNNNNNNNNNNNNNNNN%qNNNNNNNNNNNNNNNNNNNNNNROM DIRECTORY LD C,L LD B,A ;A STILL CONTAINS 0 CALL SETSEC ; LD C,H CALL SETTRK ; JR WREAD ; ; ; WARM BOOT GNNNNNNNNNNNNNNNN%NNNNNNNNNNNNNNNNNNNNNNOS CODE ; LD HL,INTCPT LD (BDOS + 7),HL ; ; INITIALIZE CLOCK VECTORS IF CLOCK INSTALLED ; LD C,CLK_F7 ;TEST FOR BOAR*NNNNNNNNNNNNNNNN%NNNNNNNNNNNNNNNNNNNNN!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; WRITE A DISK SECTOR ; EXIT - A= 0: OK; /0: ERR:dNNNNNNNNNNNNNNNNN% TNNNNNNNNNNNNNNNNNNNNN!RV),A ; ; SAVE LOGON REQUEST FLAG ; LD A,E LD (LOGRQ),A ; ; COMPUTE DISK DRIVER TABLE PTR ; CALL RETDVRT ;DRIVEZNNNNNNNNNNNNNNNN%&WNNNNNNNNNNNNNNNNNNNNNNSED LD (IOPB + PB_ST2O),A ; CALL DISKLOG JP NZ,FDSKER ; ; IF NO ID SECTOR THEN USE DEFAULTS ; LD A,(IOPB + PB_ST2O?r9NNNNNNNNNNNNNNNN%,NNNNNNNNNNNNNNNNNNNNNN DRIVE TABLE PTR ; LD HL,(DTPTR) XOR A,A RET ; ; ; IF NOT HARD DISK THEN GO DO FLOPPY TEST ; LGDEF: LD A,(BTDRV) NNNNNNNNNNNNNNNN%DNNNNNNNNNNNNNNNNNNNNNN,PB_CLRC LD (IOPB + PB_CMDO),A CALL XPRIM ; NTHUNG: ENDIF ; ; LOG ON DRIVE TO INIT TABLES ; LD A,(DK_PROM + 1) qENNNNNNNNNNNNNNNNN% NNNNNNNNNNNNNNNNNNNNNNCP CALL SETDMA ; ; READ CCP/BDOS ; WREAD: CALL DISKRD JR NZ,WEROR ;IF ERROR THEN EXIT ; ; NEXT SECTOR ; LD HL,BڼHNNNNNNNNNNNNNNNNN%B)NNNNNNNNNNNNNNNNNNNNNNERROR, OUTPUT MSG & HALT ; WEROR: LD HL,MSGLE ;OUTPUT ERROR MESSAGE CALL EDITOR HALT ; ; ; BOOT OK, INIT PAGE 0 ; WNNNNNNNNNNNNNNNN%NNNNNNNNNNNNNNNNNNNNNND PRESENT CALL CLK1 ; ; IF CLOCK PRESENT THEN TURN ON CLOCK DRIVE ; OR A,A LD A,38H ;COND. JR (ON) JR NZ,CLKON ; NNNNNNNNNNNNNNNN%NNNNNNNNNNNNNNNNNNNNN!OR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ DISKWR: LD A,PB_WRITC ;SELECT WRITE OP <4NNNNNNNNNNNNNNNNN%!gNNNNNNNNNNNNNNNNNNNNN! IS STILL IN C REGISTER LD (DVRTPTR),HL ; ; PREFETCH DRIVER EXECUTION ADDRESS FROM TABLE ; LD E,(HL) ;STORE ADDRESS ؗNNNNNNNNNNNNNNNNN%'fNNNNNNNNNNNNNNNNNNNNNN) CP A,-2 ;0: NO ID, -1: JADE ID, -2: EXTENDED ID JR NZ,LGDEF ; ; ELSE XFER ID SECTOR DATA TO TABLES ; CALL TRNONE %NNNNNNNNNNNNNNNN%-"NNNNNNNNNNNNNNNNNNNNNN IF STHD <> 0 CP A,STHD JR C,LGCKFD ENDIF CP A,NDHD + 1 JR NC,LGCKFD ; ; ELSE USE HARD DISK DEFAULTS ; CALL5BNNNNNNNNNNNNNNNN%NNNNNNNNNNNNNNNNNNNNNN AND A,3 ;MODULO 4 LD C,A LD E,0 CALL SELDSK LD A,L ;IF ERROR THEN ABORT OR A,H JR Z,WEROR ; ; READ BOOT DIRENNNNNNNNNNNNNNNN% NNNNNNNNNNNNNNNNNNNNNNTSEC INC (HL) ; LD DE,SECSZ ;DMA := DMA + SECTOR SIZE LD HL,(BTDMA) ADD HL,DE LD (BTDMA),HL ; ; IF NOT INTO BDOS odNNNNNNNNNNNNNNNNN%QdNNNNNNNNNNNNNNNNNNNNNNZRPG: ; ; INIT BIOS WARM START IN PAGE 0 ; LD A,0C3H LD HL,BIOS + 3 LD (PAGE0),A LD (PAGE0 + 1),HL ; ; INIT BDONNNNNNNNNNNNNNNN%NNNNNNNNNNNNNNNNNNNNNN ; ELSE TURN OFF CLOCK DRIVE ; LD A,18H ;UNCOND. JR (OFF) (CAUSES JUMP TO ILLEGAL) ; CLKON: LD (INHCLK),A ; ENDIF ;2NNNNNNNNNNNNNNNNN% NNNNNNNNNNNNNNNNNNNNNN JP DISKOP ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; SELECT DRIVE FUNCTION ; LOGNNNNNNNNNNNNNNNN%"2NNNNNNNNNNNNNNNNNNNNNNINC HL LD D,(HL) INC HL LD (DVRXADR),DE ; ; FETCH FLAGS ; LD C,(HL) ; ; COMPUTE DISK PARAMETER TABLE ADDRESS ;NNNNNNNNNNNNNNNNN%(XNNNNNNNNNNNNNNNNNNNNNN;ASSUME NO TRANSLATION ; ; IF HARD DISK OR DOUBLE DENSITY THEN NO TRANSLATION ; LD A,(DEFBFR + ID_FLGO) AND A,[1 SHL DFNNNNNNNNNNNNNNNN%.wNNNNNNNNNNNNNNNNNNNNNN TRNONE ; NO XLATE LD HL,HDPBK ; ; XFER DATA TO TABLES ; SEL2: PUSH HL CALL DPBAD ; USE DEFAULT TABLE POP HL LHNNNNNNNNNNNNNNNNN%NNNNNNNNNNNNNNNNNNNNN!CTORY ; LD BC,DEFBFR ;SET XFER ADDRESS (USE DEFAULT BUFFER) CALL SETDMA ; LD BC,BD_SEC ;SET DIRECTORY SECTOR CALL SE0NNNNNNNNNNNNNNNNN% NNNNNNNNNNNNNNNNNNNNNNTHEN READ NEXT SECTOR ; LD DE,BDOS XOR A,A SBC HL,DE JR C,WREAD ; ; ELSE IF AT BEGINNING OF BDOS THEN SET UP NEW TR4NNNNNNNNNNNNNNNNN%bUNNNNNNNNNNNNNNNNNNNNNNS CALL VECTOR IN PAGE 0 ; LD HL,BDOS + 6 LD (BDOSJV),A LD (BDOSJV + 1),HL ; ; INIT BIOS CALL VECTOR IN PAGE 0 ; LDN"NNNNNNNNNNNNNNNN%NNNNNNNNNNNNNNNNNNNNNN ; PASS DEFAULT DISK TO CCP ; LD A,(DEFDRV) LD C,A JP CCP SUBTTL BIOS DISK FUNCTION ROUTINES ;+++++++++++++++++++NNNNNNNNNNNNNNNN%'8NNNNNNNNNNNNNNNNNNNNNN-ON - SET DISK PARAMETER BLOCK ; ENTRY- C= DRIVE # ; E= 0 IF NEW SELECT ; EXIT - HL= PTR TO DPT OR 0 FOR ERROR ; ;++++++++NNNNNNNNNNNNNNNNNN%#NNNNNNNNNNNNNNNNNNNNNN LD HL,(BTDRV) LD H,0 ADD HL,HL ;DISK # * 16 ADD HL,HL ADD HL,HL ADD HL,HL LD DE,D0DPH ADD HL,DE ; ; IF NOTdNNNNNNNNNNNNNNNNN%)iNNNNNNNNNNNNNNNNNNNNNN_DTDB] OR [1 SHL DF_HARDB] ; ; ELSE SET TRANSLATION ; CALL Z,TR8 ; ; XFER DISK DATA TO DPB ; NOX: CALL DPBAD ;GET)NNNNNNNNNNNNNNNNN%/DNNNNNNNNNNNNNNNNNNNNNND BC,DPBSZ LDIR JR SEL1 ; ; ; USE 8" FLOPPY DEFAULTS ; LGCKFD: CALL TR8 LD HL,SD8PBK JR SEL2 ;**************NNNNNNNNNNNNNNNN%NNNNNNNNNNNNNNNNNNNNNNTSEC ; LD BC,0 ;SET TRACK TO 0 CALL SETTRK ; CALL DISKRD JR NZ,WEROR ; ; CHECK FOR VALID BOOT DIRECTORY ; LD AK9NNNNNNNNNNNNNNNN% zNNNNNNNNNNNNNNNNNNNNNNACK & SECTOR ; JR Z,RDBDOS ; ; ELSE IF NOT AT BIOS THEN READ NEXT SECTOR ; LD DE,BIOS - BDOS SBC HL,DE JP C,WREAD FBNNNNNNNNNNNNNNNN%7NNNNNNNNNNNNNNNNNNNNNN HL,BIOFUNC LD (BFUNRSV),A LD (BFUNRSV + 1),HL ; ; SET DEFAULT SECTOR BUFFER ; LD BC,DEFBFR CALL SETDMA ; IF INNNNNNNNNNNNNNNNNN%NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; READ A DISK SECTOR ; EXIT - A= 0: OK; /0: ERROR ; ;++++++++++NNNNNNNNNNNNNNNNN%rkNNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ SELDSK: ; ; ASSUME ERROR ; LD HL,0 ; ; IF UNSUP'NNNNNNNNNNNNNNNNN%$5NNNNNNNNNNNNNNNNNNNNNN FIRST SELECT OR LOGON INHIBITED THEN RETURN TABLE PTR ; LD A,(LOGRQ) OR A,C CPL AND A,1 RET Z ; ; ELSE LOG ON DRNNNNNNNNNNNNNNNN%*:NNNNNNNNNNNNNNNNNNNNN! ADDR OF DPB LD HL,DEFBFR + ID_SPTO LD BC,DPBSZ LDIR ; ; XFER DISK PHYSICAL DATA TO TABLE ; LD HL,DEFBFR + ID_FLGO IHNNNNNNNNNNNNNNNNN%0WNNNNNNNNNNNNNNNNNNNNNN************************************************************** ; ; HOME DRIVE - TREAT AS SEEK TRK 0 ; EXIT - BC= 0 ; ;***NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNŃf4Ѕk9ԉo< ׍sAݑxFᕮ|I䙳P읹V$񡾢Y(ĦNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN%VNNNNNNNNNNNNNNNNNNNNNN************************************************************************* HOME: LD BC,0 ;*********************************mINNNNNNNNNNNNNNNNN%NNNNNNNNNNNNNNNNNNNNN!****************** SETDMA: LD (BTDMA),BC XOR A,A LD (BTDMAX),A RET ;++++++++++++++++++++++++++++++++++++++++++++++++[NNNNNNNNNNNNNNNN% {NNNNNNNNNNNNNNNNNNNNNN RET SUBTTL DISK SUPPORT ROUTINES ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; LO?NNNNNNNNNNNNNNNN%3NNNNNNNNNNNNNNNNNNNNNNODE ; ENTRY- A= IOPB COMMAND ; EXIT - A= 0: OK; /0: ERROR ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++; rNNNNNNNNNNNNNNNN%NNNNNNNNNNNNNNNNNNNNNNA,(DE) ;FETCH BYTE PUSH DE ;SAVE REGS PUSH BC CALL PRHEX ;OUTPUT ERROR CODE ; LD C,' ' CALL COC ; POP BC ;RESTz$NNNNNNNNNNNNNNNNN%vjNNNNNNNNNNNNNNNNNNNNNNETURN DPB_PTR = 0 FOR SELECT FUNCTION LD A,-1 ;RETURN -1 TO BDOS OR A,A RET ;*************************************** rNNNNNNNNNNNNNNNN%%4NNNNNNNNNNNNNNNNNNNNN!+++++++++++ ; ; RETURN DRIVE PARAMETER BLOCK ADDR FUNCTION ; EXIT - DE= DPB PTR ; HL= ? ; ;++++++++++++++++++++++++++++++KNNNNNNNNNNNNNNNNNN%+;NNNNNNNNNNNNNNNNNNNNNNLOGICAL DRIVE ; LD A,(BTDRV) ;IF EVEN THEN ADD 0 ELSE ADD 128 RRCA AND A,80H LD E,A ;COMPUTE SECTOR LD D,0 LD HL,a=NNNNNNNNNNNNNNNN%ENNNNNNNNNNNNNNNNNNNNNN******************************************* ; ; SET TRACK # ; ENTRY- BC= TRACK # ; ;***************************************NNNNNNNNNNNNNNNNN%NNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++ ; ; SECTOR TRANSLATION FUNCTION ; ENTRY- DE= 0: NO XLATE, ELSE PTR TO XLATE TABLE ; BC= SECTORwNNNNNNNNNNNNNNNN%F(NNNNNNNNNNNNNNNNNNNNNNGON DISK FUNCTION ; EXIT - A= 0: OK; /0: ERROR ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++{CNNNNNNNNNNNNNNNN%NNNNNNNNNNNNNNNNNNNNN!+++++++++++++ DISKOP: ; ; SET UP IOPB ; LD HL,BTTRK LD DE,IOPB + PB_TRKO LD BC,PB_BCNTO - PB_TRKO LDIR ; DISKOP2A_rNNNNNNNNNNNNNNNN%NNNNNNNNNNNNNNNNNNNNN!ORE REGS POP DE INC DE ;NEXT ERROR BYTE DJNZ DSKER1 ;IF NOT DONE THEN LOOP ; LD HL,DSKEB ;OUTPUT ERROR MESSAGE CALL9NNNNNNNNNNNNNNNNN% cNNNNNNNNNNNNNNNNNNNNNN************************************* ; ; SET 3740 SECTOR TRANSLATION PROCEDURE ; ENTRY- (DTPTR)= MUST BE PTR TO DTP ; EXIT mKBNNNNNNNNNNNNNNNN%&gNNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++++++++ DPBAD: LD HL,(DTPTR) ;FETCH BASE ADDR LD DE,10 ;ADD OFFSET OF DPB PTR ADD HrNNNNNNNNNNNNNNNN%,&NNNNNNNNNNNNNNNNNNNNN!(IOPB + PB_SECO) ; PUSH HL ;SAVE SECTOR TO RESTORE LATER ; ADD HL,DE LD (IOPB + PB_SECO),HL ; ; EXECUTE IOPB ; knNNNNNNNNNNNNNNNN%0tNNNNNNNNNNNNNNNNNNNNNN************************************* SETTRK: LD (BTTRK),BC RET ;*****************************************************JHNNNNNNNNNNNNNNNNN% ߿NNNNNNNNNNNNNNNNNNNNNN # TO XLATE ; EXIT - HL= XLATED SECTOR OR (BC) + 1 ; BC= UNCHANGED ; A, DE= ? ; ;++++++++++++++++++++++++++++++++++++++++>cgNNNNNNNNNNNNNNNNN%uNNNNNNNNNNNNNNNNNNNNN!+ DISKLOG: ; ; SET DESCRIPTOR SECTOR XFER ADDRESS TO DEFAULT BUFFER ; LD HL,DEFBFR LD (IOPB + PB_DMAO),HL XOR A,A NNNNNNNNNNNNNNNN%NNNNNNNNNNNNNNNNNNNNNN: LD (IOPB + PB_CMDO),A ; ; FETCH DRIVER VECTOR & EXECUTE DISK DRIVER ; DKOPLP: PUSH IY ;SAVE IY LD IY,(DVRTPTR) ;F82NNNNNNNNNNNNNNNN%NNNNNNNNNNNNNNNNNNNNNN EDITOR ; ; GET USER RESPONSE ; CALL CI ;GET USER RESPONSE ; PUSH AF ;SAVE CHAR LD C,A ;ECHO CHAR CALL COC PONNNNNNNNNNNNNNNNNN%!PNNNNNNNNNNNNNNNNNNNNNN- DE, HL= ? ; ;**************************************************************************** TR8: TR3740: LD DE,SDTRAN ; SE7NNNNNNNNNNNNNNNNN%'VNNNNNNNNNNNNNNNNNNNNNNL,DE LD E,(HL) ;FETCH DPB PTR INC HL LD D,(HL) RET SUBTTL HARD DISK ROUTINES ;++++++++++++++++++++++++++++++++++T>NNNNNNNNNNNNNNNN%-NNNNNNNNNNNNNNNNNNNNNNCALL XPRIM ; ; RESTORE SECTOR ; POP HL LD (IOPB + PB_SECO),HL ; ; DONE ; RET ;+++++++++++++++++++++++++++rNNNNNNNNNNNNNNNN%NNNNNNNNNNNNNNNNNNNNNN*********************** ; ; SET SECTOR ; ENTRY- BC= SECTOR # ; ;***********************************************************NNNNNNNNNNNNNNNN% NNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++ SECTRN: ; ; IF NO TRANSLATION THEN RETURN SECTOR++ ; LD A,D ;IF TABLE ADDR = 0 THENrNNNNNNNNNNNNNNNNN%fTNNNNNNNNNNNNNNNNNNNNNNLD (IOPB + PB_DMAXO),A ; ; SET DESCRIPTOR SECTOR SECTOR ; LD HL,ID_SECT LD (IOPB + PB_SECO),HL ; ; SET DESCRIPTOR SBNNNNNNNNNNNNNNNN%NNNNNNNNNNNNNNNNNNNNN!ETCH TABLE BASE ; LD HL,DKOPRET ;PUT RETURN ADDRESS ON STACK PUSH HL ; LD HL,(DVRXADR) ;FETCH DRIVER ADDRESS PREFETCHED x ؍tBߑ{I䕱N뙺W$]+Ţ`.ʦNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN&NNNNNNNNNNNNNNNNNNNNNNSH IX LD IX,IOPB ;PASS PTR TO IOPB LD HL,DK_DSKX ;PRIMITIVE ENTRY LD A,(DK_PROM) ;FETCH PROM # CALL EXROM ;EXECUTE THENNNNNNNNNNNNNNNNN&P\NNNNNNNNNNNNNNNNNNNNNNCALL XPRIM ; ; RESTORE THE MODIFIED SECTOR SO RETRY WILL WORK ; POP HL LD (IOPB + PB_SECO),HL ; ; DONE ; RET NNNNNNNNNNNNNNNN& NNNNNNNNNNNNNNNNNNNNN! RET ; STACK, EXECUTE FUNCTION ADDRESS ON STACK ;######################################################################V9NNNNNNNNNNNNNNNN&NNNNNNNNNNNNNNNNNNNNN!++++++++++++++++++++++++++++++ ; ; RETURN DRIVER TABLE PTR FUNCTION ; ENTRY- C= DRIVE # (E FOR FUNCTION CALL) ; EXIT - HL= DF NNNNNNNNNNNNNNNN&p NNNNNNNNNNNNNNNNNNNNNNCTION ; ENTRY- IX= IOPB PTR ; EXIT - A= 0: OK ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++HNNNNNNNNNNNNNNNNN&چNNNNNNNNNNNNNNNNNNNNN!O ASCII USING DAA TRICK ; AND A,0FH ADD A,90H DAA ADC A,40H DAA ; ; OUTPUT CHAR TO CONSOLE ; LD C,A CALL COCQArNNNNNNNNNNNNNNNN&%0NNNNNNNNNNNNNNNNNNNNN!************************ INTCPT: LD A,C ;CHECK CALL VALIDITY CP A,41 ;IF <= 40 THEN OK ; BDOSV EQU $ + 1 JP C,BDOS + 11UNNNNNNNNNNNNNNNNN&+NNNNNNNNNNNNNNNNNNNNNN ILLEGC: PUSH BC ;SAVE FUNCTION # ; ; OUTPUT WARNING MESSAGE ; LD HL,ISCMSG ;OUTPUT WARNING CALL EDITOR ; ; OUTPUTNNNNNNNNNNNNNNNN&NNNNNNNNNNNNNNNNNNNNNN PRIMITIVE POP IX ; ; RETURN THE COMMAND RESULTS STATUS ; LD A,(IOPB + PB_STATO) OR A,A RET SUBTTL JADE FLOPPoNNNNNNNNNNNNNNNNN&@bNNNNNNNNNNNNNNNNNNNNN! SUBTTL BIOS FUNCTION CALLS ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; FUNCTION DISP*:NNNNNNNNNNNNNNNN&NNNNNNNNNNNNNNNNNNNNNN###### ; ; BIOS FUNCTION TABLE ; ;############################################################################ BFUNTBL: D0rNNNNNNNNNNNNNNNN&|NNNNNNNNNNNNNNNNNNNNNNRIVER TABLE BASE PTR ; A, C= 0 ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; BIOS NNNNNNNNNNNNNNNN&%sNNNNNNNNNNNNNNNNNNNNNN+ EXIOPB: ; ; SET UP FOR CALL ; LD HL,DK_DSKX LD A,(DK_PROM) CALL EXROM ; ; FETCH & RETURN RESULT STATUS ; LD<NNNNNNNNNNNNNNNNN& -NNNNNNNNNNNNNNNNNNNNNN ; ; RETURN DATA ; POP AF RET ;*************************************************************************** ; ; N?NNNNNNNNNNNNNNNN&&eNNNNNNNNNNNNNNNNNNNNNNH ;THIS ADDR MODIFIED BY WARM BOOT RTN ; ; THE FOLLOWING CONDITIONAL JUMP IS MODIFIED TO AN UNCONDITIONAL JUMP BY ; THE WARrNNNNNNNNNNNNNNNN&,@NNNNNNNNNNNNNNNNNNNNNN FUNCTION # ; POP HL LD A,L CALL PRHEX ; ; OUTPUT NEW LINE ; CALL CRLF ; ; RETURN NULLS ; XOR A,A ;BC = HLxNNNNNNNNNNNNNNNN&NNNNNNNNNNNNNNNNNNNNNNY DRIVER ROUTINES ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; JADE 8" FLOPPY DISK DRIVENNNNNNNNNNNNNNNNN& sSNNNNNNNNNNNNNNNNNNNNNNATCHER ; EXIT - A= -1: ERROR, 0: OK ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ BIOFUNC:̅dNNNNNNNNNNNNNNNNN&NNNNNNNNNNNNNNNNNNNNNNW RETVERS ;0:RETURN VERSION # DW RETDVRTF ;1:RETURN DISK PHYSICAL CONFIGURATION TABLE PTR DW EXIOPB ;2:EXECUTE THE IOPB M)6rNNNNNNNNNNNNNNNN&5MNNNNNNNNNNNNNNNNNNNNNNCALL ENTRY (E= DRIVE #) ; RETDVRTF: LD C,E ; RETDVRT: LD HL,DVR0 ;START AT 1ST TABLE ; ; IF DRIVE == 0 THEN ALREADY"NNNNNNNNNNNNNNNNN&BNNNNNNNNNNNNNNNNNNNNNN A,(IX + PB_STATO) OR A,A ;TEST RESULT FOR RETURN RET SUBTTL NON-DISK PROCEDURES ;*********************************3uNNNNNNNNNNNNNNNNN&!NNNNNNNNNNNNNNNNNNNNNNEWLINE PROCEDURE ; ;*************************************************************************** CRLF: LD C,CR CALL COC LD"HNNNNNNNNNNNNNNNNN&'VNNNNNNNNNNNNNNNNNNNNN!M BOOT ROUTINE IF THE CLOCK/CALENDAR BOARD IS NOT PRESENT ; IF NOT MODIFIED, THEN IT IS ALLWAYS FALSE (NOP). ; INHCLK: JR C, NNNNNNNNNNNNNNNN&-qNNNNNNNNNNNNNNNNNNNNNN = A = 0 LD L,A LD H,A LD C,A LD B,A RET ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++!rNNNNNNNNNNNNNNNN&NNNNNNNNNNNNNNNNNNNNNNR FUNCTION ; ENTRY- IY= DRIVER TABLE PTR ; EXIT - A= 0: OK; /0: ERROR ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++VNNNNNNNNNNNNNNNN& &NNNNNNNNNNNNNNNNNNNNN! ; ; IF FUNCTION # NOT IN TABLE THEN RETURN -1 ; LD A,C CP A,MAXFUNCS LD A,-1 RET NC ; ; ELSE COMPUTE TABLE ENT- NNNNNNNNNNNNNNNNN&ʸNNNNNNNNNNNNNNNNNNNNNNAXFUNCS EQU ($ - BFUNTBL) / 2 ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN BIcNNNNNNNNNNNNNNNN&`NNNNNNNNNNNNNNNNNNNNNN THERE ; LD A,C OR A,A RET Z ; ; ELSE IF ILLEGAL DRIVE THEN RETURN ERROR ; CP A,NDRVS JR C,RETDV2 ; OR A,A ~NNNNNNNNNNNNNNNNN&NNNNNNNNNNNNNNNNNNNNNN******************************************* ; ; OUTPUT HEX DATA TO CONSOLE SUBR ; ENTRY- A= DATA ; EXIT - A, C= ? ; ;*****NNNNNNNNNNNNNNNN&"ONNNNNNNNNNNNNNNNNNNNNN C,LF JP COC IF INTCPTS SUBTTL ADDITIONAL FUNCTIONS TO SUPPORT CDOS PROGRAMS ;**************************************WlNNNNNNNNNNNNNNNNN&(FNNNNNNNNNNNNNNNNNNNNN!ILLEGC ; ; NOW CHECK FOR EXTENDED CALLS ; CP A,8DH ;IF RETURN VERSION THEN RETURN IT JR Z,RETCVER ; CP A,90H ;IF NONNNNNNNNNNNNNNNNN&."NNNNNNNNNNNNNNNNNNNNNN+++++ ; ; CDOS RETURN VERSION FUNCTION ; MAKES CLOCK/CALENDAR WORK. ; EXIT - B= 1 ; ;++++++++++++++++++++++++++++++++++++\INNNNNNNNNNNNNNNNN&6>NNNNNNNNNNNNNNNNNNNNN!+++++++++++++++++++++++++ FD8EXEC: ; ; CONVERT LOGICAL DRIVE TO PHYSICAL DRIVE ; LD A,(IY + DVRPDRV) LD (IOPB + PB_DRVYNNNNNNNNNNNNNNNNN& 1NNNNNNNNNNNNNNNNNNNNNNRY ; PUSH HL ;SAVE POSSIBLE DATA ; LD HL,BFUNTBL LD A,C ADD A,A ADD A,L LD L,A LD A,0 ADC A,H LD H,A ; ; BNNNNNNNNNNNNNNNNN&NNNNNNNNNNNNNNNNNNNNNNOS VERSION # ; EXIT - HL= VERSION # IN BINARY {0.00,..655.35} ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++%yNNNNNNNNNNNNNNNN&S/NNNNNNNNNNNNNNNNNNNNNNRET ; ; ; ELSE COMPUTE TABLE PTR ; RETDV2: LD B,C LD DE,DVRSIZ ; RETDVL: ADD HL,DE DJNZ RETDVL ; ; RETURN NO ER"NNNNNNNNNNNNNNNN&NNNNNNNNNNNNNNNNNNNNNN*********************************************************************** PRHEX: ; ; PROCESS HIGH NIBBLE 1ST ; CALL PRDIG P5NNNNNNNNNNNNNNNNNN&#~NNNNNNNNNNNNNNNNNNNNNN************************************* ; ; SYSTEM CALL INTERCEPT ROUTINE CHECKS FOR ILLEGAL BDOS CALLS & ; PRINTS MESSAGE IF sMHNNNNNNNNNNNNNNNNN&)uNNNNNNNNNNNNNNNNNNNNNNT CLOCK THEN ERR JR C,ILLEGC ; JR Z,CLKCAL ;IF CALENDAR THEN GET IT ; CP A,92H JR C,CLKSET ;IF SET FUNCTION THEN SET CHNNNNNNNNNNNNNNNNN&/NNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++ RETCVER: LD B,1 RET SUBTTL CLOCK ROUTINES ;++++++++++++++++++++++++++++++++++WNNNNNNNNNNNNNNNN&cmNNNNNNNNNNNNNNNNNNNNNNO),A ; ; FETCH SECTOR DATA ; LD HL,(IOPB + PB_SECO) PUSH HL ;SAVE FOR XPRIM RESTORE ; ; ; EXECUTE THE IOPB ; hNNNNNNNNNNNNNNNN& NNNNNNNNNNNNNNNNNNNNNN EXECUTE TABLE ADDRESS ; LD A,(HL) INC HL LD H,(HL) LD L,A ; EX (SP),HL ;PUT CALLER'S DATA IN HL, FUNCTION ADDR ON>BNNNNNNNNNNNNNNNN&NNNNNNNNNNNNNNNNNNNNNN++++++++++++++++ RETVERS: LD HL,VERSN XOR A,A ;RETURN NO ERROR RET ;++++++++++++++++++++++++++++++++++++++++++++++rNNNNNNNNNNNNNNNNN&CNNNNNNNNNNNNNNNNNNNNNNROR ; XOR A,A RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EXECUTE IOPB FUNȯNNNNNNNNNNNNNNNN&NNNNNNNNNNNNNNNNNNNNNN ; ; SWAP HIGH & LOW NIBBLES ; PRDIG: RLCA RLCA RLCA RLCA ; ; SAVE DATA FOR RETURN ; PUSH AF ; ; CONVERT T.'NNNNNNNNNNNNNNNNN&$NNNNNNNNNNNNNNNNNNNNN!ILLEGAL. ALSO IMPLEMENTS CDOS CLOCK/CALENDAR ; SYSTEM CALLS FOR ASMB. ; ;***************************************************KNNNNNNNNNNNNNNNNN&* NNNNNNNNNNNNNNNNNNNNNNLOCK ; JR Z,CLKTIM ;IF TIME THEN GET IT ; CP A,93H JR Z,CLKRDC ;IF READ CLOCK THEN GET IT ; ; ILLEGAL SYSTEM CALL ; NNNNNNNNNNNNNNNNN&0^NNNNNNNNNNNNNNNNNNNNN!++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN CALENDAR FUNCTION 90H ; EXIT - A= DAY ; B= MONTH ; C= YEAR ; L= D NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNŃf4Ѕl:։q> ٍuBޑzH㕰L虷S W%[)ŦNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN&NNNNNNNNNNNNNNNNNNNNN!AY OF WEEK ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ CLKCAL: LD HL,CLK_CAL ;ROM ENTRYPvNNNNNNNNNNNNNNNNN&glNNNNNNNNNNNNNNNNNNNNNN*********************** ; ; CLOCK SET FUNCTION 91H ; ENTRY- DE= CLOCK IMAGE BUFR PTR (13 BYTES LONG) ; ;*******************rdNNNNNNNNNNNNNNNN& NNNNNNNNNNNNNNNNNNNNN!M ; ; ROM PROCEDURE RETURNS HERE ; EXROMR: PUSH AF ;SAVE RETURN VALUE CALL GETMON ;RESELECT MONITOR ROM ; POP AF ;drNNNNNNNNNNNNNNNN&NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++++ CNSCK: IF USEMON CALL GETMON JP MR_CONSTS ELSE IN A,(NT_STAT) ;IF DAT&YNNNNNNNNNNNNNNNN&GNNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ NTOST: IN A,(NT_STAT) CPL ;REVERSE SENSE AND A,1 SHL NTINNNNNNNNNNNNNNNNN&NNNNNNNNNNNNNNNNNNNNNN********************************************************************* LO: IF USEMON CALL GETMON JP MR_LSTOUT ELSE (rNNNNNNNNNNNNNNNN&%NNNNNNNNNNNNNNNNNNNNNN***************************** ; ; MESSAGE EDITOR ; ENTRY- HL= TEXT PTR (BIT 7= 1: TERMINATOR) ; EXIT - REGS= ? ; ;********'0NNNNNNNNNNNNNNNNN&+$NNNNNNNNNNNNNNNNNNNNNNV),A CALL GETMON ; ; PRINT PROMPT ; LD HL,ITMSG IQCONT: CALL EDITOR ; LD HL,IQMSG ;QUERY USER CALL EDITOR ; ; ߷NNNNNNNNNNNNNNNN&NNNNNNNNNNNNNNNNNNNNN! POINT JR CLK2 ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN TIME FUNCTION 9 = STHD) DW 0 ;;NO CHECKS ON HARD DISK ELSE DW D#D(DD)CHK ;;DRIVE DISK CHENNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNŃg5Ӆm;։q? ڍwE{I䕱L虷S X&\*ƦNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN'~NNNNNNNNNNNNNNNNNNNNNNCKSUMS ARRAY PTR ENDIF DW D#D(DD)ALL ;;DRIVE CLUSTER ALLOCATION BIT MAP PTR LIST OFF ENDM ; ; DEFINE THE DATA ; ONNNNNNNNNNNNNNNNN'NNNNNNNNNNNNNNNNNNNNNN########################### ; ; VARIABLES ; ;############################################################################ ;idNNNNNNNNNNNNNNNN' NNNNNNNNNNNNNNNNNNNNNND LIST ON IF ((DD - 1) >= STHD) AND ((DD - 1) <= NDHD) D#D(DD)ALL: DS 127 ;ALLOCATION BIT MAP FOR 8" HARD DRIVE #D(DD) kNNNNNNNNNNNNNNNN'oNNNNNNNNNNNNNNNNNNNNNNCLUSTER SIZE ; 1K= 3, 2K= 4, 4K= 5, 8K= 6, 16K= 7 DPBBLM DS 1 ;BLM- BLOCK MASK ; 1K = 7, 2K= 15, 4K= 31, 8K= 63, 16K= 1 NNNNNNNNNNNNNNNN'1NNNNNNNNNNNNNNNNNNNNNNEC ; 0: 128, 1: 256, 2: 512, 3: 1024 DPBPHM DS 1 ;PHM- PHYSICAL RECORD MASK BASED ON BYTES/SEC ; 0: 128, 1: 256, 3: 5125NNNNNNNNNNNNNNNNN'NNNNNNNNNNNNNNNNNNNNNN## ; STRUCT 0 DVRADD DS 2 ;START ADDRESS OF DISK DRIVER DVRFG DS 1 ;FLAGS (BIT 0= 1: INHIBIT LOGON) DVRPDRV DS 1 ;PHYSICALQH9NNNNNNNNNNNNNNNNN'%q\NNNNNNNNNNNNNNNNNNNNNNAL DRIVE 0 ; B SIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 0 ; C SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 1 ; D SIDE 2 & 3 OF NNNNNNNNNNNNNNNN'+RSNNNNNNNNNNNNNNNNNNNNNNAL DRIVE 1 ; F SIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 1 ; G JADE 8" FLOPPY PHYSICAL DRIVE 0 ; H JADE 8" FLOPPY PHYSICAL8 NNNNNNNNNNNNNNNN'-NNNNNNNNNNNNNNNNNNNNNNDD DL 1 REPT NDRVS LIST OFF ALLDPH 0123456789ABCDEF DD DL DD + 1 LIST ON ENDM ; ; LAST OF INITIALIZED CODE READNNNNNNNNNNNNNNNNN'NNNNNNNNNNNNNNNNNNNNN! DTPTR: DS 2 ;DRIVE TABLE PTR LOGRQ: DS 1 ;LOG ON REQUEST REG. DVRTPTR DS 2 ;DRIVE DRIVER TABLE BASE ADDRESS PTR DVRXADR DS 2>HNNNNNNNNNNNNNNNN'@NNNNNNNNNNNNNNNNNNNNNN ENDIF IF ((DD - 1) >= ST8FD) AND ((DD - 1) <= ND8FD) D#D(DD)ALL: DS 57 ;ALLOCATION BIT MAP FOR 8" DRIVE #D(DD) D#D(DD)CHz7NNNNNNNNNNNNNNNN'GNNNNNNNNNNNNNNNNNNNNNN27 DPBEXM DS 1 ;EXM- EXTENT MASK ; DSM < 256 : 1K= 0, 2K= 1, 4K= 3, 8K= 7, 16K= 15 ; DSM > 255 : 2K= 0, 4K= 1, 8K= 3, 1NNNNNNNNNNNNNNNN'dNNNNNNNNNNNNNNNNNNNNNN, 7: 1024 DPBSZ DS 0 ENDM ; ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; GENERATEINNNNNNNNNNNNNNNNN' NNNNNNNNNNNNNNNNNNNNN! DRIVE # ; ; THE FOLLOWING MAY BE BROUGHT OFF DISK DESCRIPTOR OR FROM DEFAULT TABLES ; DVRFLG DS 1 ;DISK FLAGS DVR0SPT DS8oNNNNNNNNNNNNNNNNN'&$NNNNNNNNNNNNNNNNNNNNNNHARD DISK PHYSICAL DRIVE 1 ; E JADE 8" FLOPPY PHYSICAL DRIVE 0 ; F JADE 8" FLOPPY PHYSICAL DRIVE 1 ENDIF IF BOOT =BNNNNNNNNNNNNNNNN',NNNNNNNNNNNNNNNNNNNNN! DRIVE 1 ENDIF ; ;************************************************************* ; ; REVISION HISTORY: ; ; 3.00 - 26 rNNNNNNNNNNNNNNNN'NNNNNNNNNNNNNNNNNNNNNN FROM DISK ; BIOSND EQU $ SUBTTL UNINITIALIZED DATA AREA ;###############################################################-sNNNNNNNNNNNNNNNNN' 2NNNNNNNNNNNNNNNNNNNNNN ;DRIVE DRIVER EXECUTION ADDRESS ROMSAV DS 1 ;ROM SWAP SAVE OF ORIGINAL ROM ;#############################################HNNNNNNNNNNNNNNNNN'qNNNNNNNNNNNNNNNNNNNNNNK DS 32 ;DIRECTORY CHECKSUMS STORAGE (1 BYTE PER SECTOR) ENDIF LIST OFF ENDM ; ; RESERVE THE DATA SPACE ; DD DL:/ NNNNNNNNNNNNNNNN'tNNNNNNNNNNNNNNNNNNNNNN6K= 7 DPBDSM DS 2 ;DSM- DRIVE STORAGE SIZE (IN CLUSTERS) ; INT(((#_TRACKS - OFF) * SPT * BYTES PER SECTOR) / CLUSTER SIZE) -NNNNNNNNNNNNNNNN'WNNNNNNNNNNNNNNNNNNNNNN THE DPB FOR DRIVE MACRO ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ALLDPB: MACRO #D LLNNNNNNNNNNNNNNNNNN'!NNNNNNNNNNNNNNNNNNNNN! TITLE CUSTOMIZED BIOS FOR M5B LIST NOCOND BOOT EQU 3H ;10H: HARD DISK, 3: 8" FLOPPY, 20H: 5" FLOPPY ;*********************NNNNNNNNNNNNNNNNN''>NNNNNNNNNNNNNNNNNNNNN! 3 ; A JADE 8" FLOPPY PHYSICAL DRIVE 0 ; B JADE 8" FLOPPY PHYSICAL DRIVE 1 ; C SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 0ɛHNNNNNNNNNNNNNNNN'-NNNNNNNNNNNNNNNNNNNNNNJAN 87 GRH ; Implemented new common IOPB code & Jade floppy firmware support. ; Implemented disk drive driver tables and new' BNNNNNNNNNNNNNNNN'DNNNNNNNNNNNNNNNNNNNNNN############# ; ; THE FOLLOWING DATA MUST RESIDE IN THIS ORDER TO MATCH THE IOPB DATA ; ;#################################-BNNNNNNNNNNNNNNNN' gNNNNNNNNNNNNNNNNNNNNNN############################### ; ; DRIVE ALLOCATION AREAS ; ;############################################################rNNNNNNNNNNNNNNNNN' 07800H) OR ($ < 8000H) CONMy;BNNNNNNNNNNNNNNNN'#NNNNNNNNNNNNNNNNNNNNN!prises, SUNNYVALE, CA ; ; AUTHOR: Girvin Herr ; ;***************************************************************************'$NNNNNNNNNNNNNNNNN')41NNNNNNNNNNNNNNNNNNNNN!PHYSICAL DRIVE 1 ENDIF IF BOOT = 20H ; A JADE 5" FLOPPY PHYSICAL DRIVE 0 ; B JADE 5" FLOPPY PHYSICAL DRIVE 1 ; INNNNNNNNNNNNNNNNN'/NNNNNNNNNNNNNNNNNNNNNNf ROM primitives. ; Moved system down to 60k. ; 3.01 26 JUN 88 GRH ; Remove 5" floppy support. Implement in CP/M-86 BIOS. ;:rNNNNNNNNNNNNNNNN'"NNNNNNNNNNNNNNNNNNNNNNED FOR FLAGS BTDMA DS 2 ;DMA ADDRESS BTDMAX DS 1 ;DMA EXTENDED ADDRESS ;#################################################hBNNNNNNNNNNNNNNNN' "NNNNNNNNNNNNNNNNNNNNNNE ALLOCATION & CHECKSUMS AREA ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ALLDAL: MACRO #oNNNNNNNNNNNNNNNN'^NNNNNNNNNNNNNNNNNNNNNN############################### STRUCT 0 DPBSPT DS 2 ;SPT- SECTORS/TRACK DPBBSH DS 1 ;BSH- BLOCK SHIFT FACTOR DETERMINED BY V$NNNNNNNNNNNNNNNNN'NNNNNNNNNNNNNNNNNNNNNNAL CP/M 3.0 DATA (ALSO COULD BE USED BY CP/M 2.2 DEBLOCKING) ; DPBPSH DS 1 ;PSH- PHYSICAL RECORD SHIFT FACTOR BASED ON BYTES/SNNNNNNNNNNNNNNNN'3NNNNNNNNNNNNNNNNNNNNNNSG **** BIOS TOO BIG, USE MOVCPM & RE-ADJUST! **** ENDIF END kHNNNNNNNNNNNNNNNNN'$BmNNNNNNNNNNNNNNNNNNNNN!* ; ; CONFIGURATION: ; ; CPM ; DRIVE USAGE IF BOOT = 10H ;HARD DISK BOOT CONFIG. ; A SIDE 0 & 1 OF HARD DISK PHYSICNNNNNNNNNNNNNNNNN'*abNNNNNNNNNNNNNNNNNNNNN!C SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 0 ; D SIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 0 ; E SIDE 0 & 1 OF HARD DISK PHYSICTINNNNNNNNNNNNNNNNN'0NNNNNNNNNNNNNNNNNNNNNN Change single function to return drive table ptr into a BIOS function ; call using restart instruction. ; Change LOGON to s NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNЁj7҅m;։q> ٍvDᑮ{I䕱L虶R흺V#񡿢Z)ŦnNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN(XNNNNNNNNNNNNNNNNNNNNN!pecify the ID sector & track. At same time, fix bug ; which did not specify the logon track. ; 3.02 7 JUL 88 GRH ; Add '?TjINNNNNNNNNNNNNNNNN(NNNNNNNNNNNNNNNNNNNNNNunction ; rather than swapping Roms itself. ; 3.07 11-25-90 GRH ; Modify for Ver. 1.22 Monitor. ; Fix bug in 8" Hard Disk@ NNNNNNNNNNNNNNNN( NNNNNNNNNNNNNNNNNNNNNNMove calculation from ; DCM8 to CBIOS. ; Remove IOPB ptr passing in IX redundancy. ; Change DPB track-head shift factor to SցNNNNNNNNNNNNNNNN(=NNNNNNNNNNNNNNNNNNNNNNem by using ROMBNK sector buffer for ; ID sector read. ; 9-20-91 GRH Fold in redlines. ; 10-21-91 GRH Fix bugs ; 10NNNNNNNNNNNNNNNN(zNNNNNNNNNNNNNNNNNNNNNN================================================================== ; INTCPTS EQU TRUE ;ENABLE SYSTEM CALL INTERCEPT WHISTLE $NNNNNNNNNNNNNNNNN(xNNNNNNNNNNNNNNNNNNNNNNSYS: EQU 59 ;SYSTEM SIZE IN K BYTES KBYTE: EQU 1024 CPMSZ: EQU KBYTE * NKSYS CPMBS: EQU CPMSZ - (20 * KBYTE) ;CP/M BIAS VArNNNNNNNNNNNNNNNN(%NNNNNNNNNNNNNNNNNNNNNNBFUNRST ;============================================================================ ; ; OTHER DECLARATIONS ; ;=======NNNNNNNNNNNNNNNNNN(+NNNNNNNNNNNNNNNNNNNNN!======================================== ; ; BDOS CONSTANTS ON ENTRY TO WRITE ; ;====================================NNNNNNNNNNNNNNNN( NNNNNNNNNNNNNNNNNNNNN!' to include file names. ; Change hard disk system tracks directory reference to new format. ; Correct bug in drivers which ca5NNNNNNNNNNNNNNNNN(8NNNNNNNNNNNNNNNNNNNNNN table which benignly (at current level) ; caused the drive table to have bad data (default table was missing ; the 2 deblocNNNNNNNNNNNNNNNN(HNNNNNNNNNNNNNNNNNNNNNNector Offset like track ; offset. Disk partitioning will add this value to sector word. It ; will be stored in the ID sectoraNNNNNNNNNNNNNNNN(&NNNNNNNNNNNNNNNNNNNNNN-22-91 GRH Fix bugs ; 10-23-91 GRH Fix bugs ; 10-24-91 GRH Fix bugs ; ; 3.13 1-4-92 GRH ; Change boot code to usȡNNNNNNNNNNNNNNNN()NNNNNNNNNNNNNNNNNNNNN! ;============================================================================ ; ; INCLUDE COMIOPB3.DEF ; INCLUDE DINNNNNNNNNNNNNNNNN( mwNNNNNNNNNNNNNNNNNNNNNNLUE CCP: EQU CPMBS + 3400H ;ADDR OF CCP BDOS: EQU CPMBS + 3C00H ;ADDRESS OF BDOS BIOS: EQU CPMBS + 4A00H ;ADDRESS OF BDOS DNNNNNNNNNNNNNNNN(&NNNNNNNNNNNNNNNNNNNNNN===================================================================== ; SECSZ: EQU 128 NDRVS: EQU 6 IF BOOT = 10H ; ; l NNNNNNNNNNNNNNNN(,(NNNNNNNNNNNNNNNNNNNNNN======================================== ; WRALL EQU 0 ;WRITE TO ALLOCATED WRDIR EQU 1 ;WRITE TO DIRECTORY WRUAL EQU 2 ;WRIT̽NNNNNNNNNNNNNNNN(>NNNNNNNNNNNNNNNNNNNNN!used retry to fail. (sector remained ; corrupted) ; Stubbed out new Clock routines for present. ; 3.03 31 JUL 88 GRH ; UNNNNNNNNNNNNNNNNNN( NNNNNNNNNNNNNNNNNNNNNNking extension bytes). ; Implement data xfer inhibit schemes with PB_FLG & PB_BCNT. ; Add pick-up of THIS_BNK data in all iopbNNNNNNNNNNNNNNNNN({NNNNNNNNNNNNNNNNNNNNNN data to be dynamic. ; ; 3.10 5-20-91 GRH ; Change LOGON to attempt to recover from old disks better, using ; DCM8301 verNNNNNNNNNNNNNNNN(NNNNNNNNNNNNNNNNNNNNNNe type 0 boot directories. ; VERSN EQU 312 ; ;**************************************************************************** 4 NNNNNNNNNNNNNNNN(NNNNNNNNNNNNNNNNNNNNNNSKS3.DEF ; INCLUDE BDIR.DEF ; INCLUDE M5ZF2.DEF ; ;==============================================================WNNNNNNNNNNNNNNNNN(!^FNNNNNNNNNNNNNNNNNNNNNN BIOSR: EQU 1000H - BIOS ; ; PAGE 0 LOCATIONS ; PAGE0: EQU 0 ;START OF CP/M RAM DEFDRV: EQU PAGE0 + 4 ;DEFAULT DRIVE PARNNNNNNNNNNNNNNNN('NNNNNNNNNNNNNNNNNNNNNN 8" HARD DISK BOOT DATA ; STHD EQU 0 ;START LOGICAL DRIVE OF HARD DISK NDHD EQU 3 ;LAST LOGICAL DRIVE OF HARD DISK ST8FD E%'NNNNNNNNNNNNNNNN(-+NNNNNNNNNNNNNNNNNNNNNNE TO UNALLOCATED ;============================================================================ ; ; ASCII CHARS ; ;=====ΨrNNNNNNNNNNNNNNNN(UNNNNNNNNNNNNNNNNNNNNNNnstub Clock routines. ; 3.04 6 AUG 88 GRH ; Remove floppy side select from BIOS & move to controller. ; Implement new ID seNNNNNNNNNNNNNNNN( ZNNNNNNNNNNNNNNNNNNNNNN cases. ; Remove clock buffer set/read system calls. ; 12-5-90 GRH ; Remove IX IOPB ptr passing to disk drivers. ; 1-13-91 aNNNNNNNNNNNNNNNNN(hNNNNNNNNNNNNNNNNNNNNN!sion controller firmware. ; ; 3.11 9-2-91 GRH ; Add redlines & change for M5ZMON v.2.00. ; ; 3.12 9-11-91 GRH ; Add deNNNNNNNNNNNNNNNN(DNNNNNNNNNNNNNNNNNNNNNN SUBTTL SYSTEM DECLARATIONS ;============================================================================ ; ; ASSEMBLY PARANNNNNNNNNNNNNNNNN(-NNNNNNNNNNNNNNNNNNNNNN============== ; LIST OFF *INCLUDE COMIOPB3.DEF *INCLUDE DISKS3.DEF *INCLUDE BDIR.DEF *INCLUDE M5ZF2.DEFNNNNNNNNNNNNNNNN(" NNNNNNNNNNNNNNNNNNNNNNAM ADDR BDOSJV EQU PAGE0 + 5 ;BDOS SYSTEM CALL ENTRY THIS_STK EQU PAGE0 + 1CH ;CURRENT STACK FRAME PTR ; ; BIOS DATA ; NNNNNNNNNNNNNNNNN((NNNNNNNNNNNNNNNNNNNNNNQU 4 ;START LOGICAL DRIVE OF 8" FLOPPY ND8FD EQU 5 ;LAST LOGICAL DRIVE OF 8" FLOPPY ENDIF IF BOOT = 3 ; ; 8" FLOPcNNNNNNNNNNNNNNNNN(.NxNNNNNNNNNNNNNNNNNNNNNN======================================================================= ; LF: EQU 0AH CR: EQU 0DH CTRLZ: EQU 1AH ;@@@@@0SNNNNNNNNNNNNNNNNN(dNNNNNNNNNNNNNNNNNNNNN!ctor format. ; Implement CP/M 3.0 DPB structure in preparation for deblocking. ; 3.05 11-3-88 GRH ; Change included data toNNNNNNNNNNNNNNNNNN( kNNNNNNNNNNNNNNNNNNNNNN GRH ; Fix bug which corrupted PB_FLG. ; 3.08 2-22-91 GRH ; Remove references to THIS_BNK & use monitor function #7 insteaqWNNNNNNNNNNNNNNNNN([NNNNNNNNNNNNNNNNNNNNNNblocking code. ; 9-17-91 GRH Add r/ls & move to 59k system. ; 9-19-91 GRH Fix bug which destroyed my root directories! W NNNNNNNNNNNNNNNN(uNNNNNNNNNNNNNNNNNNNNNNMETERS ; ;============================================================================ ; FALSE EQU 0 TRUE EQU NOT FALSE r9NNNNNNNNNNNNNNNN(NNNNNNNNNNNNNNNNNNNNNN LIST ON ;============================================================================ ; ; DISK OPERATING SYSTEM ADDRaNNNNNNNNNNNNNNNN(#8$NNNNNNNNNNNNNNNNNNNNNNORG PAGE0 + 40H BTARG DS 2 ;BOOT ARGUMENT SYSPTR DS 2 ;BOOT DIRECTORY SYSTEM LOAD DATA OFFSET PTR ; DEFBFR EQU PAGE0 + 80HqNNNNNNNNNNNNNNNNN()NNNNNNNNNNNNNNNNNNNNN!PY BOOT DATA ; STHD EQU 2 ;START LOGICAL DRIVE OF HARD DISK NDHD EQU 5 ;LAST LOGICAL DRIVE OF HARD DISK ST8FD EQU 0 ;STARNNNNNNNNNNNNNNNNN(/}INNNNNNNNNNNNNNNNNNNNNN@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; GENERATE THE TRANSLATION TABLE MACRO ; ;@@@@@@@@iNNNNNNNNNNNNNNNN(7NNNNNNNNNNNNNNNNNNNNNN update IOPB.PBSTAT to new configuration. ; 3.06 1-28-89 GRH ; Revised primitive calling procedures to use the monitor rom f͎NNNNNNNNNNNNNNNNN( .NNNNNNNNNNNNNNNNNNNNNNd. ; Add track-head shift factor to DPBs for future use. ; 3.09 5-15-91 GRH ; Change 8" floppy side select to track bit 0. NNNNNNNNNNNNNNNN(NNNNNNNNNNNNNNNNNNNNNN; BUF_RD was writing. ; Patch problems with partitioning until 20MB drive installed. ; Fix TPA corruption by LOGON problidNNNNNNNNNNNNNNNNN(KNNNNNNNNNNNNNNNNNNNNNN ;============================================================================ ; ; CONDITIONAL ASSEMBLY FLAGS ; ;==========rNNNNNNNNNNNNNNNN(KNNNNNNNNNNNNNNNNNNNNNNESSES ; ;============================================================================ ; SYS EQU 2 ;CP/M VERSION {2,3} ; NK2uNNNNNNNNNNNNNNNNNN($NNNNNNNNNNNNNNNNNNNNNN ;DEFAULT BUFFER ; ; BIOS FUNCTION CALL RESTART VECTOR ; BFUNRST EQU 28H BFUNRSV EQU PAGE0 + BFUNRST BFUNRSI EQU 0C7H + LNNNNNNNNNNNNNNNNNN(*NNNNNNNNNNNNNNNNNNNNNNT LOGICAL DRIVE OF 8" FLOPPY ND8FD EQU 1 ;LAST LOGICAL DRIVE OF 8" FLOPPY ENDIF ;====================================$NNNNNNNNNNNNNNNNN(0nNNNNNNNNNNNNNNNNNNNNNN@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; GXLATE MACRO #SECTORS, #SKEW LIST OFF NXTSEC DL 1 ;yNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNŃh6҅l:Չq> ٍuCޑyF╯}J晴PꝷS V%nNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN(oNNNNNNNNNNNNNNNNNNNNNN;START WITH SECTOR 1 LOWEST DL 1 ;; REPT #SECTORS LIST ON DB NXTSEC LIST OFF NXTSEC DL NXTSEC + #SKEW ;ADD SKEW FACTOENNNNNNNNNNNNNNNNN(6NNNNNNNNNNNNNNNNNNNNNN/ 10) + '0' DB (DD % 10) + '0' ENDM SUBTTL BIOS CODE ORG BIOS ;----------------------------------------------------NNNNNNNNNNNNNNNN( *NNNNNNNNNNNNNNNNNNNNNNALL ;############################################################################ ; ; THE FOLLOWING BOOT DATA MUST RESIDEBNNNNNNNNNNNNNNNN( NNNNNNNNNNNNNNNNNNNNN! ; CODE. THIS BUFFER IS USED BY THE CP/M DIRECTORY CHECK ROUTINES THAT ; CHECK FOR DISK CHANGE. ; ;########################lrNNNNNNNNNNNNNNNN(JNNNNNNNNNNNNNNNNNNNNNNFAULT DRIVE ; LD A,(BTARG) ;USE DRIVE # PASSED IN PAGE 0 AND A,3 LD (DEFDRV),A ; ; SEND SYSTEM SIGN-ON ; LD HL,MSGNNNNNNNNNNNNNNNNN(ONNNNNNNNNNNNNNNNNNNNNN#################################################################### ; MSGSO: DB CR,LF DB CPMSZ / (KBYTE * 10) + '0' DB (CrNNNNNNNNNNNNNNNN(%NNNNNNNNNNNNNNNNNNNNNN;ASSUME NO DATA IN BUFFER ; LD (UNA_CNT),A ;CLEAR UNALLOCATED SECTOR COUNT ; LD (BUF_MOD),A ;CLEAN BUFFER ; LD HL,BLKBU<!NNNNNNNNNNNNNNNN(+NNNNNNNNNNNNNNNNNNNNNNTOP OF SEGMENT LOOP ; W_NXTSEG: LD E,(HL) ;FETCH TRACK INC HL LD D,(HL) LD (IOPB + PB_TRKO),DE ; INC HL ;FETCH hrNNNNNNNNNNNNNNNN(:NNNNNNNNNNNNNNNNNNNNN!R ;; IF NXTSEC > #SECTORS ;CHECK FOR OVERFLOW NXTSEC DL NXTSEC - #SECTORS ;; IF NXTSEC <= LOWEST ;CHECK FOR REPEAT NNNNNNNNNNNNNNNNNN(NNNNNNNNNNNNNNNNNNNNNN------------------------ ; ; BIOS JUMP VECTOR TABLE ; ;-------------------------------------------------------------------#'HNNNNNNNNNNNNNNNN(NNNNNNNNNNNNNNNNNNNNN! AS DEFINED RIGHT BEFORE THE COLD ; INIT ROUTINE START AND MUST BE IN THE 1ST SECTOR. THESE 2 WORDS ARE ; REFERENCED BY THE BOONNNNNNNNNNNNNNNN(NNNNNNNNNNNNNNNNNNNNNN#################################################### ; DIRBF: EQU $ ;BUFFER BEGINNING ;---------------------------------fLNNNNNNNNNNNNNNNN(NNNNNNNNNNNNNNNNNNNNNNSO CALL EDITOR ; ; MODIFY COLD START VECTOR TO WARM START ; LD HL,(BIOS+4) LD (BIOS+1),HL ; ; INIT OUR STUFF ; @NNNNNNNNNNNNNNNNN( ZGNNNNNNNNNNNNNNNNNNNNNNPMSZ MOD (KBYTE * 10)) / KBYTE + '0' DB 'K CP/M-80 Vers 2.2',CR,LF DB 'M5b CBIOS Vers ' PVERS VERSN DM CR,LF NNNNNNNNNNNNNNNN(&NNNNNNNNNNNNNNNNNNNNNNF ;INIT BUFFER PTR LD (BUF_DMA),HL ; ; LOG ON DRIVE TO INIT TABLES ; LD A,(BTARG) AND A,3 ;MODULO 4 LD C,A LD E,yBNNNNNNNNNNNNNNNN(,*NNNNNNNNNNNNNNNNNNNNNNSECTOR LD E,(HL) INC HL LD D,(HL) LD (IOPB + PB_SECO),DE ; INC HL ;FETCH SEGMENT SECTOR COUNT LD A,(HL) LD (SEC)NNNNNNNNNNNNNNNN( NNNNNNNNNNNNNNNNNNNNNNXTSEC DL LOWEST + 1 LOWEST DL NXTSEC ENDIF ENDIF ;; ENDM LIST ON ENDM ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@)HNNNNNNNNNNNNNNNNN( 9NNNNNNNNNNNNNNNNNNNNNN--------- ; JP INIT1 ;COLD START ENTRY JP WARM ;RELOAD CCP/BDOS JP CNSCK ;GET CONSOLE STATUS JP CI ;CONSOLE INPUT 36NNNNNNNNNNNNNNNNN(LNNNNNNNNNNNNNNNNNNNNNNOT LOADER CODE IN ORDER TO DETERMINE THE LOAD ADDRESS ; AND LENGTH OF THE BIOS. ; ;##########################################rrNNNNNNNNNNNNNNNN('NNNNNNNNNNNNNNNNNNNNNN------------------------------------------- ; ; INIT - COLD START ENTRY FROM BOOT MUST SET ALL BIOS PARAMS ; ;----------mNNNNNNNNNNNNNNNN((NNNNNNNNNNNNNNNNNNNNNN CALL GETBNK LD (BUF_DMAB),A ; ; INITIALIZE CLOCK VECTORS IF CLOCK INSTALLED ; LD A,MF_CSYN ;TEST FOR BOARD PRESENT CXNNNNNNNNNNNNNNNN(!ivNNNNNNNNNNNNNNNNNNNNN! IF $ > (DIRBF + SECSZ) CONMSG **** WARNING! COLD INIT CODE BIGGER THAN DIR BUFFER **** ELSE DS DIRBF+SECSZ-$ ;FILL OUT`NNNNNNNNNNNNNNNNN('NNNNNNNNNNNNNNNNNNNNN!0 CALL SELDSK LD A,L ;IF ERROR THEN ABORT OR A,H JR Z,W_EROR ; ; SETUP IOPB ; LD A,PB_READC LD (IOPB + PB_CMDO'NNNNNNNNNNNNNNNN(-,NNNNNNNNNNNNNNNNNNNNNNCNT),A ; INC HL ;SAVE CURRENT DATA PTR LD (LDRPTR),HL ; ; READ SYSTEM ; W_READ: CALL XPRIM LD A,2 JR NZ,W_EROR q[NNNNNNNNNNNNNNNN(eNNNNNNNNNNNNNNNNNNNNNN@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; INITIALIZE VERSION TEXT IN RAM MACRO ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@r 9999 DB (DD / 10000) + '0' DD DL DD % 10NNNNNNNNNNNNNNNNN( [NNNNNNNNNNNNNNNNNNNNN!SK DRIVE JP SETTRK ;SET TRACK # JP SETSEC ;SET SECTOR # JP SETDMA ;SET TRANSFER ADDR JP DISKRD ;PERFORM DISK READ HNNNNNNNNNNNNNNNNN(lNNNNNNNNNNNNNNNNNNNNNNBYTES BIOSST: DW BIOS ;BIOS MODULE LOAD ADDR FOR SBD ; ; CONTINUE ON WITH INIT ; INIT1: JR INIT ;##################NNNNNNNNNNNNNNNN(ENNNNNNNNNNNNNNNNNNNNNN;USE PAGE 0 FOR STACK LD (THIS_STK),SP EI ; ; UPLOAD BOOT DIRECTORY DATA FOR WARM BOOT ; LD DE,(SYSPTR) LD HL,0080HLNNNNNNNNNNNNNNNN()NNNNNNNNNNNNNNNNNNNNNNN OFF CLOCK DRIVE ; LD A,18H ;UNCOND. JR (OFF) (CAUSES JUMP TO ILLEGAL) ; CLKON: LD (INHCLK),A ; ; BOOT CCP & BDOS ; NNNNNNNNNNNNNNNN(#NNNNNNNNNNNNNNNNNNNNNNENTRY LOADS CCP,BDOS FROM DISK & ; SETS UP VARIABLES ; ;---------------------------------------------------------- ; WARM: NNNNNNNNNNNNNNNNN()NNNNNNNNNNNNNNNNNNNNNN HL,CCP LD (IOPB + PB_DMAO),HL ; ; IF NO SYSTEM THEN ERROR ; LD HL,BT_DATA LD A,(HL) ;FETCH SEGMENT COUNT OR A,A ]NNNNNNNNNNNNNNNNN(/JyNNNNNNNNNNNNNNNNNNNNN!O) ;DMA += SECTOR SIZE LD HL,(IOPB + PB_DMAO) ADD HL,DE LD (IOPB + PB_DMAO),HL ; ; IF INTO BIOS THEN EXIT ; LD A,HPJNNNNNNNNNNNNNNNN(NNNNNNNNNNNNNNNNNNNNNN000 ENDIF IF DD > 999 DB (DD / 1000) + '0' DD DL DD % 1000 ENDIF DB (DD / 100) + '0' DB '.' DB ((DD % 100) NNNNNNNNNNNNNNNN( NNNNNNNNNNNNNNNNNNNNN!JP DISKWR ;PERFORM DISK WRITE JP LISTST ;RETURN LIST STATUS JP SECTRN ;TRANSLATE SECTOR JP BIOFUNC ;EXECUTE FUNCTION C&NNNNNNNNNNNNNNNN(9NNNNNNNNNNNNNNNNNNNNNN########################################################## ; ; DIRECTORY SECTOR BUFFER STARTS HERE AFTER CRUNCHING COLD START WNNNNNNNNNNNNNNNNN({NNNNNNNNNNNNNNNNNNNNNN ADD HL,DE LD A,(HL) ;IF > MAX THEN ERROR CP A,6 JP NC,W_EROR ; LD DE,BT_DATA LD BC,BD_SIZE LDIR ; ; INIT DEa?NNNNNNNNNNNNNNNN(|NNNNNNNNNNNNNNNNNNNNNN JR WARM ;############################################################################ ; ; SIGN-ON MESSAGE ; ;########aNNNNNNNNNNNNNNNNN($NNNNNNNNNNNNNNNNNNNNN! ; ; SET TEMPORARY STACK ; DI LD SP,DEFBFR LD (THIS_STK),SP EI ; ; INIT OUR STUFF ; XOR A,A LD (BUF_ACT),A NNNNNNNNNNNNNNNNN(*NNNNNNNNNNNNNNNNNNNNNN LD A,1 JR Z,W_EROR ; ; ELSE USE DATA TO LOAD SYSTEM ; LD A,(HL) LD (SEGCNT),A ; INC HL ;POINT TO TRACK ; ; #$NNNNNNNNNNNNNNNNN(0Y4NNNNNNNNNNNNNNNNNNNNNN CP A,HIGH BIOS JR NC,WZRPG ; ; ELSE IF SEGMENT_SECTOR_COUNT != EXHAUSTED THEN READ_NEXT_SECTOR ; LD A,(SECCNT) DEC@NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNρj8ԅo> ډuBލ{H㑱~K畴O뙹U"𝾞Z(Ģ_-ɦNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN).NNNNNNNNNNNNNNNNNNNNNN A LD (SECCNT),A JR NZ,W_READ ; ; ELSE IF SEGMENTS == COMPLETE THEN DONE ; LD A,(SEGCNT) DEC A LD (SEGCNT),A JP-NNNNNNNNNNNNNNNNN)NNNNNNNNNNNNNNNNNNNNNN ; LD A,H CP A,HIGH BIOS JR C,W_LOK ; LD A,L CP A,LOW BIOS LD A,3 JR NZ,W_EROR ; W_LOK: ; ; INIT BIOS WARMlNNNNNNNNNNNNNNNN) kyNNNNNNNNNNNNNNNNNNNNNNROUTINES ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; READ A DISK SECTOR ; EXIT - A= 0:NNNNNNNNNNNNNNNN)KNNNNNNNNNNNNNNNNNNNNN! ; DISKRDN: CALL CPM_RD JP RW_RET ;**************************************************************************** ; ; (]NNNNNNNNNNNNNNNN)NNNNNNNNNNNNNNNNNNNNNNE TYPE ; LD A,C LD (WRTYPE),A ; ; IF 1ST WRITE TO UNALLOCATED (NEW, UNUSED) BLOCK THEN SET PARAMETERS ; CP A,WRUAL V+HNNNNNNNNNNNNNNNNN)hNNNNNNNNNNNNNNNNNNNNN!L) JR NZ,ALLOC ; LD HL,(UNA_TRK) ;SAME TRACK? LD DE,(CPM_TRK) SBC HL,DE JR NZ,ALLOC ; LD HL,(CPM_SEC) LD DE,(UNA,k NNNNNNNNNNNNNNNN)%6NNNNNNNNNNNNNNNNNNNNNNALLOC: XOR A,A ;COUNT = 0 LD (UNA_CNT),A ; INC A ;PREREAD FLAG = TRUE LD (RSFLAG),A ; ; ; ; COMMON CODE FOR REAqNNNNNNNNNNNNNNNNN)+9NNNNNNNNNNNNNNNNNNNNNN LD (HL),1 ;BUFFER = ACTIVE IN ANY CASE ; OR A,A JR Z,FILHST ; ; HOST BUFFER ACTIVE, SAME AS SEEK BUFFER? ; LD A,(PNNNNNNNNNNNNNNNN){GNNNNNNNNNNNNNNNNNNNNNN Z,WZRPG ; ; ELSE DO NEXT SEGMENT ; LD HL,(LDRPTR) JR W_NXTSEG ; ; ; WARM BOOT ERROR, OUTPUT MSG & GO TO DEBUGGER NNNNNNNNNNNNNNNNNN)NNNNNNNNNNNNNNNNNNNNNN START IN PAGE 0 ; LD A,0C3H LD HL,BIOS + 3 LD (PAGE0),A LD (PAGE0 + 1),HL ; ; INIT BDOS CALL VECTOR IN PAGE 0 ; NNNNNNNNNNNNNNNN)>*NNNNNNNNNNNNNNNNNNNNNN OK; /0: ERROR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; DISKRD: ; ; SET UP DATA9DNNNNNNNNNNNNNNNN)ҒNNNNNNNNNNNNNNNNNNNNN!WRITE DISK SECTOR FUNCTION ; ENTRY- C= WRITE TYPE: ; 0: WRITE TO ALLOCATED BLOCK (UPDATE) ; 1: WRITE TO DIRECTORY BLOCK (wNNNNNNNNNNNNNNNN)NNNNNNNNNNNNNNNNNNNNNN JP NZ,CHKUNA ; ; COUNT = NUMBER_OF_SECTORS_IN_BLOCK ; LD A,(IY + DPB_BLM) ;CUR_DPB.DPBBLM + 1 ::= (BLKSIZ/128) INC A 1NNNNNNNNNNNNNNNNN) NNNNNNNNNNNNNNNNNNNNNN_SEC) SBC HL,DE JR NZ,ALLOC ; ; MATCH, MOVE TO NEXT SECTOR FOR FUTURE REF ; EX DE,HL ;UNASEC += 1 INC HL LD (UNANNNNNNNNNNNNNNNN)&eNNNNNNNNNNNNNNNNNNNNNND AND WRITE FOLLOWS ; RWOPER: ; ; ASSUME NO ERRORS ; XOR A,A LD (IOPB + PB_STATO),A ; ; COMPUTE BUFFER SECTOR ; =ABNNNNNNNNNNNNNNNN),^NNNNNNNNNNNNNNNNNNNNNNCPM_DSK) LD HL,BUF_DSK ;SAME DISK? CP A,(HL) JR NZ,NOMATCH ; LD HL,(BUF_TRK) ;SAME TRACK? LD DE,(CPM_TRK) SBC HL,DEчdNNNNNNNNNNNNNNNN)HvNNNNNNNNNNNNNNNNNNNNN! ; ENTRY- A= ERROR CODE: ; 0: SELECT DISK ERROR ; 1: NO SYSTEM SEGMENTS IN BOOT DIRECTORY ; 2: READ ERROR ; 3: BIOS ϊNNNNNNNNNNNNNNNNNN) NNNNNNNNNNNNNNNNNNNNN! LD HL,BDOS + 6 LD (BDOSJV),A LD (BDOSJV + 1),HL ; ; INIT BIOS CALL VECTOR IN PAGE 0 ; LD HL,BIOFUNC LD (BFUNRSV),AnNNNNNNNNNNNNNNNNN) NNNNNNNNNNNNNNNNNNNNNN TABLE PTRS ; PUSH IX LD IX,(CUR_DDT) ; PUSH IY LD IY,(CUR_DPB) ; ; IF NOT BLOCKED THEN USE CPM READ ; LD A,(IY rNNNNNNNNNNNNNNNN)NNNNNNNNNNNNNNNNNNNNNNALLWAYS WRITE) ; 2: WRITE TO UNALLOCATED BLOCK (NO NEED TO PRE-READ) ; ;****************************************************NNNNNNNNNNNNNNNN)¬NNNNNNNNNNNNNNNNNNNNNN LD (UNA_CNT),A ; ; SET DISK TO SEEK ; LD A,(CPM_DSK) LD (UNA_DSK),A ; ; SET TRACK TO SEEK ; LD HL,(CPM_TRK) L`NNNNNNNNNNNNNNNNNN)!(NNNNNNNNNNNNNNNNNNNNNN_SEC),HL ; ; IF PAST LAST SECTOR ON TRACK THEN USE 1ST SECTOR OF NEXT TRACK ; LD E,(IY + DPB_SPT) LD D,(IY + DPB_SPT +1?0NNNNNNNNNNNNNNNNN)'TNNNNNNNNNNNNNNNNNNNNNN LD HL,(CPM_SEC) DEC HL ;CONVERT PHYSICAL SECTOR TO LOGICAL ; LD A,(IY + DPB_PSH) ;USE PHYSICAL SHIFT FACTOR (CP/M 3.X) +HNNNNNNNNNNNNNNNN)-mNNNNNNNNNNNNNNNNNNNNNN JR NZ,NOMATCH ; LD DE,(BUF_PSEC) ;SAME SECTOR? LD HL,(BUF_SEC) SBC HL,DE JR Z,MATCH ;SKIP IF MATCH ; NOMATCH: ; ÞNNNNNNNNNNNNNNNN)NNNNNNNNNNNNNNNNNNNNNNOVERWRITTEN ; 4,5: SPARES ; 6..255: SEGMENT COUNT (TOO MANY SEGMENTS) ; W_EROR: PUSH AF ;SAVE ERROR CODE ; LD HL,MSGeNNNNNNNNNNNNNNNNNNN) NNNNNNNNNNNNNNNNNNNNN! LD (BFUNRSV + 1),HL ; ; SET DEFAULT SECTOR BUFFER ; LD BC,DEFBFR CALL SETDMA ; IF INTCPTS ; ; PUT BDOS VECTO3BNNNNNNNNNNNNNNNNN)VNNNNNNNNNNNNNNNNNNNNNN + DPB_PSH) ;0= 128-BYTE SECTORS OR A,A JP Z,DISKRDN ; ; READS DON'T NEED ALLOCATION ; XOR A,A LD (UNA_CNT),A ; ;#QNNNNNNNNNNNNNNNN)NNNNNNNNNNNNNNNNNNNNNN************************* ; DISKWR: ; ; REMOVE BOOT WRITE PROTECTION ; XOR A,A LD (WR_PROT),A ; ; SET PTRS TO DISoNNNNNNNNNNNNNNNNN)[;NNNNNNNNNNNNNNNNNNNNNND (UNA_TRK),HL ; ; SET SECTOR TO SEEK ; LD HL,(CPM_SEC) LD (UNA_SEC),HL ; ; IF NO UNALLOCATED SECTORS REMAIN THEN PN[NNNNNNNNNNNNNNNN)"}NNNNNNNNNNNNNNNNNNNNNN) SBC HL,DE JP C,NOOVF ; LD HL,0 ;SECTOR = 1 LD (UNA_SEC),HL ; LD HL,(UNA_TRK) ;TRACK++ INC HL LD (UNA_TRK),HL uNNNNNNNNNNNNNNNNN)(jNNNNNNNNNNNNNNNNNNNNNN AND A,3 ;LIMIT TO 1024 BYTE SECTORS JP Z,NOSECSHF ;IF ALREADY 0 THEN SECTOR SIZE IS 128 ; SECSHFLP: SRL H ;ELSE SHIKNNNNNNNNNNNNNNNN).8NNNNNNNNNNNNNNNNNNNNN! ; IF BUFFER == DIRTY THEN WRITE IT OUT BEFORE READING NEW ONE ; CALL BUF_FLSH ;CLEAR HOST BUFF ; JR NZ,RW_RET ;IF ERROR4 NNNNNNNNNNNNNNNNN)NNNNNNNNNNNNNNNNNNNNNNLE ;OUTPUT ERROR MESSAGE CALL EDITOR ; ; DISPLAY ERROR CODE ; POP AF LD C,A LD A,MF_PHXB CALL MR_FUN ; ; EXEC{ !NNNNNNNNNNNNNNNN) NNNNNNNNNNNNNNNNNNNNNNR INTO INTERCEPT CODE ; LD HL,(BDOS + 7) LD (BDOSV),HL ; ; NOW PUT INTERCEPT VECTOR INTO BDOS CODE ; LD HL,INTCPT PHNNNNNNNNNNNNNNNNN)-gNNNNNNNNNNNNNNNNNNNNNN READ_OPERATION_FLAG = TRUE (1) ; INC A LD (READOP),A ; ; PRE-READ_OF_DATA_FLAG = TRUE ; LD (RSFLAG),A ; ; TRE/NNNNNNNNNNNNNNNN)NNNNNNNNNNNNNNNNNNNNNNK DATA ; PUSH IX LD IX,(CUR_DDT) ; PUSH IY LD IY,(CUR_DPB) ; ; IF NOT BLOCKED THEN USE CPM WRITE ; LD A,(IY + DNNNNNNNNNNNNNNNN)h NNNNNNNNNNNNNNNNNNNNNNREREAD ; CHKUNA: LD A,(UNA_CNT) OR A,A JP Z,ALLOC ; ; ELSE MORE UNALLOCATED RECORDS REMAIN, COUNT-- ; DEC A LD (UNNNNNNNNNNNNNNNN)#NNNNNNNNNNNNNNNNNNNNNN! ; NOOVF: ; ; MATCH FOUND, MARK AS UNNECESSARY READ ; XOR A,A ;PREREAD FLAG = FALSE LD (RSFLAG),A JP RWOPER ; ; yNNNNNNNNNNNNNNNNNN))[NNNNNNNNNNNNNNNNNNNNNNFT OVER TO PHYSICAL SECTOR RR L DEC A JP NZ,SECSHFLP ; NOSECSHF: INC HL ;SET BACK TO PHYSICAL SECTOR LD (BUF_PSEC),5 NNNNNNNNNNNNNNNNN)/ NNNNNNNNNNNNNNNNNNNNNN THEN ABORT ; FILHST: ; ; READ THE SECTOR BUFFER ; LD A,(CPM_DSK) ;BUFFER SECTOR = PHYSICAL SECTOR LD (BUF_DSK),A ; lFNNNNNNNNNNNNNNNN)NNNNNNNNNNNNNNNNNNNNNNUTE DEBUGGER ; CALL MR_BRK HALT ; ; ; BOOT OK, INIT PAGE 0 ; WZRPG: ; ; IF FRONT OF BIOS OVERWRITTEN THEN ERROR  NNNNNNNNNNNNNNNNNN) XHNNNNNNNNNNNNNNNNNNNNNNLD (BDOS + 7),HL ENDIF ; ; PASS DEFAULT DISK TO CCP ; LD A,(DEFDRV) LD C,A JP CCP SUBTTL BIOS DISK FUNCTION BNNNNNNNNNNNNNNNN)x4NNNNNNNNNNNNNNNNNNNNNNAT AS UNALLOCATED BLOCK ; LD A,WRUAL LD (WRTYPE),A ; JP RWOPER ;TO PERFORM THE READ ; ; ; NORMAL NON-BLOCKED READ &NNNNNNNNNNNNNNNNN)NNNNNNNNNNNNNNNNNNNNNNPB_PSH) ;0= 128-BYTE SECTORS OR A,A JP Z,DISKWRN ; ; READ_OP_FLAG = FALSE ; XOR A,A LD (READOP),A ; ; SAVE WRITNNNNNNNNNNNNNNNN)=YNNNNNNNNNNNNNNNNNNNNNNNA_CNT),A ; ; IF REQUESTED SECTOR != UNALLOCATED SECTOR THEN PURGE ; LD A,(CPM_DSK) ;SAME DISK? LD HL,UNA_DSK CP A,(HSNNNNNNNNNNNNNNNNNN)$NNNNNNNNNNNNNNNNNNNNNN; NORMAL NON-BLOCKED WRITE ; DISKWRN: CALL CPM_WR JP RW_RET ; ; ; NOT AN UNALLOCATED RECORD, REQUIRES PRE-READ ; 4NNNNNNNNNNNNNNNNN)*NNNNNNNNNNNNNNNNNNNNN!HL ;BUFFER PHYSICAL SECTOR TO ACCESS ; ; IF BUFFER == EMPTY THEN READ THE PHYSICAL SECTOR ; LD HL,BUF_ACT LD A,(HL) ; '2NNNNNNNNNNNNNNNNN)0NNNNNNNNNNNNNNNNNNNNNN LD HL,(CPM_TRK) LD (BUF_TRK),HL ; LD HL,(BUF_PSEC) LD (BUF_SEC),HL ; ; IF REQUIRED TO READ THEN READ ; LD A,(RSFgNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNŃh6҅l:Չp> ٍvDᑯ|I啲NꙹU"𝽞Z'¢],ȦNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN)$NNNNNNNNNNNNNNNNNNNNNNLAG) ;NEED TO READ? OR A,A CALL NZ,BUF_RD ;YES, IF 1 ; ; BUFFER = CLEAN ; XOR A,A LD (BUF_MOD),A ; MATCH: ; ;ANNNNNNNNNNNNNNNNN)NNNNNNNNNNNNNNNNNNNNNN BUFFER DATA PTRS FOR LATER FLUSHES ; LD (BUF_DDT),IX LD (BUF_DPB),IY ; EX DE,HL ;SOURCE/DEST SWAP ; RWMOVE: ; ; jhNNNNNNNNNNNNNNNN) \INNNNNNNNNNNNNNNNNNNNNN****************************** ; ; CPM_WR PERFORMS THE PHYSICAL WRITE FROM CPM_DMA TO THE DISK. ; ENTRY- (CPM_DSK)= DISK # TOa!NNNNNNNNNNNNNNNN)|5NNNNNNNNNNNNNNNNNNNNNN.PB_STATO)= 0: OK, /0: ERROR ; ;**************************************************************************** ; CPM_RD2: ; yNNNNNNNNNNNNNNNN)NNNNNNNNNNNNNNNNNNNNNN ; LD HL,LL_READ ; ; COMMON CODE ; CPM_RW: PUSH HL LD HL,CPM_TRK ; ; FALL INTO COMMON XFER CODE ; ;*********INNNNNNNNNNNNNNNNN)9XNNNNNNNNNNNNNNNNNNNNNN ; (BUF_PSEC)= SECTOR # TO WRITE TO ; (BUF_DDT)= DDT PTR ; (BUF_DPB)= DPB PTR ; EXIT - (IOPB.PB_STATO)= 0: OK, /0: ERROR ENNNNNNNNNNNNNNNN)%NNNNNNNNNNNNNNNNNNNNNN# TO WRITE TO ; (BUF_TRK)= TRACK # TO WRITE TO ; (BUF_SEC)= SECTOR # TO WRITE TO ; IX= DDT PTR ; IY= DPB PTR ; EXIT - (BNNNNNNNNNNNNNNNN)+ NNNNNNNNNNNNNNNNNNNNN!UF_RW: PUSH HL LD HL,BUF_TRK JP RD_WR ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; rNNNNNNNNNNNNNNNN)LwNNNNNNNNNNNNNNNNNNNNNN COPY DATA TO OR FROM BUFFER ; LD HL,(CPM_SEC) ;CALCULATE INDEX INTO BUFFER DEC HL ;CONVERT TO LOGICAL SECTOR (0..N-1) NNNNNNNNNNNNNNNNN)NNNNNNNNNNNNNNNNNNNNN!BC INITIALLY 128, DE IS SOURCE, HL IS DEST ; LDIR ; ; DATA HAS BEEN MOVED TO/FROM HOST BUFFER, IF NOT DIRECTORY THEN DELAQNNNNNNNNNNNNNNNN) NNNNNNNNNNNNNNNNNNNNNN WRITE TO ; (CPM_TRK)= TRACK # TO WRITE TO ; (CPM_SEC)= SECTOR # TO WRITE TO ; (CPM_DMA)= XFER ADDRESS ; IX= DDT PTR ; HBNNNNNNNNNNNNNNNN)NNNNNNNNNNNNNNNNNNNNNN; SET UP PTRS ; PUSH IX PUSH IY LD IX,(CUR_DDT) LD IY,(CUR_DPB) ; ; EXECUTE READ SECTOR ; CALL CPM_RD ; ; NNNNNNNNNNNNNNNN)ƭNNNNNNNNNNNNNNNNNNNNN!******************************************************************* ; ; SET UP IOPB FOR EXECUTION ; ENTRY- HL= PTR TO IOPB IM|INNNNNNNNNNNNNNNNN) ,NNNNNNNNNNNNNNNNNNNNNN; ;**************************************************************************** ; BUF_FLSH: ; ; IF UNMODIFIED THEN RETURNXNNNNNNNNNNNNNNNNN)&UNNNNNNNNNNNNNNNNNNNNNNIOPB.PB_STATO)= 0: OK, /0: ERROR ; ;**************************************************************************** ; BUF_WR: !NNNNNNNNNNNNNNNN),iNNNNNNNNNNNNNNNNNNNNNN ; SELECT DRIVE FUNCTION ; LOG-ON - SET DISK PARAMETER BLOCK ; ENTRY- C= DRIVE # ; E= 0 IF NEW SELECT ; EXIT - HL= PTR TO D'NNNNNNNNNNNNNNNN)FNNNNNNNNNNNNNNNNNNNNNN LD A,L ; AND A,(IY + DPB_PHM) ;USE PHYSICAL RECORD MASK DATA (CP/M 3.X) ; RRA ;BITS <7..1> -> BITS <14..8> LD H,A 6 NNNNNNNNNNNNNNNNN) NNNNNNNNNNNNNNNNNNNNNNY WRITE ; LD A,(WRTYPE) ;IF NOT DIRECTORY THEN DELAY WRITE CP A,WRDIR LD A,(IOPB + PB_STATO) ;RETURN ANY ERRORS ANYWAY CNNNNNNNNNNNNNNNNN):+NNNNNNNNNNNNNNNNNNNNN! IY= DPB PTR ; EXIT - (IOPB.PB_STATO)= 0: OK, /0: ERROR ; ;******************************************************************nNNNNNNNNNNNNNNNN)֓NNNNNNNNNNNNNNNNNNNNNNRESTORE PTRS & RETURN ; POP IY POP IX RET ;*************************************************************************3NNNNNNNNNNNNNNNN)NNNNNNNNNNNNNNNNNNNNNNAGE TRACK DATA ; IX= DDT PTR ; IY= DPB PTR ; (SP)= ADDRESS {LL_READ, LLWRIT} OF EXECUTOR ; ;****************************NNNNNNNNNNNNNNNNN)!NNNNNNNNNNNNNNNNNNNNNN ; LD A,(BUF_MOD) OR A,A RET Z ; ; ELSE SET PTRS TO BUFFER DATA ; PUSH IX PUSH IY LD IX,(BUF_DDT) LD IY,(BUFHNNNNNNNNNNNNNNNNN)'dNNNNNNNNNNNNNNNNNNNNNN; LD HL,LL_WRIT JP BUF_RW ;**************************************************************************** ; ; RDBUF PER?NNNNNNNNNNNNNNNN)-ZNNNNNNNNNNNNNNNNNNNNNNPT OR 0 FOR ERROR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; SELDSK: ; ; STORE DR3NNNNNNNNNNNNNNNN)NNNNNNNNNNNNNNNNNNNNNN; LD A,0 ;BIT 0 -> BIT 7 RRA LD L,A ; ; HL HAS RELATIVE HOST BUFFER ADDRESS ; LD DE,BLKBUF ADD HL,DE ;HL = HOST۷NNNNNNNNNNNNNNNNNN) NNNNNNNNNNNNNNNNNNNNN! JR NZ,RW_RET ; ; IF ERROR THEN ABORT ; OR A,A JR NZ,RW_RET ; ; NO ERROR/DIRECTORY WRITE ; XOR A,A ;BUFFER = C&9NNNNNNNNNNNNNNNNN))fNNNNNNNNNNNNNNNNNNNNNN********** ; CPM_WR: ; LD HL,LL_WRIT JP CPM_RW ;********************************************************************pNNNNNNNNNNNNNNNN)NNNNNNNNNNNNNNNNNNNNN!*** ; ; CPM_RD PERFORMS THE PHYSICAL READ FROM THE DISK INTO CPM_DMA. ; ENTRY- (CPM_DSK)= DISK # TO READ FROM ; (CPM_TRK)= NNNNNNNNNNNNNNNNN)l NNNNNNNNNNNNNNNNNNNNNN************************************************ ; RD_WR: LD DE,IOPB + PB_TRKO LD BC,PB_BCNTO - PB_TRKO LDIR ; ; EXECUNNNNNNNNNNNNNNNN)"JNNNNNNNNNNNNNNNNNNNNNN_DPB) ; ; WRITE THE BUFFER DATA ; CALL BUF_WR ; ; RESTORE THE PTRS ; POP IY POP IX ; ; IF ERROR THEN RETURN NNNNNNNNNNNNNNNNN)(ZNNNNNNNNNNNNNNNNNNNNNNFORMS THE PHYSICAL READ FROM THE HOST DISK INTO BLKBUF. ; ENTRY- (BUF_DSK)= DISK # TO READ FROM ; (BUF_TRK)= TRACK # TO READ YNNNNNNNNNNNNNNNNN).NNNNNNNNNNNNNNNNNNNNN!IVE # FOR FUTURE USE ; LD A,C LD (CPM_DSK),A ; ; SAVE LOGON REQUEST FLAG ; LD A,E LD (LOGRQ),A ; ; COMPUTE DISNNNNNNNNNNNNNNNNNN)NNNNNNNNNNNNNNNNNNNNNN ADDRESS ; LD DE,(CPM_DMA) ;GET/PUT CP/M DATA LD BC,128 ;LENGTH OF MOVE ; LD A,(READOP) ;WHICH WAY? OR A,A JP NZ,RWSNNNNNNNNNNNNNNNNN) NNNNNNNNNNNNNNNNNNNNN!LEAN LD (BUF_MOD),A ; CALL BUF_WR ;WRITE TO DISK ; LD A,(IOPB + PB_STATO) ;RETURN ANY ERRORS ; ; DONE, RESTORE & R؁INNNNNNNNNNNNNNNNN)WNNNNNNNNNNNNNNNNNNNNN!******** ; ; CPM_RD2 PERFORMS THE PHYSICAL READ FROM THE DISK INTO CPM_DMA, ; WITHOUT BLOCKING. ; ENTRY- (CPM_DSK)= DISK # TMNNNNNNNNNNNNNNNN)NNNNNNNNNNNNNNNNNNNNNNTRACK # TO READ FROM ; (CPM_SEC)= SECTOR # TO READ FROM ; (CPM_DMA)= XFER ADDRESS ; IX= DDT PTR ; IY= DPB PTR ; EXIT - NNNNNNNNNNNNNNNN)_:NNNNNNNNNNNNNNNNNNNNN!TE LOW LEVEL READ OR WRITE (ON STACK) ; RET ;***************************************************************************NNNNNNNNNNNNNNNN)#yNNNNNNNNNNNNNNNNNNNNNNIT ; OR A,A RET NZ ; ; ELSE CLEAN BUFFER ; LD (BUF_MOD),A RET ;**********************************************"NNNNNNNNNNNNNNNNN))kNNNNNNNNNNNNNNNNNNNNNNFROM ; (BUF_SEC)= SECTOR # TO READ FROM ; IX= DDT PTR ; IY= DPB PTR ; EXIT - (IOPB.PB_STATO)= 0: OK, /0: ERROR ; ;*****` NNNNNNNNNNNNNNNNN)/ ڍvCߑ{H䕱MꙹU"𝽞Y&\+ǦNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN*NNNNNNNNNNNNNNNNNNNNNNRAMETER BLOCK ADDRESS ; INC HL ;DRV INC HL ;DPB_PTR LD E,(HL) INC HL LD D,(HL) LD (CUR_DPB),DE ; ; FETCH DISK8[NNNNNNNNNNNNNNNNN*nNNNNNNNNNNNNNNNNNNNNNN ALL CASES) ; LD A,(IOPB + PB_ST2O) CP A,-1 ;-1:NONE, 0:JADE, 1:DESCRIPTOR, 2: EXTENDED, ; 3: PARTITIONED, ID JR ZNNNNNNNNNNNNNNNN* NNNNNNNNNNNNNNNNNNNNN!_HEADS) ; SEL1: LD (IX + DDT_HDS),A ; ; RETURN DRIVE TABLE PTR ; LD HL,(CUR_DPH) XOR A,A ;RETURN NO-ERROR JR LGDON BIT_BUCKET ; SRL H RR L RRA ;TRK BIT 0 -> SECTOR BIT 15 LD (MrNNNNNNNNNNNNNNNN*"MNNNNNNNNNNNNNNNNNNNNNNA,MAXFUNCS LD A,-1 RET NC ; ; ELSE COMPUTE TABLE ENTRY ; PUSH HL ;SAVE POSSIBLE DATA ; LD HL,BFUNTBL LD A,C A_NNNNNNNNNNNNNNNNN*(>NNNNNNNNNNNNNNNNNNNNNN++++++++++++++ ; ; RETURN BIOS VERSION # FUNCTION #0 ; EXIT - HL= VERSION # IN BINARY {0.00,..655.35} ; ;++++++++++++++++++3NNNNNNNNNNNNNNNNN*. NNNNNNNNNNNNNNNNNNNNNNCTION ; ENTRY- C= DRIVE # ; EXIT - E:HL= DRIVER TABLE BASE PTR ; NZ= ILLEGAL DRIVE (HL= 0) ; A, B, C= ? ; ;+++++++++++++;NNNNNNNNNNNNNNNNN*NNNNNNNNNNNNNNNNNNNNNNNUTPUT FUNCTION # ; POP BC LD A,MF_PHXB CALL XMROM ; ; OUTPUT NEW LINE ; CALL CRLF ; ; RETURN NULLS ; XOR A,!NNNNNNNNNNNNNNNN+YNNNNNNNNNNNNNNNNNNNNNN_GCAL JP XMROM ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN TIME FUNCTION 9NNNNNNNNNNNNNNNN+SNNNNNNNNNNNNNNNNNNNNNN+++++++++ ; CI: LD A,MF_CI JP XMROM ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; "NNNNNNNNNNNNNNNN+"NNNNNNNNNNNNNNNNNNNNNN+++++++++++ ; READER: LD A,CTRLZ ;FAKE EOF ; ; FALL INTO PUNCH RETURN ; ;******************************************NNNNNNNNNNNNNNNNN+(NNNNNNNNNNNNNNNNNNNNNN+++++++++++++ ; LISTST: LD A,MF_LOS JP XMROM ;***********************************************************************NNNNNNNNNNNNNNNNNN+.դNNNNNNNNNNNNNNNNNNNNNN########################################################################### ; IOPB: REPT PB_SIZE LIST OFF DB 0 LIST ON ՁNNNNNNNNNNNNNNNNN+NNNNNNNNNNNNNNNNNNNNNN NON-DISK PROCEDURES ;*************************************************************************** ; ; NEWLINE PROCEDURE ; ;Rd'NNNNNNNNNNNNNNNNN+ ,NNNNNNNNNNNNNNNNNNNNNNED BY WARM BOOT RTN ; ; THE FOLLOWING CONDITIONAL JUMP IS MODIFIED TO AN UNCONDITIONAL JUMP BY ; THE WARM BOOT ROUTINE IF TNNNNNNNNNNNNNNNNN+NNNNNNNNNNNNNNNNNNNNNNA ;BC = HL = A = 0 LD L,A LD H,A LD C,A LD B,A RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\lNNNNNNNNNNNNNNNN+jNNNNNNNNNNNNNNNNNNNNNN2H ; EXIT - A= SECONDS ; B= MINUTES ; C= HOURS ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++`=rNNNNNNNNNNNNNNNN+bNNNNNNNNNNNNNNNNNNNNNN ; RETURN CONSOLE STATUS ; EXIT - A= 0: NOT READY ; FFH: CHAR READY ; ;+++++++++++++++++++++++++++++++++++++++++++++++++ BNNNNNNNNNNNNNNNN+#NNNNNNNNNNNNNNNNNNNNN!********************************** ; ; PUNCH DRIVER ; ENTRY- C= CHAR TO OUTPUT ; ;*****************************************NNNNNNNNNNNNNNNNN+)L3NNNNNNNNNNNNNNNNNNNNNN***** ; ; MESSAGE EDITOR ; ENTRY- HL= TEXT PTR (BIT 7= 1: TERMINATOR) ; EXIT - REGS= ? ; ;********************************QHNNNNNNNNNNNNNNNNN+/NNNNNNNNNNNNNNNNNNNNNN ENDM ;############################################################################ ; ; DISK DRIVER TABLES (DDT) ; ;###ۼNNNNNNNNNNNNNNNN+ZNNNNNNNNNNNNNNNNNNNNNN*************************************************************************** ; CRLF: LD C,CR CALL COC LD C,LF JP COC *NNNNNNNNNNNNNNNN+ NNNNNNNNNNNNNNNNNNNNNNHE CLOCK/CALENDAR BOARD IS NOT PRESENT ; IF NOT MODIFIED, THEN IT IS ALLWAYS FALSE (NOP). ; INHCLK: JR C,ILLEGC ; ; NOW C-rNNNNNNNNNNNNNNNN+\NNNNNNNNNNNNNNNNNNNNNN++++++++++++++++ ; ; CDOS RETURN VERSION FUNCTION ; MAKES CLOCK/CALENDAR WORK. ; EXIT - B= 1 ; ;+++++++++++++++++++++++++āINNNNNNNNNNNNNNNNN+zNNNNNNNNNNNNNNNNNNNNNN+++++ ; CLKTIM: LD A,MF_GTIM JP XMROM ENDIF ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++NNNNNNNNNNNNNNNN+1NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++ ; CNSCK: LD A,MF_CIS JP XMROM ;**********************************************************eHNNNNNNNNNNNNNNNNN+$:oNNNNNNNNNNNNNNNNNNNNNN*********************************** ; PUNCH: RET ;***********************************************************************PyNNNNNNNNNNNNNNNNN+*`NNNNNNNNNNNNNNNNNNNNN!******************************************** ; EDITOR: CALL GETBNK LD E,A LD A,MF_PUTS JP XMROM SUBTTL INITIALIZ$NNNNNNNNNNNNNNNNN+0NNNNNNNNNNNNNNNNNNNNNN######################################################################### ; STRUCT 0 DDT_EXE DS 2 ;START ADDRESS OF DISK DRIDONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNŃg5хl:Չp= ؍uC|I啲M陸U#񝿞[(¢]+ǦNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN+LNNNNNNNNNNNNNNNNNNNNN!VER DDT_FLG DS 1 ;FLAGS BIT DEF. ; 0 1: INHIBIT LOGON ; 1..3 PARTITION # {0,..7} ; 4 1: HARD DISK DRIVE ; DD֤NNNNNNNNNNNNNNNNN+^NNNNNNNNNNNNNNNNNNNNN!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ALLDRV MACRO #DADD,#PD,#FLG,#DPB,#DPH,#HDS,#SOF DW #DADD ;DRIVER EXECUTION ADDR K;$NNNNNNNNNNNNNNNN+ !NNNNNNNNNNNNNNNNNNNNNN; C DDT_2: ALLDRV HDEXEC,6,10H,D2DPB,D2DPH,4,0 ; D DDT_3: ALLDRV HDEXEC,6,12H,D3DPB,D3DPH,4,8000H ; E DDT_4: ALLDRV HUNNNNNNNNNNNNNNNN+]NNNNNNNNNNNNNNNNNNNNNN###################################################################### ; SD8PBK: DW 26 ;SECTORS PER TRACK DB 3 ;BLOCK SHIFbNNNNNNNNNNNNNNNN+~NNNNNNNNNNNNNNNNNNNNN! DB 31 ;BLOCK MASK (BLM) DB 1 ;NULL MASK (EXM) DW 1015 ;DISK SIZE (CLUSTERS -1) (DSM) DW 1152 / 2 ;DIRECTORY MAX —INNNNNNNNNNNNNNNNN+0NNNNNNNNNNNNNNNNNNNNNN@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ALLDPH: MACRO #D LIST ON D#D(DD)DPH: ;DRIVE PARAMETERNNNNNNNNNNNNNNNN+%>nNNNNNNNNNNNNNNNNNNNNNNY ; ;############################################################################ ; LOGIOPB: DB PB_LOGC ;COMMAND DB 0 ;DNNNNNNNNNNNNNNNN++aNNNNNNNNNNNNNNNNNNNNNN DS 2 ;XFER ADDR CPM_DMAB DS 1 ;XFER BANK ; ; ; BUFFER IOPB OVERLAY ; BUF_DSK DS 1 ;BUFFER DISK NUMBER BUF_TRK DS 2 ;BUm?rNNNNNNNNNNNNNNNN+NNNNNNNNNNNNNNNNNNNNNNT_DRV DS 1 ;PHYSICAL DRIVE # DDT_DPB DS 2 ;DPB ADDRESS FOR THIS DRIVE DDT_DPH DS 2 ;DPH ADDRESS FOR THIS DRIVE ; ; THE FOLHNNNNNNNNNNNNNNNNN+NNNNNNNNNNNNNNNNNNNNNNNDB #FLG ;FLAGS DB #PD ;MONITOR PHYSICAL DRIVE # DW #DPB ;DISK PARAMETER BLOCK PTR DW #DPH ;DISK PARAMETER HEADER PTR NNNNNNNNNNNNNNNN+rNNNNNNNNNNNNNNNNNNNNNNDEXEC,7,10H,D4DPB,D4DPH,4,0 ; F DDT_5: ALLDRV HDEXEC,7,12H,D5DPB,D5DPH,4,8000H ENDIF ;#############################aNNNNNNNNNNNNNNNN+NNNNNNNNNNNNNNNNNNNNN!T FACTOR DB 7 ;BLOCK MASK DB 0 ;NULL MASK DW 242 ;DISK SIZE -1 DW 63 ;DIRECTORY MAX DB 11000000B ;ALLOC 0 DB 0 a NNNNNNNNNNNNNNNN++NNNNNNNNNNNNNNNNNNNNNN (DRM) DB 0FFH ;ALLOCATION 0 (AL0) DB 10000000B ;ALLOCATION 1 (AL1) DW 0 ;CHECK SIZE (CKS) DW 2 ;TRACK OFFSET ?NNNNNNNNNNNNNNNNN+ NNNNNNNNNNNNNNNNNNNNNN HEADER FOR DRIVE #D(DD) DW 0 ;;SECTOR TRAN TBL (OR 0 IF NO XLATE) DW 0 ;;SCRATCH AREA DW 0 ;;" DW 0 ;;" DW DIRBF %NNNNNNNNNNNNNNNN+&k=NNNNNNNNNNNNNNNNNNNNN!RIVE DW 0 ;TRACK DW ID_SECT ;SECTOR DB 0 ;FLAGS DW BLKBUF ;DMA DB 0 ;BANK DW 0 ;COUNT ; WR_PROT DB -1 ;/0: WRITE*NNNNNNNNNNNNNNNN+,NNNNNNNNNNNNNNNNNNNNNNFFER TRACK NUMBER BUF_SEC DS 2 ;BUFFER SECTOR NUMBER DS 1 ;FLAGS BUF_DMA DS 2 BUF_DMAB DS 1 ;BANK # ; ; ; BLOCKING BUF6rNNNNNNNNNNNNNNNN+.NNNNNNNNNNNNNNNNNNNNNNLOWING MAY BE BROUGHT OFF DISK DESCRIPTOR OR FROM DEFAULT TABLES ; DDT_HDS DS 1 ;HEADS DDT_SOF DS 2 ;SECTOR OFFSET ; ; DE)NNNNNNNNNNNNNNNNN+ }NNNNNNNNNNNNNNNNNNNNN! DB #HDS ;HEADS DW #SOF ;SECTOR OFFSET ; ENDM IF BOOT = 10H ; A DDT_0: ALLDRV HDEXEC,6,10H,D0DPB,D0DPH,4,0 ; bdgNNNNNNNNNNNNNNNNN+CNNNNNNNNNNNNNNNNNNNNN!############################################### ; ; MESSAGES ; ;##########################################################NNNNNNNNNNNNNNNN+;NNNNNNNNNNNNNNNNNNNNNN;ALLOC 1 DW 16 ;CHECK SIZE DW 2 ;TRACK OFFSET DB 0 ;PHYSICAL RECORD SHIFT FACTOR DB 0 ;PHYSICAL RECORD MASK DW 0 NNNNNNNNNNNNNNNNNN+NNNNNNNNNNNNNNNNNNNNN! (OFF) DB 1 ;PHYSICAL RECORD SHIFT FACTOR (PSH) DB 1 ;PHYSICAL RECORD MASK (PRM) DW 0 ;LOGICAL DRIVE SECTOR OFFSET (SNNNNNNNNNNNNNNNNNN+!NNNNNNNNNNNNNNNNNNNNNN ;;DIRECTORY BUFFER PTR DW D#D(DD)DPB ;;DRIVE PARAMETER BLK PTR IF ((DD - 1) <= NDHD) AND ((DD - 1) >= STHD) DW 0 ;;NO N@NNNNNNNNNNNNNNNNNN+'X NNNNNNNNNNNNNNNNNNNNNN PROTECTION ENABLED ; ; LAST OF INITIALIZED CODE READ FROM DISK ; BIOSND EQU $ SUBTTL UNINITIALIZED DATA AREA ;####NNNNNNNNNNNNNNNN+-NNNNNNNNNNNNNNNNNNNNN!FER MAINTENANCE ; BUF_PSEC DS 2 ;BUFFER PHYSICAL SECTOR BUF_ACT DS 1 ;0: BUFFER FLUSHED, /0: DATA IN BUFFER BUF_MOD DS 1 ;0:NNNNNNNNNNNNNNNN+ NNNNNNNNNNNNNNNNNNNNNNFINE THE STRUCTURE SIZE ; DDT_SIZ DS 0 ENDM ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@0NNNNNNNNNNNNNNNNNN+ (NNNNNNNNNNNNNNNNNNNNNN B DDT_1: ALLDRV HDEXEC,6,12H,D1DPB,D1DPH,4,8000H ; C DDT_2: ALLDRV HDEXEC,7,10H,D2DPB,D2DPH,4,0 ; D DDT_3: ALLDRV HDEX NNNNNNNNNNNNNNNNN+NNNNNNNNNNNNNNNNNNNNN!################## ; MSGLE: DM CR,LF,'LOAD ERROR: ' ; DSKEB: DM CR,LF,'Abort, Ignore, Retry, (BDOS) - ' ; WP_ERM: DM CR,LF|NNNNNNNNNNNNNNNN+nNNNNNNNNNNNNNNNNNNNNNN;LOGICAL DRIVE SECTOR OFFSET ; ; DEFAULT DISK PHYSICAL PARAMETERS ; DB 1 ;HEADS ;##################################fNNNNNNNNNNNNNNNN+cNNNNNNNNNNNNNNNNNNNNNNOF) ; ; ; DB 4 ;HEADS ;############################################################################ ; ; DRIVE PARAM0dNNNNNNNNNNNNNNNN+"NNNNNNNNNNNNNNNNNNNNNNCHECKS ON HARD DISK ELSE DW D#D(DD)CHK ;;DRIVE DISK CHECKSUMS ARRAY PTR ENDIF DW D#D(DD)ALL ;;DRIVE CLUSTER ALLOCATINNNNNNNNNNNNNNNNN+(H2NNNNNNNNNNNNNNNNNNNNNN######################################################################## ; ; THE FOLLOWING DATA MUST RESIDE IN THIS ORDER TONNNNNNNNNNNNNNNNN+.NNNNNNNNNNNNNNNNNNNNNN BUFFER CLEAN, /0: BUFFER DIRTY (MODIFIED) ; BUF_DDT DS 2 ;BUFFER DDT PTR BUF_DPB DS 2 ;BUFFER DPB PTR ; RSFLAG: DS 1 ;0: N NNNNNNNNNNNNNNNNN+8NNNNNNNNNNNNNNNNNNNNNN@@ ; ; MACRO TO DEFINE THE DRIVER TABLE RECORD ; ENTRY- #DADD= DRIVER ADDRESS ; #PD= PHYSICAL DRIVE # ; #FLG= DRIVE FLAGS9NNNNNNNNNNNNNNNNN+ NNNNNNNNNNNNNNNNNNNNNNEC,7,12H,D3DPB,D3DPH,4,8000H ; E DDT_4: ALLDRV FD8EXEC,0,0,D4DPB,D4DPH,1,0 ; F DDT_5: ALLDRV FD8EXEC,1,0,D5DPB,D5DPH,1,0 NNNNNNNNNNNNNNNNN+?NNNNNNNNNNNNNNNNNNNNNN,'W-PROT Error!' ; IF INTCPTS ISCMSG: DM CR,LF,'ILL SYS CALL, #= ' ENDIF ;#######################################VNNNNNNNNNNNNNNNNN+]NNNNNNNNNNNNNNNNNNNNNN########################################## ; ; DEFAULT 8" HARD DISK PARAMETER BLOCK ; ;#####################################rNNNNNNNNNNNNNNNN+RNNNNNNNNNNNNNNNNNNNNNNETER HEADER AREA ; 1 PER DRIVE ; ;############################################################################ ; ;@@@@@@@@@prNNNNNNNNNNNNNNNN+#NNNNNNNNNNNNNNNNNNNNNNON BIT MAP PTR LIST OFF ENDM ; ; DEFINE THE DATA ; DD DL 1 REPT NDRVS LIST OFF ALLDPH 0123456789ABCDEF DD DL DDNNNNNNNNNNNNNNNNN+){NNNNNNNNNNNNNNNNNNNNNN MATCH THE IOPB DATA ; ;############################################################################ ; ; CP/M IOPB OVERLAYHNNNNNNNNNNNNNNNNN+/ѥNNNNNNNNNNNNNNNNNNNNN!O PREREAD REQ'D, /0: PREREAD REQ'D READOP: DS 1 ;0: WRITE OPERATION, 1: READ OPERATION WRTYPE: DS 1 ;WRITE OPERATION TYPE FROMWNNNNNNNNNNNNNNNN+mNNNNNNNNNNNNNNNNNNNNN! ; #DPB= DPB ADDRESS ; #DPH= DPH ADDRESS ; #HDS= HEADS ; #SOF= SECTOR OFFSET ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@BNNNNNNNNNNNNNNNN+ NNNNNNNNNNNNNNNNNNNNN! ENDIF IF BOOT = 3 ; A DDT_0: ALLDRV FD8EXEC,0,0,D0DPB,D0DPH,1,0 ; B DDT_1: ALLDRV FD8EXEC,1,0,D1DPB,D1DPH,1,0 9NNNNNNNNNNNNNNNN+lNNNNNNNNNNNNNNNNNNNNNN##################################### ; ; DEFAULT 8" FLOPPY DISK PARAMETER BLOCK ; IBM 3740 SINGLE DENSITY FORMAT ; ;######L|HNNNNNNNNNNNNNNNNN+MNNNNNNNNNNNNNNNNNNNNNN####################################### ; HDPBK: DW 128 ;SECTORS PER TRACK (LOGICAL) (SPT) DB 5 ;BLOCK SHIFT FACTOR (BSH)TNNNNNNNNNNNNNNNN+NNNNNNNNNNNNNNNNNNNNNN@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; GENERATE A DISK PARAMETER TABLE MACRO ; ;@@@@@@@@@@@S6HNNNNNNNNNNNNNNNNN+$ _NNNNNNNNNNNNNNNNNNNNN! + 1 LIST ON ENDM ;############################################################################ ; ; LOGON IOPB OVERLAsHNNNNNNNNNNNNNNNNN+*.PNNNNNNNNNNNNNNNNNNNNN! ; CPM_DSK DS 1 ;LOGICAL DRIVE CPM_TRK DS 2 ;LOGICAL TRACK NUMBER CPM_SEC DS 2 ;LOGICAL SECTOR NUMBER DS 1 ;FLAGS CPM_DMAvNNNNNNNNNNNNNNNNN+0NNNNNNNNNNNNNNNNNNNNNN BDOS: ; 0: WRITE TO ALLOCATED (USED) BLOCK (PREREAD) ; 1: WRITE TO DIRECTORY (PREREAD & WRITE) ; 2: WRITE TO UNALLONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNЁj7҅m;։q? ۍvDᑯ}J敳OꙹW$[*Ƣa0˦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN,QNNNNNNNNNNNNNNNNNNNNN!CATED (UNUSED) BLOCK (NO ; PREREAD REQ'D) ; ; UNA_CNT: DS 1 ;# SECTORS REMAINING IN BLOCK (CLUSTER) UNA_DSK: DS 1 ;LAST mNNNNNNNNNNNNNNNNN,8NNNNNNNNNNNNNNNNNNNNNN PTR ;############################################################################ ; ; DRIVE ALLOCATION AREAS ; ;####NNNNNNNNNNNNNNNN, 07700H) OR ($ < 8000H) CONMSG **** BIOS TOO BIG, USE MOVCPM & RE-ADJUST! **** ENDIF END  NNNNNNNNNNNNNNNN,%XsNNNNNNNNNNNNNNNNNNNNNN FUNCTION DEFINITIONS Th M5 BIO function allo program t modif BIO privat dat withou knowin wherNNNNNNNNNNNNNNNNN,+{|NNNNNNNNNNNNNNNNNNNNN! -1 th functio i no implemente (illegal I th erro cod i - the on o mor argument ar i error. NNNNNNNNNNNNNNNN,NNNNNNNNNNNNNNNNNNNNNNUNALLOC DISK UNA_TRK: DS 2 ;LAST UNALLOC TRACK UNA_SEC: DS 2 ;LAST UNALLOC SECTOR ;###################################### NNNNNNNNNNNNNNNNN,(NNNNNNNNNNNNNNNNNNNNNN######################################################################## ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@$NNNNNNNNNNNNNNNN,oNNNNNNNNNNNNNNNNNNNNNNF ALLDAL 0123456789ABCDEF DD DL DD + 1 LIST ON ENDM ;############################################################### 9NNNNNNNNNNNNNNNN,nNNNNNNNNNNNNNNNNNNNNN!DRM- DIRECTORY SIZE -1 DPB_AL0 DS 2 ;AL0,1- DIRECTORY ALLOCATION ; 1 MSB PER DIRECTORY CLUSTER ALLOCATED DPB_CKS DS 2 ;CKS+NNNNNNNNNNNNNNNN,MNNNNNNNNNNNNNNNNNNNNNNORD UPPER BITS) ; DPB_SECO DS 2 ;SOF- SECTOR OFFSET (FOR LOGICAL DRIVE) ; 0: NONE, 1..65535: OFFSET DPB_SZ DS 0 ENDM ;(VNNNNNNNNNNNNNNNNN, NNNNNNNNNNNNNNNNNNNNNN 1 REPT NDRVS LIST OFF ALLDAL 0123456789ABCDEF DD DL DD + 1 LIST ON ENDM ;######################################'NNNNNNNNNNNNNNNNN,& NNNNNNNNNNNNNNNNNNNNNN th dat i locate withi th BIOS Thes function ar accesse vi th RESTAR 28 vecto i lo memor (0028H) T,GNNNNNNNNNNNNNNNNN,,NNNNNNNNNNNNNNNNNNNNNNNo. Description  0 Return BIOS Version Number Entry- A= 0 Exit - HL= Version Number in hundredth NNNNNNNNNNNNNNNN,3NNNNNNNNNNNNNNNNNNNNNN###################################### ; ; VARIABLES ; ;##################################################################\2!NNNNNNNNNNNNNNNN, NNNNNNNNNNNNNNNNNNNNNN@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; MACRO TO DEFINE THE DRIVE ALLOCATION & CHECKSUMS AREA ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@$dNNNNNNNNNNNNNNNN,^NNNNNNNNNNNNNNNNNNNNNN############# ; ; RESERVE DRIVE PARAMETER BLOCKS ; ;######################################################################φNNNNNNNNNNNNNNNN,]NNNNNNNNNNNNNNNNNNNNNN- # DIRECTORY SECTORS CHECKED ; (DRM +1) / 4 DPB_OFF DS 2 ;OFF- # RESERVED TRACKS (USUALLY 2) ; ; ADDITIONAL CP/M 3.0 DNNNNNNNNNNNNNNNNN,~NNNNNNNNNNNNNNNNNNNNNN ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; GENERATE THE DPB FOR DRIVE MACRO ; ;@NNNNNNNNNNNNNNNNN,!NNNNNNNNNNNNNNNNNNNNNN M5b BIOS v3.16 FUNCTIONS INTERFACE SPECIFICAzNNNNNNNNNNNNNNNN,'>NNNNNNNNNNNNNNNNNNNNNNhi vecto i initialize t Jum instructio b th BIO War Boo code Th function ar use b puttin th functio Q4NNNNNNNNNNNNNNNNN,-NNNNNNNNNNNNNNNNNNNNNNs {0.00 to 655.35} 1 Return Monitor Drive Number for CP/M Drive Number Entry- A= 1 C= CP/M driv}BNNNNNNNNNNNNNNNN,mNNNNNNNNNNNNNNNNNNNNNN########## ; CUR_DPB DS 2 ;DRIVE TABLE PTR CUR_DDT DS 2 ;DRIVE DRIVER TABLE BASE ADDRESS PTR CUR_DPH DS 2 ;DPH PTR ; LOGRQ`4NNNNNNNNNNNNNNNNNN, NNNNNNNNNNNNNNNNNNNNNNN@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; ALL = (DSM / 8) + 1 ; CHK = DPB.CKS ; ALLDAL: MACRO #D LIST ON IF ((DD -UNNNNNNNNNNNNNNNNN,NNNNNNNNNNNNNNNNNNNNN!###### ; STRUCT 0 DPB_SPT DS 2 ;SPT- SECTORS/TRACK DPB_BSH DS 1 ;BSH- BLOCK SHIFT FACTOR DETERMINED BY CLUSTER SIZE ; 1NNNNNNNNNNNNNNNN,NNNNNNNNNNNNNNNNNNNNNNATA (ALSO COULD BE USED BY CP/M 2.2 DEBLOCKING) ; DPB_PSH DS 1 ;PSH- PHYSICAL RECORD SHIFT FACTOR BASED ON BYTES/SEC ; 0: ANNNNNNNNNNNNNNNNN,~NNNNNNNNNNNNNNNNNNNNNN@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ALLDPB: MACRO #D LIST ON D#D(DD)DPB: DS DPB_SQrNNNNNNNNNNNNNNNN,"NNNNNNNNNNNNNNNNNNNNNNTION May 1,1992 REV. NC NNNNNNNNNNNNNNNNN,(./NNNNNNNNNNNNNNNNNNNNNNnumbe i th A-register an othe require argument i th specifie registers an executin eithe RESTARԠ 28 in4NNNNNNNNNNNNNNNN,.NNNNNNNNNNNNNNNNNNNNN!e number {0..15} Exit - A= {0..254}: Monitor drive number -2: Drive error BC,DE,HL7NNNNNNNNNNNNNNNNNN,^NNNNNNNNNNNNNNNNNNNNNN: DS 1 ;LOG ON REQUEST REG. ; ; BOOT DATA ; BD_SIZE EQU 16 ;MAX SIZE OF SYSTEM BOOT DATA BT_DATA DS BD_SIZE ;BOOT DIRECNNNNNNNNNNNNNNNNNN, }NNNNNNNNNNNNNNNNNNNNNN 1) >= STHD) AND ((DD - 1) <= NDHD) D#D(DD)ALL: DS 128 ;ALLOCATION BIT MAP FOR 8" HARD DRIVE #D(DD) ENDIF IF ((DD - 1) RNNNNNNNNNNNNNNNNN,"NNNNNNNNNNNNNNNNNNNNN!K= 3, 2K= 4, 4K= 5, 8K= 6, 16K= 7 DPB_BLM DS 1 ;BLM- BLOCK MASK ; 1K = 7, 2K= 15, 4K= 31, 8K= 63, 16K= 127 DPB_EXM DS 1 ;E1NNNNNNNNNNNNNNNN,;NNNNNNNNNNNNNNNNNNNNNN128, 1: 256, 2: 512, 3: 1024 DPB_PHM DS 1 ;PHM- PHYSICAL RECORD MASK BASED ON BYTES/SEC ; 0: 128, 1: 256, 3: 512, 7: 1024 $rNNNNNNNNNNNNNNNN,ONNNNNNNNNNNNNNNNNNNNNNZ ;ALLOCATION FOR DRIVE #D(DD) LIST OFF ENDM ; ; RESERVE THE DATA SPACE ; DD DL 1 REPT NDRVS LIST OFF ALLDPB 01NNNNNNNNNNNNNNNN,#NNNNNNNNNNNNNNNNNNNNNN GRH Enterprises 1129 Stonylake Ct Sunnyvale, CA .PA .J NNNNNNNNNNNNNNNN,)NNNNNNNNNNNNNNNNNNNNNNstructio o Callin (executing th locatio a 0028H Al function retur valu i th A-registe an flags I th ZNNNNNNNNNNNNNNNN,/NNNNNNNNNNNNNNNNNNNNNN= ? 2 Disable Logon Entry- A= 2 C= CP/M drive number {0..15} Exit - A= 0: Ok, /0: Ille`NNNNNNNNNNNNNNNNN, NNNNNNNNNNNNNNNNNNNNNNTORY SYSTEM DATA SEGCNT DS 1 ;NUMBER OF BOOT DIRECTORY SEGMENTS SECCNT DS 1 ;SEGMENT SECTOR COUNT LDRPTR DS 2 ;SYSTEM DATA#QNNNNNNNNNNNNNNNNNN, NNNNNNNNNNNNNNNNNNNNNN>= ST8FD) AND ((DD - 1) <= ND8FD) D#D(DD)ALL: DS 57 ;ALLOCATION BIT MAP FOR 8" DRIVE #D(DD) D#D(DD)CHK DS 32 ;DIRECTORY CHENNNNNNNNNNNNNNNN,qNNNNNNNNNNNNNNNNNNNNNNXM- EXTENT MASK ; DSM < 256 : 1K= 0, 2K= 1, 4K= 3, 8K= 7, 16K= 15 ; DSM > 255 : 2K= 0, 4K= 1, 8K= 3, 16K= 7 DPB_DSM DS ##NNNNNNNNNNNNNNNNN,+NNNNNNNNNNNNNNNNNNNNNN; ; ADDITIONAL DISK PARTITIONING DATA FOR THE LOGICAL DRIVE SELECTION. ; PARTITIONING BY TRACKS ARE IMPLIMENTED THRU BDOS USQ@NNNNNNNNNNNNNNNN,NNNNNNNNNNNNNNNNNNNNNN23456789ABCDEF DD DL DD + 1 LIST ON ENDM ; ; BLOCKING BUFFER ; BLKBUF: DS 1024 ;HOST BUFFER IF (($ - 8000H)HNNNNNNNNNNNNNNNNN,$kBNNNNNNNNNNNNNNNNNNNNNNHE REVISION HISTORY REV DATE COMMENT NC 5-1-92 Initial release. .PA .HE kNNNNNNNNNNNNNNNNN,*HMNNNNNNNNNNNNNNNNNNNNN!er fla i set the n erro ha occured i cleared the th A- registe contain a erro code I th erro cod iINNNNNNNNNNNNNNNN,0NNNNNNNNNNNNNNNNNNNNNNgal drive BC,DE,HL= ? 3 Enable Logon Entry- A= 3 C= CP/M drive number {0..15} мNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN$NNNNŃg5Ѕk8ԉo< ׍sAݑyF╯}K癵Q띸U"𡽢Y'æNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN,aNNNNNNNNNNNNNNNNNNNNNN Exit - A= 0: Ok, /0: Illegal drive BC,DE,HL= ? 4 Set Disk Format Entry- A= 4 ?HNNNNNNNNNNNNNNNNN,NNNNNNNNNNNNNNNNNNNNNNLES. ; ; 2.28 - 22 APR 83 GRH ; CHANGED DEFINITIONS TO ALLOW BIG DIRECTORIES. ; DISALLOWED DRIVES C & D. ; ; 2.29 - 3 SEɦ$NNNNNNNNNNNNNNNN, NNNNNNNNNNNNNNNNNNNNNN..n-1). This maintains more uniformity in ; parameter passing between hard disk & JADE floppy IOPBs. ; Vector I/O routines { NNNNNNNNNNNNNNNN,pNNNNNNNNNNNNNNNNNNNNNNse of ROM primitives. ; Moved system down to 60k. ; ; 3.01 26 JUN 88 GRH ; Remove 5" floppy support. Implement in CP/M-86 B7@ NNNNNNNNNNNNNNNN,/NNNNNNNNNNNNNNNNNNNNNNDIR.DEF ; ;============================================================================ LIST OFF *INCLUDE JDDCONT.DEF *INCNNNNNNNNNNNNNNNNN,NNNNNNNNNNNNNNNNNNNNN!R: EQU 1000H - BIOS ; ; PAGE 0 LOCATIONS ; PAGE0: EQU 0 ;START OF CP/M RAM IOBYTE: EQU PAGE0 + 3 ;IOBYTE ADDR DEFDRV: E NNNNNNNNNNNNNNNN,%oCNNNNNNNNNNNNNNNNNNNNNN NDHD EQU 3 ;LAST LOGICAL DRIVE OF HARD DISK ST8FD EQU 4 ;START LOGICAL DRIVE OF 8" FLOPPY ND8FD EQU 5 ;LAST LOGICAL DRIVE XNNNNNNNNNNNNNNNNNN,+LLNNNNNNNNNNNNNNNNNNNNN! CALENDAR ENTRY TIMENT EQU RDBENT + 9 ;RETURN TIME ENTRY DKPENT EQU RDBENT + 0CH ;DISK PRIMITIVES ENTRY ;================#BNNNNNNNNNNNNNNNN,2NNNNNNNNNNNNNNNNNNNNN! C= CP/M drive number {0..15} E:HL= Disk descriptor sector image ptr Exit - A= 0: Ok, /0: Illegal 'NNNNNNNNNNNNNNNN,NNNNNNNNNNNNNNNNNNNNNNP 83 GRH ; Changed Rev # for blocked DCM. Enables IBM system 34 ; 256 bytes per sector disks to be read. ; ; 1.10 - 23 SEP(NNNNNNNNNNNNNNNN,_NNNNNNNNNNNNNNNNNNNNNNto monitor rom routines. ; ; 2.03 - 4 JUN 84 GRH ; Add bells & whistles again. ; Move to 61k system. ; ; 2.04 - 30 MAR 8m|NNNNNNNNNNNNNNNN,YNNNNNNNNNNNNNNNNNNNNNNIOS. ; Change single function to return drive table ptr into a BIOS function ; call using restart instruction. ; Change LOGQ NNNNNNNNNNNNNNNN,zNNNNNNNNNNNNNNNNNNNNNNLUDE COMIOPB.DEF *INCLUDE JDDDISK.DEF *INCLUDE MONBOARD.DEF *INCLUDE IOBOARD.DEF *INCLUDE NAKEDT.DEF *INCLUDE ISHA.DEF *INNNNNNNNNNNNNNNNNN, NNNNNNNNNNNNNNNNNNNNNNQU PAGE0 + 4 ;DEFAULT DRIVE PARAM ADDR DKPROM EQU PAGE0 + 40H ;DISK PRIMITIVES PROM # (STORED BY DKBOOT) DEFBFR EQU PAGE0 + 80qBNNNNNNNNNNNNNNNN,&:NNNNNNNNNNNNNNNNNNNNNNOF 8" FLOPPY ENDIF IF BOOT = 3 ; ; 8" FLOPPY BOOT DATA ; LASTSEC EQU 45 ;LAST BOOT SECTOR ; STHD EQU 0 ;START 7DNNNNNNNNNNNNNNNN,,NNNNNNNNNNNNNNNNNNNNN!============================================================ ; ; ASCII CHARS ; ;============================================ NNNNNNNNNNNNNNNN,NNNNNNNNNNNNNNNNNNNNN!drive BC,DE,HL= ? )MNNNNNNNNNNNNNNNNN, ,NNNNNNNNNNNNNNNNNNNNNN 83 GRH ; Move clock-calendar routines to ROM. Add Interrupt handler ; (Mode 2). Change Revision display of sign-on (separatCNNNNNNNNNNNNNNNNN,nNNNNNNNNNNNNNNNNNNNNNN5 GRH ; Implemented hard disk drive 1 as C: & D:. ; Implemented the Logon function for the hard disk. ; Implemented user fr?NNNNNNNNNNNNNNNN,jNNNNNNNNNNNNNNNNNNNNNNON to specify the ID sector & track. At same time, fix bug ; which did not specify the logon track. ; VERSN EQU '01' ; ;*!!NNNNNNNNNNNNNNNN,INNNNNNNNNNNNNNNNNNNNNNCLUDE CLOCK.DEF *INCLUDE SYSDIR.DEF LIST ON ;===========================================================================7NNNNNNNNNNNNNNNNN,!NNNNNNNNNNNNNNNNNNNNNNH ;DEFAULT BUFFER ; ; BIOS FUNCTION CALL RESTART VECTOR ; BFUNRST EQU 28H BFUNRSV EQU PAGE0 + BFUNRST BFUNRSI EQU 0C7H +zNNNNNNNNNNNNNNNNN,' !NNNNNNNNNNNNNNNNNNNNNNLOGICAL DRIVE OF HARD DISK NDHD EQU 3 ;LAST LOGICAL DRIVE OF HARD DISK ST8FD EQU 4 ;START LOGICAL DRIVE OF 8" FLOPPY ND8FD +lHNNNNNNNNNNNNNNNN,-NNNNNNNNNNNNNNNNNNNNNN================================ LF: EQU 0AH CR: EQU 0DH CTRLZ: EQU 1AH ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ NNNNNNNNNNNNNNNN,ZNNNNNNNNNNNNNNNNNNNNN!SO, ALL REFERENCES ; REQUIRING THE I/O PROMS TO BOOT HAS BEEN REMOVED. ; ; 2.2.5 - RECONFIGURE FOR 62K SYSTEM. ; ; 2.2.NNNNNNNNNNNNNNNNN, yNNNNNNNNNNNNNNNNNNNNN!e CBIOS rev). ; ; 2.00 - 24 MAR 84 GRH ; Modify for hard disk ; ; 2.01 - 28 APR 84 GRH ; Change hard disk DPB to reflerNNNNNNNNNNNNNNNNN,#NNNNNNNNNNNNNNNNNNNNNNiendly disk error options: Abort, Retry, Ignore. ; Solved warm boot hang problem by reseting host adapter if busy. ; ; 3.00 -h=NNNNNNNNNNNNNNNN,?NNNNNNNNNNNNNNNNNNNNNN*************************************************************************** SUBTTL SYSTEM DECLARATIONS ;=================CBNNNNNNNNNNNNNNNN,NNNNNNNNNNNNNNNNNNNNNNN= ; ; DISK OPERATING SYSTEM ADDRESSES ; ;============================================================================ NKS dNNNNNNNNNNNNNNNN,"NNNNNNNNNNNNNNNNNNNNNN BFUNRST ; TPA: EQU 100H ;============================================================================ ; ; OTHER DECLAR? NNNNNNNNNNNNNNNNN,(NNNNNNNNNNNNNNNNNNNNNNEQU 5 ;LAST LOGICAL DRIVE OF 8" FLOPPY ENDIF ;========================================================================]NNNNNNNNNNNNNNNNN,.NNNNNNNNNNNNNNNNNNNNN!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; GENERATE THE TRANSLATION TABLE MACRO ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@/nNNNNNNNNNNNNNNNNN,iNNNNNNNNNNNNNNNNNNNNN!6 - 20 FEB 83 ; DOUBLE D REV C UPGRADE. CHANGE BOARD STATUS PORT BITS. ; ; 2.2.7 - 8 MAR 83 GRH ; ADDED CLOCK/CALENDAR DRIVENNNNNNNNNNNNNNNN, JNNNNNNNNNNNNNNNNNNNNNNct half size directory, but keep ; allocation for 1k directory ; ; 2.02 - 2 JUN 84 GRH ; Change floppy disk drivers to relhmNNNNNNNNNNNNNNNNN,NNNNNNNNNNNNNNNNNNNNNN 26 JAN 87 GRH ; Implemented new common IOPB code & Jade floppy firmware support. ; Implemented disk drive driver tables andNNNNNNNNNNNNNNNN, NNNNNNNNNNNNNNNNNNNNNN=========================================================== ; ; INCLUDE JDDCONT.DEF ; INCLUDE COMIOPB.DEF ; INCLUDE JDDDISK.NNNNNNNNNNNNNNNN,NNNNNNNNNNNNNNNNNNNNNNYS: EQU 60 ;SYSTEM SIZE IN K BYTES KBYTE: EQU 1024 CPMSZ: EQU KBYTE * NKSYS CPMBS: EQU CPMSZ - (20 * KBYTE) ; CP/M BIAS VALU]9NNNNNNNNNNNNNNNN,#NNNNNNNNNNNNNNNNNNNNNNATIONS ; ;============================================================================ SECSZ: EQU 128 NDRVS: EQU 6 IF BOÜNNNNNNNNNNNNNNNNN,)*.NNNNNNNNNNNNNNNNNNNNNN==== ; ; ADDRESSES ; ;============================================================================ CALROM EQU 7 ;CALENDAR ''NNNNNNNNNNNNNNNNN,/NNNNNNNNNNNNNNNNNNNNNN@@@@@@@@@@@@@@@@@@@@@@@@@@ GXLATE MACRO #SECTORS, #SKEW LIST OFF NXTSEC DL 1 ;;START WITH SECTOR 1 LOWEST DL 1 ;; REPT  NNNNNNNNNNNNNNNN,!NNNNNNNNNNNNNNNN, =NNNNNNNNNNNNNNNNNNNNNNate to ISASI control of JADE ; FDC. ; Change IOPB sector value from physical sector (1..n) to logical ; sector value (0cBNNNNNNNNNNNNNNNN,ANNNNNNNNNNNNNNNNNNNNNN new function to return ; a ptr to a drive table. ; Removed init of IOBYTE. ; Implemented 5" floppy driver. ; Implemented usNNNNNNNNNNNNNNNNN,NNNNNNNNNNNNNNNNNNNNNNDEF ; INCLUDE MONBOARD.DEF ; INCLUDE IOBOARD.DEF ; INCLUDE NAKEDT.DEF ; INCLUDE ISHA.DEF ; INCLUDE CLOCK.DEF ; INCLUDE SYSNrNNNNNNNNNNNNNNNN,,NNNNNNNNNNNNNNNNNNNNN!E CCP: EQU CPMBS + 3400H ;ADDR OF CCP BDOS: EQU CPMBS + 3C00H ;ADDRESS OF BDOS BIOS: EQU CPMBS + 4A00H ;ADDRESS OF BDOS BIOSHNNNNNNNNNNNNNNNNN,$\rNNNNNNNNNNNNNNNNNNNNNNOT = 10H ; ; 8" HARD DISK BOOT DATA ; LASTSEC EQU 47 ;LAST BOOT SECTOR ; STHD EQU 0 ;START LOGICAL DRIVE OF HARD DISK NNNNNNNNNNNNNNNNN,*}NNNNNNNNNNNNNNNNNNNNN!ROM SELECT # RDBENT EQU 0F800H ;READ CLOCK BUFFER ENTRY SETENT EQU RDBENT + 3 ;SET CLOCK ENTRY CALENT EQU RDBENT + 6 ;RETURNNNNNNNNNNNNNNNNNN,0NNNNNNNNNNNNNNNNNNNNNN#SECTORS LIST ON DB NXTSEC LIST OFF NXTSEC DL NXTSEC + #SKEW ;ADD SKEW FACTOR ;; IF NXTSEC > #SECTORS ;CHECK FOR OVENNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNЁk8Ӆn= ؉s@܍yF⑯}J敳O뙺V#񝿞\)â^,ȦnNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN-NNNNNNNNNNNNNNNNNNNNN!RFLOW NXTSEC DL NXTSEC - #SECTORS ;; IF NXTSEC <= LOWEST ;CHECK FOR REPEAT NXTSEC DL LOWEST + 1 LOWEST DL NXTSEC ENDNNNNNNNNNNNNNNNNN-NCNNNNNNNNNNNNNNNNNNNNNNISKWR ;PERFORM DISK WRITE JP LISTST ;RETURN LIST STATUS JP SECTRN ;TRANSLATE SECTOR JP BIOFUNC ;EXECUTE FUNCTION CALL \$NNNNNNNNNNNNNNNN- NNNNNNNNNNNNNNNNNNNNN!HERE AFTER CRUNCHING COLD START ; CODE. THIS BUFFER IS USED BY THE CP/M DIRECTORY CHECK ROUTINES THAT ; CHECK FOR DISK CHANG`BNNNNNNNNNNNNNNNN-NNNNNNNNNNNNNNNNNNNNNN EDITOR ; ; MODIFY COLD START VECTOR TO WARM START ; LD HL,(BIOS+4) LD (BIOS+1),HL ; ; BOOT CCP & BDOS ; JR WARMNNNNNNNNNNNNNNNN-n?NNNNNNNNNNNNNNNNNNNNNNNTRY LOADS CCP,BDOS FROM DISK & ; SETS UP VARIABLES ; ;---------------------------------------------------------- WARM: II NNNNNNNNNNNNNNNNN-ęNNNNNNNNNNNNNNNNNNNNNNG: ENDIF ; ; LOG ON DRIVE TO INIT TABLES ; LD A,(DKPROM + 1) AND A,3 ;MODULO 4 LD C,A LD E,0 CALL SELDSK LNNNNNNNNNNNNNNNN-%.NNNNNNNNNNNNNNNNNNNNNNL DISKRD JR NZ,WEROR ;IF ERROR THEN EXIT ; ; NEXT SECTOR ; LD HL,BTSEC INC (HL) ; LD DE,SECSZ ;DMA := DMA + SECTOR:fNNNNNNNNNNNNNNNNNN-+ NNNNNNNNNNNNNNNNNNNNNN; ; BOOT OK, INIT PAGE 0 ; WZRPG: ; ; INIT BIOS WARM START IN PAGE 0 ; LD A,0C3H LD HL,BIOS + 3 LD (PAGE0),A LBNNNNNNNNNNNNNNNN-NNNNNNNNNNNNNNNNNNNNNNIF ENDIF ;; ENDM LIST ON ENDM SUBTTL BIOS CODE ORG BIOS ;-----------------------------------------------------c'NNNNNNNNNNNNNNNNN-^}NNNNNNNNNNNNNNNNNNNNNN ;############################################################################ ; ; THESE BOOT PARAMS MUST RESIDE AS DEFINED tNNNNNNNNNNNNNNNN-NNNNNNNNNNNNNNNNNNNNNNE. ; ;############################################################################ DIRBF: EQU $ ;BUFFER BEGINNING ;----+PNNNNNNNNNNNNNNNN-cNNNNNNNNNNNNNNNNNNNNN! ;############################################################################ ; ; SIGN-ON MESSAGE ; ;#################N~NNNNNNNNNNNNNNNN-;lNNNNNNNNNNNNNNNNNNNNNNF INTRPTS ; ; SET INTERRUPT VECTOR TABLE BASE ; LD A,HIGH INTABL LD I,A ; ; SET INTERRUPT MODE TO 2 ; IM 2 ; ;[NNNNNNNNNNNNNNNNN- 2NNNNNNNNNNNNNNNNNNNNN!D A,L ;IF ERROR THEN ABORT OR A,H JR Z,WEROR ; ; READ BOOT DIRECTORY ; LD BC,DEFBFR ;SET XFER ADDRESS (USE DEFAULTRNNNNNNNNNNNNNNNN-&{NNNNNNNNNNNNNNNNNNNNNN SIZE LD HL,(BTDMA) ADD HL,DE LD (BTDMA),HL ; ; IF NOT INTO BDOS THEN READ NEXT SECTOR ; LD DE,BDOS XOR A,A SBCNNNNNNNNNNNNNNNN-,_NNNNNNNNNNNNNNNNNNNNNND (PAGE0 + 1),HL ; ; INIT BDOS CALL VECTOR IN PAGE 0 ; LD HL,BDOS + 6 LD (PAGE0 + 5),A LD (PAGE0 + 6),HL ; ; INIThNNNNNNNNNNNNNNNN-NNNNNNNNNNNNNNNNNNNNNN----------------------- ; ; BIOS JUMP VECTOR TABLE ; ;--------------------------------------------------------------------HNNNNNNNNNNNNNNNNN- mLNNNNNNNNNNNNNNNNNNNNNNRIGHT BEFORE THE COLD ; INIT ROUTINE START AND MUST BE IN THE 1ST SECTOR. ; THESE 2 WORDS ARE REFERENCED BY THE BOOT CODE IN_NNNNNNNNNNNNNNNNN-NNNNNNNNNNNNNNNNNNNNNN------------------------------------------------------------------------ ; ; INIT - COLD START ENTRY FROM BOOT MUST SET AL%NNNNNNNNNNNNNNNN-+RNNNNNNNNNNNNNNNNNNNNNN########################################################### MSGSO: DB CR,LF DB CPMSZ / (KBYTE * 10) + '0' DB (CPMSZ MOD (KBcdNNNNNNNNNNNNNNNNN-]NNNNNNNNNNNNNNNNNNNNNN ENABLE INTERRUPT VECTOR 7 ; IN A,(INTMSK) AND A,7FH OUT (INTMSK),A ; ; FINALLY ENABLE VECTORED INTERRUPTS ; IN ?NNNNNNNNNNNNNNNNN-!NNNNNNNNNNNNNNNNNNNNN! BUFFER) CALL SETDMA ; LD BC,?DIRSEC ;SET DIRECTORY SECTOR CALL SETSEC ; LD BC,0 ;SET TRACK TO 0 CALL SETTRK ; CeNNNNNNNNNNNNNNNN-'HNNNNNNNNNNNNNNNNNNNNNN HL,DE JR C,WREAD ; ; ELSE IF AT BEGINNING OF BDOS THEN SET UP NEW TRACK & SECTOR ; JR Z,RDBDOS ; ; ELSE IF AT BIOSsMNNNNNNNNNNNNNNNN--nNNNNNNNNNNNNNNNNNNNNNN BIOS CALL VECTOR IN PAGE 0 ; LD HL,BIOFUNC LD (BFUNRSV),A LD (BFUNRSV + 1),HL ; ; SET DEFAULT SECTOR BUFFER ; LD CNNNNNNNNNNNNNNNN-NNNNNNNNNNNNNNNNNNNNN!-------- JP INIT1 ;COLD START ENTRY JP WARM ;RELOAD CCP/BDOS JP CNSCK ;GET CONSOLE STATUS JP CI ;CONSOLE INPUT JP \BNNNNNNNNNNNNNNNN- 8NNNNNNNNNNNNNNNNNNNNNN ; ORDER TO FIND THE LOAD ADDRESS FOR THE BIOS & IT'S LENGTH. ; ;###########################################################3NNNNNNNNNNNNNNNNN-ԧNNNNNNNNNNNNNNNNNNNNN!L BIOS PARAMS ; ;---------------------------------------------------------------------------- INIT: ; ; SET TEMPORARY STA8 NNNNNNNNNNNNNNNN-~NNNNNNNNNNNNNNNNNNNNNNYTE * 10)) / KBYTE + '0' DB 'K CP/M-80 Vers 2.2',CR,LF DB 'M5b CBIOS Vers 3.' DM HIGH VERSN , LOW VERSN,CR,LF +NNNNNNNNNNNNNNNNNN-NNNNNNNNNNNNNNNNNNNNNNA,(MONSTS) OR A,MONIE OUT (MONSTS),A EI ENDIF ; ; SET TEMPORARY STACK ; LD SP,DEFBFR ; ; INSURE MONITOR ROM !NNNNNNNNNNNNNNNN-"PNNNNNNNNNNNNNNNNNNNNNNALL DISKRD JR NZ,WEROR ; ; CHECK FOR VALID BOOT DIRECTORY ; LD A,(DEFBFR) CP A,?NEWDIR JR C,WEROR ; ; SET UP TO NNNNNNNNNNNNNNNNN-(XNNNNNNNNNNNNNNNNNNNNNN THEN DONE ; LD DE,BIOS - BDOS SBC HL,DE JR NC,WZRPG ; ; ELSE READ NEXT SECTOR ; JP WREAD ; ; ELSE SET UP & RENNNNNNNNNNNNNNNNN-.=NNNNNNNNNNNNNNNNNNNNNNBC,DEFBFR CALL SETDMA ; IF INTCPTS ; ; PUT BDOS VECTOR INTO INTERCEPT CODE ; LD HL,(BDOS + 7) LD (BDOSV),HL ; ;HNNNNNNNNNNNNNNNNN-(!NNNNNNNNNNNNNNNNNNNNNNCOC ;CONSOLE OUTPUT JP LO ;PRINTER OUTPUT JP PUNCH JP READER JP HOME ;HOME SELECTED DRIVE JP SELDSK ;SELECT DISK DNNNNNNNNNNNNNNNNN- .NNNNNNNNNNNNNNNNNNNNNN################# BIOSSZ: DW BIOSND - BIOS ;BIOS MODULE SIZE IN BYTES BIOSST: DW BIOS ;BIOS MODULE LOAD ADDR FOR SBD INIT1: 6NNNNNNNNNNNNNNNNN-NNNNNNNNNNNNNNNNNNNNNNCK ; LD SP,DEFBFR ;USE PAGE 0 FOR STACK ; ; MAKE SURE ROM IS ENABLED ; CALL GETMON ; ; INIT DEFAULT DRIVE ; LD 4aNNNNNNNNNNNNNNNN-M0NNNNNNNNNNNNNNNNNNNNN!IF $ > (DIRBF + SECSZ) CONMSG **** WARNING! COLD INIT CODE BIGGER THAN DIR BUFFER **** ELSE DS DIRBF+SECSZ-$ ;FILL OUT ϬNNNNNNNNNNNNNNNN-NNNNNNNNNNNNNNNNNNNNN!STILL ENABLED ; CALL GETMON ; IF BOOT = 10H ; TEST ISHA HOST ADAPTER FOR A HUNG CONDITION AND CLEAR IF TRUE ; IN ANNNNNNNNNNNNNNNN-#aNNNNNNNNNNNNNNNNNNNNNN LOAD CCP/BDOS ; LD HL,(DEFBFR + ?DSBDSS) ;PREFETCH BDOS TRK/SECTOR PUSH HL ; LD HL,(DEFBFR + ?DSCCPS) ;FETCH CCP TRK/SENNNNNNNNNNNNNNNNNN-)kNNNNNNNNNNNNNNNNNNNNNNAD BDOS ; RDBDOS: POP HL ;RESTORE BDOS TRK/SECTOR FROM DIRECTORY LD C,L LD B,A CALL SETSEC ; LD C,H CALL SETTRK ;$NNNNNNNNNNNNNNNNN-/ NNNNNNNNNNNNNNNNNNNNN! NOW PUT INTERCEPT VECTOR INTO BDOS CODE ; LD HL,INTCPT LD (BDOS + 7),HL ; ; INITIALIZE CLOCK VECTORS IF CLOCK INSTALNNNNNNNNNNNNNNNN-}rNNNNNNNNNNNNNNNNNNNNN!RIVE JP SETTRK ;SET TRACK # JP SETSEC ;SET SECTOR # JP SETDMA ;SET TRANSFER ADDR JP DISKRD ;PERFORM DISK READ JP DNNNNNNNNNNNNNNNN- NNNNNNNNNNNNNNNNNNNNN!JR INIT ;############################################################################ ; ; DIRECTORY SECTOR BUFFER STARTS w 9NNNNNNNNNNNNNNNN-NNNNNNNNNNNNNNNNNNNNNNA,(DKPROM + 1) ;USE DRIVE # PASSED IN PAGE 0 AND A,3 LD (DEFDRV),A ; ; SEND SYSTEM SIGN-ON ; CLOGO: LD HL,MSGSO CALL[NNNNNNNNNNNNNNNNN-]NNNNNNNNNNNNNNNNNNNNNNDIRECTORY BUFFER TO 1 SECTOR SIZE ENDIF ;---------------------------------------------------------- ; ; WARM REBOOT EBNNNNNNNNNNNNNNNN-NNNNNNNNNNNNNNNNNNNNN!,(HSTATUS) ;IF HOST ADAPTER BUSY THEN BIT HBUSYB,A JR Z,NTHUNG ; LD A,DDCLR LD (IOPB + PBCMDO),A CALL XPRIM ; NTHUNRnNNNNNNNNNNNNNNNNN-$NNNNNNNNNNNNNNNNNNNNNNCTOR LD C,L LD B,0 CALL SETSEC ; LD C,H CALL SETTRK ; LD BC,CCP CALL SETDMA ; ; READ CCP/BDOS ; WREAD: CAL3NNNNNNNNNNNNNNNNN-*>NNNNNNNNNNNNNNNNNNNNN! JR WREAD ; ; ; WARM BOOT ERROR, OUTPUT MSG & HALT ; WEROR: LD HL,MSGLE ;OUTPUT ERROR MESSAGE CALL EDITOR HALT ; = 'NNNNNNNNNNNNNNNNN-0ANNNNNNNNNNNNNNNNNNNNNNLED ; IN A,(CLKDAT) ;IF CLOCK NOT PRESENT THEN TURN OFF CLOCK DRIVE AND A,11000000B ;TEST UNUSED BUT DRIVEN BITS (1S IF NOTNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNnNNNŃi7҅l:Չp= ٍvD{H䕱L虶R 흺W$񡾢Y'ĦNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN-NNNNNNNNNNNNNNNNNNNNNN THERE) LD A,38H ;COND. JR (ON) JR Z,CLKON ; LD A,18H ;UNCOND. JR (OFF) (CAUSES JUMP TO ILLEGAL) ; CLKON: LD (INHCLK)CHNNNNNNNNNNNNNNNNN-ysNNNNNNNNNNNNNNNNNNNNNNCT WRITE OP JP DISKOP ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; SELECT DRIVE FUiNNNNNNNNNNNNNNNN- NNNNNNNNNNNNNNNNNNNNNNRE ADDRESS INC HL LD D,(HL) INC HL LD (DVRXADR),DE ; ; FETCH FLAGS ; LD C,(HL) ; ; COMPUTE DISK PARAMETER TAB]NNNNNNNNNNNNNNNN-NNNNNNNNNNNNNNNNNNNNNNLL TRNONE ;ASSUME NO TRANSLATION ; ; IF HARD DISK OR DOUBLE DENSITY THEN NO TRANSLATION ; LD A,(DEFBFR + IDFLGO) AND A7NNNNNNNNNNNNNNNN-YNNNNNNNNNNNNNNNNNNNNNN CALL TRNONE ; NO XLATE LD HL,HDPBK ; ; XFER DATA TO TABLES ; SEL2: PUSH HL CALL DPBAD ; USE DEFAULT TABLE POP NNNNNNNNNNNNNNNNN-NNNNNNNNNNNNNNNNNNNNNN***************************** ; ; SET SECTOR ; ENTRY- BC= SECTOR # ; ;*****************************************************^NNNNNNNNNNNNNNNN-%NNNNNNNNNNNNNNNNNNNNN!++++++++++++++++++++++++++++++++++++++++++ SECTRN: ; ; IF NO TRANSLATION THEN RETURN SECTOR++ ; LD A,D ;IF TABLE ADDR = YBNNNNNNNNNNNNNNNN-+:NNNNNNNNNNNNNNNNNNNNNN,A LD (IOPB + PBDMAXO),A ; ; SET DESCRIPTOR SECTOR SECTOR ; LD HL,2 LD (IOPB + PBSECO),HL ; ; SET DESCRIPTOR SECTg7NNNNNNNNNNNNNNNN-NNNNNNNNNNNNNNNNNNNNNN,A ; ENDIF ; ; PASS DEFAULT DISK TO CCP ; LD A,(DEFDRV) LD C,A JP CCP SUBTTL BIOS DISK FUNCTION ROUTINES ;++"NNNNNNNNNNNNNNNNN-iMNNNNNNNNNNNNNNNNNNNNNNNCTION ; LOG-ON - SET DISK PARAMETER BLOCK ; ENTRY- C= DRIVE # ; E= 0 IF NEW SELECT ; EXIT - HL= PTR TO DPT OR 0 FOR ERROR /NNNNNNNNNNNNNNNN-NNNNNNNNNNNNNNNNNNNNNNLE ADDRESS ; LD HL,(BTDRV) LD H,0 ADD HL,HL ;DISK # * 16 ADD HL,HL ADD HL,HL ADD HL,HL LD DE,D0DPH ADD HL,DE X^ NNNNNNNNNNNNNNNN-/SNNNNNNNNNNNNNNNNNNNNNN,[1 SHL DFDTDB] OR [1 SHL DFHARDB] ; ; ELSE SET TRANSLATION ; CALL Z,TR8 ; ; XFER DISK DATA TO DPB ; NOX: CALL DPBANNNNNNNNNNNNNNNN- \NNNNNNNNNNNNNNNNNNNNNNHL LD BC,DPBSZ LDIR JR SEL1 ; ; ; USE 8" FLOPPY DEFAULTS ; LGCKFD: CALL TR8 LD HL,SD8PBK JR SEL2 ;********NNNNNNNNNNNNNNNNN- NNNNNNNNNNNNNNNNNNNNNN*********************** SETSEC: LD (BTSEC),BC RET ;*******************************************************************+[NNNNNNNNNNNNNNNN-&LNNNNNNNNNNNNNNNNNNNNN!0 THEN NO TRANSLATION OR A,E JP Z,NOTRAN ; ; ELSE CALCULATE NEW SECTOR FROM TABLE ; EX DE,HL ADD HL,BC LD L,(HL) NNNNNNNNNNNNNNNN-,oNNNNNNNNNNNNNNNNNNNNNNOR TRACK ; LD L,H ;H == 0 FROM LAST OPERATION (HL= 0) LD (IOPB + PBTRKO),HL ; ; PASS COMMAND TO EXECUTOR ; LD A,DDL NNNNNNNNNNNNNNNN-NNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; READ A DISK SECTOR ; EXIT - A= 0: OK; /0: ERROb,NNNNNNNNNNNNNNNNN- Z|NNNNNNNNNNNNNNNNNNNNNN ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ SELDSK: ; ; ASSUME ERROR ; LD HL,0 ; ?dNNNNNNNNNNNNNNNNN-NNNNNNNNNNNNNNNNNNNNNN; ; IF NOT FIRST SELECT OR LOGON INHIBITED THEN RETURN TABLE PTR ; LD A,(LOGRQ) CPL OR A,C AND A,1 RET Z ; ; EGzNNNNNNNNNNNNNNNN-bNNNNNNNNNNNNNNNNNNNNNND ;GET ADDR OF DPB LD HL,DEFBFR + IDSPTO LD BC,DPBSZ LDIR ; ; XFER DISK PHYSICAL DATA TO TABLE ; LD HL,DEFBFR + IPNNNNNNNNNNNNNNNNNN-?mNNNNNNNNNNNNNNNNNNNNNN******************************************************************** ; ; HOME DRIVE - TREAT AS SEEK TRK 0 ; EXIT - BC= 0 ;T3!NNNNNNNNNNNNNNNN-!3NNNNNNNNNNNNNNNNNNNNNN********* ; ; SET TRANSFER ADDR ; ENTRY- BC= ADDRESS ; EXIT - A= 0 ; ;****************************************************jNNNNNNNNNNNNNNNN-'NNNNNNNNNNNNNNNNNNNNNN ; LD H,0 RET ; ; ; CONVERT FROM CP/M'S LOGICAL SECTOR {0..N-1} TO PHYSICAL SECTOR {1..N} ; NOTRAN: LD HL,1 ADD x'NNNNNNNNNNNNNNNN--^NNNNNNNNNNNNNNNNNNNNN!OG JR DISKOP2 ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; COMMON DISK I/O CODE =mNNNNNNNNNNNNNNNN-, NNNNNNNNNNNNNNNNNNNNNNR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ DISKRD: LD A,DDRDS ;SELECT READ OP JP \NNNNNNNNNNNNNNNN- /NNNNNNNNNNNNNNNNNNNNNN ; IF UNSUPPORTED DRIVE REQUESTED THEN RETURN 0 (ERROR) ; LD A,C CP A,NDRVS RET NC ; ; STORE DRIVE # FOR FUTURE USEeNNNNNNNNNNNNNNNNN-NNNNNNNNNNNNNNNNNNNNNNLSE LOG ON DRIVE ; LD (DTPTR),HL ;SAVE DRIVE TABLE PTR ; ; ATTEMPT TO READ ID SECTOR ; XOR A,A ;INIT FLAG BYTE UNTIL 3dNNNNNNNNNNNNNNNN-I1NNNNNNNNNNNNNNNNNNNNNNDFLGO ; SEL1: PUSH HL LD HL,(DVRTPTR) LD DE,DVRFLG ADD HL,DE EX DE,HL POP HL LD BC,DVRSIZ - DVRFLG LDIR ; ; j\NNNNNNNNNNNNNNNN-NNNNNNNNNNNNNNNNNNNNNN ;**************************************************************************** HOME: LD BC,0 ;***************************]NNNNNNNNNNNNNNNN-"`NNNNNNNNNNNNNNNNNNNNN!************************ SETDMA: LD (BTDMA),BC XOR A,A LD (BTDMAX),A RET ;++++++++++++++++++++++++++++++++++++++++++hNNNNNNNNNNNNNNNNN-(oNNNNNNNNNNNNNNNNNNNNNNHL,BC RET SUBTTL DISK SUPPORT ROUTINES ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ;FNNNNNNNNNNNNNNNNNN-. NNNNNNNNNNNNNNNNNNNNNN ; EXIT - A= 0: OK; /0: ERROR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ DISKOP: ; ; cNNNNNNNNNNNNNNNNNN-NNNNNNNNNNNNNNNNNNNNNNDISKOP ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; WRITE A DISK SECTOR ; EXIT - A=]'NNNNNNNNNNNNNNNNN- <NNNNNNNNNNNNNNNNNNNNN! ; LD (BTDRV),A ; ; SAVE LOGON REQUEST FLAG ; LD A,E LD (LOGRQ),A ; ; COMPUTE DISK DRIVER TABLE PTR ; CALL RENNNNNNNNNNNNNNNNN-ЦNNNNNNNNNNNNNNNNNNNNN!FIRMWARE REVISED LD (IOPB + PBST2O),A ; CALL DISKLOG JP NZ,FDSKER ; ; IF NO ID SECTOR THEN USE DEFAULTS ; LD A,(IONNNNNNNNNNNNNNNNN-zNNNNNNNNNNNNNNNNNNNNNNRETURN DRIVE TABLE PTR ; LD HL,(DTPTR) XOR A,A RET ; ; ; IF NOT HARD DISK THEN GO DO FLOPPY TEST ; LGDEF: LD A,(BTrNNNNNNNNNNNNNNNN-NNNNNNNNNNNNNNNNNNNNNN************************************************* ; ; SET TRACK # ; ENTRY- BC= TRACK # ; ;*********************************9NNNNNNNNNNNNNNNN-#QNNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++ ; ; SECTOR TRANSLATION FUNCTION ; ENTRY- DE= 0: NO XLATE, ELSE PTR TO XLATE TABLE ; BC= NNNNNNNNNNNNNNNNN-)\NNNNNNNNNNNNNNNNNNNNN! ; LOGON DISK FUNCTION ; EXIT - A= 0: OK; /0: ERROR ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++$NNNNNNNNNNNNNNNNN-/NNNNNNNNNNNNNNNNNNNNNNDRV) IF STHD <> 0 CP A,STHD JR C,LGCKFD ENDIF CP A,NDHD + 1 JR NC,LGCKFD ; ; ELSE USE HARD DISK DEFAULTS ; NNNNNNNNNNNNNNNN-NNNNNNNNNNNNNNNNNNNNNN******************************************* SETTRK: LD (BTTRK),BC RET ;***********************************************^NNNNNNNNNNNNNNNNN-$*NNNNNNNNNNNNNNNNNNNNNNSECTOR # TO XLATE ; EXIT - HL= XLATED SECTOR OR (BC) + 1 ; BC= UNCHANGED ; A, DE= ? ; ;++++++++++++++++++++++++++++++++++uNNNNNNNNNNNNNNNNNN-* NNNNNNNNNNNNNNNNNNNNNN+++++++ DISKLOG: ; ; SET DESCRIPTOR SECTOR XFER ADDRESS TO DEFAULT BUFFER ; LD HL,DEFBFR LD (IOPB + PBDMAO),HL XOR AKNNNNNNNNNNNNNNNNN-0qNNNNNNNNNNNNNNNNNNNNNNFETCH DRIVER VECTOR & EXECUTE DISK DRIVER ; DKOPLP: PUSH IY ;SAVE IY LD IY,(DVRTPTR) ;FETCH TABLE BASE ; LD HL,DKOPRETP-NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNnNNNNNNNЁj8ԅn< ؉sAލ{I瑴O땸T"񙿚\)Ğa.Ȣe3ЦNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN.9NNNNNNNNNNNNNNNNNNNNNN ;PUT RETURN ADDRESS ON STACK PUSH HL ; LD HL,(DVRXADR) ;FETCH DRIVER ADDRESS PREFETCHED FROM TABLE JP (HL) ; ; DRIVEkNNNNNNNNNNNNNNNNN.՟NNNNNNNNNNNNNNNNNNNNNNUPPER CASE ; ; IF RETRY THEN RETURN TO CALLER ; CP A,'R' ;IF RETRY THEN RETURN TO CALLER JR Z,DKOPLP ; ; ELSE IF ANNNNNNNNNNNNNNNN. :TNNNNNNNNNNNNNNNNNNNNNNE INC HL LD (HL),D RET ;**************************************************************************** ; ; SET NO SECBNNNNNNNNNNNNNNNN.(NNNNNNNNNNNNNNNNNNNNNN+++++++++++++ ; ; HARD DISK DRIVER FUNCTION ; ENTRY- IY= DRIVER TABLE PTR ; EXIT - A= 0: OK; /0: ERROR ; ;++++++++++++++++Π9NNNNNNNNNNNNNNNN.NNNNNNNNNNNNNNNNNNNNNN LD HL,DKPENT ;PRIMITIVE ENTRY LD A,(DKPROM) ;FETCH PROM # CALL EXROM ;EXECUTE THE PRIMITIVE POP IX ; ; RETURN THE INNNNNNNNNNNNNNNNN._ENNNNNNNNNNNNNNNNNNNNNN + PBTRKO) CP A,1 LD A,(IOPB + PBSECO) JR C,FD8X20 JR Z,FD8X21 ; ; DATA TRACKS ; LD C,(IY + DVRDSPT) ; ; COMMNNNNNNNNNNNNNNNN.%NNNNNNNNNNNNNNNNNNNNNNCTION # NOT IN TABLE THEN RETURN -1 ; LD HL,BFUNTBL LD A,C CP A,MAXFUNCS LD A,-1 RET NC ; ; ELSE COMPUTE TABLE ENBNNNNNNNNNNNNNNNN.+NNNNNNNNNNNNNNNNNNNNN!) / 2 ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN BIOS VERSION # ; EXIT - Hy&rNNNNNNNNNNNNNNNN.*jNNNNNNNNNNNNNNNNNNNNN!R RETURNS HERE ; DKOPRET: POP IY ; ; IF NO ERRORS THEN RETURN ZF ; RET Z ;IF NO_ERROR THEN RETURN ; ; PRINT ERRm?NNNNNNNNNNNNNNNNN.šNNNNNNNNNNNNNNNNNNNNNNBORT THEN DO WARM BOOT ; CP A,'A' ;IF ABORT THEN RE-BOOT JP Z,0 ; ; ELSE IF IGNORE THEN RETURN NO ERROR ; SUB A,'I'5NNNNNNNNNNNNNNNN.oNNNNNNNNNNNNNNNNNNNNNNTOR TRANSLATION PROCEDURE ; EXIT - HL, DE= ? ; ;**************************************************************************** NNNNNNNNNNNNNNNN.NNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ HDEXEC: ; ; CONVERT LOGICAL DRIVE TO PHYSICAL DRIVE ; LD A,eNNNNNNNNNNNNNNNN.NNNNNNNNNNNNNNNNNNNNNNCOMMAND RESULTS STATUS ; LD A,(IOPB + PBSTATO) OR A,A RET SUBTTL JADE FLOPPY DRIVER ROUTINES ;++++++++++++++++++++3NNNNNNNNNNNNNNNNN. JNNNNNNNNNNNNNNNNNNNNNNON SIDE SELECT CODE ; FD8X2: INC C SUB A,C JR C,SPTOK ; INC A ;MUST START AT 1 LD (IOPB + PBSECO),A ; ; SELECT SUNNNNNNNNNNNNNNNNN.&HNNNNNNNNNNNNNNNNNNNNNNTRY ; PUSH HL ;SAVE POSSIBLE DATA ; LD HL,BFUNTBL LD A,C ADD A,A ADD A,L LD L,A LD A,0 ADC A,H LD H,A ; ; NNNNNNNNNNNNNNNNN.,NNNNNNNNNNNNNNNNNNNNNNL= VERSION # IN BINARY {0.00,..655.35} ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ RETVERRNNNNNNNNNNNNNNNN.[NNNNNNNNNNNNNNNNNNNNNNOR ; LD HL,DSKEM ;OUTPUT PREFIX CALL EDITOR ; LD DE,IOPB LD B,IOPBSZ DSKER1: LD A,(DE) ;FETCH ERROR BYTE PUSH DENNNNNNNNNNNNNNNNN. NNNNNNNNNNNNNNNNNNNNNN ;IF IGNORE THEN RETURN NO ERROR RET Z ; ; ELSE RETURN ERROR TO BDOS ; FDSKER: LD HL,0 ;RETURN DPB_PTR = 0 FOR SELECT NNNNNNNNNNNNNNNNNN.\6NNNNNNNNNNNNNNNNNNNNNN TRNONE: LD DE,0 JR SETTR ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN DRIV:9NNNNNNNNNNNNNNNN.NNNNNNNNNNNNNNNNNNNNNN(IY + DVRPDRV) ;0,1: DRV 0, 2,3: DRV 1 LD (IOPB + PBDRVO),A ; ; OFFSET LOGICAL ADDRESS WITH LOGICAL DRIVE ; LD A,(BTDRVNNNNNNNNNNNNNNNNN.NNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; JADE 8" FLOPPY DISK DRIVER FUNCTION ; ENTRY- IY= DRIVER TABLE PTZNNNNNNNNNNNNNNNNN.!yNNNNNNNNNNNNNNNNNNNNNNIDE 1 ; LD A,80H FD8X1: LD (IOPB + PBSECO + 1),A ; ; EXECUTE THE IOPB ; JP XPRIM ; ; ; TRACK 0 ; FD8X20: LD C,j1!NNNNNNNNNNNNNNNN.'yNNNNNNNNNNNNNNNNNNNNNN EXECUTE TABLE ADDRESS ; LD A,(HL) INC HL LD H,(HL) LD L,A ; EX (SP),HL ;PUT CALLER'S DATA IN HL, FUNCTION ADDR ONNNNNNNNNNNNNNNNN.-NNNNNNNNNNNNNNNN.ўNNNNNNNNNNNNNNNNNNNNNN************************* ; ; OUTPUT HEX DATA TO CONSOLE SUBR ; ENTRY- A= DATA ; EXIT - A, C= ? ; ;***********************c@!NNNNNNNNNNNNNNNN. >UNNNNNNNNNNNNNNNNNNNNNNGE IF ILLEGAL. ALSO IMPLEMENTS CDOS CLOCK/CALENDAR ; SYSTEM CALLS FOR ASMB. ; ;*********************************************#NNNNNNNNNNNNNNNN.)NNNNNNNNNNNNNNNNNNNNNN SET CLOCK ; JR Z,CLKTIM ;IF TIME THEN GET IT ; CP A,93H JR Z,CLKRDC ;IF READ CLOCK THEN GET IT ; ; ILLEGAL SYSTEM CANNNNNNNNNNNNNNNNN.NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++ CLKCAL: LD HL,CALENT ;ROM ENTRY POINT ; CLK1: LD BC,CLKBFR ;READ CLOCK JR CLK2 NNNNNNNNNNNNNNNN.[DNNNNNNNNNNNNNNNNNNNNN!******************************************* ; ; CLOCK SET FUNCTION 91H ; ENTRY- DE= CLOCK IMAGE BUFR PTR (13 BYTES LONG) ; NNNNNNNNNNNNNNNNN.$NNNNNNNNNNNNNNNNNNNNNN ; ROM PROCEDURE RETURNS HERE ; EXROMR: PUSH AF ;SAVE RETURN VALUE CALL GETMON ;RESELECT MONITOR ROM ; POP AF ;RETURNNNNNNNNNNNNNNNNNN.*NNNNNNNNNNNNNNNNNNNNN!++++++++++++++++++++++++++++++++++ CNSCK: IF USEMON CALL GETMON JP 0F812H ELSE IN A,(NTS) ;IF DATA NOT READY THE"NNNNNNNNNNNNNNNNN.0~NNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++ NTOST: IN A,(NTS) CPL ;REVERSE SENSE AND A,1 SHL NTBSY JR TTOST1 ENDIF ANNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN^NNNNNNNсk8ԅn= ؉sA܍yG䑲M镶R![(Þ`-ɢd3ϦNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN/ NNNNNNNNNNNNNNNNNNNNNN ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; READER DRIVER - DUMMY ; EXIT - A= CTRL-Z @oNNNNNNNNNNNNNNNNN/+NNNNNNNNNNNNNNNNNNNNN! JR Z,LO ; LD A,C ;OUTPUT CHAR SET 7,A OUT (CENTOUT),A ; RES 7,A ;OUTPUT LOW TRUE STROBE OUT (CENTOUT),A SET 7,ANNNNNNNNNNNNNNNN/ LNNNNNNNNNNNNNNNNNNNNNN****************************** GETMON: LD A,XMONROM OUT (ROMSEL),A RET ;********************************************lNNNNNNNNNNNNNNNN/lNNNNNNNNNNNNNNNNNNNNNN ; ; SAVE REGS FIRST ; PUSH AF PUSH HL PUSH BC ; ; SAVE CURRENT ROM & GET MONITOR ROM ; IN A,(ROMSEL) LD (ROMEBNNNNNNNNNNNNNNNN/WNNNNNNNNNNNNNNNNNNNNN!E REGS & RETURN ; ITRAPR: LD A,(ROMSAV) ;RESTORE ROM # OUT (ROMSEL),A ; POP BC POP HL POP AF EI ;RE-ENABLE INTENNNNNNNNNNNNNNNNN/)NNNNNNNNNNNNNNNNNNNNNN,2,8,14,20,26,6,12,18,24,4,10 ; DB 16,22 ;############################################################################ ; C> NNNNNNNNNNNNNNNN/%ïNNNNNNNNNNNNNNNNNNNNN!DISK TYPE DVRFLG DS 1 ;DISK FLAGS DVR0SPT DS 1 ;TRK 0 SECTORS PER TRK DVR0SZ DS 1 ;TRK 0 SECTOR SIZE DVR1SPT DS 1 DVR1SZ DSBNNNNNNNNNNNNNNNN/+NNNNNNNNNNNNNNNNNNNNN!;;DISK TYPE DB #FG DB #S0,#Z0,#S1,#Z1,#SD,#ZD LIST OFF ENDM DVR0: IF BOOT = 10H ALLDRV HDEXEC,4,60H,64,1,64,1,6hNNNNNNNNNNNNNNNN/\NNNNNNNNNNNNNNNNNNNNNN ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ READER: LD A,CTRLZ ;FAKE EOF ;*********NNNNNNNNNNNNNNNNN/NNNNNNNNNNNNNNNNNNNNNN OUT (CENTOUT),A RET ENDIF ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETU NNNNNNNNNNNNNNNN/NNNNNNNNNNNNNNNNNNNNNN******************************** ; ; MESSAGE EDITOR ; ENTRY- HL= TEXT PTR (BIT 7= 1: TERMINATOR) ; EXIT - REGS= ? ; ;***** NNNNNNNNNNNNNNNN/ NNNNNNNNNNNNNNNNNNNNNNSAV),A CALL GETMON ; ; PRINT PROMPT ; LD HL,ITMSG IQCONT: CALL EDITOR ; LD HL,IQMSG ;QUERY USER CALL EDITOR ; ]ONNNNNNNNNNNNNNNN/NNNNNNNNNNNNNNNNNNNNN!RRUPTS RET ;---------------------------------------------------------------------------- ; ; UNSUPPORTED INTERRUPT ; NNNNNNNNNNNNNNNNN/ NNNNNNNNNNNNNNNN/ NNNNNNNNNNNNNNNNNNNNN!********************************* ; ; GET MONITOR PROM SUBR ; EXIT - A= ? ; ;**********************************************rNNNNNNNNNNNNNNNN/_NNNNNNNNNNNNNNNNNNNNNN---------------- ; ; USER INTERRUPT ; ;---------------------------------------------------------------------------- ITRAP: $NNNNNNNNNNNNNNNNN/fNNNNNNNNNNNNNNNNNNNNNNITOR THEN EXECUTE MONITOR TRAP ; ITRAP1: CP A,'M' JR NZ,ITRAPR ; POP BC POP HL POP AF JP 0F824H ; ; ELSE RESTORD9NNNNNNNNNNNNNNNN/NNNNNNNNNNNNNNNNNNNNNN########################################################### SDTRAN: GXLATE 26,6 ; DB 1,7,13,19,25,5,11,17,23,3,9,15 ; DB 21aNNNNNNNNNNNNNNNNN/$NNNNNNNNNNNNNNNNNNNNNN ;PHYSICAL DRIVE ; ; THE FOLLOWING MAY BE BROUGHT OFF DISK DESCRIPTOR OR FROM DEFAULT TABLES ; DVRDTYP DS 1 ;RESERVED FOR NNNNNNNNNNNNNNNNNNNNN!######################################################## SD8PBK: DW 26 ;SECTORS PER TRACK DB 3 ;BLOCK SHIFT FACTOR DB 7 Y~NNNNNNNNNNNNNNNNN/NNNNNNNNNNNNNNNNNNNNNN ;DISK SIZE (CLUSTERS -1) (DSM) DW 1152 / 2 ;DIRECTORY MAX (DRM) DB 0FFH ;ALLOCATION 0 (AL0) DB 10000000B ;ALLOCATIONNNNNNNNNNNNNNNNN/ {NNNNNNNNNNNNNNNNNNNNNN###################### ; ; MESSAGES ; ;############################################################################ MSGLEVrNNNNNNNNNNNNNNNN/[NNNNNNNNNNNNNNNNNNNNNN ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ALLDPH: MACRO #D LIST ON D#D(DD)DPH: ;DRIVE!rNNNNNNNNNNNNNNNN/gNNNNNNNNNNNNNNNNNNNNNN ;############################################################################ ; ; THE FOLLOWING DATA MUST RESIDE IN THIS ORONNNNNNNNNNNNNNNNN/NNNNNNNNNNNNNNNNNNNNNNTCPTS ; ; CLOCK BUFFER ; CLKBFR DS 13 ENDIF ;####################################################################rNNNNNNNNNNNNNNNN/%NNNNNNNNNNNNNNNNNNNNN!HECKSUMS STORAGE (1 BYTE PER SECTOR) ENDIF LIST OFF ENDM ; ; RESERVE THE DATA SPACE ; DD DL 1 REPT NDRVS LIST hT!NNNNNNNNNNNNNNNN/+אNNNNNNNNNNNNNNNNNNNNNN- DRIVE STORAGE SIZE (IN CLUSTERS) ; INT(((#_TRACKS - OFF) * SPT * BYTES PER SECTOR) / CLUSTER SIZE) -1 DPBDRM DS 2 ;DRM- DI%-BNNNNNNNNNNNNNNNN/kNNNNNNNNNNNNNNNNNNNNNN;BLOCK MASK DB 0 ;NULL MASK DW 242 ;DISK SIZE -1 DW 63 ;DIRECTORY MAX DB 11000000B ;ALLOC 0 DB 0 ;ALLOC 1 DW 16 #nHNNNNNNNNNNNNNNNNN/%NNNNNNNNNNNNNNNNNNNNNN 1 (AL1) DW 0 ;CHECK SIZE (CKS) DW 2 ;TRACK OFFSET (OFF) ; ; ; DB 01100000B ;FLAGS 256 BPS, HARD, SSSD DB 64,GNNNNNNNNNNNNNNNN/.NNNNNNNNNNNNNNNNNNNNNN: DM CR,LF,'LOAD ERROR' DSKEM: DM CR,LF,'Disk Error Status:',CR,LF DSKEB: DB 'H',CR,LF DM 'Abort, Ignore, Retry, (BDOS) - ' =NNNNNNNNNNNNNNNN/;NNNNNNNNNNNNNNNNNNNNN! PARAMETER HEADER FOR DRIVE #D(DD) DW 0 ;SECTOR TRAN TBL (OR 0 IF NO XLATE) DW 0 ;SCRATCH AREA DW 0 ;" DW 0 ;" DW [NNNNNNNNNNNNNNNN/4NNNNNNNNNNNNNNNNNNNNNNDER ; ;############################################################################ BTDRV: DS 1 ;DRIVE # BTTRK DS 2 ;TRACK #NNNNNNNNNNNNNNNNN/ jNNNNNNNNNNNNNNNNNNNNNN######## ; ; DRIVE ALLOCATION AREAS ; ;############################################################################ ;@@NNNNNNNNNNNNNNNN/&NNNNNNNNNNNNNNNNNNNNNNOFF ALLDAL 0123456789ABCDEF DD DL DD + 1 LIST ON ENDM ;#############################################################{NNNNNNNNNNNNNNNN/,NNNNNNNNNNNNNNNNNNNNNNNRECTORY SIZE -1 DPBAL0 DS 2 ;AL0,1- DIRECTORY ALLOCATION ; 1 MSB PER DIRECTORY CLUSTER ALLOCATED DPBCKS DS 2 ;CKS- # DIRECtNNNNNNNNNNNNNNNN/XNNNNNNNNNNNNNNNNNNNNN! ;CHECK SIZE DW 2 ;TRACK OFFSET ; ; DEFAULT DISK PHYSICAL PARAMETERS ; DB 0 ;FLAGS DB 26,0,26,0,26,0 ;SECTORS PER TNNNNNNNNNNNNNNNN/ NNNNNNNNNNNNNNNNNNNNNN1,64,1,64,1 ;64 SPT, 256 BPS ;############################################################################ ; ; MODE 2 INTxNNNNNNNNNNNNNNNNN/NNNNNNNNNNNNNNNNNNNNNN IF INTCPTS ISCMSG: DM CR,LF,'ILL SYS CALL',CR,LF ENDIF IF INTRPTS ITMSG DM CR,LF,'User' ILLIM DM CR,LF,'Ill.' IQ?9NNNNNNNNNNNNNNNN/ NNNNNNNNNNNNNNNNNNNNNNDIRBF ;DIRECTORY BUFFER PTR DW D#D(DD)DPB ;DRIVE PARAMETER BLK PTR IF ((DD - 1) <= NDHD) AND ((DD - 1) >= STHD) DW 0 *NNNNNNNNNNNNNNNNN/NNNNNNNNNNNNNNNNNNNNNN BTSEC DS 2 ;SECTOR # BTFLG DS 1 ;RESERVED FOR FLAGS BTDMA DS 2 ;DMA ADDRESS BTDMAX DS 1 ;DMA EXTENDED ADDRESS ;#######NNNNNNNNNNNNNNNNN/!8[NNNNNNNNNNNNNNNNNNNNNN@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; MACRO TO DEFINE THE DRIVE ALLOCATION & CHECKSUM"aNNNNNNNNNNNNNNNN/'NNNNNNNNNNNNNNNNNNNNNN############### ; ; RESERVE DRIVE PARAMETER BLOCKS ; ;#################################################################### HNNNNNNNNNNNNNNNN/-}6NNNNNNNNNNNNNNNNNNNNNNTORY SECTORS CHECKED ; (DRM +1) / 4 DPBOFF DS 2 ;OFF- # RESERVED TRACKS (USUALLY 2) DPBSZ DS 0 ENDM ; ; ;@@@@@@@@@@@@NNNNNNNNNNNNNNNN/HNNNNNNNNNNNNNNNNNNNNNNRACK, SECTOR SIZE (128) ;############################################################################ ; ; DEFAULT 8" HARDNNNNNNNNNNNNNNNN/ GNNNNNNNNNNNNNNNNNNNNN!ERRUPT VECTOR TABLE ; ;############################################################################ ; ; START ON AN EVEN PAy NNNNNNNNNNNNNNNNN/NNNNNNNNNNNNNNNNNNNNNNMSG DM ' Int. Abort? (Y/N) - ' ENDIF ;############################################################################ ; rNNNNNNNNNNNNNNNN/YNNNNNNNNNNNNNNNNNNNNN!;NO CHECKS ON HARD DISK ELSE DW D#D(DD)CHK ;DRIVE DISK CHECKSUMS ARRAY PTR ENDIF DW D#D(DD)ALL ;DRIVE CLUSTER ALLO NNNNNNNNNNNNNNNN/KNNNNNNNNNNNNNNNNNNNNNN##################################################################### ; ; VARIABLES ; ;################################### NNNNNNNNNNNNNNNN/"mNNNNNNNNNNNNNNNNNNNNNNS AREA ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ALLDAL: MACRO #D LIST ON IF ((DDfNNNNNNNNNNNNNNNNN/(NNNNNNNNNNNNNNNNNNNNNN######## STRUCT 0 DPBSPT DS 2 ;SPT- SECTORS/TRACK DPBBSH DS 1 ;BSH- BLOCK SHIFT FACTOR DETERMINED BY CLUSTER SIZE ; 1K= kNNNNNNNNNNNNNNNN/.(eNNNNNNNNNNNNNNNNNNNNNN@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; GENERATE THE DPB FOR DRIVE MACRO ; ;@@@@@@@@@@@@@@@@@@@NNNNNNNNNNNNNNNNNN/yNNNNNNNNNNNNNNNNNNNNNN DISK PARAMETER BLOCK ; ;############################################################################ HDPBK: DW 128 ;SECTORSBXNNNNNNNNNNNNNNNNN/ vNNNNNNNNNNNNNNNNNNNNN!AGE BOUNDARY ; IF $ AND 0FFH DS 100H - ($ AND 0FFH) ENDIF INTABL: REPT 7 ;1ST 7 ARE UNSUPPORTED LIST OFF DW ILLINNNNNNNNNNNNNNNNNN/=NNNNNNNNNNNNNNNNNNNNNN; DRIVE PARAMETER HEADER AREA ; 1 PER DRIVE ; ;############################################################################ NNNNNNNNNNNNNNNN/hNNNNNNNNNNNNNNNNNNNNNNCATION BIT MAP PTR LIST OFF ENDM ; ; DEFINE THE DATA ; DD DL 1 REPT NDRVS LIST OFF ALLDPH 0123456789ABCDEF DD DrNNNNNNNNNNNNNNNN/xNNNNNNNNNNNNNNNNNNNNN!######################################### DTPTR: DS 2 ;DRIVE TABLE PTR LOGRQ: DS 1 ;LOG ON REQUEST REG. DVRTPTR DS 2 ;DRIVE DNNNNNNNNNNNNNNNN/#^9NNNNNNNNNNNNNNNNNNNNNN - 1) >= STHD) AND ((DD - 1) <= NDHD) D#D(DD)ALL: DS 127 ;ALLOCATION BIT MAP FOR 8" HARD DRIVE #D(DD) ENDIF IF ((DD - 1HNNNNNNNNNNNNNNNNN/)NNNNNNNNNNNNNNNNNNNNN!3, 2K= 4, 4K= 5, 8K= 6, 16K= 7 DPBBLM DS 1 ;BLM- BLOCK MASK ; 1K = 7, 2K= 15, 4K= 31, 8K= 63, 16K= 127 DPBEXM DS 1 ;EXM- E$NNNNNNNNNNNNNNNNN//TNNNNNNNNNNNNNNNNNNNNNN@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ALLDPB: MACRO #D LIST ON D#D(DD)DPB: DS DPBSZ ;ALLOCATION FOR DRIRNNNNNNNNNNNNNNNN/*NNNNNNNNNNNNNNNNNNNNNN PER TRACK (LOGICAL) (SPT) DB 5 ;BLOCK SHIFT FACTOR (BSH) DB 31 ;BLOCK MASK (BLM) DB 1 ;NULL MASK (EXM) DW 1015 HNNNNNNNNNNNNNNNN/ HNNNNNNNNNNNNNNNNNNNNNNT LIST ON ENDM ; DW ITRAP ;INT 8 IS USER INTERRUPT ENDIF ;######################################################9NNNNNNNNNNNNNNNN/hNNNNNNNNNNNNNNNNNNNNNN; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; GENERATE A DISK PARAMETER TABLE MACRO ; }G$NNNNNNNNNNNNNNNNN/VNNNNNNNNNNNNNNNNNNNNNNL DD + 1 LIST ON ENDM ; ; LAST OF INITIALIZED CODE READ FROM DISK ; BIOSND EQU $ SUBTTL UNINITIALIZED DATA AREA :MNNNNNNNNNNNNNNNN/-NNNNNNNNNNNNNNNNNNNNNNRIVER TABLE BASE ADDRESS PTR DVRXADR DS 2 ;DRIVE DRIVER EXECUTION ADDRESS ROMSAV DS 1 ;ROM SWAP SAVE OF ORIGINAL ROM IF INNNNNNNNNNNNNNNNNN/$ǮNNNNNNNNNNNNNNNNNNNNNN) >= ST8FD) AND ((DD - 1) <= ND8FD) D#D(DD)ALL: DS 57 ;ALLOCATION BIT MAP FOR 8" DRIVE #D(DD) D#D(DD)CHK DS 32 ;DIRECTORY CdNNNNNNNNNNNNNNNNN/*NNNNNNNNNNNNNNNNNNNNN!XTENT MASK ; DSM < 256 : 1K= 0, 2K= 1, 4K= 3, 8K= 7, 16K= 15 ; DSM > 255 : 2K= 0, 4K= 1, 8K= 3, 16K= 7 DPBDSM DS 2 ;DSM̼$NNNNNNNNNNNNNNNNN/0NNNNNNNNNNNNNNNNNNNNNNVE #D(DD) LIST OFF ENDM ; ; RESERVE THE DATA SPACE ; DD DL 1 REPT NDRVS LIST OFF ALLDPB 0123456789ABCDEF DD DL EHNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN$NNNNNNNNЁl: օp> ډuCލ{J摴O앺V$񙿚\)Ğa.ʢe4ϦNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN0NNNNNNNNNNNNNNNNNNNNNNDD + 1 LIST ON ENDM IF (($ - 8000H) > 07800H) OR ($ < 8000H) CONMSG **** BIOS TOO BIG, USE MOVCPM & RE-ADJUST! ***{HNNNNNNNNNNNNNNNNN0lbNNNNNNNNNNNNNNNNNNNNNN; RETURN LIST DEVICE STATUS ; EXIT - A= 0: BUSY, FFH:READY ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++NNNNNNNNNNNNNNNNN0 NNNNNNNNNNNNNNNNNNNNNN 26,6 ;############################################################################ ; ; COMMON I/O PARAMETER BLOCK ; ;#'NNNNNNNNNNNNNNNNN0NNNNNNNNNNNNNNNNNNNNNNNO, CA ; ;**************************************************************************** ; ; CONFIGURATION: ; ; CPM ; DRIVE9NNNNNNNNNNNNNNNN0LNNNNNNNNNNNNNNNNNNNNNN20H ; A JADE 5" FLOPPY PHYSICAL DRIVE 0 ; B JADE 5" FLOPPY PHYSICAL DRIVE 1 ; C SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE $NNNNNNNNNNNNNNNNN0NNNNNNNNNNNNNNNNNNNNNN 60k. ; 3.01 26 JUN 88 GRH ; Remove 5" floppy support. Implement in CP/M-86 BIOS. ; Change single function to return drive t1 NNNNNNNNNNNNNNNN0% NNNNNNNNNNNNNNNNNNNNNNructure in preparation for deblocking. ; 3.05 11-3-88 GRH ; Change included data to update IOPB.PBSTAT to new configuration.NNNNNNNNNNNNNNNN0+/NNNNNNNNNNNNNNNNNNNNNN ; 3.08 2-22-91 GRH ; Remove references to THIS_BNK & use monitor function #7 instead. ; Add track-head shift factor to DPBsNNNNNNNNNNNNNNNN0NNNNNNNNNNNNNNNNNNNNNN* ENDIF END :y$NNNNNNNNNNNNNNNNN0|\NNNNNNNNNNNNNNNNNNNNN!+++++++++++++ ; LISTST: LD A,MF_LOS JP XMROM ;***********************************************************************NNNNNNNNNNNNNNNN0NNNNNNNNNNNNNNNNNNNNNN########################################################################### ; IOPB: REPT PB_SIZE LIST OFF DB 0 LIST ON ՁNNNNNNNNNNNNNNNNNN0:BNNNNNNNNNNNNNNNNNNNNN! USAGE IF BOOT = 10H ;HARD DISK BOOT CONFIG. ; A SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 0 ; B SIDE 2 & 3 OF HARD DISKv NNNNNNNNNNNNNNNN0MNNNNNNNNNNNNNNNNNNNNN!0 ; D SIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 0 ; E SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 1 ; F SIDE 2 & 3 OF HARD DISK;CNNNNNNNNNNNNNNNNN0 NNNNNNNNNNNNNNNNNNNNNNable ptr into a BIOS function ; call using restart instruction. ; Change LOGON to specify the ID sector & track. At same timBNNNNNNNNNNNNNNNNN0&YNNNNNNNNNNNNNNNNNNNNN! ; 3.06 1-28-89 GRH ; Revised primitive calling procedures to use the monitor rom function ; rather than swapping Roms itsoNNNNNNNNNNNNNNNN0,~NNNNNNNNNNNNNNNNNNNNN! for future use. ; 3.09 5-15-91 GRH ; Change 8" floppy side select to track bit 0. Move calculation from ; DCM8 to CBIOS. NNNNNNNNNNNNNNNN0NNNNNNNNNNNNNNNNNNNNN!********************************** ; ; PUNCH DRIVER ; ENTRY- C= CHAR TO OUTPUT ; ;*****************************************NNNNNNNNNNNNNNNNNN0 OmNNNNNNNNNNNNNNNNNNNNNN***** ; ; MESSAGE EDITOR ; ENTRY- HL= TEXT PTR (BIT 7= 1: TERMINATOR) ; EXIT - REGS= ? ; ;********************************QNNNNNNNNNNNNNNNNN0NNNNNNNNNNNNNNNNNNNNN! ENDM ;############################################################################ ; ; DISK DRIVER TABLES (DDT) ; ;###ۼNNNNNNNNNNNNNNNNNN0 sNNNNNNNNNNNNNNNNNNNNN! PHYSICAL DRIVE 0 ; C SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 1 ; D SIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 1 ; E JADE 8"NNNNNNNNNNNNNNNNNN0*|NNNNNNNNNNNNNNNNNNNNNN PHYSICAL DRIVE 1 ; G JADE 8" FLOPPY PHYSICAL DRIVE 0 ; H JADE 8" FLOPPY PHYSICAL DRIVE 1 ENDIF ; ;*****************u9NNNNNNNNNNNNNNNN0!"NNNNNNNNNNNNNNNNNNNNN!e, fix bug ; which did not specify the logon track. ; 3.02 7 JUL 88 GRH ; Add '?' to include file names. ; Change hard dNNNNNNNNNNNNNNNNN0'jNNNNNNNNNNNNNNNNNNNNN!elf. ; 3.07 11-25-90 GRH ; Modify for Ver. 1.22 Monitor. ; Fix bug in 8" Hard Disk table which benignly (at current level) HNNNNNNNNNNNNNNNN0-ONNNNNNNNNNNNNNNNNNNNN! ; Remove IOPB ptr passing in IX redundancy. ; Change DPB track-head shift factor to Sector Offset like track ; offset. Disk 0.!NNNNNNNNNNNNNNNN091NNNNNNNNNNNNNNNNNNNNN!*********************************** ; PUNCH: RET ;***********************************************************************PyNNNNNNNNNNNNNNNNN0 >NNNNNNNNNNNNNNNNNNNNN!******************************************** ; EDITOR: CALL GETBNK LD E,A LD A,MF_PUTS JP XMROM SUBTTL INITIALIZNNNNNNNNNNNNNNNNNN0NNNNNNNNNNNNNNNNNNNNNN######################################################################### ; STRUCT 0 DDT_EXE DS 2 ;START ADDRESS OF DISK DRIDONNNNNNNNNNNNNNNNN0\ NNNNNNNNNNNNNNNNNNNNNN FLOPPY PHYSICAL DRIVE 0 ; F JADE 8" FLOPPY PHYSICAL DRIVE 1 ENDIF IF BOOT = 3 ; A JADE 8" FLOPPY PHYSICAL DRIVE 0'NNNNNNNNNNNNNNNNN0NNNNNNNNNNNNNNNNNNNNNN******************************************** ; ; REVISION HISTORY: ; ; 3.00 - 26 JAN 87 GRH ; Implemented new common IONNNNNNNNNNNNNNNN0"qNNNNNNNNNNNNNNNNNNNNN!isk system tracks directory reference to new format. ; Correct bug in drivers which caused retry to fail. (sector remained ; NNNNNNNNNNNNNNNNN0(zNNNNNNNNNNNNNNNNNNNNNN ; caused the drive table to have bad data (default table was missing ; the 2 deblocking extension bytes). ; Implement data wBNNNNNNNNNNNNNNNN0.NNNNNNNNNNNNNNNNNNNNNNpartitioning will add this value to sector word. It ; will be stored in the ID sector data to be dynamic. ; ; 3.10 5-20-91 ONNNNNNNNNNNNNNNN0 NNNNNNNNNNNNNNNNNNNNNN***** ; ; PRINTER DRIVER ; ENTRY- C= CHAR TO OUTPUT ; ;********************************************************************NNNNNNNNNNNNNNNNN0 )NNNNNNNNNNNNNNNNNNNNNNED DATA ;############################################################################ ; ; 3740 SECTOR TRANSLATION TABLE ; **)NNNNNNNNNNNNNNNNNN0ŷNNNNNNNNNNNNNNNNNNNNNN TITLE CUSTOMIZED BIOS FOR M5B LIST NOCOND BOOT EQU 10H ;10H: HARD DISK, 3: 8" FLOPPY, 20H: 5" FLOPPY ;********************R[!NNNNNNNNNNNNNNNN0oNNNNNNNNNNNNNNNNNNNNN! ; B JADE 8" FLOPPY PHYSICAL DRIVE 1 ; C SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 0 ; D SIDE 2 & 3 OF HARD DISK PHYSICAL P NNNNNNNNNNNNNNNN0NNNNNNNNNNNNNNNNNNNNN!PB code & Jade floppy firmware support. ; Implemented disk drive driver tables and new function to return ; a ptr to a drive BNNNNNNNNNNNNNNNN0#@NNNNNNNNNNNNNNNNNNNNNN corrupted) ; Stubbed out new Clock routines for present. ; 3.03 31 JUL 88 GRH ; Unstub Clock routines. ; 3.04 6 AUG 88 ,$NNNNNNNNNNNNNNNNN0)INNNNNNNNNNNNNNNNNNNNNNxfer inhibit schemes with PB_FLG & PB_BCNT. ; Add pick-up of THIS_BNK data in all iopb cases. ; Remove clock buffer set/read sJNNNNNNNNNNNNNNNNN0/-NNNNNNNNNNNNNNNNNNNNN! GRH ; Change LOGON to attempt to recover from old disks better, using ; DCM8301 version controller firmware. ; ; 3.11 9-2-NNNNNNNNNNNNNNNN0_SNNNNNNNNNNNNNNNNNNNNN!******** ; LO: LD A,MF_LO JP XMROM ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ~NNNNNNNNNNNNNNNNN0 NNNNNNNNNNNNNNNNNNNNNN** CP/M SINGLE DENSITY **** ; ;############################################################################ ; SDTRAN: GXLATEjNNNNNNNNNNNNNNNNN0NNNNNNNNNNNNNNNNNNNNN!******************************************************** ; ; CUSTOMIZED BIOS FOR M5B ; (c) 1981 GRH Electronics, CUPERTI5NNNNNNNNNNNNNNNNN0/NNNNNNNNNNNNNNNNNNNNNNDRIVE 0 ; E SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 1 ; F SIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 1 ENDIF IF BOOT = oBNNNNNNNNNNNNNNNN0ՉNNNNNNNNNNNNNNNNNNNNNNtable. ; Removed init of IOBYTE. ; Implemented 5" floppy driver. ; Implemented use of ROM primitives. ; Moved system down touHNNNNNNNNNNNNNNNNN0$?NNNNNNNNNNNNNNNNNNNNNNGRH ; Remove floppy side select from BIOS & move to controller. ; Implement new ID sector format. ; Implement CP/M 3.0 DPB st$!NNNNNNNNNNNNNNNN0*NNNNNNNNNNNNNNNNNNNNN!ystem calls. ; 12-5-90 GRH ; Remove IX IOPB ptr passing to disk drivers. ; 1-13-91 GRH ; Fix bug which corrupted PB_FLG. NNNNNNNNNNNNNNNNN00`NNNNNNNNNNNNNNNNNNNNN!91 GRH ; Add redlines & change for M5ZMON v.2.00. ; ; 3.12 9-11-91 GRH ; Add deblocking code. ; 9-17-91 GRH Add r/ls\NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNLNNNNŃg5Ѕk9ԉo= ׍sAܑxEᕮ|I䙲OꝷT!W&¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN0NNNNNNNNNNNNNNNNNNNNNN & move to 59k system. ; 9-19-91 GRH Fix bug which destroyed my root directories! ; BUF_RD was writing. ; Patch proble NNNNNNNNNNNNNNNNN0[RNNNNNNNNNNNNNNNNNNNNNN============================================================== ; ; CONDITIONAL ASSEMBLY FLAGS ; ;===========================3NNNNNNNNNNNNNNNN0 NNNNNNNNNNNNNNNNNNNNNN====================================================================== ; SYS EQU 2 ;CP/M VERSION {2,3} ; NKSYS: EQU 59 ;SY9NNNNNNNNNNNNNNNN0NNNNNNNNNNNNNNNNNNNNNNFUNRST BFUNRSI EQU 0C7H + BFUNRST ;============================================================================ ; ; OTHEhNNNNNNNNNNNNNNNN0{.NNNNNNNNNNNNNNNNNNNNNN=================================================================== ; ; BDOS CONSTANTS ON ENTRY TO WRITE ; ;=========XNNNNNNNNNNNNNNNNN0шNNNNNNNNNNNNNNNNNNNNN! LIST OFF NXTSEC DL 1 ;;START WITH SECTOR 1 LOWEST DL 1 ;; REPT #SECTORS LIST ON DB NXTSEC LIST OFF NXTSEC DL NXTNNNNNNNNNNNNNNNN0%;NNNNNNNNNNNNNNNNNNNNN! DB '.' DB ((DD % 100) / 10) + '0' DB (DD % 10) + '0' ENDM SUBTTL BIOS CODE ORG BIOS ;-------------------------NNNNNNNNNNNNNNNN0+NNNNNNNNNNNNNNNNNNNNNNIOFUNC ;EXECUTE FUNCTION CALL ;############################################################################ ; ; THE FOLL@NNNNNNNNNNNNNNNN0NNNNNNNNNNNNNNNNNNNNN!ms with partitioning until 20MB drive installed. ; Fix TPA corruption by LOGON problem by using ROMBNK sector buffer for ; NNNNNNNNNNNNNNNNN0KlNNNNNNNNNNNNNNNNNNNNNN================================================= ; INTCPTS EQU TRUE ;ENABLE SYSTEM CALL INTERCEPT WHISTLE ;============YNNNNNNNNNNNNNNNN0NNNNNNNNNNNNNNNNNNNNN!STEM SIZE IN K BYTES KBYTE: EQU 1024 CPMSZ: EQU KBYTE * NKSYS CPMBS: EQU CPMSZ - (20 * KBYTE) ;CP/M BIAS VALUE CCP: EQU CPMNNNNNNNNNNNNNNNN0 rNNNNNNNNNNNNNNNNNNNNNNR DECLARATIONS ; ;============================================================================ ; SECSZ: EQU 128 NDRVS: EQU < NNNNNNNNNNNNNNNN0.}NNNNNNNNNNNNNNNNNNNNN!=================================================================== ; WRALL EQU 0 ;WRITE TO ALLOCATED WRDIR EQU 1 ;WRITE TO DadNNNNNNNNNNNNNNNNN0 #NNNNNNNNNNNNNNNNNNNNNNSEC + #SKEW ;ADD SKEW FACTOR ;; IF NXTSEC > #SECTORS ;CHECK FOR OVERFLOW NXTSEC DL NXTSEC - #SECTORS ;; IF NXTSEC <= NNNNNNNNNNNNNNNNN0&nNNNNNNNNNNNNNNNNNNNNNN--------------------------------------------------- ; ; BIOS JUMP VECTOR TABLE ; ;----------------------------------------ۺNNNNNNNNNNNNNNNN0,NNNNNNNNNNNNNNNNNNNNNNNOWING BOOT DATA MUST RESIDE AS DEFINED RIGHT BEFORE THE COLD ; INIT ROUTINE START AND MUST BE IN THE 1ST SECTOR. THESE 2 WORDS B NNNNNNNNNNNNNNNN0NNNNNNNNNNNNNNNNNNNNNN ID sector read. ; 9-20-91 GRH Fold in redlines. ; 10-21-91 GRH Fix bugs ; 10-22-91 GRH Fix bugs ; 10-23-91 GRH BNNNNNNNNNNNNNNNN0 x]NNNNNNNNNNNNNNNNNNNNN!================================================================ ; ; INCLUDE COMIOPB3.DEF ; INCLUDE DISKS3.DEF ; INCLU4NNNNNNNNNNNNNNNNNN0NNNNNNNNNNNNNNNNNNNNNNBS + 3400H ;ADDR OF CCP BDOS: EQU CPMBS + 3C00H ;ADDRESS OF BDOS BIOS: EQU CPMBS + 4A00H ;ADDRESS OF BDOS BIOSR: EQU 1000HrNNNNNNNNNNNNNNNN0>CNNNNNNNNNNNNNNNNNNNNN!6 IF BOOT = 10H ; ; 8" HARD DISK BOOT DATA ; STHD EQU 0 ;START LOGICAL DRIVE OF HARD DISK NDHD EQU 3 ;LAST LOGICAL VNNNNNNNNNNNNNNNNN0LNNNNNNNNNNNNNNNNNNNNN!IRECTORY WRUAL EQU 2 ;WRITE TO UNALLOCATED ;============================================================================ NNNNNNNNNNNNNNNN0!NNNNNNNNNNNNNNNNNNNNNNLOWEST ;CHECK FOR REPEAT NXTSEC DL LOWEST + 1 LOWEST DL NXTSEC ENDIF ENDIF ;; ENDM LIST ON ENDM ;@@@@@@@@@nNNNNNNNNNNNNNNNNN0']NNNNNNNNNNNNNNNNNNNNNN------------------------------------ ; JP INIT1 ;COLD START ENTRY JP WARM ;RELOAD CCP/BDOS JP CNSCK ;GET CONSOLE STATUyNNNNNNNNNNNNNNNN0-NNNNNNNNNNNNNNNNNNNNNNARE ; REFERENCED BY THE BOOT LOADER CODE IN ORDER TO DETERMINE THE LOAD ADDRESS ; AND LENGTH OF THE BIOS. ; ;###############NNNNNNNNNNNNNNNN0NNNNNNNNNNNNNNNNNNNNNN Fix bugs ; VERSN EQU 312 ; ;**************************************************************************** SUBTTL SYSTEM NNNNNNNNNNNNNNNNN0 -NNNNNNNNNNNNNNNNNNNNNNDE BDIR.DEF ; INCLUDE M5ZF2.DEF ; ;============================================================================ ; NNNNNNNNNNNNNNNNN0NNNNNNNNNNNNNNNNNNNNNN - BIOS ; ; PAGE 0 LOCATIONS ; PAGE0: EQU 0 ;START OF CP/M RAM DEFDRV: EQU PAGE0 + 4 ;DEFAULT DRIVE PARAM ADDR BDOSJV E#UNNNNNNNNNNNNNNNN0kNNNNNNNNNNNNNNNNNNNNNNDRIVE OF HARD DISK ST8FD EQU 4 ;START LOGICAL DRIVE OF 8" FLOPPY ND8FD EQU 5 ;LAST LOGICAL DRIVE OF 8" FLOPPY ENDIF NNNNNNNNNNNNNNNNN0NNNNNNNNNNNNNNNNNNNNN!; ; ASCII CHARS ; ;============================================================================ ; LF: EQU 0AH CR: EQU 0DH 9NNNNNNNNNNNNNNNN0"ANNNNNNNNNNNNNNNNNNNNNN@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; INITIALIZE VERSION TEXT IN RAM MACRO ; ;@@@@@@@@@@@@ANNNNNNNNNNNNNNNNN0(MNNNNNNNNNNNNNNNNNNNNNNS JP CI ;CONSOLE INPUT JP COC ;CONSOLE OUTPUT JP LO ;PRINTER OUTPUT JP PUNCH JP READER JP HOME ;HOME SELECTED DRSNNNNNNNNNNNNNNNN0.,NNNNNNNNNNNNNNNNNNNNN!############################################################# ; DB 0 ;Z80 CPU DB 0 ;SPARE BIOSSZ: DW BIOSND - BIOS ;BIOS6NNNNNNNNNNNNNNNNNN0=0NNNNNNNNNNNNNNNNNNNNNNDECLARATIONS ;============================================================================ ; ; ASSEMBLY PARAMETERS ; ;=====NNNNNNNNNNNNNNNNN0 ?NNNNNNNNNNNNNNNNNNNNN! LIST OFF *INCLUDE COMIOPB3.DEF *INCLUDE DISKS3.DEF *INCLUDE BDIR.DEF *INCLUDE M5ZF2.DEF LIST ON ;FNNNNNNNNNNNNNNNNN0NNNNNNNNNNNNNNNNNNNNNNQU PAGE0 + 5 ;BDOS SYSTEM CALL ENTRY THIS_STK EQU PAGE0 + 1CH ;CURRENT STACK FRAME PTR DK_BDRV EQU 0041H ;BOOT DRIVE # FROM P[NNNNNNNNNNNNNNNN0X!NNNNNNNNNNNNNNNNNNNNN!IF BOOT = 3 ; ; 8" FLOPPY BOOT DATA ; STHD EQU 2 ;START LOGICAL DRIVE OF HARD DISK NDHD EQU 5 ;LAST LOGICAL DRIVE OF HA6NNNNNNNNNNNNNNNN0NNNNNNNNNNNNNNNNNNNNNN CTRLZ: EQU 1AH ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; GENERATE THE TRANSLATIONNNNNNNNNNNNNNNN0#pNNNNNNNNNNNNNNNNNNNNNN@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; PVERS MACRO #VERS DD DL #VERS IF DD > 9999 DB (DD / NNNNNNNNNNNNNNNNN0)~NNNNNNNNNNNNNNNNNNNNNNIVE JP SELDSK ;SELECT DISK DRIVE JP SETTRK ;SET TRACK # JP SETSEC ;SET SECTOR # JP SETDMA ;SET TRANSFER ADDR JP DINNNNNNNNNNNNNNNNN0/NNNNNNNNNNNNNNNNNNNNNN MODULE SIZE IN BYTES BIOSST: DW BIOS ;BIOS MODULE LOAD ADDR FOR SBD ; ; CONTINUE ON WITH INIT ; INIT1: JR INIT ;##J9NNNNNNNNNNNNNNNN0hcNNNNNNNNNNNNNNNNNNNNNN======================================================================= ; FALSE EQU 0 TRUE EQU NOT FALSE ;==============qNNNNNNNNNNNNNNNN0 NNNNNNNNNNNNNNNNNNNNNN============================================================================ ; ; DISK OPERATING SYSTEM ADDRESSES ; ;======DNNNNNNNNNNNNNNNN0NNNNNNNNNNNNNNNNNNNNN!ROM DEFBFR EQU PAGE0 + 80H ;DEFAULT BUFFER ; ; BIOS FUNCTION CALL RESTART VECTOR ; BFUNRST EQU 28H BFUNRSV EQU PAGE0 + BNNNNNNNNNNNNNNNNN0HNNNNNNNNNNNNNNNNNNNNNNRD DISK ST8FD EQU 0 ;START LOGICAL DRIVE OF 8" FLOPPY ND8FD EQU 1 ;LAST LOGICAL DRIVE OF 8" FLOPPY ENDIF ;=========Ɉ9NNNNNNNNNNNNNNNN0NNNNNNNNNNNNNNNNNNNNN!N TABLE MACRO ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; GXLATE MACRO #SECTORS, #SKEWD'NNNNNNNNNNNNNNNNN0$NNNNNNNNNNNNNNNNNNNNNN10000) + '0' DD DL DD % 10000 ENDIF IF DD > 999 DB (DD / 1000) + '0' DD DL DD % 1000 ENDIF DB (DD / 100) + '0'!NNNNNNNNNNNNNNNN0*+NNNNNNNNNNNNNNNNNNNNNNSKRD ;PERFORM DISK READ JP DISKWR ;PERFORM DISK WRITE JP LISTST ;RETURN LIST STATUS JP SECTRN ;TRANSLATE SECTOR JP B 6NNNNNNNNNNNNNNNNN00PNNNNNNNNNNNNNNNNNNNNNN########################################################################## ; ; DIRECTORY SECTOR BUFFER STARTS HERE AFTER CRUNCNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNHNNNNNNNNNЁk9օq? ۉvCݍxF⑰}J啲M虶R흺V#񡾢Y(ĦNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN1pNNNNNNNNNNNNNNNNNNNNNNHING COLD START ; CODE. THIS BUFFER IS USED BY THE CP/M DIRECTORY CHECK ROUTINES THAT ; CHECK FOR DISK CHANGE. ; ;########NNNNNNNNNNNNNNNNN1NNNNNNNNNNNNNNNNNNNNNN TO WARM START ; LD HL,(BIOS+4) LD (BIOS+1),HL ; ; INIT OUR STUFF ; CALL GETBNK LD (BUF_DMAB),A ; ; INITIALIZElHNNNNNNNNNNNNNNNN1 NNNNNNNNNNNNNNNNNNNNNN-80 Vers 2.2',CR,LF DB 'M5b CBIOS Vers ' PVERS VERSN DM CR,LF IF $ > (DIRBF + SECSZ) CONMSG **** WARNING! C[9NNNNNNNNNNNNNNNN1aNNNNNNNNNNNNNNNNNNNNNNON DRIVE TO INIT TABLES ; LD A,(DK_BDRV) AND A,3 ;MODULO 4 LD C,A LD E,0 CALL SELDSK LD A,L ;IF ERROR THEN ABORT NNNNNNNNNNNNNNNN1:NNNNNNNNNNNNNNNNNNNNNNR THEN EXIT ; ; NEXT SECTOR ; LD HL,CPM_SEC INC (HL) ; LD DE,128 ;DMA += SECTOR SIZE LD HL,(CPM_DMA) ADD HL,DE RINNNNNNNNNNNNNNNNN1 NNNNNNNNNNNNNNNNNNNNNNL EDITOR CALL MR_BRK HALT ; ; ; BOOT OK, INIT PAGE 0 ; WZRPG: ; ; INIT BIOS WARM START IN PAGE 0 ; LD A,0C3H NNNNNNNNNNNNNNNN1%zRNNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; READ A DISK SECTOR ; EXIT - A= 0: OK; /0: ERROR ; ;+++++++++++++M8NNNNNNNNNNNNNNNN1+Y]NNNNNNNNNNNNNNNNNNNNNNW_RET ;**************************************************************************** ; ; WRITE DISK SECTOR FUNCTION ; ENTҧNNNNNNNNNNNNNNNN1#NNNNNNNNNNNNNNNNNNNNNN#################################################################### ; DIRBF: EQU $ ;BUFFER BEGINNING ;-----------------hNNNNNNNNNNNNNNNNN1 NNNNNNNNNNNNNNNNNNNNNN CLOCK VECTORS IF CLOCK INSTALLED ; LD A,MF_CSYN ;TEST FOR BOARD PRESENT CALL XMROM ; ; IF CLOCK PRESENT THEN TURN ON CD$NNNNNNNNNNNNNNNN1NNNNNNNNNNNNNNNNNNNNNNNOLD INIT CODE BIGGER THAN DIR BUFFER **** ELSE DS DIRBF+SECSZ-$ ;FILL OUT DIRECTORY BUFFER TO 1 SECTOR SIZE ENDIF rNNNNNNNNNNNNNNNN1LNNNNNNNNNNNNNNNNNNNNN! OR A,H JR Z,WEROR ; ; READ BOOT DIRECTORY ; LD BC,DEFBFR ;SET XFER ADDRESS (USE DEFAULT BUFFER) CALL SETDMA ; rNNNNNNNNNNNNNNNN1oNNNNNNNNNNNNNNNNNNNNNN LD (CPM_DMA),HL ; ; IF NOT INTO BDOS THEN READ NEXT SECTOR ; LD DE,BDOS XOR A,A SBC HL,DE JR C,WREAD ; ; ELSE NNNNNNNNNNNNNNNNN1 NNNNNNNNNNNNNNNNNNNNNN LD HL,BIOS + 3 LD (PAGE0),A LD (PAGE0 + 1),HL ; ; INIT BDOS CALL VECTOR IN PAGE 0 ; LD HL,BDOS + 6 LD (BDOSJV),A Ԑ!NNNNNNNNNNNNNNNN1&/NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; DISKRD: ; ; SET UP DATA TABLE PTRS ; PUSH IX LD IX,z%NNNNNNNNNNNNNNNN1,NNNNNNNNNNNNNNNNNNNNN!RY- C= WRITE TYPE: ; 0: WRITE TO ALLOCATED BLOCK (UPDATE) ; 1: WRITE TO DIRECTORY BLOCK (ALLWAYS WRITE) ; 2: WRITE TO U@}dNNNNNNNNNNNNNNNN1NNNNNNNNNNNNNNNNNNNNNN----------------------------------------------------------- ; ; INIT - COLD START ENTRY FROM BOOT MUST SET ALL BIOS PARAMS(\NNNNNNNNNNNNNNNN1 9NNNNNNNNNNNNNNNNNNNNNNLOCK DRIVE ; OR A,A LD A,38H ;COND. JR (ON) JR Z,CLKON ; ; ELSE TURN OFF CLOCK DRIVE ; LD A,18H ;UNCOND. JR (OFFtNNNNNNNNNNNNNNNNNN1NNNNNNNNNNNNNNNNNNNNN! ;---------------------------------------------------------- ; ; WARM REBOOT ENTRY LOADS CCP,BDOS FROM DISK & ; SETS UP VARIA9NNNNNNNNNNNNNNNN1NNNNNNNNNNNNNNNNNNNNNNLD BC,BD_SEC ;SET DIRECTORY SECTOR CALL SETSEC ; LD BC,0 ;SET TRACK TO 0 CALL SETTRK ; CALL DISKRD JR NZ,WEROR ; YQNNNNNNNNNNNNNNNNNN1\NNNNNNNNNNNNNNNNNNNNNN IF AT BEGINNING OF BDOS THEN SET UP NEW TRACK & SECTOR ; JR Z,RDBDOS ; ; ELSE IF NOT AT BIOS THEN READ NEXT SECTOR ; TNNNNNNNNNNNNNNNN1!NNNNNNNNNNNNNNNNNNNNN! LD (BDOSJV + 1),HL ; ; INIT BIOS CALL VECTOR IN PAGE 0 ; LD HL,BIOFUNC LD (BFUNRSV),A LD (BFUNRSV + 1),HL ; ; SEpNNNNNNNNNNNNNNNNN1'0NNNNNNNNNNNNNNNNNNNNNN(CUR_DDT) ; PUSH IY LD IY,(CUR_DPB) ; ; IF NOT BLOCKED THEN USE CPM READ ; LD A,(IY + DPB_PSH) ;0= 128-BYTE SECTORS $NNNNNNNNNNNNNNNN1-NNNNNNNNNNNNNNNNNNNNNNNALLOCATED BLOCK (NO NEED TO PRE-READ) ; ;**************************************************************************** ; DISBNNNNNNNNNNNNNNNN1ONNNNNNNNNNNNNNNNNNNNNN ; ;---------------------------------------------------------------------------- ; INIT: ; ; SET TEMPORARY STACK ; DI!NNNNNNNNNNNNNNNN1 lNNNNNNNNNNNNNNNNNNNNN!) (CAUSES JUMP TO ILLEGAL) ; CLKON: LD (INHCLK),A ; ; BOOT CCP & BDOS ; JR WARM ;#################################2 NNNNNNNNNNNNNNNNN12NNNNNNNNNNNNNNNNNNNNNNBLES ; ;---------------------------------------------------------- ; WARM: ; ; SET TEMPORARY STACK ; DI LD SP,DEFBF$ NNNNNNNNNNNNNNNN1*NNNNNNNNNNNNNNNNNNNNNN; CHECK FOR VALID BOOT DIRECTORY ; LD A,(DEFBFR) CP A,86H JR C,WEROR ; ; SET UP TO LOAD CCP/BDOS ; LD HL,(DEFBFRgNNNNNNNNNNNNNNNNNN1_NNNNNNNNNNNNNNNNNNNNNNLD DE,BIOS - BDOS SBC HL,DE JP C,WREAD ; ; ELSE DONE READING SYSTEM ; JR WZRPG ; ; ; ELSE SET UP & READ BDOS ; ]oNNNNNNNNNNNNNNNN1"NNNNNNNNNNNNNNNNNNNNNNT DEFAULT SECTOR BUFFER ; LD BC,DEFBFR CALL SETDMA ; IF INTCPTS ; ; PUT BDOS VECTOR INTO INTERCEPT CODE ; LD HL,NNNNNNNNNNNNNNNNN1( NNNNNNNNNNNNNNNNNNNNN! OR A,A JP Z,DISKRDN ; ; READS DON'T NEED ALLOCATION ; XOR A,A LD (UNA_CNT),A ; ; READ_OPERATION_FLAG = TRUE (1)6DNNNNNNNNNNNNNNNN1.NNNNNNNNNNNNNNNNNNNNN!KWR: ; ; REMOVE BOOT WRITE PROTECTION ; XOR A,A LD (WR_PROT),A ; ; SET PTRS TO DISK DATA ; PUSH IX LD IX,(CUR_ pNNNNNNNNNNNNNNNNNN1|NNNNNNNNNNNNNNNNNNNNNN LD SP,DEFBFR ;USE PAGE 0 FOR STACK LD (THIS_STK),SP EI ; ; INIT DEFAULT DRIVE ; LD A,(DK_BDRV) ;USE DRIVE # PASSEDPNNNNNNNNNNNNNNNNN1 _NNNNNNNNNNNNNNNNNNNNN!########################################### ; ; SIGN-ON MESSAGE ; ;#########################################################?rNNNNNNNNNNNNNNNNN1NNNNNNNNNNNNNNNNNNNNNNR LD (THIS_STK),SP EI ; ; INIT OUR STUFF ; XOR A,A LD (BUF_ACT),A ;ASSUME NO DATA IN BUFFER ; LD (UNA_CNT),A ;CLe',NNNNNNNNNNNNNNNN1NNNNNNNNNNNNNNNNNNNNN! + BD_SBDSS) ;PREFETCH BDOS TRK/SECTOR PUSH HL ; LD HL,(DEFBFR + BD_SCCPS) ;FETCH CCP TRK/SECTOR LD C,L LD B,0 CALL SX@rNNNNNNNNNNNNNNNN1nNNNNNNNNNNNNNNNNNNNNNN RDBDOS: POP HL ;RESTORE BDOS TRK/SECTOR FROM DIRECTORY LD C,L LD B,A ;A STILL CONTAINS 0 CALL SETSEC ; LD C,H CALL~NNNNNNNNNNNNNNNN1#NNNNNNNNNNNNNNNNNNNNNN(BDOS + 7) LD (BDOSV),HL ; ; NOW PUT INTERCEPT VECTOR INTO BDOS CODE ; LD HL,INTCPT LD (BDOS + 7),HL ENDIF ; ; NNNNNNNNNNNNNNNNN1)??NNNNNNNNNNNNNNNNNNNNNN ; INC A LD (READOP),A ; ; PRE-READ_OF_DATA_FLAG = TRUE ; LD (RSFLAG),A ; ; TREAT AS UNALLOCATED BLOCK ; LD ANNNNNNNNNNNNNNNNN1/NNNNNNNNNNNNNNNNNNNNNNDDT) ; PUSH IY LD IY,(CUR_DPB) ; ; IF NOT BLOCKED THEN USE CPM WRITE ; LD A,(IY + DPB_PSH) ;0= 128-BYTE SECTORS ORrNNNNNNNNNNNNNNNN1)NNNNNNNNNNNNNNNNNNNNNN IN PAGE 0 AND A,3 LD (DEFDRV),A ; ; SEND SYSTEM SIGN-ON ; LD HL,MSGSO CALL EDITOR ; ; MODIFY COLD START VECTORoKBNNNNNNNNNNNNNNNN1 ,NNNNNNNNNNNNNNNNNNNNNN################### ; MSGSO: DB CR,LF DB CPMSZ / (KBYTE * 10) + '0' DB (CPMSZ MOD (KBYTE * 10)) / KBYTE + '0' DB 'K CP/M NNNNNNNNNNNNNNNN1PNNNNNNNNNNNNNNNNNNNNN!EAR UNALLOCATED SECTOR COUNT ; LD (BUF_MOD),A ;CLEAN BUFFER ; LD HL,BLKBUF ;INIT BUFFER PTR LD (BUF_DMA),HL ; ; LOG 5$NNNNNNNNNNNNNNNNN1 NNNNNNNNNNNNNNNNNNNNN!ETSEC ; LD C,H CALL SETTRK ; LD BC,CCP CALL SETDMA ; ; READ CCP/BDOS ; WREAD: CALL DISKRD JR NZ,WEROR ;IF ERROl}NNNNNNNNNNNNNNNN1=NNNNNNNNNNNNNNNNNNNNNN SETTRK ; JR WREAD ; ; ; WARM BOOT ERROR, OUTPUT MSG & GO TO DEBUGGER ; WEROR: LD HL,MSGLE ;OUTPUT ERROR MESSAGE CALs$NNNNNNNNNNNNNNNNN1$IcNNNNNNNNNNNNNNNNNNNNN! PASS DEFAULT DISK TO CCP ; LD A,(DEFDRV) LD C,A JP CCP SUBTTL BIOS DISK FUNCTION ROUTINES ;++++++++++++++++++++++,NNNNNNNNNNNNNNNNNN1*jlNNNNNNNNNNNNNNNNNNNNNN,WRUAL LD (WRTYPE),A ; JP RWOPER ;TO PERFORM THE READ ; ; ; NORMAL NON-BLOCKED READ ; DISKRDN: CALL CPM_RD JP R'NNNNNNNNNNNNNNNNN10NNNNNNNNNNNNNNNNNNNNNN A,A JP Z,DISKWRN ; ; READ_OP_FLAG = FALSE ; XOR A,A LD (READOP),A ; ; SAVE WRITE TYPE ; LD A,C LD (WRTYPE),bHNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNŃg5Ѕk9Ӊn;Սq> ّtAݕxEᙯ}K杳O꡷S!NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN1@NNNNNNNNNNNNNNNNNNNNNNA ; ; IF 1ST WRITE TO UNALLOCATED (NEW, UNUSED) BLOCK THEN SET PARAMETERS ; CP A,WRUAL JP NZ,CHKUNA ; ; COUNT = NUMNNNNNNNNNNNNNNNNN1-NNNNNNNNNNNNNNNNNNNNNNTRK) ;SAME TRACK? LD DE,(CPM_TRK) SBC HL,DE JR NZ,ALLOC ; LD HL,(CPM_SEC) LD DE,(UNA_SEC) SBC HL,DE JR NZ,ALLOC uNNNNNNNNNNNNNNNN1 -NNNNNNNNNNNNNNNNNNNNNN (UNA_CNT),A ; INC A ;PREREAD FLAG = TRUE LD (RSFLAG),A ; ; ; ; COMMON CODE FOR READ AND WRITE FOLLOWS ; RWOPER: NNNNNNNNNNNNNNNN1QNNNNNNNNNNNNNNNNNNNNNNANY CASE ; OR A,A JR Z,FILHST ; ; HOST BUFFER ACTIVE, SAME AS SEEK BUFFER? ; LD A,(CPM_DSK) LD HL,BUF_DSK ;SAME DIANNNNNNNNNNNNNNNN1 NNNNNNNNNNNNNNNNNNNNN!ALL NZ,BUF_RD ;YES, IF 1 ; ; BUFFER = CLEAN ; XOR A,A LD (BUF_MOD),A ; MATCH: ; ; COPY DATA TO OR FROM BUFFER ;R;HNNNNNNNNNNNNNNNNN1 -> BITS <14..8> LD H,A ; LD A,0 ;BIT 0 -> BIT 7 RRA'K!NNNNNNNNNNNNNNNN1!NNNNNNNNNNNNNNNNNNNNNNOT DIRECTORY THEN DELAY WRITE CP A,WRDIR LD A,(IOPB + PB_STATO) ;RETURN ANY ERRORS ANYWAY JR NZ,RW_RET ; ; IF ERROR THHlNNNNNNNNNNNNNNNNNN1'+NNNNNNNNNNNNNNNNNNNNNNTATO)= 0: OK, /0: ERROR ; ;**************************************************************************** ; CPM_WR: ; LD HLЀNNNNNNNNNNNNNNNN1-NNNNNNNNNNNNNNNNNNNNN! POP IX RET ;**************************************************************************** ; ; CPM_RD PERFORMS THE PHY!NNNNNNNNNNNNNNNN1xNNNNNNNNNNNNNNNNNNNNNN TO SEEK ; LD HL,(CPM_SEC) LD (UNA_SEC),HL ; ; IF NO UNALLOCATED SECTORS REMAIN THEN PREREAD ; CHKUNA: LD A,(UNA_CNT)NNNNNNNNNNNNNNNNNN1 [NNNNNNNNNNNNNNNNNNNNNND HL,0 ;SECTOR = 1 LD (UNA_SEC),HL ; LD HL,(UNA_TRK) ;TRACK++ INC HL LD (UNA_TRK),HL ; NOOVF: ; ; MATCH FOUND, M NNNNNNNNNNNNNNNNN1NNNNNNNNNNNNNNNNNNNNNNECTORS JP Z,NOSECSHF ;IF ALREADY 0 THEN SECTOR SIZE IS 128 ; SECSHFLP: SRL H ;ELSE SHIFT OVER TO PHYSICAL SECTOR RR LNNNNNNNNNNNNNNNN1NNNNNNNNNNNNNNNNNNNNNNE IT OUT BEFORE READING NEW ONE ; CALL BUF_FLSH ;CLEAR HOST BUFF ; JR NZ,RW_RET ;IF ERROR THEN ABORT ; FILHST: ; ; RnNNNNNNNNNNNNNNNN1oNNNNNNNNNNNNNNNNNNNNNN LD L,A ; ; HL HAS RELATIVE HOST BUFFER ADDRESS ; LD DE,BLKBUF ADD HL,DE ;HL = HOST ADDRESS ; LD DE,(CPM_DMA) ;GEpNNNNNNNNNNNNNNNN1"NNNNNNNNNNNNNNNNNNNNNNEN ABORT ; OR A,A JR NZ,RW_RET ; ; NO ERROR/DIRECTORY WRITE ; XOR A,A ;BUFFER = CLEAN LD (BUF_MOD),A ; CALL B9[NNNNNNNNNNNNNNNNN1(;>NNNNNNNNNNNNNNNNNNNNNN,LL_WRIT JP CPM_RW ;**************************************************************************** ; ; CPM_RD2 PERFORMS T!NNNNNNNNNNNNNNNN1.NNNNNNNNNNNNNNNNNNNNN!SICAL READ FROM THE DISK INTO CPM_DMA. ; ENTRY- (CPM_DSK)= DISK # TO READ FROM ; (CPM_TRK)= TRACK # TO READ FROM ; (CPM_SECr#NNNNNNNNNNNNNNNNN1KNNNNNNNNNNNNNNNNNNNNNN OR A,A JP Z,ALLOC ; ; ELSE MORE UNALLOCATED RECORDS REMAIN, COUNT-- ; DEC A LD (UNA_CNT),A ; ; IF REQUESTED SEgNNNNNNNNNNNNNNNNN1 hNNNNNNNNNNNNNNNNNNNNNNARK AS UNNECESSARY READ ; XOR A,A ;PREREAD FLAG = FALSE LD (RSFLAG),A JP RWOPER ; ; ; NORMAL NON-BLOCKED WRITE ;  NNNNNNNNNNNNNNNNN13NNNNNNNNNNNNNNNNNNNNNN DEC A JP NZ,SECSHFLP ; NOSECSHF: INC HL ;SET BACK TO PHYSICAL SECTOR LD (BUF_PSEC),HL ;BUFFER PHYSICAL SECTOR TO ACC9NNNNNNNNNNNNNNNN1.NNNNNNNNNNNNNNNNNNNNNNEAD THE SECTOR BUFFER ; LD A,(CPM_DSK) ;BUFFER SECTOR = PHYSICAL SECTOR LD (BUF_DSK),A ; LD HL,(CPM_TRK) LD (BUF_TRK),ƮNNNNNNNNNNNNNNNN1^NNNNNNNNNNNNNNNNNNNNNNT/PUT CP/M DATA LD BC,128 ;LENGTH OF MOVE ; LD A,(READOP) ;WHICH WAY? OR A,A JP NZ,RWMOVE ;SKIP IF READ ; ; WRITE tVNNNNNNNNNNNNNNNN1#NNNNNNNNNNNNNNNNNNNNNNUF_WR ;WRITE TO DISK ; LD A,(IOPB + PB_STATO) ;RETURN ANY ERRORS ; ; DONE, RESTORE & RETURN ; RW_RET: OR A,A ;SET RES'NNNNNNNNNNNNNNNNNN1)NNNNNNNNNNNNNNNNNNNNNNHE PHYSICAL READ FROM THE DISK INTO CPM_DMA, ; WITHOUT BLOCKING. ; ENTRY- (CPM_DSK)= DISK # TO READ FROM ; (CPM_TRK)= TRACK >NNNNNNNNNNNNNNNNN1/NNNNNNNNNNNNNNNNNNNNNN)= SECTOR # TO READ FROM ; (CPM_DMA)= XFER ADDRESS ; IX= DDT PTR ; IY= DPB PTR ; EXIT - (IOPB.PB_STATO)= 0: OK, /0: ERRORD NNNNNNNNNNNNNNNN1NNNNNNNNNNNNNNNNNNNNN!CTOR != UNALLOCATED SECTOR THEN PURGE ; LD A,(CPM_DSK) ;SAME DISK? LD HL,UNA_DSK CP A,(HL) JR NZ,ALLOC ; LD HL,(UNA_dNNNNNNNNNNNNNNNN1 NNNNNNNNNNNNNNNNNNNNNNDISKWRN: CALL CPM_WR JP RW_RET ; ; ; NOT AN UNALLOCATED RECORD, REQUIRES PRE-READ ; ALLOC: XOR A,A ;COUNT = 0 LD 9NNNNNNNNNNNNNNNN1`NNNNNNNNNNNNNNNNNNNNNNESS ; ; IF BUFFER == EMPTY THEN READ THE PHYSICAL SECTOR ; LD HL,BUF_ACT LD A,(HL) ; LD (HL),1 ;BUFFER = ACTIVE IN 2$NNNNNNNNNNNNNNNNN1>NNNNNNNNNNNNNNNNNNNNNNHL ; LD HL,(BUF_PSEC) LD (BUF_SEC),HL ; ; IF REQUIRED TO READ THEN READ ; LD A,(RSFLAG) ;NEED TO READ? OR A,A C/NNNNNNNNNNNNNNNN1 NNNNNNNNNNNNNNNNNNNNN!OPERATION, MARK AND SWITCH DIRECTION ; LD A,1 ;BUFFER = DIRTY LD (BUF_MOD),A ; ; SAVE BUFFER DATA PTRS FOR LATER FLUSH`HNNNNNNNNNNNNNNNNN1$~SNNNNNNNNNNNNNNNNNNNNNNULT STATUS FLAG POP IY POP IX ; RET ;**************************************************************************** ;BNNNNNNNNNNNNNNNN1*]\NNNNNNNNNNNNNNNNNNNNNN# TO READ FROM ; (CPM_SEC)= SECTOR # TO READ FROM ; (CPM_DMA)= XFER ADDRESS ; EXIT - (IOPB.PB_STATO)= 0: OK, /0: ERROR ; NNNNNNNNNNNNNNNNN10NNNNNNNNNNNNNNNNNNNNNN ; ;**************************************************************************** ; CPM_RD: ; LD HL,LL_READ ; ; COMMONG$NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNЁl9ԅo= ؉sA܍yG⑰~K敳N陷S!Y'\*ŦNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN2+NNNNNNNNNNNNNNNNNNNNNN CODE ; CPM_RW: PUSH HL LD HL,CPM_TRK ; ; FALL INTO COMMON XFER CODE ; ;******************************************<NNNNNNNNNNNNNNNNN2 NNNNNNNNNNNNNNNNNNNNNN TO ; (BUF_DDT)= DDT PTR ; (BUF_DPB)= DPB PTR ; EXIT - (IOPB.PB_STATO)= 0: OK, /0: ERROR ; ;*****************************NNNNNNNNNNNNNNNN2 nNNNNNNNNNNNNNNNNNNNNNNK # TO WRITE TO ; (BUF_SEC)= SECTOR # TO WRITE TO ; IX= DDT PTR ; IY= DPB PTR ; EXIT - (IOPB.PB_STATO)= 0: OK, /0: ERROR >mNNNNNNNNNNNNNNNN2NNNNNNNNNNNNNNNNNNNNNN!JP RD_WR ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; SELECT DRIVE FUNCTION ; LOG-ONNNNNNNNNNNNNNNN2vNNNNNNNNNNNNNNNNNNNNN! ;DRV INC HL ;DPB_PTR LD E,(HL) INC HL LD D,(HL) LD (CUR_DPB),DE ; ; FETCH DISK PARAMETER HEADER ADDRESS ; IN*NNNNNNNNNNNNNNNNN2 NNNNNNNNNNNNNNNNNNNNNNST2O) CP A,-1 ;-1:NONE, 0:JADE, 1:DESCRIPTOR, 2: EXTENDED, ; 3: PARTITIONED, ID JR Z,LGDEF ; ; ELSE IF OLD FORMAThNNNNNNNNNNNNNNNN2%NNNNNNNNNNNNNNNNNNNNNNS),A ; ; RETURN DRIVE TABLE PTR ; LD HL,(CUR_DPH) XOR A,A ;RETURN NO-ERROR JR LGDONE ; ; ; IF NOT HARD DISK THE9NNNNNNNNNNNNNNNN2+NNNNNNNNNNNNNNNNNNNNNN******************************************* ; HOME: ; ; IF PENDING WRITE (BUFFER DIRTY) THEN IGNORE ; LD A,(BUF_MOD) 7BNNNNNNNNNNNNNNNN2~NNNNNNNNNNNNNNNNNNNNNN********************************** ; ; SET UP IOPB FOR EXECUTION ; ENTRY- HL= PTR TO IOPB IMAGE TRACK DATA ; IX= DDT PTR ;NNNNNNNNNNNNNNNNN24NNNNNNNNNNNNNNNNNNNNNN*********************************************** ; BUF_FLSH: ; ; IF UNMODIFIED THEN RETURN ; LD A,(BUF_MOD) OR A,A RENNNNNNNNNNNNNNNN2;NNNNNNNNNNNNNNNNNNNNN! ; ;**************************************************************************** ; BUF_WR: ; LD HL,LL_WRIT JP BUF_RW dNNNNNNNNNNNNNNNN2*NNNNNNNNNNNNNNNNNNNNNNN - SET DISK PARAMETER BLOCK ; ENTRY- C= DRIVE # ; E= 0 IF NEW SELECT ; EXIT - HL= PTR TO DPT OR 0 FOR ERROR ; ;++++++++++5 NNNNNNNNNNNNNNNN2%NNNNNNNNNNNNNNNNNNNNNNC HL ;DPH PTR LD E,(HL) INC HL LD D,(HL) LD (CUR_DPH),DE EX DE,HL ;PUT DPH PTR IN HL FOR RETURN ; ; IF NOT FIRST:NNNNNNNNNNNNNNNNN2 {NNNNNNNNNNNNNNNNNNNNN!S THEN PAD DPB DATA ; CP A,3 JR NC,IDOK ; LD HL,BLKBUF + ID_PSHO ;FILL DATA WITH 0S LD B,ID_FLGO - ID_PSHO ; PADIDL:NNNNNNNNNNNNNNNNN2&NNNNNNNNNNNNNNNNNNNNNNN GO DO FLOPPY TEST ; LGDEF: BIT 4,(IX + DDT_FLG) JR Z,LGCKFD ; ; ELSE USE HARD DISK DEFAULTS ; CALL TRNONE ; NO XL\BNNNNNNNNNNNNNNNN2,[NNNNNNNNNNNNNNNNNNNNN!OR A,A JR NZ,HOME2 ; ; ELSE PURGE BUFFER ; LD (BUF_ACT),A ; HOME2: ; ; JUST SET TRACK TO 0 ; LD BC,0 ; ; F&NNNNNNNNNNNNNNNN2MNNNNNNNNNNNNNNNNNNNNN! IY= DPB PTR ; (SP)= ADDRESS {LL_READ, LLWRIT} OF EXECUTOR ; ;************************************************************* NNNNNNNNNNNNNNNNNN2 NNNNNNNNNNNNNNNNNNNNNNET Z ; ; ELSE SET PTRS TO BUFFER DATA ; PUSH IX PUSH IY LD IX,(BUF_DDT) LD IY,(BUF_DPB) ; ; WRITE THE BUFFER DA*NNNNNNNNNNNNNNNNN2NNNNNNNNNNNNNNNNNNNNN! ;**************************************************************************** ; ; RDBUF PERFORMS THE PHYSICAL READ FROM THE OF9NNNNNNNNNNNNNNNN2NNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; SELDSK: ; ; STORE DRIVE # FOR FUTURE USE ; LD A,C NNNNNNNNNNNNNNNNN2NNNNNNNNNNNNNNNNNNNNN! SELECT OR LOGON INHIBITED THEN RETURN TABLE PTR ; LD A,(LOGRQ) ;0: LOGON, 1:INHIBIT OR A,C ;0: NORMAL, 1: INHIBIT CPL 0P!NNNNNNNNNNNNNNNN2!-JNNNNNNNNNNNNNNNNNNNNN! LD (HL),0 INC HL DJNZ PADIDL ; ; ELSE XFER ID SECTOR DATA TO TABLES ; IDOK: CALL TRNONE ;ASSUME NO TRANSLATION ; ;NNNNNNNNNNNNNNNNN2'NNNNNNNNNNNNNNNNNNNNNNATE LD HL,HDPBK ; ; XFER DATA TO TABLES ; SEL2: LD DE,(CUR_DPB) ; USE DEFAULT TABLE LD BC,DPB_SZ LDIR ; LD A,(HLtHNNNNNNNNNNNNNNNN2-h'NNNNNNNNNNNNNNNNNNNNNNALL INTO SET TRACK ; ;**************************************************************************** ; ; SET TRACK # ; EN-~NNNNNNNNNNNNNNNN2YNNNNNNNNNNNNNNNNNNNNNN*************** ; RD_WR: LD DE,IOPB + PB_TRKO LD BC,PB_BCNTO - PB_TRKO LDIR ; ; EXECUTE LOW LEVEL READ OR WRITE (ON ST9NNNNNNNNNNNNNNNN2 VNNNNNNNNNNNNNNNNNNNNNNTA ; CALL BUF_WR ; ; RESTORE THE PTRS ; POP IY POP IX ; ; IF ERROR THEN RETURN IT ; OR A,A RET NZ ; ; EO NNNNNNNNNNNNNNNNN2NNNNNNNNNNNNNNNNNNNNNNHOST DISK INTO BLKBUF. ; ENTRY- (BUF_DSK)= DISK # TO READ FROM ; (BUF_TRK)= TRACK # TO READ FROM ; (BUF_SEC)= SECTOR # TO R6l NNNNNNNNNNNNNNNN2HNNNNNNNNNNNNNNNNNNNNNN LD (CPM_DSK),A ; ; SAVE LOGON REQUEST FLAG ; LD A,E LD (LOGRQ),A ; ; COMPUTE DISK DRIVER TABLE PTR ; CALL RETD7:NNNNNNNNNNNNNNNNN2^NNNNNNNNNNNNNNNNNNNNNN AND A,1 RET Z ; ; ELSE LOG ON DRIVE ; PUSH IX ;SAVE REGS PUSH IY ; LD IX,(CUR_DDT) ;SET REGS LD IY,(CUR_DPB) bQNNNNNNNNNNNNNNNN2"xNNNNNNNNNNNNNNNNNNNNNN IF HARD DISK OR DOUBLE DENSITY THEN NO TRANSLATION ; LD A,(BLKBUF + ID_FLGO) AND A,[1 SHL DF_DTDB] OR [1 SHL DF_HARDB]  NNNNNNNNNNNNNNNNN2(NNNNNNNNNNNNNNNNNNNNNN) ;HEADS VALUE JR SEL1 ; ; ; USE 8" FLOPPY DEFAULTS ; LGCKFD: CALL TR8 LD HL,SD8PBK JR SEL2 ; ; ERROR EXIT ; ENNNNNNNNNNNNNNNN2.=tNNNNNNNNNNNNNNNNNNNNNNTRY- BC= TRACK # ; ;**************************************************************************** ; SETTRK: LD (CPM_TRK),BCNNNNNNNNNNNNNNNNN2hNNNNNNNNNNNNNNNNNNNNNNACK) ; RET ;**************************************************************************** ; ; BUF_FLSH FLUSHES THE BUFFbNNNNNNNNNNNNNNNNN2 gNNNNNNNNNNNNNNNNNNNNNNLSE CLEAN BUFFER ; LD (BUF_MOD),A RET ;**************************************************************************** ;-NNNNNNNNNNNNNNNNN2(NNNNNNNNNNNNNNNNNNNNNNEAD FROM ; IX= DDT PTR ; IY= DPB PTR ; EXIT - (IOPB.PB_STATO)= 0: OK, /0: ERROR ; ;**************************************ɔNNNNNNNNNNNNNNNNN2yNNNNNNNNNNNNNNNNNNNNNNVRT ;DRIVE IS STILL IN C REGISTER ; ; IF DRIVE ERROR THEN RETURN (HL= 0) ; RET NZ ; ; ELSE SAVE PTR ; LD (CUR_DDT NNNNNNNNNNNNNNNN2mNNNNNNNNNNNNNNNNNNNNN!; ; ATTEMPT TO READ ID SECTOR ; CALL BUF_FLSH ;FLUSH BUFFER 1ST JR NZ,LOGERR ; CALL DISKLOG JR NZ,LOGERR ; ; IF_PrNNNNNNNNNNNNNNNN2#K(NNNNNNNNNNNNNNNNNNNNNN; ; ELSE SET TRANSLATION ; CALL Z,TR8 ; ; XFER DISK DATA TO DPB ; LD DE,(CUR_DPB) ;GET ADDR OF DPB LD HL,BLKBUF ;"HNNNNNNNNNNNNNNNNN2)NNNNNNNNNNNNNNNNNNNNNN LOGERR: LD HL,0 ; ; DONE ; LGDONE: POP IY ;RESTORE REGS POP IX RET ;********************************************} NNNNNNNNNNNNNNNNN2/ENNNNNNNNNNNNNNNNNNNNNN RET ;**************************************************************************** ; ; SET SECTOR ; ENTRY- BC= SECTOR CNNNNNNNNNNNNNNNN2;NNNNNNNNNNNNNNNNNNNNN!ER DATA IF MODIFIED ; ENTRY- (BUF_DSK)= DISK # TO WRITE TO ; (BUF_TRK)= TRACK # TO WRITE TO ; (BUF_PSEC)= SECTOR # TO WRITE4BNNNNNNNNNNNNNNNN2 ]NNNNNNNNNNNNNNNNNNNNNN ; BUF_WR PERFORMS THE PHYSICAL WRITE FROM BLKBUF TO THE HOST DISK. ; ENTRY- (BUF_DSK)= DISK # TO WRITE TO ; (BUF_TRK)= TRAC} NNNNNNNNNNNNNNNN2}NNNNNNNNNNNNNNNNNNNNN!************************************** ; BUF_RD: ; LD HL,LL_READ ; ; COMMON CODE ; BUF_RW: PUSH HL LD HL,BUF_TRK 6lNNNNNNNNNNNNNNNNN2GNNNNNNNNNNNNNNNNNNNNNN),HL ; ; FETCH FLAGS ; INC HL ;EXE +1 INC HL ;FLGS LD C,(HL) ; ; FETCH DISK PARAMETER BLOCK ADDRESS ; INC HLYBrNNNNNNNNNNNNNNNN28NNNNNNNNNNNNNNNNNNNNNN NO ID SECTOR THEN USE DEFAULT DPB ; (NOTE: CONTROLLER HAS SET IT'S DISK DEFAULTS IN DEFBFR IN ALL CASES) ; LD A,(IOPB + PB_NNNNNNNNNNNNNNNNN2$ҿNNNNNNNNNNNNNNNNNNNNN!+ ID_SPTO LD BC,DPB_SZ LDIR ; ; XFER DISK PHYSICAL DATA TO TABLE ; LD A,(BLKBUF + ID_HEADS) ; SEL1: LD (IX + DDT_HD!NNNNNNNNNNNNNNNN2*NNNNNNNNNNNNNNNNNNNNNN******************************** ; ; HOME DRIVE - TREAT AS SEEK TRK 0 ; EXIT - BC= 0 ; ;*********************************=#'NNNNNNNNNNNNNNNNN20NNNNNNNNNNNNNNNNNNNNNN# ; ;**************************************************************************** ; SETSEC: LD (CPM_SEC),BC RET ;**6NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN8NNNŃf3΅h6Љk9ԍp= ؑtAܕxE}K坲O꡸S!NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN2NNNNNNNNNNNNNNNNNNNNNN************************************************************************** ; ; SET TRANSFER ADDR ; ENTRY- BC= ADDRESS ; EXITbNNNNNNNNNNNNNNNNN2:NNNNNNNNNNNNNNNNNNNNN!LE ADDR = 0 THEN NO TRANSLATION OR A,E JP Z,NOTRAN ; ; ELSE CALCULATE NEW SECTOR FROM TABLE ; EX DE,HL ADD HL,BC o NNNNNNNNNNNNNNNN2 YNNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++ ; ; LOW LEVEL READ ; ENTRY- IX= DDT PTR ; IY= DPB PTR ; EXIT - IOPB.PB_STATO, A= STkNNNNNNNNNNNNNNNN2yNNNNNNNNNNNNNNNNNNNNNN ; ; INHIBIT UPLOAD ; LD A,1 SHL PB_INHX LD (IOPB + PB_FLGO),A ; ; CALCULATE DOWNLOAD BYTE COUNT ; LD A,(IY + DPuNNNNNNNNNNNNNNNN2FNNNNNNNNNNNNNNNNNNNNNNA ; ; OFFSET SECTOR ; LD HL,(IOPB + PB_SECO) LD A,L ADD A,(IX + DDT_SOF) LD L,A LD A,H ADC A,(IX + DDT_SOF + 1)!NNNNNNNNNNNNNNNNN2NNNNNNNNNNNNNNNNN2wNNNNNNNNNNNNNNNNNNNNNN; IY= DPB PTR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; LL_RW: LD (IOPB + PB_CMDO),pNNNNNNNNNNNNNNNN2NNNNNNNNNNNNNNNNNNNNN!,A ; LD HL,IOPB LD A,MF_DIOB ;USE DISPLAY IOPB DATA FUNCTION CALL XMROM ; ; QUERY USER FOR OPTION ; LD HL,DSKEB HNNNNNNNNNNNNNNNNN2$NNNNNNNNNNNNNNNNNNNNNNSPLAY WRITE PROTECT ERROR MESSAGE ; DO_ERR: LD HL,WP_ERM CALL EDITOR JR IOPBDMP ;************************************7!NNNNNNNNNNNNNNNN2*ƀNNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++++++ ; ; EXECUTE THE IOPB PRIMITIVE ; EXIT - A= 0: OK, /0: ERROR ; ;++++++++++++++LHNNNNNNNNNNNNNNNNN20*8NNNNNNNNNNNNNNNNNNNNN!DRIVER ROUTINES ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; JADE 8" FLOPPY DISK DRIVER $NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNLNNNNNNNNсl9ԅp? ىtBݍzH㑲M蕵Q홻W$򝿞[(¢]+ǦnNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN3]NNNNNNNNNNNNNNNNNNNNNNFUNCTION ; ENTRY- IY= DRIVER TABLE PTR ; EXIT - A= 0: OK; /0: ERROR ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++@HNNNNNNNNNNNNNNNNN3NNNNNNNNNNNNNNNNNNNNNN SUBTTL BIOS FUNCTION CALLS ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; FUNCTION DISP*:NNNNNNNNNNNNNNNN3 uNNNNNNNNNNNNNNNNNNNNNN################################# ; ; BIOS FUNCTION TABLE ; ;###############################################################xNNNNNNNNNNNNNNNN38 NNNNNNNNNNNNNNNNNNNNN! TABLE BASE PTR ; NZ= ILLEGAL DRIVE REQUESTED (HL=0) ; A, B, C= ? ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++<9NNNNNNNNNNNNNNNN3NNNNNNNNNNNNNNNNNNNNNN LD HL,0 OR A,A ;SET NZ RET ; ; ; ELSE COMPUTE TABLE PTR ; RETDV2: LD B,C LD DE,DDT_SIZ ; RETDVL: ADD HL,DE DJNNNNNNNNNNNNNNNNN3}dNNNNNNNNNNNNNNNNNNNNNN FUNCTIONS TO SUPPORT CDOS PROGRAMS ;*************************************************************************** ; ; SYSTEM CNNNNNNNNNNNNNNNN3%:NNNNNNNNNNNNNNNNNNNNNN,8DH ;IF RETURN VERSION THEN RETURN IT JR Z,RETCVER ; CP A,90H ;IF NOT CLOCK THEN ERR JR C,ILLEGC ; JR Z,CLKCAL ;IF NNNNNNNNNNNNNNNNN3+5NNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++ ; RETCVER: LD B,1 RET SUBTTL CLOCK ROUTINES ;+++++++++++++++++++++++++++++++++++++++++++++++++++++NNNNNNNNNNNNNNNN3KNNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++ ; FD8EXEC: ; ; IF HEADS == 1 THEN EXECUTE IOPB ; LD A,(IX + DDT_HDS) DEC A JP Z,XPRIM ; ;jNNNNNNNNNNNNNNNNN3NNNNNNNNNNNNNNNNNNNNNNATCHER ; ENTRY- C= FUNCTION # ; EXIT - A= -1: ERROR, 0: OK ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++gNNNNNNNNNNNNNNNN3M&NNNNNNNNNNNNNNNNNNNNNN############# ; BFUNTBL: DW RETVERS ;0:RETURN VERSION # DW RETDVRTF ;1:RETURN DISK PHYSICAL CONFIGURATION TABLE PTR MAXFRKNNNNNNNNNNNNNNNN3NNNNNNNNNNNNNNNNNNNNN!+++++++++++++++++++++++ ; RETDVRTF: ; ; ADJUST REGISTER ; LD C,E ; ; FALL INTO LOCAL ENTRY ; ;+++++++++++++++~& NNNNNNNNNNNNNNNN3NNNNNNNNNNNNNNNNNNNNNNNZ RETDVL ; LD A,(BUF_DMAB) LD E,A ; ; RETURN NO ERROR ; XOR A,A RET ;+++++++++++++++++++++++++++++++++++++++6NNNNNNNNNNNNNNNNN3 hNNNNNNNNNNNNNNNNNNNNNNALL INTERCEPT ROUTINE CHECKS FOR ILLEGAL BDOS CALLS & ; PRINTS MESSAGE IF ILLEGAL. ALSO IMPLEMENTS CDOS CLOCK/CALENDAR ; SYSNNNNNNNNNNNNNNNNNN3&iNNNNNNNNNNNNNNNNNNNNNNCALENDAR THEN GET IT ; CP A,92H JR Z,CLKTIM ;IF TIME THEN GET IT ; ; ILLEGAL SYSTEM CALL ; ILLEGC: PUSH BC ;SAVE FUNC8NNNNNNNNNNNNNNNN3,-NNNNNNNNNNNNNNNNNNNNN!+++++++++++++++++++++++ ; ; RETURN CALENDAR FUNCTION 90H ; EXIT - A= DAY ; B= MONTH ; C= YEAR ; L= DAY OF WEEK ; ;+++dNNNNNNNNNNNNNNNN3;zNNNNNNNNNNNNNNNNNNNNNN ELSE SELECT SIDE FROM TRACK BIT 0 ; LD HL,(IOPB + PB_TRKO) PUSH HL ;SAVE ORIGINAL DATA ; LD A,(IOPB + PB_SECO + 1) |NNNNNNNNNNNNNNNNNN3 ԱNNNNNNNNNNNNNNNNNNNNNN++++++++++++++ ; BIOFUNC: ; ; IF FUNCTION # NOT IN TABLE THEN RETURN -1 ; LD A,C CP A,MAXFUNCS LD A,-1 RET NC ; NNNNNNNNNNNNNNNNN3~NNNNNNNNNNNNNNNNNNNNNNUNCS EQU ($ - BFUNTBL) / 2 ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN BIOS BNNNNNNNNNNNNNNNN3NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN DRIVER TABLE PTR FUNCTION ; ENTRY- C= DRIVE # ; EXINNNNNNNNNNNNNNNNN3NNNNNNNNNNNNNNNNNNNNN!+++++++++++++++++++++++++++++++++++++ ; ; GET BANK NUMBER FUNCTION ; EXIT - A= BANK # ; ;++++++++++++++++++++++++++++++++++NNNNNNNNNNNNNNNN3![NNNNNNNNNNNNNNNNNNNNNNTEM CALLS FOR ASMB. ; ;*************************************************************************** INTCPT: LD A,C ;CHECK CALNNNNNNNNNNNNNNNNN3'XNNNNNNNNNNNNNNNNNNNNN!TION # ; ; OUTPUT WARNING MESSAGE ; LD HL,ISCMSG ;OUTPUT WARNING CALL EDITOR ; ; OUTPUT FUNCTION # ; POP BC LDr$NNNNNNNNNNNNNNNN3-NNNNNNNNNNNNNNNNNNNNN!+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; CLKCAL: LD A,MF_GCAL JP XMROM ;++++++++++HHNNNNNNNNNNNNNNNN3NNNNNNNNNNNNNNNNNNNNNN ADD A,A ;BIT 15 -> BIT_BUCKET ; SRL H RR L RRA ;TRK BIT 0 -> SECTOR BIT 15 LD (IOPB + PB_SECO + 1),A ; LD (IOBNNNNNNNNNNNNNNNN3 NNNNNNNNNNNNNNNNNNNNNN ; ELSE COMPUTE TABLE ENTRY ; PUSH HL ;SAVE POSSIBLE DATA ; LD HL,BFUNTBL LD A,C ADD A,A ADD A,L LD L,A LD A,! NNNNNNNNNNNNNNNNN3mZNNNNNNNNNNNNNNNNNNNNN!VERSION # FUNCTION #0 ; EXIT - HL= VERSION # IN BINARY {0.00,..655.35} ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++ NNNNNNNNNNNNNNNN3NNNNNNNNNNNNNNNNNNNNNNT - E:HL= DRIVER TABLE BASE PTR ; NZ= ILLEGAL DRIVE (HL= 0) ; A, B, C= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++NNNNNNNNNNNNNNNNN3(7NNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++++ ; GETBNK: LD A,MF_GBNK JP MR_FUN SUBTTL NON-DISK PROCEDURES ;**********iNNNNNNNNNNNNNNNN3"NNNNNNNNNNNNNNNNNNNNN!L VALIDITY CP A,41 ;IF <= 40 THEN OK ; BDOSV EQU $ + 1 JP C,BDOS + 11H ;THIS ADDR MODIFIED BY WARM BOOT RTN ; ; THE FOu NNNNNNNNNNNNNNNNN3(fNNNNNNNNNNNNNNNNNNNNNN A,MF_PHXB CALL XMROM ; ; OUTPUT NEW LINE ; CALL CRLF ; ; RETURN NULLS ; XOR A,A ;BC = HL = A = 0 LD L,A LD]9NNNNNNNNNNNNNNNN3.KNNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN TIME FUNCTION 92H ; EXIT - A= SECONDS ; B= MIyNNNNNNNNNNNNNNNNNN3NNNNNNNNNNNNNNNNNNNNN!PB + PB_TRKO),HL ;TRACK = RESIDUAL ; ; EXECUTE THE IOPB ; CALL XPRIM ; ; RESTORE THE MODIFIED IOPB SO RETRY WILL WORKn NNNNNNNNNNNNNNNNN3 NNNNNNNNNNNNNNNNNNNNNN0 ADC A,H LD H,A ; ; EXECUTE TABLE ADDRESS ; LD A,(HL) INC HL LD H,(HL) LD L,A ; EX (SP),HL ;PUT CALLER'S DmNNNNNNNNNNNNNNNNN3^kNNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++ ; RETVERS: LD HL,VERSN XOR A,A ;RETURN NO ERROR RET ;++++++++++++++++++++++++++++++++++NNNNNNNNNNNNNNNN3NNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++ ; RETDVRT: ; ; ASSUME DRIVE 0 ; LD HL,DDT_0 ;START AT 1ST TABLE ; ; IF DRIVE == 0 THϯNNNNNNNNNNNNNNNN3NNNNNNNNNNNNNNNNNNNNNN***************************************************************** ; ; NEWLINE PROCEDURE ; ;*********************************79NNNNNNNNNNNNNNNN3#=NNNNNNNNNNNNNNNNNNNNNNLLOWING CONDITIONAL JUMP IS MODIFIED TO AN UNCONDITIONAL JUMP BY ; THE WARM BOOT ROUTINE IF THE CLOCK/CALENDAR BOARD IS NOT PRP%INNNNNNNNNNNNNNNNN3)WNNNNNNNNNNNNNNNNNNNNNN H,A LD C,A LD B,A RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; CDOS RETUR NNNNNNNNNNNNNNNNN3/xNNNNNNNNNNNNNNNNNNNNNNNUTES ; C= HOURS ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; CLKTIM: LD A,MF_GTIM NNNNNNNNNNNNNNNN3ďNNNNNNNNNNNNNNNNNNNNN! ; POP HL ;TRACK LD (IOPB + PB_TRKO),HL ; LD HL,IOPB + PB_SECO +1 ;CLEAR BIT 15 RES 7,(HL) ; ; DONE ; RET ONNNNNNNNNNNNNNNN3 +DNNNNNNNNNNNNNNNNNNNNNNATA IN HL, FUNCTION ADDR ON RET ; STACK, EXECUTE FUNCTION ADDRESS ON STACK ;########################################### NNNNNNNNNNNNNNNN3 8NNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN DRIVER TABLE PTR FUNCTION #1 ; ENTRY- E= DRIVE # ; EXIT - E:HL= DRIVER(u$NNNNNNNNNNNNNNNNN3NNNNNNNNNNNNNNNNNNNNNNEN ALREADY THERE ; LD A,C OR A,A RET Z ; ; ELSE IF ILLEGAL DRIVE THEN RETURN ERROR ; CP A,NDRVS JR C,RETDV2 ; }NNNNNNNNNNNNNNNN3NUNNNNNNNNNNNNNNNNNNNNNN****************************************** ; CRLF: LD C,CR CALL COC LD C,LF JP COC IF INTCPTS SUBTTL ADDITIONALHjHNNNNNNNNNNNNNNNNN3$ NNNNNNNNNNNNNNNNNNNNNNESENT ; IF NOT MODIFIED, THEN IT IS ALLWAYS FALSE (NOP). ; INHCLK: JR C,ILLEGC ; ; NOW CHECK FOR EXTENDED CALLS ; CP AC!NNNNNNNNNNNNNNNN3*NNNNNNNNNNNNNNNNNNNNNNN VERSION FUNCTION ; MAKES CLOCK/CALENDAR WORK. ; EXIT - B= 1 ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ NNNNNNNNNNNNNNNNN30kNNNNNNNNNNNNNNNNNNNNN! JP XMROM ENDIF ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; MONITOR ROM EXECUTHNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNŃh6хk9Չp> ؍sAܑxE|J噳P띸T!W%NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN3j(NNNNNNNNNNNNNNNNNNNNNNER ; ENTRY- A= FUNCTION # ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; XMROM: EQU MR_FNNNNNNNNNNNNNNNNN3NNNNNNNNNNNNNNNNNNNNNNOUTPUT ; ENTRY- C= CHAR TO OUTPUT ; ;**************************************************************************** ; COC: NNNNNNNNNNNNNNNN3 /ENNNNNNNNNNNNNNNNNNNNNNRY- C= CHAR TO OUTPUT ; ;**************************************************************************** ; LO: LD A,MF_LO J=NNNNNNNNNNNNNNNN39NNNNNNNNNNNNNNNNNNNNNN##################################################### ; ; 3740 SECTOR TRANSLATION TABLE ; **** CP/M SINGLE DENSITY **** ; ;w- NNNNNNNNNNNNNNNN3NNNNNNNNNNNNNNNNNNNNNN. ; 0 1: INHIBIT LOGON ; 1..3 PARTITION # {0,..7} ; 4 1: HARD DISK DRIVE ; DDT_DRV DS 1 ;PHYSICAL DRIVE # DDT%aNNNNNNNNNNNNNNNNN3JTNNNNNNNNNNNNNNNNNNNNNN@@@@@ ; ALLDRV MACRO #DADD,#PD,#FLG,#DPB,#DPH,#HDS,#SOF DW #DADD ;DRIVER EXECUTION ADDR DB #FLG ;FLAGS DB #PD ;MONITO$NNNNNNNNNNNNNNNN3% NNNNNNNNNNNNNNNNNNNNN!,D2DPB,D2DPH,4,0 ; D DDT_3: ALLDRV HDEXEC,4,12H,D3DPB,D3DPH,4,8000H ; E DDT_4: ALLDRV HDEXEC,7,10H,D4DPB,D4DPH,4,0 ; `9NNNNNNNNNNNNNNNN3+NNNNNNNNNNNNNNNNNNNNNN################################### ; SD8PBK: DW 26 ;SECTORS PER TRACK DB 3 ;BLOCK SHIFT FACTOR DB 7 ;BLOCK MASK DB 0!NNNNNNNNNNNNNNNN3?{NNNNNNNNNNNNNNNNNNNNNNUN SUBTTL CHAR I/O ROUTINES ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; CONSOLE IJ_NNNNNNNNNNNNNNNNN3аNNNNNNNNNNNNNNNNNNNNNNLD A,MF_CO JP XMROM ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; READER DRIVER - D-INNNNNNNNNNNNNNNN3zNNNNNNNNNNNNNNNNNNNNNNP XMROM ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN LIST DEVICE STATUS ; EX'NNNNNNNNNNNNNNNN3NNNNNNNNNNNNNNNNNNNNNN############################################################################ ; SDTRAN: GXLATE 26,6 ;#####################\NNNNNNNNNNNNNNNN3NNNNNNNNNNNNNNNNNNNNNN_DPB DS 2 ;DPB ADDRESS FOR THIS DRIVE DDT_DPH DS 2 ;DPH ADDRESS FOR THIS DRIVE ; ; THE FOLLOWING MAY BE BROUGHT OFF DISK DE9 NNNNNNNNNNNNNNNNN3 _NNNNNNNNNNNNNNNNNNNNNNR PHYSICAL DRIVE # DW #DPB ;DISK PARAMETER BLOCK PTR DW #DPH ;DISK PARAMETER HEADER PTR DB #HDS ;HEADS DW #SOF ;SECT-NNNNNNNNNNNNNNNNN3&YNNNNNNNNNNNNNNNNNNNNNNF DDT_5: ALLDRV HDEXEC,7,12H,D5DPB,D5DPH,4,8000H ENDIF ;##############################################################9NNNNNNNNNNNNNNNN3,NNNNNNNNNNNNNNNNNNNNNN ;NULL MASK DW 242 ;DISK SIZE -1 DW 63 ;DIRECTORY MAX DB 11000000B ;ALLOC 0 DB 0 ;ALLOC 1 DW 16 ;CHECK SIZE DW rNNNNNNNNNNNNNNNN3 JNNNNNNNNNNNNNNNNNNNNNNNPUT ; EXIT - A= CHAR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; CI: LD A,MF_CI ,NNNNNNNNNNNNNNNN3 NNNNNNNNNNNNNNNNNNNNN!UMMY ; EXIT - A= CTRL-Z ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; READER: LD A,CTRLi<'NNNNNNNNNNNNNNNNN3I'NNNNNNNNNNNNNNNNNNNNNNIT - A= 0: BUSY, FFH:READY ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; LISTST: LD A,?9NNNNNNNNNNNNNNNN3NNNNNNNNNNNNNNNNNNNNNN####################################################### ; ; COMMON I/O PARAMETER BLOCK ; ;##################################Ș!NNNNNNNNNNNNNNNN3NNNNNNNNNNNNNNNNNNNNNNSCRIPTOR OR FROM DEFAULT TABLES ; DDT_HDS DS 1 ;HEADS DDT_SOF DS 2 ;SECTOR OFFSET ; ; DEFINE THE STRUCTURE SIZE ; DDT_S9NNNNNNNNNNNNNNNN3!lNNNNNNNNNNNNNNNNNNNNNNOR OFFSET ; ENDM IF BOOT = 10H ; A DDT_0: ALLDRV HDEXEC,6,10H,D0DPB,D0DPH,4,0 ; B DDT_1: ALLDRV HDEXEC,6,12H,D1lNNNNNNNNNNNNNNNNN3'hNNNNNNNNNNNNNNNNNNNNNN############## ; ; MESSAGES ; ;############################################################################ ; MSGLE: DM ?HNNNNNNNNNNNNNNNN3-)NNNNNNNNNNNNNNNNNNNNNN2 ;TRACK OFFSET DB 0 ;PHYSICAL RECORD SHIFT FACTOR DB 0 ;PHYSICAL RECORD MASK DW 0 ;LOGICAL DRIVE SECTOR OFFSET ; ; !NNNNNNNNNNNNNNNN3NNNNNNNNNNNNNNNNNNNNNNJP XMROM ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN CONSOLE STATUS ; EXIT  NNNNNNNNNNNNNNNN3 NNNNNNNNNNNNNNNNNNNNNNZ ;FAKE EOF ; ; FALL INTO PUNCH RETURN ; ;***************************************************************************K NNNNNNNNNNNNNNNNN3ZjNNNNNNNNNNNNNNNNNNNNNNMF_LOS JP XMROM ;**************************************************************************** ; ; MESSAGE EDITOR ; ENTNNNNNNNNNNNNNNNN3NNNNNNNNNNNNNNNNNNNNNN########################################## ; IOPB: REPT PB_SIZE LIST OFF DB 0 LIST ON ENDM ;#####################SNNNNNNNNNNNNNNNNN3NNNNNNNNNNNNNNNNNNNNNNIZ DS 0 ENDM ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; MACRO TO DEFINE THE DRIVMNNNNNNNNNNNNNNNN3"9NNNNNNNNNNNNNNNNNNNNN!DPB,D1DPH,4,8000H ; C DDT_2: ALLDRV HDEXEC,7,10H,D2DPB,D2DPH,4,0 ; D DDT_3: ALLDRV HDEXEC,7,12H,D3DPB,D3DPH,4,8000H ; [INNNNNNNNNNNNNNNNN3(VNNNNNNNNNNNNNNNNNNNNNNCR,LF,'LOAD ERROR' ; DSKEB: DM CR,LF,'Abort, Ignore, Retry, (BDOS) - ' ; WP_ERM: DM CR,LF,'W-PROT Error!' ; IF INTCPTS NNNNNNNNNNNNNNNN3.|NNNNNNNNNNNNNNNNNNNNNN DEFAULT DISK PHYSICAL PARAMETERS ; DB 1 ;HEADS ;#####################################################################NNNNNNNNNNNNNNNNN3NNNNNNNNNNNNNNNNNNNNNN- A= 0: NOT READY ; FFH: CHAR READY ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; C .HNNNNNNNNNNNNNNNNN3 NNNNNNNNNNNNNNNNNNNNNN* ; ; PUNCH DRIVER ; ENTRY- C= CHAR TO OUTPUT ; ;**************************************************************************NNNNNNNNNNNNNNNNN3i[NNNNNNNNNNNNNNNNNNNNNNRY- HL= TEXT PTR (BIT 7= 1: TERMINATOR) ; EXIT - REGS= ? ; ;*****************************************************************T= STHD)!NNNNNNNNNNNNNNNN4&DNNNNNNNNNNNNNNNNNNNNNNSTRUCT 0 DPB_SPT DS 2 ;SPT- SECTORS/TRACK DPB_BSH DS 1 ;BSH- BLOCK SHIFT FACTOR DETERMINED BY CLUSTER SIZE ; 1K= 3, 2K= 4,rNNNNNNNNNNNNNNNN4,|NNNNNNNNNNNNNNNNNNNNN!ULD BE USED BY CP/M 2.2 DEBLOCKING) ; DPB_PSH DS 1 ;PSH- PHYSICAL RECORD SHIFT FACTOR BASED ON BYTES/SEC ; 0: 128, 1: 256, NNNNNNNNNNNNNNNN4jWNNNNNNNNNNNNNNNNNNNNNNIFT FACTOR (PSH) DB 1 ;PHYSICAL RECORD MASK (PRM) DW 0 ;LOGICAL DRIVE SECTOR OFFSET (SOF) ; ; ; DB 4 ;HEADS ;#NNNNNNNNNNNNNNNNN4 NNNNNNNNNNNNNNNNNNNNNN)DPB ;;DRIVE PARAMETER BLK PTR IF ((DD - 1) <= NDHD) AND ((DD - 1) >= STHD) DW 0 ;;NO CHECKS ON HARD DISK ELSE DW Dxm'NNNNNNNNNNNNNNNNN4/:NNNNNNNNNNNNNNNNNNNNNNOF INITIALIZED CODE READ FROM DISK ; BIOSND EQU $ SUBTTL UNINITIALIZED DATA AREA ;#######################################BNNNNNNNNNNNNNNNN4ÂNNNNNNNNNNNNNNNNNNNNN!BUFFER PHYSICAL SECTOR BUF_ACT DS 1 ;0: BUFFER FLUSHED, /0: DATA IN BUFFER BUF_MOD DS 1 ;0: BUFFER CLEAN, /0: BUFFER DIRTY (MOx?NNNNNNNNNNNNNNNN4NNNNNNNNNNNNNNNNNNNNNN### ; ; VARIABLES ; ;############################################################################ ; CUR_DPB DS 2 ;DRIVE |NNNNNNNNNNNNNNNN4! NNNNNNNNNNNNNNNNNNNNNN AND ((DD - 1) <= NDHD) D#D(DD)ALL: DS 128 ;ALLOCATION BIT MAP FOR 8" HARD DRIVE #D(DD) ENDIF IF ((DD - 1) >= ST8FD) AN NNNNNNNNNNNNNNNNN4'uNNNNNNNNNNNNNNNNNNNNNN 4K= 5, 8K= 6, 16K= 7 DPB_BLM DS 1 ;BLM- BLOCK MASK ; 1K = 7, 2K= 15, 4K= 31, 8K= 63, 16K= 127 DPB_EXM DS 1 ;EXM- EXTENT MHNNNNNNNNNNNNNNNN4-ONNNNNNNNNNNNNNNNNNNNN! 2: 512, 3: 1024 DPB_PHM DS 1 ;PHM- PHYSICAL RECORD MASK BASED ON BYTES/SEC ; 0: 128, 1: 256, 3: 512, 7: 1024 ; ; ADDITtBNNNNNNNNNNNNNNNN4NNNNNNNNNNNNNNNNNNNNNN########################################################################### ; ; DRIVE PARAMETER HEADER AREA ; 1 PER DRIVE ; NNNNNNNNNNNNNNNN4 NNNNNNNNNNNNNNNNNNNNNN#D(DD)CHK ;;DRIVE DISK CHECKSUMS ARRAY PTR ENDIF DW D#D(DD)ALL ;;DRIVE CLUSTER ALLOCATION BIT MAP PTR LIST OFF ENDM ;UNNNNNNNNNNNNNNNNN4 255 : 2K= 0, 4K= 1, 8K= 3, 16K= 7 DPB_DSM DS 2 ;DSM- DRIVv\NNNNNNNNNNNNNNNN4.NNNNNNNNNNNNNNNNNNNNNNIONAL DISK PARTITIONING DATA FOR THE LOGICAL DRIVE SELECTION. ; PARTITIONING BY TRACKS ARE IMPLIMENTED THRU BDOS USING DPBOFF A*NNNNNNNNNNNNNNNNN4NNNNNNNNNNNNNNNNNNNNNN ;############################################################################ ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@5;HNNNNNNNNNNNNNNNNN4 NNNNNNNNNNNNNNNNNNNNNN ; DEFINE THE DATA ; DD DL 1 REPT NDRVS LIST OFF ALLDPH 0123456789ABCDEF DD DL DD + 1 LIST ON ENDM ;#######9&NNNNNNNNNNNNNNNNN4FNNNNNNNNNNNNNNNNNNNNNN################################################################### ; ; CP/M IOPB OVERLAY ; CPM_DSK DS 1 ;LOGICAL DRIVE CTNNNNNNNNNNNNNNNN4NNNNNNNNNNNNNNNNNNNNNN READOP: DS 1 ;0: WRITE OPERATION, 1: READ OPERATION WRTYPE: DS 1 ;WRITE OPERATION TYPE FROM BDOS: ; 0: WRITE TO ALLOCATED NNNNNNNNNNNNNNNN4J+NNNNNNNNNNNNNNNNNNNNNN########################################################################### ; ; DRIVE ALLOCATION AREAS ; ;################`rNNNNNNNNNNNNNNNN4#lNNNNNNNNNNNNNNNNNNNNNNGE (1 BYTE PER SECTOR) ENDIF LIST OFF ENDM ; ; RESERVE THE DATA SPACE ; DD DL 1 REPT NDRVS LIST OFF ALLDAL 0'NNNNNNNNNNNNNNNNN4)zNNNNNNNNNNNNNNNNNNNNN!E STORAGE SIZE (IN CLUSTERS) ; INT(((#_TRACKS - OFF) * SPT * BYTES PER SECTOR) / CLUSTER SIZE) -1 DPB_DRM DS 2 ;DRM- DIRECTO"ONNNNNNNNNNNNNNNNN4/)NNNNNNNNNNNNNNNNNNNNNNBOVE. ; PARTITIONING BY HEADS ARE IMPLIMENTED BY USING THE FOLLOWING DATA. ; (HEAD BITS ARE INCLUDED IN SECTOR WORD UPPER BI~NNNNNNNNNNNNNNNN4NNNNNNNNNNNNNNNNNNNNNN@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; GENERATE A DISK PARAMETER TABLE MACRO ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@rNNNNNNNNNNNNNNNN4 ziNNNNNNNNNNNNNNNNNNNNNN##################################################################### ; ; LOGON IOPB OVERLAY ; ;############################u NNNNNNNNNNNNNNNN4ZNNNNNNNNNNNNNNNNNNNNNNPM_TRK DS 2 ;LOGICAL TRACK NUMBER CPM_SEC DS 2 ;LOGICAL SECTOR NUMBER DS 1 ;FLAGS CPM_DMA DS 2 ;XFER ADDR CPM_DMAB DS 1 ;XF*NNNNNNNNNNNNNNNNN4NNNNNNNNNNNNNNNNNNNNN!(USED) BLOCK (PREREAD) ; 1: WRITE TO DIRECTORY (PREREAD & WRITE) ; 2: WRITE TO UNALLOCATED (UNUSED) BLOCK (NO ; PRERݏNNNNNNNNNNNNNNNN4xNNNNNNNNNNNNNNNNNNNNNN############################################################ ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@4NNNNNNNNNNNNNNNNN4$&NNNNNNNNNNNNNNNNNNNNNN123456789ABCDEF DD DL DD + 1 LIST ON ENDM ;###########################################################################|NNNNNNNNNNNNNNNNN4*)NNNNNNNNNNNNNNNNNNNNN!RY SIZE -1 DPB_AL0 DS 2 ;AL0,1- DIRECTORY ALLOCATION ; 1 MSB PER DIRECTORY CLUSTER ALLOCATED DPB_CKS DS 2 ;CKS- # DIRECTOR$NNNNNNNNNNNNNNNNN40:NNNNNNNNNNNNNNNNNNNNN!TS) ; DPB_SECO DS 2 ;SOF- SECTOR OFFSET (FOR LOGICAL DRIVE) ; 0: NONE, 1..65535: OFFSET DPB_SZ DS 0 ENDM ; ; ;@@@@@@BNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN^NNŃi6Ӆm< ؉sA܍yI㑰~K蕶Q왺W$\)Ţ`.ɦNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN4;NNNNNNNNNNNNNNNNNNNNN!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; GENERATE THE DPB FOR DRIVE MACRO ; ;@@@@@@@@@@@@@NNNNNNNNNNNNNNNNN4NNNNNNNNNNNNNNNNNNNNNN############### ; ; RESERVE DRIVE PARAMETER BLOCKS ; ;#################################################################### NNNNNNNNNNNNNNNNNN4 ~hNNNNNNNNNNNNNNNNNNNNN!TORY SECTORS CHECKED ; (DRM +1) / 4 DPBOFF DS 2 ;OFF- # RESERVED TRACKS (USUALLY 2) DPBSZ DS 0 ENDM ; ; ;@@@@@@@@@@@@NNNNNNNNNNNNNNNNN4^NNNNNNNNNNNNNNNNNNNNNN********************** ; REVISIONS: ; ; 1.0 - ; ORIGINAL ; ; 1.1 - 3 MAR 87 GRH ; CP/M 2.X deblocking based on CP/M 3.'"NNNNNNNNNNNNNNNN4NNNNNNNNNNNNNNNNNNNNNNRK ; CALCULATE FROM: ; ;HSTBLK EQU HSTSIZ/128 ;CP/M SECTORS IN SECTOR BUFFER ; CALCULATE FROM: CUR_DPB.DPBPHM + 1 ; ;CPMSNNNNNNNNNNNNNNNNN4yNNNNNNNNNNNNNNNNNNNNNN************************ ;* * ;* THE BDOS ENTRY POINTS GIVEN BELOW SHOW THE 4$NNNNNNNNNNNNNNNN4%'NNNNNNNNNNNNNNNNNNNNN!= DISK # ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ SELDSK: ; ; SAVE DISK # AS REQUE@9NNNNNNNNNNNNNNNN4+(NNNNNNNNNNNNNNNNNNNNN!+ ; ; HOME THE SELECTED DISK ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ HOME: ; ; NNNNNNNNNNNNNNNN4nVNNNNNNNNNNNNNNNNNNNNNN@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ALLDPB: MACRO #D LIST ON D#D(DD)DPB: DS DPB_SZ ;ALLOCATI~HNNNNNNNNNNNNNNNNN4NNNNNNNNNNNNNNNNNNNNNN######## STRUCT 0 DPBSPT DS 2 ;SPT- SECTORS/TRACK DPBBSH DS 1 ;BSH- BLOCK SHIFT FACTOR DETERMINED BY CLUSTER SIZE ; 1K= kNNNNNNNNNNNNNNNN4+;NNNNNNNNNNNNNNNNNNNNNN@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; GENERATE THE DPB FOR DRIVE MACRO ; ;@@@@@@@@@@@@@@@@@@@NNNNNNNNNNNNNNNNN4ǃNNNNNNNNNNNNNNNNNNNNN!x Data structures (dynamic). ; ;**************************************************************************** ;=========== NNNNNNNNNNNNNNNN4NNNNNNNNNNNNNNNNNNNNNNPT EQU HSTBLK * HSTSPT ;CP/M SECTORS/TRACK ; CALCULATE FROM: CUR_DPB.DPBSPT ; ;SECMSK EQU HSTBLK-1 ;SECTOR MASK ; CALCULATE NNNNNNNNNNNNNNNNN4 NNNNNNNNNNNNNNNNNNNNNN * ;* CODE WHICH IS RELEVANT TO DEBLOCKING ONLY. * ;* * ;**********BNNNNNNNNNNNNNNNNNN4&tNNNNNNNNNNNNNNNNNNNNNNSTED DISK ; LD A,C LD (SEKDSK),A ; ; LOOK UP DISK PTR IN TABLE ; LD HL,DRV_TBL ;BASE ADD A,A ;WORD PTRS ADD A,L&NNNNNNNNNNNNNNNN4,KNNNNNNNNNNNNNNNNNNNNN! IF PENDING WRITE (BUFFER DIRTY) THEN IGNORE ; LD A,(HSTWRT) OR A,A RET NZ ; ; ELSE PURGE BUFFER ; LD (HSTACT),A $dNNNNNNNNNNNNNNNN4]gNNNNNNNNNNNNNNNNNNNNNNON FOR DRIVE #D(DD) LIST OFF ENDM ; ; RESERVE THE DATA SPACE ; DD DL 1 REPT NDRVS LIST OFF ALLDPB 0123456789ABCD1}NNNNNNNNNNNNNNNNNN4 NNNNNNNNNNNNNNNNNNNNNN3, 2K= 4, 4K= 5, 8K= 6, 16K= 7 DPBBLM DS 1 ;BLM- BLOCK MASK ; 1K = 7, 2K= 15, 4K= 31, 8K= 63, 16K= 127 DPBEXM DS 1 ;EXM- ENNNNNNNNNNNNNNNNN4 NNNNNNNNNNNNNNNNNNNNNN@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ALLDPB: MACRO #D LIST ON D#D(DD)DPB: DS DPBSZ ;ALLOCATION FOR DRIR NNNNNNNNNNNNNNNNNN4NNNNNNNNNNNNNNNNNNNNNN========================================== ;* * ;* CP/M TO HOST DISKNNNNNNNNNNNNNNNN4׽NNNNNNNNNNNNNNNNNNNNNNFROM: CUR_DPB.DPBPHM ; ;SECSHF EQU @X ;LOG2(HSTBLK) ; CALCULATE FROM: CUR_DPB.DPBPSH ;=================================\BNNNNNNNNNNNNNNNN4!=NNNNNNNNNNNNNNNNNNNNNN******************************************* ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ x!NNNNNNNNNNNNNNNN4'ENNNNNNNNNNNNNNNNNNNNNN LD L,A LD A,0 ADC A,H LD H,A LD A,(HL) ;FETCH PTR INC HL LD H,(HL) LD L,A LD (CUR_DPH),HL ; ; FETCH DPB [NNNNNNNNNNNNNNNN4-xNNNNNNNNNNNNNNNNNNNNNN;A= 0 AT THIS POINT RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; SET TRACK GrNNNNNNNNNNNNNNNN4NNNNNNNNNNNNNNNNNNNNNNEF DD DL DD + 1 LIST ON ENDM ; ; BLOCKING BUFFER ; BLKBUF: DS 1024 ;HOST BUFFER IF (($ - 8000H) > 07700H) O>WNNNNNNNNNNNNNNNN4 NNNNNNNNNNNNNNNNNNNNN!XTENT MASK ; DSM < 256 : 1K= 0, 2K= 1, 4K= 3, 8K= 7, 16K= 15 ; DSM > 255 : 2K= 0, 4K= 1, 8K= 3, 16K= 7 DPBDSM DS 2 ;DSM̼NNNNNNNNNNNNNNNNNN4 GNNNNNNNNNNNNNNNNNNNNNNVE #D(DD) LIST OFF ENDM ; ; RESERVE THE DATA SPACE ; DD DL 1 REPT NDRVS LIST OFF ALLDPB 0123456789ABCDEF DD DL ENNNNNNNNNNNNNNNNN4NNNNNNNNNNNNNNNNNNNNNN CONSTANTS * ;* * ;===========================================ξNNNNNNNNNNNNNNNNN4N*NNNNNNNNNNNNNNNNNNNNNN==================== ;* * ;* BDOS CONSTANTS ON ENTRY TO WRITE NNNNNNNNNNNNNNNN4"hNNNNNNNNNNNNNNNNNNNNNN; ; ENTER HERE ON SYSTEM BOOT TO INITIALIZE ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++)nNNNNNNNNNNNNNNNNN4({NNNNNNNNNNNNNNNNNNNNN!PTR ; PUSH IX ;SAVE IX 1ST PUSH HL POP IX ; LD L,(IX+DPHDPBO) LD H,(IX+DPHDPBO + 1) LD (CUR_DPB),HL ; ; FETCHUBNNNNNNNNNNNNNNNN4.-NNNNNNNNNNNNNNNNNNNNN!IVEN BY REGISTERS BC ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ SETTRK: ; ; STORE TRNNNNNNNNNNNNNNNNNN4NNNNNNNNNNNNNNNNNNNNNNR ($ < 8000H) CONMSG **** BIOS TOO BIG, USE MOVCPM & RE-ADJUST! **** ENDIF END SHNNNNNNNNNNNNNNNNN4 NNNNNNNNNNNNNNNNNNNNNN- DRIVE STORAGE SIZE (IN CLUSTERS) ; INT(((#_TRACKS - OFF) * SPT * BYTES PER SECTOR) / CLUSTER SIZE) -1 DPBDRM DS 2 ;DRM- DI%-NNNNNNNNNNNNNNNNNN48vNNNNNNNNNNNNNNNNNNNNNN;***************************************************** ;* * ;* SECTOR DNNNNNNNNNNNNNNNN4NNNNNNNNNNNNNNNNNNNNNN========== ;BLKSIZ ;CP/M ALLOCATION BLOCK SIZE (IN BYTES, 1K,2K,4K,8K,16K) ; CALCULATE FROM: 0400H SHL (CUR_DPB.DPBBSH - 3) pNNNNNNNNNNNNNNNN4}NNNNNNNNNNNNNNNNNNNNNN * ;* * ;===================================================== WRALL EQU K9NNNNNNNNNNNNNNNN4#[NNNNNNNNNNNNNNNNNNNNNN BOOT: WBOOT: ; ; ASSUME NO DATA IN BUFFER ; XOR A,A LD (HSTACT),A ; ; CLEAR UNALLOCATED SECTOR COUNT ; LD (UNNNNNNNNNNNNNNNNNN4)JNNNNNNNNNNNNNNNNNNNNNN CURRENT BUFFER CONTROL BLOCK PTR ; LD L,(IX+ DPHDTABO) LD H,(IX+ DPHDTABO + 1) LD (CUR_BCB),HL ; ; RESTORE & RETURN [NNNNNNNNNNNNNNNNN4/NNNNNNNNNNNNNNNNNNNNNNACK # ; LD (SEKTRK),BC RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; SET SC5rNNNNNNNNNNNNNNNN4NNNNNNNNNNNNNNNNNNNNN!OFF ALLDAL 0123456789ABCDEF DD DL DD + 1 LIST ON ENDM ;#############################################################{NNNNNNNNNNNNNNNNN4 MYNNNNNNNNNNNNNNNNNNNNNNRECTORY SIZE -1 DPBAL0 DS 2 ;AL0,1- DIRECTORY ALLOCATION ; 1 MSB PER DIRECTORY CLUSTER ALLOCATED DPBCKS DS 2 ;CKS- # DIRECt9NNNNNNNNNNNNNNNNN4m%NNNNNNNNNNNNNNNNNNNNN!EBLOCKING ALGORITHMS FOR CP/M 2.0 * ;* * ;*******************************c^NNNNNNNNNNNNNNNNN4NNNNNNNNNNNNNNNNNNNNNN; ;HSTSIZ ;PHYSICAL DISK SECTOR SIZE ; CALCULATE FROM: 0080H SHL CUR_DPB.DPBPSH ; ;HSTSPT EQU 64 ;PHYSICAL DISK SECTORS/TBNNNNNNNNNNNNNNNN4(HNNNNNNNNNNNNNNNNNNNNNN0 ;WRITE TO ALLOCATED WRDIR EQU 1 ;WRITE TO DIRECTORY WRUAL EQU 2 ;WRITE TO UNALLOCATED ;*****************************CNNNNNNNNNNNNNNNNN4$NNNNNNNNNNNNNNNNNNNNNNACNT),A RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; SELECT DISK ; ENTRY- C1BNNNNNNNNNNNNNNNN4*NNNNNNNNNNNNNNNNNNNNN!DPH PTR ; POP IX ; LD HL,(CUR_DPH) RET ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++^NNNNNNNNNNNNNNNNN40 NNNNNNNNNNNNNNNNNNNNNNECTOR GIVEN BY REGISTER BC ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ SETSEC: LD (SEK.$NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNnNNNNNNNЁj7҅n< ׉r? ڍwDߑzG╯~K晴Q흺W$񡾢Y(ĦNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN5zNNNNNNNNNNNNNNNNNNNNNNSEC),BC ;SECTOR TO SEEK RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; SET DM:NNNNNNNNNNNNNNNNN5'NNNNNNNNNNNNNNNNNNNNNNTAKES THE PLACE OF * ;* THE PREVIOUS BIOS DEFINTION FOR READ. * ;* INNNNNNNNNNNNNNNN5 ?NNNNNNNNNNNNNNNNNNNNN!; 1: WRITE TO DIRECTORY BLOCK (ALLWAYS WRITE) ; 2: WRITE TO UNALLOCATED BLOCK (NO NEED TO PRE-READ) ; ;******************INNNNNNNNNNNNNNNN5NNNNNNNNNNNNNNNNNNNNNN LD (UNASEC),HL ; ; IF NO UNALLOCATED SECTORS REMAIN THEN PREREAD ; CHKUNA: LD A,(UNACNT) OR A,A JP Z,ALLOC ; ; NNNNNNNNNNNNNNNN5[NNNNNNNNNNNNNNNNNNNNN! LD HL,(UNATRK) ;TRACK++ INC HL LD (UNATRK),HL ; NOOVF: ; ; MATCH FOUND, MARK AS UNNECESSARY READ ; XOR A,A ;PRE$NNNNNNNNNNNNNNNNN5ZNNNNNNNNNNNNNNNNNNNNN!OSECSHF: INC BC ;SET BACK TO PHYSICAL SECTOR LD (SEKHST),BC ;BUFFER SECTOR TO SEEK ; ; IF BUFFER EMPTY THEN READ THE PHV)NNNNNNNNNNNNNNNN5%NNNNNNNNNNNNNNNNNNNNNNL SECTOR LD (HSTDSK),A ; LD HL,(SEKTRK) LD (HSTTRK),HL ; LD HL,(SEKHST) LD (HSTSEC),HL ; ; IF REQUIRED TO READ TlNNNNNNNNNNNNNNNNN5+NNNNNNNNNNNNNNNNNNNNNNOR A,A JP NZ,RWMOVE ;SKIP IF READ ; ; WRITE OPERATION, MARK AND SWITCH DIRECTION ; LD A,1 ;BUFFER = DIRTY LD (HSTWRTG4!NNNNNNNNNNNNNNNN5/NNNNNNNNNNNNNNNNNNNNN!A ADDRESS GIVEN BY BC ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ SETDMA: LD (DMAADR),BNNNNNNNNNNNNNNNNN5NNNNNNNNNNNNNNNNNNNNNN * ;* READ THE SELECTED CP/M SECTOR * ;***************************************************** READ: ; ; SET UP D,>HNNNNNNNNNNNNNNNN5jNNNNNNNNNNNNNNNNNNNNNN********************************************************** WRITE: ; ; SET PTR TO DISK DATA ; PUSH IX LD IX,(CUR_DPB) NNNNNNNNNNNNNNNN5NNNNNNNNNNNNNNNNNNNNNNELSE MORE UNALLOCATED RECORDS REMAIN, COUNT-- ; DEC A LD (UNACNT),A ; ; IF REQUESTED SECTOR != UNALLOCATED SECTOR THEN NrNNNNNNNNNNNNNNNN5NNNNNNNNNNNNNNNNNNNNNNREAD FLAG = FALSE LD (RSFLAG),A JP RWOPER ; ; ; NOT AN UNALLOCATED RECORD, REQUIRES PRE-READ ; ALLOC: XOR A,A ;COU NNNNNNNNNNNNNNNNN5 OVNNNNNNNNNNNNNNNNNNNNN!YSICAL SECTOR ; LD HL,HSTACT LD A,(HL) ; LD (HL),1 ;BUFFER FULL IN ANY CASE ; OR A,A JP Z,FILHST ; ; HOST BUFFNNNNNNNNNNNNNNNN5&NNNNNNNNNNNNNNNNNNNNN!HEN READ ; LD A,(RSFLAG) ;NEED TO READ? OR A,A CALL NZ,READHST ;YES, IF 1 ; ; BUFFER = CLEAN ; XOR A,A LD (HSTNNNNNNNNNNNNNNNN5, ;NNNNNNNNNNNNNNNNNNNNN!),A ; EX DE,HL ;SOURCE/DEST SWAP ; RWMOVE: ; ; BC INITIALLY 128, DE IS SOURCE, HL IS DEST ; LDIR ; ; DATA HAS BmNNNNNNNNNNNNNNNN5NNNNNNNNNNNNNNNNNNNNNNC ; ; ASSUME BANK 0 FOR NOW ; XOR A,A LD (DMABNK),A RET ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++NNNNNNNNNNNNNNNNNN5 (NNNNNNNNNNNNNNNNNNNNN!ATA TABLE PTR ; PUSH IX LD IX,(CUR_DPB) ; ; READ_OPERATION_FLAG = TRUE (1) ; LD A,1 LD (READOP),A ; ; PRE-READ:HNNNNNNNNNNNNNNNNN5YNNNNNNNNNNNNNNNNNNNNNN; ; READ_OP_FLAG = FALSE ; XOR A,A LD (READOP),A ; ; SAVE WRITE TYPE ; LD A,C LD (WRTYPE),A ; ; IF 1ST WRIT9NNNNNNNNNNNNNNNN56NNNNNNNNNNNNNNNNNNNNN!PURGE ; LD A,(SEKDSK) ;SAME DISK? LD HL,UNADSK CP A,(HL) JP NZ,ALLOC ; LD HL,(UNATRK) ;SAME TRACK? LD DE,(SECTRK) eNNNNNNNNNNNNNNNNNN59NNNNNNNNNNNNNNNNNNNNNNNT = 0 LD (UNACNT),A ; INC A ;PREREAD FLAG = TRUE LD (RSFLAG),A ; ; ; ; COMMON CODE FOR READ AND WRITE FOLLOWS ; MNNNNNNNNNNNNNNNN5!|gNNNNNNNNNNNNNNNNNNNNNNER ACTIVE, SAME AS SEEK BUFFER? ; LD A,(SEKDSK) LD HL,HSTDSK ;SAME DISK? CP A,(HL) JP NZ,NOMATCH ; LD HL,(HSTTRK) ;S NNNNNNNNNNNNNNNNNN5'NNNNNNNNNNNNNNNNNNNNN!WRT),A ; MATCH: ; ; COPY DATA TO OR FROM BUFFER ; LD HL,(SEKSEC) ;CALCULATE INDEX INTO BUFFER DEC HL ;CONVERT TO LOG4$NNNNNNNNNNNNNNNN5-9 NNNNNNNNNNNNNNNNNNNNN!EEN MOVED TO/FROM HOST BUFFER, IF NOT DIRECTORY THEN DELAY WRITE ; LD A,(WRTYPE) ;IF NOT DIRECTORY THEN DELAY WRITE CP A,WRBBNNNNNNNNNNNNNNNN5tNNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++ ; ; TRANSLATE SECTOR NUMBER BC ; ENTRY- BC= LOGICAL SECTOR ; EXIT - HL= PHYSICAL SECTOR ; ;+++++++SBNNNNNNNNNNNNNNNN5 {NNNNNNNNNNNNNNNNNNNNNN_OF_DATA_FLAG = TRUE ; LD (RSFLAG),A ; ; TREAT AS UNALLOCATED BLOCK ; LD A,WRUAL LD (WRTYPE),A ; JP RWOPER ;TO PeINNNNNNNNNNNNNNNNN5JNNNNNNNNNNNNNNNNNNNNNNE TO UNALLOCATED (NEW, UNUSED) BLOCK THEN SET PARAMETERS ; CP A,WRUAL JP NZ,CHKUNA ; ; COUNT = NUMBER_OF_SECTORS_IN_BLONNNNNNNNNNNNNNNN5eNNNNNNNNNNNNNNNNNNNNNN SBC HL,DE JP NZ,ALLOC ; LD HL,(SEKSEC) LD DE,(UNASEC) SBC HL,DE JP NZ,ALLOC ; ; MATCH, MOVE TO NEXT SECTOR FOR 'NNNNNNNNNNNNNNNNN5NNNNNNNNNNNNNNNNNNNNN! RWOPER: ; ; ASSUME NO ERRORS ; XOR A,A LD (ERFLAG),A ; ; COMPUTE BUFFER SECTOR ; LD BC,(SEKSEC) DEC BC ;CON>UNNNNNNNNNNNNNNNN5")4NNNNNNNNNNNNNNNNNNNNN!AME TRACK? LD DE,(SEKTRK) SBC HL,DE JP NZ,NOMATCH ; LD DE,(SEKHST) ;SAME SECTOR? LD HL,(HSTSEC) SBC HL,DE JP Z,MA2NNNNNNNNNNNNNNNNN5(NNNNNNNNNNNNNNNNNNNNNNICAL SECTOR (0..N-1) LD A,L ; AND A,(IX+ DPBPHM) ;USE PHYSICAL RECORD MASK DATA (CP/M 3.X) ; RRA ;BITS <7..1> -> BITS k}NNNNNNNNNNNNNNNN5.lYNNNNNNNNNNNNNNNNNNNNN!DIR LD A,(ERFLAG) ;RETURN ANY ERRORS ANYWAY JR NZ,RW_RET ; ; IF ERROR THEN ABORT ; OR A,A RET NZ ; ; NO ERROR/DuaHNNNNNNNNNNNNNNNNN5ENNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ SECTRAN: LD H,B LD L,C INC HL RET ;*******YNNNNNNNNNNNNNNNNN5 JNNNNNNNNNNNNNNNNNNNNNNERFORM THE READ ;**************************************************************************** ; ; THE WRITE ENTRY POINT T NNNNNNNNNNNNNNNNN5yNNNNNNNNNNNNNNNNNNNNNNCK ; LD A,(IX+ DPBBLM) ;CUR_DPB.DPBBLM + 1 ::= (BLKSIZ/128) INC A LD (UNACNT),A ; ; SET DISK TO SEEK ; LD A,(SEKDS `NNNNNNNNNNNNNNNN5TNNNNNNNNNNNNNNNNNNNNNNFUTURE REF ; INC HL ;UNASEC = UNASEC+1 LD (UNASEC),HL ; ; IF PAST LAST SECTOR ON TRACK THEN USE 1ST SECTOR OF NEXT TRA!NNNNNNNNNNNNNNNN5 LD H,A ; LD A,0 ;BIT 0 -> BIT 7 RRA LD L,A ; ; HL HAS RELATIVE HOST BUFFER ADDRESS ; LD DE,HSTBUF ADD ]NNNNNNNNNNNNNNNNN5/_hNNNNNNNNNNNNNNNNNNNNNNIRECTORY WRITE ; XOR A,A ;BUFFER = CLEAN LD (HSTWRT),A ; CALL WRITEHST ;WRITE TO DISK ; LD A,(ERFLAG) ;RETURN ANY ER NNNNNNNNNNNNNNNN5NNNNNNNNNNNNNNNNNNNNNN********************************************** ;* * ;* THE READ ENTRY POINT [9NNNNNNNNNNNNNNNN5 NNNNNNNNNNNNNNNNNNNNN!AKES THE PLACE OF THE PREVIOUS BIOS DEFINTION ; FOR WRITE. ; ENTRY- C= WRITE TYPE: ; 0: WRITE TO ALLOCATED BLOCK (UPDATE) E9NNNNNNNNNNNNNNNN5,NNNNNNNNNNNNNNNNNNNNNNK) LD (UNADSK),A ; ; SET TRACK TO SEEK ; LD HL,(SEKTRK) LD (UNATRK),HL ; ; SET SECTOR TO SEEK ; LD HL,(SEKSEC)H NNNNNNNNNNNNNNNNN5jNNNNNNNNNNNNNNNNNNNNNNCK ; LD E,(IX+ DPBSPT) LD D,(IX+ DPBSPT +1) INC DE SBC HL,DE JP C,NOOVF ; LD HL,1 ;SECTOR = 1 LD (UNASEC),HL ;!NNNNNNNNNNNNNNNN5iNNNNNNNNNNNNNNNNNNNNNNOR SIZE IS 128 JR Z,NOSECSHF ; SECSHFLP: SRL B ;ELSE SHIFT OVER TO PHYSICAL SECTOR RR C DEC A JR NZ,SECSHFLP ; NHNNNNNNNNNNNNNNNNN5$NNNNNNNNNNNNNNNNNNNNNNR A,A CALL NZ,WRITEHST ;CLEAR HOST BUFF ; FILHST: ; ; READ THE SECTOR BUFFER ; LD A,(SEKDSK) ;BUFFER SECTOR = PHYSICAղNNNNNNNNNNNNNNNNN5*NNNNNNNNNNNNNNNNNNNNNN HL,DE ;HL = HOST ADDRESS ; LD DE,(DMAADR) ;GET/PUT CP/M DATA LD BC,128 ;LENGTH OF MOVE ; LD A,(READOP) ;WHICH WAY? NNNNNNNNNNNNNNNNN50L%NNNNNNNNNNNNNNNNNNNNNNRORS ; ; DONE, RESTORE & RETURN ; RW_RET: POP IX ; RET ;********************************************************k$NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNŃg5҅n< ׉tBލzH摴P땸T"Y&ž^,Ǣe4ЦNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN5MNNNNNNNNNNNNNNNNNNNNNN******************** ; ; WRITEHST PERFORMS THE PHYSICAL WRITE FROM HSTBUF TO THE HOST DISK. ; ENTRY- (HSTDSK)= DISK # TO WRITONNNNNNNNNNNNNNNNN5NNNNNNNNNNNNNNNNNNNNNN************************************************************ ; ; UNITIALIZED RAM DATA AREAS ; ;*****************************NNNNNNNNNNNNNNNN5 NNNNNNNNNNNNNNNNNNNNNNINING IN BLOCK (CLUSTER) UNADSK: DS 1 ;LAST UNALLOC DISK UNATRK: DS 2 ;LAST UNALLOC TRACK UNASEC: DS 2 ;LAST UNALLOC SECTOxtNNNNNNNNNNNNNNNN5(NNNNNNNNNNNNNNNNNNNNN!----------------------------------------------------------- ; ; INIT - COLD START ENTRY FROM BOOT MUST SET ALL BIOS PARAMS(NNNNNNNNNNNNNNNNN5kNNNNNNNNNNNNNNNNNNNNNNLOCK DRIVE ; OR A,A LD A,38H ;COND. JR (ON) JR Z,CLKON ; ; ELSE TURN OFF CLOCK DRIVE ; LD A,18H ;UNCOND. JR (OFFtNNNNNNNNNNNNNNNNN5mNNNNNNNNNNNNNNNNNNNNN! ;---------------------------------------------------------- ; ; WARM REBOOT ENTRY LOADS CCP,BDOS FROM DISK & ; SETS UP VARIANNNNNNNNNNNNNNNNN5%NNNNNNNNNNNNNNNNNNNNNNODE) LSTINC EQU FALSE ;LIST INCLUDE FILES USEMON EQU TRUE ;USE MONITOR ROM I/O ROUTINES IF TRUE INTRPTS EQU TRUE ;ENABLE INNNNNNNNNNNNNNNNN5+NNNNNNNNNNNNNNNNNNNNN! C SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 1 ; D SIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 1 ; E JADE 8" FLOPPY PHYSICAL DRIVErNNNNNNNNNNNNNNNNN5NNNNNNNNNNNNNNNNNNNNNNE TO ; (HSTTRK)= TRACK # TO WRITE TO ; (HSTSEC)= SECTOR # TO WRITE TO ; EXIT - (ERFLAG)= 0: OK, /0: ERROR ; ;************HNNNNNNNNNNNNNNNNN5)NNNNNNNNNNNNNNNNNNNNNN*********************************************** ; ; THE FOLLOWING ITEMS ARE SET BY THE BIOS FUNCTIONS ; SEKDSK: DS 1 ;LOG'NNNNNNNNNNNNNNNN5]NNNNNNNNNNNNNNNNNNNNNNR ; ; ERFLAG: DS 1 ;ERROR REPORTING 0: OK, /0: ERROR RSFLAG: DS 1 ;0: NO PREREAD REQ'D, /0: PREREAD REQ'D READOP: DS 1 ;@NNNNNNNNNNNNNNNN57NNNNNNNNNNNNNNNNNNNNN! ; ;---------------------------------------------------------------------------- ; INIT: ; ; SET TEMPORARY STACK ; DINNNNNNNNNNNNNNNNN58NNNNNNNNNNNNNNNNNNNNN!) (CAUSES JUMP TO ILLEGAL) ; CLKON: LD (INHCLK),A ; ; BOOT CCP & BDOS ; JR WARM ;#################################2!NNNNNNNNNNNNNNNNNN5 xfNNNNNNNNNNNNNNNNNNNNNNBLES ; ;---------------------------------------------------------- ; WARM: ; ; SET TEMPORARY STACK ; DI LD SP,DEFBF$NNNNNNNNNNNNNNNNNN5&NNNNNNNNNNNNNNNNNNNNNNNTERRUPT PROCESSING WHISTLE INTCPTS EQU TRUE ;ENABLE SYSTEM CALL INTERCEPT WHISTLE BOOT EQU 10H ;10H: HARD DISK, 3: 8" FLOPP/NNNNNNNNNNNNNNNNN5,= NNNNNNNNNNNNNNNNNNNNNN 0 ; F JADE 8" FLOPPY PHYSICAL DRIVE 1 ENDIF IF BOOT = 3 ; A JADE 8" FLOPPY PHYSICAL DRIVE 0 ; B JADE 8" FLOPPYNNNNNNNNNNNNNNNNN5+NNNNNNNNNNNNNNNNNNNNN!**************************************************************** WRITEHST: ; RET ;*************************************}NNNNNNNNNNNNNNNNN5 NNNNNNNNNNNNNNNNNNNNN!ICAL DRIVE SEKTRK: DS 2 ;LOGICAL TRACK NUMBER SEKSEC: DS 2 ;LOGICAL SECTOR NUMBER ; ; THE FOLLOWING ARE SET BY THE BUFFE$NNNNNNNNNNNNNNNNN5nNNNNNNNNNNNNNNNNNNNNNN0: WRITE OPERATION, 1: READ OPERATION WRTYPE: DS 1 ;WRITE OPERATION TYPE FROM BDOS: ; 0: WRITE TO ALLOCATED (USED) BLOCK NNNNNNNNNNNNNNNN5NNNNNNNNNNNNNNNNNNNNNN LD SP,DEFBFR ;USE PAGE 0 FOR STACK LD (THIS_STK),SP EI ; ; INIT DEFAULT DRIVE ; LD A,(DK_BDRV) ;USE DRIVE # PASSEDP NNNNNNNNNNNNNNNNN5 NNNNNNNNNNNNNNNNNNNNNN########################################### ; ; SIGN-ON MESSAGE ; ;#########################################################?HNNNNNNNNNNNNNNNNNN5!KWNNNNNNNNNNNNNNNNNNNNNN TITLE CUSTOMIZED BIOS FOR M5B LIST NOCOND ;============================================================================ ; ^NNNNNNNNNNNNNNNN5'NNNNNNNNNNNNNNNNNNNNNNY, 20H: 5" FLOPPY DEBUG EQU FALSE ;TRUE TO DUMP THE IOPB DATA TO PRINTER FORM ;******************************************BNNNNNNNNNNNNNNNN5-:NNNNNNNNNNNNNNNNNNNNNN PHYSICAL DRIVE 1 ; C SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 0 ; D SIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 0 ; E SIDE 0 NNNNNNNNNNNNNNNNN5DNNNNNNNNNNNNNNNNNNNNN!*************************************** ; ; READHST PERFORMS THE PHYSICAL READ FROM THE HOST DISK INTO HSTBUF. ; ENTRY- (HSTDNNNNNNNNNNNNNNNN5 KNNNNNNNNNNNNNNNNNNNNNNR READ/WRITE ; HSTDSK: DS 1 ;BUFFER DISK NUMBER HSTTRK: DS 2 ;BUFFER TRACK NUMBER HSTSEC: DS 2 ;BUFFER SECTOR NUMBER ; yNNNNNNNNNNNNNNNNN5}NNNNNNNNNNNNNNNNNNNNNN(PREREAD) ; 1: WRITE TO DIRECTORY (PREREAD & WRITE) ; 2: WRITE TO UNALLOCATED (UNUSED) BLOCK (NO ; PREREAD REQ'D)6rNNNNNNNNNNNNNNNN5UNNNNNNNNNNNNNNNNNNNNN! IN PAGE 0 AND A,3 LD (DEFDRV),A ; ; SEND SYSTEM SIGN-ON ; LD HL,MSGSO CALL EDITOR ; ; MODIFY COLD START VECTORoKNNNNNNNNNNNNNNNNN58NNNNNNNNNNNNNNNNNNNNN!################### ; MSGSO: DB CR,LF DB CPMSZ / (KBYTE * 10) + '0' DB (CPMSZ MOD (KBYTE * 10)) / KBYTE + '0' DB 'K CP/MdNNNNNNNNNNNNNNNN5"NNNNNNNNNNNNNNNNNNNNNN; ASSEMBLY PARAMETERS ; ;============================================================================ FALSE EQU 0 TRUE EQU N7 NNNNNNNNNNNNNNNN5(NNNNNNNNNNNNNNNNNNNNNN********************************** ; ; CUSTOMIZED BIOS FOR M5B ; (c) 1981 GRH Electronics, CUPERTINO, CA ; ;**********NNNNNNNNNNNNNNNN5.[iNNNNNNNNNNNNNNNNNNNNNN& 1 OF HARD DISK PHYSICAL DRIVE 1 ; F SIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 1 ENDIF IF BOOT = 20H ; A JADE 5" FLOxBNNNNNNNNNNNNNNNNN5uNNNNNNNNNNNNNNNNNNNNNNSK)= DISK # TO READ FROM ; (HSTTRK)= TRACK # TO READ FROM ; (HSTSEC)= SECTOR # TO READ FROM ; EXIT - (ERFLAG)= 0: OK, /0: E"HNNNNNNNNNNNNNNNNN5 zNNNNNNNNNNNNNNNNNNNNN!; SEKHST: DS 2 ;PHYSICAL SECTOR TO XFER ; HSTACT: DS 1 ;0: BUFFER FLUSHED, /0: DATA IN BUFFER HSTWRT: DS 1 ;0: BUFFER CLENNNNNNNNNNNNNNNNN5NNNNNNNNNNNNNNNNNNNNNNN DMAADR: DS 2 ;LAST DMA ADDRESS DMABNK DS 1 ;LAST DMA BANK ; HSTBUF: DS 1024 ;HOST BUFFER }NNNNNNNNNNNNNNNN5dNNNNNNNNNNNNNNNNNNNNNN TO WARM START ; LD HL,(BIOS+4) LD (BIOS+1),HL ; ; INIT OUR STUFF ; CALL GETBNK LD (BUF_DMAB),A ; ; INITIALIZElNNNNNNNNNNNNNNNNN5 NNNNNNNNNNNNNNNNNNNNN!-80 Vers 2.2',CR,LF DB 'M5b CBIOS Vers ' PVERS VERSN DM CR,LF IF $ > (DIRBF + SECSZ) CONMSG **** WARNING! C[NNNNNNNNNNNNNNNNN5#-5NNNNNNNNNNNNNNNNNNNNNNOT FALSE ;============================================================================ ; ; CONDITIONAL ASSEMBLY FLAGS ; ;NNNNNNNNNNNNNNNNNN5)NNNNNNNNNNNNNNNNNNNNNN****************************************************************** ; ; CONFIGURATION: ; ; CPM ; DRIVE USAGE IF BOOT = 1PNNNNNNNNNNNNNNNN5/hXNNNNNNNNNNNNNNNNNNNNN!PPY PHYSICAL DRIVE 0 ; B JADE 5" FLOPPY PHYSICAL DRIVE 1 ; C SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 0 ; D SIDE 2 & 3 OFW~NNNNNNNNNNNNNNNN5&NNNNNNNNNNNNNNNNNNNNN!RROR ; ;**************************************************************************** READHST: ; RET ;****************ORNNNNNNNNNNNNNNNN5 ;NNNNNNNNNNNNNNNNNNNNNNAN, /0: BUFFER DIRTY (MODIFIED) ; ; THE FOLLOWING USED BY THE UNALLOCATED BLOCK ALGORITHMS ; UNACNT: DS 1 ;# SECTORS REMA*NNNNNNNNNNNNNNNN5NNNNNNNNNNNNNNNNNNNNNN#################################################################### ; DIRBF: EQU $ ;BUFFER BEGINNING ;-----------------h>NNNNNNNNNNNNNNNNNN5ZNNNNNNNNNNNNNNNNNNNNNN CLOCK VECTORS IF CLOCK INSTALLED ; LD A,MF_CSYN ;TEST FOR BOARD PRESENT CALL XMROM ; ; IF CLOCK PRESENT THEN TURN ON CDNNNNNNNNNNNNNNNNN5^NNNNNNNNNNNNNNNNNNNNNNOLD INIT CODE BIGGER THAN DIR BUFFER **** ELSE DS DIRBF+SECSZ-$ ;FILL OUT DIRECTORY BUFFER TO 1 SECTOR SIZE ENDIF NNNNNNNNNNNNNNNNNN5$NNNNNNNNNNNNNNNNNNNNNN============================================================================ SHORT EQU FALSE ;SHORT BIOS (REMOVES UNESENTIAL CNNNNNNNNNNNNNNNNN5*NNNNNNNNNNNNNNNNNNNNNN0H ;HARD DISK BOOT CONFIG. ; A SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 0 ; B SIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 0 ; SNNNNNNNNNNNNNNNNN50{NNNNNNNNNNNNNNNNNNNNNN HARD DISK PHYSICAL DRIVE 0 ; E SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 1 ; F SIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 1 ; ,mNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN8NNNNNNNNсn< ׅs@ۉwD|K瑴P앹V$\)Ş`/ˢg5ѦNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN6]NNNNNNNNNNNNNNNNNNNNNN G JADE 8" FLOPPY PHYSICAL DRIVE 0 ; H JADE 8" FLOPPY PHYSICAL DRIVE 1 ENDIF ; ;***************************************eNNNNNNNNNNNNNNNN6KNNNNNNNNNNNNNNNNNNNNNN- 22 APR 83 GRH ; CHANGED DEFINITIONS TO ALLOW BIG DIRECTORIES. ; DISALLOWED DRIVES C & D. ; 2.29 - 3 SEP 83 GRH ; ChangjNNNNNNNNNNNNNNNNN6 0NNNNNNNNNNNNNNNNNNNNN!formity in ; parameter passing between hard disk & JADE floppy IOPBs. ; Vector I/O routines to monitor rom routines. ; 2.0NNNNNNNNNNNNNNNNN6LNNNNNNNNNNNNNNNNNNNNN!wn to 60k. ; 3.01 26 JUN 88 GRH ; Remove 5" floppy support. Implement in CP/M-86 BIOS. ; Change single function to return dr+NNNNNNNNNNNNNNNNN6kNNNNNNNNNNNNNNNNNNNNNNPB structure in preparation for deblocking. ; 3.05 11-3-88 GRH ; Change included data to update IOPB.PBSTAT to new configura?NNNNNNNNNNNNNNNN6!NNNNNNNNNNNNNNNNNNNNNNFLG. ; 3.08 2-22-91 GRH ; Remove references to THIS_BNK & use monitor function #7 instead. ; Add track-head shift factor toM(NNNNNNNNNNNNNNNNN6%+NNNNNNNNNNNNNNNNNNNNN! INCLUDE DISKS3.DEF ; INCLUDE MONBOARD.DEF ; INCLUDE ISHA.DEF ; INCLUDE B:M5ZF101.DEF ; ;============================7rNNNNNNNNNNNNNNNNN6+pNNNNNNNNNNNNNNNNNNNNNNS: EQU CPMBS + 4A00H ;ADDRESS OF BDOS BIOSR: EQU 1000H - BIOS ; ; PAGE 0 LOCATIONS ; PAGE0: EQU 0 ;START OF CP/M RAM IONNNNNNNNNNNNNNNNN6NNNNNNNNNNNNNNNNNNNNNN********************** ; REVISIONS: ; ; 2.2.0 - RELEASE ; 2.2.3 - SWAPPED DCM & BIOS SECTORS ON DISK, ALLOWING A ; LA!NNNNNNNNNNNNNNNN6[NNNNNNNNNNNNNNNNNNNNNNed Rev # for blocked DCM. Enables IBM system 34 ; 256 bytes per sector disks to be read. ; 1.10 - 23 SEP 83 GRH ; Move clocx$NNNNNNNNNNNNNNNN6cNNNNNNNNNNNNNNNNNNNNN!3 - 4 JUN 84 GRH ; Add bells & whistles again. ; Move to 61k system. ; 2.04 - 30 MAR 85 GRH ; Implemented hard disk drivBNNNNNNNNNNNNNNNN6NNNNNNNNNNNNNNNNNNNNNNive table ptr into a BIOS function ; call using restart instruction. ; Change LOGON to specify the ID sector & track. At sam*NNNNNNNNNNNNNNNNN6>NNNNNNNNNNNNNNNNNNNNNNtion. ; 3.06 1-28-89 GRH ; Revised primitive calling procedures to use the monitor rom function ; rather than swapping RomXNNNNNNNNNNNNNNNNN6 ԊNNNNNNNNNNNNNNNNNNNNN! DPBs for future use. ; ; 3.09 5-15-91 GRH ; Change 8" floppy side select to track bit 0. Move calculation from ; DCM8 toBNNNNNNNNNNNNNNN6&~,NNNNNNNNNNNNNNNNNNNNN!================================================ ; LIST OFF *INCLUDE JDDCONT.DEF *INCLUDE COMIOPB3.DEF *INCLUDE DISK NNNNNNNNNNNNNNNNN6,NNNNNNNNNNNNNNNNNNNNNNBYTE: EQU PAGE0 + 3 ;IOBYTE ADDR DEFDRV: EQU PAGE0 + 4 ;DEFAULT DRIVE PARAM ADDR BDOSJV EQU PAGE0 + 5 ;BDOS SYSTEM CALL ENTRY HNNNNNNNNNNNNNNNNN6?NNNNNNNNNNNNNNNNNNNNN!RGER BIOS ALLOCATION ON THE DISK. ; 2.2.4 - ADDED NAKED TERMINAL DRIVERS & IOBYTE IN ; ANTICIPATION OF THE MONITOR. ALSO, 'NNNNNNNNNNNNNNNNN6 hNNNNNNNNNNNNNNNNNNNNNNk-calendar routines to ROM. Add Interrupt handler ; (Mode 2). Change Revision display of sign-on (separate CBIOS rev). ; 2.00 xNNNNNNNNNNNNNNNN6RNNNNNNNNNNNNNNNNNNNNNNe 1 as C: & D:. ; Implemented the Logon function for the hard disk. ; Implemented user friendly disk error options: Abort, RetzNNNNNNNNNNNNNNNNNNN6.NNNNNNNNNNNNNNNNNNNNNNe time, fix bug ; which did not specify the logon track. ; 3.02 7 JUL 88 GRH ; Add '?' to include file names. ; Change h NNNNNNNNNNNNNNNNN6 NNNNNNNNNNNNNNNNNNNNNNs itself. ; 3.07 11-25-90 GRH ; Modify for Ver. 1.22 Monitor. ; Fix bug in 8" Hard Disk table which benignly (at current leINNNNNNNNNNNNNNNNN6!NNNNNNNNNNNNNNNNNNNNN! CBIOS. ; Remove IOPB ptr passing in IX redundancy. ; Change DPB track-head shift factor to Sector Offset like track ; offse NNNNNNNNNNNNNNNN6'MNNNNNNNNNNNNNNNNNNNNNNS3.DEF *INCLUDE MONBOARD.DEF *INCLUDE ISHA.DEF *INCLUDE B:M5ZF101.DEF LIST ON ;===================================rNNNNNNNNNNNNNNNN6-NNNNNNNNNNNNNNNNNNNNNN THIS_BNK EQU PAGE0 + 001BH ;BANK # OF THE CURRENT BANK DK_BDRV EQU 0041H ;BOOT DRIVE # FROM PROM DEFBFR EQU PAGE0 + 80H ;DEFj'NNNNNNNNNNNNNNNNN6NNNNNNNNNNNNNNNNNNNNN!ALL REFERENCES ; REQUIRING THE I/O PROMS TO BOOT HAS BEEN REMOVED. ; 2.2.5 - RECONFIGURE FOR 62K SYSTEM. ; 2.2.6 - 20 FEB[rNNNNNNNNNNNNNNNNN6 =NNNNNNNNNNNNNNNNNNNNNN- 24 MAR 84 GRH ; Modify for hard disk ; 2.01 - 28 APR 84 GRH ; Change hard disk DPB to reflect half size directory, but 4NNNNNNNNNNNNNNNN6NNNNNNNNNNNNNNNNNNNNNNry, Ignore. ; Solved warm boot hang problem by reseting host adapter if busy. ; 3.00 - 26 JAN 87 GRH ; Implemented new comm NNNNNNNNNNNNNNNN6{NNNNNNNNNNNNNNNNNNNNNNard disk system tracks directory reference to new format. ; Correct bug in drivers which caused retry to fail. (sector remained['NNNNNNNNNNNNNNNNNNN6rNNNNNNNNNNNNNNNNNNNNNNvel) ; caused the drive table to have bad data (default table was missing ; the 2 deblocking extension bytes). ; Implement NNNNNNNNNNNNNNNNN6"NNNNNNNNNNNNNNNNNNNNNNt. Disk partitioning will add this value to sector word. It ; will be stored in the ID sector data to be dynamic. ; VERSN EQ#hNNNNNNNNNNNNNNNN6(]#NNNNNNNNNNNNNNNNNNNNNN========================================= ; ; DISK OPERATING SYSTEM ADDRESSES ; ;=========================================NNNNNNNNNNNNNNNN6.NNNNNNNNNNNNNNNNNNNNNNAULT BUFFER ; ; BIOS FUNCTION CALL RESTART VECTOR ; BFUNRST EQU 28H BFUNRSV EQU PAGE0 + BFUNRST BFUNRSI EQU 0C7H + BFUNRNNNNNNNNNNNNNNNNNN6-NNNNNNNNNNNNNNNNNNNNNN 83 ; DOUBLE D REV C UPGRADE. CHANGE BOARD STATUS PORT BITS. ; 2.2.7 - 8 MAR 83 GRH ; ADDED CLOCK/CALENDAR DRIVER, SYSTEM CALNNNNNNNNNNNNNNNNNN6 NNNNNNNNNNNNNNNNNNNNNNkeep ; allocation for 1k directory ; 2.02 - 2 JUN 84 GRH ; Change floppy disk drivers to relate to ISASI control of JADE ;ANNNNNNNNNNNNNNNNN6.NNNNNNNNNNNNNNNNNNNNNNon IOPB code & Jade floppy firmware support. ; Implemented disk drive driver tables and new function to return ; a ptr to a dm'NNNNNNNNNNNNNNNN6HNNNNNNNNNNNNNNNNNNNNN! ; corrupted) ; Stubbed out new Clock routines for present. ; 3.03 31 JUL 88 GRH ; Unstub Clock routines. ; 3.04 6 AUG NNNNNNNNNNNNNNNN6CNNNNNNNNNNNNNNNNNNNNNNdata xfer inhibit schemes with PB_FLG & PB_BCNT. ; Add pick-up of THIS_BNK data in all iopb cases. ; Remove clock buffer set/rwNNNNNNNNNNNNNNNNN6#NNNNNNNNNNNNNNNNNNNNNNU 309 ; ;**************************************************************************** SUBTTL SYSTEM DECLARATIONS ;=====NNNNNNNNNNNNNNNNN6)nNNNNNNNNNNNNNNNNNNNNNN=================================== ; NKSYS: EQU 60 ;SYSTEM SIZE IN K BYTES KBYTE: EQU 1024 CPMSZ: EQU KBYTE * NKSYS CPMBSNNNNNNNNNNNNNNN6/ĴNNNNNNNNNNNNNNNNNNNNNNST ; TPA: EQU 100H ;============================================================================ ; ; OTHER DECLARATIONSrNNNNNNNNNNNNNNNNN6xNNNNNNNNNNNNNNNNNNNNNNL INTERCEPT, ; ILLEGAL SYSTEM CALL MESSAGE, CHANGED BIOS SIZE TO END ; OF INITIALIZED DATA AREA. RESTRUCTURE MODULES. ; 2.28 k}NNNNNNNNNNNNNNNNN6 NNNNNNNNNNNNNNNNNNNNNN FDC. ; Change IOPB sector value from physical sector (1..n) to logical ; sector value (0..n-1). This maintains more uniŰNNNNNNNNNNNNNNNNN6}NNNNNNNNNNNNNNNNNNNNNNrive table. ; Removed init of IOBYTE. ; Implemented 5" floppy driver. ; Implemented use of ROM primitives. ; Moved system do4rNNNNNNNNNNNNNNNN6XNNNNNNNNNNNNNNNNNNNNNN88 GRH ; Remove floppy side select from BIOS & move to controller. ; Implement new ID sector format. ; Implement CP/M 3.0 DyNNNNNNNNNNNNNNNNN6NNNNNNNNNNNNNNNNNNNNNNead system calls. ; 12-5-90 GRH ; Remove IX IOPB ptr passing to disk drivers. ; 1-13-91 GRH ; Fix bug which corrupted PB_9NNNNNNNNNNNNNNNNN6$NNNNNNNNNNNNNNNNNNNNNNN======================================================================= ; ; INCLUDE JDDCONT.DEF ; INCLUDE COMIOPB3.DEF ;INNNNNNNNNNNNNNNNN6*;ANNNNNNNNNNNNNNNNNNNNN!: EQU CPMSZ - (20 * KBYTE) ; CP/M BIAS VALUE CCP: EQU CPMBS + 3400H ;ADDR OF CCP BDOS: EQU CPMBS + 3C00H ;ADDRESS OF BDOS BIOvNNNNNNNNNNNNNNNNN60NNNNNNNNNNNNNNNNNNNNNN ; ;============================================================================ ; MR_RNUM EQU 0 ;INTERIM DEFINITION FOR IN0INNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN8NNNNˁh6хm;։r> ڍvDᑮ|J啳PꙹU!Z(Ģ_-ɦNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN6mNNNNNNNNNNNNNNNNNNNNN!TERRUPT ROM SWAP ; SECSZ: EQU 128 NDRVS: EQU 6 IF BOOT = 10H ; ; 8" HARD DISK BOOT DATA ; STHD EQU 0 ;START LOGICARNNNNNNNNNNNNNNNN6|NNNNNNNNNNNNNNNNNNNNNN 1AH ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; GENERATE THE TRANSLATION TABLE MACLNNNNNNNNNNNNNNNNN6 NNNNNNNNNNNNNNNNNNNNNN@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; PVERS MACRO #VERS DD DL #VERS IF DD > 9999 DB (DD / 10000) + '0dNNNNNNNNNNNNNNNNN6|NNNNNNNNNNNNNNNNNNNNNNLDSK ;SELECT DISK DRIVE JP SETTRK ;SET TRACK # JP SETSEC ;SET SECTOR # JP SETDMA ;SET TRANSFER ADDR JP DISKRD ;PERF'3$NNNNNNNNNNNNNNNNN6\NNNNNNNNNNNNNNNNNNNNN!E IN BYTES BIOSST: DW BIOS ;BIOS MODULE LOAD ADDR FOR SBD ; ; CONTINUE ON WITH INIT ; INIT1: JR INIT ;#############NNNNNNNNNNNNNNNN6NNNNNNNNNNNNNNNNNNNNNN;USE PAGE 0 FOR STACK ; ; INIT DEFAULT DRIVE ; LD A,(DK_BDRV) ;USE DRIVE # PASSED IN PAGE 0 AND A,3 LD (DEFDRV),A ; NNNNNNNNNNNNNNNNN6%ONNNNNNNNNNNNNNNNNNNNNNER **** ELSE DS DIRBF+SECSZ-$ ;FILL OUT DIRECTORY BUFFER TO 1 SECTOR SIZE ENDIF ;--------------------------------NNNNNNNNNNNNNNNNN6+?@NNNNNNNNNNNNNNNNNNNNNNLL SELDSK LD A,L ;IF ERROR THEN ABORT OR A,H JR Z,WEROR ; ; READ BOOT DIRECTORY ; LD BC,DEFBFR ;SET XFER ADDRESSHNNNNNNNNNNNNNNNNN6>NNNNNNNNNNNNNNNNNNNNNNL DRIVE OF HARD DISK NDHD EQU 3 ;LAST LOGICAL DRIVE OF HARD DISK ST8FD EQU 4 ;START LOGICAL DRIVE OF 8" FLOPPY ND8FD EQU 5 NNNNNNNNNNNNNNNN6lNNNNNNNNNNNNNNNNNNNNNNRO ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; GXLATE MACRO #SECTORS, #SKEW LIST OFFdzNNNNNNNNNNNNNNNN6SNNNNNNNNNNNNNNNNNNNNNN' DD DL DD % 10000 ENDIF IF DD > 999 DB (DD / 1000) + '0' DD DL DD % 1000 ENDIF DB (DD / 100) + '0' DB '.' :aNNNNNNNNNNNNNNNN6*NNNNNNNNNNNNNNNNNNNNNNORM DISK READ JP DISKWR ;PERFORM DISK WRITE JP LISTST ;RETURN LIST STATUS JP SECTRN ;TRANSLATE SECTOR JP BIOFUNC ;EX8NNNNNNNNNNNNNNNNN6 NNNNNNNNNNNNNNNNNNNNNN############################################################### ; ; DIRECTORY SECTOR BUFFER STARTS HERE AFTER CRUNCHING COLD SNNNNNNNNNNNNNNNNN6 NNNNNNNNNNNNNNNNNNNNNN ; SEND SYSTEM SIGN-ON ; CLOGO: LD HL,MSGSO CALL EDITOR ; ; MODIFY COLD START VECTOR TO WARM START ; LD HL,(BIOS+4) J!NNNNNNNNNNNNNNN6&INNNNNNNNNNNNNNNNNNNNNN-------------------------- ; ; WARM REBOOT ENTRY LOADS CCP,BDOS FROM DISK & ; SETS UP VARIABLES ; ;------------------------NNNNNNNNNNNNNNNNN6,NNNNNNNNNNNNNNNNNNNNNN (USE DEFAULT BUFFER) CALL SETDMA ; LD BC,BD_SEC ;SET DIRECTORY SECTOR CALL SETSEC ; LD BC,0 ;SET TRACK TO 0 CALL S'NNNNNNNNNNNNNNNNN6NNNNNNNNNNNNNNNNNNNNNN ;LAST LOGICAL DRIVE OF 8" FLOPPY ENDIF IF BOOT = 3 ; ; 8" FLOPPY BOOT DATA ; STHD EQU 2 ;START LOGICAL DRIVE OF sNNNNNNNNNNNNNNNNN6 _NNNNNNNNNNNNNNNNNNNNN! NXTSEC DL 1 ;;START WITH SECTOR 1 LOWEST DL 1 ;; REPT #SECTORS LIST ON DB NXTSEC LIST OFF NXTSEC DL NXTSEC + #SKEW-$NNNNNNNNNNNNNNNN6bNNNNNNNNNNNNNNNNNNNNNN DB ((DD % 100) / 10) + '0' DB (DD % 10) + '0' ENDM SUBTTL BIOS CODE ORG BIOS ;------------------------------------ 9NNNNNNNNNNNNNNNNN6NNNNNNNNNNNNNNNNNNNNN!ECUTE FUNCTION CALL ;############################################################################ ; ; THE FOLLOWING BOOT QHNNNNNNNNNNNNNNNNN6:NNNNNNNNNNNNNNNNNNNNNNTART ; CODE. THIS BUFFER IS USED BY THE CP/M DIRECTORY CHECK ROUTINES THAT ; CHECK FOR DISK CHANGE. ; ;###################q$NNNNNNNNNNNNNNNNN6!ЋNNNNNNNNNNNNNNNNNNNNN! LD (BIOS+1),HL ; ; BOOT CCP & BDOS ; JR WARM ;###################################################################-rNNNNNNNNNNNNNNNN6'z-NNNNNNNNNNNNNNNNNNNNNN---------------------------------- ; WARM: ; ; SET TEMPORARY STACK ; LD SP,DEFBFR IF INTRPTS ; ; SET INTERRUPT VNNNNNNNNNNNNNNNN6-NNNNNNNNNNNNNNNNNNNNN!ETTRK ; CALL DISKRD JR NZ,WEROR ; ; CHECK FOR VALID BOOT DIRECTORY ; LD A,(DEFBFR) CP A,86H JR C,WEROR ; ; S1NNNNNNNNNNNNNNNNNN6)NNNNNNNNNNNNNNNNNNNNNNHARD DISK NDHD EQU 5 ;LAST LOGICAL DRIVE OF HARD DISK ST8FD EQU 0 ;START LOGICAL DRIVE OF 8" FLOPPY ND8FD EQU 1 ;LAST LOGIAqNNNNNNNNNNNNNNNNN6 NNNNNNNNNNNNNNNNNNNNN! ;ADD SKEW FACTOR ;; IF NXTSEC > #SECTORS ;CHECK FOR OVERFLOW NXTSEC DL NXTSEC - #SECTORS ;; IF NXTSEC <= LOWEST ;CHENNNNNNNNNNNNNNNN6/NNNNNNNNNNNNNNNNNNNNNN---------------------------------------- ; ; BIOS JUMP VECTOR TABLE ; ;---------------------------------------------------NNNNNNNNNNNNNNNN6LNNNNNNNNNNNNNNNNNNNNN!DATA MUST RESIDE AS DEFINED RIGHT BEFORE THE COLD ; INIT ROUTINE START AND MUST BE IN THE 1ST SECTOR. THESE 2 WORDS ARE ; REFETWNNNNNNNNNNNNNNNNNN6BNNNNNNNNNNNNNNNNNNNNN!######################################################### ; DIRBF: EQU $ ;BUFFER BEGINNING ;----------------------------NNNNNNNNNNNNNNNNN6"NNNNNNNNNNNNNNNNNNNNN!######### ; ; SIGN-ON MESSAGE ; ;############################################################################ ; MSGSO: DB }NNNNNNNNNNNNNNNN6(jNNNNNNNNNNNNNNNNNNNNNNECTOR TABLE BASE ; LD A,HIGH INTABL LD I,A ; ; SET INTERRUPT MODE TO 2 ; IM 2 ; ; ENABLE INTERRUPT VECTOR 7 ; NNNNNNNNNNNNNNNN6.NNNNNNNNNNNNNNNNNNNNNNET UP TO LOAD CCP/BDOS ; LD HL,(DEFBFR + BD_SBDSS) ;PREFETCH BDOS TRK/SECTOR PUSH HL ; LD HL,(DEFBFR + BD_SCCPS) ;FETCH 'NNNNNNNNNNNNNNNNNN6NNNNNNNNNNNNNNNNNNNNNNCAL DRIVE OF 8" FLOPPY ENDIF ;============================================================================ ; ; ASCII NNNNNNNNNNNNNNNNN6 9NNNNNNNNNNNNNNNNNNNNN!CK FOR REPEAT NXTSEC DL LOWEST + 1 LOWEST DL NXTSEC ENDIF ENDIF ;; ENDM LIST ON ENDM ;@@@@@@@@@@@@@@@@@@@@NNNNNNNNNNNNNNNNN6NNNNNNNNNNNNNNNNNNNNN!------------------------- ; JP INIT1 ;COLD START ENTRY JP WARM ;RELOAD CCP/BDOS JP CNSCK ;GET CONSOLE STATUS JP CI laNNNNNNNNNNNNNNN6NNNNNNNNNNNNNNNNNNNNNNRENCED BY THE BOOT LOADER CODE IN ORDER TO DETERMINE THE LOAD ADDRESS ; AND LENGTH OF THE BIOS. ; ;##########################\9NNNNNNNNNNNNNNNN6sNNNNNNNNNNNNNNNNNNNNN!------------------------------------------------ ; ; INIT - COLD START ENTRY FROM BOOT MUST SET ALL BIOS PARAMS ; ;-----NNNNNNNNNNNNNNNNN6#NNNNNNNNNNNNNNNNNNNNNNCR,LF DB CPMSZ / (KBYTE * 10) + '0' DB (CPMSZ MOD (KBYTE * 10)) / KBYTE + '0' DB 'K CP/M-80 Vers 2.2',CR,LF DB 'M5b CBIaNNNNNNNNNNNNNNNNNN6)Y"NNNNNNNNNNNNNNNNNNNNNN IN A,(M2_IMASK) AND A,7FH OUT (M2_IMASK),A ; ; FINALLY ENABLE VECTORED INTERRUPTS ; IN A,(M2_STAT) OR A,M2_IEN O !NNNNNNNNNNNNNNN6/NNNNNNNNNNNNNNNNNNNNNNCCP TRK/SECTOR LD C,L LD B,0 CALL SETSEC ; LD C,H CALL SETTRK ; LD BC,CCP CALL SETDMA ; ; READ CCP/BDOS ; zNNNNNNNNNNNNNNNN6ONNNNNNNNNNNNNNNNNNNNNNCHARS ; ;============================================================================ ; LF: EQU 0AH CR: EQU 0DH CTRLZ: EQU<NNNNNNNNNNNNNNNNN6 1NNNNNNNNNNNNNNNNNNNNNN@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; INITIALIZE VERSION TEXT IN RAM MACRO ; ;@@@@@@@@@@@@@@@@@@@@@@@'NNNNNNNNNNNNNNNNN6MNNNNNNNNNNNNNNNNNNNNN!;CONSOLE INPUT JP COC ;CONSOLE OUTPUT JP LO ;PRINTER OUTPUT JP PUNCH JP READER JP HOME ;HOME SELECTED DRIVE JP SEEONNNNNNNNNNNNNNNN6oNNNNNNNNNNNNNNNNNNNNNN################################################## ; DB 0 ;Z80 CPU DB 0 ;SPARE BIOSSZ: DW BIOSND - BIOS ;BIOS MODULE SIZ [NNNNNNNNNNNNNNNNN6 NNNNNNNNNNNNNNNNNNNNNN----------------------------------------------------------------------- ; INIT: ; ; SET TEMPORARY STACK ; LD SP,DEFBFR jNNNNNNNNNNNNNNNNN6$/~NNNNNNNNNNNNNNNNNNNNNNOS Vers ' PVERS VERSN DM CR,LF IF $ > (DIRBF + SECSZ) CONMSG **** WARNING! COLD INIT CODE BIGGER THAN DIR BUFFNNNNNNNNNNNNNNNNN6* qNNNNNNNNNNNNNNNNNNNNN!UT (M2_STAT),A EI ENDIF ; ; LOG ON DRIVE TO INIT TABLES ; LD A,(DK_BDRV) AND A,3 ;MODULO 4 LD C,A LD E,0 CA1NNNNNNNNNNNNNNNNN60NNNNNNNNNNNNNNNNNNNNNNWREAD: CALL DISKRD JR NZ,WEROR ;IF ERROR THEN EXIT ; ; NEXT SECTOR ; LD HL,BTSEC INC (HL) ; LD DE,(IOPB + PB_BCNTONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNЁm; ׅs@ ۉwD}L鑷R 핺W$\)ƞb1͢j8ԦNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN7NNNNNNNNNNNNNNNNNNNNNN) ;SECSZ ;DMA := DMA + SECTOR SIZE LD HL,(BTDMA) ADD HL,DE LD (BTDMA),HL ; ; IF NOT INTO BDOS THEN READ NEXT SECTOR ;?HNNNNNNNNNNNNNNNN7=ONNNNNNNNNNNNNNNNNNNNNNWARM START IN PAGE 0 ; LD A,0C3H LD HL,BIOS + 3 LD (PAGE0),A LD (PAGE0 + 1),HL ; ; INIT BDOS CALL VECTOR IN PAGE 0 eNNNNNNNNNNNNNNNNN7 ҄NNNNNNNNNNNNNNNNNNNNN!K DRIVE ; LD A,18H ;UNCOND. JR (OFF) (CAUSES JUMP TO ILLEGAL) ; CLKON: LD (INHCLK),A ; ENDIF ; ; PASS DEFAULT DISK&~NNNNNNNNNNNNNNNNN7NNNNNNNNNNNNNNNNNNNNNNISK SECTOR ; EXIT - A= 0: OK; /0: ERROR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; DNNNNNNNNNNNNNNNNN73NNNNNNNNNNNNNNNNNNNNNNRETURN 0 (ERROR) ; LD A,C CP A,NDRVS RET NC ; ; STORE DRIVE # FOR FUTURE USE ; LD (BTDRV),A ; ; SAVE LOGON REQ NNNNNNNNNNNNNNNN7NNNNNNNNNNNNNNNNNNNNNN DRIVE TABLE PTR ; ; ATTEMPT TO READ ID SECTOR ; XOR A,A ;INIT FLAG BYTE UNTIL FIRMWARE REVISED LD (IOPB + PB_ST2O),A z?NNNNNNNNNNNNNNNNN7%]NNNNNNNNNNNNNNNNNNNNNNVRTPTR) LD DE,DVRFLG ADD HL,DE EX DE,HL POP HL LD BC,DVRSIZ - DVRFLG LDIR ; ; RETURN DRIVE TABLE PTR ; LD HL,$NNNNNNNNNNNNNNNNN7+~NNNNNNNNNNNNNNNNNNNNNN********************************************* ; HOME: LD BC,0 ; ; FALL INTO SET TRACK ; ;***************************NNNNNNNNNNNNNNNNNN7ºNNNNNNNNNNNNNNNNNNNNNN LD DE,BDOS XOR A,A SBC HL,DE JR C,WREAD ; ; ELSE IF AT BEGINNING OF BDOS THEN SET UP NEW TRACK & SECTOR ; JR Z,R NNNNNNNNNNNNNNNN7-qNNNNNNNNNNNNNNNNNNNNNN ; LD HL,BDOS + 6 LD (BDOSJV),A LD (BDOSJV + 1),HL ; ; INIT BIOS CALL VECTOR IN PAGE 0 ; LD HL,BIOFUNC LD (BFUNRS*%NNNNNNNNNNNNNNNN7NNNNNNNNNNNNNNNNNNNNNN TO CCP ; LD A,(DEFDRV) LD C,A JP CCP SUBTTL BIOS DISK FUNCTION ROUTINES ;++++++++++++++++++++++++++++++++++++++++++wNNNNNNNNNNNNNNNN7koNNNNNNNNNNNNNNNNNNNNNNISKWR: ; ; DISABLE UPLOAD (READ DATA) ; LD A,1 SHL PB_INHX LD (BTFLG),A ; ; ENABLE DOWNLOAD (WRITE DATA) ; LD HL_NNNNNNNNNNNNNNNNN7H`NNNNNNNNNNNNNNNNNNNNN!UEST FLAG ; LD A,E LD (LOGRQ),A ; ; COMPUTE DISK DRIVER TABLE PTR ; CALL RETDVRT ;DRIVE IS STILL IN C REGISTER LDTINNNNNNNNNNNNNNNNN7 >NNNNNNNNNNNNNNNNNNNNNN ; CALL DISKLOG JP NZ,FDSKER ; ; IF NO ID SECTOR THEN USE DEFAULTS ; LD A,(IOPB + PB_ST2O) CP A,-2 ;0: NO ID, -1: !NNNNNNNNNNNNNNN7&NNNNNNNNNNNNNNNNNNNNNN(DTPTR) XOR A,A RET ; ; ; IF NOT HARD DISK THEN GO DO FLOPPY TEST ; LGDEF: LD A,(BTDRV) IF STHD <> 0 CP A,STHD PNNNNNNNNNNNNNNNNN7,SNNNNNNNNNNNNNNNNNNNNNN************************************************* ; ; SET TRACK # ; ENTRY- BC= TRACK # ; ;*********************************yNNNNNNNNNNNNNNNNN7NNNNNNNNNNNNNNNNNNNNNNDBDOS ; ; ELSE IF NOT AT BIOS THEN READ NEXT SECTOR ; LD DE,BIOS - BDOS SBC HL,DE JP C,WREAD ; ; ELSE DONE READIN4NNNNNNNNNNNNNNNNN7 @NNNNNNNNNNNNNNNNNNNNNNV),A LD (BFUNRSV + 1),HL ; ; SET DEFAULT SECTOR BUFFER ; LD BC,DEFBFR CALL SETDMA ; IF INTCPTS ; ; PUT BDOS V5INNNNNNNNNNNNNNNN7NNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++ ; ; READ A DISK SECTOR ; EXIT - A= 0: OK; /0: ERROR ; ;+++++++++++++++++++++++++++++++++ NNNNNNNNNNNNNNNNNN7X^NNNNNNNNNNNNNNNNNNNNN!,SECSZ LD (IOPB + PB_BCNTO),HL ; ; PASS WRITE COMMAND ; LD A,PB_WRITC ;SELECT WRITE OP JP DISKOP ;++++++++++++++ŸNNNNNNNNNNNNNNNNN7{QNNNNNNNNNNNNNNNNNNNNNN (DVRTPTR),HL ; ; PREFETCH DRIVER EXECUTION ADDRESS FROM TABLE ; LD E,(HL) ;STORE ADDRESS INC HL LD D,(HL) INC HL HNNNNNNNNNNNNNNNNN7!NNNNNNNNNNNNNNNNNNNNNNJADE ID, -2: EXTENDED ID JR NZ,LGDEF ; ; ELSE XFER ID SECTOR DATA TO TABLES ; CALL TRNONE ;ASSUME NO TRANSLATION ; ;YbNNNNNNNNNNNNNNNN7';NNNNNNNNNNNNNNNNNNNNNN JR C,LGCKFD ENDIF CP A,NDHD + 1 JR NC,LGCKFD ; ; ELSE USE HARD DISK DEFAULTS ; CALL TRNONE ; NO XLATE LD HL NNNNNNNNNNNNNNNN7-bNNNNNNNNNNNNNNNNNNNNN!******************************************* ; SETTRK: LD (BTTRK),BC RET ;********************************************FNNNNNNNNNNNNNNNNN7hNNNNNNNNNNNNNNNNNNNNNNG SYSTEM ; JP WZRPG ; ; ; ELSE SET UP & READ BDOS ; RDBDOS: POP HL ;RESTORE BDOS TRK/SECTOR FROM DIRECTORY LD C,L 2BNNNNNNNNNNNNNNNNN7 KNNNNNNNNNNNNNNNNNNNNNNECTOR INTO INTERCEPT CODE ; LD HL,(BDOS + 7) LD (BDOSV),HL ; ; NOW PUT INTERCEPT VECTOR INTO BDOS CODE ; LD HL,INTCP dNNNNNNNNNNNNNNNN7NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++++ ; DISKRD: ; ; ENABLE UPLOAD (READ DATA) ; XOR A,A LD (BTFLG),A ; ; DI2INNNNNNNNNNNNNNNN7 NNNNNNNNNNNNNNNNNNNNN!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; SELECT DRIVE FUNCTION ; LOG-ON - SET DISK PARAMETER BLOCK uNNNNNNNNNNNNNNNNNN7NNNNNNNNNNNNNNNNNNNNNN LD (DVRXADR),DE ; ; FETCH FLAGS ; LD C,(HL) ; ; COMPUTE DISK PARAMETER TABLE ADDRESS ; LD HL,(BTDRV) LD H,0 NNNNNNNNNNNNNNNNN7"\NNNNNNNNNNNNNNNNNNNNNN IF HARD DISK OR DOUBLE DENSITY THEN NO TRANSLATION ; LD A,(DEFBFR + ID_FLGO) AND A,[1 SHL DF_DTDB] OR [1 SHL DF_HARDB] NNNNNNNNNNNNNNNN7(+NNNNNNNNNNNNNNNNNNNNNN,HDPBK ; ; XFER DATA TO TABLES ; SEL2: PUSH HL CALL DPBAD ; USE DEFAULT TABLE POP HL LD BC,DPBSZ LDIR JR SEL1 XNNNNNNNNNNNNNNNN7.1NNNNNNNNNNNNNNNNNNNNNN******************************** ; ; SET SECTOR ; ENTRY- BC= SECTOR # ; ;**************************************************R$NNNNNNNNNNNNNNNNNNN7[-NNNNNNNNNNNNNNNNNNNNN! LD B,A ;A STILL CONTAINS 0 CALL SETSEC ; LD C,H CALL SETTRK ; JR WREAD ; ; ; WARM BOOT ERROR, OUTPUT MSG & HALT NNNNNNNNNNNNNNNNN7 x"NNNNNNNNNNNNNNNNNNNNN!T LD (BDOS + 7),HL ; ; INITIALIZE CLOCK VECTORS IF CLOCK INSTALLED ; LD A,MF_CSYN ;TEST FOR BOARD PRESENT CALL XMROM PZNNNNNNNNNNNNNNNNN7NNNNNNNNNNNNNNNNNNNNNNSABLE DOWNLOAD (WRITE DATA) ; LD (IOPB + PB_BCNTO),A LD (IOPB + PB_BCNTO + 1),A ; ; PASS READ COMMAND ; LD A,PB_READNNNNNNNNNNNNNNNN7>$NNNNNNNNNNNNNNNNN7_,NNNNNNNNNNNNNNNNNNNNNNDE= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; SECTRN: ; ; IF NO TRANSLATION TH>NNNNNNNNNNNNNNNNN7 |#NNNNNNNNNNNNNNNNNNNNNNR ; LD HL,DEFBFR LD (IOPB + PB_DMAO),HL CALL GETBNK LD (IOPB + PB_DMAXO),A ; ; SET DESCRIPTOR SECTOR SECTOR ; LDJ NNNNNNNNNNNNNNNN7NNNNNNNNNNNNNNNNNNNNNN+ PB_TRKO LD BC,PB_BCNTO - PB_TRKO LDIR ; DISKOP2: LD (IOPB + PB_CMDO),A ; ; FETCH DRIVER VECTOR & EXECUTE DISK DRIV? NNNNNNNNNNNNNNNN7:=NNNNNNNNNNNNNNNNNNNNN!;ECHO CHAR CALL COC POP AF ; AND A,5FH ;INSURE UPPER CASE ; ; IF RETRY THEN RETURN TO CALLER ; CP A,'R' ;IF RETRNNNNNNNNNNNNNNNNNN7NNNNNNNNNNNNNNNNNNNNN! TR3740: LD DE,SDTRAN ; SETTR: LD HL,(DTPTR) LD (HL),E INC HL LD (HL),D RET ;***********************************NNNNNNNNNNNNNNNNN7"lNNNNNNNNNNNNNNNNNNNNNN;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; HARD DISK DRIVER FUNCTION ; ENTRY- IY= DRIVr NNNNNNNNNNNNNNNN7(NNNNNNNNNNNNNNNNNNNNNNET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EXECUTE THE IOPB PRIMITIVE ; EXITcPNNNNNNNNNNNNNNNN7.NNNNNNNNNNNNNNNNNNNNNN+++ ; ; JADE 8" FLOPPY DISK DRIVER FUNCTION ; ENTRY- IY= DRIVER TABLE PTR ; EXIT - A= 0: OK; /0: ERROR ; ;++++++++++++++++tNNNNNNNNNNNNNNNNN7lNNNNNNNNNNNNNNNNNNNNNNEN RETURN SECTOR++ ; LD A,D ;IF TABLE ADDR = 0 THEN NO TRANSLATION OR A,E JP Z,NOTRAN ; ; ELSE CALCULATE NEW SECTOR FbNNNNNNNNNNNNNNNNN7 ONNNNNNNNNNNNNNNNNNNNNN HL,ID_SECT LD (IOPB + PB_SECO),HL ; ; SET DESCRIPTOR SECTOR TRACK ; LD L,H ;H == 0 FROM LAST OPERATION (HL= 0) LD (XNNNNNNNNNNNNNNNNN7NNNNNNNNNNNNNNNNNNNNNNER ; DKOPLP: PUSH IY ;SAVE IY LD IY,(DVRTPTR) ;FETCH TABLE BASE ; LD HL,DKOPRET ;PUT RETURN ADDRESS ON STACK PUSH HLNNNNNNNNNNNNNNN7 NNNNNNNNNNNNNNNNNNNNNNY THEN RETURN TO CALLER JR Z,DKOPLP ; ; ELSE IF ABORT THEN DO WARM BOOT ; CP A,'A' ;IF ABORT THEN RE-BOOT JP Z,0 ; A9NNNNNNNNNNNNNNNN7NNNNNNNNNNNNNNNNNNNNN!***************************************** ; ; SET NO SECTOR TRANSLATION PROCEDURE ; EXIT - HL, DE= ? ; ;*******************&NNNNNNNNNNNNNNNNN7#]NNNNNNNNNNNNNNNNNNNNNNER TABLE PTR ; EXIT - A= 0: OK; /0: ERROR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; BNNNNNNNNNNNNNNNNNN7)/NNNNNNNNNNNNNNNNNNNNNN - A= 0: OK, /0: ERROR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; XPRIM: ; ; SET 'NNNNNNNNNNNNNNNN7/0NNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; FD8EXEC: ; ; CONVERT LOGICAL DRIVE TO PHYSICAL DRIVE ; LNNNNNNNNNNNNNNNNNN79NNNNNNNNNNNNNNNNNNNNNNNROM TABLE ; EX DE,HL ADD HL,BC LD L,(HL) ; LD H,0 RET ; ; ; CONVERT FROM CP/M'S LOGICAL SECTOR {0..N-1} TO PHYSNNNNNNNNNNNNNNNNN7 օNNNNNNNNNNNNNNNNNNNNNNIOPB + PB_TRKO),HL ; ; ENABLE UPLOAD ; LD A,L ;L= 0 LD (IOPB + PB_FLGO),A ; ; DISABLE DOWNLOAD ; LD (IOPB + PB_NNNNNNNNNNNNNNNNN7NNNNNNNNNNNNNNNNNNNNNN ; LD HL,(DVRXADR) ;FETCH DRIVER ADDRESS PREFETCHED FROM TABLE JP (HL) ; ; DRIVER RETURNS HERE ; DKOPRET: POP IY ;MNNNNNNNNNNNNNNNN72NNNNNNNNNNNNNNNNNNNNNN ; ELSE IF IGNORE THEN RETURN NO ERROR ; SUB A,'I' ;IF IGNORE THEN RETURN NO ERROR RET Z ; ; ELSE RETURN ERROR TO BD@NNNNNNNNNNNNNNNNN7NNNNNNNNNNNNNNNNNNNNNN********************************************************* ; TRNONE: LD DE,0 JR SETTR ;+++++++++++++++++++++++++++++++++NNNNNNNNNNNNNNNNN7$YNNNNNNNNNNNNNNNNNNNNNN HDEXEC: ; ; CONVERT LOGICAL DRIVE TO PHYSICAL DRIVE ; LD A,(IY + DVRPDRV) ;0,1: DRV 0, 2,3: DRV 1 LD (IOPB + PB_DRVO),eSNNNNNNNNNNNNNNNNN7*zNNNNNNNNNNNNNNNNNNNNNNBANK ADDRESS TO THIS BANK FOR NOW ; CALL GETBNK LD E,A ;PRESET IOPB BANK LD (IOPB + PB_DMAXO),A ; ; EXECUTE THE PRIM!NNNNNNNNNNNNNNNN70}NNNNNNNNNNNNNNNNNNNNNND A,(IY + DVRPDRV) LD (IOPB + PB_DRVO),A ; ; IF HEADS == 1 THEN EXECUTE IOPB ; LD A,(IY + DVRHDS) DEC A JP Z,XPRIM x$NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN8NNNNNNNNсn< ׅsA݉yG㍱~L葵Q 핺V#𙾚Y&ž^,Ȣc1ͦNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN8CNNNNNNNNNNNNNNNNNNNNNN ; ; ELSE SELECT SIDE FROM TRACK BIT 0 ; LD HL,(IOPB + PB_TRKO) PUSH HL ;SAVE FOR ERROR RESTORE ; LD A,(IOPB + PB_SNNNNNNNNNNNNNNNN8NNNNNNNNNNNNNNNNNNNNNN 0: OK ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; BIOFUNC: ; ; IF FUNCTION # NOT RHNNNNNNNNNNNNNNNNN8 jNNNNNNNNNNNNNNNNNNNNNNSION # DW RETDVRTF ;1:RETURN DISK PHYSICAL CONFIGURATION TABLE PTR DW EXIOPB ;2:EXECUTE THE IOPB MAXFUNCS EQU ($ - BFUNTBL rNNNNNNNNNNNNNNNNN8&NNNNNNNNNNNNNNNNNNNNN!#) ; RETDVRTF: LD C,E ; RETDVRT: LD HL,DVR0 ;START AT 1ST TABLE ; ; IF DRIVE == 0 THEN ALREADY THERE ; LD A,C INNNNNNNNNNNNNNNNN8NNNNNNNNNNNNNNNNNNNNN!XIOB ;MONITOR FUNCTION # (DISK FUNCTION) CALL XMROM ;EXECUTE MONITOR FUNCTION ; OR A,A ;FUNCTION ERROR? RET NZ ; ; INNNNNNNNNNNNNNNN8c{NNNNNNNNNNNNNNNNNNNNN! LD A,MF_PHXB JP XMROM ;*************************************************************************** ; ; NEWLINE PROCEDUdNNNNNNNNNNNNNNNNN8%%NNNNNNNNNNNNNNNNNNNNNNR MODIFIED BY WARM BOOT RTN ; ; THE FOLLOWING CONDITIONAL JUMP IS MODIFIED TO AN UNCONDITIONAL JUMP BY ; THE WARM BOOT ROUTaHNNNNNNNNNNNNNNNNN8+*NNNNNNNNNNNNNNNNNNNNN!A,A ;BC = HL = A = 0 LD L,A LD H,A LD C,A LD B,A RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++'uHNNNNNNNNNNNNNNNNN8TNNNNNNNNNNNNNNNNNNNNN!ECO +1) ;FETCH SIDE SELECT BYTE ADD A,A ;SHIFT OUT BIT 7 ; SRL H ;SHIFT TRACK HIGH BYTE RR L ;ROTATE BIT 8 TO 7 ANDNNNNNNNNNNNNNNNNNN8NNNNNNNNNNNNNNNNNNNNNNIN TABLE THEN RETURN -1 ; LD A,C CP A,MAXFUNCS LD A,-1 RET NC ; ; ELSE COMPUTE TABLE ENTRY ; PUSH HL ;SAVE POSSyNNNNNNNNNNNNNNNN8S9NNNNNNNNNNNNNNNNNNNNN!) / 2 ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN BIOS VERSION # ; EXIT - Hy&NNNNNNNNNNNNNNNNN8NNNNNNNNNNNNNNNNNNNNNNOR A,A RET Z ; ; ELSE IF ILLEGAL DRIVE THEN RETURN ERROR ; CP A,NDRVS JR C,RETDV2 ; OR A,A RET ; ; ; ELSE C|dNNNNNNNNNNNNNNNNN8NNNNNNNNNNNNNNNNNNNNN!FETCH & RETURN RESULT STATUS ; LD A,(IX + PB_STATO) OR A,A ;TEST RESULT FOR RETURN RET ;+++++++++++++++++++++++++++ NNNNNNNNNNNNNNNNN8 vNNNNNNNNNNNNNNNNNNNNNNRE ; ;*************************************************************************** ; CRLF: LD C,CR CALL COC LD C,LF JP xNNNNNNNNNNNNNNNN8&vNNNNNNNNNNNNNNNNNNNNN!INE IF THE CLOCK/CALENDAR BOARD IS NOT PRESENT ; IF NOT MODIFIED, THEN IT IS ALLWAYS FALSE (NOP). ; INHCLK: JR C,ILLEGC ; = STHD) DW 0 ;;NO CHENNNNNNNNNNNNNNNN9'NNNNNNNNNNNNNNNNNNNNNNBTTRK DS 2 ;TRACK # BTSEC DS 2 ;SECTOR # BTFLG DS 1 ;RESERVED FOR FLAGS BTDMA DS 2 ;DMA ADDRESS BTDMAX DS 1 ;DMA EXTENDED ADVrrNNNNNNNNNNNNNNNN9-v8NNNNNNNNNNNNNNNNNNNNNN######### ; ; DRIVE ALLOCATION AREAS ; ;############################################################################ ; ;]NNNNNNNNNNNNNNNNN9FNNNNNNNNNNNNNNNNNNNNN!,256,4 DVR1: ;B ALLDRV HDEXEC,4,60H,32,1,32,1,32,1,10H,256,4 DVR2: ;C ALLDRV HDEXEC,5,60H,32,1,32,1,32,1,10H,256,4 DVR3: e9NNNNNNNNNNNNNNNNN9 INNNNNNNNNNNNNNNNNNNNNNPY DISK PARAMETER BLOCK ; IBM 3740 SINGLE DENSITY FORMAT ; ;#################################################################dNNNNNNNNNNNNNNNN9NNNNNNNNNNNNNNNNNNNNNN ; ;############################################################################ ; HDPBK: DW 128 ;SECTORS PER TRACK (LOGICABNNNNNNNNNNNNNNNN9WNNNNNNNNNNNNNNNNNNNNN!######## ; ; MODE 2 INTERRUPT VECTOR TABLE ; ;############################################################################ NNNNNNNNNNNNNNNNNN9@NNNNNNNNNNNNNNNNNNNNNN (Y/N/I/M) - ' ENDIF ;############################################################################ ; ; DRIVE PARAMETEwNNNNNNNNNNNNNNNNN9"fNNNNNNNNNNNNNNNNNNNNN!CKS ON HARD DISK ELSE DW D#D(DD)CHK ;;DRIVE DISK CHECKSUMS ARRAY PTR ENDIF DW D#D(DD)ALL ;;DRIVE CLUSTER ALLOCATION {7NNNNNNNNNNNNNNNN9(NNNNNNNNNNNNNNNNNNNNNNDRESS ;############################################################################ ; ; VARIABLES ; ;################NNNNNNNNNNNNNNNN9.#kNNNNNNNNNNNNNNNNNNNNNN@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; MACRO TO DEFINE THE DRIVE ALLOCATION & CHECKSNNNNNNNNNNNNNNNNNNN9wNNNNNNNNNNNNNNNNNNNNN!;D ALLDRV HDEXEC,5,60H,32,1,32,1,32,1,10H,256,4 DVR4: ;E ALLDRV FD8EXEC,0,0,26,0,26,0,26,0,0,77,1 DVR5: ;F ALLDRV FD8EXE!NNNNNNNNNNNNNNNN9 xNNNNNNNNNNNNNNNNNNNNNN########### ; SD8PBK: DW 26 ;SECTORS PER TRACK DB 3 ;BLOCK SHIFT FACTOR DB 7 ;BLOCK MASK DB 0 ;NULL MASK DW 242 ;9NNNNNNNNNNNNNNNNN96NNNNNNNNNNNNNNNNNNNNNNL) (SPT) DB 5 ;BLOCK SHIFT FACTOR (BSH) DB 31 ;BLOCK MASK (BLM) DB 1 ;NULL MASK (EXM) DW 1015 ;DISK SIZE (CLUSTNNNNNNNNNNNNNNNN9fNNNNNNNNNNNNNNNNNNNNNN; ; START ON AN EVEN PAGE BOUNDARY ; IF $ AND 0FFH DS 100H - ($ AND 0FFH) ENDIF INTABL: REPT 7 ;1ST 7 ARE UNSUPPORy]HNNNNNNNNNNNNNNNNN9sNNNNNNNNNNNNNNNNNNNNNNR HEADER AREA ; 1 PER DRIVE ; ;############################################################################ ; ;@@@@@@@@@@@@HNNNNNNNNNNNNNNNNN9#U7NNNNNNNNNNNNNNNNNNNNNNBIT MAP PTR LIST OFF ENDM ; ; DEFINE THE DATA ; DD DL 1 REPT NDRVS LIST OFF ALLDPH 0123456789ABCDEF DD DL DD + wNNNNNNNNNNNNNNNNNNN9)NNNNNNNNNNNNNNNNNNNNNN############################################################ ; DTPTR: DS 2 ;DRIVE TABLE PTR LOGRQ: DS 1 ;LOG ON REQUEST REG. BNNNNNNNNNNNNNNN9/ZNNNNNNNNNNNNNNNNNNNNNNUMS AREA ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ALLDAL: MACRO #D LIST ON IFNNNNNNNNNNNNNNNNN9$NNNNNNNNNNNNNNNNNNNNNNC,1,0,26,0,26,0,26,0,0,77,1 ENDIF IF BOOT = 3 DVR0: ;A ALLDRV FD8EXEC,0,0,26,0,26,0,26,0,0,77,1 DVR1: ;B ALLDRV FDNNNNNNNNNNNNNNNNN9 CNNNNNNNNNNNNNNNNNNNNNNDISK SIZE -1 DW 63 ;DIRECTORY MAX DB 11000000B ;ALLOC 0 DB 0 ;ALLOC 1 DW 16 ;CHECK SIZE DW 2 ;TRACK OFFSET DB 0 }1NNNNNNNNNNNNNNNNN9cNNNNNNNNNNNNNNNNNNNNNNERS -1) (DSM) DW 1152 / 2 ;DIRECTORY MAX (DRM) DB 0FFH ;ALLOCATION 0 (AL0) DB 10000000B ;ALLOCATION 1 (AL1) DW 0 ^ NNNNNNNNNNNNNNNN9XNNNNNNNNNNNNNNNNNNNNNNTED LIST OFF DW ILLINT LIST ON ENDM ; DW ITRAP ;INT 8 IS USER INTERRUPT ENDIF ;#############################*NNNNNNNNNNNNNNNNN9&NNNNNNNNNNNNNNNNNNNNNN@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; GENERATE A DISK PARAMETER TABLE MACRO ; ;@@@@@@@@@@@@@@ NNNNNNNNNNNNNNNNN9$̠NNNNNNNNNNNNNNNNNNNNNN1 LIST ON ENDM ; ; LAST OF INITIALIZED CODE READ FROM DISK ; BIOSND EQU $ SUBTTL UNINITIALIZED DATA AREA ;##### HNNNNNNNNNNNNNNNNN9*NNNNNNNNNNNNNNNNNNNNN! DVRTPTR DS 2 ;DRIVE DRIVER TABLE BASE ADDRESS PTR DVRXADR DS 2 ;DRIVE DRIVER EXECUTION ADDRESS SECOFF DS 2 ;LOGICAL DRIVE SEC@HNNNNNNNNNNNNNNNNN90NNNNNNNNNNNNNNNNNNNNNN ((DD - 1) >= STHD) AND ((DD - 1) <= NDHD) D#D(DD)ALL: DS 127 ;ALLOCATION BIT MAP FOR 8" HARD DRIVE #D(DD) ENDIF IF ((DHNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNnNNŃi7ԅp= ىvCލyH摴P땸T"Y&Þ`/ˢg6ЦNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN9NNNNNNNNNNNNNNNNNNNNNND - 1) >= ST8FD) AND ((DD - 1) <= ND8FD) D#D(DD)ALL: DS 57 ;ALLOCATION BIT MAP FOR 8" DRIVE #D(DD) D#D(DD)CHK DS 32 ;DIRECTNNNNNNNNNNNNNNNN9%NNNNNNNNNNNNNNNNNNNNNN ;EXM- EXTENT MASK ; DSM < 256 : 1K= 0, 2K= 1, 4K= 3, 8K= 7, 16K= 15 ; DSM > 255 : 2K= 0, 4K= 1, 8K= 3, 16K= 7 DPBDSM DNNNNNNNNNNNNNNNNN9 GNNNNNNNNNNNNNNNNNNNNNN ADDITIONAL DISK PARTITIONING DATA FOR THE LOGICAL DRIVE SELECTION. ; PARTITIONING BY TRACKS ARE IMPLIMENTED THRU BDOS USING ?NNNNNNNNNNNNNNNNN9gNNNNNNNNNNNNNNNNNNNNNNABCDEF DD DL DD + 1 LIST ON ENDM IF (($ - 8000H) > 07700H) OR ($ < 8000H) CONMSG **** BIOS TOO BIG, USE MOVCPM & NNNNNNNNNNNNNNNNN9YNNNNNNNNNNNNNNNNNNNNNNATA TABLE PTR ; PUSH IX LD IX,(CUR_DPB) ; ; READ_OPERATION_FLAG = TRUE (1) ; LD A,1 LD (READOP),A ; ; PRE-READ:NNNNNNNNNNNNNNNNNN9"NNNNNNNNNNNNNNNNNNNNNN; ; READ_OP_FLAG = FALSE ; XOR A,A LD (READOP),A ; ; SAVE WRITE TYPE ; LD A,C LD (WRTYPE),A ; ; IF 1ST WRITNNNNNNNNNNNNNNNNN9%ȡNNNNNNNNNNNNNNNNNNNNNN GET MONITOR PROM SUBR ; EXIT - A= ? ; ;**************************************************************************** GETMON:Al!NNNNNNNNNNNNNNNN9+NNNNNNNNNNNNNNNNNNNNNN; ;---------------------------------------------------------------------------- ITRAP: ; ; SAVE REGS FIRST ; PUSH AF fNNNNNNNNNNNNNNNNN9WNNNNNNNNNNNNNNNNNNNNN!ORY CHECKSUMS STORAGE (1 BYTE PER SECTOR) ENDIF LIST OFF ENDM ; ; RESERVE THE DATA SPACE ; DD DL 1 REPT NDRVS NNNNNNNNNNNNNNNN9NNNNNNNNNNNNNNNNNNNNNNS 2 ;DSM- DRIVE STORAGE SIZE (IN CLUSTERS) ; INT(((#_TRACKS - OFF) * SPT * BYTES PER SECTOR) / CLUSTER SIZE) -1 DPBDRM DS 2 0NNNNNNNNNNNNNNNN9NNNNNNNNNNNNNNNNNNNNNNDPBOFF ABOVE. ; PARTITIONING BY HEADS ARE IMPLIMENTED BY USING THE FOLLOWING DATA. ; (HEAD BITS ARE INCLUDED IN SECTOR WORD l'NNNNNNNNNNNNNNNNN9NNNNNNNNNNNNNNNNNNNNNNRE-ADJUST! **** ENDIF END NNNNNNNNNNNNNNNNN9 NNNNNNNNNNNNNNNNNNNNNN_OF_DATA_FLAG = TRUE ; LD (RSFLAG),A ; ; TREAT AS UNALLOCATED BLOCK ; LD A,WRUAL LD (WRTYPE),A ; JP RWOPER ;TO PeNNNNNNNNNNNNNNNNNN9 7TNNNNNNNNNNNNNNNNNNNNNNE TO UNALLOCATED (NEW, UNUSED) BLOCK THEN SET PARAMETERS ; CP A,WRUAL JP NZ,CHKUNA ; ; COUNT = NUMBER_OF_SECTORS_IN_BLONNNNNNNNNNNNNNNN9&NNNNNNNNNNNNNNNNNNNNNN LD A,XMONROM OUT (ROMSEL),A RET ;**************************************************************************** ; ; =NNNNNNNNNNNNNNNNNN9,r9NNNNNNNNNNNNNNNNNNNNNNPUSH HL PUSH BC ; ; SAVE CURRENT ROM & GET MONITOR ROM ; IN A,(ROMSEL) LD (ROMSAV),A CALL GETMON ; ; PRINT PROMNNNNNNNNNNNNNNN9dNNNNNNNNNNNNNNNNNNNNNNLIST OFF ALLDAL 0123456789ABCDEF DD DL DD + 1 LIST ON ENDM ;########################################################xNNNNNNNNNNNNNNNNN9 *NNNNNNNNNNNNNNNNNNNNNN;DRM- DIRECTORY SIZE -1 DPBAL0 DS 2 ;AL0,1- DIRECTORY ALLOCATION ; 1 MSB PER DIRECTORY CLUSTER ALLOCATED DPBCKS DS 2 ;CKS-'NNNNNNNNNNNNNNNN9!NNNNNNNNNNNNNNNNNNNNNNUPPER BITS) ; DPBSOF DS 2 ;SOF- SECTOR OFFSET (FOR LOGICAL DRIVE) ; 0: NONE, 1..65535: OFFSET DPBSZ DS 0 ENDM ; ; ;@NNNNNNNNNNNNNNNNN94NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ SECTRAN: LD H,B LD L,C INC HL RET ;*******YNNNNNNNNNNNNNNNNN9;NNNNNNNNNNNNNNNNNNNNNNERFORM THE READ ;**************************************************************************** ; ; THE WRITE ENTRY POINT TNNNNNNNNNNNNNNNNNN9!eNNNNNNNNNNNNNNNNNNNNNN ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN LIST DEVICE STATUS ; EXIT - A= 0: BNNNNNNNNNNNNNNNN9'NNNNNNNNNNNNNNNNNNNNNNMESSAGE EDITOR ; ENTRY- HL= TEXT PTR (BIT 7= 1: TERMINATOR) ; EXIT - REGS= ? ; ;********************************************}rNNNNNNNNNNNNNNNNN9-ANNNNNNNNNNNNNNNNNNNNNNPT ; LD HL,ITMSG IQCONT: CALL EDITOR ; LD HL,IQMSG ;QUERY USER CALL EDITOR ; CALL CI ;GET USER OPTION ; ; IF OPVNNNNNNNNNNNNNNNNN9vNNNNNNNNNNNNNNNNNNNNN!#################### ; ; RESERVE DRIVE PARAMETER BLOCKS ; ;###############################################################nNNNNNNNNNNNNNNNNN9 yNNNNNNNNNNNNNNNNNNNNNN # DIRECTORY SECTORS CHECKED ; (DRM +1) / 4 DPBOFF DS 2 ;OFF- # RESERVED TRACKS (USUALLY 2) ; ; ADDITIONAL CP/M 3.0 DATˮNNNNNNNNNNNNNNNN92NNNNNNNNNNNNNNNNNNNNNN@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; GENERATE THE DPB FOR DRIVE MACRO ; ;@@@@@@@@NNNNNNNNNNNNNNNN9gNNNNNNNNNNNNNNNNNNNNN!********************************************** ;* * ;* THE READ ENTRY POINT [rNNNNNNNNNNNNNNNNN9wNNNNNNNNNNNNNNNNNNNNNNAKES THE PLACE OF THE PREVIOUS BIOS DEFINTION ; FOR WRITE. ; ENTRY- C= WRITE TYPE: ; 0: WRITE TO ALLOCATED BLOCK (UPDATE) E NNNNNNNNNNNNNNNN9"Q6NNNNNNNNNNNNNNNNNNNNNNUSY, FFH:READY ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ LISTST: IF USEMON CALL GO$NNNNNNNNNNNNNNNNN9(NNNNNNNNNNNNNNNNNNNNN!******************************** EDITOR: LD C,(HL) ;MESSAGE EDIT LOOP PUSH HL ;SAVE PTR RES 7,C ;CLEAR BIT 7 FOR OUTPUT O^!NNNNNNNNNNNNNNNN9.[NNNNNNNNNNNNNNNNNNNNNNTION IS CTRL-C THEN WARM BOOT ; CP A,3 ;IF CTRL-C THEN WARM BOOT JP Z,PAGE0 ; ; IF OPTION IS YES THEN WARM BOOT ; ALNNNNNNNNNNNNNNNNN9GNNNNNNNNNNNNNNNNNNNNN!############# ; STRUCT 0 DPBSPT DS 2 ;SPT- SECTORS/TRACK DPBBSH DS 1 ;BSH- BLOCK SHIFT FACTOR DETERMINED BY CLUSTER SIZE 4$NNNNNNNNNNNNNNNNN9 HNNNNNNNNNNNNNNNNNNNNNNA (ALSO COULD BE USED BY CP/M 2.2 DEBLOCKING) ; DPBPSH DS 1 ;PSH- PHYSICAL RECORD SHIFT FACTOR BASED ON BYTES/SEC ; 0: 128ANNNNNNNNNNNNNNNNN9NNNNNNNNNNNNNNNNNNNNNN@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ALLDPB: MACRO #D LIST ON D#D(DD)DPB: DS DPBSZ ;ALLO%NNNNNNNNNNNNNNN9VNNNNNNNNNNNNNNNNNNNNNNTAKES THE PLACE OF * ;* THE PREVIOUS BIOS DEFINTION FOR READ. * ;* !NNNNNNNNNNNNNNNNN9DNNNNNNNNNNNNNNNNNNNNN!; 1: WRITE TO DIRECTORY BLOCK (ALLWAYS WRITE) ; 2: WRITE TO UNALLOCATED BLOCK (NO NEED TO PRE-READ) ; ;******************I'NNNNNNNNNNNNNNNNN9#bNNNNNNNNNNNNNNNNNNNNNNETMON JP 0F827H ELSE IN A,(CENTS) ;IF BUSY THEN RETURN 0 CPL ;INVERT THE SENSE AND A,1 SHL CENTBSY RET Z LD 2BNNNNNNNNNNNNNNNN9)NNNNNNNNNNNNNNNNNNNNNN CALL COC ; POP HL BIT 7,(HL) ;IF BIT 7 SET THEN RETURN RET NZ ; INC HL ;ELSE PRINT NEXT CHAR JR EDITOR IF I#`NNNNNNNNNNNNNNNNN9/'jNNNNNNNNNNNNNNNNNNNNN!ND A,5FH ;IGNORE CASE ; CP A,'Y' JP Z,PAGE0 ; ; IF OPTION IS INTERRUPT THEN EXECUTE RESTART 7 ; CP A,'I' JR NZ,ITMNNNNNNNNNNNNNNNNNN9NNNNNNNNNNNNNNNNNNNNNN ; 1K= 3, 2K= 4, 4K= 5, 8K= 6, 16K= 7 DPBBLM DS 1 ;BLM- BLOCK MASK ; 1K = 7, 2K= 15, 4K= 31, 8K= 63, 16K= 127 DPBEXM DS 1NNNNNNNNNNNNNNNNN9 tNNNNNNNNNNNNNNNNNNNNNN, 1: 256, 2: 512, 3: 1024 DPBPHM DS 1 ;PHM- PHYSICAL RECORD MASK BASED ON BYTES/SEC ; 0: 128, 1: 256, 3: 512, 7: 1024 ; ;SfNNNNNNNNNNNNNNNNN9TNNNNNNNNNNNNNNNNNNNNNNCATION FOR DRIVE #D(DD) LIST OFF ENDM ; ; RESERVE THE DATA SPACE ; DD DL 1 REPT NDRVS LIST OFF ALLDPB 0123456789 NNNNNNNNNNNNNNNN9hNNNNNNNNNNNNNNNNNNNNNN * ;* READ THE SELECTED CP/M SECTOR * ;***************************************************** READ: ; ; SET UP D,>NNNNNNNNNNNNNNNNN9NNNNNNNNNNNNNNNNNNNNNN********************************************************** WRITE: ; ; SET PTR TO DISK DATA ; PUSH IX LD IX,(CUR_DPB) NNNNNNNNNNNNNNNNNN9$NNNNNNNNNNNNNNNNNNNNNNA,0FFH ;ELSE RETURN -1 RET ENDIF ;**************************************************************************** ; ;NNNNNNNNNNNNNNNN9*؟NNNNNNNNNNNNNNNNNNNNN!NTRPTS SUBTTL INTERRUPTS ;---------------------------------------------------------------------------- ; ; USER INTERRUPT `pNNNNNNNNNNNNNNNN904'NNNNNNNNNNNNNNNNNNNNNNRAP1 ; POP BC ;RESTORE REGS 1ST POP HL POP AF JP 0038H ; ; IF OPTION IS MONITOR THEN EXECUTE MONITOR TRAP ; ITRANNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN^NNNNNNNρl:օsA܉xF㍱N鑷T"𕾖Y'š_-Ȟd2̢h5ѦNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN:oNNNNNNNNNNNNNNNNNNNNN!P1: CP A,'M' JR NZ,ITRAPR ; POP BC POP HL POP AF JP 0F824H ; ; ELSE RESTORE REGS & RETURN ; ITRAPR: LD A,(ROMNNNNNNNNNNNNNNNN:NNNNNNNNNNNNNNNNNNNNNN#################### SDTRAN: GXLATE 26,6 ; DB 1,7,13,19,25,5,11,17,23,3,9,15 ; DB 21,2,8,14,20,26,6,12,18,24,4,10 ; DB 16,]DNNNNNNNNNNNNNNNNNN: NNNNNNNNNNNNNNNNNNNNNNDS 1 ;TRK 0 SECTORS PER TRK DVR0SZ DS 1 ;TRK 0 SECTOR SIZE DVR1SPT DS 1 DVR1SZ DS 1 DVRDSPT DS 1 DVRDSZ DS 1 DVRSIZ DS 0 bNNNNNNNNNNNNNNNN:~NNNNNNNNNNNNNNNNNNNNNN,1 ALLDRV HDEXEC,5,60H,64,1,64,1,64,1 ALLDRV HDEXEC,5,60H,64,1,64,1,64,1 ALLDRV FD5EXEC,8,0,16,0,16,0,16,0 ALLDRV FD5EXErNNNNNNNNNNNNNNNN:$NNNNNNNNNNNNNNNNNNNNNNDB 3 ;BLOCK SHIFT FACTOR DB 7 ;BLOCK MASK DB 0 ;NULL MASK DW 242 ;DISK SIZE -1 DW 63 ;DIRECTORY MAX DB 11000000B 5NNNNNNNNNNNNNNNN:NNNNNNNNNNNNNNNNNNNNNN DW 3 ;TRACK OFFSET ; ; DEFAULT DISK PHYSICAL PARAMETERS ; DB 0 ;FLAGS DB 16,0,16,0,16,0 ;SECTORS PER TRACK, SECTORNNNNNNNNNNNNNNNNN:%dMNNNNNNNNNNNNNNNNNNNNNN;64 SPT, 256 BPS ;############################################################################ ; ; MODE 2 INTERRUPT VECTOv7INNNNNNNNNNNNNNNNN:+GBNNNNNNNNNNNNNNNNNNNNNNSCMSG: DM CR,LF,'ILL SYS CALL',CR,LF ENDIF IF INTRPTS ITMSG DM CR,LF,'User' ILLIM DM CR,LF,'Ill.' IQMSG DM ' Int. Abo%NNNNNNNNNNNNNNNNNN:9NNNNNNNNNNNNNNNN;RNNNNNNNNNNNNNNNNNNNNN!0) + '0' DD DL DD % 10000 ENDIF IF DD > 999 DB (DD / 1000) + '0' DD DL DD % 1000 ENDIF DB (DD / 100) + '0' DjINNNNNNNNNNNNNNNNN;NNNNNNNNNNNNNNNNNNNNNNPERFORM DISK READ JP DISKWR ;PERFORM DISK WRITE JP LISTST ;RETURN LIST STATUS JP SECTRN ;TRANSLATE SECTOR JP BIOFUNC NNNNNNNNNNNNNNNN;%NNNNNNNNNNNNNNNNNNNNNN##################### ; ; DIRECTORY SECTOR BUFFER STARTS HERE AFTER CRUNCHING COLD START ; CODE. THIS BUFFER IS USED BY THE oHNNNNNNNNNNNNNNNNN;+1NNNNNNNNNNNNNNNNNNNNNN,A ; ; INIT DEBLOCKING DATA ; XOR A,A ;ASSUME NO DATA IN BUFFER LD (HST_ACT),A ; LD (UNA_CNT),A ;CLEAR UNALLOCATED WNNNNNNNNNNNNNNNN;NNNNNNNNNNNNNNNNNNNNNN======================== LIST OFF *INCLUDE JDDCONT.DEF *INCLUDE COMIOPB.DEF *INCLUDE DISKS.DEF *INCLUDE MONBOARD.DEF *INC3$NNNNNNNNNNNNNNNNN;bCNNNNNNNNNNNNNNNNNNNNNN 0 LOCATIONS ; PAGE0: EQU 0 ;START OF CP/M RAM IOBYTE: EQU PAGE0 + 3 ;IOBYTE ADDR DEFDRV: EQU PAGE0 + 4 ;DEFAULT DRIVE PARANNNNNNNNNNNNNNNN;NNNNNNNNNNNNNNNNNNNNNNPY ND8FD EQU 5 ;LAST LOGICAL DRIVE OF 8" FLOPPY ENDIF IF BOOT = 3 ; ; 8" FLOPPY BOOT DATA ; STHD EQU 2 ;START LNNNNNNNNNNNNNNNN;$]NNNNNNNNNNNNNNNNNNNNNN LIST OFF NXTSEC DL 1 ;;START WITH SECTOR 1 LOWEST DL 1 ;; REPT #SECTORS LIST ON DB NXTSEC LIST OFF NXTSEC DL NXTSINNNNNNNNNNNNNNNN;RNNNNNNNNNNNNNNNNNNNNNNB '.' DB ((DD % 100) / 10) + '0' DB (DD % 10) + '0' ENDM SUBTTL BIOS CODE ORG BIOS ;-----------------------------ʄrNNNNNNNNNNNNNNNNN; NNNNNNNNNNNNNNNNNNNNN! ;EXECUTE FUNCTION CALL ;############################################################################ ; ; THESE BOOT PARA =NNNNNNNNNNNNNNNNN;&GNNNNNNNNNNNNNNNNNNNNN!CP/M DIRECTORY CHECK ROUTINES THAT ; CHECK FOR DISK CHANGE. ; ;#############################################################+NNNNNNNNNNNNNNNN;,aNNNNNNNNNNNNNNNNNNNNNNSECTOR COUNT ; ; SEND SYSTEM SIGN-ON ; CLOGO: LD HL,MSGSO CALL EDITOR ; ; MODIFY COLD START VECTOR TO WARM START ; 4NNNNNNNNNNNNNNNN;NNNNNNNNNNNNNNNNNNNNNNLUDE ZMONROM.DEF *INCLUDE DKBTROM.DEF *INCLUDE NAKEDT.DEF *INCLUDE ISHA.DEF *INCLUDE CLOKROM.DEF LIST ON ;===========& NNNNNNNNNNNNNNNNN; QrNNNNNNNNNNNNNNNNNNNNNNM ADDR BDOSJV EQU PAGE0 + 5 ;BDOS SYSTEM CALL ENTRY DEFBFR EQU PAGE0 + 80H ;DEFAULT BUFFER ; ; BIOS FUNCTION CALL RESTART f'NNNNNNNNNNNNNNNNN;NNNNNNNNNNNNNNNNNNNNNNOGICAL DRIVE OF HARD DISK NDHD EQU 5 ;LAST LOGICAL DRIVE OF HARD DISK ST8FD EQU 0 ;START LOGICAL DRIVE OF 8" FLOPPY ND8FD EBNNNNNNNNNNNNNNNN;lNNNNNNNNNNNNNNNNNNNNN!EC + #SKEW ;ADD SKEW FACTOR ;; IF NXTSEC > #SECTORS ;CHECK FOR OVERFLOW NXTSEC DL NXTSEC - #SECTORS ;; IF NXTSEC <= LNNNNNNNNNNNNNNNNNN;4cNNNNNNNNNNNNNNNNNNNNN!----------------------------------------------- ; ; BIOS JUMP VECTOR TABLE ; ;--------------------------------------------'NNNNNNNNNNNNNNNNN;!=NNNNNNNNNNNNNNNNNNNNN!MS MUST RESIDE AS DEFINED RIGHT BEFORE THE COLD INIT ; ROUTINE START AND MUST BE IN THE 1ST SECTOR. THESE 2 WORDS ARE REFERENC=NNNNNNNNNNNNNNNNN;'tNNNNNNNNNNNNNNNNNNNNNN############### DIRBF: EQU $ ;BUFFER BEGINNING ;-------------------------------------------------------------------------NNNNNNNNNNNNNNNN;-PNNNNNNNNNNNNNNNNNNNNNN LD HL,(BIOS+4) LD (BIOS+1),HL ; ; BOOT CCP & BDOS ; JR WARM ;###################################################9NNNNNNNNNNNNNNNN;'.NNNNNNNNNNNNNNNNNNNNNN================================================================= ; ; DISK OPERATING SYSTEM ADDRESSES ; ;=================aNNNNNNNNNNNNNNNN; !NNNNNNNNNNNNNNNNNNNNNNVECTOR ; BFUNRST EQU 28H BFUNRSV EQU PAGE0 + BFUNRST BFUNRSI EQU 0C7H + BFUNRST ; TPA: EQU 100H ;====================-NNNNNNNNNNNNNNNNN;NNNNNNNNNNNNNNNNNNNNN!QU 1 ;LAST LOGICAL DRIVE OF 8" FLOPPY ENDIF ;=========================================================================pNNNNNNNNNNNNNNNN;B?NNNNNNNNNNNNNNNNNNNNNNOWEST ;CHECK FOR REPEAT NXTSEC DL LOWEST + 1 LOWEST DL NXTSEC ENDIF ENDIF ;; ENDM LIST ON ENDM ;@@@@@@@@@@NNNNNNNNNNNNNNNNN;NNNNNNNNNNNNNNNNNNNNNN-------------------------------- JP INIT1 ;COLD START ENTRY JP WARM ;RELOAD CCP/BDOS JP CNSCK ;GET CONSOLE STATUS JP >NNNNNNNNNNNNNNNN;"nNNNNNNNNNNNNNNNNNNNNNNED ; BY THE BOOT CODE IN ORDER TO FIND THE LOAD ADDRESS FOR THE BIOS & IT'S ; LENGTH. ; ;#################################b NNNNNNNNNNNNNNNNN;(dNNNNNNNNNNNNNNNNNNNNNN--- ; ; INIT - COLD START ENTRY FROM BOOT MUST SET ALL BIOS PARAMS ; ;--------------------------------------------------5 NNNNNNNNNNNNNNNNN;.NNNNNNNNNNNNNNNNNNNNN!######################### ; ; SIGN-ON MESSAGE ; ;###########################################################################GNNNNNNNNNNNNNNNNN;NNNNNNNNNNNNNNNNNNNNNN=========================================================== OP_SYS EQU 2 ;CP/M VERSION ; NKSYS: EQU 60 ;SYSTEM SIZE IN K BY8NNNNNNNNNNNNNNNNN; 7NNNNNNNNNNNNNNNNNNNNNN======================================================== ; ; OTHER DECLARATIONS ; ;=========================================p NNNNNNNNNNNNNNNNN;ۨNNNNNNNNNNNNNNNNNNNNNN=== ; ; ASCII CHARS ; ;============================================================================ LF: EQU 0AH CR: EQU 0D?NNNNNNNNNNNNNNNN;qNNNNNNNNNNNNNNNNNNNNNN@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; INITIALIZE VERSION TEXT IN RAM MACRO ; ;@@@@@@@@@@@@@9NNNNNNNNNNNNNNNN;NNNNNNNNNNNNNNNNNNNNNNCI ;CONSOLE INPUT JP COC ;CONSOLE OUTPUT JP LO ;PRINTER OUTPUT JP PUNCH JP READER JP HOME ;HOME SELECTED DRIVE Jf|NNNNNNNNNNNNNNNNNN;#_NNNNNNNNNNNNNNNNNNNNNN########################################### BIOSSZ: DW BIOSND - BIOS ;BIOS MODULE SIZE IN BYTES BIOSST: DW BIOS ;BIOS MODULE NNNNNNNNNNNNNNNNN;)WNNNNNNNNNNNNNNNNNNNNN!-------------------------- INIT: ; ; SET TEMPORARY STACK ; LD SP,DEFBFR ;USE PAGE 0 FOR STACK ; ; MAKE SURE ROM IS EbINNNNNNNNNNNNNNNNN;/2NNNNNNNNNNNNNNNNNNNNNN# MSGSO: DB CR,LF DB CPMSZ / (KBYTE * 10) + '0' DB (CPMSZ MOD (KBYTE * 10)) / KBYTE + '0' DB 'K CP/M-80 Vers 2.2',CR,LF yNNNNNNNNNNNNNNNN;ALNNNNNNNNNNNNNNNNNNNNN!TES KBYTE: EQU 1024 CPMSZ: EQU KBYTE * NKSYS CPMBS: EQU CPMSZ - (20 * KBYTE) ; CP/M BIAS VALUE CCP: EQU CPMBS + 3400H ;ADDR !NNNNNNNNNNNNNNNN; NNNNNNNNNNNNNNNNNNNNNN=================================== SECSZ: EQU 128 NDRVS: EQU 6 IF BOOT = 10H ; ; 8" HARD DISK BOOT DATA ; STHD EQU ONNNNNNNNNNNNNNNNNN;NNNNNNNNNNNNNNNNNNNNNNH CTRLZ: EQU 1AH ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; GENERATE THE TRANSLAT7!NNNNNNNNNNNNNNNNN;a0NNNNNNNNNNNNNNNNNNNNN!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ PVERS MACRO #VERS DD DL #VERS IF DD > 9999 DB (DD / 1000.NNNNNNNNNNNNNNNN;˖NNNNNNNNNNNNNNNNNNNNNNP SELDSK ;SELECT DISK DRIVE JP SETTRK ;SET TRACK # JP SETSEC ;SET SECTOR # JP SETDMA ;SET TRANSFER ADDR JP DISKRD ;jNNNNNNNNNNNNNNNNN;$!NNNNNNNNNNNNNNNNNNNNNNLOAD ADDR FOR SBD ; ; CONTINUE ON WITH INIT ; INIT1: JR INIT ;#######################################################ONNNNNNNNNNNNNNNNN;*NNNNNNNNNNNNNNNNNNNNNNNABLED ; CALL GETMON ; ; INIT DEFAULT DRIVE ; LD A,(DK_PROM + 1) ;USE DRIVE # PASSED IN PAGE 0 AND A,3 LD (DEFDRV)J NNNNNNNNNNNNNNNNN;0NNNNNNNNNNNNNNNNNNNNNN DB 'M5b CBIOS Vers ' PVERS VERSN DM CR,LF IF $ > (DIRBF + SECSZ) CONMSG **** WARNING! COLD INIT CODE BIGGER jINNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN8NNNŃg5хm;Չp= ٍtBߑ{H䕱M陷S 흺V#[)ŦNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN;NNNNNNNNNNNNNNNNNNNNNNTHAN DIR BUFFER **** ELSE DS DIRBF+SECSZ-$ ;FILL OUT DIRECTORY BUFFER TO 1 SECTOR SIZE ENDIF ;-------------------"NNNNNNNNNNNNNNNNN;EMNNNNNNNNNNNNNNNNNNNNNNISHA HOST ADAPTER FOR A HUNG CONDITION AND CLEAR IF TRUE ; IN A,(ISH_STATUS) ;IF HOST ADAPTER BUSY THEN BIT ISH_BSYB,A JRMNNNNNNNNNNNNNNNN; NNNNNNNNNNNNNNNNNNNNNNOS TRK/SECTOR PUSH HL ; LD HL,(DEFBFR + BD_SCCPS) ;FETCH CCP TRK/SECTOR LD C,L LD B,0 CALL SETSEC ; LD C,H CALL δBNNNNNNNNNNNNNNNN;NNNNNNNNNNNNNNNNNNNNN! RDBDOS: POP HL ;RESTORE BDOS TRK/SECTOR FROM DIRECTORY LD C,L LD B,A ;A STILL CONTAINS 0 CALL SETSEC ; LD C,H CALL~NNNNNNNNNNNNNNNN;e1NNNNNNNNNNNNNNNNNNNNNNHL ; ; NOW PUT INTERCEPT VECTOR INTO BDOS CODE ; LD HL,INTCPT LD (BDOS + 7),HL ; ; INITIALIZE CLOCK VECTORS IF CLOC#NNNNNNNNNNNNNNNNN;ϗNNNNNNNNNNNNNNNNNNNNNNE= 0 IF NEW SELECT ; EXIT - HL= PTR TO DPT OR 0 FOR ERROR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++^NNNNNNNNNNNNNNNN;%%NNNNNNNNNNNNNNNNNNNNNNCUR_WR),HL ; LD L,(IX+ DPHRDO) LD H,(IX+ DPHRDO +1) LD (CUR_RD),HL ; LD L,(IX+ DPHSOFO) LD H,(IX+ DPHSOFO +1) LD (HNNNNNNNNNNNNNNNNN;+NNNNNNNNNNNNNNNNNNNNNNFER ID SECTOR DATA TO TABLES ; LD HL,DEFBFR + ID_SPTO ; ; XFER DISK DATA TO DPB ; LG_XDPB: LD DE,(CUR_DPB) ;GET ADDNNNNNNNNNNNNNNNN;NNNNNNNNNNNNNNNNNNNNNN--------------------------------------- ; ; WARM REBOOT ENTRY LOADS CCP,BDOS FROM DISK & ; SETS UP VARIABLES ; ;-----------'NNNNNNNNNNNNNNNNN;UsNNNNNNNNNNNNNNNNNNNNNN Z,NTHUNG ; LD A,PB_CLRC LD (IOPB + PB_CMDO),A CALL XPRIM ; NTHUNG: ENDIF ; ; LOG ON DRIVE TO INIT TABLES ; WNNNNNNNNNNNNNNNN;NNNNNNNNNNNNNNNNNNNNN!SETTRK ; LD BC,CCP CALL SETDMA ; ; READ CCP/BDOS ; WREAD: CALL DISKRD JR NZ,WEROR ;IF ERROR THEN EXIT ; ; NEXT ADNNNNNNNNNNNNNNNN;mNNNNNNNNNNNNNNNNNNNNN! SETTRK ; JR WREAD ; ; ; WARM BOOT ERROR, OUTPUT MSG & HALT ; WEROR: LD HL,MSGLE ;OUTPUT ERROR MESSAGE CALL EDITOR V9NNNNNNNNNNNNNNNN;0bNNNNNNNNNNNNNNNNNNNNN!K INSTALLED ; LD C,CLK_F7 ;TEST FOR BOARD PRESENT CALL CLK1 ; ; IF CLOCK PRESENT THEN TURN ON CLOCK DRIVE ; OR A,A ydNNNNNNNNNNNNNNNNN; 3 THEN SET TO 0 (NO DEBLOCK) ; DEC HL ;SKEW DEC HL ;PHM DEC HL ;PSH LNNNNNNNNNNNNNNNN;NNNNNNNNNNNNNNNNNNNNN!----------------------------------------------- WARM: IF INTRPTS ; ; SET INTERRUPT VECTOR TABLE BASE ; LD A,HIGH INTA!NNNNNNNNNNNNNNNN; fBNNNNNNNNNNNNNNNNNNNNNNLD A,(DK_PROM + 1) AND A,3 ;MODULO 4 LD C,A LD E,0 CALL SELDSK LD A,L ;IF ERROR THEN ABORT OR A,H JR Z,WEROR ; v NNNNNNNNNNNNNNNNN;NNNNNNNNNNNNNNNNNNNNNNSECTOR ; LD HL,(SEK_SEC) INC HL LD (SEK_SEC),HL ; LD DE,SECSZ ;DMA := DMA + SECTOR SIZE LD HL,(DMA_ADR) ADD HL,DE UNNNNNNNNNNNNNNNN; \NNNNNNNNNNNNNNNNNNNNN! HALT ; ; ; BOOT OK, INIT PAGE 0 ; WZRPG: ; ; INIT BIOS WARM START IN PAGE 0 ; LD A,0C3H LD HL,BIOS + 3 LD (PAtNNNNNNNNNNNNNNNNN;SNNNNNNNNNNNNNNNNNNNNNN LD A,38H ;COND. JR (ON) JR NZ,CLKON ; ; ELSE TURN OFF CLOCK DRIVE ; LD A,18H ;UNCOND. JR (OFF) (CAUSES JUMP TO ILLEG#'NNNNNNNNNNNNNNNNN;! NNNNNNNNNNNNNNNNNNNNN! CP A,NDRVS RET NC ; ; STORE DRIVE # FOR FUTURE USE ; LD (SEK_DSK),A ; ; LOOK UP DRIVE IN TABLES ; ADD A,A L\NNNNNNNNNNNNNNNNN;'CNNNNNNNNNNNNNNNNNNNNNN ; LD A,E LD (LOGRQ),A ; ; FETCH DISK PARAMETER HEADER TABLE ADDRESS ; LD HL,(CUR_DPH) ; ; IF NOT FIRST SELECT ORjINNNNNNNNNNNNNNNN;-`NNNNNNNNNNNNNNNNNNNNNND A,(HL) CP A,4 JR C,PSHOK ; LD (HL),0 ;PSH = 0 INC HL ;PHM = 0 LD (HL),0 INC HL ;SKEW = 0 LD (HL),0 JR DPBS']NNNNNNNNNNNNNNNN;NNNNNNNNNNNNNNNNNNNNNNBL LD I,A ; ; SET INTERRUPT MODE TO 2 ; IM 2 ; ; ENABLE INTERRUPT VECTOR 7 ; IN A,(M2_IMASK) AND A,7FH OUT (NNNNNNNNNNNNNNNNNN; 3NNNNNNNNNNNNNNNNNNNNNN ; READ BOOT DIRECTORY ; LD BC,DEFBFR ;SET XFER ADDRESS (USE DEFAULT BUFFER) CALL SETDMA ; LD BC,BD_SEC ;SET DIRECTO" NNNNNNNNNNNNNNNNN;ߩNNNNNNNNNNNNNNNNNNNNNN LD (DMA_ADR),HL ; ; IF NOT INTO BDOS THEN READ NEXT SECTOR ; LD DE,BDOS XOR A,A SBC HL,DE JR C,WREAD ; ; ELSEBNNNNNNNNNNNNNNNN;uNNNNNNNNNNNNNNNNNNNNNNGE0),A LD (PAGE0 + 1),HL ; ; INIT BDOS CALL VECTOR IN PAGE 0 ; LD HL,BDOS + 6 LD (BDOSJV),A LD (BDOSJV + 1),HL ; nNNNNNNNNNNNNNNNNN;NNNNNNNNNNNNNNNNNNNNNNAL) ; CLKON: LD (INHCLK),A ; ENDIF ; ; PASS DEFAULT DISK TO CCP ; LD A,(DEFDRV) LD C,A JP CCP IF P_DISKrNNNNNNNNNNNNNNNN;"^NNNNNNNNNNNNNNNNNNNNNND HL,DRV_PTRS ADD A,L LD L,A LD A,0 ADC A,H LD H,A LD A,(HL) INC HL LD H,(HL) LD L,A LD (CUR_DPH),HL ; ; ONNNNNNNNNNNNNNNNN;(SNNNNNNNNNNNNNNNNNNNNNN LOGON INHIBITED THEN RETURN TABLE PTR ; CPL AND A,1 RET Z ; ; ELSE LOG ON DRIVE ; ; ATTEMPT TO READ ID SECTOR ;ӽNNNNNNNNNNNNNNNNN;.3NNNNNNNNNNNNNNNNNNNNNNET ; PSHOK: ; FETCH SKEW INDEX ; INC HL ;PHM INC HL ;SKEW ; DPBSET: LD A,(HL) ; ; CALCULATE SKEW TABLE TO USE ?HNNNNNNNNNNNNNNNNN;#/NNNNNNNNNNNNNNNNNNNNNNM2_IMASK),A ; ; FINALLY ENABLE VECTORED INTERRUPTS ; IN A,(M2_STAT) OR A,M2_IEN OUT (M2_STAT),A EI ENDIF ; ; ߶NNNNNNNNNNNNNNNNN; NNNNNNNNNNNNNNNNNNNNN!RY SECTOR CALL SETSEC ; LD BC,0 ;SET TRACK TO 0 CALL SETTRK ; CALL DISKRD JR NZ,WEROR ; ; CHECK FOR VALID BOOT CNNNNNNNNNNNNNNNNN;NNNNNNNNNNNNNNNNNNNNN! IF AT BEGINNING OF BDOS THEN SET UP NEW TRACK & SECTOR ; JR Z,RDBDOS ; ; ELSE IF NOT AT BIOS THEN READ NEXT SECTOR ; TNNNNNNNNNNNNNNNN;F>NNNNNNNNNNNNNNNNNNNNNN; INIT BIOS CALL VECTOR IN PAGE 0 ; LD HL,BIOFUNC LD (BFUNRSV),A LD (BFUNRSV + 1),HL ; ; SET DEFAULT SECTOR BUFFER NNNNNNNNNNNNNNNN;NNNNNNNNNNNNNNNNNNNNNN OR P_ALL LIST ON ELSE LIST OFF ENDIF SUBTTL BIOS DISK FUNCTION ROUTINES ;+++++++++++++++++++++++++++++++++++++++_ LAST THEN NONE ; LG_X1: CP A,4 JR C,LG_NOX ; ; ELSE IF SKEW == 1 THEN IBM 3740 FORMAT ; LD HL,X3740 CP A,2 JR CNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNnNNNNNNNсl:Յr@܉xE}K瑵P땸S!Z'Þ_-ʢe3ϦNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN<NNNNNNNNNNNNNNNNNNNNNNC,LG_X ; ; ELSE IF SKEW == 2 THEN IBM 3740 DOUBLE SIDED ; LD HL,X3740D JR Z,LG_X ; ; ELSE IF SKEW == 3 THEN CCS SIN13NNNNNNNNNNNNNNNNN<#PNNNNNNNNNNNNNNNNNNNNNNK 0 ; EXIT - BC= 0 ; ;**************************************************************************** HOME: ; ; IF PENDING 04NNNNNNNNNNNNNNNN< ̛NNNNNNNNNNNNNNNNNNNNNN***************************************** ; ; SET TRANSFER ADDR ; ENTRY- BC= ADDRESS ; EXIT - A= 0 ; ;********************(NNNNNNNNNNNNNNNN<NNNNNNNNNNNNNNNNNNNNNN******************************************* DISKRD: ; ; IF SECTOR SIZE == 128 THEN USE UNBLOCKED ROUTINES & SAVE BUFFER ; ƊNNNNNNNNNNNNNNNN<,NNNNNNNNNNNNNNNNNNNNN! TO DIRECTORY BLOCK (ALLWAYS WRITE) WR_UAL EQU 2 ;WRITE TO UNALLOCATED BLOCK (NO NEED TO PRE-READ) ; ;***********************qNNNNNNNNNNNNNNNNN<NNNNNNNNNNNNNNNNNNNNNN ; LD A,(SEK_DSK) LD (UNA_DSK),A ; ; SET TRACK TO SEEK ; LD HL,(SEK_TRK) LD (UNA_TRK),HL ; ; SET SECTOR TO SEE=9NNNNNNNNNNNNNNNN<%CNNNNNNNNNNNNNNNNNNNNNN THEN USE 1ST SECTOR OF NEXT TRACK ; LD E,(IX+ DPBSPTO) LD D,(IX+ DPBSPTO +1) SBC HL,DE JP C,NOOVF ; LD HL,0 ;SECTOcbNNNNNNNNNNNNNNNNN<+`NNNNNNNNNNNNNNNNNNNNN!28 JR Z,NOSECSHF ; SECSHFLP: SRL B ;ELSE SHIFT OVER TO PHYSICAL SECTOR RR C DEC A JR NZ,SECSHFLP ; NOSECSHF: L-NNNNNNNNNNNNNNNNNN<ܥNNNNNNNNNNNNNNNNNNNNN!GLE SIDED ; LD HL,XCCS CP A,4 JR C,LG_X ; ; ELSE IF SKEW == 4 THEN CCS DOUBLE SIDED ; LD HL,XCCSD JR LG_X ; ; MNNNNNNNNNNNNNNNNN<3nNNNNNNNNNNNNNNNNNNNNNNWRITE (BUFFER DIRTY) THEN IGNORE ; LD A,(HST_WRT) OR A,A RET NZ ; ; ELSE PURGE BUFFER ; LD (HST_ACT),A RET *NNNNNNNNNNNNNNNN<NNNNNNNNNNNNNNNNNNNNNN******************************************************** SETDMA: LD (DMA_ADR),BC XOR A,A LD (DMA_BNK),A RET ;+++++++UNNNNNNNNNNNNNNNN<upNNNNNNNNNNNNNNNNNNNNNN LD HL,(CUR_DPB) LD DE,DPBPSHO ADD HL,DE LD A,(HL) OR A,A JP Z,UB_READ ; ; SET UP DATA TABLE PTR ; PUSH IX LNNNNNNNNNNNNNNNN<VNNNNNNNNNNNNNNNNNNNNNN***************************************************** DISKWR: ; ; IF SECTOR SIZE == 128 THEN USE UNBLOCKED ROUTINES ; LD1NNNNNNNNNNNNNNNNN< !NNNNNNNNNNNNNNNNNNNNN!K ; LD HL,(SEK_SEC) LD (UNA_SEC),HL ; ; IF NO UNALLOCATED SECTORS REMAIN THEN PREREAD ; CHKUNA: LD A,(UNA_CNT) OR AM!NNNNNNNNNNNNNNNN<&NNNNNNNNNNNNNNNNNNNNNNR = #1 LD (UNA_SEC),HL ; LD HL,(UNA_TRK) ;TRACK++ INC HL LD (UNA_TRK),HL ; NOOVF: ; ; MATCH FOUND, MARK AS UNNECEBNNNNNNNNNNNNNNNN<,LNNNNNNNNNNNNNNNNNNNNN!D (SEK_HST),BC ;BUFFER SECTOR TO SEEK ; ; IF BUFFER EMPTY THEN READ THE PHYSICAL SECTOR ; LD HL,HST_ACT LD A,(HL) ; kNNNNNNNNNNNNNNNN<NNNNNNNNNNNNNNNNNNNNNN ; RETURN DRIVE TABLE PTR ; LG_DONE: LD HL,(CUR_DPH) XOR A,A RET ; ; ; SELECT DEFAULT DPB FROM TABLES BASED ON DR $NNNNNNNNNNNNNNNNN< _NNNNNNNNNNNNNNNNNNNNNN;**************************************************************************** ; ; SET TRACK # ; ENTRY- BC= TRACK # ; ;***** NNNNNNNNNNNNNNNNN<NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; SECTOR TRANSLATION BDOS FUNCTION DOES NOTHING IN DEB49NNNNNNNNNNNNNNNN<FANNNNNNNNNNNNNNNNNNNNNND IX,(CUR_DPB) ; ; READ_OPERATION_FLAG = TRUE (1) ; LD A,1 LD (READ_OP),A ; ; PRE-READ_OF_DATA_FLAG = TRUE ; LD pHNNNNNNNNNNNNNNNNN<eNNNNNNNNNNNNNNNNNNNNNN! HL,(CUR_DPB) LD DE,DPBPSHO ADD HL,DE LD A,(HL) OR A,A JP Z,UB_WRITE ; ; SET PTR TO DISK DATA ; PUSH IX LD IXNNNNNNNNNNNNNNNNN<!NNNNNNNNNNNNNNNNNNNNNN,A JP Z,ALLOC ; ; ELSE MORE UNALLOCATED RECORDS REMAIN, COUNT-- ; DEC A LD (UNA_CNT),A ; ; IF REQUESTED SECTOR !=nINNNNNNNNNNNNNNNNN<'%NNNNNNNNNNNNNNNNNNNNNNSSARY READ ; XOR A,A ;PREREAD FLAG = FALSE LD (RS_FLAG),A JP RWOPER ; ; ; NOT AN UNALLOCATED RECORD, REQUIRES PRE-RNNNNNNNNNNNNNNNN<-}NNNNNNNNNNNNNNNNNNNNNNLD (HL),1 ;BUFFER FULL IN ANY CASE ; OR A,A JP Z,FILHST ; ; HOST BUFFER ACTIVE, SAME AS SEEK BUFFER? ; LD A,(SEK_DS%9NNNNNNNNNNNNNNNN<vNNNNNNNNNNNNNNNNNNNNN!IVE TYPE ; LGDEF: LD HL,(CUR_DPH) DEC HL ;POINT TO DRIVE TYPE BYTE ; ; IF HARD DISK THEN USE HARD DISK TABLE ; LD A,ONNNNNNNNNNNNNNNNN< U NNNNNNNNNNNNNNNNNNNNNN*********************************************************************** SETTRK: LD (SEK_TRK),BC RET ;*****************jNNNNNNNNNNNNNNNNN<NNNNNNNNNNNNNNNNNNNNN!LOCKING MODE ; ENTRY- BC= SECTOR # TO XLATE ; EXIT - HL= BC ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.BNNNNNNNNNNNNNNNN<NNNNNNNNNNNNNNNNNNNNNN(RS_FLAG),A ; ; TREAT AS UNALLOCATED BLOCK ; LD A,WR_UAL LD (WR_TYPE),A ; JP RWOPER ;TO PERFORM THE READ ;****oNNNNNNNNNNNNNNNNN<NNNNNNNNNNNNNNNNNNNNNN,(CUR_DPB) ; ; READ_OP_FLAG = FALSE ; XOR A,A LD (READ_OP),A ; ; SAVE WRITE TYPE ; LD A,C LD (WR_TYPE),A ; ;wdNNNNNNNNNNNNNNNN<"CNNNNNNNNNNNNNNNNNNNNNN UNALLOCATED SECTOR THEN PURGE ; LD A,(SEK_DSK) ;SAME DISK? LD HL,UNA_DSK CP A,(HL) JP NZ,ALLOC ; LD HL,(UNA_TRK) ;SdNNNNNNNNNNNNNNNNN<(5NNNNNNNNNNNNNNNNNNNNN!EAD ; ALLOC: XOR A,A ;COUNT = 0 LD (UNA_CNT),A ; INC A ;PREREAD FLAG = TRUE LD (RS_FLAG),A ; ; ; ; COMMON COD|NNNNNNNNNNNNNNNNN<..NNNNNNNNNNNNNNNNNNNNN!K) LD HL,HST_DSK ;SAME DISK? CP A,(HL) JP NZ,NOMATCH ; LD HL,(HST_TRK) ;SAME TRACK? LD DE,(SEK_TRK) SBC HL,DE JP NNNNNNNNNNNNNNNNN<E2NNNNNNNNNNNNNNNNNNNNNN(HL) CP A,10H JR C,LG_DEFF ; LD HL,HDPBK JR LG_XDPB ; ; ; USE 8" FLOPPY DEFAULTS ; LG_DEFF: LD HL,SD8PBK JR NNNNNNNNNNNNNNNNN< f=NNNNNNNNNNNNNNNNNNNNNN*********************************************************** ; ; SET SECTOR ; ENTRY- BC= SECTOR # ; ;***********************TdNNNNNNNNNNNNNNNNN<NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++ SECTRN: LD H,B LD L,C RET ;*************************************************************************՛NNNNNNNNNNNNNNNN< #NNNNNNNNNNNNNNNNNNNNNN************************************************************************ ; ; THE WRITE ENTRY POINT TAKES THE PLACE OF THE PREVK9NNNNNNNNNNNNNNNN<NNNNNNNNNNNNNNNNNNNNN! IF 1ST WRITE TO UNALLOCATED (NEW, UNUSED) BLOCK THEN SET PARAMETERS ; CP A,WR_UAL JP NZ,CHKUNA ; ; COUNT = NUMBER_OFFNNNNNNNNNNNNNNNNNN<#rNNNNNNNNNNNNNNNNNNNNN!AME TRACK? LD DE,(SEK_TRK) SBC HL,DE JP NZ,ALLOC ; LD HL,(SEK_SEC) LD DE,(UNA_SEC) SBC HL,DE JP NZ,ALLOC ; ; NNNNNNNNNNNNNNNNN<)NNNNNNNNNNNNNNNNNNNNNNE FOR READ AND WRITE FOLLOWS ; RWOPER: ; ; ASSUME NO ERRORS ; XOR A,A LD (ER_FLAG),A ; ; COMPUTE BUFFER SECTOR ;NNNNNNNNNNNNNNNNN</NNNNNNNNNNNNNNNNNNNNN!NZ,NOMATCH ; LD DE,(SEK_HST) ;SAME SECTOR? LD HL,(HST_SEC) SBC HL,DE JP Z,MATCH ;SKIP IF MATCH ; NOMATCH: ; ; IFNNNNNNNNNNNNNNNN<aNNNNNNNNNNNNNNNNNNNNN!LG_XDPB ;**************************************************************************** ; ; HOME DRIVE - TREAT AS SEEK TRLNNNNNNNNNNNNNNNNN< NNNNNNNNNNNNNNNNNNNNNN***************************************************** SETSEC: LD (SEK_SEC),BC RET ;***********************************p0NNNNNNNNNNNNNNNNNN<NNNNNNNNNNNNNNNNNNNNNN*** ; ; THE READ FUNCTION READS THE REQUESTED SECTOR ; EXIT - A= 0: OK, /0: ERROR CODE ; ;*********************************(MNNNNNNNNNNNNNNNNN<0NNNNNNNNNNNNNNNNNNNNNNIOUS BIOS DEFINTION ; FOR WRITE. ; ENTRY- C= WRITE TYPE: WR_ALL EQU 0 ;WRITE TO ALLOCATED BLOCK (UPDATE) WR_DIR EQU 1 ;WRITE;NNNNNNNNNNNNNNNN<NNNNNNNNNNNNNNNNNNNNNN_SECTORS_IN_BLOCK ; LD A,(IX+ DPBBLMO) ;CUR_DPB.DPBBLM + 1 ::= (BLKSIZ/128) INC A LD (UNA_CNT),A ; ; SET DISK TO SEEK.HNNNNNNNNNNNNNNNNN<$pNNNNNNNNNNNNNNNNNNNNN!MATCH, MOVE TO NEXT SECTOR FOR FUTURE REF ; INC HL ;UNASEC = UNASEC+1 LD (UNA_SEC),HL ; ; IF PAST LAST SECTOR ON TRACKNNNNNNNNNNNNNNNNN<*SNNNNNNNNNNNNNNNNNNNNNN LD BC,(SEK_SEC) ; LD A,(IX+ DPBPSHO) ;USE PHYSICAL SHIFT FACTOR (CP/M 3.X) OR A,A ;IF ALREADY 0 THEN SECTOR SIZE IS 1= NNNNNNNNNNNNNNNNN<0RNNNNNNNNNNNNNNNNNNNNNN CURRENT BUFFER DIRTY THEN WRITE IT OUT BEFORE READING NEW ONE ; LD A,(HST_WRT) OR A,A CALL NZ,WRITEHST ;CLEAR HOST BUFF dINNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN8NNNN΁h5Ѕk9Ӊn;֍r@ܑxE{H䙲N靷T"𡽢X'æNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN<NNNNNNNNNNNNNNNNNNNNNN ; FILHST: ; ; READ THE SECTOR BUFFER ; LD A,(SEK_DSK) ;BUFFER SECTOR = PHYSICAL SECTOR LD (HST_DSK),A ; LD HL,(SEK_$NNNNNNNNNNNNNNNNN<`NNNNNNNNNNNNNNNNNNNNNN8 ;LENGTH OF MOVE ; LD A,(READ_OP) ;WHICH WAY? OR A,A JP NZ,RWMOVE ;SKIP IF READ ; ; WRITE OPERATION, MARK AND SWITCrNNNNNNNNNNNNNNNN< NNNNNNNNNNNNNNNNNNNNNN SUBTTL DISK SUPPORT ROUTINES ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; UNBLOCKED R+9NNNNNNNNNNNNNNNN<NNNNNNNNNNNNNNNNNNNNNNXFER ADDRESS TO DATA ; LD HL,(DMA_ADR) LD (IOPB + PB_DMAO),HL LD A,(DMA_BNK) LD (IOPB + PB_DMAXO),A ; ; EXECUTE THEUKNNNNNNNNNNNNNNNN<4NNNNNNNNNNNNNNNNNNNNNN(IOPB + PB_DMAXO),A ; ; SET DESCRIPTOR SECTOR SECTOR ; LD HL,ID_SECT LD (IOPB + PB_SECO),HL ; ; SET DESCRIPTOR SECTksNNNNNNNNNNNNNNNNN<NNNNNNNNNNNNNNNNNNNNNN_DMAXO),A ; LD A,PB_READC ;SELECT READ OP JP DISKOP ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++!BNNNNNNNNNNNNNNNN<%tNNNNNNNNNNNNNNNNNNNNN! EXIT - A= 0: OK; /0: ERROR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ DISKOP: ; ; SHNNNNNNNNNNNNNNNNN<+WNNNNNNNNNNNNNNNNNNNNNNWR: H8_RD: H8_WR: EX_IOPB ; ; EXECUTE DISK DRIVER ; DKOPLP: ; ; EXECUTE THE PRIMITIVE IN ROM ; PUSH IX LD IX,INNNNNNNNNNNNNNNN<NNNNNNNNNNNNNNNNNNNNNN_TRK) LD (HST_TRK),HL ; LD HL,(SEK_HST) LD (HST_SEC),HL ; ; IF REQUIRED TO READ THEN READ ; LD A,(RS_FLAG) ;NEED LHNNNNNNNNNNNNNNNNN<^NNNNNNNNNNNNNNNNNNNNNNH DIRECTION ; LD A,1 ;BUFFER = DIRTY LD (HST_WRT),A ; EX DE,HL ;SOURCE/DEST SWAP ; RWMOVE: ; ; BC INITIALLY 128,NNNNNNNNNNNNNNNN<NNNNNNNNNNNNNNNNNNNNN!EAD FUNCTION ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ UB_READ: ; ; SET COMMAND TO !NNNNNNNNNNNNNNNN<B@NNNNNNNNNNNNNNNNNNNNN! IOPB ; JP EX_IOPB ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; UNBLOCKED WRITE FNNNNNNNNNNNNNNNN<aONNNNNNNNNNNNNNNNNNNNNNOR TRACK ; LD L,H ;H == 0 FROM LAST OPERATION (HL= 0) LD (IOPB + PB_TRKO),HL ; ; PASS COMMAND TO EXECUTOR ; LD A,PB  NNNNNNNNNNNNNNNNN< NNNNNNNNNNNNNNNNNNNNNN+++++++++++ ; ; WRITE A DISK SECTOR FROM SECTOR DEBLOCKING BUFFER FUNCTION ; EXIT - A= 0: OK; /0: ERROR ; ;++++++++++++++++E?NNNNNNNNNNNNNNNN<&!NNNNNNNNNNNNNNNNNNNNNNET IOPB COMMAND ; LD (IOPB + PB_CMDO),A ; ; DRIVE ; LD A,(CUR_DRV) LD (IOPB + PB_DRVO),A ; ; TRACK ; LD HL,(H9NNNNNNNNNNNNNNNN<,|NNNNNNNNNNNNNNNNNNNNNNOPB ;PASS PTR TO IOPB LD HL,DK_DSKX ;PRIMITIVE ENTRY LD A,(DK_PROM) ;FETCH PROM # CALL EXROM ;EXECUTE THE PRIMITIVE POrNNNNNNNNNNNNNNNN<ؤNNNNNNNNNNNNNNNNNNNNNNTO READ? OR A,A CALL NZ,READHST ;YES, IF 1 ; ; BUFFER = CLEAN ; XOR A,A LD (HST_WRT),A ; MATCH: ; ; COPY DATY$NNNNNNNNNNNNNNNNN< 7oNNNNNNNNNNNNNNNNNNNNN! DE IS SOURCE, HL IS DEST ; LDIR ; ; DATA HAS BEEN MOVED TO/FROM HOST BUFFER, IF NOT DIRECTORY THEN DELAY WRITE ; LD A\ NNNNNNNNNNNNNNNNN<NNNNNNNNNNNNNNNNNNNNNNREAD ; LD A,PB_READC ; ; COMMON UNBUFFERED R/W ; UB_COMM: LD (IOPB + PB_CMDO),A ; ; SET DRIVE ; LD A,(CUR_DRV) NNNNNNNNNNNNNNNN<qqNNNNNNNNNNNNNNNNNNNNNNUNCTION ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ UB_WRITE: ; ; SET COMMAND TO WRITNNNNNNNNNNNNNNNNN<R~NNNNNNNNNNNNNNNNNNNNN!_LOGC LD (IOPB + PB_CMDO),A ; ; EXECUTE THE IOPB ; JP EX_IOPB ;+++++++++++++++++++++++++++++++++++++++++++++++++++HNNNNNNNNNNNNNNNNN<! NNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ WRITEHST: ; ; SET PTR TO EXECUTION ROUTINE ; LD HL,(CUR_WR)NNNNNNNNNNNNNNNNN<'NNNNNNNNNNNNNNNNNNNNNNST_TRK) LD (IOPB + PB_TRKO),HL ; ; SECTOR ; LD BC,(HST_SEC) ;XLATE POSSIBLE LD DE,(CUR_XLAT) CALL SEC_TRN ; LD +NNNNNNNNNNNNNNNN<-MNNNNNNNNNNNNNNNNNNNNNNP IX ; ; IF NO ERRORS THEN RETURN THE COMMAND RESULTS STATUS ; LD A,(IOPB + PB_STATO) OR A,A RET Z ; ; PRINT ERRONNNNNNNNNNNNNNNN<A3NNNNNNNNNNNNNNNNNNNNNNA TO OR FROM BUFFER ; LD HL,(SEK_SEC) ;CALCULATE INDEX INTO BUFFER LD A,L ; AND A,(IX+ DPBPHMO) ;USE PHYSICAL RECORD MASj!NNNNNNNNNNNNNNNN< b -> BITS <14..8> LD H,A ; LD A,0 ;BIT 0 -> BIT 7 RRA LD L,A ; ; HL HAS RE6NNNNNNNNNNNNNNNNN< Q NNNNNNNNNNNNNNNNNNNNNN ERROR THEN ABORT ; OR A,A RET NZ ; ; NO ERROR/DIRECTORY WRITE ; XOR A,A ;BUFFER = CLEAN LD (HST_WRT),A ; CALL NNNNNNNNNNNNNNNNN<NNNNNNNNNNNNNNNNNNNNNNR SECTOR SECTOR ; LD BC,(SEK_SEC) ;MUST TRANSLATE LD DE,(CUR_XLAT) CALL SEC_TRN LD (IOPB + PB_SECO),HL ; ; NO FLAG NNNNNNNNNNNNNNNN<NNNNNNNNNNNNNNNNNNNNNN DISK FUNCTION ; EXIT - A= 0: OK; /0: ERROR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ TBNNNNNNNNNNNNNNNN<NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ READHST: ; ; SET PTR TO EXECUTION ROUTINE ; LDNNNNNNNNNNNNNNNNN<#BNNNNNNNNNNNNNNNNNNNNNN LD A,PB_WRITC ;SELECT WRITE OP ; ; FALL INTO COMMON DISK I/O ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++wNNNNNNNNNNNNNNNNN<)1NNNNNNNNNNNNNNNNNNNNN!;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EXECUTE IOPB FUNCTION ; ENTRY- IOPB ALL SETI\NNNNNNNNNNNNNNNNN<//NNNNNNNNNNNNNNNNNNNNNNE REGS PUSH BC CALL PRHEX ;OUTPUT ERROR CODE ; LD C,' ' CALL COC ; POP BC ;RESTORE REGS POP DE INC DE ;NEXT ErNNNNNNNNNNNNNNNN<'QNNNNNNNNNNNNNNNNNNNNNNLATIVE HOST BUFFER ADDRESS ; LD DE,HST_BUF ADD HL,DE ;HL = HOST ADDRESS ; LD DE,(DMA_ADR) ;GET/PUT CP/M DATA LD BC,12NNNNNNNNNNNNNNNN< ȚNNNNNNNNNNNNNNNNNNNNNN WRITEHST ;WRITE TO DISK ; LD A,(ER_FLAG) ;RETURN ANY ERRORS ; ; DONE, RESTORE & RETURN ; RW_RET: POP IX ; RET ~!NNNNNNNNNNNNNNNN<NNNNNNNNNNNNNNNNNNNNNNS ; XOR A,A LD (IOPB + PB_FLGO),A ; ; 128 BYTES ; LD HL,128 LD (IOPB + PB_BCNTO),HL ; ; SET DESCRIPTOR SECTOR  NNNNNNNNNNNNNNNNN<-NNNNNNNNNNNNNNNNNNNNNNDISKLOG: ; ; SET DESCRIPTOR SECTOR XFER ADDRESS TO DEFAULT BUFFER ; LD HL,DEFBFR LD (IOPB + PB_DMAO),HL XOR A,A LD 5rNNNNNNNNNNNNNNNN<NNNNNNNNNNNNNNNNNNNNNN HL,(CUR_RD) PUSH HL ; ; SET DMA TO SECTOR BUFFER ; LD HL,HST_BUF LD (IOPB + PB_DMAO),HL ; XOR A,A LD (IOPB + PBpNNNNNNNNNNNNNNNNN<$GNNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++ ; ; COMMON DISK I/O CODE ; ENTRY- A= IOPB COMMAND ; (SP)= DRIVER ADDRESS ; (IOPB.PB_DMA= SET ;,HNNNNNNNNNNNNNNNNN<*dNNNNNNNNNNNNNNNNNNNNNN UP ; EXIT - A= 0: OK; /0: ERROR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ F8_RD: F8_a NNNNNNNNNNNNNNNNN<0bNNNNNNNNNNNNNNNNNNNNNNRROR BYTE DJNZ DSKER1 ;IF NOT DONE THEN LOOP ; LD HL,DSKEB ;OUTPUT ERROR MESSAGE CALL EDITOR ; ; GET USER RESPONSE tINNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN^NNNNNNNсl:Յp> ؉sAލzH味N長S!Y&ž^,Ƣa/˦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN=BNNNNNNNNNNNNNNNNNNNNNN; CALL CI ; PUSH AF ;SAVE CHAR LD C,A ;ECHO CHAR CALL COC POP AF ; AND A,5FH ;INSURE UPPER CASE ; ; IF RETRйNNNNNNNNNNNNNNNNN=UNNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++ SEC_TRN: ; ; IF NO TRANSLATION THEN RETURN SECTOR++ ; LD A,D ;IF TABLE ADDR = 0 THEN NO T NNNNNNNNNNNNNNNN= /NNNNNNNNNNNNNNNNNNNNN!C CP A,MAXFUNCS LD A,-1 RET NC ; ; ELSE COMPUTE TABLE ENTRY ; PUSH HL ;SAVE POSSIBLE DATA ; LD HL,BFUNTBL LD NNNNNNNNNNNNNNNN=SNNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN BIOS VERSION # ; EXIT - HL= VERSION # IN BINARY {0.00,..655.35$NNNNNNNNNNNNNNNN=uNNNNNNNNNNNNNNNNNNNNNNBASE OF TABLE LD D,0 ;ADD OFFSET TWICE FOR WORD PTRS ADD HL,DE ADD HL,DE ; LD E,(HL) ;FETCH DPH PTR INC HL LD D,(NNNNNNNNNNNNNNNNN=>NNNNNNNNNNNNNNNNNNNNNN TO CONSOLE SUBR ; ENTRY- A= DATA ; EXIT - A, C= ? ; ;**********************************************************************0NNNNNNNNNNNNNNNN=%5`NNNNNNNNNNNNNNNNNNNNN!N ELSE LIST OFF ENDIF SUBTTL ADDITIONAL FUNCTIONS TO SUPPORT CDOS PROGRAMS ;***************************************HNNNNNNNNNNNNNNNNN=+oNNNNNNNNNNNNNNNNNNNNNNLLEGC ; ; NOW CHECK FOR EXTENDED CALLS ; CP A,8DH ;IF RETURN VERSION THEN RETURN IT JR Z,RETCVER ; CP A,90H ;IF NOT0!NNNNNNNNNNNNNNNN=NNNNNNNNNNNNNNNNNNNNNNY THEN RETURN TO CALLER ; CP A,'R' JR Z,DKOPLP ; ; ELSE IF ABORT THEN DO WARM BOOT ; CP A,'A' JP Z,0 ; ; ELSE ]$NNNNNNNNNNNNNNNNN=ENNNNNNNNNNNNNNNNNNNNN!RANSLATION OR A,E JP Z,NOTRAN ; ; ELSE CALCULATE NEW SECTOR FROM TABLE ; EX DE,HL ADD HL,BC LD L,(HL) ; LD H,0ʀNNNNNNNNNNNNNNNN=|NNNNNNNNNNNNNNNNNNNNN!A,C ADD A,A ADD A,L LD L,A LD A,0 ADC A,H LD H,A ; ; EXECUTE TABLE ADDRESS ; LD A,(HL) INC HL LD H,(HL) UNNNNNNNNNNNNNNNN=NNNNNNNNNNNNNNNNNNNNNN} ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ RETVERS: LD HL,VERSN XOR A,A ;RETURN N\NNNNNNNNNNNNNNNN= NNNNNNNNNNNNNNNNNNNNN!HL) ; EX DE,HL ;RETURN IN HL ; ; RETURN NO ERROR ; XOR A,A RET ;++++++++++++++++++++++++++++++++++++++++++++++7NNNNNNNNNNNNNNNNN= ʕNNNNNNNNNNNNNNNNNNNNNN****** PRHEX: ; ; PROCESS HIGH NIBBLE 1ST ; CALL PRDIG ; ; SWAP HIGH & LOW NIBBLES ; PRDIG: RLCA RLCA RLCA RȘNNNNNNNNNNNNNNNNN=&`3NNNNNNNNNNNNNNNNNNNNNN************************************ ; ; SYSTEM CALL INTERCEPT ROUTINE CHECKS FOR ILLEGAL BDOS CALLS & ; PRINTS MESSAGE IF Ih~NNNNNNNNNNNNNNNNN=,NNNNNNNNNNNNNNNNNNNNNN CLOCK THEN ERR JR C,ILLEGC ; JR Z,CLKCAL ;IF CALENDAR THEN GET IT ; CP A,92H JR C,CLKSET ;IF SET FUNCTION THEN SET CLl&NNNNNNNNNNNNNNNN= NNNNNNNNNNNNNNNNNNNNNNIF IGNORE THEN RETURN NO ERROR ; SUB A,'I' RET Z ; ; ELSE RETURN ERROR TO BDOS ; FDSKER: LD HL,0 ;RETURN DPB_PTR = 0NNNNNNNNNNNNNNNNN= vNNNNNNNNNNNNNNNNNNNNNN RET ; ; ; CONVERT FROM CP/M'S LOGICAL SECTOR {0..N-1} TO PHYSICAL SECTOR {1..N} ; NOTRAN: LD HL,1 ADD HL,BC RET4HNNNNNNNNNNNNNNNNN=MNNNNNNNNNNNNNNNNNNNNNN LD L,A ; EX (SP),HL ;PUT CALLER'S DATA IN HL, FUNCTION ADDR ON RET ; STACK, EXECUTE FUNCTION ADDRESS ON STACK ;###BNNNNNNNNNNNNNNNN=0NNNNNNNNNNNNNNNNNNNNN!O ERROR RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN DRIVER TABLE PTR lNNNNNNNNNNNNNNNNN=NNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++ ; ; EXECUTE IOPB FUNCTION ; ENTRY- IX= IOPB PTR ; EXIT - A= 0: OK ; ;++++++++++++++++++++++'NNNNNNNNNNNNNNNNN=!NNNNNNNNNNNNNNNNNNNNNNLCA ; ; SAVE DATA FOR RETURN ; PUSH AF ; ; CONVERT TO ASCII USING DAA TRICK ; AND A,0FH ADD A,90H DAA ADC A,&xNNNNNNNNNNNNNNNNN='SNNNNNNNNNNNNNNNNNNNNNNLLEGAL. ALSO IMPLEMENTS CDOS CLOCK/CALENDAR ; SYSTEM CALLS FOR ASMB. ; ;****************************************************&NNNNNNNNNNNNNNNN=-NNNNNNNNNNNNNNNNNNNNNNOCK ; JR Z,CLKTIM ;IF TIME THEN GET IT ; CP A,93H JR Z,CLKRDC ;IF READ CLOCK THEN GET IT ; ; ILLEGAL SYSTEM CALL ; PNNNNNNNNNNNNNNNN=NNNNNNNNNNNNNNNNNNNNN! FOR SELECT FUNCTION LD A,-1 ;RETURN -1 TO BDOS OR A,A RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++NNNNNNNNNNNNNNNN= #NNNNNNNNNNNNNNNNNNNNNN IF P_BFUN OR P_ALL LIST ON ELSE LIST OFF ENDIF SUBTTL BIOS FUNCTION CALLS ;+++++++++++++++++++++++++++++6kNNNNNNNNNNNNNNNNN=NNNNNNNNNNNNNNNNNNNNNN######################################################################### ; ; BIOS FUNCTION TABLE ; ;####################### 0INNNNNNNNNNNNNNNNN=eNNNNNNNNNNNNNNNNNNNNNNFUNCTION ; ENTRY- C= DRIVE # (E FOR FUNCTION CALL) ; EXIT - HL= DRIVER TABLE BASE PTR ; A, C= 0 ; ;+++++++++++++++++++++++NNNNNNNNNNNNNNNNN=mNNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++++++++++++++++ EXIOPB: ; ; SET UP FOR CALL ; LD HL,DK_DSKX LD A,(DK_PROM) CANNNNNNNNNNNNNNNN="NNNNNNNNNNNNNNNNNNNNNN40H DAA ; ; OUTPUT CHAR TO CONSOLE ; LD C,A CALL COC ; ; RETURN DATA ; POP AF RET ;********************NNNNNNNNNNNNNNNNN=(CBNNNNNNNNNNNNNNNN="NNNNNNNNNNNNNNNNNNNNNN*********************************************************************** ; ; PRINTER DRIVER ; ENTRY- C= CHAR TO OUTPUT ; ;**NNNNNNNNNNNNNNNNN=(t NNNNNNNNNNNNNNNNNNNNNN***************************************** GETMON: LD A,MR_RNUM OUT (M2_RSEL),A RET ;********************************-'NNNNNNNNNNNNNNNNN=.ުNNNNNNNNNNNNNNNNNNNNNN----------------------------------------------------------------- ITRAP: ; ; SAVE REGS FIRST ; PUSH AF PUSH HL PUSH SHNNNNNNNNNNNNNNNNN=NNNNNNNNNNNNNNNNNNNNN!+++++++++++++++++++++++++ CLKCAL: LD HL,CLK_CAL ;ROM ENTRY POINT JR CLK2 ;++++++++++++++++++++++++++++++++++++++++++++MNNNNNNNNNNNNNNNNN= 'NNNNNNNNNNNNNNNNNNNNNNCLOCK IMAGE BUFR PTR (13 BYTES LONG) ; ;**************************************************************************** CLKSET: DdNNNNNNNNNNNNNNNNN=NNNNNNNNNNNNNNNNNNNNN! ;SAVE RETURN VALUE CALL GETMON ;RESELECT MONITOR ROM ; POP AF ;RETURN VALUE RET IF P_CHAR OR P_ALL LIST ON XNNNNNNNNNNNNNNNN=aNNNNNNNNNNNNNNNNNNNNN!++++++++++++++++++++++++++++++++++++++++++++++++ CNSCK: IF USEMON CALL GETMON JP MR_CONSTS ELSE IN A,(NT_STAT) ;IBNNNNNNNNNNNNNNNN=lNNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ NTOST: IN A,(NT_STAT) CPL ;REVERSE SENSE AND A,1 S NNNNNNNNNNNNNNNN=#NNNNNNNNNNNNNNNNNNNNNN************************************************************************** LO: IF USEMON CALL GETMON JP MR_LSTOUT ENNNNNNNNNNNNNNNNN=)G=NNNNNNNNNNNNNNNNNNNNN!******************************************** ; ; MESSAGE EDITOR ; ENTRY- HL= TEXT PTR (BIT 7= 1: TERMINATOR) ; EXIT - REGS= )NNNNNNNNNNNNNNNNN=/NNNNNNNNNNNNNNNNNNNNNNBC ; ; SAVE CURRENT ROM & GET MONITOR ROM ; IN A,(M2_RSEL) LD (ROMSAV),A CALL GETMON ; ; PRINT PROMPT ; LD HL, `9NNNNNNNNNNNNNNNN=QNNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++ ; ; RETURN TIME FUNCTION 92H ; EXIT - A= SECONDS ; B= MINITS ; C= HOURS ; ;+++++++++++gNNNNNNNNNNNNNNNNN= .NNNNNNNNNNNNNNNNNNNNNN LD C,CLK_F2 ; CLK1: LD HL,CLK_FUN ; CLK2: LD A,CLK_ROM ; ; FALL INTO ROM EXECUTER ; ENDIF LIST ON ;******* NNNNNNNNNNNNNNNNN=RNNNNNNNNNNNNNNNNNNNNNN ELSE LIST OFF ENDIF SUBTTL CHAR I/O ROUTINES ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++0dNNNNNNNNNNNNNNNNN=qNNNNNNNNNNNNNNNNNNNNNNF DATA NOT READY THEN RETURN 0 AND A,1 SHL NT_READY TTOST1: RET Z LD A,-1 ;ELSE RETURN -1 RET ENDIF ;**********BNNNNNNNNNNNNNNNN=?NNNNNNNNNNNNNNNNNNNNN!HL NT_BUSY JR TTOST1 ENDIF ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; READERONNNNNNNNNNNNNNNNN=$1aNNNNNNNNNNNNNNNNNNNNNNLSE RET ENDIF ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN LIST DEVICE oHNNNNNNNNNNNNNNNNN=*nNNNNNNNNNNNNNNNNNNNNN!? ; ;**************************************************************************** EDITOR: LD C,(HL) ;MESSAGE EDIT LOOP PUS NNNNNNNNNNNNNNNNN=0NNNNNNNNNNNNNNNNNNNNNNITMSG IQCONT: CALL EDITOR ; LD HL,IQMSG ;QUERY USER CALL EDITOR ; ; GET & ECHO USER INPUT ; CALL CI ; PUSH AF $NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNnNNNNNNNсm:Յp? ىtAݍzH䑲M镶S![)ƞc0͢h6ҦnNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN>dNNNNNNNNNNNNNNNNNNNNNNLD C,A CALL COC POP AF ; ; IF OPTION IS CTRL-C THEN WARM BOOT ; CP A,3 ;IF CTRL-C THEN WARM BOOT JP Z,PAGE0 ; ; " NNNNNNNNNNNNNNNNN>8NNNNNNNNNNNNNNNNNNNNNN ;---------------------------------------------------------------------------- ILLINT: PUSH AF ;SAVE ALL 8080 REGS PUSH H]NNNNNNNNNNNNNNNN> !NNNNNNNNNNNNNNNNNNNNNN################ IOPB: REPT PB_SIZE LIST OFF DB 0 LIST ON ENDM ;##################################################fBNNNNNNNNNNNNNNNN>NNNNNNNNNNNNNNNNNNNNNN;############################################################################ HDPBK: DW 128 ;SECTORS PER TRACK (LOGICAL) (SPT)CNNNNNNNNNNNNNNNN>DNNNNNNNNNNNNNNNNNNNNNN############################# ; ; START ON AN EVEN PAGE BOUNDARY ; IF $ AND 0FFH DS 100H - ($ AND 0FFH) ENDIF INTABLT$NNNNNNNNNNNNNNNNN>DNNNNNNNNNNNNNNNNNNNNN!ITMSG DM CR,LF,'User' ILLIM DM CR,LF,'Ill.' IQMSG DM ' Int. Abort? (Y/N/I/M) - ' ENDIF IF P_DISK OR P_ALL LIST Ox'9NNNNNNNNNNNNNNNN>%NNNNNNNNNNNNNNNNNNNNNN######################## ; ; DPH STRUCTURE ; STRUCT -12 ; ; EXTENDED DPH DATA ; DPHSOFO DS 2 ;SECTOR OFFSET FOR THIHNNNNNNNNNNNNNNNNN>+NNNNNNNNNNNNNNNNNNNNNNF OP_SYS = 3 DS 3 ;ADDITIONAL SCRATCH DPHMFO DS 1 ;MEDIA FLAG DPHDPBO DS 2 ;ADDRESS OF DPB DPHCSVO DS 2 ;ADDRESS OF DIRECTO5NNNNNNNNNNNNNNNN>1NNNNNNNNNNNNNNNNNNNNNN IF OPTION IS YES THEN WARM BOOT ; AND A,5FH ;IGNORE CASE ; CP A,'Y' JP Z,PAGE0 ; ; IF OPTION IS INTERRUPT THEN EX$NNNNNNNNNNNNNNNNN>NNNNNNNNNNNNNNNNNNNNNNL PUSH BC LD HL,ILLIM ;NOTIFY USER OF INT JR IQCONT SUBTTL INITIALIZED DATA IF P_DISK OR P_ALL LIST ON ELSQXNNNNNNNNNNNNNNNN>tNNNNNNNNNNNNNNNNNNNNN!########################## ; ; DEFAULT 8" FLOPPY DISK PARAMETER BLOCK ; IBM 3740 SINGLE DENSITY FORMAT ; ;#################NNNNNNNNNNNNNNNN>NNNNNNNNNNNNNNNNNNNNNN DB 5 ;BLOCK SHIFT FACTOR (BSH) DB 31 ;BLOCK MASK (BLM) DB 1 ;NULL MASK (EXM) DW 1015 ;DISK SIZE (CLUSTERS -1) pBNNNNNNNNNNNNNNNN>NNNNNNNNNNNNNNNNNNNNNN: REPT 7 ;1ST 7 ARE UNSUPPORTED LIST OFF DW ILLINT LIST ON ENDM IF P_INT OR P_ALL LIST ON ELSE LIST OFF NNNNNNNNNNNNNNNNN> QINNNNNNNNNNNNNNNNNNNNNNN ELSE LIST OFF ENDIF ;############################################################################ ; ; DRIVE DATA !NNNNNNNNNNNNNNNN>&NNNNNNNNNNNNNNNNNNNNNNS DRIVE DPHWRTO DS 2 ;ADDRESS OF SECTOR WRITE DRIVER DPHRDO DS 2 ;ADDRESS OF SECTOR READ DRIVER DPHLOGO DS 2 ;ADDRESS OF LOGINNNNNNNNNNNNNNNN>,$NNNNNNNNNNNNNNNNNNNNNNRY CHECKSUMS BUFFER DPHALVO DS 2 ;ADDRESS OF CLUSTER ALLOCATION BIT MAP BUFFER DPHDIRBO DS 2 ;ADDRESS OF DIRECTORY BUFFER DPHLNNNNNNNNNNNNNNNN>NNNNNNNNNNNNNNNNNNNNNNECUTE RESTART 7 ; CP A,'I' JR NZ,ITRAP1 ; POP BC ;RESTORE REGS 1ST POP HL POP AF JP 0038H ; ; IF OPTION IS MO'NNNNNNNNNNNNNNNNN> 7NNNNNNNNNNNNNNNNNNNNN!E LIST OFF ENDIF ;############################################################################ ; ; 3740 SECTOR TRANSLATHNNNNNNNNNNNNNNNNN>GNNNNNNNNNNNNNNNNNNNNNN########################################################### SD8PBK: DW 26 ;SECTORS PER TRACK DB 3 ;BLOCK SHIFT FACTOR DB 9NNNNNNNNNNNNNNNN>)NNNNNNNNNNNNNNNNNNNNN!(DSM) DW 1152 / 2 ;DIRECTORY MAX (DRM) DB 0FFH ;ALLOCATION 0 (AL0) DB 10000000B ;ALLOCATION 1 (AL1) DW 0 ;CHECK hNNNNNNNNNNNNNNNNN>&NNNNNNNNNNNNNNNNNNNNNN ENDIF ; DW ITRAP ;INT 8 IS USER INTERRUPT LIST ON ;###############################################################'NNNNNNNNNNNNNNNNN>!bxNNNNNNNNNNNNNNNNNNNNN!STRUCTURES POINTER TABLE ; ;############################################################################ DRV_PTRS: ; ALL_DPNNNNNNNNNNNNNNNNN>'NNNNNNNNNNNNNNNNNNNNNNN DRIVER (NOT USED AT THIS TIME) DPHINO DS 2 ;ADDRESS OF INIT DRIVER DPHDRVO DS 1 ;PHYSICAL DRIVE # ASSOCIATED WITH THIS LOGIC}HNNNNNNNNNNNNNNNN>-'NNNNNNNNNNNNNNNNNNNNNNDTABO DS 2 ;ADDRESS OF DATA BUFFER CONTROL BLOCK DPHHSHO DS 2 ;ADDRESS OF DIRECTORY HASH TABLE BUFFER DPHHBNKO DS 1 ;BANK # OFVRNNNNNNNNNNNNNNNN>kNNNNNNNNNNNNNNNNNNNNNNNITOR THEN EXECUTE MONITOR TRAP ; ITRAP1: CP A,'M' JR NZ,ITRAPR ; POP BC POP HL POP AF JP 0F824H ; ; ELSE RESTO*NNNNNNNNNNNNNNNNN> dNNNNNNNNNNNNNNNNNNNNNNION TABLE ; **** CP/M SINGLE DENSITY **** ; ;############################################################################ X3͊BNNNNNNNNNNNNNNNNN>TNNNNNNNNNNNNNNNNNNNNN!7 ;BLOCK MASK DB 0 ;NULL MASK DW 242 ;DISK SIZE -1 DW 63 ;DIRECTORY MAX DB 11000000B ;ALLOC 0 DB 0 ;ALLOC 1 DW -eBNNNNNNNNNNNNNNNN>zNNNNNNNNNNNNNNNNNNNNNNSIZE (CKS) DW 2 ;TRACK OFFSET (OFF) DB 0 ;PHYSICAL RECORD SHIFT FACTOR (PSH) DB 0 ;PHYSICAL RECORD MASK (PHM) DB>^NNNNNNNNNNNNNNNNN>NNNNNNNNNNNNNNNNNNNNNN############# ; ; MESSAGES ; ;############################################################################ MSGLE: DM CR,L[NNNNNNNNNNNNNNNN>"7+NNNNNNNNNNNNNNNNNNNNNNHP MACRO #D LIST ON DW D#D(DD)DPH LIST OFF ENDM ; DD DL 1 ; REPT NDRVS ALL_DPHP 0123456789ABCDEF DD DL DD +1 E NNNNNNNNNNNNNNNNN>(NNNNNNNNNNNNNNNNNNNNN!AL DRIVE DPHTYPO DS 1 ;DRIVE TYPE BYTE ; ; REQUIRED (NORMAL) DPH DATA ; DPHXLTO DS 2 ;ADDRESS OF SECTOR TRANSLATION TABLE'NNNNNNNNNNNNNNNNN>.rFNNNNNNNNNNNNNNNNNNNNNN DIRECTORY HASH TABLE BUFFER ENDIF ; DPHSIZE EQU -DPHSOFO + $ ENDM ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@$NNNNNNNNNNNNNNNNN>ZNNNNNNNNNNNNNNNNNNNNNNRE REGS & RETURN ; ITRAPR: LD A,(ROMSAV) ;RESTORE ROM # OUT (M2_RSEL),A ; POP BC POP HL POP AF EI ;RE-ENABLE INoNNNNNNNNNNNNNNNNN> UNNNNNNNNNNNNNNNNNNNNNN740: GXLATE 26,6 X3740D: GXLATE 26,6 XCCS: GXLATE 8,3 XCCSD: GXLATE 8,3 ;###############################################NNNNNNNNNNNNNNNNN>gNNNNNNNNNNNNNNNNNNNNNN16 ;CHECK SIZE DW 2 ;TRACK OFFSET DB 0 ;PHYSICAL RECORD SHIFT FACTOR DB 0 ;PHYSICAL RECORD MASK DB 1 ;SKEW INDEX NNNNNNNNNNNNNNNNN>KNNNNNNNNNNNNNNNNNNNNNN 0 ;SKEW INDEX (NONE) IF P_INT OR P_ALL LIST ON ELSE LIST OFF ENDIF ;#####################################uNNNNNNNNNNNNNNNN>"NNNNNNNNNNNNNNNNNNNNNNF,'LOAD ERROR' ; DSKEM: DB CR,LF,'Disk Error Status:' DM CR,LF,'CM DR TL TH SL SH FG AL AH AX CL CH ST S1 S2 S3',CR,LF DSKENNNNNNNNNNNNNNNNN>#NNNNNNNNNNNNNNNNNNNNNNNDM IF P_DISK OR P_ALL LIST ON ELSE LIST OFF ENDIF ;#######################################################SINNNNNNNNNNNNNNNNN>)NNNNNNNNNNNNNNNNNNNNNN (0 FOR DEBLOCKING) DS 6 ;SCRATCH IF OP_SYS = 2 DPHDIRBO DS 2 ;ADDRESS OF DIRECTORY BUFFER DPHDPBO DS 2 ;ADDRESS OF DPB aNNNNNNNNNNNNNNNNN>/AwNNNNNNNNNNNNNNNNNNNNNN@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; GENERATE A DISK PARAMETER TABLE MACRO ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@NNNNNNNNNNNNNNNN> NNNNNNNNNNNNNNNNNNNNNNTERRUPTS RET ;---------------------------------------------------------------------------- ; ; UNSUPPORTED INTERRUPT ;#NNNNNNNNNNNNNNNNN> NNNNNNNNNNNNNNNNNNNNNN############################# ; ; COMMON I/O PARAMETER BLOCK ; ;############################################################NNNNNNNNNNNNNNNNNN>2NNNNNNNNNNNNNNNNNNNNNN ;############################################################################ ; ; DEFAULT 8" HARD DISK PARAMETER BLOCK ; NINNNNNNNNNNNNNNNNN>uNNNNNNNNNNNNNNNNNNNNNN####################################### ; ; MODE 2 INTERRUPT VECTOR TABLE ; ;###############################################HNNNNNNNNNNNNNNNN>wNNNNNNNNNNNNNNNNNNNNNNB: DM CR,LF,'Abort, Ignore, Retry, (BDOS) - ' ; IF INTCPTS ISCMSG: DM CR,LF,'ILL SYS CALL, #= ' ENDIF IF INTRPTS "NNNNNNNNNNNNNNNNN>$NNNNNNNNNNNNNNNNNNNNNN##################### ; ; DRIVE PARAMETER HEADER AREA ; 1 PER DRIVE ; ;####################################################YNNNNNNNNNNNNNNNNN>*NNNNNNNNNNNNNNNNNNNNNN DPHCSVO DS 2 ;ADDRESS OF DIRECTORY CHECKSUMS BUFFER DPHALVO DS 2 ;ADDRESS OF CLUSTER ALLOCATION BIT MAP BUFFER ENDIF I|NNNNNNNNNNNNNNNNN>0R:NNNNNNNNNNNNNNNNNNNNNN@@@@@@@@@@@@@@@@@@@@@@@@@@@ ALLDPH: MACRO #N,#SOFF,#WD,#RD,#LD,#ID,#PD,#DT,#CKS LIST ON DW #SOFF ;;SECTOR OFFSET DW #WD -$NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNBNNNŃg5хl:։q> ڍvD{I䕱L虶R W$\*ƦNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN>SNNNNNNNNNNNNNNNNNNNNNN ;;WRITE DRVR DW #RD ;;READ DRVR DW #LD ;;LOGIN DRVR DW #ID ;;INIT DRVR DB #PD ;;PHYSICAL DRIVE # DB #DT D#NDPH: INNNNNNNNNNNNNNNNN>NNNNNNNNNNNNNNNNNNNNNNALLDPH 0,0,H8_WR,H8_RD,0,0,4,10H,0 ALLDPH 1,80H,H8_WR,H8_RD,0,0,4,10H,0 ALLDPH 2,0,H8_WR,H8_RD,0,0,5,10H,0 ALLDPH 3,80H,H8} NNNNNNNNNNNNNNNN> NNNNNNNNNNNNNNNNNNNNN!###################################################### ; ; THE FOLLOWING ITEMS ARE SET BY THE BIOS FUNCTIONS ; SEK_DSK: DSrNNNNNNNNNNNNNNNN>6NNNNNNNNNNNNNNNNNNNNNNRACK UNA_SEC: DS 2 ;LAST UNALLOC SECTOR ; ; ER_FLAG: DS 1 ;ERROR REPORTING 0: OK, /0: ERROR RS_FLAG: DS 1 ;0: NO PREREXNNNNNNNNNNNNNNNN>tNNNNNNNNNNNNNNNNNNNNNNPTR CUR_XLAT DS 2 ;XLATION TABLE PTR (0: NONE) CUR_SOFF DS 2 ;SECTOR OFFSET FOR DRIVE CUR_DRV DS 1 ;CURRENT PHYSICAL DRIVE # ÍNNNNNNNNNNNNNNNNN>sNNNNNNNNNNNNNNNNNNNNNN ;ALLOCATION BIT MAP FOR 8" DRIVE #D(DD) D#D(DD)CHK DS 32 ;DIRECTORY CHECKSUMS STORAGE (1 BYTE PER SECTOR) ENDIF LIST nNNNNNNNNNNNNNNNN>%NNNNNNNNNNNNNNNNNNNNNN8K= 7, 16K= 15 ; DSM > 255 : 2K= 0, 4K= 1, 8K= 3, 16K= 7 DPBDSMO DS 2 ;DSM- DRIVE STORAGE SIZE (IN CLUSTERS) ; INT(((#_T6NNNNNNNNNNNNNNNNN>+NNNNNNNNNNNNNNNNNNNNN!EED THIS BYTE ; DPBSKWO DS 1 ;SKW- SKEW INDEX ; 0: NONE, 1:3740, 2:DS3740, 3:CCS1K, 4:DSCCS1K ; DPBSZ DS 0 ENDM ; ; !NNNNNNNNNNNNNNNN>NNNNNNNNNNNNNNNNNNNNNN ;;DRIVE PARAMETER HEADER FOR DRIVE #D(DD) DW 0 ;;SECTOR TRAN TBL (OR 0 IF NO XLATE) DW 0,0,0 ;;SCRATCH AREA DW DIRBF xHNNNNNNNNNNNNNNNNN>6NNNNNNNNNNNNNNNNNNNNNN_WR,H8_RD,0,0,5,10H,0 ALLDPH 4,0,F8_WR,F8_RD,0,0,0,0,D4CHK ALLDPH 5,0,F8_WR,F8_RD,0,0,1,0,D5CHK ELSE IF BOOT < 30H 2=NNNNNNNNNNNNNNNN>CNNNNNNNNNNNNNNNNNNNNNN 1 ;LOGICAL DRIVE SEK_TRK: DS 2 ;LOGICAL TRACK NUMBER SEK_SEC: DS 2 ;LOGICAL SECTOR NUMBER ; ; THE FOLLOWING ARE SET CNNNNNNNNNNNNNNNN>(NNNNNNNNNNNNNNNNNNNNN!AD REQ'D, /0: PREREAD REQ'D READ_OP: DS 1 ;0: WRITE OPERATION, 1: READ OPERATION WR_TYPE: DS 1 ;WRITE OPERATION TYPE FROM BDONNNNNNNNNNNNNNNN>'NNNNNNNNNNNNNNNNNNNNNN ;############################################################################ ; ; DRIVE ALLOCATION AREAS ; ;#########NNNNNNNNNNNNNNNNN> fyNNNNNNNNNNNNNNNNNNNNNNOFF ENDM ; ; RESERVE THE DATA SPACE ; DD DL 1 REPT NDRVS LIST OFF ALLDAL 0123456789ABCDEF DD DL DD + 1 LIST ON _NNNNNNNNNNNNNNNN>&NNNNNNNNNNNNNNNNNNNNNNRACKS - OFF) * SPT * BYTES PER SECTOR) / CLUSTER SIZE) -1 DPBDRMO DS 2 ;DRM- DIRECTORY SIZE -1 DPBAL0O DS 2 ;AL0,1- DIRECTORY ?NNNNNNNNNNNNNNNN>,#NNNNNNNNNNNNNNNNNNNNNN ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; GENERATE THE DPB FOR DRIVE MACRO ; ;@@@@@ZR9NNNNNNNNNNNNNNNN>5NNNNNNNNNNNNNNNNNNNNN! ;;DIRECTORY BUFFER PTR DW D#DDPB ;;DRIVE PARAMETER BLK PTR DW #CKS ;;NO CHECKS ON HARD DISK DW D#DALL ;;DRIVE CLUSTER /$NNNNNNNNNNNNNNNNN> NNNNNNNNNNNNNNNNNNNNNN;5" FLOPPY BOOT ALLDPH 0,0,F8_WR,F8_RD,0,0,0,0,D0CHK ALLDPH 1,0,F8_WR,F8_RD,0,0,1,0,D1CHK ALLDPH 2,0,H8_WR,H8_RD,0,0,4,10H4NNNNNNNNNNNNNNNNN>pNNNNNNNNNNNNNNNNNNNNNNBY THE BUFFER READ/WRITE ; HST_DSK: DS 1 ;BUFFER DISK NUMBER HST_TRK: DS 2 ;BUFFER TRACK NUMBER HST_SEC: DS 2 ;BUFFER SECkNNNNNNNNNNNNNNNN>NNNNNNNNNNNNNNNNNNNNNNOS: ; 0: WRITE TO ALLOCATED (USED) BLOCK (PREREAD) ; 1: WRITE TO DIRECTORY (PREREAD & WRITE) ; 2: WRITE TO UNALLO3NNNNNNNNNNNNNNNNN>NNNNNNNNNNNNNNNNNNNNNN################################################################### ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@HNNNNNNNNNNNNNNNNN>!UHNNNNNNNNNNNNNNNNNNNNNN ENDM ;############################################################################ ; ; RESERVE DRIVE PARAMETER BLOCKS=^NNNNNNNNNNNNNNNNN>'NNNNNNNNNNNNNNNNNNNNN!ALLOCATION ; 1 MSB PER DIRECTORY CLUSTER ALLOCATED DPBCKSO DS 2 ;CKS- # DIRECTORY SECTORS CHECKED ; (DRM +1) / 4 DPBOF}$NNNNNNNNNNNNNNNN>-%NNNNNNNNNNNNNNNNNNNNNN@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ALLDPB: MACRO #D LIST ON D#D(DD)DPB: DS DPBSZ ;ALLOA9NNNNNNNNNNNNNNNN>[NNNNNNNNNNNNNNNNNNNNN!ALLOCATION BIT MAP PTR LIST OFF ENDM ; ; DEFINE THE DATA ; IF BOOT < 10H ;8" FLOPPY BOOT ALLDPH 0,0,F8_WR,F8_RNNNNNNNNNNNNNNNNN> TNNNNNNNNNNNNNNNNNNNNN!,0 ALLDPH 3,80H,H8_WR,H8_RD,0,0,4,10H,0 ALLDPH 4,0,H8_WR,H8_RD,0,0,5,10H,0 ALLDPH 5,80H,H8_WR,H8_RD,0,0,5,10H,0 ENDIF NNNNNNNNNNNNNNNNN>cNNNNNNNNNNNNNNNNNNNNN!TOR NUMBER ; ; SEK_HST: DS 2 ;PHYSICAL SECTOR TO XFER ; ; FLAGS ; HST_ACT: DS 1 ;0: BUFFER FLUSHED, /0: DATA IN BUF2NNNNNNNNNNNNNNNN>JNNNNNNNNNNNNNNNNNNNNNNCATED (UNUSED) BLOCK (NO ; PREREAD REQ'D) DMA_ADR: DS 2 ;LAST DMA ADDRESS DMA_BNK DS 1 ;LAST DMA BANK ; HST_BUF: DS 1UNNNNNNNNNNNNNNNNN>&NNNNNNNNNNNNNNNNNNNNN!@@@@@@@@@@@@@@@@@@@@ ; ; MACRO TO DEFINE THE DRIVE ALLOCATION & CHECKSUMS AREA ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@NBNNNNNNNNNNNNNNNN>"NNNNNNNNNNNNNNNNNNNNNN ; ;############################################################################ STRUCT 0 DPBSPTO DS 2 ;SPT- SECTORS/TRACK NNNNNNNNNNNNNNNNN>(NNNNNNNNNNNNNNNNNNNNN!FO DS 2 ;OFF- # RESERVED TRACKS (USUALLY 2) ; ; ADDITIONAL CP/M 3.0 DATA (ALSO COULD BE USED BY CP/M 2.2 DEBLOCKING) ; DPBHNNNNNNNNNNNNNNNNN>.EvNNNNNNNNNNNNNNNNNNNNNNCATION FOR DRIVE #D(DD) LIST OFF ENDM ; ; RESERVE THE DATA SPACE ; DD DL 1 REPT NDRVS LIST OFF ALLDPB 0123456789'NNNNNNNNNNNNNNNNN>jNNNNNNNNNNNNNNNNNNNNNND,0,0,0,0,D0CHK ALLDPH 1,0,F8_WR,F8_RD,0,0,1,0,D1CHK ALLDPH 2,0,H8_WR,H8_RD,0,0,4,10H,0 ALLDPH 3,80H,H8_WR,H8_RD,0,0,4,10Hv~NNNNNNNNNNNNNNNNN> eNNNNNNNNNNNNNNNNNNNNNN ENDIF ENDIF LIST ON ; ; LAST OF INITIALIZED CODE READ FROM DISK ; BIOSND EQU $ SUBTTL UNINITIALIZED DATA A"NNNNNNNNNNNNNNNNN>PNNNNNNNNNNNNNNNNNNNNNNFER HST_WRT: DS 1 ;0: BUFFER CLEAN, /0: BUFFER DIRTY (MODIFIED) ; ; THE FOLLOWING USED BY THE UNALLOCATED BLOCK ALGORITHF!NNNNNNNNNNNNNNNN>{NNNNNNNNNNNNNNNNNNNNNN024 ;HOST BUFFER LOGRQ: DS 1 ;LOG ON REQUEST REG. ROMSAV DS 1 ;ROM SWAP SAVE OF ORIGINAL ROM ; ; CURRENT DRIVE DATA BNNNNNNNNNNNNNNNN>NNNNNNNNNNNNNNNNNNNNNN@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ALLDAL: MACRO #D LIST ON IF ((DD - 1) >= STHD) AND ((DD - 1) <= NDHD) D#D(DD)ALL: DS NNNNNNNNNNNNNNNN>#3*NNNNNNNNNNNNNNNNNNNNN! DPBBSHO DS 1 ;BSH- BLOCK SHIFT FACTOR DETERMINED BY CLUSTER SIZE ; 1K= 3, 2K= 4, 4K= 5, 8K= 6, 16K= 7 DPBBLMO DS 1 ;BLM- BNNNNNNNNNNNNNNNNN>)NNNNNNNNNNNNNNNNNNNNN!PSHO DS 1 ;PSH- PHYSICAL RECORD SHIFT FACTOR BASED ON BYTES/SEC ; 0: 128, 1: 256, 2: 512, 3: 1024 DPBPHMO DS 1 ;PHM- PHYSIC9NNNNNNNNNNNNNNNNN>/vGNNNNNNNNNNNNNNNNNNNNN!ABCDEF DD DL DD + 1 LIST ON ENDM IF $ >= 0F800H CONMSG **** BIOS TOO BIG, USE MOVCPM & RE-ADJUST! **** ENDIF fhBNNNNNNNNNNNNNNNN>9NNNNNNNNNNNNNNNNNNNNNN,0 ALLDPH 4,0,H8_WR,H8_RD,0,0,5,10H,0 ALLDPH 5,80H,H8_WR,H8_RD,0,0,5,10H,0 ELSE IF BOOT < 20H ;8" HARD DISK BOOT NNNNNNNNNNNNNNNNNN> %NNNNNNNNNNNNNNNNNNNNNNREA ;############################################################################ ; ; VARIABLES ; ;######################NNNNNNNNNNNNNNNNNN>NNNNNNNNNNNNNNNNNNNNNNMS ; UNA_CNT: DS 1 ;# SECTORS REMAINING IN BLOCK (CLUSTER) UNA_DSK: DS 1 ;LAST UNALLOC DISK UNA_TRK: DS 2 ;LAST UNALLOC T NNNNNNNNNNNNNNNNN>ENNNNNNNNNNNNNNNNNNNNNN; CUR_DPH DS 2 ;DPH PTR CUR_DPB DS 2 ;DPB PTR CUR_BCB DS 2 ;BCB PTR CUR_RD DS 2 ;READ DRIVER PTR CUR_WR DS 2 ;WRITE DRIVER HNNNNNNNNNNNNNNNN>@NNNNNNNNNNNNNNNNNNNNNN127 ;ALLOCATION BIT MAP FOR 8" HARD DRIVE #D(DD) ENDIF IF ((DD - 1) >= ST8FD) AND ((DD - 1) <= ND8FD) D#D(DD)ALL: DS 57kHNNNNNNNNNNNNNNNNN>$NNNNNNNNNNNNNNNNNNNNNNLOCK MASK ; 1K = 7, 2K= 15, 4K= 31, 8K= 63, 16K= 127 DPBEXMO DS 1 ;EXM- EXTENT MASK ; DSM < 256 : 1K= 0, 2K= 1, 4K= 3, SNNNNNNNNNNNNNNNNN>*NNNNNNNNNNNNNNNNNNNNNNAL RECORD MASK BASED ON BYTES/SEC ; 0: 128, 1: 256, 3: 512, 7: 1024 ; ; ADDITIONAL UNIQUE DATA. HOPE CP/M 4.X DOES NOT NLNNNNNNNNNNNNNNNNN>0e NNNNNNNNNNNNNNNNNNNNNN END ͨHNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNnNNNNNNNсl9Յq@ۉvDߍ|I摴NꕷS!Y&Þ`-ɢd2ΦNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN?*NNNNNNNNNNNNNNNNNNNNNN/**************************************************************************** M5b BIOS Function Call Utility ************_NNNNNNNNNNNNNNNNN?NNNNNNNNNNNNNNNNNNNNNNfdptr, *bytptr, *temp_p, /* Temporary ptr */ *cbptr; /* Ptr to command block array elements */ char *gets(), /* TeJNNNNNNNNNNNNNNNN? WGNNNNNNNNNNNNNNNNNNNNNN */ BYTE pb_dmax;/* Unused dma extended address */ /* Argument in, Return value out */ WORD pb_bcnt; /* Xfer count */ /* R!NNNNNNNNNNNNNNNN?w;NNNNNNNNNNNNNNNNNNNNN!/ WORD fov_fmt; /* Format table ptr */ WORD fov_fsz; /* Format section byte count */ WORD fov_prt; /* Controller port # */@NNNNNNNNNNNNNNNN?NNNNNNNNNNNNNNNNNNNNNN***********************************************************************/ main () { /* Display signon */ printf(signon); NNNNNNNNNNNNNNNNN?2VNNNNNNNNNNNNNNNNNNNNNN("\n\n\ Command Options:\n\ 0 Display BIOS Version\n\ 1 Display monitor drive number assigned to CP/M drive\n\ 2 DisabįNNNNNNNNNNNNNNNN?%NNNNNNNNNNNNNNNNNNNNNN break; case '2': /* disable logon */ if ( (cpui.BC = get_drv()) < 0) break; cpui.AF = 2 << 8; bf_exec(~NNNNNNNNNNNNNNNNN?+NNNNNNNNNNNNNNNNNNNNNN fcb_ptr = srch_fst(); if (fcb_ptr == -1) { printf("\nNo Format Overlays Found... Aborting!"); M9NNNNNNNNNNNNNNNN?GyNNNNNNNNNNNNNNNNNNNNNN***************************************************************** Known bugs: ***************************************UNNNNNNNNNNNNNNNNN?NNNNNNNNNNNNNNNNNNNNNNll cc that this is a char ptr */ *toupper(), *cptr, /* User command text ptr */ tbuf[80]; /* Input buffer */ WORD NNNNNNNNNNNNNNNN?NNNNNNNNNNNNNNNNNNNNNNeturn values */ BYTE pb_sts; /* Command result status */ BYTE pb_st1; /* fdc status if pb_mod == 0x1f */ BYTE pb_st2; /* rNNNNNNNNNNNNNNNN?NNNNNNNNNNNNNNNNNNNNNN } *fmt_buf, /* Ptr to the structure */ *fov_p; /* Format overlay file data ptrs */ struct { BYTE fil_name[11]; b9NNNNNNNNNNNNNNNN?ͣNNNNNNNNNNNNNNNNNNNNNN /* Initialize data */ cpui.AF = (MF_GBNK) << 8; /* get current bank # */ farcall( (WORD) MR_FUN, 0, &cpui, &cpui); NNNNNNNNNNNNNNNNN? 'NNNNNNNNNNNNNNNNNNNNNNle dynamic format selection (LOGON)\n\ 3 Enable dynamic format selection\n\ 4 Set disk format\n\ \n\ ^C Exit to DOS\n\ NNNNNNNNNNNNNNNNN?&[NNNNNNNNNNNNNNNNNNNNN!); break; case '3': /* enable logon */ if ( (cpui.BC = get_drv()) < 0) break; cpui.AF = 3 << 8; "NNNNNNNNNNNNNNNNNN?,bNNNNNNNNNNNNNNNNNNNNNN exit(1); } for (i = 0; i < 64 && fcb_ptr != -1; i++, file_bp += 11) { movmem( (txyNNNNNNNNNNNNNNNN?tHNNNNNNNNNNNNNNNNNNNNNN************************************** Revision History: 0.0 - 10-31-90 grh First cut. Extracted from Format.c v2.01b.NNNNNNNNNNNNNNNNN? NNNNNNNNNNNNNNNNNNNNNN a, n_ents, /* Number of format track table entries */ *fmt_tblp, /* Format table ptr */ *trk_fmtp, /* Track format data QgNNNNNNNNNNNNNNNNN?1%NNNNNNNNNNNNNNNNNNNNNNeturned value #1 */ BYTE pb_st3; /* returned value #2 */ } cmd_blk, liopb; #define pb_fnskb 0x01 /* Inhibit implied seek flNNNNNNNNNNNNNNNN?ݝNNNNNNNNNNNNNNNNNNNNN!/* FCB filename */ char fil_txt[]; /* File text description */ } *fov_file, /* Base ptr to array */ *fov_ptr[64]; /* PojNNNNNNNNNNNNNNNNN?NNNNNNNNNNNNNNNNNNNNNN this_bnk = cpui.AF >> 8; /* drive = -1; Assume no controller */ cmd_blk.pb_sts = -1; /* Force error if not access_NNNNNNNNNNNNNNNNNN?!NNNNNNNNNNNNNNNNNNNNNN \n\ Enter Command # - "); /**** Fetch command */ gets(tbuf); switch (tbuf[0]) { case '0': /* dis&NNNNNNNNNNNNNNNNN?'jNNNNNNNNNNNNNNNNNNNNN! bf_exec(); break; case '4': /* set disk format */ /******* Request drive for overlays */ f_cNNNNNNNNNNNNNNNN?-QNNNNNNNNNNNNNNNNNNNNNN(BYTE *) fcb_ptr) + 1, file_bp, 11); fov_ptr[i] = file_bp; fcb_ptr = srch_nxt(); } XBNNNNNNNNNNNNNNNN?NNNNNNNNNNNNNNNNNNNNNN */ #define signon "\nM5b BIOS Function Test Utility Vers. 0.0\n" /*************************************************NNNNNNNNNNNNNNNNN? NNNNNNNNNNNNNNNNNNNNNNptr */ fmt_len; /* Length of format table */ int i, d, j, temp, c; unsigned int utemp, cnt; FILE *i*NNNNNNNNNNNNNNNNN?"hNNNNNNNNNNNNNNNNNNNNNNag mask */ #define pb_fmtd 0x20 /* Format drive option */ #define pb_inhx 0x40 /* Inhibit data xfer to host flag mask */ #def#NNNNNNNNNNNNNNNN?NNNNNNNNNNNNNNNNNNNNN!trs to each file data */ BYTE *file_bp; /* Ptr into array */ unsigned int max_files; /* max files found */ /* CP/M $NNNNNNNNNNNNNNNNN?gNNNNNNNNNNNNNNNNNNNNNNed */ /* Allocate heap buffer */ file_bp = fov_file = malloc(7000); /* Allocate Filename buffer */ if (fov_file == 0)INNNNNNNNNNNNNNNN?"ANNNNNNNNNNNNNNNNNNNNN!play BIOS version */ cpui.AF = 0; if (bf_exec() < 0) break; printf("\nBIOS Version = %d.%2d\n", cpui.HL / 100, cpui.H9NNNNNNNNNNNNNNNNN?(TNNNNNNNNNNNNNNNNNNNNNNb.f_driv = 0; /* assume default */ printf("\n\ Enter drive letter containing format database files {A..P} - "); 'NNNNNNNNNNNNNNNNN?.NNNNNNNNNNNNNNNNNNNNNN max_files = i; if (i < 63) fov_ptr[i] = -1; for (i = 0; i < max_files; i++ ) { if ( get_,NNNNNNNNNNNNNNNNN?NNNNNNNNNNNNNNNNNNNNN!***************************/ #include stdio.h #include ctype.h #include io.h #include farcall.h #include b:m5zf200.h NNNNNNNNNNNNNNNNN? NNNNNNNNNNNNNNNNNNNNNNnfile, *fopen(); /* IOPB definitions */ struct cb { /* Arguments */ BYTE pb_cmd; /* command */ BYTE pb_drv; /* dNNNNNNNNNNNNNNNNN?YNNNNNNNNNNNNNNNNNNNNN!ine pb_fnrb 0x80 /* Inhibit retries flag mask */ /* Format overlay header data */ struct { WORD fov_txt; /* Text ptrnNNNNNNNNNNNNNNNN?NNNNNNNNNNNNNNNNNNNNNNFile Control Block */ struct fcb *srch_fst(), *srch_nxt(), f_cb, *fcb_ptr; /* farcall registers */ struct regs NNNNNNNNNNNNNNNN?T4NNNNNNNNNNNNNNNNNNNNNN { puts("\nInsufficient Memory...Aborting!"); exit(1); } (BYTE *) fmt_buf = ((BYTE *) fov_file) + 5976)NNNNNNNNNNNNNNNNNN?#rNNNNNNNNNNNNNNNNNNNNNNL % 100); break; case '1': /* display monitor drive # */ if ( (cpui.BC = get_drv()) < 0) break; c(\NNNNNNNNNNNNNNNNN?)eNNNNNNNNNNNNNNNNNNNNNN gets(tbuf); if ( *tbuf != '\0') f_cb.f_driv = ( toupper( *tbuf) - 'A' + 1); /******* Read directory */ D NNNNNNNNNNNNNNNNN?/7NNNNNNNNNNNNNNNNNNNNNNfov( &f_cb, fov_ptr[i] ) != 0) { printf("\nOverlay read error... aborting!"); exit(1); } /********NNNNNNNNNNNNNNNN?NNNNNNNNNNNNNNNNNNNNNN BYTE this_bnk, /* Location of our memory bank */ fbuf[1024], /* Format data buffer */ sbuf[1024], /* Sector buffer */ *'NNNNNNNNNNNNNNNNN? dvNNNNNNNNNNNNNNNNNNNNNNrive */ WORD pb_trk; /* track */ WORD pb_sec; /* sector */ BYTE pb_flags; /* flags */ WORD pb_dma; /* Unused dma addressNNNNNNNNNNNNNNNNNN?D NNNNNNNNNNNNNNNNNNNNNN */ WORD fov_tsz; /* Byte count of text */ WORD fov_idp; /* ID Sector image ptr */ WORD fov_ids; /* ID Sector byte count *uRNNNNNNNNNNNNNNNNN?NNNNNNNNNNNNNNNNNNNNN! cpui, cpuo; /**************************************************************************** main program *****rNNNNNNNNNNNNNNNN?gNNNNNNNNNNNNNNNNNNNNNN; /* Allocate format overlay buffer */ /* Top of command loop */ while (TRUE) { /**** Display Options */ printfNNNNNNNNNNNNNNNNN?$9NNNNNNNNNNNNNNNNNNNNNNpui.AF = 1 << 8; if (bf_exec() < 0 ) break; printf("\nMonitor Drive for this CP/M drive = %u\n", cpui.AF >> 8); oNNNNNNNNNNNNNNNNN?*6NNNNNNNNNNNNNNNNNNNNNN for (i = 0, cptr = &f_cb.f_name[0]; i < 8; i++) *cptr++ = '?'; *cptr++ = 'F'; *cptr++ = 'O'; *cptr = 'V'; MNNNNNNNNNNNNNNNNN?0$NNNNNNNNNNNNNNNNNNNNNN** Insert text */ cnt = fmt_buf -> fov_tsz; file_bp = ((BYTE *) fov_ptr[i]) + 11; movmem(XHNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN8NNNŃf3΅i7щm:Սr@ܑxFᕮ}K癵Q읹V$[)ŦNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN?%NNNNNNNNNNNNNNNNNNNNNN file_bp, &file_bp[cnt], 5975 - cnt - (file_bp - ((BYTE *) fov_file) ) ); bytptr = fmt_buf; moNNNNNNNNNNNNNNNNN?NNNNNNNNNNNNNNNNNNNNNNSet changed flag */ } } } /******* Display formats */ for (i = j = 0; i < max_filH7 NNNNNNNNNNNNNNNN? `wNNNNNNNNNNNNNNNNNNNNNNif (*cptr == '\0') putchar(' '); else putchar(*cptr); } printf(" - %s", &fov_ptr[i] -> fil_txNNNNNNNNNNNNNNNN?@ NNNNNNNNNNNNNNNNNNNNNNfunction arguments */ cpui.BC = get_drv(); /* drive # */ cpui.DE = this_bnk; cpui.HL = &sbuf; /* ID sectYrNNNNNNNNNNNNNNNN?NNNNNNNNNNNNNNNNNNNNN!************************/ int get_fov(f_cb, fnp) struct fcb *f_cb; BYTE *fnp; { int i, rv; BYTE *bp; /* InsertpoNNNNNNNNNNNNNNNNN?fNNNNNNNNNNNNNNNNNNNNNN***********************************/ get_drv() { /* Stay in loop until valid data given */ while (TRUE) { /**** RequefNNNNNNNNNNNNNNNN?%8NNNNNNNNNNNNNNNNNNNNN!*****************************************************/ dmp_fcb(f_cb) struct fcb *f_cb; { int i; char *cp; printf(NNNNNNNNNNNNNNNNNN?+7NNNNNNNNNNNNNNNNNNNNNNffer ptr to directory segment */ bdos( SETDMA, Wrkbuf); /* Search the directory */ r = bdos( SRCHFL, &f_cb); reANNNNNNNNNNNNNNNN?pINNNNNNNNNNNNNNNNNNNNN!vmem( &bytptr[fmt_buf -> fov_txt], file_bp, cnt); /********** Adjust ptrs */ for (j = i + 1; j < max_files; j++)JNNNNNNNNNNNNNNNNN?NNNNNNNNNNNNNNNNNNNNNNes; i++, j++) { if (j == 0) printf("\n\033E\ -------------------------- Format Directory -----------------------NNNNNNNNNNNNNNNN?5$NNNNNNNNNNNNNNNNNNNNNNt ); } printf("\nEnter selection - "); gets(tbuf); temp = atoi(tbuf); /******* GotcTBNNNNNNNNNNNNNNNN?ٜNNNNNNNNNNNNNNNNNNNNNNor buffer */ cpui.AF = 4 << 8; printf("\nID at %04x", &sbuf); temp = bf_exec(); if (temp != 0 && temp > IrNNNNNNNNNNNNNNNN?NNNNNNNNNNNNNNNNNNNNNN file name */ movmem(fnp, f_cb -> f_name, 11); /* Init fcb */ f_cb->f_ext = f_cb->f_resv[0] = f_cb->f_resv[1] = f_cb->f9}INNNNNNNNNNNNNNNNN? NNNNNNNNNNNNNNNNNNNNNNst drive data */ printf("\nEnter CP/M Drive {A..P} (X: abort) - "); gets(tbuf); tbuf[0] = toupper(tbuf[0]);[NNNNNNNNNNNNNNNN?&kNNNNNNNNNNNNNNNNNNNNNN"\n%2x ", f_cb -> f_driv ); for (i = 0, cp = &f_cb -> f_name; i < 8; i++, cp++ ) { if (*cp == '\0') putchar(' '); ٛNNNNNNNNNNNNNNNN?,UNNNNNNNNNNNNNNNNNNNNNNturn (r < 4) ? (Wrkbuf + (r << 5 )) : -1; } /**************************************************************************H9NNNNNNNNNNNNNNNN?CxNNNNNNNNNNNNNNNNNNNNNN { fov_ptr[j] = ((BYTE *) fov_ptr[j]) + cnt; } } /******* Sort the files */ for (d =ENNNNNNNNNNNNNNNNN? NNNNNNNNNNNNNNNNNNNNNN-----"); if (j == 20) { printf("\n\n\ Space for additional, '-' to back up, # to select - "); 4kNNNNNNNNNNNNNNNNN?NNNNNNNNNNNNNNNNNNNNNN selection, read format overlay */ if (get_fov(&f_cb, fov_ptr[temp - 1 ]) != 0) { printf("Cannot read overlay...[NNNNNNNNNNNNNNNN?NNNNNNNNNNNNNNNNNNNNNN0) printf("\nError - %x", temp); break; /******* Unrecognized command */ default: printf("ComYNNNNNNNNNNNNNNNNN?ɢNNNNNNNNNNNNNNNNNNNNNN_rc = f_cb->f_cr = 0; /* Open the fcb */ rv = bdos(OPNFIL, f_cb); if (rv == 0xff) return rv; /* Read the file */ HNNNNNNNNNNNNNNNNN?!#NNNNNNNNNNNNNNNNNNNNNN /**** If abort requested then return -1 */ if (tbuf[0] == 'X') return -1; /**** Else if valid drive letter then dgNNNNNNNNNNNNNNNNN?'ZNNNNNNNNNNNNNNNNNNNNNN else putchar(*cp); } putchar('.'); for ( ; i < 11; i++, cp++ ) { if (*cp == '\0') putchar(' '); NNNNNNNNNNNNNNNN?-fNNNNNNNNNNNNNNNNNNNNNN** Search for next directory match Assumes f_cb has proper search name Returns ptr to directory fcb data (-1 = not found@NNNNNNNNNNNNNNNN?NNNNNNNNNNNNNNNNNNNNNN TRUE; d == TRUE; ) { d = FALSE; /* Assume sorted */ for (i = 0; i < (max_files - 1); i++) { 5!NNNNNNNNNNNNNNNN? NNNNNNNNNNNNNNNNNNNNN! c = getchar(); if (c == '-') { j -= 20; i -= 20; } else if (c == ' ')iNNNNNNNNNNNNNNNNN?XNNNNNNNNNNNNNNNNNNNNNNaborting!"); exit(1); } /******* Transfer ID sector data to sector buffer */ setmem(&sbuf, 1024, 0); fdptr ECNNNNNNNNNNNNNNNN?NNNNNNNNNNNNNNNNNNNNNNmand Not Implemented! Try again."); break; } } /* Done. */ exit(0); } /************'NNNNNNNNNNNNNNNNN?P5NNNNNNNNNNNNNNNNNNNNNN for (bp = fmt_buf, rv = 0, i = 1024; i > 0 && rv == 0; i -= 128, bp += 128 ) { bdos( SETDMA, bp); rv = bdosNNNNNNNNNNNNNNNN?"vNNNNNNNNNNNNNNNNNNNNN!return it's numeric value */ if (tbuf[0] >= 'A' && tbuf[0] <= 'P') return tbuf[0] - 'A'; /**** Else display error meNNNNNNNNNNNNNNNNN?(dNNNNNNNNNNNNNNNNNNNNN! else putchar(*cp); } } /**************************************************************************** NNNNNNNNNNNNNNNNN?.3NNNNNNNNNNNNNNNNNNNNN!) ****************************************************************************/ struct fcb *srch_nxt() { int r; /* _$NNNNNNNNNNNNNNNNN?NNNNNNNNNNNNNNNNNNNNNNtemp = strncmp( fov_ptr[i], fov_ptr[i+1], 8); /* Test for sort */ if (temp > 0) { /* If larger first then swap */ ^NNNNNNNNNNNNNNNNN? NNNNNNNNNNNNNNNNNNNNN! { j = 0; } else { ungetc( c, "stdin"); break; } }DkNNNNNNNNNNNNNNNNN?&iNNNNNNNNNNNNNNNNNNNNNN= fmt_buf; cnt = fmt_buf -> fov_idp; if ((fmt_buf -> fov_ids) > 1024) { printf("\nFormat ID sector data size error:( fil_name; d < 8; d++, cptr++) {  NNNNNNNNNNNNNNNNN?s:NNNNNNNNNNNNNNNNNNNNNN%d)! Aborting!", fmt_buf -> fov_ids); break; } movmem(&fdptr[cnt], sbuf, fmt_buf -> fov_ids); /******* Set A NNNNNNNNNNNNNNNNN?NNNNNNNNNNNNNNNNNNNNNNo use arg2= ptr to filename from directory Returns 0: ok, /0: error ****************************************************ZNNNNNNNNNNNNNNNN?6WNNNNNNNNNNNNNNNNNNNNN! Get the CP/M drive from user exit - -1: abort 0..15: drive number = A..P *****************************************̠HNNNNNNNNNNNNNNNNN?$ NNNNNNNNNNNNNNNNNNNNNN******************************************* Dump the fcb file data Assumes f_cb has proper name ***********************NNNNNNNNNNNNNNNNN?*NNNNNNNNNNNNNNNNNNNNNN***************************************************************************/ struct fcb *srch_fst() { int r; /* Set bu9NNNNNNNNNNNNNNNNN?0NNNNNNNNNNNNNNNNNNNNNN return (r < 4) ? (Wrkbuf + (r << 5 )) : -1; } /********************************************************************sNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNpNNNNNNNNҁn< ׅsA݉xE፯}L葶QW%š_-ɞe3Тk:֦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN@NNNNNNNNNNNNNNNNNNNNNN******** Execute the BIOS function exit - TRUE: abort FALSE: no error any_other: error **************************NNNNNNNNNNNNNNNNN@.NNNNNNNNNNNNNNNNNNNNNN***/ dmp_cdb() { cpui.AF = (MF_DIOB) << 8; cpui.DE = this_bnk; cpui.HL = &cmd_blk; farcall( (WORD4NNNNNNNNNNNNNNNN@ NNNNNNNNNNNNNNNNNNNNNNCI ;CONSOLE INPUT JP COC ;CONSOLE OUTPUT JP LO ;PRINTER OUTPUT JP PUNCH JP READER JP HOME ;HOME SELECTED DRIVE Jf|NNNNNNNNNNNNNNNNN@NNNNNNNNNNNNNNNNNNNNNNOFUNC LD (BFUNRSV),A LD (BFUNRSV + 1),HL ; ; SET DEFAULT SECTOR BUFFER ; LD BC,DEFBFR CALL SETDMA ; IF INTCPTS e9NNNNNNNNNNNNNNNN@kNNNNNNNNNNNNNNNNNNNNNNCPM READ ; LD A,(IY + DPB_PSH) ;0= 128-BYTE SECTORS OR A,A JP Z,DISKRDN ; ; READS DON'T NEED ALLOCATION ; XOR A,A  NNNNNNNNNNNNNNNNN@NNNNNNNNNNNNNNNNNNNNNN*********************************************** ; DISKWR: ; ; REMOVE BOOT WRITE PROTECTION ; XOR A,A LD (WR_PROT),A NNNNNNNNNNNNNNNN@%NNNNNNNNNNNNNNNNNNNNNNN LD HL,(CPM_TRK) LD (UNA_TRK),HL ; ; SET SECTOR TO SEEK ; LD HL,(CPM_SEC) LD (UNA_SEC),HL ; ; IF NO UNALLOCATEDNNNNNNNNNNNNNNNNN@+mNNNNNNNNNNNNNNNNNNNNNN LD D,(IY + DPB_SPT +1) SBC HL,DE JP C,NOOVF ; LD HL,0 ;SECTOR = 1 LD (UNA_SEC),HL ; LD HL,(UNA_TRK) ;TRACK++ INCNNNNNNNNNNNNNNNN@NNNNNNNNNNNNNNNNNNNNN!**************************************************/ int bf_exec() { int i; /* Execute the command */ farcall( (WORD)NNNNNNNNNNNNNNNNN@>)NNNNNNNNNNNNNNNNNNNNNN) MR_FUN, this_bnk, &cpui, &cpui); } NNNNNNNNNNNNNNNN@NNNNNNNNNNNNNNNNNNNNN!P SELDSK ;SELECT DISK DRIVE JP SETTRK ;SET TRACK # JP SETSEC ;SET SECTOR # JP SETDMA ;SET TRANSFER ADDR JP DISKRD ;jNNNNNNNNNNNNNNNNNN@x7NNNNNNNNNNNNNNNNNNNNNN ; ; PUT BDOS VECTOR INTO INTERCEPT CODE ; LD HL,(BDOS + 7) LD (BDOSV),HL ; ; NOW PUT INTERCEPT VECTOR INTO BDOS CODorNNNNNNNNNNNNNNNN@[8NNNNNNNNNNNNNNNNNNNNNN LD (UNA_CNT),A ; ; READ_OPERATION_FLAG = TRUE (1) ; INC A LD (READOP),A ; ; PRE-READ_OF_DATA_FLAG = TRUE ; LD {NNNNNNNNNNNNNNNNN@ fNNNNNNNNNNNNNNNNNNNNN!; ; SET PTRS TO DISK DATA ; PUSH IX LD IX,(CUR_DDT) ; PUSH IY LD IY,(CUR_DPB) ; ; IF NOT BLOCKED THEN USE CPM WDCNNNNNNNNNNNNNNNN@&NNNNNNNNNNNNNNNNNNNNNN SECTORS REMAIN THEN PREREAD ; CHKUNA: LD A,(UNA_CNT) OR A,A JP Z,ALLOC ; ; ELSE MORE UNALLOCATED RECORDS REMAIN, COUNNNNNNNNNNNNNNNNNN@, NNNNNNNNNNNNNNNNNNNNNN HL LD (UNA_TRK),HL ; NOOVF: ; ; MATCH FOUND, MARK AS UNNECESSARY READ ; XOR A,A ;PREREAD FLAG = FALSE LD (RSFLAG)-NNNNNNNNNNNNNNNN@NNNNNNNNNNNNNNNNNNNNNN 0x0028, this_bnk, &cpui, &cpui); /* if error then display it */ switch (cpui.AF >> 8) { case 255: printf^NNNNNNNNNNNNNNNNN@ NNNNNNNNNNNNNNNNNNNNNN0) + '0' DD DL DD % 10000 ENDIF IF DD > 999 DB (DD / 1000) + '0' DD DL DD % 1000 ENDIF DB (DD / 100) + '0' Dj$NNNNNNNNNNNNNNNNN@NNNNNNNNNNNNNNNNNNNNNNPERFORM DISK READ JP DISKWR ;PERFORM DISK WRITE JP LISTST ;RETURN LIST STATUS JP SECTRN ;TRANSLATE SECTOR JP BIOFUNC dNNNNNNNNNNNNNNNNNN@KNNNNNNNNNNNNNNNNNNNNNNE ; LD HL,INTCPT LD (BDOS + 7),HL ENDIF ; ; PASS DEFAULT DISK TO CCP ; LD A,(DEFDRV) LD C,A JP CCP SUBTaHNNNNNNNNNNNNNNNNN@h NNNNNNNNNNNNNNNNNNNNNN(RSFLAG),A ; ; TREAT AS UNALLOCATED BLOCK ; LD A,WRUAL LD (WRTYPE),A ; JP RWOPER ;TO PERFORM THE READ ; ; ; NO@@HNNNNNNNNNNNNNNNNN@!WNNNNNNNNNNNNNNNNNNNNN!RITE ; LD A,(IY + DPB_PSH) ;0= 128-BYTE SECTORS OR A,A JP Z,DISKWRN ; ; READ_OP_FLAG = FALSE ; XOR A,A LD (READO NNNNNNNNNNNNNNNNN@'(NNNNNNNNNNNNNNNNNNNNNNT-- ; DEC A LD (UNA_CNT),A ; ; IF REQUESTED SECTOR != UNALLOCATED SECTOR THEN PURGE ; LD A,(CPM_DSK) ;SAME DISK? LfHNNNNNNNNNNNNNNNN@-:NNNNNNNNNNNNNNNNNNNNNN,A JP RWOPER ; ; ; NORMAL NON-BLOCKED WRITE ; DISKWRN: CALL CPM_WR JP RW_RET ; ; ; NOT AN UNALLOCATED RECORD, U9NNNNNNNNNNNNNNNN@{DNNNNNNNNNNNNNNNNNNNNNN("Illegal Function!"); return -1; case 254: printf("Argument Out of Range Error!"); return -2; f!NNNNNNNNNNNNNNNN@ XKNNNNNNNNNNNNNNNNNNNNN!B '.' DB ((DD % 100) / 10) + '0' DB (DD % 10) + '0' ENDM SUBTTL BIOS CODE ORG BIOS ;-----------------------------ʄNNNNNNNNNNNNNNNNNN@NNNNNNNNNNNNNNNNNNNNNN ;EXECUTE FUNCTION CALL ;############################################################################ ; ; THESE BOOT PARA =INNNNNNNNNNNNNNNNN@UNNNNNNNNNNNNNNNNNNNNN!TL BIOS DISK FUNCTION ROUTINES ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; READ A DISK jNNNNNNNNNNNNNNNNN@NNNNNNNNNNNNNNNNNNNNNNRMAL NON-BLOCKED READ ; DISKRDN: CALL CPM_RD JP RW_RET ;*************************************************************rNNNNNNNNNNNNNNNN@"NNNNNNNNNNNNNNNNNNNNNNP),A ; ; SAVE WRITE TYPE ; LD A,C LD (WRTYPE),A ; ; IF 1ST WRITE TO UNALLOCATED (NEW, UNUSED) BLOCK THEN SET PARAMENNNNNNNNNNNNNNNNN@(8NNNNNNNNNNNNNNNNNNNNNND HL,UNA_DSK CP A,(HL) JR NZ,ALLOC ; LD HL,(UNA_TRK) ;SAME TRACK? LD DE,(CPM_TRK) SBC HL,DE JR NZ,ALLOC ; LD HL,zNNNNNNNNNNNNNNNNN@.iNNNNNNNNNNNNNNNNNNNNNNREQUIRES PRE-READ ; ALLOC: XOR A,A ;COUNT = 0 LD (UNA_CNT),A ; INC A ;PREREAD FLAG = TRUE LD (RSFLAG),A ; ; ; ;NNNNNNNNNNNNNNNNN@HuNNNNNNNNNNNNNNNNNNNNN! default: return cpui.AF >> 8; break; } } /**************************************************SNNNNNNNNNNNNNNNNN@ kzNNNNNNNNNNNNNNNNNNNNNN----------------------------------------------- ; ; BIOS JUMP VECTOR TABLE ; ;--------------------------------------------NNNNNNNNNNNNNNNNNN@NNNNNNNNNNNNNNNNNNNNNN ; ; INIT BIOS WARM START IN PAGE 0 ; LD A,0C3H LD HL,BIOS + 3 LD (PAGE0),A LD (PAGE0 + 1),HL ; ; INIT BDOS CALLBNNNNNNNNNNNNNNNNN@-dNNNNNNNNNNNNNNNNNNNNN!SECTOR ; EXIT - A= 0: OK; /0: ERROR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; DISKR:BNNNNNNNNNNNNNNNN@¯NNNNNNNNNNNNNNNNNNNNN!*************** ; ; WRITE DISK SECTOR FUNCTION ; ENTRY- C= WRITE TYPE: ; 0: WRITE TO ALLOCATED BLOCK (UPDATE) ; 1: WRIT^NNNNNNNNNNNNNNNNNN@#5NNNNNNNNNNNNNNNNNNNNN!TERS ; CP A,WRUAL JP NZ,CHKUNA ; ; COUNT = NUMBER_OF_SECTORS_IN_BLOCK ; LD A,(IY + DPB_BLM) ;CUR_DPB.DPBBLM + 1 ::= RNNNNNNNNNNNNNNNNN@) NNNNNNNNNNNNNNNNNNNNNN(CPM_SEC) LD DE,(UNA_SEC) SBC HL,DE JR NZ,ALLOC ; ; MATCH, MOVE TO NEXT SECTOR FOR FUTURE REF ; EX DE,HL ;UNASEC +NNNNNNNNNNNNNNNNN@/XNNNNNNNNNNNNNNNNNNNNNN COMMON CODE FOR READ AND WRITE FOLLOWS ; RWOPER: ; ; ASSUME NO ERRORS ; XOR A,A LD (IOPB + PB_STATO),A ; ; COMyNNNNNNNNNNNNNNNN@&NNNNNNNNNNNNNNNNNNNNNN************************** Dump command block *************************************************************************hNNNNNNNNNNNNNNNNNN@ NNNNNNNNNNNNNNNNNNNNNN-------------------------------- JP INIT1 ;COLD START ENTRY JP WARM ;RELOAD CCP/BDOS JP CNSCK ;GET CONSOLE STATUS JP >NNNNNNNNNNNNNNNNNN@ґNNNNNNNNNNNNNNNNNNNNN! VECTOR IN PAGE 0 ; LD HL,BDOS + 6 LD (BDOSJV),A LD (BDOSJV + 1),HL ; ; INIT BIOS CALL VECTOR IN PAGE 0 ; LD HL,BI?NNNNNNNNNNNNNNNNN@=ZNNNNNNNNNNNNNNNNNNNNNND: ; ; SET UP DATA TABLE PTRS ; PUSH IX LD IX,(CUR_DDT) ; PUSH IY LD IY,(CUR_DPB) ; ; IF NOT BLOCKED THEN USE tBNNNNNNNNNNNNNNNN@NNNNNNNNNNNNNNNNNNNNNNE TO DIRECTORY BLOCK (ALLWAYS WRITE) ; 2: WRITE TO UNALLOCATED BLOCK (NO NEED TO PRE-READ) ; ;*****************************u{NNNNNNNNNNNNNNNNN@$}NNNNNNNNNNNNNNNNNNNNNN(BLKSIZ/128) INC A LD (UNA_CNT),A ; ; SET DISK TO SEEK ; LD A,(CPM_DSK) LD (UNA_DSK),A ; ; SET TRACK TO SEEK ;HNNNNNNNNNNNNNNNNN@*^NNNNNNNNNNNNNNNNNNNNNN= 1 INC HL LD (UNA_SEC),HL ; ; IF PAST LAST SECTOR ON TRACK THEN USE 1ST SECTOR OF NEXT TRACK ; LD E,(IY + DPB_SPT) $NNNNNNNNNNNNNNNNN@0NNNNNNNNNNNNNNNNNNNNNNPUTE BUFFER SECTOR ; LD HL,(CPM_SEC) DEC HL ;CONVERT PHYSICAL SECTOR TO LOGICAL ; LD A,(IY + DPB_PSH) ;USE PHYSICAL SH%NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNŃf4υj8҉m:ԍp> ڑvDߕzG㙲N靶RV$NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN@NNNNNNNNNNNNNNNNNNNNNNIFT FACTOR (CP/M 3.X) AND A,3 ;LIMIT TO 1024 BYTE SECTORS JP Z,NOSECSHF ;IF ALREADY 0 THEN SECTOR SIZE IS 128 ; SECSHFLqdNNNNNNNNNNNNNNNNN@'NNNNNNNNNNNNNNNNNNNNNNMATCH ; NOMATCH: ; ; IF BUFFER == DIRTY THEN WRITE IT OUT BEFORE READING NEW ONE ; CALL BUF_FLSH ;CLEAR HOST BUFF ;  NNNNNNNNNNNNNNNN@ NNNNNNNNNNNNNNNNNNNNNNITS <14..8> LD H,A ; LD A,0 ;BIT 0 -> BIT 7 RRA LD L,A ; ; HL HAS RELATIVE HOST BUFFER ADDRESS ; LD DE,BLKBUF NNNNNNNNNNNNNNNN@֐NNNNNNNNNNNNNNNNNNNNNNRN ANY ERRORS ANYWAY JR NZ,RW_RET ; ; IF ERROR THEN ABORT ; OR A,A JR NZ,RW_RET ; ; NO ERROR/DIRECTORY WRITE ; ;9NNNNNNNNNNNNNNNN@9[NNNNNNNNNNNNNNNNNNNNNN******************************** ; CPM_WR: ; LD HL,LL_WRIT JP CPM_RW ;**********************************************dNNNNNNNNNNNNNNNNN@NNNNNNNNNNNNNNNNNNNNNN************************* ; ; CPM_RD PERFORMS THE PHYSICAL READ FROM THE DISK INTO CPM_DMA. ; ENTRY- (CPM_DSK)= DISK # TO REA%NNNNNNNNNNNNNNNN@%yNNNNNNNNNNNNNNNNNNNNNN********************************************************************** ; RD_WR: LD DE,IOPB + PB_TRKO LD BC,PB_BCNTO - PB_TRK['NNNNNNNNNNNNNNNNN@+ZNNNNNNNNNNNNNNNNNNNNNN(BUF_DDT) LD IY,(BUF_DPB) ; ; WRITE THE BUFFER DATA ; CALL BUF_WR ; ; RESTORE THE PTRS ; POP IY POP IX ; ; NNNNNNNNNNNNNNNN@NNNNNNNNNNNNNNNNNNNNNNP: SRL H ;ELSE SHIFT OVER TO PHYSICAL SECTOR RR L DEC A JP NZ,SECSHFLP ; NOSECSHF: INC HL ;SET BACK TO PHYSICAL ShHNNNNNNNNNNNNNNNNN@ NNNNNNNNNNNNNNNNNNNNN!JR NZ,RW_RET ;IF ERROR THEN ABORT ; FILHST: ; ; READ THE SECTOR BUFFER ; LD A,(CPM_DSK) ;BUFFER SECTOR = PHYSICAL SECTO)NNNNNNNNNNNNNNNN@NNNNNNNNNNNNNNNNNNNNN! ADD HL,DE ;HL = HOST ADDRESS ; LD DE,(CPM_DMA) ;GET/PUT CP/M DATA LD BC,128 ;LENGTH OF MOVE ; LD A,(READOP) ;WHICH WA NNNNNNNNNNNNNNNN@ONNNNNNNNNNNNNNNNNNNNN! XOR A,A ;BUFFER = CLEAN LD (BUF_MOD),A ; CALL BUF_WR ;WRITE TO DISK ; LD A,(IOPB + PB_STATO) ;RETURN ANY ERRORS ; NNNNNNNNNNNNNNNN@lNNNNNNNNNNNNNNNNNNNNN!****************************** ; ; CPM_RD2 PERFORMS THE PHYSICAL READ FROM THE DISK INTO CPM_DMA, ; WITHOUT BLOCKING. ; ENTR9$NNNNNNNNNNNNNNNNN@ VNNNNNNNNNNNNNNNNNNNNN!D FROM ; (CPM_TRK)= TRACK # TO READ FROM ; (CPM_SEC)= SECTOR # TO READ FROM ; (CPM_DMA)= XFER ADDRESS ; IX= DDT PTR ; F!NNNNNNNNNNNNNNNN@&,NNNNNNNNNNNNNNNNNNNNNNO LDIR ; ; EXECUTE LOW LEVEL READ OR WRITE (ON STACK) ; RET ;*****************************************************Q !NNNNNNNNNNNNNNNN@,;NNNNNNNNNNNNNNNNNNNNN! IF ERROR THEN RETURN IT ; OR A,A RET NZ ; ; ELSE CLEAN BUFFER ; LD (BUF_MOD),A RET ;************************NNNNNNNNNNNNNNNN@NNNNNNNNNNNNNNNNNNNNN!ECTOR LD (BUF_PSEC),HL ;BUFFER PHYSICAL SECTOR TO ACCESS ; ; IF BUFFER == EMPTY THEN READ THE PHYSICAL SECTOR ; LD HL,BLNNNNNNNNNNNNNNNNN@ :(NNNNNNNNNNNNNNNNNNNNNNR LD (BUF_DSK),A ; LD HL,(CPM_TRK) LD (BUF_TRK),HL ; LD HL,(BUF_PSEC) LD (BUF_SEC),HL ; ; IF REQUIRED TO READ TH$NNNNNNNNNNNNNNNNN@NNNNNNNNNNNNNNNNNNNNNNY? OR A,A JP NZ,RWMOVE ;SKIP IF READ ; ; WRITE OPERATION, MARK AND SWITCH DIRECTION ; LD A,1 ;BUFFER = DIRTY LD (B=>NNNNNNNNNNNNNNNN@|6NNNNNNNNNNNNNNNNNNNNN! ; DONE, RESTORE & RETURN ; RW_RET: OR A,A ;SET RESULT STATUS FLAG POP IY POP IX ; RET ;************************NNNNNNNNNNNNNNNNN@_9NNNNNNNNNNNNNNNNNNNNNNY- (CPM_DSK)= DISK # TO READ FROM ; (CPM_TRK)= TRACK # TO READ FROM ; (CPM_SEC)= SECTOR # TO READ FROM ; (CPM_DMA)= XFER ANNNNNNNNNNNNNNNNN@!gNNNNNNNNNNNNNNNNNNNNN!IY= DPB PTR ; EXIT - (IOPB.PB_STATO)= 0: OK, /0: ERROR ; ;*******************************************************************/NNNNNNNNNNNNNNNNN@'NNNNNNNNNNNNNNNNNNNNNN*********************** ; ; BUF_FLSH FLUSHES THE BUFFER DATA IF MODIFIED ; ENTRY- (BUF_DSK)= DISK # TO WRITE TO ; (BUF_TRK)NNNNNNNNNNNNNNNN@- NNNNNNNNNNNNNNNNNNNNNN**************************************************** ; ; BUF_WR PERFORMS THE PHYSICAL WRITE FROM BLKBUF TO THE HOST DISK. ; E'NNNNNNNNNNNNNNNN@LtNNNNNNNNNNNNNNNNNNNNN!UF_ACT LD A,(HL) ; LD (HL),1 ;BUFFER = ACTIVE IN ANY CASE ; OR A,A JR Z,FILHST ; ; HOST BUFFER ACTIVE, SAME AS SENNNNNNNNNNNNNNNN@ o{NNNNNNNNNNNNNNNNNNNNNNEN READ ; LD A,(RSFLAG) ;NEED TO READ? OR A,A CALL NZ,BUF_RD ;YES, IF 1 ; ; BUFFER = CLEAN ; XOR A,A LD (BUF_M)X9NNNNNNNNNNNNNNNNN@NNNNNNNNNNNNNNNNNNNNNNUF_MOD),A ; ; SAVE BUFFER DATA PTRS FOR LATER FLUSHES ; LD (BUF_DDT),IX LD (BUF_DPB),IY ; EX DE,HL ;SOURCE/DEST SWAt*NNNNNNNNNNNNNNNN@)eNNNNNNNNNNNNNNNNNNNNN!**************************************************** ; ; CPM_WR PERFORMS THE PHYSICAL WRITE FROM CPM_DMA TO THE DISK. ; ENTRY?WNNNNNNNNNNNNNNNNNN@ƮNNNNNNNNNNNNNNNNNNNNNNDDRESS ; EXIT - (IOPB.PB_STATO)= 0: OK, /0: ERROR ; ;************************************************************************PBNNNNNNNNNNNNNNNN@"4NNNNNNNNNNNNNNNNNNNNNN********* ; CPM_RD: ; LD HL,LL_READ ; ; COMMON CODE ; CPM_RW: PUSH HL LD HL,CPM_TRK ; ; FALL INTO COMMON XFER CvNNNNNNNNNNNNNNNNN@(NNNNNNNNNNNNNNNNNNNNNN= TRACK # TO WRITE TO ; (BUF_PSEC)= SECTOR # TO WRITE TO ; (BUF_DDT)= DDT PTR ; (BUF_DPB)= DPB PTR ; EXIT - (IOPB.PB_STAT^NNNNNNNNNNNNNNNNN@.YNNNNNNNNNNNNNNNNNNNNNNNTRY- (BUF_DSK)= DISK # TO WRITE TO ; (BUF_TRK)= TRACK # TO WRITE TO ; (BUF_SEC)= SECTOR # TO WRITE TO ; IX= DDT PTR ; IMNNNNNNNNNNNNNNNNN@ENNNNNNNNNNNNNNNNNNNNNNEK BUFFER? ; LD A,(CPM_DSK) LD HL,BUF_DSK ;SAME DISK? CP A,(HL) JR NZ,NOMATCH ; LD HL,(BUF_TRK) ;SAME TRACK? LD DENNNNNNNNNNNNNNNNN@ \JNNNNNNNNNNNNNNNNNNNNN!OD),A ; MATCH: ; ; COPY DATA TO OR FROM BUFFER ; LD HL,(CPM_SEC) ;CALCULATE INDEX INTO BUFFER DEC HL ;CONVERT TO LOG!NNNNNNNNNNNNNNNNN@NNNNNNNNNNNNNNNNNNNNNNP ; RWMOVE: ; ; BC INITIALLY 128, DE IS SOURCE, HL IS DEST ; LDIR ; ; DATA HAS BEEN MOVED TO/FROM HOST BUFFER, IF N NNNNNNNNNNNNNNNN@TNNNNNNNNNNNNNNNNNNNNN!- (CPM_DSK)= DISK # TO WRITE TO ; (CPM_TRK)= TRACK # TO WRITE TO ; (CPM_SEC)= SECTOR # TO WRITE TO ; (CPM_DMA)= XFER ADDREeNNNNNNNNNNNNNNNN@NNNNNNNNNNNNNNNNNNNNNN**** ; CPM_RD2: ; ; SET UP PTRS ; PUSH IX PUSH IY LD IX,(CUR_DDT) LD IY,(CUR_DPB) ; ; EXECUTE READ SECTOR ; :yNNNNNNNNNNNNNNNN@#NNNNNNNNNNNNNNNNNNNNNNODE ; ;**************************************************************************** ; ; SET UP IOPB FOR EXECUTION ; ENT NNNNNNNNNNNNNNNNN@) -> BNNNNNNNNNNNNNNNNN@NNNNNNNNNNNNNNNNNNNNNNOT DIRECTORY THEN DELAY WRITE ; LD A,(WRTYPE) ;IF NOT DIRECTORY THEN DELAY WRITE CP A,WRDIR LD A,(IOPB + PB_STATO) ;RETU 1 NNNNNNNNNNNNNNNNN@ jNNNNNNNNNNNNNNNNNNNNNNSS ; IX= DDT PTR ; IY= DPB PTR ; EXIT - (IOPB.PB_STATO)= 0: OK, /0: ERROR ; ;********************************************&hBNNNNNNNNNNNNNNNN@NNNNNNNNNNNNNNNNNNNNNN CALL CPM_RD ; ; RESTORE PTRS & RETURN ; POP IY POP IX RET ;***************************************************X$NNNNNNNNNNNNNNNNN@$JNNNNNNNNNNNNNNNNNNNNNNRY- HL= PTR TO IOPB IMAGE TRACK DATA ; IX= DDT PTR ; IY= DPB PTR ; (SP)= ADDRESS {LL_READ, LLWRIT} OF EXECUTOR ; ;******u'NNNNNNNNNNNNNNNNN@*iNNNNNNNNNNNNNNNNNNNNNNUNMODIFIED THEN RETURN ; LD A,(BUF_MOD) OR A,A RET Z ; ; ELSE SET PTRS TO BUFFER DATA ; PUSH IX PUSH IY LD IX,?u$NNNNNNNNNNNNNNNNN@0%NNNNNNNNNNNNNNNNNNNNN!******** ; BUF_WR: ; LD HL,LL_WRIT JP BUF_RW ;**********************************************************************(^NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNсl:Յp> ىuCލ{H䑲M镶Q홼Y'ž^+Ǣb1ͦNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNANNNNNNNNNNNNNNNNNNNNNN****** ; ; RDBUF PERFORMS THE PHYSICAL READ FROM THE HOST DISK INTO BLKBUF. ; ENTRY- (BUF_DSK)= DISK # TO READ FROM ; (BUF_NNNNNNNNNNNNNNNNNAXNNNNNNNNNNNNNNNNNNNNNNLDSK: ; ; STORE DRIVE # FOR FUTURE USE ; LD A,C LD (CPM_DSK),A ; ; SAVE LOGON REQUEST FLAG ; LD A,E LD (LOGRQ) :NNNNNNNNNNNNNNNNA hNNNNNNNNNNNNNNNNNNNNNNGON, 1:INHIBIT OR A,C ;0: NORMAL, 1: INHIBIT CPL AND A,1 RET Z ; ; ELSE LOG ON DRIVE ; PUSH IX ;SAVE REGS PUS NNNNNNNNNNNNNNNNANNNNNNNNNNNNNNNNNNNNNNLES ; IDOK: CALL TRNONE ;ASSUME NO TRANSLATION ; ; IF HARD DISK OR DOUBLE DENSITY THEN NO TRANSLATION ; LD A,(BLKBUF +9NNNNNNNNNNNNNNNNAxNNNNNNNNNNNNNNNNNNNNNN USE DEFAULT TABLE LD BC,DPB_SZ LDIR ; LD A,(HL) ;HEADS VALUE JR SEL1 ; ; ; USE 8" FLOPPY DEFAULTS ; LGCKFD: CNNNNNNNNNNNNNNNNNAyNNNNNNNNNNNNNNNNNNNNNN******************************* ; ; SET TRACK # ; ENTRY- BC= TRACK # ; ;*************************************************** 9NNNNNNNNNNNNNNNNA%8'NNNNNNNNNNNNNNNNNNNNNN DONE ; RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; SECTOR TRANSLATION FUNCNNNNNNNNNNNNNNNNNA+(NNNNNNNNNNNNNNNNNNNNN!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; LOGON DISK FUNCTION ; EXIT - A= 0: OK; /0: ERROR ; ;++++lNNNNNNNNNNNNNNNNAVNNNNNNNNNNNNNNNNNNNNNNTRK)= TRACK # TO READ FROM ; (BUF_SEC)= SECTOR # TO READ FROM ; IX= DDT PTR ; IY= DPB PTR ; EXIT - (IOPB.PB_STATO)= 0: OK}gNNNNNNNNNNNNNNNNNAHNNNNNNNNNNNNNNNNNNNNN!,A ; ; COMPUTE DISK DRIVER TABLE PTR ; CALL RETDVRT ;DRIVE IS STILL IN C REGISTER ; ; IF DRIVE ERROR THEN RETURN (HLNNNNNNNNNNNNNNNNA;NNNNNNNNNNNNNNNNNNNNNNH IY ; LD IX,(CUR_DDT) ;SET REGS LD IY,(CUR_DPB) ; ; ATTEMPT TO READ ID SECTOR ; CALL BUF_FLSH ;FLUSH BUFFER 1ST JvNNNNNNNNNNNNNNNNANNNNNNNNNNNNNNNNNNNNNN ID_FLGO) AND A,[1 SHL DF_DTDB] OR [1 SHL DF_HARDB] ; ; ELSE SET TRANSLATION ; CALL Z,TR8 ; ; XFER DISK DATA TO DPBNNNNNNNNNNNNNNNNA-NNNNNNNNNNNNNNNNNNNNNNALL TR8 LD HL,SD8PBK JR SEL2 ; ; ERROR EXIT ; LOGERR: LD HL,0 ; ; DONE ; LGDONE: POP IY ;RESTORE REGS POP IX rDNNNNNNNNNNNNNNNNNA NNNNNNNNNNNNNNNNNNNNNN************************* ; SETTRK: LD (CPM_TRK),BC RET ;************************************************************JNNNNNNNNNNNNNNNNA&mtNNNNNNNNNNNNNNNNNNNNN!TION ; ENTRY- DE= 0: NO XLATE, ELSE PTR TO XLATE TABLE ; BC= SECTOR # TO XLATE ; EXIT - HL= XLATED SECTOR OR BC + 1 ; BC= |wNNNNNNNNNNNNNNNNNNA,NNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; DISKLOG: ; ; SET UP READ IOPB ; LD A,(BUF_DMNNNNNNNNNNNNNNNNAgNNNNNNNNNNNNNNNNNNNNNN, /0: ERROR ; ;**************************************************************************** ; BUF_RD: ; LD HL,LL_READ ; WNNNNNNNNNNNNNNNNNA {NNNNNNNNNNNNNNNNNNNNN!= 0) ; RET NZ ; ; ELSE SAVE PTR ; LD (CUR_DDT),HL ; ; FETCH FLAGS ; INC HL ;EXE +1 INC HL ;FLGS LD C,(HL)+'NNNNNNNNNNNNNNNNNA NNNNNNNNNNNNNNNNNNNNN!R NZ,LOGERR ; CALL DISKLOG JR NZ,LOGERR ; ; IF NO ID SECTOR THEN USE DEFAULT DPB ; (NOTE: CONTROLLER HAS SET IT'S DISKe)NNNNNNNNNNNNNNNNA=NNNNNNNNNNNNNNNNNNNNNN ; LD DE,(CUR_DPB) ;GET ADDR OF DPB LD HL,BLKBUF + ID_SPTO LD BC,DPB_SZ LDIR ; ; XFER DISK PHYSICAL DATA TO TABLE \'NNNNNNNNNNNNNNNNNANNNNNNNNNNNNNNNNNNNNNN RET ;**************************************************************************** ; ; HOME DRIVE - TREAT AS SEEK TRK 0,'NNNNNNNNNNNNNNNNNA!NNNNNNNNNNNNNNNNNNNNNN**************** ; ; SET SECTOR ; ENTRY- BC= SECTOR # ; ;******************************************************************|HNNNNNNNNNNNNNNNNNA'^ENNNNNNNNNNNNNNNNNNNNNNUNCHANGED ; A, DE= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; SECTRN: ; ; IF HNNNNNNNNNNNNNNNNA-NNNNNNNNNNNNNNNNNNNNNNAB) LD (LOGIOPB + PB_DMAXO),A ; LD HL,LOGIOPB LD DE,IOPB LD BC,PB_STATO LDIR ; ; EXECUTE WITHOUT COMPENSATION ; EwNNNNNNNNNNNNNNNNA NNNNNNNNNNNNNNNNNNNNNN ; COMMON CODE ; BUF_RW: PUSH HL LD HL,BUF_TRK JP RD_WR ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++]NNNNNNNNNNNNNNNNNNA .NNNNNNNNNNNNNNNNNNNNNN ; ; FETCH DISK PARAMETER BLOCK ADDRESS ; INC HL ;DRV INC HL ;DPB_PTR LD E,(HL) INC HL LD D,(HL) LD (CUR_DPB) BNNNNNNNNNNNNNNNNNAGNNNNNNNNNNNNNNNNNNNNNN DEFAULTS IN DEFBFR IN ALL CASES) ; LD A,(IOPB + PB_ST2O) CP A,-1 ;-1:NONE, 0:JADE, 1:DESCRIPTOR, 2: EXTENDED, ; 3: t9NNNNNNNNNNNNNNNNAhNNNNNNNNNNNNNNNNNNNNNN ; LD A,(BLKBUF + ID_HEADS) ; SEL1: LD (IX + DDT_HDS),A ; ; RETURN DRIVE TABLE PTR ; LD HL,(CUR_DPH) XOR A,A ;RETU5NNNNNNNNNNNNNNNNNA*NNNNNNNNNNNNNNNNNNNNNN ; EXIT - BC= 0 ; ;**************************************************************************** ; HOME: ; ; IF PENDING ;NNNNNNNNNNNNNNNNA"NNNNNNNNNNNNNNNNNNNNNN********** ; SETSEC: LD (CPM_SEC),BC RET ;***************************************************************************~rNNNNNNNNNNNNNNNNNA(N{NNNNNNNNNNNNNNNNNNNNNNNO TRANSLATION THEN RETURN SECTOR++ ; LD A,D ;IF TABLE ADDR = 0 THEN NO TRANSLATION OR A,E JP Z,NOTRAN ; ; ELSE CALCUNNNNNNNNNNNNNNNNNA.NNNNNNNNNNNNNNNNNNNNNN JR LL_DO ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; LOW LEVEL READ ; ENTRY- IX=HNNNNNNNNNNNNNNNNNA>NNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++ ; ; SELECT DRIVE FUNCTION ; LOG-ON - SET DISK PARAMETER BLOCK ; ENTRY- C= DRIVE # ; E= 0 IF NEW SELECT NNNNNNNNNNNNNNNNNA NNNNNNNNNNNNNNNNNNNNNN,DE ; ; FETCH DISK PARAMETER HEADER ADDRESS ; INC HL ;DPH PTR LD E,(HL) INC HL LD D,(HL) LD (CUR_DPH),DE EX DENNNNNNNNNNNNNNNNNAvNNNNNNNNNNNNNNNNNNNNNNPARTITIONED, ID JR Z,LGDEF ; ; ELSE IF OLD FORMATS THEN PAD DPB DATA ; CP A,3 JR NC,IDOK ; LD HL,BLKBUF + ID_PSHO 6gNNNNNNNNNNNNNNNNNA[NNNNNNNNNNNNNNNNNNNNN!RN NO-ERROR JR LGDONE ; ; ; IF NOT HARD DISK THEN GO DO FLOPPY TEST ; LGDEF: BIT 4,(IX + DDT_FLG) JR Z,LGCKFD ; ; rNNNNNNNNNNNNNNNNANNNNNNNNNNNNNNNNNNNNN!WRITE (BUFFER DIRTY) THEN IGNORE ; LD A,(BUF_MOD) OR A,A JR NZ,HOME2 ; ; ELSE PURGE BUFFER ; LD (BUF_ACT),A ; HONNNNNNNNNNNNNNNNA#NNNNNNNNNNNNNNNNNNNNNN* ; ; SET TRANSFER ADDR ; ENTRY- BC= ADDRESS ; EXIT - A= ? ; ;************************************************************NNNNNNNNNNNNNNNNNA)}JNNNNNNNNNNNNNNNNNNNNN!LATE NEW SECTOR FROM TABLE ; EX DE,HL ADD HL,BC LD L,(HL) ; LD H,0 RET ; ; ; CONVERT FROM CP/M'S LOGICAL SECTORNNNNNNNNNNNNNNNNNA/NNNNNNNNNNNNNNNNNNNNNN DDT PTR ; IY= DPB PTR ; EXIT - IOPB.PB_STATO, A= STATUS ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++e9NNNNNNNNNNNNNNNNAkNNNNNNNNNNNNNNNNNNNNNN ; EXIT - HL= PTR TO DPT OR 0 FOR ERROR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; SE+NNNNNNNNNNNNNNNNNA YNNNNNNNNNNNNNNNNNNNNNN,HL ;PUT DPH PTR IN HL FOR RETURN ; ; IF NOT FIRST SELECT OR LOGON INHIBITED THEN RETURN TABLE PTR ; LD A,(LOGRQ) ;0: LONNNNNNNNNNNNNNNNA%NNNNNNNNNNNNNNNNNNNNN!;FILL DATA WITH 0S LD B,ID_FLGO - ID_PSHO ; PADIDL: LD (HL),0 INC HL DJNZ PADIDL ; ; ELSE XFER ID SECTOR DATA TO TABVNNNNNNNNNNNNNNNNNAKNNNNNNNNNNNNNNNNNNNNNN ELSE USE HARD DISK DEFAULTS ; CALL TRNONE ; NO XLATE LD HL,HDPBK ; ; XFER DATA TO TABLES ; SEL2: LD DE,(CUR_DPB) ;BNNNNNNNNNNNNNNNNAHNNNNNNNNNNNNNNNNNNNNNNME2: ; ; JUST SET TRACK TO 0 ; LD BC,0 ; ; FALL INTO SET TRACK ; ;*********************************************2NNNNNNNNNNNNNNNNNA$ NNNNNNNNNNNNNNNNNNNNNN**************** ; SETDMA: LD (CPM_DMA),BC ; LD A,(BUF_DMAB) ;FETCH BANK ADDRESS SET BY COLD START LD (CPM_DMAB),A ; ; ~NNNNNNNNNNNNNNNNNA*(NNNNNNNNNNNNNNNNNNNNN! {0..N-1} TO PHYSICAL SECTOR {1..N} ; NOTRAN: LD HL,1 ADD HL,BC RET SUBTTL DISK SUPPORT ROUTINES ;++++++++++++++`NNNNNNNNNNNNNNNNNA0ġNNNNNNNNNNNNNNNNNNNNN!+++++++++++++ ; LL_READ: ; ; ENABLE UPLOAD ; XOR A,A LD (IOPB + PB_FLGO),A ; ; DISABLE DOWNLOAD ; LD HL,0 LDNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNŃf4Ѕk9Չq? ڍvCߑ{I啳N뙺V$\)Ģ_-ɦNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNA5NNNNNNNNNNNNNNNNNNNNNN (IOPB + PB_BCNTO),HL ; ; PASS READ SECTOR COMMAND ; LD A,PB_READC JP LL_RW ;+++++++++++++++++++++++++++++++++++++g NNNNNNNNNNNNNNNNNAoNNNNNNNNNNNNNNNNNNNNNNL ;DOUBLE COUNT DEC A JP NZ,LL_WR3 ; LL_WR2: LD (IOPB + PB_BCNTO),HL ; ; PASS WRITE COMMAND ; LD A,PB_WRITC ; ; '#NNNNNNNNNNNNNNNNA XNNNNNNNNNNNNNNNNNNNNNNT RETURN ADDRESS ON STACK PUSH HL ; LD L,(IX + DDT_EXE) ;FETCH DRIVER ADDRESS FROM TABLE LD H,(IX + DDT_EXE + 1) JP (HL,NNNNNNNNNNNNNNNNA$NNNNNNNNNNNNNNNNNNNNNN ; CP A,'A' ;IF ABORT THEN RE-BOOT JP Z,0 ; ; ELSE IF DEBUGGER THEN EXECUTE IT ; CP A,'M' JP Z,MR_BRK ; ; ELSE1NNNNNNNNNNNNNNNNAONNNNNNNNNNNNNNNNNNNNNN********************************************************************** ; ; SET NO SECTOR TRANSLATION PROCEDURE ; EXIT - HL, DNNNNNNNNNNNNNNNNNAINNNNNNNNNNNNNNNNNNNNNN RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; HARD DISK DRIVER FUNCTION ; ENTRo!NNNNNNNNNNNNNNNNA%NNNNNNNNNNNNNNNNNNNNNNL ;SAVE ORIGINAL DATA ; LD A,(IOPB + PB_SECO + 1) ADD A,A ;BIT 15 -> BIT_BUCKET ; SRL H RR L RRA ;TRK BIT 0 -l!NNNNNNNNNNNNNNNNA+,NNNNNNNNNNNNNNNNNNNNNNN -1 ; LD A,C CP A,MAXFUNCS LD A,-1 RET NC ; ; ELSE COMPUTE TABLE ENTRY ; PUSH HL ;SAVE POSSIBLE DATA ; LD H6NNNNNNNNNNNNNNNNAfNNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++ ; ; LOW LEVEL WRITE ; ENTRY- IX= DDT PTR ; IY= DPB PTR ; EXIT - IOPB.PB_STATO, A= )$NNNNNNNNNNNNNNNNNANNNNNNNNNNNNNNNNNNNNNN FALL INTO COMMON CODE ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; COMMON IOPB 7INNNNNNNNNNNNNNNNA NNNNNNNNNNNNNNNNNNNNNN) ; ; DRIVER RETURNS HERE ; LL_OPRET: ; ; IF NO ERRORS THEN RETURN ZF ; RET Z ;IF NO_ERROR THEN RETURN ; ; PRIN PNNNNNNNNNNNNNNNNA9NNNNNNNNNNNNNNNNNNNNN! IF IGNORE THEN RETURN NO ERROR ; SUB A,'I' ;IF IGNORE THEN RETURN NO ERROR RET Z ; ; ELSE RETURN ERROR TO BDOS ; L\,NNNNNNNNNNNNNNNNANNNNNNNNNNNNNNNNNNNNNNE= ? ; ;**************************************************************************** ; TRNONE: LD DE,0 JR SETTR SUBTNNNNNNNNNNNNNNNNNA NNNNNNNNNNNNNNNNNNNNNNY- IX= DRIVER TABLE PTR ; EXIT - A= 0: OK; /0: ERROR ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++HNNNNNNNNNNNNNNNNNA&ZDNNNNNNNNNNNNNNNNNNNNNN> SECTOR BIT 15 LD (IOPB + PB_SECO + 1),A ; LD (IOPB + PB_TRKO),HL ;TRACK = RESIDUAL ; ; EXECUTE THE IOPB ; CALL XPR]RNNNNNNNNNNNNNNNNNA,NNNNNNNNNNNNNNNNNNNNN!L,BFUNTBL LD A,C ADD A,A ADD A,L LD L,A LD A,0 ADC A,H LD H,A ; ; EXECUTE TABLE ADDRESS ; LD A,(HL) INC HCrNNNNNNNNNNNNNNNNAWNNNNNNNNNNNNNNNNNNNNNNSTATUS ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; LL_WRIT: ; ; IF STILL PROTECTED1NNNNNNNNNNNNNNNNNA LNNNNNNNNNNNNNNNNNNNNNNEXECUTER ; ENTRY- A= COMMAND ; IX= DRIVE TABLE PTR ; IY= DPB PTR ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++ =HNNNNNNNNNNNNNNNNNA:NNNNNNNNNNNNNNNNNNNNNNT ERROR ; IOPBDMP: LD A,(BUF_DMAB) ;SET BANK LD E,A ; LD HL,IOPB LD A,MF_DIOB ;USE DISPLAY IOPB DATA FUNCTION CALL <NNNNNNNNNNNNNNNNA NNNNNNNNNNNNNNNNNNNNNND A,-1 ;RETURN -1 TO BDOS OR A,A RET ; ; ; DISPLAY WRITE PROTECT ERROR MESSAGE ; DO_ERR: LD HL,WP_ERM CALL EDITOR )NNNNNNNNNNNNNNNNNNA)NNNNNNNNNNNNNNNNNNNNNNTL HARD DISK ROUTINES ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EXECUTE THE IOPB PRIMNNNNNNNNNNNNNNNNNA!NNNNNNNNNNNNNNNNNNNNNN+++++++ ; HDEXEC: EQU XPRIM SUBTTL JADE FLOPPY DRIVER ROUTINES ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++NNNNNNNNNNNNNNNNNNA'iuNNNNNNNNNNNNNNNNNNNNNNIM ; ; RESTORE THE MODIFIED IOPB SO RETRY WILL WORK ; POP HL ;TRACK LD (IOPB + PB_TRKO),HL ; LD HL,IOPB + PB_SECO d'NNNNNNNNNNNNNNNNA-NNNNNNNNNNNNNNNNNNNNNNL LD H,(HL) LD L,A ; EX (SP),HL ;PUT CALLER'S DATA IN HL, FUNCTION ADDR ON RET ; STACK, EXECUTE FUNCTION ADDRESS ON VNNNNNNNNNNNNNNNNA:NNNNNNNNNNNNNNNNNNNNN! THEN ERROR ; LD A,(WR_PROT) OR A,A JR NZ,DO_ERR ; ; INHIBIT UPLOAD ; LD A,1 SHL PB_INHX LD (IOPB + PB_FLGO),A CNNNNNNNNNNNNNNNNNA NNNNNNNNNNNNNNNNNNNNN!+++++++++++++++++++++++ ; LL_RW: LD (IOPB + PB_CMDO),A ; ; OFFSET SECTOR ; LD HL,(IOPB + PB_SECO) LD A,L ADD A,(IX NNNNNNNNNNNNNNNNNAwNNNNNNNNNNNNNNNNNNNNNNXMROM ; ; QUERY USER FOR OPTION ; LD HL,DSKEB CALL EDITOR ; ; GET USER RESPONSE ; CALL CI ;GET USER RESPONSE ;DrNNNNNNNNNNNNNNNNA_NNNNNNNNNNNNNNNNNNNNN! JR IOPBDMP ;**************************************************************************** ; ; SET 3740 SECTOR TRANSLATIO`NNNNNNNNNNNNNNNNNANNNNNNNNNNNNNNNNNNNNN!ITIVE ; EXIT - A= 0: OK, /0: ERROR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; XPRIM:0DNNNNNNNNNNNNNNNNA"NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++ ; ; JADE 8" FLOPPY DISK DRIVER FUNCTION ; ENTRY- IY= DRIVER TABLE PTR ; EXIT - A= 0: OK; /0: ERROR ; rNNNNNNNNNNNNNNNNNA(yKNNNNNNNNNNNNNNNNNNNNNN+1 ;CLEAR BIT 15 RES 7,(HL) ; ; DONE ; RET SUBTTL BIOS FUNCTION CALLS ;+++++++++++++++++++++++++++++++++++++++++NNNNNNNNNNNNNNNNNA.NNNNNNNNNNNNNNNNNNNNNNSTACK ;############################################################################ ; ; BIOS FUNCTION TABLE ; ;########5NNNNNNNNNNNNNNNNNA NNNNNNNNNNNNNNNNNNNNNN; ; CALCULATE DOWNLOAD BYTE COUNT ; LD A,(IY + DPB_PSH) ;USE SHIFT FACTOR {0:128, 1:256, 2:512, 3:1024} LD HL,128 ;STAR[NNNNNNNNNNNNNNNNNA *NNNNNNNNNNNNNNNNNNNNNN+ DDT_SOF) LD L,A LD A,H ADC A,(IX + DDT_SOF + 1) LD H,A LD (IOPB + PB_SECO),HL ; ; SET PHYSICAL DRIVE ; LL_DO: w NNNNNNNNNNNNNNNNNAFNNNNNNNNNNNNNNNNNNNNNN PUSH AF ;SAVE CHAR LD C,A ;ECHO CHAR CALL COC CALL CRLF ;NEW LINE POP AF ; AND A,5FH ;INSURE UPPER CASE ; ; vNNNNNNNNNNNNNNNNNAlNNNNNNNNNNNNNNNNNNNNNNN PROCEDURE ; ENTRY- (CUR_DPH)= MUST BE PTR TO DPH ; EXIT - DE, HL= ? ; ;***************************************************)NNNNNNNNNNNNNNNNA+NNNNNNNNNNNNNNNNNNNNNN ; ; EXECUTE THE PRIMITIVE IN ROM ; LD A,(BUF_DMAB) ;PRESET IOPB BANK LD E,A ; LD HL,IOPB CALL MR_XIOB ;EXECUTE TmBNNNNNNNNNNNNNNNNA#NNNNNNNNNNNNNNNNNNNNNN ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; FD8EXEC: ; ; IF HEADS == 1 THEN EXECUTE IMNNNNNNNNNNNNNNNNNA)JzNNNNNNNNNNNNNNNNNNNNN!+++++++++++++++++++++++++++++++++++ ; ; FUNCTION DISPATCHER ; ENTRY- C= FUNCTION # ; EXIT - A= -1: ERROR, 0: OK ; ;+++++++NNNNNNNNNNNNNNNNNA/NNNNNNNNNNNNNNNNNNNNNN#################################################################### ; BFUNTBL: DW RETVERS ;0:RETURN VERSION # DW RETDVRT !NNNNNNNNNNNNNNNNA\NNNNNNNNNNNNNNNNNNNNNNT WITH 128 BYTES ; AND A,3 ;LIMIT TO 1024-BYTE SECTORS ; JR Z,LL_WR2 ;IF SHIFT_FACTOR == 0 THEN DONE ; LL_WR3: ADD HL,HNNNNNNNNNNNNNNNNNA iNNNNNNNNNNNNNNNNNNNNNNLD A,(IX + DDT_DRV) LD (IOPB + PB_DRVO),A ; ; FETCH DRIVER VECTOR & EXECUTE DISK DRIVER ; LL_OPLP: LD HL,LL_OPRET ;PU\NNNNNNNNNNNNNNNNANNNNNNNNNNNNNNNNNNNNNN IF RETRY THEN TRY AGAIN ; CP A,'R' ;IF RETRY THEN RETURN TO CALLER JR Z,LL_OPLP ; ; ELSE IF ABORT THEN DO WARM BOOT %INNNNNNNNNNNNNNNNNA|NNNNNNNNNNNNNNNNNNNNNN************************* ; TR8: LD DE,SDTRAN ; SETTR: LD HL,(CUR_DPH) LD (HL),E INC HL LD (HL),D RET ;*******NNNNNNNNNNNNNNNNAxNNNNNNNNNNNNNNNNNNNNNNHE FUNCTION ; OR A,A ;FUNCTION ERR? RET NZ ; ; RETURN THE COMMAND RESULTS STATUS ; LD A,(IOPB + PB_STATO) OR A,A (HNNNNNNNNNNNNNNNNNA$<&NNNNNNNNNNNNNNNNNNNNNNOPB ; LD A,(IX + DDT_HDS) DEC A JP Z,XPRIM ; ; ELSE SELECT SIDE FROM TRACK BIT 0 ; LD HL,(IOPB + PB_TRKO) PUSH HNNNNNNNNNNNNNNNNNA*)NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; BIOFUNC: ; ; IF FUNCTION # NOT IN TABLE THEN RETUR1NNNNNNNNNNNNNNNNNA0NNNNNNNNNNNNNNNNNNNNNNF ;1:RETURN DISK PHYSICAL CONFIGURATION TABLE PTR MAXFUNCS EQU ($ - BFUNTBL) / 2 ;++++++++++++++++++++++++++++++++++++++++T'NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN8NNNNNNNNсk8Ӆo= ׉r@ۍwEᑯ|J敳O왻X&]*Ƣb0̦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNBiNNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++ ; ; RETURN BIOS VERSION # FUNCTION #0 ; EXIT - HL= VERSION # IN BINARY {0.00,..655.35} NNNNNNNNNNNNNNNNNBNNNNNNNNNNNNNNNNNNNNN!N DRIVER TABLE PTR FUNCTION ; ENTRY- C= DRIVE # ; EXIT - E:HL= DRIVER TABLE BASE PTR ; NZ= ILLEGAL DRIVE (HL= 0) ; A, B, CNNNNNNNNNNNNNNNNB ,NNNNNNNNNNNNNNNNNNNNNNXIT - A= BANK # ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; GETBNK: LD A,MF_GBNK JNNNNNNNNNNNNNNNNB NNNNNNNNNNNNNNNNNNNNNN*************************** INTCPT: LD A,C ;CHECK CALL VALIDITY CP A,41 ;IF <= 40 THEN OK ; BDOSV EQU $ + 1 JP C,BDOS +BNNNNNNNNNNNNNNNNBNNNNNNNNNNNNNNNNNNNNN! CALL EDITOR ; ; OUTPUT FUNCTION # ; POP BC LD A,MF_PHXB CALL XMROM ; ; OUTPUT NEW LINE ; CALL CRLF ; ; REK NNNNNNNNNNNNNNNNNBINNNNNNNNNNNNNNNNNNNNNN ; CLKCAL: LD A,MF_GCAL JP XMROM ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; NNNNNNNNNNNNNNNNB%NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++ ; CI: LD A,MF_CI JP XMROM ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++NNNNNNNNNNNNNNNNNNB+NNNNNNNNNNNNNNNNNNNNN!+++++++++++++++++++++++++++++++++ ; READER: LD A,CTRLZ ;FAKE EOF ; ; FALL INTO PUNCH RETURN ; ;********************K!NNNNNNNNNNNNNNNNBNNNNNNNNNNNNNNNNNB NNNNNNNNNNNNNNNNNNNNNN NOT CLOCK THEN ERR JR C,ILLEGC ; JR Z,CLKCAL ;IF CALENDAR THEN GET IT ; CP A,92H JR Z,CLKTIM ;IF TIME THEN GET IT ; NNNNNNNNNNNNNNNNB/NNNNNNNNNNNNNNNNNNNNNN ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN CALENDAR FUNCTION 90H ; EXIT - A= D;!NNNNNNNNNNNNNNNNB# ]NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++ ; XMROM: EQU MR_FUN SUBTTL CHAR I/O ROUTINES ;+++++++++++++++++++++++++++++++++++++XLNNNNNNNNNNNNNNNNNB)NNNNNNNNNNNNNNNNNNNNNN******************************************* ; COC: LD A,MF_CO JP XMROM ;+++++++++++++++++++++++++++++++++++++++++++++NNNNNNNNNNNNNNNNNB/L0NNNNNNNNNNNNNNNNNNNNNN****************************** ; LO: LD A,MF_LO JP XMROM ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++NNNNNNNNNNNNNNNNBNNNNNNNNNNNNNNNNNNNNNN! ; ; FALL INTO LOCAL ENTRY ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURoyNNNNNNNNNNNNNNNNNNB NNNNNNNNNNNNNNNNNNNNNNA,A RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; GET BANK NUMBER FUNCTION ; Ex9NNNNNNNNNNNNNNNNB?NNNNNNNNNNNNNNNNNNNNNNIF ILLEGAL. ALSO IMPLEMENTS CDOS CLOCK/CALENDAR ; SYSTEM CALLS FOR ASMB. ; ;************************************************NNNNNNNNNNNNNNNNNNB2NNNNNNNNNNNNNNNNNNNNNN ; ILLEGAL SYSTEM CALL ; ILLEGC: PUSH BC ;SAVE FUNCTION # ; ; OUTPUT WARNING MESSAGE ; LD HL,ISCMSG ;OUTPUT WARNING 9NNNNNNNNNNNNNNNNBzNNNNNNNNNNNNNNNNNNNNN!AY ; B= MONTH ; C= YEAR ; L= DAY OF WEEK ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++YNNNNNNNNNNNNNNNNNB$NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++ ; ; CONSOLE INPUT ; EXIT - A= CHAR ; ;+++++++++++++++++++++++++++++++++++++++++++++}@'NNNNNNNNNNNNNNNNNB*NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++ ; ; READER DRIVER - DUMMY ; EXIT - A= CTRL-Z ; ;+++++++++++++++++++++++++++++++++++++++++++zINNNNNNNNNNNNNNNNNB0_}NNNNNNNNNNNNNNNNNNNNN!+++++++++++++++++ ; ; RETURN LIST DEVICE STATUS ; EXIT - A= 0: BUSY, FFH:READY ; ;+++++++++++++++++++++++++++++++++++++++++HNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN8NNŃh5Ѕl:Չp> ؍tAݑyF㕰~K癶R 흺W%[*ƦNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNB^NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++ ; LISTST: LD A,MF_LOS JP XMROM ;*************************************************NNNNNNNNNNNNNNNNNBONNNNNNNNNNNNNNNNNNNNNNPARAMETER BLOCK ; ;############################################################################ ; IOPB: REPT PB_SIZE LIST 8NNNNNNNNNNNNNNNNB NNNNNNNNNNNNNNNNNNNNNNCTOR OFFSET ; ; DEFINE THE STRUCTURE SIZE ; DDT_SIZ DS 0 ENDM ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@NNNNNNNNNNNNNNNNB;NNNNNNNNNNNNNNNNNNNNNNH,D0DPB,D0DPH,4,0 ; B DDT_1: ALLDRV HDEXEC,4,12H,D1DPB,D1DPH,4,8000H ; C DDT_2: ALLDRV HDEXEC,5,10H,D2DPB,D2DPH,4,0 ; }BNNNNNNNNNNNNNNNNB3NNNNNNNNNNNNNNNNNNNNNN######################################## ; MSGLE: DM CR,LF,'LOAD ERROR' ; DSKEB: DM CR,LF,'Abort, Ignore, Retry, (BDOS) - ' ϾNNNNNNNNNNNNNNNNNB~NNNNNNNNNNNNNNNNNNNNN!RECORD MASK DW 0 ;LOGICAL DRIVE SECTOR OFFSET ; ; DEFAULT DISK PHYSICAL PARAMETERS ; DB 1 ;HEADS ;##############BNNNNNNNNNNNNNNNNB%NNNNNNNNNNNNNNNNNNNNN!IVE SECTOR OFFSET (SOF) ; ; ; DB 4 ;HEADS ;##########################################################################-NNNNNNNNNNNNNNNNNNB+NNNNNNNNNNNNNNNNNNNNNN STHD) DW 0 ;;NO CHECKS ON HARD DISK ELSE DW D#D(DD)CHK ;;DRIVE DISK CHECKSUMS ARRAY PTR ENDIF DW D#D(DD)ALL ;;DRNNNNNNNNNNNNNNNNB NNNNNNNNNNNNNNNNNNNNNN*************************** ; ; MESSAGE EDITOR ; ENTRY- HL= TEXT PTR (BIT 7= 1: TERMINATOR) ; EXIT - REGS= ? ; ;**********$NNNNNNNNNNNNNNNNNBqNNNNNNNNNNNNNNNNNNNNNNOFF DB 0 LIST ON ENDM ;############################################################################ ; ; DISK DRIVER$NNNNNNNNNNNNNNNNBNNNNNNNNNNNNNNNNNNNNNNN@@@@@@@@@@@@@@@@@@@@@@@@ ; ; MACRO TO DEFINE THE DRIVER TABLE RECORD ; ENTRY- #DADD= DRIVER ADDRESS ; #PD= PHYSICAL DRIVE #NNNNNNNNNNNNNNNNBoNNNNNNNNNNNNNNNNNNNNN! D DDT_3: ALLDRV HDEXEC,5,12H,D3DPB,D3DPH,4,8000H ; E DDT_4: ALLDRV FD8EXEC,0,0,D4DPB,D4DPH,1,0 ; F DDT_5: ALLDRV FD8EXYrNNNNNNNNNNNNNNNNB`NNNNNNNNNNNNNNNNNNNNN! ; WP_ERM: DM CR,LF,'W-PROT Error!' ; IF INTCPTS ISCMSG: DM CR,LF,'ILL SYS CALL, #= ' ENDIF ;###################NNNNNNNNNNNNNNNNNNB k>NNNNNNNNNNNNNNNNNNNNNN############################################################## ; ; DEFAULT 8" HARD DISK PARAMETER BLOCK ; ;#################6NNNNNNNNNNNNNNNNNB&NNNNNNNNNNNNNNNNNNNNN!## ; ; DRIVE PARAMETER HEADER AREA ; 1 PER DRIVE ; ;#######################################################################"NNNNNNNNNNNNNNNNB,.SNNNNNNNNNNNNNNNNNNNNN!IVE CLUSTER ALLOCATION BIT MAP PTR LIST OFF ENDM ; ; DEFINE THE DATA ; DD DL 1 REPT NDRVS LIST OFF ALLDPH 012345rNNNNNNNNNNNNNNNNB8NNNNNNNNNNNNNNNNNNNNNN****************************************************************** ; EDITOR: CALL GETBNK LD E,A LD A,MF_PUTS JP XMROM aNNNNNNNNNNNNNNNNB @NNNNNNNNNNNNNNNNNNNNNN TABLES (DDT) ; ;############################################################################ ; STRUCT 0 DDT_EXE DS 2 ;STAd7NNNNNNNNNNNNNNNNNB}NNNNNNNNNNNNNNNNNNNNN! ; #FLG= DRIVE FLAGS ; #DPB= DPB ADDRESS ; #DPH= DPH ADDRESS ; #HDS= HEADS ; #SOF= SECTOR OFFSET ; ;@@@@@@@@@@@@@@@@^BNNNNNNNNNNNNNNNNB^NNNNNNNNNNNNNNNNNNNNNNEC,1,0,D5DPB,D5DPH,1,0 ENDIF IF BOOT = 3 ; A DDT_0: ALLDRV FD8EXEC,0,0,D0DPB,D0DPH,1,0 ; B DDT_1: ALLDRV FD8EXECLNNNNNNNNNNNNNNNNNBQNNNNNNNNNNNNNNNNNNNNNN######################################################### ; ; DEFAULT 8" FLOPPY DISK PARAMETER BLOCK ; IBM 3740 SINGLE DENSIT)NNNNNNNNNNNNNNNNNB!XNNNNNNNNNNNNNNNNNNNNNN########################################################### ; HDPBK: DW 128 ;SECTORS PER TRACK (LOGICAL) (SPT) DB 5 ;BLOCKldNNNNNNNNNNNNNNNNNB'NNNNNNNNNNNNNNNNNNNNNN##### ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; GENERATE A DISK PARAMETER TABLE MAZAHNNNNNNNNNNNNNNNNB-bNNNNNNNNNNNNNNNNNNNNNN6789ABCDEF DD DL DD + 1 LIST ON ENDM ;############################################################################ ; ;yNNNNNNNNNNNNNNNNBNNNNNNNNNNNNNNNNNNNNNN SUBTTL INITIALIZED DATA ;############################################################################ ; ; 3740 SECTOR T8NNNNNNNNNNNNNNNNNNB NNNNNNNNNNNNNNNNNNNNNNRT ADDRESS OF DISK DRIVER DDT_FLG DS 1 ;FLAGS BIT DEF. ; 0 1: INHIBIT LOGON ; 1..3 PARTITION # {0,..7} ; 4 1: HARDrNNNNNNNNNNNNNNNNNBnNNNNNNNNNNNNNNNNNNNNN!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ALLDRV MACRO #DADD,#PD,#FLG,#DPB,#DPH,#HDS,#SOF DW #DADD ;DR/erNNNNNNNNNNNNNNNNB NNNNNNNNNNNNNNNNNNNNNN,1,0,D1DPB,D1DPH,1,0 ; C DDT_2: ALLDRV HDEXEC,4,10H,D2DPB,D2DPH,4,0 ; D DDT_3: ALLDRV HDEXEC,4,12H,D3DPB,D3DPH,4,8000H NNNNNNNNNNNNNNNNNB+NNNNNNNNNNNNNNNNNNNNNNY FORMAT ; ;############################################################################ ; SD8PBK: DW 26 ;SECTORS PER TRACKTNNNNNNNNNNNNNNNNB" \NNNNNNNNNNNNNNNNNNNNNN SHIFT FACTOR (BSH) DB 31 ;BLOCK MASK (BLM) DB 1 ;NULL MASK (EXM) DW 1015 ;DISK SIZE (CLUSTERS -1) (DSM) DW 1152CNNNNNNNNNNNNNNNNNB(NNNNNNNNNNNNNNNNNNNNNNCRO ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ALLDPH: MACRO #D LIST ON D#D(DD)DPHLNNNNNNNNNNNNNNNNNB.H1NNNNNNNNNNNNNNNNNNNNNN ; LOGON IOPB OVERLAY ; ;############################################################################ ; LOGIOPB: DB PB_LOGNNNNNNNNNNNNNNNNNB-NNNNNNNNNNNNNNNNNNNNNNRANSLATION TABLE ; **** CP/M SINGLE DENSITY **** ; ;#########################################################################tgNNNNNNNNNNNNNNNNNB "NNNNNNNNNNNNNNNNNNNNNN DISK DRIVE ; DDT_DRV DS 1 ;PHYSICAL DRIVE # DDT_DPB DS 2 ;DPB ADDRESS FOR THIS DRIVE DDT_DPH DS 2 ;DPH ADDRESS FOR THISCrNNNNNNNNNNNNNNNNNB]NNNNNNNNNNNNNNNNNNNNNNIVER EXECUTION ADDR DB #FLG ;FLAGS DB #PD ;MONITOR PHYSICAL DRIVE # DW #DPB ;DISK PARAMETER BLOCK PTR DW #DPH ;DISK NNNNNNNNNNNNNNNNNBmNNNNNNNNNNNNNNNNNNNNNN / 2 ;DIRECTORY MAX (DRM) DB 0FFH ;ALLOCATION 0 (AL0) DB 10000000B ;ALLOCATION 1 (AL1) DW 0 ;CHECK SIZE (CKS) 4NNNNNNNNNNNNNNNNNB)ѦNNNNNNNNNNNNNNNNNNNNNN: ;DRIVE PARAMETER HEADER FOR DRIVE #D(DD) DW 0 ;;SECTOR TRAN TBL (OR 0 IF NO XLATE) DW 0 ;;SCRATCH AREA DW 0 ;;" DNNNNNNNNNNNNNNNNNB/{NNNNNNNNNNNNNNNNNNNNNNC ;COMMAND DB 0 ;DRIVE DW 0 ;TRACK DW ID_SECT ;SECTOR DB 0 ;FLAGS DW BLKBUF ;DMA DB 0 ;BANK DW 0 ;COUNT ; WR_PNNNNNNNNNNNNNNNNB~NNNNNNNNNNNNNNNNNNNNNN### ; SDTRAN: GXLATE 26,6 ;############################################################################ ; ; COMMON I/O NNNNNNNNNNNNNNNNNB (NNNNNNNNNNNNNNNNNNNNN! DRIVE ; ; THE FOLLOWING MAY BE BROUGHT OFF DISK DESCRIPTOR OR FROM DEFAULT TABLES ; DDT_HDS DS 1 ;HEADS DDT_SOF DS 2 ;SE:NNNNNNNNNNNNNNNNBNNNNNNNNNNNNNNNNNNNNN!PARAMETER HEADER PTR DB #HDS ;HEADS DW #SOF ;SECTOR OFFSET ; ENDM IF BOOT = 10H ; A DDT_0: ALLDRV HDEXEC,4,105 NNNNNNNNNNNNNNNNNBNNNNNNNNNNNNNNNNNNNNNN##################################################################### ; ; MESSAGES ; ;####################################NNNNNNNNNNNNNNNNBMNNNNNNNNNNNNNNNNNNNNNN0B ;ALLOC 0 DB 0 ;ALLOC 1 DW 16 ;CHECK SIZE DW 2 ;TRACK OFFSET DB 0 ;PHYSICAL RECORD SHIFT FACTOR DB 0 ;PHYSICAL NNNNNNNNNNNNNNNNNB$NNNNNNNNNNNNNNNNNNNNNNDW 2 ;TRACK OFFSET (OFF) DB 1 ;PHYSICAL RECORD SHIFT FACTOR (PSH) DB 1 ;PHYSICAL RECORD MASK (PRM) DW 0 ;LOGICAL DR`NNNNNNNNNNNNNNNNNB*NNNNNNNNNNNNNNNNNNNNNNW 0 ;;" DW DIRBF ;;DIRECTORY BUFFER PTR DW D#D(DD)DPB ;;DRIVE PARAMETER BLK PTR IF ((DD - 1) <= NDHD) AND ((DD - 1) >=(INNNNNNNNNNNNNNNNNB0hMNNNNNNNNNNNNNNNNNNNNN!ROT DB -1 ;/0: WRITE PROTECTION ENABLED ; ; LAST OF INITIALIZED CODE READ FROM DISK ; BIOSND EQU $ SUBTTL UNINITIALI $NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN8NNNNNNNNсk8Ӆn< ׉r@ۍwD{I啲M陸T"𝽞Z)â^,ȦNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNCmNNNNNNNNNNNNNNNNNNNNN!ZED DATA AREA ;############################################################################ ; ; THE FOLLOWING DATA MUST RES+NNNNNNNNNNNNNNNNNCNNNNNNNNNNNNNNNNNNNNN!ER BUF_MOD DS 1 ;0: BUFFER CLEAN, /0: BUFFER DIRTY (MODIFIED) ; BUF_DDT DS 2 ;BUFFER DDT PTR BUF_DPB DS 2 ;BUFFER DPB PTR ;INNNNNNNNNNNNNNNNC ZNNNNNNNNNNNNNNNNNNNNNN############################## ; CUR_DPB DS 2 ;DRIVE TABLE PTR CUR_DDT DS 2 ;DRIVE DRIVER TABLE BASE ADDRESS PTR CUR_DPH DS HBNNNNNNNNNNNNNNNNCz|NNNNNNNNNNNNNNNNNNNNN!RD DRIVE #D(DD) ENDIF IF ((DD - 1) >= ST8FD) AND ((DD - 1) <= ND8FD) D#D(DD)ALL: DS 75 ;ALLOCATION BIT MAP FOR 8" DRIVE·NNNNNNNNNNNNNNNNCNNNNNNNNNNNNNNNNNNNNNN, 4K= 31, 8K= 63, 16K= 127 DPB_EXM DS 1 ;EXM- EXTENT MASK ; DSM < 256 : 1K= 0, 2K= 1, 4K= 3, 8K= 7, 16K= 15 ; DSM > 255w NNNNNNNNNNNNNNNNNC?NNNNNNNNNNNNNNNNNNNNNNSEC ; 0: 128, 1: 256, 3: 512, 7: 1024 ; ; ADDITIONAL DISK PARTITIONING DATA FOR THE LOGICAL DRIVE SELECTION. ; PARTITIO%rNNNNNNNNNNNNNNNNC%ONNNNNNNNNNNNNNNNNNNNNNDD DL 1 REPT NDRVS LIST OFF ALLDPB 0123456789ABCDEF DD DL DD + 1 LIST ON ENDM ; ; BLOCKING BUFFER ; BLKBUF: DS1BNNNNNNNNNNNNNNNNC+@NNNNNNNNNNNNNNNNNNNNNN ENDIF ENDIF LIST ON ; ; LAST OF INITIALIZED CODE READ FROM DISK ; BIOSND EQU $ SUBTTL UNINITIALIZED DATA A"rNNNNNNNNNNNNNNNNNCJ>NNNNNNNNNNNNNNNNNNNNNNIDE IN THIS ORDER TO MATCH THE IOPB DATA ; ;############################################################################ ; ;XTNNNNNNNNNNNNNNNNNCNNNNNNNNNNNNNNNNNNNNNN RSFLAG: DS 1 ;0: NO PREREAD REQ'D, /0: PREREAD REQ'D READOP: DS 1 ;0: WRITE OPERATION, 1: READ OPERATION WRTYPE: DS 1 ;WRITE}NNNNNNNNNNNNNNNNCSNNNNNNNNNNNNNNNNNNNNN!2 ;DPH PTR ; LOGRQ: DS 1 ;LOG ON REQUEST REG. ;##########################################################################wNNNNNNNNNNNNNNNNCNNNNNNNNNNNNNNNNNNNNN! #D(DD) D#D(DD)CHK DS 32 ;DIRECTORY CHECKSUMS STORAGE (1 BYTE PER SECTOR) ENDIF LIST OFF ENDM ; ; RESERVE THE DA;ONNNNNNNNNNNNNNNNCNNNNNNNNNNNNNNNNNNNNN! : 2K= 0, 4K= 1, 8K= 3, 16K= 7 DPB_DSM DS 2 ;DSM- DRIVE STORAGE SIZE (IN CLUSTERS) ; INT(((#_TRACKS - OFF) * SPT * BYTES PERNNNNNNNNNNNNNNNNNC *NNNNNNNNNNNNNNNNNNNNNNNING BY TRACKS ARE IMPLIMENTED THRU BDOS USING DPBOFF ABOVE. ; PARTITIONING BY HEADS ARE IMPLIMENTED BY USING THE FOLLOWING DATNNNNNNNNNNNNNNNNNNC&NNNNNNNNNNNNNNNNNNNNN! 1024 ;HOST BUFFER IF (($ - 8000H) > 07700H) OR ($ < 8000H) CONMSG **** BIOS TOO BIG, USE MOVCPM & RE-ADJUST! **** NNNNNNNNNNNNNNNNNC,oNNNNNNNNNNNNNNNNNNNNNNREA ;############################################################################ ; ; VARIABLES ; ;######################rNNNNNNNNNNNNNNNNCyNNNNNNNNNNNNNNNNNNNNNN CP/M IOPB OVERLAY ; CPM_DSK DS 1 ;LOGICAL DRIVE CPM_TRK DS 2 ;LOGICAL TRACK NUMBER CPM_SEC DS 2 ;LOGICAL SECTOR NUMBER lNNNNNNNNNNNNNNNNNC NNNNNNNNNNNNNNNNNNNNN! OPERATION TYPE FROM BDOS: ; 0: WRITE TO ALLOCATED (USED) BLOCK (PREREAD) ; 1: WRITE TO DIRECTORY (PREREAD & WRITE) ; HNNNNNNNNNNNNNNNNNCNNNNNNNNNNNNNNNNNC(NNNNNNNNNNNNNNNNNNNNN!_WR,H8_RD,0,0,5,10H,0 ALLDPH 4,0,F8_WR,F8_RD,0,0,0,0,D4CHK ALLDPH 5,0,F8_WR,F8_RD,0,0,1,0,D5CHK ELSE IF BOOT < 30H 2=NNNNNNNNNNNNNNNNNNC. NNNNNNNNNNNNNNNNNNNNNN 1 ;LOGICAL DRIVE SEK_TRK: DS 2 ;LOGICAL TRACK NUMBER SEK_SEC: DS 2 ;LOGICAL SECTOR NUMBER ; ; THE FOLLOWING ARE SET CdNNNNNNNNNNNNNNNNNNCөNNNNNNNNNNNNNNNNNNNNNNER BUF_TRK DS 2 ;BUFFER TRACK NUMBER BUF_SEC DS 2 ;BUFFER SECTOR NUMBER DS 1 ;FLAGS BUF_DMA DS 2 BUF_DMAB DS 1 ;BANK # ; [NNNNNNNNNNNNNNNNNC NNNNNNNNNNNNNNNNNNNNNNUNA_DSK: DS 1 ;LAST UNALLOC DISK UNA_TRK: DS 2 ;LAST UNALLOC TRACK UNA_SEC: DS 2 ;LAST UNALLOC SECTOR ;##################E NNNNNNNNNNNNNNNNNCNNNNNNNNNNNNNNNNNNNNNNA ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; ALL = (DSM / 8) + 1 ; CHK = DPB.CKS 8NNNNNNNNNNNNNNNNNNCNNNNNNNNNNNNNNNNNNNNNN################################################# ; STRUCT 0 DPB_SPT DS 2 ;SPT- SECTORS/TRACK DPB_BSH DS 1 ;BSH- BLOCK SHIFC\9NNNNNNNNNNNNNNNNCYsNNNNNNNNNNNNNNNNNNNNNNS (USUALLY 2) ; ; ADDITIONAL CP/M 3.0 DATA (ALSO COULD BE USED BY CP/M 2.2 DEBLOCKING) ; DPB_PSH DS 1 ;PSH- PHYSICAL RECOR#NNNNNNNNNNNNNNNNC#NNNNNNNNNNNNNNNNNNNNNN ; GENERATE THE DPB FOR DRIVE MACRO ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ALLDP$NNNNNNNNNNNNNNNNNC)"NNNNNNNNNNNNNNNNNNNNNN;5" FLOPPY BOOT ALLDPH 0,0,F8_WR,F8_RD,0,0,0,0,D0CHK ALLDPH 1,0,F8_WR,F8_RD,0,0,1,0,D1CHK ALLDPH 2,0,H8_WR,H8_RD,0,0,4,10H4 NNNNNNNNNNNNNNNNNC/:NNNNNNNNNNNNNNNNNNNNNNBY THE BUFFER READ/WRITE ; HST_DSK: DS 1 ;BUFFER DISK NUMBER HST_TRK: DS 2 ;BUFFER TRACK NUMBER HST_SEC: DS 2 ;BUFFER SECkNNNNNNNNNNNNNNNNNNCNNNNNNNNNNNNNNNNNNNNNN ; ; BLOCKING BUFFER MAINTENANCE ; BUF_PSEC DS 2 ;BUFFER PHYSICAL SECTOR BUF_ACT DS 1 ;0: BUFFER FLUSHED, /0: DATA IN BUFF;!NNNNNNNNNNNNNNNNC i1NNNNNNNNNNNNNNNNNNNNN!########################################################## ; ; VARIABLES ; ;##############################################NNNNNNNNNNNNNNNNCIMNNNNNNNNNNNNNNNNNNNNNN; ALLDAL: MACRO #D LIST ON IF ((DD - 1) >= STHD) AND ((DD - 1) <= NDHD) D#D(DD)ALL: DS 128 ;ALLOCATION BIT MAP FOR 8" HANNNNNNNNNNNNNNNNNCNNNNNNNNNNNNNNNNNNNNNNT FACTOR DETERMINED BY CLUSTER SIZE ; 1K= 3, 2K= 4, 4K= 5, 8K= 6, 16K= 7 DPB_BLM DS 1 ;BLM- BLOCK MASK ; 1K = 7, 2K= 15)BNNNNNNNNNNNNNNNNC NNNNNNNNNNNNNNNNNNNNNND SHIFT FACTOR BASED ON BYTES/SEC ; 0: 128, 1: 256, 2: 512, 3: 1024 DPB_PHM DS 1 ;PHM- PHYSICAL RECORD MASK BASED ON BYTES/&INNNNNNNNNNNNNNNNNC$~NNNNNNNNNNNNNNNNNNNNNNB: MACRO #D LIST ON D#D(DD)DPB: DS DPB_SZ ;ALLOCATION FOR DRIVE #D(DD) LIST OFF ENDM ; ; RESERVE THE DATA SPACE ; 4NNNNNNNNNNNNNNNNNC*qNNNNNNNNNNNNNNNNNNNNN!,0 ALLDPH 3,80H,H8_WR,H8_RD,0,0,4,10H,0 ALLDPH 4,0,H8_WR,H8_RD,0,0,5,10H,0 ALLDPH 5,80H,H8_WR,H8_RD,0,0,5,10H,0 ENDIF NNNNNNNNNNNNNNNNNC0)NNNNNNNNNNNNNNNNNNNNNNTOR NUMBER ; ; SEK_HST: DS 2 ;PHYSICAL SECTOR TO XFER ; ; FLAGS ; HST_ACT: DS 1 ;0: BUFFER FLUSHED, /0: DATA IN BUF2NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN8NNŃi6҅l:։q? ۍwF⑰}K蕶Q홻X&\*Ǣc1ͦNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNC(]NNNNNNNNNNNNNNNNNNNNNNPPER BITS) ; DPB_SECO DS 2 ;SOF- SECTOR OFFSET (FOR LOGICAL DRIVE) ; 0: NONE, 1..65535: OFFSET DPB_SKT DS 1 ;SKEW TABLE SGNNNNNNNNNNNNNNNNNCNNNNNNNNNNNNNNNNNNNNNNH) > 075FFH) CONMSG **** BIOS TOO BIG, USE MOVCPM & RE-ADJUST! **** ENDIF END ǫNNNNNNNNNNNNNNNNC m0NNNNNNNNNNNNNNNNNNNNNN@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ALLDAL: MACRO #D LIST ON IF ((DD - 1) >= STHD) AND ((DD - 1) <= NDHD) D#D(DD)ALL: DS NNNNNNNNNNNNNNNNNCMLNNNNNNNNNNNNNNNNNNNNNN@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; MACRO TO DEFINE THE DRIVE ALLOCATION & CHECKSUMS AREA ; z9NNNNNNNNNNNNNNNNCNNNNNNNNNNNNNNNNNNNNNNF DD DL DD + 1 LIST ON ENDM ;############################################################################ ; ; RESEW.INNNNNNNNNNNNNNNNNC!NNNNNNNNNNNNNNNNNNNNNNB_AL0 DS 2 ;AL0,1- DIRECTORY ALLOCATION ; 1 MSB PER DIRECTORY CLUSTER ALLOCATED DPB_CKS DS 2 ;CKS- # DIRECTORY SECTORS CHEC@NNNNNNNNNNNNNNNNC%NNNNNNNNNNNNNNNNNNNNN!CO DS 2 ;SOF- SECTOR OFFSET (FOR LOGICAL DRIVE) ; 0: NONE, 1..65535: OFFSET DPB_SKT DS 1 ;SKEW TABLE STARTS HERE, IF USED, CBNNNNNNNNNNNNNNNNC+pNNNNNNNNNNNNNNNNNNNNN! **** BIOS TOO BIG, USE MOVCPM & RE-ADJUST! **** ENDIF END !NNNNNNNNNNNNNNNNC}NNNNNNNNNNNNNNNNNNNNNNTARTS HERE, IF USED, ELSE 0 ; DPB_SZ DS 0 ENDM ; ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@HNNNNNNNNNNNNNNNNNCNNNNNNNNNNNNNNNNNNNNN!; CUR_DPH DS 2 ;DPH PTR CUR_DPB DS 2 ;DPB PTR CUR_BCB DS 2 ;BCB PTR CUR_RD DS 2 ;READ DRIVER PTR CUR_WR DS 2 ;WRITE DRIVER HNNNNNNNNNNNNNNNNC8cNNNNNNNNNNNNNNNNNNNNNN127 ;ALLOCATION BIT MAP FOR 8" HARD DRIVE #D(DD) ENDIF IF ((DD - 1) >= ST8FD) AND ((DD - 1) <= ND8FD) D#D(DD)ALL: DS 57kNNNNNNNNNNNNNNNNNNCNNNNNNNNNNNNNNNNNNNNN! ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; ALL = (DSM / 8) + 1 ; CHK = DPB.CKS ; ALqrNNNNNNNNNNNNNNNNCNNNNNNNNNNNNNNNNNNNNNNRVE DRIVE PARAMETER BLOCKS ; ;############################################################################ ; STRUCT 0 DPB_ NNNNNNNNNNNNNNNNNC NNNNNNNNNNNNNNNNNNNNN!KED ; (DRM +1) / 4 DPB_OFF DS 2 ;OFF- # RESERVED TRACKS (USUALLY 2) ; ; ADDITIONAL CP/M 3.0 DATA (ALSO COULD BE USED BY'NNNNNNNNNNNNNNNNNNC&,NNNNNNNNNNNNNNNNNNNNNNELSE 0 ; DPB_SZ DS 0 ENDM ; ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; GENERATCBNNNNNNNNNNNNNNNNC,XNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNCN?NNNNNNNNNNNNNNNNNNNNNN@@@@@@@ ; ; GENERATE THE DPB FOR DRIVE MACRO ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@eKNNNNNNNNNNNNNNNNNC NNNNNNNNNNNNNNNNNNNNNNPTR CUR_XLAT DS 2 ;XLATION TABLE PTR (0: NONE) CUR_SOFF DS 2 ;SECTOR OFFSET FOR DRIVE CUR_DRV DS 1 ;CURRENT PHYSICAL DRIVE # Í$NNNNNNNNNNNNNNNNNC RNNNNNNNNNNNNNNNNNNNNN! ;ALLOCATION BIT MAP FOR 8" DRIVE #D(DD) D#D(DD)CHK DS 32 ;DIRECTORY CHECKSUMS STORAGE (1 BYTE PER SECTOR) ENDIF LIST nNNNNNNNNNNNNNNNNNNCNNNNNNNNNNNNNNNNNNNNNNLDAL: MACRO #D LIST ON IF DSK_#D(DD) = 10H D#D(DD)ALL: DS 128 ;ALLOCATION BIT MAP FOR 4MB HARD DRIVE #D(DD) ENDIF NNNNNNNNNNNNNNNNNCNNNNNNNNNNNNNNNNNNNNNNSPT DS 2 ;SPT- SECTORS/TRACK DPB_BSH DS 1 ;BSH- BLOCK SHIFT FACTOR DETERMINED BY CLUSTER SIZE ; 1K= 3, 2K= 4, 4K= 5, 8K= 6,t!NNNNNNNNNNNNNNNNC!.NNNNNNNNNNNNNNNNNNNNN! CP/M 2.2 DEBLOCKING) ; DPB_PSH DS 1 ;PSH- PHYSICAL RECORD SHIFT FACTOR BASED ON BYTES/SEC ; 0: 128, 1: 256, 2: 512, 3: 10?NNNNNNNNNNNNNNNNNNC'NNNNNNNNNNNNNNNNNNNNN!E THE DPB FOR DRIVE MACRO ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ALLDPB: MACRO #D_HNNNNNNNNNNNNNNNNC-kNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNCרNNNNNNNNNNNNNNNNNNNNNN ; ALLDPB: MACRO #D LIST ON D#D(DD)DPB: DS DPB_SZ ;ALLOCATION FOR DRIVE #D(DD) IF (DSK_#D(DD) < 10H) OR (DSK_#D(DD) >iNNNNNNNNNNNNNNNNNNC NNNNNNNNNNNNNNNNNNNNNN ;############################################################################ ; ; DRIVE ALLOCATION AREAS ; ;#########NNNNNNNNNNNNNNNNNNCNNNNNNNNNNNNNNNNNNNNNNOFF ENDM ; ; RESERVE THE DATA SPACE ; DD DL 1 REPT NDRVS LIST OFF ALLDAL 0123456789ABCDEF DD DL DD + 1 LIST ON _NNNNNNNNNNNNNNNNNCNNNNNNNNNNNNNNNNNNNNNN IF DSK_#D(DD) = 11H D#D(DD)ALL: DS 256 ;ALLOCATION BIT MAP FOR 8MB HARD DISK #D(DD) ENDIF IF (DSK_#D(DD) AND 0F0H) = 0\NNNNNNNNNNNNNNNNC]rNNNNNNNNNNNNNNNNNNNNNN 16K= 7 DPB_BLM DS 1 ;BLM- BLOCK MASK ; 1K = 7, 2K= 15, 4K= 31, 8K= 63, 16K= 127 DPB_EXM DS 1 ;EXM- EXTENT MASK ; DSM 9NNNNNNNNNNNNNNNNC"{NNNNNNNNNNNNNNNNNNNNN!24 DPB_PHM DS 1 ;PHM- PHYSICAL RECORD MASK BASED ON BYTES/SEC ; 0: 128, 1: 256, 3: 512, 7: 1024 ; ; ADDITIONAL DISK PARNNNNNNNNNNNNNNNNNC(#NNNNNNNNNNNNNNNNNNNNNN LIST ON D#D(DD)DPB: DS DPB_SZ ;ALLOCATION FOR DRIVE #D(DD) IF (DSK_#D(DD) < 10H) OR (DSK_#D(DD) >= 20H) DS SKTSZ - 1NNNNNNNNNNNNNNNNNNC.>NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNCNNNNNNNNNNNNNNNNNNNNNN= 20H) DS SKTSZ - 1 ENDIF LIST OFF ENDM ; ; RESERVE THE DATA SPACE ; DD DL 1 REPT NDRVS LIST OFF ALLDPB 01NNNNNNNNNNNNNNNNNNC ǖNNNNNNNNNNNNNNNNNNNNNN################################################################### ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@NNNNNNNNNNNNNNNNNNC+.NNNNNNNNNNNNNNNNNNNNNNH PTR ; LOGRQ: DS 1 ;LOG ON REQUEST REG. ;############################################################################ ;/NNNNNNNNNNNNNNNNNCNNNNNNNNNNNNNNNNNNNNNN D#D(DD)ALL: DS 75 ;ALLOCATION BIT MAP FOR 8" FLOPPY DRIVE #D(DD) D#D(DD)CHK DS 64 ;DIRECTORY CHECKSUMS STORAGE (1 BYTE PER,9NNNNNNNNNNNNNNNNCnCNNNNNNNNNNNNNNNNNNNNNN< 256 : 1K= 0, 2K= 1, 4K= 3, 8K= 7, 16K= 15 ; DSM > 255 : 2K= 0, 4K= 1, 8K= 3, 16K= 7 DPB_DSM DS 2 ;DSM- DRIVE STORAGE SIZENNNNNNNNNNNNNNNNC#HNNNNNNNNNNNNNNNNNNNNNNTITIONING DATA FOR THE LOGICAL DRIVE SELECTION. ; PARTITIONING BY TRACKS ARE IMPLIMENTED THRU BDOS USING DPBOFF ABOVE. ; PARTI;NNNNNNNNNNNNNNNNNC)NNNNNNNNNNNNNNNNNNNNNN ENDIF LIST OFF ENDM ; ; RESERVE THE DATA SPACE ; DD DL 1 REPT NDRVS LIST OFF ALLDPB 0123456789ABCDEF DD DL$NNNNNNNNNNNNNNNNNC/ NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNCNNNNNNNNNNNNNNNNNNNNNN23456789ABCDEF DD DL DD + 1 LIST ON ENDM ; ; BLOCKING BUFFER ; BLKBUF: DS 1024 ;HOST BUFFER IF (($ AND 07FFFTNNNNNNNNNNNNNNNNNC ^NNNNNNNNNNNNNNNNNNNNNN@@@@@@@@@@@@@@@@@@@@ ; ; MACRO TO DEFINE THE DRIVE ALLOCATION & CHECKSUMS AREA ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@NNNNNNNNNNNNNNNNNNC~}NNNNNNNNNNNNNNNNNNNNNN ; DRIVE ALLOCATION AREAS ; ;############################################################################ ; ;@@@@@@@@@@@@9HNNNNNNNNNNNNNNNNNCNNNNNNNNNNNNNNNNNNNNNN SECTOR) ENDIF LIST OFF ENDM ; ; RESERVE THE DATA SPACE ; DD DL 1 REPT NDRVS LIST OFF ALLDAL 0123456789ABCDENNNNNNNNNNNNNNNNC;NNNNNNNNNNNNNNNNNNNNN! (IN CLUSTERS) ; INT(((#_TRACKS - OFF) * SPT * BYTES PER SECTOR) / CLUSTER SIZE) -1 DPB_DRM DS 2 ;DRM- DIRECTORY SIZE -1 DP'RNNNNNNNNNNNNNNNNNC$NNNNNNNNNNNNNNNNNNNNNNNTIONING BY HEADS ARE IMPLIMENTED BY USING THE FOLLOWING DATA. ; (HEAD BITS ARE INCLUDED IN SECTOR WORD UPPER BITS) ; DPB_SEg\NNNNNNNNNNNNNNNNC*ANNNNNNNNNNNNNNNNNNNNN! DD + 1 LIST ON ENDM ; ; BLOCKING BUFFER ; BLKBUF: DS 1024 ;HOST BUFFER IF (($ AND 07FFFH) > 075FFH) CONMSGxNNNNNNNNNNNNNNNNNC0NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN8NNNNNNNNсm; ؅s@݉xF⍰~L葵Q땺T"񙿚Z'Ğ`.Ȣd1ͦnNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNDN@NNNNNNNNNNNNNNNNNNNNNN BUFFER PTR DW D#D(DD)DPB ;DRIVE PARAMETER BLK PTR IF ((DD - 1) <= NDHD) AND ((DD - 1) >= STHD) DW 0 ;NO CHECKS ON HARNNNNNNNNNNNNNNNNNNDNNNNNNNNNNNNNNNNNNNNN!ST REG. DVRTPTR DS 2 ;DRIVE DRIVER TABLE BASE ADDRESS PTR DVRXADR DS 2 ;DRIVE DRIVER EXECUTION ADDRESS IF INTCPTS ;##ldNNNNNNNNNNNNNNNNNND -NNNNNNNNNNNNNNNNNNNNN!@@@@@@@@@@@@@@@@@@@@@@ ALLDAL: MACRO #D LIST ON IF ((DD - 1) >= STHD) AND ((DD - 1) <= NDHD) D#D(DD)ALL: DS 127 ;ALLOCATINNNNNNNNNNNNNNNND+QNNNNNNNNNNNNNNNNNNNNNN########### ; ; RESERVE DRIVE PARAMETER BLOCKS ; ;########################################################################NNNNNNNNNNNNNNNNNDĚNNNNNNNNNNNNNNNNNNNNN! SECTORS CHECKED ; (DRM +1) / 4 DPBOFF DS 2 ;OFF- # RESERVED TRACKS (USUALLY 2) DPBSZ DS 0 ENDM ; ; ;@@@@@@@@@@@@@@@@HNNNNNNNNNNNNNNNNNDn= ST8FD) AND ((DD - 1) <= ND8FD) D#D(DD)ALL: DS 57 ;ALLOCATION9NNNNNNNNNNNNNNNNNNDNNNNNNNNNNNNNNNNNNNNNN#### STRUCT 0 DPBSPT DS 2 ;SPT- SECTORS/TRACK DPBBSH DS 1 ;BSH- BLOCK SHIFT FACTOR DETERMINED BY CLUSTER SIZE ; 1K= 3, 2 INNNNNNNNNNNNNNNNDNNNNNNNNNNNNNNNNNNNNNN@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; GENERATE THE DPB FOR DRIVE MACRO ; ;@@@@@@@@@@@@@@@@@@@@@@@W=HNNNNNNNNNNNNNNNND {NNNNNNNNNNNNNNNNNNNNNN ENDIF LD A,(DEFDRV) ;PASS IN DEFAULT DISK TO CCP LD C,A JP CCP SUBTTL DISK ROUTINES ;+++++++++++++++++++++++++++++@NNNNNNNNNNNNNNNNND&1NNNNNNNNNNNNNNNNNNNNNNNTERRUPT PROCESSING WHISTLE INTCPTS EQU TRUE ;ENABLE SYSTEM CALL INTERCEPT WHISTLE BOOT EQU 10H ;10H: HARD DISK, 3: 8" FLOPP/NNNNNNNNNNNNNNNNNND,>NNNNNNNNNNNNNNNNNNNNNN 0 ; F JADE 8" FLOPPY PHYSICAL DRIVE 1 ENDIF IF BOOT = 3 ; A JADE 8" FLOPPY PHYSICAL DRIVE 0 ; B JADE 8" FLOPPYNNNNNNNNNNNNNNNND("NNNNNNNNNNNNNNNNNNNNNNR LIST OFF ENDM ; ; DEFINE THE DATA ; DD DL 1 REPT NDRVS LIST OFF ALLDPH 0123456789ABCDEF DD DL DD + 1 LIST OHNNNNNNNNNNNNNNNNND NNNNNNNNNNNNNNNNNNNNN!############################################### CLKBFR DS 13 ENDIF ROMSAV DS 1 ;ROM SWAP SAVE OF ORIGINAL ROM ;######ZNNNNNNNNNNNNNNNNNDmONNNNNNNNNNNNNNNNNNNNN! BIT MAP FOR 8" DRIVE #D(DD) D#D(DD)CHK DS 32 ;DIRECTORY CHECKSUMS STORAGE (1 BYTE PER SECTOR) ENDIF IF ((DD - 1) >= NNNNNNNNNNNNNNNNNDNNNNNNNNNNNNNNNNNNNNNNK= 4, 4K= 5, 8K= 6, 16K= 7 DPBBLM DS 1 ;BLM- BLOCK MASK ; 1K = 7, 2K= 15, 4K= 31, 8K= 63, 16K= 127 DPBEXM DS 1 ;EXM- EXTENrNNNNNNNNNNNNNNNNDNNNNNNNNNNNNNNNNNNNNNN@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ALLDPB: MACRO #D LIST ON D#D(DD)DPB: DS DPBSZ ;ALLOCATION FOR DRIVE #vddNNNNNNNNNNNNNNNNND!HNNNNNNNNNNNNNNNNNNNNN! TITLE CUSTOMIZED BIOS FOR M5B LIST NOCOND ;============================================================================ ; ^rNNNNNNNNNNNNNNNND'NNNNNNNNNNNNNNNNNNNNNNY, 20H: 5" FLOPPY DEBUG EQU FALSE ;TRUE TO DUMP THE IOPB DATA TO PRINTER FORM ;******************************************NNNNNNNNNNNNNNNNND- NNNNNNNNNNNNNNNNNNNNNN PHYSICAL DRIVE 1 ; C SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 0 ; D SIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 0 ; E SIDE 0 NNNNNNNNNNNNNNNNNDNNNNNNNNNNNNNNNNNNNNN!N ENDM ; ; LAST OF INITIALIZED CODE READ FROM DISK ; BIOSND EQU $ SUBTTL UNINITIALIZED DATA AREA ; ; THE REMAINIk'NNNNNNNNNNNNNNNND NNNNNNNNNNNNNNNNNNNNNN###################################################################### ; ; DRIVE ALLOCATION AREAS ; ;#####################rNNNNNNNNNNNNNNNND~NNNNNNNNNNNNNNNNNNNNNN ST5FD) AND ((DD - 1) <= ND5FD) D#D(DD)ALL: DS 35 ;ALLOCATION BIT MAP FOR 5" DRIVE #D(DD) D#D(DD)CHK DS 32 ;DIRECTORY CHECKqNNNNNNNNNNNNNNNNNNDԤNNNNNNNNNNNNNNNNNNNNNNT MASK ; DSM < 256 : 1K= 0, 2K= 1, 4K= 3, 8K= 7, 16K= 15 ; DSM > 255 : 2K= 0, 4K= 1, 8K= 3, 16K= 7 DPBDSM DS 2 ;DSM- DRNNNNNNNNNNNNNNNNND;oNNNNNNNNNNNNNNNNNNNNNND(DD) LIST OFF ENDM ; ; RESERVE THE DATA SPACE ; DD DL 1 REPT NDRVS LIST OFF ALLDPB 0123456789ABCDEF DD DL DD +A9NNNNNNNNNNNNNNND"NNNNNNNNNNNNNNNNNNNNNN; ASSEMBLY PARAMETERS ; ;============================================================================ FALSE EQU 0 TRUE EQU N7'NNNNNNNNNNNNNNNNND(>NNNNNNNNNNNNNNNNNNNNNN********************************** ; ; CUSTOMIZED BIOS FOR M5B ; (c) 1981 GRH Electronics, CUPERTINO, CA ; ;**********'NNNNNNNNNNNNNNNNND.XNNNNNNNNNNNNNNNNNNNNNN& 1 OF HARD DISK PHYSICAL DRIVE 1 ; F SIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 1 ENDIF IF BOOT = 20H ; A JADE 5" FLOxrNNNNNNNNNNNNNNNNNDNNNNNNNNNNNNNNNNNNNNNNNG AREA DOES NOT HAVE TO ; BELONG ON THE DISK. ; BTDRV: DS 1 ;DRIVE # BTTRK DS 2 ;TRACK # BTSEC DS 2 ;SECTOR # BTFLG DS BNNNNNNNNNNNNNNNND NNNNNNNNNNNNNNNNNNNNNN####################################################### ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ugNNNNNNNNNNNNNNNNNDM3NNNNNNNNNNNNNNNNNNNNNNSUMS STORAGE (1 BYTE PER SECTOR) ENDIF LIST OFF ENDM ; ; RESERVE THE DATA SPACE ; DD DL 1 REPT NDRVS LIST OFF $NNNNNNNNNNNNNNNNDNNNNNNNNNNNNNNNNNNNNNNIVE STORAGE SIZE (IN CLUSTERS) ; INT(((#_TRACKS - OFF) * SPT * BYTES PER SECTOR) / CLUSTER SIZE) -1 DPBDRM DS 2 ;DRM- DIRECT'NNNNNNNNNNNNNNNNNND^NNNNNNNNNNNNNNNNNNNNN! 1 LIST ON ENDM IF (($ - 8000H) > 07800H) OR ($ < 8000H) CONMSG **** BIOS TOO BIG, USE MOVCPM & RE-ADJUST! **** HTNNNNNNNNNNNNNNNNND#.NNNNNNNNNNNNNNNNNNNNNNOT FALSE ;============================================================================ ; ; CONDITIONAL ASSEMBLY FLAGS ; ;BNNNNNNNNNNNNNNNND)NNNNNNNNNNNNNNNNNNNNNN****************************************************************** ; ; CONFIGURATION: ; ; CPM ; DRIVE USAGE IF BOOT = 1PNNNNNNNNNNNNNNNNND/kNNNNNNNNNNNNNNNNNNNNNNPPY PHYSICAL DRIVE 0 ; B JADE 5" FLOPPY PHYSICAL DRIVE 1 ; C SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 0 ; D SIDE 2 & 3 OFW~aNNNNNNNNNNNNNNNNNDNNNNNNNNNNNNNNNNNNNNNN 1 ;FLAG BTDMA DS 2 ;DMA ADDRESS BTDMAX DS 1 ;DMA EXTENDED ADDRESS ; DTPTR: DS 2 ;DRIVE TABLE PTR LOGRQ: DS 1 ;LOG ON REQUENNNNNNNNNNNNNNNND 8NNNNNNNNNNNNNNNNNNNNNN@@@@@@@@ ; ; MACRO TO DEFINE THE DRIVE ALLOCATION & CHECKSUMS AREA ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@QrNNNNNNNNNNNNNNNND`NNNNNNNNNNNNNNNNNNNNNN ALLDAL 0123456789ABCDEF DD DL DD + 1 LIST ON ENDM ;#################################################################NNNNNNNNNNNNNNNNNDNNNNNNNNNNNNNNNNNNNNNNORY SIZE -1 DPBAL0 DS 2 ;AL0,1- DIRECTORY ALLOCATION ; 1 MSB PER DIRECTORY CLUSTER ALLOCATED DPBCKS DS 2 ;CKS- # DIRECTORY$NNNNNNNNNNNNNNNNND] NNNNNNNNNNNNNNNNNNNNNN ENDIF END NNNNNNNNNNNNNNNND$SNNNNNNNNNNNNNNNNNNNNNN============================================================================ SHORT EQU FALSE ;SHORT BIOS (REMOVES UNESENTIAL CNNNNNNNNNNNNNNNNND*\NNNNNNNNNNNNNNNNNNNNNN0H ;HARD DISK BOOT CONFIG. ; A SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 0 ; B SIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 0 ; SNNNNNNNNNNNNNNNNND0xNNNNNNNNNNNNNNNNNNNNNN HARD DISK PHYSICAL DRIVE 0 ; E SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 1 ; F SIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 1 ; ,!NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN8NNN΁j8ԅo< ؉rAݍzH䑲O镸S"𙾚Y'Ğ_.ɢe2ΦNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNDypNNNNNNNNNNNNNNNNNNNNNN G JADE 8" FLOPPY PHYSICAL DRIVE 0 ; H JADE 8" FLOPPY PHYSICAL DRIVE 1 ENDIF ; ;***************************************eNNNNNNNNNNNNNNNNNDNNNNNNNNNNNNNNNNNNNNNNDULES. ; ; 2.28 - 22 APR 83 GRH ; CHANGED DEFINITIONS TO ALLOW BIG DIRECTORIES. ; DISALLOWED DRIVES C & D. ; ; 2.29 - 3 NNNNNNNNNNNNNNNNNND <NNNNNNNNNNNNNNNNNNNNNN(0..n-1). This maintains more uniformity in ; parameter passing between hard disk & JADE floppy IOPBs. ; Vector I/O routineGNNNNNNNNNNNNNNNNDaNNNNNNNNNNNNNNNNNNNNNN use of ROM primitives. ; Moved system down to 60k. ; ; 3.01 26 JUN 88 GRH ; Remove 5" floppy support. Implement in CP/M-86vNNNNNNNNNNNNNNNNDNNNNNNNNNNNNNNNNNNNNNN==================== ; ; INCLUDE JDDCONT.DEF ; INCLUDE COMIOPB.DEF ; INCLUDE DISKS.DEF ; INCLUDE MONBOARD.DEF ; INCLUDE ZM;NNNNNNNNNNNNNNNNNDY NNNNNNNNNNNNNNNNNNNNN!KBYTE: EQU 1024 CPMSZ: EQU KBYTE * NKSYS CPMBS: EQU CPMSZ - (20 * KBYTE) ; CP/M BIAS VALUE CCP: EQU CPMBS + 3400H ;ADDR OF CC5ENNNNNNNNNNNNNNNNND%RNNNNNNNNNNNNNNNNNNNNNN============================== SECSZ: EQU 128 NDRVS: EQU 6 IF BOOT = 10H ; ; 8" HARD DISK BOOT DATA ; STHD EQU 0 ;SƷHNNNNNNNNNNNNNNNNND+]NNNNNNNNNNNNNNNNNNNNNNRLZ: EQU 1AH ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; GENERATE THE TRANSLATION T@ NNNNNNNNNNNNNNNND,#NNNNNNNNNNNNNNNNNNNNNN********************** ; REVISIONS: ; ; 2.2.0 - RELEASE ; ; 2.2.3 - SWAPPED DCM & BIOS SECTORS ON DISK, ALLOWING A ; #NNNNNNNNNNNNNNNNDNNNNNNNNNNNNNNNNNNNNN!SEP 83 GRH ; Changed Rev # for blocked DCM. Enables IBM system 34 ; 256 bytes per sector disks to be read. ; ; 1.10 - 23 SBNNNNNNNNNNNNNNNNDiNNNNNNNNNNNNNNNNNNNNNNNs to monitor rom routines. ; ; 2.03 - 4 JUN 84 GRH ; Add bells & whistles again. ; Move to 61k system. ; ; 2.04 - 30 MAR=uNNNNNNNNNNNNNNNNNNDNNNNNNNNNNNNNNNNNNNNNN BIOS. ; Change single function to return drive table ptr into a BIOS function ; call using restart instruction. ; Change Lވ$NNNNNNNNNNNNNNNNDNNNNNNNNNNNNNNNNNNNNN!ONROM.DEF ; INCLUDE DKBTROM.DEF ; INCLUDE NAKEDT.DEF ; INCLUDE ISHA.DEF ; INCLUDE CLOKROM.DEF ; ;=========================5 NNNNNNNNNNNNNNNND LNNNNNNNNNNNNNNNNNNNNNNP BDOS: EQU CPMBS + 3C00H ;ADDRESS OF BDOS BIOS: EQU CPMBS + 4A00H ;ADDRESS OF BDOS BIOSR: EQU 1000H - BIOS ; ; PAGE 0 LONNNNNNNNNNNNNNNNND&NNNNNNNNNNNNNNNNNNNNNNTART LOGICAL DRIVE OF HARD DISK NDHD EQU 3 ;LAST LOGICAL DRIVE OF HARD DISK ST8FD EQU 4 ;START LOGICAL DRIVE OF 8" FLOPPY N6(NNNNNNNNNNNNNNNNNND, NNNNNNNNNNNNNNNNNNNNN!ABLE MACRO ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ GXLATE MACRO #SECTORS, #SKEW LIS6NNNNNNNNNNNNNNNNDNNNNNNNNNNNNNNNNNNNNNN LARGER BIOS ALLOCATION ON THE DISK. ; ; 2.2.4 - ADDED NAKED TERMINAL DRIVERS & IOBYTE IN ; ANTICIPATION OF THE MONITOR. bLNNNNNNNNNNNNNNNNND NNNNNNNNNNNNNNNNNNNNN!EP 83 GRH ; Move clock-calendar routines to ROM. Add Interrupt handler ; (Mode 2). Change Revision display of sign-on (separsNNNNNNNNNNNNNNNNNDZNNNNNNNNNNNNNNNNNNNNNN 85 GRH ; Implemented hard disk drive 1 as C: & D:. ; Implemented the Logon function for the hard disk. ; Implemented user %u NNNNNNNNNNNNNNNNNDNNNNNNNNNNNNNNNNNNNNNNOGON to specify the ID sector & track. At same time, fix bug ; which did not specify the logon track. ; ; 3.02 7 JUL 88 G!NNNNNNNNNNNNNNNNDNNNNNNNNNNNNNNNNNNNNNN=================================================== LIST OFF *INCLUDE JDDCONT.DEF *INCLUDE COMIOPB.DEF *INCLUDE DISKS.DEF INNNNNNNNNNNNNNNNND!NNNNNNNNNNNNNNNNNNNNNNCATIONS ; PAGE0: EQU 0 ;START OF CP/M RAM IOBYTE: EQU PAGE0 + 3 ;IOBYTE ADDR DEFDRV: EQU PAGE0 + 4 ;DEFAULT DRIVE PARAM ADDwrNNNNNNNNNNNNNNNND'0NNNNNNNNNNNNNNNNNNNNNND8FD EQU 5 ;LAST LOGICAL DRIVE OF 8" FLOPPY ENDIF IF BOOT = 3 ; ; 8" FLOPPY BOOT DATA ; STHD EQU 2 ;START LOGICAtNNNNNNNNNNNNNNNNND-:NNNNNNNNNNNNNNNNNNNNN!T OFF NXTSEC DL 1 ;;START WITH SECTOR 1 LOWEST DL 1 ;; REPT #SECTORS LIST ON DB NXTSEC LIST OFF NXTSEC DL NXTSEC + NNNNNNNNNNNNNNNNNDNNNNNNNNNNNNNNNNNNNNN!ALSO, ALL REFERENCES ; REQUIRING THE I/O PROMS TO BOOT HAS BEEN REMOVED. ; ; 2.2.5 - RECONFIGURE FOR 62K SYSTEM. ; ; 2. NNNNNNNNNNNNNNNND NNNNNNNNNNNNNNNNNNNNN!ate CBIOS rev). ; ; 2.00 - 24 MAR 84 GRH ; Modify for hard disk ; ; 2.01 - 28 APR 84 GRH ; Change hard disk DPB to refcNNNNNNNNNNNNNNNNDI2NNNNNNNNNNNNNNNNNNNNNNfriendly disk error options: Abort, Retry, Ignore. ; Solved warm boot hang problem by reseting host adapter if busy. ; ; 3.00lNNNNNNNNNNNNNNNNNNDNNNNNNNNNNNNNNNNNNNNNNRH ; Add '?' to include file names. ; Change hard disk system tracks directory reference to new format. ; Correct bug in drivzNNNNNNNNNNNNNNNNND _NNNNNNNNNNNNNNNNNNNNNN*INCLUDE MONBOARD.DEF *INCLUDE ZMONROM.DEF *INCLUDE DKBTROM.DEF *INCLUDE NAKEDT.DEF *INCLUDE ISHA.DEF *INCLUDE CLOKROM.DEF "NNNNNNNNNNNNNNND"*NNNNNNNNNNNNNNNNNNNNNNR BDOSJV EQU PAGE0 + 5 ;BDOS SYSTEM CALL ENTRY DEFBFR EQU PAGE0 + 80H ;DEFAULT BUFFER ; ; BIOS FUNCTION CALL RESTART VECTOuKNNNNNNNNNNNNNNNNND(NNNNNNNNNNNNNNNNNNNNNNL DRIVE OF HARD DISK NDHD EQU 5 ;LAST LOGICAL DRIVE OF HARD DISK ST8FD EQU 0 ;START LOGICAL DRIVE OF 8" FLOPPY ND8FD EQU 1 5NNNNNNNNNNNNNNNNND.oNNNNNNNNNNNNNNNNNNNNNN#SKEW ;ADD SKEW FACTOR ;; IF NXTSEC > #SECTORS ;CHECK FOR OVERFLOW NXTSEC DL NXTSEC - #SECTORS ;; IF NXTSEC <= LOWEST_o NNNNNNNNNNNNNNNNNDNNNNNNNNNNNNNNNNNNNNNN2.6 - 20 FEB 83 ; DOUBLE D REV C UPGRADE. CHANGE BOARD STATUS PORT BITS. ; ; 2.2.7 - 8 MAR 83 GRH ; ADDED CLOCK/CALENDAR DRI9NNNNNNNNNNNNNNNND NNNNNNNNNNNNNNNNNNNNNNlect half size directory, but keep ; allocation for 1k directory ; ; 2.02 - 2 JUN 84 GRH ; Change floppy disk drivers to r NNNNNNNNNNNNNNNNNDzNNNNNNNNNNNNNNNNNNNNNN - 26 JAN 87 GRH ; Implemented new common IOPB code & Jade floppy firmware support. ; Implemented disk drive driver tables a:&rNNNNNNNNNNNNNNNNDХNNNNNNNNNNNNNNNNNNNNNNers which caused retry to fail. (sector remained ; corrupted) ; VERSN EQU 302 ; ;****************************************B'NNNNNNNNNNNNNNNNNND?nNNNNNNNNNNNNNNNNNNNNNN LIST ON ;============================================================================ ; ; DISK OPERATING SYSTEM ADDREINNNNNNNNNNNNNNNNND#NNNNNNNNNNNNNNNNNNNNNNR ; BFUNRST EQU 28H BFUNRSV EQU PAGE0 + BFUNRST BFUNRSI EQU 0C7H + BFUNRST ; TPA: EQU 100H ;=========================0NNNNNNNNNNNNNNNND)?NNNNNNNNNNNNNNNNNNNNNN ;LAST LOGICAL DRIVE OF 8" FLOPPY ENDIF ;============================================================================ W4NNNNNNNNNNNNNNNND/\NNNNNNNNNNNNNNNNNNNNN! ;CHECK FOR REPEAT NXTSEC DL LOWEST + 1 LOWEST DL NXTSEC ENDIF ENDIF ;; ENDM LIST ON ENDM ;@@@@@@@@@@@@@@@A7NNNNNNNNNNNNNNNNNNDNNNNNNNNNNNNNNNNNNNNNNVER, SYSTEM CALL INTERCEPT, ; ILLEGAL SYSTEM CALL MESSAGE, CHANGED BIOS SIZE TO END ; OF INITIALIZED DATA AREA. RESTRUCTURE MOyNNNNNNNNNNNNNNNND ,NNNNNNNNNNNNNNNNNNNNNNelate to ISASI control of JADE ; FDC. ; Change IOPB sector value from physical sector (1..n) to logical ; sector value NNNNNNNNNNNNNNNND/PNNNNNNNNNNNNNNNNNNNNNNnd new function to return ; a ptr to a drive table. ; Removed init of IOBYTE. ; Implemented 5" floppy driver. ; Implementedb$NNNNNNNNNNNNNNNNNDNNNNNNNNNNNNNNNNNNNNNN************************************ SUBTTL SYSTEM DECLARATIONS ;========================================================NNNNNNNNNNNNNNNNNDj=NNNNNNNNNNNNNNNNNNNNN!SSES ; ;============================================================================ NKSYS: EQU 60 ;SYSTEM SIZE IN K BYTES p{!NNNNNNNNNNNNNNNND$cNNNNNNNNNNNNNNNNNNNNNN=================================================== ; ; OTHER DECLARATIONS ; ;==============================================.NNNNNNNNNNNNNNNNND*lNNNNNNNNNNNNNNNNNNNNNN; ; ASCII CHARS ; ;============================================================================ LF: EQU 0AH CR: EQU 0DH CTHgNNNNNNNNNNNNNNNNND0ONNNNNNNNNNNNNNNNNNNNN!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; INITIALIZE VERSION TEXT IN RAM MACRO ; ;@@@@@@@@@@@@@@@@@@9NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN8NNNNNNNNсl:օq> ۉwF፯}K瑵Q앺V$\)Ş`/ʢf4ϦNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNE8NNNNNNNNNNNNNNNNNNNNN!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ PVERS MACRO #VERS DD DL #VERS IF DD > 9999 DB (DD / 10000) + V'NNNNNNNNNNNNNNNNNERNNNNNNNNNNNNNNNNNNNNNNDSK ;SELECT DISK DRIVE JP SETTRK ;SET TRACK # JP SETSEC ;SET SECTOR # JP SETDMA ;SET TRANSFER ADDR JP DISKRD ;PERFO NNNNNNNNNNNNNNNNNE }NNNNNNNNNNNNNNNNNNNNNNADDR FOR SBD ; ; CONTINUE ON WITH INIT ; INIT1: JR INIT ;############################################################NNNNNNNNNNNNNNNNE]NNNNNNNNNNNNNNNNNNNNNND ; CALL GETMON ; ; INIT DEFAULT DRIVE ; LD A,(?DKPROM + 1) ;USE DRIVE # PASSED IN PAGE 0 AND A,3 LD (DEFDRV),A ;awNNNNNNNNNNNNNNNNE.NNNNNNNNNNNNNNNNNNNNNN **** ELSE DS DIRBF+SECSZ-$ ;FILL OUT DIRECTORY BUFFER TO 1 SECTOR SIZE ENDIF ;----------------------------------dNNNNNNNNNNNNNNNNNENNNNNNNNNNNNNNNNNNNNNN FOR A HUNG CONDITION AND CLEAR IF TRUE ; IN A,(?HSTATUS) ;IF HOST ADAPTER BUSY THEN BIT ?HBUSYB,A JR Z,NTHUNG ; LD A,NNNNNNNNNNNNNNNNNE%NNNNNNNNNNNNNNNNNNNNNN HL ; LD HL,(DEFBFR + ?BDSCCPS) ;FETCH CCP TRK/SECTOR LD C,L LD B,0 CALL SETSEC ; LD C,H CALL SETTRK ; LD BC,CC8dNNNNNNNNNNNNNNNNE+NNNNNNNNNNNNNNNNNNNNNNOM DIRECTORY LD C,L LD B,A ;A STILL CONTAINS 0 CALL SETSEC ; LD C,H CALL SETTRK ; JR WREAD ; ; ; WARM BOOT E&NNNNNNNNNNNNNNNNEmNNNNNNNNNNNNNNNNNNNNNN'0' DD DL DD % 10000 ENDIF IF DD > 999 DB (DD / 1000) + '0' DD DL DD % 1000 ENDIF DB (DD / 100) + '0' DB '.' NNNNNNNNNNNNNNNNElNNNNNNNNNNNNNNNNNNNNNNRM DISK READ JP DISKWR ;PERFORM DISK WRITE JP LISTST ;RETURN LIST STATUS JP SECTRN ;TRANSLATE SECTOR JP BIOFUNC ;EXÉNNNNNNNNNNNNNNNNNE(NNNNNNNNNNNNNNNNNNNNN!################ ; ; DIRECTORY SECTOR BUFFER STARTS HERE AFTER CRUNCHING COLD START ; CODE. THIS BUFFER IS USED BY THE CP/M :NNNNNNNNNNNNNNNNNNErNNNNNNNNNNNNNNNNNNNNNN ; SEND SYSTEM SIGN-ON ; CLOGO: LD HL,MSGSO CALL EDITOR ; ; MODIFY COLD START VECTOR TO WARM START ; LD HL,(BIOS+4!NNNNNNNNNNNNNNNNNE}NNNNNNNNNNNNNNNNNNNNNN------------------------ ; ; WARM REBOOT ENTRY LOADS CCP,BDOS FROM DISK & ; SETS UP VARIABLES ; ;---------------------------NNNNNNNNNNNNNNNNE #NNNNNNNNNNNNNNNNNNNNNN?DDCLR LD (IOPB + ?PBCMDO),A CALL XPRIM ; NTHUNG: ENDIF ; ; LOG ON DRIVE TO INIT TABLES ; LD A,(?DKPROM + 1) gNNNNNNNNNNNNNNNNNE&NNNNNNNNNNNNNNNNNNNNN!P CALL SETDMA ; ; READ CCP/BDOS ; WREAD: CALL DISKRD JR NZ,WEROR ;IF ERROR THEN EXIT ; ; NEXT SECTOR ; LD HL,BT?rNNNNNNNNNNNNNNNNNNE,HNNNNNNNNNNNNNNNNNNNNNN!RROR, OUTPUT MSG & HALT ; WEROR: LD HL,MSGLE ;OUTPUT ERROR MESSAGE CALL EDITOR HALT ; ; ; BOOT OK, INIT PAGE 0 ; WZ~!NNNNNNNNNNNNNNNE^NNNNNNNNNNNNNNNNNNNNN! DB ((DD % 100) / 10) + '0' DB (DD % 10) + '0' ENDM SUBTTL BIOS CODE ORG BIOS ;----------------------------------|NNNNNNNNNNNNNNNNE ]NNNNNNNNNNNNNNNNNNNNNNCUTE FUNCTION CALL ;############################################################################ ; ; THESE BOOT PARAMS MU>NNNNNNNNNNNNNNNNENNNNNNNNNNNNNNNNNNNNNNDIRECTORY CHECK ROUTINES THAT ; CHECK FOR DISK CHANGE. ; ;##################################################################&NNNNNNNNNNNNNNNNNECNNNNNNNNNNNNNNNNNNNNN!) LD (BIOS+1),HL ; ; BOOT CCP & BDOS ; JR WARM ;##################################################################@XNNNNNNNNNNNNNNNNNELNNNNNNNNNNNNNNNNNNNNNN-------------------------------- WARM: IF INTRPTS ; ; SET INTERRUPT VECTOR TABLE BASE ; LD A,HIGH INTABL LD I,A ; HNNNNNNNNNNNNNNNNNE!>NNNNNNNNNNNNNNNNNNNNNNAND A,3 ;MODULO 4 LD C,A LD E,0 CALL SELDSK LD A,L ;IF ERROR THEN ABORT OR A,H JR Z,WEROR ; ; READ BOOT DIRECTNNNNNNNNNNNNNNNNE'NNNNNNNNNNNNNNNNNNNNNNSEC INC (HL) ; LD DE,SECSZ ;DMA := DMA + SECTOR SIZE LD HL,(BTDMA) ADD HL,DE LD (BTDMA),HL ; ; IF NOT INTO BDOS TB NNNNNNNNNNNNNNNNNE-{NNNNNNNNNNNNNNNNNNNNNNRPG: ; ; INIT BIOS WARM START IN PAGE 0 ; LD A,0C3H LD HL,BIOS + 3 LD (PAGE0),A LD (PAGE0 + 1),HL ; ; INIT BDOSprNNNNNNNNNNNNNNNNNENNNNNNNNNNNNNNNNNNNNNN------------------------------------------ ; ; BIOS JUMP VECTOR TABLE ; ;-------------------------------------------------m NNNNNNNNNNNNNNNNE NNNNNNNNNNNNNNNNNNNNNNST RESIDE AS DEFINED RIGHT BEFORE THE COLD INIT ; ROUTINE START AND MUST BE IN THE 1ST SECTOR. THESE 2 WORDS ARE REFERENCED ;NNNNNNNNNNNNNNNNNNENNNNNNNNNNNNNNNNNNNNNN########## DIRBF: EQU $ ;BUFFER BEGINNING ;---------------------------------------------------------------------------- rNNNNNNNNNNNNNNNNNENNNNNNNNNNNNNNNNNNNNNN########## ; ; SIGN-ON MESSAGE ; ;############################################################################ MSGSO: DB CRgNNNNNNNNNNNNNNNNNEMNNNNNNNNNNNNNNNNNNNNNN ; SET INTERRUPT MODE TO 2 ; IM 2 ; ; ENABLE INTERRUPT VECTOR 7 ; IN A,(?INTMSK) AND A,7FH OUT (?INTMSK),A ; ;bNNNNNNNNNNNNNNNNE"kANNNNNNNNNNNNNNNNNNNNNNORY ; LD BC,DEFBFR ;SET XFER ADDRESS (USE DEFAULT BUFFER) CALL SETDMA ; LD BC,?BTDIRS ;SET DIRECTORY SECTOR CALL SET,i NNNNNNNNNNNNNNNNNE(NNNNNNNNNNNNNNNNNNNNN!HEN READ NEXT SECTOR ; LD DE,BDOS XOR A,A SBC HL,DE JR C,WREAD ; ; ELSE IF AT BEGINNING OF BDOS THEN SET UP NEW TRAˮNNNNNNNNNNNNNNNNNE..,NNNNNNNNNNNNNNNNNNNNNN CALL VECTOR IN PAGE 0 ; LD HL,BDOS + 6 LD (BDOSJV),A LD (BDOSJV + 1),HL ; ; INIT BIOS CALL VECTOR IN PAGE 0 ; LD ^HNNNNNNNNNNNNNNNNNE0NNNNNNNNNNNNNNNNNNNNNN--------------------------- JP INIT1 ;COLD START ENTRY JP WARM ;RELOAD CCP/BDOS JP CNSCK ;GET CONSOLE STATUS JP CI ;X'INNNNNNNNNNNNNNNNE ?NNNNNNNNNNNNNNNNNNNNNN BY THE BOOT CODE IN ORDER TO FIND THE LOAD ADDRESS FOR THE BIOS & IT'S ; LENGTH. ; ;######################################םNNNNNNNNNNNNNNNNNE;NNNNNNNNNNNNNNNNNNNNN!; ; INIT - COLD START ENTRY FROM BOOT MUST SET ALL BIOS PARAMS ; ;-------------------------------------------------------+NNNNNNNNNNNNNNNNE!NNNNNNNNNNNNNNNNNNNNNN,LF DB CPMSZ / (KBYTE * 10) + '0' DB (CPMSZ MOD (KBYTE * 10)) / KBYTE + '0' DB 'K CP/M-80 Vers 2.2',CR,LF DB 'M5b CBIOSSNNNNNNNNNNNNNNNNNNE~NNNNNNNNNNNNNNNNNNNNNN FINALLY ENABLE VECTORED INTERRUPTS ; IN A,(?MONSTS) OR A,?MONIE OUT (?MONSTS),A EI ENDIF ; ; SET TEMPORARY ST ; NNNNNNNNNNNNNNNNE#XpNNNNNNNNNNNNNNNNNNNNNNSEC ; LD BC,0 ;SET TRACK TO 0 CALL SETTRK ; CALL DISKRD JR NZ,WEROR ; ; CHECK FOR VALID BOOT DIRECTORY ; LD A,NNNNNNNNNNNNNNNNE)NNNNNNNNNNNNNNNNNNNNN!CK & SECTOR ; JR Z,RDBDOS ; ; ELSE IF NOT AT BIOS THEN READ NEXT SECTOR ; LD DE,BIOS - BDOS SBC HL,DE JP C,WREAD +INNNNNNNNNNNNNNNNNE/NNNNNNNNNNNNNNNNNNNNNNHL,BIOFUNC LD (BFUNRSV),A LD (BFUNRSV + 1),HL ; ; SET DEFAULT SECTOR BUFFER ; LD BC,DEFBFR CALL SETDMA ; IF INTdNNNNNNNNNNNNNNNNNNEcNNNNNNNNNNNNNNNNNNNNNNCONSOLE INPUT JP COC ;CONSOLE OUTPUT JP LO ;PRINTER OUTPUT JP PUNCH JP READER JP HOME ;HOME SELECTED DRIVE JP SELf!NNNNNNNNNNNNNNNNE NNNNNNNNNNNNNNNNNNNNNNN###################################### BIOSSZ: DW BIOSND - BIOS ;BIOS MODULE SIZE IN BYTES BIOSST: DW BIOS ;BIOS MODULE LOAD NNNNNNNNNNNNNNNNEnNNNNNNNNNNNNNNNNNNNNNN--------------------- INIT: ; ; SET TEMPORARY STACK ; LD SP,DEFBFR ;USE PAGE 0 FOR STACK ; ; MAKE SURE ROM IS ENABLENNNNNNNNNNNNNNNNENNNNNNNNNNNNNNNNNNNNN! Vers ' PVERS VERSN DM CR,LF IF $ > (DIRBF + SECSZ) CONMSG **** WARNING! COLD INIT CODE BIGGER THAN DIR BUFFER`+NNNNNNNNNNNNNNNNNE+NNNNNNNNNNNNNNNNNNNNN!ACK ; LD SP,DEFBFR ; ; INSURE MONITOR ROM STILL ENABLED ; CALL GETMON ; IF BOOT = 10H ; TEST ISHA HOST ADAPTER5 NNNNNNNNNNNNNNNNNE$NNNNNNNNNNNNNNNNNNNNNN(DEFBFR) CP A,86H JR C,WEROR ; ; SET UP TO LOAD CCP/BDOS ; LD HL,(DEFBFR + ?BDSBDSS) ;PREFETCH BDOS TRK/SECTOR PUSHENNNNNNNNNNNNNNNNNE*NNNNNNNNNNNNNNNNNNNNN!; ; ELSE DONE READING SYSTEM ; JP WZRPG ; ; ; ELSE SET UP & READ BDOS ; RDBDOS: POP HL ;RESTORE BDOS TRK/SECTOR FR+NNNNNNNNNNNNNNNNE0PNNNNNNNNNNNNNNNNNNNNNNCPTS ; ; PUT BDOS VECTOR INTO INTERCEPT CODE ; LD HL,(BDOS + 7) LD (BDOSV),HL ; ; NOW PUT INTERCEPT VECTOR INTO BDOfrNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNŃh6҅n< ؉sAݍzI䑱M蕶Q홻W%\+Ţa.ʦNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNENNNNNNNNNNNNNNNNNNNNNNS CODE ; LD HL,INTCPT LD (BDOS + 7),HL ; ; INITIALIZE CLOCK VECTORS IF CLOCK INSTALLED ; ; LD C,?CLKF7 ;TEST FOR BOARNNNNNNNNNNNNNNNNEbNNNNNNNNNNNNNNNNNNNNN!+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; WRITE A DISK SECTOR ; EXIT - A= 0: OK; /0: ERROR ; ;+++GNNNNNNNNNNNNNNNNNE JNNNNNNNNNNNNNNNNNNNNN! SAVE LOGON REQUEST FLAG ; LD A,E LD (LOGRQ),A ; ; COMPUTE DISK DRIVER TABLE PTR ; CALL RETDVRT ;DRIVE IS STILL IN ʏrNNNNNNNNNNNNNNNNEjNNNNNNNNNNNNNNNNNNNNNNB + ?PBST2O),A ; CALL DISKLOG JP NZ,FDSKER ; ; IF NO ID SECTOR THEN USE DEFAULTS ; LD A,(IOPB + ?PBST2O) CP A,-2 NNNNNNNNNNNNNNNNENNNNNNNNNNNNNNNNNNNNNNPTR ; LD HL,(DTPTR) XOR A,A RET ; ; ; IF NOT HARD DISK THEN GO DO FLOPPY TEST ; LGDEF: LD A,(BTDRV) IF STHD <>~HNNNNNNNNNNNNNNNNNE/NNNNNNNNNNNNNNNNNNNNNN****************************** ; ; SET TRACK # ; ENTRY- BC= TRACK # ; ;****************************************************&$NNNNNNNNNNNNNNNNNE%NNNNNNNNNNNNNNNNNNNNN!+++++++++++++++ ; ; SECTOR TRANSLATION FUNCTION ; ENTRY- DE= 0: NO XLATE, ELSE PTR TO XLATE TABLE ; BC= SECTOR # TO XLATE NYNNNNNNNNNNNNNNNNNE+NNNNNNNNNNNNNNNNNNNNNNTION ; EXIT - A= 0: OK; /0: ERROR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ DISKLOG: CrNNNNNNNNNNNNNNNNEZNNNNNNNNNNNNNNNNNNNNNND PRESENT ; CALL CLK1 ; ; IF CLOCK PRESENT THEN TURN ON CLOCK DRIVE ; ; LD A,38H ;COND. JR (ON) ; JR CLKON ; ; ELSE((NNNNNNNNNNNNNNNNNE\NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ DISKWR: LD A,?DDWRS ;SELECT WRITE OP JP DISKOP ,NNNNNNNNNNNNNNNNENNNNNNNNNNNNNNNNNNNNNNC REGISTER LD (DVRTPTR),HL ; ; PREFETCH DRIVER EXECUTION ADDRESS FROM TABLE ; LD E,(HL) ;STORE ADDRESS INC HL LD D NNNNNNNNNNNNNNNNNEBNNNNNNNNNNNNNNNNNNNNN!;0: NO ID, -1: JADE ID, -2: EXTENDED ID JR NZ,LGDEF ; ; ELSE XFER ID SECTOR DATA TO TABLES ; CALL TRNONE ;ASSUME NO TR NNNNNNNNNNNNNNNNEMNNNNNNNNNNNNNNNNNNNNNN 0 CP A,STHD JR C,LGCKFD ENDIF CP A,NDHD + 1 JR NC,LGCKFD ; ; ELSE USE HARD DISK DEFAULTS ; CALL TRNONE ; NqNNNNNNNNNNNNNNNNE :NNNNNNNNNNNNNNNNNNNNN!************************ SETTRK: LD (BTTRK),BC RET ;******************************************************************NNNNNNNNNNNNNNNNNE&NNNNNNNNNNNNNNNNNNNNNN; EXIT - HL= XLATED SECTOR OR (BC) + 1 ; BC= UNCHANGED ; A, DE= ? ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++ mNNNNNNNNNNNNNNNNNNE,~NNNNNNNNNNNNNNNNNNNNN!; ; SET DESCRIPTOR SECTOR XFER ADDRESS TO DEFAULT BUFFER ; LD HL,DEFBFR LD (IOPB + ?PBDMAO),HL XOR A,A LD (IOPB + ?PHNNNNNNNNNNNNNNNNEiNNNNNNNNNNNNNNNNNNNNNN TURN OFF CLOCK DRIVE ; LD A,18H ;UNCOND. JR (OFF) (CAUSES JUMP TO ILLEGAL) ; CLKON: LD (INHCLK),A ; ENDIF ; ; PASNNNNNNNNNNNNNNNNE mNNNNNNNNNNNNNNNNNNNNNN ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; SELECT DRIVE FUNCTION ; LOG-ON - SET DIS $NNNNNNNNNNNNNNNNNE,NNNNNNNNNNNNNNNNNNNNN!,(HL) INC HL LD (DVRXADR),DE ; ; FETCH FLAGS ; LD C,(HL) ; ; COMPUTE DISK PARAMETER TABLE ADDRESS ; LD HL,(BTDNNNNNNNNNNNNNNNNNNEsNNNNNNNNNNNNNNNNNNNNNNANSLATION ; ; IF HARD DISK OR DOUBLE DENSITY THEN NO TRANSLATION ; LD A,(DEFBFR + ?IDFLGO) AND A,[1 SHL ?DFDTDB] OR [1 tNNNNNNNNNNNNNNNNE|NNNNNNNNNNNNNNNNNNNNNNO XLATE LD HL,HDPBK ; ; XFER DATA TO TABLES ; SEL2: PUSH HL CALL DPBAD ; USE DEFAULT TABLE POP HL LD BC,DPBSZ "NNNNNNNNNNNNNNNNNE! "NNNNNNNNNNNNNNNNNNNNNN********** ; ; SET SECTOR ; ENTRY- BC= SECTOR # ; ;************************************************************************'pNNNNNNNNNNNNNNNNE'NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++ SECTRN: ; ; IF NO TRANSLATION THEN RETURN SECTOR++ ; LD A,D ;IF TABLE ADDR = 0 THEN NO TRANSLATIۗHNNNNNNNNNNNNNNNNNE-LONNNNNNNNNNNNNNNNNNNNN!BDMAXO),A ; ; SET DESCRIPTOR SECTOR SECTOR ; LD HL,?IDSECT LD (IOPB + ?PBSECO),HL ; ; SET DESCRIPTOR SECTOR TRACK T_NNNNNNNNNNNNNNNNNE1NNNNNNNNNNNNNNNNNNNNNNS DEFAULT DISK TO CCP ; LD A,(DEFDRV) LD C,A JP CCP SUBTTL BIOS DISK FUNCTION ROUTINES ;++++++++++++++++++++++++++++φNNNNNNNNNNNNNNNNE >NNNNNNNNNNNNNNNNNNNNN!K PARAMETER BLOCK ; ENTRY- C= DRIVE # ; E= 0 IF NEW SELECT ; EXIT - HL= PTR TO DPT OR 0 FOR ERROR ; ;+++++++++++++++++++++ NNNNNNNNNNNNNNNNE?NNNNNNNNNNNNNNNNNNNNN!RV) LD H,0 ADD HL,HL ;DISK # * 16 ADD HL,HL ADD HL,HL ADD HL,HL LD DE,D0DPH ADD HL,DE ; ; IF NOT FIRST SELECTx0$NNNNNNNNNNNNNNNNNE NNNNNNNNNNNNNNNNNNNNNNSHL ?DFHARDB] ; ; ELSE SET TRANSLATION ; CALL Z,TR8 ; ; XFER DISK DATA TO DPB ; NOX: CALL DPBAD ;GET ADDR OF DPB dNNNNNNNNNNNNNNNNNEzNNNNNNNNNNNNNNNNNNNNNNLDIR JR SEL1 ; ; ; USE 8" FLOPPY DEFAULTS ; LGCKFD: CALL TR8 LD HL,SD8PBK JR SEL2 ;***************************NNNNNNNNNNNNNNNE"\qNNNNNNNNNNNNNNNNNNNNNN**** SETSEC: LD (BTSEC),BC RET ;**************************************************************************** ; ; SET2NNNNNNNNNNNNNNNNNE(NNNNNNNNNNNNNNNNNNNNN!ON OR A,E JP Z,NOTRAN ; ; ELSE CALCULATE NEW SECTOR FROM TABLE ; EX DE,HL ADD HL,BC LD L,(HL) ; LD H,0 RET  NNNNNNNNNNNNNNNNNE.NNNNNNNNNNNNNNNNNNNNNN; LD L,H ;H == 0 FROM LAST OPERATION (HL= 0) LD (IOPB + ?PBTRKO),HL ; ; PASS COMMAND TO EXECUTOR ; LD A,?DDLOG JR NNNNNNNNNNNNNNNNNENNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++++++++++ ; ; READ A DISK SECTOR ; EXIT - A= 0: OK; /0: ERROR ; ;+++++++++++++++++++ NNNNNNNNNNNNNNNNE NNNNNNNNNNNNNNNNNNNNN!+++++++++++++++++++++++++++++++++++++++++++++++++++++++ SELDSK: ; ; ASSUME ERROR ; LD HL,0 ; ; IF UNSUPPORTED DRIVE rNNNNNNNNNNNNNNNNNE NNNNNNNNNNNNNNNNNNNNNN OR LOGON INHIBITED THEN RETURN TABLE PTR ; LD A,(LOGRQ) OR A,C CPL AND A,1 RET Z ; ; ELSE LOG ON DRIVE ; LD (uNNNNNNNNNNNNNNNNENNNNNNNNNNNNNNNNNNNNNN LD HL,DEFBFR + ?IDSPTO LD BC,DPBSZ LDIR ; ; XFER DISK PHYSICAL DATA TO TABLE ; LD HL,DEFBFR + ?IDFLGO ; SEL1: PUS!NNNNNNNNNNNNNNNNNEINNNNNNNNNNNNNNNNNNNNNN************************************************* ; ; HOME DRIVE - TREAT AS SEEK TRK 0 ; EXIT - BC= 0 ; ;****************-~NNNNNNNNNNNNNNNNNE#o@NNNNNNNNNNNNNNNNNNNNNN TRANSFER ADDR ; ENTRY- BC= ADDRESS ; EXIT - A= 0 ; ;***********************************************************************+NNNNNNNNNNNNNNNNE)NNNNNNNNNNNNNNNNNNNNNN; ; ; CONVERT FROM CP/M'S LOGICAL SECTOR {0..N-1} TO PHYSICAL SECTOR {1..N} ; NOTRAN: LD HL,1 ADD HL,BC RET Sx/NNNNNNNNNNNNNNNNE/*-NNNNNNNNNNNNNNNNNNNNN!DISKOP2 ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; COMMON DISK I/O CODE ; ENTRY- mNNNNNNNNNNNNNNNNNNESNNNNNNNNNNNNNNNNNNNNN!+++++++++++++++++++++++++++++++++++++++++++++++++++++++++ DISKRD: LD A,?DDRDS ;SELECT READ OP JP DISKOP ;+++++++++++++-NNNNNNNNNNNNNNNNE yNNNNNNNNNNNNNNNNNNNNNNREQUESTED THEN RETURN 0 (ERROR) ; LD A,C CP A,NDRVS RET NC ; ; STORE DRIVE # FOR FUTURE USE ; LD (BTDRV),A ; ; zNNNNNNNNNNNNNNNNEYNNNNNNNNNNNNNNNNNNNNNNDTPTR),HL ;SAVE DRIVE TABLE PTR ; ; ATTEMPT TO READ ID SECTOR ; XOR A,A ;INIT FLAG BYTE UNTIL FIRMWARE REVISED LD (IOP6 NNNNNNNNNNNNNNNNNE/NNNNNNNNNNNNNNNNNNNNNNH HL LD HL,(DVRTPTR) LD DE,DVRFLG ADD HL,DE EX DE,HL POP HL LD BC,DVRSIZ - DVRFLG LDIR ; ; RETURN DRIVE TABLE NNNNNNNNNNNNNNNNNENNNNNNNNNNNNNNNNNNNNNN************************************************************ HOME: LD BC,0 ;**********************************************0NNNNNNNNNNNNNNNNE$NNNNNNNNNNNNNNNNNNNNNN***** SETDMA: LD (BTDMA),BC XOR A,A LD (BTDMAX),A RET ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ZeNNNNNNNNNNNNNNNNNE*NNNNNNNNNNNNNNNNNNNNNNUBTTL DISK SUPPORT ROUTINES ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; LOGON DISK FUNCgNNNNNNNNNNNNNNNNNE09`NNNNNNNNNNNNNNNNNNNNNNA= IOPB COMMAND ; EXIT - A= 0: OK; /0: ERROR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN8NNNNNNNNҁo= مs@݉wF⍱~L鑷S!Y'Ú_-ɞf5Тk9ԦNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNF(NNNNNNNNNNNNNNNNNNNNNN DISKOP: ; ; SET UP IOPB ; LD HL,BTTRK LD DE,IOPB + ?PBTRKO LD BC,?PBSTATO - ?PBTRKO LDIR ; DISKOP2: LD (IOPB + NNNNNNNNNNNNNNNNNF NNNNNNNNNNNNNNNNNNNNNN POP DE INC DE ;NEXT ERROR BYTE DJNZ DSKER1 ;IF NOT DONE THEN LOOP ; LD HL,DSKEB ;OUTPUT ERROR MESSAGE CALL EDITOR NNNNNNNNNNNNNNNNNNNF ENNNNNNNNNNNNNNNNNNNNNN***************************** ; ; SET 3740 SECTOR TRANSLATION PROCEDURE ; ENTRY- (DTPTR)= MUST BE PTR TO DTP ; EXIT - DE, HL^NNNNNNNNNNNNNNNNF9NNNNNNNNNNNNNNNNNNNNN!++++++++++++++++++++++++++++++++++++++ DPBAD: LD HL,(DTPTR) ;FETCH BASE ADDR LD DE,10 ;ADD OFFSET OF DPB PTR ADD HL,DE L NNNNNNNNNNNNNNNNF)NNNNNNNNNNNNNNNNNNNNN!?PBSECO) ; PUSH HL ;SAVE SECTOR TO RESTORE LATER ; ADD HL,DE LD (IOPB + ?PBSECO),HL ; ; EXECUTE IOPB ; CALL XPRNNNNNNNNNNNNNNNNNFTNNNNNNNNNNNNNNNNNNNNN! POP IX ; ; RETURN THE COMMAND RESULTS STATUS ; LD A,(IOPB + ?PBSTATO) OR A,A RET SUBTTL JADE FLOPPY DRIVER ROINNNNNNNNNNNNNNNNNF%i NNNNNNNNNNNNNNNNNNNNNN ; BREAK; DEFAULT: /* DATA TRACKS */ } ; LD C,(IY + DVRDSPT) ; ; IF SECTOR < SECTORS_PER_TRACK THEN SIDE = 0 ; FD( rNNNNNNNNNNNNNNNNF+JNNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++++++++ ; ; FUNCTION DISPATCHER ; EXIT - A= -1: ERROR, 0: OK ; ;+++++++++++++++++++zrNNNNNNNNNNNNNNNNF{NNNNNNNNNNNNNNNNNNNNNN ?PBCMDO),A ; ; FETCH DRIVER VECTOR & EXECUTE DISK DRIVER ; DKOPLP: PUSH IY ;SAVE IY LD IY,(DVRTPTR) ;FETCH TABLE BASNNNNNNNNNNNNNNNNFNNNNNNNNNNNNNNNNNNNNNN ; ; GET USER RESPONSE ; CALL CI ;GET USER RESPONSE ; PUSH AF ;SAVE CHAR LD C,A ;ECHO CHAR CALL COC POP AF ; NNNNNNNNNNNNNNNNNFNNNNNNNNNNNNNNNNNNNNNN= ? ; ;**************************************************************************** TR8: TR3740: LD DE,SDTRAN ; SETTR: LD NNNNNNNNNNNNNNNNNNF_NNNNNNNNNNNNNNNNNNNNNND E,(HL) ;FETCH DPB PTR INC HL LD D,(HL) RET SUBTTL HARD DISK ROUTINES ;++++++++++++++++++++++++++++++++++++++++++NNNNNNNNNNNNNNNNF|NNNNNNNNNNNNNNNNNNNNN!IM ; ; RESTORE SECTOR ; POP HL LD (IOPB + ?PBSECO),HL ; ; DONE ; RET ;+++++++++++++++++++++++++++++++++++\NNNNNNNNNNNNNNNNF NNNNNNNNNNNNNNNNNNNNNNUTINES ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; JADE 8" FLOPPY DISK DRIVER FUNCTION & NNNNNNNNNNNNNNNNNF&NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; BIOS CALL ENTRY (E= DRIVE #) ; RETDVRTF: LD C,E ; RETDVRT: BNNNNNNNNNNNNNNNNNF uNNNNNNNNNNNNNNNNNNNNNNALL ; PUSH DE POP IX LD HL,?DSKX LD A,(?DKPROM) CALL EXROM ; ; FETCH & RETURN RESULT STATUS ; LD A,(IX + ?PBSTNNNNNNNNNNNNNNNNF NNNNNNNNNNNNNNNNNNNNNN CALL COC ; ; RETURN DATA ; POP AF RET ;**************************************************************************.}NNNNNNNNNNNNNNNNFNNNNNNNNNNNNNNNNNNNNNNBDOS + 11H ;THIS ADDR MODIFIED BY WARM BOOT RTN ; ; THE FOLLOWING CONDITIONAL JUMP IS MODIFIED TO AN UNCONDITIONAL JUMP BY ;NNNNNNNNNNNNNNNNNFdNNNNNNNNNNNNNNNNNNNNNN OUTPUT FUNCTION # ; POP HL LD A,L CALL PRHEX ; ; OUTPUT NEW LINE ; CALL CRLF ; ; RETURN NULLS ; XOR A,A *'NNNNNNNNNNNNNNNNNF%^:NNNNNNNNNNNNNNNNNNNNNNROM ENTRY POINT JR CLK2 ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN TIME FJNNNNNNNNNNNNNNNNF+}5NNNNNNNNNNNNNNNNNNNNNN****************************************************************** CLKSET: LD C,?CLKF2 ; CLK1: LD HL,?CLKFUN ; CLK2: LD AfjNNNNNNNNNNNNNNNNNFKNNNNNNNNNNNNNNNNNNNNNNHYSICAL CONFIGURATION TABLE PTR DW EXIOPB ;2:EXECUTE THE IOPB MAXFUNCS EQU ($ - BFUNTBL) / 2 ;+++++++++++++++++++++++++xNNNNNNNNNNNNNNNNNF.NNNNNNNNNNNNNNNNNNNNNN LD HL,DVR0 ;START AT 1ST TABLE ; ; IF DRIVE == 0 THEN ALREADY THERE ; LD A,C OR A,A RET Z ; ; ELSE IF ILLEGAL DvNNNNNNNNNNNNNNNNNNF&NNNNNNNNNNNNNNNNNNNNN!ATO) POP IX ;RESTORE REG OR A,A ;TEST RESULT FOR RETURN RET SUBTTL NON-DISK PROCEDURES ;************************ NNNNNNNNNNNNNNNNNFhNNNNNNNNNNNNNNNNNNNNN!* ; ; NEWLINE PROCEDURE ; ;*************************************************************************** CRLF: LD C,CR CALLNNNNNNNNNNNNNNNFKNNNNNNNNNNNNNNNNNNNNNN THE WARM BOOT ROUTINE IF THE CLOCK/CALENDAR BOARD IS NOT PRESENT ; IF NOT MODIFIED, THEN IT IS ALLWAYS FALSE (NOP). ; INHCNNNNNNNNNNNNNNNNF NNNNNNNNNNNNNNNNNNNNNN ;BC = HL = A = 0 LD L,A LD H,A LD C,A LD B,A RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++BNNNNNNNNNNNNNNNNNF& iNNNNNNNNNNNNNNNNNNNNNNUNCTION 92H ; EXIT - A= SECONDS ; B= MINITS ; C= HOURS ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++JNNNNNNNNNNNNNNNNNNF,NNNNNNNNNNNNNNNNNNNNNN,?CLKROM ; ; FALL INTO ROM EXECUTER ; ENDIF ;*********************************************************************}NNNNNNNNNNNNNNNFzNNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN BIOS VERSION # ; EXIT - HL= VERSION # IN BINARY {0.00,..655.35$NNNNNNNNNNNNNNNNF NNNNNNNNNNNNNNNNNNNNN!RIVE THEN RETURN ERROR ; CP A,NDRVS JR C,RETDV2 ; OR A,A RET ; ; ; ELSE COMPUTE TABLE PTR ; RETDV2: LD B,C LD$NNNNNNNNNNNNNNNNNFNNNNNNNNNNNNNNNNNNNNNN**************************************************** ; ; OUTPUT HEX DATA TO CONSOLE SUBR ; ENTRY- A= DATA ; EXIT - A, C= ? )]NNNNNNNNNNNNNNNNNNF[NNNNNNNNNNNNNNNNNNNNNN COC LD C,LF JP COC IF INTCPTS SUBTTL ADDITIONAL FUNCTIONS TO SUPPORT CDOS PROGRAMS ;*****************************&NNNNNNNNNNNNNNNNNFxNNNNNNNNNNNNNNNNNNNNNNLK: JR C,ILLEGC ; ; NOW CHECK FOR EXTENDED CALLS ; CP A,8DH ;IF RETURN VERSION THEN RETURN IT JR Z,RETCVER ; CP A,90_NNNNNNNNNNNNNNNNF!NNNNNNNNNNNNNNNNNNNNNN++++++++++++++ ; ; CDOS RETURN VERSION FUNCTION ; MAKES CLOCK/CALENDAR WORK. ; EXIT - B= 1 ; ;+++++++++++++++++++++++++++ݼHNNNNNNNNNNNNNNNNF'8XNNNNNNNNNNNNNNNNNNNNNN+++++++++++++ CLKTIM: LD HL,?CLKTIM JR CLK2 ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++9NNNNNNNNNNNNNNNNNF-דNNNNNNNNNNNNNNNNNNNNNN******* ; ; EXECUTE ROM ROUTINE ; ENTRY- HL= ENTRY ADDRESS ; A= ROM # ; EXIT - ? ; ;************************************/!NNNNNNNNNNNNNNNNNFkNNNNNNNNNNNNNNNNNNNNN!} ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ RETVERS: LD HL,VERSN XOR A,A ;RETURN N\NNNNNNNNNNNNNNNNF HNNNNNNNNNNNNNNNNNNNNNN DE,DVRSIZ ; RETDVL: ADD HL,DE DJNZ RETDVL ; ; RETURN NO ERROR ; XOR A,A RET ;++++++++++++++++++++++++++++++++rNNNNNNNNNNNNNNNNFZNNNNNNNNNNNNNNNNNNNNNN; ;**************************************************************************** PRHEX: ; ; PROCESS HIGH NIBBLE 1ST ; CAۡNNNNNNNNNNNNNNNNNFNNNNNNNNNNNNNNNNNNNNNN********************************************** ; ; SYSTEM CALL INTERCEPT ROUTINE CHECKS FOR ILLEGAL BDOS CALLS & ; PRINTS MEUNNNNNNNNNNNNNNNNNF7NNNNNNNNNNNNNNNNNNNNNNH ;IF NOT CLOCK THEN ERR JR C,ILLEGC ; JR Z,CLKCAL ;IF CALENDAR THEN GET IT ; CP A,92H JR C,CLKSET ;IF SET FUNCTION TiNNNNNNNNNNNNNNNNF"ǭNNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++++++++++ RETCVER: LD B,1 RET SUBTTL CLOCK ROUTINES ;+++++++++++++++++++++++++NNNNNNNNNNNNNNNNNF((fNNNNNNNNNNNNNNNNNNNNNN++++ ; ; READ CLOCK TIME FUNCTION 93H ; ENTRY- DE= PTR TO 13 BYTE BUFFER FOR CLOCK DATA ; ;++++++++++++++++++++++++++++++++1uNNNNNNNNNNNNNNNNF.NNNNNNNNNNNNNNNNNNNNN!**************************************** EXROM: AND A,?ROMSMK ;MASK OUT UNUSED BITS OUT (?ROMSEL),A ; PUSH HL ;SAVE ROMNNNNNNNNNNNNNNNNNFXNNNNNNNNNNNNNNNNNNNNNNO ERROR RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN DRIVER TABLE PTR lyNNNNNNNNNNNNNNNNF {NNNNNNNNNNNNNNNNNNNNN!++++++++++++++++++++++++++++++++++++++++++++ ; ; EXECUTE IOPB FUNCTION ; ENTRY- DE= IOPB PTR ; EXIT - A= 0: OK ; ;++++++++ҶNNNNNNNNNNNNNNNNNFkNNNNNNNNNNNNNNNNNNNNN!LL PRDIG ; ; SWAP HIGH & LOW NIBBLES ; PRDIG: RLCA RLCA RLCA RLCA ; ; SAVE DATA FOR RETURN ; PUSH AF ; ; ryNNNNNNNNNNNNNNNNF=NNNNNNNNNNNNNNNNNNNNNNSSAGE IF ILLEGAL. ALSO IMPLEMENTS CDOS CLOCK/CALENDAR ; SYSTEM CALLS FOR ASMB. ; ;******************************************"NNNNNNNNNNNNNNNNNFNNNNNNNNNNNNNNNNNNNNN!HEN SET CLOCK ; JR Z,CLKTIM ;IF TIME THEN GET IT ; CP A,93H JR Z,CLKRDC ;IF READ CLOCK THEN GET IT ; ; ILLEGAL SYSTEMkWNNNNNNNNNNNNNNNNF#NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN CALENDAR FUNCTION 90H ; EXIT - A= DAY ; B= MONTH ; C= YEAR!NNNNNNNNNNNNNNNNF)WNNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++++++ CLKRDC: LD C,?CLKF1 JR CLK1 ;********************************************1NNNNNNNNNNNNNNNNNF/NNNNNNNNNNNNNNNNNNNNN! ENTRY VECTOR ; LD HL,EXROMR ;PUT RETURN ADDR ON STACK EX (SP),HL ;SWAP RETURN ADDRESS WITH ROM ENTRY VECTOR JP (HL) ;E(NNNNNNNNNNNNNNNNNNF NNNNNNNNNNNNNNNNNNNNNNFUNCTION ; ENTRY- C= DRIVE # (E FOR FUNCTION CALL) ; EXIT - HL= DRIVER TABLE BASE PTR ; A, C= 0 ; ;+++++++++++++++++++++++NNNNNNNNNNNNNNNNF DNNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ EXIOPB: ; ; SAVE REG ; PUSH IX ; ; SET UP FOR C1'NNNNNNNNNNNNNNNNF8NNNNNNNNNNNNNNNNNNNNNNCONVERT TO ASCII USING DAA TRICK ; AND A,0FH ADD A,90H DAA ADC A,40H DAA ; ; OUTPUT CHAR TO CONSOLE ; LD C,A jNNNNNNNNNNNNNNNNNF-NNNNNNNNNNNNNNNNNNNNNN********************************* INTCPT: LD A,C ;CHECK CALL VALIDITY CP A,41 ;IF <= 40 THEN OK ; BDOSV EQU $ + 1 JP C,GNNNNNNNNNNNNNNNNNFUNNNNNNNNNNNNNNNNNNNNNN CALL ; ILLEGC: PUSH BC ;SAVE FUNCTION # ; ; OUTPUT WARNING MESSAGE ; LD HL,ISCMSG ;OUTPUT WARNING CALL EDITOR ; ;NNNNNNNNNNNNNNNNNF$m NNNNNNNNNNNNNNNNNNNNNN ; L= DAY OF WEEK ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ CLKCAL: LD HL,?CLKCAL ;NNNNNNNNNNNNNNNNF*NNNNNNNNNNNNNNNNNNNNNNN******************************** ; ; CLOCK SET FUNCTION 91H ; ENTRY- DE= CLOCK IMAGE BUFR PTR (13 BYTES LONG) ; ;**********/NNNNNNNNNNNNNNNNF0NNNNNNNNNNNNNNNNNNNNNNXECUTE ROM ; ; ROM PROCEDURE RETURNS HERE ; EXROMR: PUSH AF ;SAVE RETURN VALUE CALL GETMON ;RESELECT MONITOR ROM ; jXNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN8NNNNNNNNсm;օr@܉vD{J呲N蕶Q뙹U#񝿞\+Ƣb0˦'NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNG՜NNNNNNNNNNNNNNNNNNNNNNPOP AF ;RETURN VALUE RET SUBTTL CHAR I/O ROUTINES ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++YNNNNNNNNNNNNNNNNG:NNNNNNNNNNNNNNNNNNNNNNA NOT READY THEN RETURN 0 AND A,1 SHL ?NTRDY TTOST1: RET Z LD A,-1 ;ELSE RETURN -1 RET ENDIF ;*****************NNNNNNNNNNNNNNNNNNG NNNNNNNNNNNNNNNNNNNNNNTTOST1 ENDIF ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; READER DRIVER - DUMMY !NNNNNNNNNNNNNNNNGNNNNNNNNNNNNNNNNNNNNNNF ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN LIST DEVICE STATUS ; EXIT - AL NNNNNNNNNNNNNNNNG_FNNNNNNNNNNNNNNNNNNNNN!****************************************************** EDITOR: LD C,(HL) ;MESSAGE EDIT LOOP PUSH HL ;SAVE PTR RES 7,C ;C!NNNNNNNNNNNNNNNNGNNNNNNNNNNNNNNNNNNNNNNER INPUT ; CALL CI ; PUSH AF LD C,A CALL COC POP AF ; ; IF OPTION IS CTRL-C THEN WARM BOOT ; CP A,3 ;IF CTRL>NNNNNNNNNNNNNNNNNG%NNNNNNNNNNNNNNNNNNNNNN------ ; ; UNSUPPORTED INTERRUPT ; ;---------------------------------------------------------------------------- ILLINT: HNNNNNNNNNNNNNNNNNG+= STHD) DW 0 ;;NO CHECKS ON HARD DISK ELSE DW D#D(DD)CHK ;;DRIVE DISK CHENNNNNNNNNNNNNNNNNG&}NNNNNNNNNNNNNNNNNNNNN!2 ;DMA ADDRESS BTDMAX DS 1 ;DMA EXTENDED ADDRESS ;########################################################################NNNNNNNNNNNNNNNNNNG,NNNNNNNNNNNNNNNNNNNNNNS AREA ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ALLDAL: MACRO #D LIST ON IF ((DDfNNNNNNNNNNNNNNNNGNNNNNNNNNNNNNNNNNNNNNNTRKS SPT ; #ZD= DATA TRKS SIZE ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ALLDRV MACK NNNNNNNNNNNNNNNNNG kNNNNNNNNNNNNNNNNNNNNNN,1,64,1 ALLDRV HDEXEC,5,60H,64,1,64,1,64,1 ENDIF LIST ON ;#########################################################.NNNNNNNNNNNNNNNNNGNNNNNNNNNNNNNNNNNNNNNNK PARAMETER BLOCK ; ;############################################################################ HDPBK: DW 128 ;SECTORS PER(NNNNNNNNNNNNNNNNNG-NNNNNNNNNNNNNNNNNNNNNNBOUNDARY ; IF $ AND 0FFH DS 100H - ($ AND 0FFH) ENDIF INTABL: REPT 7 ;1ST 7 ARE UNSUPPORTED LIST OFF DW ILLINT UNNNNNNNNNNNNNNNNGNNNNNNNNNNNNNNNNNNNNNN#################################################### ; ; DRIVE PARAMETER HEADER AREA ; 1 PER DRIVE ; ;#####################;NNNNNNNNNNNNNNNNNG!JNNNNNNNNNNNNNNNNNNNNNNCKSUMS ARRAY PTR ENDIF DW D#D(DD)ALL ;;DRIVE CLUSTER ALLOCATION BIT MAP PTR LIST OFF ENDM ; ; DEFINE THE DATA ; OrNNNNNNNNNNNNNNNNG'NNNNNNNNNNNNNNNNNNNNNNN#### ; ; VARIABLES ; ;############################################################################ DTPTR: DS 2 ;DRIVE TABNNNNNNNNNNNNNNNNNG-'NNNNNNNNNNNNNNNNNNNNNN - 1) >= STHD) AND ((DD - 1) <= NDHD) D#D(DD)ALL: DS 127 ;ALLOCATION BIT MAP FOR 8" HARD DRIVE #D(DD) ENDIF IF ((DD - 1NNNNNNNNNNNNNNNNNGYNNNNNNNNNNNNNNNNNNNNNNRO #DADD,#PD,#FG,#S0,#Z0,#S1,#Z1,#SD,#ZD LIST ON DW #DADD DB 0 ;;LOGON INHIBIT FLAG (LOGON ENABLED) DB #PD DB #FG DNNNNNNNNNNNNNNNNG >VNNNNNNNNNNNNNNNNNNNNNN################### ; ; DEFAULT 8" FLOPPY DISK PARAMETER BLOCK ; IBM 3740 SINGLE DENSITY FORMAT ; ;########################NNNNNNNNNNNNNNNNGNNNNNNNNNNNNNNNNNNNNNN TRACK (LOGICAL) (SPT) DB 5 ;BLOCK SHIFT FACTOR (BSH) DB 31 ;BLOCK MASK (BLM) DB 1 ;NULL MASK (EXM) DW 1015 ;DI=NNNNNNNNNNNNNNNNNNGxHNNNNNNNNNNNNNNNNNNNNNNLIST ON ENDM ; DW ITRAP ;INT 8 IS USER INTERRUPT ENDIF ;##########################################################NNNNNNNNNNNNNNNNNGNNNNNNNNNNNNNNNNNNNNNN####################################################### ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@NNNNNNNNNNNNNNNG"NNNNNNNNNNNNNNNNNNNNNNDD DL 1 REPT NDRVS LIST OFF ALLDPH 0123456789ABCDEF DD DL DD + 1 LIST ON ENDM ; ; LAST OF INITIALIZED CODE READNNNNNNNNNNNNNNNNNG(^NNNNNNNNNNNNNNNNNNNNNNLE PTR LOGRQ: DS 1 ;LOG ON REQUEST REG. DVRTPTR DS 2 ;DRIVE DRIVER TABLE BASE ADDRESS PTR DVRXADR DS 2 ;DRIVE DRIVER EXECUTIO NNNNNNNNNNNNNNNNNG.tNNNNNNNNNNNNNNNNNNNNNN) >= ST8FD) AND ((DD - 1) <= ND8FD) D#D(DD)ALL: DS 57 ;ALLOCATION BIT MAP FOR 8" DRIVE #D(DD) D#D(DD)CHK DS 32 ;DIRECTORY CdNNNNNNNNNNNNNNNNNG.hNNNNNNNNNNNNNNNNNNNNNNB #S0,#Z0,#S1,#Z1,#SD,#ZD DB 0 ;;DISK TYPE LIST OFF ENDM DVR0: IF BOOT = 10H ALLDRV HDEXEC,4,60H,64,1,64,1,64,1 aNNNNNNNNNNNNNNNNNG gNNNNNNNNNNNNNNNNNNNNN!#################################################### SD8PBK: DW 26 ;SECTORS PER TRACK DB 3 ;BLOCK SHIFT FACTOR DB 7 ;BLOoNNNNNNNNNNNNNNNNNGNNNNNNNNNNNNNNNNNNNNNNSK SIZE (CLUSTERS -1) (DSM) DW 1152 / 2 ;DIRECTORY MAX (DRM) DB 0FFH ;ALLOCATION 0 (AL0) DB 10000000B ;ALLOCATION 1 g$NNNNNNNNNNNNNNNNGKyNNNNNNNNNNNNNNNNNNNNN!################## ; ; MESSAGES ; ;############################################################################ MSGLE: DMLNNNNNNNNNNNNNNNNNGNNNNNNNNNNNNNNNNNNNNNN@@@@@@@@@ ; ; GENERATE A DISK PARAMETER TABLE MACRO ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@NNNNNNNNNNNNNNNNNG#(NNNNNNNNNNNNNNNNNNNNNN FROM DISK ; BIOSND EQU $ SUBTTL UNINITIALIZED DATA AREA ;###############################################################-sNNNNNNNNNNNNNNNNG)mNNNNNNNNNNNNNNNNNNNNNNN ADDRESS ROMSAV DS 1 ;ROM SWAP SAVE OF ORIGINAL ROM ;#####################################################################NNNNNNNNNNNNNNNNG/ENNNNNNNNNNNNNNNNNNNNNNHECKSUMS STORAGE (1 BYTE PER SECTOR) ENDIF LIST OFF ENDM ; ; RESERVE THE DATA SPACE ; DD DL 1 REPT NDRVS LIST hTNNNNNNNNNNNNNNNNNNG{;NNNNNNNNNNNNNNNNNNNNNN ALLDRV HDEXEC,4,60H,64,1,64,1,64,1 ALLDRV HDEXEC,5,60H,64,1,64,1,64,1 ALLDRV HDEXEC,5,60H,64,1,64,1,64,1 ALLDRV FD8EXEC,gNNNNNNNNNNNNNNNNG NNNNNNNNNNNNNNNNNNNNNNCK MASK DB 0 ;NULL MASK DW 242 ;DISK SIZE -1 DW 63 ;DIRECTORY MAX DB 11000000B ;ALLOC 0 DB 0 ;ALLOC 1 DW 16 ;CH NNNNNNNNNNNNNNNNGNNNNNNNNNNNNNNNNNNNNNN (AL1) DW 0 ;CHECK SIZE (CKS) DW 2 ;TRACK OFFSET (OFF) ; ; ; DB 01100000B ;FLAGS 256 BPS, HARD, SSSD DB 64,1,64hNNNNNNNNNNNNNNNNNG[GNNNNNNNNNNNNNNNNNNNNNN CR,LF,'LOAD ERROR' ; DSKEM: DB CR,LF,'Disk Error Status:' DM CR,LF,'CM DR TL TH SL SH FG AL AH AX ST S1 S2 S3 S4 S5',CR,LF NNNNNNNNNNNNNNNNNGNNNNNNNNNNNNNNNNNNNNN!@@@@@@@ ALLDPH: MACRO #D LIST ON D#D(DD)DPH: ;DRIVE PARAMETER HEADER FOR DRIVE #D(DD) DW 0 ;;SECTOR TRAN TBL (OR 0 IF NRNNNNNNNNNNNNNNNNG$NNNNNNNNNNNNNNNNNNNNNN############# ; ; THE FOLLOWING DATA MUST RESIDE IN THIS ORDER ; ;########################################################`NNNNNNNNNNNNNNNNG*8NNNNNNNNNNNNNNNNNNNNNN######## ; ; DRIVE ALLOCATION AREAS ; ;############################################################################ ;@@'NNNNNNNNNNNNNNNNNG0NNNNNNNNNNNNNNNNNNNNNNOFF ALLDAL 0123456789ABCDEF DD DL DD + 1 LIST ON ENDM ;#############################################################{NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN8NNNNNNNNҁo= مs@܉uCߍ{I味P땹U#𙾚Y&],Ǣb0˦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNHrNNNNNNNNNNNNNNNNNNNNNN############### ; ; RESERVE DRIVE PARAMETER BLOCKS ; ;#################################################################### HNNNNNNNNNNNNNNNNNHNNNNNNNNNNNNNNNNNNNNNNTORY SECTORS CHECKED ; (DRM +1) / 4 DPBOFF DS 2 ;OFF- # RESERVED TRACKS (USUALLY 2) DPBSZ DS 0 ENDM ; ; ;@@@@@@@@@@@@HNNNNNNNNNNNNNNNNNNH DNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNHdcNNNNNNNNNNNNNNNNNNNNNNOT FALSE ;============================================================================ ; ; CONDITIONAL ASSEMBLY FLAGS ; ; NNNNNNNNNNNNNNNNHNNNNNNNNNNNNNNNNNNNNNN**************************************************************** ; ; CONFIGURATION: ; ; CPM ; DRIVE USAGE IF BOOT = 10HdNNNNNNNNNNNNNNNNNH!NNNNNNNNNNNNNNNNNNNNNNY PHYSICAL DRIVE 0 ; B JADE 5" FLOPPY PHYSICAL DRIVE 1 ; C SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 0 ; D SIDE 2 & 3 OF H$NNNNNNNNNNNNNNNNNH%PNNNNNNNNNNNNNNNNNNNNNN6 - 20 FEB 83 ; DOUBLE D REV C UPGRADE. CHANGE BOARD STATUS PORT BITS. ; ; 2.2.7 - 8 MAR 83 GRH ; ADDED CLOCK/CALENDAR DRIVErNNNNNNNNNNNNNNNNH+_NNNNNNNNNNNNNNNNNNNNNNct half size directory, but keep ; allocation for 1k directory ; ; 2.02 - 2 JUN 84 GRH ; Change floppy disk drivers to relhm\NNNNNNNNNNNNNNNNHT!NNNNNNNNNNNNNNNNNNNNNN######## STRUCT 0 DPBSPT DS 2 ;SPT- SECTORS/TRACK DPBBSH DS 1 ;BSH- BLOCK SHIFT FACTOR DETERMINED BY CLUSTER SIZE ; 1K= kNNNNNNNNNNNNNNNNHNNNNNNNNNNNNNNNNNNNNNN@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; GENERATE THE DPB FOR DRIVE MACRO ; ;@@@@@@@@@@@@@@@@@@@NNNNNNNNNNNNNNNNNHLNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNHNNNNNNNNNNNNNNNNNNNNNN============================================================================ SHORT EQU FALSE ;SHORT BIOS (REMOVES UNESENTIAL CBNNNNNNNNNNNNNNNHNNNNNNNNNNNNNNNNNNNNN! ;HARD DISK BOOT CONFIG. ; A SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 0 ; B SIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 0 ; C9NNNNNNNNNNNNNNNNH 4NNNNNNNNNNNNNNNNNNNNNNARD DISK PHYSICAL DRIVE 0 ; E SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 1 ; F SIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 1 ; G NNNNNNNNNNNNNNNNNH&NNNNNNNNNNNNNNNNNNNNNNR, SYSTEM CALL INTERCEPT, ; ILLEGAL SYSTEM CALL MESSAGE, CHANGED BIOS SIZE TO END ; OF INITIALIZED DATA AREA. RESTRUCTURE MODU>NNNNNNNNNNNNNNNNNNH,qNNNNNNNNNNNNNNNNNNNNNNate to ISASI control of JADE ; FDC. ; Change IOPB sector value from physical sector (1..n) to logical ; sector value (0cNNNNNNNNNNNNNNNHgNNNNNNNNNNNNNNNNNNNNNN3, 2K= 4, 4K= 5, 8K= 6, 16K= 7 DPBBLM DS 1 ;BLM- BLOCK MASK ; 1K = 7, 2K= 15, 4K= 31, 8K= 63, 16K= 127 DPBEXM DS 1 ;EXM- ENNNNNNNNNNNNNNNNNH NNNNNNNNNNNNNNNNNNNNN!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ALLDPB: MACRO #D LIST ON D#D(DD)DPB: DS DPBSZ ;ALLOCATION FOR DRIRNNNNNNNNNNNNNNNNNH"}NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNHNNNNNNNNNNNNNNNNNNNNNNODE) LSTINC EQU FALSE ;LIST INCLUDE FILES USEMON EQU TRUE ;USE MONITOR ROM I/O ROUTINES IF TRUE INTRPTS EQU TRUE ;ENABLE I'NNNNNNNNNNNNNNNNNHNNNNNNNNNNNNNNNNNNNNNN SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 1 ; D SIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 1 ; E JADE 8" FLOPPY PHYSICAL DRIVE 0NNNNNNNNNNNNNNNNNH!NNNNNNNNNNNNNNNNNNNNNN JADE 8" FLOPPY PHYSICAL DRIVE 0 ; H JADE 8" FLOPPY PHYSICAL DRIVE 1 ENDIF ; ;*****************************************.NNNNNNNNNNNNNNNNH'2NNNNNNNNNNNNNNNNNNNNNNLES. ; ; 2.28 - 22 APR 83 GRH ; CHANGED DEFINITIONS TO ALLOW BIG DIRECTORIES. ; DISALLOWED DRIVES C & D. ; ; 2.29 - 3 SEɦNNNNNNNNNNNNNNNNNH-BNNNNNNNNNNNNNNNNNNNNNN..n-1). This maintains more uniformity in ; parameter passing between hard disk & JADE floppy IOPBs. ; Vector I/O routines {BNNNNNNNNNNNNNNNNNHNNNNNNNNNNNNNNNNNNNNNNXTENT MASK ; DSM < 256 : 1K= 0, 2K= 1, 4K= 3, 8K= 7, 16K= 15 ; DSM > 255 : 2K= 0, 4K= 1, 8K= 3, 16K= 7 DPBDSM DS 2 ;DSM̼INNNNNNNNNNNNNNNNH ݈NNNNNNNNNNNNNNNNNNNNNNVE #D(DD) LIST OFF ENDM ; ; RESERVE THE DATA SPACE ; DD DL 1 REPT NDRVS LIST OFF ALLDPB 0123456789ABCDEF DD DL ENNNNNNNNNNNNNNNNNNH10NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNHNNNNNNNNNNNNNNNNNNNNNNNTERRUPT PROCESSING WHISTLE INTCPTS EQU TRUE ;ENABLE SYSTEM CALL INTERCEPT WHISTLE BOOT EQU 3 ;10H: HARD DISK, 3: 8" FLOPPY,NNNNNNNNNNNNNNNNNHt]NNNNNNNNNNNNNNNNNNNNNN ; F JADE 8" FLOPPY PHYSICAL DRIVE 1 ENDIF IF BOOT = 3 ; A JADE 8" FLOPPY PHYSICAL DRIVE 0 ; B JADE 8" FLOPPY PHNNNNNNNNNNNNNNNNH"RNNNNNNNNNNNNNNNNNNNNNN******************** ; REVISIONS: ; ; 2.2.0 - RELEASE ; ; 2.2.3 - SWAPPED DCM & BIOS SECTORS ON DISK, ALLOWING A ; LrNNNNNNNNNNNNNNNNNH( NNNNNNNNNNNNNNNNNNNNN!P 83 GRH ; Changed Rev # for blocked DCM. Enables IBM system 34 ; 256 bytes per sector disks to be read. ; ; 1.10 - 23 SEP(!NNNNNNNNNNNNNNNNH.NNNNNNNNNNNNNNNNNNNNN!to monitor rom routines. ; ; 2.03 - 4 JUN 84 GRH ; Add bells & whistles again. ; Move to 61k system. ; ; 2.04 - 30 MAR 8m|NNNNNNNNNNNNNNNNNHͶNNNNNNNNNNNNNNNNNNNNNN- DRIVE STORAGE SIZE (IN CLUSTERS) ; INT(((#_TRACKS - OFF) * SPT * BYTES PER SECTOR) / CLUSTER SIZE) -1 DPBDRM DS 2 ;DRM- DI%-NNNNNNNNNNNNNNNNH NNNNNNNNNNNNNNNNNNNNN!DD + 1 LIST ON ENDM IF (($ - 8000H) > 07800H) OR ($ < 8000H) CONMSG **** BIOS TOO BIG, USE MOVCPM & RE-ADJUST! ***{NNNNNNNNNNNNNNNNNNHNNNNNNNNNNNNNNNNNNNNNN TITLE CUSTOMIZED BIOS FOR M5B LIST NOCOND ;============================================================================ ; ^BNNNNNNNNNNNNNNNNHNNNNNNNNNNNNNNNNNNNNN! 20H: 5" FLOPPY DEBUG EQU FALSE ;TRUE TO DUMP THE IOPB DATA TO PRINTER FORM ;********************************************/!NNNNNNNNNNNNNNNNNHGlNNNNNNNNNNNNNNNNNNNNNNHYSICAL DRIVE 1 ; C SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 0 ; D SIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 0 ; E SIDE 0 & NNNNNNNNNNNNNNNNH#aNNNNNNNNNNNNNNNNNNNNNNARGER BIOS ALLOCATION ON THE DISK. ; ; 2.2.4 - ADDED NAKED TERMINAL DRIVERS & IOBYTE IN ; ANTICIPATION OF THE MONITOR. ALrNNNNNNNNNNNNNNNNH)=NNNNNNNNNNNNNNNNNNNNNN 83 GRH ; Move clock-calendar routines to ROM. Add Interrupt handler ; (Mode 2). Change Revision display of sign-on (separatC$NNNNNNNNNNNNNNNNNH/$NNNNNNNNNNNNNNNNNNNNNN5 GRH ; Implemented hard disk drive 1 as C: & D:. ; Implemented the Logon function for the hard disk. ; Implemented user fr? NNNNNNNNNNNNNNNNNNHNNNNNNNNNNNNNNNNNNNNNNRECTORY SIZE -1 DPBAL0 DS 2 ;AL0,1- DIRECTORY ALLOCATION ; 1 MSB PER DIRECTORY CLUSTER ALLOCATED DPBCKS DS 2 ;CKS- # DIRECtBNNNNNNNNNNNNNNNNH w.NNNNNNNNNNNNNNNNNNNNNN* ENDIF END :yNNNNNNNNNNNNNNNNHWRNNNNNNNNNNNNNNNNNNNNN!; ASSEMBLY PARAMETERS ; ;============================================================================ FALSE EQU 0 TRUE EQU N7!NNNNNNNNNNNNNNNNHNNNNNNNNNNNNNNNNNNNNNN******************************** ; ; CUSTOMIZED BIOS FOR M5B ; (c) 1981 GRH Electronics, CUPERTINO, CA ; ;************Q9NNNNNNNNNNNNNNNNNH?NNNNNNNNNNNNNNNNNNNNNN1 OF HARD DISK PHYSICAL DRIVE 1 ; F SIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 1 ENDIF IF BOOT = 20H ; A JADE 5" FLOPPdNNNNNNNNNNNNNNNNNH$aNNNNNNNNNNNNNNNNNNNNNNSO, ALL REFERENCES ; REQUIRING THE I/O PROMS TO BOOT HAS BEEN REMOVED. ; ; 2.2.5 - RECONFIGURE FOR 62K SYSTEM. ; ; 2.2.NNNNNNNNNNNNNNNNNNH*nNNNNNNNNNNNNNNNNNNNNNNe CBIOS rev). ; ; 2.00 - 24 MAR 84 GRH ; Modify for hard disk ; ; 2.01 - 28 APR 84 GRH ; Change hard disk DPB to refleNNNNNNNNNNNNNNNNH07NNNNNNNNNNNNNNNNNNNNNNiendly disk error options: Abort, Retry, Ignore. ; Solved warm boot hang problem by reseting host adapter if busy. ; ; 3.00 -h=9NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNŃg4Ѕk9ԉn< ؍sBݑxFᕯ}J噳N靶S"Y'¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNH6BNNNNNNNNNNNNNNNNNNNNN! 26 JAN 87 GRH ; Implemented new common IOPB code & Jade floppy firmware support. ; Implemented disk drive driver tables andNNNNNNNNNNNNNNNNHNNNNNNNNNNNNNNNNNNNNNN========================================================== ; ; INCLUDE JDDCONT.DEF ; INCLUDE COMIOPB.DEF ; INCLUDE JDDDISK.DӁNNNNNNNNNNNNNNNNNH s/NNNNNNNNNNNNNNNNNNNNNNS: EQU 60 ;SYSTEM SIZE IN K BYTES KBYTE: EQU 1024 CPMSZ: EQU KBYTE * NKSYS CPMBS: EQU CPMSZ - (20 * KBYTE) ; CP/M BIAS VALUEKNNNNNNNNNNNNNNNNHSSNNNNNNNNNNNNNNNNNNNNN!========================== ; ; OTHER DECLARATIONS ; ;=======================================================================uNNNNNNNNNNNNNNNNHNNNNNNNNNNNNNNNNNNNNNN================================================= ; ; ADDRESSES ; ;=========================================================NNNNNNNNNNNNNNNNNH>NNNNNNNNNNNNNNNNNNNNNN@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ GXLATE MACRO #SECTORS, #SKEW LIST OFF NXTSEC DL 1 ;KNNNNNNNNNNNNNNNNNH%`NNNNNNNNNNNNNNNNNNNNNN ENDIF IF DD > 999 DB (DD / 1000) + '0' DD DL DD % 1000 ENDIF DB (DD / 100) + '0' DB '.' DB ((DD % 100) / 1#NNNNNNNNNNNNNNNNH+oNNNNNNNNNNNNNNNNNNNNN!KWR ;PERFORM DISK WRITE JP LISTST ;RETURN LIST STATUS JP SECTRN ;TRANSLATE SECTOR JP BIOFUNC ;EXECUTE FUNCTION CALL L+HNNNNNNNNNNNNNNNNNHcNNNNNNNNNNNNNNNNNNNNNN new function to return ; a ptr to a drive table. ; Removed init of IOBYTE. ; Implemented 5" floppy driver. ; Implemented usNNNNNNNNNNNNNNNNNHNNNNNNNNNNNNNNNNNNNNNNEF ; INCLUDE MONBOARD.DEF ; INCLUDE IOBOARD.DEF ; INCLUDE NAKEDT.DEF ; INCLUDE ISHA.DEF ; INCLUDE CLOCK.DEF ; INCLUDE SYSD'NNNNNNNNNNNNNNNNH&|NNNNNNNNNNNNNNNNNNNNNN CCP: EQU CPMBS + 3400H ;ADDR OF CCP BDOS: EQU CPMBS + 3C00H ;ADDRESS OF BDOS BIOS: EQU CPMBS + 4A00H ;ADDRESS OF BDOS BIOSRF$NNNNNNNNNNNNNNNNNHNNNNNNNNNNNNNNNNNNNNN!===== SECSZ: EQU 128 NDRVS: EQU 6 IF BOOT = 10H ; ; 8" HARD DISK BOOT DATA ; LASTSEC EQU 47 ;LAST BOOT SECTOR ; SfNNNNNNNNNNNNNNNNHNNNNNNNNNNNNNNNNNNNNNN=================== CALROM EQU 7 ;CALENDAR ROM SELECT # RDBENT EQU 0F800H ;READ CLOCK BUFFER ENTRY SETENT EQU RDBENT + 3 ;SXBNNNNNNNNNNNNNNNNH NNNNNNNNNNNNNNNNNNNNNN;START WITH SECTOR 1 LOWEST DL 1 ;; REPT #SECTORS LIST ON DB NXTSEC LIST OFF NXTSEC DL NXTSEC + #SKEW ;ADD SKEW FACTOENNNNNNNNNNNNNNNNNH&3NNNNNNNNNNNNNNNNNNNNNN0) + '0' DB (DD % 10) + '0' ENDM SUBTTL BIOS CODE ORG BIOS ;-------------------------------------------------------;NNNNNNNNNNNNNNNNNNH,FNNNNNNNNNNNNNNNNNNNNNN ;############################################################################ ; ; THESE BOOT PARAMS MUST RESIDE AS DEFINED trNNNNNNNNNNNNNNNHP NNNNNNNNNNNNNNNNNNNNNNse of ROM primitives. ; Moved system down to 60k. ; ; 3.01 26 JUN 88 GRH ; Remove 5" floppy support. Implement in CP/M-86 B7@NNNNNNNNNNNNNNNNH NNNNNNNNNNNNNNNNNNNNNNIR.DEF ; ;============================================================================ LIST OFF *INCLUDE JDDCONT.DEF *INCL; NNNNNNNNNNNNNNNNNHMNNNNNNNNNNNNNNNNNNNNNN: EQU 1000H - BIOS ; ; PAGE 0 LOCATIONS ; PAGE0: EQU 0 ;START OF CP/M RAM IOBYTE: EQU PAGE0 + 3 ;IOBYTE ADDR DEFDRV: EQNNNNNNNNNNNNNNNNNNHNNNNNNNNNNNNNNNNNNNNNNTHD EQU 0 ;START LOGICAL DRIVE OF HARD DISK NDHD EQU 3 ;LAST LOGICAL DRIVE OF HARD DISK ST8FD EQU 4 ;START LOGICAL DRIVE OF NNNNNNNNNNNNNNNNHNNNNNNNNNNNNNNNNNNNNNNET CLOCK ENTRY CALENT EQU RDBENT + 6 ;RETURN CALENDAR ENTRY TIMENT EQU RDBENT + 9 ;RETURN TIME ENTRY DKPENT EQU RDBENT + 0CH WNNNNNNNNNNNNNNNNH!0NNNNNNNNNNNNNNNNNNNNN!R ;; IF NXTSEC > #SECTORS ;CHECK FOR OVERFLOW NXTSEC DL NXTSEC - #SECTORS ;; IF NXTSEC <= LOWEST ;CHECK FOR REPEAT NNNNNNNNNNNNNNNNNH'NNNNNNNNNNNNNNNNNNNNNN--------------------- ; ; BIOS JUMP VECTOR TABLE ; ;----------------------------------------------------------------------1+NNNNNNNNNNNNNNNNNH-uNNNNNNNNNNNNNNNNNNNNNNRIGHT BEFORE THE COLD INIT ; ROUTINE START AND MUST BE IN THE 1ST SECTOR. THESE 2 WORDS ARE REFERENCED ; BY THE BOOT CODE INNNNNNNNNNNNNNNNNNHɷNNNNNNNNNNNNNNNNNNNNNNIOS. ; Change single function to return drive table ptr into a BIOS function ; call using restart instruction. ; Change LOGQNNNNNNNNNNNNNNNNH NNNNNNNNNNNNNNNNNNNNNNUDE COMIOPB.DEF *INCLUDE JDDDISK.DEF *INCLUDE MONBOARD.DEF *INCLUDE IOBOARD.DEF *INCLUDE NAKEDT.DEF *INCLUDE ISHA.DEF *INC.7NNNNNNNNNNNNNNNNHNNNNNNNNNNNNNNNNNNNNNNU PAGE0 + 4 ;DEFAULT DRIVE PARAM ADDR BDOSJV EQU PAGE0 + 5 ;BDOS SYSTEM CALL ENTRY DKPROM EQU PAGE0 + 40H ;DISK PRIMITIVES PRO-NNNNNNNNNNNNNNNNNHNNNNNNNNNNNNNNNNNNNNNN 8" FLOPPY ND8FD EQU 5 ;LAST LOGICAL DRIVE OF 8" FLOPPY ENDIF IF BOOT = 3 ; ; 8" FLOPPY BOOT DATA ; LASTSEC EQU NNNNNNNNNNNNNNNNNHCmNNNNNNNNNNNNNNNNNNNNN!;DISK PRIMITIVES ENTRY ;============================================================================ ; ; ASCII CHARS ; >NNNNNNNNNNNNNNNNH"eNNNNNNNNNNNNNNNNNNNNNNXTSEC DL LOWEST + 1 LOWEST DL NXTSEC ENDIF ENDIF ;; ENDM LIST ON ENDM ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@)NNNNNNNNNNNNNNNNNH(NNNNNNNNNNNNNNNNH @NNNNNNNNNNNNNNNNNNNNNN ; ; DISK OPERATING SYSTEM ADDRESSES ; ;============================================================================ NKSYoNNNNNNNNNNNNNNNNH`bNNNNNNNNNNNNNNNNNNNNNNUNRSV EQU PAGE0 + BFUNRST BFUNRSI EQU 0C7H + BFUNRST ; TPA: EQU 100H ;==================================================JNNNNNNNNNNNNNNNNNHNNNNNNNNNNNNNNNNNNNNNN 0 ;START LOGICAL DRIVE OF 8" FLOPPY ND8FD EQU 1 ;LAST LOGICAL DRIVE OF 8" FLOPPY ENDIF ;===========================NNNNNNNNNNNNNNNNNH%NNNNNNNNNNNNNNNNNNNNNN@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; GENERATE THE TRANSLATION TABLE MACRO ; ;@@@@@JNNNNNNNNNNNNNNNNNH$QNNNNNNNNNNNNNNNNNNNNNN@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ PVERS MACRO #VERS DD DL #VERS IF DD > 9999 DB (DD / 10000) + '0' DD DL DD % 10000 NNNNNNNNNNNNNNNNH*^NNNNNNNNNNNNNNNNNNNNNNVE JP SETTRK ;SET TRACK # JP SETSEC ;SET SECTOR # JP SETDMA ;SET TRANSFER ADDR JP DISKRD ;PERFORM DISK READ JP DISNNNNNNNNNNNNNNNNH0NNNNNNNNNNNNNNNNNNNNNNCONTINUE ON WITH INIT ; INIT1: JR INIT ;############################################################################ ; NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNсm:Յp> ډtBߍ|J呲N蕶R W$[)â_,ȦNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNIwNNNNNNNNNNNNNNNNNNNNNN; DIRECTORY SECTOR BUFFER STARTS HERE AFTER CRUNCHING COLD START ; CODE. THIS BUFFER IS USED BY THE CP/M DIRECTORY CHECK ROUTIBNNNNNNNNNNNNNNNNI`NNNNNNNNNNNNNNNNNNNNNN-ON ; CLOGO: LD HL,MSGSO CALL EDITOR ; ; MODIFY COLD START VECTOR TO WARM START ; LD HL,(BIOS+4) LD (BIOS+1),HL ; INNNNNNNNNNNNNNNNNNI 2NNNNNNNNNNNNNNNNNNNNNN-- ; ; WARM REBOOT ENTRY LOADS CCP,BDOS FROM DISK & ; SETS UP VARIABLES ; ;------------------------------------------------NNNNNNNNNNNNNNNNINNNNNNNNNNNNNNNNNNNNNN CALL XPRIM ; NTHUNG: ENDIF ; ; LOG ON DRIVE TO INIT TABLES ; LD A,(DKPROM + 1) AND A,3 ;MODULO 4 LD C,A LD($NNNNNNNNNNNNNNNNINNNNNNNNNNNNNNNNNNNNNNCP/BDOS ; WREAD: CALL DISKRD JR NZ,WEROR ;IF ERROR THEN EXIT ; ; NEXT SECTOR ; LD HL,BTSEC INC (HL) ; LD DE,SECS?!NNNNNNNNNNNNNNNNIWNNNNNNNNNNNNNNNNNNNNNNROR: LD HL,MSGLE ;OUTPUT ERROR MESSAGE CALL EDITOR HALT ; ; ; BOOT OK, INIT PAGE 0 ; WZRPG: ; ; INIT BIOS WARM ST5!dNNNNNNNNNNNNNNNNNI%NNNNNNNNNNNNNNNNNNNNNNRIVE AND A,11000000B ;TEST UNUSED BUT DRIVEN BITS (1S IF NOT THERE) LD A,38H ;COND. JR (ON) JR Z,CLKON ; LD A,18H ;UNHNNNNNNNNNNNNNNNNNI+NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++ DISKWR: LD A,DDWRS ;SELECT WRITE OP JP DISKOP ;++++++++++++++++++++++++++++++++++++!NNNNNNNNNNNNNNNNI"NNNNNNNNNNNNNNNNNNNNNNNES THAT ; CHECK FOR DISK CHANGE. ; ;############################################################################ DIRBF: EQ]NNNNNNNNNNNNNNNNNNI^NNNNNNNNNNNNNNNNNNNNNN ; BOOT CCP & BDOS ; JR WARM ;############################################################################ ; ; SIGN-@NNNNNNNNNNNNNNNNIgNNNNNNNNNNNNNNNNNNNNN!---------- WARM: IF INTRPTS ; ; SET INTERRUPT VECTOR TABLE BASE ; LD A,HIGH INTABL LD I,A ; ; SET INTERRUPT MODrNNNNNNNNNNNNNNNNNI@NNNNNNNNNNNNNNNNNNNNNN E,0 CALL SELDSK LD A,L ;IF ERROR THEN ABORT OR A,H JR Z,WEROR ; ; READ BOOT DIRECTORY ; LD BC,DEFBFR ;SET XFEINNNNNNNNNNNNNNNNIONNNNNNNNNNNNNNNNNNNNNNZ ;DMA := DMA + SECTOR SIZE LD HL,(BTDMA) ADD HL,DE LD (BTDMA),HL ; ; IF NOT INTO BDOS THEN READ NEXT SECTOR ; LD Dr9NNNNNNNNNNNNNNNNI BNNNNNNNNNNNNNNNNNNNNNNART IN PAGE 0 ; LD A,0C3H LD HL,BIOS + 3 LD (PAGE0),A LD (PAGE0 + 1),HL ; ; INIT BDOS CALL VECTOR IN PAGE 0 ; LDFHNNNNNNNNNNNNNNNNNI&NNNNNNNNNNNNNNNNNNNNNNCOND. JR (OFF) (CAUSES JUMP TO ILLEGAL) ; CLKON: LD (INHCLK),A ; ENDIF ; ; PASS DEFAULT DISK TO CCP ; LD A,(DEFDRV)NNNNNNNNNNNNNNNNNNI,|NNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++ ; ; SELECT DRIVE FUNCTION ; LOG-ON - SET DISK PARAMETER BLOCK ; ENTRY- C= DRIVE # jNNNNNNNNNNNNNNNNINNNNNNNNNNNNNNNNNNNNNNU $ ;BUFFER BEGINNING ;---------------------------------------------------------------------------- ; ; INIT - COLD NNNNNNNNNNNNNNNNNI oNNNNNNNNNNNNNNNNNNNNN!ON MESSAGE ; ;############################################################################ MSGSO: DB CR,LF DB CPMSZ / (KBYTɤNNNNNNNNNNNNNNNNNITNNNNNNNNNNNNNNNNNNNNNNE TO 2 ; IM 2 ; ; ENABLE INTERRUPT VECTOR 7 ; IN A,(INTMSK) AND A,7FH OUT (INTMSK),A ; ; FINALLY ENABLE VECTORBNNNNNNNNNNNNNNNNNIqNNNNNNNNNNNNNNNNNNNNNNR ADDRESS (USE DEFAULT BUFFER) CALL SETDMA ; LD BC,?DIRSEC ;SET DIRECTORY SECTOR CALL SETSEC ; LD BC,0 ;SET TRACK TO bVrNNNNNNNNNNNNNNNNI~NNNNNNNNNNNNNNNNNNNNNNE,BDOS XOR A,A SBC HL,DE JR C,WREAD ; ; ELSE IF AT BEGINNING OF BDOS THEN SET UP NEW TRACK & SECTOR ; JR Z,RDBDOS sNNNNNNNNNNNNNNNNNNI!q NNNNNNNNNNNNNNNNNNNNN! HL,BDOS + 6 LD (BDOSJV),A LD (BDOSJV + 1),HL ; ; INIT BIOS CALL VECTOR IN PAGE 0 ; LD HL,BIOFUNC LD (BFUNRSV),A ; NNNNNNNNNNNNNNNNI'ۆNNNNNNNNNNNNNNNNNNNNNN LD C,A JP CCP SUBTTL BIOS DISK FUNCTION ROUTINES ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++PrNNNNNNNNNNNNNNNNNI-4MNNNNNNNNNNNNNNNNNNNNNN; E= 0 IF NEW SELECT ; EXIT - HL= PTR TO DPT OR 0 FOR ERROR ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#NNNNNNNNNNNNNNNNNI3NNNNNNNNNNNNNNNNNNNNNNSTART ENTRY FROM BOOT MUST SET ALL BIOS PARAMS ; ;---------------------------------------------------------------------------- HNNNNNNNNNNNNNNNNI (DIRBF + SECSZ) CONMSG **** WARNING! COLD INIT CODE BIGGER THAN DIR BUFFER **** ELSE DS DIINNNNNNNNNNNNNNNNNItNNNNNNNNNNNNNNNNNNNNNN INSURE MONITOR ROM STILL ENABLED ; CALL GETMON ; IF BOOT = 10H ; TEST ISHA HOST ADAPTER FOR A HUNG CONDITION AND C[NNNNNNNNNNNNNNNNINNNNNNNNNNNNNNNNNNNNN!EROR ; ; SET UP TO LOAD CCP/BDOS ; LD HL,(DEFBFR + ?DSBDSS) ;PREFETCH BDOS TRK/SECTOR PUSH HL ; LD HL,(DEFBFR + ?DSCQ9NNNNNNNNNNNNNNNNNI1NNNNNNNNNNNNNNNNNNNNNNM ; JP WZRPG ; ; ; ELSE SET UP & READ BDOS ; RDBDOS: POP HL ;RESTORE BDOS TRK/SECTOR FROM DIRECTORY LD C,L LD B,ATNNNNNNNNNNNNNNNNNI#BNNNNNNNNNNNNNNNNNNNNNNNTO INTERCEPT CODE ; LD HL,(BDOS + 7) LD (BDOSV),HL ; ; NOW PUT INTERCEPT VECTOR INTO BDOS CODE ; LD HL,INTCPT LD UNNNNNNNNNNNNNNNNNNI)NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++ DISKRD: LD A,DDRDS ;SELECT READ OP JP DISKOP ;+++++++++++++++++++++++++++++++++++++++++++++++++++++XNNNNNNNNNNNNNNNNI/R/NNNNNNNNNNNNNNNNNNNNNNA,C CP A,NDRVS RET NC ; ; STORE DRIVE # FOR FUTURE USE ; LD (BTDRV),A ; ; SAVE LOGON REQUEST FLAG ; LD A,E L%NNNNNNNNNNNNNNNNNIQNNNNNNNNNNNNNNNNNNNNNN ; INIT DEFAULT DRIVE ; LD A,(DKPROM + 1) ;USE DRIVE # PASSED IN PAGE 0 AND A,3 LD (DEFDRV),A ; ; SEND SYSTEM SIGN`$NNNNNNNNNNNNNNNNI NNNNNNNNNNNNNNNNNNNNNNRBF+SECSZ-$ ;FILL OUT DIRECTORY BUFFER TO 1 SECTOR SIZE ENDIF ;--------------------------------------------------------&NNNNNNNNNNNNNNNNI!NNNNNNNNNNNNNNNNNNNNN!LEAR IF TRUE ; IN A,(HSTATUS) ;IF HOST ADAPTER BUSY THEN BIT HBUSYB,A JR Z,NTHUNG ; LD A,DDCLR LD (IOPB + PBCMDO),A 9NNNNNNNNNNNNNNNNNI-NNNNNNNNNNNNNNNNNNNNN!CPS) ;FETCH CCP TRK/SECTOR LD C,L LD B,0 CALL SETSEC ; LD C,H CALL SETTRK ; LD BC,CCP CALL SETDMA ; ; READ C9INNNNNNNNNNNNNNNNNIdNNNNNNNNNNNNNNNNNNNNNN ;A STILL CONTAINS 0 CALL SETSEC ; LD C,H CALL SETTRK ; JR WREAD ; ; ; WARM BOOT ERROR, OUTPUT MSG & HALT ; WENNNNNNNNNNNNNNNNI$NNNNNNNNNNNNNNNNNNNNNN(BDOS + 7),HL ; ; INITIALIZE CLOCK VECTORS IF CLOCK INSTALLED ; IN A,(CLKDAT) ;IF CLOCK NOT PRESENT THEN TURN OFF CLOCK D-BNNNNNNNNNNNNNNNNI*NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++ ; ; WRITE A DISK SECTOR ; EXIT - A= 0: OK; /0: ERROR ; ;+++++++++++++++++++++++++++++++++++++++++++YNNNNNNNNNNNNNNNNNI0AbNNNNNNNNNNNNNNNNNNNNNND (LOGRQ),A ; ; COMPUTE DISK DRIVER TABLE PTR ; CALL RETDVRT ;DRIVE IS STILL IN C REGISTER LD (DVRTPTR),HL ; ; PRE)CNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNŃh5Ѕl:Չo= ٍuDޑzH㕱M虶R흺V%\*ŦNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNI@NNNNNNNNNNNNNNNNNNNNNNFETCH DRIVER EXECUTION ADDRESS FROM TABLE ; LD E,(HL) ;STORE ADDRESS INC HL LD D,(HL) INC HL LD (DVRXADR),DE ; ; mNNNNNNNNNNNNNNNNIPNNNNNNNNNNNNNNNNNNNNNNJR NZ,LGDEF ; ; ELSE XFER ID SECTOR DATA TO TABLES ; CALL TRNONE ;ASSUME NO TRANSLATION ; ; IF HARD DISK OR DOUBLE D,LNNNNNNNNNNNNNNNNNNI NNNNNNNNNNNNNNNNNNNNNNDHD + 1 JR NC,LGCKFD ; ; ELSE USE HARD DISK DEFAULTS ; CALL TRNONE ; NO XLATE LD HL,HDPBK ; ; XFER DATA TO TABL}NNNNNNNNNNNNNNNNI%NNNNNNNNNNNNNNNNNNNNNNBC RET ;**************************************************************************** ; ; SET SECTOR ; ENTRY- BC= SECTO˾NNNNNNNNNNNNNNNNI,NNNNNNNNNNNNNNNNNNNNNNUNCHANGED ; A, DE= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ SECTRN: ; ; IF NO ~NNNNNNNNNNNNNNNNNNI`NNNNNNNNNNNNNNNNNNNNNNFAULT BUFFER ; LD HL,DEFBFR LD (IOPB + PBDMAO),HL XOR A,A LD (IOPB + PBDMAXO),A ; ; SET DESCRIPTOR SECTOR SECTOR ;]NNNNNNNNNNNNNNNNI%NNNNNNNNNNNNNNNNNNNNN!SAVE IY LD IY,(DVRTPTR) ;FETCH TABLE BASE ; LD HL,DKOPRET ;PUT RETURN ADDRESS ON STACK PUSH HL ; LD HL,(DVRXADR) ;FETCNNNNNNNNNNNNNNNNNI+NNNNNNNNNNNNNNNNNNNNNND C,A ;ECHO CHAR CALL COC POP AF ; AND A,5FH ;INSURE UPPER CASE ; ; IF RETRY THEN RETURN TO CALLER ; CP A,'R' ;NNNNNNNNNNNNNNNNNINNNNNNNNNNNNNNNNNNNNNN FETCH FLAGS ; LD C,(HL) ; ; COMPUTE DISK PARAMETER TABLE ADDRESS ; LD HL,(BTDRV) LD H,0 ADD HL,HL ;DISK # * 16 NNNNNNNNNNNNNNNNNInNNNNNNNNNNNNNNNNNNNNNNENSITY THEN NO TRANSLATION ; LD A,(DEFBFR + IDFLGO) AND A,[1 SHL DFDTDB] OR [1 SHL DFHARDB] ; ; ELSE SET TRANSLATION ;7NNNNNNNNNNNNNNNNIPNNNNNNNNNNNNNNNNNNNNNNES ; SEL2: PUSH HL CALL DPBAD ; USE DEFAULT TABLE POP HL LD BC,DPBSZ LDIR JR SEL1 ; ; ; USE 8" FLOPPY DEFAULTNNNNNNNNNNNNNNNNNIpNNNNNNNNNNNNNNNNNNNNN!R # ; ;**************************************************************************** SETSEC: LD (BTSEC),BC RET ;*****fNNNNNNNNNNNNNNNNINNNNNNNNNNNNNNNNNNNNNNTRANSLATION THEN RETURN SECTOR++ ; LD A,D ;IF TABLE ADDR = 0 THEN NO TRANSLATION OR A,E JP Z,NOTRAN ; ; ELSE CALCULATw$NNNNNNNNNNNNNNNNI u!NNNNNNNNNNNNNNNNNNNNN! LD HL,2 LD (IOPB + PBSECO),HL ; ; SET DESCRIPTOR SECTOR TRACK ; LD L,H ;H == 0 FROM LAST OPERATION (HL= 0) LD (IO6NNNNNNNNNNNNNNNNNI&߇NNNNNNNNNNNNNNNNNNNNNNH DRIVER ADDRESS PREFETCHED FROM TABLE JP (HL) ; ; DRIVER RETURNS HERE ; DKOPRET: POP IY ; ; IF NO ERRORS THEN RET]NNNNNNNNNNNNNNNNNNI,0LNNNNNNNNNNNNNNNNNNNNNNIF RETRY THEN RETURN TO CALLER JR Z,DKOPLP ; ; ELSE IF ABORT THEN DO WARM BOOT ; CP A,'A' ;IF ABORT THEN RE-BOOT JP RNNNNNNNNNNNNNNNI&NNNNNNNNNNNNNNNNNNNNNN ADD HL,HL ADD HL,HL ADD HL,HL LD DE,D0DPH ADD HL,DE ; ; IF NOT FIRST SELECT OR LOGON INHIBITED THEN RETURN TABLE PT~9NNNNNNNNNNNNNNNNI _NNNNNNNNNNNNNNNNNNNNNN CALL Z,TR8 ; ; XFER DISK DATA TO DPB ; NOX: CALL DPBAD ;GET ADDR OF DPB LD HL,DEFBFR + IDSPTO LD BC,DPBSZ LDIR NNNNNNNNNNNNNNNNNIcNNNNNNNNNNNNNNNNNNNNNNS ; LGCKFD: CALL TR8 LD HL,SD8PBK JR SEL2 ;**************************************************************************XNNNNNNNNNNNNNNNNNNIANNNNNNNNNNNNNNNNNNNNN!*********************************************************************** ; ; SET TRANSFER ADDR ; ENTRY- BC= ADDRESS ; EXIT - !NNNNNNNNNNNNNNNNINNNNNNNNNNNNNNNNNNNNNN!E NEW SECTOR FROM TABLE ; EX DE,HL ADD HL,BC LD L,(HL) ; LD H,0 RET ; ; ; CONVERT FROM CP/M'S LOGICAL SECTOR {0:yNNNNNNNNNNNNNNNNI!FNNNNNNNNNNNNNNNNNNNNNNPB + PBTRKO),HL ; ; PASS COMMAND TO EXECUTOR ; LD A,DDLOG JR DISKOP2 ;++++++++++++++++++++++++++++++++++++++++++++NNNNNNNNNNNNNNNNI'NNNNNNNNNNNNNNNNNNNNNNURN ZF ; RET Z ;IF NO_ERROR THEN RETURN ; ; PRINT ERROR ; LD HL,DSKEM ;OUTPUT PREFIX CALL EDITOR ; LD DE,IOPB NYNNNNNNNNNNNNNNNNNI-}NNNNNNNNNNNNNNNNNNNNNNZ,0 ; ; ELSE IF IGNORE THEN RETURN NO ERROR ; SUB A,'I' ;IF IGNORE THEN RETURN NO ERROR RET Z ; ; ELSE RETURN ERRO NNNNNNNNNNNNNNNNNINNNNNNNNNNNNNNNNNNNNNNR ; LD A,(LOGRQ) OR A,C CPL AND A,1 RET Z ; ; ELSE LOG ON DRIVE ; LD (DTPTR),HL ;SAVE DRIVE TABLE PTR ; ; NNNNNNNNNNNNNNNNI NNNNNNNNNNNNNNNNNNNNNN ; ; XFER DISK PHYSICAL DATA TO TABLE ; LD HL,DEFBFR + IDFLGO ; SEL1: PUSH HL LD HL,(DVRTPTR) LD DE,DVRFLG ADD HL,NNNNNNNNNNNNNNNNIpNNNNNNNNNNNNNNNNNNNNNN** ; ; HOME DRIVE - TREAT AS SEEK TRK 0 ; EXIT - BC= 0 ; ;***************************************************************NNNNNNNNNNNNNNNNNNINNNNNNNNNNNNNNNNNNNNNNA= 0 ; ;**************************************************************************** SETDMA: LD (BTDMA),BC XOR A,A LD (BT!NNNNNNNNNNNNNNNNNI5NNNNNNNNNNNNNNNNNNNNNN..N-1} TO PHYSICAL SECTOR {1..N} ; NOTRAN: LD HL,1 ADD HL,BC RET SUBTTL DISK SUPPORT ROUTINES ;+++++++++++++++++m*NNNNNNNNNNNNNNNNI"CNNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++ ; ; COMMON DISK I/O CODE ; EXIT - A= 0: OK; /0: ERROR ; ;+++++++++++++++++++++++++++++++NNNNNNNNNNNNNNNNNI(NNNNNNNNNNNNNNNNNNNNNN LD B,IOPBSZ DSKER1: LD A,(DE) ;FETCH ERROR BYTE PUSH DE ;SAVE REGS PUSH BC CALL PRHEX ;OUTPUT ERROR CODE ; LD C,+NNNNNNNNNNNNNNNNI.V.NNNNNNNNNNNNNNNNNNNNN!R TO BDOS ; FDSKER: LD HL,0 ;RETURN DPB_PTR = 0 FOR SELECT FUNCTION LD A,-1 ;RETURN -1 TO BDOS OR A,A RET ;******XNNNNNNNNNNNNNNNNNI2NNNNNNNNNNNNNNNNNNNNNNATTEMPT TO READ ID SECTOR ; XOR A,A ;INIT FLAG BYTE UNTIL FIRMWARE REVISED LD (IOPB + PBST2O),A ; CALL DISKLOG JP NZ,{NNNNNNNNNNNNNNNNI =NNNNNNNNNNNNNNNNNNNNNNDE EX DE,HL POP HL LD BC,DVRSIZ - DVRFLG LDIR ; ; RETURN DRIVE TABLE PTR ; LD HL,(DTPTR) XOR A,A RET ; ; ;NNNNNNNNNNNNNNNNNICNNNNNNNNNNNNNNNNNNNNN!************* HOME: LD BC,0 ;**************************************************************************** ; ; SET TRACK ;NNNNNNNNNNNNNNNNI#NNNNNNNNNNNNNNNNNNNNNNDMAX),A RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; SECTOR TRANSLATION FUNCTI*NNNNNNNNNNNNNNNNNINNNNNNNNNNNNNNNNNNNNN!+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; LOGON DISK FUNCTION ; EXIT - A= 0: OK; /0: ERROR ; ;+++++++DNNNNNNNNNNNNNNNNI# rNNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++++++ DISKOP: ; ; SET UP IOPB ; LD HL,BTTRK LD DE,IOPB + PBTRKO LD BC,PBSTATwNNNNNNNNNNNNNNNNI)ϹNNNNNNNNNNNNNNNNNNNNNN' ' CALL COC ; POP BC ;RESTORE REGS POP DE INC DE ;NEXT ERROR BYTE DJNZ DSKER1 ;IF NOT DONE THEN LOOP ; LD HL,DNNNNNNNNNNNNNNNNNI/eNNNNNNNNNNNNNNNNNNNNNN********************************************************************** ; ; SET 3740 SECTOR TRANSLATION PROCEDURE ; ENTRY- (DT)NNNNNNNNNNNNNNNNNNIaNNNNNNNNNNNNNNNNNNNNNNFDSKER ; ; IF NO ID SECTOR THEN USE DEFAULTS ; LD A,(IOPB + PBST2O) CP A,-2 ;0: NO ID, -1: JADE ID, -2: EXTENDED ID lNNNNNNNNNNNNNNNNI 6NNNNNNNNNNNNNNNNNNNNNN IF NOT HARD DISK THEN GO DO FLOPPY TEST ; LGDEF: LD A,(BTDRV) IF STHD <> 0 CP A,STHD JR C,LGCKFD ENDIF CP A,NNNNNNNNNNNNNNNNNINNNNNNNNNNNNNNNNNNNNNN# ; ENTRY- BC= TRACK # ; ;**************************************************************************** SETTRK: LD (BTTRK),NNNNNNNNNNNNNNNNNINNNNNNNNNNNNNNNNNNNNN!ON ; ENTRY- DE= 0: NO XLATE, ELSE PTR TO XLATE TABLE ; BC= SECTOR # TO XLATE ; EXIT - HL= XLATED SECTOR OR (BC) + 1 ; BC= NNNNNNNNNNNNNNNNNISNNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ DISKLOG: ; ; SET DESCRIPTOR SECTOR XFER ADDRESS TO DEbNNNNNNNNNNNNNNNNNI$NNNNNNNNNNNNNNNNNNNNNNO - PBTRKO LDIR ; DISKOP2: LD (IOPB + PBCMDO),A ; ; FETCH DRIVER VECTOR & EXECUTE DISK DRIVER ; DKOPLP: PUSH IY ;;NNNNNNNNNNNNNNNNI*NNNNNNNNNNNNNNNNNNNNNNSKEB ;OUTPUT ERROR MESSAGE CALL EDITOR ; ; GET USER RESPONSE ; CALL CI ;GET USER RESPONSE ; PUSH AF ;SAVE CHAR LNNNNNNNNNNNNNNNNI0vRNNNNNNNNNNNNNNNNNNNNNNPTR)= MUST BE PTR TO DTP ; EXIT - DE, HL= ? ; ;**************************************************************************** G'NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN8NNNNNNNNсm;օq> ډuCލ{I呲N镸S!Y'ž^,Ǣc0̦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNJNNNNNNNNNNNNNNNNNNNNN!TR8: TR3740: LD DE,SDTRAN ; SETTR: LD HL,(DTPTR) LD (HL),E INC HL LD (HL),D RET ;*******************************CBNNNNNNNNNNNNNNNNJFNNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; HARD DISK DRIVER FUNCTION ; ENTRY- IY= DRIVER=INNNNNNNNNNNNNNNNNNJ wNNNNNNNNNNNNNNNNNNNNNN PRIMITIVE IN ROM ; PUSH IX LD IX,IOPB ;PASS PTR TO IOPB LD HL,DKPENT ;PRIMITIVE ENTRY LD A,(DKPROM) ;FETCH PROM # C oNNNNNNNNNNNNNNNNJ NNNNNNNNNNNNNNNNNNNNNNX21 ; ; DATA TRACKS ; LD C,(IY + DVRDSPT) ; ; COMMON SIDE SELECT CODE ; FD8X2: INC C SUB A,C JP C,SPTOK ; IN(HNNNNNNNNNNNNNNNNJfNNNNNNNNNNNNNNNNNNNNNN; LD A,C CP A,MAXFUNCS LD A,-1 RET NC ; ; ELSE COMPUTE TABLE ENTRY ; PUSH HL ;SAVE POSSIBLE DATA ; LD HL,BFUNNNNNNNNNNNNNNNNNJfNNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN BIOS VERSION # ; EXIT - HL= VERSION # IN BINARY {0.00 NNNNNNNNNNNNNNNNNJ%&8NNNNNNNNNNNNNNNNNNNNNNILLEGAL DRIVE THEN RETURN ERROR ; CP A,NDRVS JR C,RETDV2 ; OR A,A RET ; ; ; ELSE COMPUTE TABLE PTR ; RETDV2: LDdNNNNNNNNNNNNNNNNNJ+7NNNNNNNNNNNNNNNNNNNNNN********************************************************** ; ; OUTPUT HEX DATA TO CONSOLE SUBR ; ENTRY- A= DATA ; EXIT - A, S!NNNNNNNNNNNNNNNNJINNNNNNNNNNNNNNNNNNNNNN********************************************* ; ; SET NO SECTOR TRANSLATION PROCEDURE ; EXIT - HL, DE= ? ; ;***************BNNNNNNNNNNNNNNNNJVNNNNNNNNNNNNNNNNNNNNNN TABLE PTR ; EXIT - A= 0: OK; /0: ERROR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ HDEXdNNNNNNNNNNNNNNNNJ$NNNNNNNNNNNNNNNNNNNNNNALL EXROM ;EXECUTE THE PRIMITIVE POP IX ; ; RETURN THE COMMAND RESULTS STATUS ; LD A,(IOPB + PBSTATO) OR A,A RET KNNNNNNNNNNNNNNNNNJNNNNNNNNNNNNNNNNNNNNNNC A ;MUST START AT 1 LD (IOPB + PBSECO),A ; ; SELECT SIDE 1 ; LD A,80H FD8X1: LD (IOPB + PBSECO + 1),A ; ; EXECUTNNNNNNNNNNNNNNNNJ3NNNNNNNNNNNNNNNNNNNNNNTBL LD A,C ADD A,A ADD A,L LD L,A LD A,0 ADC A,H LD H,A ; ; EXECUTE TABLE ADDRESS ; LD A,(HL) INC HL LD BNNNNNNNNNNNNNNNNJ NNNNNNNNNNNNNNNNNNNNNN,..655.35} ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ RETVERS: LD HL,VERSN XOR A,A NNNNNNNNNNNNNNNNNJ&skNNNNNNNNNNNNNNNNNNNNNN B,C LD DE,DVRSIZ ; RETDVL: ADD HL,DE DJNZ RETDVL ; ; RETURN NO ERROR ; XOR A,A RET ;+++++++++++++++++++++++!NNNNNNNNNNNNNNNNNJ,NNNNNNNNNNNNNNNNNNNNNNC= ? ; ;**************************************************************************** PRHEX: ; ; PROCESS HIGH NIBBLE 1ST HNNNNNNNNNNNNNNNNJxNNNNNNNNNNNNNNNNNNNNNN************************************************************* TRNONE: LD DE,0 JR SETTR ;++++++++++++++++++++++++++++++++\NNNNNNNNNNNNNNNNNJ eNNNNNNNNNNNNNNNNNNNNN!EC: ; ; CONVERT LOGICAL DRIVE TO PHYSICAL DRIVE ; LD A,(IY + DVRPDRV) ;0,1: DRV 0, 2,3: DRV 1 LD (IOPB + PBDRVO),A ; VNNNNNNNNNNNNNNNNNJNNNNNNNNNNNNNNNNNNNNNN SUBTTL JADE FLOPPY DRIVER ROUTINES ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; JADa9NNNNNNNNNNNNNNNNNJ#NNNNNNNNNNNNNNNNNNNNNNE THE IOPB ; JP XPRIM ; ; ; TRACK 0 ; FD8X20: LD C,(IY + DVR0SPT) JP FD8X2 ; ; ; TRACK 1 ; FD8X21: LD C,(IY +dNNNNNNNNNNNNNNNNJNNNNNNNNNNNNNNNNNNNNNN H,(HL) LD L,A ; EX (SP),HL ;PUT CALLER'S DATA IN HL, FUNCTION ADDR ON RET ; STACK, EXECUTE FUNCTION ADDRESS ON STACK !NNNNNNNNNNNNNNNNJ!NNNNNNNNNNNNNNNNNNNNNN;RETURN NO ERROR RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN DRIVER T!NNNNNNNNNNNNNNNNJ'@ZNNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EXECUTE IOPB FUNCTION ; ENTRY- DE= IOPB PTR ; EXIT - A= 0: OK ; ;!NNNNNNNNNNNNNNNNNJ-NNNNNNNNNNNNNNNNNNNNN!; CALL PRDIG ; ; SWAP HIGH & LOW NIBBLES ; PRDIG: RLCA RLCA RLCA RLCA ; ; SAVE DATA FOR RETURN ; PUSH AF ;qgNNNNNNNNNNNNNNNNNJNNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN DRIVE PARAMETER BLOCK ADDR FUNCTION ; EXIT - DE= DPB PTR ; HL= ? ;SHNNNNNNNNNNNNNNNNJ 0NNNNNNNNNNNNNNNNNNNNNN; OFFSET LOGICAL ADDRESS WITH LOGICAL DRIVE ; LD A,(BTDRV) ;IF EVEN THEN ADD 0 ELSE ADD 128 RRCA AND A,80H LD E,A ; NNNNNNNNNNNNNNNNJXNNNNNNNNNNNNNNNNNNNNNNE 8" FLOPPY DISK DRIVER FUNCTION ; ENTRY- IY= DRIVER TABLE PTR ; EXIT - A= 0: OK; /0: ERROR ; ;+++++++++++++++++++++++++++++wNNNNNNNNNNNNNNNNNNJvNNNNNNNNNNNNNNNNNNNNNN DVR1SPT) JP FD8X2 ; ; ; SECTORS OK ; SPTOK: XOR A,A JP FD8X1 SUBTTL BIOS FUNCTION CALLS ;++++++++++++++++++++uBNNNNNNNNNNNNNNNNNJ5NNNNNNNNNNNNNNNNNNNNNN ;############################################################################ ; ; BIOS FUNCTION TABLE ; ;##############=NNNNNNNNNNNNNNNNJ"NNNNNNNNNNNNNNNNNNNNNNABLE PTR FUNCTION ; ENTRY- C= DRIVE # (E FOR FUNCTION CALL) ; EXIT - HL= DRIVER TABLE BASE PTR ; A, C= 0 ; ;++++++++++++++ XBNNNNNNNNNNNNNNNNJ(PdNNNNNNNNNNNNNNNNNNNNNN;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ EXIOPB: ; ; SAVE REG ; PUSH IX ; ; SETjNNNNNNNNNNNNNNNNNNJ.NNNNNNNNNNNNNNNNNNNNNN ; CONVERT TO ASCII USING DAA TRICK ; AND A,0FH ADD A,90H DAA ADC A,40H DAA ; ; OUTPUT CHAR TO CONSOLE ; LD9NNNNNNNNNNNNNNNNNJ NNNNNNNNNNNNNNNNNNNNNN ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ DPBAD: LD HL,(DTPTR) ;FETCH BASE ADDR LD DE,1moNNNNNNNNNNNNNNNNNJ NNNNNNNNNNNNNNNNNNNNNNCOMPUTE SECTOR LD D,0 LD HL,(IOPB + PBSECO) ADD HL,DE LD (IOPB + PBSECO),HL ; ; FINISH SETTING UP THE IOPB ; XPRIMOdNNNNNNNNNNNNNNNNNJiNNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++++++++ FD8EXEC: ; ; CONVERT LOGICAL DRIVE TO PHYSICAL DRIVE ; LD A,(IY + DVRPDRxNNNNNNNNNNNNNNNNJENNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; FUNCTION DISPATCHER ; EXIT - A= -1: ERROR, 0: OK ; ;++++++++++|NNNNNNNNNNNNNNNNNJNNNNNNNNNNNNNNNNNNNNNN############################################################## BFUNTBL: DW RETVERS ;0:RETURN VERSION # DW RETDVRTF ;1:RETU@yNNNNNNNNNNNNNNNNJ#NNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; BIOS CALL ENTRY (E= DRIVE #) ; RETDVRTF: LD C,E ; RNNNNNNNNNNNNNNNNNNJ)cUNNNNNNNNNNNNNNNNNNNNNN UP FOR CALL ; PUSH DE POP IX LD HL,DKPENT LD A,(DKPROM) CALL EXROM ; ; FETCH & RETURN RESULT STATUS ; LD A,(IjNNNNNNNNNNNNNNNNNNJ/NNNNNNNNNNNNNNNNNNNNNN C,A CALL COC ; ; RETURN DATA ; POP AF RET IF INTCPTS SUBTTL ADDITIONAL FUNCTIONS TO SUPPORT CDOS PROGRAMS l!NNNNNNNNNNNNNNNNNJuNNNNNNNNNNNNNNNNNNNNNN0 ;ADD OFFSET OF DPB PTR ADD HL,DE LD E,(HL) ;FETCH DPB PTR INC HL LD D,(HL) RET SUBTTL HARD DISK ROUTINES ;+ܙNNNNNNNNNNNNNNNNJ FNNNNNNNNNNNNNNNNNNNNNN: XOR A,A LD (IOPB + PBFLGO),A ;NO FLAGS FOR NOW ; LD HL,SECSZ ;SET XFER COUNT LD (IOPB + PBST4O),HL ; ; EXECUTE THENNNNNNNNNNNNNNNNJ:NNNNNNNNNNNNNNNNNNNNNNV) LD (IOPB + PBDRVO),A ; ; SELECT SIDE ; LD A,(IOPB + PBTRKO) CP A,1 LD A,(IOPB + PBSECO) JR C,FD8X20 JR Z,FD8j NNNNNNNNNNNNNNNNNJUNNNNNNNNNNNNNNNNNNNNN!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ BIOFUNC: ; ; IF FUNCTION # NOT IN TABLE THEN RETURN -1 oDNNNNNNNNNNNNNNNNNJWNNNNNNNNNNNNNNNNNNNNN!RN DISK PHYSICAL CONFIGURATION TABLE PTR DW EXIOPB ;2:EXECUTE THE IOPB MAXFUNCS EQU ($ - BFUNTBL) / 2 ;++++++++++++++++NNNNNNNNNNNNNNNNNJ$ NNNNNNNNNNNNNNNNNNNNNNETDVRT: LD HL,DVR0 ;START AT 1ST TABLE ; ; IF DRIVE == 0 THEN ALREADY THERE ; LD A,C OR A,A RET Z ; ; ELSE IF NNNNNNNNNNNNNNNNNNJ*6NNNNNNNNNNNNNNNNNNNNNNX+PBSTATO) POP IX ;RESTORE REG OR A,A ;TEST RESULT FOR RETURN RET SUBTTL NON-DISK PROCEDURES ;******************gNNNNNNNNNNNNNNNNNJ0ھNNNNNNNNNNNNNNNNNNNNNN;*************************************************************************** ; ; SYSTEM CALL INTERCEPT ROUTINE CHECKS FOR ILLEvNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN@NNN΁j8ԅo< ؉r@ݍyG㑱M蕷R W%ž^,Ǣd2ͦNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNJ*NNNNNNNNNNNNNNNNNNNNNNGAL BDOS CALLS & ; PRINTS MESSAGE IF ILLEGAL. ALSO IMPLEMENTS CDOS CLOCK/CALENDAR ; SYSTEM CALLS FOR ASMB. ; ;************NNNNNNNNNNNNNNNNNJqNNNNNNNNNNNNNNNNNNNNN!JR C,CLKSET ;IF SET FUNCTION THEN SET CLOCK ; JR Z,CLKTIM ;IF TIME THEN GET IT ; CP A,93H JR Z,CLKRDC ;IF READ CLOCK THEQNNNNNNNNNNNNNNNNNNJ GNNNNNNNNNNNNNNNNNNNNN!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ CLKCAL: LD HL,CALENT ;ROM ENTRY POINT ; CLK1: LDNNNNNNNNNNNNNNNNJ;NNNNNNNNNNNNNNNNNNNNNN**************************************************************************** ; ; CLOCK SET FUNCTION 91H ; ENTRY- DE= CLOCK IMqNNNNNNNNNNNNNNNNJQNNNNNNNNNNNNNNNNNNNNNNECTOR JP (HL) ;EXECUTE ROM ; ; ROM PROCEDURE RETURNS HERE ; EXROMR: PUSH AF ;SAVE RETURN VALUE CALL GETMON ;RESELECTNNNNNNNNNNNNNNNNNJVNNNNNNNNNNNNNNNNNNNNN!+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ CNSCK: IF USEMON CALL GETMON JP 0F812H ELSE I-NNNNNNNNNNNNNNNNNJ%NNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ NTOST: IN A,(NTS) CPL ;REVERSE SENSE AND A,1 SHlNNNNNNNNNNNNNNNNNJ+2NNNNNNNNNNNNNNNNNNNNN!*********************************************************************** LO: IF USEMON CALL GETMON JP 0F80FH ELSE ^NNNNNNNNNNNNNNNNJyNNNNNNNNNNNNNNNNNNNNNN*************************************************************** INTCPT: LD A,C ;CHECK CALL VALIDITY CP A,41 ;IF <= 40 THEN NNNNNNNNNNNNNNNNJaNNNNNNNNNNNNNNNNNNNNNNN GET IT ; ; ILLEGAL SYSTEM CALL ; ILLEGC: LD HL,ISCMSG ;OUTPUT WARNING CALL EDITOR XOR A,A ;BC = HL = A = 0 LD L,A NNNNNNNNNNNNNNNNJNNNNNNNNNNNNNNNNNNNNNN BC,CLKBFR ;READ CLOCK JR CLK2 ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN NNNNNNNNNNNNNNNNNNNJ'NNNNNNNNNNNNNNNNNNNNNNAGE BUFR PTR (13 BYTES LONG) ; ;**************************************************************************** CLKSET: LD C,ENNNNNNNNNNNNNNNNJNNNNNNNNNNNNNNNNNNNNNNT MONITOR ROM ; POP AF ;RETURN VALUE RET SUBTTL CHAR I/O ROUTINES ;+++++++++++++++++++++++++++++++++++++++++++++++++NNNNNNNNNNNNNNNNJ NNNNNNNNNNNNNNNNNNNNN!N A,(NTS) ;IF DATA NOT READY THEN RETURN 0 AND A,1 SHL NTRDY TTOST1: RET Z LD A,-1 ;ELSE RETURN -1 RET ENDIF ;NNNNNNNNNNNNNNNNNJ&D[NNNNNNNNNNNNNNNNNNNNN!L NTBSY JR TTOST1 ENDIF ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; READER DRKNNNNNNNNNNNNNNNNNNJ,NNNNNNNNNNNNNNNNNNNNNNCALL LISTST ;IF BUSY THEN WAIT JR Z,LO ; LD A,C ;OUTPUT CHAR SET 7,A OUT (CENTOUT),A ; RES 7,A ;OUTPUT LOW TRUE S NNNNNNNNNNNNNNNNJHNNNNNNNNNNNNNNNNNNNNNNOK ; BDOSV EQU $ + 1 JP C,BDOS + 11H ;THIS ADDR MODIFIED BY WARM BOOT RTN ; ; THE FOLLOWING CONDITIONAL JUMP IS MODIFIED NNNNNNNNNNNNNNNNNJ RNNNNNNNNNNNNNNNNNNNNNN LD H,A LD C,A LD B,A RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; CDOS R /NNNNNNNNNNNNNNNNNJ%NNNNNNNNNNNNNNNNNNNNNN TIME FUNCTION 92H ; EXIT - A= SECONDS ; B= MINITS ; C= HOURS ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++MNNNNNNNNNNNNNNNNNJNNNNNNNNNNNNNNNNNNNNNN ;SET UP PARAMETERS LD B,D LD HL,SETENT CLK2: LD A,CALROM ENDIF ;************************************************LNNNNNNNNNNNNNNNNNJ7NNNNNNNNNNNNNNNNNNNNN!+++++++++++++++++++++++++++ ; ; CONSOLE INPUT ; EXIT - A= CHAR ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++V NNNNNNNNNNNNNNNNNJ!NNNNNNNNNNNNNNNNNNNNNN**************************************************************************** ; ; CONSOLE OUTPUT ; ENTRY- C= CHAR TO OUTPUT ;xNNNNNNNNNNNNNNNNJ'wjNNNNNNNNNNNNNNNNNNNNNNIVER - DUMMY ; EXIT - A= CTRL-Z ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ READER: LD AdNNNNNNNNNNNNNNNNNJ-NNNNNNNNNNNNNNNNNNNNNNTROBE OUT (CENTOUT),A SET 7,A OUT (CENTOUT),A RET ENDIF ;++++++++++++++++++++++++++++++++++++++++++++++++++++++NNNNNNNNNNNNNNNNNJ$NNNNNNNNNNNNNNNNNNNNNNTO AN UNCONDITIONAL JUMP BY ; THE WARM BOOT ROUTINE IF THE CLOCK/CALENDAR BOARD IS NOT PRESENT ; IF NOT MODIFIED, THEN IT ISINNNNNNNNNNNNNNNNJ NNNNNNNNNNNNNNNNNNNNN!ETURN VERSION FUNCTION ; MAKES CLOCK/CALENDAR WORK. ; EXIT - B= 1 ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++JNNNNNNNNNNNNNNNNJhNNNNNNNNNNNNNNNNNNNNN!++++++++++++++++++++ CLKTIM: LD HL,TIMENT JR CLK1 ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++iNNNNNNNNNNNNNNNNNNNJANNNNNNNNNNNNNNNNNNNNNN**************************** ; ; EXECUTE ROM ROUTINE ; ENTRY- HL= ENTRY ADDRESS ; A= ROM # ; EXIT - ? ; ;***************P#NNNNNNNNNNNNNNNNNJNNNNNNNNNNNNNNNNNNNNNN+++++++++++++++++++ CI: IF USEMON CALL GETMON ;SWITCH IN MONITOR ROM JP 0F803H ;USE MONITOR ELSE CALL CNSCK ;IyyNNNNNNNNNNNNNNNJ"NNNNNNNNNNNNNNNNNNNNNN ;**************************************************************************** COC: IF USEMON CALL GETMON JP 0F809H XNNNNNNNNNNNNNNNNNJ(gTNNNNNNNNNNNNNNNNNNNNN!,CTRLZ ;FAKE EOF ;**************************************************************************** ; ; PUNCH DRIVER ; ENTRYGNNNNNNNNNNNNNNNNNJ.NNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++ ; ; RETURN LIST DEVICE STATUS ; EXIT - A= 0: BUSY, FFH:READY ; ;++++++++++++++++++++++++++++++++++++eNNNNNNNNNNNNNNNNNJNNNNNNNNNNNNNNNNNNNNN! ALLWAYS FALSE (NOP). ; INHCLK: JR C,ILLEGC ; ; NOW CHECK FOR EXTENDED CALLS ; CP A,8DH ;IF RETURN VERSION THEN RETURN NNNNNNNNNNNNNNNNJ 4NNNNNNNNNNNNNNNNNNNNNN++++++++++++++++++++++ RETCVER: LD B,1 RET SUBTTL CLOCK ROUTINES ;++++++++++++++++++++++++++++++++++++++++++++++++++++NNNNNNNNNNNNNNNNNK!HNNNNNNNNNNNNNNNNNNNNNNDVR0: IF BOOT = 10H ALLDRV HDEXEC,4,60H,64,1,64,1,64,1 ALLDRV HDEXEC,4,60H,64,1,64,1,64,1 ALLDRV HDEXEC,5,60H,64,1,64,% NNNNNNNNNNNNNNNNK'6NNNNNNNNNNNNNNNNNNNNN! ;SECTORS PER TRACK DB 3 ;BLOCK SHIFT FACTOR DB 7 ;BLOCK MASK DB 0 ;NULL MASK DW 242 ;DISK SIZE -1 DW 63 ;DIRECTHNNNNNNNNNNNNNNNNNK-%NNNNNNNNNNNNNNNNNNNNN!DB 0FFH ;ALLOCATION 0 (AL0) DB 10000000B ;ALLOCATION 1 (AL1) DW 0 ;CHECK SIZE (CKS) DW 2 ;TRACK OFFSET (OFF) ;4hNNNNNNNNNNNNNNNNNKe[NNNNNNNNNNNNNNNNNNNNNNTOR) ; EXIT - REGS= ? ; ;**************************************************************************** EDITOR: LD C,(HL) ;MENNNNNNNNNNNNNNNNK FTNNNNNNNNNNNNNNNNNNNNNNG ;QUERY USER CALL EDITOR ; ; GET & ECHO USER INPUT ; CALL CI ; PUSH AF LD C,A CALL COC POP AF ; ; IF OPTI\NNNNNNNNNNNNNNNNKNNNNNNNNNNNNNNNNNNNNNN------------------------------------------------------ ; ; UNSUPPORTED INTERRUPT ; ;----------------------------------------CNNNNNNNNNNNNNNNNNNNKJNNNNNNNNNNNNNNNNNNNNN!###################################################################### IOPB: REPT 16 ;;HARD DISK IOPB LIST OFF DB 0 LISTNNNNNNNNNNNNNNNNNKNNNNNNNNNNNNNNNNNNNNNN 0 ENDM ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; MACRO TO DEFINE THE DRIVER TABLNNNNNNNNNNNNNNNNK"NNNNNNNNNNNNNNNNNNNNNN1,64,1 ALLDRV HDEXEC,5,60H,64,1,64,1,64,1 ALLDRV FD8EXEC,0,0,26,0,26,0,26,0 ALLDRV FD8EXEC,1,0,26,0,26,0,26,0 ENDIF tQINNNNNNNNNNNNNNNNNK(&NNNNNNNNNNNNNNNNNNNNNNORY MAX DB 11000000B ;ALLOC 0 DB 0 ;ALLOC 1 DW 16 ;CHECK SIZE DW 2 ;TRACK OFFSET ; ; DEFAULT DISK PHYSICAL PARAME)bNNNNNNNNNNNNNNNNNK.vNNNNNNNNNNNNNNNNNNNNN! ; ; DB 01100000B ;FLAGS 256 BPS, HARD, SSSD DB 64,1,64,1,64,1 ;64 SPT, 256 BPS ;####################################HNNNNNNNNNNNNNNNNNKVjNNNNNNNNNNNNNNNNNNNNN!SSAGE EDIT LOOP PUSH HL ;SAVE PTR RES 7,C ;CLEAR BIT 7 FOR OUTPUT CALL COC ; POP HL BIT 7,(HL) ;IF BIT 7 SET THEN NNNNNNNNNNNNNNNNK ueNNNNNNNNNNNNNNNNNNNNNNON IS CTRL-C THEN WARM BOOT ; CP A,3 ;IF CTRL-C THEN WARM BOOT JP Z,PAGE0 ; ; IF OPTION IS YES THEN WARM BOOT ; ANDVNNNNNNNNNNNNNNNNNKNNNNNNNNNNNNNNNNNNNNNN------------------------------------ ILLINT: PUSH AF ;SAVE ALL 8080 REGS PUSH HL PUSH BC LD HL,ILLIM ;NOTIFY USER OF IArNNNNNNNNNNNNNNNNK3{NNNNNNNNNNNNNNNNNNNNNN ON ENDM ;############################################################################ ; ; DISK DRIVER TABLES ; ;####\'NNNNNNNNNNNNNNNNNNKܰNNNNNNNNNNNNNNNNNNNNNNE RECORD ; ENTRY- #DADD= DRIVER ADDRESS ; #PD= PHYSICAL DRIVE # ; #FG= DRIVE FLAGS (IDFLGO) ; #S0= TRK 0 SPT ; #Z0= TRK}BNNNNNNNNNNNNNNNNK#*NNNNNNNNNNNNNNNNNNNNNN IF BOOT = 3 ALLDRV FD8EXEC,0,0,26,0,26,0,26,0 ALLDRV FD8EXEC,1,0,26,0,26,0,26,0 ALLDRV HDEXEC,4,60H,64,1,64,1,64,1 ALL# NNNNNNNNNNNNNNNNK)NNNNNNNNNNNNNNNNNNNNNNTERS ; DB 0 ;FLAGS DB 26,0,26,0,26,0 ;SECTORS PER TRACK, SECTOR SIZE (128) ;#########################################ޅNNNNNNNNNNNNNNNNK/GNNNNNNNNNNNNNNNNNNNNNN######################################## ; ; MODE 2 INTERRUPT VECTOR TABLE ; ;##############################################INNNNNNNNNNNNNNNNNNK9NNNNNNNNNNNNNNNNNNNNNNRETURN RET NZ ; INC HL ;ELSE PRINT NEXT CHAR JR EDITOR IF INTRPTS SUBTTL INTERRUPTS ;---------------------------LBNNNNNNNNNNNNNNNNK NNNNNNNNNNNNNNNNNNNNNN A,5FH ;IGNORE CASE ; CP A,'Y' JP Z,PAGE0 ; ; IF OPTION IS INTERRUPT THEN EXECUTE RESTART 7 ; CP A,'I' JR NZ,ITRABNNNNNNNNNNNNNNNNK̎NNNNNNNNNNNNNNNNNNNNNNNT JR IQCONT SUBTTL INITIALIZED DATA ;############################################################################ ; NNNNNNNNNNNNNNNNNNK#ENNNNNNNNNNNNNNNNNNNNN!######################################################################## STRUCT 0 DVRADD DS 2 ;START ADDRESS OF DISK DRIVER PHHNNNNNNNNNNNNNNNNNKNNNNNNNNNNNNNNNNNNNNN! 0 SIZE ; #S1= TRK 1 SPT ; #Z1= TRK 1 SIZE ; #SD= DATA TRKS SPT ; #ZD= DATA TRKS SIZE ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@~NNNNNNNNNNNNNNNNNK$cNNNNNNNNNNNNNNNNNNNNNNDRV HDEXEC,4,60H,64,1,64,1,64,1 ALLDRV HDEXEC,5,60H,64,1,64,1,64,1 ALLDRV HDEXEC,5,60H,64,1,64,1,64,1 ENDIF LIST ON bNNNNNNNNNNNNNNNNNK*@NNNNNNNNNNNNNNNNNNNNNN################################### ; ; DEFAULT 8" HARD DISK PARAMETER BLOCK ; ;############################################NNNNNNNNNNNNNNNNNK0 NNNNNNNNNNNNNNNNNNNNNN############################## ; ; START ON AN EVEN PAGE BOUNDARY ; IF $ AND 0FFH DS 100H - ($ AND 0FFH) ENDIF INTABڔyNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNpNNŃh6҅m; ׉q?܍xG䑱M蕶Q왺U"𝾞Y'¢^,ȦnNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNKNNNNNNNNNNNNNNNNNNNNNNL: REPT 7 ;1ST 7 ARE UNSUPPORTED LIST OFF DW ILLINT LIST ON ENDM ; DW ITRAP ;INT 8 IS USER INTERRUPT ENDIF NNNNNNNNNNNNNNNNK8NNNNNNNNNNNNNNNNNNNNN!ARAMETER HEADER AREA ; 1 PER DRIVE ; ;############################################################################ ; ;@@@@@NNNNNNNNNNNNNNNNNNNK NNNNNNNNNNNNNNNNNNNNNNION BIT MAP PTR LIST OFF ENDM ; ; DEFINE THE DATA ; DD DL 1 REPT NDRVS LIST OFF ALLDPH 0123456789ABCDEF DD DL D NNNNNNNNNNNNNNNNKȏNNNNNNNNNNNNNNNNNNNNNN###################################### DTPTR: DS 2 ;DRIVE TABLE PTR LOGRQ: DS 1 ;LOG ON REQUEST REG. DVRTPTR DS 2 ;DRIVE DRIVk NNNNNNNNNNNNNNNNK'DNNNNNNNNNNNNNNNNNNNNNN1) >= STHD) AND ((DD - 1) <= NDHD) D#D(DD)ALL: DS 127 ;ALLOCATION BIT MAP FOR 8" HARD DRIVE #D(DD) ENDIF IF ((DD - 1) >NNNNNNNNNNNNNNNNNKNNNNNNNNNNNNNNNNNNNNNN2K= 4, 4K= 5, 8K= 6, 16K= 7 DPBBLM DS 1 ;BLM- BLOCK MASK ; 1K = 7, 2K= 15, 4K= 31, 8K= 63, 16K= 127 DPBEXM DS 1 ;EXM- EXTE[NNNNNNNNNNNNNNNNNK%gNNNNNNNNNNNNNNNNNNNNNN@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ALLDPB: MACRO #D LIST ON D#D(DD)DPB: DS DPBSZ ;ALLOCATION FOR DRIVE NNNNNNNNNNNNNNNNK+DNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNKNNNNNNNNNNNNNNNNNNNNN! ;############################################################################ ; ; MESSAGES ; ;########################## NNNNNNNNNNNNNNNNNKNNNNNNNNNNNNNNNNNNNNNN@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; GENERATE A DISK PARAMETER TABLE MACRO ; ;@@@@@@@aNNNNNNNNNNNNNNNNNKNNNNNNNNNNNNNNNNNNNNNND + 1 LIST ON ENDM ; ; LAST OF INITIALIZED CODE READ FROM DISK ; BIOSND EQU $ SUBTTL UNINITIALIZED DATA AREA ;#NNNNNNNNNNNNNNNNNKQNNNNNNNNNNNNNNNNNNNNNNER TABLE BASE ADDRESS PTR DVRXADR DS 2 ;DRIVE DRIVER EXECUTION ADDRESS ROMSAV DS 1 ;ROM SWAP SAVE OF ORIGINAL ROM IF INTCPNNNNNNNNNNNNNNNNKrNNNNNNNNNNNNNNNNNNNNNN= ST8FD) AND ((DD - 1) <= ND8FD) D#D(DD)ALL: DS 57 ;ALLOCATION BIT MAP FOR 8" DRIVE #D(DD) D#D(DD)CHK DS 32 ;DIRECTORY CHECNNNNNNNNNNNNNNNNK INNNNNNNNNNNNNNNNNNNNNNNT MASK ; DSM < 256 : 1K= 0, 2K= 1, 4K= 3, 8K= 7, 16K= 15 ; DSM > 255 : 2K= 0, 4K= 1, 8K= 3, 16K= 7 DPBDSM DS 2 ;DSM- DNNNNNNNNNNNNNNNNNK&2NNNNNNNNNNNNNNNNNNNNNN#D(DD) LIST OFF ENDM ; ; RESERVE THE DATA SPACE ; DD DL 1 REPT NDRVS LIST OFF ALLDPB 0123456789ABCDEF DD DL DD uNNNNNNNNNNNNNNNNNNK,$NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNKNNNNNNNNNNNNNNNNNNNNNN################################################## MSGLE: DM CR,LF,'LOAD ERROR' ; DSKEM: DB CR,LF,'Disk Error Status:' DM CNNNNNNNNNNNNNNNNK $7NNNNNNNNNNNNNNNNNNNNNN@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ALLDPH: MACRO #D LIST ON D#D(DD)DPH: ;DRIVE PARAMETENNNNNNNNNNNNNNNNNKNNNNNNNNNNNNNNNNNNNNNN########################################################################### ; ; THE FOLLOWING DATA MUST RESIDE IN THIS ORDERۤNNNNNNNNNNNNNNNNNNNKb)NNNNNNNNNNNNNNNNNNNNNNTS ; ; CLOCK BUFFER ; CLKBFR DS 13 ENDIF ;####################################################################### NNNNNNNNNNNNNNNNNKA&NNNNNNNNNNNNNNNNNNNNNNKSUMS STORAGE (1 BYTE PER SECTOR) ENDIF LIST OFF ENDM ; ; RESERVE THE DATA SPACE ; DD DL 1 REPT NDRVS LIST OFF NNNNNNNNNNNNNNNNNK!xNNNNNNNNNNNNNNNNNNNNN!RIVE STORAGE SIZE (IN CLUSTERS) ; INT(((#_TRACKS - OFF) * SPT * BYTES PER SECTOR) / CLUSTER SIZE) -1 DPBDRM DS 2 ;DRM- DIRECNNNNNNNNNNNNNNNNK'NNNNNNNNNNNNNNNNNNNNNN+ 1 LIST ON ENDM IF (($ - 8000H) > 07800H) OR ($ < 8000H) CONMSG **** BIOS TOO BIG, USE MOVCPM & RE-ADJUST! **** UNNNNNNNNNNNNNNNNNK-NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNKRkNNNNNNNNNNNNNNNNNNNNNNR,LF,'CM DR TL TH SL SH FG AL AH AX ST S1 S2 S3 S4 S5',CR,LF DSKEB: DM CR,LF,'Abort, Ignore, Retry, (BDOS) - ' ; IF INTCPT NNNNNNNNNNNNNNNNK qdNNNNNNNNNNNNNNNNNNNNNNR HEADER FOR DRIVE #D(DD) DW 0 ;;SECTOR TRAN TBL (OR 0 IF NO XLATE) DW 0 ;;SCRATCH AREA DW 0 ;;" DW 0 ;;" DW DIRBF|NNNNNNNNNNNNNNNNKNNNNNNNNNNNNNNNNNNNNNN ; ;############################################################################ BTDRV: DS 1 ;DRIVE # BTTRK DS 2 ;TRACK # BZNNNNNNNNNNNNNNNNNK7zNNNNNNNNNNNNNNNNNNNNN!##### ; ; DRIVE ALLOCATION AREAS ; ;############################################################################ ;@@@@@NNNNNNNNNNNNNNNNNKرNNNNNNNNNNNNNNNNNNNNN! ALLDAL 0123456789ABCDEF DD DL DD + 1 LIST ON ENDM ;################################################################*NNNNNNNNNNNNNNNNK"+NNNNNNNNNNNNNNNNNNNNNNTORY SIZE -1 DPBAL0 DS 2 ;AL0,1- DIRECTORY ALLOCATION ; 1 MSB PER DIRECTORY CLUSTER ALLOCATED DPBCKS DS 2 ;CKS- # DIRECTORrmNNNNNNNNNNNNNNNNNK(NNNNNNNNNNNNNNNNNNNNNN ENDIF END bNNNNNNNNNNNNNNNNK.FNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNKaZNNNNNNNNNNNNNNNNNNNNNNS ISCMSG: DM CR,LF,'ILL SYS CALL',CR,LF ENDIF IF INTRPTS ITMSG DM CR,LF,'User' ILLIM DM CR,LF,'Ill.' IQMSG DM ' Int.= STHD) DW 0 ;;NO,NNNNNNNNNNNNNNNNNKNNNNNNNNNNNNNNNNNNNNNNTSEC DS 2 ;SECTOR # BTFLG DS 1 ;RESERVED FOR FLAGS BTDMA DS 2 ;DMA ADDRESS BTDMAX DS 1 ;DMA EXTENDED ADDRESS ;##########WNNNNNNNNNNNNNNNNKKNNNNNNNNNNNNNNNNNNNNNN@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; MACRO TO DEFINE THE DRIVE ALLOCATION & CHECKSUMS AٶNNNNNNNNNNNNNNNNNKNNNNNNNNNNNNNNNNNNNNNN############ ; ; RESERVE DRIVE PARAMETER BLOCKS ; ;#######################################################################rNNNNNNNNNNNNNNNNK#NNNNNNNNNNNNNNNNNNNNN!Y SECTORS CHECKED ; (DRM +1) / 4 DPBOFF DS 2 ;OFF- # RESERVED TRACKS (USUALLY 2) DPBSZ DS 0 ENDM ; ; ;@@@@@@@@@@@@@@@myNNNNNNNNNNNNNNNNK)"NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNK/wNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNK4 NNNNNNNNNNNNNNNNNNNNNN Abort? (Y/N/I/M) - ' ENDIF ;############################################################################ ; ; DRIVE PINNNNNNNNNNNNNNNNK NNNNNNNNNNNNNNNNNNNNNN CHECKS ON HARD DISK ELSE DW D#D(DD)CHK ;;DRIVE DISK CHECKSUMS ARRAY PTR ENDIF DW D#D(DD)ALL ;;DRIVE CLUSTER ALLOCATzNNNNNNNNNNNNNNNNKNNNNNNNNNNNNNNNNNNNNNN################################################################## ; ; VARIABLES ; ;######################################fNNNNNNNNNNNNNNNNNKuNNNNNNNNNNNNNNNNNNNNN!REA ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ALLDAL: MACRO #D LIST ON IF ((DD - >NNNNNNNNNNNNNNNNNKNNNNNNNNNNNNNNNNNNNNNN##### STRUCT 0 DPBSPT DS 2 ;SPT- SECTORS/TRACK DPBBSH DS 1 ;BSH- BLOCK SHIFT FACTOR DETERMINED BY CLUSTER SIZE ; 1K= 3, NNNNNNNNNNNNNNNNNK$TNNNNNNNNNNNNNNNNNNNNNN@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; GENERATE THE DPB FOR DRIVE MACRO ; ;@@@@@@@@@@@@@@@@@@@@@@NNNNNNNNNNNNNNNNK*wNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNK0:NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN8NNNNNNNNсm; ׅsA݉yG㍱M鑷S!Y'Ú_-ɞe3Ϣk9զNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNL˃NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNLa%NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNL NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNLNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNLAYNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNLNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNL%NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNL+"NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNLNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNLqNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNL۽NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNL7NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNL NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNL TNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNL&TNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNL,9NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNLNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNL B*NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNLNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNL4NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNL';NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNL!eNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNL'gNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNL-NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNL4vNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNL yNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNLNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNLQgNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNLNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNL"6NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNL(wNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNL.[NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNLGNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNL $HNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNLNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNLbVNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNLNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNL#NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNL)DNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNL/jNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNLRNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNL NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNLNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNLrhNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNLNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNL$2NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNL*NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNL0'NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN8NNŃh6҅n< ؉tBލzH䑲NꕸT"𙾚Z(Ğ`.ʢf4ЦNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNLNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNLVNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNL NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNLNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNLviNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNLNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNL%6NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNL+NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNLNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNLF+NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNLNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNL5NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNL#:NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNL dNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNL&cNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNL, NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNLNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNL uNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNL߼NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNL3NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNL NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNL!UNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNL'PNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNL-8NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNLFNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNL INNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNLNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNLfWNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNLNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNL"NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNL(@NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNL.kNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNL0wNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNL xNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNLNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNLUfNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNLNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNL#7NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNL)sNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNL/ZNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNLe$NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNL NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNLNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNLEXNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNLNNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNL$NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNL*&NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNL0NNNNNNNNNNNNNNNNNNNNNNbNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN