Ignore:
Timestamp:
Nov 21, 2011, 11:01:08 AM (12 years ago)
Author:
gregli@…
google:author:
gregli@hotmail.com
Message:

Adding proper serial port support to the Configurator, which required some minor changes elsewhere. Also added an option, off by default, to automatically scan for serial drives at the end of normal drive detection (no ALT key required, although that is still available if the option is off).

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/XTIDE_Universal_BIOS_Configurator_v2/Src/Menupages/IdeControllerMenu.asm

    r153 r199  
    1010    at  MENUPAGE.fnEnter,           dw  IdeControllerMenu_EnterMenuOrModifyItemVisibility
    1111    at  MENUPAGE.fnBack,            dw  ConfigurationMenu_EnterMenuOrModifyItemVisibility
    12     at  MENUPAGE.wMenuitems,        dw  8
     12    at  MENUPAGE.wMenuitems,        dw  11
    1313iend
    1414
     
    5050    at  MENUITEM.szQuickInfo,       dw  g_szNfoIdeDevice
    5151    at  MENUITEM.szHelp,            dw  g_szNfoIdeDevice
    52     at  MENUITEM.bFlags,            db  FLG_MENUITEM_VISIBLE | FLG_MENUITEM_BYTEVALUE
     52    at  MENUITEM.bFlags,            db  FLG_MENUITEM_VISIBLE | FLG_MENUITEM_BYTEVALUE | FLG_MENUITEM_MODIFY_MENU
    5353    at  MENUITEM.bType,             db  TYPE_MENUITEM_MULTICHOICE
    5454    at  MENUITEM.itemValue + ITEM_VALUE.wRomvarsValueOffset,        dw  NULL
     
    5757    at  MENUITEM.itemValue + ITEM_VALUE.rgwChoiceToValueLookup,     dw  g_rgwChoiceToValueLookupForDevice
    5858    at  MENUITEM.itemValue + ITEM_VALUE.rgszValueToStringLookup,    dw  g_rgszValueToStringLookupForDevice
     59    at  MENUITEM.itemValue + ITEM_VALUE.fnValueWriter,              dw  IdeControllerMenu_WriteDevice
    5960iend
    6061
     
    8990iend
    9091
     92g_MenuitemIdeControllerSerialCOM:
     93istruc MENUITEM
     94    at  MENUITEM.fnActivate,        dw  Menuitem_ActivateMultichoiceSelectionForMenuitemInDSSI
     95    at  MENUITEM.fnFormatValue,     dw  MenuitemPrint_WriteLookupValueStringToBufferInESDIfromUnshiftedItemInDSSI
     96    at  MENUITEM.szName,            dw  g_szItemSerialCOM
     97    at  MENUITEM.szQuickInfo,       dw  g_szNfoIdeSerialCOM
     98    at  MENUITEM.szHelp,            dw  g_szHelpIdeSerialCOM
     99    at  MENUITEM.bFlags,            db  FLG_MENUITEM_MODIFY_MENU
     100    at  MENUITEM.bType,             db  TYPE_MENUITEM_MULTICHOICE
     101    at  MENUITEM.itemValue + ITEM_VALUE.wRomvarsValueOffset,        dw  NULL
     102    at  MENUITEM.itemValue + ITEM_VALUE.szDialogTitle,              dw  g_szDlgDevice
     103    at  MENUITEM.itemValue + ITEM_VALUE.szMultichoice,              dw  g_szSerialCOMChoice
     104    at  MENUITEM.itemValue + ITEM_VALUE.rgwChoiceToValueLookup,     dw  NULL
     105    at  MENUITEM.itemValue + ITEM_VALUE.rgszValueToStringLookup,    dw  g_rgszValueToStringLookupForCOM
     106    at  MENUITEM.itemValue + ITEM_VALUE.fnValueReader,              dw  IdeControllerMenu_SerialReadCOM 
     107    at  MENUITEM.itemValue + ITEM_VALUE.fnValueWriter,              dw  IdeControllerMenu_SerialWriteCOM
     108iend
     109
     110g_MenuitemIdeControllerSerialPort:
     111istruc MENUITEM
     112    at  MENUITEM.fnActivate,        dw  Menuitem_ActivateHexInputForMenuitemInDSSI
     113    at  MENUITEM.fnFormatValue,     dw  MenuitemPrint_WriteHexValueStringToBufferInESDIfromItemInDSSI
     114    at  MENUITEM.szName,            dw  g_szItemSerialPort
     115    at  MENUITEM.szQuickInfo,       dw  g_szNfoIdeSerialPort
     116    at  MENUITEM.szHelp,            dw  g_szHelpIdeSerialPort
     117    at  MENUITEM.bFlags,            db  FLG_MENUITEM_MODIFY_MENU       
     118    at  MENUITEM.bType,             db  TYPE_MENUITEM_HEX
     119    at  MENUITEM.itemValue + ITEM_VALUE.wRomvarsValueOffset,        dw  NULL
     120    at  MENUITEM.itemValue + ITEM_VALUE.szDialogTitle,              dw  g_szDlgIdeCmdPort
     121    at  MENUITEM.itemValue + ITEM_VALUE.wMinValue,                  dw  240h
     122    at  MENUITEM.itemValue + ITEM_VALUE.wMaxValue,                  dw  438h
     123    at  MENUITEM.itemValue + ITEM_VALUE.fnValueReader,              dw  IdeControllerMenu_SerialReadPort
     124    at  MENUITEM.itemValue + ITEM_VALUE.fnValueWriter,              dw  IdeControllerMenu_SerialWritePort
     125iend       
     126
     127g_MenuitemIdeControllerSerialBaud:     
     128istruc MENUITEM
     129    at  MENUITEM.fnActivate,        dw  Menuitem_ActivateMultichoiceSelectionForMenuitemInDSSI
     130    at  MENUITEM.fnFormatValue,     dw  MenuitemPrint_WriteLookupValueStringToBufferInESDIfromUnshiftedItemInDSSI
     131    at  MENUITEM.szName,            dw  g_szItemSerialBaud
     132    at  MENUITEM.szQuickInfo,       dw  g_szNfoIdeSerialBaud
     133    at  MENUITEM.szHelp,            dw  g_szHelpIdeSerialBaud
     134    at  MENUITEM.bType,             db  TYPE_MENUITEM_MULTICHOICE
     135    at  MENUITEM.itemValue + ITEM_VALUE.wRomvarsValueOffset,        dw  NULL
     136    at  MENUITEM.itemValue + ITEM_VALUE.szDialogTitle,              dw  g_szDlgDevice
     137    at  MENUITEM.itemValue + ITEM_VALUE.szMultichoice,              dw  g_szSerialBaudChoice
     138    at  MENUITEM.itemValue + ITEM_VALUE.rgwChoiceToValueLookup,     dw  NULL
     139    at  MENUITEM.itemValue + ITEM_VALUE.rgszValueToStringLookup,    dw  g_rgszValueToStringLookupForBaud
     140    at  MENUITEM.itemValue + ITEM_VALUE.fnValueReader,              dw  IdeControllerMenu_SerialReadBaud
     141    at  MENUITEM.itemValue + ITEM_VALUE.fnValueWriter,              dw  IdeControllerMenu_SerialWriteBaud
     142iend
     143       
    91144g_MenuitemIdeControllerEnableInterrupt:
    92145istruc MENUITEM
     
    135188    dw  g_szValueCfgDeviceSerial
    136189
     190g_rgszValueToStringLookupForCOM:       
     191    dw  g_szValueCfgCOM1
     192    dw  g_szValueCfgCOM2
     193    dw  g_szValueCfgCOM3
     194    dw  g_szValueCfgCOM4
     195    dw  g_szValueCfgCOM5
     196    dw  g_szValueCfgCOM6
     197    dw  g_szValueCfgCOM7
     198    dw  g_szValueCfgCOM8
     199    dw  g_szValueCfgCOM9
     200    dw  g_szValueCfgCOMA
     201    dw  g_szValueCfgCOMB
     202    dw  g_szValueCfgCOMC
     203    dw  g_szValueCfgCOMx
     204
     205g_rgszValueToStringLookupForBaud:
     206    dw  g_szValueCfgBaud2400
     207    dw  g_szValueCfgBaud9600
     208    dw  g_szValueCfgBaud38_4
     209    dw  g_szValueCfgBaud115_2
     210
     211g_wPrintBaud:
     212    dw  DEVICE_SERIAL_PRINTBAUD_2400
     213    dw  DEVICE_SERIAL_PRINTBAUD_9600
     214    dw  DEVICE_SERIAL_PRINTBAUD_38_4
     215    dw  DEVICE_SERIAL_PRINTBAUD_115_2
    137216
    138217; Section containing code
     
    161240    lea     ax, [bx+IDEVARS.wPort]
    162241    mov     [cs:g_MenuitemIdeControllerCommandBlockAddress+MENUITEM.itemValue+ITEM_VALUE.wRomvarsValueOffset], ax
    163 
     242    mov     [cs:g_MenuitemIdeControllerSerialPort+MENUITEM.itemValue+ITEM_VALUE.wRomvarsValueOffset], ax
     243    mov     [cs:g_MenuitemIdeControllerSerialCOM+MENUITEM.itemValue+ITEM_VALUE.wRomvarsValueOffset], ax     
     244    mov     [cs:g_MenuitemIdeControllerSerialBaud+MENUITEM.itemValue+ITEM_VALUE.wRomvarsValueOffset], ax
     245                ;; baud also modifies the next two bytes (print chars in wPortCtrl), but it never reads them
     246       
    164247    lea     ax, [bx+IDEVARS.wPortCtrl]
    165248    mov     [cs:g_MenuitemIdeControllerControlBlockAddress+MENUITEM.itemValue+ITEM_VALUE.wRomvarsValueOffset], ax
     
    168251    mov     [cs:g_MenuitemIdeControllerEnableInterrupt+MENUITEM.itemValue+ITEM_VALUE.wRomvarsValueOffset], ax
    169252    mov     [cs:g_MenuitemIdeControllerIdeIRQ+MENUITEM.itemValue+ITEM_VALUE.wRomvarsValueOffset], ax
     253
    170254    ret
    171255
     
    185269    pop     ds
    186270    call    .EnableOrDisableIRQ
     271    call    .EnableOrDisableSerial
    187272    mov     si, g_MenupageForIdeControllerMenu
    188273    jmp     Menupage_ChangeToNewMenupageInDSSI
     
    226311    ret
    227312
    228 
     313.EnableOrDisableSerial:
     314    mov     bx, g_MenuitemIdeControllerCommandBlockAddress
     315    call    .DisableMenuitemFromCSBX
     316
     317    mov     bx, g_MenuitemIdeControllerControlBlockAddress
     318    call    .DisableMenuitemFromCSBX
     319
     320    mov     bx, g_MenuitemIdeControllerEnableInterrupt
     321    call    .DisableMenuitemFromCSBX
     322
     323    mov     bx, g_MenuitemIdeControllerSerialBaud
     324    call    .DisableMenuitemFromCSBX
     325
     326    mov     bx, g_MenuitemIdeControllerSerialCOM
     327    call    .DisableMenuitemFromCSBX
     328
     329    mov     bx, g_MenuitemIdeControllerSerialPort
     330    call    .DisableMenuitemFromCSBX
     331               
     332    mov     bx, [cs:g_MenuitemIdeControllerDevice+MENUITEM.itemValue+ITEM_VALUE.wRomvarsValueOffset]       
     333    call    Buffers_GetRomvarsValueToAXfromOffsetInBX
     334    cmp     al,DEVICE_SERIAL_PORT
     335    jnz     .DisableAllSerial
     336
     337    mov     bx, g_MenuitemIdeControllerSerialCOM
     338    call    .EnableMenuitemFromCSBX
     339
     340    mov     bx, g_MenuitemIdeControllerSerialBaud
     341    call    .EnableMenuitemFromCSBX
     342
     343    mov     bx, [cs:g_MenuitemIdeControllerSerialCOM+MENUITEM.itemValue+ITEM_VALUE.wRomvarsValueOffset]         
     344    call    Buffers_GetRomvarsValueToAXfromOffsetInBX
     345    mov     bx, g_MenuitemIdeControllerSerialPort
     346    cmp     al,'x'
     347    jz      .EnableMenuitemFromCSBX
     348    jmp     .DisableMenuitemFromCSBX
     349
     350.DisableAllSerial:
     351
     352    mov     bx, g_MenuitemIdeControllerCommandBlockAddress
     353    call    .EnableMenuitemFromCSBX
     354
     355    mov     bx, g_MenuitemIdeControllerControlBlockAddress
     356    call    .EnableMenuitemFromCSBX
     357
     358    mov     bx, g_MenuitemIdeControllerEnableInterrupt
     359    call    .EnableMenuitemFromCSBX             
     360
     361    ret
     362       
    229363;--------------------------------------------------------------------
    230364; MENUITEM activation functions (.fnActivate)
     
    250384    call    MasterSlaveMenu_InitializeToDrvparamsOffsetInBX
    251385    jmp     MasterSlaveMenu_EnterMenuOrModifyItemVisibility
     386
     387PackedCOMPortAddresses:             ; COM1 - COMC (or COM12)
     388    db      (DEVICE_SERIAL_COM1 - DEVICE_SERIAL_PACKEDPORTANDBAUD_STARTINGPORT) >> 1
     389    db      (DEVICE_SERIAL_COM2 - DEVICE_SERIAL_PACKEDPORTANDBAUD_STARTINGPORT) >> 1
     390    db      (DEVICE_SERIAL_COM3 - DEVICE_SERIAL_PACKEDPORTANDBAUD_STARTINGPORT) >> 1
     391    db      (DEVICE_SERIAL_COM4 - DEVICE_SERIAL_PACKEDPORTANDBAUD_STARTINGPORT) >> 1   
     392    db      (DEVICE_SERIAL_COM5 - DEVICE_SERIAL_PACKEDPORTANDBAUD_STARTINGPORT) >> 1
     393    db      (DEVICE_SERIAL_COM6 - DEVICE_SERIAL_PACKEDPORTANDBAUD_STARTINGPORT) >> 1
     394    db      (DEVICE_SERIAL_COM7 - DEVICE_SERIAL_PACKEDPORTANDBAUD_STARTINGPORT) >> 1   
     395    db      (DEVICE_SERIAL_COM8 - DEVICE_SERIAL_PACKEDPORTANDBAUD_STARTINGPORT) >> 1   
     396    db      (DEVICE_SERIAL_COM9 - DEVICE_SERIAL_PACKEDPORTANDBAUD_STARTINGPORT) >> 1
     397    db      (DEVICE_SERIAL_COMA - DEVICE_SERIAL_PACKEDPORTANDBAUD_STARTINGPORT) >> 1   
     398    db      (DEVICE_SERIAL_COMB - DEVICE_SERIAL_PACKEDPORTANDBAUD_STARTINGPORT) >> 1
     399    db      (DEVICE_SERIAL_COMC - DEVICE_SERIAL_PACKEDPORTANDBAUD_STARTINGPORT) >> 1 
     400    db      0                       ; null terminated
     401
     402;------------------------------------------------------------------------------------------
     403;
     404; Reader/Writer Routines
     405;
     406; For serial drives, we pack the port number and baud rate into a single byte, and thus
     407; we need to take care to properly read/write just the bits we need.  In addition, since
     408; we use the Port/PortCtrl bytes in a special way for serial drives, we need to properly
     409; default the values stored in both these words  when switching in and out of the Serial
     410; device choice.
     411;
     412; Writers:
     413;   Parameters:
     414;       AX:     Value that the MENUITEM system was interacting with
     415;       ES:DI:  ROMVARS location where the value is to be stored
     416;       DS:SI:  MENUITEM pointer
     417;   Returns:
     418;       AX:     Value to actually write to ROMVARS
     419;   Corrupts registers:
     420;       AX
     421;
     422; Readers:
     423;   Parameters:
     424;       AX:     Value read from the ROMVARS location
     425;       ES:DI:  ROMVARS location where the value was just read from
     426;       DS:SI:  MENUITEM pointer
     427;   Returns:
     428;       AX:     Value that the MENUITEM system will interact with and display
     429;   Corrupts registers:
     430;       AX
     431;
     432
     433;
     434; No change to Device byte, but use this opportunity to change defaults stored in wPort and wPortCtrl if we are
     435; changing in/out of a Serial device (since we use these bytes in radically different ways).  Also clear the
     436; interrupt informtion is we are moving into Serial (since the serial device does not use interrupts).
     437;
     438ALIGN JUMP_ALIGN
     439IdeControllerMenu_WriteDevice:
     440        push    ax
     441        push    bx
     442        push    di
     443
     444        mov     bl,[es:di]                          ; what is the current Device?
     445       
     446        add     di,IDEVARS.wPort - IDEVARS.bDevice  ; Get ready to set the Port addresses
     447       
     448        cmp     al,DEVICE_SERIAL_PORT
     449        jz      .changingToSerial
     450
     451        cmp     bl,DEVICE_SERIAL_PORT
     452        jnz     .done                               ; if we weren't Serial before, nothing to do
     453
     454.changingFromSerial:
     455        cmp     al,DEVICE_16BIT_ATA
     456        jl      .xtide
     457
     458        mov     ax,DEVICE_ATA_DEFAULT_PORT          ; Defaults for 16-bit and better ATA devices
     459        mov     bx,DEVICE_ATA_DEFAULT_PORTCTRL
     460        jmp     .writeNonSerial
     461
     462.xtide:
     463        mov     ax,DEVICE_XTIDE_DEFAULT_PORT        ; Defaults for 8-bit XTIDE devices
     464        mov     bx,DEVICE_XTIDE_DEFAULT_PORTCTRL       
     465
     466.writeNonSerial:       
     467        mov     [es:di],ax                          ; Store defaults in IDEVARS.wPort and IDEVARS.wPortCtrl
     468        mov     [es:di+2],bx
     469
     470        jmp     .done
     471
     472.changingToSerial:     
     473        cmp     bl,DEVICE_SERIAL_PORT
     474        jz      .done                               ; if we were already serial, nothing to do
     475
     476        mov     ax,DEVICE_SERIAL_DEFAULT_COM
     477        call    IdeControllerMenu_SerialWriteCOM
     478        mov     [es:di],ax
     479       
     480        mov     ax,DEVICE_SERIAL_DEFAULT_BAUD
     481        call    IdeControllerMenu_SerialWriteBaud
     482        mov     [es:di],ax
     483               
     484        add     di,IDEVARS.bIRQ - IDEVARS.wPort     ; clear out the interrupt information, we don't use interrupts
     485        mov     al,0
     486        mov     [es:di],al
     487
     488.done: 
     489        pop     di
     490        pop     bx
     491        pop     ax
     492
     493        ret
     494
     495;
     496; "COMn" ASCII characer -> Numeric COM number
     497;
     498ALIGN JUMP_ALIGN
     499IdeControllerMenu_SerialReadCOM:
     500        xor     ah,ah                               ; clear out packedportbaud value
     501
     502        cmp     al,'x'                              ; base this on the ASCII character used to print
     503        jz      .custom
     504
     505        cmp     al,'A'
     506        jae     .over10
     507
     508        sub     al, '0'+1                           ; convert ASCII value '0'-'9' to numeric
     509        ret
     510
     511.over10:
     512        sub     al, 'A'-10+1                        ; convert ASCII value 'A'-'C' to numeric
     513        ret
     514
     515.custom:
     516        mov     al, 12                              ; convert ASCII value 'x' (for custom) to numeric
     517        ret
     518
     519;
     520; Numeric COM number -> Packed port address, and update ASCII character for printing "COMn"
     521;               
     522ALIGN JUMP_ALIGN
     523IdeControllerMenu_SerialWriteCOM:
     524        push    bx
     525
     526        cmp     al,12                               ; custom?
     527        jge     .custom
     528
     529        mov     bx,ax                               ; lookup packed port address based on COM address
     530        mov     ah,[cs:bx+PackedCOMPortAddresses]
     531
     532        cmp     al,9                                ; COMA or higher, but not custom
     533        jge     .atorabove10
     534
     535        add     al, '0'+1                           ; convert numeric to ASCII '1' to '9'
     536        jmp     IdeControllerMenu_SerialWriteCOM_PackAndRet
     537
     538.custom:
     539        mov     al,'x'                              ; ASCII value 'x' for custom
     540        mov     ah,0                                ; 240h is default custom value
     541        jmp     IdeControllerMenu_SerialWriteCOM_PackAndRet
     542
     543.atorabove10:
     544        add     al, 'A'-10+1                        ; convert numeric to ASCII 'A' to 'C'
     545
     546IdeControllerMenu_SerialWriteCOM_PackAndRet:
     547        mov     bl,[es:di+1]                        ; read baud rate bits
     548        and     bl,DEVICE_SERIAL_PACKEDPORTANDBAUD_BAUDMASK     
     549        or      ah,bl
     550
     551        pop     bx
     552        ret     
     553
     554;
     555; Packed Baud -> Numeric Baud
     556;               
     557ALIGN JUMP_ALIGN
     558IdeControllerMenu_SerialReadBaud:
     559        xchg    al,ah
     560        and     ax,DEVICE_SERIAL_PACKEDPORTANDBAUD_BAUDMASK         ; also clears high order byte
     561        ret
     562
     563;
     564; Numeric Baud -> Packed Baud, also update ASCII printing characters for baud rate
     565;               
     566ALIGN JUMP_ALIGN
     567IdeControllerMenu_SerialWriteBaud:
     568        and     ax,DEVICE_SERIAL_PACKEDPORTANDBAUD_BAUDBITS         ; ensure we only have the bits we want
     569       
     570        push    bx
     571
     572        mov     bx,ax                                               ; lookup printing word for wPortCtrl
     573        shl     bx,1
     574        mov     bx,[cs:bx+g_wPrintBaud]
     575        mov     [es:di+2],bx
     576
     577        xchg    al,ah                                               ; or in port bits
     578        mov     bx,[es:di]
     579        and     bh,DEVICE_SERIAL_PACKEDPORTANDBAUD_PORTMASK
     580        or      ax,bx
     581
     582        pop     bx
     583        ret
     584
     585;
     586; Packed Port -> Numeric Port
     587;               
     588ALIGN JUMP_ALIGN
     589IdeControllerMenu_SerialReadPort:       
     590        mov     al,ah
     591        and     ax,DEVICE_SERIAL_PACKEDPORTANDBAUD_PORTMASK         ; note that this clears AH
     592        shl     ax,1
     593        add     ax,DEVICE_SERIAL_PACKEDPORTANDBAUD_STARTINGPORT
     594        ret
     595
     596;
     597; Numeric Port -> Packed Port, convert from Custom to a defined COM port if we match one
     598;
     599ALIGN JUMP_ALIGN
     600IdeControllerMenu_SerialWritePort:     
     601        push    bx
     602
     603        sub     ax,DEVICE_SERIAL_PACKEDPORTANDBAUD_STARTINGPORT     ; convert from numeric to packed port number
     604        shr     ax,1
     605        and     al,DEVICE_SERIAL_PACKEDPORTANDBAUD_PORTMASK
     606
     607        mov     bx,PackedCOMPortAddresses                           ; loop, looking for port address in known COM address list
     608.next: 
     609        mov     ah,[cs:bx]
     610        inc     bx
     611        test    ah,ah
     612        jz      .notfound
     613        cmp     al,ah
     614        jnz     .next
     615
     616        sub     bx,PackedCOMPortAddresses + 1                       ; FOUND!, +1 since we already incremented
     617        mov     ax,bx
     618        pop     bx
     619        jmp     IdeControllerMenu_SerialWriteCOM                    ; if found, use that logic to get ASCII character
     620
     621.notfound:
     622        xchg    ah,al                                               
     623        mov     al,'x'
     624        jmp     IdeControllerMenu_SerialWriteCOM_PackAndRet
     625
     626
Note: See TracChangeset for help on using the changeset viewer.