Changeset 242 in xtideuniversalbios for trunk/XTIDE_Universal_BIOS/Src
- Timestamp:
- Feb 10, 2012, 3:12:40 AM (13 years ago)
- google:author:
- krille_n_@hotmail.com
- Location:
- trunk/XTIDE_Universal_BIOS/Src
- Files:
-
- 8 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/XTIDE_Universal_BIOS/Src/Device/IDE/IdeDPT.asm
r160 r242 14 14 ; Nothing 15 15 ; Corrupts registers: 16 ; AX , BX, CX, DX16 ; AX 17 17 ;-------------------------------------------------------------------- 18 18 IdeDPT_Finalize: … … 28 28 ; Nothing 29 29 ; Corrupts registers: 30 ; Nothing30 ; AX 31 31 ;-------------------------------------------------------------------- 32 32 .StoreBlockMode: -
trunk/XTIDE_Universal_BIOS/Src/Device/IDE/IdeTransfer.asm
r238 r242 35 35 ALIGN JUMP_ALIGN 36 36 IdeTransfer_StartWithCommandInAL: 37 mov ah, [bp+IDEPACK.bSectorCount]38 39 37 ; Are we reading or writing? 40 38 test al, 16 ; Bit 4 is cleared on all the read commands but set on 3 of the 4 write commands 41 jnz SHORT .PrepareToWriteDataFromESSI 39 mov ah, [bp+IDEPACK.bSectorCount] 40 jnz SHORT WriteToDrive 42 41 cmp al, COMMAND_WRITE_MULTIPLE 43 je SHORT .PrepareToWriteDataFromESSI 44 45 ; Prepare to read data to ESSI 46 mov bx, g_rgfnPioRead 47 call InitializePiovarsInSSBPwithSectorCountInAH 48 xchg si, di 49 jmp SHORT ReadFromDrive 50 51 ALIGN JUMP_ALIGN 52 .PrepareToWriteDataFromESSI: 53 mov bx, g_rgfnPioWrite 54 call InitializePiovarsInSSBPwithSectorCountInAH 55 ; Fall to WriteToDrive 56 57 58 ;-------------------------------------------------------------------- 59 ; WriteToDrive 60 ; Parameters: 42 je SHORT WriteToDrive 43 ; Fall to ReadFromDrive 44 45 ;-------------------------------------------------------------------- 46 ; ReadFromDrive 47 ; Parameters: 48 ; AH: Number of sectors to transfer (1...128) 49 ; ES:SI: Normalized ptr to buffer to receive data 61 50 ; DS:DI: Ptr to DPT (in RAMVARS segment) 62 ; ES:SI: Normalized ptr to buffer containing data63 51 ; SS:BP: Ptr to PIOVARS 64 52 ; Returns: 53 ; DS:DI: Ptr to DPT (in RAMVARS segment) 65 54 ; AH: BIOS Error code 66 55 ; CX: Number of successfully transferred sectors … … 70 59 ; AL, BX, DX, SI, ES 71 60 ;-------------------------------------------------------------------- 61 ReadFromDrive: 62 ; Prepare to read data to ESSI 63 mov bx, g_rgfnPioRead 64 call InitializePiovarsInSSBPwithSectorCountInAH 65 66 ; Wait until drive is ready to transfer 67 call IdeWait_IRQorDRQ ; Wait until ready to transfer 68 jc SHORT ReturnWithTransferErrorInAH 69 xchg si, di ; ES:DI now points buffer 70 71 mov cx, [bp+PIOVARS.wWordsInBlock] 72 73 ALIGN JUMP_ALIGN 74 .ReadNextBlockFromDrive: 75 mov dx, [bp+PIOVARS.wDataPort] 76 cmp [bp+PIOVARS.wWordsLeft], cx 77 jbe SHORT .ReadLastBlockFromDrive 78 call [bp+PIOVARS.fnXfer] 79 80 ; Wait until ready for next block and check for errors 81 xchg di, si ; DS:DI now points DPT 82 call IdeWait_IRQorDRQ ; Wait until ready to transfer 83 jc SHORT ReturnWithTransferErrorInAH 84 xchg si, di ; ES:DI now points buffer 85 86 ; Increment number of successfully read WORDs 87 mov cx, [bp+PIOVARS.wWordsInBlock] 88 sub [bp+PIOVARS.wWordsLeft], cx 89 add [bp+PIOVARS.wWordsDone], cx 90 jmp SHORT .ReadNextBlockFromDrive 91 92 ALIGN JUMP_ALIGN 93 .ReadLastBlockFromDrive: 94 mov cx, [bp+PIOVARS.wWordsLeft] 95 call [bp+PIOVARS.fnXfer] ; Transfer possibly partial block 96 97 ; Check for errors in last block 98 mov di, si ; DS:DI now points DPT 99 CheckErrorsAfterTransferringLastBlock: 100 mov bx, TIMEOUT_AND_STATUS_TO_WAIT(TIMEOUT_DRQ, FLG_STATUS_DRDY) 101 call IdeWait_PollStatusFlagInBLwithTimeoutInBH 102 103 ; Return number of successfully read sectors 104 ReturnWithTransferErrorInAH: 105 mov cx, [bp+PIOVARS.wWordsDone] 106 jc SHORT .ConvertTransferredWordsInCXtoSectors 107 add cx, [bp+PIOVARS.wWordsLeft] ; Never sets CF 108 .ConvertTransferredWordsInCXtoSectors: 109 xchg cl, ch 110 ret 111 112 113 ;-------------------------------------------------------------------- 114 ; WriteToDrive 115 ; Parameters: 116 ; AH: Number of sectors to transfer (1...128) 117 ; DS:DI: Ptr to DPT (in RAMVARS segment) 118 ; ES:SI: Normalized ptr to buffer containing data 119 ; SS:BP: Ptr to PIOVARS 120 ; Returns: 121 ; AH: BIOS Error code 122 ; CX: Number of successfully transferred sectors 123 ; CF: 0 if transfer succesfull 124 ; 1 if any error 125 ; Corrupts registers: 126 ; AL, BX, DX, SI, ES 127 ;-------------------------------------------------------------------- 128 ALIGN JUMP_ALIGN 72 129 WriteToDrive: 130 ; Prepare to write data from ESSI 131 mov bx, g_rgfnPioWrite 132 call InitializePiovarsInSSBPwithSectorCountInAH 133 73 134 ; Always poll when writing first block (IRQs are generated for following blocks) 74 135 mov bx, TIMEOUT_AND_STATUS_TO_WAIT(TIMEOUT_DRQ, FLG_STATUS_DRQ) … … 76 137 jc SHORT ReturnWithTransferErrorInAH 77 138 139 mov cx, [bp+PIOVARS.wWordsInBlock] 140 78 141 ALIGN JUMP_ALIGN 79 142 .WriteNextBlockToDrive: 80 mov cx, [bp+PIOVARS.wWordsInBlock]81 143 mov dx, [bp+PIOVARS.wDataPort] 82 144 cmp [bp+PIOVARS.wWordsLeft], cx … … 89 151 90 152 ; Increment number of successfully written WORDs 91 mov ax, [bp+PIOVARS.wWordsInBlock]92 sub [bp+PIOVARS.wWordsLeft], ax93 add [bp+PIOVARS.wWordsDone], ax153 mov cx, [bp+PIOVARS.wWordsInBlock] 154 sub [bp+PIOVARS.wWordsLeft], cx 155 add [bp+PIOVARS.wWordsDone], cx 94 156 jmp SHORT .WriteNextBlockToDrive 95 157 … … 107 169 108 170 ;-------------------------------------------------------------------- 109 ; ReadFromDrive110 ; Parameters:111 ; ES:DI: Normalized ptr to buffer to recieve data112 ; DS:SI: Ptr to DPT (in RAMVARS segment)113 ; SS:BP: Ptr to PIOVARS114 ; Returns:115 ; DS:DI: Ptr to DPT (in RAMVARS segment)116 ; AH: BIOS Error code117 ; CX: Number of successfully transferred sectors118 ; CF: 0 if transfer succesfull119 ; 1 if any error120 ; Corrupts registers:121 ; AL, BX, DX, SI, ES122 ;--------------------------------------------------------------------123 ALIGN JUMP_ALIGN124 ReadFromDrive:125 ; Wait until drive is ready to transfer126 xchg di, si ; DS:DI now points DPT127 call IdeWait_IRQorDRQ ; Wait until ready to transfer128 jc SHORT ReturnWithTransferErrorInAH129 xchg si, di ; ES:DI now points buffer130 131 ALIGN JUMP_ALIGN132 .ReadNextBlockFromDrive:133 mov cx, [bp+PIOVARS.wWordsInBlock]134 mov dx, [bp+PIOVARS.wDataPort]135 cmp [bp+PIOVARS.wWordsLeft], cx136 jbe SHORT .ReadLastBlockFromDrive137 call [bp+PIOVARS.fnXfer]138 139 ; Wait until ready for next block and check for errors140 xchg di, si ; DS:DI now points DPT141 call IdeWait_IRQorDRQ ; Wait until ready to transfer142 jc SHORT ReturnWithTransferErrorInAH143 xchg si, di ; ES:DI now points buffer144 145 ; Increment number of successfully read WORDs146 mov ax, [bp+PIOVARS.wWordsInBlock]147 sub [bp+PIOVARS.wWordsLeft], ax148 add [bp+PIOVARS.wWordsDone], ax149 jmp SHORT .ReadNextBlockFromDrive150 151 ALIGN JUMP_ALIGN152 .ReadLastBlockFromDrive:153 mov cx, [bp+PIOVARS.wWordsLeft]154 call [bp+PIOVARS.fnXfer] ; Transfer possibly partial block155 156 ; Check for errors in last block157 mov di, si ; DS:DI now points DPT158 CheckErrorsAfterTransferringLastBlock:159 mov bx, TIMEOUT_AND_STATUS_TO_WAIT(TIMEOUT_DRQ, FLG_STATUS_DRDY)160 call IdeWait_PollStatusFlagInBLwithTimeoutInBH161 162 ; Return number of successfully read sectors163 ReturnWithTransferErrorInAH:164 mov cx, [bp+PIOVARS.wWordsDone]165 jc SHORT .ConvertTransferredWordsInCXtoSectors166 add cx, [bp+PIOVARS.wWordsLeft] ; Never sets CF167 .ConvertTransferredWordsInCXtoSectors:168 xchg cl, ch169 ret170 171 172 ;--------------------------------------------------------------------173 171 ; InitializePiovarsInSSBPwithSectorCountInAH 174 172 ; Parameters: … … 180 178 ; Nothing 181 179 ; Corrupts registers: 182 ; AX, BX, CX,DX180 ; AX, BX, DX 183 181 ;-------------------------------------------------------------------- 184 182 ALIGN JUMP_ALIGN … … 187 185 xor al, al 188 186 mov [bp+PIOVARS.wWordsLeft], ax 187 mov ah, [di+DPT_ATA.bSetBlock] 188 mov [bp+PIOVARS.wWordsInBlock], ax 189 189 cbw 190 190 mov [bp+PIOVARS.wWordsDone], ax ; Zero 191 mov ah, [di+DPT_ATA.bSetBlock]192 mov [bp+PIOVARS.wWordsInBlock], ax193 191 194 192 ; Get transfer function based on bus type 195 193 xchg ax, bx ; Lookup table offset to AX 196 eMOVZX bx, BYTE [di+DPT.bIdevarsOffset]; CS:BX now points to IDEVARS194 mov bl, [di+DPT.bIdevarsOffset] ; CS:BX now points to IDEVARS 197 195 mov dx, [cs:bx+IDEVARS.wPort] ; Load IDE Data port address 198 196 mov bl, [cs:bx+IDEVARS.bDevice] ; Load device type to BX 199 197 add bx, ax 198 mov [bp+PIOVARS.wDataPort], dx 200 199 mov ax, [cs:bx] ; Load offset to transfer function 201 mov [bp+PIOVARS.wDataPort], dx202 200 mov [bp+PIOVARS.fnXfer], ax 203 201 ret … … 213 211 ; CX: Block size in WORDs 214 212 ; DX: IDE Data port address 215 ; ES:DI: Normalized ptr to buffer to rec ieve data213 ; ES:DI: Normalized ptr to buffer to receive data 216 214 ; Returns: 217 215 ; Nothing … … 236 234 SingleByteRead: 237 235 %ifdef USE_186 ; INS instruction available 236 dec cx ; Avoid overflowing CX on a 128 sector transfer 238 237 shl cx, 1 ; WORD count to BYTE count 238 inc cx 239 239 rep insb 240 insb 240 241 %else ; If 8088/8086 241 242 shr cx, 1 ; WORD count to DWORD count … … 328 329 SingleByteWrite: 329 330 %ifdef USE_186 ; OUTS instruction available 331 dec cx ; Avoid overflowing CX on a 128 sector transfer 330 332 shl cx, 1 ; WORD count to BYTE count 333 inc cx 331 334 es ; Source is ES segment 332 335 rep outsb 336 es outsb 333 337 %else ; If 8088/8086 334 338 shr cx, 1 ; WORD count to DWORD count … … 386 390 387 391 388 389 392 ; Lookup tables to get transfer function based on bus type 390 393 ALIGN WORD_ALIGN -
trunk/XTIDE_Universal_BIOS/Src/Device/MemoryMappedIDE/MemIdeTransfer.asm
r238 r242 8 8 .wWordsLeft resb 2 ; 2, WORDs left to transfer 9 9 .wWordsDone resb 2 ; 4, Number of sectors xferred 10 resb 1 ; 6, 10 ; TODO: The above word vars could just as well be byte vars? 11 resb 1 ; 6, 11 12 resb 1 ; 7, IDEPACK.bDeviceControl 12 13 .fpDPT resb 4 ; 8, Far pointer to DPT … … 34 35 ALIGN JUMP_ALIGN 35 36 MemIdeTransfer_StartWithCommandInAL: 37 push cs ; We push CS here (segment of SAW) and later pop it to DS (reads) or ES (writes) 38 36 39 ; Initialize MEMPIOVARS 37 xchg cx, ax ; IDE command to CL 38 xor al, al 39 mov ah, [bp+IDEPACK.bSectorCount] 40 mov [bp+MEMPIOVARS.wWordsLeft], ax 41 cbw 42 mov [bp+MEMPIOVARS.wWordsDone], ax ; Zero 43 mov ah, [di+DPT_ATA.bSetBlock] 44 mov [bp+MEMPIOVARS.wWordsInBlock], ax 40 xor cx, cx 41 mov [bp+MEMPIOVARS.wWordsDone], cx 42 mov ch, [bp+IDEPACK.bSectorCount] 43 mov [bp+MEMPIOVARS.wWordsLeft], cx 44 mov ch, [di+DPT_ATA.bSetBlock] 45 mov [bp+MEMPIOVARS.wWordsInBlock], cx 45 46 mov [bp+MEMPIOVARS.fpDPT], di 46 47 mov [bp+MEMPIOVARS.fpDPT+2], ds 47 48 48 49 ; Are we reading or writing? 49 test cl, 16 ; Bit 4 is cleared on all the read commands but set on 3 of the 4 write commands 50 jnz SHORT .PrepareToWriteDataFromESSI 51 cmp cl, COMMAND_WRITE_MULTIPLE 52 je SHORT .PrepareToWriteDataFromESSI 53 54 ; Prepare to read data to ES:DI 55 mov di, si 56 push cs 57 pop ds 58 mov si, JRIDE_SECTOR_ACCESS_WINDOW_OFFSET 59 jmp SHORT ReadFromSectorAccessWindowInDSSItoESDI 60 61 ALIGN JUMP_ALIGN 62 .PrepareToWriteDataFromESSI: 63 push es 64 pop ds 65 push cs 66 pop es 67 mov di, JRIDE_SECTOR_ACCESS_WINDOW_OFFSET 68 ; Fall to WriteToSectorAccessWindowInESDIfromDSSI 69 70 71 ;-------------------------------------------------------------------- 72 ; WriteToSectorAccessWindowInESDIfromDSSI 73 ; Parameters: 74 ; DS:SI: Normalized ptr to buffer containing data 75 ; ES:DI: Ptr to Sector Access Window 50 test al, 16 ; Bit 4 is cleared on all the read commands but set on 3 of the 4 write commands 51 jnz SHORT WriteToSectorAccessWindow 52 cmp al, COMMAND_WRITE_MULTIPLE 53 je SHORT WriteToSectorAccessWindow 54 ; Fall to ReadFromSectorAccessWindow 55 56 ;-------------------------------------------------------------------- 57 ; ReadFromSectorAccessWindow 58 ; Parameters: 59 ; Stack: Segment part of ptr to Sector Access Window 60 ; ES:SI: Normalized ptr to buffer to receive data 76 61 ; SS:BP: Ptr to MEMPIOVARS 77 62 ; Returns: … … 84 69 ; AL, BX, DX, SI, ES 85 70 ;-------------------------------------------------------------------- 86 WriteToSectorAccessWindowInESDIfromDSSI: 87 ; Always poll when writing first block (IRQs are generated for following blocks) 88 call WaitUntilReadyToTransferNextBlock 89 jc SHORT ReturnWithMemoryIOtransferErrorInAH 90 91 ALIGN JUMP_ALIGN 92 .WriteNextBlockToDrive: 93 mov cx, [bp+PIOVARS.wWordsInBlock] 94 cmp [bp+PIOVARS.wWordsLeft], cx 95 jbe SHORT .WriteLastBlockToDrive 96 eMOVZX dx, ch ; DX = Sectors in block 97 call WriteSingleBlockFromDSSIToSectorAccessWindowInESDI 98 call WaitUntilReadyToTransferNextBlock 99 jc SHORT ReturnWithMemoryIOtransferErrorInAH 100 101 ; Increment number of successfully written WORDs 102 mov ax, [bp+PIOVARS.wWordsInBlock] 103 sub [bp+PIOVARS.wWordsLeft], ax 104 add [bp+PIOVARS.wWordsDone], ax 105 jmp SHORT .WriteNextBlockToDrive 106 107 ALIGN JUMP_ALIGN 108 .WriteLastBlockToDrive: 109 eMOVZX dx, BYTE [bp+PIOVARS.wWordsLeft+1] ; Sectors left 110 %ifdef USE_186 111 push CheckErrorsAfterTransferringLastMemoryMappedBlock 112 jmp WriteSingleBlockFromDSSIToSectorAccessWindowInESDI 113 %else 114 call WriteSingleBlockFromDSSIToSectorAccessWindowInESDI 115 jmp SHORT CheckErrorsAfterTransferringLastMemoryMappedBlock 116 %endif 117 118 119 ;-------------------------------------------------------------------- 120 ; WriteSingleBlockFromDSSIToSectorAccessWindowInESDI 121 ; Parameters: 122 ; DX: Number of sectors in block 123 ; DS:SI: Normalized ptr to source buffer 124 ; ES:DI: Ptr to Sector Access Window 125 ; Returns: 126 ; CX, DX: Zero 127 ; SI: Updated 128 ; Corrupts registers: 129 ; Nothing 130 ;-------------------------------------------------------------------- 131 ALIGN JUMP_ALIGN 132 WriteSingleBlockFromDSSIToSectorAccessWindowInESDI: 133 mov cx, JRIDE_SECTOR_ACCESS_WINDOW_SIZE / 2 134 rep movsw 135 sub di, JRIDE_SECTOR_ACCESS_WINDOW_SIZE ; Reset for next sector 136 dec dx 137 jnz SHORT WriteSingleBlockFromDSSIToSectorAccessWindowInESDI 138 ret 139 140 141 ;-------------------------------------------------------------------- 142 ; ReadFromSectorAccessWindowInDSSItoESDI 143 ; Parameters: 144 ; ES:DI: Normalized ptr to buffer to recieve data 145 ; DS:SI: Ptr to Sector Access Window 146 ; SS:BP: Ptr to MEMPIOVARS 147 ; Returns: 148 ; DS:DI: Ptr to DPT (in RAMVARS segment) 149 ; AH: BIOS Error code 150 ; CX: Number of successfully transferred sectors 151 ; CF: 0 if transfer succesfull 152 ; 1 if any error 153 ; Corrupts registers: 154 ; AL, BX, DX, SI, ES 155 ;-------------------------------------------------------------------- 156 ALIGN JUMP_ALIGN 157 ReadFromSectorAccessWindowInDSSItoESDI: 158 call WaitUntilReadyToTransferNextBlock 159 jc SHORT ReturnWithMemoryIOtransferErrorInAH 71 ReadFromSectorAccessWindow: 72 pop ds ; CS -> DS 73 mov di, si 74 mov si, JRIDE_SECTOR_ACCESS_WINDOW_OFFSET 75 76 call WaitUntilReadyToTransferNextBlock 77 jc SHORT ReturnWithMemoryIOtransferErrorInAH 78 79 mov cx, [bp+PIOVARS.wWordsInBlock] 160 80 161 81 ALIGN JUMP_ALIGN 162 82 .ReadNextBlockFromDrive: 163 mov cx, [bp+PIOVARS.wWordsInBlock]164 83 cmp [bp+PIOVARS.wWordsLeft], cx 165 84 jbe SHORT .ReadLastBlockFromDrive 166 eMOVZX dx, ch ; DX = Sectors in block167 85 call ReadSingleBlockFromSectorAccessWindowInDSSItoESDI 168 86 call WaitUntilReadyToTransferNextBlock … … 170 88 171 89 ; Increment number of successfully read WORDs 172 mov ax, [bp+PIOVARS.wWordsInBlock]173 sub [bp+PIOVARS.wWordsLeft], ax174 add [bp+PIOVARS.wWordsDone], ax90 mov cx, [bp+PIOVARS.wWordsInBlock] 91 sub [bp+PIOVARS.wWordsLeft], cx 92 add [bp+PIOVARS.wWordsDone], cx 175 93 jmp SHORT .ReadNextBlockFromDrive 176 94 177 95 ALIGN JUMP_ALIGN 178 96 .ReadLastBlockFromDrive: 179 eMOVZX dx, BYTE [bp+PIOVARS.wWordsLeft+1]; Sectors left97 mov ch, [bp+PIOVARS.wWordsLeft+1] ; Sectors left 180 98 call ReadSingleBlockFromSectorAccessWindowInDSSItoESDI 181 99 … … 186 104 call IDEDEVICE%+Wait_PollStatusFlagInBLwithTimeoutInBH 187 105 188 ; Return number of successfully read sectors106 ; Return number of successfully transferred sectors 189 107 ReturnWithMemoryIOtransferErrorInAH: 190 108 lds di, [bp+MEMPIOVARS.fpDPT] ; DPT now in DS:DI … … 198 116 199 117 ;-------------------------------------------------------------------- 118 ; WriteToSectorAccessWindow 119 ; Parameters: 120 ; Stack: Segment part of ptr to Sector Access Window 121 ; ES:SI: Normalized ptr to buffer containing data 122 ; SS:BP: Ptr to MEMPIOVARS 123 ; Returns: 124 ; DS:DI: Ptr to DPT (in RAMVARS segment) 125 ; AH: BIOS Error code 126 ; CX: Number of successfully transferred sectors 127 ; CF: 0 if transfer succesfull 128 ; 1 if any error 129 ; Corrupts registers: 130 ; AL, BX, DX, SI, ES 131 ;-------------------------------------------------------------------- 132 ALIGN JUMP_ALIGN 133 WriteToSectorAccessWindow: 134 push es 135 pop ds 136 pop es ; CS -> ES 137 mov di, JRIDE_SECTOR_ACCESS_WINDOW_OFFSET 138 139 ; Always poll when writing first block (IRQs are generated for following blocks) 140 call WaitUntilReadyToTransferNextBlock 141 jc SHORT ReturnWithMemoryIOtransferErrorInAH 142 143 mov cx, [bp+PIOVARS.wWordsInBlock] 144 145 ALIGN JUMP_ALIGN 146 .WriteNextBlockToDrive: 147 cmp [bp+PIOVARS.wWordsLeft], cx 148 jbe SHORT .WriteLastBlockToDrive 149 call WriteSingleBlockFromDSSIToSectorAccessWindowInESDI 150 call WaitUntilReadyToTransferNextBlock 151 jc SHORT ReturnWithMemoryIOtransferErrorInAH 152 153 ; Increment number of successfully written WORDs 154 mov cx, [bp+PIOVARS.wWordsInBlock] 155 sub [bp+PIOVARS.wWordsLeft], cx 156 add [bp+PIOVARS.wWordsDone], cx 157 jmp SHORT .WriteNextBlockToDrive 158 159 ALIGN JUMP_ALIGN 160 .WriteLastBlockToDrive: 161 mov ch, [bp+PIOVARS.wWordsLeft+1] ; Sectors left 162 %ifndef USE_186 163 mov bx, CheckErrorsAfterTransferringLastMemoryMappedBlock 164 push bx 165 %else 166 push CheckErrorsAfterTransferringLastMemoryMappedBlock 167 %endif 168 ; Fall to WriteSingleBlockFromDSSIToSectorAccessWindowInESDI 169 170 ;-------------------------------------------------------------------- 171 ; WriteSingleBlockFromDSSIToSectorAccessWindowInESDI 172 ; Parameters: 173 ; CH: Number of sectors in block 174 ; DS:SI: Normalized ptr to source buffer 175 ; ES:DI: Ptr to Sector Access Window 176 ; Returns: 177 ; CX, DX: Zero 178 ; SI: Updated 179 ; Corrupts registers: 180 ; BX 181 ;-------------------------------------------------------------------- 182 ALIGN JUMP_ALIGN 183 WriteSingleBlockFromDSSIToSectorAccessWindowInESDI: 184 mov bx, di 185 eMOVZX dx, ch 186 xor cl, cl 187 ALIGN JUMP_ALIGN 188 .WriteBlock: 189 mov ch, JRIDE_SECTOR_ACCESS_WINDOW_SIZE >> 9 190 rep movsw 191 mov di, bx ; Reset for next sector 192 dec dx 193 jnz SHORT .WriteBlock 194 ret 195 196 197 ;-------------------------------------------------------------------- 200 198 ; ReadSingleBlockFromSectorAccessWindowInDSSItoESDI 201 199 ; Parameters: 202 ; DX: Number of sectors in block203 ; ES:DI: Normalized ptr to buffer to rec ieve data (destination)200 ; CH: Number of sectors in block 201 ; ES:DI: Normalized ptr to buffer to receive data (destination) 204 202 ; DS:SI: Ptr to Sector Access Window (source) 205 203 ; Returns: … … 207 205 ; DI: Updated 208 206 ; Corrupts registers: 209 ; Nothing207 ; BX 210 208 ;-------------------------------------------------------------------- 211 209 ALIGN JUMP_ALIGN 212 210 ReadSingleBlockFromSectorAccessWindowInDSSItoESDI: 213 mov cx, JRIDE_SECTOR_ACCESS_WINDOW_SIZE / 2 211 mov bx, si 212 eMOVZX dx, ch 213 xor cl, cl 214 ALIGN JUMP_ALIGN 215 .ReadBlock: 216 mov ch, JRIDE_SECTOR_ACCESS_WINDOW_SIZE >> 9 214 217 rep movsw 215 sub si, JRIDE_SECTOR_ACCESS_WINDOW_SIZE; Reset for next sector218 mov si, bx ; Reset for next sector 216 219 dec dx 217 jnz SHORT ReadSingleBlockFromSectorAccessWindowInDSSItoESDI220 jnz SHORT .ReadBlock 218 221 ret 219 222 … … 238 241 pop ds 239 242 ret 243 244 245 %if JRIDE_SECTOR_ACCESS_WINDOW_SIZE <> 512 246 %error "JRIDE_SECTOR_ACCESS_WINDOW_SIZE is no longer equal to 512. MemIdeTransfer.asm needs changes." 247 %endif 248 -
trunk/XTIDE_Universal_BIOS/Src/Device/Serial/SerialCommand.asm
r234 r242 112 112 mov ch,dh 113 113 xor dh,dh 114 eSHL_IM dx, 2 ; shift from one byte to two 115 114 eSHL_IM dx, 2 ; shift from one byte to two 115 116 116 mov al,[bp+IDEPACK.bSectorCount] 117 117 … … 599 599 ; wSerialPortAndBaud Non-Zero: 600 600 ; previous serial drive not found: -> Error - Not Found (4) 601 ; previo suserial drive found: -> Continue with wSerialPackedAndBaud (5)601 ; previous serial drive found: -> Continue with wSerialPackedAndBaud (5) 602 602 ; wSerialPortAndBaud Zero: 603 603 ; previous serial drive not found: -> Error - Not Found (4) … … 608 608 ; And as with the int13h/25h case, we just go off and get the needed information using the user's setting. 609 609 ; (2) We are using the special .ideVarsSerialAuto structure. During drive detection, we would only be here 610 ; if we ha nd't already seen a serial drive (since we only scan if no explicit drives are set),610 ; if we hadn't already seen a serial drive (since we only scan if no explicit drives are set), 611 611 ; so we go off to scan. 612 612 ; (3) We are using the special .ideVarsSerialAuto structure. We won't get here during drive detection, but … … 633 633 pop si 634 634 jnc .notfounddpt 635 mov ax, [ds:di+DPT_SERIAL.wSerialPortAndBaud]636 .notfounddpt: 635 mov ax, [di+DPT_SERIAL.wSerialPortAndBaud] 636 .notfounddpt: 637 637 638 638 test bh, FLG_DRVNHEAD_DRV … … 647 647 jnz .identifyDeviceInDX 648 648 649 or dx,ax ; Since DX is zero, this effectively moves the previously found serial drive 649 or dx,ax ; Since DX is zero, this effectively moves the previously found serial drive 650 650 ; information to dx, as well as test for zero 651 651 jz .scanSerial … … 672 672 pop cx 673 673 pop dx 674 674 675 675 pop bp 676 676 ; 677 ; place port and baud word in to the return sector, in a vendor specific area, 677 ; place port and baud word in to the return sector, in a vendor specific area, 678 678 ; which is read by FinalizeDPT and DetectDrives 679 679 ; … … 732 732 ; Begin baud rate scan on this port... 733 733 ; 734 ; On a scan, we support 6 baud rates, starting here and going higher by a factor of two each step, with a 734 ; On a scan, we support 6 baud rates, starting here and going higher by a factor of two each step, with a 735 735 ; small jump between 9600 and 38800. These 6 were selected since we wanted to support 9600 baud and 115200, 736 ; *on the server side* if the client side had a 4x clock multiplier, a 2x clock multiplier, or no clock multiplier. 736 ; *on the server side* if the client side had a 4x clock multiplier, a 2x clock multiplier, or no clock multiplier. 737 737 ; 738 738 ; Starting with 30h, that means 30h (2400 baud), 18h (4800 baud), 0ch (9600 baud), and … … 747 747 shr dh,1 748 748 jz .nextPort 749 cmp dh,6 ; skip from 6 to 4, to move from the top of the 9600 baud range 749 cmp dh,6 ; skip from 6 to 4, to move from the top of the 9600 baud range 750 750 jnz .testBaud ; to the bottom of the 115200 baud range 751 751 mov dh,4 -
trunk/XTIDE_Universal_BIOS/Src/Device/Serial/SerialDPT.asm
r233 r242 13 13 ; Nothing 14 14 ; Corrupts registers: 15 ; AX , BX, CX, DX15 ; AX 16 16 ;-------------------------------------------------------------------- 17 17 SerialDPT_Finalize: 18 18 or byte [di+DPT.bFlagsHigh], FLGH_DPT_SERIAL_DEVICE 19 19 mov ax, [es:si+ATA6.wVendor] 20 mov word[di+DPT_SERIAL.wSerialPortAndBaud], ax20 mov [di+DPT_SERIAL.wSerialPortAndBaud], ax 21 21 ret 22 22 -
trunk/XTIDE_Universal_BIOS/Src/Initialization/DetectDrives.asm
r233 r242 29 29 30 30 mov cx, g_szDetectSlave 31 mov bh, MASK_DRVNHEAD_SET | FLG_DRVNHEAD_DRV 31 mov bh, MASK_DRVNHEAD_SET | FLG_DRVNHEAD_DRV 32 32 call StartDetectionWithDriveSelectByteInBHandStringInAX 33 33 34 34 pop cx 35 35 36 36 add bp, BYTE IDEVARS_size ; Point to next IDEVARS 37 37 38 %ifdef MODULE_SERIAL 38 %ifdef MODULE_SERIAL 39 39 jcxz .done ; Set to zero on .ideVarsSerialAuto iteration (if any) 40 40 %endif 41 41 42 42 loop .DriveDetectLoop 43 43 44 %ifdef MODULE_SERIAL 44 %ifdef MODULE_SERIAL 45 45 ; 46 46 ; if serial drive detected, do not scan (avoids duplicate drives and isn't needed - we already have a connection) … … 49 49 jc .done 50 50 51 mov bp, ROMVARS.ideVarsSerialAuto ; Point to our special IDEVARS s ructure, just for serial scans52 51 mov bp, ROMVARS.ideVarsSerialAuto ; Point to our special IDEVARS structure, just for serial scans 52 53 53 mov al,[cs:ROMVARS.wFlags] ; Configurator set to always scan? 54 54 or al,[es:BDA.bKBFlgs1] ; Or, did the user hold down the ALT key? 55 55 and al,8 ; 8 = alt key depressed, same as FLG_ROMVARS_SERIAL_ALWAYSDETECT 56 jnz .DriveDetectLoop 56 jnz .DriveDetectLoop 57 57 %endif 58 58 … … 61 61 62 62 %if FLG_ROMVARS_SERIAL_SCANDETECT != 8 63 %error "DetectDrives is currently coded to assume that FLG_ROMVARS_SERIAL_SCANDETECT is the same bit as the ALT key code in the BDA. Changes in the code will be needed if these values are no longer the same."63 %error "DetectDrives is currently coded to assume that FLG_ROMVARS_SERIAL_SCANDETECT is the same bit as the ALT key code in the BDA. Changes in the code will be needed if these values are no longer the same." 64 64 %endif 65 65 66 66 67 67 ;-------------------------------------------------------------------- 68 68 ; StartDetectionWithDriveSelectByteInBHandStringInAX … … 110 110 ;call ReadAtapiInfoFromDrive ; Assume CD-ROM 111 111 ;jnc SHORT _CreateBiosTablesForCDROM 112 112 113 113 ;jmp short DetectDrives_DriveNotFound 114 114 ;;; fall-through instead of previous jmp instruction … … 122 122 ; AX, SI 123 123 ;-------------------------------------------------------------------- 124 DetectDrives_DriveNotFound: 124 DetectDrives_DriveNotFound: 125 125 mov si, g_szNotFound 126 jmp BootMenuPrint_NullTerminatedStringFromCSSIandSetCF 126 jmp BootMenuPrint_NullTerminatedStringFromCSSIandSetCF 127 127 128 128 -
trunk/XTIDE_Universal_BIOS/Src/Initialization/DetectPrint.asm
r235 r242 22 22 ePUSH_T ax, ROMVARS.szTitle ; Bios title string 23 23 push cs ; BIOS segment 24 25 DetectPrint_BootMenuPrint_FormatCSSIfromParamsInSSBP_Relay: 24 25 DetectPrint_BootMenuPrint_FormatCSSIfromParamsInSSBP_Relay: 26 26 jmp BootMenuPrint_FormatCSSIfromParamsInSSBP 27 27 … … 32 32 ; CS:CX: Ptr to "Master" or "Slave" string 33 33 ; CS:BP: Ptr to IDEVARS 34 ; SI: Ptr to template string 34 ; SI: Ptr to template string 35 35 ; Returns: 36 36 ; Nothing … … 44 44 ; DL=COM number character, DH=.bDevice 45 45 46 push bp ; setup stack for call to 46 push bp ; setup stack for call to 47 47 mov bp, sp ; BootMenuPrint_FormatCSSIfromParamsInSSBP 48 48 49 49 push cx ; Push "Master" or "Slave" 50 50 51 51 mov cl, (g_szDetectPort-$$) & 0xff ; Setup print string for standard IDE 52 52 ; Note that we modify only the low order bits of CX a lot here, … … 55 55 ; on the same 256 byte page, which is checked in strings.asm. 56 56 57 cmp dx, DEVICE_SERIAL_PORT << 8 ; Check if this is a serial device, 57 cmp dx, DEVICE_SERIAL_PORT << 8 ; Check if this is a serial device, 58 58 ; And also check if DL is zero, check with the jz below 59 ; This optimization requires that DEVICE_SERIAL_PORT be 59 ; This optimization requires that DEVICE_SERIAL_PORT be 60 60 ; the highest value in the DEVICE_* series, ensuring that 61 61 ; anything less in the high order bits is a different device. 62 62 63 j l.pushAndPrint ; CX = string to print, AX = port address, DX won't be used63 jb .pushAndPrint ; CX = string to print, AX = port address, DX won't be used 64 64 65 65 mov cl, (g_szDetectCOM-$$) & 0xff ; Setup print string for COM ports … … 68 68 69 69 push dx ; Push COM number character 70 ; If the str nig is going to be "Auto", we will push a NULL (zero)71 ; here for the COM port number, which will be eaten by the 72 ; print routine (DisplayPrint_CharacterFromAL), resulting in 70 ; If the string is going to be "Auto", we will push a NULL (zero) 71 ; here for the COM port number, which will be eaten by the 72 ; print routine (DisplayPrint_CharacterFromAL), resulting in 73 73 ; just "COM" being printed without a character after it. 74 74 75 75 mov cl, (g_szDetectCOMAuto-$$) & 0xff ; Setup secondary print string for "Auto" 76 76 77 77 jz .pushAndPrint ; CX = string to print, AX and DX won't be used 78 78 79 79 mov cl, (g_szDetectCOMLarge-$$) & 0xff ; Setup secondary print string for "COMn/xx.yK" 80 80 … … 82 82 cbw ; clear AH, AL will always be less than 128 83 83 xchg si,ax ; move AX to SI for divide 84 mov ax,1152 ; baud rate to displa is 115200/divisor, the "00" is handled84 mov ax,1152 ; baud rate to display is 115200/divisor, the "00" is handled 85 85 ; in the print strings 86 xor dx,dx; clear top 16-bits of dividend86 cwd ; clear top 16-bits of dividend 87 87 div si ; and divide... Now AX = baud rate/100, DX = 0 (always a clean divide) 88 88 89 89 mov si,10 ; Now separate the whole portion from the fractional for "K" display 90 90 div si ; and divide... Now AX = baud rate/1000, DX = low order digit 91 92 cmp ax,si ; < = 10: "2400", "9600", etc.; >10: "19.2K", "38.4K", etc.91 92 cmp ax,si ; < 10: "2400", "9600", etc.; >= 10: "19.2K", "38.4K", etc. 93 93 jae .pushAndPrint 94 94 95 95 mov cl, (g_szDetectCOMSmall-$$) & 0xff ; Setup secondary print string for "COMn/XXy00" 96 97 .pushAndPrint: 96 97 .pushAndPrint: 98 98 push cx ; Push print string 99 99 push ax ; Push high order digits, or port address, or N/A … … 102 102 mov si, g_szDetectOuter ; Finally load SI with wrapper string "IDE %s at %s: " 103 103 104 jmp short DetectPrint_BootMenuPrint_FormatCSSIfromParamsInSSBP_Relay 104 jmp short DetectPrint_BootMenuPrint_FormatCSSIfromParamsInSSBP_Relay 105 105 106 106 … … 127 127 ret 128 128 129 130 131 -
trunk/XTIDE_Universal_BIOS/Src/Strings.asm
r241 r242 3 3 4 4 %ifdef MODULE_STRINGS_COMPRESSED_PRECOMPRESS 5 %include "Display.inc"5 %include "Display.inc" 6 6 %endif 7 7 … … 10 10 11 11 ; The following strings are used by DetectPrint_StartDetectWithMasterOrSlaveStringInAXandIdeVarsInCSBP 12 ; To support an optimization in that code, these strings must start on the same 256 byte page, 12 ; To support an optimization in that code, these strings must start on the same 256 byte page, 13 13 ; which is checked at assembly time below. 14 14 ; 15 g_szDetectStart: 16 g_szDetectMaster: db "Master",NULL 15 g_szDetectStart: 16 g_szDetectMaster: db "Master",NULL 17 17 g_szDetectSlave: db "Slave ",NULL 18 18 g_szDetectOuter: db "IDE %s at %s: ",NULL 19 19 g_szDetectPort: db "%x",NULL ; IDE Master at 1F0h: 20 g_szDetectCOM: db "COM%c%s",NULL 20 g_szDetectCOM: db "COM%c%s",NULL 21 21 g_szDetectCOMAuto: db " Auto",NULL 22 22 g_szDetectCOMSmall: db "/%u%u00",NULL ; IDE Master at COM1/9600: 23 23 g_szDetectEnd: 24 24 g_szDetectCOMLarge: db "/%u.%uK",NULL ; IDE Master at COM1/19.2K: 25 26 %ifndef CHECK_FOR_UNUSED_ENTRYPOINTS 27 %if ((g_szDetectEnd-$$) & 0xff00) <> ((g_szDetectStart-$$) & 0xff00)28 %error "g_szDetect* strings must start on the same 256 byte page, required by DetectPrint_StartDetectWithMasterOrSlaveStringInAXandIdeVarsInCSBP. Please move this block up or down within strings.asm"29 %endif25 26 %ifndef CHECK_FOR_UNUSED_ENTRYPOINTS 27 %if ((g_szDetectEnd-$$) & 0xff00) <> ((g_szDetectStart-$$) & 0xff00) 28 %error "g_szDetect* strings must start on the same 256 byte page, required by DetectPrint_StartDetectWithMasterOrSlaveStringInAXandIdeVarsInCSBP. Please move this block up or down within strings.asm" 29 %endif 30 30 %endif 31 31 32 32 ; Boot Menu menuitem strings 33 ; 33 ; 34 34 ; The following strings are used by BootMenuPrint_* routines. 35 ; To support optimizations in that code, these strings must start on the same 256 byte page, 35 ; To support optimizations in that code, these strings must start on the same 256 byte page, 36 36 ; which is checked at assembly time below. 37 ; 38 g_szBootMenuPrintStart: 37 ; 38 g_szBootMenuPrintStart: 39 39 g_szDriveNum: db "%x %s",NULL 40 40 g_szDriveNumBOOTNFO: db "%x %z",NULL 41 41 g_szFloppyDrv: db "Floppy Drive %c",NULL 42 g_szBootMenuPrintEnd: 42 g_szBootMenuPrintEnd: 43 43 g_szForeignHD: db "Foreign Hard Disk",NULL 44 44 45 %ifndef CHECK_FOR_UNUSED_ENTRYPOINTS 46 %if ((g_szBootMenuPrintStart-$$) & 0xff00) <> ((g_szBootMenuPrintEnd-$$) & 0xff00)47 %error "g_szBootMenuPrint* strings must start on the same 256 byte page, required by the BootMenuPrint_* routines. Please move this block up or down within strings.asm"48 %endif45 %ifndef CHECK_FOR_UNUSED_ENTRYPOINTS 46 %if ((g_szBootMenuPrintStart-$$) & 0xff00) <> ((g_szBootMenuPrintEnd-$$) & 0xff00) 47 %error "g_szBootMenuPrint* strings must start on the same 256 byte page, required by the BootMenuPrint_* routines. Please move this block up or down within strings.asm" 48 %endif 49 49 %endif 50 50 51 51 ; POST drive detection strings 52 52 g_szRomAt: db "%s @ %x",LF,CR,NULL 53 53 54 54 ; Boot loader strings 55 55 g_szTryToBoot: db "Booting from %s %x",ANGLE_QUOTE_RIGHT,"%x",LF,CR,NULL … … 63 63 g_szRomBoot: db "ROM Boot",NULL 64 64 g_szHotkey: db "%A%c%c%A%s%A ",NULL 65 65 66 66 ; Boot Menu information strings 67 67 g_szCapacity: db "Capacity : %s",NULL 68 g_szCapacityNum: db "%5-u.%u %ciB",NULL 68 g_szCapacityNum: db "%5-u.%u %ciB",NULL 69 69 g_szSizeDual: db "%s /%s",LF,CR 70 70 db "Addr.",SINGLE_VERTICAL,"Block",SINGLE_VERTICAL,"Bus",SINGLE_VERTICAL, "IRQ",SINGLE_VERTICAL,"Reset",LF,CR … … 72 72 73 73 ; Boot Menu Floppy Disk strings 74 ; 74 ; 75 75 ; The following strings are used by BootMenuPrint_RefreshInformation 76 ; To support optimizations in that code, these strings must start on the same 256 byte page, 76 ; To support optimizations in that code, these strings must start on the same 256 byte page, 77 77 ; which is checked at assembly time below. 78 ; 79 g_szFddStart: 78 ; 79 g_szFddStart: 80 80 g_szFddUnknown: db "Unknown",NULL 81 81 g_szFddSizeOr: db "5",ONE_QUARTER,QUOTATION_MARK," or 3",ONE_HALF,QUOTATION_MARK," DD",NULL 82 82 g_szFddSize: db "%s",QUOTATION_MARK,", %u kiB",NULL ; 3½", 1440 kiB 83 83 g_szFddThreeHalf: db "3",ONE_HALF,NULL 84 g_szFddEnd: 84 g_szFddEnd: 85 85 g_szFddFiveQuarter: db "5",ONE_QUARTER,NULL 86 86 87 %ifndef CHECK_FOR_UNUSED_ENTRYPOINTS 88 %if ((g_szFddStart-$$) & 0xff00) <> ((g_szFddEnd-$$) & 0xff00)89 %error "g_szFdd* strings must start on the same 256 byte page, required by the BootMenuPrint_RefreshInformation routines for floppy drives. Please move this block up or down within strings.asm"90 %endif91 %endif 92 93 g_szAddressingModes: 87 %ifndef CHECK_FOR_UNUSED_ENTRYPOINTS 88 %if ((g_szFddStart-$$) & 0xff00) <> ((g_szFddEnd-$$) & 0xff00) 89 %error "g_szFdd* strings must start on the same 256 byte page, required by the BootMenuPrint_RefreshInformation routines for floppy drives. Please move this block up or down within strings.asm" 90 %endif 91 %endif 92 93 g_szAddressingModes: 94 94 g_szLCHS: db "L-CHS",NULL 95 95 g_szPCHS: db "P-CHS",NULL … … 100 100 ; Ensure that addressing modes are correctly spaced in memory 101 101 ; 102 %ifndef CHECK_FOR_UNUSED_ENTRYPOINTS 103 %if g_szLCHS <> g_szAddressingModes104 %error "g_szAddressingModes Displacement Incorrect 1"105 %endif106 %if g_szPCHS <> g_szLCHS + g_szAddressingModes_Displacement107 %error "g_szAddressingModes Displacement Incorrect 2"108 %endif109 %if g_szLBA28 <> g_szPCHS + g_szAddressingModes_Displacement 110 %error "g_szAddressingModes Displacement Incorrect 3"111 %endif112 %if g_szLBA48 <> g_szLBA28 + g_szAddressingModes_Displacement 113 %error "g_szAddressingModes Displacement Incorrect 4"114 %endif115 %endif 116 117 g_szBusTypeValues: 102 %ifndef CHECK_FOR_UNUSED_ENTRYPOINTS 103 %if g_szLCHS <> g_szAddressingModes 104 %error "g_szAddressingModes Displacement Incorrect 1" 105 %endif 106 %if g_szPCHS <> g_szLCHS + g_szAddressingModes_Displacement 107 %error "g_szAddressingModes Displacement Incorrect 2" 108 %endif 109 %if g_szLBA28 <> g_szPCHS + g_szAddressingModes_Displacement 110 %error "g_szAddressingModes Displacement Incorrect 3" 111 %endif 112 %if g_szLBA48 <> g_szLBA28 + g_szAddressingModes_Displacement 113 %error "g_szAddressingModes Displacement Incorrect 4" 114 %endif 115 %endif 116 117 g_szBusTypeValues: 118 118 g_szBusTypeValues_8Dual: db "D8 ",NULL 119 119 g_szBusTypeValues_8Reversed: db "X8 ",NULL … … 126 126 ; Ensure that bus type strings are correctly spaced in memory 127 127 ; 128 %ifndef CHECK_FOR_UNUSED_ENTRYPOINTS 129 %if g_szBusTypeValues_8Dual <> g_szBusTypeValues130 %error "g_szBusTypeValues Displacement Incorrect 1"131 %endif132 %if g_szBusTypeValues_8Reversed <> g_szBusTypeValues + g_szBusTypeValues_Displacement133 %error "g_szBusTypeValues Displacement Incorrect 2" 134 %endif135 %if g_szBusTypeValues_8Single <> g_szBusTypeValues_8Reversed + g_szBusTypeValues_Displacement136 %error "g_szBusTypeValues Displacement Incorrect 3" 137 %endif138 %if g_szBusTypeValues_16 <> g_szBusTypeValues_8Single + g_szBusTypeValues_Displacement 139 %error "g_szBusTypeValues Displacement Incorrect 4" 140 %endif141 %if g_szBusTypeValues_32 <> g_szBusTypeValues_16 + g_szBusTypeValues_Displacement142 %error "g_szBusTypeValues Displacement Incorrect 5" 143 %endif144 %if g_szBusTypeValues_Serial <> g_szBusTypeValues_32 + g_szBusTypeValues_Displacement145 %error "g_szBusTypeValues Displacement Incorrect 6" 146 %endif147 %endif 148 128 %ifndef CHECK_FOR_UNUSED_ENTRYPOINTS 129 %if g_szBusTypeValues_8Dual <> g_szBusTypeValues 130 %error "g_szBusTypeValues Displacement Incorrect 1" 131 %endif 132 %if g_szBusTypeValues_8Reversed <> g_szBusTypeValues + g_szBusTypeValues_Displacement 133 %error "g_szBusTypeValues Displacement Incorrect 2" 134 %endif 135 %if g_szBusTypeValues_8Single <> g_szBusTypeValues_8Reversed + g_szBusTypeValues_Displacement 136 %error "g_szBusTypeValues Displacement Incorrect 3" 137 %endif 138 %if g_szBusTypeValues_16 <> g_szBusTypeValues_8Single + g_szBusTypeValues_Displacement 139 %error "g_szBusTypeValues Displacement Incorrect 4" 140 %endif 141 %if g_szBusTypeValues_32 <> g_szBusTypeValues_16 + g_szBusTypeValues_Displacement 142 %error "g_szBusTypeValues Displacement Incorrect 5" 143 %endif 144 %if g_szBusTypeValues_Serial <> g_szBusTypeValues_32 + g_szBusTypeValues_Displacement 145 %error "g_szBusTypeValues Displacement Incorrect 6" 146 %endif 147 %endif 148 149 149 g_szSelectionTimeout: db DOUBLE_BOTTOM_LEFT_CORNER,DOUBLE_LEFT_HORIZONTAL_TO_SINGLE_VERTICAL,"%ASelection in %2-u s",NULL 150 150 … … 153 153 154 154 ;------------------------------------------------------------------------------------------ 155 ; 155 ; 156 156 ; Tables for StringsCompress.pl 157 157 ; … … 167 167 ;$translate{ord('.')} = 9; 168 168 ;$translate{ord('/')} = 10; 169 ;$translate{ord('1')} = 11; 169 ;$translate{ord('1')} = 11; 170 170 ;$translate{ord('2')} = 12; 171 171 ;$translate{ord('3')} = 13; … … 197 197 ; 198 198 ; Starting point for the "normal" range, typically around 0x40 to cover upper and lower case 199 ; letters. If lower case 'z' is not used, 0x3a can be a good choice as it adds ':' to the 199 ; letters. If lower case 'z' is not used, 0x3a can be a good choice as it adds ':' to the 200 200 ; front end. 201 201 ; … … 207 207 208 208 209 210
Note:
See TracChangeset
for help on using the changeset viewer.