Skip to content

Commit f8ddc79

Browse files
committed
MEM_TEST inverse pattern fix, 'PARITY' string
1 parent 655bc33 commit f8ddc79

File tree

1 file changed

+80
-72
lines changed

1 file changed

+80
-72
lines changed

src/GLABIOS.ASM

Lines changed: 80 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -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)
224224
MAX_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)
228225
MAX_RAM_AUTO = 0 ; Auto-detect MAX_RAM from video DIP switches
229226
DRAM_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)
363360
POST_TEST_KB = 0 ; disable PKEY and PKI errors
364361
POST_TEST_PIT_1 = 0 ; disable Timer 1 Test (no DRAM)
365362
POST_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
369365
SW1_FLP = 01b ; SW1 7/8 Max # of floppy drives (0-3)
370366
FD_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
413409
CASSETTE = 0 ; use all features on 5150
414410
CGA_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
;
422418
BASIC_ROM = 0 ; disable to free code space
423419
TURBO_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
;----------------------------------------------------------------------------;
31463150
GET_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
32623267
MAX_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
33333339
HALT_BEEP_2:
33343340
JMP HALT_BEEP ; NEAR jump to beep
33353341
VID_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
42624268
POST_RSEP DB POST_R, 0
42634269
POST_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-
42724271
STRINGS 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
;----------------------------------------------------------------------------;
46214624
MEM_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
;----------------------------------------------------------------------------;
46354641
MEM_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
;----------------------------------------------------------------------------;
46544660
POST_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
46624668
POST_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

46674672
POST_BOOT DB 'Boot', 0
46684673
POST_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
;----------------------------------------------------------------------------;
46804685
POST_SYS_VIDEO PROC
46814686
POST_COL_2 POST_VIDEO, POST_CLR_VAL1 ; display "Video" left column
@@ -4736,14 +4741,13 @@ CHECK_EGA:
47364741

47374742
POST_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

47424746
POST_SYS_VIDEO ENDP
47434747
ENDIF
47444748

47454749
;
4746-
; 0 BYTES HERE
4750+
; 6 BYTES HERE
47474751
;
47484752
BYTES_HERE INT_19
47494753

@@ -5134,25 +5138,19 @@ PORT_TEST_DONE:
51345138
RET
51355139
PORT_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
;
51575155
BYTES_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
96089606
IO_DELAY_MS ENDP
96099607
IO_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
;
96259632
BYTES_HERE INT_12
96269633

@@ -11011,8 +11018,9 @@ POST_VIDEO DB 'Video', 0
1101111018
ENDIF
1101211019
POST_NONE DB 'None', 0 ; must be after POST_VIDEO
1101311020

11021+
;
1101411022
; 1 BYTE HERE
11015-
11023+
;
1101611024
BYTES_HERE INT_RET
1101711025

1101811026
;----------------------------------------------------------------------------;

0 commit comments

Comments
 (0)