home *** CD-ROM | disk | FTP | other *** search
- MAKING PC SOFTWARE COMPATIBLE WITH PC jr
-
- WHILE MOST SOFTWARE WRITTEN FOR THE PC WILL RUN WITHOUT
- MODIFICATION ON PC JR SOME WILL CAUSE PROBLEMS BECAUSE OF THE
- DIFFERENCES BETWEEN THE MACHINES. THE MOST IMPORTANT
- DIFFERENCE BETWEEN THE PC AND PC JR IS THE VIDEO HARDWARE.
- THE MACHINES ARE ESENTIALLY EQUIVALENT WHEN PROGRAMMING DOWN
- TO THE BIOS CALL LEVEL, IF THE PROGRAMMER ATTEMPTS TO
- DIRECTLY MANIPULATE THE VIDEO HARDWARE ADDRESSES PROBLEMS
- WILL OCCUR.
- FOR EXAMPLE ;
- MODE SWITCHES ARE VERY EASILY ACCOMPLISHED ON THE PC, YOU
- MERELY WRITE THE MODE VALUE YOU WANT TO THE PORT AT ADDRESS
- 3D8 (THE MODE CONTROL REGISTER). WRITING A 00H TO THIS
- ADDRESS WILL PUT THE PC INTO 40 COLUMN X 25 LINES OF COLOR
- VIDEO MODE. WRITING A 0AH SETS UP THE 320 X 200 COLOR
- GRAPHICS MODE.
- WITH JUNIOR HOWEVER, IT IS NOT THAT SIMPLE. THE PORT AT
- ADDRESS 3D8 DOES NOT EXIST AND JUNIORS COMPLICATED VIDEO GATE
- ARRAY MAKES CHANGING MODES MUCH MORE DIFFICULT. IF A PROGRAM
- THAT RUNS FINE ON THE PC FAILS ON THE JUNIOR IT MAY BE
- BECAUSE OF THIS TYPE OF MODE CHANGING ERROR. TO FIND OUT IF
- THIS IS THE CASE YOU CAN LOOK AT THE CODE USING DEBUG. I
- MERELY SEARCH FOR THE MOST OBVIOUS WAYS THAT A MODE CHANGE
- CAN BE ACCOMPLISHED ON THE PC. THE FOLLOWING CODE IS AN
- EXAMPLE;
-
- MOV AL,XX ;WHERE XX IS THE NEW MODE VALUE TO BE SET
- MOV DX,3D8 ;SETUP ADDRESS OF THE MODE CONTROL PORT
- OUT DX,AL ;OUTPUT THE NEW VALUE
-
- SOMETIMES YOU WIL FIND THESE INSTRUCTIONS IN SLIGHTLY
- DIFERENT ODERINGS SUCH AS;
-
- MOV DX,3D8
- MOV AL,XX
- OUT DX,AL
-
- BOTH OF THESE WILL DO THE SAME THING TO THE VIDEO HARDWARE.
- THEY WILL CHANGE THE MODE TO THE VALUE OF XX, WHATEVER THAT
- MAY BE.
- IN HEX THESE INSTRUCTIONS LOOK LIKE THIS;
-
- B0 XX ;THE MOVE AL,XX INSTRUCTION
- BA D8 03 ; MOV DX,3D8
- EE ; OUT DX,AL
-
- THE EASIEST THING TO LOOK FOR IS THE MOV DX,3D8 INSTRUCTION.
- THE DEBUG COMMAND FOR THIS IS;
-
- -S STARTING ADDRESS ENDING ADDRESS SEARCH STRING
- FOR EXAMPLE;
-
- -S 0 FFFE BA D8 03
-
- THIS WILL SEARCH FROM ADDRESS 0 TO ADDRESS FFFE IN THE
- CURRENT SEGMENT FOR THE MOV DX,3D8 INSTRUCTION. IF IT FINDS
- ONE DEBUG WILL DISPLAY THE ADDRESS WHERE IT CAN BE FOUND.
- LIKE SO;
-
- 901:186
- 901:1B7
-
- THIS WOULD MEAN THAT DEBUG HAS FOUND TWO INSTANCES OF THE
- MOV DX,3D8 INSTRUCTION. LET'S LOOK AT ONE OF THEM.
- WE WILL USE THE DEBUG UNASSEMBLE COMMAND AND THE ADDRESS THAT
- DEBUG HAS PROVIDED.
-
- -U 901:187
-
- THE RESULT OF THIS SHOULD LOOK SOMETHING LIKE THIS;
-
- 901:0187 BAD803 MOV DX,03D8
- 901:0189 B000 MOV AL,00
- 901:018B EE OUT DX,AL
- .
- .
- .
- . AND SO ON
- .
-
- THIS IS DEFINATELY ONE OF THE OFFENDING PROGRAMS. THE
- PROGRAMMER IS SETTING THE PC TO THE 40 X 25 COLOR
- ALPHANUMERIC DISPLAY. ON JUNIOR HOWEVER, THEY ARE NOT
- ACCOMPLISHING ANYTHING AT ALL. TO FIX THIS WE MUST MAKE SOME
- SIMPLE CHANGES TO THE CODE. INSTEAD OF DOING THE MODE CHANGE
- DIRECTLY WE WILL LET BIOS DO IT FOR US. ALL WE NEED TO DO IS
- TELL BIOS WHAT MODE WE WANT AND THEN DO A BIOS VIDEO CALL.
- THAT NEW CODE WILL LOOK LIKE THIS;
-
- MOV AX,0000H ;TELL BIOS WE WANT 40 X 25 MODE
- INT 10H ;CALL THE BIOS VIDEO ROUTINE
-
- WE PLACE THE VALUE 00 INTO THE AH REGISTER (THE AX 16 BIT
- REGISTER IS THE COMBINATION OF THE AH AND AL 8 BIT REGISTERS)
- . THIS TELLS BIOS THAT WE WANT IT TO DO A MODE CHANGE. THE
- VALUE WE PLACE IN THE AL REGISTER WILL TELL BIOS THE NEW MODE
- WE WANT.
- TO REPLACE THE OLD CODE WITH THE NEW WE WILL USE THE DEBUG
- ASSEMBLE COMMAND WHICH HAS THE FOLLOWING FORM;
-
- -A STARTING ADDRESS
-
- TO PUT THE NEW CODE WHERE THE OLD CODE WAS JUST USE THE SAME
- ADDRESS.
-
- -A 901:0186
-
- DEBUG WILL RESPOND LIKE SO;
-
- 901:0186 _
-
- FROM HERE WE JUST TYPE IN THE INSTRUCTIONS.
-
- 901:0186 MOV AX,0000
- 901:0189 INT 10H
- 901:018B _
-
- IN ORDER TO WIPE OUT THE out dx,al INSTRUCTION, WHICH INSN'T
- NNEDED ANYMORE, WE WILL ADD A nop (DO NOTHING) COMMAND TO
- WRITE OVER IT.
-
- 901:018B NOP
-
- NOW IF WE WERE TO ONCE AGAIN DO AN UNASSEMBLE COMMAND WE
- COULD SEE ALL THE CHANGES WE HAVE MADE.
-
- -U 901:0186
-
- 901:0186 B80100 MOV AX,0000
- 901:0189 CD10 INT 10
- 901:018B 90 NOP
- .
- .
- .
- . THIS ALL SHOULD STAY THE SAME
- .
- .
- .
-
- NOT ONLY WILL THIS CODE NOW FUNCTION PROPERLY ON JUNIOR, IT
- WILL STILL OPERATE ON THE PC AS WELL. THIS IS BECAUSE THE TWO
- MACHINES ARE COMPATIBLE AT THE BIOS CALL LEVEL. IT IS
- INTERESTING TO NOTE THAT THE NEW CODE COULD BE ONE BYTE
- SHORTER THAN THE OLD. THIS IS BECAUSE THE NOP WOULD NOT HAVE
- BEEN NEEDED IF THE PROGRAM HAD BEEN WRITTEN THIS WAY IN THE
- FIRST PLACE.
- THE MOST DIFFICULT PART OF MAKING THESE TYPES OF CHANGES IS
- CONVERTING FROM THE PC MODE VALUES (DESIGNATED XX ABOVE) TO
- THE BIOS MODE VALUES. THE FOLLOWING TABLE SUMMARIZES THE
- NEEDED CHANGES.
-
- PC MODE REGISTER VALUES (HEX) BIOS CALL MODE VALUES (HEX)
-
- 2C 00 40 x 25 b/w
- 28 01 40 x 25 color
- 2D 02 80 x 25 b/w
- 29 03 80 x 25 color
- 0A or 2A 04 320 x 200 4 color
- 0E or 2E 05 320 x 200 b/w
- 1E or 3E 06 640 x 200 b/w
-
-
-
- THERE ARE OTHER VALUES AVAILABLE FOR BOTH THE PC MODE
- REGISTER AND THE BIOS CALLS, ESPECIALLY ON THE JUNIOR. USING
- BIOS JUNIOR CAN BE PLACED INTO ONE OF 3 MODES THAT THE PC
- DOES NOT EVEN HAVE AVAILABLE.
- GOING BACK TO OUR ORIGINAL SEARCH FOR THE mov dx,3D8
- INSTRUCTION USING DEBUG WE FOUND TWO INSTANCES IN THIS
- PROGRAM. LET'S LOOK AT THE SECOND EXAMPLE NOW. USE THE DEBUG
- UNASSEMBLE COMMAND AGAIN.
-
- -U 901:1B7
-
- THIS WILL SHOW US THE FOLLOWING CODE;
-
- 0901:01B7 BAD803 MOV DX,03D8
- 0901:01BA B02A MOV AL,2A
- 0901:01BC 80FB00 CMP BL,00
- 0901:01BF 7502 JNZ 01C3
- 0901:01C1 B02E MOV AL,2E
- 0901:01C3 EE OUT DX,AL
- 0901:01C4 BAD903 MOV DX,03D9
- 0901:01C7 B030 MOV AL,30
- 0901:01C9 EE OUT DX,AL
- .
- .
- .
-
-
- THIS IS A SLIGHTLY MORE COMPLICATED EXAMPLE. HERE THE
- PROGRAM LOADS THE MODE REGISTER ADDRESS INTO DX AND THEN SETS
- UP A MODE VALUE OF 2A IN AL. IT THEN TESTS THE BL REGISTER TO
- SEE IF IT IS ZERO. IF IT IS NOT, THEN THE PROGRAM JUMPS TO
- THE out dx,al INSTRUCTION WHICH SETS THE MODE TO 320X200
- COLOR GRAPHICS. IF BL WAS NOT ZERO THEN A NEW MODE VALUE IS
- PLACED INTO AL. THIS TIME THE MODE SELECTED IS 80 X 25 B/W
- ALPHANUMERICS (2E). THE NEXT INSTRUCTION (mov dx,3D9) PUTS
- THE ADDRESS OF THE PC'S COLOR SELECT REGISTER INTO DX IN
- PREPARATION FOR THE out dx,al INSTRUCTION. BEFORE THAT
- HAPPENS THE AL REGISTER IS LOADED WITH THE COLOR SELECT VALUE
- (30).
- THE COLOR SELECT REGISTER AT ADDRESS 3D9 IS THE OTHER VIDEO
- REGISTER THAT JUNIOR DOES NOT HAVE. COLOR SELECTION CAN BE
- ACCOMPLISHED ON JUNIOR THROUGH A BIOS CALL JUST LIKE THE MODE
- SELECTS.
- TO MAKE THIS CODE COMPATIBLE WITH JUNIOR WE MUST MAKE THE
- FOLLOWING CODE CHANGES:
-
- MOV AX,0004 ;SET BIOS MODE SET COMMAND AND 320 X 200 COLOR
- CMP BL,00 ;TEST BL FOR ZERO
- JNZ int ;JUMP IF NOT ZERO TO THE int INSTRUCTION
- MOV AL,05 ;SET MODE TO 320 X 200 B/W GRAPHICS
- INT 10H ;BIOS VIDEO CALL
-
- THIS IS ALL WE NEED TO MAKE THE MODE CHANGES ON JUNIOR. BUT,
- THIS CODE REQUIRES 13 BYTES WHICH IS ONE BYTE SHORTER,
- FORTUNATELY, THAN THE EXISTING PC CODE. UNFORTUNATELY, THE
- COLOR SELECT CODE THAT FOLLOWS IT WILL USE UP ONE MORE BYTE.
- SO THE TWO CHANGES TOGETHER WILL JUST FIT INTO THE SAME
- SPACE. THE CODE CHANGE FOR THE COLOR SELECT CHANGE IS:
-
- MOV AH,0B ;SET THE BIOS COLOR SELECT COMMAND BYTE
- MOV BX,0001 ;SELECTS CYAN, MAGENTA, AND WHITE COLORS
- INT 10H ;BIOS VIDEO CALL
-
- USING DEBUG TO ASSEMBLE THE REPLACEMENT CODE;
-
- -A 901:1B7
-
- 0901:01B7 MOV AX,0004
- 0901:01BA CMP BL,00
- 0901:01BD JNC 01C1
- 0901:01BF MOV AL,05
- 0901:01C1 INT 10H
- 0901:01C3 MOV AH,0B
- 0901:01C5 MOV BX,0001
- 0901:01C8 INT 10H
-
- AFTER YOU MAKE ALL THE FIXES DO A WRITE COMMAND TO HAVE
- DEBUG SAVE THE CHANGES ON THE DISK.
-
- THESE TYPES OF PROBLEMS CAN USUALLY BE FIXED WITH THE SAME OR
- FEWER BYTES OF CODE. IF THE FIX REQUIRES MORE CODE THAN YOU
- HAVE SPACE FOR IT BECOMES A REAL HEADACHE TO TRY AND FIX. YOU
- MUST MAKE CORRECTIONS IN ALL THE CALL AND JUMP INSTRUCTIONS.
- ANY INSTRUCTION THAT USES AN OFFSET MIGHT ALSO HAVE TO BE
- REPAIRED. IN A LONG PROGRAM THIS CAN BECOME EXTREMELY
- DIFFICULT. BUT IN WELL WRITTEN CODE THESE TYPES OF MODE AND
- COLOR CHANGES HAPPEN ONLY RARELY.
-
- ANOTHER DIFFERENCE BETWEEN PC AND JUNIOR CAN BE FOUND IN THE
- BIOS ROMS. THE NEXT TO LAST BYTE (F000:FFFE) CONTAINS A
- SIGNATURE BYTE WHICH CAN TELL A PROGRAM IF IT IS RUNNING IN A
- JUNIOR, A PC, OR A PC XT. FOR JUNIOR THIS BYTE IS FDH, FOR PC
- IT IS FFH, AND THE XT HAS AN FEH AT THIS LOCATION. AT PRESENT
- THE ONLY PLACE I HAVE SEEN THIS USED IS IN DOS 2.1,
- COMMAND.COM.
- USE DEBUG TO LOAD COMMAND.COM AND SEARCH FOR A CMP BYTE PTR
- [FFFE],FD INSTRUCTION.
-
- A>DEBUG COMMAND.COM
- -S 0 FFFE 80 3E FE FF FD
-
- 0905:354B
-
- IF YOU UNASSEMBLE THIS COMMAND YOU WILL FIND THAT WHAT IS
- HAPPENING HERE IS THAT WHEN COMMAND.COM DETERMINES IT IS IN A
- JUNIOR IT WILL SCAN THE CARTRIDGE ADDRESS SPACE LOOKING FOR
- PROGRAMS THERE. SINCE THE PC DOESN'T HAVE CARTRIDGES IT NEED
- TO DO THIS IF IT IS RUNNING IN A PC. THIS EXPLAINS WHY WHEN
- YOU HAVE THE CARTRIDGE BASIC INSTALLED AND YOU TYPE THE
- basica COMMAND YOU GO INTO BASIC WITHOUT DOING A DISK ACCESS.
- NORMALLY COMMAND.COM WILL SEARCH THE DIRECTORY OF THE
- CURRENT DRIVE FOR ANY COMMAND THAT IS NOT INTERNAL. BUT WHEN
- IT IS RUNNING ON A JUNIOR IT WILL SCAN THE CARTRIDGE SPACE
- LOOKING FOR BASIC BEFORE IT GOES TO THE DISK. THIS MIGHT BE
- USED TO UPGRADE DOS WITH ALL SORTS OF NEW FUNCTIONS THAT ON
- JUNIOR WOULD SEEM TO BE INTERNAL TO COMMAND.COM. THESE NEW
- FUNCTIONS WOULD BE PROGRAMMED INTO A CARTRIDGE RATHER THAN
- MODIFYING DOS. THIS MIGHT MEAN THAT SOME DOS REVISIONS WOULD
- COME IN CARTRIDGE FORM IN THE FUTURE. NOT A BAD FEATURE WHEN
- YOU UNDERSTAND IT.
-
-
- OTHER STRANGE THINGS ABOUT JUNIOR'S VIDEO SECTION WILL COME
- LATER. AFTER YOU HAVE BECOME THOROUGHLY CONFUSED BY THE
- TECHNICAL REFERENCE MANUAL TUNE IN HERE AND WE WILL EXPLAIN
- "PAGES" AND "PLANES".
-
- HOW ABOUT "WILL THE REAL "PAGE" PLEASE STAND UP"?
-