@@ -218,13 +218,10 @@ POST_TEST_KEY = 1 ; POST Key Test (PKEY)
218218;----------------------------------------------------------------------------;
219219; Advanced Options (may void your warranty)
220220;
221- MAX_RAM_PC EQU 640 ; 0000-A000 (ought to be enough )
222- MAX_RAM_MDA EQU 704 ; MDA include A000-B000
223- MAX_RAM_CGA EQU 736 ; CGA include A000-B800
221+ MAX_RAM_PC EQU 640 ; 640K: base 0000-A000 (EGA/VGA )
222+ MAX_RAM_MDA EQU 704 ; 704K: include A000-B000 (MDA)
223+ MAX_RAM_CGA EQU 736 ; 736K: include A000-B800 (CGA)
224224MAX_RAM = MAX_RAM_PC ; Max detectable low RAM (in KB)
225- ; 640 max using EGA/VGA
226- ; 704 max using MDA (MAX_RAM_MDA)
227- ; 736 max using CGA (MAX_RAM_CGA)
228225MAX_RAM_AUTO = 0 ; Auto-detect MAX_RAM from video DIP switches
229226DRAM_REFRESH = 1 ; 1=Use standard DMA DRAM refresh
230227 ; 0=Disable refresh (use only with SRAM!)
@@ -363,8 +360,7 @@ POST_TEST_DMA = 0 ; disable DMA Register Test (no DMA)
363360POST_TEST_KB = 0 ; disable PKEY and PKI errors
364361POST_TEST_PIT_1 = 0 ; disable Timer 1 Test (no DRAM)
365362POST_TEST_PIC_REG = 0 ; disable PIC Register Test
366- SW1_VID = 00b ; SW1 5/6 Video Type (0=EGA/VGA
367- ; 1=CGA 40, 2=CGA 80, 3=MDA/Herc)
363+ SW1_VID = VID_ROM ; SW1 5/6 Video Type
368364 IF FDC_ENABLE EQ 1
369365SW1_FLP = 01b ; SW1 7/8 Max # of floppy drives (0-3)
370366FD_AUTO_DETECT = 1 ; auto-detect number of floppy drives
@@ -409,7 +405,7 @@ TURBO_TYPE = TURBO_STD ; enable Turbo features
409405;----------------------------------------------------------------------------;
410406; Additional Configuration for MartyPC emulator
411407;
412- MAX_RAM = 736 ; 736 KB Max detectable low RAM
408+ MAX_RAM = MAX_RAM_CGA ; 736 KB Max detectable low RAM
413409CASSETTE = 0 ; use all features on 5150
414410CGA_SNOW_REMOVE = 0 ; disable CGA snow removal
415411;RAM_TEST_LONG = 0 ; disable long RAM test
@@ -421,7 +417,7 @@ CGA_SNOW_REMOVE = 0 ; disable CGA snow removal
421417;
422418BASIC_ROM = 0 ; disable to free code space
423419TURBO_TYPE = TURBO_STD ; use inverse so toggle sets speed
424- ;MAX_RAM = 704 ; if using integrated MDA
420+ ;MAX_RAM = MAX_RAM_MDA ; if using integrated MDA
425421 ENDIF
426422
427423;----------------------------------------------------------------------------;
@@ -851,18 +847,26 @@ EFLAGS86 RECORD FSF:1,FZF:1,FR1:1,FAF:1,FR2:1,FPF:1,FR3:1=1,FCF:1
851847; 000 | - COM : # of COM ports present
852848; 0| - DMA : DMA (should always be 0)
853849; |00 - FLP : Floppy drives present (+1) (0=1 drive,1=2,etc)
854- ; | 00 - VIDM : Video mode (00=EGA/VGA, 01=CGA 40x25,
850+ ; | 00 - VID : Video mode (00=EGA/VGA, 01=CGA 40x25,
855851; - 10=CGA 80x25, 11=MDA 80x25)
856852; | 11 - MBRAM: MB RAM (00=64K, 01=128K, 10=192K, 11=256K+)
857853; | 0 - FPU : FPU installed
858854; | 1 - IPL : Floppy drive(s) installed (always 1 on 5160)
859855;----------------------------------------------------------------------------;
860856 IF FDC_ENABLE EQ 1
861- EQFLAGS RECORD LPT: 2 , X1: 1 , GAM: 1 , COM: 3 , DMA: 1 , FLP: 2 , VIDM :2 , MBRAM: 2 = 11b , FPU: 1 , IPL: 1 = 1
857+ EQFLAGS RECORD LPT: 2 , X1: 1 , GAM: 1 , COM: 3 , DMA: 1 , FLP: 2 , VID :2 , MBRAM: 2 = 11b , FPU: 1 , IPL: 1 = 1
862858 ELSE
863- EQFLAGS RECORD LPT: 2 , X1: 1 , GAM: 1 , COM: 3 , DMA: 1 , FLP: 2 , VIDM :2 , MBRAM: 2 = 11b , FPU: 1 , IPL: 1 = 0
859+ EQFLAGS RECORD LPT: 2 , X1: 1 , GAM: 1 , COM: 3 , DMA: 1 , FLP: 2 , VID :2 , MBRAM: 2 = 11b , FPU: 1 , IPL: 1 = 0
864860 ENDIF
865861
862+ ;----------------------------------------------------------------------------;
863+ ; Video Card (VID) DIP switch settings (bits 4-5)
864+ ;
865+ VID_ROM EQU DNB < 00b > ; OFF/OFF: EGA/VGA/Option ROM
866+ VID_CGA40 EQU DNB < 01b > ; OFF/ON: CGA 40 column
867+ VID_CGA80 EQU DNB < 10b > ; ON/OFF: CGA 80 column
868+ VID_MDA EQU DNB < 11b > ; ON/ON: MDA
869+
866870;----------------------------------------------------------------------------;
867871; GLaBIOS Equipment Flags (40:12H)
868872;----------------------------------------------------------------------------;
@@ -3141,7 +3145,7 @@ CPU_TYPE_DONE:
31413145; | 0 ; FPU installed
31423146; | 0 ; Test Loop (always 0)
31433147;
3144- ; EQUIP_FLAGS: LPT:2,X1:1,GAM:1,COM:3,DMA:1,FLP:2,VIDM :2,MBRAM:2,FPU:1,IPL:1
3148+ ; EQUIP_FLAGS: LPT:2,X1:1,GAM:1,COM:3,DMA:1,FLP:2,VID :2,MBRAM:2,FPU:1,IPL:1
31453149;----------------------------------------------------------------------------;
31463150GET_SW_SETTINGS:
31473151 IN AL , PPI_B ; read Port B register
@@ -3212,7 +3216,7 @@ SETTINGS_FE2010_1:
32123216 MOV CL , 4
32133217 SHL AL , CL ; shift drives and video to high nibble
32143218 ENDIF
3215- AND AL , MASK VIDM ; Bits 4-5 Video only
3219+ AND AL , MASK VID ; Bits 4-5 Video only
32163220 OR AL , EQFLAGS < ,,,,, SW1_FLP AND 1 ,,, 1 > ; set FPU: 1, defaults and SW1_FLP
32173221 ; FD: 00b=1 drive, 01b=2 drives
32183222
@@ -3251,17 +3255,19 @@ SETTINGS_5160:
32513255; Set MAX_RAM from video DIP switches: CGA=736, MDA=704 else 640
32523256; 21 bytes
32533257;
3258+ MAX_RAM_AUTO_SETUP PROC
32543259 PUSH AX ; save original equipment byte
32553260 MOV DX , MAX_RAM_PC ; default 640K
3256- AND AL , MASK VIDM ; bits 4-5 video only
3257- JZ MAX_RAM_AUTO_DONE ; done if EGA/VGA (off, off )
3261+ AND AL , MASK VID ; bits 4-5 video only
3262+ JZ MAX_RAM_AUTO_DONE ; done if EGA/VGA (OFF, OFF )
32583263 MOV DL , LOW MAX_RAM_MDA ; try MDA 704K
3259- CMP AL , 11b SHL 4 ; is MDA (on, on )?
3264+ CMP AL , VID_MDA ; is MDA (ON, ON )?
32603265 JE MAX_RAM_AUTO_DONE ; done if MDA
32613266 MOV DL , LOW MAX_RAM_CGA ; else CGA 736K
32623267MAX_RAM_AUTO_DONE:
32633268 MOV MEM_SZ_PC , DX ; save to BDA
32643269 POP AX ; restore equipment byte
3270+ MAX_RAM_AUTO_SETUP ENDP
32653271 ENDIF
32663272
32673273 ENDIF ; not ARCH_TYPE EQ ARCH_EHB
@@ -3326,14 +3332,14 @@ SETTINGS_SAVE:
33263332; - If MB video switch is 0 (option ROM), skip reset
33273333; - If not 0, determine correct 6845 video mode and do INT 10H reset
33283334;----------------------------------------------------------------------------;
3329- GET_EFLAG VIDM ; AX = 00=error(ZF), 01=CGA 40, 10=CGA 80, 11=MDA
3335+ GET_EFLAG VID ; AX = 00=error(ZF), 01=CGA 40, 10=CGA 80, 11=MDA
33303336 XCHG AX , DX ; AL = EQUIP_FLAGS, DX = BDA initial video mode
33313337 JNZ VID_MODE_OK ; jump if mode valid or video option ROM loaded
33323338 MOV BL , BEEP_SL < 3 , 3 > ; Beep 3 long, 3 short
33333339HALT_BEEP_2:
33343340 JMP HALT_BEEP ; NEAR jump to beep
33353341VID_MODE_OK:
3336- TEST AL , MASK VIDM ; is SW1 mode 00?
3342+ TEST AL , MASK VID ; is SW1 mode 00?
33373343 JZ RESET_VIDEO_DONE ; if custom video ROM, skip reset
33383344 DEC DX
33393345 MOV AX , 1 ; CGA 40x25 color, AH = 0 (for INT 10h below)
@@ -4262,13 +4268,6 @@ POST_LSEP DB POST_L, 0
42624268POST_RSEP DB POST_R , 0
42634269POST_STRINGS ENDP
42644270
4265- NMI_ERR_IO DB 'IO' ; NMI I/O Error string
4266- NMI_ERR_PAR DB ' PAR'
4267- IF POST_OPT_ROM NE 1
4268- DB 'ITY' ; TODO: fix size hack
4269- ENDIF
4270- DB 0 ; NMI Parity Error
4271-
42724271STRINGS ENDP
42734272
42744273;============================================================================;
@@ -4408,22 +4407,25 @@ DETECT_MEMORY PROC
44084407;
44094408 IF ARCH_TYPE EQ ARCH_5150 OR MAX_RAM_AUTO EQ 1
44104409 MOV AX , MEM_SZ_PC ; SW2 RAM size in KB
4411- MOV CL , 4 ; shift counter
4412- SHR AX , CL ; Number of 16KB RAM blocks
4410+ IF CPU_TYPE EQ CPU_V20
4411+ SHR AX , 4 ; V20: Number of 16KB RAM blocks
4412+ ELSE
4413+ MOV CL , 4 ; 8088: Number of 16KB RAM blocks
4414+ SHR AX , CL
4415+ ENDIF
44134416 XCHG AX , CX ; CX = 16KB RAM blocks
44144417 DEC CX ; after first 16K block
44154418 ELSE
4416-
4419+ IF ARCH_TYPE EQ ARCH_UM82
44174420;----------------------------------------------------------------------------;
44184421; UM82C088: get RAM status register
44194422;
4420- IF ARCH_TYPE EQ ARCH_UM82
44214423 CALL UM82_MEM_SIZE ; CX = 16KB RAM blocks - 1
44224424
4425+ ELSE
44234426;----------------------------------------------------------------------------;
44244427; Otherwise, use default for MAX_RAM and detect
44254428;
4426- ELSE
44274429 MOV CX , (MAX_RAM SHR 4 ) - 1 ; Max number of 16KB RAM blocks
44284430 ; (ex: 640K / 16K = 40)
44294431 ENDIF
@@ -4612,25 +4614,29 @@ MEM_ADDR_TEST ENDP
46124614;
46134615; Input:
46144616; ES = segment to test
4617+ ; Output:
4618+ ; ZF and AX = 0 if pass, NZ if fail
46154619;
4616- ; Clobbers AX, CX, DI
4620+ ; Clobbers: AX, CX, DI
46174621;
4618- ; ZF and AX = 0 if pass, NZ if fail
4619- ; Size: 22 bytes
4622+ ; Size: 26 bytes
46204623;----------------------------------------------------------------------------;
46214624MEM_TEST PROC
46224625 MOV AX , RAM_TEST ; test pattern
4623- CALL MEM_CHECK
4624- NOT AX ; invert pattern
4626+ CALL MEM_CHECK ; write and verify pattern
4627+ JNZ MEM_ADDR_ERR ; return if error
4628+ MOV AX , NOT RAM_TEST ; inverted test pattern
46254629
46264630;----------------------------------------------------------------------------;
46274631; Write and verify a 16KB block of Memory at ES:0000
46284632;----------------------------------------------------------------------------;
46294633; Input:
46304634; AX = pattern to write
46314635; ES = segment for test
4636+ ; Output:
4637+ ; ZF and AX = 0 if pass, NZ if fail
46324638;
4633- ; ZF and AX = 0 if pass, NZ if fail
4639+ ; Clobbers: AX, CX, DI
46344640;----------------------------------------------------------------------------;
46354641MEM_CHECK PROC
46364642 MOV CX , 16 * 1024 / 2 ; loop 16KB in WORDs
@@ -4649,7 +4655,7 @@ MEM_TEST ENDP
46494655;----------------------------------------------------------------------------;
46504656; Display "WARM" or "COLD" boot
46514657;----------------------------------------------------------------------------;
4652- ; Size: 39 bytes
4658+ ; Size: 38 bytes
46534659;----------------------------------------------------------------------------;
46544660POST_BOOT_TYPE PROC
46554661 MOV SI , OFFSET POST_BOOT ; BOOT string
@@ -4661,8 +4667,7 @@ POST_BOOT_TYPE PROC
46614667 MOV SI , OFFSET POST_COLD ; COLD string
46624668POST_BOOT_TYPE_OUT:
46634669 CALL OUT_SZ_ATTR ; write string with attribute
4664- POST_COL_END_NL ; end of column end NL
4665- RET
4670+ JMP POST_END_COL_NL ; end of column with NL and RET
46664671
46674672POST_BOOT DB 'Boot' , 0
46684673POST_WARM DB 'WARM' , 0
@@ -4675,7 +4680,7 @@ POST_BOOT_TYPE ENDP
46754680;----------------------------------------------------------------------------;
46764681; Display Video Type
46774682;----------------------------------------------------------------------------;
4678- ; Size: 109 bytes
4683+ ; Size: 108 bytes (including relocated strings)
46794684;----------------------------------------------------------------------------;
46804685POST_SYS_VIDEO PROC
46814686 POST_COL_2 POST_VIDEO , POST_CLR_VAL1 ; display "Video" left column
@@ -4736,14 +4741,13 @@ CHECK_EGA:
47364741
47374742POST_SYS_VIDEO_DONE:
47384743 CALL OUT_SZ ; display detected video adapter
4739- POST_COL_END_NL
4740- RET
4744+ JMP POST_END_COL_NL ; end of column with NL and RET
47414745
47424746POST_SYS_VIDEO ENDP
47434747 ENDIF
47444748
47454749;
4746- ; 0 BYTES HERE
4750+ ; 6 BYTES HERE
47474751;
47484752BYTES_HERE INT_19
47494753
@@ -5134,25 +5138,19 @@ PORT_TEST_DONE:
51345138 RET
51355139PORT_TEST ENDP
51365140
5141+ IF POST_VIDEO_TYPE EQ 1
51375142;----------------------------------------------------------------------------;
5138- ; Reset NMI enable flags
5139- ;----------------------------------------------------------------------------;
5140- ; Output:
5141- ; AL = current PPI B flags
5143+ ; POST Video Adapter Type Strings
5144+ ; 17 bytes
51425145;
5143- ; Size: 11 bytes
5144- ;----------------------------------------------------------------------------;
5145- NMI_RESET PROC
5146- IN AL , PPI_B ; read current flags
5147- OR AL , MASK PBIO OR MASK PBPC ; parity, I/O flags high (disable)
5148- OUT PPI_B , AL ; write to PPI
5149- XOR AL , MASK PBIO OR MASK PBPC ; flags low (enable)
5150- OUT PPI_B , AL ; write to PPI
5151- RET
5152- NMI_RESET ENDP
5146+ POST_VGA DB 'VGA' , 0
5147+ POST_EGA DB 'EGA' , 0
5148+ POST_CGA DB 'CGA' , 0
5149+ POST_MDA DB 'Mono' , 0
5150+ ENDIF
51535151
51545152;
5155- ; 6 BYTES HERE
5153+ ; 0 BYTES HERE
51565154;
51575155BYTES_HERE INT_16
51585156
@@ -7645,8 +7643,8 @@ INT_10_0_1:
76457643; Determine video adapter type and new mode and re-program 6845
76467644;
76477645 MOV AL , BYTE PTR EQUIP_FLAGS ; get BDA equipment flags
7648- XOR AL , MASK VIDM ; isolate video switches
7649- AND AL , 11B SHL VIDM ; is switch MDA (ON-ON)?
7646+ XOR AL , MASK VID ; isolate video switches
7647+ AND AL , VID_MDA ; is switch MDA (ON-ON)?
76507648 MOV AL , 0 ; 0 = CGA disable video signal
76517649 MOV SI , O_INT_1D_80 ; SI = CGA 80 CRTD offset
76527650 MOV BH , VID_DEF_COLS ; default 80 columns
@@ -9608,19 +9606,28 @@ IO_DELAY_TICK ENDP
96089606IO_DELAY_MS ENDP
96099607IO_WAIT_MS_125 ENDP
96109608
9611- IF POST_VIDEO_TYPE EQ 1
96129609;----------------------------------------------------------------------------;
9613- ; POST Video Adapter Type Strings
9614- ; 17 bytes
9610+ ; Reset NMI enable flags
9611+ ;----------------------------------------------------------------------------;
9612+ ; Output:
9613+ ; AL = current PPI B flags
96159614;
9616- POST_VGA DB 'VGA' , 0
9617- POST_EGA DB 'EGA' , 0
9618- POST_CGA DB 'CGA' , 0
9619- POST_MDA DB 'Mono' , 0
9620- ENDIF
9615+ ; Size: 11 bytes
9616+ ;----------------------------------------------------------------------------;
9617+ NMI_RESET PROC
9618+ IN AL , PPI_B ; read current flags
9619+ OR AL , MASK PBIO OR MASK PBPC ; parity, I/O flags high (disable)
9620+ OUT PPI_B , AL ; write to PPI
9621+ XOR AL , MASK PBIO OR MASK PBPC ; flags low (enable)
9622+ OUT PPI_B , AL ; write to PPI
9623+ RET
9624+ NMI_RESET ENDP
9625+
9626+ NMI_ERR_IO DB 'IO' ; NMI I/O Error string
9627+ NMI_ERR_PAR DB ' PARITY' , 0 ; NMI Parity Error
96219628
96229629;
9623- ; 8 BYTES HERE
9630+ ; 4 BYTES HERE
96249631;
96259632BYTES_HERE INT_12
96269633
@@ -11011,8 +11018,9 @@ POST_VIDEO DB 'Video', 0
1101111018 ENDIF
1101211019POST_NONE DB 'None' , 0 ; must be after POST_VIDEO
1101311020
11021+ ;
1101411022; 1 BYTE HERE
11015-
11023+ ;
1101611024BYTES_HERE INT_RET
1101711025
1101811026;----------------------------------------------------------------------------;
0 commit comments