IMD 1.18: 15/07/2013 8:55:11 msdos 2.11 list diskette APC R2.0030684010201N MATCH#3877@`  @`/#@%`)+-/1 3@5`79;=?A C@E`GIKMOQ S@U`WY[]_a c@e`gikmoq s@u`wy{} @` ` @ ` @ ` @ ` ǀ ɠ @ ` ׀ ٠  @` @`!Aa   !a!!O%a')+-/1!3A5a79;=?A!OEaGIKMOQ!SAUaWY[]_a!cAeaikmoq!sAuawy{}!Aa/a!Aa!Aa!Aaǁɡ!Aaׁ١!Aa!Aa " B b  !"!B!b!!!!!"!""#B"%b"'")"+"-"/#1"#3B#5b#7#9#;#=#?$A"$CB$Eb$G$I$K$M$O%/%SB%Ub%W%Y%[%]%_&acB&eb&g&i&k&m&o'q"'sB'ub'w'y'{'}"(@`  @`/#@%`)+-/1 3@5`79;=?A C@E`GIKMOQ S@U`WY[]_a c@e`gikmoq s@u`wy{} @` ` @ ` @ ` @ ` ǀ ɠ @ ` ׀ ٠  @` @`!Aa   !a!!O%a')+-/1!3A5a79;=?A!OEaGIKMOQ!SAUaWY[]_a!cAeaikmoq!sAuawy{}!Aa/a!Aa!Aa!Aaǁɡ!Aaׁ١!Aa!Aa " B b  !"!B!b!!!!!"!""#B"%b"'")"+"-"/#1"#3B#5b#7#9#;#=#?$A"$CB$Eb$G$I$K$M$O%/%SB%Ub%W%Y%[%]%_&acB&eb&g&i&k&m&o'q"'sB'ub'w'y'{'}"(USLIST LST ]?{KBDTLO LST ]?![CALENDARLST ]?']KUSCONIN LST ^?:gBIGBIOS LST 9^?MSREAD LST c^?MSTIME LST m^?X:USLIDATALST s^?#uDMAXFER LST ^?*aMELODY LST ^?CZ[INT LST ^?Z0RS232CIOLST u?g_MSCONST LST ^?{APO LST ^?CUSCMOS LST ^?CONOUT LST _?HARDDISKLST 0_?S BPT LST <_?QCRAMDISK LST |<bomCONFIG DOC l~GSXAMPLEPAS ;  The Microsoft MACRO Assembler , Version 1.25 Page 1-1 USLIST 01-31-84 title USLIST page 58,132 ;----------------------------------------------------------------------------- ; ; MS-DOS BIOS for the N.E.C. Advanced Personal Computer ; ; module name: USLIST ; MS-DOS version: 2.0 ; module version: 1.0 ; ; abstract: This module contains the parrallel printer output port ; device drivers. ; ; contains routines: ; prn_sta prn_wrt listout excvo listst sordio ; ; revision history: ; ; This module was taken from a NEC/Tokyo version of April, 1983, ; which was part of the IO system for MS-DOS V1.25. The DOS interface ; routines were added by NECIS for use with MS-DOS V2.0 ; - RMG 6-7-83 ; ; Significant changes regarding print device status have been made. ; A printer which is disconnected, powered down, or offline will now ; return not ready errors when accessed. An unready printer will never ; hang the system. (Control-p followed by control-c will generally get ; you back to the system command prompt. ; - RMG 6-13-83 ; ; The 8023 and Pinwriter devices now support printing characters ; from the alternate character set. This support was added by NEC/T ; in their enhancements to the first release. ; - RMG 1-4-84 ; ; The printer driver now checks the DEVCON enable to decide whether ; to execute the status check for "powered/plugged", so that the check ; will be excluded for printers which do not provide this status. ; - RMG 1-11-84 ; ; The printer type byte is now part of io.sys, rather than a CMOS ; setting. The upper two bits of the type have been defined as a select ; between the parallel port and serial port(s). ; - RMG 1-12-84 ; ;----------------------------------------------------------------------------- 0000 CODE SEGMENT PUBLIC 'CODE' EXTRN PMSG:NEAR,CONIN:NEAR,TBLWORK:BYTE EXTRN SVDATA:BYTE,SIDA1:BYTE,WORKSI:BYTE,WORKSO:BYTE EXTRN exit:near,busy_exit:near,err_exit:near,ptrsav:dword extrn mslistout:far, EXTRN ALTRBYTFLG:BYTE ; FILE "CONOUT" ; rmg 1-4-84  The Microsoft MACRO Assembler , Version 1.25 Page 1-2 USLIST 01-31-84 EXTRN U_AUXCGTBL:BYTE ; FILE "USCONIN" ; rmg 1-4-84 EXTRN DEVCON:BYTE ; rmg 1-11-84 EXTRN PRINTTYPE:BYTE ; rmg 1-12-84 extrn aux_writ:near,aux_wrst:near extrn aux2_writ:near,aux2_wrst:near ; rmg 1-16-84 PUBLIC prn_wrt,prn_sta PUBLIC LISTOUT ASSUME CS:CODE,DS:CODE,SS:CODE,ES:CODE  ;********************************************* ;* LIST USE AREA * ;********************************************* = 006E SODAMD EQU 6EH ; WRITE SIGNAL 0 = 006E SODAW1 EQU 6EH ; WRITE SIGNAL 1 = 006C SODAW2 EQU 6CH ; WRITE SIGNAL 2 = 0068 SODARS EQU 68H ; READ SIGNAL = 006A SODAWD EQU 6AH ; WRITE DATA = 0020 ISIFT1 EQU 20H ; SIFT FRE <-- = 0060 ISIFT2 EQU 60H ; SIFT FRE --> = 00A0 OSIFT1 EQU 0A0H ; SIFT FRE <-- = 00E0 OSIFT2 EQU 0E0H ; SIFT FRE --> = 24B6 CTLPFREE EQU 24B6H ; CTRL P FREE ; 0000 00 HHDATA DB 0 ; SAVE BL DATA 0001 00 SISOF DB 0 ; COUNT FLG 0002 00 OLDFLG DB 0 ; SI-SO OLDFLG ;--- rmg / necis / 1-4-84 --- add tokyo items for alt char support ; 0003 0000 TRNCNT DW 0 ; TRANSFER COUNT ; 0005 0000 SAVE_CX DW 0 0007 0000 SAVE_SI DW 0 0009 00 NEWCONTF DB 0 000A 1B 00 30 30 30 30 CONTROL DB 1BH,00H,30H,30H,30H,30H 0010 10 [ OUT_PTR DW 16 DUP (?) ???? ] 0030 00 END_CODE DB 0 ; 0031 D800 ALT_SEGMENT DW 0D800H 0033 0000 0000 0000 0000 TOP_CODE DW 0,0,0,0 003B 0000 0000 0000 0000 BOTTOM_CODE DW 0,0,0,0 ; ;--- rmg / necis / 1-4-84 ;--------------------------------------------------------------------- ; ; ; DOS IO request packet structure  The Microsoft MACRO Assembler , Version 1.25 Page 1-3 USLIST 01-31-84 ; iopack struc 0000 0D [ db 13 dup (?) ; 13 byte static header ?? ] 000D ?? lk_ret db ? ; (unused for character device IO) 000E ???????? trans dd ? ; data transfer address 0012 ???? count dw ? ; request length (number of characters) 0014 iopack ends  ; ; prn_sta ; ; list device status read ; 0043 prn_sta: 0043 F6 06 0000 E 80 test printtype,80h ; serial printer? 0048 74 0D jz parst 004A F6 06 0000 E 40 test printtype,40h ; standard rs232 port? 004F 75 03 jnz stdst 0051 E9 0000 E jmp aux2_wrst 0054 stdst: 0054 E9 0000 E jmp aux_wrst 0057 parst: 0057 E8 02C4 R call listst ; get list device status 005A 73 05 jnc chkrdy ; is the device ready (online)? 005C B0 02 mov al,2 ; return error if not 005E E9 0000 E jmp err_exit ; error exit to DOS 0061 chkrdy: 0061 0A C0 or al,al ; is device ready for data? 0063 75 03 jnz busy1 ; 0065 E9 0000 E jmp exit ; yes, ready for data; normal exit to DOS 0068 E9 0000 E busy1: jmp busy_exit ; busy exit to DOS... ; ; prn_wrt ; ; list device buffer write ; 006B prn_wrt: 006B F6 06 0000 E 80 test printtype,80h ; serial printer? 0070 74 0D jz parwr 0072 F6 06 0000 E 40 test printtype,40h ; standard rs232 port? 0077 75 03 jnz stdwr 0079 E9 0000 E jmp aux2_writ 007C stdwr: 007C E9 0000 E jmp aux_writ 007F parwr: 007F E3 12 jcxz lvprn ; just exit for request of zero bytes 0081 8B F7 mov si,di ; transfer address to si 0083 51 push cx 0084 prn_wr1: 0084 26: AC lods byte ptr es:[si] ; next character into al 0086 51 push cx ; save count  The Microsoft MACRO Assembler , Version 1.25 Page 1-4 USLIST 01-31-84 0087 56 push si ; save transfer pointer 0088 9A 0000 ---- E call mslistout ; send the character 008D 5E pop si 008E 59 pop cx 008F 72 12 jc list_nrdy 0091 E2 F1 loop prn_wr1 ; go back for remaining chars 0093 lvprn: 0093 5B pop bx 0094 2B D9  sub bx,cx 0096 8B CB mov cx,bx 0098 2E: C5 1E 0000 E lds bx,cs:[ptrsav] 009D 89 4F 12 mov [bx.count],cx ; transferred entire request 00A0 E9 0000 E jmp exit 00A3 list_nrdy: 00A3 B0 02 mov al,2 ; not ready error 00A5 5B pop bx 00A6 2B D9 sub bx,cx ; bx := # requ - # remaining 00A8 8B CB mov cx,bx 00AA 2E: C5 1E 0000 E lds bx,cs:[ptrsav] 00AF 89 4F 12 mov [bx.count],cx ; transferred count characters 00B2 E9 0000 E jmp err_exit ; error exit ;********************************************* ;* * ;* LISTOUT (LIST DEVICE OUTPUT) * ;* * ;********************************************* 00B5 LISTOUT: 00B5 FC CLD ;**************************************************************** ;* CHECK OUTPUT CHARACTER CODE * ;* IF ASCII, OUTPUT CODE. * ;* IF ALTERNATE, CONVERT BIT PATTERN * ;* AND OUTPUT BIT PATTERN. * ;**************************************************************** 00B6 8A C1 MOV AL,CL 00B8 F6 06 0000 E 80 TEST ALTRBYTFLG,80H 00BD 75 1F JNZ U_CGEND ; IF BDOS OR BIOS ERROR MESSAGE 00BF F6 06 0000 E 07 TEST ALTRBYTFLG,07H 00C4 74 03 JZ LISTOUT10 ; 00C6 E9 01A7 R JMP DOT_PATTERN ; IF DOT MATRIX PATTERN 00C9 LISTOUT10: 00C9 3A 0E 0000 E CMP CL,U_AUXCGTBL ; 00CD 77 0F JA U_CGEND ; IF NO UNIVERSAL CODE 00CF 2A ED SUB CH,CH ; CLEAR CH 00D1 BE 0001 E MOV SI,OFFSET U_AUXCGTBL+1 ; UNIVERSAL CG CODE OFFSET 00D4 03 F1 ADD SI,CX 00D6 AC LODS BYTE PTR [SI] ; AL = UNIVERSAL CG CODE 00D7 3A C1 CMP AL,CL ; 00D9 74 03 JE U_CGEND ; IF ASCII DATA  The Microsoft MACRO Assembler , Version 1.25 Page 1-5 USLIST 01-31-84 00DB E9 01A7 R JMP DOT_PATTERN ; IF DOT PATTERN  The Microsoft MACRO Assembler , Version 1.25 Page 1-6 USLIST 01-31-84 PAGE ;**************************************************************** ;* * ;* DATA OUTPUT BY CHARACTER CODE * ;* 1. CODE CONVERT. * ;* 2. CHECK SHIFT IN OR SHIFT OUT. * ;* 3. IF NEED, ADD PARITY BIT ON CHARACTER CODE. * ;* * ;**************************************************************** 00DE U_CGEND: 00DE 8A C1 MOV AL,CL 00E0 E8 0111 R CALL EXCVO ; CODE CONVERT 00E3 80 FA 00 CMP DL,00H 00E6 74 28 JE LOUT020 ; IF ERROR DATA  The Microsoft MACRO Assembler , Version 1.25 Page 1-7 USLIST 01-31-84 PAGE ;****************************************************************  ;* * ;* DATA SEND TO PRINTER DEVICE * ;* ( DATA IS CHARACTER CODE, BIT PATTERN, ESC SEQENCE * ;* AND ESC SEQUENCE PARAMETER.) * ;* 1. CHECK PRINTER DEVICE READY. * ;* 2. IF NEED, OUTPUT SHIFT IN OR SHIFT OUT CODE. * ;* 4. OUTPUT CHARACTER CODE. * ;* * ;**************************************************************** 00E8 LOUT010: 00E8 wait_ready_for_data: 00E8 E8 02C4 R CALL LISTST ; LIST STATUS 00EB 73 04 jnc onliner ; error "not ready" if device went offline 00ED F9 stc ; set carry (error status) 00EE EB 20 90 jmp lout020 ; and back on out 00F1 onliner: 00F1 3C 00 CMP al,00h ; printer ready for data? 00F3 75 F3 jne wait_ready_for_data 00F5 LOUT015: 00F5 8A F9 MOV BH,CL ; SI-SO DATA --> BH 00F7 B0 01 MOV AL,01H 00F9 84 06 0001 R TEST AL,SISOF ; AL = FLG ? 00FD 74 0C JZ LOUT016 00FF 8A C7 MOV AL,BH 0101 E6 6A OUT SODAWD,AL ; WRITE SI-SO DATA 0103 B7 00 MOV BH,00H 0105 88 3E 0001 R MOV SISOF,BH ; SISOFLG = 00H 0109 EB DD JMP LOUT010 010B LOUT016: 010B 8A C3 MOV AL,BL 010D E6 6A OUT SODAWD,AL ; WRITE CONVERT DATA 010F F8 CLC ; CLEAR ERROR STATUS ; 0110 LOUT020: 0110 C3 RET  The Microsoft MACRO Assembler , Version 1.25 Page 1-8 USLIST 01-31-84 PAGE ;********************************************* ;* CODE CONVERT * ;* INPUT AL ; ASCII * ;* OUTPUT BL ; CONVERT CODE * ;* CL ; SI-SO CVCODE * ;********************************************* 0111 B2 FF EXCVO: MOV DL,0FFH 0113 8A D8 MOV BL,AL 0115 80 3E 0000 E 80 CMP TBLWORK,80H ; USER APOINT = BL ? 011A 74 31 JE DATADD2 ; IF 80H THEN GOTO DATADD2 011C 80 FB 7F CMP BL,7FH ; SO OR SI ? 011F 76 43 JBE SIADD ; IF SI THEN SI ADDRESS 0121 80 FB A0 CMP BL,OSIFT1 ; SIFT FRE ? (S) 0124 76 27 JBE DATADD2 0126 80 FB E0 CMP BL,OSIFT2 ; SIFT FRE ? (G) 0129 7D 22 JGE DATADD2 012B 8A 0E 0000 E MOV CL,WORKSO ; CL = SO DATA 012F 3A 0E 0002 R CMP CL,OLDFLG ; OLDFLUG = SO ? 0133 74 18 JZ DATADD2 ; IF '=' THEN ADD2 0135 88 0E 0002 R MOV OLDFLG,CL ; WRITE SODATA --->OLDFLG 0139 88 1E 0000 R MOV HHDATA,BL ; SAVE BL 013D 8A D9 MOV BL,CL ; LOAD BL,0EH 013F E8 0158 R CALL TBCOV ; SO => PARETY RUTINE 0142 8A CB MOV CL,BL 0144 8A 1E 0000 R MOV BL,HHDATA ; SAVEDATA => BL 0148 B0 01 MOV AL,01H ; SI,SO INITIALIZE 014A A2 0001 R MOV SISOF,AL 014D DATADD2: 014D B8 0000 E MOV AX,OFFSET SIDA1 ; 1ST SO ADDRESS POINT DATA 0150 2A FF CONVBL: SUB BH,BH ; BH = 0 0152 03 D8 ADD BX,AX ; AX = CONVERT DATA ADDRESS 0154 8A 07 MOV AL,[BX] ; BL = CONVERT DATA 0156 8A D8 MOV BL,AL 0158 A0 0000 E TBCOV: MOV AL,TBLWORK ; USER APOINTED PARITY 015B 3C 81 CMP AL,81H 015D 74 36 JZ PA01 ; IF ODD THEN PARITY-ODD 015F 3C 82 CMP AL,82H 0161 74 3B JZ PA02 ; IF EVEN THEN PARITY-EVEN 0163 C3 ALRET: RET ; ; 0164 80 FB 20 SIADD: CMP BL,ISIFT1 ; SIFT FRE ? (S) 0167 76 27 JBE DATADD1 0169 80 FB 60 CMP BL,ISIFT2 ; SIFT FRE ? (G) 016C 7D 22 JGE DATADD1 016E 8A 0E 0000 E MOV CL,WORKSI 0172 3A 0E 0002 R CMP CL,OLDFLG ; OLDFLUG = SI 0176 74 18 JZ DATADD1 ; IF OLDF = SI THEN DD1 0178 88 0E 0002 R MOV OLDFLG,CL ; WRITE SIDATA --> OLDFLUG 017C 88 1E 0000 E MOV SVDATA,BL ; SAVE BL DATA 0180 8A D9 MOV BL,CL 0182 E8 0158 R CALL TBCOV ; SI => PARITY RUTINE  The Microsoft MACRO Assembler , Version 1.25 Page 1-9 USLIST 01-31-84 0185 8A CB MOV CL,BL 0187 8A 1E 0000 E MOV BL,SVDATA ; SAVEDATA => BL 018B B0 01 MOV AL,01H ; SET COUNT FLUG 018D A2 0001 R MOV SISOF,AL ; COUNT FLG --> SISOF 0190 DATADD1: 0190 B8 0000 E MOV AX,OFFSET SIDA1 0193 EB BB JMP CONVBL ; ;**** ODD PARITY ROUTINE **** ; 0195 0A DB PA01: OR BL,BL 0197 7B CA JNP ALRET ; BL = ODD 0199 80 F3 80 XOR BL,80H ; INSERT ODD PARITY 019C EB C5 JMP ALRET ; ;**** EVEN PARITY ROUTINE **** ; 019E 0A DB PA02: OR BL,BL 01A0 7A C1 JPE ALRET ; BL = EVEN 01A2 80 F3 80 XOR BL,80H ; INSERT EVEN PARITY 01A5 EB BC JMP ALRET ;  The Microsoft MACRO Assembler , Version 1.25 Page 1-10 USLIST 01-31-84 PAGE ;**************************************************************** ;* * ;* OUTPUT CHARACTER BY DOT PATTERN * ;* 1. CHECK KIND OF PRINTER. (8023 OR SKSP) * ;* 2. GET BIT PATTERN FORM ALT CG MEMORY. * ;* 3. CHANGE DOT MODE. (PRINTER) * ;* 4. OUTPUT BIT PATTERN. * ;* * ;* INPUT PARAMETER * ;* CL = CHARACTER CODE * ;* * ;* REMARK THIS ROUTINE CALL LOUT010. * ;* THIS ROUTINE EXIT LOUT020. * ;* IF PRINTER IS NOT "8023" OR "SKSP", * ;* GO TO U_CGEND. * ;* ( OUTPUT BY CHARACTER CODE) * ;* * ;**************************************************************** 01A7 DOT_PATTERN: ;******************************** ;* CHECK INVALID CODE * ;******************************** 01A7 80 3E 0000 E 01 CMP ALTRBYTFLG,01H 01AC 74 14 JE DOT_PTR00 ; IF ALT PATTERN 1CHR 01AE 80 F9 7F CMP CL,7FH ; SHIFT FREE CODE ANALAIZE 01B1 77 07 JA SOADDRESS ; IF 7FH < CL 01B3 80 F9 20 CMP CL,ISIFT1 ; 20H 01B6 72 07 JB DOT_PTR_NOT ; 1FH > CL 01B8 EB 08 JMP SHORT DOT_PTR00 ; IF DOT DATA 01BA SOADDRESS: 01BA 80 F9 FE CMP CL,0FEH ; SHIFT FREE CODE 01BD 72 03 JB DOT_PTR00 ; IF NOT SHIFT CODE 01BF DOT_PTR_NOT: 01BF E9 00DE R JMP U_CGEND ; IF NOMAL DATA ;**************************************** ;* CLEAR DOT PATTERN WORK AREA * ;**************************************** 01C2 DOT_PTR00: 01C2 51 PUSH CX ; SAVE DATA 01C3 50 PUSH AX ; SAVE DATA 01C4 B9 0008 MOV CX,08H 01C7 06 push es 01C8 8C C8 mov ax,cs 01CA 8E C0 mov es,ax 01CC 2B C0 SUB AX,AX 01CE BF 0010 R MOV DI,OFFSET OUT_PTR 01D1 F3/ AB REP STOSW ; CLEAR BUFFER 01D3 B1 08 MOV CL,08H 01D5 BF 0033 R  MOV DI,OFFSET TOP_CODE 01D8 F3/ AB REP STOSW 01DA 07 pop es 01DB 58 POP AX  The Microsoft MACRO Assembler , Version 1.25 Page 1-11 USLIST 01-31-84 ;********************************************* ;* PATTERN ADDRESS SET ROUTINE * ;********************************************* ; 01DC PTN_ADD_SET: 01DC 2A E4 SUB AH,AH 01DE B9 0005 MOV CX,05H 01E1 D3 E0 SHL AX,CL 01E3 8B F0 MOV SI,AX ;******************************** ;* CHECK KIND OF PRINTER * ;******************************** ; ; The printer type byte is now part of io.sys rather than CMOS ; ; PUSH ES ; SAVE ES ; MOV AX,0A000H ; CMOS SEGMENT ; MOV ES,AX ; ; MOV BX,0054H ; CMOS PRINTER PATTERN DATA ADDRESS ; MOV AL,ES:[BX] ; AL = PATTERN DATA ; POP ES 01E5 59 POP CX 01E6 A0 0000 E MOV AL,PRINTTYPE ; GET PRINTER TYPE FROM IO SYSTEM NOW 01E9 3C 04 CMP AL,04H 01EB 74 1B JE DOT_PTR04 ; IF 8023 8 PIN DOT MATRIX 01ED 3C 01 CMP AL,01H 01EF 74 03 JE DOT_PTR02 ; IF SKSP 16 PIN DOT MATRIX 01F1 E9 00DE R JMP U_CGEND ; IF SPCE OUT PUT 01F4 DOT_PTR02: 01F4 C7 06 0003 R 0002 MOV TRNCNT,2 01FA BB 003A R MOV BX,OFFSET TOP_CODE+7 01FD E8 02A3 R CALL TRANSFER 0200 BB 0042 R MOV BX,OFFSET BOTTOM_CODE+7 0203 E8 02A3 R CALL TRANSFER 0206 EB 60 JMP SHORT PIN16 0208 DOT_PTR04: 0208 C7 06 0003 R 0004 MOV TRNCNT,4 020E BB 003A R MOV BX,OFFSET TOP_CODE+7 0211 E8 02A3 R CALL TRANSFER ; ; ;************************************************ ;* 8023 8 PIN DOT MATRIX TRANSFER ROUTINE * ;************************************************ ; 0214 PIN8: 0214 80 3E 0009 R 02 CMP NEWCONTF,02H 0219  74 14 JE PIN8_00 021B C6 06 0009 R 02 MOV NEWCONTF,02H 0220 C6 06 000B R 53 MOV BYTE PTR CONTROL+1,'S' 0225 C6 06 000E R 30 MOV BYTE PTR CONTROL+4,30H  The Microsoft MACRO Assembler , Version 1.25 Page 1-12 USLIST 01-31-84 022A C6 06 000F R 38 MOV BYTE PTR CONTROL+5,38H 022F PIN8_00: 022F B9 0008 MOV CX,08H 0232 BE 0033 R MOV SI,OFFSET TOP_CODE ; TRNSFER DATA OFFSET TOP_CODE 0235 BF 0010 R MOV DI,OFFSET OUT_PTR ; DOT OUT_PUT BUFFFER ADDRESS ; 0238 SETCODE: 0238 06 PUSH ES 0239 8C D8 MOV AX,DS 023B 8E C0 MOV ES,AX 023D F3/ A4 REP MOVSB 023F 07 POP ES ; ; Dot matrix main out routine ; 0240 MAIN_OUT: 0240 B9 0026 MOV CX,OFFSET END_CODE - OFFSET CONTROL 0243 BE 000A R MOV SI,OFFSET CONTROL ; START ADDRESS 0246 MAIN_OUT10: 0246 2B C0 SUB AX,AX 0248 2A FF SUB BH,BH ; CLEAR AX,BH 024A A2 0001 R MOV SISOF,AL ; CLERR PARITY FLAG 024D 89 0E 0005 R MOV SAVE_CX,CX 0251 89 36 0007 R MOV SAVE_SI,SI ; 0255 8A 1C MOV BL,[SI] ; BL = DOT 1 BYTE DATA 0257 E8 00E8 R CALL LOUT010 ; PRINT OUT 025A 8B 36 0007 R MOV SI,SAVE_SI 025E 46 INC SI 025F 8B 0E 0005 R MOV CX,SAVE_CX 0263 E2 E1 LOOP MAIN_OUT10 0265 E9 0110 R JMP LOUT020 ; ;************************************************** ;* SKSP 16 PIN DOT MATRIX TRNSFER ROUTINE * ;************************************************** ; 0268 PIN16: 0268 80 3E 0009 R 01 CMP NEWCONTF,01H 026D 74 14 JE PIN16_00 026F C6 06 0009 R 01 MOV NEWCONTF,01H 0274 C6 06 000B R 49 MOV BYTE PTR CONTROL+1,'I' ; CONTROL CODE SET 0279 C6 06 000E R 31 MOV BYTE PTR CONTROL+4,31H 027E C6 06 000F R 32 MOV BYTE PTR CONTROL+5,32H 0283 PIN16_00: 0283 BB 0033 R MOV BX,OFFSET TOP_CODE 0286 BA 003B R MOV DX,OFFSET BOTTOM_CODE 0289 BE 0014 R MOV SI,OFFSET OUT_PTR+4 028C B9 0008 MOV CX,08H ; COUNTER 028F SKSP00: 028F 8A 07 MOV AL,[BX] ; TOP_CODE BYTE DATA 0291 88 04 MOV [SI],AL ; OUTPUT DATA BUFF = SI 0293 43 INC BX 0294 46 INC SI  The Microsoft MACRO Assembler , Version 1.25 Page 1-13 USLIST 01-31-84 0295 53 PUSH BX 0296 8B DA MOV BX,DX 0298 8A 07 MOV AL,[BX] ; BOTTOM_CODE BYTE DATA 029A 88 04 MOV [SI],AL 029C 42 INC DX 029D 46 INC SI 029E 5B POP BX 029F E2 EE LOOP SKSP00 02A1 EB 9D JMP SHORT MAIN_OUT ; ;********************************************* ;* DOT MATRIX TRANSFER ROUTNE * ;********************************************* ; 02A3 TRANSFER: 02A3 B9 0008 MOV CX,08H ; COUNTER 02A6 TRANSFER00: 02A6 1E PUSH DS 02A7 A1 0031 R MOV AX,ALT_SEGMENT ; SEGMENT = D800H 02AA 8E D8 MOV DS,AX 02AC 8A 04 MOV AL,BYTE PTR [SI]; 02AE 1F POP DS 02AF 53 PUSH BX 02B0 51 PUSH CX 02B1 B9 0008 MOV CX,08H 02B4 TRANSFER01: 02B4 D0 D0 RCL AL,01H 02B6 D0 1F RCR BYTE PTR [BX],01H ; DATA BUFF IN CY FLAG DATA 02B8 4B DEC BX 02B9 E2 F9 LOOP TRANSFER01 02BB 59 POP CX 02BC 5B POP BX 02BD 03 36 0003 R ADD SI,TRNCNT 02C1 E2 E3 LOOP TRANSFER00 02C3 C3 RET  The Microsoft MACRO Assembler , Version 1.25 Page 1-14 USLIST 01-31-84 PAGE ; ; Report list device status ; ; Input: none. ; ; Output: ; carry reset ; DL = 00h - printer online, ready for data ; DL = ffh - printer online, busy ; carry set ; device is 1) not plugged 2) not powered up or 3) offline ; 02C4 51 listst: push cx 02C5 B0 07 mov al,07h 02C7 E6 6E out sodaw1,al ; set rms signal ; ; read status ; 02C9 B9 000A mov cx,0ah ; retry limit for two consecutive reads same 02CC E4 68 in al,sodars ; read status port 02CE try_again: 02CE 8A E0 mov ah,al ; save previous status 02D0 E4 68 in al,sodars ; get status again 02D2 3A C4 cmp al,ah ; same as previous? 02D4 E0 F8 loopnz try_again ; try again until 10 tries or matches ; ; interpret status ; 02D6 F6 06 0000 E 01 test devcon,1 ; does printer type support this status bit? 02DB 74 04 jz nodevcon ; if not, don't check this bit 02DD A8 80 test al,10000000b ; plugged in and powered? 02DF 75 12 jnz not_plg_or_pwr ; printer is offline (cable not connect, or ; powered down. 02E1 nodevcon: 02E1 A8 08  test al,00001000b ; is printer in local mode? 02E3 75 0E jnz in_local 02E5 A8 02 test al,00000010b ; ready for data? 02E7 74 05 jz busy_printer 02E9 B0 00 mov al,00h ; everything ready... 02EB EB 03 90 jmp listst_online 02EE busy_printer: 02EE B0 FF mov al,0ffh ; printer is not ready for data, busy. 02F0 listst_online: 02F0 F8 clc ; clear error flag 02F1 listst_exit: 02F1 59 pop cx 02F2 C3 ret 02F3 not_plg_or_pwr:  The Microsoft MACRO Assembler , Version 1.25 Page 1-15 USLIST 01-31-84 02F3 in_local: 02F3 F9 stc ; printer not ready 02F4 EB FB jmp listst_exit 02F6 CODE ENDS END  The Microsoft MACRO Assembler , Version 1.25 Page Symbols-1 USLIST 01-31-84 Structures and records: N a m e Width # fields Shift Width Mask Initial IOPACK . . . . . . . . . . . . . 0014 0004 LK_RET . . . . . . . . . . . . . 000D TRANS. . . . . . . . . . . . . . 000E COUNT. . . . . . . . . . . . . . 0012 Segments and groups: N a m e Size align combine class CODE . . . . . . . . . . . . . . 02F6 PARA PUBLIC 'CODE' Symbols: N a m e Type Value Attr ALRET. . . . . . . . . . . . . . L NEAR 0163 CODE ALTRBYTFLG . . . . . . . . . . . V BYTE 0000 CODE External ALT_SEGMENT. . . . . . . . . . . L WORD 0031 CODE AUX2_WRIT. . . . . . . . . . . . L NEAR 0000 CODE External AUX2_WRST. . . . . . . . . . . . L NEAR 0000 CODE External AUX_WRIT . . . . . . . . . . . . L NEAR 0000 CODE External AUX_WRST . . . . . . . . . . . . L NEAR 0000 CODE External BOTTOM_CODE. . . . . . . . . . . L WORD 003B CODE BUSY1. . . . . . . . . . . . . . L NEAR 0068 CODE BUSY_EXIT. . . . . . . . . . . . L NEAR 0000 CODE External BUSY_PRINTER . . . . . . . . . . L NEAR 02EE CODE CHKRDY . . . . . . . . . . . . . L NEAR 0061 CODE CONIN. . . . . . . . . . . . . . L NEAR 0000 CODE External CONTROL. . . . . . . . . . . . . L BYTE 000A CODE CONVBL . . . . . . . . . . . . . L NEAR 0150 CODE CTLPFREE . . . . . . . . . . . . Number 24B6 DATADD1. . . . . . . . . . . . . L NEAR 0190 CODE DATADD2. . . . . . . . . . . . . L NEAR 014D CODE DEVCON . . . . . . . . . . . . . V BYTE 0000 CODE External DOT_PATTERN. . . . . . . . . . . L NEAR 01A7 CODE DOT_PTR00. . . . . . . . . . . . L NEAR 01C2 CODE DOT_PTR02. . . . . . . . . . . . L NEAR 01F4 CODE DOT_PTR04. . . . . . . . . . . . L NEAR 0208 CODE DOT_PTR_NOT. . . . . . . . . . . L NEAR 01BF CODE END_CODE . . . . . . . . . . . . L BYTE 0030 CODE ERR_EXIT . . . . . . . . . . . . L NEAR 0000 CODE External EXCVO. . . . . . . . . . . . . . L NEAR 0111 CODE EXIT . . . . . . . . . . . . . . L NEAR 0000 CODE External HHDATA . . . . . . . . . . . . . L BYTE 0000 CODE IN_LOCAL . . . . . . . . . . . . L NEAR 02F3 CODE ISIFT1 . . . . . . . . . . . . . Number 0020 ISIFT2 . . . . . . . . . . . . . Number 0060 LISTOUT. . . . . . . . . . . . . L NEAR 00B5 CODE Global LISTOUT10. . . . . . . . . . . . L NEAR 00C9 CODE  The Microsoft MACRO Assembler , Version 1.25 Page Symbols-2 USLIST 01-31-84 LISTST . . . . . . . . . . . . . L NEAR 02C4 CODE LISTST_EXIT. . . . . . . . . . . L NEAR 02F1 CODE LISTST_ONLINE. . . . . . . . . . L NEAR 02F0 CODE LIST_NRDY. . . . . . . . . . . . L NEAR 00A3 CODE LOUT010. . . . . . . . . . . . . L NEAR 00E8 CODE LOUT015. . . . . . . . . . . . . L NEAR 00F5 CODE LOUT016. . . . . . . . . . . . . L NEAR 010B CODE LOUT020. . . . . . . . . . . . . L NEAR 0110 CODE LVPRN. . . . . . . . . . . . . . L NEAR 0093 CODE MAIN_OUT . . . . . . . . . . . . L NEAR 0240 CODE MAIN_OUT10 . . . . . . . . . . . L NEAR 0246 CODE MSLISTOUT. . . . . . . . . . . . L FAR 0000 CODE External NEWCONTF . . . . . . . . . . . . L BYTE 0009 CODE NODEVCON . . . . . . . . . . . . L NEAR 02E1 CODE NOT_PLG_OR_PWR . . . . . . . . . L NEAR 02F3 CODE OLDFLG . . . . . . . . . . . . . L BYTE 0002 CODE ONLINER. . . . . . . . . . . . . L NEAR 00F1 CODE OSIFT1 . . . . . . . . . . . . . Number 00A0 OSIFT2 . . . . . . . . . . . . . Number 00E0 OUT_PTR. . . . . . . . . . . . . L WORD 0010 CODE Length =0010 PA01 . . . . . . . . . . . . . . L NEAR 0195 CODE PA02 . . . . . . . . . . . . . . L NEAR 019E CODE PARST. . . . . . . . . . . . . . L NEAR 0057 CODE PARWR. . . . . . . . . . . . . . L NEAR 007F CODE PIN16. . . . . . . . . . . . . . L NEAR 0268 CODE PIN16_00 . . . . . . . . . . . . L NEAR 0283 CODE PIN8 . . . . . . . . . . . . . . L NEAR 0214 CODE PIN8_00. . . . . . . . . . . . . L NEAR 022F CODE PMSG . . . . . . . . . . . . . . L NEAR 0000 CODE External PRINTTYPE. . . . . . . . . . . . V BYTE 0000 CODE External PRN_STA. . . . . . . . . . . . . L NEAR 0043 CODE Global PRN_WR1. . . . . . . . . . . . . L NEAR 0084 CODE PRN_WRT. . . . . . . . . . . . . L NEAR 006B CODE Global PTN_ADD_SET. . . . . . . . . . . L NEAR 01DC CODE PTRSAV . . . . . . . . . . . . . V DWORD 0000 CODE External SAVE_CX. . . . . . . . . . . . . L WORD 0005 CODE SAVE_SI. . . . . . . . . . . . . L WORD 0007 CODE SETCODE. . . . . . . . . . . . . L NEAR 0238 CODE SIADD. . . . . . . . . . . . . . L NEAR 0164 CODE SIDA1. . . . . . . . . . . . . . V BYTE 0000 CODE External SISOF. . . . . . . . . . . . . . L BYTE 0001 CODE SKSP00 . . . . . . . . . . . . . L NEAR 028F CODE SOADDRESS. . . . . . . . . . . . L NEAR 01BA CODE SODAMD . . . . . . . . . . . . . Number 006E SODARS . . . . . . . . . . . . . Number 0068 SODAW1 . . . . . . . . . . . . . Number 006E SODAW2 . . . . . . . . . . . . . Number 006C SODAWD . . . . . . . . . . . . . Number 006A STDST. . . . . . . . . . . . . . L NEAR 0054 CODE STDWR. . . . . . . . . . . . . . L NEAR 007C CODE SVDATA . . . . . . . . . . . . . V BYTE 0000 CODE External TBCOV. . . . . . . . . . . . . . L NEAR 0158 CODE TBLWORK. . . . . . . . . . . . . V BYTE 0000 CODE External  The Microsoft MACRO Assembler , Version 1.25 Page Symbols-3 USLIST 01-31-84 TOP_CODE . . . . . . . . . . . . L WORD 0033 CODE TRANSFER . . . . . . . . . . . . L NEAR 02A3 CODE TRANSFER00 . . . . . . . . . . . L NEAR 02A6 CODE TRANSFER01 . . . . . . . . . . . L NEAR 02B4 CODE TRNCNT . . . . . . . . . . . . . L WORD 0003 CODE TRY_AGAIN. . . . . . . . . . . . L NEAR 02CE CODE U_AUXCGTBL . . . . . . . . . . . V BYTE 0000 CODE External U_CGEND. . . . . . . . . . . . . L NEAR 00DE CODE WAIT_READY_FOR_DATA. . . . . . . L NEAR 00E8 CODE WORKSI . . . . . . . . . . . . . V BYTE 0000 CODE External WORKSO . . . . . . . . . . . . . V BYTE 0000 CODE External Warning Severe Errors Errors 0 0   The Microsoft MACRO Assembler , Version 1.25 Page 1-1 KBDTLO 01-31-84 title KBDTLO page 58,132 ;----------------------------------------------------------------------------- ; ; MS-DOS BIOS for the N.E.C. Advanced Personal Computer ; ; module name: KBDTLO ; MS-DOS version: 2.0 ; module version: 1.0 ; ; abstract: ; ; contains routines: ; kbdtlo ; ; revision history: ; ; This routine was taken unmodified from a NEC/Tokyo MS-DOS V1.25 ; iosystem. ; - RMG 6-7-83 ; ;----------------------------------------------------------------------------- 0000 CODE SEGMENT PUBLIC 'CODE' EXTRN LA:BYTE,CA:BYTE EXTRN KBLCCV:NEAR,KBCSRO:NEAR,KBMOUT:NEAR,GENATBIT:NEAR PUBLIC ATMAP,ALTRBYT PUBLIC ATTRIB PUBLIC KBDTLO ASSUME CS:CODE,DS:CODE,SS:CODE,ES:CODE ;********************************************************************** ;* DATA LOW-BYTE OUTPUT * ;* INPUT AL ; DATA CODE * ;* LA,CA POINT TO NEXT POSITION * ;********************************************************************** 0000 KBDTLO: 0000 A2 000B R MOV DATABYT,AL 0003 E8 0000 E CALL KBMOUT ; MULTI COMMAND OUTPUT 0006 03 DB 03H 0007 4220 DW 4220H ; CODEW COMMAND OUTPUT 0009 00 ALTRBYT DB 00H 000A 40 DB 40H 000B 00 DATABYT DB 00H 000C 40 DB 40H ; ; RESET ALTERNATE BYTE (AUX CHAR) 000D C6 06 0009 R 00 MOV ALTRBYT,0 0012 8A 36 0000 E MOV DH,LA 0016 8A 16 0000 E MOV DL,CA 001A E8 0000 E CALL KBLCCV ; GET NEXT SCREEN ADDRESS 001D 50 PUSH AX ; ; LA CA IS ALREADY INCREMENTED  The Microsoft MACRO Assembler , Version 1.25 Page 1-2 KBDTLO 01-31-84 001E 3D 0050 CMP AX,50H 0021 75 08 JNE KBDTLO10 0023 E8 0000 E CALL KBCSRO ; 0026 B8 0FEF MOV AX,80*51-1 ; SET THE LAST SCREEN ADDRESS 0029 EB 03 JMP SHORT KBDTLO20 002B KBDTLO10: 002B 2D 0001 SUB AX,1 002E KBDTLO20: 002E 50 PUSH AX ; SAVE ATTRIBUTE ADDRESS ; GET THE SPECIFIED ADDRESS IN ATMAP (ATTRIBUTE MAP) ; INPUT AX = SCREEN ADDRESS ; OUTPUT DI = SPECIFIED ADDRESS ; DL = MASK (RELATIVE BIT) 002F KBDTLO30: 002F E8 0000 E CALL GENATBIT 0032 58 POP AX ; RESTORE ATTRIBUTE ADDRESS 0033 05 1000 ADD AX,1000H 0036 59 POP CX ; ; CHECK IF ATTRIBUTE IS DEFAULT OR NOT 0037 80 3E 0053 R 80 CMP byte ptr ATTRIB,80H 003C 75 0A JNE KBDTLO60 003E KBDTLO40: ; ATTRIBUTE REQUESTED IS DEFAULT VALUE CHECK OLD ATTRIBUTE BIT 003E  84 15 TEST [DI],DL 0040 74 1A JZ KBDTLO80 0042 F6 D2 NOT DL 0044 20 15 AND [DI],DL ; ATTRIBUTE BIT OFF 0046 EB 02 JMP SHORT KBDTLO70 ; JUMP TO WRITE ATTRIBUTE 0048 KBDTLO60: ; ; ATTRIBUTE REQUESTED IS NOT DEFAULT ,THEN SET ATTRIBUTE BIT ON 0048 08 15 OR [DI],DL 004A KBDTLO70: 004A E8 0000 E CALL KBCSRO 004D E8 0000 E CALL KBMOUT 0050 03 DB 03H 0051 4220 DW 4220H 0053 80 ATTRIB DB 80H 0054 40 DB 40H 0055 00 DB 00H 0056 40 DB 40H ; RESTORE NEXT SCREEN ADDRESS 0057 8B C1 MOV AX,CX 0059 E8 0000 E CALL KBCSRO 005C KBDTLO80: 005C C3 RET ; 005D 0200 [ ATMAP DB 512 DUP(0) ; ATTRIBUTE MAP 00 ]  The Microsoft MACRO Assembler , Version 1.25 Page 1-3 KBDTLO 01-31-84 025D CODE ENDS END  The Microsoft MACRO Assembler , Version 1.25 Page Symbols-1 KBDTLO 01-31-84 Segments and groups: N a m e Size align combine class CODE . . . . . . . . . . . . . . 025D PARA PUBLIC 'CODE' Symbols: N a m e Type Value Attr ALTRBYT. . . . . . . . . . . . . L BYTE 0009 CODE Global ATMAP. . . . . . . . . . . . . . L BYTE 005D CODE Global Length =0200 ATTRIB . . . . . . . . . . . . . L BYTE 0053 CODE Global CA . . . . . . . . . . . . . . . V BYTE 0000 CODE External DATABYT. . . . . . . . . . . . . L BYTE 000B CODE GENATBIT . . . . . . . . . . . . L NEAR 0000 CODE External KBCSRO . . . . . . . . . . . . . L NEAR 0000 CODE External KBDTLO . . . . . . . . . . . . . L NEAR 0000 CODE Global KBDTLO10 . . . . . . . . . . . . L NEAR 002B CODE KBDTLO20 . . . . . . . . . . . . L NEAR 002E CODE KBDTLO30 . . . . . . . . . . . . L NEAR 002F CODE KBDTLO40 . . . . . . . . . . . . L NEAR 003E CODE KBDTLO60 . . . . . . . . . . . . L NEAR 0048 CODE KBDTLO70 . . . . . . . . . . . . L NEAR 004A CODE KBDTLO80 . . . . . . . . . . . . L NEAR 005C CODE KBLCCV . . . . . . . . . . . . . L NEAR 0000 CODE External KBMOUT . . . . . . . . . . . . . L NEAR 0000 CODE External LA . . . . . . . . . . . . . . . V BYTE 0000 CODE External Warning Severe Errors Errors 0 0 GRAPHICSEXE SRDCPM COM MP%CAT COM zdCIPHER COM wTcRAMDISK SYS |<ASSIGN SYS hd?2DDNECAPCSYS ">-DDNECP2 SYS ) %7DDLA50 SYS `S(3:DDLA100 SYS S(B:DDOKI84 SYS @Z(Q:DDPMVP SYS Z(`:DDANADXMSYS Q(o:DDCITOLRSYS `R(~:DDCNTXM SYS R(:DDDS180 SYS R(:DDFXHR8 SYS S(:DDFXLR7 SYS R(:DDFXLR8 SYS S(:DDHP7470SYS a!0DDIDSM SYS @S(:  The Microsoft MACRO Assembler , Version 1.25 Page 1-1 CALENDAR 01-31-84 title CALENDAR page 58,132 ;----------------------------------------------------------------------------- ; ; MS-DOS BIOS for the N.E.C. Advanced Personal Computer ; ; module name: CALENDAR ; MS-DOS version: 2.0 ; module version: 1.0 ; ; abstract: This module contains routines used to set and read the ; clock/calendar. ; ; contains routines: ; calendar pscmse pscmsd psclks psclke ; ; revision history: ; ; This module was taken without modification from an April, 1983 ; NEC/Tokyo MS-DOS 2.0 io system. ; - RMG 6-7-83 ; ;----------------------------------------------------------------------------- 0000 CODE SEGMENT PUBLIC 'CODE' EXTRN SYSTMFLG:BYTE,SYSTMCHK:BYTE EXTRN INT_DS:WORD PUBLIC CALENDAR PUBLIC PSCMSE,PSCMSD PUBLIC PSCLKS,PSCLKE ASSUME CS:CODE,DS:CODE,SS:CODE,ES:CODE = 0058 CLKPOT EQU 58H ; PORT NO = 0005 MODCAN EQU 05H ; MODE CANCEL = 0007 CLKSTB0 EQU 07H ; STB 0 = 0008 CLKSTB1 EQU 08H; ; STB 1 ;* ;********************************************************************** ;* * ;* DATA AREA * ;* * ;********************************************************************** ;* 0000 00 RWFLG DB 0 ; SAVE SET/GET ;***** WORK AREA *********************************************** 0001 00 YYFLG DB 0 ; YY READ FLAG 0002 00 YYSAVE DB 0 ; YY (BCD) 0003 0000 YYWORK DW 0 ; YY (JIS8) 0005 00 CLKWK0 DB 0 0006 00 DB 0 0007 00 DB 0 0008 00 DB 0 0009 00 CLKWK4 DB 0 000A 00 DB 0  The Microsoft MACRO Assembler , Version 1.25 Page 1-2 CALENDAR 01-31-84 ;********************************************************************** ;* * ;* CALENDAR CLOCK SERVICE ROUTINE * ;* * ;********************************************************************** ;* * ;* FNC : * ;* 1) SET/GET CALENDAR & CLOCK * ;* * ;********************************************************************** ;* * ;* IN :  * ;* 1) DS,DX; P.DATA AREA * ;* CL; 00H; GET, 01H; SET * ;* * ;* OUT : * ;* 1) AX,BP; BREAK * ;* * ;********************************************************************** ;* ;***** SET/GET CALENDAR & CLOCK ******************************* 000B CALENDAR: 000B 88 0E 0000 R MOV RWFLG,CL ; SAVE SET/GET 000F 8B DA MOV BX,DX ; BX = ADDR OF DATA AREA 0011 8B C1 MOV AX,CX ; AX = FNC CODE 0013 C6 06 0000 E 01 MOV SYSTMFLG,1 ; CLOCK BUSY FLAG ON ;* ;***** FLAG CHECK PROC. *************************************** ;*  0018 80 F9 01 CMP CL,1 ; CHK SET/GET F. 001B 74 52 JE SCL500 ; JMP IF SET ;* 001D 80 3E 0001 R 00 CMP YYFLG,0 ; CHK YY READ F. 0022 75 0D JNE SCL150 ; JMP IF NOT READ 0024 53 PUSH BX ; 0025 BB 0003 R MOV BX,OFFSET YYWORK ; DX = YY WORK AREA ADDR 0028 B4 00 MOV AH,0 ; AH = 00 :READ ;***** YY (YEAR) DATA READ PROC. ******************************* 002A E8 00A6 R CALL SCL800 ; YY READ TO SYS.WORK 002D E8 00D2 R CALL YYBCD ; YY BCD <-- JIS8 0030 5B POP BX ; 0031 A0 0002 R SCL150: MOV AL,YYSAVE ; YY 0034 1E PUSH DS 0035 8E 1E 0000 E MOV DS,INT_DS 0039 88 07 MOV DS:[BX],AL 003B 1F POP DS ;* ;***** CLOCK READ PROC. *************************************** 003C 53 SCL200: PUSH BX 003D 55 PUSH BP ; 003E BB 0005 R MOV BX,OFFSET CLKWK0 0041 E8 0109 R CALL PSCLKR ; CLOCK READ RTN. 0044 5D POP BP  The Microsoft MACRO Assembler , Version 1.25 Page 1-3 CALENDAR 01-31-84 0045 5B POP BX 0046 8B FB MOV DI,BX ; 0048 83 C7 05 ADD DI,5 004B BE 0005 R MOV SI,OFFSET CLKWK0 004E B9 0005 MOV CX,5 0051 06 PUSH ES 0052 8E 06 0000 E MOV ES,INT_DS ; USER AREA DATA SEG. 0056 FC SCL300: CLD 0057 AC LODS BYTE PTR[SI] 0058 FD STD 0059 AA STOS BYTE PTR [DI] 005A E2 FA LOOP SCL300 005C FC CLD 005D 43 SCL400: INC BX 005E 26: 8A 07 MOV AL,ES:BYTE PTR[BX] 0061 FE C0 INC AL 0063 26: 88 07 MOV ES:BYTE PTR[BX],AL 0066 07 POP ES 0067 C6 06 0000 E 00 MOV SYSTMFLG,0 ; CLOCK BUSY FLAG OFF 006C EB 37 90 JMP SCL600 ; IF GET ;* 006F 53 SCL500: PUSH BX 0070 8B F3 MOV SI,BX ; 0072 46 INC SI 0073 BF 0009 R MOV DI,OFFSET CLKWK4 0076 B9 0005 MOV CX,5 0079 1E PUSH DS 007A 8E 1E 0000 E MOV DS,INT_DS ; USER AREA DATA SEG. 007E FC SCL550: CLD 007F AC LODS BYTE PTR [SI] 0080 FD STD 0081 AA STOS BYTE PTR [DI] 0082 E2 FA LOOP SCL550 0084 FC CLD 0085 1F POP DS 0086 FE 0E 0009 R DEC CLKWK4 008A 55 PUSH BP 008B BB 0005 R MOV BX,OFFSET CLKWK0 008E E8 010D R CALL PSCLKW ; CLOCK WRITE RTN. 0091 5D POP BP 0092 5B POP BX ;* 0093 E8 00E7 R CALL YYJIS8 ; YY JIS8 <-- BCD 0096 53 PUSH BX ; 0097 BB 0003 R MOV BX,OFFSET YYWORK ; DX = YY WORK AREA ADDR ;* ;***** YY (YEAR) DATA WRITE PROC. ******************************* ;* 009A B4 01 MOV AH,1 009C E8 00A6 R CALL SCL800 ; YY WRITE TO C-MOS MEM. 009F 5B POP BX ; ;-------------------------------------------------02/23/1983----------- 00A0 C6 06 0000 E 02 MOV SYSTMFLG,2 ; CLOCK REWRITING FLAG ON  The Microsoft MACRO Assembler , Version 1.25  Page 1-4 CALENDAR 01-31-84 ;---------------------------------------------------------------------- ;* ;***** END PROC. *********************************************** ;* 00A5 SCL600: 00A5 C3 RET ;* ;***** SUB-ROUTINE *********************************************** ;* * ;* IN : DS,BX; SYS.WORK * ;* AH; 00H/01H; READ/WRITE * ;* * ;* OUT : CX,BP; BREAK * ;* * ;********************************************************************** ;* 00A6 8B 0F SCL800: MOV CX,[BX] ; CX; YY DATA FROM SYS.WORK 00A8 1E PUSH DS ; 00A9 53 PUSH BX ; 00AA 50 PUSH AX 00AB B8 A000 MOV AX,0A000H ; 00AE 8E D8 MOV DS,AX ; DS = C-MOS ADDR 00B0 58 POP AX 00B1 BB 0100 MOV BX,0100H ; DS,BX; P.YY DATA AREA 00B4 0A E4 OR AH,AH ; CHK YY READ/WRITE F. 00B6 75 10 JNZ SCL870 ; JMP IF WRITE ;* ;***** YY DATA READ FROM C-MOS MEM. ******************************* ;* 00B8 8B 0F MOV CX,[BX] ; CX; YY DATA 00BA 5B SCL820: POP BX 00BB 1F POP DS 00BC 0A E4 OR AH,AH ; CHK YY READ/WRITE F. 00BE 75 02 JNZ SCL850 ; JMP IF WRITE 00C0 89 0F MOV [BX],CX ; STORE YY DATA 00C2 C6 06 0001 R 01 SCL850: MOV YYFLG,1 ; SET YY READ F. 00C7 C3 RET ;* ;***** YY DATA WRITE TO C-MOS MEM. ******************************* ;* 00C8 SCL870: 00C8 E8 01CB R CALL PSCMSE ; C-MOS ENABLE 00CB 89 0F MOV [BX],CX ; STORE YY DATA 00CD E8 01D2 R CALL PSCMSD ; C-MOS DISABLE 00D0 EB E8 JMP SCL820 ;* ;***** YY BCD <-- JIS8 *********************************************** 00D2 51 YYBCD: PUSH CX 00D3 50 PUSH AX 00D4 8B 07 MOV AX,[BX] ; 00D6 86 E0 XCHG AH,AL ; 00D8 B1 04 MOV CL,4 00DA D2 E4 SHL AH,CL ;  The Microsoft MACRO Assembler , Version 1.25 Page 1-5 CALENDAR 01-31-84 00DC 24 0F AND AL,0FH ; 00DE 0A E0 OR AH,AL ; 00E0 88 26 0002 R MOV YYSAVE,AH ; 00E4 58 POP AX 00E5 59 POP CX 00E6 C3 RET ;* ;***** YY JIS8 <-- BCD *********************************************** 00E7 51 YYJIS8: PUSH CX 00E8 50 PUSH AX 00E9 1E PUSH DS 00EA 8E 1E 0000 E MOV DS,INT_DS 00EE 8A 07 MOV AL,BYTE PTR [BX] 00F0 1F POP DS 00F1 A2 0002 R MOV YYSAVE,AL 00F4 B4 00 MOV AH,0 00F6 B1 04 MOV CL,4 00F8 D3 E0 SHL AX,CL 00FA 80 CC 30 OR AH,30H 00FD D2 E8 SHR AL,CL 00FF 0C 30 OR AL,30H 0101 86 E0 XCHG AH,AL 0103 A3 0003 R MOV YYWORK,AX 0106 58 POP AX 0107 59 POP CX 0108 C3 RET ;* ;***** CLOCK READ ROUTINE *************************************** ;* 0109 F9 PSCLKR: STC ; READ 010A EB 02 90 JMP SCW100 ;***** CLOCK WRITE ROUTINE *************************************** 010D F8 PSCLKW: CLC ; WRITE 010E 56 SCW100: PUSH SI 010F BE 0002 MOV SI,2 ; SI; COUNTER (CNTO) 0112 52 PUSH DX 0113 BA 0058 MOV DX,0058H ; DX; I/O PORT# 0116 53 PUSH BX 0117 80 3E 0000 R 00 CMP RWFLG,0 ; READ ? 011C 74 43 JE SCR100 ; JMP IF READ ;***** CLOCK WRITE PRIC. *************************************** 011E B0 01 MOV AL,01H 0120 E8 01AC R CALL PSCLKS ; REGISTER SHIFT 0123 B1 10 SCW200: MOV CL,16 ; CX; COUNTER (CNT1) 0125 8B 2F SCW250: MOV BP,[BX] ; BP; WRITE DATA 0127 8A E5 SCW300: MOV AH,CH ; AH; 00H 0129 D1 ED SHR BP,1 ; CF; WRITE DATA (1BIT) 012B D0 DC RCR AH,1 012D D0 EC SHR AH,1 012F D0 EC SHR AH,1 0131 0A C4 OR AL,AH ; AL; WRITE DATA (1BIT) 0133 9C PUSHF 0134 FA CLI  The Microsoft MACRO Assembler , Version 1.25 Page 1-6 CALENDAR 01-31-84 0135 EE OUT DX,AL ; DI SET 0136 0C 10 OR AL,10H 0138 EE OUT DX,AL ; CLK; 1, 1BIT WRITE 0139 56 PUSH SI ; TIMER = 2 (MS) 013A 5E POP SI 013B 24 EF AND AL,0EFH 013D EE OUT DX,AL ; CLK; 0 013E 24 07 AND AL,07H ; RESET DI 0140 9D POPF 0141 E2 E4 LOOP SCW300 ; JMP IF CNT1 NE 0 0143 43 INC BX 0144 43 INC BX 0145 4E DEC SI ; DEC.CNT0 0146 78 06 JS SCW500 ; JMP IF WRITE END (CNT0 = -1) 0148 75 D9 JNZ SCW200 ; JMP IF CNT0 NE 0 014A B1 08 MOV CL,8 ; CNT1 = 8 014C EB D7 JMP SCW250 ;* 014E B0 02 SCW500: MOV AL,02H 0150 E8 01AC R CALL PSCLKS ; TIME SET AND COUNTER HOLD 0153 2A C0 SUB AL,AL 0155 E8 01AC R CALL PSCLKS ; REGISTER HOLD 0158 C6 06 0000 E 00 MOV SYSTMCHK,0 ; TIMER COUNTER CLEAR 015D 5B SCW700: POP BX 015E 5A POP DX 015F 5E POP SI 0160 C3 RET ;***** CLOCK READ PROC. *************************************** 0161 B0 03 SCR100: MOV AL,03H 0163 E8 01AC R CALL PSCLKS ; TIME READ 0166 B0 01 MOV AL,01H 0168 E8 01B4 R CALL PSCLKE ; REGISTER SHIFT 016B 9C PUSHF 016C FA CLI 016D 50 PUSH AX 016E EC IN AL,DX ; AL; LSB (SEC.) 016F D0 E8 SHR AL,1 ; CF; READ DATA (1BIT) 0171 D1 DD RCR BP,1 ; BP; READ DATA 0173 58 POP AX 0174 B1 0F MOV CL,15 ; CL; COUNTER (CNT1) 0176 9D POPF 0177 EB 03 90 JMP SCR300 017A SCR200: 017A B1 10 MOV CL,16 ; CL; COUNTER (CNT1) 017C SCR300: 017C 9C PUSHF 017D FA CLI 017E 0C 10 OR AL,10H 0180 EE OUT DX,AL ; CLK; 1 0181 56 PUSH SI ; TIMER = 5 (MS) 0182 5E POP SI 0183 56 PUSH SI 0184 5E POP SI  The Microsoft MACRO Assembler , Version 1.25 Page 1-7 CALENDAR 01-31-84 0185 50 PUSH AX 0186 EC IN AL,DX ; DATA READ (1BIT) 0187 D0 E8 SHR AL,1 ; CF; READ DATA 0189 D1 DD RCR BP,1 ; BP; READ DATA 018B 58 POP AX 018C 24 EF AND AL,0EFH 018E EE OUT DX,AL ; CLK; 0 018F 56 PUSH SI ; TIMER = 5 (MS) 0190 5E POP SI 0191 56 PUSH SI 0192 5E POP SI 0193 9D POPF 0194 90 NOP 0195 E2 E5 LOOP SCR300 ; JMP IF CNT1 NE 0 0197 4E DEC SI ; DEC.CNT0 0198 78 0C JS SCR500 ; SET READ DATA INTO WORK 019A 89 2F MOV [BX],BP ; SET READ DATA INTO WORK 019C 43 INC BX 019D 43 INC BX 019E 0B F6 OR SI,SI 01A0 75 D8 JNZ SCR200 ; JMP IF CNT0 NE 0 01A2 B1 08 MOV CL,8 ; CNT1 = 8 01A4 EB D6 JMP SCR300 ;* 01A6 8B C5 SCR500: MOV AX,BP ; AH; READ DATA 01A8 88 27 MOV [BX],AH ; SET READ DATA INTO WORK 01AA EB B1 JMP SCW700 ;* ;***** COMMAND SET SUB-ROUTINE ******************************* ;* 01AC PSCLKS: 01AC 9C PUSHF 01AD FA CLI 01AE B9 0001 MOV CX,1 ; TIMER COUNT = 1 (5MS) 01B1 EB 06 90 JMP SCS100 01B4 PSCLKE: 01B4 9C PUSHF 01B5 FA CLI 01B6 B9 0006 MOV CX,6 ; TIMER COUNT = 6 (40MS) 01B9 EE SCS100: OUT DX,AL ; OUT CMD 01BA 52 PUSH DX 01BB 5A POP DX 01BC 0C 08 OR AL,08H ; STB; 1 01BE EE OUT DX,AL ; WRITE CMD 01BF 52 SCS500: PUSH DX ; TIMER 01C0 5A POP DX 01C1 E2 FC LOOP SCS500 01C3 90 NOP 01C4 24 07 AND AL,07H ; STB; 0 01C6 EE OUT DX,AL ; STB CLEAR 01C7 52 PUSH DX 01C8 5A POP DX 01C9 9D POPF  The Microsoft MACRO Assembler , Version 1.25 Page 1-8 CALENDAR 01-31-84 01CA C3 RET ;* ;********************************************************************** ;* * ;* C-MOS ACCESS ENABLE * ;* * ;********************************************************************** ;* 01CB 50 PSCMSE: PUSH AX 01CC B0 01 MOV AL,01H 01CE E6 59 OUT 59H,AL ; ENABLE 01D0 58 POP AX 01D1 C3 RET ;* ;********************************************************************** ;* * ;* C-MOS ACCESS DISABLE * ;* * ;********************************************************************** ;* 01D2 50 PSCMSD: PUSH AX 01D3 2B C0 SUB AX,AX 01D5 E6 59 OUT 59H,AL ; DISABLE 01D7 58 POP AX 01D8 C3 RET 01D9 CODE ENDS END  The Microsoft MACRO Assembler , Version 1.25 Page Symbols-1 CALENDAR 01-31-84 Segments and groups: N a m e Size align combine class CODE . . . . . . . . . . . . . . 01D9 PARA PUBLIC 'CODE' Symbols: N a m e Type Value Attr CALENDAR . . . . . . . . . . . . L NEAR 000B CODE Global CLKPOT . . . . . . . . . . . . . Number 0058 CLKSTB0. . . . . . . . . . . . . Number 0007 CLKSTB1. . . . . . . . . . . . . Number 0008 CLKWK0 . . . . . . . . . . . . . L BYTE 0005 CODE CLKWK4 . . . . . . . . . . . . . L BYTE 0009 CODE INT_DS . . . . . . . . . . . . . V WORD 0000 CODE External MODCAN . . . . . . . . . . . . . Number 0005 PSCLKE . . . . . . . . . . . . . L NEAR 01B4 CODE Global PSCLKR . . . . . . . . . . . . . L NEAR 0109 CODE PSCLKS . . . . . . . . . . . . . L NEAR 01AC CODE Global PSCLKW . . . . . . . . . . . . . L NEAR 010D CODE PSCMSD . . . . . . . . . . . . . L NEAR 01D2 CODE Global PSCMSE . . . . . . . . . . . . . L NEAR 01CB CODE Global RWFLG. . . . . . . . . . . . . . L BYTE 0000 CODE SCL150 . . . . . . . . . . . . . L NEAR 0031 CODE SCL200 . . . . . . . . . . . . . L NEAR 003C CODE SCL300 . . . . . . . . . . . . . L NEAR 0056 CODE SCL400 . . . . . . . . . . . . . L NEAR 005D CODE SCL500 . . . . . . . . . . . . . L NEAR 006F CODE SCL550 . . . . . . . . . . . . . L NEAR 007E CODE SCL600 . . . . . . . . . . . . . L NEAR 00A5 CODE SCL800 . . . . . . . . . . . . . L NEAR 00A6 CODE SCL820 . . . . . . . . . . . . . L NEAR 00BA CODE SCL850 . . . . . . . . . . . . . L NEAR 00C2 CODE SCL870 . . . . . . . . . . . . . L NEAR 00C8 CODE SCR100 . . . . . . . . . . . . . L NEAR 0161 CODE SCR200 . . . . . . . . . . . . . L NEAR 017A CODE SCR300 . . . . . . . . . . . . . L NEAR 017C CODE SCR500 . . . . . . . . . . . . . L NEAR 01A6 CODE SCS100 . . . . . . . . . . . . . L NEAR 01B9 CODE SCS500 . . . . . . . . . . . . . L NEAR 01BF CODE SCW100 . . . . . . . . . . . . . L NEAR 010E CODE SCW200 . . . . . . . . . . . . . L NEAR 0123 CODE SCW250 . . . . . . . . . . . . . L NEAR 0125 CODE SCW300 . . . . . . . . . . . . . L NEAR 0127 CODE SCW500 . . . . . . . . . . . . . L NEAR 014E CODE SCW700 . . . . . . . . . . . . . L NEAR 015D CODE SYSTMCHK . . . . . . . . . . . . V BYTE 0000 CODE External SYSTMFLG . . . . . . . . . . . . V BYTE 0000 CODE External YYBCD. . . . . . . . . . . . . . L NEAR 00D2 CODE YYFLG. . . . . . . . . . . . . . L BYTE 0001 CODE YYJIS8 . . . . . . . . . . . . . L NEAR 00E7 CODE  The Microsoft MACRO Assembler , Version 1.25 Page Symbols-2 CALENDAR 01-31-84 YYSAVE . . . . . . . . . . . . . L BYTE 0002 CODE YYWORK . . . . . . . . . . . . . L WORD 0003 CODE Warning Severe Errors Errors 0 0 ú"%!#%!$%!z9 !$_ 01D6 FA 1D DB 0FAH,1DH ; <-- 01D8 FB 1C DB 0FBH,1CH ; INS 01DA FC 18 DB 0FCH,18H ; DEL 01DC FD 0D DB 0FDH,0DH ; ENTER 01DE FF 10 DB 0FFH,10H ; PRINT 01E0 00 00 DB 0,0 ; DATA END (STOPER) ; ;********************************************************************** ;* KB SIGNAL TABLE FORMAT * ;********************************************************************** 01E2 KBSW1TBL: 01E2 00 01 DB 0,1 ; NORMAL 01E4 40 02 DB 40H,2 ; NORMAL (SHIFT) 01E6 04 03 DB 04H,3 ; GRPH1 (UNSHIFT) 01E8 44 04 DB 44H,4 ; GRPH1 (SHIFT) 01EA 08 05 DB 08H,5 ; GRPH2 (UNSHIFT) 01EC 48 06 DB 48H,6 ; GRPH2 (SHIFT) 01EE 20 01 DB 20H,1 ; ALT (UNSHIFT) 01F0 60 02 DB 60H,2 ; ALT (SHIFT) --- 7 -> 2 rmg 12-7-83 01F2 24 03 DB 24H,3 ; ALT+GRPH1 (UNSHIFT) 01F4 64 04 DB 64H,4 ; ALT+GRPH1 (SHIFT) 01F6 28 05 DB 28H,5 ; ALT+GRPH2 (UNSHIFT) 01F8 68 06 DB 68H,6 ; ALT+GRPH2 (SHIFT) 01FA FF 00 DB 0FFH,0 ; END (ERROR)  The Microsoft MACRO Assembler , Version 1.25 Page 1-10 USCONIN 01-31-84 PAGE ;************************************************************************ ;* ASCII KEY CODE CONVERT TABLE FORMAT * ;* BYTE ; * ;* 0 ; ORIGINAL CODE * ;* 1 ; NORMAL (UNSHIFT) / ALT (UNSHIFT) * ;* 2 ; " (SHIFT) * ;* 3 ; GRPH1 (UNSHIFT) / ALT+GRPH1 (UNSHIFT) * ;* 4 ; " (SHIFT) / " (SHIFT) * ;* 5 ; GRPH2 (UNSHIFT) / ALT+GRPH2 (UNSHIFT) * ;* 6 ; " (SHIFT) / " (SHIFT) * ;* 7 ; ALT (SHIFT) * ;************************************************************************ 01FC ASCTBL: 01FC 31 31 21 01 90 C7 DB 31H,31H,21H,01H,90H,0C7H,0A0H,21H ; ! 1 A0 21 0204 32 32 40 02 91 CC DB 32H,32H,40H,02H,91H,0CCH,0A2H,40H ; @ 2 A2 40 020C 33 33 23 03 92 B1 DB 33H,33H,23H,03H,92H,0B1H,0A6H,23H ; # 3 A6 23 0214 34 34 24 04 93 B3 DB 34H,34H,24H,04H,93H,0B3H,0DBH,24H ; $ 4 DB 24 021C 35 35 25 05 94 B4 DB 35H,35H,25H,05H,94H,0B4H,0D3H,25H ; % 5 D3 25 0224 36 36 D0 06 95 B5 DB 36H,36H,0D0H,06H,95H,0B5H,0CDH,9BH ; 6 CD 9B 022C 37 37 26 07 96 D4 DB 37H,37H,26H,07H,96H,0D4H,0A5H,26H ; & 7 A5 26 0234 38 38 2A 08 97 D5 DB 38H,38H,2AH,08H,97H,0D5H,0A3H,2AH ; * 8 A3 2A 023C 39 39 28 09 98 D6 DB 39H,39H,28H,09H,98H,0D6H,0ADH,28H ; ( 9 AD 28 0244 30 30 29 0A 99 DC DB 30H,30H,29H,0AH,99H,0DCH,0AEH,29H ; ) 0 AE 29 024C 5F 2D 5F 0B 9A A8 DB 5FH,2DH,5FH,0BH,9AH,0A8H,0CEH,5FH ; _ - CE 5F 0254 2D 3D 2B 0C 9B AF DB 2DH,3DH,2BH,0CH,9BH,0AFH,0ACH,2BH ; + = AC 2B 025C 40 60 7E 0D 9C B0 DB 40H,60H,7EH,0DH,9CH,0B0H,0C8H,7EH ; ~ ` C8 7E ; 0264 51 71 51 0E 9D C0 DB 51H,71H,51H,0EH,9DH,0C0H,00H,51H ; Q 00 51 026C 57 77 57 0F 9E C3 DB 57H,77H,57H,0FH,9EH,0C3H,00H,57H ; W 00 57 0274 45 65 45 10 9F B2 DB 45H,65H,45H,10H,9FH,0B2H,00H,45H ; E 00 45 027C 52 72 52 11 E0 BD DB 52H,72H,52H,11H,0E0H,0BDH,00H,52H ; R 00 52 0284 54 74 54 12 E1 B6 DB 54H,74H,54H,12H,0E1H,0B6H,00H,54H ; T 00 54 028C 59 79 59 13 E2 DD DB 59H,79H,59H,13H,0E2H,0DDH,00H,59H ; Y 00 59  The Microsoft MACRO Assembler , Version 1.25 Page 1-11 USCONIN 01-31-84  0294 55 75 55 14 E3 C5 DB 55H,75H,55H,14H,0E3H,0C5H,00H,55H ; U 00 55 029C 49 69 49 15 E4 C6 DB 49H,69H,49H,15H,0E4H,0C6H,00H,49H ; I 00 49 02A4 4F 6F 4F 16 E5 D7 DB 4FH,6FH,4FH,16H,0E5H,0D7H,00H,4FH ; O 00 4F 02AC 50 70 50 17 E6 BE DB 50H,70H,50H,17H,0E6H,0BEH,00H,50H ; P 00 50 02B4 5B 5B 7B 18 E7 00 DB 5BH,5BH,7BH,18H,0E7H,00H,0A7H,7BH ; [ A7 7B 02BC 5D 5D 7D 19 E8 00 DB 5DH,5DH,7DH,19H,0E8H,00H,0A9H,7DH ; ] A9 7D 02C4 5C 5C 7C 1A E9 00 DB 5CH,5CH,7CH,1AH,0E9H,00H,0AAH,7CH ; AA 7C 02CC 5E 03 5E 00 EA 00 DB 5EH,03H,5EH,00H,0EAH,00H,0ABH,5EH ; ^ AB 5E ; 02D4 41 61 41 1B EB DE DB 41H,61H,41H,1BH,0EBH,0DEH,00H,41H ; A 00 41 02DC 53 73 53 1C EC DF DB 53H,73H,53H,1CH,0ECH,0DFH,0,53H ; S 00 53 02E4 44 64 44 1D ED C1 DB 44H,64H,44H,1DH,0EDH,0C1H,00H,44H ; D 00 44 02EC 46 66 46 1E EE C4 DB 46H,66H,46H,1EH,0EEH,0C4H,00H,46H ; F 00 46 02F4 47 67 47 1F EF BC DB 47H,67H,47H,1FH,0EFH,0BCH,00H,47H ; G 00 47 02FC 48 68 48 80 F0 CA DB 48H,68H,48H,80H,0F0H,0CAH,00H,48H ; H 00 48 0304 4A 6A 4A 81 F1 B7 DB 4AH,6AH,4AH,81H,0F1H,0B7H,00H,4AH ; J 00 4A 030C 4B 6B 4B 82 F2 B8 DB 4BH,6BH,4BH,82H,0F2H,0B8H,00H,4BH ; K 00 4B 0314 4C 6C 4C 83 F3 CF DB 4CH,6CH,4CH,83H,0F3H,0CFH,0,4CH ; L 00 4C 031C 3A 3B 3A 84 F4 C9 DB 3AH,3BH,3AH,84H,0F4H,0C9H,00H,3AH ; : ; 00 3A 0324 3B 27 22 85 F5 00 DB 3BH,27H,22H,85H,0F5H,0,0D2H,22H ; " ' D2 22 ; 032C 5A 7A 5A 86 F6 D8 DB 5AH,7AH,5AH,86H,0F6H,0D8H,00H,5AH ; Z 00 5A 0334 58 78 58 87 F7 DA DB 58H,78H,58H,87H,0F7H,0DAH,00H,58H ; X 00 58 033C 43 63 43 88 F8 B9 DB 43H,63H,43H,88H,0F8H,0B9H,00H,43H ; C 00 43 0344 56 76 56 89 F9 D1 DB 56H,76H,56H,89H,0F9H,0D1H,00H,56H ; V 00 56 034C 42 62 42 8A FA BB DB 42H,62H,42H,8AH,0FAH,0BBH,00H,42H ; B 00 42 0354 4E 6E 4E 8B FB C2 DB 4EH,6EH,4EH,8BH,0FBH,0C2H,00H,4EH ; N 00 4E 035C 4D 6D 4D 8C FC CB DB 4DH,6DH,4DH,8CH,0FCH,0CBH,00H,4DH ; M  The Microsoft MACRO Assembler , Version 1.25 Page 1-12 USCONIN 01-31-84 00 4D 0364 2C 2C 3C 8D FD BF DB 2CH,2CH,3CH,8DH,0FDH,0BFH,0A4H,3CH ; < , A4 3C 036C 2E 2E 3E 8E FE BA DB 2EH,2EH,3EH,8EH,0FEH,0BAH,0A1H,3EH ; > . A1 3E 0374 2F 2F 3F 8F FF 00 DB 2FH,2FH,3FH,8FH,0FFH,0,0D9H,3FH ; ? / D9 3F  The Microsoft MACRO Assembler , Version 1.25 Page 1-13 USCONIN 01-31-84 page even ;************************************************ ;* * ;* UNIVERSAL CG TABLE * ;* * ;* If output code is same as ASCII * ;* code, output ASCII code. * ;* Else output AUX code. * ;* * ;************************************************ 037C U_AUXCGTBL LABEL BYTE 037C 00 DB 0 ; MAX CODE OF ALTERNATE 037D UCGOFF LABEL BYTE 037D 00 01 02 03 04 05 DB 0H ,1H ,2H ,3H ,4H ,5H ,6H ,7H 06 07 0385 08 09 0A 0B 0C 0D DB 8H ,9H ,0AH,0BH,0CH,0DH,0EH,0FH 0E 0F 038D 10 11 12 13 14 15 DB 10H,11H,12H,13H,14H,15H,16H,17H 16 17 0395 18 19 1A 1B 1C 1D DB 18H,19H,1AH,1BH,1CH,1DH,1EH,1FH 1E 1F 039D 20 21 22 23 24 25 DB 20H,21H,22H,23H,24H,25H,26H,27H 26 27 03A5 28 29 2A 2B 2C 2D DB 28H,29H,2AH,2BH,2CH,2DH,2EH,2FH 2E 2F 03AD 30 31 32 33 34 35 DB 30H,31H,32H,33H,34H,35H,36H,37H 36 37 03B5 38 39 3A 3B 3C 3D DB 38H,39H,3AH,3BH,3CH,3DH,3EH,3FH 3E 3F 03BD 40 41 42 43 44 45 DB 40H,41H,42H,43H,44H,45H,46H,47H 46 47 03C5 48 49 4A 4B 4C 4D DB 48H,49H,4AH,4BH,4CH,4DH,4EH,4FH 4E 4F 03CD 50 51 52 53 54 55 DB 50H,51H,52H,53H,54H,55H,56H,57H 56 57 03D5 58 59 5A 5B 5C 5D DB 58H,59H,5AH,5BH,5CH,5DH,5EH,5FH 5E 5F 03DD 60 61 62 63 64 65 DB 60H,61H,62H,63H,64H,65H,66H,67H 66 67 03E5 68 69 6A 6B 6C 6D DB 68H,69H,6AH,6BH,6CH,6DH,6EH,6FH 6E 6F 03ED 70 71 72 73 74 75 DB 70H,71H,72H,73H,74H,75H,76H,77H 76 77 03F5 78 79 7A 7B 7C 7D DB 78H,79H,7AH,7BH,7CH,7DH,7EH,7FH 7E 7F  The Microsoft MACRO Assembler , Version 1.25 Page 1-14 USCONIN 01-31-84 PAGE ;********************************************** ;* * ;* CONST (CONSOLE STATUS) * ;* * ;* OUTPUT AL=0 EMPTY * ;* AL=FF READY * ;********************************************** 03FD CONST: ;------------------------------------------------------------------------------ ; CHECK IF ESC MODE 03FD 83 3E 0000 E 00 CMP ESCCPRCNT,0 0402 75 22 JNE CONST020 ;------------------------------------------------------------------------------ ; CHECK DISABLE/ENABLE KEY BOARD INPUT 0404 80 3E 00DC R 00 CMP SYSKEYINFLG,0 0409 75 17 JNE CONST010 ; IF DISABLE KEY BOARD INPUT ; CHECK IF SOFT KEY MODE 040B 80 3E 00D5 R 00 CMP SFKEYFLG,0 ; CHECK SOFTKEY MODE 0410 75 14 JNE CONST020 ; YES ; CHECK IF KB FIFO = EMPTY ? 0412 A0 0092 R MOV AL,KBIN 0415 3A 06 0093 R CMP AL,KBOUT 0419 75 0B JNE CONST020 ; NOT EMPTY ; CHECK REPEAT STATUS 041B 80 3E 016B R 00 CMP KBREPFLG,0 0420 75 04 JNE CONST020 0422 CONST010: 0422 B0 00 MOV AL,00H 0424 EB 02 JMP SHORT CONST030 0426 CONST020: 0426 B0 FF MOV AL,0FFH ; READY TO GET DATA 0428 CONST030: 0428 C3 RET  The Microsoft MACRO Assembler , Version 1.25 Page 1-15 USCONIN 01-31-84 PAGE ;********************************************* ;* * ;* CONIN (CONSOLE INPUT) * ;* * ;********************************************* 0429 CONIN: 0429 FC CLD ;------------------------------------------------------------------------------ ;* ;* ESC MODE PROC. ;* 042A 83 3E 0000 E 00 CMP ESCCPRCNT,0 042F 74 12 JE CONIN999 0431 BB 0008 MOV BX,8 0434 2B 1E 0000 E SUB BX,ESCCPRCNT 0438 8A 87 0000 E MOV AL,ESCCPR[BX] 043C FF 0E 0000 E DEC ESCCPRCNT 0440 E9 04DB R JMP CONINRET 0443 CONIN999: ;------------------------------------------------------------------------------ 0443 CONIN000: ; ;* INPUT KEY CODE ; ; SOFT KEY PROC. 0443 80 3E 00D5 R 00 CMP SFKEYFLG,0 ; CHECK SOFTKEY 0448 74 11 JE CONIN010 ; MODE 044A 8B 1E 00D6 R MOV BX, SFKEYPTR 044E 8A 07 MOV AL,[BX] 0450 FF 06 00D6 R INC SFKEYPTR 0454 FE 0E 00D5 R DEC SFKEYFLG 0458 EB 5F 90 JMP CONIN030 045B CONIN010: 045B E8 03FD R CALL CONST 045E 3C 00 CMP AL,0 0460 74 F9 JE CONIN010 0462 80 3E 016B R 00 CMP KBREPFLG,0 0467 74 0A JE CONIN018 ; REPEAT PROC 0469 C6 06 016B R 00 MOV KBREPFLG,0 046E A0 016D R MOV AL,SVDATA 0471 EB 03 JMP SHORT CONIN019 ; GET KEY IN DATA FROM KB FIFO BUFFER 0473 CONIN018: 0473 E8 04E0 R CALL KBGET ; ;* CODE CONVERT  ; 0476 CONIN019: 0476 E8 050C R CALL CODCHNG ; DATA CHECK AND CONV.  The Microsoft MACRO Assembler , Version 1.25 Page 1-16 USCONIN 01-31-84 0479 80 3E 00D5 R 00 CMP SFKEYFLG,0 047E 75 C3 JNE CONIN000 0480 80 FA 00 CMP DL,00H 0483 74 BE JE CONIN000 0485 CONIN020: ; CHECK FOR UPPER OR LOWER CASE OF ENGLISH LETTER 0485 C6 06 016C R 00 MOV KBULFLG,0 048A F6 06 00D9 R 80 TEST KBSW1,80H 048F 75 04 JNZ CONIN021 0491 FE 06 016C R INC KBULFLG 0495 CONIN021: ;--- rmg / necis / 1-3-84 --- delete next two lines ; TEST KBSW1,20H ; JNZ CONIN030 ; IF ALT KEY LATCHED 0495 3C 41 CMP AL,41H 0497 7C 20 JL CONIN030 ; IF NOT NOMAL (A-Z) KEY SHIFTED 0499 3C 5A CMP AL,5AH 049B 7E 13 JLE CONIN023 ; IF NOMAL (A-Z) KEY SHIFTED 049D 3C 61 CMP AL,61H 049F 7C 18 JL CONIN030 ; IF NOT NOMAL (A-Z) KEY UNSIFTED 04A1 3C 7A CMP AL,7AH 04A3 7F 14 JG CONIN030 ; IF NOT NOMAL (A-Z) KEY UNSIFTED 04A5 CONIN022: 04A5 80 3E 016C R 00 CMP KBULFLG,0 04AA 75 0D JNE CONIN030 ; IF CAPS KEY UNLATCHED 04AC 2C 20 SUB AL,20H ; CODE CONVERT (SMALL<--LARGE) 04AE EB 09 JMP SHORT CONIN030 04B0 CONIN023: 04B0 80 3E 016C R 00 CMP KBULFLG,0 04B5 75 02 JNE CONIN030 ; IF CAPS KEY UNLATCHFD 04B7 04 20 ADD AL,20H ; CODE CONVERT (LARGE<--SMALL) 04B9 CONIN030: ; AND AL,7FH ; REMOVE PARITY BIT 04B9 CONIN040: ; ;* ROLL UP ; ; CHECK IF ROLL DOWN WAS OCCURED 04B9 80 3E 0000 E 00 CMP ROLDCNT,0 04BE 74 1B JE CONINRET 04C0 50 PUSH AX 04C1 2A ED SUB CH,CH 04C3 8A 0E 0000 E MOV CL,ROLDCNT 04C7 CONIN045: 04C7 E8 0000 E CALL ROLLUP 04CA E2 FB LOOP CONIN045 ; ;* DISPLAY CURSOL ; 04CC 8A 36 0000 E MOV DH,LA 04D0 8A 16 0000 E MOV DL,CA 04D4 E8 0000 E CALL KBLCCV 04D7 E8 0000 E CALL KBCSRO  The Microsoft MACRO Assembler , Version 1.25 Page 1-17 USCONIN 01-31-84 04DA 58 POP AX 04DB CONINRET: 04DB 8A 26 00D9 R MOV AH,KBSW1 ;AH=GENEREATE CONTROLL DATA 04DF C3 RET  The Microsoft MACRO Assembler , Version 1.25 Page 1-18 USCONIN 01-31-84 PAGE ;************************************************************************ ;* KBGET * ;* GET KEY IN DATA FROM KB FIFO BUFFER * ;* * ;* INPUT NONE * ;* OUTPUT AX = DATA * ;* SVDATA=DATA * ;* KBSWI =CONTROL DATA * ;* * ;************************************************************************ 04E0 KBGET: 04E0 51 PUSH CX 04E1 2A E4 SUB AH,AH 04E3 BB 0094 R MOV BX,OFFSET KBFIFO 04E6 A0 0093 R MOV AL,KBOUT 04E9 03 D8 ADD BX,AX 04EB 8A 07 MOV AL,[BX] ; GET CONTROL CODE 04ED A2 00D9 R MOV KBSW1,AL 04F0 8A 47 01 MOV AL,1[BX] ; GET DATA 04F3 A2 016D R MOV SVDATA,AL ; MAINTENANCE KBOUT POINTER 04F6 B1 00 MOV CL,0 04F8 80 3E 0093 R 3E CMP KBOUT,KBFIFOSZ-2 04FD 74 07 JE KBGETRET 04FF 8A 0E 0093 R MOV CL,KBOUT 0503 80 C1 02 ADD CL,2 0506 KBGETRET: 0506 88 0E 0093 R MOV KBOUT,CL 050A 59 POP CX 050B C3 RET  The Microsoft MACRO Assembler , Version 1.25 Page 1-19 USCONIN 01-31-84 PAGE ;********************************************************************** ;* KEY-IN DATA CHECK AND CHANGE ROUTINE * ;* * ;* INPUT AL ; JIS8 CODE * ;* OUTPUT DL ; = 0 : ERROR RETURN * ;* = FF : NORMAL RETURN * ;* AL = ASCII CODE * ;********************************************************************** 050C CODCHNG: 050C 2A E4 SUB AH,AH 050E 2A ED SUB CH,CH ; ;* FUNCTION KEY (SOFT KEY) ; 0510 50 PUSH AX 0511 3D 0080 CMP AX,80H 0514 72 3D JB CDCNG040 0516 3D 0095 CMP AX,95H 0519 7F 38 JG CDCNG040 ; IF NOT PF KEY 051B 2C 80 SUB AL,80H 051D B1 04 MOV CL,4 051F D3 E0 SHL AX,CL 0521 BB 0000 E MOV BX,OFFSET SFKEYTBL 0524 03 D8 ADD BX,AX 0526 F6 06 00D9 R 01 TEST KBSW1,01H 052B 74 04 JZ CDCNG010 ; PF (1-16) 052D 81 C3 0160 ADD BX,22*16 ; PF + FNC 0531 CDCNG010: 0531 89 1E 00D6 R MOV SFKEYPTR,BX ; INITIALIZE POINTER 0535 C6 06 00D5 R 00 MOV SFKEYFLG,0 053A CDCNG020: 053A 8A 07 MOV AL,[BX] 053C 3C 00 CMP AL,0 053E  74 07 JE CDCNG030 0540 FE 06 00D5 R INC SFKEYFLG 0544 43 INC BX 0545 EB F3 JMP SHORT CDCNG020 0547 CDCNG030: 0547 80 3E 00D5 R 00 CMP SFKEYFLG,0 054C 74 05 JE CDCNG040 054E 58 POP AX 054F B2 00 MOV DL,0 0551 EB 23 JMP SHORT CDCNGRET ; 0553 CDCNG040: 0553 58 POP AX ; ;* SPECIAL KEY ; 0554 BB 0176 R MOV BX,OFFSET SPCTBL ; BX = SPECIAL KEY TABLE ADDR 0557 B1 02 MOV CL,2 ; POINTER COUNT 0559 E8 063A R CALL KBTBLSRCH ; SPECIAL KEY TABLE SEARCH  The Microsoft MACRO Assembler , Version 1.25 Page 1-20 USCONIN 01-31-84 055C 80 FA 00 CMP DL,0 055F 74 05 JE CDCNG050 ; IF NOT SPECIAL KEY 0561 E8 0577 R CALL SPCCNV ; SPECIAL KEY CHECK AND CNVERT 0564 EB 10 JMP SHORT CDCNGRET ; 0566 CDCNG050: ; ;* ASCII KEY ; 0566 BB 01FC R MOV BX,OFFSET ASCTBL ; BX = ASCII KEY TABLE ADDR 0569 B1 08 MOV CL,8 ; POINTER COUNT 056B E8 063A R CALL KBTBLSRCH ; ASCII KEY TABLE SEARCH 056E 80 FA 00 CMP DL,0 0571 74 03 JE CDCNGRET ; IF ERROR KEY-IN 0573 E8 05DA R CALL ASCCNV ; ASCII KEY CHECK AND CONVERT ; 0576 CDCNGRET: 0576 C3 RET  The Microsoft MACRO Assembler , Version 1.25 Page 1-21 USCONIN 01-31-84 PAGE ;********************************************************************** ;* SPECIAL KEY CHECK AND CONVERT ROUTINE * ;* INPUT AL ; SPECIAL KEY CODE * ;* BX ; SPECIAL KEY TABLE ADDR * ;* OUTPUT DL ; = 0 ERROR RETURN * ;* = 255 NORMAL RETURN * ;* AL = ASCII CODE * ;********************************************************************** 0577 SPCCNV: ; ;* BREAK KEY (WITH SHIFT OR CNTL KEY) ; 0577 3C 96 CMP AL,BSTOP 0579 75 15 JNE SPC030 ; IF NOT BREAK-STOP KEY ; 057B F6 06 00D9 R 02 SPC010: TEST KBSW1,CTLON 0580 75 0A JNZ SPC020 ; IF CTRL = ON 0582 F6 06 00D9 R 40 TEST KBSW1,SFTON 0587 75 03 JNZ SPC020 ; IF SHIFT = ON (SHIFT=CTRL) ;--- rmg / necis / 11-30-83 ; ; permit non shifted code to be converted via table ; ; MOV AL,13H ; BREAK-STOP = CTL-S ; JMP SHORT SPCRET 0589 EB 4B 90 jmp spc060 ; ;--- rmg / necis / 11-30-83 058C B0 03 SPC020: MOV AL,03H ; CTL+BREAK-STOP = CTL-C 058E EB 49 JMP SHORT SPCRET ; ;* MOVE CURSOR KEY (WITH CNTL-KEY) ; 0590 SPC030: 0590 3D 00F7 CMP AX,0F7H 0593 7C 11 JL SPC040 ; IF NOT CURSOR CONTROL KEY 0595 3D 00FA CMP AX,0FAH 0598 7F 0C JG SPC040 ; IF NOT CURSOR CONTROL KEY ; ;--- rmg / necis / 11-30-83 ; ; The following modification permits unshifted (by cntrl) cursor control keys ; to be converted via the spctbl, rather than inline code in cscnv2; ; this permits user modification via spctbl alone ; 059A F6 06 00D9 R 02 test kbsw1,02h 059F 74 35 jz spc060 ; ;--- rmg / necis / 11-30-83  The Microsoft MACRO Assembler , Version 1.25 Page 1-22 USCONIN 01-31-84 05A1 E8 0665 R CALL CDCNV2 ; CURSOR CONTROL KEY CONVERT 05A4 EB 33 JMP SHORT SPCRET ; ;* CLEAR-HOME KEY (WITH SHIFT OR CNTL-KEY) ; 05A6 SPC040: 05A6 3C 9A CMP AL,CHOME 05A8 75 15 JNE SPC050 ; IF NOT CLEAR-HOME KEY 05AA F6 06 00D9 R 02 TEST KBSW1,CTLON 05AF 75 07 JNZ SPC045 ; IF CTRL = ON 05B1 F6 06 00D9 R 40 TEST KBSW1,SFTON 05B6 74 1E JZ SPC060 ; IF SHIFT = OFF 05B8 SPC045: 05B8 E8 0000 E CALL CRTCLR ; CRT ALL CLEAR 05BB B2 00 MOV DL,0 05BD EB 1A JMP SHORT SPCRET ; ;* TAB OR DEL KEY (WITH SHIFT KEY) ; 05BF F6 06 00D9 R 40 SPC050: TEST KBSW1,SFTON ; 05C4 74 10 JZ SPC060 ; IF UNSHIFT 05C6 3C 98 CMP AL,KBTAB 05C8 75 04 JNE SPC055 ; IF NOT TAB KEY 05CA B0 1F MOV AL,1FH ; SHIFT+TAB 05CC EB 0B JMP SHORT SPCRET 05CE 3C FC SPC055: CMP AL,KBDEL 05D0 75 04 JNE SPC060 ; IF NOT DEL KEY 05D2 B0 7F MOV AL,7FH ; RUBOUT CODE SET 05D4 EB 03 JMP SHORT SPCRET ; ;* OTHOR KEY ; 05D6 43 SPC060: INC BX 05D7 8A 07 MOV AL,BYTE PTR[BX] ; 05D9 SPCRET: 05D9 C3 RET  The Microsoft MACRO Assembler , Version 1.25 Page 1-23 USCONIN 01-31-84 PAGE ;**********************************************************************  ;* ASCII KEY CHECK AND CONVERT * ;* INPUT AL ; KEY-IN DATA CODE * ;* BX ; ASCII KEY CODE TABLE ADDR * ;* OUTPUT DL ; = 0 ERROR RETURN * ;* = 255 NORMAL RETURN * ;* AL = ASCII CODE * ;********************************************************************** ; ;* WITH CTRL AND SHIFT-KEY ; 05DA ASCCNV: 05DA F6 06 00D9 R 02 TEST KBSW1,CTLON 05DF 74 2D JZ ASC030 ; IF CTRL KEY = OFF 05E1 F6 06 00D9 R 40 TEST KBSW1,SFTON 05E6 74 17 JZ ASC010 ; IF SHIFT KEY = OFF ;---------------------------------------------------------03/10/1983--- 05E8 3D 005E CMP AX,5EH ; ^ 05EB 74 12 JZ ASC020 05ED 3D 005F CMP AX,5FH ; _ 05F0 74 0D JZ ASC020 05F2 3D 0032 CMP AX,32H ; 2 05F5 75 06 JNZ NEXT001 05F7 B8 0040 MOV AX,40H 05FA EB 03 90 JMP ASC020 05FD NEXT001: ;---------------------------------------------------------------------- 05FD EB 38 JMP SHORT ASCERR ; CTRL+SHIFT+ASCII KEY = ERROR ; ;* WITH CTRL KEY ; 05FF ASC010: ;--- rmg / necis / 1-3-84 --- display speed is changed in intkb, not here! ; CMP AX,30H ; JL ASC020 ; CMP AX,39H ; JG ASC020 ; IF NOT 0 - 9 KEY ; OUTPUT SPEED CONTROL PROC. ; SUB AL,30H ; MOV SPDWK,AL ; JMP SHORT ASCERR ; ;---------------------------------------------------------03/10/1983--- 05FF 3D 0040 ASC020: CMP AX,40H 0602 7C 33 JL ASCERR 0604 3D 005F CMP AX,5FH 0607 7F 2E JG ASCERR ; IF NOT @ - _ KEY ;---------------------------------------------------------------------- 0609 E8 0662 R CALL KBCTRL ; CTRL + ASCII CHARACTER KEY 060C EB 2B JMP SHORT ASCRET ; ;* WITH OTHER KEY (ALT,SHIFT,GRPH1,GRPH2)  The Microsoft MACRO Assembler , Version 1.25 Page 1-24 USCONIN 01-31-84 ; 060E 8A 0E 00D9 R ASC030: MOV CL,KBSW1 0612 80 E1 7F AND CL,7FH ; MASK CAPS LOCK 0615 53 PUSH BX ; SAVE ASCII TABLE ADDR 0616 BB 01E2 R MOV BX,OFFSET KBSW1TBL ; 0619 80 3F FF ASC040: CMP BYTE PTR[BX],0FFH 061C 74 18 JE ASC060 ; IF ERROR SIGNAL 061E 38 0F CMP BYTE PTR[BX],CL 0620 74 04 JE ASC050 ; IF MACTH SIGNAL 0622 43 INC BX 0623 43 INC BX 0624 EB F3 JMP SHORT ASC040 0626 43 ASC050: INC BX 0627 8A 0F MOV CL,BYTE PTR[BX] 0629 5B POP BX 062A 2A ED SUB CH,CH 062C 03 D9 ADD BX,CX 062E 8A 07 MOV AL,BYTE PTR[BX] ; GET ASCII CONVERT CODE 0630 3C 00 CMP AL,0 0632 75 05 JNE ASCRET ; IF NOT NOTHING CODE 0634 EB 01 JMP SHORT ASCERR ; 0636 5B ASC060: POP BX  0637 B2 00 ASCERR: MOV DL,0 ; ERROR RETURN CODE SET ; 0639 ASCRET: 0639 C3 RET  The Microsoft MACRO Assembler , Version 1.25 Page 1-25 USCONIN 01-31-84 PAGE ;********************************************************************** ;* KEY-IN DATA TABLE SERCH ROUTINE * ;********************************************************************** 063A KBTBLSRCH: 063A 80 3F 00 CMP BYTE PTR[BX],00H 063D 74 08 JE KBTBLERR ; IF DATA END (ERROR) 063F 38 07 CMP BYTE PTR[BX],AL 0641 74 08 JE KBTBLNML ; IF DATA CODE MATCH 0643 03 D9 ADD BX,CX ; TABLE ADDR UP 0645 EB F3 JMP SHORT KBTBLSRCH ; NEXT SEARCH 0647 KBTBLERR: 0647 B2 00 MOV DL,0 0649 EB 02 JMP SHORT KBTBLRET 064B KBTBLNML: 064B B2 FF MOV DL,0FFH 064D KBTBLRET: 064D C3 RET ;******************************************** ;* RETURN BOOT * ;******************************************** 064E KBBOOT: 064E FA CLI ;----------------------------------------------------------------------------- ; Reset graphics board hardware on reboot RMG 6-14-83 ; 064F B0 00 mov al,00h 0651 E6 72 out 72h,al ; ;----------------------------------------------------------------------------- 0653 2B C0 SUB AX,AX 0655 8E C0 MOV ES,AX 0657 8E D0 MOV SS,AX 0659 0E push cs ; rmg / necis / 12-5-83 065A 1F pop ds ; for nmi button boot request 065B BC FF00 MOV SP,OFFSET BOOTSTAK 065E FF 2E 0172 R JMP DWORD PTR BOOTOF ; ;********************************************* ;* CTRL+KEY PROC. * ;********************************************* 0662 KBCTRL: 0662 2C 40 SUB AL,40H ; CTRL+KEY CODE CONVERT 0664 C3 RET  ; ;********************************************* ;* DATA CODE CONVERTION ROUTINE 2 * ;* (CURSOR POSITON CONVERT) * ;********************************************* 0665 CDCNV2: ; ;* WITH CNTL-KEY ;  The Microsoft MACRO Assembler , Version 1.25 Page 1-26 USCONIN 01-31-84 ;--- rmg / necis / 11-30-83 ; ; *** delete next two instructions ; ; TEST KBSW1,02H ; CHECK CTL-KEY ; JZ CDCNV2009 ; ;--- rmg / necis / 11-30-83 0665 80 3E 0000 E 00 CMP FLAGX,0 066A 75 10 JNE CDCNV2006 066C 3C F7 CMP AL,0F7H ; CTL-VERTICAL UP 066E 75 05 JNE CDCNV2005 0670 E8 0000 E CALL ROLLDOWN 0673 EB 07 JMP SHORT CDCNV2006 0675 CDCNV2005: 0675 3C F8 CMP AL,0F8H ; CTL-LINE FEED 0677 75 03 JNE CDCNV2006 0679 E8 0000 E CALL ROLLUP 067C CDCNV2006: 067C E8 0000 E CALL CSWRT 067F B2 00 MOV DL,00H 0681 EB 00 JMP SHORT CDCNV2040 ; ;* WITH NOTING ; ;--- rmg / necis / 11-30-83 ; ; delete the following section (non-cntrl keys now handled driectly in spccnv) ; ;CDCNV2009: ; CMP AL,0F7H ; JNE CDCNV2010 ; IF NOT VERTICAL UP ; MOV AL,0BH ; JMP SHORT CDCNV2040 ;CDCNV2010: ; CMP AL,0F8H ; JNE CDCNV2020 ; IF NOT LINE FEED ; MOV AL,0AH ; JMP SHORT CDCNV2040 ;CDCNV2020: ; CMP AL,0F9H ; JNE CDCNV2030 ; IF NOT FORM FEED ; MOV AL,0CH ; JMP SHORT CDCNV2040 ;CDCNV2030: ; MOV AL,1DH ; ;--- rmg / necis / 11-30-83 0683 CDCNV2040: 0683 C3 RET  The Microsoft MACRO Assembler , Version 1.25 Page 1-27 USCONIN 01-31-84 PAGE ;********************************************************************** ;* KEY BOARD INTERRUPT ROUTINE * ;********************************************************************** 0684 INTKB: ; DISABLE EXTERNAL INTERRUPT 0684 E8 0AFF R CALL REGSAVE 0687 80 3E 00DC R 00 CMP SYSKEYINFLG,0 068C 74 05 JE INTKB000 ; IF ENABLE KEY BOARD INPUT 068E E4 48 in al,kbinp ; --- clr port if kb disabled --- rmg 1-3-84 0690 E9 07AB R JMP INTKB05 ; IF DISABLE KEY BOARD INPUT ; ; GET DATA FROM KB & SET IT TO FIFO BUFFER ; 0693 INTKB000: 0693 E4 4A IN AL,KBSTP ; READ STATUS 0695 A8 01 TEST AL,01H 0697 74 05 JZ INTKB00 0699 E4 48 IN AL,KBINP ; DUMMY GET 069B E9 07AB R JMP INTKB05 069E INTKB00: ; ; GENERATE CONTROL DATA ; BIT ; KBSW0 = 0 ; FNC ; 1 ; CNTRL ; 2 ; GRPH 1 ; 3 ; GRPH 2  ; 4 ; NOT USED ; 5 ; ALT ; 6 ; SHIFT ; 7 ; CAPS LOCK ; ; (1) CHECK SW SIGNAL ; 069E E4 4C IN AL,KBSWP 06A0 24 2F AND AL,2FH ; MASK NOT USED FLAG 06A2 A2 00D8 R MOV KBSW0,AL ; ; (2) CHECK SHIFT STATUS ; 06A5 E4 4E IN AL,KBSFP 06A7 A8 01 TEST AL,01H 06A9 74 05 JZ INTKB03 ; IF NOT SHIFT 06AB 80 0E 00D8 R 40 OR KBSW0,40H ; SHIFT 06B0 INTKB03: 06B0 A8 04 TEST AL,04H 06B2 74 05 JZ INTKB04 ; IF NOT CAPS 06B4 80 0E 00D8 R 80 OR KBSW0,80H ; CAPS LOCK 06B9 INTKB04: 06B9 E4 48 IN AL,KBINP ; GET KEY-IN DATA 06BB A2 00D4 R MOV KBIND,AL ;----------------------------------------------------------------03/25/1983---  The Microsoft MACRO Assembler , Version 1.25 Page 1-28 USCONIN 01-31-84 06BE 3C 96 CMP AL,BSTOP 06C0 75 0F JNE INTKB005 ; IF NOT BREAK-STOP KEY ;--- rmg / necis / 1-3-84 --- flush kb fifo is break stop and not (fnc+ctrl) ; TEST KBSW0,01H ; JZ INTKB005 ; IF NOT FNC ON ; TEST KBSW0,02H ; JZ INTKB005 ; IF NOT CNTL ON 06C2 8A 26 00D8 R mov ah,kbsw0 06C6 80 E4 03 and ah,03h 06C9 80 FC 03 cmp ah,03h 06CC 75 6D jne yes_flush ;--- rmg / necis / 1-3-84 ; ; RETURN BOOT ; 06CE E8 064E R CALL KBBOOT ; RETURN BOOT 06D1 INTKB005: ; ;--- rmg / necis / 1-4-84 --- check for screen dump as in NEC/T release ; ; check for crt dump, display speed change request ; 06D1 3C FF cmp al,kbprint ; print key? 06D3 75 22 jne intkb006 06D5 8A 26 00D8 R mov ah,kbsw0 06D9 80 E4 03 and ah,03h 06DC B1 00 mov cl,0 06DE 80 FC 02 cmp ah,02h ; ctrl? 06E1 74 0E je intkb056 06E3 B1 01 mov cl,1 06E5 80 FC 01 cmp ah,01h ; fnc? 06E8 74 07 je intkb056 06EA B1 02 mov cl,2 06EC 80 FC 03 cmp ah,03h 06EF 75 06 jne intkb006 06F1 intkb056: 06F1 E8 0000 E call scrdump 06F4 E9 07AB R jmp intkb05 06F7 intkb006: ; ; display speed change request (CTRL + 0...9) ; 06F7 8A 26 00D8 R MOV AH,KBSW0 06FB 80 E4 4F AND AH,4FH 06FE 80 FC 02 CMP AH,02H ; WITH CNTL (UNSHIFT) 0701 75 10 JNE INTKB007 0703 3C 30 CMP AL,30H ; FROM '0' TO '9' WITH CTRL (UNSHIFT) 0705 7C 0C JL INTKB007 0707 3C 39 CMP AL,39H 0709 7F 08 JG INTKB007 070B 2C 30 SUB AL,30H  The Microsoft MACRO Assembler , Version 1.25 Page 1-29 USCONIN 01-31-84 070D A2 016E R MOV SPDWK,AL ; SET CRT DISPLAY SPEED 0710 E9 07AB R JMP intkb05 ; --- rmg / necis / 1-4-84 --- dont nq it! 0713 INTKB007: 0713 8A 26 00D8 R MOV AH,KBSW0 0717 80 E4 4F AND AH,4FH 071A 3D 005E CMP AX,005EH ; '^' WITHOUT SHIFT AND CTRL 071D 74 1C JE YES_FLUSH ; ;------------------------------------------------02/26,02/23/1983------ ; ; CHECK CONTROL CODE [ ctrl-C,ctrl-S,ctrl-F ] ; 071F F6 06 00D8 R 02 TEST KBSW0,2 0724 74 23 JZ NO_FLUSH 0726 80 3E 00D4 R 43 CMP KBIND,'C' 072B 74 0E JZ YES_FLUSH 072D 80 3E 00D4 R 53 CMP KBIND,'S' 0732 74 07 JZ YES_FLUSH 0734 80 3E 00D4 R 46 CMP KBIND,'F' 0739 75 0E JNZ NO_FLUSH 073B YES_FLUSH: 073B C6 06 00D5 R 00 mov sfkeyflg,0 ; --- rmg / necis / 1-3-84 0740 C7 06 0000 E 0000 mov esccprcnt,0 ; --- rmg / necis / 1-3-84 0746 E8 07B4 R call flush 0749 NO_FLUSH: 0749 F6 06 00D8 R 20 test kbsw0,20h ; --- rmg / necis / 1-3-84 alt? 074E 74 08 jz intkb0082 ; 1-3-84 0750 80 0E 0000 E 04 or altrbytflg,04h ; 1-3-84 0755 EB 06 90 jmp intkb0084 ; 1-3-84 0758 intkb0082: ; 1-3-84 0758 80 26 0000 E FB and altrbytflg,(not 04h) ; 1-3-84 075D intkb0084: ; 1-3-84 ;---------------------------------------------------------------------- ; ; CHECK FIFO FULL ; 075D B1 00 MOV CL,0 075F 80 3E 0092 R 3E CMP KBIN,KBFIFOSZ-2 0764 74 07 JE INTKB01 0766 8A 0E 0092 R MOV CL,KBIN 076A 80 C1 02 ADD CL,2 076D INTKB01: 076D 3A 0E 0093 R CMP CL,KBOUT ; FIFO FULL : ; (KBIN+2) MOD 64 = KBOUT ? 0771 75 07 JNE NOTFULL ; NO ; ; FIFO IS FULL - chirp - rmg / necis / 1-23-84 ; 0773 B0 39 MOV AL,39H 0775 E6 60 OUT 60H,AL 0777 EB 32 90 JMP INTKB05 077A NOTFULL:  The Microsoft MACRO Assembler , Version 1.25 Page 1-30 USCONIN 01-31-84 077A 80 3E 00DB R 00 CMP CLICKFLG,0 077F 74 03 JE INTKB02 ; KEY CLICK OFF 0781 E8 0BD3 R CALL KBCLICK ; YEY CLICK 0784 INTKB02: ; ; SET CONTROL AND INPUT DATA TO FIFO BUFFER ; 0784 BB 0094 R MOV BX,OFFSET KBFIFO 0787 A0 0092 R MOV AL,KBIN 078A 98 CBW 078B 03 D8 ADD BX,AX 078D A0 00D8 R MOV AL,KBSW0 0790 88 07 MOV BYTE PTR [BX],AL ; CONTROL DATA 0792 43 INC BX 0793 A0 00D4 R MOV AL,KBIND 0796 88 07 MOV BYTE PTR [BX],AL ; ; MAINTENANCE KBIN POINTER ; 0798 88 0E 0092 R MOV KBIN,CL 079C C6 06 0167 R 00 MOV KBREPDELAY,0 07A1 C6 06 0168 R 00 MOV KBREPRATE,0 07A6 C6 06 016B R 00 MOV KBREPFLG,0 ; ; RESTORE REGISTER ; 07AB INTKB05: 07AB C6 06 00E2 R 01 MOV INTKBFLG,1 ; IF KB INPUT SET ON 07B0 E8 0B48 R CALL REGRESTORE ; ; ; 07B3 CF IRET ; RETURN  ; ; keyboard flush routine ; ; rmg / necis / 12-5-83 ; 07B4 flush: 07B4 9C pushf 07B5 FA cli 07B6 C6 06 0092 R 00 mov kbin,0 07BB C6 06 0093 R 00 mov kbout,0 07C0 C6 06 0000 E 01 mov flushflg,1 07C5 9D popf 07C6 C3 ret  The Microsoft MACRO Assembler , Version 1.25 Page 1-31 USCONIN 01-31-84 PAGE ;************************************************************************ ;* * ;* * ;* INTTM TIMER INTERRUPT ROUTINE * ;* * ;* * ;************************************************************************ 07C7 INTTM: 07C7 E8 0B69 R CALL REGSAVETM ; ;* RELOAD 25MS COUNTER ; 07CA B0 04 MOV AL,04H 07CC E6 46 OUT 46H,AL ; RESET TIMER INTERRUPT 07CE 2A C0 SUB AL,AL 07D0 E6 29 OUT 29H,AL 07D2 B0 F0 MOV AL,0F0H ; 25MS 07D4 E6 29 OUT 29H,AL 07D6 FE 06 00DF R INC INTTMEVEN 07DA F6 06 00DF R 01 TEST INTTMEVEN,01H 07DF 74 03 JZ INTTM00 07E1 E9 08B2 R JMP INTTMRET 07E4 INTTM00: ; ;* REPEAT CHECK ; 07E4 A0 0092 R MOV AL,KBIN 07E7 3A 06 0093 R CMP AL,KBOUT 07EB 75 3D JNE INTTM03 ; IF KB FIFO IS NOT EMPTY 07ED E4 4C IN AL,KBSWP 07EF A8 10 TEST AL,10H 07F1 74 37 JZ INTTM03 ; IF REPEAT SIGNAL OFF ; 07F3 80 3E 0167 R 00 CMP KBREPDELAY,0 07F8 75 22 JNE INTTM02 07FA INTTM01: 07FA 80 3E 0168 R 00 CMP KBREPRATE,0 07FF 75 08 JNE INTTM011 0801 A0 0163 R MOV AL,REPDELAY 0804 A2 0167 R MOV KBREPDELAY,AL ; SET 1 SEC DELAY COUNTER 0807 EB 30 JMP SHORT INTTM04 0809 INTTM011: 0809 FE 0E 0168 R DEC KBREPRATE ; COUNT DOWN KB REPEAT RATE COUNTER  080D 75 2A JNZ INTTM04 080F C6 06 016B R 01 MOV KBREPFLG,1 0814 A0 0164 R MOV AL,REPRATE 0817 A2 0168 R MOV KBREPRATE,AL 081A EB 1D JMP SHORT INTTM04 081C INTTM02: ; COUNT DOWN KB REPEAT-DELAY COUNTER 081C FE 0E 0167 R DEC KBREPDELAY  The Microsoft MACRO Assembler , Version 1.25 Page 1-32 USCONIN 01-31-84 0820 75 17 JNZ INTTM04 0822 A0 0164 R MOV AL,REPRATE 0825 A2 0168 R MOV KBREPRATE,AL 0828 EB 0F JMP SHORT INTTM04 082A INTTM03: 082A C6 06 0166 R 00 MOV SYSTMCHK,0 082F C6 06 0167 R 00 MOV KBREPDELAY,0 0834 C6 06 0168 R 00 MOV KBREPRATE,0 ; ;* CHECK DISK CHANGE, STATUS OF LOCK KEY AND TIME ; 0839 INTTM04: 0839 A0 00DD R MOV AL,SYSDSPFLG 083C 32 06 00DE R XOR AL,SYSDSPFSAV 0840 74 04 JZ INTTM040 0842 FE 06 00E0 R INC DISPREQ ; REQUEST DISPLAY STATUS 0846 INTTM040: 0846  80 3E 0169 R 00 CMP KBMODECHK,0 ; FINISH TIMEDELAY OF DISK CHANGE AND CHECK LOCK KEY 084B 75 1B JNZ INTTM041 ;--- rmg / necis / 11-30-83 ; 084D 80 3E 0000 E 00 cmp hd_time_flush,0 0852 74 09 jz inttm0400 0854 FE 0E 0000 E dec hd_time_flush 0858 75 03 jnz inttm0400 085A E8 0000 E call hd_flush_buf 085D inttm0400: ; ;--- rmg / necis / 11-30-83 085D E8 08B6 R CALL KBSTCHK 0860 A0 0165 R MOV AL,MODECHK 0863 A2 0169 R MOV KBMODECHK,AL 0866 EB 11 JMP SHORT INTTM042 0868 INTTM041: 0868 FE 0E 0169 R DEC KBMODECHK 086C 80 3E 0166 R 00 CMP SYSTMCHK,0 ; FINISH TIMEDELAY OF CLOCK 0871 74 06 JZ INTTM042 0873 FE 0E 0166 R DEC SYSTMCHK ; COUNT DOWN 0877 EB 28 JMP SHORT INTTM05 0879 INTTM042: 0879 A0 0162 R MOV AL,TMCHK 087C A2 0166 R MOV SYSTMCHK,AL 087F E8 0A35 R CALL GETTIME2 ; GET TIME 0882 A0 00F8 R MOV AL,SYSMIN 0885 80 3E 00F6 R 02 CMP SYSTMFLG,2 ; IF CLOCK REWRITED 088A 74 06 JE INTTM045 088C 3A 06 00FC R CMP AL,OLDMIN ; CHANGE MINITE ? 0890 74 0F JE INTTM05 ; CONVERT TIME DATA & SET IT TO DISPLAY BUFFER 0892 INTTM045: 0892 C6 06 00F6 R 00 MOV SYSTMFLG,0 ; SYSTM FLAG RESET 0897 A2 00FC R MOV OLDMIN,AL 089A E8 0A8C R CALL TIMESET  The Microsoft MACRO Assembler , Version 1.25 Page 1-33 USCONIN 01-31-84 089D FE 06 00E0 R INC DISPREQ ; REQUEST DISPLAY STATUS ; ;* DISPAY STATUS ; 08A1 INTTM05: 08A1 80 3E 00E0 R 00 CMP DISPREQ,0 ; REQUST STATUS ? 08A6 75 07 JNE INTTM051 08A8 80 3E 00E1 R 00 CMP DISPREQKB,0 ; REQUEST DISPLAY LOCKED KEY ? 08AD 74 03 JE INTTMRET 08AF INTTM051: 08AF E8 097C R CALL DISPSTATUS 08B2 INTTMRET: 08B2 E8 0BB2 R CALL REGRESTORETM 08B5 CF IRET  The Microsoft MACRO Assembler , Version 1.25 Page 1-34 USCONIN 01-31-84 PAGE ;********************************************************************** ;* KB STATUS CHECK ROUTINE * ;********************************************************************** 08B6 KBSTCHK: 08B6 80 3E 00E2 R 00 CMP INTKBFLG,0 ; IF KEY IN 08BB 74 39 JE KBSTCHK03 08BD C6 06 00E2 R 00 MOV INTKBFLG,0 ; FLAG RESET ; ;* CAPS KEY ; 08C2 C6 06 00E5 R 00 MOV KBSFSAV,0 08C7 E4 4E IN AL,KBSFP 08C9 A8 04 TEST AL,04H 08CB 75 04 JNZ KBSTCHK01 08CD FE 06 00E5 R INC KBSFSAV 08D1 KBSTCHK01: 08D1 A0 00E5 R MOV AL,KBSFSAV ; SAME AS OLD STATUS OF CAPS KEY ? 08D4 32 06 00E6 R XOR AL,KBSFSAV1 08D8 74 1C JZ KBSTCHK03 08DA FE 06 00E1 R INC DISPREQKB ; REQUEST DISPLAY STATUS OF LOCKED KEY 08DE A0 00E5 R MOV AL,KBSFSAV 08E1 A2 00E6 R MOV KBSFSAV1,AL 08E4 KBSTCHK02: 08E4 BB 00E7 R MOV BX,OFFSET KBSTBUF ; SET SCREEN MEMORY ADDRESS 08E7 80 3E 00E5 R 00 CMP KBSFSAV,0 08EC 74 05 JE KBSTCHK021 08EE E8 0970 R CALL KBATTOFF ; IF CAPS IS LOCKED 08F1 EB 03 JMP SHORT KBSTCHK03 08F3 KBSTCHK021: 08F3 E8 096C R CALL KBATTON ; IF CAPS IS NOT LOCKED ; ;* ALT,GRPH1,GRPH2 KEY ; 08F6 KBSTCHK03: 08F6 E4 4C IN AL,KBSWP ; GET KB STATUS 08F8 24 2C AND AL,2CH ;--- rmg / necis / 1-3-84 --- set altrbyt according to state of ALT key 08FA 8A 26 0000 E mov ah,altrbytflg 08FE 80 E4 FB and ah,(not 04h) 0901 A8 20 test al,20h ; alt key latched? 0903 74 03 jz kbstchk0304 0905 80 CC 04 or ah,04h 0908 kbstchk0304: 0908 88 26 0000 E mov altrbytflg,ah 090C F6 C4 0F test ah,0fh ; alt? 090F 74 02 jz kbstchk0306 0911 0C 20 or al,20h ; set alt flag 0913 kbstchk0306: ;--- rmg / necis / 1-3-84 0913 A2 00E3 R MOV KBSWSAV,AL  The Microsoft MACRO Assembler , Version 1.25 Page 1-35 USCONIN 01-31-84 0916 32 06 00E4 R XOR AL,KBSWSAV1 091A 74 3A JZ KBSTCHK06 091C FE 06 00E1 R INC DISPREQKB ; REQUEST DISPLAY LOCKED KEY 0920 A0 00E3 R MOV AL,KBSWSAV 0923 A2 00E4 R MOV KBSWSAV1,AL 0926 BB 00EB R MOV BX,OFFSET KBSTBUF+4 ; SET SCREEN MEMORY ADDRESS ;* ALT KEY 0929 F6 06 00E3 R 20 TEST KBSWSAV,20H ; ALT MODE CHECK 092E 74 05 JZ KBSTCHK031 0930 E8 096C R CALL KBATTON ; IF ALT MODE 0933 EB 03 JMP SHORT KBSTCHK04 0935 KBSTCHK031: 0935 E8 0970 R CALL KBATTOFF ; IF NOT ALT MODE ;* GRPH1 KEY 0938 KBSTCHK04: 0938 F6 06 00E3 R 04 TEST KBSWSAV,04H ; GRPH1 MODE CHECK 093D 74 05 JZ KBSTCHK041 093F E8 096C R CALL KBATTON ; IF GRPH1 MODE 0942 EB 03 JMP SHORT KBSTCHK05 0944 KBSTCHK041:  0944 E8 0970 R CALL KBATTOFF ; IF NOT GRPH1 MODE ;* GRPH2 KEY 0947 KBSTCHK05: 0947 F6 06 00E3 R 08 TEST KBSWSAV,08H ; GRPH2 MODE CHECK 094C 74 05 JZ KBSTCHK051 094E E8 096C R CALL KBATTON ; IF GRPH2 MODE 0951 EB 03 JMP SHORT KBSTCHK06 0953 KBSTCHK051: 0953 E8 0970 R CALL KBATTOFF ; IF NOT GRPH2 MODE ; ;* SPEED OF DISPLAY TO GDC ; 0956 KBSTCHK06: 0956 A0 016E R MOV AL,SPDWK 0959 3A 06 016F R CMP AL,SPDSAV ; SAME AS OLD SPEED ? 095D 74 0C JE KBSTCHKRET 095F A2 016F R MOV SPDSAV,AL 0962 0C 30 OR AL,30H 0964 A2 0132 R MOV STATUSSP,AL 0967 FE 06 00E0 R INC DISPREQ ; REQUEST DISPLAY STATUS 096B KBSTCHKRET: 096B C3 RET ;******************************************************** ;* * ;* SET ATTRIBUTE OF LOCKED KEY STATUS * ;* * ;* MODULE "KBATTON" SET NORMAL *  ;* MODULE "KBATTOFF" SET REVERSE * ;* * ;* INPUT BX ATTRIBUTE ADDRESS * ;* OUTPUT BX BX + 4 * ;* CX 0 * ;* AL 80H OR 90H *  The Microsoft MACRO Assembler , Version 1.25 Page 1-36 USCONIN 01-31-84 ;* * ;******************************************************** 096C KBATTON: 096C B0 90 MOV AL,90H ; ATTRIBUTE DEFAULT 096E EB 02 JMP SHORT KBATSET 0970 KBATTOFF: 0970 B0 80 MOV AL,80H ; ATTRIBUTE REVERSE 0972 KBATSET: 0972 B9 0003 MOV CX,3 0975 KBATSET1: 0975 88 07 MOV [BX],AL ; SET ATTRIBUTE DATA 0977 43 INC BX 0978 E2 FB LOOP KBATSET1 097A 43 INC BX 097B C3 RET  The Microsoft MACRO Assembler , Version 1.25 Page 1-37 USCONIN 01-31-84 PAGE ;********************************************************************** ;* DISPSTATUS DISPLAY SYSTEM STATUS LINE * ;********************************************************************** 097C DISPSTATUS: ; ;* CHECK DISPLAY OR ERASE ; 097C 80 3E 016A R 00 CMP GDCBUSYF,0 ; 0981 74 03 JE DISPSTATUS000 ; IF GDC READY 0983 E9 0A34 R JMP DISPSTATUSRET ; IF GDC BUSY 0986 DISPSTATUS000: ; *** change for use with new dmaxfer *** RMG / NECIS *** 9-13-83 0986 80 3E 0000 E 00 cmp dmaxflg,0 ; IN AL,GDCSTATUS ; GDC STATUS READ ; TEST AL,10H ; DMA EXECUTE (DB4) 098B 74 03 JZ DISPSTATUS00 ; IF NOT DMA EXECUTE 098D E9 0A34 R JMP DISPSTATUSRET 0990 DISPSTATUS00: 0990 80 3E 00DE R 00 CMP SYSDSPFSAV,0 ; EXPRESSING ? 0995 74 15 JE DISPSTATUS002 0997 80 3E 00DD R 00 CMP SYSDSPFLG,0 ; REQUEST DISPLAY ? 099C 74 03 JE DISPSTATUS001 ; 099E E9 0A34 R JMP DISPSTATUSRET 09A1 DISPSTATUS001: 09A1 C6 06 00DE R 00 MOV SYSDSPFSAV,0 ; EXPRESSING ? 09A6 FE 06 00E1 R INC DISPREQKB 09AA EB 0B JMP SHORT DISPSTATUS01 09AC DISPSTATUS002: 09AC 80 3E 00DD R 00 CMP SYSDSPFLG,0 09B1 74 04 JE DISPSTATUS01 ; REQUEST DISPLAY ? 09B3 FE 06 00DE R INC SYSDSPFSAV ; SET NOT DISPLAY ; ;* CLEAR CURSOL ; 09B7 DISPSTATUS01: 09B7 FF 36 0000 E PUSH CRTDSP 09BB E8 0000 E CALL CURSOROFF ; DISABLE CURSOL DISPLAY 09BE E8 0000 E CALL KBCSAD ; GET CURSOL ADDRESS FROM UPD7220 09C1 50 PUSH AX ; SAVE CURSOL ADDRESS ; ;* DISPLAY/ERASE STATUS ; 09C2 80 3E 00E0 R 00 CMP DISPREQ,0 09C7 74 35 JE DISPSTATUS04 09C9 C6 06 00E0 R 00 MOV DISPREQ,0 ; CLEAR DISPLAY REQUEST FLAG 09CE B8 0000 MOV AX,0 ; CURSOR POSITION SET TO HOME LINE 09D1 E8 0000 E CALL KBCSRO 09D4 B9 0050 MOV CX,COLUMN 09D7 80 3E 00DD R 00 CMP SYSDSPFLG,0 ; EXPRESSING 09DC 74 0B JE DISPSTATUS02 09DE 49 DEC CX ;--- rmg / necis 11-30-83 --- kbcrtc0 len rel 0 09DF E8 0000 E CALL KBCRTC0 ; ERASE STATUS LINE  The Microsoft MACRO Assembler , Version 1.25 Page 1-38 USCONIN 01-31-84 09E2 C6 06 00E3 R FF MOV KBSWSAV,0FFH 09E7 EB 40 JMP SHORT DISPSTATUS06 09E9 DISPSTATUS02: 09E9 BB 00FD R MOV BX,OFFSET STATUSLINE 09EC DISPSTATUS03: 09EC 8A 07 MOV AL,[BX] ; DISPLAY STATUS LINE 09EE A2 09F9 R MOV STDTBYT,AL 09F1 E8 0000 E CALL KBMOUT 09F4 03 DB 03H 09F5 4220 DW 4220H 09F7 00 STALTBYT DB 00H 09F8 40 DB 40H 09F9 00 STDTBYT DB 00H 09FA 40 DB 40H 09FB 43 INC BX 09FC E2 EE LOOP DISPSTATUS03 ; ;* CHANGE ATTRIBUTE ; 09FE DISPSTATUS04: 09FE 80 3E 00E1 R 00 CMP DISPREQKB,0 0A03 74 24 JE DISPSTATUS06 0A05 C6 06 00E1 R 00 MOV DISPREQKB,0 0A0A B9 000F MOV CX,KBSTBUFSZ 0A0D BB 00E7 R MOV BX,OFFSET KBSTBUF 0A10 B8 101F MOV AX,STATUSKB_AD ; SCREEN ADDRESS FOR KB STATUS 0A13 E8 0000 E CALL KBCSRO 0A16 DISPSTATUS05: 0A16 8A 17 MOV DL,[BX] 0A18 88 16 0A22 R MOV KBATBYT,DL 0A1C E8 0000 E CALL KBMOUT 0A1F 03 DB 03H 0A20 4220 DW 4220H 0A22 00 KBATBYT DB 00H 0A23 40 DB 40H 0A24 00 DB 00H 0A25 40 DB 40H 0A26 43 INC BX 0A27 E2 ED LOOP DISPSTATUS05 ; ;* DISPLAY CURSOL ; 0A29 DISPSTATUS06: 0A29 58 POP AX 0A2A E8 0000 E CALL KBCSRO ; OUTPUT CURSOL ADDRESS 0A2D 8F 06 0000 E POP CRTDSP ; 0A31 E8 0000 E CALL KBCSRD ; OUTPUT CURSOR DISP COMMAND 0A34 DISPSTATUSRET: 0A34 C3 RET  The Microsoft MACRO Assembler , Version 1.25 Page 1-39 USCONIN 01-31-84 PAGE ;************************************************************************ ;* GET TIME ROUTINE * ;* * ;* OUTPUT SYSSEC SECONT * ;* SYSMIN MINITE * ;* SYSHOUR HOUR * ;* SYSDAY DAY * ;* SYSNN MONTH AND WEEK * ;* * ;************************************************************************ 0A35 GETTIME2: 0A35 80 3E 00F6 R 01 CMP SYSTMFLG,01 ; 0A3A 74 4F JE GETTMRET ; WRITING CLOCK NOW 0A3C GETTM01: 0A3C 55 PUSH BP 0A3D BB 00F7 R MOV BX,OFFSET SYSTM ; BX = SYSTEM BUFFER ADDRESS 0A40 F9 STC 0A41 BE 0002 MOV SI,2 ; SI = COUNTER (CNT0) 0A44 BA 0058 MOV DX,0058H ; DX = I/O PORT# 0A47 B0 03 MOV AL,03H ; 0A49 E8 0000 E CALL PSCLKS ; TIME READ 0A4C B0 01 MOV AL,01H ; 0A4E E8 0000 E CALL PSCLKE ; REGISTER SHIFT 0A51 50 PUSH AX 0A52 EC  IN AL,DX ; AL = LSB (SEC.) 0A53 D0 E8 SHR AL,1 ; CF = READ DATA (1BIT) 0A55 D1 DD RCR BP,1 ; BP = READ DATA (STORED) 0A57 58 POP AX 0A58 B1 0F MOV CL,15 ; CL = COUNTER (CNT1) 0A5A EB 03 90 JMP GETTM021 0A5D GETTM02: 0A5D B1 10 MOV CL,16 ; CL = COUNTER (CNT1) 0A5F GETTM021: 0A5F 0C 10 OR AL,10H 0A61 EE OUT DX,AL ; CLK = 1 0A62 56 PUSH SI ; WAIT = 5 (MICRO SEC.) 0A63 5E POP SI 0A64 56 PUSH SI 0A65 5E POP SI 0A66 50 PUSH AX 0A67 EC IN AL,DX ; READ DATA (1BIT) 0A68 D0 E8 SHR AL,1 ; AL = READ DATA (1BIT) 0A6A D1 DD RCR BP,1 ; BP = READ DATA (STORED) 0A6C 58 POP AX 0A6D 24 EF AND AL,0EFH ; 0A6F EE OUT DX,AL ; CLK = 0 0A70 56 PUSH SI ; WAIT = 5 (MICRO SEC.) 0A71 5E POP SI 0A72 56 PUSH SI 0A73 5E POP SI 0A74 90 NOP 0A75 E2 E8 LOOP GETTM021 ; JUMP IF CNT1 NE 0  The Microsoft MACRO Assembler , Version 1.25 Page 1-40 USCONIN 01-31-84 0A77 4E DEC SI ; DEC. SI 0A78 78 0C JS GETTM022 ; SET READ DATA 0A7A 89 2F MOV [BX],BP ; 0A7C 43 INC BX 0A7D 43 INC BX 0A7E 0B F6 OR SI,SI 0A80 75 DB JNZ GETTM02 ; JUMP IF CNT1 NE 0 0A82 B1 08 MOV CL,8 ; CL = COUNTER (CNT1) 0A84 EB D9 JMP GETTM021 0A86 GETTM022: 0A86 8B C5 MOV AX,BP 0A88 88 27 MOV [BX],AH ; 0A8A 5D POP BP 0A8B GETTMRET: 0A8B C3 RET ; RETURN  The Microsoft MACRO Assembler , Version 1.25 Page 1-41 USCONIN 01-31-84 PAGE ;********************************************************************** ;* TIMESET CONVERT TIME DATA TO ASCII * ;********************************************************************** 0A8C TIMESET: 0A8C 1E PUSH DS 0A8D  B8 A000 MOV AX,0A000H ; 0A90 8E D8 MOV DS,AX ; DS = C_MOS SEGMENT 0A92 BB 0100 MOV BX,0100H ; BX = YY ADDRESS 0A95 8B 07 MOV AX,[BX] ; GET YY FROM C_MOS 0A97 1F POP DS 0A98 A3 0145 R MOV STATUSYY,AX ; SET YY STATUS LINE BUFFER 0A9B A0 00FB R MOV AL,SYSMM 0A9E E8 0AF0 R CALL GETNIBBLE 0AA1 50 PUSH AX 0AA2 B4 30 MOV AH,30H ; CONVERT HEX TO ASCII 0AA4 3C 0A CMP AL,10 0AA6 72 04 JB TIMESET01 0AA8 2C 0A SUB AL,10 0AAA B4 31 MOV AH,31H 0AAC TIMESET01: 0AAC 0C 30 OR AL,30H 0AAE 86 E0 XCHG AH,AL 0AB0 A3 013F R MOV STATUSMM,AX 0AB3 58 POP AX ; GET DAY OF WEEK 0AB4 8A C4 MOV AL,AH 0AB6 25 000F AND AX,0FH 0AB9 B9 0003 MOV CX,3 0ABC F7 E1 MUL CX 0ABE BE 014D R MOV SI,OFFSET WEEK 0AC1 03 F0 ADD SI,AX 0AC3 BF 0139 R MOV DI,OFFSET STATUSWK 0AC6 B9 0003 MOV CX,3 0AC9 F3/ A4 REP MOVSB ; DAY 0ACB A0 00FA R MOV AL,SYSDAY 0ACE E8 0AF0 R CALL GETNIBBLE 0AD1 0D 3030 OR AX,3030H 0AD4 A3 0142 R MOV STATUSDD,AX ; HOUR 0AD7 A0 00F9 R MOV AL,SYSHOUR 0ADA E8 0AF0 R CALL GETNIBBLE 0ADD 0D 3030 OR AX,3030H 0AE0 A3 0148 R MOV STATUSHH,AX ; MINUTES 0AE3 A0 00F8 R MOV AL,SYSMIN 0AE6 E8 0AF0 R CALL GETNIBBLE 0AE9 0D 3030 OR AX,3030H 0AEC A3 014B R MOV STATUSMIN,AX 0AEF C3 RET ;********************************************************************** ;* GETNIBBLE *  The Microsoft MACRO Assembler , Version 1.25 Page 1-42 USCONIN 01-31-84 ;* INPUT AL ; 'B7--B4,B3--B0' * ;* OUTPUT AH ; '0000 ,B3--B0' * ;* AL ; '0000 ,B7--B4' * ;********************************************************************** 0AF0 GETNIBBLE: 0AF0 51 PUSH CX 0AF1 8A C8 MOV CL,AL 0AF3 24 0F AND AL,0FH 0AF5 8A E0 MOV AH,AL 0AF7 8A C1 MOV AL,CL 0AF9 B1 04 MOV CL,4 0AFB D2 E8 SHR AL,CL 0AFD 59 POP CX 0AFE C3 RET  The Microsoft MACRO Assembler , Version 1.25 Page 1-43 USCONIN 01-31-84 PAGE ;********************************************************************** ;* REGISTER SAVE ROUTINE * ;********************************************************************** 0AFF REGSAVE: 0AFF 2E: A3 0002 R MOV CS:RS_AX,AX 0B03 58 POP AX 0B04 2E: A3 0004 R MOV CS:RS_RTN,AX 0B08 2E: 89 26 0006 R MOV CS:RS_SP,SP 0B0D 2E: 8C 16 0008 R MOV CS:RS_SS,SS 0B12 BC 004A R MOV SP,OFFSET INTSTACKBASE 0B15 8C C8 MOV AX,CS 0B17 8E D0 MOV SS,AX 0B19 2E: A1 0002 R MOV AX,CS:RS_AX 0B1D 06 PUSH ES  0B1E 1E PUSH DS 0B1F 50 PUSH AX 0B20 53 PUSH BX 0B21 51 PUSH CX 0B22 52 PUSH DX 0B23 55 PUSH BP 0B24 56 PUSH SI 0B25 57 PUSH DI 0B26 2E: 8E 06 0008 R MOV ES,CS:RS_SS 0B2B 2E: 8B 1E 0006 R MOV BX,CS:RS_SP 0B30 26: 8B 47 04 MOV AX,ES:04[BX] 0B34 25 0200 AND AX,0200H 0B37 74 01 JZ REGSAVE1 0B39 FB STI 0B3A REGSAVE1: 0B3A 8C C8 MOV AX,CS 0B3C 8E D8 MOV DS,AX 0B3E 8E C0 MOV ES,AX 0B40 A1 0002 R MOV AX,RS_AX 0B43 FC CLD 0B44 FF 26 0004 R JMP RS_RTN ; RETURN WITHOUT POP STACK ;********************************************************************** ;* REGISTER RESTORE ROUTINE * ;********************************************************************** 0B48 REGRESTORE: 0B48 FA CLI 0B49 58 POP AX 0B4A A3 0004 R MOV RS_RTN,AX 0B4D 5F POP DI 0B4E 5E POP SI 0B4F 5D POP BP 0B50 5A POP DX 0B51 59 POP CX 0B52 5B POP BX ; 0B53 B0 20 MOV AL,20H 0B55 E6 20 OUT ICP1,AL ; OUT EOI TO MASTER PIC (OCW2) 0B57 58 POP AX  The Microsoft MACRO Assembler , Version 1.25 Page 1-44 USCONIN 01-31-84 0B58 1F POP DS 0B59 07 POP ES 0B5A 2E: 8E 16 0008 R MOV SS,CS:RS_SS 0B5F 2E: 8B 26 0006 R MOV SP,CS:RS_SP 0B64 2E: FF 26 0004 R JMP CS:RS_RTN ;********************************************************************** ;* REGSAVETM REGISTER SAVE FOR TIMER * ;********************************************************************** 0B69 REGSAVETM: 0B69 2E: A3 004A R MOV CS:TM_AX,AX 0B6D 58 POP AX 0B6E 2E: A3 004C R MOV CS:TM_RTN,AX 0B72 2E: 89 26 004E R MOV CS:TM_SP,SP 0B77 2E: 8C 16 0050 R MOV CS:TM_SS,SS 0B7C BC 0092 R MOV SP,OFFSET TMSTACKBASE 0B7F 8C C8 MOV AX,CS 0B81 8E D0 MOV SS,AX 0B83 2E: A1 004A R MOV AX,CS:TM_AX 0B87 06 PUSH ES 0B88 1E PUSH DS 0B89 50 PUSH AX 0B8A 53 PUSH BX 0B8B 51 PUSH CX 0B8C 52 PUSH DX 0B8D 55 PUSH BP 0B8E 56 PUSH SI 0B8F 57 PUSH DI 0B90 2E: 8E 06 0050 R MOV ES,CS:TM_SS 0B95 2E: 8B 1E 004E R MOV BX,CS:TM_SP 0B9A 26: 8B 47 04 MOV AX,ES:04[BX] 0B9E 25 0200 AND AX,0200H 0BA1 74 01 JZ REGSAVETM1 0BA3 FB STI 0BA4 REGSAVETM1: 0BA4 8C C8 MOV AX,CS 0BA6 8E D8 MOV DS,AX 0BA8 8E C0 MOV ES,AX 0BAA A1 004A R MOV AX,TM_AX 0BAD FC CLD 0BAE FF 26 004C R JMP TM_RTN ;********************************************************************** ;* REGRESTORETM * ;********************************************************************** 0BB2 REGRESTORETM: 0BB2 FA CLI 0BB3 58 POP AX 0BB4 A3 004C R MOV TM_RTN,AX 0BB7 5F POP DI 0BB8 5E POP SI 0BB9 5D POP BP 0BBA 5A POP DX 0BBB 59 POP CX  The Microsoft MACRO Assembler , Version 1.25 Page 1-45 USCONIN 01-31-84 0BBC 5B POP BX ; 0BBD B0 20 MOV AL,20H 0BBF E6 20 OUT ICP1,AL ; OUT EOI TO MASTER PIC (OCW2) 0BC1 58 POP AX 0BC2 1F POP DS 0BC3 07 POP ES 0BC4 2E: 8E 16 0050 R MOV SS,CS:TM_SS 0BC9 2E: 8B 26 004E R MOV SP,CS:TM_SP 0BCE 2E: FF 26 004C R JMP CS:TM_RTN  The Microsoft MACRO Assembler , Version 1.25 Page 1-46 USCONIN 01-31-84 PAGE ;********************************************************************** ;* KEY-CLICK * ;********************************************************************** 0BD3 KBCLICK: 0BD3 50 PUSH AX 0BD4 51 PUSH CX 0BD5 B0 31 MOV AL,CLICKCNT1 ; CONTROL CMD FOR BELL SOUND 0BD7 E8 0BE7 R CALL CLICKOUT ; TO SOUND LSI PD1771C-005 0BDA B0 63 MOV AL,CLICKCNTBEL 0BDC E8 0BE7 R CALL CLICKOUT 0BDF B0 38 MOV AL,CLICKCLICK 0BE1 E8 0BE7 R CALL CLICKOUT 0BE4 59 POP CX 0BE5 58 POP AX 0BE6 C3 RET ; 0BE7 CLICKOUT: 0BE7 C6 06 0001 R 00 MOV CLICKSTC,0 0BEC 8A E0 MOV AH,AL 0BEE CLICKST: 0BEE 80 3E 0001 R 02 CMP CLICKSTC,2 0BF3 74 19 JE CLICKRET 0BF5 E4 60 IN AL,CLICKSTP 0BF7 A2 0000 R MOV CLICKSTT,AL 0BFA E4 60 IN AL,CLICKSTP 0BFC FE 06 0001 R INC CLICKSTC 0C00 3A 06 0000 R CMP AL,CLICKSTT 0C04 75 E8 JNE CLICKST 0C06 3C 80 CMP AL,CLICKRDY 0C08 75 E4 JNE CLICKST 0C0A 8A C4 MOV AL,AH 0C0C E6 60 OUT CLICKWP,AL 0C0E CLICKRET: 0C0E C3 RET 0C0F CODE ENDS END   The Microsoft MACRO Assembler , Version 1.25 Page Symbols-1 USCONIN 01-31-84 Segments and groups: N a m e Size align combine class CODE . . . . . . . . . . . . . . 0C0F PARA PUBLIC 'CODE' Symbols: N a m e Type Value Attr ALTRBYTFLG . . . . . . . . . . . V BYTE 0000 CODE External ASC010 . . . . . . . . . . . . . L NEAR 05FF CODE ASC020 . . . . . . . . . . . . . L NEAR 05FF CODE ASC030 . . . . . . . . . . . . . L NEAR 060E CODE ASC040 . . . . . . . . . . . . . L NEAR 0619 CODE ASC050 . . . . . . . . . . . . . L NEAR 0626 CODE ASC060 . . . . . . . . . . . . . L NEAR 0636 CODE ASCCNV . . . . . . . . . . . . . L NEAR 05DA CODE ASCERR . . . . . . . . . . . . . L NEAR 0637 CODE ASCRET . . . . . . . . . . . . . L NEAR 0639 CODE ASCTBL . . . . . . . . . . . . . L NEAR 01FC CODE BOOTOF . . . . . . . . . . . . . L WORD 0172 CODE BOOTSE . . . . . . . . . . . . . L WORD 0174 CODE BOOTSTAK . . . . . . . . . . . . Number FF00 BSTOP. . . . . . . . . . . . . . Number 0096 CA . . . . . . . . . . . . . . . V BYTE 0000 CODE External CDCNG010 . . . . . . . . . . . . L NEAR 0531 CODE CDCNG020 . . . . . . . . . . . . L NEAR 053A CODE CDCNG030 . . . . . . . . . . . . L NEAR 0547 CODE CDCNG040 . . . . . . . . . . . . L NEAR 0553 CODE CDCNG050 . . . . . . . . . . . . L NEAR 0566 CODE CDCNGRET . . . . . . . . . . . . L NEAR 0576 CODE CDCNV2 . . . . . . . . . . . . . L NEAR 0665 CODE CDCNV2005. . . . . . . . . . . . L NEAR 0675 CODE CDCNV2006. . . . . . . . . . . . L NEAR 067C CODE CDCNV2040. . . . . . . . . . . . L NEAR 0683 CODE CHOME. . . . . . . . . . . . . . Number 009A CLICKCLICK . . . . . . . . . . . Number 0038 CLICKCNT1. . . . . . . . . . . . Number 0031 CLICKCNTBEL. . . . . . . . . . . Number 0063 CLICKFLG . . . . . . . . . . . . L BYTE 00DB CODE Global CLICKOUT . . . . . . . . . . . . L NEAR 0BE7 CODE CLICKRDY . . . . . . . . . . . . Number 0080 CLICKRET . . . . . . . . . . .  . L NEAR 0C0E CODE CLICKST. . . . . . . . . . . . . L NEAR 0BEE CODE CLICKSTC . . . . . . . . . . . . L BYTE 0001 CODE CLICKSTP . . . . . . . . . . . . Number 0060 CLICKSTT . . . . . . . . . . . . L BYTE 0000 CODE CLICKWP. . . . . . . . . . . . . Number 0060 CODCHNG. . . . . . . . . . . . . L NEAR 050C CODE COLUMN . . . . . . . . . . . . . Number 0050 CONIN. . . . . . . . . . . . . . L NEAR 0429 CODE Global CONIN000 . . . . . . . . . . . . L NEAR 0443 CODE  The Microsoft MACRO Assembler , Version 1.25 Page Symbols-2 USCONIN 01-31-84 CONIN010 . . . . . . . . . . . . L NEAR 045B CODE CONIN018 . . . . . . . . . . . . L NEAR 0473 CODE CONIN019 . . . . . . . . . . . . L NEAR 0476 CODE CONIN020 . . . . . . . . . . . . L NEAR 0485 CODE CONIN021 . . . . . . . . . . . . L NEAR 0495 CODE CONIN022 . . . . . . . . . . . . L NEAR 04A5 CODE CONIN023 . . . . . . . . . . . . L NEAR 04B0 CODE CONIN030 . . . . . . . . . . . . L NEAR 04B9 CODE CONIN040 . . . . . . . . . . . . L NEAR 04B9 CODE CONIN045 . . . . . . . . . . . . L NEAR 04C7 CODE CONIN999 . . . . . . . . . . . . L NEAR 0443 CODE CONINRET . . . . . . . . . . . . L NEAR 04DB CODE CONST. . . . . . . . . . . . . . L NEAR 03FD CODE Global CONST010 . . . . . . . . . . . . L NEAR 0422 CODE CONST020 . . . . . . . . . . . . L NEAR 0426 CODE CONST030 . . . . . . . . . . . . L NEAR 0428 CODE CRTCLR . . . . . . . . . . . . . L NEAR 0000 CODE External CRTDSP . . . . . . . . . . . . . V WORD 0000 CODE External CSWRT. . . . . . . . . . . . . . L NEAR 0000 CODE External CTLON. . . . . . . . . . . . . . Number 0002 CURSOROFF. . . . . . . . . . . . L NEAR 0000 CODE External DISPREQ. . . . . . . . . . . . . L BYTE 00E0 CODE Global DISPREQKB. . . . . . . . . . . . L BYTE 00E1 CODE DISPSTATUS . . . . . . . . . . . L NEAR 097C CODE Global DISPSTATUS00 . . . . . . . . . . L NEAR 0990 CODE DISPSTATUS000. . . . . . . . . . L NEAR 0986 CODE DISPSTATUS001. . . . . . . . . . L NEAR 09A1 CODE  DISPSTATUS002. . . . . . . . . . L NEAR 09AC CODE DISPSTATUS01 . . . . . . . . . . L NEAR 09B7 CODE DISPSTATUS02 . . . . . . . . . . L NEAR 09E9 CODE DISPSTATUS03 . . . . . . . . . . L NEAR 09EC CODE DISPSTATUS04 . . . . . . . . . . L NEAR 09FE CODE DISPSTATUS05 . . . . . . . . . . L NEAR 0A16 CODE DISPSTATUS06 . . . . . . . . . . L NEAR 0A29 CODE DISPSTATUSRET. . . . . . . . . . L NEAR 0A34 CODE DMAXFLG. . . . . . . . . . . . . V BYTE 0000 CODE External ESCCPR . . . . . . . . . . . . . V BYTE 0000 CODE External ESCCPRCNT. . . . . . . . . . . . V WORD 0000 CODE External FLAGX. . . . . . . . . . . . . . V BYTE 0000 CODE External FLUSH. . . . . . . . . . . . . . L NEAR 07B4 CODE Global FLUSHFLG . . . . . . . . . . . . V BYTE 0000 CODE External FNCON. . . . . . . . . . . . . . Number 0001 GDCBUSYF . . . . . . . . . . . . L BYTE 016A CODE Global GDCSTATUS. . . . . . . . . . . . Number 0040 GETNIBBLE. . . . . . . . . . . . L NEAR 0AF0 CODE GETTIME2 . . . . . . . . . . . . L NEAR 0A35 CODE GETTM01. . . . . . . . . . . . . L NEAR 0A3C CODE GETTM02. . . . . . . . . . . . . L NEAR 0A5D CODE GETTM021 . . . . . . . . . . . . L NEAR 0A5F CODE GETTM022 . . . . . . . . . . . . L NEAR 0A86 CODE GETTMRET . . . . . . . . . . . . L NEAR 0A8B CODE HD_FLUSH_BUF . . . . . . . . . . L NEAR 0000 CODE External HD_TIME_FLUSH. . . . . . . . . . V BYTE 0000 CODE External  The Microsoft MACRO Assembler , Version 1.25 Page Symbols-3 USCONIN 01-31-84 ICP1 . . . . . . . . . . . . . . Number 0020 INTKB. . . . . . . . . . . . . . L NEAR 0684 CODE Global INTKB00. . . . . . . . . . . . . L NEAR 069E CODE INTKB000 . . . . . . . . . . . . L NEAR 0693 CODE INTKB005 . . . . . . . . . . . . L NEAR 06D1 CODE INTKB006 . . . . . . . . . . . . L NEAR 06F7 CODE INTKB007 . . . . . . . . . . . . L NEAR 0713 CODE INTKB0082. . . . . . . . . . . . L NEAR 0758 CODE INTKB0084. . . . . . . . . . . . L NEAR 075D CODE INTKB01. . . . . . . . . . . . . L NEAR 076D CODE INTKB02. . . . . . . . . . . . . L NEAR 0784 CODE INTKB03. . . . . . . . . . . . . L NEAR 06B0 CODE INTKB04. . . . . . . . . . . . . L NEAR 06B9 CODE INTKB05. . . . . . . . . . . . . L NEAR 07AB CODE INTKB056 . . . . . . . . . . . . L NEAR 06F1 CODE INTKBFLG . . . . . . . . . . . . L BYTE 00E2 CODE INTSTACK . . . . . . . . . . . . L WORD 000A CODE Length =0020 INTSTACKBASE . . . . . . . . . . E NEAR 004A CODE INTTM. . . . . . . . . . . . . . L NEAR 07C7 CODE Global INTTM00. . . . . . . . . . . . . L NEAR 07E4 CODE INTTM01. . . . . . . . . . . . . L NEAR 07FA CODE INTTM011 . . . . . . . . . . . . L NEAR 0809 CODE INTTM02. . . . . . . . . . . . . L NEAR 081C CODE INTTM03. . . . . . . . . . . . . L NEAR 082A CODE INTTM04. . . . . . . . . . . . . L NEAR 0839 CODE INTTM040 . . . . . . . . . . . . L NEAR 0846 CODE INTTM0400. . . . . . . . . . . . L NEAR 085D CODE INTTM041 . . . . . . . . . . . . L NEAR 0868 CODE INTTM042 . . . . . . . . . . . . L NEAR 0879 CODE INTTM045 . . . . . . . . . . . . L NEAR 0892 CODE INTTM05. . . . . . . . . . . . . L NEAR 08A1 CODE INTTM051 . . . . . . . . . . . . L NEAR 08AF CODE INTTMEVEN. . . . . . . . . . . . L BYTE 00DF CODE INTTMRET . . . . . . . . . . . . L NEAR 08B2 CODE KBATBYT. . . . . . . . . . . . . L BYTE 0A22 CODE KBATSET. . . . . . . . . . . . . L NEAR 0972 CODE KBATSET1 . . . . . . . . . . . . L NEAR 0975 CODE KBATTOFF . . . . . . . . . . . . L NEAR 0970 CODE KBATTON. . . . . . . . . . . . . L NEAR 096C CODE KBBOOT . . . . . . . . . . . . . L NEAR 064E CODE Global KBCLICK. . . . . . . . . . . . . L NEAR 0BD3 CODE KBCRTC0. . . . . . . . . . . . . L NEAR 0000 CODE External KBCSAD . . . . . . . . . . . . . L NEAR 0000 CODE External KBCSRD . . . . . . . . . . . . . L NEAR 0000 CODE External KBCSRO . . . . . . . . . . . . . L NEAR 0000 CODE External KBCTRL . . . . . . . . . . . . . L NEAR 0662 CODE KBDEL. . . . . . . . . . . . . . Number 00FC KBFIFO . . . . . . . . . . . . . L BYTE 0094 CODE Length =0040 KBFIFOSZ . . . . . . . . . . . . Number 0040 KBGET. . . . . . . . . . . . . . L NEAR 04E0 CODE KBGETRET . . . . . . . . . . . . L NEAR 0506 CODE KBIN . . . . . . . . . . . . . . L BYTE 0092 CODE Global KBIND. . . . . . . . . . . . . . L BYTE 00D4 CODE  The Microsoft MACRO Assembler , Version 1.25 Page Symbols-4 USCONIN 01-31-84 KBINP. . . . . . . . . . . . . . Number 0048 KBLCCV . . . . . . . . . . . . . L NEAR 0000 CODE External KBMODECHK. . . . . . . . . . . . L BYTE 0169 CODE KBMOUT . . . . . . . . . . . . . L NEAR 0000 CODE External KBOUT. . . . . . . . . . . . . . L BYTE 0093 CODE Global KBPRINT. . . . . . . . . . . . . Number 00FF KBREPDELAY . . . . . . . . . . . L BYTE 0167 CODE KBREPFLG . . . . . . . . . . . . L BYTE 016B CODE KBREPRATE. . . . . . . . . . . . L BYTE 0168 CODE KBSFP. . . . . . . . . . . . . . Number 004E KBSFSAV. . . . . . . . . . . . . L BYTE 00E5 CODE KBSFSAV1 . . . . . . . . . . . . L BYTE 00E6 CODE KBSTBUF. . . . . . . . . . . . . L NEAR 00E7 CODE KBSTBUFSZ. . . . . . . . . . . . Number 000F KBSTCHK. . . . . . . . . . . . . L NEAR 08B6 CODE KBSTCHK01. . . . . . . . . . . . L NEAR 08D1 CODE KBSTCHK02. . . . . . . . . . . . L NEAR 08E4 CODE KBSTCHK021 . . . . . . . . . . . L NEAR 08F3 CODE KBSTCHK03. . . . . . . . . . . . L NEAR 08F6 CODE KBSTCHK0304. . . . . . . . . . . L NEAR 0908 CODE KBSTCHK0306. . . . . . . . . . . L NEAR 0913 CODE KBSTCHK031 . . . . . . . . . . . L NEAR 0935 CODE KBSTCHK04. . . . . . . . . . . . L NEAR 0938 CODE KBSTCHK041 . . . . . . . . . . . L NEAR 0944 CODE KBSTCHK05. . . . . . . . . . . . L NEAR 0947 CODE KBSTCHK051 . . . . . . . . . . . L NEAR 0953 CODE KBSTCHK06. . . . . . . . . . . . L NEAR 0956 CODE KBSTCHKRET . . . . . . . . . . . L NEAR 096B CODE KBSTP. . . . . . . . . . . . . . Number 004A KBSW0. . . . . . . . . . . . . . L BYTE 00D8 CODE KBSW1. . . . . . . . . . . . . . L BYTE 00D9 CODE KBSW1TBL . . . . . . . . . . . . L NEAR 01E2 CODE KBSWP . . . . . . . . . . . . . . Number 004C KBSWSAV. . . . . . . . . . . . . L BYTE 00E3 CODE KBSWSAV1 . . . . . . . . . . . . L BYTE 00E4 CODE KBTAB. . . . . . . . . . . . . . Number 0098 KBTBLERR . . . . . . . . . . . . L NEAR 0647 CODE KBTBLNML . . . . . . . . . . . . L NEAR 064B CODE KBTBLRET . . . . . . . . . . . . L NEAR 064D CODE KBTBLSRCH. . . . . . . . . . . . L NEAR 063A CODE KBULFLG. . . . . . . . . . . . . L BYTE 016C CODE LA . . . . . . . . . . . . . . . V BYTE 0000 CODE External MINFLG . . . . . . . . . . . . . L BYTE 00DA CODE Global MODECHK. . . . . . . . . . . . . L BYTE 0165 CODE NEXT001. . . . . . . . . . . . . L NEAR 05FD CODE NOTFULL. . . . . . . . . . . . . L NEAR 077A CODE NO_FLUSH . . . . . . . . . . . . L NEAR 0749 CODE OLDMIN . . . . . . . . . . . . . L BYTE 00FC CODE PSCLKE . . . . . . . . . . . . . L NEAR 0000 CODE External PSCLKS . . . . . . . . . . . . . L NEAR 0000 CODE External REGRESTORE . . . . . . . . . . . L NEAR 0B48 CODE REGRESTORETM . . . . . . . . . . L NEAR 0BB2 CODE REGSAVE. . . . . . . . . . . . . L NEAR 0AFF CODE  The Microsoft MACRO Assembler , Version 1.25 Page Symbols-5 USCONIN 01-31-84 REGSAVE1 . . . . . . . . . . . . L NEAR 0B3A CODE REGSAVETM. . . . . . . . . . . . L NEAR 0B69 CODE REGSAVETM1 . . . . . . . . . . . L NEAR 0BA4 CODE REPDELAY . . . . . . . . . . . . L BYTE 0163 CODE REPRATE. . . . . . . . . . . . . L BYTE 0164 CODE ROLDCNT. . . . . . . . . . . . . V BYTE 0000 CODE External ROLLDOWN . . . . . . . . . . . . L NEAR 0000 CODE External ROLLUP . . . . . . . . . . . . . L NEAR 0000 CODE External RS_AX. . . . . . . . . . . . . . L WORD 0002 CODE RS_RTN . . . . . . . . . . . . . L WORD 0004 CODE RS_SP. . . . . . . . . . . . . . L WORD 0006 CODE RS_SS. . . . . . . . . . . . . . L WORD 0008 CODE SCRDUMP. . . . . . . . . . . . . L NEAR 0000 CODE External SFKEYFLG . . . . . . . . . . . . L BYTE 00D5 CODE SFKEYPTR . . . . . . . . . . . . L WORD 00D6 CODE SFKEYTBL . . . . . . . . . . . . V BYTE 0000 CODE External SFTON. . . . . . . . . . . . . . Number 0040 SPC010 . . . . . . . . . . . . . L NEAR 057B CODE SPC020 . . . . . . . . . . . . . L NEAR 058C CODE SPC030 . . . . . . . . . . . . . L NEAR 0590 CODE SPC040 . . . . . . . . . . . . . L NEAR 05A6 CODE SPC045 . . . . . . . . . . . . . L NEAR 05B8 CODE SPC050 . . . . . . . . . . . . . L NEAR 05BF CODE SPC055 . . . . . . . . . . . . . L NEAR 05CE CODE SPC060 . . . . . . . . . . . . . L NEAR 05D6 CODE SPCCNV . . . . . . . . . . . . . L NEAR 0577 CODE SPCRET . . . . . . . . . . . . . L NEAR 05D9 CODE SPCTBL . . . . . . . . . . . . . L NEAR 0176 CODE SPDCNT . . . . . . . . . . . . . L WORD 0170 CODE Global SPDSAV . . . . . . . . . . . . . L BYTE 016F CODE SPDWK. . . . . . . . . . . . . . L BYTE 016E CODE Global STALTBYT . . . . . . . . . . . . L BYTE 09F7 CODE STATUSDD . . . . . . . . . . . . L WORD 0142 CODE STATUSHDACC. . . . . . . . . . . L BYTE 0134 CODE Global STATUSHH . . . . . . . . . . . . L WORD 0148 CODE STATUSKB . . . . . . . . . . . . L BYTE 011C CODE STATUSKB_AD. . . . . . . . . . . Number 101F STATUSLINE . . . . . . . . . . . L BYTE 00FD CODE Global STATUSMIN. . . . . . . . . . . . L WORD 014B CODE STATUSMM . . . . . . . . . . . . L WORD 013F CODE STATUSSP . . . . . . . . . . . . L BYTE 0132 CODE STATUSWK . . . . . . . . . . . . L BYTE 0139 CODE STATUSYY . . . . . . . . . . . . L WORD 0145 CODE STDTBYT. . . . . . . . . . . . . L BYTE 09F9 CODE SVDATA . . . . . . . . . . . . . L BYTE 016D CODE Global SYSDAY . . . . . . . . . . . . . L BYTE 00FA CODE SYSDSPFLG. . . . . . . . . . . . L BYTE 00DD CODE Global SYSDSPFSAV . . . . . . . . . . . L BYTE 00DE CODE SYSHOUR. . . . . . . . . . . . . L BYTE 00F9 CODE SYSKEYINFLG. . . . . . . . . . . L BYTE 00DC CODE Global SYSMIN . . . . . . . . . . . . . L BYTE 00F8 CODE SYSMM. . . . . . . . . . . . . . L BYTE 00FB CODE SYSSEC . . . . . . . . . . . . . L BYTE 00F7 CODE  The Microsoft MACRO Assembler , Version 1.25 Page Symbols-6 USCONIN 01-31-84 SYSTM. . . . . . . . . . . . . . E NEAR 00F7 CODE SYSTMCHK . . . . . . . . . . . . L BYTE 0166 CODE Global SYSTMFLG . . . . . . . . . . . . L BYTE 00F6 CODE Global TIMESET. . . . . . . . . . . . . L NEAR 0A8C CODE TIMESET01. . . . . . . . . . . . L NEAR 0AAC CODE TMCHK. . . . . . . . . . . . . . L BYTE 0162 CODE TMSTACK. . . . . . . . . . . . . L WORD 0052 CODE Length =0020 TMSTACKBASE. . . . . . . . . . . E NEAR 0092 CODE TM_AX. . . . . . . . . . . . . . L WORD 004A CODE TM_RTN . . . . . . . . . . . . . L WORD 004C CODE TM_SP. . . . . . . . . . . . . . L WORD 004E CODE TM_SS. . . . . . . . . . . . . . L WORD 0050 CODE UCGOFF . . . . . . . . . . . . . L BYTE 037D CODE Global U_AUXCGTBL . . . . . . . . . . . L BYTE 037C CODE Global WEEK . . . . . . . . . . . . . . L BYTE 014D CODE YES_FLUSH. . . . . . . . . . . . L NEAR 073B CODE Warning Severe Errors Errors 0 0 E ;*********************  The Microsoft MACRO Assembler , Version 1.25 Page 1-1 BIGBIOS 01-31-84 TITLE BIGBIOS PAGE 58,132 ;------------------------------------------------------------------------------ ; ; MS-DOS BIOS for the N.E.C. Advanced Personal Computer ; ; module name: BIGBIOS ; MS-DOS version: 2.0 ; module version: 1.0 ; ; abstract: This is the main interface between the IO system and the ; DOS. It is loaded and started by the boot loader, performs ; initialization tasks, loads MSDOS.SYS, and then starts ; the SYSINIT routine. The default bios device list, and the ; device function dispatch tables are located herein. This ; module contains the dummy STRATEGY entry point, and the ; "interrupt" routine entry points. The soft key table also ; resides within this module. ; ; contains routines: ; "strategy", device "interrupt" entry points ; re_init ms_init iosize int_trap ; ; revision history: ; ; The April 1983 NEC/Tokyo MS-DOS V1.25 BIGBIOS module was used ; as a starting point. The soft key table and most of the hardware ; initialization code, have not been modified. ; ; The device list, "strategy" routine, "interrupt" entry points ; and common entry and exit routines were added by NECIS after the ; manner used in the skeletal BIOS provided by microsoft. ; ; The loading of MSDOS.SYS has been maintained in this module, rather ; being performed by the boot loader, as the combined length of the ; IO.SYS and MSDOS.SYS file's were coming perilously close to over- ; writing the boot loader itself. This way, MSDOS.SYS or IO.SYS can ; grow without concern about the booter. ; ; When loading MSDOS.SYS, the msinit routine determines the starting ; disk address by looking at the directory entry for IO.SYS, and adding ; it's length to it's starting AU number. This removes a constraint ; of previous versions which required an EQU to be changed to reflect ; the current size of the IO system. The MSDOS.SYS load address is also ; determined in this manner. ; ; A table call config_table is now pointed at by the dw pointer ; at location 0003 within IO.SYS. This table in turn contains a list ; of pointers to various tables within the BIOS, permitting utilities/ ; applications to be made io system address independent (except, of ; course that the config_table pointer must always be present at 0003.) ; ; The interrupt trap now calls regprnt to dump register contents and  The Microsoft MACRO Assembler , Version 1.25 Page 1-2 BIGBIOS 01-31-84 ; p ermit memory examination when a trap occurs. ; ; The hardware initialazion now has a delay after video display is ; started to mask the bounce effect of the status line when the system ; comes up. ; ; This IO system implements the int 29h fast character display ; handler, and "special" bit in the console device list entry. ; - RMG 6-7-83 ; ; The IO system now switched to a local stack upon entry from the ; DOS. This was done because MicroSoft cautions that the DOS stack ; "not more than a few saves of the registers" deep. The local IO system ; stack is 256 bytes deep. ; - RMG 6-9-83 ; ; The diskette controller now uses interrupts to detect operation ; complete and drive ready status changes, so that TIMEROFF will not ; disable auto disk logging. Therefore, the send 8259 is now enabled ; and initialized properly at msinit time. ; - RMG 11-29-83 ; ; Added KBBOOT NMI interrupt vector to cause system reboot from ; switch. ; - RMG 12-5-83 ; ; The interrupt 221 vector (0DDh) is now initialized to point at an ; IRET so that attempt to dump screen will be ignored until CRTDUMP is ; installed. ; - RMG 12-7-83 ; ; Support for the AUX2 (H14) poert added. ; - RMG 1-11-84 ; ;----------------------------------------------------------------------------- extrn sysinit:far extrn current_dos_location:word extrn final_dos_location:word extrn device_list:dword extrn memory_size:word extrn default_drive:byte extrn buffers:byte 0000 code segment public 'CODE' EXTRN REGPRNT:FAR EXTRN MSREAD:FAR,MSWRITE:FAR,DSKCHG:FAR ;in MSREAD.ASM EXTRN INTFD:NEAR  ;in MSREAD.ASM EXTRN FDC_FINISHED:BYTE ;in MSREAD.ASM EXTRN FLUSH:NEAR,KBIN:BYTE,KBBOOT:FAR ;in USCONIN.ASM EXTRN SET_TIME:FAR,SET_DATE:FAR,GET_DATE:FAR ;in MSTIME.ASM EXTRN MSCONST:FAR,MSCONIN:FAR,MSCONOUT:FAR ;in MSCONST.ASM  The Microsoft MACRO Assembler , Version 1.25 Page 1-3 BIGBIOS 01-31-84 EXTRN MSLISTOUT:FAR,MSREADER:FAR,MSPUNCH:FAR EXTRN INTKB:NEAR,INTTM:NEAR,EXT_FNC_INT:NEAR ;in INT.ASM EXTRN CONOUT:NEAR EXTRN MLOUT:NEAR,KBMOUT:NEAR,KBSCRO:NEAR EXTRN KBCRTC:NEAR,KBLCCV:NEAR EXTRN KBCSRO:NEAR,KBCSRD:NEAR EXTRN LA:BYTE,CA:BYTE EXTRN TBLWORK:NEAR EXTRN DRIVTBL:NEAR ;drive config table in msread EXTRN STATUSLINE:NEAR ;system staus line of USCONIN EXTRN FDC_SPECIFY:BYTE EXTRN SENDCOM:NEAR EXTRN KBSCROPAT:NEAR,CRTDSP:BYTE,KBSAD0:BYTE,DISPSTATUS:NEAR EXTRN HD_INDICATION:BYTE EXTRN DISK_CHANGE_FLAG:WORD EXTRN HD_DIRECT_MODE:BYTE EXTRN U_AUXCGTBL:NEAR EXTRN STATUS0:BYTE ; in msread EXTRN RS232PARMS:NEAR ; rs232 mode parms ; ; dispatch routines reside in the various modules comprising ; the IO system... ; extrn mediac:near,get_bpb:near,dsk_red:near,dsk_init:near extrn dsk_wrt:near,dsk_wrv:near extrn hmediac:near,hget_bpb:near,hdsk_red:near,hdsk_init:near extrn hdsk_wrt:near,hdsk_wrv:near extrn con_init:near,con_read:near,con_rdnd:near,con_flsh:near extrn con_writ:near,con_wrst:near,con_rdsts:near extrn aux_read:near,aux_rdnd:near,aux_rdsts:near extrn aux_writ:near,aux_wrst:near,aux_flush:near extrn aux2_read:near,aux2_rdnd:near,aux2_rdsts:near ; rmg / necis / 1-11-84 extrn aux2_writ:near,aux2_wrst:near,aux2_flush:near ; rmg / necis / 1-11-84 extrn tim_red:near,tim_wrt:near extrn prn_wrt:near,prn_sta:near public ptrsav,busy_exit,cmderr,exit,err_exit = 0900 bootseg equ 900H ; boot loader segment (for temp direct read) = 0040 biosseg equ 040H = 0002 nbufs equ 2 ; default number of disk buffers public RE_INIT ; post sysinit initialization PUBLIC PMSG PUBLIC SFKEYTBL ASSUME CS:CODE,DS:CODE,SS:CODE,ES:CODE = 000D cr equ 0dh ; carriage return  The Microsoft MACRO Assembler , Version 1.25 Page 1-4 BIGBIOS 01-31-84 = 000A lf equ 0ah ; linefeed = 00DC CALENDAR_INT EQU 220 = 00DC MELODY_INT EQU 220 ; PIC PORT ADDRESS = 0020 ICP1 EQU 20H ; MASTER PIC 8259A PORT1 = 0022 ICP2 EQU 22H ; PORT2 = 0028 SICP1 EQU 28H ; SLAVE PIC PORT1 = 0067 PICMASK EQU 067H ; (SLAVE,OP3,OP2,KB,TIMER,OP1,SIO1,ASOP) ; 0 1 1 0 0 1 1 1 ; 1=MASK ON ,0=MASK OFF ; NOTE: SLAVE PIC MASK = 00EF SLVMASK EQU 0EFH ; (APU,OP7,OP6,FD,CRT/GRAPH,OP5,OP4,ODA) ; 1 1 1 0 1 1 1 1 = 002A SICP2 EQU 2AH ; PORT2 = 0058 clkpot EQU 58h = 0005 modcan EQU 05h ;test mode cancel = 0008 clkstb1 EQU 08h ;stb 1 = 0007 clkstb0 EQU 07h ;stb 0 = 006E sodamd EQU 6eh ;lsi mode set = 006E sodaw1 EQU 6eh ;set inte flag = 006C sodaw2 EQU 6ch ;set irt and mask 0000 E9 023E R init: jmp near ptr msinit ; jump to hardware initialization code ; ; Many BIOS tables must be update/patched by various utilities from time ; to time. In order to free such utilities from being hard coded for ; specific address in the bios, a configuration table will be maintained ; with pointers to the particular tables. In this way, changes that move ; things within the bios will not require changes to hard coded addresses ; within the utilities. The following dword pointer points at the first byte ; of the configuration table. (In this way, even the config table can move if ; need be.) However, this pointer MUST NOT BE MOVED; i.e., it should always ; reside at offset 3 within the bios segment!!! (40:0003). ; 0003 01E9 R CONFIG_TABLE_PTR DW CONFIG_TABLE ;********************************************* ;* * ;* Device Driver tables * ;* * ;********************************************* 0005 devstart label word 0005 condev: ; header for device "CON " 0005 0017 R 0040 dw auxdev,biosseg ; link to next device 0009 8013 dw 8013h ; attributes: console, input, output, special 000B 0141 R dw strategy ; common strategy entry point 000D 014C R dw con_int ; "interrupt" entry point  The Microsoft MACRO Assembler , Version 1.25 Page 1-5 BIGBIOS 01-31-84 000F 43 4F 4E 20 20 20 db "CON " ; device name 20 20 0017 auxdev: ; header for auxiliary (reader/punch) device 0017 0029 R 0040 dw prndev,biosseg 001B 8000 dw 8000h ; character device 001D 0141 R dw strategy 001F 0152 R dw aux_int 0021 41 55 58 20 20 20 db "AUX " 20 20 0029 prndev: ; header for printer (list) device 0029 003B R 0040 dw timdev,biosseg 002D 8000 dw 8000h ; character device 002F 0141 R dw strategy 0031 015E R dw prn_int 0033 50 52 4E 20 20 20 db "PRN " 20 20 003B timd ev: ; header for clock device 003B 004D R 0040 dw aux2dev,biosseg 003F 8008 dw 8008h 0041 0141 R dw strategy 0043 0164 R dw tim_int 0045 43 4C 4F 43 4B 20 db "CLOCK " 20 20 004D aux2dev: ; header for H14 auxiliary port 004D 005F R 0040 dw dskdev,biosseg 0051 8000 dw 8000h ; character device 0053 0141 R dw strategy 0055 0158 R dw aux2_int 0057 41 55 58 32 20 20 db "AUX2 " 20 20 005F dskdev: ; diskette 005F 0071 R 0040 dw hdskdev,biosseg 0063 2000 dw 2000h ; non-IBM format, block device 0065 0141 R dw strategy 0067 0170 R dw dsk_int 0069 04 db 4 ; number of units (reserve A-D) 006A 07 [ db 7 dup (?) ; pad header ?? ] 0071 hdskdev: ; hard disk device header 0071 FFFF FFFF dw -1,-1 0075 2000 dw 2000h ; non-IBM format, block device 0077 0141 R dw strategy 0079 016A R dw hdsk_int 007B 08 db 8 ; number of units (reserve E-L) 007C 07 [ db 7 dup (?) ; pad header  The Microsoft MACRO Assembler , Version 1.25 Page 1-6 BIGBIOS 01-31-84 ?? ] ; ; device despatch tables ; 0083 0000 E dsktbl: dw dsk_init ; initialize driver 0085 0000 E dw mediac ; 1 media check 0087 0000 E dw get_bpb ; 2 build BPB 0089 01BE R dw cmderr ; 3 IOCTL input 008B 0000 E dw dsk_red ; 4 input (read) 008D 01B9 R dw busy_exit ; 5 non-destruct input (read) 008F 01C5 R dw exit ; 6 input status 0091 01C5 R dw exit ; 7 input flush 0093 0000 E dw dsk_wrt ; 8 output (write) 0095 0000 E dw dsk_wrv ; 9 output (write) with verify 0097 01C5 R dw exit ;10 return output status 0099 01C5 R  dw exit ;11 output flush 009B 01C5 R dw exit ;12 IOCTL output 009D 0000 E hdsktbl: dw hdsk_init ; initialize driver 009F 0000 E dw hmediac ; 1 media check 00A1 0000 E dw hget_bpb ; 2 build BPB 00A3 01BE R dw cmderr ; 00A5 0000 E dw hdsk_red 00A7 01B9 R dw busy_exit ; 5 non-destruct input (read) 00A9 01C5 R dw exit ; 6 input status 00AB 01C5 R dw exit ; 7 input flush 00AD 0000 E dw hdsk_wrt 00AF 0000 E dw hdsk_wrv 00B1 01C5 R dw exit ;10 return output status 00B3 01C5 R dw exit ;11 ouput flush 00B5 01C5 R dw exit ;12 IOCTL output 00B7 0000 E contbl: dw con_init 00B9 01C5 R dw exit 00BB 01C5 R dw exit 00BD 01BE R dw cmderr 00BF 0000 E dw con_read 00C1 0000 E dw con_rdnd 00C3 01C5 R dw exit 00C5 0000 E dw con_flsh 00C7 0000 E dw con_writ 00C9 0000 E dw con_writ 00CB 0000 E dw con_wrst 00CD 01C5 R dw exit 00CF 01C5 R dw exit 00D1 01C5 R aux2tbl dw exit 00D3 01C5 R dw exit 00D5 01C5 R dw exit 00D7 01BE R dw cmderr  The Microsoft MACRO Assembler , Version 1.25 Page 1-7 BIGBIOS 01-31-84 00D9 0000 E dw aux2_read 00DB 0000 E dw aux2_rdnd 00DD 0000 E dw aux2_rdsts 00DF 0000 E dw aux2_flush 00E1 0000 E dw aux2_writ 00E3 0000 E dw aux2_writ 00E5 0000 E dw aux2_wrst 00E7 01C5 R dw exit 00E9 01C5 R dw exit 00EB 01C5 R auxtbl dw exit 00ED 01C5 R dw exit 00EF 01C5 R dw exit 00F1 01BE R dw cmderr 00F3 0000 E dw aux_read 00F5 0000 E dw aux_rdnd 00F7 0000 E dw aux_rdsts 00F9 0000 E dw aux_flush 00FB 0000 E dw aux_writ 00FD 0000 E dw aux_writ 00FF 0000 E dw aux_wrst 0101 01C5 R dw exit 0103 01C5 R dw exit 0105 01C5 R timtbl dw exit 0107 01C5 R dw exit 0109 01C5 R dw exit 010B 01BE R dw cmderr 010D 0000 E dw tim_red 010F 01B9 R dw busy_exit 0111 01C5 R dw exit 0113 01C5 R dw exit 0115 0000 E dw tim_wrt 0117 0000 E dw tim_wrt 0119 01C5 R dw exit 011B 01C5 R dw exit 011D 01C5 R dw exit 011F 01C5 R prntbl: dw exit 0121 01C5 R dw exit 0123 01C5 R dw exit 0125 01BE R dw cmderr 0127 01C5 R dw exit 0129 01B9 R dw busy_exit 012B 01C5 R dw exit 012D 01C5 R dw exit 012F 0000 E dw prn_wrt 0131 0000 E dw prn_wrt 0133 0000 E dw prn_sta 0135 01C5 R dw exit 0137 01C5 R dw exit  The Microsoft MACRO Assembler , Version 1.25 Page 1-8 BIGBIOS 01-31-84 page ; ; IO data packet structure: ; iodat struc 0000 ?? cmdln db ? ; length of this command 0001 ?? unit db ? ; sub unit specifier 0002 ?? cmd db ? ; command code 0003 ???? status dw ? ; return status 0005 08 [ db 8 dup (?) ; reserved for q links (future versions) ?? ] 000D ?? media db ? ; media descriptor byte 000E ???????? trans dd ? ; transfer address 0012 ???? count dw ? ; count of blocks or characters 0014 ???? start dw ? ; first block to transfer 0016 iodat ends 0139 00 00 00 00 ptrsav dd 0 013D 0000 dos_ss_sav dw 0 ; save area for dos stack seg & pointer 013F 0000 dos_sp_sav dw 0 ; ; "dummy" strategy routine- simple version for non-multitasking system ; ; only saves IO packet pointer in ptrsav ; 0141 stratp proc far 0141 strategy: 0141 2E: 89 1E 0139 R mov word ptr cs:[ptrsav],bx ; save offset 0146 2E: 8C 06 013B R mov word ptr cs:[ptrsav+2],es ; save segment base 014B CB ret 014C stratp endp ; ; "interrupt" routines for each device. ; ; Each routine simply puts a pointer to the device's dispatch table ; in SI after pushing SI in order to save the stack segment, then ; jumps to a common entry routine. ; 014C con_int: 014C 56 push si 014D BE 00B7 R mov si,offset contbl 0150 EB 22 jmp short entry 0152 aux_int: 0152 56 push si  The Microsoft MACRO Assembler , Version 1.25 Page 1-9 BIGBIOS 01-31-84 0153 BE 00EB R mov si,offset auxtbl 0156 EB 1C jmp short entry 0158 aux2_int: ; rmg / necis / 1-11-84 0158 56 push si 0159 BE 00D1 R mov si,offset aux2tbl 015C EB 16 jmp short entry  015E prn_int: 015E 56 push si 015F BE 011F R mov si,offset prntbl 0162 EB 10 jmp short entry 0164 tim_int: 0164 56 push si 0165 BE 0105 R mov si,offset timtbl 0168 EB 0A jmp short entry 016A hdsk_int: 016A 56 push si 016B BE 009D R mov si,offset hdsktbl 016E EB 04 jmp short entry 0170 dsk_int: 0170 56 push si 0171 BE 0083 R mov si,offset dsktbl ; ; The following code is shared by all of the driver "interrupt" ; routines. Future versions (i.e., multitasking) may require ; modification ; 0174 entry: 0174 50 push ax 0175 51 push cx 0176 52 push dx 0177 57 push di 0178 55 push bp 0179 1E push ds 017A 06 push es 017B 53 push bx 017C 0E push cs 017D 1F pop ds 017E 9C push f ; maintain old interrupt state 017F 58 pop ax 0180 FA cli ; indivisable op for old 8086s 0181 89 26 013F R mov dos_sp_sav,sp ; save DOS stack state; 0185 8C 16 013D R mov dos_ss_sav,ss ; will use our own in io system 0189 8C CB mov bx,cs 018B 8E D3 mov ss,bx 018D BC 0632 R mov sp,offset stackbase  The Microsoft MACRO Assembler , Version 1.25 Page 1-10 BIGBIOS 01-31-84 0190 50 push ax 0191 9D popf ; recover old interrupt state 0192 2E: C5 1E 0139 R lds bx,cs:[ptrsav] ; get io packet pointer 0197 8A 47 01 mov al,[bx.unit] ; al is unit code 019A 8A 67 0D mov ah,[bx.media] ; ah is media 019D 8B 4F 12 mov cx,[bx.count] ; cx is byte/sector count 01A0 8B 57 14 mov dx,[bx.start] ; dx is starting sector 01A3 97 xchg di,ax ; save unit, media... 01A4 8A 47 02 mov al,[bx.cmd] ; al is command code 01A7 32 E4 xor ah,ah ; clear ah 01A9 03 F0 add si,ax 01AB 03 F0 add si,ax ; si points to pointer to entry 01AD 3C 0C cmp al,12 ; confirm valid command 01AF 77 0D ja cmderr ; oops, no such beast, error 01B1 97 xchg ax,di ; ax is unit, media again 01B2 C4 7F 0E les di,[bx.trans] ; es:di is transfer address 01B5 0E push cs 01B6 1F pop ds 01B7 FF 24 jmp [si] ; vector off to handler... 01B9 busy_exit: 01B9 B4 03 mov ah,00000011b ; return busy, done status 01BB F8 clc 01BC EB 0A jmp short exit1 ; jump to common exit code 01BE B0 03 cmderr: mov al,3 ; "unknown command" error code ; ; common error exit code; come here with actual error ; code in al... ; 01C0 err_exit: 01C0 B4 81 mov ah,10000001b ; return error, done 01C2 F9 stc  ;set carry error flag 01C3 EB 03 jmp short exit1 ;and use common exit ; ; normal (non-error) exit code. deive drivers should exit here if ; no error was encountered ; 01C5 exitp proc far 01C5 B4 01 exit: mov ah,00000001b ;return done 01C7 F8 clc ; clear carry - no error ; ; common exit code here. enter with ah (& al if error bit on in ah) ; and carry set (error) or reset (no error) ; 01C8 2E: C5 1E 0139 R exit1: lds bx,cs:[ptrsav] ;retrieve pointer to io packet  The Microsoft MACRO Assembler , Version 1.25 Page 1-11 BIGBIOS 01-31-84 01CD 89 47 03 mov [bx.status],ax ;put return status into packet 01D0 0E push cs 01D1 1F pop ds 01D2 9C pushf 01D3 58 pop ax ; indivisible op (for old 8086) 01D4 FA cli ; interrupts off 01D5 8E 16 013D R mov ss,dos_ss_sav  01D9 8B 26 013F R mov sp,dos_sp_sav ; restore DOS stack state; 01DD 50 push ax 01DE 9D popf ; maintain interrupt state 01DF 5B pop bx 01E0 07 pop es 01E1 1F pop ds 01E2 5D pop bp 01E3 5F pop di 01E4 5A pop dx 01E5 59 pop cx 01E6 58 pop ax 01E7 5E pop si 01E8 CB ret 01E9 exitp endp ; end of exit routine ; ; The configuration table: ; 01E9 CONFIG_TABLE: ; 0 01E9 0632 R SFKEYADDR DW OFFSET SFKEYTBL ; soft key table 01EB ---- R SFKEYSEG DW SEG CODE ; 1 01ED 0000 E PRTCNVADDR DW OFFSET TBLWORK ; print port attributes 01EF ---- R PRTCNVSEG DW SEG CODE ; 2 01F1 0000 E DRIVCONADD DW OFFSET DRIVTBL ; fd drive config table 01F3 ---- R DRIVCONSEG DW SEG CODE ; 3 01F5 0000 E STATUSADD DW OFFSET STATUSLINE ; system status line 01F7 ---- R STATUSSEG DW SEG CODE ; 4 01F9 0000 E MSCONOUTADD DW OFFSET MSCONOUT ; PROC FAR conout entry 01FB ---- R MSCONOUTSEG DW SEG CODE ; 5 01FD 0000 E MSCONSTADD DW OFFSET MSCONST ; PROC FAR const entry 01FF ---- R MSCONSTSEG DW SEG CODE ; 6 0201 0000 E KBSCROPATADD DW OFFSET KBSCROPAT ; KBSCRO patch point 0203 ---- R KBSCROPATSEG DW SEG CODE ; 7 0205 0000 E CRTDSPADD DW OFFSET CRTDSP ; CRTDSP (in conout) 0207 ---- R CRTDSPSEG DW SEG CODE  The Microsoft MACRO Assembler , Version 1.25 Page 1-12 BIGBIOS 01-31-84 ; 8 0209 0000 E KBSAD0ADD DW OFFSET KBSAD0 ; KBSCAD0 020B ---- R KBSAD0SEG DW SEG CODE ; 9 020D 0000 E DISPSTATUSADD DW OFFSET DISPSTATUS ; DISPSTATUS routine 020F ---- R DISPSTATUSSEG DW SEG CODE ; 10 0211 0000 E HDINDICADD DW OFFSET HD_INDICATION ; HD_INDICATOR type byte 0213 ---- R HDINDICSEG DW SEG CODE ; 11 0215 0000 E KBINADD DW OFFSET KBIN ; KBIN queue pointer 0217 ---- R KBINSEG DW SEG CODE ; 12 0219 0239 R RAMDISKENADD DW OFFSET RAMDISKENABLE ; ram disk enable to prevent 021B ---- R RAMDISKENSEG DW SEG CODE ; auto sizing past para 3FFF ; 13 021D 0000 E DSKCHGFLGADD DW OFFSET DISK_CHANGE_FLAG ; hard disk volume change flag 021F ---- R DSKCHGFLGSEG DW SEG CODE ; 14 0221 0000 E HDMODEADD DW OFFSET HD_DIRECT_MODE ; hard disk direct mode flag 0223 ---- R HDMODESEG DW SEG CODE ; 15 0225 0000 E U_AUXCGTBL_ADD DW OFFSET U_AUXCGTBL ; universal char code map 0227 ---- R U_AUXCGTBL_SEG DW SEG CODE ; 16 0229 0000 E FDC_FINISH_ADD DW OFFSET FDC_FINISHED ; fdc operation complete flag 022B ---- R FDC_FINISH_SEG DW SEG CODE ; 17 022D 0000 E FDC_STATUS0_ADD DW OFFSET STATUS0 ; fdc status save data from 022F ---- R FDC_STATUS0_SEG DW SEG CODE ; interrupt handler ; 18 0231 023A R CRTTYPEADD DW OFFSET CRTTYPE ; crt type for scrdump 0233 ---- R CRTTYPESEG DW SEG CODE ; 19 0235 0000 E RSPARMSADD DW OFFSET RS232PARMS ; serial port data 0237 ---- R RSPERMSSEG DW SEG CODE ; ; End of configuration table ; 0239 00 ramdiskenable db 00h ; ram disk enable flag 023A 00 crttype db 00h ; bit 0 = color ; bit 1 = graphics ; ; The following iret is used to effectively stub crtdump until the rsx is ; installed. ; 023B intdump: 023B CF iret ; not tonight, i've got a headache 023C reproc proc far 023C re_init: 023C FB sti 023D CB ret ; no post-sysinit code in this io system  The Microsoft MACRO Assembler , Version 1.25 Page 1-13 BIGBIOS 01-31-84 023E reproc endp 023E msinit: 023E FA cli ;disable interrupt. 023F 8C C8 mov ax,cs ;set stack pointer. 0241 8E D0 mov ss,ax 0243 8E D8 mov ds,ax 0245 8E C0 mov es,ax 0247 BC 0632 R mov sp,offset stackbase ASSUME DS:SEG0 024A 06 push es 024B 1E push ds ;save the DS register 024C B8 ---- R mov ax,seg int0_offset 024F 8E D8 mov ds,ax 0251 8E C0 mov es,ax ;set ES and DS to zero ;setup interrupt 0 to address trap routine 0253 C7 06 0000 R 08F2 R mov int0_offset,offset int_trap 0259 8C 0E 0002 R mov int0_segment,CS 025D BF 0004 mov di,4 0260 BE 0000 mov si,0 ;then propagate 0263 B9 01FE mov cx,510 ;trap vector to 0266 F3/ A5 rep movsw ;all 256 interrupts 0268 C7 06 0050 R 0000 E mov intkbos,offset INTKB 026E C7 06 004C R 0000 E mov inttmos,offset INTTM 0274 C7 06 0008 R 0000 E mov intkbboot,offset kbboot ; rmg / necis / 12-5-83   027A C7 06 0374 R 023B R mov intcrtdump,offset intdump ; rmg / necis / 12-7-83 ;--- rmg / necis / 11-29-83 ; 0280 C7 06 0070 R 0000 E mov intfdos,offset INTFD ; ;--- rmg / necis / 11-29-83 0286 C7 06 0370 R 0000 E mov ext_fnc_int_offset,offset EXT_FNC_INT 028C B0 11 mov al,11h ;PIC reinitialization. 028E E6 20 out icp1,al 0290 B0 10 mov al,10h ;*** LOOK HERE *** (20h in INIT) 0292 E6 22 out icp2,al 0294 B0 80 mov al,80h 0296 E6 22 out icp2,al 0298 B0 01 mov al,01h 029A E6 22 out icp2,al ;--- rmg / necis / 11-29-83 --- set up slave 8259 to enable diskette interrupt ; 029C B0 11 mov al,11h 029E E6 28 out sicp1,al 02A0 B0 18 mov al,18h 02A2 E6 2A out sicp2,al 02A4 B0 07 mov al,07h 02A6 E6 2A out sicp2,al 02A8 B0 01 mov al,01h 02AA E6 2A out sicp2,al ;  The Microsoft MACRO Assembler , Version 1.25 Page 1-14 BIGBIOS 01-31-84 ;--- rmg / necis / 11-29-83 ;------------------------------------------------------02/23/1983------ 02AC E4 48 IN AL,48H ; DUMMY GET FROM KEYBOAD ;---------------------------------------------------------------------- 02AE 1F pop ds 02AF 07 pop es ASSUME DS:CODE ; ; TIMER INITIALIZE ; 02B0 B0 30 MOV AL,30H ; MODE 0 (INTERRUPT BY COUNT END) 02B2 E6 2F OUT 2FH,AL ; WRITE MODE (COUNTER 0) 02B4 B0 04 MOV AL,04H ; 02B6 E6 46 OUT 46H,AL ; 02B8 BA 0029 MOV DX,29H ; DX=PORT NO. 02BB 2A C0 SUB AL,AL 02BD EE OUT DX,AL 02BE B0 F0 MOV AL,0F0H 02C0 EE OUT DX,AL ; TIMER = 25 MS ; ; CALENDAR INITIALIZE ; 02C1 B2 58 MOV DL,CLKPOT 02C3 B0 05 MOV AL,MODCAN ; TEST MODE CANCEL 02C5 EE OUT DX,AL 02C6 0C 08  OR AL,CLKSTB1 ; STB 1 02C8 EE OUT DX,AL ; WRITE MODE 02C9 24 07 AND AL,CLKSTB0 ; STB 0 02CB EE OUT DX,AL ; WRITE COMMAND ; ; MELODY S/W INITIALIZATION ; 02CC B2 06 MOV DL,06H 02CE E8 0000 E CALL MLOUT ; OUT INITIAL CONTOROL COMMAMD ; ; GDC S/W INITIALIZATION ; 02D1 E8 0000 E CALL KBMOUT ; MULTI COMMAND OUTPUT 02D4 0B DB 0BH 02D5 4200 DW 4200H ; reset GDC. 02D7 4010 DW 4010H 02D9 404E DW 404EH 02DB 404F DW 404FH 02DD 401A DW 401AH 02DF 4006 DW 4006H 02E1 4013 DW 4013H 02E3 40EE DW 40EEH 02E5 4045 DW 4045H 02E7 4247 DW 4247H ; PITCH WRITE 02E9 4050 DW 4050H 02EB E8 0000 E CALL KBSCRO ; SCROLL CMD OUTPUT 02EE B8 0000 MOV AX,00H  The Microsoft MACRO Assembler , Version 1.25 Page 1-15 BIGBIOS 01-31-84 02F1 BA 2000 MOV DX,2000H 02F4 B9 0FFF MOV CX,0FFFH 02F7 E8 0000 E CALL KBCRTC ; DATA CLEAR 02FA B8 1000 MOV AX,1000H 02FD BA 0080 MOV DX,0080H 0300 B9 0FFF MOV CX,0FFFH 0303 E8 0000 E CALL KBCRTC ; ATTRIBUTE RESET 0306 C6 06 0000 E 00 MOV byte ptr LA,00H 030B C6 06 0000 E 00 MOV byte ptr CA,00H 0310 8A 36 0000 E MOV DH,byte ptr LA 0314 8A 16 0000 E MOV DL,byte ptr CA 0318 E8 0000 E CALL KBLCCV 031B E8 0000 E CALL KBCSRO ; COUSOR OUTPUT 031E E8 0000 E CALL KBCSRD ; COUSOR DISPLAY ; LIST INITIALIZATION 0321 B0 94 MOV AL,94H 0323 E6 6E OUT SODAMD,AL ; LSI MODE SET 0325 B0 05 MOV AL,05H 0327 E6 6E OUT SODAW1,AL ; SET INTE FLAG 0329 B0 90 MOV AL,90H 032B E6 6C OUT SODAW2,AL ; SET IRT AND MASK 032D B9 0003 MOV CX,03H ; SET LOOP TIME 0330 INIT010: 0330 E2 FE LOOP INIT010 ; IDLE LOOP (10 U/S) 0332 B0 0E MOV AL,0EH 0334 E6 6E OUT SODAW1,AL ; ;--- rmg / necis / 1-16-84 ; ; Initialize rs-232 ports ; 0336 BE 0000 E mov si,offset rs232parms 0339 AC lodsb ; get std baud 033A 8A F0 mov dh,al 033C AC lodsb ; get std mode 033D 8A D0 mov dl,al 033F B1 0A mov cl,0ah ; initialize std rs232 function number 0341 CD DC int 220 ; init std port 0343 AC lodsb ; get h14 baud 0344 8A F0 mov dh,al 0346 AC lodsb ; get h14 mode 0347 8A D0 mov dl,al 0349 B1 0B mov cl,0bh ; initialize h14 rs232 function number 034B CD DC int 220 ; init h14 port ; ;--- rmg / necis / 1-16-84 ; MASK PIC 034D B0 67 MOV AL,PICMASK 034F E6 22 OUT ICP2,AL 0351 B0 EF MOV AL,SLVMASK  The Microsoft MACRO Assembler , Version 1.25 Page 1-16 BIGBIOS 01-31-84  0353 E6 2A OUT SICP2,AL ; ;disp start ;4/7/83 ************* 1.106:013 COMPATIBLE CODE ******************** ;** DELAY LOOP FOR CRT INIT DELAY KEEPS STATUS LINE FROM BOUNCING ** ; 0355 INITGDC: 0355 B9 FFFF MOV CX,0FFFFH ; IDLE LOOP 128 MSEC 0358 B0 03 MOV AL,3 ; ... * 3 = 378 MSEC 035A INITGDCEND: 035A E2 FE LOOP INITGDCEND 035C FE C8 DEC AL ; DECREMENT OUTER LOOP COUNT 035E 75 FA JNZ INITGDCEND ; GO BACK FOR ANOTHER 128 MSEC ;********************************************************************** 0360 B0 6B mov al,6bh 0362 E6 42 out 42h,al ;set segment. 0364 8C D8 mov ax,ds 0366 A3 01EB R mov sfkeyseg,ax ;set soft key table segment address 0369 A3 01EF R mov prtcnvseg,ax ;set list out table segment address 036C FB sti ;enable interrupt. ;end DEBUG 08/17 by NAC ; ; FDC SPECIFY  ; SRT = 5 MSEC ; HUT = 176 MSEC ; HLT = 50 MSEC ; 036D BB 0000 E mov bx,offset FDC_SPECIFY 0370 E8 0000 E call SENDCOM ; ; Load MSDOS.SYS... ; 0373 E8 03CC R call near ptr read_sys ; ; Set up conditions for the call to SYSINIT... ; 0376 8C C8 mov ax,cs 0378 8E C0 mov es,ax ; ; set sysinit parm CURRENT_DOS_LOCATION ; 037A 8B 1E 0430 R mov bx,dosseg ; where msdos.sys was loaded 037E B8 ---- E mov ax,seg sysinit ; set data segment to SYSINIT 0381 8E D8 mov ds,ax ASSUME DS:SEG SYSINIT 0383 89 1E 0000 E mov ds:[current_dos_location],bx ; ; set sysinit parm FINAL_DOS_LOCATION ;  The Microsoft MACRO Assembler , Version 1.25 Page 1-17 BIGBIOS 01-31-84 0387 89 1E 0000 E mov ds:[final_dos_location],bx ; no relocation this rev... ; ; ; set sysinit parm DEVICE LIST ; 038B 8C C8 mov ax,cs 038D A3 0002 E mov word ptr ds:[device_list+2],ax 0390 C7 06 0000 E 0005 R mov word ptr ds:[device_list],offset devstart ; ; set number of default buffers ; 0396 C6 06 0000 E 02 mov ds:[buffers],nbufs ; ; set memory size ; 039B 36: F6 06 0239 R FF test ramdiskenable,0ffh ; does user want ramdisk? 03A1 74 24 jz goinit ; if not, let ms-dos auto size.... 03A3 1E push ds 03A4 B8 7FFF mov ax,07fffh 03A7 8E D8 mov ds,ax ; last paragraph of 512k 03A9 BB 0000 mov bx,0 03AC 8B 07 mov ax,[bx] ; save value 03AE F6 17 not [bx] 03B0 3B 07 cmp ax,[bx] ; is it ram? 03B2 89 07 mov [bx],ax ; it might be somebody's data! 03B4 1F pop ds 03B5 75 09 jnz do256k ; if it's really ram 03B7 36: C6 06 0239 R 00 mov  ramdiskenable,00h ; sorry, need 512kb 03BD EB 08 90 jmp goinit 03C0 do256k: 03C0 BB 4000 mov bx,4000h ; it's ram... select 256 ms-dos memory 03C3 89 1E 0000 E mov ds:[memory_size],bx 03C7 goinit: 03C7 EA 0000 ---- E jmp sysinit ASSUME DS:CODE 03CC read_sys proc near ; ; Read MS-DOS.SYS ; 03CC B0 01 mov al,1 ; select driver #1(drive 0[2d]) 03CE 32 E4 xor ah,ah 03D0 E8 03EC R call near ptr io_size ; get start sector of msdos.sys 03D3 B9 0011 mov cx,17 ; MSDOS.SYS is 17 sectors long 03D6 8B 1E 0430 R mov bx,dosseg 03DA 8E DB mov ds,bx ; read into dosseg:0 03DC BB 0000 mov bx,0 03DF 9A 0000 ---- E call far ptr msread ; use MS-BIOS to read in 03E4 8C C8 mov ax,cs 03E6 8E D8 mov ds,ax 03E8 8E C0 mov es,ax 03EA FC cld  The Microsoft MACRO Assembler , Version 1.25 Page 1-18 BIGBIOS 01-31-84 03EB C3 ret ; 03EC read_sys endp ; ; ; 03EC IOSIZE PROC NEAR ; ; Previous versions of the MS-DOS IO system for the APC ; have literally specified the starting floppy record from which ; to load the MSDOS.SYS module. If the size of the bios changed ; so that the IO.SYS module occupied a different number of sectors ; it became neccessary to update the literal accordingly. The ; following routine permits msinit to determine for itself the ; size of IO.SYS and thence the location of the first sector of ; MSDOS.SYS to load. This is accomplished by reading then ; examining the directory entry for IO.SYS. This version ; assumes and requires that the first sector of directory ; resides in record 5; a future version may be required to ; support other boot media than 2s2d for which this is true. ; ; Calling sequence ; call io_size ; ; returns with number of the first sector of MSDOS.SYS in DX; ; DS and status are altered; all other registers preserved. ; ; R.M. Geiger 4/5/83 ; ; Add logic to calculate & save dosseg (dos segment location) ; ; R. M. Geiger 6-7-83 ; 03EC IO_SIZE: 03EC 50 PUSH AX 03ED 53 PUSH BX 03EE 51 PUSH CX 03EF B0 01 MOV AL,1 ; SELECT DRIVER #1 (2S2D) 03F1 32 E4 XOR AH,AH 03F3 BA 0005 MOV DX,5 ; SECTOR 5 IS FIRST OF DIRECTORY 03F6 B9 0001 MOV CX,1 ; READING A SINGLE SECTOR ; ; USE DOS LOCATION FOR DIRECTORY READ ; 03F9 BB 0900 MOV BX,bootseg ; SET UP scratch DMA AREA 03FC 8E DB MOV DS,BX ; DATA SEGMENT FOR READ 03FE BB 0000 MOV BX,0 ; ENTRY STARTS AT 0 0401 9A 0000 ---- E CALL FAR PTR MSREAD ; READ THE DIRECTORY SECTOR 0406 BB 001C MOV BX,28 ; LENGTH IS AT 28 WITHIN DIREC ENTRY 0409 8B 07 MOV AX,DS:[BX] 040B 0E push cs 040C 1F pop ds ; restore ds 040D 33 D2 XOR DX,DX ; CLEAR DIVIDEND EXTENSION H.O. BITS  The Microsoft MACRO Assembler , Version 1.25 Page 1-19 BIGBIOS 01-31-84 040F B9 0400 MOV CX,400H 0412 F7 F1 DIV CX ; DIVIDE FILE LENGTH BY 1k SECTOR SIZE 0414 0B D2 OR DX,DX ; CHECK FOR NONZERO REMAINDER 0416 74 01 JZ NO_PAD ; IF NO REMAINDER DON'T NEED PARTIAL REC 0418 40 INC AX 0419 NO_PAD: ;----------------------------------------------------------------------------- ; Calculate dosseg based on bios size RMG 6-7-83 0419 8B D8 mov bx,ax 041B B9 0006 mov cx,6 ; 1k/16 = paragraphs per 1k 041E D3 E3 shl bx,cl ; multiply 1k size to get paragraph size 0420 83 C3 40 add bx,biosseg ; add paragraph offset to start of bios 0423 89 1E 0430 R mov dosseg,bx ; save it away ;----------------------------------------------------------------------------- 0427 05 000B ADD AX,0BH ; ADD IN OFFSET TO FIRST SECTOR OF IO.SYS 042A 8B D0 MOV DX,AX ; PUT RETURN RESULT IN DX 042C 59 POP CX 042D 5B POP BX 042E 58 POP AX 042F C3 RET 0430 IOSIZE ENDP 0430 ???? dosseg dw ? ; dos load segment 0432 0100 [ localstk dw 100h dup (0) 0000 ] 0632 stackbase: 0632 cend: ; 0632 1B 0E [ sfkeytbl db 1bh,'S',14 dup(0) 00 ] 0642 1B 0E [ db 1bh,'T',14 dup(0) 00 ] 0652 1B 0E [ db 1bh,'U',14 dup(0) 00 ] 0662 1B 0E [ db 1bh,'V',14 dup(0) 00  ] 0672 1B 0E [ db 1bh,'W',14 dup(0) 00 ] ;------------------------------------------------------02/23/1983------  The Microsoft MACRO Assembler , Version 1.25 Page 1-20 BIGBIOS 01-31-84 0682 1B 0E [ db 1bh,'E',14 dup(0) 00 ] ;---------------------------------------------------------------------- 0692 1B 0E [ db 1bh,'P',14 dup(0) 00 ] 06A2 1B 0E [ db 1bh,'Q',14 dup(0) 00 ] ;-------------------------------------------------------02/23/1983----- 06B2 1B 0E [ db 1bh,'J',14 dup(0) 00 ] ;---------------------------------------------------------------------- 06C2 1B 0E [ db 1bh,'D',14 dup(0) 00 ] 06D2 10 [ db 16 dup(0) 00 ] 06E2 10 [ db 16 dup(0) 00 ] 06F2 10 [ db 16 dup(0) 00 ] 0702 10 [ db 16 dup(0) 00 ] 0712 10 [ db 16 dup(0) 00 ] 0722 10 [ db 16 dup(0) 00 ] ;grey funtion keys 0732 1B 0D [F db 1bh,'OO',13 dup(0) 00 ] 0742 1B 0D [0 db 1bh,'OP',13 dup(0)  The Microsoft MACRO Assembler , Version 1.25 Page 1-21 BIGBIOS 01-31-84 00 ] 0752 1B 0D [1 db 1bh,'OQ',13 dup(0) 00 ] 0762 1B 0D [2 db 1bh,'OR',13 dup(0) 00 ] 0772 1B 0D [3 db 1bh,'OS',13 dup(0) 00 ] 0782 1B 0D [4 db 1bh,'OT',13 dup(0) 00 ] ;*** FNC mode *** 0792 44 49 52 20 41 3A db 'DIR A:',13,09 dup(0) 0D 09 [ 00 ] 07A2 44 49 52 20 42 3A db 'DIR B:',13,09 dup(0) 0D 09 [ 00 ] 07B2 43 0B [0 59 20 db 'COPY ',11 dup(0) 00 ] 07C2 54 0B [0 45 20 db 'TYPE ',11 dup(0) 00 ] 07D2 43 48 4B 44 53 4B db 'CHKDSK ',09 dup(0) 20 09 [ 00   ] 07E2 44 0C [C 20 db 'DEL ',12 dup(0) 00 ] 07F2 52 0C [E 20 db 'REN ',12 dup(0) 00 ] 0802 44 0B [4 45 0D db 'DATE',13,11 dup(0) 00  The Microsoft MACRO Assembler , Version 1.25 Page 1-22 BIGBIOS 01-31-84 ] 0812 54 0B [D 45 0D db 'TIME',13,11 dup(0) 00 ] 0822 4D 0B [3 4D 20 db 'MASM ',11 dup(0) 00 ] 0832 4C 0B [E 4B 20 db 'LINK ',11 dup(0) 00 ] 0842 4C 4F 43 41 54 45 db 'LOCATE ',09 dup(0) 20 09 [ 00 ] 0852 45 0A [C 49 4E 20 db 'EDLIN ',10 dup(0) 00 ] 0862 44 0A [2 55 47 20 db 'DEBUG ',10 dup(0) 00 ] 0872 46 0D [0 db 'FC ',13 dup(0) 00 ] 0882 4B 0C [9 0D db 'KEY',13,12 dup(0) 00 ] ;*** FNC grey key *** 0892 1B 0D [5 db 1bh,'OU',13 dup(0) 00 ] 08A2 1B 0D [6 db 1bh,'OV',13 dup(0) 00 ] 08B2 1B 0D [7 db 1bh,'OW',13 dup(0) 00 ] 08C2 1B 0D [8 db 1bh,'OX',13 dup(0) 00 ] 08D2 1B 0D [9 db 1bh,'OY',13 dup(0)  The Microsoft MACRO Assembler , Version 1.25 Page 1-23 BIGBIOS 01-31-84 00 ] 08E2 1B 0D [A db 1bh,'OZ',13 dup(0) 00 ] ; ; 08F2 INT_TRAP PROC FAR 08F2 EA 0000 ---- E jmp REGPRNT 08F7 INT_TRAP ENDP 08F7 PMSG PROC NEAR 08F7 50 push ax 08F8 1E push ds 08F9 51 push cx 08FA B9 ---- E mov cx,seg msconout 08FD 8E D9 mov ds,cx 08FF 59 pop cx 0900 pmsg1: 0900 8A 07 mov al,[BX] ;get next char from message 0902 84 C0 test al,al 0904 74 12 jz pmsg010 ;if zero return ;----------------------------------------------------------------------------- ; RMG 6-7-83 ; Save registers for use with new msconout with "minimal" register save 0906 53 push bx 0907 52 push dx 0908 57 push di 0909 50 push ax 090A 1E push ds ;----------------------------------------------------------------------------- 090B 9A 0000 ---- E  call msconout ;----------------------------------------------------------------------------- ; Restore saved registers 0910 1F pop ds 0911 58 pop ax 0912 5F pop di 0913 5A pop dx 0914 5B pop bx ;----------------------------------------------------------------------------- 0915 43 inc bx 0916 EB E8 jmp short pmsg1 ;next character and loop 0918 pmsg010: 0918 1F pop ds 0919 58 pop ax 091A C3 ret 091B PMSG ENDP  The Microsoft MACRO Assembler , Version 1.25 Page 1-24 BIGBIOS 01-31-84 ;********************************************* ;* * ;* Data Areas * ;* * ;********************************************* 091B 0D 0A int_trp db cr,lf 091D  49 6E 74 65 72 72 db 'Interrupt Trap Halt' 75 70 74 20 54 72 61 70 20 48 61 6C 74 0930 0D 0A db cr,lf 0932 00 DB 0 0933 CODE ENDS ;********************************************* ;* * ;* Dummy Data Section * ;* * ;********************************************* 0000 SEG0 SEGMENT at 0 ASSUME CS:SEG0 0000 org 0 ;(interrupt vectors) 0000 0000 int0_offset dw 0002 org 2 0002 0000 int0_segment dw ;--- rmg / necis / 12-5-83 --- NMI button interrupt vector ; 0008 org 08h 0008 0000 intkbboot dw ; ;--- rmg / necis / 12-5-83 ;begin DEBUG-1' 08/17 by NAC 0050 org 50h 0050 0000 INTKBOS DW 004C org 4ch 004C 0000 inttmos DW ;end DEBUG-1' 08/17 by NAC ;--- rmg / necis / 11-29-83 --- fd controller interrupt vector ; 0070 org 70h 0070 0000 intfdos dw ; ;--- rmg / necis / 11-29-83  The Microsoft MACRO Assembler , Version 1.25 Page 1-25 BIGBIOS 01-31-84 0370 ORG 4*220 0370 0000 EXT_FNC_INT_OFFSET DW 0372 ORG 4*220+2 0372 0000 EXT_FNC_INT_SEGMENT DW ; 0374 org 4*221 ; rmg / necis / 12-7-83 0374 0000 intcrtdump dw 0376 org 4*221+2 0376 0000 intcrtdump_seg dw 0378 SEG0 ENDS END  The Microsoft MACRO Assembler , Version 1.25 Page Symbols-1 BIGBIOS 01-31-84 Structures and records: N a m e Width # fields Shift Width Mask Initial IODAT. . . . . . . . . . . . . . 0016 0009 CMDLN. . . . . . . . . . . . . . 0000 UNIT . . . . . . . . . . . . . . 0001 CMD. . . . . . . . . . . . . . . 0002 STATUS . . . . . . . . . . . . . 0003 MEDIA. . . . . . . . . . . . . . 000D TRANS. . . . . . . . . . . . . . 000E COUNT. . . . . . . . . . . . . . 0012 START. . . . . . . . . . . . . . 0014 Segments and groups: N a m e Size align combine class CODE . . . . . . . . . . . . . . 0933 PARA PUBLIC 'CODE' SEG0 . . . . . . . . . . . . . . 0378 AT 0000 Symbols: N a m e Type Value Attr AUX2DEV. . . . . . . . . . . . . L NEAR 004D CODE AUX2TBL. . . . . . . . . . . . . L WORD 00D1 CODE AUX2_FLUSH . . . . . . . . . . . L NEAR 0000 CODE External AUX2_INT . . . . . . . . . . . . L NEAR 0158 CODE AUX2_RDND. . . . . . . . . . . . L NEAR 0000 CODE External AUX2_RDSTS . . . . . . . . . . . L NEAR 0000 CODE External AUX2_READ. . . . . . . . . . . . L NEAR 0000 CODE External AUX2_WRIT. . . . . . . . . . . . L NEAR 0000 CODE External AUX2_WRST. . . . . . . . . . . . L NEAR 0000 CODE External AUXDEV . . . . . . . . . . . . . L NEAR 0017 CODE AUXTBL . . . . . . . . . . . . . L WORD 00EB CODE AUX_FLUSH. . . . . . . . . . . . L NEAR 0000 CODE External AUX_INT. . . . . . . . . . . . . L NEAR 0152 CODE AUX_RDND . . . . . . . . . . . . L NEAR 0000 CODE External AUX_RDSTS. . . . . . . . . . . . L NEAR 0000 CODE External AUX_READ . . . . . . . . . . . . L NEAR 0000 CODE External AUX_WRIT . . . . . . . . . . . . L NEAR 0000 CODE External AUX_WRST . . . . . . . . . . . . L NEAR 0000 CODE External BIOSSEG. . . . . . . . . . . . . Number 0040 BOOTSEG. . . . . . . . . . . . . Number 0900 BUFFERS. . . . . . . . . . . . . V BYTE 0000 External BUSY_EXIT. . . . . . . . . . . . L NEAR 01B9 CODE Global CA . . . . . . . . . . . . . . . V BYTE 0000 CODE External CALENDAR_INT . . . . . . . . . . Number 00DC CEND . . . . . . . . . . . . . . L NEAR 0632 CODE CLKPOT . . . . . . . . . . . . . Number 0058 CLKSTB0. . . . . . . . . . . . . Number 0007 CLKSTB1. . . . . . . . . . .  . . Number 0008  The Microsoft MACRO Assembler , Version 1.25 Page Symbols-2 BIGBIOS 01-31-84 CMDERR . . . . . . . . . . . . . L NEAR 01BE CODE Global CONDEV . . . . . . . . . . . . . L NEAR 0005 CODE CONFIG_TABLE . . . . . . . . . . L NEAR 01E9 CODE CONFIG_TABLE_PTR . . . . . . . . L WORD 0003 CODE CONOUT . . . . . . . . . . . . . L NEAR 0000 CODE External CONTBL . . . . . . . . . . . . . L NEAR 00B7 CODE CON_FLSH . . . . . . . . . . . . L NEAR 0000 CODE External CON_INIT . . . . . . . . . . . . L NEAR 0000 CODE External CON_INT. . . . . . . . . . . . . L NEAR 014C CODE CON_RDND . . . . . . . . . . . . L NEAR 0000 CODE External CON_RDSTS. . . . . . . . . . . . L NEAR 0000 CODE External CON_READ . . . . . . . . . . . . L NEAR 0000 CODE External CON_WRIT . . . . . . . . . . . . L NEAR 0000 CODE External CON_WRST . . . . . . . . . . . . L NEAR 0000 CODE External CR . . . . . . . . . . . . . . . Number 000D CRTDSP . . . . . . . . . . . . . V BYTE  0000 CODE External CRTDSPADD. . . . . . . . . . . . L WORD 0205 CODE CRTDSPSEG. . . . . . . . . . . . L WORD 0207 CODE CRTTYPE. . . . . . . . . . . . . L BYTE 023A CODE CRTTYPEADD . . . . . . . . . . . L WORD 0231 CODE CRTTYPESEG . . . . . . . . . . . L WORD 0233 CODE CURRENT_DOS_LOCATION . . . . . . V WORD 0000 External DEFAULT_DRIVE. . . . . . . . . . V BYTE 0000 External DEVICE_LIST. . . . . . . . . . . V DWORD 0000 External DEVSTART . . . . . . . . . . . . L WORD 0005 CODE DISK_CHANGE_FLAG . . . . . . . . V WORD 0000 CODE External DISPSTATUS . . . . . . . . . . . L NEAR 0000 CODE External DISPSTATUSADD. . . . . . . . . . L WORD 020D CODE DISPSTATUSSEG. . . . . . . . . . L WORD 020F CODE DO256K . . . . . . . . . . . . . L NEAR 03C0 CODE DOSSEG . . . . . . . . . . . . . L WORD 0430 CODE DOS_SP_SAV . . . . . . . . . . . L WORD 013F CODE DOS_SS_SAV . . . . . . . . . . . L WORD 013D CODE DRIVCONADD . . . . . . . . . . . L WORD 01F1 CODE DRIVCONSEG . . . . . . . . . . . L WORD 01F3 CODE DRIVTBL. . . . . . . . . . . . . L NEAR 0000 CODE External DSKCHG . . . . . . . . . . . . . L FAR 0000 CODE External DSKCHGFLGADD . . . . . . . . . . L WORD 021D CODE DSKCHGFLGSEG . . . . . . . . . . L WORD 021F CODE DSKDEV . . . . . . . . . . . . . L NEAR 005F CODE DSKTBL . . . . . . . . . . . . . L NEAR 0083 CODE DSK_INIT . . . . . . . . . . . . L NEAR 0000 CODE External DSK_INT. . . . . . . . . . . . . L NEAR 0170 CODE DSK_RED. . . . . . . . . . . . . L NEAR 0000 CODE External DSK_WRT. . . . . . . . . . . . . L NEAR 0000 CODE External DSK_WRV. . . . . . . . . . . . . L NEAR 0000 CODE External ENTRY. . . . . . . . . . . . . . L NEAR 0174 CODE ERR_EXIT . . . . . . . . . . . . L NEAR 01C0 CODE Global EXIT . . . . . . . . . . . . . . L NEAR 01C5 CODE Global EXIT1. . . . . . . . . . . . . . L NEAR 01C8 CODE EXITP. . . . . . . . . . . . . . F PROC 01C5 CODE Length =0024 EXT_FNC_INT. . . . . . . . . . . L NEAR 0000 CODE External EXT_FNC_INT_OFFSET . . . . . . . L WORD 0370 SEG0  The Microsoft MACRO Assembler , Version 1.25 Page Symbols-3 BIGBIOS 01-31-84 EXT_FNC_INT_SEGMENT. . . . . . . L WORD 0372 SEG0 FDC_FINISHED . . . . . . . . . . V BYTE 0000 CODE External FDC_FINISH_ADD . . . . . . . . . L WORD 0229 CODE FDC_FINISH_SEG . . . . . . . . . L WORD 022B CODE FDC_SPECIFY. . . . . . . . . . . V BYTE 0000 CODE External FDC_STATUS0_ADD. . . . . . . . . L WORD 022D CODE FDC_STATUS0_SEG. . . . . . . . . L WORD 022F CODE FINAL_DOS_LOCATION . . . . . . . V WORD 0000 External FLUSH. . . . . . . . . . . . . . L NEAR 0000 CODE External GET_BPB. . . . . . . . . . . . . L NEAR 0000 CODE External GET_DATE . . . . . . . . . . . . L FAR 0000 CODE External GOINIT . . . . . . . . . . . . . L NEAR 03C7 CODE HDINDICADD . . . . . . . . . . . L WORD 0211 CODE HDINDICSEG . . . . . . . . . . . L WORD 0213 CODE HDMODEADD. . . . . . . . . . . . L WORD 0221 CODE HDMODESEG. . . . . . . . . . . . L WORD 0223 CODE HDSKDEV. . . . . . . . . . . . . L NEAR 0071 CODE HDSKTBL. . . . . . . . . . . . . L NEAR 009D CODE HDSK_INIT. . . . . . . . . . . . L NEAR 0000 CODE External HDSK_INT . . . . . . . . . . . . L NEAR 016A CODE HDSK_RED . . . . . . . . . . . . L NEAR 0000 CODE External HDSK_WRT . . . . . . . . . . . . L NEAR 0000 CODE External HDSK_WRV . . . . . . . . . . . . L NEAR 0000 CODE External HD_DIRECT_MODE . . . . . . . . . V BYTE 0000 CODE External HD_INDICATION. . . . . . . . . . V BYTE 0000 CODE External HGET_BPB . . . . . . . . . . . . L NEAR 0000 CODE External HMEDIAC. . . . . . . . . . . . . L NEAR 0000 CODE External ICP1 . . . . . . . . . . . . . . Number 0020 ICP2 . . . . . . . . . . . . . . Number 0022 INIT . . . . . . . . . . . . . . L NEAR 0000 CODE INIT010. . . . . . . . . . . . . L NEAR 0330 CODE INITGDC. . . . . . . . . . . . . L NEAR 0355 CODE INITGDCEND . . . . . . . . . . . L NEAR 035A CODE INT0_OFFSET. . . . . . . . . . . L WORD 0000 SEG0 INT0_SEGMENT . . . . . . . . . . L WORD 0002 SEG0 INTCRTDUMP . . . . . . . . . . . L WORD 0374 SEG0 INTCRTDUMP_SEG . . . . . . . . . L WORD 0376 SEG0 INTDUMP. . . . . . . . . . . . . L NEAR 023B CODE INTFD. . . . . . . . . . . . . . L NEAR 0000 CODE External INTFDOS. . . . . . . . . . . . . L WORD 0070 SEG0 INTKB. . . . . . . . . . . . . . L NEAR 0000 CODE External INTKBBOOT. . . . . . . . . . . . L WORD 0008 SEG0 INTKBOS. . . . . . . . . . . . . L WORD 0050 SEG0 INTTM. . . . . . . . . . . . . . L NEAR 0000 CODE External INTTMOS. . . . . . . . . . . . . L WORD 004C SEG0 INT_TRAP . . . . . . . . . . . . F PROC 08F2 CODE Length =0005 INT_TRP. . . . . . . . . . . . . L BYTE 091B CODE IOSIZE . . . . . . . . . . . . . N PROC 03EC CODE Length =0044 IO_SIZE. . . . . . . . . . . . . L NEAR 03EC CODE KBBOOT . . . . . . . . . . . . . L FAR 0000 CODE External KBCRTC . . . . . . . . . . . . . L NEAR 0000 CODE External KBCSRD . . . . . . . . . . . . . L NEAR 0000 CODE External KBCSRO . . . . . . . . . . . . . L NEAR 0000 CODE External  The Microsoft MACRO Assembler , Version 1.25 Page Symbols-4 BIGBIOS 01-31-84 KBIN . . . . . . . . . . . . . . V BYTE 0000 CODE External KBINADD. . . . . . . . . . . . . L WORD 0215 CODE KBINSEG. . . . . . . . . . . . . L WORD 0217 CODE KBLCCV . . . . . . . . . . . . . L NEAR 0000 CODE External KBMOUT . . . . . . . . . . . . . L NEAR 0000 CODE External KBSAD0 . . . . . . . . . . . . . V BYTE 0000 CODE External KBSAD0ADD. . . . . . . . . . . . L WORD 0209 CODE KBSAD0SEG. . . . . . . . . . . . L WORD 020B CODE KBSCRO . . . . . . . . . . . . . L NEAR 0000 CODE External KBSCROPAT. . . . . . . . . . . . L NEAR 0000 CODE External KBSCROPATADD . . . . . . . . . . L WORD 0201 CODE KBSCROPATSEG . . . . . . . . . . L WORD 0203 CODE LA . . . . . . . . . . . . . . . V BYTE 0000 CODE External LF . . . . . . . . . . . . . . . Number 000A LOCALSTK . . . . . . . . . . . . L WORD 0432 CODE Length =0100 MEDIAC . . . . . . . . . . . . . L NEAR 0000 CODE External MELODY_INT . . . . . . . . . . . Number 00DC MEMORY_SIZE. . . . . . . . . . . V WORD 0000 External MLOUT. . . . . . . . . . . . . . L NEAR 0000 CODE External MODCAN . . . . . . . . . . . . . Number 0005 MSCONIN. . . . . . . . . . . . . L FAR 0000 CODE External MSCONOUT . . . . . . . . . . . . L FAR 0000 CODE External MSCONOUTADD. . . . . . . . . . . L WORD 01F9 CODE MSCONOUTSEG. . . . . . . . . . . L WORD 01FB CODE MSCONST. . . . . . . . . . . . . L FAR 0000 CODE External MSCONSTADD . . . . . . . . . . . L WORD 01FD CODE MSCONSTSEG . . . . . . . . . . . L WORD 01FF CODE MSINIT . . . . . . . . . . . . . L NEAR 023E CODE MSLISTOUT. . . . . . . . . . . . L FAR 0000 CODE External MSPUNCH. . . . . . . . . . . . . L FAR 0000 CODE External MSREAD . . . . . . . . . . . . . L FAR 0000 CODE External MSREADER . . . . . . . . . . . . L FAR 0000 CODE External MSWRITE. . . . . . . . . . . . . L FAR 0000 CODE External NBUFS. . . . . . . . . . . . . . Number 0002   NO_PAD . . . . . . . . . . . . . L NEAR 0419 CODE PICMASK. . . . . . . . . . . . . Number 0067 PMSG . . . . . . . . . . . . . . N PROC 08F7 CODE Global Length =0024 PMSG010. . . . . . . . . . . . . L NEAR 0918 CODE PMSG1. . . . . . . . . . . . . . L NEAR 0900 CODE PRNDEV . . . . . . . . . . . . . L NEAR 0029 CODE PRNTBL . . . . . . . . . . . . . L NEAR 011F CODE PRN_INT. . . . . . . . . . . . . L NEAR 015E CODE PRN_STA. . . . . . . . . . . . . L NEAR 0000 CODE External PRN_WRT. . . . . . . . . . . . . L NEAR 0000 CODE External PRTCNVADDR . . . . . . . . . . . L WORD 01ED CODE PRTCNVSEG. . . . . . . . . . . . L WORD 01EF CODE PTRSAV . . . . . . . . . . . . . L DWORD 0139 CODE Global RAMDISKENABLE. . . . . . . . . . L BYTE 0239 CODE RAMDISKENADD . . . . . . . . . . L WORD 0219 CODE RAMDISKENSEG . . . . . . . . . . L WORD 021B CODE READ_SYS . . . . . . . . . . . . N PROC 03CC CODE Length =0020 REGPRNT. . . . . . . . . . . . . L FAR 0000 CODE External REPROC . . . . . . . . . . . . . F PROC 023C CODE Length =0002  The Microsoft MACRO Assembler , Version 1.25 Page Symbols-5 BIGBIOS 01-31-84 RE_INIT. . . . . . . . . . . . . L NEAR 023C CODE Global RS232PARMS . . . . . . . . . . . L NEAR 0000 CODE External RSPARMSADD . . . . . . . . . . . L WORD 0235 CODE RSPERMSSEG . . . . . . . . . . . L WORD 0237 CODE SENDCOM. . . . . . . . . . . . . L NEAR 0000 CODE External SET_DATE . . . . . . . . . . . . L FAR 0000 CODE External SET_TIME . . . . . . . . . . . . L FAR 0000 CODE External SFKEYADDR. . . . . . . . . . . . L WORD 01E9 CODE SFKEYSEG . . . . . . . . . . . . L WORD 01EB CODE SFKEYTBL . . . . . . . . . . . . L BYTE 0632 CODE Global SICP1. . . . . . . . . . . . . . Number 0028 SICP2. . . . . . . . . . . . . . Number 002A SLVMASK. . . . . . . . . . . . . Number 00EF SODAMD . . . . . . . . . . . . . Number 006E SODAW1 . . . . . . . . . . . . . Number 006E SODAW2 . . . . . . . . . . . . . Number 006C STACKBASE. . . . . . . . . . . . L NEAR 0632 CODE STATUS0. . . . . . . . . . . . . V BYTE 0000 CODE External STATUSADD. . . . . . . . . . . . L WORD 01F5 CODE STATUSLINE . . . . . . . . . . . L NEAR 0000 CODE External STATUSSEG. . . . . . . . . . . . L WORD 01F7 CODE STRATEGY . . . . . . . . . . . . L NEAR 0141 CODE STRATP . . . . . . . . . . . . . F PROC 0141 CODE Length =000B SYSINIT. . . . . . . . . . . . . L FAR 0000 External TBLWORK. . . . . . . . . . . . . L NEAR 0000 CODE External TIMDEV . . . . . . . . . . . . . L NEAR 003B CODE TIMTBL . . . . . . . . . . . . . L WORD 0105 CODE TIM_INT. . . . . . . . . . . . . L NEAR 0164 CODE TIM_RED. . . . . . . . . . . . . L NEAR 0000 CODE External TIM_WRT. . . . . . . . . . . . . L NEAR 0000 CODE External U_AUXCGTBL . . . . . . . . . . . L NEAR 0000 CODE External U_AUXCGTBL_ADD . . . . . . . . . L WORD 0225 CODE U_AUXCGTBL_SEG . . . . . . . . . L WORD 0227 CODE Warning Severe Errors Errors 0 0 M86DAT ۇӀˀ\LT  The Microsoft MACRO Assembler , Version 1.25 Page 1-1 MSREAD 01-31-84 TITLE MSREAD page 58,132 ;----------------------------------------------------------------------------- ; ; MS-DOS BIOS for the N.E.C. Advanced Personal Computer ; ; module name: MSREAD ; MS-DOS version: 2.0 ; module version: 1.0 ; ; abstract: This module contains the io drivers for the diskette drives. ; ; contains routines: ; rdydly dskchg dskcheck msread mswrite execute sendcom execpoll ; dsk_init mediac get_bpb dsk_red dsk_wrv dsk_wrt sing_chg ; ; revision history: ; ; This module originated as a module of an April, 1983 NEC/Tokyo ; IO system for MS-DOS V1.25. The interface routines were added at ; NECIS in mid April, 1983, for use as part of the MS-DOS 2.0 IO ; system. Hooks for hard disk IO handle were then integrated. ; ; A change was also made to fix the "drive ready" delay problem when ; attempting IO to soon after closing the drive door. The fix is to ; wait for aprox. 1 second after any not ready state is detected; ; the drive status is then sensed again, and if has not gone ready, ; then the not ready error code is returned. ; ; The check for write protection has been modified so that the ; protection state is examined at the time of the call. ; (this fixes the unmanifested error of not returning a write protect ; violation if no call to DSKCHG has been made after the write-protected ; disk has been mounted. This error was detected by the BIOS test ; program, but did not show up in this version of the DOS.) ; - RMG 6-7-83 ; ; The MAPDEV stub routine has been removed. Unnecessary register ; saves which were residual from V1.25 have been removed. ; - RMG 6-9-83 ; ; The diskette controller now uses it's interrupt to detect operation ; complete and drive ready status changes, so that auto disk logging ; no longer depends on the timer interrupt to poll drive ready. ; - RMG 11-29-83 ; ; FLUSH routine removed (now done by direct manipulation of KBIN, ; KBOUT, in module usconin). ; - RMG 12-5-83 ; ;-----------------------------------------------------------------------------  The Microsoft MACRO Assembler , Version 1.25 Page 1-2 MSREAD 01-31-84 0000 CODE SEGMENT PUBLIC 'CODE' ;--------------------------------------------------------02/23/1983---- = 00DC BIOSINT EQU 220 ;---------------------------------------------------------------------- extrn flush:near EXTRN regprnt:far EXTRN pmsg:near,msconout:far,msconst:far,msconin:far EXTRN exit:near,err_exit:near,ptrsav:dword extrn hd_transfer:near extrn cursoroff:near,kbcsad:near,crtdsp:word extrn kbcsro:near,kbmout:near,kbcsrd:near extrn gdcbusyf:byte public fdc_finished public gord,gowr public driver_num,num_of_sec,wflag,dma_segment public intfd public hd_ind_on,hd_ind_off PUBLIC dsk_red,dsk_wrt,dsk_wrv,mediac PUBLIC dsk_init,get_bpb,drivtbl PUBLIC DSKCHG PUBLIC MSREAD PUBLIC MSWRITE PUBLIC SENDCOM PUBLIC FDC_SPECIFY PUBLIC STATUS0 ASSUME CS:CODE,DS:CODE,SS:CODE,ES:CODE inits struc 0000 0D [ db 13 dup (?) ?? ] 000D ?? nounits db ? 000E ???? dw ? 0010 ???? dw ? 0012 ???? bpbadr dw ? 0014 ???? bpbseg dw ? 0016 inits ends bpbb struc 0000 0D [ db 13 dup (?) ?? ] 000D ?? bpb_med db ? 000E ???? scrt dw ? 0010 ???? dw ? 0012 ???? bpb_adr dw ? 0014 ???? bpb_seg dw ?  The Microsoft MACRO Assembler , Version 1.25 Page 1-3 MSREAD 01-31-84 0016 bpbb ends medias struc 0000 0D [ db 13 dup (?) ?? ] 000D ?? med_des db ? 000E ?? med_sts db ? 000F medias ends iodat struc 0000 ?? cmdlen db ? 0001 ?? unit db ? 0002 ?? cmd db ? 0003 ???? status dw ? 0005 08 [ db 8 dup (?) ?? ] 000D ?? media db ? 000E ???????? trans dd ? 0012 ???? count dw ? 0014 ???? start dw ? 0016 iodat ends dpb struc 0000 03 [ bjmp db 3 dup (?) ?? ] 0003 08 [ sysid db 8 dup (?) ?? ] 000B ???? secsiz dw ? 000D ?? alloc db ? 000E ???? ressec dw ? 0010 ?? fats db ? 0011 ???? maxdir dw ? 0013 ???? sectors dw ? 0015 ?? mediaid db ? 0016 ???? fatsec dw ? 0018 ???? secper dw ? 001A dpb ends 0000 03 [ dsdd dpb <,,1024,1,1,2,192,77*8*2,0feh,2,8> ?? ] 0003 08 [ ?? ] 000B 0400  The Microsoft MACRO Assembler , Version 1.25 Page 1-4 MSREAD 01-31-84 000D 01 000E 0001 0010 02 0011 00C0 0013 04D0 0015 FE 0016 0002 0018 0008 001A  03 [ sssd dpb <,,128,4,1,2,68,77*26,0ffh,6,26> ?? ] 001D 08 [ ?? ] 0025 0080 0027 04 0028 0001 002A 02 002B 0044 002D 07D2 002F FF 0030 0006 0032 001A ; ; The following table will be used in the future by a config ; utility allowing the user to configure the system for the ; actual number of physical drives on an APC. The 'nodriv' dpb ; and dbp array entries serve two purposes: ; ; 1. Reserve the drive designator (A,B,C,D) for floppy ; disk if there are less than 4 drives in the system ; ; 2. Allow the system to detect a single drive system in ; order invoke the single drive disk swapping logic ; ; The format of the table will be as follows: ; ; At drivtbl will be nunits, the byte number of drives currently ; serviced by the driver (and consequently the number of "reserved" ; drive designators, ie nunits = 5 would reserve A, B, C, D, and E. ; The next byte, nphy0, gives the actual number of physical units - 1. ; This is the byte which should be patched by a configuration utility. ; The next nunits words are the dpb pointer array which will ; be returned to sysinit by dsk_init. ; 0034 drivtbl: 0034 04 nunits db 4 ; number of 'reserved' units (4 = A-D, etc) = 0002 nphy equ 2 0035 01 nphy0 db nphy-1 ; relative-0 number of phy drivs...  The Microsoft MACRO Assembler , Version 1.25 Page 1-5 MSREAD 01-31-84 0036 000B R dsdd_ptr dw dsdd.secsiz 0038 000B R dw dsdd.secsiz 003A 000B R dw dsdd.secsiz 003C 000B R dw dsdd.secsiz = 0000 adisk equ 0 = 0001 bdisk equ 1 003E 00 cursing_disk db 0 ; current mounted disk (for single ; drive ops only; 0 = A, 1 = B ; ; ; delay routine; delays cx milliseconds (5Mhz, not incl interrupt ; service routines) ; ; inner loop length, for 1 ms must be 5000 t cycles (x 200ns/t = 1ms) ; ; 11 + 4 + 17n + 8 + 17 = 5000 ; 17n = 4960 ; n = 291.76; use 291, and we'll never be late ; 003F rdydly: 003F dlyloop: 003F 51 push cx ; 11 t cycles 0040 B9 0123 mov cx,291 ; 4 (to get 1 ms delay for each inner) 0043 inner: 0043 E2 FE loop inner ; 17 (taken) 0045 59 pop cx ; 8 0046 E2 F7 loop dlyloop ; 17 (taken) 0048 C3 ret ; 8 ; 0049 DSKCHG PROC FAR ;in: AL,AH=drive number.(0=A:,1=B:) ;ex: AH=-1(changed),0(not nown) or 1(not changed) ; AL=driver number (0=A:single side FM) ; (1=A:double side MFM) ; (2=B:single side FM) ; (3=B:double side MFM) ; cf=(0:nomal,1:err) ; see drive status (not ready,fd=1 or fd=2d) 0049 50 push ax ; calculate wp_flag_(dr) in bx 004A B4 00 mov ah,0 004C BB 0589 R mov bx,offset wp_flag_0 004F 03 D8 add bx,ax 0051 C6 07 00 mov byte ptr[bx],0 ;usually it's 0. 0054 53 push bx ; save drive number. 0055 A2 0991 R mov dvc_us,al ;set drive# in dvccmd.  The Microsoft MACRO Assembler , Version 1.25 Page 1-6 MSREAD 01-31-84 0058 BB 098F R mov bx,offset dvccmd ;set top of cmd line. 005B E8 0433 R call sendcom ;04h-(dr#). 005E E8 0114 R call get_st_sub ;get status. 0061 5B pop bx ;restore bx for wr_op. 0062 A8 20 test al,20h 0064 75 17 jnz is_ready 0066 51 push cx 0067 B9 03E8 mov cx,1000 ;timeout after 1 sec. not rdy 006A E8 003F R call rdydly ; delay 006D 59 pop cx ;chack status again 006E 53 push bx 006F BB 098F R mov bx,offset dvccmd ;set top of cmd line. 0072 E8 0433 R call sendcom ;04h-(dr#). 0075 E8 0114 R call get_st_sub ;get status. 0078 5B pop bx ;restore bx for wr_op. 0079 A8 20 test al,20h 007B 74 25 jz dskch_err ;if fdd not ready. 007D is_ready: 007D A8 08 test al,08h 007F B3 00 mov bl,0 ;default fd=1. 0081 74 02 je skip_fd_2d ;if fd=1. 0083 B3 01 mov bl,1 ; fd=2d. 0085 skip_fd_2d: 0085 58 pop ax 0086 D0 E0 shl al,1 0088 02 C3 add al,bl ;drv#=dr#*2+fd 008A B4 00 mov ah,0 ;not known ;*** operation about changing *** 008C 2B DB sub bx,bx 008E 8A 1E 0991 R mov bl,dvc_us 0092 81 C3 099E R add bx,offset fdd_same0 ;bx=fdd_same(0/1) 0096 80 3F FF cmp byte ptr 0[bx],0ffh ;same disk? 0099 75 02 jne skip_same 009B B4 01 mov ah,1 ;*** NOT CHANGED *** 009D C6 07 FF skip_same: mov byte ptr 0[bx],0ffh ;nomal end. 00A0 F8 clc ;Clear the Carry Status 00A1 dskchg_ret: 00A1 CB ret 00A2 dskch_err: 00A2 58 pop ax 00A3 B8 0002 mov ax,2 ; fdd not ready 00A6 F9 stc ;Set the Carry Status 00A7 EB F8 jmp short dskchg_ret 00A9 DSKCHG ENDP ;--- rmg / necis / 11-29-83 --- ; ; The diskette change detection is now interrupt driven. The following ; routine is called whenever an interrupt caused by a drive ready state ; change is serviced.  The Microsoft MACRO Assembler , Version 1.25 Page 1-7 MSREAD 01-31-84 ; 00A9 DISKCHECK PROC NEAR 00A9 E4 50 in al,50h ;check FDD BUSY. 00AB A8 10 test al,10h 00AD 75 64 jnz check_ret ;return if BUSY. ;----------------------------------------------------02/23/1983-------- ;***** DRIVE 0 ***** 00AF 80 3E 099E R 00 cmp byte ptr fdd_same0,0 00B4 74 12 je check_fdd1 ;already not ready(DRIVE 0) 00B6 BB 0992 R mov bx,offset DVC0 ;check status 00B9 E8 0433 R call sendcom 00BC E8 0114 R call get_st_sub 00BF A8 20 test al,20h ;check if not ready? 00C1 75 05 jnz check_fdd1 ;ready 00C3 C6 06 099E R 00 mov byte ptr fdd_same0,0 ;** turn to NOT READY ** 00C8 check_fdd1: ;*** DRIVE 1 *** 00C8 80 3E 099F R 00 cmp byte ptr fdd_same1,0 00CD 74 12 je check_fdd2 00CF BB 0995 R mov bx,offset DVC1 00D2 E8 0433 R call sendcom 00D5 E8 0114 R call get_st_sub 00D8 A8 20  test al,20h 00DA 75 05 jnz check_fdd2 00DC C6 06 099F R 00 mov byte ptr fdd_same1,0 00E1 check_fdd2: ;***** DRIVE 2 ***** 00E1 80 3E 09A0 R 00 cmp byte ptr fdd_same2,0 00E6 74 12 je check_fdd3 00E8 BB 0998 R mov bx,offset DVC2 00EB E8 0433 R call sendcom 00EE E8 0114 R call get_st_sub 00F1 A8 20 test al,20h 00F3 75 05 jnz check_fdd3 00F5 C6 06 09A0 R 00 mov byte ptr fdd_same2,0 00FA check_fdd3: ;***** DRIVE 3 ***** 00FA 80 3E 09A1 R 00 cmp byte ptr fdd_same3,0 00FF 74 12 je check_ret 0101 BB 099B R mov bx,offset DVC3 0104 E8 0433 R call sendcom 0107 E8 0114 R call get_st_sub 010A A8 20 test al,20h 010C 75 05 jnz check_ret 010E C6 06 09A1 R 00 mov byte ptr fdd_same3,0 ;---------------------------------------------------------------------- 0113 C3 check_ret: ret 0114 DISKCHECK ENDP  0114 GET_ST_SUB PROC NEAR 0114 E4 50 in al,50h 0116 D0 E0 shl al,1 0118 73 FA jae get_st_sub 011A D0 E0 shl al,1 011C 73 F6 jae get_st_sub  The Microsoft MACRO Assembler , Version 1.25 Page 1-8 MSREAD 01-31-84 011E E4 52 in al,52h 0120 C3 ret 0121 GET_ST_SUB ENDP ;*********************************** ;*** MSREAD & MSWRITE *** ;*********************************** ;in: AL=I/O driver number (starting with 0) ; AH=Verify flag (1:verify) ; CX=Number of physical sectors to transfer. ; DX=Logical sector number. ; DS:BX=transfer address. ;ex: cf=(1:err detected, 0:no err) ; AL=error type (0:write protect) ; (2:not ready) ; CX=number of sectors remaining to be transfered 0121 MSREAD PROC FAR 0121 F8 clc ;clear carry as read. 0122 EB 01 jmp short MSREAD_WRITE 0124 MSWRITE LABEL FAR 0124 F9 stc ;set carry as write. 0125 MSREAD_WRITE: 0125 1E push ds 0126 06 push es ;begin COMMON1 ;common (read/write) (fd=1/fd=2d) ;operation: ; DMA_CHNNEL =higher 4 bits of DS*10h+BX. ; DMA_ADDRESS=lower 16 bits of DS*10h+BX ; DRIVER_NUM =AL ; VERIFY_FLAG=AH ; NUM_OF_SEC =CX ; LOG_SEC =DX ; DRIVE_NUM =int(AL/2) ; WFLAG =0(read) or 1(write) ; BP reg =fdd1 or fdd2 0127 50 push ax 0128 1E push ds 0129 8C C8 mov ax,cs 012B 8E D8 mov ds,ax ;ds=cs. 012D 8E C0 mov es,ax ;es=cs. 012F 58 pop ax 0130 A3 057F R mov dma_segment,ax 0133 58 pop ax 0134 A2 0578 R mov driver_num,al 0137 88 26 057A R mov verify_flag,ah 013B 89 0E 057B R mov num_of_sec,cx 013F 89 16 057D R mov log_sec,dx ;W_FLAG  The Microsoft MACRO Assembler , Version 1.25 Page 1-9 MSREAD 01-31-84 0143 B0 00 mov al,0 0145 73 02 jnc skip_wflag_on 0147 B0 01 mov al,1 0149 skip_wflag_on: 0149 A2 0581 R mov wflag,al 014C 20 06 057A R and verify_flag,al ;mask vflag by wflag = 0004 hd_base_unit equ 4 0150 80 3E 0578 R 04 cmp byte ptr driver_num,HD_Base_Unit ; {BD} 0155 7C 06 jl skip_hard ; {BD} 0157 E8 0000 E call HD_Transfer ; {BD} 015A E9 0341 R jmp MS_RW_RET ; {BD} 015D skip_hard: 015D 8B 16 057F R mov dx,dma_segment 0161 8A C6 mov al,dh 0163 B1 04 mov cl,4 0165 D2 E8 shr al,cl 0167 8A E8 mov ch,al ;ch=higher 4 bit of DS. 0169 8B C2 mov ax,dx 016B B1 04 mov cl,4 016D D3 E0 shl ax,cl 016F 03 C3 add ax,bx ;ax=DS*10h+BX 0171 73 02 jnc skip_over_flow 0173 FE C5 inc ch ;treat over flow 0175 skip_over_flow: 0175 A3 0576 R mov dma_address,ax 0178 8A C5 mov al,ch 017A A2 0575 R mov dma_channel,al ;drive number 017D A0 0578 R mov al,driver_num 0180 D0 E8 shr al,1 0182 A2 0579 R mov drive_num,al 0185 BB 055B R mov bx,offset fdd1 0188 73 03 jnc skip_bx_fdd1 018A BB 0568 R mov bx,offset fdd2 018D skip_bx_fdd1: ; end COMMON1 ; ; check for drive not ready... ; 018D 53 push bx ; save drive number. 018E A2 0991 R mov dvc_us,al ;set drive# in dvccmd. 0191 BB 098F R mov bx,offset dvccmd ;set top of cmd line. 0194 E8 0433 R call sendcom ;04h-(dr#). 0197 E8 0114 R call get_st_sub ;get status. 019A 5B pop bx 019B A8 20 test al,20h 019D 75 1D jnz is_ready2 ;if fdd ready, then continue 019F 51 push cx 01A0 B9 03E8 mov cx,1000 ;timeout after 1 sec. not rdy 01A3 E8 003F R call rdydly ; delay 01A6 59 pop cx ;chack status again 01A7 53 push bx  The Microsoft MACRO Assembler , Version 1.25 Page 1-10 MSREAD 01-31-84 01A8 BB 098F R mov bx,offset dvccmd ;set top of cmd line. 01AB E8 0433 R call sendcom ;04h-(dr#). 01AE E8 0114 R call get_st_sub ;get status. 01B1 5B pop bx ;restore bx for wr_op. 01B2 A8 20 test al,20h 01B4 75 06 jnz is_ready2 ;if fdd ready 01B6 B8 0002 mov ax,2 ;not ready error code 01B9 E9 0344 R jmp ms_err_ret ;return error 01BC is_ready2: ;*** write protect error check *** ;if write operation ? 01BC 80 3E 0581 R 01 cmp byte ptr wflag,1 01C1 75 0A jne skip_wp_check 01C3 A8 40 test al,40h ;write protect status bit 01C5 74 06 jz skip_wp_check 01C7 B8 0000 mov ax,0 ;write protect error 01CA E9 0344 R jmp ms_err_ret 01CD skip_wp_check: 01CD more_track: 01CD 53 push bx ;save bx for next. ;begin COMMON2 ;operation: ; make TRACK_TO_ACCESS byte ptr 6[BP] ; SEC_TO_ACCESS byte ptr 8[BP] ; NUM_TO_ACCESS ; DMA_CH1,DMA_SND ; update DMA_ADDRESS ; DMA_CHANNEL ; NUM_OF_SEC ; LOG_SEC ; see SEC_PER_TRACK byte ptr 0[BP] ; BYTE_OF_SEC word ptr 1[BP] 01CE 8A 0F mov cl,0[bx] ;cl=SEC_PER_TRACK 01D0 A1 057D R mov ax,log_sec 01D3 F6 F1 div cl 01D5 88 47 06 mov 6[bx],al ;track_to_access 01D8 FE C4 inc ah 01DA 88 67 08 mov 8[bx],ah ;sec_to_access ; 01DD 8A C4 mov al,ah 01DF B4 00 mov ah,0 ;sec_to_access 01E1 B5 00 mov ch,0 ;sec per track 01E3 8B 16 057B R mov dx,num_of_sec 01E7 03 C2 add ax,dx ;ax=next sec 01E9 48 dec ax 01EA 2B C1 sub ax,cx ;ax=next sec in next track. 01EC 7E 02 jle skip_next_tr 01EE 2B D0 sub dx,ax ;case ax>=1 01F0 skip_next_tr: ;hear DX=number to access now(DX<256 so DX=DL) 01F0 A1 0576 R mov ax,dma_address  The Microsoft MACRO Assembler , Version 1.25 Page 1-11 MSREAD 01-31-84 01F3 A3 09BB R mov dma_snd,ax 01F6 A0 0575 R mov al,dma_channel 01F9 A2 09BA R mov dma_ch1,al 01FC A0 0579 R mov al,drive_num 01FF 88 47 05 mov 5[bx],al ;end COMMON2 ;check if fd=1 0202 80 3F 1A cmp byte ptr 0[bx],26 0205 74 26  jz case_of_1 ;case of d2 0207 8A 47 06 mov al,6[bx] ;load track. 020A D0 E8 shr al,1 020C B1 00 mov cl,0 020E 73 02 jnc side_cl 0210 B1 01 mov cl,1 ;side=1 0212 side_cl: 0212 88 47 06 mov 6[bx],al ;track/2 0215 88 4F 07 mov 7[bx],cl 0218 8A C1 mov al,cl 021A B1 02 mov cl,2 021C D2 E0 shl al,cl 021E 8A 67 05 mov ah,5[bx] ;HD,UNIT 0221 0A C4 or al,ah 0223 88 47 05 mov 5[bx],al 0226 C6 47 04 C6 mov byte ptr 4[bx],0c6h ;2d_read(-1;write) 022A EB 05 90 jmp common_1_2d 022D case_of_1: 022D C6 47 04 06 mov byte ptr 4[bx],06h ;1_read 0231 common_1_2d: 0231 C6 06 09BD R 15 mov byte ptr dma_rw,15h ;read DMA 0236 80 3E 0581 R 00 cmp byte ptr wflag,0 023B 74 08 jz skip_write_case ;write case 023D FE 4F 04 dec byte ptr 4[bx] ;command to write. 0240 C6 06 09BD R 19 mov byte ptr dma_rw,19h ;write DMA 0245 skip_write_case: ;begin COMMON3 ; 0245 C6 06 0582 R 00 mov byte ptr over_up_flag,0 ;usualy not over up. 024A over_seg_check: ;check over segment access (illegal) 024A 8B 47 01 mov ax,1[bx] ;bytes of sector. 024D B1 03 mov cl,3 024F D3 E8 shr ax,cl 0251 F6 E2 mul dl 0253 B1 03 mov cl,3 0255 D3 E0 shl ax,cl 0257 48 dec ax ;dma count is start with 0 0258 A3 09B8 R mov dma_tc,ax ;dma_tc=transfer bytes+1 025B 40 inc ax ;resume ax starting with 1 025C 8B 0E 0576 R mov cx,dma_address 0260 03 C1 add ax,cx  The Microsoft MACRO Assembler , Version 1.25 Page 1-12 MSREAD 01-31-84 0262 74 34 jz just_segment ;if just_segment_bottom 0264 73 36 jnc ok_seg_check ;if not over up. 0266 FE CA dec dl 0268 75 E0 jnz over_seg_check ;decrement num of sec & retry ;*** special case *** 026A C6 06 0582 R 01 90 mov over_up_flag,1 ;** OVER SEGMENT *** 0270 FE C2 inc dl ;dl=1 0272 50 push ax 0273 8A 26 09BA R mov ah,dma_ch1 0277 B0 00 mov al,0 0279 B1 04 mov cl,4 027B D2 E4 shl ah,cl 027D FE C4 inc ah ;ax=dma_ch1*1000h+100h 027F A3 0585 R mov over_seg,ax ;save it in over_seg 0282 A1 09BB R mov ax,dma_snd 0285 2D 1000 sub ax,1000h ;ax=dma_snd-1000h 0288 A3 0587 R mov over_adr,ax ;save it in over_adr 028B 58 pop ax 028C C6 06 09BA R 00 90 mov dma_ch1,0 0292 C7 06 09BB R 098D R mov dma_snd,(400h+offset dma_buffer) ; 0298 FE 06 0575 R just_segment: inc dma_channel ;update dma_channel 029C ok_seg_check: ;here not over up access. 029C A3 0576 R mov dma_address,ax ;update DMA_ADDRESS 029F 8B C2  mov ax,dx ;to calcurate 02A1 29 06 057B R sub num_of_sec,ax ;update num_of_sec 02A5 01 06 057D R add log_sec,ax ;update log_sec 02A9 A3 0583 R mov num_old,ax ;save current #. ;end COMMON3 02AC C6 06 09AD R 00 90 mov retry_vrf,0 ; no verify retries yet 02B2 set_rw_command: 02B2 A0 0582 R mov al,over_up_flag 02B5 22 06 0581 R and al,wflag 02B9 74 16 jz skip_over_w ;only case over_up & write 02BB 1E push ds ;set distination (ES=CS:DI=dma_buffer) 02BC BF 058D R mov di,offset dma_buffer 02BF 8B 0E 09B8 R mov cx,dma_tc 02C3 41 inc cx ;set source address(DS=over_seg:SI=over_adr) 02C4 8B 36 0587 R mov si,over_adr 02C8 A1 0585 R mov ax,over_seg 02CB 8E D8 mov ds,ax ;[MUST BE LAST!!!] 02CD FC cld 02CE F3/ A4 rep movsb 02D0 1F pop ds 02D1 skip_over_w: ;begin ACCESS ;access on dma_ch1,dma_snd  The Microsoft MACRO Assembler , Version 1.25 Page 1-13 MSREAD 01-31-84 02D1 83 C3 03 add bx,3 02D4 E8 0384 R call execute ;*** EXECUTE ACCESS *** 02D7 80 3E 0582 R 01 cmp byte ptr over_up_flag,1 02DC 75 1F jne skip_over_r 02DE 80 3E 0581 R 00 cmp byte ptr wflag,0 02E3 75 18 jne skip_over_r ;only case of over segment access 02E5 50 push ax 02E6 06 push es ;set source (DS:SI) 02E7 BE 058D R mov si,offset dma_buffer ;set distination (ES:DI) 02EA A1 0585 R mov ax,over_seg 02ED 8E C0 mov es,ax 02EF 8B 3E 0587 R mov di,over_adr ;set counter (CX) 02F3 8B 0E 09B8 R mov cx,dma_tc 02F7 41 inc cx 02F8 FC cld 02F9 F3/ A4 rep movsb 02FB 07 pop es 02FC 58 pop ax 02FD skip_over_r: 02FD 5B pop bx ;restore BX for more_track 02FE 3C 00 cmp al,0 ;error check. 0300 75 42 jne ms_err_ret ;if error ocurred 0302 80 3E 057A R 01 cmp byte ptr verify_flag,1 0307 75 2D jne skip_verify ;only verify case ;============================================================================= ; Patch to 1) implement retry on verify and 2) fix write/ver of 1s1d diskettes ; from May 28 NEC/T MSREAD 0309 53 push bx 030A C6 06 09BD R 11 mov byte ptr dma_rw,11h 030F FE 47 04 inc byte ptr 4[bx] 0312 83 C3 03 add bx,3 0315 E8 0384 R call execute 0318 5B pop bx 0319 3C 00 cmp al,0 031B B0 0A mov al,10 ;*** write fault *** 031D 74 17 je skip_verify 031F FE 06 09AD R inc retry_vrf 0323 80 3E 09AD R 02 cmp byte ptr retry_vrf,2 0328 73 1A jnb ms_err_ret 032A FE 4F 04  dec byte ptr 4[bx] 032D C6 06 09BD R 13 mov byte ptr dma_rw,19 0332 53 push bx 0333 E9 02B2 R jmp set_rw_command ;============================================================================= 0336 skip_verify: 0336 83 3E 057B R 00 cmp word ptr num_of_sec,0  The Microsoft MACRO Assembler , Version 1.25 Page 1-14 MSREAD 01-31-84 033B 74 03 jz no_more_track 033D E9 01CD R jmp more_track 0340 no_more_track: 0340 F8 clc 0341 MS_RW_RET: 0341 07 pop es 0342 1F pop ds 0343 CB ret 0344 ms_err_ret: 0344 50 push ax ;save error type. 0345 A1 057B R mov ax,num_of_sec 0348 03 06 0583 R add ax,num_old 034C 8B C8 mov cx,ax ;rest # 034E 58 pop ax ;restore error type. 034F F9 stc ;error flag 0350 EB EF jmp ms_rw_ret 0352 MSREAD ENDP ; 0352 SENS PROC NEAR ; MOV BX,OFFSET SENSCMD ; CALL sendcom ; 0352 B9 0002 MOV CX,02H ; 0355 E8 0450 R CALL EXECPOLL ; 0358 A0 09B0 R MOV AL,STATUS0 035B 8A C8 MOV CL,AL 035D 80 E1 C0 AND CL,0C0H ; MASK IGNORE 0360 80 F9 C0 CMP CL,0C0H ; 0363 75 11 JNE SENS010 ; IF NOT IGNORE 0365 24 03 AND AL,03H ; MASK UNIT NO. 0367 8A 0E 0991 R MOV CL,DVC_US 036B 80 E1 03 AND CL,03H ; MASK ACCESS UNIT NO. 036E 3A C1 CMP AL,CL ; 0370 75 0E JNE SENS020 ; IF NOT ACCESS UNIT IGNORE 0372 0C FF OR AL,255 ; IF ACCESS UNIT IGNORE 0374 EB 0D JMP SHORT SENS_NOT_READY 0376 SENS010: 0376 24 F8 AND AL,0F8H 0378 A8 08 TEST AL,08H 037A 75 07 JNZ SENS_NOT_READY 037C 3C 20 CMP AL,020H ; CHECK SEEK end 037E 75 D2 JNE SENS 0380 SENS020: 0380 24 00 AND AL,0 ; NORMAL end 0382 C3 RET 0383 SENS_NOT_READY: 0383 C3 RET 0384 SENS ENDP 0384 EXECUTE PROC NEAR 0384 8A 47 02 mov al,2[bx]  The Microsoft MACRO Assembler , Version 1.25 Page 1-15 MSREAD 01-31-84 0387 A2 09A7 R mov seeku,al 038A 8A 47 03 mov al,3[bx] 038D A2 09A8 R mov seekc,al 0390 execute_00: 0390 89 1E 09AE R MOV LAST_COM,BX ; SAVE LAST CMD BLOCK ; ADDRESS 0394 OUTER_RETRY: 0394 C6 06 09AC R 00 MOV BYTE PTR RTCNT,0 ; 0399 OUTER_RETRY00: 0399 C6 06 09AB R 00 MOV BYTE PTR RETRY_CNT,0 ; FOR RETRIES 039E RETRY: ; 039E BB 09A5 R MOV BX,OFFSET SEEKCMD 03A1 E8 0433 R CALL sendcom ; EXECUTE SEEK 03A4 E8 0352 R CALL SENS 03A7 3C 00 CMP AL,0 03A9 74 03 JE send_dma 03AB EB 79 90 JMP EXEC040 ; SET UP DMA 03AE send_dma: ; 03AE A1 09BB R  MOV AX,DMA_SND 03B1 E6 03 OUT 03H,AL ; send LOW BYTE OF DMA ; ADDRESS 03B3 8A C4 MOV AL,AH 03B5 E6 03 OUT 03H,AL ; send HIGH BYTE 03B7 A1 09B8 R MOV AX,DMA_TC 03BA E6 13 OUT 13H,AL 03BC 8A C4 MOV AL,AH 03BE E6 13 OUT 13H,AL ; TC SET 03C0 A0 09BD R MOV AL,DMA_RW ; R/W SET 03C3 E6 1B OUT 1BH,AL ; WRITE MODE SET 03C5 A0 09BA R MOV AL,DMA_CH1 03C8 E6 3A OUT 3AH,AL ; DMA CH1 REG FILE 03CA B0 01 MOV AL,01H 03CC E6 0B OUT 0BH,AL ; MASK RESET 03CE 8B 1E 09AE R MOV BX,LAST_COM 03D2 E8 0433 R CALL sendcom ; TRANSMIT COMMAND TO FDC 03D5 B9 0007 MOV CX,07H ; CX = STATUS FETCH LENGTH 03D8 E8 0450 R CALL EXECPOLL 03DB 8A 26 09B0 R MOV AH,STATUS0 03DF A0 09B1 R MOV AL,STATUS1 03E2 25 F8FF AND AX,0F8FFH ; IF ST0,ST1 ALARM 03E5 75 09 JNZ EXEC030 03E7 80 26 09B2 R BF AND BYTE PTR STATUS2,0BFH ; IF STATUS2 ALARM (IGNORE DDM) 03EC 75 02 JNZ EXEC030 03EE EB 39 JMP SHORT Z_RET 03F0 EXEC030: 03F0 FE 06 09AB R INC RETRY_CNT 03F4 80 3E 09AB R 08 CMP BYTE PTR RETRY_CNT,8 ; IF RETRY COUNT = 8 03F9 75 31 JNE RETRY_L0  The Microsoft MACRO Assembler , Version 1.25 Page 1-16 MSREAD 01-31-84 03FB FE 06 09AC R INC BYTE PTR RTCNT ; 03FF 80 3E 09AC R 03 CMP BYTE PTR RTCNT,3 ; 0404 74 20 JE EXEC040 ; 0406 8B 1E 09AE R MOV BX,LAST_COM ; 040A 8A 47 02 MOV AL,2[BX] ; US 040D 24 03 AND AL,03H 040F A2 09A4 R MOV HOMERU,AL ; 0412 BB 09A2 R MOV BX,OFFSET HOMER 0415 E8 0433 R CALL sendcom ; send SEEK CMD 0418 E8 0352 R CALL SENS ; SENSE SEEK end 041B 3C 00 CMP AL,0 041D 75 07 JNE EXEC040 ; 041F 8B 1E 09AE R MOV BX,LAST_COM ; 0423 E9 0399 R JMP OUTER_RETRY00 ; ; 0426 EXEC040: 0426 EXEC_ERR: 0426  0C FF OR AL,255 ; SET CODE FOR ; PARAMETER ERROR 0428 EXEC_EXIT: 0428 C3 RET 0429 Z_RET: 0429 24 00 AND AL,0 042B C3 RET ; RETURN WITH NO ERROR CODE 042C RETRY_L0: 042C 8B 1E 09AE R MOV BX,LAST_COM ; 0430 E9 039E R JMP RETRY 0433 EXECUTE ENDP 0433 SENDCOM PROC NEAR 0433 E4 50 IN AL,50H ; GET STATUS REG 0435 A8 10 TEST AL,10H ; IF FDC BUSY 0437 75 FA JNZ sendcom ; BUSY 0439 B5 00 MOV CH,0 043B 8A 0F MOV CL,[BX] 043D 8B F3 MOV SI,BX 043F 46 INC SI 0440 sendc010: 0440 E4 50 IN AL,50H ; GET STATUS REG 0442 D0 E0 SHL AL,1 ; IF RQM ON 0444 73 FA JAE sendc010 0446 D0 E0 SHL AL,1 ; & DIO OFF 0448 72 F6 JB sendc010 044A AC LODS BYTE PTR [SI] ; THEN AL = [SI],SI+1 044B E6 52 OUT 52H,AL 044D E2 F1 LOOP sendc010 ; IF CX = 0 044F C3 RET 0450 SENDCOM ENDP ; ; 0450 EXECPOLL PROC NEAR ;--- rmg / necis / 11-29-83  The Microsoft MACRO Assembler , Version 1.25 Page 1-17 MSREAD 01-31-84 ; ; EXECPOLL rewritten to use fd interrupt signal of command completion; ; this is necessary because the fd door lock is now interrupt driven, so ; that TIMEROFF will not disable auto disk logging. ; 0450 F6 06 0536 R 01 test byte ptr fdc_finished,1 ; fdc command finished? 0455 74 F9 jz execpoll ; wait until so 0457 80 26 0536 R 00 and byte ptr fdc_finished,0 045C C3 ret ; ;--- rmg / necis / 11-29-83 ; MOV DI, OFFSET STATUS0 ; DI = STATUS TABLE ADDR ; MOV SI,DI ; SAVE POINTER ;EXECP010: ; IN AL,50H ; GET FDC STATUS REG ; ADD AL,40H ; JAE EXECP010 ; RQM, DIO = OFF / ; IN AL,52H ; GET STATUS ; STOS BYTE PTR [SI] ; SAVE STATUS ; MOV AL,[SI] ; AL = ST0 ; SHL AL,1 ; JAE EXECP020 ; IF NORMAL end ; SHL AL,1 ; JAE EXECP030 ; NORMAL end ;EXECP020: ; LOOP EXECP010 ;EXECP030: ; ret 045D EXECPOLL ENDP ;--- rmg / necis / 11-29-83 ; 045D 2E: A3 0526 R intfd: mov cs:fdintax,ax 0461 2E: 89 1E 0528 R mov cs:fdintbx,bx 0466 2E: 89 0E 052A R mov cs:fdintcx,cx 046B 2E: 89 16 052C R mov cs:fdintdx,dx 0470 2E: 89 36 052E R mov cs:fdintsi,si 0475 2E: 8C 1E 0530 R mov cs:fdintds,ds 047A 2E: 89 26 0532 R mov cs:fdintsp,sp 047F 2E: 8C 16 0534 R mov cs:fdintss,ss 0484 8C C8 mov ax,cs 0486 8E D8 mov ds,ax 0488 8E D0 mov ss,ax 048A BC 0557 R mov sp,offset fdint_stacktop 048D E4 50 in al,50h ; read fdc status register 048F 04 40 add al,40h 0491 73 26 jae nostat_there ; is no status there already, must be seek ; or drive ready state change... go do sense 0493 B9 0007 mov cx,7 ; otherwise, its an op complete interrupt 0496 BB 09B0 R mov bx,offset status0 0499 fd010:  The Microsoft MACRO Assembler , Version 1.25 Page 1-18 MSREAD 01-31-84 0499 E4 50 in al,50h 049B 04 40 add al,40h 049D 73 FA jae fd010 049F E4 52 in al,52h 04A1 88 07 mov [bx],al 04A3 43 inc bx 04A4 A0 09B0 R mov al,status0 04A7 D0 E0 shl al,1 04A9 73 04 jae fd020 04AB D0 E0 shl al,1 04AD 73 02 jae fdc_errret 04AF fd020: 04AF E2 E8 loop fd010 04B1 fdc_errret: 04B1 C6 06 0536 R 01 mov byte ptr fdc_finished,1 04B6 EB 40 90 jmp fdcret 04B9 nostat_there: ; 04B9 wtnbsy: 04B9 E4 50 in al,50h 04BB A8 10 test al,10h 04BD 75 FA jnz wtnbsy 04BF wtstrdy: 04BF E4 50 in al,50h 04C1 D0 E0 shl al,1 04C3 73 FA jae wtstrdy 04C5 D0 E0 shl al,1 04C7 72 F6 jb wtstrdy 04C9 B0 08 mov al,08h ; sense interrupt state 04CB E6 52 out 52h,al ; 04CD wtsense1: 04CD E4 50 in al,50h 04CF 04 40 add al,40h 04D1 73 FA jae wtsense1 04D3 E4 52 in al,52h 04D5 A2 09B0 R mov status0,al 04D8 8A E0 mov ah,al 04DA wtsense2: 04DA E4 50 in al,50h 04DC 04 40 add al,40h 04DE 73 FA jae wtsense2 04E0 E4 52 in al,52h 04E2 A2 09B1 R mov status1,al 04E5 80 E4 E0 and ah,11100000b ; was it cause by ready state change? 04E8 80 FC C0 cmp ah,11000000b 04EB 75 06 jnz nochg 04ED E8 00A9 R call diskcheck 04F0 EB 06 90 jmp fdcret  The Microsoft MACRO Assembler , Version 1.25 Page 1-19 MSREAD 01-31-84 04F3 nochg: 04F3 C6 06 0536 R 01 mov byte ptr fdc_finished,1 ; musta been a seek or recalibrate- 04F8 fdcret: 04F8 B0 20 mov al,20h ; set eoi 04FA E6 20 out 20h,al 04FC E6 28 out 28h,al 04FE 2E: A1 0526 R mov ax,cs:fdintax 0502 2E: 8B 1E 0528 R mov bx,cs:fdintbx 0507 2E: 8B 0E 052A R mov cx,cs:fdintcx 050C 2E: 8B 16 052C R mov dx,cs:fdintdx 0511 2E: 8B 36 052E R mov si,cs:fdintsi 0516 2E: 8E 1E 0530 R mov ds,cs:fdintds 051B 2E: 8B 26 0532 R mov sp,cs:fdintsp 0520 2E: 8E 16 0534 R mov ss,cs:fdintss 0525 CF iret 0526 ???? fdintax dw ? 0528 ???? fdintbx dw ? 052A ???? fdintcx dw ? 052C ???? fdintdx dw ? 052E ???? fdintsi dw ? 0530 ???? fdintds dw ? 0532 ???? fdintsp dw ? 0534 ???? fdintss dw ? 0536 00 fdc_finished db 0 0537 20 [ fdint_stack db 20h dup (?)  ?? ] 0557 fdint_stacktop: ; ;--- rmg / necis / 11-29-83 0557 03 FDC_SPECIFY DB 03H ; CMD PHASE SIZE 0558 03 DB 03H ; SPECIFY CMD ;4/7/83 ********** 1.106 COMPATABLE CODE ************************* ;** SEEK TIME FOR FLOPPY DISK IS 4 MSEC NOT 5 MSEC ***************** ; 0559 CB DB 0CBH ; SRT(4MSEC),HUT(176MSEC) ;******************************************************************** 055A 30 DB 30H ; HLT(50MSEC) 055B 1A fdd1 db 26 ;b[0] sector_per_track 055C 0080 dw 128 ;w[1] bytes_per_track 055E 09 msiocb db 09h ; transfer length 055F 06 db 06h ;b[4] command to 765. (06=rd 05=wr) 0560 00 db 0 ;b[5] Head,Unit 0561 00 db 0 ;b[6] Track 0562 00 db 0 ; Head. 0563 00 db 0 ;b[8] Sector  The Microsoft MACRO Assembler , Version 1.25 Page 1-20 MSREAD 01-31-84 0564 00 db 0 ; N (0 as 128,3 as 1024) 0565 1A db 1ah ; EOT (for 128) 0566 07 db 07h ; GPL (for 128) 0567 80 db 80h ; DTL (for 128) 0568 08 fdd2 db 8 ;b[0] sector_per_track 0569 0400 dw 1024 ;w[1] bytes_per_track 056B 09 msiocb2d db 09h ; transfer length 056C C6 db 0c6h ;b[4] command to 765. (C6=rd C5=wr) 056D 00 db 0 ;b[5] Head,Unit 056E 00 db 0 ;b[6] Track 056F 00 db 0 ;b[7] Head 0570 00 db 0 ;b[8] Sector 0571 03 db 3 ; N (0 as 128,3 as 1024) 0572 08 db 08h ; EOT (for 1024) 0573 35 db 35h ; GPL (for 1024) 0574 FF db 0ffh ; DTL (for 1024) 0575 00 dma_channel db 0 0576 0000 dma_address dw 0 0578 00 driver_num db 0 0579 00 drive_num db 0 057A 00 verify_flag db 0 057B 0000 num_of_sec dw 0 057D 0001 log_sec dw 1 057F 0000 dma_segment dw 0 ;only work in COMMON1 0581 00 wflag db 0 0582 00 over_up_flag db 0 0583 0000 num_old dw 0 0585 0000 over_seg dw 0 0587 0000 over_adr dw 0 ;--------------------------------------------------------03/10/1983---- 0589 00 wp_flag_0 db 0 058A 00 wp_flag_1 db 0 058B 00 wp_flag_2 db 0 058C 00 wp_flag_3 db 0 = 0400 max_sector_size equ 1024 ; max of sector size 058D 0400 [ dma_buffer db max_sector_size dup(0) 00 ] ;---------------------------------------------------------------------- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; text area ; 098D 00 chsave db 0  The Microsoft MACRO Assembler , Version 1.25 Page 1-21 MSREAD 01-31-84 098E 00 chvald db 0 ; 098F 02 DVCCMD DB 02H ; TRANSFER LENGTH 0990 04 DB 04H ; SENCE DEVICE STATUS 0991 00 DVC_US DB 00H ; HD,US ; ;---------------------------------------------------02/23/1983--------- 0992 02 04 00 dvc0 db 02h,04h,00h 0995 02 04 01 dvc1 db 02h,04h,01h 0998 02 04 02 dvc2 db 02h,04h,02h 099B 02 04 03 dvc3 db 02h,04h,03h ; 099E 00 fdd_same0 db 0 099F 00 fdd_same1 db 0 09A0 00 fdd_same2 db 0 09A1 00 fdd_same3 db 0 ;---------------------------------------------------------------------- ; 09A2 02 HOMER DB 02H ; LENGTH 09A3 07 DB 07H ; RECALIBRATE CMD 09A4 00 HOMERU DB 0H ; UNIT = 0 ; 09A5 03 SEEKCMD DB 03H ; LENGTH 09A6 0F DB 0FH ; SEEK CMD 09A7 00 SEEKU DB 0H ; UNIT 09A8 00 SEEKC DB 0H ; CYLINDER # ; 09A9 01 SENSCMD DB 01H ; LENGTH 09AA 08 DB 08H ; SENSE INTERRUPT STATE  ; 09AB 00 RETRY_CNT DB 0 ; RETRY COUNTER 1 09AC 00 RTCNT DB 0 ; RETRY COUNTER 2 (AFTER RECALIBRATE) 09AD 00 RETRY_VRF DB 0 ; RETRY COUNTER 3 (VERIFY ERROR) 09AE 0000 LAST_COM DW 0 ; ADDRESS OF LAST COMMAND ; STRING 09B0 00 STATUS0 DB 0 09B1 00 STATUS1 DB 0 09B2 00 00 00 00 00 00 STATUS2 DB 0,0,0,0,0,0 09B8 0000 DMA_TC DW 00H ;DMA TERMINAL COUNTER 09BA 00 DMA_CH1 DB 0 ;CH1 REG FILE 09BB 0000 dma_snd dw 0 ;actual address to dma = 0019 DMA_WRT EQU 19H ; DMA (MEMORY TO I/O) = 0015 DMA_RAD EQU 15H ; DMA (I/O TO MEMORY) = 0011 DMA_VRY EQU 11H ; DMA (VERIFY) = 0005 fdc_wrt1d equ 05h ;fdc write command (1d) = 0006 fdc_rad1d equ 06h ;fdc read command (1d) = 00C5 fdc_wrt2d equ 0c5h ;fdc write command (2d) = 00C6 fdc_rad2d equ 0c6h ;fdc read command (2d) 09BD 00 DMA_RW DB 0 ;DMA READ/WRITE MODE SET ; ; dsk_init  The Microsoft MACRO Assembler , Version 1.25 Page 1-22 MSREAD 01-31-84 ; ; initialize floppy disk system ; 09BE dsk_init: 09BE C6 06 003E R 00 mov cursing_disk,adisk ; a disk first in 1 drv system 09C3 8A 0E 0034 R mov cl,nunits ; no units to reserve this dev 09C7 2E: C5 1E 0000 E lds bx,cs:[ptrsav] 09CC 88 4F 0D mov [bx.nounits],cl 09CF C7 47 12 0036 R mov [bx.bpbadr],offset dsdd_ptr 09D4 8C 4F 14 mov [bx.bpbseg],cs 09D7 32 C0 xor al,al 09D9 E9 0000 E jmp exit ; ; ; mediac ; ; perform media check operation ; 09DC mediac: 09DC 80 3E 0035 R 00 cmp nphy0,0 09E1 75 03 jnz check 09E3 E8 0B2A R call sing_chg 09E6 check: 09E6 3A 06 0035 R cmp al,nphy0 09EA 7E 03 jle known1 09EC E9 0B7D R jmp unknown_unit 09EF known1: 09EF 32 E4 xor ah,ah 09F1 9A 0049 ---- R call dskchg 09F6 73 03 jnc med_rdy ; is the drive ready? 09F8 E9 0000 E jmp err_exit 09FB med_rdy: 09FB 2E: C5 1E 0000 E lds bx,cs:[ptrsav] 0A00 88 67 0E mov [bx.med_sts],ah ; 0A03 B4 FF mov ah,0ffh ; assume media code = sssd 0A05 A8 01 test al,1 ; test assumption against dskchg return 0A07 74 02 jz sdy ; if bit 0 = 0 then it's sssd 0A09 FE CC dec ah ; else it's really dsdd 0A0B sdy: ; 0A0B 88 67 0D mov [bx.med_des],ah 0A0E B0 00 mov al,0 ; no error 0A10 E9 0000 E jmp exit ; ; ; get_bpb ; ; return pointer to bios parameter block ; 0A13 get_bpb: 0A13 80 3E 0035 R 00 cmp nphy0,0 0A18 75 03 jnz build  The Microsoft MACRO Assembler , Version 1.25 Page 1-23 MSREAD 01-31-84 0A1A E8 0B2A R call sing_chg 0A1D build: 0A1D 3A 06 0035 R cmp al,nphy0  0A21 7E 03 jle known2 0A23 E9 0B7D R jmp unknown_unit 0A26 known2: 0A26 9A 0049 ---- R call dskchg 0A2B 73 03 jnc bp_rdy 0A2D E9 0000 E jmp err_exit 0A30 bp_rdy: 0A30 B4 FF mov ah,0ffh 0A32 B9 0025 R mov cx,offset sssd.secsiz 0A35 A8 01 test al,1 0A37 74 05 jz sdy2 0A39 FE CC dec ah 0A3B B9 000B R mov cx,offset dsdd.secsiz 0A3E sdy2: 0A3E 2E: C5 1E 0000 E lds bx,cs:[ptrsav] ; 0A43 88 67 0D mov [bx.bpb_med],ah 0A46 89 4F 12 mov [bx.bpb_adr],cx 0A49 8C 4F 14 mov [bx.bpb_seg],cs 0A4C B0 00 mov al,0 0A4E E9 0000 E jmp exit ; ; dsk_red ; ; read multiple sectors ; 0A51 dsk_red: 0A51 80 3E 0035 R 00 cmp nphy0,0 0A56 75 03 jnz dread 0A58 E8 0B2A R call sing_chg 0A5B dread: 0A5B 3A 06 0035 R cmp al,nphy0 0A5F 7E 03 jle known3 0A61 E9 0B7D R  jmp unknown_unit 0A64 known3: 0A64 51 push cx 0A65 80 FC FF cmp ah,0ffh ; sssd? 0A68 75 09 jnz ddy 0A6A 3C 00 cmp al,0 ; unit 0? 0A6C 74 09 jz gord 0A6E B0 02 mov al,2 ; unit 1 sssd is driver number 2 0A70 EB 05 90 jmp gord 0A73 D0 E0 ddy: sal al,1 ; drive (0,1) => driver (1,3) 0A75 FE C0 inc al 0A77 gord: 0A77 8C C3 mov bx,es 0A79 8E DB mov ds,bx 0A7B 8B DF mov bx,di ; offset (transfer address) to bx for MSREAD 0A7D 83 F9 00 cmp cx,0 ; zero sector transfer? 0A80 74 05 jz red_noxfer  The Microsoft MACRO Assembler , Version 1.25 Page 1-24 MSREAD 01-31-84 0A82 9A 0121 ---- R call msread 0A87 red_noxfer: 0A87 B4 00 dskcom: mov ah,0 0A89 73 02 jnc nerr 0A8B B4 0A mov ah,0ah ; error code for write 0A8D 8B D1 nerr: mov dx,cx 0A8F 59 pop cx ; restore total request size 0A90 2B CA sub cx,dx ; cx := total size - number remaining 0A92 2E: C5 1E 0000 E lds bx,cs:[ptrsav] 0A97 89 4F 12 mov [bx.count],cx ; fill in total number xfered 0A9A 0A E4 or ah,ah ; ah := 0? 0A9C 74 0D jz exit1 0A9E 80 7F 02 08 cmp [bx.cmd],8 ; was this a write? 0AA2 7D 02 jnl go_error 0AA4 FE C4 inc ah ; change write fault to read fault 0AA6 go_error: 0AA6 8A C4 mov al,ah 0AA8 E9 0000 E jmp err_exit 0AAB E9 0000 E exit1: jmp exit ; ; ; dsk_wrx ; ; write [with verify] multiple sectors ; 0AAE dsk_wrv: 0AAE B7 01 mov bh,1 ; set verify flag 0AB0 EB 03 90 jmp wr1 0AB3 dsk_wrt: 0AB3 32 FF xor bh,bh ; reset verify flag 0AB5 wr1: 0AB5 80 3E 0035 R 00 cmp nphy0,0 0ABA 75 03 jnz dwrite 0ABC E8 0B2A R call sing_chg 0ABF dwrite: 0ABF 3A 06 0035 R cmp al,nphy0 0AC3 7E 03 jle known4 0AC5 E9 0B7D R jmp unknown_unit 0AC8 known4: 0AC8 51 push cx ; 0AC9 80 FC FF cmp ah,0ffh 0ACC 75 09 jnz ddy2 0ACE 3C 00 cmp al,0 0AD0 74 09 jz gowr 0AD2 B0 02 mov al,2 0AD4 EB 05 90 jmp gowr 0AD7 D0 E0 ddy2: sal al,1 0AD9 FE C0 inc al 0ADB gowr: 0ADB 8A E7 mov ah,bh ; ah := verify flag for mswrite call 0ADD 8C C3 mov bx,es  The Microsoft MACRO Assembler , Version 1.25 Page 1-25 MSREAD 01-31-84 0ADF 8E DB mov ds,bx 0AE1 8B DF mov bx,di ; set transefer address for MSWRITE 0AE3 83 F9 00 cmp cx,0 ; transfer 0 sectors? 0AE6 74 05 jz wrt_noxfer 0AE8 9A 0124 ---- R call mswrite 0AED wrt_noxfer: 0AED EB 98 jmp dskcom ; ; ; ; sing_chg ; ; input: call with requested disk in al (0=a, 1=b) ; Checks for disk request matching currently mounted disk; ; if it doesn't, then a request is made to mount the proper ; disk and press any key... ; 0AEF 0D 0A 49 6E 73 65 mount_msg: db 0dh,0ah,'Insert disk for drive ',0 72 74 20 64 69 73 6B 20 66 6F 72 20 64 72 69 76 65 20 00 0B08 20 61 6E 64 20 73 mount_ms2: db ' and strike any key when ready',0dh,0ah,0ah,0 74 72 69 6B 65 20 61 6E 79 20 6B 65 79 20 77 68 65 6E 20 72 65 61 64 79 0D 0A 0A 00 ; 0B2A sing_chg: 0B2A 53 push bx 0B2B 51 push cx 0B2C 52 push dx 0B2D 56 push si 0B2E 57 push di 0B2F 50 push ax 0B30 3C 01 cmp al,1 0B32 7F 42 jg notab 0B34 3A 06 003E R cmp al,cursing_disk 0B38 74 36 jz sing_ok 0B3A BB 0AEF R mov bx,offset mount_msg 0B3D E8 0000 E call pmsg 0B40 04 41 add al,41h 0B42 9A 0000 ---- E call msconout  0B47 B0 3A mov al,':' 0B49 9A 0000 ---- E call msconout 0B4E BB 0B08 R mov bx,offset mount_ms2 0B51 E8 0000 E call pmsg 0B54 E8 0000 E call flush 0B57 9A 0000 ---- E waitky: call msconst 0B5C 74 F9 jz waitky 0B5E 3C 03 cmp al,03h ; is char control-c?  The Microsoft MACRO Assembler , Version 1.25 Page 1-26 MSREAD 01-31-84 0B60 74 05 jz skiprd ; if so, leave it in buffer 0B62 9A 0000 ---- E call msconin 0B67 skiprd: 0B67 F6 16 003E R not cursing_disk 0B6B 80 26 003E R 01 and cursing_disk,1 0B70 sing_ok: 0B70 58 pop ax 0B71 32 C0 xor al,al 0B73 EB 02 90 jmp sing_rest 0B76 notab: 0B76 58 pop ax 0B77 sing_rest: 0B77 5F pop di 0B78 5E pop si 0B79 5A pop dx 0B7A 59 pop cx 0B7B 5B pop bx 0B7C C3 ret ; ; ; unknown unit error exit, called when io is attempted to a ; non-existent physical unit ; 0B7D unknown_unit: 0B7D B0 01 mov al,1 ; unknown unit error code 0B7F E9 0000 E jmp err_exit ; 0B82 hd_ind_on: ; ; turn on/off hard disk activity indicator ; 0B82 C6 06 0BAF R 1C 90 mov hdsymb,1ch 0B88 EB 07 90 jmp hd_ind_onoff 0B8B hd_ind_off: 0B8B C6 06 0BAF R 20 90 mov hdsymb,20h 0B91 hd_ind_onoff: 0B91 50 push ax 0B92 53 push bx 0B93 51 push cx 0B94 52 push dx 0B95 56 push si 0B96 FF 36 0000 E push crtdsp ; save cursor on/off state 0B9A E8 0000 E call cursoroff ; turn cursor off 0B9D E8 0000 E call kbcsad ; get cursor address 0BA0 50 push ax ; and save it 0BA1 B8 0037 mov ax,37h ; location of hard disk symbol 0BA4 E8 0000 E call kbcsro ; set cursor position 0BA7 E8 0000 E call kbmout  The Microsoft MACRO Assembler , Version 1.25 Page 1-27 MSREAD 01-31-84 0BAA 03 db 03 0BAB 4220 dw 4220h 0BAD 4000 dw 4000h 0BAF ?? hdsymb db ? 0BB0 40 db 40h 0BB1 58 pop ax 0BB2 E8 0000 E call kbcsro 0BB5 8F 06 0000 E pop crtdsp 0BB9 E8 0000 E call kbcsrd 0BBC 5E pop si 0BBD 5A pop dx 0BBE 59 pop cx 0BBF 5B pop bx 0BC0 58 pop ax 0BC1 C3 ret 0BC2 CODE ENDS END  The Microsoft MACRO Assembler , Version 1.25 Page Symbols-1 MSREAD 01-31-84 Structures and records: N a m e Width # fields Shift Width Mask Initial BPBB . . . . . . . . . . . . . . 0016 0006 BPB_MED. . . . . . . . . . . . . 000D SCRT . . . . . . . . . . . . . . 000E BPB_ADR. . . . . . . . . . . . . 0012 BPB_SEG. . . . . . . . . . . . . 0014 DPB. . . . . . . . . . . . . . . 001A 000B BJMP . . . . . . . . . . . . . . 0000 SYSID. . . . . . . . . . . . . . 0003 SECSIZ . . . . . . . . . . . . . 000B ALLOC. . . . . . . . . . . . . . 000D RESSEC . . . . . . . . . . . . . 000E FATS . . . . . . . . . . . . . . 0010 MAXDIR . . . . . . . . . . . . . 0011 SECTORS. . . . . . . . . . . . . 0013 MEDIAID. . . . . . . . . . . . . 0015 FATSEC . . . . . . . . . . . . . 0016 SECPER . . . . . . . . . . . . . 0018 INITS. . . . . . . . . . . . . . 0016 0006 NOUNITS. . . . . . . . . . . . . 000D BPBADR . . . . . . . . . . . . . 0012 BPBSEG . . . . . . . . . . . . . 0014 IODAT. . . . . . . . . . . . . . 0016 0009 CMDLEN . . . . . . . . . . . . . 0000 UNIT . . . . . . . . . . . . . . 0001 CMD. . . . . . . . . . . . . . . 0002 STATUS . . . . . . . . . . . . . 0003 MEDIA. . . . . . . . . . . . . . 000D TRANS. . . . . . . . . . . . . . 000E COUNT. . . . . . . . . . . . . . 0012 START. . . . . . . . . . . . . . 0014 MEDIAS . . . . . . . . . . . . . 000F 0003 MED_DES. . . . . . . . . . . . . 000D MED_STS. . . . . . . . . . . . . 000E Segments and groups: N a m e Size align combine class CODE . . . . . . . . . . . . . . 0BC2 PARA PUBLIC 'CODE' Symbols: N a m e Type Value Attr ADISK. . . . . . . . . . . . . . Number 0000 BDISK. . . . . . . . . . . . . . Number 0001 BIOSINT. . . . . . . . . . . . . Number 00DC BP_RDY . . . . . . . . . . . . . L NEAR 0A30 CODE BUILD. . . . . . . . . . . . . . L NEAR 0A1D CODE  The Microsoft MACRO Assembler , Version 1.25 Page Symbols-2 MSREAD 01-31-84 CASE_OF_1. . . . . . . . . . . . L NEAR 022D CODE CHECK. . . . . . . . . . . . . . L NEAR 09E6 CODE CHECK_FDD1 . . . . . . . . . . . L NEAR 00C8 CODE CHECK_FDD2 . . . . . . . . . . . L NEAR 00E1 CODE CHECK_FDD3 . . . . . . . . . . . L NEAR 00FA CODE CHECK_RET. . . . . . . . . . . . L NEAR 0113 CODE CHSAVE . . . . . . . . . . . . . L BYTE 098D CODE CHVALD . . . . . . . . . . . . . L BYTE 098E CODE COMMON_1_2D. . . . . . . . . . . L NEAR 0231 CODE CRTDSP . . . . . . . . . . . . . V WORD 0000 CODE External CURSING_DISK . . . . . . . . . . L BYTE 003E CODE CURSOROFF. . . . . . . . . . . . L NEAR 0000 CODE External DDY. . . . . . . . . . . . . . . L NEAR 0A73 CODE DDY2 . . . . . . . . . . . . . . L NEAR 0AD7 CODE DISKCHECK. . . . . . . . . . . . N PROC 00A9 CODE Length =006B DLYLOOP. . . . . . . . . . . . . L NEAR 003F CODE DMA_ADDRESS. . . . . . . . . . . L WORD 0576 CODE DMA_BUFFER . . . . . . . . . . . L BYTE 058D CODE Length =0400 DMA_CH1. . . . . . . . . . . . . L BYTE 09BA CODE DMA_CHANNEL. . . . . . . . . . . L BYTE 0575 CODE DMA_RAD. . . . . . . . . . . . . Number 0015 DMA_RW . . . . . . . . . . . . . L BYTE 09BD CODE DMA_SEGMENT. . . . . . . . . . . L WORD 057F CODE Global DMA_SND. . . . . . . . . . . . . L WORD 09BB CODE DMA_TC . . . . . . . . . . . . . L WORD 09B8 CODE DMA_VRY. . . . . . . . . . . . . Number 0011 DMA_WRT. . . . . . . . . . . . . Number 0019 DREAD. . . . . . . . . . . . . . L NEAR 0A5B CODE DRIVER_NUM . . . . . . . . . . . L BYTE 0578 CODE Global DRIVE_NUM. . . . . . . . . . . . L BYTE 0579 CODE DRIVTBL. . . . . . . . . . . . . L NEAR 0034 CODE Global DSDD . . . . . . . . . . . . . . L 001A 0000 CODE DSDD_PTR . . . . . . . . . . . . L WORD 0036 CODE DSKCHG . . . . . . . . . . . . . F PROC 0049 CODE Global Length =0060 DSKCHG_RET . . . . . . . . . . . L NEAR 00A1 CODE DSKCH_ERR. . . . . . . . . . . . L NEAR 00A2 CODE DSKCOM . . . . . . . . . . . . . L NEAR 0A87 CODE DSK_INIT . . . . . . . . . . . . L NEAR 09BE CODE Global DSK_RED. . . . . . . . . . . . . L NEAR 0A51 CODE Global DSK_WRT. . . . . . . . . . . . . L NEAR 0AB3 CODE Global DSK_WRV. . . . . . . . . . . . . L NEAR 0AAE CODE Global DVC0 . . . . . . . . . . . . . . L BYTE 0992 CODE DVC1 . . . . . . . . . . . . . . L BYTE 0995 CODE DVC2 . . . . . . . . . . . . . . L BYTE 0998 CODE DVC3 . . . . . . . . . . . . . . L BYTE 099B CODE DVCCMD . . . . . . . . . . . . . L BYTE 098F CODE DVC_US . . . . . . . . . . . . . L BYTE 0991 CODE DWRITE . . . . . . . . . . . . . L NEAR 0ABF CODE ERR_EXIT . . . . . . . . . . . . L NEAR 0000 CODE External EXEC030. . . . . . . . . . . . . L NEAR 03F0 CODE EXEC040. . . . . . . . . . . . . L NEAR 0426 CODE EXECPOLL . . . . . . . . . . . . N PROC 0450 CODE Length =000D EXECUTE. . . . . . . . . . . . . N PROC 0384 CODE Length =00AF  The Microsoft MACRO Assembler , Version 1.25 Page Symbols-3 MSREAD 01-31-84 EXECUTE_00 . . . . . . . . . . . L NEAR 0390 CODE EXEC_ERR . . . . . . . . . . . . L NEAR 0426 CODE EXEC_EXIT. . . . . . . . . . . . L NEAR 0428 CODE EXIT . . . . . . . . . . . . . . L NEAR 0000 CODE External EXIT1. . . . . . . . . . . . . . L NEAR 0AAB CODE FD010. . . . . . . . . . . . . . L NEAR 0499 CODE FD020. . . . . . . . . . . . . . L NEAR 04AF CODE FDCRET . . . . . . . . . . . . . L NEAR 04F8 CODE FDC_ERRRET . . . . . . . . . . . L NEAR 04B1 CODE FDC_FINISHED . . . . . . . . . . L BYTE 0536 CODE Global FDC_RAD1D. . . . . . . . . . . . Number 0006 FDC_RAD2D. . . . . . . . . . . . Number 00C6 FDC_SPECIFY. . . . . . . . . . . L BYTE 0557 CODE Global FDC_WRT1D. . . . . . . . . . . . Number 0005 FDC_WRT2D. . . . . . . . . . . . Number 00C5 FDD1 . . . . . . . . . . . . . . L BYTE 055B CODE FDD2 . . . . . . . . . . . . . . L BYTE 0568 CODE FDD_SAME0. . . . . . . . . . . . L BYTE 099E CODE FDD_SAME1. . . . . . . . . . . . L BYTE 099F CODE FDD_SAME2. . . . . . . . . . . . L BYTE 09A0 CODE FDD_SAME3. . . . . . . . . . . . L BYTE 09A1 CODE FDINTAX. . . . . . . . . . . . . L WORD 0526 CODE FDINTBX. . . . . . . . . . . . . L WORD 0528 CODE FDINTCX. . . . . . . . . . . . . L WORD 052A CODE FDINTDS. . . . . . . . . . . . . L WORD 0530 CODE FDINTDX. . . . . . . . . . . . . L WORD 052C CODE FDINTSI. . . . . . . . . . . . . L WORD 052E CODE FDINTSP. . . . . . . . . . . . . L WORD 0532 CODE FDINTSS. . . . . . . . . . . . . L WORD 0534 CODE FDINT_STACK. . . . . . . . . . . L BYTE 0537 CODE Length =0020 FDINT_STACKTOP . . . . . . . . . L NEAR 0557 CODE FLUSH. . . . . . . . . . . . . . L NEAR 0000 CODE External GDCBUSYF . . . . . . . . . . . . V BYTE 0000 CODE External GET_BPB. . . . . . . . . . . . . L NEAR 0A13 CODE Global GET_ST_SUB . . . . . . . . . . . N PROC 0114 CODE Length =000D GORD . . . . . . . . . . . . . . L NEAR 0A77 CODE Global GOWR . . . . . . . . . . . . . . L NEAR 0ADB CODE Global GO_ERROR . . . . . . . . . . . . L NEAR 0AA6 CODE HDSYMB . . . . . . . . . . . . . L BYTE 0BAF CODE HD_BASE_UNIT . . . . . . . . . . Number 0004 HD_IND_OFF . . . . . . . . . . . L NEAR 0B8B CODE Global HD_IND_ON. . . . . . . . . . . . L NEAR 0B82 CODE Global HD_IND_ONOFF . . . . . . . . . . L NEAR 0B91 CODE HD_TRANSFER. . . . . . . . . . . L NEAR 0000 CODE External HOMER. . . . . . . . . . . . . . L BYTE 09A2 CODE HOMERU . . . . . . . . . . . . . L BYTE 09A4 CODE INNER. . . . . . . . . . . . . . L NEAR 0043 CODE INTFD. . . . . . . . . . . . . . L NEAR 045D CODE Global IS_READY . . . . . . . . . . . . L NEAR 007D CODE IS_READY2. . . . . . . . . . . . L NEAR 01BC CODE JUST_SEGMENT . . . . . . . . . . L NEAR 0298 CODE KBCSAD . . . . . . . . . . . . . L NEAR 0000 CODE External KBCSRD . . . . . . . . . . . . . L NEAR 0000 CODE External  The Microsoft MACRO Assembler , Version 1.25 Page Symbols-4 MSREAD 01-31-84 KBCSRO . . . . . . . . . . . . . L NEAR 0000 CODE External KBMOUT . . . . . . . . . . . . . L NEAR 0000 CODE External KNOWN1 . . . . . . . . . . . . . L NEAR 09EF CODE KNOWN2 . . . . . . . . . . . . . L NEAR 0A26 CODE KNOWN3 . . . . . . . . . . . . . L NEAR 0A64 CODE KNOWN4 . . . . . . . . . . . . . L NEAR 0AC8 CODE LAST_COM . . . . . . . . . . . . L WORD 09AE CODE LOG_SEC. . . . . . . . . . . . . L WORD 057D CODE MAX_SECTOR_SIZE. . . . . . . . . Number 0400 MEDIAC . . . . . . . . . . . . . L NEAR 09DC CODE Global MED_RDY. . . . . . . . . . . . . L NEAR 09FB CODE MORE_TRACK . . . . . . . . . . . L NEAR 01CD CODE MOUNT_MS2. . . . . . . . . . . . L NEAR 0B08 CODE MOUNT_MSG. . . . . . . . . . . . L NEAR 0AEF CODE MSCONIN. . . . . . . . . . . . . L FAR 0000 CODE External MSCONOUT . . . . . . . . . . . . L FAR 0000 CODE External MSCONST. . . . . . . . . . . . . L FAR 0000 CODE External MSIOCB . . . . . . . . . . . . . L BYTE 055E CODE MSIOCB2D . . . . . . . . . . . . L BYTE 056B CODE MSREAD . . . . . . . . . . . . . F PROC 0121 CODE Global Length =0231 MSREAD_WRITE . . . . . . . . . . L NEAR 0125 CODE MSWRITE. . . . . . . . . . . . . L FAR 0124 CODE Global MS_ERR_RET . . . . . . . . . . . L NEAR 0344 CODE MS_RW_RET. . . . . . . . . . . . L NEAR 0341 CODE NERR . . . . . . . . . . . . . . L NEAR 0A8D CODE NOCHG. . . . . . . . . . . . . . L NEAR 04F3 CODE NOSTAT_THERE . . . . . . . . . . L NEAR 04B9 CODE NOTAB. . . . . . . . . . . . . . L NEAR 0B76 CODE NO_MORE_TRACK. . . . . . . . . . L NEAR 0340 CODE NPHY . . . . . . . . . . . . . . Number 0002 NPHY0. . . . . . . . . . . . . . L BYTE 0035 CODE NUM_OF_SEC . . . . . . . . . . . L WORD 057B CODE Global NUM_OLD. . . . . . . . . . . . . L WORD 0583 CODE NUNITS . . . . . . . . . . . . . L BYTE 0034 CODE OK_SEG_CHECK . . . . . . . . . . L NEAR 029C CODE OUTER_RETRY. . . . . . . . . . . L NEAR 0394 CODE OUTER_RETRY00. . . . . . . . . . L NEAR 0399 CODE OVER_ADR . . . . . . . . . . . . L WORD 0587 CODE OVER_SEG . . . . . . . . . . . . L WORD 0585 CODE OVER_SEG_CHECK . . . . . . . . . L NEAR 024A CODE OVER_UP_FLAG . . . . . . . . . . L BYTE 0582 CODE PMSG . . . . . . . . . . . . . . L NEAR 0000 CODE External PTRSAV . . . . . . . . . . . . . V DWORD 0000 CODE External RDYDLY . . . . . . . . . . . . . L NEAR 003F CODE RED_NOXFER . . . . . . . . . . . L NEAR 0A87 CODE REGPRNT. . . . . . . . . . . . . L FAR 0000 CODE External RETRY. . . . . . . . . . . . . . L NEAR 039E CODE RETRY_CNT. . . . . . . . . . . . L BYTE 09AB CODE RETRY_L0 . . . . . . . . . . . . L NEAR 042C CODE RETRY_VRF. . . . . . . . . . . . L BYTE 09AD CODE RTCNT. . . . . . . . . . . . . . L BYTE 09AC CODE SDY. . . . . . . . . . . . . . . L NEAR 0A0B CODE SDY2 . . . . . . . . . . . . . . L NEAR 0A3E CODE  The Microsoft MACRO Assembler , Version 1.25 Page Symbols-5 MSREAD 01-31-84 SEEKC. . . . . . . . . . . . . . L BYTE 09A8 CODE SEEKCMD. . . . . . . . . . . . . L BYTE 09A5 CODE SEEKU. . . . . . . . . . . . . . L BYTE 09A7 CODE SENDC010 . . . . . . . . . . . . L NEAR 0440 CODE SENDCOM. . . . . . . . . . . . . N PROC 0433 CODE Global Length =001D SEND_DMA . . . . . . . . . . . . L NEAR 03AE CODE SENS . . . . . . . . . . . . . . N PROC 0352 CODE Length =0032 SENS010. . . . . . . . . . . . . L NEAR 0376 CODE SENS020. . . . . . . . . . . . . L NEAR 0380 CODE SENSCMD. . . . . . . . . . . . . L BYTE 09A9 CODE SENS_NOT_READY . . . . . . . . . L NEAR 0383 CODE SET_RW_COMMAND . . . . . . . . . L NEAR 02B2 CODE SIDE_CL. . . . . . . . . . . . . L NEAR 0212 CODE SING_CHG . . . . . . . . . . . . L NEAR 0B2A CODE SING_OK. . . . . . . . . . . . . L NEAR 0B70 CODE SING_REST. . . . . . . . . . . . L NEAR 0B77 CODE SKIPRD . . . . . . . . . . . . . L NEAR 0B67 CODE SKIP_BX_FDD1 . . . . . . . . . . L NEAR 018D CODE SKIP_FD_2D . . . . . . . . . . . L NEAR 0085 CODE SKIP_HARD. . . . . . . . . . . . L NEAR 015D CODE SKIP_NEXT_TR . . . . . . . . . . L NEAR 01F0 CODE SKIP_OVER_FLOW . . . . . . . . . L NEAR 0175 CODE SKIP_OVER_R. . . . . . . . . . . L NEAR 02FD CODE SKIP_OVER_W. . . . . . . . . . . L NEAR 02D1 CODE SKIP_SAME. . . . . . . . . . . . L NEAR 009D CODE SKIP_VERIFY. . . . . . . . . . . L NEAR 0336 CODE SKIP_WFLAG_ON. . . . . . . . . . L NEAR 0149 CODE SKIP_WP_CHECK. . . . . . . . . . L NEAR 01CD CODE SKIP_WRITE_CASE. . . . . . . . . L NEAR 0245 CODE SSSD . . . . . . . . . . . . . . L 001A 001A CODE STATUS0. . . . . . . . . . . . . L BYTE 09B0 CODE Global STATUS1. . . . . . . . . . . . . L BYTE 09B1 CODE STATUS2. . . . . . . . . . . . . L BYTE 09B2 CODE UNKNOWN_UNIT . . . . . . . . . . L NEAR 0B7D CODE VERIFY_FLAG. . . . . . . . . . . L BYTE 057A CODE WAITKY . . . . . . . . . . . . . L NEAR 0B57 CODE WFLAG. . . . . . . . . . . . . . L BYTE 0581 CODE Global WP_FLAG_0. . . . . . . . . . . . L BYTE 0589 CODE WP_FLAG_1. . . . . . . . . . . . L BYTE 058A CODE WP_FLAG_2. . . . . . . . . . . . L BYTE 058B CODE WP_FLAG_3. . . . . . . . . . . . L BYTE 058C CODE WR1. . . . . . . . . . . . . . . L NEAR 0AB5 CODE WRT_NOXFER . . . . . . . . . . . L NEAR 0AED CODE WTNBSY . . . . . . . . . . . . . L NEAR 04B9 CODE WTSENSE1 . . . . . . . . . . . . L NEAR 04CD CODE WTSENSE2 . . . . . . . . . . . . L NEAR 04DA CODE WTSTRDY. . . . . . . . . . . . . L NEAR 04BF CODE Z_RET. . . . . . . . . . . . . . L NEAR 0429 CODE Warning Severe Errors Errors 0 0 L BYTE 09A9 CODE SENS_NOT_READY . . . . . . . . . L NEAR 0383 CODE SE  The Microsoft MACRO Assembler , Version 1.25 Page 1-1 MSTIME 01-31-84 title MSTIME page 58,132 ;----------------------------------------------------------------------------- ; ; MS-DOS BIOS for the N.E.C. Advanced Personal Computer ; ; module name: MSTIME ; MS-DOS version: 2.0 ; module version: 1.0 ; ; abstract: This module contains the clock/calendar drivers used ; by the DOS. ; ; contains routines: ; set_date set_time get_date read_date_time comv_set see_table ; sam_table check_large byn_to_bcd bcd_to_byn tim_red tim_wrt ; ; revision history: ; ; The module originated as a NEC/Tokyo version for use with MS-DOS ; version 1.25. It was converted for use with MS-DOS V2.0 by NECIS in ; April, 1983, by the addition of the tim_red and tim_wrt routines.  ; - RMG 6/7/83 ; ; The unnecessary register saves which are not required in MS-DOS ; V2.0 have been removed. ; - RMG 6-9-83 ; ;----------------------------------------------------------------------------- 0000 CODE SEGMENT PUBLIC 'CODE' EXTRN exit:near PUBLIC tim_red,tim_wrt PUBLIC SET_DATE PUBLIC SET_TIME PUBLIC GET_DATE ASSUME CS:CODE,DS:CODE,SS:CODE,ES:CODE 0000 0A const_10 db 10 0001 016E year_table dw 366 ;1980 0003 016D 016D 016D 016E dw 365,365,365,366 ;1981-1984 000B 016D 016D 016D 016E dw 365,365,365,366 ;1985-1988 0013 016D 016D 016D 016E dw 365,365,365,366 ;1989_1992 001B 016D 016D 016D 016E dw 365,365,365,366 ;1993-1996 0023 016D 016D 016D 016D dw 365,365,365,365 ;1997-2000 002B 016D 016D 016D 016E dw 365,365,365,366 ;2001-2004 0033 001F  month_table dw 31 0035 001D 001F 001E 001F month2 dw 29,31,30,31,30,31 ;jun-sep 001E 001F 0041 001F 001E 001F 001E dw 31,30,31,30,31,30,31 ;aug-dec 001F 001E 001F  The Microsoft MACRO Assembler , Version 1.25 Page 1-2 MSTIME 01-31-84 004F 01 year_byn db 1 0050 08 month_byn db 8 0051 12 date_byn db 18 0052 51 year_buf db 81 0053 0B month_buf db 11 0054 01 date_buf db 01 0055 01 hour_buf db 01 0056 00 minute_buf db 00 0057 00 second_buf db 00 0058 00 centi_buf db 00 0059 SET_DATE PROC FAR ; ; MSDOS far call routine. ; ; in:ax=total days since jun. 1,1980. ; ex:non 0059 50 push ax ;save to see date of week. ;read time 005A E8 00F3 R call read_date_time ;set date 005D E8 0106 R call comv_set ;ax=date,dl=month,dh=year. ;*** date *** 0060 E8 0181 R call byn_to_bcd ;transfer ax(byn) to ax(bcd). 0063 A2 0054 R mov date_buf,al ;. ;*** date of week *** 0066 58 pop ax ;restore to see date of week. 0067 05 0002 add ax,2 ;set default (jun.1,1980). 006A BB 0380 mov bx,7*128 ;limit on ax. 006D set_date_lp1: 006D 2B C3 sub ax,bx ;substract it until over. 006F 73 FC jnc set_date_lp1 ;. 0071 03 C3 add ax,bx 0073 B1 07 mov cl,7 ;division by 7. 0075 F6 F1 div cl 0077 FE C4 inc ah ;start at 1 ;*** month *** 0079 8A C2 mov al,dl ;ah=date of week,al=month. 007B B1 04 mov cl,4 007D D2 E0 shl al,cl ;a7-a4:month. 007F 0A C4 or al,ah ;a3-a1:date of week 0081 A2 0053 R mov month_buf,al ;*** year *** 0084 8A C6 mov al,dh ;year 0086 04 50 add al,80 ;base is 1980 0088 E8 0181 R call byn_to_bcd 008B A2 0052 R mov year_buf,al 008E set_dt_common:  The Microsoft MACRO Assembler , Version 1.25 Page 1-3 MSTIME 01-31-84 ;set it. 008E E8 0101 R call write_date_time 0091 set_date_ret: 0091 CB ret 0092 SET_DATE ENDP 0092 SET_TIME PROC FAR 0092 51 push cx ;read time & date. 0093 E8 00F3 R call read_date_time ;*** hours *** 0096 59 pop cx 0097 8A C5 mov al,ch 0099 E8 0181 R call byn_to_bcd 009C A2 0055 R mov hour_buf,al ;*** minutes *** 009F 8A C1 mov al,cl 00A1 E8 0181 R call byn_to_bcd 00A4 A2 0056 R mov minute_buf,al ;*** seconds *** 00A7 8A C6 mov al,dh 00A9 E8 0181 R call byn_to_bcd 00AC A2 0057 R mov second_buf,al ;*** set all and return *** 00AF EB DD  jmp set_dt_common 00B1 SET_TIME ENDP 00B1 GET_DATE PROC FAR ;*** read time & date in buffer *** 00B1 E8 00F3 R call read_date_time ;*** year *** 00B4 A0 0052 R mov al,year_buf 00B7 E8 0190 R call bcd_to_byn 00BA 2C 50 sub al,80 00BC A2 004F R mov year_byn,al ;*** month *** 00BF A0 0053 R mov al,month_buf 00C2 B1 04 mov cl,4 00C4 D2 E8 shr al,cl 00C6 A2 0050 R mov month_byn,al ;*** date *** 00C9 A0 0054 R mov al,date_buf 00CC E8 0190 R call bcd_to_byn 00CF A2 0051 R mov date_byn,al ;*** calcurate of total days *** 00D2 E8 0135 R call comv_get 00D5 50 push ax ;*** hour *** 00D6 A0 0055 R mov al,hour_buf 00D9 E8 0190 R call bcd_to_byn 00DC 8A E8 mov ch,al ;*** minute *** 00DE A0 0056 R mov al,minute_buf  The Microsoft MACRO Assembler , Version 1.25 Page 1-4 MSTIME 01-31-84 00E1 E8 0190 R call bcd_to_byn 00E4 8A C8 mov cl,al ;*** second *** 00E6 BA 0000 mov dx,0 00E9 A0 0057 R mov al,second_buf 00EC E8 0190 R call bcd_to_byn 00EF 8A F0 mov dh,al 00F1 58 pop ax 00F2 CB ret 00F3 GET_DATE ENDP 00F3 READ_DATE_TIME PROC NEAR 00F3 51 push cx 00F4 B1 00 mov cl,0 00F6 rw_date_time_common: 00F6 52 push dx 00F7 BA 0052 R mov dx,offset year_buf 00FA FA cli 00FB CD DC int 0dch 00FD FB sti 00FE 5A pop dx 00FF 59 pop cx 0100 C3 ret 0101 WRITE_DATE_TIME LABEL NEAR 0101 51 push cx 0102 B1 01 mov cl,1 0104 EB F0 jmp rw_date_time_common 0106 READ_DATE_TIME ENDP 0106 COMV_SET PROC NEAR  ;in: ax=total date from jun. 1st,1980 ;ex: dh=year, dl=month, ax=date ; ;------------------------------------------------------02/28/1983------ ;---------------------------------------------------------------------- 0106 56 push si 0107 BB 0001 R mov bx,offset year_table ;BP on year_table. 010A E8 0127 R call see_table ;si=year ax=remain. BX=255(+1). 010D 8B D6 mov dx,si ;mov dh,si 010F 8A F2 mov dh,dl ;. 0111 E8 016E R call check_large ;[month2] <-- 28 or 29 by BX. 0114 BB 0033 R mov bx,offset month_table ;BP on month_table. 0117 E8 0127 R call see_table ;si=month. ax=remain. 011A 8B DE mov bx,si ;dl=si. 011C 8A D3 mov dl,bl ;. 011E D0 EA shr dl,1 0120 D0 EE shr dh,1 0122 FE C2 inc dl ;month is start at 1. ;------------------------------------------------------02/28/1983------ 0124 40 inc ax ;date is start at 1. ;----------------------------------------------------------------------  The Microsoft MACRO Assembler , Version 1.25 Page 1-5 MSTIME 01-31-84 0125 5E pop si 0126 C3 ret 0127 COMV_SET ENDP 0127 SEE_TABLE PROC NEAR 0127 BE 0000 mov si,0 ;start at 0. 012A 2B 00 see_table_1: sub ax,[bx+si] ;load year in bx. 012C 72 04 jb see_table_ret ;if ax 0 021A 03 06 0013 R ADD AX,NOC2 ; AX = STLINE + NOC2 021E SENDDGRET: 021E E8 0000 E CALL KBCSRO ; NEW CURSOR POSITION OUTPUT 0221 E8 0000 E CALL KBSACV ; CHNG SCREEN MEMORY ADD TO LA/CA 0224 SENDDGRET1: 0224 88 36 0000 E MOV LA,DH ; RESET LA 0228 88 16 0000 E MOV CA,DL ; RESET CA 022C C3 RET ; RETURN ; ;********************************************************************** ;* SET DMAGDC COMMAND AND PARAMETERS * ;********************************************************************** 022D SENDGDC: 022D 88 1E 023F R MOV GDCCSRW_1,BL ; SET ADDRESS TO DISPLAY CURSOR (LOW BYTE) 0231 88 3E 0241 R MOV GDCCSRW_2,BH ; SET ADDRESS TO DISPLAY CURSOR (HIGH BYTE) 0235 1E push ds 0236 52 push dx 0237 50 push ax 0238 51 push cx ; ; SET DMA COMMAND AND PARAMETERS ; 0239 E8 0000 E call kbmout ; multi command output to gdc 023C 06 db 06h ; number of command and parameters 023D 4249 dw 4249h ; cursor output command 023F 00 gdccsrw_1 db 00h ; cursor address (low byte) 0240 40 db 40h 0241 00 gdccsrw_2 db 00h ; cursor address (high byte) 0242 40 db 40h 0243 424A dw 424ah ; gdc mask write command 0245 00 gdcmsk_l db 00h ; low byte mask 0246 40 db 40h 0247 00 gdcmsk_h db 00h ; high byte mask 0248 40 db 40h ; 0249 59 pop cx 024A 5E pop si 024B E8 027D R call gdcempchk ; gdc fifo empty check 024E A0 0018 R mov al,gdcwrt  The Microsoft MACRO Assembler , Version 1.25 Page 1-8 DMAXFER 01-31-84 0251 E6 42 out gdccmdw,al ; ouput command 0253 1F pop ds 0254 3C 20 cmp al,gdcwrt_w ; if word write 0256 75 15 jne sendgdc020 0258 sendgdc010: 0258 F7 C1 0007 test cx,0007h 025C 75 03 jnz sendgdc015 025E E8 027D R call gdcempchk 0261 sendgdc015: 0261 AD lodsw 0262 E6 40 out gdcparaw,al 0264 8A C4 mov al,ah 0266 E6 40 out gdcparaw,al 0268 E2 EE loop sendgdc010 026A EB 0F 90 jmp sendgdcret ; 026D sendgdc020: 026D F7 C1 000F test cx,000fh 0271 75 03 jnz sendgdc025 0273 E8 027D R call gdcempchk 0276 sendgdc025: 0276 AC lodsb 0277 E6 40 out gdcparaw,al 0279 E2 F2 loop sendgdc020 027B sendgdcret: 027B 1F pop ds 027C C3  ret 027D gdcempchk: 027D E4 40 in al,gdcstatus 027F A8 04 test al,04h 0281 74 FA jz gdcempchk 0283 C3 ret ; ;********************************************************************** ;* GENERATION ATTRIBUTE BIT MAP * ;* INPUT AX = SCREEN ADDRESS * ;* CX = WORD COUNT * ;********************************************************************** 0284 GENATMAP: 0284 50 PUSH AX 0285 51 PUSH CX ; 0286 E8 0000 E CALL GENATBIT ; GENERATE ATTRIBUTE MASK BIT 0289 08 15 OR [DI],DL 028B 59 POP CX 028C 58 POP AX 028D 40 INC AX 028E E2 F4 LOOP GENATMAP ; GENERATE ATTRIBUTE BIT MAP 0290 C3 RET ; ;********************************************************************** ;* DMA XFER RETURN *  The Microsoft MACRO Assembler , Version 1.25  Page 1-9 DMAXFER 01-31-84 ;********************************************************************** 0291 DMAXFERRET: 0291 C3 RET ; RETURN 0292 CODE ENDS END  The Microsoft MACRO Assembler , Version 1.25 Page Symbols-1 DMAXFER 01-31-84 Segments and groups: N a m e Size align combine class CODE . . . . . . . . . . . . . . 0292 PARA PUBLIC 'CODE' Symbols: N a m e Type Value Attr CA . . . . . . . . . . . . . . . V BYTE 0000 CODE External COLUMN . . . . . . . . . . . . . Number 0050 CRTDSP . . . . . . . . . . . . . V WORD 0000 CODE External CURSOROFF. . . . . . . . . . . . L NEAR 0000 CODE External DMAABAS. . . . . . . . . . . . . L WORD 000F CODE DMAAOFF. . . . . . . . . . . . . L WORD 000D CODE DMACA. . . . . . . . . . . . . . L BYTE 0006 CODE DMACH0_CMD . . . . . . . . . . . L BYTE 0004 CODE DMADBAS. . . . . . . . . . . . . L WORD 000B CODE DMADOFF. . . . . . . . . . . . . L WORD 0009 CODE DMAGDC0. . . . . . . . . . . . . L NEAR 0052 CODE DMAGDC1. . . . . . . . . . . . . L NEAR 0060 CODE DMAGDC2. . . . . . . . . . . . . L NEAR 006E CODE DMAGDC3. . . . . . . . . . . . . L NEAR 0085 CODE DMAGDC31 . . . . . . . . . . . . L NEAR 0092 CODE DMAGDC3RET . . . . . . . . . . . L NEAR 00AC CODE DMAGDC4. . . . . . . . . . . . . L NEAR 00AD CODE DMAGDC41 . . . . . . . . . . . . L NEAR 00BA CODE DMAGDC4RET . . . . . . . . . . . L NEAR 00BF CODE DMAGDC_DRB . . . . . . . . . . . L NEAR 0004 CODE DMALA. . . . . . . . . . . . . . L BYTE 0005 CODE DMALACA. . . . . . . . . . . . . L WORD 0015 CODE DMANOC . . . . . . . . . . . . . L WORD 0007 CODE DMAXFER. . . . . . . . . . . . . L NEAR 002B CODE Global DMAXFERRET . . . . . . . . . . . L NEAR 0291 CODE DMAXFERTBL . . . . . . . . . . . L BYTE 0019 CODE DMAXFLG. . . . . . . . . . . . . L BYTE 0000 CODE Global DPLINE . . . . . . . . . . . . . Number 0019 DRBOFF . . . . . . . . . . . . . L WORD 0002 CODE FLAGX. . . . . . . . . . . . . . L BYTE 0001 CODE Global GDCCMDW. . . . . . . . . . . . . Number 0042 GDCCSRW_1. . . . . . . . . . . . L BYTE 023F CODE GDCCSRW_2. . . . . . . . . . . . L BYTE 0241 CODE GDCEMPCHK. . . . . . . . . . . . L NEAR 027D CODE GDCMAX . . . . . . . . . . . . . Number 0FF0 GDCMSK_H . . . . . . . . . . . . L BYTE 0247 CODE GDCMSK_H1. . . . . . . . . . . . Number 00FF GDCMSK_H2. . . . . . . . . . . . Number 0000 GDCMSK_L . . . . . . . . . . . . L BYTE 0245 CODE GDCMSK_L1. . . . . . . . . . . . L BYTE 0017 CODE GDCMSK_L2. . . . . . . . . . . . Number 00FF GDCPARAW . . . . . . . . . . . . Number 0040 GDCSTATUS. . . . . . . . . . . . Number 0040  The Microsoft MACRO Assembler , Version 1.25 Page Symbols-2 DMAXFER 01-31-84 GDCWRT . . . . . . . . . . . . . L BYTE 0018 CODE GDCWRT_H . . . . . . . . . . . . Number 0038 GDCWRT_L . . . . . . . . . . . . Number 0030 GDCWRT_W . . . . . . . . . . . . Number 0020 GENATBIT . . . . . . . . . . . . L NEAR 0000 CODE External GENATMAP . . . . . . . . . . . . L NEAR 0284 CODE INT_DS . . . . . . . . . . . . . V WORD 0000 CODE External KBCSAD . . . . . . . . . . . . . L NEAR 0000 CODE External KBCSRD . . . . . . . . . . . . . L NEAR 0000 CODE External KBCSRO . . . . . . . . . . . . . L NEAR 0000 CODE External KBLCCV . . . . . . . . . . . . . L NEAR 0000 CODE External KBMOUT . . . . . . . . . . . . . L NEAR 0000 CODE External KBSACV . . . . . . . . . . . . . L NEAR 0000 CODE External LA . . . . . . . . . . . . . . . V BYTE 0000 CODE External LACACHNG . . . . . . . . . . . . L NEAR 0000 CODE External LOOKUP . . . . . . . . . . . . . L NEAR 0000 CODE External NOC1 . . . . . . . . . . . . . . L WORD 0011 CODE NOC2 . . . . . . . . . . . . . . L WORD 0013 CODE PMSG . . . . . . . . . . . . . . L NEAR 0000 CODE External ROLLDOWN . . . . . . . . . . . . L NEAR 0000 CODE External ROLLUP . . . . . . . . . . . . . L NEAR 0000 CODE External SENDDG001. . . . . . . . . . . . L NEAR 00CC CODE SENDDG002. . . . . . . . . . . . L NEAR 00D8 CODE SENDDG003. . . . . . . . . . . . L NEAR 00F2 CODE SENDDG004. . . . . . . . . . . . L NEAR 0104 CODE SENDDG005. . . . . . . . . . . . L NEAR 012A CODE SENDDG01 . . . . . . . . . . . . L NEAR 0131 CODE SENDDG012. . . . . . . . . . . . L NEAR 0140 CODE SENDDG015. . . . . . . . . . . . L NEAR 0181 CODE SENDDG019. . . . . . . . . . . . L NEAR 018E CODE SENDDG02 . . . . . . . . . . . . L NEAR 0195 CODE SENDDG021. . . . . . . . . . . . L NEAR 01E4 CODE SENDDG022. . . . . . . . . . . . L NEAR 01EE CODE SENDDG023. . . . . . . . . . . . L NEAR 01F6 CODE SENDDG03 . . . . . . . . . . . . L NEAR 01FA CODE SENDDGRET. . . . . . . . . . . . L NEAR 021E CODE SENDDGRET1 . . . . . . . . . . . L NEAR 0224 CODE SENDDMAGDC . . . . . . . . . . . L NEAR 00C0 CODE SENDGDC. . . . . . . . . . . . . L NEAR 022D CODE SENDGDC010 . . . . . . . . . . . L NEAR 0258 CODE SENDGDC015 . . . . . . . . . . . L NEAR 0261 CODE SENDGDC020 . . . . . . . . . . . L NEAR 026D CODE SENDGDC025 . . . . . . . . . . . L NEAR 0276 CODE SENDGDCRET . . . . . . . . . . . L NEAR 027B CODE STLINE . . . . . . . . . . . . . Alias COLUMN Warning Severe Errors Errors 0 0   The Microsoft MACRO Assembler , Version 1.25 Page 1-1 MELODY 01-31-84 title MELODY page 58,132 ;----------------------------------------------------------------------------- ; ; MS-DOS BIOS for the N.E.C. Advanced Personal Computer ; ; module name: MELODY ; MS-DOS version: 2.0 ; module version: 1.0 ; ; abstract: This module provides the 'play melody' function of the ; the APC extended io system. ; ; contains routines: ; mlcmd mlbuz1 mlout pmedecbin pmwait ; ; revision history: ; ; This module was taken without modification from a NEC/Tokyo ; MS-DOS 1.25 io system of April, 1983. ; - RMG 6-7-83 ; ;----------------------------------------------------------------------------- 0000 CODE SEGMENT PUBLIC 'CODE' EXTRN INT_DS:WORD PUBLIC MLOUT PUBLIC MELODY ASSUME CS:CODE,DS:CODE,SS:CODE,ES:CODE ;* ;********************************************************************** ;* * ;* DATA AREA * ;* * ;********************************************************************** ;* 0000 0000 LMICMD DW 0000H ; COMMAND CODE , FLAG 0002 0000 LMIIOS DW 0000H ; IOS1 , IOS2 0004 0000 LMIDPT DW 0000H ; DATA AREA POINTER (OFFSET) 0006 0000 DW 0000H ; (SEGMENT) 0008 0000 LMIDLN DW 0000H ; DATA AREA LENGTH ;* ;*** WORKING AREA ;* 000A 31 MLWPCB DB 31H ; 1ST COMMAND 000B 42 DB 42H ; 2ND COMMAND 000C 31 DB 31H ; 000D 50 DB 50H ; 000E 31 DB 31H  ; 000F 62 DB 62H ; ;* 0010 00 MLWPBZ DB 00H ; 0011 00 DB 00H ;  The Microsoft MACRO Assembler , Version 1.25 Page 1-2 MELODY 01-31-84 ;* 0012 50 MLWK01 DB 50H ; MELODY SPEED 0013 04 MLWK02 DB 04H ; NOTE LENGTH 0014 00 MLWK03 DB 00H ; NOTE LENGTH (FOR WAITING) 0015 00 MLWFLG DB 00H ; FLAG 0016 0000 PSWK0 DW 0 0018 0000 DW 0 001A 0000 DW 0 001C 0000 DW 0 001E 0000 DW 0 0020 0000 DW 0 0022 0000 DW 0 ;********************************************************************** ;* * ;* NOTE CONSTANT TABLE * ;* * ;********************************************************************** ;* 0024 0A MLTBL1 DB 0AH  ; -A 0025 0C DB 0CH ; -B 0026 01 DB 01H ; -C 0027 03 DB 03H ; -D 0028 05 DB 05H ; -E 0029 06 DB 06H ; -F 002A 08 DB 08H ; -G ;* ;********************************************************************** ;* * ;* NOTE LENGTH CONSTANT TABLE * ;* * ;********************************************************************** ;* 002B 40 MLTBL2 DB 40H ; 1 002C 49 DB 49H ; .1/2 002D 41 DB 41H ; 1/2 002E 4A DB 4AH ; .1/4 002F 42 DB 42H ; 1/4 0030 4B DB 4BH ; .1/8 0031 43 DB 43H ; 1/8 0032 4C DB 4CH ; .1/16 0033 44 DB 44H ; 1/16 0034 45 DB 45H ; 1/32 ;********************************************************************** ;* * ;* MELODY MAIN ROUTINE * ;* * ;********************************************************************** ;* 0035 MELODY: 0035 89 16 0004 R MOV LMIDPT,DX 0039 A3 0008 R MOV LMIDLN,AX ; DATA AREA LENGTH SAVE 003C 89 0E 0000 R MOV LMICMD,CX ; COMMAND CODE 0040 A1 0000 E MOV AX,INT_DS  The Microsoft MACRO Assembler , Version 1.25 Page 1-3 MELODY 01-31-84 0043 A3 0006 R MOV LMIDPT+2,AX 0046 E8 004A R LMA010: CALL MLCMD ; COMMAND PROCESS ;* 0049 C3 RET ; ;* ;********************************************************************** ;* * ;* COMMAND PROCESS  * ;* * ;********************************************************************** ;* 004A MLCMD: 004A FC CLD ; CLEAR DIRECTION FLAG 004B C6 06 0015 R 00 MOV MLWFLG,00H ; CLEAR FLAG 0050 A1 0000 R MOV AX,LMICMD ; COMMAND CODE 0053 3C 02 CMP AL,02H ; 0055 75 06 JNE MLC010 ; IF NOT SET MELODY COMMAND 0057 E8 0065 R CALL MLSETM ; SET MELODY COMMAND 005A EB 08 90 JMP MLC030 ; 005D 3C 03 MLC010: CMP AL,03H ; 005F 75 03 JNE MLC030 ; IF NOT BUZZER1 COMMAND 0061 E8 0147 R CALL MLBUZ1 ; BUZZER1 COMMAND 0064 MLC030: 0064 C3 RET ;* ;********************************************************************** ;* * ;* SET MELODY COMMAND * ;*  * ;********************************************************************** ;* 0065 8B 36 0004 R MLSETM: MOV SI,LMIDPT ; DATA AREA POINTER 0069 8E 06 0006 R MOV ES,LMIDPT+2 006D 8B 0E 0008 R MOV CX,LMIDLN ; DATA LENGTH 0071 E3 5A LSE010: JCXZ LSE095 ; RETURN IF DATA END 0073 26: AC LSE020: LODS ES:BYTE PTR [SI] ; 0075 C6 06 000A R 31 MOV MLWPCB,31H ; SET 1ST COMMAND (CONTROL) 007A 49 DEC CX ; 007B 3C 4D CMP AL,4DH ; 007D 75 1D JNZ LSE050 ; IF NOT 'M' 007F E3 4C JCXZ LSE095 ; RETURN IF DATA END 0081 26: AC LODS ES:BYTE PTR [SI] 0083 49 DEC CX ; 0084 04 10 ADD AL,10H ; 0086 3C 41 CMP AL,41H ; 0088 72 04 JB LSE030 ; 008A 3C 43 CMP AL,43H ; 008C 76 02 JBE LSE040 ; 008E B0 42 LSE030: MOV AL,42H ; 0090 A2 000B R LSE040: MOV MLWPCB+1,AL ; SET 2ND COMMAND (CONTROL) 0093 B2 02 MOV DL,02H ; NUMBER OF PARAMETERS 0095 E8 020B R CALL MLOUT ; OUT CONTROL COMMAND 0098 75 33 JNZ LSE095 ; RETURN IF ALM  The Microsoft MACRO Assembler , Version 1.25 Page 1-4 MELODY 01-31-84 009A EB D5 LSE045: JMP LSE010 ; 009C 3C 54 LSE050: CMP AL,54H ; 009E 75 13 JNZ LSE080 ;IF NOT 'T' 00A0 E3 2B JCXZ LSE095 ; RETURN IF DATA END 00A2 26: AC LODS ES:BYTE PTR [SI] ; 00A4 49 DEC CX ; 00A5 04 1F ADD AL,1FH ; 00A7 3C 50 CMP AL,50H ; 00A9 72 04 JB LSE060 ; 00AB 3C 53 CMP AL,53H ; 00AD 76 02 JBE LSE070 ; 00AF B0 50 LSE060: MOV AL,50H ; 00B1 EB DD LSE070: JMP LSE040 ; ;* 00B3 2B D2 LSE080: SUB DX,DX ; 0 CLEAR DX 00B5 3C 53 CMP AL,53H ; 00B7 75 07 JNZ LSE090 ; IF NOT 'S' 00B9 E3 12 JCXZ LSE095 ; RETUURN IF DATA END 00BB B2 10 MOV DL,10H ; 00BD 26: AC  LODS ES:BYTE PTR [SI] ; 00BF 49 DEC CX ; 00C0 3C 2B LSE090: CMP AL,2BH ; 00C2 74 0E JZ LSE100 ; IF '+' 00C4 3C 2D CMP AL,2DH ; 00C6 74 0C JZ LSE110 ; IF '-' 00C8 B6 0C MOV DH,0CH ; 00CA EB 0D 90 JMP LSE120 ; ;* 00CD C3 LSE095: RET ; ;* 00CE 4E LSE096: DEC SI ; 00CF 41 INC CX ; 00D0 EB A1 JMP LSE020 ; ;* 00D2 B6 18 LSE100: MOV DH,18H ; 00D4 E3 F7 LSE110: JCXZ LSE095 ; 00D6 26: AC LODS ES:BYTE PTR [SI] ; 00D8 49 DEC CX ; 00D9 3C 41 LSE120: CMP AL,41H ; 00DB 72 F7 JB LSE110 ; 00DD 3C 47 CMP AL,47H ; 00DF 76 09 JBE LSE130 ; IF AL = A--G 00E1 3C 4E CMP AL,4EH ; 00E3 75 B5 JNZ LSE045 ; IF NOT 'N' 00E5 B0 30 MOV AL,30H ; 00E7 EB 0E 90 JMP LSE135 ; 00EA 24 0F LSE130: AND AL,0FH ; 00EC 48 DEC AX ; 00ED BB 0024 R MOV BX,OFFSET MLTBL1 00F0 D7 XLAT BX ; GET NOTE BITS 00F1 02 C6 ADD AL,DH ; 00F3 3C 1E CMP AL,1EH ; 00F5 73 D7 JAE LSE096 ;  The Microsoft MACRO Assembler , Version 1.25 Page 1-5 MELODY 01-31-84 00F7 A2 000A R LSE135: MOV MLWPCB,AL ; SET 1ST COMMAND (MELODY) 00FA E3 2F JCXZ LSE150 ; IF DATA END 00FC 3C 30 CMP AL,30H ; 00FE 74 19 JZ LSE137 ; IF 'N' 0100 2A C6 SUB AL,DH ; 0102 3C 05 CMP AL,05H ; 0104 74 13 JZ LSE137 ; IF 'E' 0106 3C 0C CMP AL,0CH ; 0108 74 0F JZ LSE137 ; IF 'B' 010A 26: 8A 04 MOV AL,ES:BYTE PTR [SI] ; 010D 3C 23 CMP AL,23H ; 010F 75 0B JNZ LSE140 ; IF NOT '#' 0111 FE 06 000A R INC MLWPCB ; 0115 46 INC SI ; 0116 49 DEC CX ; 0117 E3 12 JCXZ LSE150 ; IF DATA END 0119 LSE137: ; 0119 26: 8A 04 MOV AL,ES:BYTE PTR [SI] ; 011C 3C 30 LSE140: CMP AL,30H ; 011E 72 0B JB LSE150 ; IF NOTE LENGTH OMITTED 0120 3C 39 CMP AL,39H ; 0122 77 07 JA LSE150 ; IF NOTE LENGTH OMITTED 0124 46 INC SI ; 0125 49 DEC CX ; 0126 24 0F AND AL,0FH ; 0128 EB 04 90 JMP LSE160 ; 012B A0 0013 R LSE150: MOV AL,MLWK02 ; 012E A2 0013 R LSE160: MOV MLWK02,AL ; 0131 BB 002B R MOV BX,OFFSET MLTBL2 ; 0134 D7 XLAT BX ; 0135 0A C2 OR AL,DL ; 0137 A2 000B R MOV MLWPCB+1,AL ; SET 2ND COMMAND 013A B2 02 MOV DL,02H ; NUMBER OF PARAMETERS 013C E8 020B R CALL MLOUT ; OUT NOTE COMMAND 013F 75 05 JNZ LSE180 ; RETURN IF ALM 0141 E3 03 JCXZ LSE180 ; RETURN IF DATA END 0143 E9 0073 R LSE170: JMP LSE020 ; 0146 C3 LSE180: RET ; ;********************************************************************** ;* * ;* BUZZER1 COMMAND  * ;* * ;********************************************************************** ;* 0147 8B 36 0004 R MLBUZ1: MOV SI,LMIDPT ; DATA AREA POINTER 014B 8E 06 0006 R MOV ES,LMIDPT+2 ; 014F 8B 0E 0008 R MOV CX,LMIDLN ; DATA LENGTH 0153 E3 58 LBU010: JCXZ LBU085 ; RETURN IF DATA END 0155 26: AC LODS ES:BYTE PTR [SI] ; 0157 49 DEC CX ; 0158 B2 30 MOV DL,30H ; 015A 3C 42 CMP AL,42H ; 015C 74 06 JZ LBU020 ; IF 'B'  The Microsoft MACRO Assembler , Version 1.25 Page 1-6 MELODY 01-31-84 015E 3C 50 CMP AL,50H ; 0160 B2 40 MOV DL,40H ; 0162 75 22 JNZ LBU050 ; IF NOT 'P' 0164 E3 47 LBU020: JCXZ LBU085 ; RETURN IF DATA END 0166 C6 06 000A R 31 MOV MLWPCB,31H ; SET 1ST COMMAND (CONTROL) 016B 26: AC LODS ES:BYTE PTR [SI] ; 016D 49 DEC CX ; 016E 3C 31 CMP AL,31H ; 0170 72 04 JB LBU030 ; 0172 3C 33 CMP AL,33H ; 0174 76 02 JBE LBU040 ; 0176 B0 32 LBU030: MOV AL,32H ; 0178 02 C2 LBU040: ADD AL,DL ; 017A A2 000B R MOV MLWPCB+1,AL ; SET 2ND COMMAND (CONTROL) 017D B2 02 MOV DL,02H ; NUMBER OF PARAMETERS 017F E8 020B R CALL MLOUT ; OUT CONTROL COMMAND 0182 75 29 JNZ LBU085 ; RETURN IF ALM 0184 EB CD JMP LBU010 ; ;* 0186 3C 48 LBU050: CMP AL,48H ; 0188 72 04 JB LBU060 ; 018A 3C 4B CMP AL,4BH ; 018C 76 07 JBE LBU070 ; 018E E3 1D LBU060: JCXZ LBU085 ; RETURN IF DATA END 0190 26: AC LODS ES:BYTE PTR [SI] ; 0192 49 DEC CX 0193 EB F1 JMP LBU050 ;* 0195 2C 48 LBU070: SUB AL,48H ; 0197 92 XCHG AX,DX ; AL--> DL 0198 2B DB SUB BX,BX ; SET BX TO 0 019A E3 12 LBU080: JCXZ LBU090 ; IF DATA END  019C 26: 8A 04 MOV AL,ES:BYTE PTR[SI] 019F 3C 30 CMP AL,30H ; 01A1 72 0B JB LBU090 ; IF LENGTH OMITTED 01A3 3C 39 CMP AL,39H ; 01A5 77 07 JA LBU090 ; IF LENGTH OMITTED 01A7 46 INC SI ; 01A8 43 INC BX ; 01A9 49 DEC CX ; 01AA EB EE JMP LBU080 ; ;* 01AC 59 LBU084: POP CX ; 01AD C3 LBU085: RET ; ;* 01AE 80 CA 38 LBU090: OR DL,38H ; 01B1 88 16 000A R MOV MLWPCB,DL ; SET BUZZER COMMAND 01B5 51 PUSH CX ; 01B6 80 0E 0015 R 02 OR MLWFLG,02H ; SET C-F 01BB 23 DB AND BX,BX ; 01BD 74 15 JZ LBU095 ; IF LENGTH OMITTED 01BF 80 26 0015 R FD AND MLWFLG,0FDH ; CLEAR C-F 01C4 8A CB MOV CL,BL  The Microsoft MACRO Assembler , Version 1.25 Page 1-7 MELODY 01-31-84 01C6 F7 DB NEG BX ; 01C8 8D 18 LEA BX,[SI+BX] ; 01CA E8 0235 R CALL PMEDECBIN ; DECIMAL TO BINARY 01CD 8B CA MOV CX,DX ; 01CF 83 F9 02 CMP CX,0002H ; 01D2 76 05 JBE LBU100 ; IF 20MS 01D4 80 0E 000A R 04 LBU095: OR MLWPCB,04H ; 01D9 B2 01 LBU100: MOV DL,01H ; NUMBER OF PARAMETERS 01DB E8 020B R CALL MLOUT ; OUT BUZZER COMMAND 01DE 75 CC JNZ LBU084 ; RETURN IF ALM 01E0 F6 06 000A R 04 TEST MLWPCB,04H ; 01E5 74 16 JZ LBU120 ; IF 20MS COMMAND END 01E7 F6 06 0015 R 02 TEST MLWFLG,02H ; 01EC 75 0F JNZ LBU120 ; IF C-F ON 01EE 83 E9 03 SUB CX,0003H ; 01F1 E3 03 JCXZ LBU110 ; IF WAIT TIME IS 30MS 01F3 E8 0260 R CALL PMWAIT ; WAIT 01F6 80 26 000A R FB LBU110: AND MLWPCB,0FBH ; SET 20MS COMMAND 01FB EB DC JMP LBU100 ; 01FD 59 LBU120: POP CX ; 01FE E3 AD JCXZ LBU085 ; RETURN IF DATA END 0200 51 PUSH CX ; 0201 B9 0007 MOV CX,0007H ; 0204 E8 0260 R CALL PMWAIT ; WAIT 0207 59 POP CX ; 0208 E9 0153 R JMP LBU010 ;  ;* ;********************************************************************** ;* * ;* OUT COMMAND BY SPECIFIED NUMBER OF BYTES * ;* * ;* INPUT PARAMETERS : * ;* REG.DL : NUMBER OF PARAMETER BYTES * ;* * ;* RETURNED VALUE : * ;* ZERO FLAG : ON / NORMAL * ;* OFF / ALM * ;* * ;********************************************************************** ;* 020B BF 000A R MLOUT: MOV DI,OFFSET MLWPCB ; POINTER TO PARAMETER AREA 020E B6 02 LOU010: MOV DH,02H ; 0210 E4 60 LOU020: IN AL,60H ; 0212 93 XCHG AX,BX ; AL -> BL 0213 E4 60 IN AL,60H ; 0215 3A C3 CMP AL,BL ; 0217 74 0C JZ LOU030 ; IF STATUS MATCH 0219 FE CE DEC DH ; 021B 75 F3 JNZ LOU020 ; 021D 42 INC DX ; CLEAR ZERO FLAG 021E C7 06 0002 R 1008 MOV LMIIOS,1008H ; SET IOS (AT3,ALM) 0224 C3 RET ;*  The Microsoft MACRO Assembler , Version 1.25 Page 1-8 MELODY 01-31-84 0225 3C 80 LOU030: CMP AL,80H ; 0227 74 02 JZ LOU040 ; IF READY 0229 EB E3 JMP LOU010 ; ;* 022B 8A 05 LOU040: MOV AL,DS:BYTE PTR [DI] ; 022D E6 60 OUT 60H,AL ; OUT 1 PARAMETER BYTE 022F 47 INC DI ; 0230 FE CA DEC DL ; 0232 75 DA JNZ LOU010 ; IF NOT END 0234 C3 RET ; ;* ;********************************************************************** ;*  * ;* DECIMAL TO BINARY ROUTINE * ;* * ;********************************************************************** ;* 0235 PMEDECBIN: 0235 50 PUSH AX 0236 2B D2 SUB DX,DX 0238 8A EE MOV CH,DH ; CX; DECIMAL DATA LL. 023A 26: 8A 07 SDE100: MOV AL,ES:BYTE PTR [BX] ; AL; DECIMAL DATA 023D 24 0F AND AL,0FH 023F 51 PUSH CX ; ESCAPE DATA LL. ;* 0240 D1 E2 SHL DX,1 ; *2 0242 72 14 JB SDE300 ; JMP IF ERR. 0244 8B CA MOV CX,DX 0246 D1 E2 SHL DX,1 ; *4 0248 72 0E JB SDE300 ; JMP IF ERR. 024A D1 E2 SHL DX,1 ; *8 024C 72 0A JB SDE300 ; JMP IF ERR. 024E 03 D1 ADD DX,CX ; *10 0250 72 06 JB SDE300 ; JMP IF ERR. ;* 0252 8A C8 MOV CL,AL 0254 2A ED SUB CH,CH 0256 03 D1 ADD DX,CX ;* 0258 59 SDE300: POP CX 0259 72 03 JB SDE500 ; JMP IF ERR.(OVERFLOW) 025B 43 INC BX 025C E2 DC LOOP SDE100 025E 58 SDE500: POP AX 025F C3 RET ; ;* ;********************************************************************** ;* * ;* WAIT ROUTINE * ;* * ;********************************************************************** ;* 0260 PMWAIT:  The Microsoft MACRO Assembler , Version 1.25 Page 1-9 MELODY 01-31-84 0260 51 PUSH CX ; 0261 B9 0C00 MOV CX,0C00H ; SET 10MS WAIT COUNT 0264 E2 FE PMW010: LOOP PMW010 ; 10MS WAIT 0266 59 POP CX ; 0267 E2 F7 LOOP PMWAIT ; 0269 C3 RET ; 026A CODE ENDS END  The Microsoft MACRO Assembler , Version 1.25 Page Symbols-1 MELODY 01-31-84 Segments and groups: N a m e Size align combine class CODE . . . . . . . . . . . . . . 026A PARA PUBLIC 'CODE' Symbols: N a m e Type Value Attr INT_DS . . . . . . . . . . . . . V WORD 0000 CODE External LBU010 . . . . . . . . . . . . . L NEAR 0153 CODE LBU020 . . . . . . . . . . . . . L NEAR 0164 CODE LBU030 . . . . . . . . . . . . . L NEAR 0176 CODE LBU040 . . . . . . . . . . . . . L NEAR 0178 CODE LBU050 . . . . . . . . . . . . . L NEAR 0186 CODE LBU060 . . . . . . . . . . . . . L NEAR 018E CODE LBU070 . . . . . . . . . . . . . L NEAR 0195 CODE LBU080 . . . . . . . . . . . . . L NEAR 019A CODE LBU084 . . . . . . . . . . . . . L NEAR 01AC CODE LBU085 . . . . . . . . . . . . . L NEAR 01AD CODE LBU090 . . . . . . . . . . . . . L NEAR 01AE CODE LBU095 . . . . . . . . . . . . . L NEAR 01D4 CODE LBU100 . . . . . . . . . . . . . L NEAR 01D9 CODE LBU110 . . . . . . . . . . . . . L NEAR 01F6 CODE LBU120 . . . . . . . . . . . . . L NEAR 01FD CODE LMA010 . . . . . . . . . . . . . L NEAR 0046 CODE LMICMD . . . . . . . . . . . . . L WORD 0000 CODE LMIDLN . . . . . . . . . . . . . L WORD 0008 CODE LMIDPT . . . . . . . . . . . . . L WORD 0004 CODE LMIIOS . . . . . . . . . . . . . L WORD 0002 CODE LOU010 . . . . . . . . . . . . . L NEAR 020E CODE LOU020 . . . . . . . . . . . . . L NEAR 0210 CODE LOU030 . . . . . . . . . . . . . L NEAR 0225 CODE LOU040 . . . . . . . . . . . . . L NEAR 022B CODE LSE010 . . . . . . . . . . . . . L NEAR 0071 CODE LSE020 . . . . . . . . . . . . . L NEAR 0073 CODE LSE030 . . . . . . . . . . . . . L NEAR 008E CODE LSE040 . . . . . . . . . . . . . L NEAR 0090 CODE LSE045 . . . . . . . . . . . . . L NEAR 009A CODE LSE050 . . . . . . . . . . . . . L NEAR 009C CODE LSE060 . . . . . . . . . . . . . L NEAR 00AF CODE LSE070 . . . . . . . . . . . . . L NEAR 00B1 CODE LSE080 . . . . . . . . . . . . . L NEAR 00B3 CODE LSE090 . . . . . . . . . . . . . L NEAR 00C0 CODE LSE095 . . . . . . . . . . . . . L NEAR 00CD CODE LSE096 . . . . . . . . . . . . . L NEAR 00CE CODE LSE100 . . . . . . . . . . . . . L NEAR 00D2 CODE LSE110 . . . . . . . . . . . . . L NEAR 00D4 CODE LSE120 . . . . . . . . . . . . . L NEAR 00D9 CODE LSE130 . . . . . . . . . . . . . L NEAR 00EA CODE LSE135 . . . . . . . . . . . . . L NEAR 00F7 CODE LSE137 . . . . . . . . . . . . . L NEAR 0119 CODE  The Microsoft MACRO Assembler , Version 1.25 Page Symbols-2 MELODY 01-31-84 LSE140 . . . . . . . . . . . . . L NEAR 011C CODE LSE150 . . . . . . . . . . . . . L NEAR 012B CODE LSE160 . . . . . . . . . . . . . L NEAR 012E CODE LSE170 . . . . . . . . . . . . . L NEAR 0143 CODE LSE180 . . . . . . . . . . . . . L NEAR 0146 CODE MELODY . . . . . . . . . . . . . L NEAR 0035 CODE Global MLBUZ1 . . . . . . . . . . . . . L NEAR 0147 CODE MLC010 . . . . . . . . . . . . . L NEAR 005D CODE MLC030 . . . . . . . . . . . . . L NEAR 0064 CODE MLCMD. . . . . . . . . . . . . . L NEAR 004A CODE MLOUT. . . . . . . . . . . . . . L NEAR 020B CODE Global MLSETM . . . . . . . . . . . . . L NEAR 0065 CODE MLTBL1 . . . . . . . . . . . . . L BYTE 0024 CODE MLTBL2 . . . . . . . . . . . . . L BYTE 002B CODE MLWFLG . . . . . . . . . . . . . L BYTE 0015 CODE MLWK01 . . . . . . . . . . . . . L BYTE 0012 CODE MLWK02 . . . . . . . . . . . . . L BYTE 0013 CODE MLWK03 . . . . . . . . . . . . . L BYTE 0014 CODE MLWPBZ . . . . . . . . . . . . . L BYTE 0010 CODE MLWPCB . . . . . . . . . . . . . L BYTE 000A CODE PMEDECBIN. . . . . . . . . . . . L NEAR 0235 CODE PMW010 . . . . . . . . . . . . . L NEAR 0264 CODE PMWAIT . . . . . . . . . . . . . L NEAR 0260 CODE PSWK0. . . . . . . . . . . . . . L WORD 0016 CODE SDE100 . . . . . . . . . . . . . L NEAR 023A CODE SDE300 . . . . . . . . . . . . . L NEAR 0258 CODE SDE500 . . . . . . . . . . . . . L NEAR 025E CODE Warning Severe Errors Errors 0 0   The Microsoft MACRO Assembler , Version 1.25 Page 1-1 INT 01-31-84 title INT page 58,132 ;----------------------------------------------------------------------------- ; ; MS-DOS BIOS for the N.E.C. Advanced Personal Computer ; ; module name: INT ; MS-DOS version: 2.0 ; module version: 1.0 ; ; abstract: This module contains the interrupt 220h funnctions. ; ; contains routines: ; ext_fnc_int curead clrfifo ; ; revision history: ; ; This module was taken from a NEC/Tokyo IO system for MS-DOS V1.25 ; of April, 1983. The disk_change_routine was added at NECIS for ; use with the hard disk formatter (HDFORMAT). ; - RMG 6-7-83 ; ; Removed disk change routine. The change flag now resides in the ; harddisk driver module, and is accessable to the utility via a config ; table entry. ; - RMG 12-16-83 ; ; Added modifications for AUX2 device (H14) support; function 11. ; - RMG 1-13-84 ; ;----------------------------------------------------------------------------- 0000 CODE SEGMENT PUBLIC 'CODE' EXTRN LOOKUP:NEAR,CALENDAR:NEAR,MELODY:NEAR,APO:NEAR,DMAXFER:NEAR EXTRN regprnt:far EXTRN RWCMOS:NEAR,RS232INIT:NEAR ;--------------------------------------------------02/25/1983---------- EXTRN KBIN:byte,KBOUT:byte,KBCSAD:NEAR,KBSACV:NEAR ;---------------------------------------------------------------------- ;-----------------------------------------------------02/26/1983------- extrn flushflg:byte ;---------------------------------------------------------------------- PUBLIC INT_DX PUBLIC EXT_FNC_INT PUBLIC INT_DS ASSUME CS:CODE,DS:CODE,SS:CODE,ES:CODE ;********************************************************************** ;* EXT_FNC_INT * ;********************************************************************** 0000 EXT_FNC_INT: 0000 E8 0015 R CALL REGSAVEINT ; 0003 50 PUSH AX  The Microsoft MACRO Assembler , Version 1.25 Page 1-2 INT 01-31-84 0004 8A C1 MOV AL,CL ; FUNCTION 0006 FE C0 INC AL 0008 BE 0091 R MOV SI,OFFSET INTTBL ; INT TABLE ADDR 000B E8 0000 E CALL LOOKUP ; 000E 58 POP AX 000F FF D3 CALL BX ; ; 0011 E8 0074 R CALL REGRESTORINT ; 0014 CF IRET ;********************************************************************** ;* REGSAVEINT * ;********************************************************************** 0015 REGSAVEINT: 0015 2E: A3 00B8 R MOV CS:INT_AX,AX 0019 58  POP AX 001A 2E: A3 00BA R MOV CS:INT_RTN,AX 001E 2E: 89 26 00BC R MOV CS:INT_SP,SP 0023 2E: 8C 16 00BE R MOV CS:INT_SS,SS 0028 2E: 8C 1E 00C0 R MOV CS:INT_DS,DS 002D 2E: 8C 06 00C2 R MOV CS:INT_ES,ES 0032 2E: 89 0E 00C4 R MOV CS:INT_CX,CX 0037 2E: 89 16 00C6 R MOV CS:INT_DX,DX 003C 8C C8 MOV AX,CS 003E 8E D0 MOV SS,AX 0040 BC 0108 R MOV SP,OFFSET EXTSTACKBASE 0043 2E: A1 00B8 R MOV AX,CS:INT_AX 0047 REGSVINT010: 0047 1E PUSH DS 0048 52 PUSH DX 0049 06 PUSH ES 004A 50 PUSH AX 004B 51 PUSH CX 004C 53 PUSH BX 004D 55 PUSH BP 004E 56 PUSH SI 004F 57 PUSH DI 0050 2E: 8E 06 00BE R MOV ES,CS:INT_SS ; rmg / necis / 12-5-83 --- add cs override 0055 2E: 8B 1E 00BC R MOV BX,CS:INT_SP ; rmg / necis / 12-5-83 --- add cs override 005A 26: 8B 47 04 MOV AX,ES:04[BX] 005E 25 0200 AND AX,0200H 0061  74 01 JZ REGSVINT020 0063 FB STI 0064 REGSVINT020: 0064 8C C8 MOV AX,CS 0066 8E D8 MOV DS,AX 0068 8E C0 MOV ES,AX 006A 2E: A1 00B8 R MOV AX,CS:INT_AX 006E FC CLD 006F 2E: FF 26 00BA R JMP CS:INT_RTN ;********************************************************************** ;* REGRESTORINT *  The Microsoft MACRO Assembler , Version 1.25 Page 1-3 INT 01-31-84 ;********************************************************************** 0074 REGRESTORINT: 0074 58 POP AX 0075 2E: A3 00BA R MOV CS:INT_RTN,AX 0079 5F POP DI 007A 5E POP SI 007B 5D POP BP 007C 5B POP BX 007D 59 POP CX 007E 58 POP AX 007F 07 POP ES 0080 5A POP DX 0081 1F POP DS 0082 REGRESVINT010: 0082 2E: 8E 16 00BE R MOV SS,CS:INT_SS 0087 2E: 8B 26 00BC R MOV SP,CS:INT_SP 008C 2E: FF 26 00BA R JMP CS:INT_RTN ; ;********************************************************************** ;* DATA ARDS * ;********************************************************************** 0091 01 INTTBL DB 1 0092 0000 E DW CALENDAR ; CALENDAR GET 0094 02 DB 2 0095 0000 E DW CALENDAR ; CALENDAR SET 0097 03 DB 3 0098 0000 E DW MELODY ; MELODY 009A 04 DB 4 009B 0000 E DW MELODY ; BUZZER 009D 05 DB 5 009E 0112 R DW CUREAD ; CURSOR READ 00A0 06 DB 6 00A1 0000 E DW APO ; APO (OUTO POWER OFF) 00A3 07 DB 7 00A4 015C R DW CLRFIFO ; FIFO BUFFER CLEAR 00A6 08 DB 8 00A7 0000 E DW DMAXFER ; DMA XFER 00A9 09 DB 9 00AA 0000 E DW RWCMOS ; WRITE CMOS 00AC 0A DB 10 00AD 0000 E DW RWCMOS ; READ CMOS 00AF 0B DB 11 00B0 0108 R DW RS232INIT0 ; RS232C INITIALIZE - STD 00B2 0C DB 12 00B3 010D R DW RS232INIT1 ; RS232C INITIALIZE - H14 00B5 00 DB 0 00B6 016C R DW NULLRTN ; STOPPER (NULL) ; 00B8 0000 INT_AX DW 0 00BA 0000 INT_RTN DW 0 00BC 0000 INT_SP DW 0 00BE 0000 INT_SS DW 0 00C0 0000 INT_DS DW 0  The Microsoft MACRO Assembler , Version 1.25 Page 1-4 INT 01-31-84 00C2 0000 INT_ES DW 0 00C4 0000 INT_CX DW 0 00C6 0000 INT_DX DW 0 00C8 20 [ EXTSTACK dw 32 dup(0) 0000 ] 0108 EXTSTACKBASE LABEL NEAR ; ; Entry points for RS-232c initialization ; ; rmg / necis / 1-13-84 ; 0108 rs232init0: 0108 B5 00 mov ch,0 ; set port select switch to std 010A E9 0000 E jmp rs232init 010D rs232init1: 010D B5 01 mov ch,1 ; set port select switch to h14 010F E9 0000 E jmp rs232init ;********************************************************************** ;* CURSOR READ ROUTINE * ;********************************************************************** 0112 CUREAD: 0112 E8 0000 E CALL KBCSAD ; CURSOR ADDR READ 0115 E8 0000 E CALL KBSACV ; SCREEN MEMORY ADDR TO LA,CA CONV. 0118 8A C6 MOV AL,DH ; LA 011A FE C0 INC AL 011C E8 0147 R CALL CUR010 ; ASCII <--HEX. 011F A2 0156 R MOV KBWKLAH,AL 0122 88 26 0157 R MOV KBWKLAL,AH 0126 8A C2 MOV AL,DL 0128 FE C0 INC AL 012A E8 0147 R CALL CUR010 ; ASCII <-- HEX. 012D A2 0159 R MOV KBWKCAH,AL 0130 88 26 015A R MOV KBWKCAL,AH 0134 06 PUSH ES 0135 8E 06 00C0 R MOV ES,INT_DS 0139 BE 0154 R MOV SI,OFFSET KBCURSOR 013C 8B 3E 00C6 R MOV DI,INT_DX 0140 B9 0008 MOV CX,8 0143 F3/ A4 REP MOVSB 0145 07 POP ES 0146 C3 RET ; 0147 CUR010: 0147 2A E4 SUB AH,AH 0149 F6 36 0153 R DIV KBWK10 014D 80 CC 30 OR AH,30H 0150 0C 30 OR AL,30H  The Microsoft MACRO Assembler , Version 1.25 Page 1-5 INT 01-31-84 0152 C3 RET 0153 0A KBWK10 DB 0AH ; 0154 1B KBCURSOR DB 1BH ; ESC 0155 5B DB '[' 0156 00 KBWKLAH DB 0 0157 00 KBWKLAL DB 0 0158 3B DB ';' 0159 00 KBWKCAH DB 0 015A 00 KBWKCAL DB 0 015B 52 DB 'R' ;********************************************************************** ;* KB FIFO BUFFER CLEAR ROUTINE * ;********************************************************************** 015C CLRFIFO: 015C C6 06 0000 E 00 MOV KBIN,0 0161 C6 06 0000 E 00 MOV KBOUT,0 ;-----------------------------------------------------02/26/1983------- 0166 C6 06 0000 E 01  mov flushflg,1 ;---------------------------------------------------------------------- 016B C3 RET ;********************************************************************** ;* NULL RETURN ROUTINE * ;********************************************************************** ; 016C NULLRTN: 016C C3 RET 016D CODE ENDS END  The Microsoft MACRO Assembler , Version 1.25 Page Symbols-1 INT 01-31-84 Segments and groups: N a m e Size align combine class CODE . . . . . . . . . . . . . . 016D PARA PUBLIC 'CODE' Symbols: N a m e Type Value Attr APO. . . . . . . . . . . . . . . L NEAR 0000 CODE External CALENDAR . . . . . . . . . . . . L NEAR 0000 CODE External CLRFIFO. . . . . . . . . . . . . L NEAR 015C CODE CUR010 . . . . . . . . . . . . . L NEAR 0147 CODE CUREAD . . . . . . . . . . . . . L NEAR 0112 CODE DMAXFER. . . . . . . . . . . . . L NEAR 0000 CODE External EXTSTACK . . . . . . . . . . . . L WORD 00C8 CODE Length =0020 EXTSTACKBASE . . . . . . . . . . L NEAR 0108 CODE EXT_FNC_INT. . . . . . . . . . . L NEAR 0000 CODE Global FLUSHFLG . . . . . . . . . . . . V BYTE 0000 CODE External INTTBL . . . . . . . . . . . . . L BYTE 0091 CODE INT_AX . . . . . . . . . . . . . L WORD 00B8 CODE INT_CX . . . . . . . . . . . . . L WORD 00C4 CODE INT_DS . . . . . . . . . . . . . L WORD 00C0 CODE Global INT_DX . . . . . . . . . . . . . L WORD 00C6 CODE Global INT_ES . . . . . . . . . . . . . L WORD 00C2 CODE INT_RTN. . . . . . . . . . . . . L WORD 00BA CODE INT_SP . . . . . . . . . . . . . L WORD 00BC CODE INT_SS . . . . . . . . . . . . . L WORD 00BE CODE KBCSAD . . . . . . . . . . . . . L NEAR 0000 CODE External KBCURSOR . . . . . . . . . . . . L BYTE 0154 CODE KBIN . . . . . . . . . . . . . . V BYTE 0000 CODE External KBOUT. . . . . . . . . . . . . . V BYTE 0000 CODE External KBSACV . . . . . . . . . . . . . L NEAR 0000 CODE External KBWK10 . . . . . . . . . . . . . L BYTE 0153 CODE KBWKCAH. . . . . . . . . . . . . L BYTE 0159 CODE KBWKCAL. . . . . . . . . . . . . L BYTE 015A CODE KBWKLAH. . . . . . . . . . . . . L BYTE 0156 CODE KBWKLAL. . . . . . . . . . . . . L BYTE 0157 CODE LOOKUP . . . . . . . . . . . . . L NEAR 0000 CODE External MELODY . . . . . . . . . . . . . L NEAR 0000 CODE External NULLRTN. . . . . . . . . . . . . L NEAR 016C CODE REGPRNT. . . . . . . . . . . . . L FAR 0000 CODE External REGRESTORINT . . . . . . . . . . L NEAR 0074 CODE REGRESVINT010. . . . . . . . . . L NEAR 0082 CODE REGSAVEINT . . . . . . . . . . . L NEAR 0015 CODE REGSVINT010. . . . . . . . . . . L NEAR 0047 CODE REGSVINT020. . . . . . . . . . . L NEAR 0064 CODE RS232INIT. . . . . . . . . . . . L NEAR 0000 CODE External RS232INIT0 . . . . . . . . . . . L NEAR 0108 CODE RS232INIT1 . . . . . . . . . . . L NEAR 010D CODE RWCMOS . . . . . . . . . . . . . L NEAR 0000 CODE External  The Microsoft MACRO Assembler , Version 1.25 Page Symbols-2 INT 01-31-84 Warning Severe Errors Errors 0 0 T |<omCONFIG DOC lGSXAMPLEPAS ;  The Microsoft MACRO Assembler , Version 1.25 Page 1-1 RS232CIO 01-31-84 title RS232CIO PAGE 58,132 ;------------------------------------------------------------------------------ ; ; MS-DOS BIOS for the N.E.C. Advanced Personal Computer ; ; module name: RS232CIO ; MS-DOS version: 2.0 ; module version: 1.0 ; ; abstract: This module contains the driver for the aux serial port. ; ; contains routines: ; rs232init punch reader rs232_io aux_flush aux_rdsts aux_read ; aux_write aux_wrst aux_rdnd ; ; revision history: ; ; This module was taken from a version in an April, 1983 NEC/Tokyo ; io system. ; ; The DOS interface routines (aux_xxx) were added at NECIS for use ; with the MS-DOS V2.0 system. ; - RMG 6-7-83 ; ; Modified for use with H14. ; - RMG 1-13-84 ; ;----------------------------------------------------------------------------- .LFCOND =-0001 TURE = -1 = 0000 FALSE = 0 =-0001 TOKYO = TURE 0000 CODE SEGMENT PUBLIC 'CODE' EXTRN CONST:NEAR EXTRN INT_DX:WORD EXTRN exit:near,busy_exit:near,ptrsav:dword EXTRN err_exit:near EXTRN regprnt:far,msconout:far EXTRN MSREADER:FAR,MSPUNCH:FAR PUBLIC aux_read,aux_writ,aux_rdnd,aux_flush PUBLIC aux_wrst,aux_rdsts PUBLIC aux2_read,aux2_writ,aux2_rdnd,aux2_flush PUBLIC aux2_wrst,aux2_rdsts PUBLIC RS232INIT,PUNCH,READER public rs232parms ASSUME CS:CODE,DS:CODE,SS:CODE,ES:CODE ; ; dos io request packet structure (read non-destructive) ;  The Microsoft MACRO Assembler , Version 1.25  Page 1-2 RS232CIO 01-31-84 iopack struc 0000 0D [ db 13 dup (?) ; 13 byte static header ?? ] 000D ?? lk_ret db ? ; return character from look ahead 000E ???????? trans dd ? ; 0012 ???? count dw ? ; 0014 iopack ends ; ; ;********************************************************************** ;* * ;* RS232C I/O ROUTINE * ;* * ;* INPUT AH = FUNCTION CODE * ;* CH = 0 FOR STANDARD SERIAL PORT * ;* CH = 1 FOR H14 SERIAL PORT * ;* * ;* AH=0 INITITIALIZE COMMUNICATION PORT * ;* * ;* INPUT AL = PARAMETER FOR INITIALIZATION * ;* * ;* 7 6 5 4 3 2 1 0 * ;* -STOP BIT- PARITY PARITY WORD LENGTH - BAUD RATE - * ; ENABLE * ;* 0 1 = 1 1= EVEN 1= ENABLE 0 0 = 5 0 1 = *1 * ;* 1 1 = 2 0= ODD 0= DESABLE 0 1 = 6 1 0 = *16 * ;* 1 0 = 7 * ;* 1 1 = 8 * ;* * ;* * ;* AH=1 SEND THE CHARACTOR * ;* * ;* INPUT AL = SEND CHARACTOR * ;* OUTPUT AH = STATUS 1 * ;* * ;* AH=2 RECEIVE A CHARACTOR * ;* * ;* OUTPUT AL = RECEIVE CHARACTOR * ;* AH = STATUS 1 * ;* * ;* AH=3 RETURN THE COMMAND STATUS * ;* * ;* OUTPUT AH = STATUS 1 * ;* BIT 7 = TIME OUT * ;* 6 = BREAK DETECT * ;* 5 = FRAMING ERROR * ;* 4 = OVERRUN ERROR * ;* 3 = PARITY ERROR * ;* 2 = TRANSMITTER EMPTY * ;* 1 = RECEIVER READY *  The Microsoft MACRO Assembler , Version 1.25 Page 1-3 RS232CIO 01-31-84 ;* 0 = TRANSMITTER READY * ;* * ;* AL = STATUS 2 * ;* BIT 7 = MODEM DR * ;* 6 = UNUSED * ;* 5 = UNUSED * ;* 4 = UNUSED * ;* 3 = UNUSED * ;* 2 = MODEM CS * ;* 1 = MODEM CI * ;* 0 = MODEM CD * ;* * ;********************************************************************** ;* ; ; IO port addressing ; = 0032 RSIM EQU 32H ; MODE SET = 0032 RSIC EQU 32H ; COMMAND SET = 0032 RSIS EQU 32H ; STATUS READ = 0030 RSIR EQU 30H ; RECV DATA READ = 0030 RSIW EQU 30H ; SEND DATA WRITE = 002B RSCS EQU 2BH ; COUNTER SET = 0061 rscsh14 equ 61h ; counter set - h14 = 002F RSCM EQU 2FH ; COUNTER MODE SET = 0067 rscmh14 equ 67h ; counter mode set - h14 = 0034 RSMK EQU 34H ; MASK SET = 0034 RSRS EQU 34H ; READ MODEM SIGNAL = 0036 RSWS EQU 36H ; WRITE LINE CLOSE ; ; Current baud rate and mode values; also used to set default rate at system ; boot time. ; 0000 rs232parms: 0000 02 stdbaud db 2 ; distribution default is 300 baud 0001 7A stdmode db 7ah ; and 7 bit data, 1 stop bit, even parity 0002 02 h14baud db 2 0003 7A h14mode db 7ah ; ; Baud rate table ; 0004 0400 BAUD_TBL DW 0400H ; 150 BAUD 0006 0300 DW 0300H ; 200 0008 0200 DW 0200H ; 300 000A 0100 DW 0100H ; 600 000C 0080 DW 0080H ; 1200 000E 0040 DW 0040H ; 2400 0010 0020 DW 0020H ; 4800 0012 0010 DW 0010H ; 9600 0014 0008 DW 0008H ; 19200 ;********************************************************************** ;* *  The Microsoft MACRO Assembler , Version 1.25 Page 1-4 RS232CIO 01-31-84 ;* RS232C INITIALIZE PROCESS * ;* * ;* INPUT CH = DEVICE SELECT; 0 = STD, 1 = H14 * ;* DL = INITIALIZE PARAMETER * ;* DH = BAUD RATE * ;* * ;********************************************************************** 0016 RS232INIT: 0016 8B 16 0000 E MOV DX,INT_DX ; SET INIT PARAM 001A 8A C2 MOV AL,DL ; AL = INPUT PARAM (MODE BYTE) 001C 2A E4 SUB AH,AH ; SET FNC.CODE (INITIALIZE) ; ; save init parms for future reference ; 001E 80 FD 00 cmp ch,0 ; init of standard port? 0021 75 0B jnz inith14 0023 88 36 0000 R mov stdbaud,dh ; save baud rate 0027 88 16 0001 R mov stdmode,dl ; and mode 002B EB 09 90 jmp do_rsinit 002E inith14: 002E 88 36 0002 R mov h14baud,dh 0032 88 16 0003 R mov h14mode,dl 0036 do_rsinit: 0036 E8 007C R CALL RS232_IO ; RS232C I/O ROUTINE 0039 C3 RET ;********************************************************************** ;* * ;* PUNCH (PUNCH DEVICE OUTPUT) * ;* * ;* INPUT CL = SEND CHARACTOR * ;* CH = DEVICE SELECT; 0 = STD, 1 = H14 * ;* * ;********************************************************************** 003A PUNCH: 003A 50 PUSH AX ; REGISTOR SAVE 003B PUNCH00: 003B 8A C1 MOV AL,CL ; SET SEND CHARACTOR 003D B4 01 MOV AH,01H ; SET FNC.CODE (SEND CHARA) 003F E8 007C R CALL RS232_IO ; RS232C I/O ROUTINE 0042 F6 C4 80 TEST AH,80H ;-----------------------------------------------------AUG/19/83-------- IF TOKYO EQ FALSE JZ PUNCH10 ; IF NOT TIME OUT CALL CONST ; KEYIN CHECK OR AL,AL JZ PUNCH00 ; IF NOT KEYIN ENDIF ;--------------------------------------------------------------------- 0045 PUNCH10: 0045 58 POP AX ; REGISTOR RESTORE 0046 C3 RET  The Microsoft MACRO Assembler , Version 1.25 Page 1-5 RS232CIO 01-31-84 ; ;********************************************************************** ;* * ;* READER (auxiliary device read) * ;* * ;* INPUT CH = DEVICE SELECT; 0 = STD, 1 = H14 * ;* OUTPUT AL = RECV CHARACTOR * ;* * ;********************************************************************** 0047 00 lk_ahead0 db 0 ; look ahead flag, device 0 (std) 0048 00 lk_char0 db 0 ; 1 deep fifo "Q", device 0 (std) 0049 00 lk_ahead1 db 0 ; look ahead flag, device 1 (H14) 004A 00 lk_char1 db 0 ; 1 deep fifo "Q", device 1 (H14) 004B READER: 004B 52 PUSH DX 004C 50 PUSH AX ; REGISTOR SAVE 004D 56 PUSH SI 004E 80 FD 01 cmp ch,1 ; h14? 0051 75 06 jnz selh14 0053 BE 0047 R MOV SI,offset lk_ahead0 0056 EB 04 90 jmp seled 0059 selh14: 0059 BE 0049 R  mov si,offset lk_ahead1 005C seled: ;****** 4/8/83 ***** effect 1 character fifo to permit nondes. read *** 005C 80 3C 00 cmp byte ptr [si],0 ; anything in look ahead "q"? 005F 74 0B jz reader00 0061 8A 54 01 mov dl,byte ptr [si+1] ; yes, return it 0064 C6 04 00 mov byte ptr [si],0 ; and clear flag 0067 3A C0 cmp al,al ; set zero bit as status OK 0069 EB 0B 90 jmp reader10 ;****** 4/8/83 ******************************************************** 006C READER00: 006C B4 02 MOV AH,02H ; SET FNC.CODE (RECV CHARA) 006E E8 007C R CALL RS232_IO ; RS232C I/O ROUTINE 0071 8A D0 MOV DL,AL ; SAVE RECV CHARACTOR 0073 F6 C4 80 TEST AH,80H ;-----------------------------------------------------AUG/19/83---- IF TOKYO EQ FALSE JZ READER10 ; IF NOT TIME OUT CALL CONST ; KEYIN CHECK OR AL,AL JZ READER00 ; IF NOT KEYIN ENDIF ;-------------------------------------------------------------------- 0076 READER10: 0076 5E POP SI  The Microsoft MACRO Assembler , Version 1.25 Page 1-6 RS232CIO 01-31-84 0077 58 POP AX 0078 8A C2 MOV AL,DL ; RESTORE RECV CHARACTOR 007A 5A POP DX ; REGISTOR RESTORE 007B C3 RET ; ; vector to appropriate routine ; 007C RS232_IO: 007C 53 PUSH BX ; REGISTOR SAVE 007D 51 PUSH CX 007E 52 PUSH DX 007F 0A E4 OR AH,AH 0081 75 03 JNZ TRYSEND 0083 EB 1D 90 JMP RSIN00 ; IF AH=0 (INITIALIZE) 0086 TRYSEND: 0086 80 FC 01 CMP AH,01H 0089 75 03 JNZ TRYREC 008B E9 0115 R JMP RSSN00 ; IF AH=1 (SEND CHARACTOR) 008E TRYREC: 008E 80 FC 02 CMP AH,02H 0091 75 03 JNZ RS232_00 0093 E9 0163 R JMP RSRV00 ; IF AH=2 (RECV CHARACTOR) 0096 RS232_00: 0096 80 FC 03 CMP AH,03H 0099 75 03 JNZ RS232_RET 009B E9 0197 R JMP RSSR00 ; IF AH=3 (STATUS READ) 009E RS232_RET: 009E 5A POP DX ; REGISTOR RESTORE 009F 59 POP CX 00A0 5B POP BX 00A1 C3 RET ; ; initialize communications port ; 00A2 RSIN00: 00A2 50 push ax 00A3 8A D0 mov dl,al ; save mode byte 00A5 52 push dx ; save parms 00A6 B0 07 MOV AL,07H 00A8 BA 0034 mov dx,rsmk 00AB 02 D5 add dl,ch ; select port 00AD EE OUT dx,AL ; MASK SET (INTERRUPT NOT USE) 00AE 51 push cx 00AF B9 0003 mov cx,3 00B2 nexdum: ; 00B2 B0 00 MOV AL,00H ; send three dummy 00 command bytes 00B4 BA 0032 mov dx,rsim ; as per 8251 ddata sheets 00B7 02 D5 add dl,ch ; loop logic provides delay for 5mhz 00B9 EE OUT dx,AL ; DUMMY MODE SET  00BA E2 F6 loop nexdum 00BC 59 pop cx 00BD B0 40 MOV AL,40H 00BF BA 0032 mov dx,rsic  The Microsoft MACRO Assembler , Version 1.25 Page 1-7 RS232CIO 01-31-84 00C2 02 D5 add dl,ch 00C4 EE OUT dx,AL ; COMMUNICATION PORT RESET 00C5 80 FD 00 cmp ch,0 00C8 75 07 jnz h14_01 00CA B0 76 MOV AL,76H 00CC E6 2F OUT RSCM,AL ; COUNTER MODE SET 00CE EB 05 90 jmp h14_cc01 00D1 h14_01: 00D1 B0 36 mov al,36h ; counter 0 00D3 E6 67 out rscmh14,al 00D5 h14_cc01: 00D5 5A pop dx 00D6 52 push dx 00D7 8A DE MOV BL,DH ; SET INIT PARM 00D9 D0 E3 SHL BL,1 00DB 81 E3 001E AND BX,001EH 00DF 8B 87 0004 R MOV AX,OFFSET BAUD_TBL[BX] ; READ BAUD RATE SET DATA 00E3 80 FD 00 cmp ch,0 00E6 75 09 jnz h14_02 00E8 E6 2B OUT RSCS,AL ; COUNTER (LOW) SET 00EA 8A C4 mov al,ah 00EC E6 2B out rscs,al ; counter (high) 00EE EB 07 90 jmp h14_cc02 00F1 h14_02: 00F1 E6 61 out rscsh14,al ; counter low 00F3 8A C4 mov al,ah 00F5 E6 61 out rscsh14,al ; counter (high) 00F7 h14_cc02: 00F7 5A pop dx 00F8 8A C2 MOV AL,dl ; SET INIT PARM 00FA BA 0032 mov dx,rsim 00FD 02 D5 add dl,ch 00FF EE OUT dx,AL ; COMMUNICATION PORT MODE SET 0100 B0 07 MOV AL,07H 0102 BA 0032 mov dx,rsic 0105 02 D5 add dl,ch 0107 EE OUT dx,AL ; MODEM ER ON 0108 2A C0 SUB AL,AL 010A BA 0036 mov dx,rsws 010D 02 D5 add dl,ch 010F EE OUT dx,AL ; RESET TDC 0110 8B C1 MOV AX,CX ; REGISTOR RESTORE 0112 58 pop ax 0113 EB 89 JMP RS232_RET ; ; send character ; 0115 RSSN00: 0115 50 PUSH AX 0116 B0 27 MOV AL,27H 0118 BA 0032 mov dx,rsic 011B 02 D5 add dl,ch 011D EE OUT dx,AL ; MODEM RS,ER ON  The Microsoft MACRO Assembler , Version 1.25 Page 1-8 RS232CIO 01-31-84 011E 8B D9 mov bx,cx ; get select to bx 0120 2B C9 SUB CX,CX ; INIT TIME OUT COUNTER 0122 RSSN10: 0122 BA 0032 mov dx,rsis 0125 02 D7 add dl,bh 0127 EC IN AL,dx ; READ STATUS 0128 A8 80 TEST AL,80H 012A 75 04 JNZ RSSN20 ; IF DR IS ON 012C E2 F4 LOOP RSSN10 ; WAIT DR 012E EB 1A JMP SHORT RSSN30 0130 RSSN20: 0130 BA 0034 mov dx,rsrs 0133 02 D7 add dl,bh 0135 EC IN AL,dx ; READ SIGNAL 0136 A8 04 TEST AL,04H ; 0138 75 04 JNZ RSSN25 ; IF CS IS ON 013A E2 F4 LOOP RSSN20 013C EB 0C JMP SHORT RSSN30 ; 013E RSSN25: 013E BA 0032 mov dx,rsis 0141 02 D7 add dl,bh 0143 EC IN AL,dx ; READ STATUS 0144 A8 05 TEST AL,05H 0146 75 09 JNZ RSSN40 ; IF TRNSMITTER READY (CS IS ON) 0148 E2 D8 LOOP RSSN10 ; WAIT SEND 014A RSSN30: 014A 0C 80 OR AL,80H ; SET TIME OUT 014C 8A D0 MOV DL,AL ; STATUS SAVE 014E 58 POP AX 014F EB 0D JMP SHORT RSSN50 0151 RSSN40: 0151 24 7F AND AL,7FH ; CLR TIME OUT 0153 8A D0 MOV DL,AL ; STATUS SAVE 0155 58 POP AX 0156 52 push dx 0157 BA 0030 mov dx,rsiw 015A 02 D7 add dl,bh 015C EE OUT dx,AL ; SEND CHARACTOR 015D 5A pop dx 015E RSSN50: 015E 8A E2 MOV AH,DL ; STATUS RESTORE 0160 E9 009E R JMP RS232_RET ; ; recieve character ; 0163 RSRV00: 0163 B0 07 MOV AL,07H 0165 BA 0032 mov dx,rsic 0168 02 D5 add dl,ch 016A EE OUT dx,AL ; MODEM ER ON 016B 8B D9 mov bx,cx ; save device select to bx 016D 2B C9 SUB CX,CX ; INIT TIME OUT COUNTER 016F RSRV10:  The Microsoft MACRO Assembler , Version 1.25 Page 1-9 RS232CIO 01-31-84 016F BA 0032 mov dx,rsis 0172 02 D7 add dl,bh 0174 EC IN AL,dx ; RESD STATUS 0175 A8 80 TEST AL,80H 0177 75 02 JNZ RSRV20 ; IF DR IS ON 0179 E2 F4 LOOP RSRV10 ; WAIT DR 017B RSRV20: 017B A8 02 TEST AL,02H 017D 75 0B JNZ RSRV40 ; IF RECEIVER READY 017F E2 EE LOOP RSRV10 ; WAIT RECV 0181 RSRV30: 0181 0C 80 OR AL,80H ; SET TIME OUT 0183 8A E0 MOV AH,AL 0185 2A C0 SUB AL,AL 0187 E9 009E R JMP RS232_RET 018A RSRV40: 018A 24 7F AND AL,7FH ; CLR TIME OUT 018C 8A E0 MOV AH,AL 018E BA 0030 mov dx,rsir 0191 02 D7 add dl,bh 0193 EC IN AL,dx ; RECV CHARACTOR 0194 E9 009E R JMP RS232_RET ; ; read status ; 0197  RSSR00: ; SUB DL,DL 0197 BA 0032 mov dx,rsis 019A 02 D5 add dl,ch 019C EC IN AL,dx ; READ STATUS ; TEST AL,80H ; JNZ RSSR10 ; IF DR IS ON ; MOV DL,80H 019D RSSR10: 019D 8A E0 MOV AH,AL 019F BA 0034 mov dx,rsrs 01A2 02 D5 add dl,ch 01A4 EC IN AL,dx ; READ MODEM SIGNAL 01A5 0C 00 OR AL,0 01A7 E9 009E R JMP RS232_RET ; ; aux_clr - std rs232 port ; ; clear input buffer clear ; no input fifo (of depth > 1) currently implemented ; 01AA aux_flush: 01AA C6 06 0047 R 00 mov lk_ahead0,0 ; anything in the look ahead q? 01AF E4 30 in al,30h ; clear reciever register in usart 01B1 E9 0000 E jmp exit ; back to the DOS ;  The Microsoft MACRO Assembler , Version 1.25 Page 1-10 RS232CIO 01-31-84 ; aux read status ; 01B4 aux_rdsts: 01B4 80 3E 0047 R 00 cmp lk_ahead0,0 ; anything in the look ahead? 01B9 75 0F jnz have1 ; 01BB B4 03 mov ah,3 ; status read command 01BD B5 00 mov ch,0 ; select std port 01BF E8 007C R call rs232_io ; anything new in usart rec buffer? 01C2 F6 C4 02 test ah,02h ; receiver ready? 01C5 75 03 jnz have1 01C7 E9 0000 E jmp busy_exit ; if so, leave with "busy" status 01CA have1: 01CA E9 0000 E jmp exit ; ; ; aux_read ; ; read aux device (rs232) ; 01CD aux_read: 01CD B7 00 mov bh,0 ; switch for standard rs232 port 01CF aux_rdcom: 01CF 51 push cx ; save original transfer count 01D0 E3 38 jcxz aux_rdex ; check for length 0 request 01D2 aux_rd1: 01D2 F7 C7 000F test di,0fh ; are we on paragraph boundry? 01D6 74 13 jz aux_rdadj ; if so, go adjust for zero rel segment 01D8 06 push es 01D9 51 push cx 01DA 8A EF mov ch,bh 01DC 9A 0000 ---- E call msreader ; get a char from comms 01E1 59 pop cx 01E2 07 pop es 01E3 75 29 jnz aux_errex ; error exit if zero not set 01E5 AA stosb ; put character at transfer address 01E6 E2 EA loop aux_rd1 ; go back for next char 01E8 EB 20 90 jmp aux_rdex ; or leave normal exit if req. complete 01EB aux_rdadj: 01EB 51 push cx ; 01EC B1 04 mov cl,4 ; (for rotate) 01EE D3 EF shr di,cl ; convert destination to paragraph 01F0 8C C1 mov cx,es ; add to current segment 01F2 03 CF add cx,di ; 01F4 8E C1 mov es,cx ; new transfer segment 01F6 59 pop cx ; restore loop count 01F7 BF 0000 mov di,0 ; start at offset 0 in new segment 01FA aux_rd2: 01FA 06 push es 01FB 51 push cx 01FC 8A EF mov ch,bh ; select port 01FE 9A 0000 ---- E call msreader ; get the next char 0203 59 pop cx  The Microsoft MACRO Assembler , Version 1.25 Page 1-11 RS232CIO 01-31-84 0204 07 pop es 0205 75 07 jnz aux_errex ; always check for error cond 0207 AA stosb ; character to xfer buffer 0208 E2 F0 loop aux_rd2 ; go back if not complete 020A aux_rdex: 020A 59 pop cx ; transferred all request 020B E9 0000 E jmp exit ; back to system 020E aux_errex: 020E 5A pop dx ; original request length 020F 2B D1 sub dx,cx ; minus number remaining 0211 2E: C5 1E 0000 E lds bx,cs:[ptrsav] ; is number transferred 0216 89 57 12 mov [bx.count],dx ; (put transfer count) 0219 B0 02 mov al,2 ; device went not ready 021B E9 0000 E jmp err_exit ; error exit to DOS ; ; aux_writ ; ; write aux device (rs232) ; 021E aux_writ: 021E B7 00 mov bh,0 ; set switch for std rs232 port 0220 aux_wrcom: 0220 E3 38 jcxz aux_wrex ; zero length transfer? 0222 8B F7 mov si,di ; set up xfer pointers if not 0224 aux_wr1: 0224 F7 C6 000F test si,0fh ; on paragraph boundry? 0228 74 12 jz aux_wradj ; go adjust segment if so 022A 26: AC lods byte ptr es:[si] ; other wise get byte to write 022C 51 push cx 022D 8A EF mov ch,bh ; select port 022F 9A 0000 ---- E call mspunch ; go send it 0234 59 pop cx ;-----------------------------------------------------AUG/19/83----- IF TOKYO EQ TURE 0235 75 D7 JNZ AUX_ERREX ENDIF ;------------------------------------------------------------------- 0237 E2 EB loop aux_wr1 ; go for another if not completed 0239 EB 1F 90 jmp aux_wrex 023C aux_wradj: 023C 51 push cx 023D B1 04 mov cl,4 ; for shift 023F D3 EE shr si,cl ; adjust to segment boundry 0241 8C C1 mov cx,es ; 0243 03 CE add cx,si 0245 8E C1 mov es,cx ; new adjusted transfer segment 0247 59 pop cx 0248 BE 0000 mov si,0 ; start at offset 0 within new seg 024B aux_wr2: 024B 26: AC lods byte ptr es:[si] ; get next byte 024D 51 push cx 024E 8A EF mov ch,bh ; select port 0250 9A 0000 ---- E call mspunch ; send it  The Microsoft MACRO Assembler , Version 1.25 Page 1-12 RS232CIO 01-31-84 0255 59 pop cx ;-------------------------------------------------------AUG/19/83----- IF TOKYO EQ TURE 0256 75 B6 JNZ AUX_ERREX ENDIF ;--------------------------------------------------------------------- 0258 E2 F1 loop aux_wr2 ; and back for another if done 025A aux_wrex: 025A E9 0000 E jmp exit ; normal exit ; ; aux_wrst ; ; return aux device (rs232) status ; 025D aux_wrst: 025D B5 00 mov ch,0 ; set port switch to std 025F aux_stcom: 025F B4 03 mov ah,03h ; "get status" command to i/f routine 0261 E8 007C R call rs232_io 0264 F6 C4 01 test ah,01h ; read character ready? 0267 74 03 jz notrdy ; not if bit is off 0269 E9 0000 E jmp exit ; shure enough 026C notrdy: 026C E9 0000 E jmp busy_exit ; no character ready ; ; aux_rdnd ; ; read aux device (rs232) non-destructively ; 026F aux_rdnd: 026F B5 00 mov ch,0 ; set port select switch to std 0271 A0 0048 R mov al,lk_char0 ; anything in look ahead? 0274 80 3E 0047 R 00 cmp lk_ahead0,0 ; 0279 75 0F jnz re_read ; if so, just return it 027B B4 03 mov ah,03h ; otherwise, look at status 027D E8 007C R call rs232_io ; 0280 F6 C4 02 test ah,02h ; anybody there? 0283 74 1A jz busy1 ; "busy" exit if not 0285 B4 02 mov ah,02h ; we've got one 0287 E8 007C R call rs232_io ; read it 028A re_read: 028A 2E: C5 1E 0000 E lds bx,cs:[ptrsav] ; get pointer to request packet 028F 88 47 0D mov [bx.lk_ret],al ; return the character 0292 0E push cs 0293 1F pop ds ; get ds back where it belongs 0294 A2 0048 R mov lk_char0,al ; put new char in look_ahead 0297 C6 06 0047 R FF mov lk_ahead0,0ffh ; flag something in look ahead 029C E9 0000 E jmp exit ; and normal exit 029F E9 0000 E busy1: jmp busy_exit ; ; aux_clr - h14  The Microsoft MACRO Assembler , Version 1.25 Page 1-13 RS232CIO 01-31-84 ; ; clear input buffer clear ; no input fifo (of depth > 1) currently implemented ; 02A2 aux2_flush: 02A2 C6 06 0049 R 00 mov lk_ahead1,0 ; anything in the look ahead q? 02A7 E4 31 in al,31h ; clear reciever register in usart 02A9 E9 0000 E jmp exit ; back to the DOS ; ; aux read status - h14 ; 02AC aux2_rdsts: 02AC 80 3E 0049 R 00 cmp lk_ahead1,0 ; anything in the look ahead? 02B1 75 0F jnz have1_1 ; 02B3 B4 03 mov ah,3 ; status read command 02B5 B5 01 mov ch,1 ; select h14 02B7 E8 007C R call rs232_io ; anything new in usart rec buffer? 02BA F6 C4 02 test ah,02h ; receiver ready? 02BD 75 03 jnz have1_1 02BF E9 0000 E jmp busy_exit ; if so, leave with "busy" status 02C2 have1_1: 02C2 E9 0000 E jmp exit ; ; aux_read - h14 ; ; read aux device (rs232) ; 02C5 aux2_read: 02C5 B7 01 mov bh,1 ; set port select switch to h14  02C7 E9 01CF R jmp aux_rdcom ; ; aux_writ ; ; write aux device (rs232) ; 02CA aux2_writ: 02CA B7 01 mov bh,1 ; set port select switch to h14 02CC E9 0220 R jmp aux_wrcom ; ; aux_wrst - h14 ; ; return aux device (rs232) status ; 02CF aux2_wrst: 02CF B7 01 mov bh,1 ; set devioce select switch to h14 02D1 EB 8C jmp aux_stcom ; ; aux_rdnd - h14 ; ; read aux device (rs232) non-destructively  The Microsoft MACRO Assembler , Version 1.25 Page 1-14 RS232CIO 01-31-84 ; 02D3 aux2_rdnd: 02D3 B5 01 mov ch,1 ; set port select to h14 02D5 A0 004A R mov al,lk_char1 ; anything in look ahead? 02D8 80 3E 0049 R 00 cmp lk_ahead1,0 ; 02DD 75 0F jnz re_read_1 ; if so, just return it 02DF B4 03 mov ah,03h  ; otherwise, look at status 02E1 E8 007C R call rs232_io ; 02E4 F6 C4 02 test ah,02h ; anybody there? 02E7 74 B6 jz busy1 ; "busy" exit if not 02E9 B4 02 mov ah,02h ; we've got one 02EB E8 007C R call rs232_io ; read it 02EE re_read_1: 02EE 2E: C5 1E 0000 E lds bx,cs:[ptrsav] ; get pointer to request packet 02F3 88 47 0D mov [bx.lk_ret],al ; return the character 02F6 0E push cs 02F7 1F pop ds ; get ds back where it belongs 02F8 A2 004A R mov lk_char1,al ; put new char in look_ahead 02FB C6 06 0049 R FF mov lk_ahead1,0ffh ; flag something in look ahead 0300 E9 0000 E jmp exit ; and normal exit 0303 CODE ENDS END  The Microsoft MACRO Assembler , Version 1.25 Page Symbols-1 RS232CIO 01-31-84 Structures and records: N a m e Width # fields Shift Width Mask Initial IOPACK . . . . . . . . . . . . . 0014 0004 LK_RET . . . . . . . . . . . . . 000D TRANS. . . . . . . . . . . . . . 000E COUNT. . . . . . . . . . . . . . 0012 Segments and groups: N a m e Size align combine class CODE . . . . . . . . . . . . . . 0303 PARA PUBLIC 'CODE' Symbols: N a m e Type Value Attr AUX2_FLUSH . . . . . . . . . . . L NEAR 02A2 CODE Global AUX2_RDND. . . . . . . . . . . . L NEAR 02D3 CODE Global AUX2_RDSTS . . . . . . . . . . . L NEAR 02AC CODE Global AUX2_READ. . . . . . . . . . . . L NEAR 02C5 CODE Global AUX2_WRIT. . . . . . . . . . . . L NEAR 02CA CODE Global AUX2_WRST. . . . . . . . . . . . L NEAR 02CF CODE Global AUX_ERREX. . . . . . . . . . . . L NEAR 020E CODE AUX_FLUSH. . . . . . . . . . . . L NEAR 01AA CODE Global AUX_RD1. . . . . . . . . . . . . L NEAR 01D2 CODE AUX_RD2. . . . . . . . . . . . . L NEAR 01FA CODE AUX_RDADJ. . . . . . . . . . . . L NEAR 01EB CODE AUX_RDCOM. . . . . . . . . . . . L NEAR 01CF CODE AUX_RDEX . . . . . . . . . . . . L NEAR 020A CODE AUX_RDND . . . . . . . . . . . . L NEAR 026F CODE Global AUX_RDSTS. . . . . . . . . . . . L NEAR 01B4 CODE Global AUX_READ . . . . . . . . . . . . L NEAR 01CD CODE Global AUX_STCOM. . . . . . . . . . . . L NEAR 025F CODE AUX_WR1. . . . . . . . . . . . . L NEAR 0224 CODE AUX_WR2. . . . . . . . . . . . . L NEAR 024B CODE AUX_WRADJ. . . . . . . . . . . . L NEAR 023C CODE AUX_WRCOM. . . . . . . . . . . . L NEAR 0220 CODE AUX_WREX . . . . . . . . . . . . L NEAR 025A CODE AUX_WRIT . . . . . . . . . . . . L NEAR 021E CODE Global AUX_WRST . . . . . . . . . . . . L NEAR 025D CODE Global BAUD_TBL . . . . . . . . . . . . L WORD 0004 CODE BUSY1. . . . . . . . . . . . . . L NEAR 029F CODE BUSY_EXIT. . . . . . . . . . . . L NEAR 0000 CODE External CONST. . . . . . . . . . . . . . L NEAR 0000 CODE External DO_RSINIT. . . . . . . . . . . . L NEAR 0036 CODE ERR_EXIT . . . . . . . . . . . . L NEAR 0000 CODE External EXIT . . . . . . . . . . . . . . L NEAR 0000 CODE External FALSE. . . . . . . . . . . . . . Number 0000 H14BAUD. . . . . . . . . . . . . L BYTE 0002 CODE H14MODE. . . . . . . . . . . . . L BYTE 0003 CODE  The Microsoft MACRO Assembler , Version 1.25 Page Symbols-2 RS232CIO 01-31-84 H14_01 . . . . . . . . . . . . . L NEAR 00D1 CODE H14_02 . . . . . . . . . . . . . L NEAR 00F1 CODE H14_CC01 . . . . . . . . . . . . L NEAR 00D5 CODE H14_CC02 . . . . . . . . . . . . L NEAR 00F7 CODE HAVE1. . . . . . . . . . . . . . L NEAR 01CA CODE HAVE1_1. . . . . . . . . . . . . L NEAR 02C2 CODE INITH14. . . . . . . . . . . . . L NEAR 002E CODE INT_DX . . . . . . . . . . . . . V WORD 0000 CODE External LK_AHEAD0. . . . . . . . . . . . L BYTE 0047 CODE LK_AHEAD1. . . . . . . . . . . . L BYTE 0049 CODE LK_CHAR0 . . . . . . . . . . . . L BYTE 0048 CODE LK_CHAR1 . . . . . . . . . . . . L BYTE 004A CODE MSCONOUT . . . . . . . . . . . . L FAR 0000 CODE External MSPUNCH. . . . . . . . . . . . . L FAR 0000 CODE External MSREADER . . . . . . . . . . . . L FAR 0000 CODE External NEXDUM . . . . . . . . . . . . . L NEAR 00B2 CODE NOTRDY . . . . . . . . . . . . . L NEAR 026C CODE PTRSAV . . . . . . . . . . . . . V DWORD 0000 CODE External PUNCH. . . . . . . . . . . . . . L NEAR 003A CODE Global PUNCH00. . . . . . . . . . . . . L NEAR 003B CODE PUNCH10. . . . . . . . . . . . . L NEAR 0045 CODE READER . . . . . . . . . . . . . L NEAR 004B CODE Global READER00 . . . . . . . . . . . . L NEAR 006C CODE READER10 . . . . . . . . . . . . L NEAR 0076 CODE REGPRNT. . . . . . . . . . . . . L FAR 0000 CODE External RE_READ. . . . . . . . . . . . . L NEAR 028A CODE RE_READ_1. . . . . . . . . . . . L NEAR 02EE CODE RS232INIT. . . . . . . . . . . . L NEAR 0016 CODE Global RS232PARMS . . . . . . . . . . . L NEAR 0000 CODE Global RS232_00 . . . . . . . . . . . . L NEAR 0096 CODE RS232_IO . . . . . . . . . . . . L NEAR 007C CODE RS232_RET. . . . . . . . . . . . L NEAR 009E CODE RSCM . . . . . . . . . . . . . . Number 002F RSCMH14. . . . . . . . . . . . . Number 0067 RSCS . . . . . . . . . . . . . . Number 002B RSCSH14. . . . . . . . . . . . . Number 0061 RSIC . . . . . . . . . . . . . . Number 0032 RSIM . . . . . . . . . . . . . . Number 0032 RSIN00 . . . . . . . . . . . . . L NEAR 00A2 CODE RSIR . . . . . . . . . . . . . . Number 0030 RSIS . . . . . . . . . . . . . . Number 0032 RSIW . . . . . . . . . . . . . . Number 0030 RSMK . . . . . . . . . . . . . . Number 0034 RSRS . . . . . . . . . . . . . . Number 0034 RSRV00 . . . . . . . . . . . . . L NEAR 0163 CODE RSRV10 . . . . . . . . . . . . . L NEAR 016F CODE RSRV20 . . . . . . . . . . . . . L NEAR 017B CODE RSRV30 . . . . . . . . . . . . . L NEAR 0181 CODE RSRV40 . . . . . . . . . . . . . L NEAR 018A CODE RSSN00 . . . . . . . . . . . . . L NEAR 0115 CODE RSSN10 . . . . . . . . . . . . . L NEAR 0122 CODE RSSN20 . . . . . . . . . . . . . L NEAR 0130 CODE RSSN25 . . . . . . . . . . . . . L NEAR 013E CODE  The Microsoft MACRO Assembler , Version 1.25 Page Symbols-3 RS232CIO 01-31-84 RSSN30 . . . . . . . . . . . . . L NEAR 014A CODE RSSN40 . . . . . . . . . . . . . L NEAR 0151 CODE RSSN50 . . . . . . . . . . . . . L NEAR 015E CODE RSSR00 . . . . . . . . . . . . . L NEAR 0197 CODE RSSR10 . . . . . . . . . . . . . L NEAR 019D CODE RSWS . . . . . . . . . . . . . . Number 0036 SELED. . . . . . . . . . . . . . L NEAR 005C CODE SELH14 . . . . . . . . . . . . . L NEAR 0059 CODE STDBAUD. . . . . . . . . . . . . L BYTE 0000 CODE STDMODE. . . . . . . . . . . . . L BYTE 0001 CODE TOKYO. . . . . . . . . . . . . . Number - 0001 TRYREC . . . . . . . . . . . . . L NEAR 008E CODE TRYSEND. . . . . . . . . . . . . L NEAR 0086 CODE TURE . . . . . . . . . . . . . . Number - 0001 Warning Severe Errors Errors 0 0   The Microsoft MACRO Assembler , Version 1.25 Page 1-1 MSCONST 01-31-84 title MSCONST page 58,132 ;----------------------------------------------------------------------------- ; ; MS-DOS BIOS for the N.E.C. Advanced Personal Computer ; ; module name: MSCONST ; MS-DOS version: 2.0 ; module version: 1.0 ; ; abstract: This module contains intermediate routines which translate ; some parameters and save registers. (see rev history) ; ; contains routines: ; msconst msconout msconin mslistout msreader mspunch ; ; revision history: ; This routine is a vestage of the conversion of the CP/M BIOS into ; an MS-DOS IO system. The routines are used as intermediaries between ; the device driver routines and the DOS interface routines. ; RMG 6-14-83 ; ;----------------------------------------------------------------------------- 0000 CODE SEGMENT PUBLIC 'CODE' EXTRN CONST:NEAR,CONIN:NEAR,CONOUT:NEAR EXTRN LISTOUT:NEAR,READER:NEAR,PUNCH:NEAR ;--------------------------------------------------------02/26/1983---- public flushflg ;---------------------------------------------------------------------- PUBLIC MSCONST PUBLIC MSCONOUT,MSCONIN PUBLIC MSLISTOUT,MSREADER,MSPUNCH ASSUME CS:CODE,DS:CODE,SS:CODE,ES:CODE 0000 00 chsave db 0 0001 00 chvald db 0 ;----------------------------------------------------------02/26/1983-- 0002 00 flushflg db 0 ;---------------------------------------------------------------------- ; ; const ; 0003 MSCONST PROC FAR ; 0003 80 3E 0002 R 00 cmp flushflg,0 0008 74 05 jz nextcon 000A C6 06 0001 R 00 mov chvald,0 000F nextcon: 000F C6 06 0002 R 00 mov flushflg,0 0014 A0 0000 R mov al,chsave  The Microsoft MACRO Assembler , Version 1.25 Page 1-2 MSCONST 01-31-84 0017 80 3E 0001 R 00 cmp chvald,0 001C 75 16 jnz mscon1 001E E8 0000 E call const 0021 84 C0 test al,al 0023 A0 0000 R mov al,chsave 0026 74 0C jz mscon1 0028 9A 0035 ---- R call far ptr msconin 002D C6 06 0001 R 01 mov chvald,1 0032 0A C0 or al,al 0034 mscon1: 0034 CB ret 0035 MSCONST ENDP ; ; conin ; 0035 MSCONIN PROC FAR 0035 80 3E 0001 R 00 cmp chvald,0 003A C6 06 0001 R 00 mov chvald,0 003F 74 05 jz msconi1 0041 A0 0000 R mov al,chsave 0044 EB 0C jmp short msconin1 0046 msconi1: 0046 51 push cx 0047 57 push di 0048 06 push es 0049 E8 0000 E call conin 004C A2 0000 R mov chsave,al 004F 07 pop es 0050 5F pop di 0051 59 pop cx 0052 msconin1: 0052 CB ret 0053 MSCONIN ENDP ; ; conout ; 0053 MSCONOUT PROC FAR 0053 51 push cx 0054 56 push si 0055 06 push es 0056 8C CA mov dx,cs 0058 8E DA mov ds,dx 005A 8A C8 mov cl,al ; cp/m pass the char by cl 005C E8 0000 E call conout 005F 07 pop es 0060 5E pop si 0061 59 pop cx 0062 CB ret 0063 MSCONOUT ENDP  The Microsoft MACRO Assembler , Version 1.25 Page 1-3 MSCONST 01-31-84 ; ;list out ; 0063 MSLISTOUT PROC FAR 0063 53 push bx 0064 06 push es 0065 8A C8 mov cl,al 0067 E8 0000 E call listout 006A 07 pop es 006B 5B pop bx 006C CB ret 006D MSLISTOUT ENDP ; ;punch ; 006D MSPUNCH PROC FAR 006D 51 push cx 006E 56 push si 006F 06 push es 0070 8A C8 mov cl,al 0072 E8 0000 E call punch 0075 07 pop es 0076 5E pop si 0077 59 pop cx 0078 CB ret 0079 MSPUNCH ENDP 0079 MSREADER PROC FAR 0079 51 push cx 007A 57 push di 007B 1E push ds 007C E8 0000 E call reader 007F 1F pop ds 0080 5F pop di 0081 59 pop cx 0082 CB ret 0083 MSREADER ENDP 0083 CODE ENDS END  The Microsoft MACRO Assembler , Version 1.25 Page Symbols-1 MSCONST 01-31-84 Segments and groups: N a m e Size align combine class CODE . . . . . . . . . . . . . . 0083 PARA PUBLIC 'CODE' Symbols: N a m e Type Value Attr CHSAVE . . . . . . . . . . . . . L BYTE 0000 CODE CHVALD . . . . . . . . . . . . . L BYTE 0001 CODE CONIN. . . . . . . . . . . . . . L NEAR 0000 CODE External CONOUT . . . . . . . . . . . . . L NEAR 0000 CODE External CONST. . . . . . . . . . . . . . L NEAR 0000 CODE External FLUSHFLG . . . . . . . . . . . . L BYTE 0002 CODE Global LISTOUT. . . . . . . . . . . . . L NEAR 0000 CODE External MSCON1 . . . . . . . . . . . . . L NEAR 0034 CODE MSCONI1. . . . . . . . . . . . . L NEAR 0046 CODE MSCONIN. . . . . . . . . . . . . F PROC 0035 CODE Global Length =001E MSCONIN1 . . . . . . . . . . . . L NEAR 0052 CODE MSCONOUT . . . . . . . . . . . . F PROC 0053 CODE Global Length =0010 MSCONST. . . . . . . . . . . . . F PROC 0003 CODE Global Length =0032 MSLISTOUT. . . . . . . . . . . . F PROC 0063 CODE Global Length =000A MSPUNCH. . . . . . . . . . . . . F PROC 006D CODE Global Length =000C MSREADER . . . . . . . . . . . . F PROC 0079 CODE Global Length =000A NEXTCON. . . . . . . . . . . . . L NEAR 000F CODE PUNCH. . . . . . . . . . . . . . L NEAR 0000 CODE External READER . . . . . . . . . . . . . L NEAR 0000 CODE External Warning Severe Errors Errors 0 0 84 TOP_CODE . . . . . . . . . . . . L WORD 0033 CODE TRANSFER . . . . . . . . . . . . L NEAR 02A3 CODE TRANSFER00 . . . . . . . . . . . L NEAR 02A6 CODE TRANSFER01 . . . . . . . . . . . L NEAR 02B4 CODE TRNCNT . . . . . . . . . . . . . L WORD 0003 CODE TRY_AGAIN. . . . . . . . . . . . L NEAR 02CE CODE U_AUXCGTBL . . . . . . . . . . . V BYTE 0000 CODE External U_CGEND. . . . . . . . . . . . . L NEAR 00DE CODE WAIT_READY_FOR_DATA. . . . . . . L NEAR 00E8 CODE WORKSI . . . . . . . . . . . . . V BYTE 0000 CODE External WORKSO . . . . . . . . . . . . . V BYTE 0000 CODE External Warning Severe Errors Errors 0 0   The Microsoft MACRO Assembler , Version 1.25 Page 1-1 APO 01-31-84 title APO page 58,132 ;----------------------------------------------------------------------------- ; ; MS-DOS BIOS for the N.E.C. Advanced Personal Computer ; ; module name: APO ; MS-DOS version: 2.0 ; module version: 1.0 ; ; abstract: This module contains the routine which ; performs an auto power down ; ; contains routines: ; apo ; ; revision history: ; ; This routine is an unmodified version of the NEC/Tokyo MS-DOS V1.25 ; io system apo. ; - RMG 6-7-83 ; ;----------------------------------------------------------------------------- 0000 CODE SEGMENT PUBLIC 'CODE' PUBLIC APO ASSUME CS:CODE,DS:CODE,SS:CODE,ES:CODE ;********************************************************************** ;* APO (AUTO POWER OFF) * ;********************************************************************** ; OUTPUT PORT # = 5BH , AL = 1 (POWER OFF) ; 0 (DO NOTHING) 0000 APO: 0000 B9 01F4 MOV CX,500 ; 5 SEC WAIT COUNT 0003 51 APO010: PUSH CX 0004 B9 0C00 MOV CX,0C00H ; 10 MS WAIT COUNT 0007 E2 FE LOOP $ 0009 59 POP CX 000A E2 F7 LOOP APO010 ; 000C B0 01 MOV AL,01H 000E E6 5B OUT 5BH,AL ; 0010 CODE ENDS END  The Microsoft MACRO Assembler , Version 1.25 Page Symbols-1 APO 01-31-84 Segments and groups: N a m e Size align combine class CODE . . . . . . . . . . . . . . 0010 PARA PUBLIC 'CODE' Symbols: N a m e Type Value Attr APO. . . . . . . . . . . . . . . L NEAR 0000 CODE Global APO010 . . . . . . . . . . . . . L NEAR 0003 CODE Warning Severe Errors Errors 0 0 CODE KBDTLO80 . . . . . . . . . . . . L NEAR 005C CODE KBLCCV . . . . . . . . . . . . . L NEAR 0000 CODE External KBMOUT . . . . . . . . . . . . . L NEAR 0000 CODE External LA . . . . . . . . . . . . . . . V BYTE 0000 CODE External Warning Severe Errors Errors 0 0 GRAPHICSEXE SRDCPM COM MP%CAT COM zdCIPHER COM wTcRAMDISK SYS |<ASSIGN SYS hd?2DDNECAPCSYS ">-DDNECP2 SYS ) %7DDLA50 SYS `S(3:DDLA100 SYS S(B:DDOKI84 SYS @Z(Q:DDPMVP SYS Z(`:DDANADXMSYS Q(o:DDCITOLRSYS `R(~:DDCNTXM SYS R(:DDDS180 SYS R(:DDFXHR8 SYS S(:DDFXLR7 SYS R(:DDFXLR8 SYS S(:DDHP7470SYS a!0DDIDSM SYS @S(:  The Microsoft MACRO Assembler , Version 1.25 Page 1-1 USCMOS 01-31-84 title USCMOS page 58,132 ;----------------------------------------------------------------------------- ; ; MS-DOS BIOS for the N.E.C. Advanced Personal Computer ; ; module name: USCMOS ; MS-DOS version: 2.0 ; module version: 1.0 ; ; abstract: This module provides access to the APC battery backed cmos. ; ; contains routines: ; rwcmos rcmos wcmos ; ; revision history: ; ; This module was taken from an NEC/Tokyo version for use with MS-DOS ; version 1.25. No modifications have been made to these routines. ; - RMG 6-7-83 ; ;----------------------------------------------------------------------------- 0000 CODE SEGMENT PUBLIC 'CODE' EXTRN INT_DS:WORD EXTRN PSCMSE:NEAR,PSCMSD:NEAR PUBLIC RWCMOS ASSUME CS:CODE,DS:CODE,SS:CODE,ES:CODE ; ;********************************************************************** ;* CMOS R/W USE AREA * ;********************************************************************** = 0E00 CMOSOFF EQU 0E00H ; CMOS AREA OFFSET = A000 CMOSBAS EQU 0A000H ; CMOS AREA BASE ; 0000 00 CMOSFLG DB 0 ; CMOS R/W FUNCTION 0001 CMOSPRM: 0001 0000 PCMOSADDR DW 0 ; R/W CMOS ADDR 0003 0000 PSIZE DW 0 ; R/W CMOS SIZE 0005 0000 PUSROFF DW 0 ; USER BUFFER OFFSET 0007 0000 PUSRBAS DW 0 ; USER BUFFER BASE ;********************************************************************** ;* CMOS READ/WRITE ROUTINE * ;* INPUT CL = 8 (WRITE) * ;* = 9 (READ) * ;* DS,DX = WORD 0 ; CMOS ADDR (0 - 511) * ;* 1 ; SIZE (1 - 512 BYTE) * ;* 2 ; USER BUFFER OFFSET * ;* 3 ; USER BUFFER BASE * ;********************************************************************** 0009 RWCMOS: 0009 88 0E 0000 R MOV CMOSFLG,CL ; SAVE R/W FUNCTION 000D 1E PUSH DS  The Microsoft MACRO Assembler , Version 1.25 Page 1-2 USCMOS 01-31-84 000E 8B F2 MOV SI,DX 0010 BF 0001 R MOV DI,OFFSET CMOSPRM ; DI = CMOS R/W PARAMETER AREA 0013 8E 1E 0000 E MOV DS,INT_DS 0017 B9 0008 MOV CX,8 001A F3/ A4 REP MOVSB 001C 1F POP DS ; 001D 83 3E 0003 R 00 CMP PSIZE,0 0022 7E 3E JLE RWCMOSRET ; IF INPUT SIZE ERROR 0024 81 3E 0003 R 0200 CMP PSIZE,512 002A 7F 36 JG RWCMOSRET ; IF INPUT SIZE ERROR ; 002C 83 3E 0001 R 00 CMP PCMOSADDR,0 0031 7C 2F JL RWCMOSRET ; IF INPUT CMOS ADDR ERROR 0033 81 3E 0001 R 01FF CMP PCMOSADDR,511 0039 7F 27 JG RWCMOSRET ; IF INPUT CMOS ADDR ERROR ; 003B B8 0200 MOV AX,512 003E 2B 06 0001 R SUB AX,PCMOSADDR ; R/W MAX SIZE 0042 3B 06 0003 R CMP AX,PSIZE 0046 7C 03 JL RWCMOS010 ; IF R/W MAX SIZE < R/W SIZE 0048 A1 0003 R MOV AX,PSIZE 004B RWCMOS010: 004B 8B C8 MOV CX,AX ; 004D E8 0000 E CALL PSCMSE ; CMOS ACCESS ENABLE ; 0050 80 3E 0000 R 08 CMP CMOSFLG,8 0055 74 05 JE RWCMOS020 ; IF CMOS WRITE ; 0057 E8 0063 R CALL RCMOS ; READ CMOS 005A EB 03 JMP SHORT RWCMOS030 ; 005C RWCMOS020: 005C E8 007E R CALL WCMOS ; WRITE CMOS ; 005F RWCMOS030: 005F E8 0000 E CALL PSCMSD ; CMOS ACCESS DISABLE ; 0062 RWCMOSRET: 0062 C3 RET ; ;********************************************************************** ;* READ CMOS MEMORY *  ;********************************************************************** 0063 RCMOS: 0063 1E PUSH DS 0064 06 PUSH ES 0065 BE 0E00 MOV SI,CMOSOFF ; 0068 03 36 0001 R ADD SI,PCMOSADDR ; SI = CMOS READ AREA OFFSET 006C 8B 3E 0005 R MOV DI,PUSROFF ; DI = USER BUFFER OFFSET 0070 8E 06 0007 R MOV ES,PUSRBAS ; ES = USER BUFFER BASE 0074 B8 A000 MOV AX,CMOSBAS ; DS = CMOS AREA BASE  The Microsoft MACRO Assembler , Version 1.25 Page 1-3 USCMOS 01-31-84 0077 8E D8 MOV DS,AX 0079 F3/ A4 REP MOVSB 007B 07 POP ES 007C 1F POP DS 007D C3 RET ; ;********************************************************************** ;* WRITE CMOS MEMORY * ;********************************************************************** 007E WCMOS: 007E 1E PUSH DS 007F 06 PUSH ES 0080 8B 36 0005 R MOV SI,PUSROFF ; SI = USER BUFFER OFFSET 0084 BF 0E00 MOV DI,CMOSOFF ; 0087 03 3E 0001 R ADD DI,PCMOSADDR ; DI = CMOS WRITE OFFSET 008B B8 A000 MOV AX,CMOSBAS ; ES = CMOS BASE 008E 8E C0 MOV ES,AX 0090 8E 1E 0007 R MOV DS,PUSRBAS ; DS = USER BUFFER BASE 0094 F3/ A4 REP MOVSB 0096 07 POP ES 0097 1F POP DS 0098 C3 RET 0099 CODE ENDS END  The Microsoft MACRO Assembler , Version 1.25 Page Symbols-1 USCMOS 01-31-84 Segments and groups: N a m e Size align combine class CODE . . . . . . . . . . . . . . 0099 PARA PUBLIC 'CODE' Symbols: N a m e Type Value Attr CMOSBAS. . . . . . . . . . . . . Number A000 CMOSFLG. . . . . . . . . . . . . L BYTE 0000 CODE CMOSOFF. . . . . . . . . . . . . Number 0E00 CMOSPRM. . . . . . . . . . . . . L NEAR 0001 CODE INT_DS . . . . . . . . . . . . . V WORD 0000 CODE External PCMOSADDR. . . . . . . . . . . . L WORD 0001 CODE PSCMSD . . . . . . . . . . . . . L NEAR 0000 CODE External PSCMSE . . . . . . . . . . . . . L NEAR 0000 CODE External PSIZE. . . . . . . . . . . . . . L WORD 0003 CODE PUSRBAS. . . . . . . . . . . . . L WORD 0007 CODE PUSROFF. . . . . . . . . . . . . L WORD 0005 CODE RCMOS. . . . . . . . . . . . . . L NEAR 0063 CODE RWCMOS . . . . . . . . . . . . . L NEAR 0009 CODE Global RWCMOS010. . . . . . . . . . . . L NEAR 004B CODE RWCMOS020. . . . . . . . . . . . L NEAR 005C CODE RWCMOS030. . . . . . . . . . . . L NEAR 005F CODE RWCMOSRET. . . . . . . . . . . . L NEAR 0062 CODE WCMOS. . . . . . . . . . . . . . L NEAR 007E CODE Warning Severe Errors Errors 0 0 8 bit length and no parity. $unrecognized. $3530. $parallel with 7 bit length and even parity. (Suitable for the 7730 and default spinwriters.) $L!  The Microsoft MACRO Assembler , Version 1.25 Page 1-1 CONOUT 01-31-84 TITLE CONOUT PAGE 58,132 ;----------------------------------------------------------------------------- ; ; MS-DOS BIOS for the N.E.C. Advanced Personal Computer ; ; module name: CONOUT ; MS-DOS version: 2.0 ; module version: 1.0 ; ; abstract: The routines in this module implement the display console ; of the APC by driving the 7720 graphics display ; controller. The APC escape functions are implemented here. ; ; contains routines: ; conout lookup belrtn melout escrtn escnul esccup1 lcchk ; escaltchr escaltset escreset buffclr escansi escansi1 ; escgenprm dtob escsgr esccuu esccud esccuf esccub esced ; escel escmin escchkl escchkh escoff escon clickon clickoff ; cursoron cursoroff keyinon keyinoff vurrtn lfrtn ffrtn bsrtn ; crrtn homertn clrrtn datartn lacaup rollup rolldown kbcharchg ; kblccv lacachng sl1chng kbcsro kbscro kbmout kbcsrd crtclr ; kbcrtc kbcrtc0 kbcsad kbsacv genatbit con_init fastcon ; con_writ con_wrst con_flsh con_rdnd con_rdsts con_read ; ; revision history: ; ; This module originated as the NEC/Tokyo MS-DOS V2.0 release dated ; May 28 1983. The driver interface routines (con_init, fastcon, ; con_writ... ...con_read) were added by NECIS. ; - RMG 6-10-83 ; ; The order of entries in the search tables has been changed so that ; the most commonly used entries are located at the front of the table. ; (Tables CNTTBL, ESCTBL1, ESCANSITBL). ; A range check is now done prior to table lookup for a control ; character. This will be efficient for the usual case where most  ; output characters are displayable codes. ; - RMG 6-10-83 ; ;----------------------------------------------------------------------------- 0000 CODE SEGMENT PUBLIC 'CODE' EXTRN SYSKEYINFLG:BYTE EXTRN GDCBUSYF:BYTE EXTRN KBDTLO:NEAR EXTRN FLAGX:BYTE EXTRN ATMAP:BYTE EXTRN SYSDSPFLG:BYTE EXTRN CLICKFLG:BYTE EXTRN ATTRIB:BYTE EXTRN MINFLG:BYTE  The Microsoft MACRO Assembler , Version 1.25 Page 1-2 CONOUT 01-31-84 EXTRN ALTRBYT:BYTE,SPDCNT:WORD EXTRN SPDWK:BYTE EXTRN msconin:far,msconst:far,msconout:far,flush:near EXTRN exit:near,busy_exit:near,ptrsav:dword EXTRN regprnt:far EXTRN u_auxcgtbl:byte ; file "usconin" 1-3-84 EXTRN ucgoff:byte ; file "usconin" 1-3-84 EXTRN dmaxflg:byte  PUBLIC ESCCPR PUBLIC ESCCPRCNT PUBLIC CURSOROFF PUBLIC KBCSRD PUBLIC CRTDSP PUBLIC KBSACV,GENATBIT PUBLIC KBMOUT,KBCSAD,KBCRTC,LA,CA PUBLIC KBLCCV,KBCSRO,KBSCRO,LACACHNG PUBLIC CONOUT,LOOKUP,ROLLUP,ROLLDOWN PUBLIC ROLDCNT,CSWRT,CRTCLR,KBCRTC0 PUBLIC con_writ,con_wrst,con_flsh,con_read,con_rdnd PUBLIC con_init,con_rdsts PUBLIC kbsad0,kbscropat PUBLIC scrdump PUBLIC altrbytflg ASSUME CS:CODE,DS:CODE,SS:CODE,ES:CODE ;******************************************************** ;* EQUATE TABLE * ;******************************************************** = 4092 CSRON EQU 4092H ; CURSOR DISP ON = 4012 CSROFF EQU 4012H ; OFF = 0050 CTLLINE EQU 0050H = 0FEF LASTLINE EQU 51*80-1 = 0050 COLUMN EQU 80 = 0019 DPLINE EQU 25 ; DISPLAIED LINE = 0820 HFLINE EQU 26*COLUMN = 0FA0 ENDLINE EQU 50*COLUMN = LINE1 EQU COLUMN = 0130 LINESIZE EQU 19*16 = 1DB0 LINEMAX EQU DPLINE*LINESIZE = STLINE EQU COLUMN ;******************************************************** ;* BELL ROUTINE * ;******************************************************** = 0031 MELCNT1 EQU 31H ; MELODY CONTROL CMD NO.1 = 0063 MELCNTBEL EQU 63H ; CONTROL CMD BELL SOUND = 003C MELBEL EQU 3CH ; BELL SOUND 200MS,710HZ = 0039 MELCLICK EQU 39H ; CLICK SOUND 20MS,1202HZ = 0060 MELSTP EQU 60H ; READ STATUS PORT = 0060 MELWP EQU 60H ; WRITE PORT = 0080 MELRDY EQU 80H ; REDY TO RECEIVE CMD 0000 00 MELSTT DB 0 ; TEMPORARY STATUS  The Microsoft MACRO Assembler , Version 1.25 Page 1-3 CONOUT  01-31-84 0001 00 MELSTC DB 0 ; TEMP COUNTER  The Microsoft MACRO Assembler , Version 1.25 Page 1-4 CONOUT 01-31-84 PAGE ;********************************************* ;* CONOUT USE AREA * ;********************************************* 0002 00 LA DB 00H ; LINE ADDR 0003 00 CA DB 00H ; COLUMUN ADD 0004 00 WKCA DB 00H ; WORK FOR CA 0005 00 WKLA DB 00H ; WORK FOR LA ;* 0006 0000 KBWKSL DW 0000H ;--- rmg / necis / 1-3-84 --- add altrbytflg as per NEC/T ; 0008 00 altrbytflg db 00h ; alternate character set mode flags ; bit 0 = ( 1 ; 1 = ( 0 / ( B ; 2 = ALT key ;*** GDC MEMORY ADDR & LENGTH ;* 0009 0000 KBSAD0 DW 0000H ; GDC ADDR 0 000B 0130 KBSL0 DW 1*LINESIZE ; GDC LENGTH 0 (STATUS LINE) 000D 0050 KBSAD1 DW COLUMN ; GDC ADDR 1 000F 1DB0 KBSL1 DW LINEMAX ; GDC LENGTH 1 0011 0050 KBSAD2 DW COLUMN ; GDC ADDR 2 0013 0000 KBSL2 DW 0000H ; GDC LENGTH 2 0015 0000 KBSAD3 DW 0000H ; GDC ADDR 3 0017 0000 KBSL3 DW 0000H ; GDC LENGTH 3 ;* 0019 0FA0 LINELAST DW ENDLINE ; LAST WRITTEN LINE 001B 0000 LINESAVE DW 0 ; TEMP LINE 001D 00 ROLDCNT DB 0 ; ROLL DOWN COUNTER 001E 00 ROLDSTOP DB 0 ; FIRST ROLL DOWN FLAG = 000A ANSIPRMTBLSZ EQU 10 ; 001F 00 ANSINOP DB 0 0020 0A [ ANSIPRMTBL DW ANSIPRMTBLSZ DUP(0) 0000 ] 0034 00 ATTRIBWK DB 0 ; 0035 00 ATTRIBS DB 0 ; =0 COLOR ATTRIBUTE NOTHING >0 OTHOR ;********************************************************************** ;* ATTRIBUTE TABLE * ;********************************************************************** ; GDC PARAM. INPUT PARAM. 0036 00 ATTRTBL DB 00H ; ATTRIBUTE 0 DEFAULT 0037 00 DB 00H ; 1 DEFAULT 0038 04 DB 04H ; 2 V LINE 0039 02 DB 02H ; 3 O LINE 003A 01 DB 01H ; 4 U LINE 003B 08 DB 08H ; 5 BLINK 003C 00 DB 0 ; 6 NOT USED  The Microsoft MACRO Assembler , Version 1.25 Page 1-5 CONOUT 01-31-84 003D 10 DB 10H ; 7 REVERSE 003E 00 DB 0 ; 8 SECRET 003F 00 00 00 00 00 00 DB 0,0,0,0,0,0,0 ; 9...15 NOT USED 00 0046 00 DB 00H ; 16 SECRET 0047 20 DB 20H ; 17 RED 0048 40 DB 40H ; 18 BLUE 0049 60 DB 60H ; 19 PURPLE 004A 80 DB 80H ; 20 GREEN 004B A0 DB 0A0H ; 21 YELLOW 004C C0 DB 0C0H ; 22 LIGHT BLUE 004D E0 DB 0E0H ; 23 WHITE 004E 00 00 00 00 00 00 DB 0,0,0,0,0,0 ; 24...29 NOT USED 0054 00 DB 0 ; 30 SECRET 0055 20 DB 20H ; 31 RED 0056 80 DB 80H ; 32 GREEN 0057 A0 DB 0A0H ; 33 YELLOW 0058 40 DB 40H ; 34 BLUE 0059 60 DB 60H ; 35 PURPLE --- rmg/necis/11-30-83 005A C0 DB 0C0H ; 36 LIGHT BLUE --- rmg / necis " 005B E0 DB 0E0H ; 37 WHITE  The Microsoft MACRO Assembler , Version 1.25 Page 1-6 CONOUT 01-31-84 PAGE ;********************************************************************** ;* ASCII CONTROL CODE TABLE * ; ; The following EQU's must be changed if a new control code outside ; of the current range is added to the table! ; = 0007 lowest_code equ 07h = 001E highest_code equ 1eh ; ;* * ;********************************************************************** 005C 0D CNTTBL DB 0DH ; CR CURSOR TO LEFT MARGIN 005D 086C R DW CRRTN 005F 1B DB 1BH ; ESC ESC MODE SET 0060 02BA R DW ESCRTN 0062 08 DB 08H ; BS CURSOR BACKWARD 0063 084B R DW BSRTN 0065 1E DB 1EH ; RS CURSOR HOME 0066 0873 R DW HOMERTN 0068 1A DB 1AH ; SUB CLEAR SCREEN 0069 0880 R DW CLRRTN 006B 0C DB 0CH ; FF CURSOR FORWARD 006C 0820 R DW FFRTN 006E 0B DB 0BH ; VT CURSOR UP 006F 07F1 R DW VURRTN 0071 0A DB 0AH ; LF CURSOR DOWN 0072 080E R DW LFRTN 0074 07 DB 07H ; BEL BELL 0075 0274 R DW BELRTN 0077 00 DB 0 ; STOPPER 0078 0886 R DW DATARTN ; GRAFIC CODES ; ;********************************************************************** ;* ESC TABLE 1 FIRST CHARACTER FOLLOWING "ESC", * ;* AND RELATED ROUTINE * ;********************************************************************** 007A 5B ESCTBL1 DB '[' ; CONTROL SEQUENCE INTRODUCER 007B 03A9 R DW ESCANSI 007D 3D DB '=' ; CURSOR POSITION 007E 02C0 R DW ESCCUP1 0080 28 DB '(' ; ALTERNATE CHARACTER MODE SET/RESET 0081 02FD R DW ESCALTCHR 0083 80 DB 80h ; screen dump request --- rmg / necis / 12-7-83 0084 0328 R DW escsdmp 0086 00 DB 0 ; STOPPER 0087 037B R DW ESCRESET ; ;********************************************************************** ;* ESC ANSI MODE PARAMETERS (DEC VT100 MODE) * ;********************************************************************** 0089 6D ESCANSITBL DB 'm' 008A 044F R DW ESCSGR  The Microsoft MACRO Assembler , Version 1.25 Page 1-7 CONOUT 01-31-84 008C 4D DB 'M' ; 008D 044F R DW ESCSGR 008F 68 DB 'h' ; ESC SET MODE / CURSOR POSITION 0090 06C7 R DW ESCCHKH 0092 48 DB 'H' ; ESC SET MODE / CURSOR POSITON 0093 06C7 R DW ESCCHKH 0095 4A DB 'J' ; ERASE IN DISPLAY 0096 0577 R DW ESCED 0098 4B DB 'K' ; ERASE IN LINE 0099 066B R DW ESCEL 009B 41 DB 'A' ; CURSOR UP 009C 04C2 R DW ESCCUU 009E 42 DB 'B' ; CURSOR DOWN 009F 04E0 R DW ESCCUD 00A1 43 DB 'C' ; CURSOR FORWARD 00A2 04FE R DW ESCCUF 00A4 44 DB 'D' ; CURSOR BACKWARD 00A5 051C R DW ESCCUB 00A7 6C DB 'l' ; ESC RESET MODE 00A8 06BC R DW ESCCHKL 00AA 4C DB 'L' ; ESC RESET MODE / 00AB 06BC R DW ESCCHKL 00AD 3E DB '>' ; 00AE 06B6 R DW ESCMIN 00B0 4F DB 'O' ; INSERT CHARACTER 00B1 06B5 R DW ESCIC 00B3 50 DB 'P' ; DELETE CHARACTER 00B4 06B5 R DW ESCDC 00B6 66 DB 'f' 00B7 06C7 R DW ESCCHKH 00B9 6E DB 'n' 00BA 078B R DW ESCDSR 00BC 73 DB 's' 00BD 07AE R DW ESCSCP 00BF 75 DB 'u' 00C0 07CE R DW ESCRCP 00C2 00 DB 0 ; STOPPER 00C3 037B R DW ESCRESET ;********************************************************************** ;* ESC ALTERNATE CHARACTER PARAMETER * ;********************************************************************** 00C5 31 ESCALTPRM DB '1' 00C6 0316 R DW ESCALTSET 00C8 30 DB '0' ; add "0" and "B" 00C9 031C R DW ESCALTSET00 ;--- rmg / necis / 1-3-84 00CB 42 DB 'B' 00CC 0322 R DW ESCALTRESET 00CE 00 DB 0 00CF 02BF R DW ESCNULL ; ;********************************************************************* ;* ESC SCREEN DUMP PARAMETER rmg / necis / 12-7-83 * ;*********************************************************************  The Microsoft MACRO Assembler , Version 1.25 Page 1-8 CONOUT 01-31-84 00D1 ESCSDMPPRM LABEL BYTE 00D1 30 DB '0' 00D2 0341 R DW SDMP00 00D4 31 DB '1' 00D5 0347 R DW SDMP01 00D7 32 DB '2' 00D8 034D R DW SDMP02 00DA 00 DB 0 00DB 02BF R DW ESCNULL ;  The Microsoft MACRO Assembler , Version 1.25 Page 1-9 CONOUT 01-31-84 PAGE ;**************************************************************** ;* * ;* LINE SIZE CONVERT TO CHARACTER SIZE * ;* * ;* IF DATA LESS THAN 16*130H AND 130H MULTIPLE, * ;* BIT PATTERN FROM 7 TO 4 IS CONSTANT. * ;* GET BIT PATTERN FROM 7 TO 4 AND CONVERT 80H * ;* MULTIPLE. * ;* * ;* REMARK * ;* IF 19*N - 16*M = 1, min N = 11 min M = 13 * ;* IF 19*N - 16*M = 2, min N = 11*2 MOD 16 = 6 * ;* IF 19*N - 16*M = 3, min N = 11*3 MOD 16 = 1 * ;* . . * ;* . . * ;* IF 19*N - 16*M = X, min N = 11*X MOD 16 * ;* . . * ;**************************************************************** 00DD TBL_SL1 LABEL WORD 00DD 0000 DW COLUMN * 0 ; 0 * 19 MOD 16 = 0 00DF 0370 DW COLUMN * 11 ; 11 * 19 MOD 16 = 1 00E1 01E0 DW COLUMN * 6 ; 6 * 19 MOD 16 = 2 00E3 0050 DW COLUMN * 1 ; 1 * 19 MOD 16 = 3 00E5 03C0 DW COLUMN * 12 ; 12 * 19 MOD 16 = 4 00E7 0230 DW COLUMN * 7 ; 7 * 19 MOD 16 = 5 00E9 00A0 DW COLUMN * 2 ; 2 * 19 MOD 16 = 6 00EB 0410 DW COLUMN * 13 ; 13 * 19 MOD 16 = 7 00ED 0280 DW COLUMN * 8 ; 8 * 19 MOD 16 = 8 00EF 00F0 DW COLUMN * 3 ; 3 * 19 MOD 16 = 9 00F1 0460 DW COLUMN * 14 ; 14 * 19 MOD 16 = 10 00F3 02D0 DW COLUMN * 9 ; 9 * 19 MOD 16 = 11 00F5 0140 DW COLUMN * 4 ; 4 * 19 MOD 16 = 12 00F7 04B0 DW COLUMN * 15 ; 15 * 19 MOD 16 = 13 00F9 0320 DW COLUMN * 10 ; 10 * 19 MOD 16 = 14 00FB 0190 DW COLUMN * 5 ; 5 * 19 MOD 16 = 15 ;**************************************** ;* COLUMN MULTIPLE * ;**************************************** 00FD TBL_CLM LABEL WORD = 0000 PARA = 0 REPT 26 DW PARA * COLUMN PARA = PARA + 1 ENDM 00FD 0000 + DW PARA * COLUMN 00FF 0050 + DW PARA * COLUMN 0101 00A0 + DW PARA * COLUMN 0103 00F0 + DW PARA * COLUMN 0105 0140 + DW PARA * COLUMN 0107 0190 + DW PARA * COLUMN 0109 01E0 + DW PARA * COLUMN 010B 0230 + DW PARA * COLUMN  The Microsoft MACRO Assembler , Version 1.25 Page 1-10 CONOUT 01-31-84 010D 0280 + DW PARA * COLUMN 010F 02D0 + DW PARA * COLUMN 0111 0320 + DW PARA * COLUMN 0113 0370 + DW PARA * COLUMN 0115 03C0 + DW PARA * COLUMN 0117 0410 + DW PARA * COLUMN 0119 0460 + DW PARA * COLUMN 011B 04B0 + DW PARA * COLUMN 011D 0500 + DW PARA * COLUMN 011F 0550 + DW PARA * COLUMN 0121 05A0 + DW PARA * COLUMN 0123 05F0 + DW PARA * COLUMN 0125 0640 + DW PARA * COLUMN 0127 0690 + DW PARA * COLUMN 0129 06E0 + DW PARA * COLUMN 012B 0730 + DW PARA * COLUMN 012D 0780 + DW PARA * COLUMN 012F 07D0  + DW PARA * COLUMN ;**************************************** ;* LINESIZE MULTIPLE * ;**************************************** 0131 TBL_LIN LABEL WORD = 0000 PARA = 0 REPT 51 DW PARA * LINESIZE PARA = PARA + 1 ENDM 0131 0000 + DW PARA * LINESIZE 0133 0130 + DW PARA * LINESIZE 0135 0260 + DW PARA * LINESIZE 0137 0390 + DW PARA * LINESIZE 0139 04C0 + DW PARA * LINESIZE 013B 05F0 + DW PARA * LINESIZE 013D 0720 + DW PARA * LINESIZE 013F 0850 + DW PARA * LINESIZE 0141 0980 + DW PARA * LINESIZE 0143 0AB0 + DW PARA * LINESIZE 0145 0BE0 + DW PARA * LINESIZE 0147 0D10 + DW PARA * LINESIZE 0149 0E40  + DW PARA * LINESIZE 014B 0F70 + DW PARA * LINESIZE 014D 10A0 + DW PARA * LINESIZE 014F 11D0 + DW PARA * LINESIZE 0151 1300 + DW PARA * LINESIZE 0153 1430 + DW PARA * LINESIZE 0155 1560 + DW PARA * LINESIZE 0157 1690 + DW PARA * LINESIZE 0159 17C0 + DW PARA * LINESIZE 015B 18F0 + DW PARA * LINESIZE 015D 1A20 + DW PARA * LINESIZE 015F 1B50 + DW PARA * LINESIZE 0161 1C80 + DW PARA * LINESIZE 0163 1DB0 + DW PARA * LINESIZE  The Microsoft MACRO Assembler , Version 1.25 Page 1-11 CONOUT 01-31-84 0165 1EE0 + DW PARA * LINESIZE 0167 2010 + DW PARA * LINESIZE 0169 2140 + DW PARA * LINESIZE 016B 2270 + DW PARA * LINESIZE 016D 23A0 + DW PARA * LINESIZE 016F 24D0 + DW PARA * LINESIZE 0171 2600 + DW PARA * LINESIZE 0173 2730 + DW PARA * LINESIZE 0175 2860 + DW PARA * LINESIZE 0177 2990 + DW PARA * LINESIZE 0179 2AC0 + DW PARA * LINESIZE 017B 2BF0 + DW PARA * LINESIZE 017D 2D20 + DW PARA * LINESIZE 017F 2E50 + DW PARA * LINESIZE 0181 2F80 + DW PARA * LINESIZE 0183 30B0 + DW PARA * LINESIZE 0185 31E0 + DW PARA * LINESIZE 0187 3310 + DW PARA * LINESIZE 0189 3440 + DW PARA * LINESIZE 018B 3570 + DW PARA * LINESIZE 018D 36A0 + DW PARA * LINESIZE  018F 37D0 + DW PARA * LINESIZE 0191 3900 + DW PARA * LINESIZE 0193 3A30 + DW PARA * LINESIZE 0195 3B60 + DW PARA * LINESIZE  The Microsoft MACRO Assembler , Version 1.25 Page 1-12 CONOUT 01-31-84 PAGE ;********************************************************************** ;* DATA AREA FOR ESC SEQUENCE PROCESS ;********************************************************************** = 0014 ESCBUFFSZ EQU 20 0197 0199 R ESCPTR DW OFFSET ESCBUFF ; POINTER FOR ESC BUFFER 0199 14 [ ESCBUFF DW ESCBUFFSZ DUP(0) 0000 ] ; 01C1 00 ESCMODE DB 0 ; CALLING COUNTER IN ESC MODE 01C2 0000 ESCWTG DW 0 ; WTG WHERE TO GO ; 01C4 20 LCOFFSET DB 20H 01C5 00 ESCEDCASE DB 0 ; CASE FOR ESC SCREEN CLEAR 01C6 0000 ESCEDSL1 DW 0 ; DISPLAY LENGTH (<-- KBSL1) 01C8 0000 ESCEDSL2 DW 0 ; " (<-- KBSL2) 01CA 08 [ ESCCPR DB 8 DUP(0) 00 ] 01D2 0000 ESCCPRCNT DW 0 01D4 00 SCPLA DB 0 01D5 00 SCPCA DB 0  The Microsoft MACRO Assembler , Version 1.25 Page 1-13 CONOUT 01-31-84 PAGE ;********************************************************************** ;* * ;* CONOUT (CONSOLE OUTPUT) * ;* * ;********************************************************************** 01D6 CONOUT: ;********************************************************************** ;* CHECK ESC MODE * ;********************************************************************** 01D6 FC CLD 01D7 2A E4 SUB AH,AH 01D9 53 PUSH BX 01DA 8A C1 MOV AL,CL ; ; ESCMODE = 0 ; NOT IN ESC MODE ; ESCMODE = 1 ; GOT "ESC" CHARACTER IN ESC MODE ; 2 ; GOT FIRST CHARACTER FOLLOWING "ESC" IN ESC MODE ; 3 ; GOT SECOND CHARACTER IN ESC MODE ; : : : ; : : : ; n ; GOT nTH CHARACTER IN ESC MODE ; 01DC BE 005C R MOV SI,OFFSET CNTTBL 01DF 80 3E 01C1 R 00 CMP ESCMODE,0 01E4 74 28 JE CONOUT002 ; SEARCH ASCII CONTROL CODE ; TABLE ; ; NOW,WE ARE IN ESC MODE ; SET INPUT CODE TO ESC BUFFER ; 01E6 80 3E 01C1 R 28 CMP ESCMODE,ESCBUFFSZ*2 ; INPUT DATA IS OVERFLOWED 01EB 7F 66 JG CONOUT004 ; IN ESC BUFFER 01ED 8B 1E 0197 R MOV BX,ESCPTR 01F1 88 07 MOV [BX],AL 01F3 FF 06 0197 R INC ESCPTR 01F7 FE 06 01C1 R INC ESCMODE ; ; CHECK IF ESCMODE = 2 (FIRST CHARACTER FOLLOWING "ESC") ; 01FB 80 3E 01C1 R 02 CMP ESCMODE,2 0200 74 06 JE CONOUT001 ; SEARCH FIRST CHARACTER ; FOLLOWING "ESC" ; ; DISPATCH TO WTG (WHERE TO GO) ; 0202 FF 16 01C2 R CALL ESCWTG 0206 EB 2C JMP SHORT CONOUTRET ; 0208 CONOUT001: 0208 BE 007A R MOV SI,OFFSET ESCTBL1 ;============================================================================= ; Don't try to look up non-control codes, it wastes valuable cycles...  The Microsoft MACRO Assembler , Version 1.25 Page 1-14 CONOUT 01-31-84 ; 020B EB 17 90 jmp lookitup ; always look up char after ESC 020E CONOUT002: ;--- rmg / necis / 1-3-84 --- modify for new alt char methods ; ; CMP ALTRBYT,89H ; JE CONOUT005 ; IF ALTERNATE CHARACTER ? ; 020E F6 06 0008 R 01 test altrbytflg,01h ; single character from alternate set? 0213 75 43 jnz conout005 0215 3C 00 cmp al,0 0217 74 1B jz conoutret ; ;--- rmg / necis / 1-3-84 0219 BB 0886 R mov bx,offset datartn ; will handle as data char if not in range 021C 3C 07 cmp al,lowest_code ; lowest lookup code 021E 7C 07 jl skip_lookup ; skip lookup if lower than lowest 0220 3C 1E cmp al,highest_code ; highest lookup code 0222 7F 03 jg skip_lookup ; skip lookup if higher than highest 0224 lookitup: 0224 E8 0262 R CALL LOOKUP ; TABLE LOOK UP 0227 skip_lookup: ; ; RMG 7-10-83 ;============================================================================= 0227 80 3E 01C1 R 02 CMP ESCMODE,2 022C 75 04 JNE CONOUT003 022E 89 1E 01C2 R MOV ESCWTG,BX ; SET WTG ; BRANCH TO 0232  CONOUT003: 0232 FF D3 CALL BX ; THE SPECIFIC ROUTINE ; ; RETURN TO BDOS ; 0234 CONOUTRET: 0234 80 3E 0000 E 09 CMP SPDWK,9 0239 74 16 JE CONOUTRET9 023B A1 0000 E MOV AX,SPDCNT 023E 2B C9 SUB CX,CX 0240 2B D2 SUB DX,DX 0242 8A 16 0000 E MOV DL,SPDWK 0246 B1 09 MOV CL,9 0248 2A CA SUB CL,DL ; CL=9-SPDWK 024A F7 E1 MUL CX 024C 8B C8 MOV CX,AX 024E 41 INC CX 024F E2 FE LOOP $ 0251 CONOUTRET9: 0251 5B POP BX 0252 C3 RET 0253 CONOUT004:  The Microsoft MACRO Assembler , Version 1.25 Page 1-15 CONOUT 01-31-84 0253 E8 037B R CALL ESCRESET 0256 EB DC JMP SHORT CONOUTRET 0258 CONOUT005: ;============================================================================= ;--- rmg / necis / 1-3-84 --- delete following section for new alterbyte style ; Ignore NULs rather than advancing cursor RMG 6-10-83 ; ; cmp altrbyt,89H ; je do_data_out ; cmp al,0 ; a NUL? ; jz skip_data ; 0258 DO_DATA_OUT: 0258 E8 0886 R CALL DATARTN ; DATA CODE OUTPUT 025B 80 26 0008 R FE and altrbytflg,(not 01h) ; rmg / necis / 1-3-84 --- reset flag 0260 skip_data: 0260 EB D2 JMP SHORT CONOUTRET ; ; ;=============================================================================  The Microsoft MACRO Assembler , Version 1.25 Page 1-16 CONOUT 01-31-84 PAGE ;********************************************************************** ;* TABLE LOOK UP * ;* INPUT SI=TABLE TOP ADDRESS * ;* AL=CODE (CHARACTER) * ;* OUTPUT BX=JMP TABLE * ;********************************************************************** 0262 LOOKUP: 0262 80 3C 00 CMP BYTE PTR [SI],0 ; REACH TABLE END ? 0265 74 09 JE LOOKRET 0267 38 04 CMP [SI],AL ; CHECK INPUT CHARACTER 0269 74 05 JE LOOKRET 026B 83 C6 03 ADD SI,3 026E EB F2 JMP SHORT LOOKUP 0270 LOOKRET: 0270 8B 5C 01 MOV BX,1[SI] 0273 C3 RET ;**************************************************************** ;* BUZZER 250 MILLI SECOND * ;* * ;* INPUT NONE * ;* OUTPUT NONE * ;**************************************************************** 0274 BELRTN: 0274 50 PUSH AX 0275 51 PUSH CX 0276 B0 31 MOV AL,MELCNT1 ; CONTROL CMD FOR BELL SOUND 0278 E8 0292 R CALL MELOUT ; TO SOUND LSI PD1771C-005 027B B0 63 MOV AL,MELCNTBEL 027D E8 0292 R CALL MELOUT 0280 B0 3C MOV AL,MELBEL 0282 E8 0292 R CALL MELOUT ; OUTPUT BELL SOUND 0285 B9 1F35 MOV CX,0B7DH*25 ; WAIT FOR 250 MS 0288 E2 FE LOOP $ 028A B0 39 MOV AL,MELCLICK 028C E8 0292 R CALL MELOUT 028F 59 POP CX 0290 58 POP AX 0291 C3 RET ;**************************************************************** ;* OUTPUT COMMAND TO MELODY DEVICE * ;* * ;* INPUT AL : COMMAND * ;* OUTPUT NONE * ;**************************************************************** ; 0292 MELOUT: 0292 C6 06 0001 R 00 MOV MELSTC,0 0297 8A E0 MOV AH,AL 0299 80 3E 0001 R 02 MELST: CMP MELSTC,2 029E 74 19 JE MELRET 02A0 E4 60 IN AL,MELSTP 02A2 A2 0000 R MOV MELSTT,AL  The Microsoft MACRO Assembler , Version 1.25 Page 1-17 CONOUT 01-31-84 02A5 E4 60 IN AL,MELSTP 02A7 FE 06 0001 R INC MELSTC 02AB 3A 06 0000 R CMP AL,MELSTT 02AF 75 E8  JNE MELST 02B1 3C 80 CMP AL,MELRDY 02B3 75 E4 JNE MELST 02B5 8A C4 MOV AL,AH 02B7 E6 60 OUT MELWP,AL 02B9 MELRET: 02B9 C3 RET  The Microsoft MACRO Assembler , Version 1.25 Page 1-18 CONOUT 01-31-84 PAGE ; ; ;********************************************************************** ;* MISCELLANEOUS ROUTINES * ;* * ;********************************************************************** 02BA ESCRTN: 02BA FE 06 01C1 R INC ESCMODE ; ENTER ESC MODE 02BE C3 RET ; 02BF ESCNULL: 02BF C3 RET ; ESC NULL ROUTINE ; ;********************************************************************** ;* CURSOR POSITION IN NOT ANSI MODE * ;* ; ESC = L C  * ;********************************************************************** 02C0 ESCCUP1: ; ; ARE PARAMETERS ALREADY SET IN ESC BUFFER ? ; 02C0 80 3E 01C1 R 04 CMP byte ptr ESCMODE,4 02C5 75 24 JNE ESCCUP1RET ; NO, SO DO NOTHING 02C7 C6 06 01C4 R 20 MOV byte ptr LCOFFSET,20H 02CC BB 0199 R MOV BX,OFFSET ESCBUFF 02CF 8A 47 01 MOV AL,byte ptr 1[BX] 02D2 B4 18 MOV AH,DPLINE-1 02D4 E8 02EC R CALL LCCHK ; COLUMN CHECK 02D7 A2 0002 R MOV LA,AL 02DA 8A 47 02 MOV AL,byte ptr 2[BX] 02DD B4 4F MOV AH,COLUMN-1 02DF E8 02EC R CALL LCCHK ; LINE CHECK 02E2 A2 0003 R MOV CA,AL 02E5 E8 07FD R CALL CSWRT 02E8 E8 037B R CALL ESCRESET 02EB ESCCUP1RET: 02EB C3 RET ; ; LINE OR COLUMN NUMBER CHECK ; 02EC 3C 20 LCCHK: CMP AL,20H 02EE 73 02 JNC LCCHK01 ; --- rmg / necis / 11-30-83 --- jge --> jnc 02F0 B0 20 MOV AL,20H 02F2 LCCHK01: 02F2 2A 06 01C4 R SUB AL,LCOFFSET 02F6 3A C4 CMP AL,AH 02F8 72 02 JB LCCHKRET 02FA 8A C4 MOV AL,AH 02FC C3 LCCHKRET: RET  The Microsoft MACRO Assembler , Version 1.25 Page 1-19 CONOUT 01-31-84 PAGE ;********************************************************************** ;* ALTERNATE CHARACTER MODE * ;* SET/RESET ROUTINE * ;* ; ESC ( 1 GAIJI SET * ;********************************************************************** 02FD ESCALTCHR: ; ; IS FINAL CHAR. ALREADY SET IN ESC BUFFER ? ; 02FD 80 3E 01C1 R 03 CMP ESCMODE,3 0302 75 11 JNE ESCALTRET ; NO SO DO NOTHING 0304 BB 0199 R MOV BX,OFFSET ESCBUFF 0307 8A 47 01 MOV AL,1[BX] 030A BE 00C5 R MOV SI,OFFSET ESCALTPRM 030D  E8 0262 R CALL LOOKUP 0310 FF D3 CALL BX 0312 E8 037B R CALL ESCRESET 0315 ESCALTRET: 0315 C3 RET ; ; ; 0316 ESCALTSET: ;--- rmg / necis / 1-3-84 ; ; MOV ALTRBYT,89H ; SET ALTERNATE CHARACTER FLAG ; RET ; MSB ON = GAIJI ; ; VALUE 9= HANKAK 0316 80 0E 0008 R 01 or altrbytflg,01h 031B C3 ret 031C escaltset00: 031C 80 0E 0008 R 02 or altrbytflg,02h 0321 C3 ret 0322 escaltreset: 0322 80 26 0008 R FD and altrbytflg,(not 02h) 0327 C3 ret ; ;--- rmg / necis / 1-3-84  The Microsoft MACRO Assembler , Version 1.25 Page 1-20 CONOUT 01-31-84 PAGE ; ; added screen dump hooks from nect --- rmg / necis / 12-7-83 ; ;********************************************************************** ;* CRT SCREEN DIRECT DUMP TO PRINTER * ;* ; ESC 80H 0 CHARACTER DUMP * ;* ; ESC 80H 1 DOT PATTERN DUMP * ;* ; ESC 80H 2 GRAFIC MEMORY DUMP * ;********************************************************************** 0328 ESCSDMP: ; ; IS FINAL CHAR. ALREADY SET IN ESC BUFFER ? ; 0328 80 3E 01C1 R 03 CMP ESCMODE,3 032D 75 11 JNE ESCSDMPRET ; NO SO DO NOTHING 032F BB 0199 R MOV BX,OFFSET ESCBUFF 0332 8A 47 01 MOV AL,1[BX] 0335 BE 00D1 R MOV SI,OFFSET ESCSDMPPRM 0338 E8 0262 R CALL LOOKUP 033B FF D3 CALL BX 033D E8 037B R CALL ESCRESET 0340 ESCSDMPRET: 0340 C3 RET ; ; ; 0341 SDMP00: 0341 B1 00 MOV CL,0 0343 E8 0353 R CALL SCRDUMP 0346 C3 RET 0347 SDMP01: 0347 B1 01 MOV CL,1 0349 E8 0353 R CALL SCRDUMP  034C C3 RET 034D SDMP02: 034D B1 02 MOV CL,2 034F E8 0353 R CALL SCRDUMP 0352 C3 RET ;************************************************************************ ;* SCREEN DUMP * ;* CL = 00H ; CHARACTER DUMP ( CTRL + PRINT) * ;* = 01H ; CRT GRAPH DUMP ( FNC + PRINT) * ;* = 02H ; GRAPH MEMORY DUMP ( CTRL + FNC + PRINT) * ;************************************************************************ ; = 00DD INTSDP EQU 221 ; INTERRUPTION SCREEN DUMP ; 0353 SCRDUMP: 0353 80 3E 0000 E 00 CMP GDCBUSYF,0 ; IF GDC BUSY 0358 75 20 JNZ SCRDMPRET ; BUSY  The Microsoft MACRO Assembler , Version 1.25 Page 1-21 CONOUT 01-31-84 ; CMP DMAXFLG,0 ; IF DMAXER EXECUTE 035A 75 1E JNZ SCRDMPRET ; EXECUTE ; 035C C6 06 0000 E 01 MOV GDCBUSYF,1 0361 1E PUSH DS ; 0362 06 PUSH ES ; ; 0363 CD DD INT INTSDP ; 0365 07 POP ES ; 0366 1F POP DS ; 0367 C6 06 0000 E 00 MOV GDCBUSYF,0 ; 036C 8A 16 0003 R MOV DL,CA ; 0370 8A 36 0002 R MOV DH,LA 0374 E8 0A10 R CALL KBLCCV ; 0377 E8 0A66 R CALL KBCSRO ; OUTPUT CURSOR AT CURRENT SCREEN ADR. 037A SCRDMPRET: 037A C3 RET ;********************************************************************** ;* EXIT ESC SEQUENCE * ;********************************************************************** 037B ESCRESET: 037B C6 06 01C1 R 00 MOV ESCMODE,0 ; CLEAR ESC MODE COUNTER 0380 C7 06 01C2 R 0000 MOV ESCWTG,0 ; CLEAR ESC WTG 0386 C7 06 0197 R 0199 R MOV ESCPTR,OFFSET ESCBUFF ; INITIALIZE ESC BUFFER 038C B9 0014 MOV CX,ESCBUFFSZ 038F 8B 1E 0197 R MOV BX,ESCPTR 0393 E8 03A0 R CALL BUFFCLR 0396 B9 000A MOV CX,ANSIPRMTBLSZ 0399 BB 0020 R MOV BX,OFFSET ANSIPRMTBL 039C E8 03A0 R CALL BUFFCLR 039F C3 RET ; ; 03A0 BUFFCLR: 03A0 C7 07 0000 MOV WORD PTR [BX],0 ; CX=COUNTER 03A4 43 INC BX ; BX=TBL ADDRESS 03A5 43 INC BX 03A6 E2 F8 LOOP BUFFCLR 03A8 C3 RET ; ;********************************************************************** ;* ESCAPE ANSI MODE PROCEDURE * ;* ; ESC [ PS;PS;......FINAL CHAR. * ;********************************************************************** 03A9 ESCANSI: 03A9 80 3E 01C1 R 02 CMP ESCMODE,2 03AE 74 23 JE ESCANSIRET ; PARAMETER IS NOT STILL IN PARAMETER ; BUFFER SO , DO NOTHING ; ; ANSI MODE PARAMETERS IN PARAMETER BUFFER  The Microsoft MACRO Assembler , Version 1.25 Page 1-22 CONOUT 01-31-84 ; IF INPUT CHARACTER IS ; (1) NUMERIC OR PARAMETER SEPARATER (";") ; THEN GO THROUGH ; (2) OTHERWISE, TREAT AS A FINAL CHARACTER ; 03B0 3D 0030 CMP AX,30H 03B3 72 09 JB ESCANSI1 03B5 3D 003A CMP AX,3AH 03B8 72 19 JB ESCANSIRET ; NUMERIC CHARACTER THEN GO THROUGH 03BA 3C 3B CMP AL,3BH 03BC 74 15 JE ESCANSIRET ; SEPARATER ";" THEN GO THROUGH ; ; NOW ASSUME INPUT CHARACTER AS A FINAL CHARACTER ; 03BE ESCANSI1: 03BE E8 03D4 R CALL ESCGENPRM ; GENERATE PARAMETER TABLE 03C1 BE 0089 R MOV SI,OFFSET ESCANSITBL ; AL=FINAL CHARACTER 03C4 E8 0262 R CALL LOOKUP 03C7 FF D3 CALL BX 03C9 80 3E 0000 E 01 CMP MINFLG,1 03CE 74 03 JE ESCANSIRET ; IF ESC [ < 03D0 E8 037B R CALL ESCRESET 03D3 ESCANSIRET: 03D3 C3 RET ; ;********************************************************************** ;* ESCGENPRM GENERATE PARAMETER TABLE ROUTINE  * ;* * ;********************************************************************** 03D4 ESCGENPRM: 03D4 56 PUSH SI 03D5 57 PUSH DI 03D6 53 PUSH BX 03D7 51 PUSH CX 03D8 BE 0199 R MOV SI,OFFSET ESCBUFF ; 03DB 8B FE MOV DI,SI 03DD 46 INC SI 03DE BB 0020 R MOV BX,OFFSET ANSIPRMTBL 03E1 C6 06 001F R 00 MOV ANSINOP,0 03E6 FF 0E 0197 R DEC ESCPTR 03EA ESCGENPRM01: 03EA 3B 3E 0197 R CMP DI,ESCPTR 03EE 74 29 JE ESCGENPRMRET 03F0 47 INC DI ; COUNT UP NUMERIC CHARACTERS ; 03F1 B9 0000 MOV CX,0 03F4 ESCGENPRM02: 03F4 80 3D 3B CMP BYTE PTR [DI],3BH ; SEPARATER (';') ? 03F7 74 0A JE ESCGENPRM03 03F9 3B 3E 0197 R CMP DI,ESCPTR ; FINAL CHARACTER ?  The Microsoft MACRO Assembler , Version 1.25 Page 1-23 CONOUT 01-31-84 03FD 74 04 JE ESCGENPRM03 03FF 41 INC CX 0400 47 INC DI 0401 EB F1 JMP SHORT ESCGENPRM02 ; ; CONVERT DECIMAL TO BINARY ; AND SET THE PARAMETER TO ANSIPRMTBL ; ; SI = INPUT BUFFER ADDRESS ; CX = NOC ; BX = OUTPUT BUFFER ( ANSIPRMTBL ) 0403 ESCGENPRM03: ; 0403 E8 041E R CALL DTOB 0406 FE 06 001F R INC ANSINOP 040A 80 3E 001F R 0A CMP ANSINOP,ANSIPRMTBLSZ 040F 7F 08 JG ESCGENPRMRET 0411 8B F7 MOV SI,DI 0413 46 INC SI 0414 83 C3 02 ADD BX,2 0417 EB D1 JMP SHORT ESCGENPRM01 0419 ESCGENPRMRET: 0419 59 POP CX 041A 5B POP BX 041B 5F POP DI 041C 5E POP SI 041D C3 RET ; ;********************************************************************** ;* DECIMAL (ASCII) TO BINARY CONVERSION ROUTINE * ;*  * ;* * ;* INPUT SI = TOP ADDRESS OF INPUT STRING * ;* CX = NUMBER OF CHARACTERS NOC (MAX 5 CHARS) * ;* BX = TOP ADDRESS OF OUTPUT (1 WORD ; * ;* IGNORE OVERFLOWED * ;* DATA) * ;* OUTPUT .SET CONVERTED DATA TO [BX] * ;* .IF NOC > 5 THEN TREAT NOC = 5 * ;* IF NOC = 0 THEN SET 0 TO [BX] * ;********************************************************************** 041E DTOB: 041E 50 PUSH AX 041F 56 PUSH SI 0420 52 PUSH DX 0421 83 F9 05 CMP CX,5 0424 76 03 JBE DTOB01 0426 B9 0005 MOV CX,5 0429 DTOB01: 0429 C7 07 0000 MOV WORD PTR [BX],0 ;CLEAR OUTPUT WORD 042D 83 F9 00 CMP CX,0 0430 74 19 JE DTOBRET 0432 DTOB02:  The Microsoft MACRO Assembler , Version 1.25 Page 1-24 CONOUT 01-31-84 0432 8B 07 MOV AX,[BX] ; AX = [BX] * 10 0434 D1 E0 SHL AX,1 0436 8B D0 MOV DX,AX 0438 D1 E0 SHL AX,1 043A D1 E0 SHL AX,1 043C 03 C2 ADD AX,DX 043E 8A 14 MOV DL,BYTE PTR [SI] 0440 81 E2 000F AND DX,0FH 0444 03 C2 ADD AX,DX ; 0446 89 07 MOV [BX],AX ; [BX] = [BX]* 10 + [SI]AND 0FH 0448 46 INC SI ; 0449 E2 E7 LOOP DTOB02 ; LOOP TILL CX=0 044B DTOBRET: 044B 5A POP DX 044C 5E POP SI 044D 58 POP AX 044E C3 RET  The Microsoft MACRO Assembler , Version 1.25 Page 1-25 CONOUT 01-31-84 PAGE ;********************************************************************** ;* ATTRIBUTE OUTPUT ROUTINE *  ;* * ;* ESCSGR SELECT GRAPHIC RENDITION * ;* * ;********************************************************************** 044F ESCSGR: ; SAVE REGISTER 044F 50 PUSH AX 0450 56 PUSH SI 0451 57 PUSH DI 0452 C6 06 0034 R 00 MOV ATTRIBWK,0 ; CLEAR ATTRIBUTE WORK 0457 C6 06 0035 R 00 MOV ATTRIBS,0 045C 80 3E 001F R 00 CMP ANSINOP,0 0461 75 04 JNE ESCSGR00 0463 FE 06 001F R INC ANSINOP 0467 ESCSGR00: ; ; CONVERT VT100 PARAMETER TO GDC LSI ( PD7220) PARAMETER ; 0467 BE 0020 R MOV SI,OFFSET ANSIPRMTBL 046A ESCSGR01: 046A 80 3E 001F R 00 CMP ANSINOP,0 ; END OF PARAMS ? 046F 74 2D JE ESCSGRRET ; YES 0471 8B 3C MOV DI,WORD PTR [SI] 0473 83 FF 25 CMP DI,37 0476 7F 1D JG ESCSGR02 ; IGNORE ATTRIBUTE 0478 83 FF 08 CMP DI,8 047B 74 0A JE ESCSGR03 047D 83 FF 10 CMP DI,16 0480 74 05 JE ESCSGR03 0482 83 FF 1E CMP DI,30 0485 75 04 JNE ESCSGR011 0487 ESCSGR03: 0487 FE 06 0035 R INC ATTRIBS 048B ESCSGR011: 048B 81 C7 0036 R ADD DI,OFFSET WORD PTR ATTRTBL 048F 8A 05 MOV AL,[DI] ; GET ATTRIBUTE 0491 08 06 0034 R OR ATTRIBWK,AL 0495 ESCSGR02: 0495 FE 0E 001F R DEC ANSINOP 0499 83 C6 02 ADD SI,2 049C EB CC JMP SHORT ESCSGR01 049E ESCSGRRET: 049E A0 0034 R MOV AL,ATTRIBWK 04A1 24 E0 AND AL,0E0H 04A3 3C 00 CMP AL,0 04A5 75 11 JNE ESCSGRRET1 ; SE GREEN IF COLOR ATTRIBUTE NOTHING 04A7 80 0E 0034 R 80 OR ATTRIBWK,80H 04AC 80 3E 0035 R 00 CMP ATTRIBS,0  The Microsoft MACRO Assembler , Version 1.25 Page 1-26 CONOUT 01-31-84 04B1 74 05 JE ESCSGRRET1 04B3 80 26 0034 R 1F AND ATTRIBWK,1FH ; SET SECRET 04B8 ESCSGRRET1: 04B8 A0 0034 R MOV AL,ATTRIBWK 04BB A2 0000 E MOV ATTRIB,AL 04BE 5F POP DI 04BF 5E POP SI 04C0 58 POP AX 04C1 C3 RET ;********************************************************************** ;* ESCCUU ESC CURSOR UP * ;********************************************************************** 04C2 ESCCUU: 04C2 56 PUSH SI 04C3 51 PUSH CX 04C4 BE 0020 R MOV SI,OFFSET ANSIPRMTBL 04C7 80 3E 001F R 02 CMP ANSINOP,2 ; TOO MUCH PARAMETER ? 04CC 7D 0F JGE ESCCUURET ; ERROR 04CE 8B 0C MOV CX,[SI] ; GET PRM 04D0 83 F9 00 CMP CX,0 04D3 75 03 JNE ESCCUU01 04D5 B9 0001 MOV CX,1 04D8 ESCCUU01: 04D8 E8 07F1 R CALL VURRTN 04DB E2 FB LOOP ESCCUU01 04DD ESCCUURET: 04DD 59 POP CX 04DE 5E POP SI 04DF C3 RET  ;********************************************************************** ;* ESCCUD ESC CURSOR DOWN * ;********************************************************************** 04E0 ESCCUD: 04E0 56 PUSH SI 04E1 51 PUSH CX 04E2 BE 0020 R MOV SI,OFFSET ANSIPRMTBL 04E5 80 3E 001F R 02 CMP ANSINOP,2 ; TOO MUCH PARAMETER 04EA 7D 0F JGE ESCCUDRET ; ERROR 04EC 8B 0C MOV CX,[SI] ; GET PRM 04EE 83 F9 00 CMP CX,0 04F1 75 03 JNE ESCCUD01 04F3 B9 0001 MOV CX,1 04F6 ESCCUD01: 04F6 E8 080E R CALL LFRTN 04F9 E2 FB LOOP ESCCUD01 04FB ESCCUDRET: 04FB 59 POP CX 04FC 5E POP SI 04FD C3 RET ;********************************************************************** ;* ESCCUF ESC CURSOR FORWARD * ;********************************************************************** 04FE ESCCUF:  The Microsoft MACRO Assembler , Version 1.25 Page 1-27 CONOUT 01-31-84 04FE 56 PUSH SI 04FF 51 PUSH CX 0500 BE 0020 R MOV SI,OFFSET ANSIPRMTBL 0503 80 3E 001F R 02 CMP ANSINOP,2 ; TOO MUCH PARAMETER ? 0508 7D 0F JGE ESCCUFRET ; ERROR 050A 8B 0C MOV CX,[SI] ; GET PRM 050C 83 F9 00 CMP CX,0 050F 75 03 JNE ESCCUF01 0511 B9 0001 MOV CX,1 0514 ESCCUF01: 0514 E8 0820 R CALL FFRTN 0517 E2 FB LOOP ESCCUF01 0519 ESCCUFRET: 0519 59 POP CX 051A 5E POP SI 051B C3 RET ;********************************************************************** ;* ESCCUB ESC CURSOR BACKWARD * ;********************************************************************** 051C ESCCUB: 051C 56 PUSH SI 051D 51 PUSH CX 051E BE 0020 R MOV SI,OFFSET ANSIPRMTBL 0521 80 3E 001F R 02 CMP ANSINOP,2 ; TOO MUCH PARAMETER ? 0526 7D 0F JGE ESCCUBRET ; ERROR 0528 8B 0C MOV CX,[SI] ; GET PRM 052A 83 F9 00 CMP CX,0 052D 75 03 JNE ESCCUB01 052F B9 0001 MOV CX,1 0532 ESCCUB01: 0532 E8 084B R CALL BSRTN 0535 E2 FB LOOP ESCCUB01 0537 ESCCUBRET: 0537 59 POP CX 0538 5E POP SI 0539 C3 RET ; ;********************************************************************** ;* ESCCUP0 ESC DIRECT CURSOR ADDRESSING * ;********************************************************************** 053A ESCCUP0: 053A 56 PUSH SI 053B BE 0020 R MOV SI,OFFSET ANSIPRMTBL 053E 80 3E 001F R 00 CMP ANSINOP,0 ; PARAMETER NOTHING ? 0543 74 07 JE ESCCUP000 ; IF ESC[H 0545 80 3E 001F R 02 CMP ANSINOP,2 ; TOO MUCH PARAMETER ? 054A 75 29 JNE ESCCUP0RET 054C ESCCUP000: 054C 8B 04 MOV AX,[SI] ; GET PL LINE ADDRESS 054E 3C 00 CMP AL,0 0550 74 08  JE ESCCUP00 0552 2C 01 SUB AL,1 0554 3C 18 CMP AL,DPLINE-1  The Microsoft MACRO Assembler , Version 1.25 Page 1-28 CONOUT 01-31-84 0556 72 02 JB ESCCUP00 0558 B0 18 MOV AL,DPLINE-1 055A ESCCUP00: 055A A2 0002 R MOV LA,AL 055D 8B 44 02 MOV AX,2[SI] ; GET PC COLUMN ADDRESS 0560 3C 00 CMP AL,0 0562 74 08 JE ESCCUP01 0564 2C 01 SUB AL,1 0566 3C 4F CMP AL,COLUMN-1 0568 72 02 JB ESCCUP01 056A B0 4F MOV AL,COLUMN-1 056C ESCCUP01: 056C A2 0003 R MOV CA,AL 056F E8 07FD R CALL CSWRT 0572 E8 037B R CALL ESCRESET 0575 ESCCUP0RET: 0575 5E POP SI 0576 C3 RET  The Microsoft MACRO Assembler , Version 1.25 Page 1-29 CONOUT 01-31-84 PAGE ;********************************************************************** ;* ESCED ESC ERASE  * ;* * ;* ESC [J / ESC[0J : ERASE FROM CURSOR TO END OF SCREEN * ;* ESC [1J : ERASE FROM BEGINNING OF SCREEN TO * ;* CURSOR * ;* ESC [2J : ERASE ENTIRE SCREEN * ;********************************************************************** 0577 ESCED: 0577 56 PUSH SI 0578 BE 0020 R MOV SI, OFFSET ANSIPRMTBL ; GET SCREEN MEMORY ADDRESS IN AX ; 057B 8A 36 0002 R MOV DH,LA 057F 8A 16 0003 R MOV DL,CA 0583 E8 0A10 R CALL KBLCCV ; SAVE CURSOR ADDRESS 0586 50 PUSH AX 0587 80 3E 001F R 01 CMP ANSINOP,1 058C 7E 03 JLE ESCED000 058E E9 0665 R JMP ESCEDRET ; CHECK CURSOR POSITION ON THE SCREEN DISPLAYED 0591 ESCED000: 0591 C6 06 01C5 R 00 MOV ESCEDCASE,0 0596 83 3E 0013 R 00 CMP KBSL2,0 059B 74 0E JE ESCED00 059D  FE 06 01C5 R INC ESCEDCASE 05A1 3B 06 000D R CMP AX,KBSAD1 05A5 7D 04 JGE ESCED00 05A7 FE 06 01C5 R INC ESCEDCASE ; ESCEDCASE ; = 0 KBSL2 = 0 , KBSAD1 <= AX ; = 1 KBSL2 <>0 , KBSAD1 <= AX ; = 2 KBSL2 <>0 , KBSAD1 > AX 05AB ESCED00: ; CALCULATE DISPLAY LENGTH IN VIDEO MEMORY ; ESCEDSL1 = (KBSL1/(19*16))*80 ; ESCEDSL2 = (KBSL2/(19*16))*80 ; 05AB 50 PUSH AX 05AC A1 000F R MOV AX,KBSL1 05AF E8 0A48 R CALL SL1CHNG 05B2 A3 01C6 R MOV ESCEDSL1,AX 05B5 A1 0013 R MOV AX,KBSL2 05B8 E8 0A48 R CALL SL1CHNG 05BB A3 01C8 R MOV ESCEDSL2,AX 05BE 58 POP AX 05BF 8B 0C MOV CX,[SI] 05C1 83 F9 03 CMP CX,3 05C4 7D 49 JGE ESCED99 05C6 83 F9 01 CMP CX,1 05C9 74 47 JE ESCED10 05CB 83 F9 02 CMP CX,2 05CE 74 70 JE ESCED20  The Microsoft MACRO Assembler , Version 1.25  Page 1-30 CONOUT 01-31-84 ; ESC [ J / ESC [ 0 J ; ; CASE = 0 05D0 80 3E 01C5 R 00 CMP ESCEDCASE,0 05D5 75 0E JNE ESCED01 05D7 B9 07CF MOV CX,1999 05DA 03 0E 000D R ADD CX,KBSAD1 05DE 2B C8 SUB CX,AX 05E0 E8 0B3A R CALL KBCRTC0 05E3 EB 2A JMP SHORT ESCED99 ; CASE = 1 05E5 ESCED01: 05E5 80 3E 01C5 R 01 CMP ESCEDCASE,1 05EA 75 15 JNE ESCED02 05EC B9 0FFF MOV CX,0FFFH 05EF 2B C8 SUB CX,AX 05F1 E8 0B3A R CALL KBCRTC0 05F4 A1 0011 R MOV AX,KBSAD2 05F7 8B 0E 01C8 R MOV CX,ESCEDSL2 05FB 49 DEC CX 05FC E8 0B3A R CALL KBCRTC0 05FF EB 0E JMP SHORT ESCED99 ; CASE = 2 0601 ESCED02: 0601 8B 0E 01C8 R MOV CX,ESCEDSL2 0605 03 0E 0011 R ADD CX,KBSAD2 0609 2B C8 SUB CX,AX 060B 49 DEC CX 060C E8 0B3A R CALL KBCRTC0 060F ESCED99: 060F EB 54 90 JMP ESCEDRET ; ; ESC [ 1 J ; ; CASE = 0 / 1 0612 ESCED10: 0612 80 3E 01C5 R 02 CMP ESCEDCASE,2 0617 74 0E JE ESCED11 0619 2B 06 000D R SUB AX,KBSAD1 061D 8B C8 MOV CX,AX 061F A1 000D R MOV AX,KBSAD1 0622 E8 0B3A R CALL KBCRTC0 0625 EB 3E JMP SHORT ESCEDRET ; CASE = 2 0627 ESCED11: 0627 2B 06 0011 R SUB AX,KBSAD2 062B 8B C8 MOV CX,AX 062D A1 0011 R MOV AX,KBSAD2 0630 E8 0B3A R CALL KBCRTC0 0633 A1 000D R MOV AX,KBSAD1 0636 8B 0E 01C6 R MOV CX,ESCEDSL1 063A 49 DEC CX 063B E8 0B3A R CALL KBCRTC0  The Microsoft MACRO Assembler , Version 1.25 Page 1-31 CONOUT 01-31-84 063E EB 25 JMP SHORT ESCEDRET ; ; ESC [ 2 J ; ; CASE = 0 0640 ESCED20: 0640 80 3E 01C5 R 00 CMP ESCEDCASE,0 0645 75 08 JNE ESCED21 0647 A1 000D R MOV AX,KBSAD1 064A B9 07CF MOV CX,1999 064D EB 13 JMP SHORT ESCED22 ; CASE = 1 / 2 064F ESCED21: 064F A1 000D R MOV AX,KBSAD1 0652 8B 0E 01C6 R MOV CX,ESCEDSL1 0656 49 DEC CX 0657 E8 0B3A R CALL KBCRTC0 065A A1 0011 R MOV AX,KBSAD2 065D 8B 0E 01C8 R MOV CX,ESCEDSL2 0661 49 DEC CX 0662 ESCED22: 0662 E8 0B3A R CALL KBCRTC0 0665 ESCEDRET: 0665 58 POP AX 0666 E8 0A66 R CALL KBCSRO 0669 5E POP SI 066A C3 RET  The Microsoft MACRO Assembler , Version 1.25 Page 1-32 CONOUT 01-31-84 PAGE ;********************************************************************** ;* ESCEL ESC ERASE LINE * ;* ESC [K / [0K : ERASE FROM CURSOR TO END OF LINE * ;* ESC [1K : ERASE FROM BEGINNING OF LINE TO * ;* CURSOR * ;* ESC [2K : ERASE ENTIRE LINE CONTAINING CURSOR * ;********************************************************************** 066B ESCEL: 066B 56 PUSH SI 066C BE 0020 R MOV SI,OFFSET ANSIPRMTBL 066F 80 3E 001F R 01 CMP ANSINOP,1 ; TOO MUCH PARAMETER ? 0674 7F 3D JG ESCELRET 0676 83 3C 03 CMP WORD PTR[SI],3 0679 7D 38 JGE ESCELRET ; GET SCREEN MEMORY ADDRESS IN AX ; 067B 8A 36 0002 R MOV DH,LA 067F 8A 16 0003 R MOV DL,CA 0683 81 FA 1900 CMP DX,1900H ; IF CURSOR IS OUT OF SCREEN (LA=25,CA=00) 0687 74 2A JE ESCELRET ; THEN DO NOTHING 0689 E8 0A10 R CALL KBLCCV ; GET SCREEN MEMORY ADDRESS OF CURSOR 068C 50 PUSH AX 068D 2A ED SUB CH,CH 068F 83 3C 00 CMP WORD PTR [SI],0 0692 74 0D JE ESCEL0 0694 8A 0E 0003 R MOV CL,CA 0698 2B C1 SUB AX,CX 069A 83 3C 01 CMP WORD PTR [SI],1 069D 74 0D JE ESCEL3 ; ESC [1K 069F EB 08 JMP SHORT ESCEL2 ; ESC [K / ESC [0K 06A1  ESCEL0: 06A1 B1 4F MOV CL,79 06A3 2A 0E 0003 R SUB CL,CA 06A7 EB 03 JMP SHORT ESCEL3 ; ESC [1K 06A9 ESCEL2: 06A9 B9 004F MOV CX,79 06AC ESCEL3: 06AC E8 0B3A R CALL KBCRTC0 06AF 58 POP AX 06B0 E8 0A66 R CALL KBCSRO 06B3 ESCELRET: 06B3 5E POP SI 06B4 C3 RET 06B5 ESCIL: 06B5 ESCDL: 06B5 ESCIC: 06B5 ESCDC: 06B5 C3 RET ;  The Microsoft MACRO Assembler , Version 1.25 Page 1-33 CONOUT 01-31-84 PAGE ;********************************************************************** ;* ESCMIN * ;********************************************************************** 06B6 C6 06 0000 E 01 ESCMIN: MOV MINFLG,1 ; > FLAG SET 06BB C3 RET ; ;********************************************************************** ; CHESK ESC RESET MODE  * ;********************************************************************** 06BC ESCCHKL: 06BC 80 3E 0000 E 00 CMP MINFLG,0 06C1 74 03 JE ESCCHKLRET ; IF NOT ESC RESET MODE ; 06C3 E8 0715 R CALL ESCON ; ESC RESET MODE ; 06C6 ESCCHKLRET: 06C6 C3 RET ; ;********************************************************************** ;* CHECK ESC SET MODE / CURSOR POSITION * ;********************************************************************** 06C7 ESCCHKH: 06C7 80 3E 0000 E 00 CMP MINFLG,0 06CC 74 05 JE ESCCHKH010 ; IF CURSOR POSITION ; 06CE E8 06D7 R CALL ESCOFF ; ESC SET MODE 06D1 EB 03 JMP SHORT ESCCHKHRET ; 06D3 ESCCHKH010: 06D3 E8 053A R CALL ESCCUP0 ; CURSOR POSITION ; 06D6 ESCCHKHRET: 06D6 C3 RET ; ; ;********************************************************************** ;* ESCOFF * ;********************************************************************** 06D7 ESCOFF: 06D7 56 PUSH SI 06D8 51 PUSH CX 06D9 BE 0020 R MOV SI,OFFSET ANSIPRMTBL 06DC 80 3E 001F R 01 CMP ANSINOP,1 ; TOO MUCH PARAMETER ? 06E1 75 2A JNE ESCOFF050 ; IF INPUT ERROR 06E3 8B 0C MOV CX,[SI] 06E5 83 F9 01 CMP CX,1 06E8 74 11 JE ESCOFF010 ; IF DISABLE SYSTEM STATUS DISP. 06EA 83 F9 02 CMP CX,2 06ED 74 11 JE ESCOFF020 ; IF DISABLE KEY CLICK 06EF 83 F9 05 CMP CX,5 06F2 74 11 JE ESCOFF030 ; IF DISABLE CURSOR DISPLAY 06F4 83 F9 07 CMP CX,7  The Microsoft MACRO Assembler , Version 1.25 Page 1-34 CONOUT 01-31-84 06F7 74 11 JE ESCOFF040 ; IF DISABLE KEY BOARD INPUT 06F9 EB 12 JMP SHORT ESCOFF050 ; 06FB ESCOFF010: 06FB E8 0759 R CALL SYSDSPOFF ; DISABLE SYSTEM STATUS DISPLAY 06FE EB 0D JMP SHORT ESCOFF050 0700 ESCOFF020: 0700 E8 0765 R CALL CLICKOFF ; DISABLE KEY CLICK 0703 EB 08 JMP SHORT ESCOFF050 ; 0705 ESCOFF030: 0705 E8 0775 R CALL CURSOROFF ; DISABLE CURSOR DISPLAY 0708 EB 03 JMP SHORT ESCOFF050 ; 070A ESCOFF040: 070A E8 0785 R CALL KEYINOFF ; DISABLE KEY BOARD INPUT ; 070D ESCOFF050: 070D 59 POP CX 070E 5E POP SI 070F ESCOFF060: 070F C6 06 0000 E 00 MOV MINFLG,0 0714 C3 RET ; ;********************************************************************** ;* ESCON * ;********************************************************************** 0715 56 ESCON: PUSH SI 0716 51 PUSH CX 0717 BE 0020 R MOV SI,OFFSET ANSIPRMTBL 071A 80 3E 001F R 01 CMP ANSINOP,1 071F 75 2A JNE ESCON050 ; IF INPUT ERROR 0721 8B 0C MOV CX,[SI] 0723 83 F9 01 CMP CX,1 0726 74 11 JE ESCON010 ; IF ENABLE SYSTEM STATUS DSP. 0728 83 F9 02 CMP CX,2 072B 74 11 JE ESCON020 ; IF ENABLE KEY CLICK 072D 83 F9 05 CMP CX,5 0730 74 11 JE ESCON030 ; IF ENABLE CURSOR DISPLAY 0732 83 F9 07 CMP CX,7 0735 74 11 JE ESCON040 ; IF ENABLE KEY BOARD INPUT 0737 EB 12 JMP SHORT ESCON050 ; 0739 ESCON010: 0739 E8 0753 R CALL SYSDSPON ; ENABLE SYSTEM STATUS DSPLAY 073C EB 0D JMP SHORT ESCON050 ; 073E ESCON020: 073E E8 075F R CALL CLICKON ; ENABLE KEY CLICK 0741 EB 08 JMP SHORT ESCON050 ; 0743 ESCON030: 0743 E8 076B R CALL CURSORON ; ENABLE CURSOR DISPLAY  The Microsoft MACRO Assembler , Version 1.25 Page 1-35 CONOUT 01-31-84 0746 EB 03 JMP SHORT ESCON050 ; 0748 ESCON040: 0748 E8 077F R CALL KEYINON ; ENABLE KEY BOARD INPUT ; 074B ESCON050: 074B 59 POP CX 074C 5E POP SI 074D C6 06 0000 E 00 MOV MINFLG,0 0752 C3 RET ; ;********************************************************************** ;* ENABLE/DISABLE SYSTEM STATUS DISPLAY * ;********************************************************************** 0753 SYSDSPON: 0753 C6 06 0000 E 00 MOV SYSDSPFLG,0 0758 C3 RET ; 0759 SYSDSPOFF: 0759 C6 06 0000 E 01 MOV SYSDSPFLG,1 075E C3 RET ; ;********************************************************************** ;* ENABLE/DISABLE KEY CLICK * ;********************************************************************** 075F CLICKON: 075F C6 06 0000 E 01 MOV CLICKFLG,1 0764 C3 RET ; 0765 CLICKOFF: 0765 C6 06 0000 E 00 MOV CLICKFLG,0 076A C3 RET ; ;********************************************************************** ;* ENABLE/DISABLE CURSOR DISPLAY * ;********************************************************************** 076B CURSORON: 076B C7 06 0AE7 R 4092 MOV CRTDSP,CSRON 0771 E8 0AD0 R CALL KBCSRD ; CURSOR DISP CMD OUT 0774 C3 RET 0775 CURSOROFF: 0775 C7 06 0AE7 R 4012 MOV CRTDSP,CSROFF 077B E8 0AD0 R CALL KBCSRD ; CURSOR DISP CMD OUT 077E C3 RET ; ;********************************************************************** ;* ENABLE/DISABLE KEY BOARD INPUT * ;********************************************************************** 077F KEYINON: 077F C6 06 0000 E 00 MOV SYSKEYINFLG,0 0784 C3 RET ; 0785 KEYINOFF:  The Microsoft MACRO Assembler , Version 1.25 Page 1-36 CONOUT 01-31-84 0785 C6 06 0000 E 01 MOV SYSKEYINFLG,1 078A C3 RET ;   The Microsoft MACRO Assembler , Version 1.25 Page 1-37 CONOUT 01-31-84 PAGE ;**************************************************************** ;* * ;* ESC DSR * ;* * ;* ESC [ 6 n ; CURSOR POSITION REPORT * ;* * ;**************************************************************** 078B ESCDSR PROC 078B 56 PUSH SI 078C 52 PUSH DX 078D 51 PUSH CX 078E BE 0020 R MOV SI,OFFSET ANSIPRMTBL 0791 80 3E 001F R 01 CMP ANSINOP,1 0796 75 12 JNZ ESCDSRRET 0798 83 3C 06 CMP WORD PTR [SI],6 079B 75 0D JNZ ESCDSRRET 079D BA 01CA R MOV DX,OFFSET ESCCPR 07A0 B1 04 MOV CL,4 07A2 CD DC INT 220 07A4 C7 06 01D2 R 0008 MOV ESCCPRCNT,8 07AA ESCDSRRET: 07AA 59 POP CX 07AB 5A POP DX 07AC 5E POP SI  07AD C3 RET 07AE ESCDSR ENDP ;**************************************************************** ;* * ;* ESC SCP * ;* * ;* ESC [ s ; SAVE CURSOR POSITION * ;* * ;**************************************************************** 07AE ESCSCP PROC 07AE 56 PUSH SI 07AF 50 PUSH AX 07B0 BE 0020 R MOV SI,OFFSET ANSIPRMTBL 07B3 80 3E 001F R 02 CMP ANSINOP,2 07B8 73 11 JNC ESCSCPRET 07BA 83 3C 00 CMP WORD PTR [SI],0 07BD 75 0C JNZ ESCSCPRET 07BF A0 0002 R MOV AL,LA 07C2 A2 01D4 R MOV SCPLA,AL 07C5 A0 0003 R MOV AL,CA 07C8 A2 01D5 R MOV SCPCA,AL 07CB ESCSCPRET: 07CB 58 POP AX 07CC 5E POP SI 07CD C3 RET  The Microsoft MACRO Assembler , Version 1.25 Page 1-38 CONOUT 01-31-84  07CE ESCSCP ENDP ;**************************************************************** ;* * ;* ESC RCP * ;* * ;* ESC [ u ; RESTORE CURSOR POSITION * ;* * ;**************************************************************** 07CE ESCRCP PROC 07CE 56 PUSH SI 07CF 50 PUSH AX 07D0 BE 0020 R MOV SI,OFFSET ANSIPRMTBL 07D3 80 3E 001F R 02 CMP ANSINOP,2 07D8 73 14 JNC ESCRCPRET 07DA 83 3C 00 CMP WORD PTR [SI],0 07DD 75 0F JNZ ESCRCPRET 07DF A0 01D4 R MOV AL,SCPLA 07E2 A2 0002 R MOV LA,AL 07E5 A0 01D5 R MOV AL,SCPCA 07E8 A2 0003 R MOV CA,AL 07EB E8 07FD R CALL CSWRT 07EE ESCRCPRET: 07EE 58 POP AX 07EF 5E POP SI 07F0 C3 RET 07F1 ESCRCP ENDP  The Microsoft MACRO Assembler , Version 1.25  Page 1-39 CONOUT 01-31-84 PAGE ;******************************************* ;* CURSOR POSITION VERTICAL UP * ;******************************************* 07F1 VURRTN: 07F1 80 3E 0002 R 00 CMP LA,00H 07F6 74 15 JE VURRTNRET ; IF LA=FIRST LINE 07F8 80 2E 0002 R 01 SUB LA,01H 07FD CSWRT: 07FD 50 PUSH AX 07FE 8A 36 0002 R MOV DH,LA 0802 8A 16 0003 R MOV DL,CA 0806 E8 0A10 R CALL KBLCCV ; TO SCREEN MEMORY ADDR 0809 E8 0A66 R CALL KBCSRO ; CURSOR POSIT. OUTPUT 080C 58 POP AX 080D VURRTNRET: 080D C3 RET ;******************************************* ;* CURSOR LINE FEED * ;******************************************* 080E LFRTN: 080E 80 3E 0002 R 18 CMP LA,DPLINE-1 0813 72 05 JB LFRTN010 ; IF LA=NOT END LINE 0815 E8 08EE R CALL ROLLUP ; ROLL UP 0818 EB E3 JMP SHORT CSWRT ; GDC CURSOR WRITE 081A LFRTN010: 081A FE 06 0002 R INC LA 081E EB DD JMP SHORT CSWRT ; GDC CURSOR WRITE ;******************************************* ;* CURSOR POSITION HORIZONTAL RIGHT * ;******************************************* 0820 FFRTN: 0820 FE 06 0003 R INC CA ; COLUMN ADDRESS COUNT UP 0824 80 3E 0002 R 19 CMP LA,DPLINE ; CHECK IF CURSOR IS OUT OF SCREEN 0829 74 17 JE FFRTN010 082B 80 3E 0003 R 50 CMP CA,COLUMN ; CHECK IF CURSOR IS OUT OF SCREEN 0830 72 17 JB FFRTN020 0832 C6 06 0003 R 00 MOV CA,00H 0837 FE 06 0002 R INC LA ; COLUMN ADDRESS COUNT UP 083B 80 3E 0002 R 19 CMP LA,DPLINE 0840 72 07 JB FFRTN020 0842 FFRTN010: 0842 E8 08EE R CALL ROLLUP ; ROLL UP SCREEN 0845 FE 0E 0002 R DEC LA ; 0849 FFRTN020: 0849 EB B2 JMP CSWRT ; GDC CURSOR WRITE ;******************************************* ;* CURSOR POSITON HORIZONTAL LEFT * ;******************************************* 084B BSRTN: 084B 80 3E 0003 R 00 CMP CA,00H 0850 74 07 JE BSRTN010 ; IF FIRST OF COLUMN 0852 80 2E 0003 R 01 SUB CA,01H  The Microsoft MACRO Assembler , Version 1.25 Page 1-40 CONOUT 01-31-84 0857 EB 10 JMP SHORT BSRTN020 0859 BSRTN010: 0859 80 3E 0002 R 00 CMP LA,00H 085E 74 0B JE BSRTN030 ; IF FIRST OF LINE 0860 FE 0E 0002 R DEC LA 0864 C6 06 0003 R 4F MOV CA,COLUMN-1 0869 BSRTN020: 0869 EB 92 JMP CSWRT ; GDC CURSOR WRITE 086B BSRTN030: 086B C3 RET ;******************************************* ;* CHARRIAGE RETURN * ;******************************************* 086C C6 06 0003 R 00 CRRTN: MOV CA,00H ; FIRST OF COLUMN ADDR 0871 EB 8A JMP CSWRT ; GDC CURSOR WRITE ;---------------------------------------------------  The Microsoft MACRO Assembler , Version 1.25 Page 1-41 CONOUT 01-31-84 PAGE ;******************************************* ;* HOME * ;******************************************* 0873 HOMERTN: 0873 C6 06 0002 R 00 MOV LA,00H ; FIRST OF LINE ADDR 0878 C6 06 0003 R 00 MOV CA,00H ; FIRST OF COLUMN ADDR 087D E9 07FD R JMP CSWRT ; GDC CURSOR WRITE ;--------------------------------------------------- ;******************************************* ;* CRT ALL CLEAR * ;******************************************* 0880 CLRRTN: 0880 50 PUSH AX 0881 E8 0AEE R CALL CRTCLR ; CRT CLEAR CALL 0884 58 POP AX 0885 C3 RET ;******************************************* ;* GENERAL DATA * ;******************************************* 0886 DATARTN: 0886 C6 06 0000 E 01 MOV GDCBUSYF,1 ; GDC BUSY FLAG ON ;--- rmg / necis / 3-1-84 --- delete the eos scroll as per nec/t release ;----------------------------------------------02/23/1983-------------- ; CMP LA,DPLINE-1 ; CHECK IF CURSOR POS. IS (LA=24,CA=79) ; JNE DATARTN_NOMAL ; CMP CA,COLUMN-1 ; JNE DATARTN_NOMAL ; CALL LACAUP ; CALL KBDTLO ; MOV AL,' ' ; CALL LACAUP ; CALL KBDTLO ; CALL BSRTN ; MOV GDCBUSYF,0 ; RET ;DATARTN_NOMAL: ;---------------------------------------------------------------------- ;--- rmg / necis / 1-3-84 088B E8 089A R CALL LACAUP ; LA,CA CHECK / ROLL-UP 088E E8 08C3 R call u_aux_check ; --- rmg / necis / 1-3-84 for ucg 0891 E8 0000 E CALL KBDTLO ; GDC CODE WRITE 0894 C6 06 0000 E 00 MOV GDCBUSYF,0 ; GDC BUSY FLAG OFF 0899 C3 RET ;******************************************* ;* LINE ADDR , COLUMN ADDR CHECK * ;******************************************* 089A LACAUP: 089A 80 3E 0002 R 19 CMP LA,DPLINE ; CHECK IF CURSOR POSITON IS (LA=25,CA=0) 089F 74 16 JE LACA010 08A1 FE 06 0003 R INC CA ; COLUMN ADDRESS COUNT UP  The Microsoft MACRO Assembler , Version 1.25 Page 1-42 CONOUT 01-31-84 08A5 80 3E 0003 R 50 CMP CA,COLUMN ; CHECK IF CURSOR IS OUT OF SCREEN 08AA 72 16 JB LACA020 08AC C6 06 0003 R 00 MOV CA,00H 08B1 FE 06 0002 R INC LA ; LINE ADDRESS COUNT UP 08B5 EB 0B JMP SHORT LACA020 08B7 LACA010: 08B7 E8 08EE R CALL ROLLUP ; ROLL UP SCREEN 08BA FE 06 0003 R INC CA 08BE FE 0E 0002 R DEC LA 08C2 LACA020: 08C2 C3 RET ; RETURN ;******************************************************** ;* CHECK ASCII/ALTERNATE * ;******************************************************** 08C3 U_AUX_CHECK: 08C3 8A 26 0008 R MOV AH,ALTRBYTFLG 08C7 F6 C4 80 TEST AH,80H 08CA 75 15 JNE U_AUX_CHECK20 08CC F6 C4 07 TEST AH,07H 08CF 75 17 JNE U_AUX_CHECK30 08D1 3A 06 0000 E CMP AL,U_AUXCGTBL 08D5 77 0A JA U_AUX_CHECK20 08D7 8A E0 MOV AH,AL 08D9 BB 0001 E MOV BX,OFFSET U_AUXCGTBL + 1 08DC D7 XLAT 08DD 3A C4 CMP AL,AH 08DF 75 07 JNE U_AUX_CHECK30 08E1 U_AUX_CHECK20: 08E1 C6 06 0000 E 00 MOV ALTRBYT,00H ; SET ASCII CODE 08E6 EB 05 JMP SHORT U_AUX_CHECK40 08E8 U_AUX_CHECK30: 08E8 C6 06 0000 E 89 MOV ALTRBYT,89H ; SET ALTERNATE CODE 08ED U_AUX_CHECK40: 08ED C3 RET  The Microsoft MACRO Assembler , Version 1.25 Page 1-43 CONOUT 01-31-84 PAGE  ;******************************************* ;* ROLL-UP * ;******************************************* 08EE ROLLUP: 08EE 50 PUSH AX 08EF 51 PUSH CX ; ;* ROLL UP ; 08F0 A1 000D R MOV AX,KBSAD1 08F3 3D 0FA0 CMP AX,ENDLINE ; KBSAD1 = END LINE ? 08F6 74 13 JE ROL005 ; INITIALIZE SCREEN ADDRESS 08F8 3D 0820 CMP AX,HFLINE ; KBSAD1 = HALF LINE OF VRAM? 08FB 7D 10 JGE ROL010 08FD C7 06 0013 R 0000 MOV KBSL2,0 ; KBSAD1 < HALF LINE 0903 05 07D0 ADD AX,DPLINE*COLUMN 0906 A3 001B R MOV LINESAVE,AX 0909 EB 16 JMP SHORT ROL020 090B EB 67 ROL005: JMP SHORT ROLINIT 090D ROL010: 090D 2D 0820 SUB AX,HFLINE ; HALF LINE <= KBSAD1 0910 50 PUSH AX 0911 05 0050 ADD AX,STLINE 0914 A3 001B R MOV LINESAVE,AX 0917 58 POP AX 0918 05 0050 ADD AX,LINE1 091B E8 0A01 R CALL KBCHARCHG ; CONVERT CHAR TO LENGTH 091E A3 0013 R MOV KBSL2,AX 0921 ROL020: 0921 83 06 000D R 50 ADD KBSAD1,LINE1 ; ADD ONE LINE TO KBSAD1 0926 B8 1DB0 MOV AX,LINEMAX 0929 2B 06 0013 R SUB AX,KBSL2 092D A3 000F R MOV KBSL1,AX 0930 ROL030: 0930 E8 0A85 R CALL KBSCRO ; SCROLL CMD. OUTPUT ; ;* ROLL DOWN ;* SPACE CLEAR NEWLINE IF ROLL DOWN NOT OCCURRED ; 0933 80 3E 001D R 00 CMP ROLDCNT,0 ; CHECK IF ROLL DOWN OCCURRED 0938 74 06 JE ROL035 ; NO 093A FE 0E 001D R DEC ROLDCNT 093E EB 31 JMP SHORT ROL070 0940 ROL035: 0940 80 3E 001D R 00 CMP ROLDCNT,0 0945 75 05 JNE ROL036 ; 0947 C6 06 0000 E 00 MOV FLAGX,0 ; 094C ROL036: 094C B6 18 MOV DH,DPLINE-1  The Microsoft MACRO Assembler , Version 1.25 Page 1-44 CONOUT 01-31-84 094E B2 00 MOV DL,0 0950 E8 0A10 R CALL KBLCCV 0953 B9 0050 MOV CX,COLUMN 0956 49 DEC CX 0957 E8 0B3A R CALL KBCRTC0 ; CLEAR NEW LINE 095A ROL060: ; ;* CHECK ATTACHED TO BOTTOM OF SCREEN MEMORY ; 095A A1 001B R MOV AX,LINESAVE ; SET LAST WRITTEN LINE 095D A3 0019 R MOV LINELAST,AX 0960 80 3E 001E R 00 CMP ROLDSTOP,0 0965 75 0A JNE ROL070 0967 3D 0FA0 CMP AX,ENDLINE ; FIRST ROLL DOWN TO VRAM? 096A 75 05 JNE ROL070 096C C6 06 001E R 01 MOV ROLDSTOP,1 ; RESET FIRST ROLL DOWN FLAG 0971 ROL070: 0971 59 POP CX 0972 58 POP AX 0973 C3 RET ; RETURN 0974 ROLINIT: 0974 C7 06 000D R 0050 MOV KBSAD1,COLUMN 097A C7 06 000F R 1DB0 MOV KBSL1,LINEMAX 0980 C7 06 0011 R 0050 MOV KBSAD2,COLUMN 0986 C7 06 0013 R 0000 MOV KBSL2,0 098C EB A2 JMP SHORT ROL030 ;******************************************* ;* ROLL DOWN * ;******************************************* 098E ROLLDOWN: 098E 50 PUSH AX 098F 53 PUSH BX ; ;* CHECK ENABLE ROLL DOWN ;* DISPLAY START LINE OVER SCREEN MEMORY OR LAST WRITTEN LINR ? ; 0990 A1 000D R MOV AX,KBSAD1 0993 8B 1E 0019 R MOV BX,LINELAST ; BX=LAST WRITTEN LINE 0997 3D 0050 CMP AX,STLINE 099A 75 07 JNE ROLD005 099C 80 3E 001E R 00 CMP ROLDSTOP,0 09A1 74 5B JE ROLDRET ; KBSAD1 = STLINE & ; ROLDSTOP = 0 THEN THROUGH RETURN 09A3 ROLD005: 09A3 81 FB 0FA0 CMP BX,ENDLINE 09A7 75 07 JNE ROLD010 09A9 3D 0050 CMP AX,STLINE 09AC 74 50 JE ROLDRET ; LAST LINE=ENDLINE & ; KBSAD1 = STLINE ; THEN THROUGH 09AE EB 22 JMP SHORT ROLD030 ; LAST LINE = END LINE & ; KBSAD1 <> STLINE  The Microsoft MACRO Assembler , Version 1.25 Page 1-45 CONOUT 01-31-84 09B0 ROLD010: 09B0 83 C3 50 ADD BX,LINE1 09B3 3B C3 CMP AX,BX 09B5 74 47 JE ROLDRET ; IF LAST LINE THEN RETURN ; ;* ROLL DOWN ; 09B7 ROLD020: 09B7 83 3E 000D R 50 CMP KBSAD1,STLINE 09BC 75 14 JNE ROLD030 09BE C7 06 000D R 0FA0 MOV KBSAD1,ENDLINE ; KBSAD1=STLINE 09C4 C7 06 000F R 0130 MOV KBSL1,LINESIZE 09CA C7 06 0013 R 1C80 MOV KBSL2,LINESIZE*(DPLINE-1) 09D0 EB 25 JMP SHORT ROLD060 09D2 ROLD030: 09D2 3D 0870 CMP AX,HFLINE+LINE1 09D5 7F 08 JG ROLD040 09D7 C7 06 0013 R 0000 MOV KBSL2,0 ; KBSAD1 <= HFLINE + LINE1 09DD EB 09 JMP SHORT ROLD050 09DF ROLD040: 09DF 2D 0870 SUB AX,HFLINE+LINE1 09E2 E8 0A01 R CALL KBCHARCHG 09E5 A3 0013 R MOV KBSL2,AX 09E8 ROLD050: 09E8 83 2E 000D R 50 SUB KBSAD1,LINE1 09ED B8 1DB0 MOV AX,LINEMAX 09F0 2B 06 0013 R SUB AX,KBSL2 09F4 A3 000F R MOV KBSL1,AX 09F7 ROLD060: 09F7 E8 0A85 R CALL KBSCRO ; OUTPUT SCROLL CMD 09FA FE 06 001D R INC ROLDCNT 09FE ROLDRET: 09FE 5B POP BX 09FF 58 POP AX 0A00 C3 RET  The Microsoft MACRO Assembler , Version 1.25 Page 1-46 CONOUT 01-31-84 PAGE ;************************************************ ;* CHARACTER TO SCREEN LENGTH * ;* AX = AX / 80 * 304 * ;* * ;* INPUT AX:NUMBER OF CHARACTER * ;* OUTPUT AX:SCREEN LENGTH * ;* BREAK DX * ;************************************************ 0A01 KBCHARCHG: 0A01 53 PUSH BX 0A02 B3 50 MOV BL,COLUMN 0A04 F6 F3 DIV BL ; AX/COLUMN 0A06 8B D8 MOV BX,AX 0A08 D1 E3 SHL BX,1 0A0A 8B 87 0131 R MOV AX,OFFSET TBL_LIN[BX] 0A0E 5B POP BX 0A0F C3 RET ;************************************************ ;* LA,CA TO SCREEN MEMORY ADDR CONVERT * ;* * ;* INPUT DH:LA (LINE ADDRESS) * ;* DL:CA (COLUM ADDRESS) * ;* OUTPUT AX:SCREEN MEMORY ADDRESS* ;************************************************ 0A10 KBLCCV: 0A10 A1 000F R MOV AX,KBSL1 0A13 E8 0A48 R CALL SL1CHNG ; SL TO CHARACTER NO. 0A16 A3 0006 R MOV KBWKSL,AX 0A19 E8 0A39 R CALL LACACHNG ; SCREEN RELATIVE ADDRESS 0A1C 3B 06 0006 R CMP AX,KBWKSL 0A20 7C 12 JL KBLCCV010 0A22 81 3E 0006 R 07D0 CMP KBWKSL,2000 0A28 74 0A JZ KBLCCV010 0A2A 2B 06 0006 R SUB AX,KBWKSL 0A2E 03 06 0011 R ADD AX,KBSAD2 0A32 EB 04 JMP SHORT KBLCCV020 0A34 KBLCCV010: 0A34 03 06 000D R ADD AX,KBSAD1 0A38 KBLCCV020: 0A38 C3 RET ; RETURN ;********************************************* ;* LA,CA TO SCREEN RELATIVE ADDR * ;* INPUT DH : LA * ;* DL : CA * ;* OUTPUT AX : SCREEN RELATIV ADDR* ;********************************************* 0A39 LACACHNG: 0A39 53 PUSH BX 0A3A 2B DB SUB BX,BX 0A3C 86 DE XCHG BL,DH 0A3E D1 E3 SHL BX,1 0A40 8B 87 00FD R MOV AX,OFFSET TBL_CLM[BX]  The Microsoft MACRO Assembler , Version 1.25 Page 1-47 CONOUT 01-31-84 0A44 03 C2 ADD AX,DX 0A46 5B POP BX 0A47 C3 RET ; RETURN ;********************************************* ;* SL1 TO CHARACTER NO. CONVERT * ;* AX = AX / 304 * 80 * ;* * ;* INPUT AX : SCREEN LENGTH * ;* OUTPUT AX : CHARACTER NO. * ;********************************************* 0A48 SL1CHNG: 0A48 53 PUSH BX 0A49 8B D8 MOV BX,AX 0A4B 2B C0 SUB AX,AX 0A4D 81 FB 1300 CMP BX,LINESIZE * 16 0A51 72 03 JB SL1CHNG1 0A53 B8 0500 MOV AX,COLUMN * 16 0A56 SL1CHNG1: 0A56 D1 EB SHR BX,1 0A58 D1 EB SHR BX,1 0A5A D1 EB SHR BX,1 0A5C 81 E3 001E AND BX,001EH 0A60 03 87 00DD R ADD AX,OFFSET TBL_SL1[BX] 0A64 5B POP BX 0A65 C3 RET ; RETURN  The Microsoft MACRO Assembler , Version 1.25 Page 1-48 CONOUT 01-31-84 PAGE ;******************************************** ;* CURSOR POSITION OUTPUT * ;* INPUT AX ; SCREEN ADDR * ;******************************************** 0A66 KBCSRO: 0A66 50 PUSH AX 0A67 50 PUSH AX 0A68 C6 06 0000 E 01 MOV GDCBUSYF,1 ; SET GDC BUSY ; 0A6D KBCSRO1: 0A6D E4 40 IN AL,40H 0A6F A8 04 TEST AL,04H 0A71 74 FA JZ KBCSRO1 ; 0A73 B0 49 MOV AL,49H 0A75 E6 42 OUT 42H,AL 0A77 58 POP AX 0A78 E6 40 OUT 40H,AL 0A7A 8A C4 MOV AL,AH 0A7C E6 40 OUT 40H,AL ; 0A7E C6 06 0000 E 00 MOV GDCBUSYF,0 0A83 58 POP AX 0A84 C3 RET ; RETURN ;******************************************** ;* SCROLL COMMAND OUTPUT * ;******************************************** 0A85 KBSCRO: 0A85 53 PUSH BX 0A86 C6 06 0000 E 01 MOV GDCBUSYF,1 ; GDC BUSY FLAG ON 0A8B BSC00: 0A8B E4 40 IN AL,40H ; GDC STATUS READ ; *** NOTE *** ; TEST AL,20H ; VERTICAL SYNC (DB5) ; JZ BSC00 ; IF NOT READY ; TEST AL,08H ; DRAWING (DB3) ; JNZ BSC00 ; IF DRAWING NOW 0A8D A8 04 TEST AL,04H ; FIFO EMPTY (DB2) 0A8F 74 FA JZ BSC00 ; IF NOT EMPTY 0A91 B0 70 MOV AL,70H 0A93 E6 42 OUT 42H,AL ; SCROL COMMAND WRITE 0A95 BB 0009 R MOV BX,OFFSET KBSAD0 0A98 kbscropat: ; --- rmg / necis / 11-30-83 --- 0A98 B9 0010 MOV CX,010H 0A9B BSC010: 0A9B 8A 07 MOV AL,[BX] 0A9D E6 40 OUT 40H,AL ; WRITE PARAMETER 0A9F 43 INC BX 0AA0 E2 F9 LOOP BSC010 0AA2 C6 06 0000 E 00 MOV GDCBUSYF,0 ; GDC BUSY FLAG OFF 0AA7 5B POP BX 0AA8 C3 RET ; RETURN  The Microsoft MACRO Assembler , Version 1.25 Page 1-49 CONOUT 01-31-84 ;********************************************* ;* MULTI COMMAND OUTPUT TO GDC * ;********************************************* 0AA9 KBMOUT: 0AA9 5E POP SI 0AAA 50 PUSH AX 0AAB 51 PUSH CX 0AAC 2A ED SUB CH,CH 0AAE 2A F6 SUB DH,DH 0AB0 8A 0C MOV CL,[SI] ; COMMAND COUNTER 0AB2 C6 06 0000 E 01 MOV GDCBUSYF,1 ; GDC BUSY FLAG ON 0AB7 BMO000: 0AB7 E4 40 IN AL,40H ; GDC FIFO EMPTY CHECK 0AB9 A8 04 TEST AL,04H ; FIFO EMPTY (DB2) 0ABB 74 FA JZ BMO000 ; IF NOT EMPTY 0ABD 46 BMO010: INC SI 0ABE 8A 04 MOV AL,[SI] ; COMMAND CODE 0AC0 46 INC SI 0AC1 8A 14 MOV DL,[SI] ; I/O ADDR 0AC3 EE OUT DX,AL ; COMMAND WRITE 0AC4 E2 F7 LOOP BMO010 0AC6 C6 06 0000 E 00 MOV GDCBUSYF,0 ; GDC BUSY FLAG OFF 0ACB 59 POP CX 0ACC 58 POP AX 0ACD 46 INC SI 0ACE FF E6 JMP SI ; RETURN ;********************************************** ;* CURSOR DISP * ;********************************************** 0AD0 KBCSRD: 0AD0 C6 06 0000 E 01 MOV GDCBUSYF,1 ; GDC BUSY FLAG ON 0AD5 50 PUSH AX 0AD6 KBCSRD1: 0AD6 E4 40 IN AL,40H ; GDC STATUS READ 0AD8 A8 08 TEST AL,08H ; DRAWING (DB3) 0ADA 75 FA JNZ KBCSRD1 ; IF NOT READY 0ADC A8 20 TEST AL,20H ; VERTICAL SYNC (DB5) 0ADE 74 F6 JZ KBCSRD1 ; IF NOT READY 0AE0 58 POP AX 0AE1 E8 0AA9 R CALL KBMOUT ; MULT CMD.OUTPUT 0AE4 04 DB 04H 0AE5 424B DW 424BH 0AE7 4092 CRTDSP DW 4092H 0AE9 4001 DW 4001H 0AEB 408A DW 408AH 0AED C3 RET ;********************************************** ;* CRT CLEAR CALL SUBROUTINE * ;********************************************** 0AEE CRTCLR: ; LOCAL CLEAR 0AEE C6 06 001F R 01 MOV ANSINOP,1 0AF3 C7 06 0020 R 0002 MOV ANSIPRMTBL,2  The Microsoft MACRO Assembler , Version 1.25 Page 1-50 CONOUT 01-31-84 0AF9 E8 0577 R CALL ESCED 0AFC E8 037B R CALL ESCRESET 0AFF E9 07FD R JMP CSWRT ; CURSOR WRITE ;********************************************** ;* CRT CLEAR * ;* INPUT AX = SCREEN MEMORY ADDR * ;* DL = ATTRITRIBUTE * ;* DH = CLEAR CODE  * ;* CX = CLEAR LENGTH FROM 0 * ;********************************************** 0B02 KBCRTC: 0B02 50 PUSH AX 0B03 A2 0B20 R MOV BCC010,AL 0B06 88 26 0B22 R MOV BCC020,AH 0B0A 88 0E 0B2E R MOV BCC030,CL 0B0E 88 2E 0B30 R MOV BCC040,CH 0B12 88 16 0B34 R MOV BCC050,DL 0B16 88 36 0B36 R MOV BCC060,DH 0B1A E8 0AA9 R CALL KBMOUT ; MULTI COM. OUTPUT 0B1D 0D DB 0DH 0B1E 4249 DW 4249H ; CSRW COM. OUTPUT 0B20 00 BCC010 DB 00H 0B21 40 DB 40H 0B22 00 BCC020 DB 00H 0B23 40 DB 40H 0B24 424A DW 424AH 0B26 40FF DW 40FFH 0B28 40FF DW 40FFH 0B2A 424C DW 424CH 0B2C 4002 DW 4002H 0B2E 00 BCC030 DB 00H 0B2F 40 DB 40H 0B30 00 BCC040 DB 00H 0B31 40 DB 40H 0B32 4220 DW 4220H 0B34 00 BCC050 DB 00H 0B35 40 DB 40H 0B36 00 BCC060 DB 00H 0B37 40  DB 40H 0B38 58 POP AX 0B39 C3 RET ;********************************************************************** ;* KBCRTC0 CRT CLEAR WITH ATTRIBUTE AREA * ;* AX = SCREEN MEMORY ADDRESS * ;* CX = CLEAR LENGTH * ;********************************************************************** 0B3A KBCRTC0: 0B3A 81 F9 FFFF CMP CX,0FFFFH ; IF CLEAR LENGTH IS ZERO 0B3E 74 27 JE KBCRTC02 0B40 52 PUSH DX 0B41 50 PUSH AX 0B42 BA 2000 MOV DX,2000H 0B45 E8 0B02 R CALL KBCRTC  The Microsoft MACRO Assembler , Version 1.25 Page 1-51 CONOUT 01-31-84 0B48 05 1000 ADD AX,1000H 0B4B BA 0080 MOV DX,0080H 0B4E E8 0B02 R CALL KBCRTC 0B51 58 POP AX 0B52 E8 0A66 R CALL KBCSRO 0B55 41 INC CX 0B56 KBCRTC01: ; RESET ATTRIBUTE MAP 0B56 51 PUSH CX  0B57 E8 0BC9 R CALL GENATBIT 0B5A F6 D2 NOT DL 0B5C 59 POP CX 0B5D KBCRTC015: 0B5D 20 15 AND [DI],DL 0B5F D0 C2 ROL DL,1 0B61 72 01 JB KBCRTC017 0B63 47 INC DI 0B64 KBCRTC017: 0B64 E2 F7 LOOP KBCRTC015 0B66 5A POP DX 0B67 KBCRTC02: 0B67 C3 RET ; RETURN ; ;********************************************************************** ;* KBCSAD READ CURSOR ADDRESS * ;* OUTPUT AX; CURSOR SCREEN MEMORY ADDRESS * ;********************************************************************** 0B68 KBCSAD: 0B68 C6 06 0000 E 01 MOV GDCBUSYF,1 ; GDC BUSY FLAG ON 0B6D BCA000: ;*** GDC FIFO EMPTY CHECK **** 0B6D E4 40 IN AL,40H ; GDC STATUS READ 0B6F A8 04 TEST AL,04H ; GDC FIFO EMPTY (DB2) 0B71 74 FA JZ BCA000 ; IF NOT EMPTY 0B73 B0 E0 MOV AL,0E0H 0B75 E6 42 OUT 42H,AL ; CSRR CMD 0B77 BCA010: 0B77 E4 40 IN AL,40H ; READ STATUS 0B79 D0 E8 SHR AL,1 0B7B 73 FA JAE BCA010 ; GDC DATA NOT READY 0B7D E4 42 IN AL,42H ; READ DATA 0B7F 8A E0 MOV AH,AL 0B81 BCA020: 0B81 E4 40 IN AL,40H ; READ STATUS 0B83 D0 E8 SHR AL,1 0B85 73 FA JAE BCA020 0B87 E4 42 IN AL,42H 0B89 86 E0 XCHG AH,AL 0B8B 50 PUSH AX 0B8C B0 6B MOV AL,6BH ; DUMMY COMMAND 0B8E E6 42 OUT 42H,AL 0B90 58 POP AX 0B91 C6 06 0000 E 00 MOV GDCBUSYF,0 ; GDC BUSY FLAG OFF 0B96 C3 RET  The Microsoft MACRO Assembler , Version 1.25 Page 1-52 CONOUT 01-31-84 ;********************************************************************** ;* SCREEN MEMORY ADDRESS TO LA,CA CONVERSION * ;* INPUT AX = SCREEN MEMORY ADDR * ;* OUTPUT DH = LA * ;* DL = CA  * ;********************************************************************** 0B97 3D 0050 KBSACV: CMP AX,CTLLINE 0B9A 72 2A JB BSA020 ; IF CONTROL LINE 0B9C 3B 06 000D R CMP AX,KBSAD1 0BA0 73 15 JAE BSA010 0BA2 50 PUSH AX 0BA3 B8 0FF0 MOV AX,LASTLINE+1 0BA6 8B 0E 000D R MOV CX,KBSAD1 0BAA 2B C1 SUB AX,CX 0BAC 8B C8 MOV CX,AX 0BAE 58 POP AX 0BAF 2B 06 0011 R SUB AX,KBSAD2 0BB3 03 C1 ADD AX,CX 0BB5 EB 06 JMP SHORT BSA015 0BB7 8B 0E 000D R BSA010: MOV CX,KBSAD1 0BBB 2B C1 SUB AX,CX 0BBD BSA015: 0BBD B1 50 MOV CL,COLUMN 0BBF F6 F1 DIV CL 0BC1 8A F0 MOV DH,AL 0BC3 8A D4 MOV DL,AH 0BC5 C3 RET ; 0BC6 2B D2 BSA020: SUB DX,DX ; DX = LA,CA (00) 0BC8 C3 RET ; ;******************************************************************* ;* GENERATE ATTRIBUTE MASK BIT  * ;* INPUT AX = SCREEN MEMORY ADDRESS * ;******************************************************************* ; 0BC9 GENATBIT: 0BC9 8B C8 MOV CX,AX ; (SCREEN MEMORY ADDRESS /8) 0BCB D1 E8 SHR AX,1 0BCD D1 E8 SHR AX,1 0BCF D1 E8 SHR AX,1 0BD1 8B F8 MOV DI,AX 0BD3 80 E1 07 AND CL,7 0BD6 B2 01 MOV DL,1 ; SET (DB0) ON 0BD8 D2 E2 SHL DL,CL 0BDA 81 C7 0000 E ADD DI,OFFSET ATMAP ; GENERATE ATTRIBUTE MASK BIT 0BDE C3 RET ; ; Interface to DOS ; ;  The Microsoft MACRO Assembler , Version 1.25 Page 1-53 CONOUT 01-31-84 ; IO request packet for nendestructive read ; datpack struc 0000 0D [ db 13 dup (?) ; 13 byte static header ?? ] 000D ?? retchar db ? ; nondestruct read return char 000E datpack ends ; ; con_init ; ; initialize console inturrupt 29hex handler ; 0BDF con_init: 0BDF 1E push ds 0BE0 50 push ax 0BE1 33 C0 xor ax,ax 0BE3 8E D8 mov ds,ax assume ds:seg0 0BE5 58 pop ax 0BE6 C7 06 00A4 R 0BF6 R mov int29_offset, offset fastcon 0BEC 8C 0E 00A6 R mov int29_segment,cs 0BF0 1F pop ds assume ds:code 0BF1 32 E4 xor ah,ah 0BF3 E9 0000 E jmp exit ; ; Interrupt 29h handler ; 0BF6 fastcon: 0BF6 55 push bp 0BF7 8B EC mov bp,sp 0BF9 F6 46 06 20 test byte ptr ss:6[bp],20h 0BFD 74 01 jz nosti 0BFF FB sti 0C00 nosti: 0C00 53 push bx 0C01 51 push cx 0C02 52 push dx 0C03 57 push di 0C04 56 push si 0C05 50 p ush ax 0C06 1E push ds 0C07 8C CA mov dx,cs  The Microsoft MACRO Assembler , Version 1.25 Page 1-54 CONOUT 01-31-84 0C09 8E DA mov ds,dx 0C0B 8A C8 mov cl,al 0C0D E8 01D6 R call conout 0C10 1F pop ds 0C11 58 pop ax 0C12 5E pop si 0C13 5F pop di 0C14 5A pop dx 0C15 59 pop cx 0C16 5B pop bx 0C17 5D pop bp 0C18 CF iret ; ; con_writ ; ; write console device ; 0C19 con_writ: 0C19 E3 2C jcxz con_wrex ; no action for 0 byte requests 0C1B 8B F7 mov si,di ; set up string indices 0C1D con_wr1: 0C1D F7 C6 000F test si,0fh ; on paragraph boundry? 0C21 74 0C jz con_wradj 0C23 26: AC lods byte ptr es:[si] ; get output character 0C25 9A 0000 ---- E call msconout ; ship it 0C2A E2 F1 loop con_wr1 ; and back for more 0C2C EB 19 90 jmp con_wrex ; (unless done with entrie request 0C2F con_wradj: 0C2F 51 push cx ; adjust for clean transfer segment 0C30 B1 04 mov cl,4 ; 0C32 D3 EE shr si,cl ; divide for para. boundry 0C34 8C C1 mov cx,es 0C36 03 CE add cx,si 0C38 8E C1 mov es,cx 0C3A 59 pop cx 0C3B BE 0000 mov si,0 0C3E con_wr2: 0C3E 26: AC lods byte ptr es:[si] ; get next output char 0C40 9A 0000 ---- E call msconout ; ship it 0C45 E2 F7 loop con_wr2 ; and go for next 0C47 con_wrex: 0C47 E9 0000 E jmp exit ; normal exit ; ; con_wrst ; ; return console write status ; = 0040 gdc_status equ 40h ; 0C4A con_wrst: 0C4A E4 40 in al,gdc_status ; get gdc fifo staus 0C4C A8 04 test al,04h ; ready for more data?  The Microsoft MACRO Assembler , Version 1.25 Page 1-55 CONOUT 01-31-84 0C4E 74 03 jz con_stbusy ; use busy return if not 0C50 E9 0000 E jmp exit ; otherwise normal exit, "ready" 0C53 con_stbusy: 0C53 E9 0000 E jmp busy_exit ; ; con_flsh ; ; flush console input buffer (keyboard fifo) ; 0C56 con_flsh: 0C56 E8 0000 E call flush 0C59 E9 0000 E jmp exit ; ; con_rdnd ; ; read console input buffer (keyboard fifo) no destructive ; 0C5C con_rdnd: 0C5C 9A 0000 ---- E call msconst ; anything in buffer? 0C61 74 0B jz busy1 0C63 2E: C5 1E 0000 E lds bx,cs:[ptrsav] 0C68 88 47 0D mov [bx.retchar],al ; return character if so 0C6B E9 0000 E jmp exit 0C6E E9 0000 E busy1: jmp busy_exit ; ; con_rdsts ; ; report console keyboard input status ; 0C71 con_rdsts: 0C71 9A 0000 ---- E call msconst 0C76 74 03 jz busy2 0C78 E9 0000 E jmp exit 0C7B E9 0000 E busy2: jmp busy_exit ; ; con_read ; ; read console device ; 0C7E con_read: 0C7E E3 28 jcxz con_rdex ; ignore zero length requests 0C80 con_rd1: 0C80 F7 C7 000F test di,0fh 0C84 74 0B jz con_rdadj 0C86 9A 0000 ---- E call msconin 0C8B AA stosb 0C8C E2 F2 loop con_rd1 0C8E EB 18 90 jmp con_rdex 0C91 con_rdadj: 0C91 51 push cx 0C92 B1 04 mov cl,4  The Microsoft MACRO Assembler , Version 1.25 Page 1-56 CONOUT 01-31-84 0C94 D3 EF shr di,cl 0C96 8C C1 mov cx,es 0C98 03 CF add cx,di 0C9A 8E C1 mov es,cx 0C9C 59 pop cx 0C9D BF 0000 mov di,0 0CA0 con_rd2: 0CA0 9A 0000 ---- E call msconin 0CA5 AA stosb 0CA6 E2 F8 loop con_rd2 0CA8 con_rdex: 0CA8 E9 0000 E jmp exit 0CAB CODE ENDS 0000 SEG0 segment at 0 assume cs:seg0 00A4 org 29h * 4 00A4 0000 int29_offset dw 00A6 org (29h * 4) + 2 00A6 0000 int29_segment dw 00A8 SEG0 ends END  The Microsoft MACRO Assembler , Version 1.25 Page Symbols-1 CONOUT 01-31-84 Structures and records: N a m e Width # fields Shift Width Mask Initial DATPACK. . . . . . . . . . . . . 000E 0002 RETCHAR. . . . . . . . . . . . . 000D Segments and groups: N a m e Size align combine class CODE . . . . . . . . . . . . . . 0CAB PARA PUBLIC 'CODE' SEG0 . . . . . . . . . . . . . . 00A8 AT 0000 Symbols: N a m e Type Value Attr ALTRBYT. . . . . . . . . . . . . V BYTE 0000 CODE External ALTRBYTFLG . . . . . . . . . . . L BYTE 0008 CODE Global ANSINOP. . . . . . . . . . . . . L BYTE 001F CODE ANSIPRMTBL . . . . . . . . . . . L WORD 0020 CODE Length =000A ANSIPRMTBLSZ . . . . . . . . . . Number 000A ATMAP. . . . . . . . . . . . . . V BYTE 0000 CODE External ATTRIB . . . . . . . . . . . . . V BYTE 0000 CODE External ATTRIBS. . . . . . . . . . . . . L BYTE 0035 CODE ATTRIBWK . . . . . . . . . . . . L BYTE 0034 CODE ATTRTBL. . . . . . . . . . . . . L BYTE 0036 CODE BCA000 . . . . . . . . . . . . . L NEAR 0B6D CODE BCA010 . . . . . . . . . . . . . L NEAR 0B77 CODE BCA020 . . . . . . . . . . . . . L NEAR 0B81 CODE BCC010 . . . . . . . . . . . . . L BYTE 0B20 CODE BCC020 . . . . . . . . . . . . . L BYTE 0B22 CODE BCC030 . . . . . . . . . . . . . L BYTE 0B2E CODE BCC040 . . . . . . . . . . . . . L BYTE 0B30 CODE BCC050 . . . . . . . . . . . . . L BYTE 0B34 CODE BCC060 . . . . . . . . . . . . . L BYTE 0B36 CODE BELRTN . . . . . . . . . . . . . L NEAR 0274 CODE BMO000 . . . . . . . . . . . . . L NEAR 0AB7 CODE BMO010 . . . . . . . . . . . . . L NEAR 0ABD CODE BSA010 . . . . . . . . . . . . . L NEAR 0BB7 CODE BSA015 . . . . . . . . . . . . . L NEAR 0BBD CODE BSA020 . . . . . . . . . . . . . L NEAR 0BC6 CODE BSC00. . . . . . . . . . . . . . L NEAR 0A8B CODE BSC010 . . . . . . . . . . . . . L NEAR 0A9B CODE BSRTN. . . . . . . . . . . . . . L NEAR 084B CODE BSRTN010 . . . . . . . . . . . . L NEAR 0859 CODE BSRTN020 . . . . . . . . . . . . L NEAR 0869 CODE BSRTN030 . . . . . . . . . . . . L NEAR 086B CODE BUFFCLR. . . . . . . . . . . . . L NEAR 03A0 CODE BUSY1. . . . . . . . . . . . . . L NEAR 0C6E CODE BUSY2. . . . . . . . . . . . . . L NEAR 0C7B CODE BUSY_EXIT. . . . . . . . . . . . L NEAR 0000 CODE External  The Microsoft MACRO Assembler , Version 1.25 Page Symbols-2 CONOUT 01-31-84 CA . . . . . . . . . . . . . . . L BYTE 0003 CODE Global CLICKFLG . . . . . . . . . . . . V BYTE 0000 CODE External CLICKOFF . . . . . . . . . . . . L NEAR 0765 CODE CLICKON. . . . . . . . . . . . . L NEAR 075F CODE  CLRRTN . . . . . . . . . . . . . L NEAR 0880 CODE CNTTBL . . . . . . . . . . . . . L BYTE 005C CODE COLUMN . . . . . . . . . . . . . Number 0050 CONOUT . . . . . . . . . . . . . L NEAR 01D6 CODE Global CONOUT001. . . . . . . . . . . . L NEAR 0208 CODE CONOUT002. . . . . . . . . . . . L NEAR 020E CODE CONOUT003. . . . . . . . . . . . L NEAR 0232 CODE CONOUT004. . . . . . . . . . . . L NEAR 0253 CODE CONOUT005. . . . . . . . . . . . L NEAR 0258 CODE CONOUTRET. . . . . . . . . . . . L NEAR 0234 CODE CONOUTRET9 . . . . . . . . . . . L NEAR 0251 CODE CON_FLSH . . . . . . . . . . . . L NEAR 0C56 CODE Global CON_INIT . . . . . . . . . . . . L NEAR 0BDF CODE Global CON_RD1. . . . . . . . . . . . . L NEAR 0C80 CODE CON_RD2. . . . . . . . . . . . . L NEAR 0CA0 CODE CON_RDADJ. . . . . . . . . . . . L NEAR 0C91 CODE CON_RDEX . . . . . . . . . . . . L NEAR 0CA8 CODE CON_RDND . . . . . . . . . . . . L NEAR 0C5C CODE Global CON_RDSTS. . . . . . . . . . . . L NEAR 0C71 CODE Global CON_R EAD . . . . . . . . . . . . L NEAR 0C7E CODE Global CON_STBUSY . . . . . . . . . . . L NEAR 0C53 CODE CON_WR1. . . . . . . . . . . . . L NEAR 0C1D CODE CON_WR2. . . . . . . . . . . . . L NEAR 0C3E CODE CON_WRADJ. . . . . . . . . . . . L NEAR 0C2F CODE CON_WREX . . . . . . . . . . . . L NEAR 0C47 CODE CON_WRIT . . . . . . . . . . . . L NEAR 0C19 CODE Global CON_WRST . . . . . . . . . . . . L NEAR 0C4A CODE Global CRRTN. . . . . . . . . . . . . . L NEAR 086C CODE CRTCLR . . . . . . . . . . . . . L NEAR 0AEE CODE Global CRTDSP . . . . . . . . . . . . . L WORD 0AE7 CODE Global CSROFF . . . . . . . . . . . . . Number 4012 CSRON. . . . . . . . . . . . . . Number 4092 CSWRT. . . . . . . . . . . . . . L NEAR 07FD CODE Global CTLLINE. . . . . . . . . . . . . Number 0050 CURSOROFF. . . . . . . . . . . . L NEAR 0775 CODE Global CURSORON . . . . . . . . . . . . L NEAR 076B CODE DATARTN. . . . . . . . . . . . . L NEAR 0886 CODE DMAXFLG. . . . . . . . . . . . . V BYTE 0000 CODE External DO_DATA_OUT. . . . . . . . . . . L NEAR 0258 CODE DPLINE . . . . . . . . . . . . . Number 0019 DTOB . . . . . . . . . . . . . . L NEAR 041E CODE DTOB01 . . . . . . . . . . . . . L NEAR 0429 CODE DTOB02 . . . . . . . . . . . . . L NEAR 0432 CODE DTOBRET. . . . . . . . . . . . . L NEAR 044B CODE ENDLINE. . . . . . . . . . . . . Number 0FA0 ESCALTCHR. . . . . . . . . . . . L NEAR 02FD CODE ESCALTPRM. . . . . . . . . . . . L BYTE 00C5 CODE ESCALTRESET. . . . . . . . . . . L NEAR 0322 CODE ESCALTRET. . . . . . . . . . . . L NEAR 0315 CODE  The Microsoft MACRO Assembler , Version 1.25 Page Symbols-3 CONOUT 01-31-84 ESCALTSET. . . . . . . . . . . . L NEAR 0316 CODE ESCALTSET00. . . . . . . . . . . L NEAR 031C CODE ESCANSI. . . . . . . . . . . . . L NEAR 03A9 CODE ESCANSI1 . . . . . . . . . . . . L NEAR 03BE CODE ESCANSIRET . . . . . . . . . . . L NEAR 03D3 CODE ESCANSITBL . . . . . . . . . . . L BYTE 0089 CODE ESCBUFF. . . . . . . . . . . . . L WORD 0199 CODE Length =0014 ESCBUFFSZ. . . . . . . . . . . . Number 0014 ESCCHKH. . . . . . . . . . . . . L NEAR 06C7 CODE ESCCHKH010 . . . . . . . . . . . L NEAR 06D3 CODE ESCCHKHRET . . . . . . . . . . . L NEAR 06D6 CODE ESCCHKL. . . . . . . . . . . . . L NEAR 06BC CODE ESCCHKLRET . . . . . . . . . . . L NEAR 06C6 CODE ESCCPR . . . . . . . . . . . . . L BYTE 01CA CODE Global Length =0008 ESCCPRCNT. . . . . . . . . . . . L WORD 01D2 CODE Global ESCCUB . . . . . . . . . . . . . L NEAR 051C CODE ESCCUB01 . . . . . . . . . . . . L NEAR 0532 CODE ESCCUBRET. . . . . . . . . . . . L NEAR 0537 CODE ESCCUD . . . . . . . . . . . . . L NEAR 04E0 CODE ESCCUD01 . . . . . . . . . . . . L NEAR 04F6 CODE ESCCUDRET. . . . . . . . . . . . L NEAR 04FB CODE ESCCUF . . . . . . . . . . . . . L NEAR 04FE CODE ESCCUF01 . . . . . . . . . . . . L NEAR 0514 CODE ESCCUFRET. . . . . . . . . . . . L NEAR 0519 CODE ESCCUP0. . . . . . . . . . . . . L NEAR 053A CODE ESCCUP00 . . . . . . . . . . . . L NEAR 055A CODE ESCCUP000. . . . . . . . . . . . L NEAR 054C CODE ESCCUP01 . . . . . . . . . . . . L NEAR 056C CODE ESCCUP0RET . . . . . . . . . . . L NEAR 0575 CODE ESCCUP1. . . . . . . . . . . . . L NEAR 02C0 CODE ESCCUP1RET . . . . . . . . . . . L NEAR 02EB CODE ESCCUU . . . . . . . . . . . . . L NEAR 04C2 CODE ESCCUU01 . . . . . . . . . . . . L NEAR 04D8 CODE ESCCUURET. . . . . . . . . . . . L NEAR 04DD CODE ESCDC. . . . . . . . . . . . . . L NEAR 06B5 CODE ESCDL. . . . . . . . . . . . . . L NEAR 06B5 CODE ESCDSR . . . . . . . . . . . . . N PROC 078B CODE Length =0023 ESCDSRRET. . . . . . . . . . . . L NEAR 07AA CODE ESCED. . . . . . . . . . . . . . L NEAR 0577 CODE ESCED00. . . . . . . . . . . . . L NEAR 05AB CODE ESCED000 . . . . . . . . . . . . L NEAR 0591 CODE ESCED01. . . . . . . . . . . . . L NEAR 05E5 CODE ESCED02. . . . . . . . . . . . . L NEAR 0601 CODE ESCED10. . . . . . . . . . . . . L NEAR 0612 CODE ESCED11. . . . . . . . . . . . . L NEAR 0627 CODE ESCED20. . . . . . . . . . . . . L NEAR 0640 CODE ESCED21. . . . . . . . . . . . . L NEAR 064F CODE ESCED22. . . . . . . . . . . . . L NEAR 0662 CODE ESCED99. . . . . . . . . . . . . L NEAR 060F CODE ESCEDCASE. . . . . . . . . . . . L BYTE 01C5 CODE ESCEDRET . . . . . . . . . . . . L NEAR 0665 CODE ESCEDSL1 . . . . . . . . . . . . L WORD 01C6 CODE ESCEDSL2 . . . . . . . . . . . . L WORD 01C8 CODE  The Microsoft MACRO Assembler , Version 1.25 Page Symbols-4 CONOUT 01-31-84 ESCEL. . . . . . . . . . . . . . L NEAR 066B CODE ESCEL0 . . . . . . . . . . . . . L NEAR 06A1 CODE ESCEL2 . . . . . . . . . . . . . L NEAR 06A9 CODE ESCEL3 . . . . . . . . . . . . . L NEAR 06AC CODE ESCELRET . . . . . . . . . . . . L NEAR 06B3 CODE ESCGENPRM. . . . . . . . . . . . L NEAR 03D4 CODE ESCGENPRM01. . . . . . . . . . . L NEAR 03EA CODE ESCGENPRM02. . . . . . . . . . . L NEAR 03F4 CODE ESCGENPRM03. . . . . . . . . . . L NEAR 0403 CODE ESCGENPRMRET . . . . . . . . . . L NEAR 0419 CODE ESCIC. . . . . . . . . . . . . . L NEAR 06B5 CODE ESCIL. . . . . . . . . . . . . . L NEAR 06B5 CODE ESCMIN . . . . . . . . . . . . . L NEAR 06B6 CODE ESCMODE. . . . . . . . . . . . . L BYTE 01C1 CODE ESCNULL. . . . . . . . . . . . . L NEAR 02BF CODE ESCOFF . . . . . . . . . . . . . L NEAR 06D7 CODE ESCOFF010. . . . . . . . . . . . L NEAR 06FB CODE ESCOFF020. . . . . . . . . . . . L NEAR 0700 CODE ESCOFF030. . . . . . . . . . . . L NEAR 0705 CODE ESCOFF040. . . . . . . . . . . . L NEAR 070A CODE ESCOFF050. . . . . . . . . . . . L NEAR 070D CODE ESCOFF060. . . . . . . . . . . . L NEAR 070F CODE ESCON. . . . . . . . . . . . . . L NEAR 0715 CODE ESCON010 . . . . . . . . . . . . L NEAR 0739 CODE ESCON020 . . . . . . . . . . . . L NEAR 073E CODE ESCON030 . . . . . . . . . . . . L NEAR 0743 CODE ESCON040 . . . . . . . . . . . . L NEAR 0748 CODE ESCON050 . . . . . . . . . . . . L NEAR 074B CODE ESCPTR . . . . . . . . . . . . . L WORD 0197 CODE ESCRCP . . . . . . . . . . . . . N PROC 07CE CODE Length =0023 ESCRCPRET. . . . . . . . . . . . L NEAR 07EE CODE ESCRESET . . . . . . . . . . . . L NEAR 037B CODE ESCRTN . . . . . . . . . . . . . L NEAR 02BA CODE ESCSCP . . . . . . . . . . . . . N PROC 07AE CODE Length =0020 ESCSCPRET. . . . . . . . . . . . L NEAR 07CB CODE ESCSDMP. . . . . . . . . . . . . L NEAR 0328 CODE ESCSDMPPRM . . . . . . . . . . . L BYTE 00D1 CODE ESCSDMPRET . . . . . . . . . . . L NEAR 0340 CODE ESCSGR . . . . . . . . . . . . . L NEAR 044F CODE ESCSGR00 . . . . . . . . . . . . L NEAR 0467 CODE ESCSGR01 . . . . . . . . . . . . L NEAR 046A CODE ESCSGR011. . . . . . . . . . . . L NEAR 048B CODE ESCSGR02 . . . . . . . . . . . . L NEAR 0495 CODE ESCSGR03 . . . . . . . . . . . . L NEAR 0487 CODE ESCSGRRET. . . . . . . . . . . . L NEAR 049E CODE ESCSGRRET1 . . . . . . . . . . . L NEAR 04B8 CODE ESCTBL1. . . . . . . . . . . . . L BYTE 007A CODE ESCWTG . . . . . . . . . . . . . L WORD 01C2 CODE EXIT . . . . . . . . . . . . . . L NEAR 0000 CODE External FASTCON. . . . . . . . . . . . . L NEAR 0BF6 CODE FFRTN. . . . . . . . . . . . . . L NEAR 0820 CODE FFRTN010 . . . . . . . . . . . . L NEAR 0842 CODE FFRTN020 . . . . . . . . . . . . L NEAR 0849 CODE  The Microsoft MACRO Assembler , Version 1.25 Page Symbols-5 CONOUT 01-31-84 FLAGX. . . . . . . . . . . . . . V BYTE 0000 CODE External FLUSH. . . . . . . . . . . . . . L NEAR 0000 CODE External GDCBUSYF . . . . . . . . . . . . V BYTE 0000 CODE External GDC_STATUS . . . . . . . . . . . Number 0040 GENATBIT . . . . . . . . . . . . L NEAR 0BC9 CODE Global HFLINE . . . . . . . . . . . . . Number 0820 HIGHEST_CODE . . . . . . . . . . Number 001E HOMERTN. . . . . . . . . . . . . L NEAR 0873 CODE INT29_OFFSET . . . . . . . . . . L WORD 00A4 SEG0 INT29_SEGMENT. . . . . . . . . . L WORD 00A6 SEG0 INTSDP . . . . . . . . . . . . . Number 00DD KBCHARCHG. . . . . . . . . . . . L NEAR 0A01 CODE KBCRTC . . . . . . . . . . . . . L NEAR !0B02 CODE Global KBCRTC0. . . . . . . . . . . . . L NEAR 0B3A CODE Global KBCRTC01 . . . . . . . . . . . . L NEAR 0B56 CODE KBCRTC015. . . . . . . . . . . . L NEAR 0B5D CODE KBCRTC017. . . . . . . . . . . . L NEAR 0B64 CODE KBCRTC02 . . . . . . . . . . . . L NEAR 0B67 CODE KBCSAD . . . . . . . . . . . . . L NEAR 0B68 CODE Global KBCSRD . . . . . . . . . . . . . L NEAR 0AD0 CODE Global KBCSRD1. . . . . . . . . . . . . L NEAR 0AD6 CODE KBCSRO . . . . . . . . . . . . . L NEAR 0A66 CODE Global KBCSRO1. . . . . . . . . . . . . L NEAR 0A6D CODE KBDTLO . . . . . . . . . . . . . L NEAR 0000 CODE External KBLCCV . . . . . . . . . . . . . L NEAR 0A10 CODE Global KBLCCV010. . . . . . . . . . . . L NEAR 0A34 CODE KBLCCV020. . . . . . . . . . . . L NEAR 0A38 CODE KBMOUT . . . . . . . . . . . . . L NEAR 0AA9 CODE Global KBSACV . . . . . . . . . . . . . L NEAR 0B97 CODE Global KBSAD0 . . . . . . . . . . . . . L WORD 0009 CODE Global KBSAD1 . . . . . . . . . . . . . L WORD 000D CODE KBSAD2 . . . . . . . . . . . . . L WORD 0011 CODE KBSAD3 . . . . . . . . . . . . . L WORD 0015 CODE KBSCRO . . . . . . . . . . . . . L NEAR 0A85 CODE Global KBSCROPAT. . . . . . . . . . . . L NEAR 0A98 CODE Global KBSL0. . . . . . . . . . . . . . L WORD 000B CODE KBSL1. . . . . . . . . . . . . . L WORD 000F CODE KBSL2. . . . . . . . . . . . . . L WORD 0013 CODE KBSL3. . . . . . . . . . . . . . L WORD 0017 CODE KBWKSL . . . . . . . . . . . . . L WORD 0006 CODE KEYINOFF . . . . . . . . . . . . L NEAR 0785 CODE KEYINON. . . . . . . . . . . . . L NEAR 077F CODE LA . . . . . . . . . . . . . . . L BYTE 0002 CODE Global LACA010. . . . . . . . . . . . . L NEAR 08B7 CODE LACA020. . . . . . . . . . . . . L NEAR 08C2 CODE LACACHNG . . . . . . . . . . . . L NEAR 0A39 CODE Global LACAUP . . . . . . . . . . . . . L NEAR 089A CODE LASTLINE . . . . . . . . . . . . Number 0FEF LCCHK. . . . . . . . . . . . . . L NEAR 02EC CODE LCCHK01. . . . . . . . . . . . . L NEAR 02F2 CODE LCCHKRET . . . . . . . . . . . . L NEAR 02FC CODE LCOFFSET . . . . . . . . . . . . L BYTE 01C4 CODE LFRTN. . . . . . . . . . . . . . L NEAR 080E CODE  The Microsoft MACRO Assembler , Version 1.25 Page Symbols-6 CONOUT 01-31-84 LFRTN010 . . . . . . . . . . . . L NEAR 081A CODE LINE1. . . . . . . . . . . . . . Alias COLUMN LINELAST . . . . . . . . . . . . L WORD 0019 CODE LINEMAX. . . . . . . . . . . . . Number 1DB0 LINESAVE . . . . . . . . . . . . L WORD 001B CODE LINESIZE . . . . . . . . . . . . Number 0130 LOOKITUP . . . . . . . . . . . . L NEAR 0224 CODE LOOKRET. . . . . . . . . . . . . L NEAR 0270 CODE LOOKUP . . . . . . . . . . . . . L NEAR 0262 CODE Global LOWEST_CODE. . . . . . . . . . . Number 0007 MELBEL . . . . . . . . . . . . . Number 003C MELCLICK . . . . . . . . . . . . Number 0039 MELCNT1. . . . . . . . . . . . . Number 0031 MELCNTBEL. . . . . . . . . . . . Number 0063 MELOUT . . . . . . . . . . . . . L NEAR 0292 CODE MELRDY . . . . . . . . . . . . . Number 0080 MELRET . . . . . . . . . . . . . L NEAR 02B9 CODE MELST. . . . . . . . . . . . . . L NEAR 0299 CODE MELSTC . . . . . . . . . . . . . L BYTE 0001 CODE MELSTP . . . . . . . . . . . . . Number 0060 MELSTT . . . . . . . . . . . . . L BYTE 0000 CODE MELWP. . . . . . . . . . . . . . Number 0060 MINFLG . . . . . . . . . . . . . V BYTE 0000 CODE External MSCONIN. . . . . . . . . . . . . L FAR 0000 CODE External MSCONOUT . . . . . . . . . . . . L FAR 0000 CODE External MSCONST. . . . . . . . . . . . . L FAR 0000 CODE External NOSTI. . . . . . . . . . . . . . L NEAR 0C00 CODE PARA . . . . . . . . . . . . . . Number 0033 PTRSAV . . . . . . . . . . . . . V DWORD 0000 CODE External REGPRNT. . . . . . . . . . . . . L FAR 0000 CODE External ROL005 . . . . . . . . . . . . . L NEAR 090B CODE ROL010 . . . . . . . . . . . . . L NEAR 090D CODE ROL020 . . . . . . . . . . . . . L NEAR 0921 CODE ROL030 . . . . . . . . . . . . . L NEAR 0930 CODE ROL035 . . . . . . . . . . . . . L NEAR 0940 CODE ROL036 . . . . . . . . . . . . . L NEAR 094C CODE ROL060 . . . . . . . . . . . . . L NEAR 095A CODE ROL070 . . . . . . . . . . . . . L NEAR 0971 CODE ROLD005. . . . . . . . . . . . . L NEAR 09A3 CODE ROLD010. . . . . . . . . . . . . L NEAR 09B0 CODE ROLD020. . . . . . . . . . . . . L NEAR 09B7 CODE ROLD030. . . . . . . . . . . . . L NEAR 09D2 CODE ROLD040. . . . . . . . . . . . . L NEAR 09DF CODE ROLD050. . . . . . . . . . . . . L NEAR 09E8 CODE ROLD060. . . . . . . . . . . . . L NEAR 09F7 CODE ROLDCNT. . . . . . . . . . . . . L BYTE 001D CODE Global ROLDRET. . . . . . . . . . . . . L NEAR 09FE CODE ROLDSTOP . . . . . . . . . . . . L BYTE 001E CODE ROLINIT. . . . . . . . . . . . . L NEAR 0974 CODE ROLLDOWN . . . . . . . . . . . . L NEAR 098E CODE Global ROLLUP . . . . . . . . . . . . . L NEAR 08EE CODE Global SCPCA. . . . . . . . . . . . . . L BYTE 01D5 CODE SCPLA. . . . . . . . . . . . . . L BYTE 01D4 CODE  The Microsoft MACRO Assembler , Version 1.25 Page Symbols-7 CONOUT 01-31-84 SCRDMPRET. . . . . . . . . . . . L NEAR 037A CODE SCRDUMP. . . . . . . . . . . . . L NEAR 0353 CODE Global SDMP00 . . . . . . . . . . . . . L NEAR 0341 CODE SDMP01 . . . . . . . . . . . . . L NEAR 0347 CODE SDMP02 . . . . . . . . . . . . . L NEAR 034D CODE SKIP_DATA. . . . . . . . . . . . L NEAR 0260 CODE SKIP_LOOKUP. . . . . . . . . . . L NEAR 0227 CODE SL1CHNG. . . . . . . . . . . . . L NEAR 0A48 CODE SL1CHNG1 . . . . . . . . . . . . L NEAR 0A56 CODE SPDCNT . . . . . . . . . . . . . V WORD 0000 CODE External SPDWK. . . . . . . . . . . . . . V BYTE 0000 CODE External STLINE . . . . . . . . . . . . . Alias COLUMN SYSDSPFLG. . . . . . . . . . . . V BYTE 0000 CODE External SYSDSPOFF. . . . . . . . . . . . L NEAR 0759 CODE SYSDSPON . . . . . . . . . . . . L NEAR 0753 CODE SYSKEYINFLG. . . . . . . . . . . V BYTE 0000 CODE External TBL_CLM. . . . . . . . . . . . . L WORD 00FD CODE TBL_LIN. . . . . . . . . . . . . L WORD 0131 CODE TBL_SL1. . . . . . . . . . . . . L WORD 00DD CODE UCGOFF . . . . . . . . . . . . . V BYTE 0000 CODE External U_AUXCGTBL . . . . . . . . . . . V BYTE 0000 CODE External U_AUX_CHECK. . . . . . . . . . . L NEAR 08C3 CODE U_AUX_CHECK20. . . . . . . . . . L NEAR 08E1 CODE U_AUX_CHECK30. . . . . . . . . . L NEAR 08E8 CODE U_AUX_CHECK40. . . . . . . . . . L NEAR 08ED CODE VURRTN . . . . . . . . . . . . . L NEAR 07F1 CODE VURRTNRET. . . . . . . . . . . . L NEAR 080D CODE WKCA . . . . . . . . . . . . . . L BYTE 0004 CODE WKLA . . . . . . . . . . . . . . L BYTE 0005 CODE Warning Severe Errors Errors 0 0 75 0C JNZ ESCSCPRET 07BF A0 0002 R MOV AL,LA 07C2 A2 01D4 R MOV SCPLA,AL 07C5 A0 0003 R MOV AL,CA 07C8 A2 01D5 R MOV SCPCA,AL 07CB ESCSCPRET: 07CB 58 POP AX 07CC 5E POP SI 07CD C3 RET  The Microsoft MACRO Assembler , Version 1.25 Page 1-38 CONOUT 01-31-84   The Microsoft MACRO Assembler , Version 1.25 Page 1-1 HARDDISK 01-31-84 title HARDDISK page 58,132 ;----------------------------------------------------------------------------- ; ; MS-DOS BIOS for the N.E.C. Advanced Personal Computer ; ; module name: HARDDISK ; MS-DOS version: 2.0 ; module version: 1.0 ; ; abstract: Hard disk IO drivers ; ; contains routines: ; hdsk_init hmediac hget_bpb hdsk_red hdsk_wrv hdsk_wrt ; hd_init hd_select drive_search hd_transfer hd_error ; hd_flush_buf hd_io hd_dma hd_delay nfats ; ; revision history: ; ; The drivers in this module were developed by TICOM, Inc, for ; use with MS-DOS V1.25. They were modified on site at NECIS in May ; 1983, with the assistance of TICOM, for MS-DOS version 2.0. The ; number of FAT! sectors is now calculated and filled in at the BPB. ; The media ID byte is "flipped" whenever the disk change flag is set, ; so that the DOS will pay attention to the new BPB. ; - RMG 6-7-83 ; ; Start addition of slave drive logic, allowing use of 20mb ; configuration. ; - RMG 12-13-83 ; ; Slave drive modifications now operational. Moved disk init and ; change flags into this module from int.asm; now they are accessableu ; via a config table entry. ; - RMG 12-16-83 ; ;----------------------------------------------------------------------------- 0000 CODE SEGMENT PUBLIC 'CODE' EXTRN regprnt:far EXTRN exit:near,err_exit:near,ptrsav:dword EXTRN DSKCHG:FAR EXTRN MSREAD:FAR EXTRN MSWRITE:FAR extrn gord:near,gowr:near extrn driver_num:byte,num_of_sec:word extrn wflag:byte,dma_segment:word extrn hd_ind_on:near,hd_ind_off:near public hd_indication public hd_transfer PUBLIC hdsk_red,hdsk_wrt,hdsk_wrv,hmediac PUBLIC hdsk_init,hget_bpb PUBLIC hd_flush_buf,hd_time_flush  The Microsoft MACRO Assembler , Version 1.25 Page 1-2 HARDDISK 01-31-84 public disk_change_flag,disk_init_flag public hd_direct_mode ASSUME CS:CODE,DS:CODE,SS:CODE,ES:CODE inits struc 0000 0D [ db 13 dup (?) ?? ] 000D ?? nounits db ? 000E ???? dw ? 0010 ???? dw ? 0012 ???? bpbadr dw ? 0014 ???? bpbseg dw ? 0016 inits ends bpbb struc 0000 0D [ db 13 dup (?) ?? ] 000D ?? bpb_med db ? 000E ???? scrt dw ? 0010 ???? dw ? 0012 ???? bpb_adr dw ? 0014 ???? bpb_seg dw ? 0016 bpbb ends medias struc 0000 0D [ db 13 dup (?) ?? ] 000D ?? med_des db ? 000E ?? med_sts db ? 000F medias ends iodat struc 0000 ?? cmdlen db ? 0001 ?? unit db ? 0002 ?? cmd db ? 0003 ???? status dw ? 0005 08 [ db 8 dup (?) ?? ] 000D ?? media db ? 000E ???????? trans dd ? 0012 ???? count dw ? 0014 ???? start dw ? 0016 iodat ends  The Microsoft MACRO Assembler , Version 1.25 Page 1-3 HARDDISK 01-31-84 dpb struc 0000 03 [ bjmp db 3 dup (?) ?? ] 0003 08 [ sysid db 8 dup (?) ?? ] 000B ????  secsiz dw ? 000D ?? alloc db ? 000E ???? ressec dw ? 0010 ?? fats db ? 0011 ???? maxdir dw ? 0013 ???? sectors dw ? 0015 ?? mediaid db ? 0016 ???? fatsec dw ? 0018 ???? secper dw ? 001A dpb ends ; ; Hard disk driver module for MS-DOS V2.0 ; = 9C00 HD_Buffer Equ 9C00H ; Memory buffer for DMA xfer = 0200 HD_Block_Size Equ 512 ; # bytes in virtual sector = 0100 HD_Size_Sector Equ 256 ; # bytes in physical sector = 001A HD_Sector_Count Equ 26 ; # sectors on track = 19FF HD_Track_Size Equ HD_Sector_Count*HD_Size_Sector-1 ; Full track = 1A00 HD_Reloc_Table0 Equ HD_Track_Size+1 ; Buffer relative bad block tbl = 1B00 HD_Cnfg_Table0 Equ HD_Reloc_Table0+HD_Size_Sector ; Drive config = 1C00 HD_Reloc_Table1 Equ HD_Reloc_Table0 + 200h = 1D00 HD_Cnfg_Table1 Equ HD_Cnfg_Table0 + 200h = 000D HD_Block_Track Equ 0DH ; Number of blocks per track = 0004 HD_Base_Unit Equ 04H ; Lowest hard drive unit number = 0008 HD_Max_Retry Equ 8 ; Maximum number of retries = 0001 HD_Time_Out Equ 1 ; Dirty buffer flush delay * 500ms {rg} = BFFB HD_Reloc_Valid Equ 0BFFBH ; Table validation stamp = 0050 HD_Home_Cmd Equ 50H ; Recalibrate command = 0010 HD_Int_Cmd Equ 10H ; Sense interrupt status command = 0068 HD_Seek_Cmd Equ 68H ; Seek command = 0015 HD_Read_DMA Equ 15H ; DMA read command = 0019 HD_Wrt_DMA Equ 19H ; DMA write command = 00B0 HD_Read_Cmd Equ 0B0H ; Read command = 00F0 HD_Wrt_Cmd Equ 0F0H ; Write command = 00A3 HD_DMA_Addr Equ 0A3H ; DMA address register = 0093 HD_DMA_TC Equ 093H ; DMA transfer count register = 00AB HD_DMA_Mask Equ 0ABH ; DMA single mask register = 009B HD_DMA_Mode Equ 09BH ; DMA mode write register = 00A9 HD_DMA_Cmd Equ 0A9H  ; DMA command write register  The Microsoft MACRO Assembler , Version 1.25 Page 1-4 HARDDISK 01-31-84 = 009F HD_DMA_AMask Equ 09FH ; DMA all mask write register = 00A0 HD_HDC_Data Equ 0A0H ; Controller data register = 0092 HD_HDC_Stat Equ 092H ; Controller status register = 0092 HD_HDC_Cmd Equ 092H ; Controller command register = 0096 HD_Int_Reg Equ 096H ; Interrupt control register = 0098 HD_Int_Mask Equ 098H ; Interrupt mask = 00A2 HD_Fmt_Reg Equ 0A2H ; Formatter control register = 0094 HD_Reset Equ 094H ; Controller reset register = 0006 Seek_Error Equ 6 ; Attempt to seek off disk = 0004 CRC_Error Equ 4 ; Data error = 0002 Off_Line_Error Equ 2 ; Drive went off line ;--- rmg / necis / 11-30-83 ; ; change "CMOS_T_DISK" use to hd_write_mode in io.sys ; 0000 00 HD_Direct_Mode DB 0 ; default write mode is buffered ; xxxxxx00 = buffered mode ; xxxxxx01 = direct write ; xxxxxx11 = direct read / write 0001 00 HD_Indication DB 0 ; hard disk activity indication type ; 0 = silent (no indication) ; 1 = visual (on status line) ; 2 = audio (20ms beep) ; ;--- rmg / necis / 11-30-83 ; ; Note: disk init flag must always immediatley follow the change flag, as a ; config table entry is used to locate both. ; - rmg 12-16-83 ; 0002 0000 disk_change_flag dw 0 0004 00 disk_init_flag db 0 0005 00 hd_unit_select db 0 ; {RMG} master/slave unit select 0006 00 hd_curr_unit db 0 ; {RMG} current hd unit owns data buff 0007 00 ausize db 0 0008 00 HD_RW_Mode DB 0 ; DMA read/write mode 0009 1A00 HD_Address DW hd_reloc_table0 ; DMA address (HD_Buf relative) 000B 01FF HD_Byte_Count DW 2*HD_Size_Sector-1 ; Size of first reads 000D 00 HD_Homer DB 0 ; Number of command parameters 000E 50 HD_Home_Unit DB HD_Home_Cmd ; Home command and unit number 000F 02 HD_Seeker DB 2 ; Number of command parameters  The Microsoft MACRO Assembler , Version 1.25 Page 1-5 HARDDISK 01-31-84 0010 HD_Seek_Cyl Label Word ; This is stored as a word 0010 00 HD_Seek_HCyl DB ; High byte of cylinder number 0011 00 HD_Seek_LCyl DB ; Low byte of cylinder number 0012 68 HD_Seek_Unit DB HD_Seek_Cmd ; Seek command and unit number 0013 06 HD_Xfer DB 6 ; Number of command parameters 0014 02 HD_Xfer_PHead DB 2 ; Physical head number 0015 HD_Xfer_Cyl Label Word ; This is stored as a word 0015 FE HD_Xfer_HCyl DB 0FEH ; High byte of cylinder number 0"016 00 HD_Xfer_LCyl DB 0 ; Low byte of cylinder number 0017 02 HD_Xfer_LHead DB 2 ; Logical head number 0018 HD_Xfer_Pos Label Word ; This is stored as a word 0018 02 HD_Xfer_Sector DB 2 ; Sector number 0019 02 HD_Xfer_Count DB 2 ; Sector count 001A B0 HD_Xfer_Unit DB HD_Read_Cmd ; Xfer command and unit number 001B FFFF HD_Cur_Track DW 0FFFFH ; Current cyl * 8 + head 001D 00 HD_Dirty_Buf DB 0 ; Contains 1 if dirty track buf 001E 00 HD_Retry_Count DB ; Number of remaining retries ; Status string buffer 001F 00 HD_Stat_Buf DB ; Controller status register 0020 00 HD_Est_Int DB ; Controller EST register 0021 00 HD_Phn_Reg DB ; Ending physical head 0022 00 HD_Lchn_Reg DB ; Ending high cylinder number 0023 00 HD_Lchl_Reg DB ; Ending low cylinder number 0024 00 HD_Lhn_Reg DB ; Ending logical head number 0025 HD_LPos Label Word ; This is stored as a word 0025 00 HD_Lsn_Reg DB ; Ending logical sector number 0026 00 HD_Scnt_Reg DB ; Ending sector count 0027 00 HD_Controller DB 0 ; Is there a hard disk attached ? 0028 01 HD_Time_Flush DB HD_Time_Out ; Number of 15th of sec left 0029 HD_Reloc_Desc Label DWord ; This is a long address 0029 0000 DW ; Offset of relocation entry 002B 9C00 DW HD_Buffer ; Base segment of reloc entry 002D HD_Cnfg_Desc Label DWord ; This is a long address 002D 1B00 DW HD_Cnfg_Table0 ; Offset of configuration table, unit 0 002F 9C00 DW HD_Buffer ; Base segment of reloc table 0031 0000 HD_Bad_Blocks DW 0 ; Bad block bit map ; Parameter values 0033 0000 Cur_Track DW 0 ; Current track number 0035 0000 Cur_Sector DW 0 ; Current sector number 0037 0000 DMA_Addr DW 0 ; Current offset address = 0013 Hard_Size Equ 19 ; Offset of total sectors  The Microsoft MACRO Assembler , Version 1.25 Page 1-6 HARDDISK 01-31-84 ; ; *** Media descriptor byte for hard disk: ; ; MS-DOS will NOT build a new bpb after a build bpb call ; if the media descriptor byte ; returned by the call matches the previous value. In that case, ; MS-DOS recognizes a new logical volume with the SAME ; size and number of fat sectors as before. Therefore, ; for hard disk volumes, the media descriptor will be "flipped" ; between F0h and F1h (in HD_Init) whenever a volume ; change has occured, inorder to force MS-DOS to examine the new ; bpb for the volume ; ; Note: ; ; The bpb's given below include initialized NFATS and ALLOC feilds; ; this is required, even though they are filled in by HD_Init, as  ; MS-DOS will attemp to build internal structures for ALL defined ; units, even those which the user has not defined mounted volumes ; for! ; 0039 03 [ hd0bpb dpb <,,512,2,0,2,1024,1,0f0h,,13> ?? ] 003C 08 [ ?? ] 0044 0200 0046 02 0047 0000 0049 02 004A 0400 004C 0001 004E F0 004F ???? 0051 000D 0053 03 [ hd1bpb dpb <,,512,2,0,2,1024,1,0f0h,,13> ?? ] 0056 08 [ ?? ] 005E 0200 0060 02 0061 0000 0063 02 0064 0400 0066 0001 0068 F0 0069 ???? 006B 000D  The Microsoft MACRO Assembler , Version 1.25 Page 1-7 HARDDISK 01-31-84 006D 03 [ hd2bpb dpb <,,512,2,0,2,1024,1,0f0h,,13> ?? ] 0070 08 [ ?? ] 0078 0200 007A 02 007B 0000 007D 02 007E 0400 0080 0001 0082 F0 0083 ???? 0085 000D 0087 03 [ hd3bpb dpb <,,512,2,0,2,1024,1,0f0h,,13> ?? ] 008A 08 [ ?? ] 0092 0200 0094 02 0095 0000 0097 02 0098 0400 009A 0001 009C F0 009D ???? 009F 000D 00A1 03 [ hd4bpb dpb <,,512,2,0,2,1024,1,0f0h,,13> ?? ] 00A4 08 [ ?? ] 00AC 0200 00AE 02 00AF 0000 00B1 02 00B2 0400 00B4 0001 00B6 F0 00B7 ???? 00B9 000D 00BB 03 [ hd5bpb dpb <,,512,2,0,2,1024,1,0f0h,,13> ?? ] 00BE 08 [ ??  The Microsoft MACRO Assembler , Version 1.25 Page 1-8 HARDDISK 01-31-84 ] 00C6 0200 00C8 02 00C9 0000 00CB 02 00CC 0400 00CE 0001 00D0 F0 00D1 ???? 00D3 000D 00D5 03 [ hd6bpb dpb <,,512,2,0,2,1024,1,0f0h,,13> ?? ] 00D8 08 [ ?? ] 00E0 0200 00E2 02 00E3 0000 00E5 02 00E6 0400 00E8 0001 00EA F0 00EB ???? 00ED 000D 00EF 03 [ hd7bpb dpb <,,512,2,0,2,1024,1,0f0h,,13> ?? ] 00F2 08 [ ?? ] 00FA 0200 00FC 02 00FD 0000 00FF 02 0100 0400 0102 0001 0104 F0 0105 ???? 0107 000D 0109 0044 R hd_bpbs dw hd0bpb.secsiz 010B 005E R dw hd1bpb.secsiz 010D 0078 R dw hd2bpb.secsiz 010F 0092 R dw hd3bpb.secsiz 0111 00AC R dw hd4bpb.secsiz 0113 00C6 R dw hd5bpb.secsiz 0115 00E0 R dw hd6bpb.secsiz 0117 00FA R dw hd7bpb.secsiz  The Microsoft MACRO Assembler , Version 1.25 Page 1-9 HARDDISK 01-31-84 ; = 0008 hd_nunits equ 8 ; {rmg} 12-13-83 E F G H I J K L ; 0119 hdsk_init: ; ; 0119 E8 01B0 R call HD_Init 011C B1 08 mov cl,hd_nunits ; 011E 2E: C5 1E 0000 E lds bx,cs:[ptrsav] 0123 88 4F 0D mov [bx.nounits],cl 0126 C7 47 12 0109 R mov [bx.bpbadr],offset hd_bpbs ; change to represent each drve 012B 8C 4F 14 mov [bx.bpbseg],cs 012E 32 C0 xor al,al 0130 E9 0000 E jmp exit ;*************************************************************** ; hard disk "media check" ; 0133 hmediac: ; 0133 8A C8 mov cl,al 0135 B8 0010 mov ax,0010h ; {rmg} 12-13-83 for 8 units 0138 0A C9 or cl,cl 013A 74 04 jz check_bit 013C shift_bit: 013C D1 E0 shl ax,1 013E E2 FC loop shift_bit 0140 check_bit: 0140 B1 01 mov cl,1 ; not changed flag 0142 85 06 0002 R test disk_change_flag,ax 0146 74 1C jz not_changed 0148 F7 D0 not ax 014A 21 06 0002 R and disk_change_flag,ax 014E B1 FF mov cl,-1 ; media changed flag return 0150 F6 06 0004 R 02 test disk_init_flag,2 ; need disk init? 0155 74 0D jz not_changed 0157 E8 0525 R call hd_flush_buf ; flush the buffer is needed 015A E8 01B0 R call hd_init 015D C6 06 0004 R 00 mov disk_init_flag,0 0162 B1 FF mov cl,-1 ; later" versions must clear bit 1 only ! 0164 not_changed: 0164 2E: C5 1E 0000 E lds bx,cs:[ptrsav] 0169 88 4F 0E mov [bx.med_sts],cl 016C C6 47 0D F0 mov [bx.med_des],0f0h ;hd type 0170 B0 00 mov al,0 ;no error 0172 E9 0000 E jmp exit ;****************************************************************** ;*** get the bpb for the hard disk ; ; 0175 hget_bpb: 0175 B9 0000 mov cx,0 0178 8A C8 mov cl,al  The Microsoft MACRO Assembler , Version 1.25 Page 1-10 HARDDISK 01-31-84 017A B8 0044 R mov ax,offset hd0bpb.secsiz 017D 0B C9 or cx,cx 017F 74 05 jz got_bpb 0181 bump_dpb: 0181 05 001A add ax,26 ; bump to next bpb 0184 E2 FB loop bump_dpb 0186 got_bpb: 0186 2E: C5 1E 0000 E lds bx,cs:[ptrsav] 018B C6 47 0D F0 mov [bx.bpb_med],0f0h 018F 89 47 12 mov [bx.bpb_adr],ax 0192 8C 4F 14 mov [bx.bpb_seg],cs 0195 B0 00 mov al,0 0197 E9 0000 E jmp exit ;***************************************************************** 019A Hdsk_red: ; translate 2.0 parameters into 1.25 parameters ; then call Read or Write as before 019A 51 push cx 019B 04 04 add al,4 ;bump up to hard disk 019D E9 0000 E jmp gord ;go do the normal read ;*************************************************************** 01A0 hdsk_wrv: 01A0 51 push cx 01A1 B7 01 mov bh,1 01A3 04 04 ADD AL,4 ;BUMP UP TO HARD DISK 01A5 E9 0000 E jmp gowr ;verify and interface to mswrite ;***************************************************************** ; 01A8 hdsk_wrt: 01A8 51 push cx 01A9 32 FF xor bh,bh 01AB 04 04 ADD AL,4 ;BUMP UP TO HARD DISK 01AD E9 0000 E jmp gowr ;no verify and interface to mswrite ;******************************************************************* ; ; WARNING: The following code should be examined with a bib, fork, ; meatballs, lots of tomato sauce, and grated parmesian cheese. ; 01B0 HD_Init Proc Near ; Initialize hard disk and tables 01B0 E8 06AA R Call HD_DMA ; Stuff DMA registers to see if there 01B3 E4 93 In AL,HD_DMA_TC ; Get low part of DMA count 01B5 8A E0 Mov AH,AL 01B7 E4 93 In AL,HD_DMA_TC ; Get high part of DMA count 01B9 86 E0 Xchg AH,AL 01BB 3B 06 000B R Cmp AX,HD_Byte_Count ; Is it the original TC ? 01BF 74 03 Je HD_Init_05 01C1 E9 02CF R Jmp HD_Init_99  The Microsoft MACRO Assembler , Version 1.25 Page 1-11 HARDDISK 01-31-84 01C4 HD_Init_05: 01C4 32 C0 Xor AL,AL ; Issue reset to hard disk 01C6 E6 94 Out HD_Reset,AL 01C8 E6 A2 Out HD_Fmt_Reg,AL ; Send 00,80,00 to FMT 01CA B0 80 Mov AL,80H 01CC E6 A2 Out HD_Fmt_Reg,AL ; ... don't ask me, I just work here 01CE 32 C0 Xor AL,AL 01D0 E6 A2 Out HD_Fmt_Reg,AL 01D2 E6 A9 Out HD_DMA_Cmd,AL ; Clear out DMA command register 01D4 B0 0E Mov AL,0EH 01D6 E6 9F Out HD_DMA_AMask,AL ; Clear out interrupt mask 01D8 32 C0 Xor AL,AL 01DA E6 98 Out HD_Int_Mask,AL 01DC B9 0000 mov cx,0 ; two possible units (master / slave) {RMG} 01DF next_unit: 01DF 8A 1E 000E R mov bl,hd_home_unit 01E3 80 E3 F8 and bl,0f8h ; clear unit select field 01E6 0A D9 or bl,cl ; or in unit select 01E8 88 1E 000E R mov hd_home_unit,bl ; put it in command pak 01EC 8D 1E 000D R Lea BX,HD_Homer ; Go initialize drive 0 01F0 E8 0597 R Call HD_IO ; Perform the home 01F3 80 E4 80 And AH,80H ; Did the seek terminate ? 01F6 80 FC 80 Cmp AH,80H 01F9 75 3D Jne hd_unit_skip ; {RMG} can't home this unit 01FB C6 06 0008 R 15 Mov HD_RW_Mode,HD_Read_DMA 0200 80 F9 00 cmp cl,0 0203 74 06 jz dma_alredy_set 0205 C7 06 0009 R 1C00 mov hd_address,hd_reloc_table1 020B dma_alredy_set: 020B C6 06 0018 R 02 mov hd_xfer_sector,2 ; sector address of first table copy 0210 E8 06AA R Call HD_DMA ; Set up DMA for bad track table 0213 8A 1E 001A R mov bl,hd_xfer_unit 0217 80 E3 F8 and bl,0f8h ; clear unit select field 021A 0A D9 or bl,cl 021C 88 1E 001A R mov hd_xfer_unit,bl 0220 8D 1E 0013 R Lea BX,HD_Xfer 0224 E8 0597 R Call HD_IO ; Start relocation table read 0227 74 0F Je hd_unit_skip ; Was it a good read ? 0229 C6 06 0018 R 0E Mov HD_Xfer_Sector,0EH ; No, try alternate sector 022E E8 06AA R Call HD_DMA ; Set up DMA for alternate table 0231 8D 1E 0013 R Lea BX,HD_Xfer 0235 E8 0597 R Call HD_IO ; Start alternate table read 0238 hd_unit_skip: 0238  41 inc cx 0239 83 F9 01 cmp cx,1 ; have we tried both units? 023C 7E A1 jle next_unit ; go do slave if not 023E HD_Init_10: 023E C7 06 0009 R 0000 Mov HD_Address,0000H ; Set up for future I/O 0244 C7 06 000B R 19FF Mov HD_Byte_Count,HD_Track_Size 024A FE 06 0027 R Inc HD_Controller  The Microsoft MACRO Assembler , Version 1.25 Page 1-12 HARDDISK 01-31-84 024E B9 0000 mov cx,0 ; config table array index 0251 next_config: 0251 C4 3E 002D R Les DI,HD_Cnfg_Desc ; Set up addressing for config table 0255 83 F9 00 cmp cx,0 0258 74 04 jz use_desc0 025A 81 C7 0200 add di,200h ; bump to unit 1 config info 025E use_desc0: 025E 26: 81 7D 08 BFFB Cmp ES:[DI+8],HD_Reloc_Valid ; Is this a valid table 0264 75 61 jne hd_config_skip0 0266 26: 81 7D 0A 4004 Cmp ES:[DI+10],Not HD_Reloc_Valid 026C 75 59 Jne hd_config_skip0 026E 83 F9 01 cmp cx,1 0271 51 push cx 0272 26: 8B 0D Mov CX,ES:[DI] 0275 E3 4F Jcxz hd_config_skip ; Are there any entries at all? 0277 75 07 jnz unit0_bpbs 0279 8D 36 00B4 R lea si,hd4bpb+hard_size 027D EB 05 90 jmp hd_init_cc01 0280 unit0_bpbs: 0280 8D 36 004C R Lea SI,hd0bpb+Hard_Size ; Get pointer to victim blocks 0284 hd_init_cc01: 0284 83 C7 0C Add DI,000CH ; Move to first entry in table 0287 BB 000D Mov BX,HD_Block_Track 028A HD_Init_25: 028A 26: 81 7D 04 0101 Cmp ES:[DI+4],0101H ; Is this a mounted MS-DOS volume ? 0290 75 2F Jne HD_Init_22 0292 26: 8B 45 02 Mov AX,ES:[DI+2] ; Yes, get the last track 0296 26: 2B 05 Sub AX,ES:[DI] 0299 40 Inc AX ; Calculate number of tracks 029A F7 E3 Mul BX ; Caluclate number of blocks 029C 89 04 Mov [SI],AX ; ; flip media id byte to force new bpb to be built... ; 029E F6 54 02  not byte ptr [si+2] 02A1 80 4C 02 F0 or byte ptr [si+2],0f0h ; ; calculate and fill in number of FAT sectors ; 02A5 53 push bx 02A6 26: 8B 45 02 mov ax,es:[di+2] ; last track 02AA 26: 8B 1D mov bx,es:[di] ; first track 02AD E8 06DF R call nfats 02B0 5B pop bx 02B1 89 44 03 mov [si+3],ax ; fill in number of fat sectors ;--- rmg / necis / 1-27-84 ; ; set allocation unit size as computed by the above call to nfats ; 02B4 56 push si 02B5 83 EE 06 sub si,6  The Microsoft MACRO Assembler , Version 1.25 Page 1-13 HARDDISK 01-31-84 02B8 A0 0007 R mov al,ausize 02BB 88 04 mov [si],al 02BD 5E pop si ; ;--- rmg / necis / 1-27-84 02BE 83 C6 1A Add SI,26 ; Move to next drive entry 02C1 HD_Init_22: 02C1 83 C7 1A Add DI,001AH ; Move to next volume entry 02C4# E2 C4 Loop HD_Init_25 02C6 hd_config_skip: 02C6 59 pop cx ; now which unit were we on? 02C7 hd_config_skip0: 02C7 41 inc cx 02C8 83 F9 01 cmp cx,1 02CB 7F 02 jg hd_init_99 02CD EB 82 jmp next_config 02CF HD_Init_99: 02CF C7 06 001B R FFFF Mov HD_Cur_Track,0ffffh ; rmg / necis / 1-27-84 02D5 C3 Ret 02D6 HD_Init Endp 02D6 HD_Select Proc Near ; Calculate address of virtual drive descriptor ; and return BX. Drive driver_num exists if sign status ; set, otherwise, not mounted. Save unit select (master/slave) ; in hd_unit_select ; 02D6 06 Push ES 02D7 8A 16 0000 E Mov DL,Driver_Num 02DB 80 EA 04 Sub DL,HD_Base_Unit ; Make drive zero-based 02DE 80 FA 04 cmp dl,4 ; is this drive on unit 0 or 1? 02E1 7D 08 jge onunit1 02E3 C6 06 0005 R 00 mov hd_unit_select,0 02E8 EB 09 90 jmp hd_select_cc01 02EB onunit1: 02EB C6 06 0005 R 01 mov hd_unit_select,1 02F0 80 EA 04 sub dl,4 ; make drive zero based within unit 1 02F3 hd_select_cc01: 02F3 C4 1E 002D R Les BX,HD_Cnfg_Desc ; Set up addressing for config table 02F7 80 3E 0005 R 00 cmp hd_unit_select,0 02FC 74 04 jz usecf0 02FE 81 C3 0200 add bx,200h ; bump to unit1 config table 0302 usecf0: 0302 E8 030B R Call Drive_Search ; Search config table for drive 0 0305 07 Pop ES 0306 89 1E 0029 R Mov word ptr HD_Reloc_Desc,BX ; Save entry pointer for later 030A C3 Ret 030B HD_Select Endp  The Microsoft MACRO Assembler , Version 1.25 Page 1-14 HARDDISK 01-31-84 030B Drive_Search Proc Near ; Search for virtual drive DL in table ES:BX; ; Return sign status set if found 030B 26: 81 7F 08 BFFB Cmp ES:[BX+8],HD_Reloc_Valid ; Is this a valid table ? 0311 75 21 Jne DS_10 0313 26: 81 7F 0A 4004 Cmp ES:[BX+10],Not HD_Reloc_Valid 0319 75 19 Jne DS_10 031B 26: 8B 0F Mov CX,ES:[BX] 031E E3 14 Jcxz DS_10 ; Yes, are there any entries ? 0320 83 C3 0C Add BX,000CH ; Yes, skip to the first entry 0323 26: 81 7F 04 0101 DS_05: Cmp ES:[BX+4],0101H ; Is this a mounted MS-DOS disk ? 0329 75 04 Jne DS_00 032B FE CA Dec DL ; Yes, is this the drive we want ? 032D 78 07 Js DS_20 032F 83 C3 1A DS_00: Add BX,001AH ; No, skip to next entry 0332 E2 EF Loop DS_05 0334 33 DB DS_10: Xor BX,BX ; Indicate not found 0336 C3 DS_20: Ret 0337 Drive_Search Endp 0337 HD_Transfer Proc Near ; Transfer based on parameters 0337 89 1E 0037 R Mov DMA_Addr,BX ; Save beginning address offset 033B 33 C0 Xor AX,AX ; Calculate starting track and sector 033D 92 Xchg DX,AX ; driver number to dl 033E B9 000D Mov CX,HD_Block_Track 0341 F7 F1 Div CX 0343 A3 0033 R Mov Cur_Track,AX 0346 89 16 0035 R Mov Cur_Sector,DX 034A E8 02D6 R Call HD_Select ; Calculate virtual drive descriptor 034D 8B 0E 0000 E Mov CX,Num_Of_Sec 0351 79 35 Jns HDX_10 ; Is this drive mounted ? 0353 E3 30 Jcxz HDX_90 ; Is there anything to read ? 0355 51 HDX_00: Push CX 0356 8A 1E 0000 E Mov BL,wflag ; Yes, go do transfer 035A E8 038C R Call HD_Common 035D 59 Pop CX 035E 72 27 Jc HDX_99 ; Was there an error ? 0360 81 06 0037 R 0200 Add DMA_Addr,0200H ; No, move to next buffer 0366 73 06 Jnc HDX_01 ; Did we just overflow segment ? 0368 81 06 0000 E 1000 Add DMA_Segment,1000H 036E FF 06 0035 R HDX_01: Inc Cur_Sector ; Move to next sector 0372 83 3E 0035 R 0D Cmp Cur_Sector,HD_Block_Track ; Did we just move tracks ? 0377 75 0A Jne HDX_02 0379 C7 06 0035 R 0000 Mov Cur_Sector,00H ; Yes, update position 037F FF 06 0033 R Inc Cur_Track 0383 E2 D0 HDX_02: Loop HDX_00 ; One more time (at least) 0385 33 C0 HDX_90: Xor AX,AX ; Make sure no error is indicated 0387 C3 HDX_99: Ret 0388 B0 02 HDX_10: Mov AL,Off_Line_Error ; Virtual disk is not mounted 038A F9 Stc  The Microsoft MACRO Assembler , Version 1.25 Page 1-15 HARDDISK 01-31-84 038B C3 Ret 038C HD_Transfer Endp 038C HD_Common Proc Near ; Transfer one sector 038C C6 06 0028 R 00 Mov HD_Time_Flush,00H ; Lock out clock's buffer check 0391 8B 16 0033 R Mov DX,Cur_Track ; Get track number 0395 1E Push DS ; Check for remapping of track 0396 C5 3E 0029 R Lds DI,HD_Reloc_Desc ; Get pointer to relocation entry 039A 03 15 Add DX,[DI] 039C 3B 55 02 Cmp DX,[DI+2] ; Are we off the end of the disk ? 039F 7E 05  Jle HDC_08 03A1 1F Pop DS ; Yes, give seek error 03A2 B0 06 Mov AL,Seek_Error 03A4 F9 Stc 03A5 C3 Ret 03A6 81 EF 0100 HDC_08: Sub DI,0100H ; Position to alternate track table 03AA 81 E7 FF00 And DI,0FF00H 03AE 81 3D BFFB Cmp [DI],HD_Reloc_Valid ; Is this a valid relocation table ? 03B2 75 16 Jne HDC_03 03B4 81 7D 02 4004 Cmp [DI+2],Not HD_Reloc_Valid 03B9 75 0F Jne HDC_03 03BB 83 C7 04 Add DI,0004H ; Skip over allocation information 03BE 83 C7 04 HDC_07: Add DI,0004H ; Move to next entry 03C1 39 15 Cmp [DI],DX 03C3 7C 05 Jl HDC_03 ; Have we passed where it might be ? 03C5 75 F7 Jne HDC_07 ; No, is there a match ? 03C7 8B 55 02 Mov DX,[DI+2] ; Yes, terminate search and remap 03CA 1F HDC_03: Pop DS 03CB 3B 16 001B R Cmp DX,HD_Cur_Track ; Do we already have this track ? 03CF 75 0E Jne HDC_00 03D1 50 push ax 03D2 A0 0006 R mov al,hd_curr_unit 03D5 3A 06 0005 R cmp al,hd_unit_select 03D9 58 pop ax 03DA 75 03 jne hdc_00 03DC E9 04A5 R Jmp HD_Deblock 03DF 53 HDC_00: Push BX 03E0 E8 0525 R Call HD_Flush_Buf ; Flush track to disk if necessary 03E3 50 push ax 03E4 A0 0005 R mov al,hd_unit_select 03E7 A2 0006 R mov hd_curr_unit,al 03EA 58 pop ax 03EB C6 06 0008 R 15 Mov HD_RW_Mode,HD_Read_DMA ; Set up DMA command block 03F0 C6 06 001A R B0 Mov HD_Xfer_Unit,HD_Read_Cmd ; Set up xfer command block 03F5 C6 06 001E R 08 Mov HD_Retry_Count,HD_Max_Retry 03FA 8A DA Mov BL,DL 03FC 80 E3 07 And BL,07H  The Microsoft MACRO Assembler , Version 1.25 Page 1-16 HARDDISK 01-31-84 03FF 88 1E 0014 R Mov HD_Xfer_PHead,BL ; Set up physical head number 0403 88 1E 0017 R Mov HD_Xfer_LHead,BL ; Set up logical head number 0407 B1 03 Mov CL,03H ; Set up cylinder number 0409 A1 001B R Mov AX,HD_Cur_Track ; Calculate current cylinder number 040C 89 16 001B R Mov HD_Cur_Track,DX 0410 D3 EA Shr DX,CL 0412 D3 E8 Shr AX,CL 0414 3B C2 Cmp AX,DX 0416 74 22 Je HDC_10 ; Is this the correct cylinder ? 0418 86 F2 Xchg DH,DL ; No, move MSB and LSB into position 041A 89 16 0010 R Mov HD_Seek_Cyl,DX 041E 80 CA FE Or DL,0FEH ; Make sure unused bits are 1 0421 89 16 0015 R Mov HD_Xfer_Cyl,DX 0425 HDC_05: 0425 50 push ax 0426 A0 0012 R mov al,hd_seek_unit 0429 24 F8 and al,0f8h 042B 0A 06 0005 R or al,hd_unit_select 042F A2 0012 R mov hd_seek_unit,al 0432 58 pop ax 0433 8D 1E 000F R Lea BX,HD_Seeker 0437 E8 0597 R Call HD_IO ; Seek to the appropriate cylinder 043A E8 06AA R HDC_10: Call HD_DMA ; Issue DMA command 043D C6 06 0018 R 00 Mov HD_Xfer_Sector,00H 0442 C6 06 0019 R 1A Mov HD_Xfer_Count,HD_Sector_Count #0447 C7 06 0031 R 0000 Mov HD_Bad_Blocks,0000H ; Clear bad block status bits 044D HDC_11: 044D 50 push ax 044E A0 001A R mov al,hd_xfer_unit 0451 24 F8 and al,0f8h 0453 0A 06 0005 R or al,hd_unit_select 0457 A2 001A R mov hd_xfer_unit,al 045A 58 pop ax 045B 8D 1E 0013 R Lea BX,HD_Xfer ; Issue read command 045F E8 0597 R Call HD_IO 0462 75 1F Jne HDC_14 ; Was the read successful ? 0464 8B 1E 0025 R Mov BX,HD_LPos ; Yes, check on ECC 0468 8A CB Mov CL,BL ; Save this for bad block calculation 046A FE C3 Inc BL ; Move to next sector 046C FE CF Dec BH ; Count down one sector 046E 74 30 Je HDC_15 ; Is there more ? 0470 78 2E Js HDC_15 0472 89 1E 0018 R Mov HD_Xfer_Pos,BX ; Yes, must have corrected ECC 0476 D0 E9 Shr CL,1 ; Calculate bit for bad block 0478 B8 0001 Mov AX,0001H 047B D3 E0 Shl AX,CL 047D 09 06 0031 R Or HD_Bad_Blocks,AX ; Record that this block is bad 0481 EB CA Jmp HDC_11 0483 FE 0E 001E R HDC_14: Dec HD_Retry_Count ; No, can we still retry ? 0487 74 17 Jz HDC_15 0489 8D 1E 000D R Lea BX,HD_Homer ; Yes, recalibrate drive 048D 50 push ax  The Microsoft MACRO Assembler , Version 1.25 Page 1-17 HARDDISK 01-31-84 048E A0 000E R mov al,hd_home_unit 0491 24 F8 and al,0f8h 0493 0A 06 0005 R or al,hd_unit_select 0497 A2 000E R mov hd_home_unit,al 049A 58 pop ax 049B E8 0597 R Call HD_IO 049E EB 85 Jmp HDC_05 04A0 5B HDC_15: Pop BX ; Get read/write mode 04A1 3C 40 Cmp AL,40H ; Is this a good I/O 04A3 75 73 Jne HD_Error 04A5 HD_Deblock: ; Transfer between disk memory buffer and main memory 04A5 1E Push DS ; Save data segment 04A6 8B 36 0035 R Mov SI,Cur_Sector ; Calculate buffer offset 04AA B1 09 Mov CL,09H 04AC  D3 E6 Shl SI,CL 04AE 8E 06 0000 E Mov ES,DMA_Segment 04B2 8B 3E 0037 R Mov DI,DMA_Addr ; Get destination address 04B6 B8 9C00 Mov AX,HD_Buffer ; Get buffer segment 04B9 8E D8 Mov DS,AX 04BB 0A DB Or BL,BL ; Is this a read ? 04BD 74 0A Jz HDD_25 04BF 87 F7 Xchg SI,DI ; No, switch source and destination 04C1 8C D8 Mov AX,DS 04C3 8C C2 Mov DX,ES 04C5 8E C0 Mov ES,AX 04C7 8E DA Mov DS,DX 04C9 B9 0100 HDD_25: Mov CX,HD_Block_Size/2 ; Set up transfer count in words 04CC FC Cld 04CD F3/ A5 Rep Movsw ; Transfer a sector 04CF 1F Pop DS ; Recover data segment 04D0 0A DB Or BL,BL ; Is this a write ? 04D2 75 12 Jnz HDD_30 04D4 BB 0001 Mov BX,0001H ; No, check for bad block 04D7 8B 0E 0035 R Mov CX,Cur_Sector 04DB D3 E3 Shl BX,CL 04DD 85 1E 0031 R Test HD_Bad_Blocks,BX ; Was this block read OK ? 04E1 75 3E Jnz HD_CRC 04E3 EB 23 90 Jmp HDD_90 04E6 08 1E 001D R HDD_30: Or HD_Dirty_Buf,BL ; Yes, indicate buffer dirty 04EA F6 06 0000 R 01 Test HD_Direct_Mode,1 ; Are we in direct mode {RMG 11-30-83} 04EF 74 0A Jz HDD_35 04F1 HDD_305: 04F1 E8 0525 R Call HD_Flush_Buf ; Yes, make sure we flush it NOW 04F4 3C 40 Cmp AL,40H ; Was it a good write ? 04F6 75 20 Jne HD_Error 04F8 EB 0E 90 Jmp HDD_90 ; {RMG 11-30-83} 04FB HDD_35: ; no... 04FB 50 Push AX ; {RMG 11-30-83}  The Microsoft MACRO Assembler , Version 1.25 Page 1-18 HARDDISK 01-31-84 04FC E4 22 In AL,022h ; {RMG 11-30-83} Is timer interrupt enabled? 04FE A8 08 Test AL,08h ; {RMG 11-30-83} 0500 58 Pop AX ; {RMG 11-30-83} 0501 75 EE Jnz HDD_305 ; {RMG 11-30-83} no, waiting for Godot 0503 C6 06 0028 R 01 Mov HD_Time_Flush,HD_Time_Out ; Yes, reset clock driver 0508  HDD_90: 0508 F6 06 0000 R 02 Test HD_Direct_Mode,2 ; Direct mode for both read and write? 050D 74 06 jz HDD_99 050F C7 06 001B R FFFF Mov HD_Cur_Track,0ffffh ; Force physical read next request 0515 HDD_99: 0515 32 C0 Xor AL,AL ; Return good I/O result 0517 C3 Ret 0518 HD_Error: ; Calculate bad I/O result 0518 F6 C4 08 Test AH,08H ; Did drive go off line ? 051B 74 04 Jz HD_CRC 051D B0 02 Mov AL,Off_Line_Error ; Yes, return that result 051F F9 Stc ; Set error flag 0520 C3 Ret 0521 B0 04 HD_CRC: Mov AL,CRC_Error ; No, let the poor guy know 0523 F9 Stc ; Set error flag 0524 C3 Ret 0525 HD_Common Endp 0525 HD_Flush_Buf Proc Near ; Write dirty buffer to disk if necessary 0525 80 3E 001D R 00 Cmp HD_Dirty_Buf,00 ; Is there a dirty buffer to flush ? 052A 74 6A Je HDF_01 052C C6 06 001D R 00 Mov HD_Dirty_Buf,00H ; Clear dirty buffer flag 0531 C6 06 0008 R 19 Mov HD_RW_Mode,HD_Wrt_DMA ; Setup write command 0536 80 0E 001A R F0 Or HD_Xfer_Unit,HD_Wrt_Cmd 053B C6 06 001E R 08 Mov HD_Retry_Count,HD_Max_Retry 0540 C6 06 0018 R 00 Mov HD_Xfer_Sector,00H 0545 C6 06 0019 R 1A Mov HD_Xfer_Count,HD_Sector_Count 054A E8 06AA R HDF_02: Call HD_DMA ; Start track write 054D 50 push ax 054E A0 001A R mov al,hd_xfer_unit 0551 24 F8 and al,0f8h 0553 0A 06 0006 R or al,hd_curr_unit ; rmg / necis 1-24-84 flush to old owner's unit 0557 A2 001A R mov hd_xfer_unit,al 055A 58 pop ax 055B 8D 1E 0013 R Lea BX,HD_Xfer 055F E8 0597 R Call HD_IO 0562 74 32 Je HDF_01 ; Was the transfer successful ? 0564 FE 0E 001E R Dec HD_Retry_Count 0568 74 2C Jz HDF_01 ; No, are there any retries left ? 056A 8D 1E 000D R Lea BX,HD_Homer ; Yes, recalibrate drive 056E 50 push ax 056F A0 000E R mov al,hd_home_unit 0572 24 F8 and al,0f8h 0574 0A 06 0006 R or al,hd_curr_unit ; rmg / necis 1-24-84 0578 A2 000E R mov hd_home_unit,al  The Microsoft MACRO Assembler , Version 1.25 Page 1-19 HARDDISK 01-31-84 057B 58 pop ax 057C E8 0597 R Call HD_IO 057F 8D 1E 000F R Lea BX,HD_Seeker ; Seek bad to desired track 0583 50 push ax 0584 A0 0012 R mov al,hd_seek_unit 0587 24 F8 and al,0f8h 0589 0A 06 0006 R or al,hd_curr_unit ; rmg / necis 1-24-84 058D A2 0012 R mov hd_seek_unit,al 0590 58 pop ax 0591 E8 0597 R Call HD_IO 0594 EB B4 Jmp HDF_02 0596 C3 HDF_01: Ret 0597 HD_Flush_Buf Endp 0597 HD_IO Proc Near ; Issue hard disk command block in BX 0597 51 push cx ; save cx {RMG} 12-13-83 0598 32 C0 Xor AL,AL ; Reset completion bits 059A E6 96 Out HD_Int_Reg,AL 059C E8 06D5 R Call HD_Delay 059F 32 ED Xor CH,CH ; Get number of bytes in command block 05A1 8A 0F Mov CL,[BX] 05A3 E3 2E Jcxz HDI_10 05A5 B0 40 Mov AL,40H ; Write CLDB into formatter 05A7 E6 A2 Out HD_Fmt_Reg,AL 05A9 E8 06D5 R Call HD_Delay 05AC E4 A2 HDI_00: In AL,HD_Fmt_Reg ; Is it safe to load command bytes ? 05AE A8 20 Test AL,20H 05B0 74 FA Jz HDI_00 05B2 43 HDI_01: Inc BX ; Is there just one parameter left ? 05B3 49 Dec CX 05B4 E3 0C Jcxz HDI_02 05B6 8A 07 Mov AL,[BX] ; No, get next parameter 05B8 E8 06D5 R Call HD_Delay 05BB E6 A0 Out HD_HDC_Data,AL ; Send it to the controller 05BD E8 06D5 R Call HD_Delay 05C0 EB F0 Jmp HDI_01 05C2 B0 04 HDI_02: Mov AL,04H ; Signal last parameter 05C4 E8 06D5 R Call HD_Delay 05C7 E6 A2 Out HD_Fmt_Reg,AL 05C9 E8 06D5 R Call HD_Delay 05CC 8A 07 Mov AL,[BX] ; Send last paramete$r 05CE E6 A0 Out HD_HDC_Data,AL 05D0 E8 06D5 R Call HD_Delay 05D3 B0 11 HDI_10: Mov AL,11H ; Write HSRQ and CLCE into formatter 05D5 E6 A2 Out HD_Fmt_Reg,AL 05D7 E8 06D5 R Call HD_Delay 05DA E4 A2 HDI_05: In AL,HD_Fmt_Reg ; Wait until CE flag says ready 05DC A8 04 Test AL,04H 05DE 75 FA Jnz HDI_05  The Microsoft MACRO Assembler , Version 1.25 Page 1-20 HARDDISK 01-31-84 05E0 43 Inc BX ; Ready, move to command 05E1 8A 07 Mov AL,[BX] 05E3 E6 92 Out HD_HDC_Cmd,AL ; Send command to controller 05E5 8A E0 Mov AH,AL ; Remember command for later 05E7 E8 06D5 R Call HD_Delay ;--- rmg / necis / 12-1-83 ; ; Mod to allow visual or audio or no indication of hard disk activity ; 05EA 80 3E 0001 R 00 Cmp HD_Indication,0 ; Are we indicating activity today? 05EF 74 1C jz HDI_20 ; Go wait if not 05F1 F6 06 0001 R 01  Test HD_Indication,1 ; Visual indication? 05F6 74 0F Jz HD_Aural ; Go razz user if not 05F8 E8 0000 E Call HD_Ind_On ; set visual flag 05FB HDI_200: 05FB E4 96 In AL,HD_Int_Reg ; Is the command complete ? 05FD A8 02 Test AL,02H 05FF 74 FA Jz HDI_200 0601 E8 0000 E Call HD_Ind_Off 0604 EB 10 90 Jmp HD_Ind_Continue 0607 HD_Aural: 0607 50 Push AX 0608 B0 38 Mov AL,38h 060A E6 60 Out 60h,al ; meemeep 060C 58 Pop AX 060D E4 96 HDI_20: In AL,HD_Int_Reg ; Is the command complete ? 060F A8 02 Test AL,02H 0611 74 FA Jz HDI_20 0613 E8 06D5 R Call HD_Delay 0616 HD_Ind_Continue: 0616 80 E4 80 And AH,80H ; Is this a seek/recalibrate ? 0619 74 06 Jz HD_Int_Status 061B B9 0007 Mov CX,0007H ; Set up status count for xfer 061E EB 48 90 Jmp HD_Get_Status 0621 HD_Int_Status: ; Get status for seek/recalibrate  0621 E4 92 In AL,HD_HDC_Stat ; Flush out status register 0623 E8 06D5 R Call HD_Delay 0626 B0 10 Mov AL,10H ; Clear formatter CE 0628 E6 A2 Out HD_Fmt_Reg,AL 062A E8 06D5 R Call HD_Delay 062D E4 A2 HDS_05: In AL,HD_Fmt_Reg ; Wait until CE is actually clear 062F A8 04 Test AL,04H 0631 75 FA Jnz HDS_05 0633 E8 06D5 R Call HD_Delay 0636 E4 96 HDS_06: In AL,HD_Int_Reg ; Wait until HDIN is also off 0638 A8 02 Test AL,02H 063A 74 FA Jz HDS_06 063C E8 06D5 R Call HD_Delay 063F E4 92 HDS_07: In AL,HD_HDC_Stat ; Wait until status is ready 0641 A8 10 Test AL,10H 0643 74 FA Jz HDS_07  The Microsoft MACRO Assembler , Version 1.25 Page 1-21 HARDDISK 01-31-84 0645 B0 11 Mov AL,11H ; Issue HSRQ and CLCE to formatter 0647 E8 06D5 R Call HD_Delay 064A E6 A2 Out HD_Fmt_Reg,AL 064C E8 06D5 R Call HD_Delay 064F E4 A2 HDS_00: In AL,HD_Fmt_Reg ; Wait until CE is off 0651 A8 04 Test AL,04H 0653 75 FA Jnz HDS_00 0655 E8 06D5 R Call HD_Delay 0658 B0 10 Mov AL,HD_Int_Cmd ; Issue interrupt status command 065A E6 92 Out HD_HDC_Cmd,AL 065C E8 06D5 R Call HD_Delay 065F E4 96 HDS_01: In AL,HD_Int_Reg ; Wait for status to become available 0661 A8 02 Test AL,02H 0663 74 FA Jz HDS_01 0665 B9 0001 Mov CX,0001H ; Set up status byte count 0668 HD_Get_Status: ; Get CX status bytes into status buffer ; Check to see if operation status says OK 0668 06 Push ES 0669 8C DB Mov BX,DS ; Set up status buffer 066B 8E C3 Mov ES,BX 066D 8D 3E 001F R Lea DI,HD_Stat_Buf 0671 E8 06D5 R Call HD_Delay 0674 E4 92 In AL,HD_HDC_Stat ; Get the first status byte 0676 FC Cld 0677 AA Stosb ; Save status byte in buffer 0678 B0 20 Mov AL,20H ; Set up to read status string 067A E8 06D5 R Call HD_Delay 067D E6 A2 Out HD_Fmt_Reg,AL 067F E8 06D5 R Call HD_Delay 0682 E4 A2 HDG_10: In AL,HD_Fmt_Reg ; Wait until string is ready 0684 A8 20 Test AL,20H 0686 74 FA Jz HDG_10 0688 E8 06D5 R Call HD_Delay 068B E4 A0 HDG_15: In AL,HD_HDC_Data ; Get byte of status 068D AA Stosb 068E E2 FB Loop HDG_15 0690 B0 10 Mov AL,10H ; Clear CE status 0692 E8 06D5 R Call HD_Delay 0695 E6 A2 Out HD_Fmt_Reg,AL 0697 E8 06D5 R Call HD_Delay 069A E4 A2 HDG_20: In AL,HD_Fmt_Reg ; Wait until CE is off 069C A8 04 Test AL,04H 069E 75 FA Jnz HDG_20 06A0 07 Pop ES 06A1 A1 001F R Mov AX,word ptr HD_Stat_Buf ; Get operation status and first byte 06A4 24 60 And AL,60H ; Isolate completion status 06A6 3C 40 Cmp AL,40H ; Did the opertion complete normally ?  The Microsoft MACRO Assembler , Version 1.25 Page 1-22 HARDDISK 01-31-84 06A8 59 pop cx ; restore cx {RMG} 12-13-83 06A9 C3 Ret 06AA HD_IO Endp 06AA HD_DMA Proc Near ; Issue DMA command to DMA controller 06AA A0 0008 R Mov AL,HD_RW_Mode ; Get mod value 06AD E6 9B Out HD_DMA_Mode,AL 06AF E8 06D5 R Call HD_Delay 06B2 A1 0009 R Mov AX,HD_Address ; Get address 06B5 E6 A3 Out HD_DMA_Addr,AL 06B7 E8 06D5 R Call HD_Delay 06BA 8A C4 Mov AL,AH 06BC E6 A3 Out HD_DMA_Addr,AL 06BE E8 06D5 R Call HD_Delay 06C1 A1 000B R Mov AX,HD_Byte_Count ; Set up transfer count 06C4 E6 93 Out HD_DMA_TC,AL 06C6 E8 06D5 R Call HD_Delay 06C9 8A C4 Mov AL,AH 06CB E6 93 Out HD_DMA_TC,AL 06CD E8 06D5 R Call HD_Delay 06D0 B0 01 Mov AL,01H ; Set up mask 06D2 E6 AB Out HD_DMA_Mask,AL 06D4 C3 Ret 06D5 HD_DMA Endp 06D5  HD_Delay Proc Near ; Delay for an indiscreet time 06D5 51 Push CX 06D6 9C Pushf 06D7 B9 0010 Mov CX,0010H 06DA E2 FE HD_Del: Loop HD_Del 06DC 9D Popf 06DD 59 Pop CX 06DE C3 Ret 06DF HD_Delay Endp ; ; Notes on AU size selection for hard disk volumes: ; ; The IO system for the MS-DOS 2.00 (000) release have severe problems ; in handling large ( > about 8232 blocks) volumes due to an AU size too ; small to permit the entire volume to be mapped correctly in a single ; FAT. This version selects 1 of three AU sizes based on the number of ; blocks in the volume. The discussion below documents the rational ; for the chosen cutoff sizes for AU's of 2, 4, and 8 blocks/AU. ; ; 1. A FAT can map AU's from 002h-FF6h (0 and 1 are reserved by the DOS, ; FF7 maps bad blocks, and FF8-FFF are used as end of file marks.) ; The number of FAT enties usable for data is (FF6 - 002) + 1 = 4085. ; ; 2. Caveat: for purposes of chossing the breakoff point, the size of  The Microsoft MACRO Assembler , Version 1.25 Page 1-23 HARDDISK 01-31-84 ; the data area shall be considered to be the entire size of the disk ; image, minus the size of the root directory area. Note that this ; convention does not subtract out the FAT sectors from the size of ; the area the FAT has to map. This is acceptable because it results ; in a slightly conservative placement of the cutoff point. The most ; dangerous situation results from underestimation of the cutoff. ; ; 3. The directory is 1024 entries long. Each entry occupies 32 bytes ; A block is 512 bytes. So, a root directory occupies: ; (1024 * 32) / 512 = 64 blocks. ; ; 4. Calculation: ; $ cutoff size, blocks ; AU size x 4085 AU's + 64 (directory) ; ------- ----------- ------------------- ; 2 8170 8234 ; 4 16340 16404 ; 8 32680 32744 ; ; These block boundries translate into the following number ; of track boundries, since a volume must contain a multiple ; of tracks (13 blocks per track): ; ; Cutoff ; AU size Tracks blocks ; ------- ------ ------ ; 2 <= 633 8229 ; 4 <= 1261 16393 ; 8 <= 2518 32734 ; ; These derived cutoffs are used by the IO system and HDFORMAT in ; deciding what AU size to use for a given volume. ; ; ; how many FAT sectors can dance on the head of a pin? ; ; The formula for calculating the of sectors in a FAT, nfats, ; for a volume, given strk (starting track number), etrk ; (ending track number), ndir (number of directory entries), ; spertrk (sectors per track) and ausize (AU size in sectors) is: ; ; nfatbytes = (1 + (((1 + (etrk - strk)) * spertrk ; - ndir div 16)) div ausize * 3) div 2 + 3 ; ; nfats = (nfatbytes + 511) div 512 ; ; (next, a "second pass" is made to subtract out the number of ; FAT blocks from the size of the FAT map (FAT sectors are not ; allocatable units...) ; ; nfatbytes = (1 + (((1 + (etrk - strk)) * spertrk ; - ndir div 16 - nfats)) div ausize * 3) div 2 + 3  The Microsoft MACRO Assembler , Version 1.25 Page 1-24 HARDDISK 01-31-84 ; ; nfats = (nfatbytes + 511) div 512 ; ; This routine computes the number of fat sectors for ; a volume. ; ; Input: ; bx starting track number  ; ax ending track number ; ; Output: ; al number of fat sectors for the volumne ; ; register ax only is altered ; = 000D spertrk equ 13 ; 13 sectors per track = 0400 ndir equ 1024 ; 1024 directory entries per volume 06DF nfats proc near 06DF 52 push dx ; dx used for "2nd pass" FAT_BLOCKS 06E0 50 push ax ; save start track for "second pass" 06E1 BA 0000 mov dx,0 ; subtract 0 for "first pass nfats" 06E4 pass2: ; entry point for "second pass" 06E4 53 push bx 06E5 51 push cx 06E6 2B C3 sub ax,bx ; etrk - strk 06E8 40 inc ax ; + 1 ;--- rmg / necis / 1-27-84 ; ; select allocation unit size ; 06E9 C6 06 0007 R 02 mov byte ptr ausize,2 06EE 3D 0279 cmp ax,633 ; will 2 blocks/AU do? 06F1 7E 0F jle aus_set 06F3 C6 06 0007 R 04 mov byte ptr ausize,4 ; select 4 blocks/AU 06F8 3D 04ED cmp ax,1261 ; will 4 blocks/AU do? 06FB 7E 05 jle aus_set 06FD C6 06 0007 R 08 mov byte ptr ausize,8 ; select 8 blocks/AU 0702 aus_set: ; ;--- rmg / necis / 1-27-84 0702 8B C8 mov cx,ax 0704 D1 E1 sal cx,1 ; 0706 03 C8 add cx,ax ; [ * 3 ] 0708 51 push cx 0709 B1 04 mov cl,4 070B D3 E0 sal ax,cl ; [ * 16 ] 070D 59 pop cx 070E 2B C1 sub ax,cx ; * 13 0710 BB 0400 mov bx,ndir 0713 B1 04 mov cl,4  The Microsoft MACRO Assembler , Version 1.25 Page 1-25 HARDDISK 01-31-84 0715 D3 FB sar bx,cl ; div 16 0717 2B C3 sub ax,bx ; - (ndir div 16) 0719 2B C2 sub ax,dx ; - 0 (1st pass); - nfats (2nd pass) 071B 40 inc ax ; 1 + 071C D1 F8 sar ax,1 ; div 2 ;--- rmg / necis / 1-27-84 ; ; select proper divide factor for the volume's AU size ; 071E 80 3E 0007 R 02 cmp byte ptr ausize,2 ; using ausize of 2 blocks? 0723 74 0B je divdone ; 0725 D1 F8 sar ax,1 ; div 4 0727 80 3E 0007 R 04 cmp byte ptr ausize,4 072C 74 02 je divdone 072E D1 F8 sar ax,1 ; div 8 0730 divdone: ; ;--- rmg / necis / 1-27-84 0730 8B C8 mov cx,ax 0732 03 C0 add ax,ax 0734 03 C1 add ax,cx ; * 3 0736 D1 F8 sar ax,1 ; div 2 0738 05 0202 add ax,514 ; + 3; + 511 073B B1 09 mov cl,9 073D D3 F8 sar ax,cl ; div 512 073F 83 FA 00 cmp dx,0 ; was this first pass? 0742 75 07 jnz nfat_exit ; exit if not 0744 59 pop cx 0745 5B pop bx 0746 8B D0 mov dx,ax ; save nfats for 2nd pass 0748 58 pop ax ; recover first track 0749 EB 99 jmp pass2 074B nfat_exit: 074B 59 pop cx 074C 5B pop bx 074D 5A pop dx ; whew, stack should be OK... 074E C3 ret 074F nfats endp 074F CODE ENDS END  The Microsoft MACRO Assembler , Version 1.25 Page Symbols-1 HARDDISK 01-31-84 Structures and records: N a m e Width # fields Shift Width Mask Initial BPBB . . . . . . . . . . . . . . 0016 0006 BPB_MED. . . . . . . . . . . . . 000D SCRT . . . . . . . . . . . . . . 000E BPB_ADR. . . . . . . . . . . . . 0012 BPB_SEG. . . . . . . . . . . . . 0014 DPB. . . . . . . . . . . . . . . 001A 000B BJMP . . . . . . . . . . . . . . 0000 SYSID. . . . . . . . . . . . . . 0003 SECSIZ . . . . . . . . . . . . . 000B ALLOC. . . . . . . . . . . . . . 000D RESSEC . . . . . . . . . . . . . 000E FATS . . . . . . . . . . . . . . 0010 MAXDIR . . . . . . . . . . . . . 0011 SECTORS. . . . . . . . . . . . . 0013 MEDIAID. . . . . . . . . . . . . 0015 FATSEC . . . . . . . . . . . . . 0016 SECPER . . . . . . . . . . . . . 0018 INITS. . . . . . . . . . . . . . 0016 0006 NOUNITS. . . . . . . . . . . . . 000D BPBADR . . . . . . . . . . . . . 0012 BPBSEG . . . . . . . . . . . . . 0014 IODAT. . . . . . . . . . . . . . 0016 0009 CMDLEN . . . . . . . . . . . . . 0000 UNIT . . . . . . . . . . . . . . 0001 CMD. . . . . . . . . . . . . . . 0002 STATUS . . . . . . . . . . . . . 0003 MEDIA. . . . . . . . . . . . . . 000D TRANS. . . . . . . . . . . . . . 000E COUNT. . . . . . . . . . . . . . 0012 START. . . . . . . . . . . . . . 0014 MEDIAS . . . . . . . . . . . . . 000F 0003 MED_DES. . . . . . . . . . . . . 000D MED_STS. . . . . . . . . . . . . 000E Segments and groups: N a m e Size align combine class CODE . . . . . . . . . . . . . . 074F PARA PUBLIC 'CODE' Symbols: N a m e Type Value Attr AUSIZE . . . . . . . . . . . . . L BYTE 0007 CODE AUS_SET. . . . . . . . . . . . . L NEAR 0702 CODE BUMP_DPB . . . . . . . . . . . . L NEAR 0181 CODE CHECK_BIT. . . . . . . . . . . . L NEAR 0140 CODE CRC_ERROR. . . . . . . . . . . . Number 0004  The Microsoft MACRO Assembler , Version 1.25 Page Symbols-2 HARDDISK 01-31-84 CUR_SECTOR . . . . . . . . . . . L WORD 0035 CODE CUR_TRACK. . . . . . . . . . . . L WORD 0033 CODE DISK_CHANGE_FLAG . . . . . . . . L WORD 0002 CODE Global DISK_INIT_FLAG . . . . . . . . . L BYTE 0004 CODE Global DIVDONE. . . . . . . . . . . . . L NEAR 0730 CODE DMA_ADDR . . . . . . . . . . . . L WORD 0037 CODE DMA_ALREDY_SET . . . . . . . . . L NEAR 020B CODE DMA_SEGMENT. . . . . . . . . . . V WORD 0000 CODE External DRIVER_NUM . . . . . . . . . . . V BYTE 0000 CODE External DRIVE_SEARCH . . . . . . . . . . N PROC 030B CODE Length =002C DSKCHG . . . . . . . . . . . . . L FAR 0000 CODE External DS_00. . . . . . . . . . . . . . L NEAR 032F CODE DS_05. . . . . . . . . . . . . . L NEAR 0323 CODE DS_10. . . . . . . . . . . . . . L NEAR 0334 CODE DS_20. . .% . . . . . . . . . . . L NEAR 0336 CODE ERR_EXIT . . . . . . . . . . . . L NEAR 0000 CODE External EXIT . . . . . . . . . . . . . . L NEAR 0000 CODE External GORD . . . . . . . . . . . . . . L NEAR 0000 CODE External GOT_BPB. . . . . . . . . . . . . L NEAR 0186 CODE GOWR . . . . . . . . . . . . . . L NEAR 0000 CODE External HARD_SIZE. . . . . . . . . . . . Number 0013 HD0BPB . . . . . . . . . . . . . L 001A 0039 CODE HD1BPB . . . . . . . . . . . . . L 001A 0053 CODE HD2BPB . . . . . . . . . . . . . L 001A 006D CODE HD3BPB . . . . . . . . . . . . . L 001A 0087 CODE HD4BPB . . . . . . . . . . . . . L 001A 00A1 CODE HD5BPB . . . . . . . . . . . . . L 001A 00BB CODE HD6BPB . . . . . . . . . . . . . L 001A 00D5 CODE HD7BPB . . . . . . . . . . . . . L 001A 00EF CODE HDC_00 . . . . . . . . . . . . . L NEAR 03DF CODE HDC_03 . . . . . . . . . . . . . L NEAR 03CA CODE HDC_05 . . . . . . . . . . . . . L NEAR 0425 CODE HDC_07 . . . . . . . . . . . . . L NEAR 03BE CODE HDC_08 . . . . . . . . . . . . . L NEAR 03A6 CODE HDC_10 . . . . . . . . . . . . . L NEAR 043A CODE HDC_11 . . . . . . . . . . . . . L NEAR 044D CODE HDC_14 . . . . . . . . . . . . . L NEAR 0483 CODE HDC_15 . . . . . . . . . . . . . L NEAR 04A0 CODE HDD_25 . . . . . . . . . . . . . L NEAR 04C9 CODE HDD_30 . . . . . . . . . . . . . L NEAR 04E6 CODE HDD_305. . . . . . . . . . . . . L NEAR 04F1 CODE HDD_35 . . . . . . . . . . . . . L NEAR 04FB CODE HDD_90 . . . . . . . . . . . . . L NEAR 0508 CODE HDD_99 . . . . . . . . . . . . . L NEAR 0515 CODE HDF_01 . . . . . . . . . . . . . L NEAR 0596 CODE HDF_02 . . . . . . . . . . . . . L NEAR 054A CODE HDG_10 . . . . . . . . . . . . . L NEAR 0682 CODE HDG_15 . . . . . . . . . . . . . L NEAR 068B CODE HDG_20 . . . . . . . . . . . . . L NEAR 069A CODE HDI_00 . . . . . . . . . . . . . L NEAR 05AC CODE HDI_01 . . . . . . . . . . . . . L NEAR 05B2 CODE HDI_02 . . . . . . . . . . . . . L NEAR 05C2 CODE HDI_05 . . . . . . . . . . . . . L NEAR 05DA CODE  The Microsoft MACRO Assembler , Version 1.25 Page Symbols-3 HARDDISK 01-31-84 HDI_10 . . . . . . . . . . . . . L NEAR 05D3 CODE HDI_20 . . . . . . . . . . . . . L NEAR 060D CODE HDI_200. . . . . . . . . . . . . L NEAR 05FB CODE HDSK_INIT. . . . . . . . . . . . L NEAR 0119 CODE Global HDSK_RED . . . . . . . . . . . . L NEAR 019A CODE Global HDSK_WRT . . . . . . . . . . . . L NEAR 01A8 CODE Global HDSK_WRV . . . . . . . . . . . . L NEAR 01A0 CODE Global HDS_00 . . . . . . . . . . . . . L NEAR 064F CODE HDS_01 . . . . . . . . . . . . . L NEAR 065F CODE HDS_05 . . . . . . . . . . . . . L NEAR 062D CODE HDS_06 . . . . . . . . . . . . . L NEAR 0636 CODE HDS_07 . . . . . . . . . . . . . L NEAR 063F CODE HDX_00 . . . . . . . . . . . . . L NEAR 0355 CODE HDX_01 . . . . . . . . . . . . . L NEAR 036E CODE HDX_02 . . . . . . . . . . . . . L NEAR 0383 CODE HDX_10 . . . . . . . . . . . . . L NEAR 0388 CODE HDX_90 . . . . . . . . . . . . . L NEAR 0385 CODE HDX_99 . . . . . . . . . . . . . L NEAR 0387 CODE HD_ADDRESS . . . . . . . . . . . L WORD 0009 CODE HD_AURAL . . . . . . . . . . . . L NEAR 0607 CODE HD_BAD_BLOCKS. . . . . . . . . . L WORD 0031 CODE HD_BASE_UNIT . . . . . . . . . . Number 0004 HD_BLOCK_SIZE. . . . . . . . . . Number 0200 HD_BLOCK_TRACK . . . . . . . . . Number 000D HD_BPBS. . . . . . . . . . . . . L WORD 0109 CODE HD_BUFFER. . . . . . . . . . . . Number 9C00 HD_BYTE_COUNT. . . . . . . . . . L WORD 000B CODE HD_CNFG_DESC . . . . . . . . . . L DWORD 002D CODE HD_CNFG_TABLE0 . . . . . . . . . Number 1B00 HD_CNFG_TABLE1 . . . . . . . . . Number 1D00 HD_COMMON. . . . . . . . . . . . N PROC 038C CODE Length =0199 HD_CONFIG_SKIP . . . . . . . . . L NEAR 02C6 CODE HD_CONFIG_SKIP0. . . . . . . . . L NEAR 02C7 CODE HD_CONTROLLER. . . . . . . . . . L BYTE 0027 CODE HD_CRC . . . . . . . . . . . . . L NEAR 0521 CODE HD_CURR_UNIT . . . . . . . . . . L BYTE 0006 CODE HD_CUR_TRACK . . . . . . . . . . L WORD 001B CODE HD_DEBLOCK . . . . . . . . . . . L NEAR 04A5 CODE HD_DEL . . . . . . . . . . . . . L NEAR 06DA CODE HD_DELAY . . . . . . . . . . . . N PROC 06D5 CODE Length =000A HD_DIRECT_MODE . . . . . . . . . L BYTE 0000 CODE Global HD_DIRTY_BUF . . . . . . . . . . L BYTE 001D CODE HD_DMA . . . . . . . . . . . . . N PROC 06AA CODE Length =002B HD_DMA_ADDR. . . . . . . . . . . Number 00A3 HD_DMA_AMASK . . . . . . . . . . Number 009F HD_DMA_CMD . . . . . . . . . . . Number 00A9 HD_DMA_MASK. . . . . . . . . . . Number 00AB HD_DMA_MODE. . . . . . . . . . . Number 009B HD_DMA_TC. . . . . . . . . . . . Number 0093 HD_ERROR . . . . . . . . . . . . L NEAR 0518 CODE HD_EST_INT . . . . . . . . . . . L BYTE 0020 CODE HD_FLUSH_BUF . . . . . . . . . . N PROC 0525 CODE Global Length =0072 HD_FMT_REG . . . . . . . . . . . Number 00A2  The Microsoft MACRO Assembler , Version 1.25 Page Symbols-4 HARDDISK 01-31-84 HD_GET_STATUS. . . . . . . . . . L NEAR 0668 CODE HD_HDC_CMD . . . . . . . . . . . Number 0092 HD_HDC_DATA. . . . . . . . . . . Number 00A0 HD_HDC_STAT. . . . . . . . . . . Number 0092 HD_HOMER . . . . . . . . . . . . L BYTE 000D CODE HD_HOME_CMD. . . . . . . . . . . Number 0050 HD_HOME_UNIT . . . . . . . . . . L BYTE 000E CODE HD_INDICATION. . . . . . . . . . L BYTE 0001 CODE Global HD_IND_CONTINUE. . . . . . . . . L NEAR 0616 CODE HD_IND_OFF . . . . . . . . . . . L NEAR 0000 CODE External HD_IND_ON. . . . . . . . . . . . L NEAR 0000 CODE External HD_INIT. . . . . . . . . . . . . N PROC 01B0 CODE Length =0126 HD_INIT_05 . . . . . . . . . . . L NEAR 01C4 CODE HD_INIT_10 . . . . . . . . . . . L NEAR 023E CODE HD_INIT_22 . . . . . . . . . . . L NEAR 02C1 CODE HD_INIT_25 . . . . . . . . . . . L NEAR 028A CODE HD_INIT_99 . . . . . . . . . . . L NEAR 02CF CODE HD_INIT_CC01 . . . . . . . . . . L NEAR 0284 CODE HD_INT_CMD . . . . . . . . . . . Number 0010 HD_INT_MASK. . . . . . . . . . . Number 0098 HD_INT_REG . . . . . . . . . . . Number 0096 HD_INT_STATUS. . . . . . . . . . L NEAR 0621 CODE HD_IO. . . . . . . . . . . . . . N PROC 0597 CODE Length =0113 HD_LCHL_REG. . . . . . . . . . . L BYTE 0023 CODE HD_LCHN_REG. . . . . . . . . . . L BYTE 0022 CODE HD_LHN_REG . . . . . . . . . . . L BYTE 0024 CODE HD_LPOS. . . . . . . . . . . . . L WORD 0025 CODE HD_LSN_REG . . . . . . . . . . . L BYTE 0025 CODE HD_MAX_RETRY . . . . . . . . . . Number 0008 HD_NUNITS. . . . . . . . . . . . Number 0008 HD_PHN_REG . . . . . . . . . . . L BYTE 0021 CODE HD_READ_CMD. . . . . . . . . . . Number 00B0 HD_READ_DMA. . . . . . . . . . . Number 0015 HD_RELOC_DESC. . . . . . . . . . L DWORD 0029 CODE HD_RELOC_TABLE0. . . . . . . . . Number 1A00 HD_RELOC_TABLE1. . . . . . . . . Number 1C00 HD_RELOC_VALID . . . . . . . . . Number BFFB HD_RESET . . . . . . . . . . . . Number 0094 HD_RETRY_COUNT . . . . . . . . . L BYTE 001E CODE HD_RW_MODE . . . . . . . . . . . L BYTE 0008 CODE HD_SCNT_REG. . . . . . . . . . . L BYTE 0026 CODE HD_SECTOR_COUNT. . . . . . . . . Number 001A HD_SEEKER. . . . . . . . . . . . L BYTE 000F CODE HD_SEEK_CMD. . . . . . . . . . . Number 0068 HD_SEEK_CYL. . . . . . . . . . . L WORD 0010 CODE HD_SEEK_HCYL . . . . . . . . . . L BYTE 0010 CODE HD_SEEK_LCYL . . . . . . . . . . L BYTE 0011 CODE HD_SEEK_UNIT . . . . . . . . . . L BYTE 0012 CODE HD_SELECT. . . . . . . . . . . . N PROC 02D6 CODE Length =0035 HD_SELECT_CC01 . . . . . . . . . L NEAR 02F3 CODE HD_SIZE_SECTOR . . . . . . . . . Number 0100 HD_STAT_BUF. . . . . . . . . . . L BYTE 001F CODE HD_TIME_FLUSH. . . . . . . . . . L BYTE 0028 CODE Global  The Microsoft MACRO Assembler , Version 1.25 Page Symbols-5 HARDDISK 01-31-84 HD_TIME_OUT. . . . . . . . . . . Number 0001 HD_TRACK_SIZE. . . . . . . . . . Number 19FF HD_TRANSFER. . . . . . . . . . . N PROC 0337 CODE Global Length =0055 HD_UNIT_SELECT . . . . . . . . . L BYTE 0005 CODE HD_UNIT_SKIP . . . . . . . . . . L NEAR 0238 CODE HD_WRT_CMD . . . . . . . . . . . N%umber 00F0 HD_WRT_DMA . . . . . . . . . . . Number 0019 HD_XFER. . . . . . . . . . . . . L BYTE 0013 CODE HD_XFER_COUNT. . . . . . . . . . L BYTE 0019 CODE HD_XFER_CYL. . . . . . . . . . . L WORD 0015 CODE HD_XFER_HCYL . . . . . . . . . . L BYTE 0015 CODE HD_XFER_LCYL . . . . . . . . . . L BYTE 0016 CODE HD_XFER_LHEAD. . . . . . . . . . L BYTE 0017 CODE HD_XFER_PHEAD. . . . . . . . . . L BYTE 0014 CODE HD_XFER_POS. . . . . . . . . . . L WORD 0018 CODE HD_XFER_SECTOR . . . . . . . . . L BYTE 0018 CODE HD_XFER_UNIT . . . . . . . . . . L BYTE 001A CODE HGET_BPB . . . . . . . . . . . . L NEAR 0175 CODE Global HMEDIAC. . . . . . . . . . . . . L NEAR 0133 CODE Global MSREAD . . . . . . . . . . . . . L FAR 0000 CODE External MSWRITE. . . . . . . . . . . . . L FAR 0000 CODE External NDIR . . . . . . . . . . . . . . Number 0400 NEXT_CONFIG. . . . . . . . . . . L NEAR 0251 CODE NEXT_UNIT. . . . . . . . . . . . L NEAR 01DF CODE NFATS. . . . . . . . . . . . . . N PROC 06DF CODE Length =0070 NFAT_EXIT. . . . . . . . . . . . L NEAR 074B CODE NOT_CHANGED. . . . . . . . . . . L NEAR 0164 CODE NUM_OF_SEC . . . . . . . . . . . V WORD 0000 CODE External OFF_LINE_ERROR . . . . . . . . . Number 0002 ONUNIT1. . . . . . . . . . . . . L NEAR 02EB CODE PASS2. . . . . . . . . . . . . . L NEAR 06E4 CODE PTRSAV . . . . . . . . . . . . . V DWORD 0000 CODE External REGPRNT. . . . . . . . . . . . . L FAR 0000 CODE External SEEK_ERROR . . . . . . . . . . . Number 0006 SHIFT_BIT. . . . . . . . . . . . L NEAR 013C CODE SPERTRK. . . . . . . . . . . . . Number 000D UNIT0_BPBS . . . . . . . . . . . L NEAR 0280 CODE USECF0 . . . . . . . . . . . . . L NEAR 0302 CODE USE_DESC0. . . . . . . . . . . . L NEAR 025E CODE WFLAG. . . . . . . . . . . . . . V BYTE 0000 CODE External Warning Severe Errors Errors 0 0 D_RETRY_COUNT . . . . . . . . . L BYTE 001E CODE HD_RW_MODE . . . . . . . . . . . L BYTE 0008 CODE HD_SCNT_REG. . . . . . . . . . . L BYTE 0026 CODE HD_SECTOR_COUNT. .  The Microsoft MACRO Assembler , Version 1.25 Page 1-1 BPT 01-31-84 TITLE BPT PAGE 58,132 ;----------------------------------------------------------------------------- ; ; MS-DOS BIOS for the N.E.C. Advanced Personal Computer ; ; module name: BPT ; MS-DOS version: 2.0 ; module version: 1.0 ; ; abstract: This routine will be executed whenever an interrupt ; trap halt occurs. It diplays the contents of the registers ; and allows for memory areas to be examined ; ; contains routines: ; regprnt ; ; revision history: ; ; - Written by Glen Horton, NECIS, April 1983 ; - Memory examine feature added by Rchard Geiger, NECIS, April 1983 ; - Fix for use as interrupt trap halt routine RMG / NECIS / Jan 1984 ; ;----------------------------------------------------------------------------- ;****** THIS IS A PROGRAM MODULE TO PRINT THE CURRENT REGISTER ** ;****** CONTENTS WHEN IT IS CALLED ***************************** ;*** 4/11/83 ****** G.R.H. ; 0000 CODE SEGMENT PUBLIC 'CODE' EXTRN PMSG:NEAR EXTRN MSCONIN:FAR,MSCONOUT:FAR ASSUME CS:CODE,DS:CODE,ES:CODE,SS:CODE PUBLIC REGPRNT ; 0000 REG_PRNT_PROC PROC FAR 0000 REGPRNT: 0000 2E: A3 012B R MOV cs:AX_SAVE,AX 0004 2E: 89 1E 012D R MOV cs:BX_SAVE,BX 0009 2E: 89 0E 012F R MOV cs:CX_SAVE,CX 000E 2E: 89 16 0131 R MOV cs:DX_SAVE,DX 0013 2E: 89 36 0133 R MOV cs:SI_SAVE,SI 0018 2E: 89 3E 0135 R MOV cs:DI_SAVE,DI 001D 2E: 89 2E 0137 R MOV cs:BP_SAVE,BP 0022 2E: 8C 1E 013D R MOV cs:DS_SAVE,DS 0027 2E: 8C 06 013F R MOV cs:ES_SAVE,ES 002C 2E: 8C 16 0139 R MOV cs:SS_SAVE,SS 0031 83 C4 06 ADD SP,6 0034 2E: 89 26 013B R MOV cs:SP_SAVE,SP 0039 83 EC 06 SUB SP,6 003C 8B EC MOV BP,SP 003E 8B 46 00 MOV AX,WORD PTR [BP] 0041 2E: A3 0143 R MOV cs:IP_SAVE,AX  The Microsoft MACRO Assembler , Version 1.25 Page 1-2 BPT 01-31-84 0045 8B 46 02 MOV AX,WORD PTR 2[BP] 0048 2E: A3 0141 R MOV cs:CS_SAVE,AX 004C 8B 46 04 MOV AX,WORD PTR 4[BP] 004F 2E: A3 0145 R MOV cs:FL_SAVE,AX ; 0053 8C C8 mov ax,cs 0055 8E D8 mov ds,ax 0057 8E C0 mov es,ax 0059 8E D0 mov ss,ax 005B BC 0351 R mov sp,offset new_sp ; 005E BF 015D R MOV DI,OFFSET AX_SAVE_STR+6 0061 B9 000E MOV CX,14 ;THERE ARE 14 REGS TO CONVERT 0064 BB 012B R MOV BX,OFFSET AX_SAVE 0067 NEXT_REG: 0067 8B 17 MOV DX,WORD PTR [BX] 0069 51 PUSH CX 006A B9 0004 MOV CX,4 006D NEXT_DIGIT: 006D 2B C0 SUB AX,AX 006F F8 CLC 0070 D1 D2  RCL DX,1 0072 D1 D0 RCL AX,1 0074 D1 D2 RCL DX,1 0076 D1 D0 RCL AX,1 0078 D1 D2 RCL DX,1 007A D1 D0 RCL AX,1 007C D1 D2 RCL DX,1 007E D1 D0 RCL AX,1 0080 53 PUSH BX 0081 BB 0147 R MOV BX,OFFSET TABLE_1 0084 D7 XLAT 0085 5B POP BX 0086 88 05 MOV BYTE PTR [DI],AL 0088 47 INC DI 0089 E2 E2 LOOP NEXT_DIGIT 008B 59 POP CX 008C 83 C7 05 ADD DI,5 008F 83 C3 02 ADD BX,2 0092 83 F9 08 cmp cx,8 0095 75 03 jnz nospc 0097 83 C7 02 add di,2 009A nospc: 009A E2 CB LOOP NEXT_REG ; ;*** GET THE BYTES FROM THE MEMORY ****************** ;*** 10 BYTES BEFORE OLD IP AND 5 BYTES AFTER OLD IP ********* ; 009C 06 PUSH ES ;SAVE CURRENT ES VALUE 009D 8E 06 0141 R MOV ES,CS_SAVE ;GET OLD CS VALUE 00A1 8B 36 0143 R MOV SI,IP_SAVE ;GET OLD IP VALUE 00A5 83 EE 0A  SUB SI,10 ;10 BYTES BEFORE OLD IP 00A8 BF 01E5 R MOV DI,OFFSET BYTE_SAVE_STR ;POINT TO CONVERT AREA  The Microsoft MACRO Assembler , Version 1.25 Page 1-3 BPT 01-31-84 00AB BB 0147 R MOV BX,OFFSET TABLE_1 ;TRANSLATE TABLE PTR 00AE B9 0010 MOV CX,16 ;THERE ARE 16 BYTES TO CONVERT ; 00B1 NEXT_BYTE: ; 00B1 26: 8A 14 MOV DL,BYTE PTR ES:[SI] ;GET THE BYTE 00B4 51 PUSH CX ;SAVE AWAY THE OLD CX VALUE 00B5 B9 0002 MOV CX,2 ;THERE ARE 2 NYBBLES PER BYTE ; 00B8 NEXT_NYBBLE: ; 00B8 F8 CLC ;CARRY = 0 00B9 2B C0 SUB AX,AX ;DEST CLEARED 00BB D0 D2 RCL DL,1 00BD D0 D0 RCL AL,1 00BF D0 D2 RCL DL,1 00C1 D0 D0 RCL AL,1 00C3 D0 D2 RCL DL,1 00C5 D0 D0 RCL AL,1 00C7 D0 D2 RCL DL,1 00C9 D0 D0 RCL AL,1 00CB D7 XLAT ;CONVERT TO ASCII 00CC 88 05 MOV BYTE PTR DS:[DI],AL 00CE 47 INC DI 00CF E2 E7 LOOP NEXT_NYBBLE ;DO THE NEXT HALF OF THE BYTE 00D1 47 INC DI 00D2 47 INC DI 00D3 46 INC SI ;NEXT BYTE IN MEMORY 00D4 59 POP CX ;OLD COUNT RECOVERED 00D5 E2 DA LOOP NEXT_BYTE ;DO THE NEXT BYTE 00D7 07 POP ES ;RECOVER THE OLD ES VALUE ; ;** NOW OUTPUT THE RESULTS ******************* ; 00D8 9C pushf 00D9 FB sti 00DA BB 0351 R mov bx,offset trapmsg 00DD E8 0000 E call pmsg 00E0 BB 0157 R bploop: mov bx,offset ax_save_str 00E3 E8 0000 E call pmsg 00E6 BB 0376 R mov bx,offset prmpts 00E9 E8 0000 E call pmsg 00EC E8 0390 R call rdhex 00EF 72 EF jc bploop 00F1 8B F0 mov si,ax 00F3 BB 038B R mov bx,offset prmpto 00F6 E8 0000 E call pmsg 00F9 E8 0390 R call rdhex 00FC 72 E2 jc bploop 00FE 8B F8 mov di,ax 0100 E8 03CC R call dmpm&em 0103 EB DB jmp bploop ;  The Microsoft MACRO Assembler , Version 1.25 Page 1-4 BPT 01-31-84 ; do until false (forever) ; 0105 9D popf ; ;*** RESTORE ALL THE REGISTERS ****************** ; 0106 8B 1E 012D R MOV BX,BX_SAVE 010A 8B 0E 012F R MOV CX,CX_SAVE 010E 8B 16 0131 R MOV DX,DX_SAVE 0112 8B 36 0133 R MOV SI,SI_SAVE 0116 8B 3E 0135 R MOV DI,DI_SAVE 011A 8B 2E 0137 R MOV BP,BP_SAVE 011E A1 0145 R MOV AX,FL_SAVE 0121 50 PUSH AX 0122 9D POPF 0123 A1 012B R MOV AX,AX_SAVE 0126 8E 1E 013D R MOV DS,DS_SAVE 012A CB RET 012B REG_PRNT_PROC ENDP = 000D CR EQU 0DH = 000A LF EQU 0AH ; 012B 0000 AX_SAVE DW 0 012D 0000 BX_SAVE DW 0 012F 0000 CX_SAVE DW 0 0131 0000 DX_SAVE DW 0 0133 0000 SI_SAVE DW 0 0135 0000 DI_SAVE  DW 0 0137 0000 BP_SAVE DW 0 0139 0000 SS_SAVE DW 0 013B 0000 SP_SAVE DW 0 013D 0000 DS_SAVE DW 0 013F 0000 ES_SAVE DW 0 0141 0000 CS_SAVE DW 0 0143 0000 IP_SAVE DW 0 0145 0000 FL_SAVE DW 0 ;**** TRANSLATE TABLE ******** 0147 30 31 32 33 34 35 TABLE_1 DB '0123456789ABCDEF' 36 37 38 39 41 42 43 44 45 46 ;**** STRING OUTPUT ************ 0157 0D 0A 0A AX_SAVE_STR DB CR,LF,LF ; 015A 41 58 3D 58 58 58 DB 'AX=XXXX',' ' 58 20 20 0163 42 58 3D 58 58 58 DB 'BX=XXXX',' ' 58 20 20 016C 43 58 3D 58 58 58 DB 'CX=XXXX',' ' 58 20 20 0175 44 58 3D 58 58 58 DB 'DX=XXXX',' '  The Microsoft MACRO Assembler , Version 1.25 Page 1-5 BPT 01-31-84 58 20 20 017E 53 49 3D 58 58 58 DB 'SI=XXXX',' ' 58 20 20 0187 44 49 3D 58 58 58 DB 'DI=XXXX',' '  58 20 20 0190 42 50 3D 58 58 58 DB 'BP=XXXX',' ',0dh,0ah 58 20 20 0D 0A 019B 53 53 3D 58 58 58 DB 'SS=XXXX',' ' 58 20 20 01A4 53 50 3D 58 58 58 DB 'SP=XXXX',' ' 58 20 20 01AD 44 53 3D 58 58 58 DB 'DS=XXXX',' ' 58 20 20 01B6 45 53 3D 58 58 58 DB 'ES=XXXX',' ' 58 20 20 01BF 43 53 3D 58 58 58 DB 'CS=XXXX',' ' 58 20 20 01C8 49 50 3D 58 58 58 DB 'IP=XXXX',' ' 58 20 20 01D1 46 4C 3D 58 58 58 DB 'FL=XXXX',CR,LF,LF 58 0D 0A 0A 01DB 43 53 3A 49 50 2D DB 'CS:IP-10: ' 31 30 3A 20 01E5 58 58 20 20 58 58 BYTE_SAVE_STR DB 'XX XX XX XX XX XX XX XX XX XX [XX] ' 20 20 58 58 20 20 58 58 20 20 58 58 20 20 58 58 20 20 58 58 20 20 58 58 20 20 58 58 20 20 58 58 20 5B 58 58 5D 20 0211 58 58 20 20 58 58 DB 'XX XX XX XX XX' 20 20 58 58 20 20  58 58 20 20 58 58 0223 0D 0A 0A DB CR,LF,LF 0226 5B 58 58 5D 20 3C DB '[XX] <-- RETURN ADDRESS ON STACK (CS:IP)',CR,LF 2D 2D 20 52 45 54 55 52 4E 20 41 44 44 52 45 53 53 20 4F 4E 20 53 54 41 43 4B 20 28 43 53 3A 49 50 29 0D 0A 0250 00 DB 0 0251 80 [ new_stk dw 80h dup (?) ???? ] 0351 new_sp: 0351 0D 0A 07 20 2A 2A trapmsg db 0dh,0ah,07,' *** Interrupt Trap Halt ! ***',07h,0dh,0ah,0ah 2A 20 49 6E 74 65 72 72 75 70 74 20  The Microsoft MACRO Assembler , Version 1.25 Page 1-6 BPT 01-31-84 54 72 61 70 20 48 61 6C 74 20 21 20 2A 2A 2A 07 0D 0A 0A 0376 0D 0A 44 75 6D 70 prmpts db cr,lf,'Dump memory at ? >',0 20 6D 65 6D 6F 72 79 20 61 74 20 3F 20 3E 00 038B 3A 00 prmpto db ':',0 038D 0D 0A 00  crlf db 0dh,0ah,0 0390 53 rdhex: push bx 0391 51 push cx 0392 B3 04 mov bl,4 0394 33 C9 xor cx,cx 0396 32 E4 xor ah,ah 0398 E8 043C R get1: call svconin 039B E8 0428 R call svconout 039E 2C 30 sub al,30h 03A0 7C 20 jl hxerr 03A2 3C 09 cmp al,9 03A4 7F 10 jg tryalp 03A6 0A C8 add1: or cl,al 03A8 FE CB dec bl 03AA 74 1A jz hxok 03AC 50 push ax 03AD 91 xchg ax,cx 03AE B1 04 mov cl,4 03B0 D3 C0 rol ax,cl 03B2 91 xchg ax,cx 03B3 58 pop ax 03B4 EB E2 jmp get1 03B6 2C 07 tryalp: sub al,7 03B8 3C 0A cmp al,0ah 03BA 7C 06 jl hxerr 03BC 3C 0F cmp al,0fh 03BE 7F 02 jg hxerr 03C0 EB E4 jmp add1 ; 03C2 F9 hxerr: stc 03C3 EB 04 90 jmp hexit 03C6 F8 hxok: clc 03C7 8B C1 mov ax,cx 03C9 59 hexit: pop cx 03CA 5B pop bx 03CB C3  ret 03CC BB 038D R dmpmem: mov bx,offset crlf 03CF E8 0000 E call pmsg 03D2 8E C6 mov es,si 03D4 8C C0 dump1: mov ax,es 03D6 E8 0400 R call wrdhex 03D9 B0 3A mov al,":"  The Microsoft MACRO Assembler , Version 1.25 Page 1-7 BPT 01-31-84 03DB E8 0428 R call svconout 03DE 8B C7 mov ax,di 03E0 E8 0400 R call wrdhex 03E3 B0 20 mov al,' ' 03E5 E8 0428 R call svconout 03E8 26: 8B 05 mov ax,es:[di] 03EB E8 0400 R call wrdhex 03EE BB 038D R mov bx,offset crlf 03F1 E8 0000 E call pmsg 03F4 E8 043C R call svconin 03F7 3C 0D cmp al,0dh 03F9 75 04 jnz mexit 03FB 47 inc di 03FC 47 inc di 03FD EB D5 jmp dump1 03FF C3 mexit: ret 0400 wrdhex: 0400 53 push bx 0401 51 push cx 0402 8B C8 mov cx,ax 0404 B4 04 mov ah,4 0406 8A C5 nib1: mov al,ch 0408 51 push cx 0409 B1 04 mov cl,4 040B D2 C8 ror al,cl 040D 59 pop cx 040E 24 0F and al,0fh 0410 BB 0147 R mov bx,offset table_1 0413 D7 xlat 0414 E8 0428 R call svconout 0417 FE CC dec ah 0419 74 0A jz wexit 041B 50 push ax 041C 91 xchg ax,cx 041D B1 04 mov cl,4 041F D3 C0 rol ax,cl 0421 91 xchg ax,cx 0422 58 pop ax 0423 EB E1 jmp nib1 ; 0425 59 wexit: pop cx 0426 5B pop bx 0427 C3 ret ; ; The following routine permits use of the new "minimal save" ; msconout by preserving registers not saved in msconout ; RMG 6-8-83 ; 0428 svconout: 0428 51 push cx 0429 53 push bx  The Microsoft MACRO Assembler , Version 1.25 Page 1-8 BPT 01-31-84 042A 52 push dx 042B 56 push si 042C 57 push di 042D 50  push ax 042E 1E push ds 042F 9A 0000 ---- E call msconout 0434 1F pop ds 0435 58 pop ax 0436 5F pop di 0437 5E pop si 0438 5A pop dx 0439 5B pop bx 043A 59 pop cx 043B C3 ret ; ; The following routine permits use of the new "minimal save" ; msconin by preserving registers not saved in msconin ; RMG 1-23-84 ; 043C svconin: 043C 51 push cx 043D 53 push bx 043E 52 push dx 043F 56 push si 0440 57 push di 0441 1E push ds 0442 9A 0000 ---- E call msconin 0447 1F pop ds 0448 5F pop di 0449 5E pop si 044A 5A pop dx 044B 5B pop bx 044C 59 pop cx 044D C3 ret 044E CODE ENDS END  The Microsoft MACRO Assembler , Version 1.25 Page Symbols-1 BPT 01-31-84 Segments and g&roups: N a m e Size align combine class CODE . . . . . . . . . . . . . . 044E PARA PUBLIC 'CODE' Symbols: N a m e Type Value Attr ADD1 . . . . . . . . . . . . . . L NEAR 03A6 CODE AX_SAVE. . . . . . . . . . . . . L WORD 012B CODE AX_SAVE_STR. . . . . . . . . . . L BYTE 0157 CODE BPLOOP . . . . . . . . . . . . . L NEAR 00E0 CODE BP_SAVE. . . . . . . . . . . . . L WORD 0137 CODE BX_SAVE. . . . . . . . . . . . . L WORD 012D CODE BYTE_SAVE_STR. . . . . . . . . . L BYTE 01E5 CODE CR . . . . . . . . . . . . . . . Number 000D CRLF . . . . . . . . . . . . . . L BYTE 038D CODE CS_SAVE. . . . . . . . . . . . . L WORD 0141 CODE CX_SAVE. . . . . . . . . . . . . L WORD 012F CODE DI_SAVE. . . . . . . . . . . . . L WORD 0135 CODE DMPMEM . . . . . . . . . . . . . L NEAR 03CC CODE DS_SAVE. . . . . . . . . . . . . L WORD 013D CODE DUMP1. . . . . . . . . . . . . . L NEAR 03D4 CODE DX_SAVE. . . . . . . . . . . . . L WORD 0131 CODE ES_SAVE. . . . . . . . . . . . . L WORD 013F CODE FL_SAVE. . . . . . . . . . . . . L WORD 0145 CODE GET1 . . . . . . . . . . . . . . L NEAR 0398 CODE HEXIT. . . . . . . . . . . . . . L NEAR 03C9 CODE HXERR. . . . . . . . . . . . . . L NEAR 03C2 CODE HXOK . . . . . . . . . . . . . . L NEAR 03C6 CODE IP_SAVE. . . . . . . . . . . . . L WORD 0143 CODE LF . . . . . . . . . . . . . . . Number 000A MEXIT. . . . . . . . . . . . . . L NEAR 03FF CODE MSCONIN. . . . . . . . . . . . . L FAR 0000 CODE External MSCONOUT . . . . . . . . . . . . L FAR 0000 CODE External NEW_SP . . . . . . . . . . . . . L NEAR 0351 CODE NEW_STK. . . . . . . . . . . . . L WORD 0251 CODE Length =0080 NEXT_BYTE. . . . . . . . . . . . L NEAR 00B1 CODE NEXT_DIGIT . . . . . . . . . . . L NEAR 006D CODE NEXT_NYBBLE. . . . . . . . . . . L NEAR 00B8 CODE NEXT_REG . . . . . . . . . . . . L NEAR 0067 CODE NIB1 . . . . . . . . . . . . . . L NEAR 0406 CODE NOSPC. . . . . . . . . . . . . . L NEAR 009A CODE PMSG . . . . . . . . . . . . . . L NEAR 0000 CODE External PRMPTO . . . . . . . . . . . . . L BYTE 038B CODE PRMPTS . . . . . . . . . . . . . L BYTE 0376 CODE RDHEX. . . . . . . . . . . . . . L NEAR 0390 CODE REGPRNT. . . . . . . . . . . . . L NEAR 0000 CODE Global REG_PRNT_PROC. . . . . . . . . . F PROC 0000 CODE Length =012B SI_SAVE. . . . . . . . . . . . . L WORD 0133 CODE SP_SAVE. . . . . . . . . . . . . L WORD 013B CODE  The Microsoft MACRO Assembler , Version 1.25 Page Symbols-2 BPT 01-31-84 SS_SAVE. . . . . . . . . . . . . L WORD 0139 CODE SVCONIN. . . . . . . . . . . . . L NEAR 043C CODE SVCONOUT . . . . . . . . . . . . L NEAR 0428 CODE TABLE_1. . . . . . . . . . . . . L BYTE 0147 CODE TRAPMSG. . . . . . . . . . . . . L BYTE 0351 CODE TRYALP . . . . . . . . . . . . . L NEAR 03B6 CODE WEXIT. . . . . . . . . . . . . . L NEAR 0425 CODE WRDHEX . . . . . . . . . . . . . L NEAR 0400 CODE Warning Severe Errors Errors 0 0   The Microsoft MACRO Assembler , Version 1.25 Page 1-1 RAMDISK 01-28-84 TITLE RAMDISK PAGE 58,132 ;----------------------------------------------------------------------------- ; ; MS-DOS Ram Disk driver for the N.E.C. Advanced Personal Computer ; ; module name: RAMDISK ; MS-DOS version: 2.0 ; module version: 1.0 ; ; abstract: This module provides a RAM emulation of a SSSD floppy disk. ; ; revision history: ; ; Work is begun Tue evening 10-04-83 22:24 / RMG ; Coding completed on Thursday evening ; Working on Sunday afternoon ; Added Volumne name of RAMDISK on Monday (Columbus Day) ; ; implementation notes ; ; This version of the driver requires a system with 512kb of memory ; contiguous from 0000:0000 to 7000:FFFE. There is no provision for ; using a different memory region at this time. It cannot be used with ; the rev 00 release of the system, since MS-DOS will autosize into the ; area used as memory disk. Release (001) contains a ramdisk enable byte ; in IO.SYS which, when set, inhibits auto memory sizing on 512KB ; systems, and causes sysinit to configure a 256KB memory arena. ; ; To active the RAMDISK, the driver, RAMDISK.SYS, must be installed at ; boot time. This is accomplished by a DEVICE=RAMDISK.SYS command in the ; CONFIG.SYS file. When MS-DOS installs the driver, the initialization ; code in the driver first determines whether a formatted ram disk is ; present by looking for a string in the first logical sector. If the ; message is present, the driver will assume a valid RAMDISK and skip ; the formating code. If the message is not present, the driver formats ; the ramdisk by writing E5's to each byte on the volume, then writing ; the blank FATs and directory areas. The net efect is that the RAMDISK ; will be formatted only at the first boot after poweron; subsequent ; reboots will not destroy a RAMDISK volume's data. To force a RAMDISK ; formatting, use debug (or a simple utility could be used) to overwrite ; the initialization message at the first logical sector (system memory ; address 4000:0000), or power down the system and re-boot. ; ;----------------------------------------------------------------------------- 0000 code segment assume cs:code,ds:code,es:code,ss:nothing ; org 100h ; ; equates ; = 000C ramdiskenable_cnfg equ 12 ; config entry number  The Microsoft MACRO Assembler , Version 1.25 Page 1-2 RAMDISK 01-28-84 = 4000 ramdisk_base equ 4000h ; base of ramdisk paragraph = 0001 nunits equ 1 ; well it's better than none ; ; driver header ; 0000 devstart label word 0000 ramdiskdev: ; header for device 0000 FFFF FFFF dw -1,-1 ; only one device in this driver 0004 2000 dw 2000h ; non-IBM format, block device 0006 0050 R dw strategy ; dummy strategy entry 0008 005B R dw ramdisk_int ; dummy interrupt entry 000A 01 db nunits ; 1 unit 000B 07 [ db 7 dup (?) ; pad header ?? ] ; 0012 ramdisktable: 0012 03B5 R dw init ; 0 initialize driver 0014 00D5 R dw mediac ; 1 media check 0016 00E8 R dw get_bpb ; 2 build BPB 0018 00AA R dw cmderr ; 3 IOCTL input 001A 00FF R dw read ; 4 input (read) 001C 00A4 R dw busy_exit ; 5 non-destruct input (read) 001E 00B1 R dw exit ; 6 input status 0020 00B1 R dw exit ; 7 input flush 0022 0135 R dw write ; 8 output (write) 0024 0135 R dw write_ver ; 9 output (write) with verify 0026 00B1 R dw exit ;10 return output status 0028 00B1 R dw exit ;11 output flush 002A 00B1 R dw exit ;12 IOCTL output ; ; IO data packet structures: ; iodat struc 0000 ?? cmdln db ? ; length of this command 0001 ?? unit db ? ; sub unit specifier 0002 ?? cmd db ? ; command code 0003 ???? status dw ? ; return status 0005 08 [ db 8 dup (?) ; reserved for q links (future versions) ?? ] 000D ?? media db ? ; media descriptor byte 000E ???????? trans dd ? ; transfer address 0012 ???? count dw ? ; count of blocks or characters 0014 ???? start dw ? ; first block to transfer 0016 iodat ends inits struc ; init function io request packet  The Microsoft MACRO Assembler , Version 1.25' Page 1-3 RAMDISK 01-28-84 0000 0D [ db 13 dup (?) ; 13 byte static header ?? ] 000D ?? nounits db ? ; number of units 000E ???? dw ? 0010 ???? dw ? 0012 ???? bpbadr dw ? ; bpb address return 0014 ???? bpbseg dw ? ; bpb segment return 0016 inits ends bpbb struc ; get bpb function io request structure 0000 0D [ db 13 dup (?) ; 13 byte static header ?? ] 000D ?? bpb_med db ? ; media descriptor return 000E ???? scrt dw ? 0010 ???? dw ? 0012 ???? bpb_adr dw ? 0014 ???? bpb_seg dw ? 0016 bpbb ends medias struc ; media check io request structure 0000 0D [ db 13 dup (?) ; 13 byte static header ?? ] 000D ?? med_des db ? ; media descriptor 000E ?? med_sts db ? ; media change status 000F medias ends dpb struc ; disk parameter block structure 0000 03 [ bjmp db 3 dup (?) ; for dpb in sector 1 - unused this implement. ?? ] 0003 08 [ sysid db 8 dup (?) ; ditto ?? ] 000B ???? secsiz dw ? ; sector size in bytes 000D ?? alloc db ? ; au size in sectors 000E ???? ressec dw ? ; number reserved sectors 0010 ?? fats db ? ; number of FATs 0011 ???? maxdir dw ? ; maximum # of drectory entries 0013 ???? sectors dw ? ; total size in sectors 0015 ?? mediaid db ? ; meadia descriptor 0016 ???? fatsec dw ? ; number of FAT sectors 0018 ???? secper dw ? ; number of sectors per FAT (optional) 001A dpb ends  The Microsoft MACRO Assembler , Version 1.25 Page 1-4 RAMDISK  01-28-84 002C 03 [ ramdpb dpb <,,128,4,1,2,68,77*26,0ffh,6> ?? ] 002F 08 [ ?? ] 0037 0080 0039 04 003A 0001 003C 02 003D 0044 003F 07D2 0041 FF 0042 0006 0044 ???? 0046 0037 R ramdsk_ptr dw ramdpb.secsiz 0048 00 00 00 00 ptrsav dd 0 004C 0000 dos_ss_sav dw 0 ; save area for dos stack seg & pointer 004E 0000 dos_sp_sav dw 0 ; ; "dummy" strategy routine- simple version for non-multitasking system ; ; only saves IO packet pointer in ptrsav ; 0050 stratp proc far 0050 strategy: 0050 2E: 89 1E 0048 R mov word ptr cs:[ptrsav],bx ; save offset 0055 2E: 8C 06 004A R mov word ptr cs:[ptrsav+2],es ; save segment base 005A CB ret 005B stratp endp  ; ; "interrupt" routine entry ; 005B ramdisk_int: 005B 50 push ax 005C 53 push bx 005D 51 push cx 005E 52 push dx 005F 56 push si 0060 57 push di 0061 55 push bp 0062 1E push ds 0063 06 push es 0064 0E push cs 0065 1F pop ds  The Microsoft MACRO Assembler , Version 1.25 Page 1-5 RAMDISK 01-28-84 0066 9C pushf ; maintain old interrupt state 0067 58 pop ax 0068 FA cli ; indivisable op for old 8086s 0069 89 26 004E R mov dos_sp_sav,sp ; save DOS stack state; 006D 8C 16 004C R mov dos_ss_sav,ss ; will use our own in this driver 0071 8C CB mov bx,cs 0073 8E D3 mov ss,bx 0075 BC 03B5 R mov sp,offset stackbase 0078 50 push ax 0079 9D popf ; recover old interrupt state 007A BE 0012 R mov si,offset ramdisktable 007D  2E: C5 1E 0048 R lds bx,cs:[ptrsav] ; get io packet pointer 0082 8A 47 01 mov al,[bx.unit] ; al is unit code 0085 8A 67 0D mov ah,[bx.media] ; ah is media 0088 8B 4F 12 mov cx,[bx.count] ; cx is byte/sector count 008B 8B 57 14 mov dx,[bx.start] ; dx is starting sector 008E 97 xchg di,ax ; save unit, media... 008F 8A 47 02 mov al,[bx.cmd] ; al is command code 0092 32 E4 xor ah,ah ; clear ah 0094 03 F0 add si,ax 0096 03 F0 add si,ax ; si points to pointer to entry 0098 3C 0C cmp al,12 ; confirm valid command 009A 77 0E ja cmderr ; oops, no such beast, error 009C 97 xchg ax,di ; ax is unit, media again 009D C4 7F 0E les di,[bx.trans] ; es:di is transfer address 00A0 0E push cs 00A1 1F pop ds 00A2 FF 24 jmp [si] ; vector off to handler... ; ; exit routine entry points ; 00A4 busy_exit: 00A4 B4 03 mov ah,00000011b ; return busy, done status 00A6 F8 clc 00A7 EB 0B 90 jmp exit1 ; jump to common exit code 00AA B0 03 cmderr: mov al,3 ; "unknown command" error code ; ; common error exit code; come here with actual error ; code in al... ; 00AC err_exit: 00AC B4 81 mov ah,10000001b ; return error, done 00AE F9 stc ;set carry error flag 00AF EB 03 jmp short exit1 ;and use common exit ;  The Microsoft MACRO Assembler , Version 1.25 Page 1-6 RAMDISK 01-28-84 ; normal (non-error) exit code. deive drivers should exit here if ; no error was encountered ; 00B1 exitp proc far 00B1 B4 01 exit: mov ah,00000001b ;return done 00B3 F8 clc ; clear carry - no error ; ; common exit code here. enter with ah (& al if error bit on in ah) ; and carry set (error) or reset (no error) ; 00B4 2E: C5 1E 0048 R exit1: lds bx,cs:[ptrsav] ;retrieve pointer to io packet 00B9 89 47 03 mov [bx.status],ax ;put return status into packet 00BC 0E push cs 00BD 1F pop ds 00BE 9C pushf 00BF 58 pop ax ; indivisible op (for old 8086) 00C0 FA cli ; interrupts off 00C1 8E 16 004C R mov ss,dos_ss_sav 00C5 8B 26 004E R mov sp,dos_sp_sav ; restore DOS stack state; 00C9 50 push ax 00CA 9D popf ; maintain interrupt state 00CB 07 pop es 00CC 1F pop ds 00CD 5D pop bp 00CE 5F pop di 00CF 5E pop si 00D0 5A pop dx 00D1 59 pop cx 00D2 5B pop bx 00D3 58 pop ax 00D4 CB ret 00D5 exitp endp ; end of exit routine ; ; ; mediac ; ; perform media check operation ; 00D5 mediac: 00D5 2E: C5 1E 0048 R lds bx,cs:[ptrsav] 00DA B4 01 mov ah,1 ; ramdisk cannot be removed! 00DC 88 67 0E mov [bx.med_sts],ah ; 00DF B4 FF mov ah,0ffh ; only game in town 00E1 88 67 0D mov [bx.med_des],ah 00E4 B0 00 mov al,0 ; no error 00E6 EB C9 jmp exit  The Microsoft MACRO Assembler , Version 1.25 Page 1-7 RAMDISK 01-28-84 ; ; ; get_bpb ; ; return pointer to bios parameter block ; 00E8 get_bpb: 00E8 bp_rdy: 00E8 B4 FF mov ah,0ffh 00EA B9 0037 R mov cx,offset ramdpb.secsiz 00ED 2E: C5 1E 0048 R lds bx,cs:[ptrsav] ; 00F2 88 67 0D mov [bx.bpb_med],ah 00F5 89 4F 12 mov [bx.bpb_adr],cx 00F8 8C 4F 14 mov [bx.bpb_seg],cs 00FB B0 00 mov al,0 00FD EB B2 jmp exit ' ; ; read ; ; read multiple sectors ; ; al is unit code ; ah is media ; cx is byte/sector count ; dx is starting sector ; es:di is transfer address ; 00FF read: 00FF 51 push cx 0100 52 push dx 0101 81 E2 FE00 and dx,0fe00h 0105 B1 03 mov cl,3 0107 D3 E2 shl dx,cl 0109 BB 4000 mov bx,ramdisk_base 010C 03 DA add bx,dx 010E 8E DB mov ds,bx 0110 5A pop dx 0111 81 E2 01FF and dx,01ffh 0115 8B DA mov bx,dx ; get starting sector 0117 B1 07 mov cl,7 ; * 128 shift factor 0119 D3 E3 shl bx,cl ; find offset for the start sector 011B 59 pop cx 011C 8B F3 mov si,bx ; set up for transfer 011E 51 push cx ; save for after transfer complete 011F 83 F9 00 cmp cx,0 ; zero sector transfer? 0122 74 03 jz red_noxfer 0124 E8 0171 R call transfer 0127 red_noxfer: 0127 B4 00 mov ah,0 0129 2E: C5 1E 0048 R lds bx,cs:[ptrsav]  The Microsoft MACRO Assembler , Version 1.25 Page 1-8 RAMDISK 01-28-84 012E 59 pop cx 012F 89 4F 12 mov [bx.count],cx ; fill in total number xfered 0132 E9 00B1 R jmp exit ; ; write ; ; write multiple sectors ; ; al is unit code ; ah is media ; cx is byte/sector count ; dx is starting sector ; es:di is transfer address ; 0135 write: 0135 write_ver: 0135 51 push cx 0136 52 push dx 0137 81 E2 FE00 and dx,0fe00h 013B B1 03 mov cl,3 013D D3 E2 shl dx,cl 013F BB 4000 mov bx,ramdisk_base 0142 03 DA add bx,dx 0144 8E DB mov ds,bx 0146 5A pop dx 0147 81 E2 01FF and dx,01ffh 014B 8B DA mov bx,dx ; get starting sector  014D B1 07 mov cl,7 ; * 128 shift factor 014F D3 E3 shl bx,cl ; find offset for the start sector 0151 59 pop cx 0152 8B F3 mov si,bx ; set up for transfer 0154 51 push cx ; save for after transfer complete 0155 83 F9 00 cmp cx,0 ; zero sector transfer? 0158 74 09 jz wrt_noxfer 015A 06 push es 015B 1E push ds 015C 87 F7 xchg si,di 015E 07 pop es 015F 1F pop ds 0160 E8 0171 R call transfer 0163 wrt_noxfer: 0163 B4 00 mov ah,0 0165 2E: C5 1E 0048 R lds bx,cs:[ptrsav] 016A 59 pop cx 016B 89 4F 12 mov [bx.count],cx ; fill in total number xfered 016E E9 00B1 R jmp exit ; ; transfer routine  The Microsoft MACRO Assembler , Version 1.25 Page 1-9 RAMDISK 01-28-84 ; ; input ; ds:si source ; es:di destination ; cx sector count ; ; routine ignores wrap around bytes ; 0171 transfer: 0171 51 push cx 0172 8B C7 mov ax,di 0174 D1 E8 shr ax,1 0176 D1 E8 shr ax,1 0178 D1 E8 shr ax,1 017A D1 E8 shr ax,1 017C 8C C1 mov cx,es 017E 03 C8 add cx,ax 0180 8E C1 mov es,cx 0182 81 E7 000F and di,000fh 0186 8B C6 mov ax,si 0188 D1 E8 shr ax,1 018A D1 E8 shr ax,1 018C D1 E8 shr ax,1 018E D1 E8 shr ax,1 0190 8C D9 mov cx,ds 0192 03 C8 add cx,ax 0194 8E D9 mov ds,cx 0196 81 E6 000F and si,000fh 019A 59 pop cx 019B 8B C1 mov ax,cx 019D B1 07 mov cl,7 019F D3 E0 shl ax,cl ; convert sector count to byte count 01A1 8B C8 mov cx,ax 01A3 73 08 jnc not64k 01A5 2B CE sub cx,si ; ignore wraparound bytes on 64k transfer 01A7 B9 8000 mov cx,8000h ; 32k words to move 01AA EB 03 90 jmp movem 01AD not64k: 01AD D1 E9 shr cx,1 ; divide by two to make it word count 01AF movem: 01AF F3/ A5 rep movsw 01B1 73 01 jnc notodd 01B3 A4 movsb ; mov posible maverik byte 01B4 notodd: 01B4 C3 ret 01B5 0100 [ localstk dw 100h dup (0) 0000 ]  The Microsoft MACRO Assembler , Version 1.25 Page 1-10 RAMDISK 01-28-84 03B5 stackbase: ; ; init ; ; initialize ram disk device ; 03B5 init: 03B5 06 push es 03B6 B8 0040 mov ax,40h 03B9 8E C0 mov es,ax 03BB BB 0003 mov bx,3 03BE 26: 8B 1F mov bx,es:[bx] 03C1 83 C3 30 add bx,4*ramdiskenable_cnfg ; index into config table 03C4 26: 8B 3F mov di,es:[bx] ; get offset 03C7 26: 8E 47 02 mov es,es:2[bx] ; get segment 03CB 26: F6 05 FF test byte ptr es:[di],0ffh ; enabled? 03CF 07 pop es 03D0 75 05 jnz enabled_ok 03D2 B1 00 mov cl,0 ; no units if ramdisk disabled 03D4 EB 0B 90 jmp setunits 03D7 enabled_ok: 03D7 E8 0443 R call init_check ; check for ram disk presently there 03DA 74 03 jz already_there ; skip "formatting" if disk there 03DC E8 0457 R call format ; else format it 03DF already_there: 03DF B1 01 mov cl,nunits ; no units to reserve this dev 03E1 setunits: 03E1 2E: C5 1E 0048 R lds bx,cs:[ptrsav] 03E6 88 4F 0D mov [bx.nounits],cl 03E9 C7 47 12 0046 R mov [bx.bpbadr],offset ramdsk_ptr 03EE C7 47 0E 03B5 R mov word ptr [bx].trans, offset init 03F3 8C 4F 10 mov word ptr [bx].trans+2,cs 03F6 8C 4F 14 mov [bx.bpbseg],cs 03F9 32 C0 xor al,al 03FB E9 00B1 R jmp exit  ; ; the following string present in the first logical sector of the RAM disk ; indicates that the disk is probably already formatted. ; 03FE 46 6F 72 6D 61 74 init_str db 'Formatted RAM Disk (probably) present' 74 65 64 20 52 41 4D 20 44 69 73 6B 20 28 70 72 6F 62 61 62 6C 79 29 20 70 72 65 73 65 6E 74 = 0025 check_len equ 37 ;  The Microsoft MACRO Assembler , Version 1.25 Page 1-11 RAMDISK 01-28-84 ; volume name directory entry ; ; time and date of creation are presently hand coded and indicate the date ; of creation of the last revision. In a future version this could be auto- ; mated, or it could be changed to be the time and date of formatting. ; 0423 52 41 4D 44 49 53 ramvol db 'RAMDISK ' 4B 20 20 20 20 042E 08 0A [ db 08h, 10 dup (0), 0c0h, 64h, 3Ch, 08h, 6 dup (0) 00 ] C0 64 3C 06 [ 00 ] ; 1-28-84 12:38pm ; ; determine whether valid RAM disk already in place ; ; return with zero flag set if so ; 0443 init_check: 0443 0E push cs 0444 1F pop ds 0445 BE 03FE R mov si,offset init_str 0448 B9 4000 mov cx,ramdisk_base 044B 8E C1 mov es,cx 044D BF 0000 mov di,0 0450 B9 0025 mov cx,check_len 0453 FC cld 0454 F3/ A6 repz cmpsb 0456 C3 ret ; ; format the ram disk ; 0457 format: ; ; first put e5s everywhere ; 0457 FC cld 0458 BF 0000 mov di,0 045B B0 E5 mov al,0e5h 045D B9 0004 mov cx,4 0460 init64k: 0460 51 push cx 0461 B9 0000 mov cx,0( 0464 initbyte: 0464 AA stosb 0465 E2 FD loop initbyte 0467 8C C1 mov cx,es 0469 81 C1 1000 add cx,1000h  The Microsoft MACRO Assembler , Version 1.25 Page 1-12 RAMDISK 01-28-84 046D 8E C1 mov es,cx 046F 59 pop cx 0470 E2 EE loop init64k ; ; init formatted disk id message in reserved sector ; 0472 B9 4000 mov cx,ramdisk_base 0475 8E C1 mov es,cx 0477 BE 03FE R mov si,offset init_str 047A BF 0000 mov di,0 047D B9 0025 mov cx,check_len 0480 movchar: 0480 A4 movsb 0481 E2 FD loop movchar ; ; now do fats ; 0483 06 push es 0484 1F pop ds 0485 B0 FF mov al,0ffh 0487 BB 0080 mov bx,0080h 048A 88 07 mov [bx],al 048C FE 0F dec byte ptr [bx] 048E 43 inc bx 048F 88 07 mov [bx],al 0491 43 inc bx 0492 88 07  mov [bx],al 0494 B9 02FD mov cx,765 ; number remaining FAT bytes 0497 BF 0083 mov di,0083h 049A B0 00 mov al,0 049C F3/ AA rep stosb ; ; FAT #2 ; 049E BE 0080 mov si,0080h 04A1 BF 0380 mov di,0380h 04A4 B9 0300 mov cx,768 04A7 F3/ A4 rep movsb ; ; now do directory ; 04A9 BF 0680 mov di,0680h ; start of directory 04AC B9 0044 mov cx,68 04AF B0 00 mov al,00h 04B1 one_entry: 04B1 88 05 mov [di],al 04B3 83 C7 20 add di,20h 04B6 E2 F9 loop one_entry ; ; do volumne name ; 04B8 BF 0680 mov di,0680h 04BB B9 0020 mov cx,20h ; length of dir entry  The Microsoft MACRO Assembler , Version 1.25 Page 1-13 RAMDISK 01-28-84 04BE BE 0423 R mov si,offset ramvol 04C1 0E push cs 04C2 1F pop ds 04C3 F3/ A4 rep movsb 04C5 C3 ret 04C6 code ends end  The Microsoft MACRO Assembler , Version 1.25 Page Symbols-1 RAMDISK 01-28-84 Structures and records: N a m e Width # fields Shift Width Mask Initial BPBB . . . . . . . . . . . . . . 0016 0006 BPB_MED. . . . . . . . . . . . . 000D SCRT . . . . . . . . . . . . . . 000E BPB_ADR. . . . . . . . . . . . . 0012 BPB_SEG. . . . . . . . . . . . . 0014 DPB. . . . . . . . . . . . . . . 001A 000B BJMP . . . . . . . . . . . . . . 0000 SYSID. . . . . . . . . . . . . . 0003 SECSIZ . . . . . . . . . . . . . 000B ALLOC. . . . . . . . . . . . . . 000D RESSEC . . . . . . . . . . . . . 000E FATS . . . . . . . . . . . . . . 0010 MAXDIR . . . . . . . . . . . . . 0011 SECTORS. . . . . . . . . . . . . 0013 MEDIAID. . . . . . . . . . . . . 0015 FATSEC . . . . . . . . . . . . . 0016 SECPER . . . . . . . . . . . . . 0018 INITS. . . . . . . . . . . . . . 0016 0006 NOUNITS. . . . . . . . . . . . . 000D BPBADR . . . . . . . . . . . . . 0012 BPBSEG . . . . . . . . . . . . . 0014 IODAT. . . . . . . . . . . . . . 0016 0009 CMDLN. . . . . . . . . . . . . . 0000 UNIT . . . . . . . . . . . . . . 0001 CMD. . . . . . . . . . . . . . . 0002 STATUS . . . . . . . . . . . . . 0003 MEDIA. . . . . . . . . . . . . . 000D TRANS. . . . . . . . . . . . . . 000E COUNT. . . . . . . . . . . . . . 0012 START. . . . . . . . . . . . . . 0014 MEDIAS . . . . . . . . . . . . . 000F 0003 MED_DES. . . . . . . . . . . . . 000D MED_STS. . . . . . . . . . . . . 000E Segments and groups: N a m e Size align combine class CODE . . . . . . . . . . . . . . 04C6 PARA NONE Symbols: N a m e Type Value Attr ALREADY_THERE. . . . . . . . . . L NEAR 03DF CODE BP_RDY . . . . . . . . . . . . . L NEAR 00E8 CODE BUSY_EXIT. . . . . . . . . . . . L NEAR 00A4 CODE CHECK_LEN. . . . . . . . . . . . Number 0025 CMDERR . . . . . . . . . . . . . L NEAR 00AA CODE  The Microsoft MACRO Assembler , Version 1.25 Page Symbols-2 RAMDISK 01-28-84 DEVSTART . . . . . . . . . . . . L WORD 0000 CODE DOS_SP_SAV . . . . . . . . . . . L WORD 004E CODE DOS_SS_SAV . . . . . . . . . . . L WORD 004C CODE ENABLED_OK . . . . . . . . . . . L NEAR 03D7 CODE ERR_EXIT . . . . . . . . . . . . L NEAR 00AC CODE EXIT . . . . . . . . . . . . . . L NEAR 00B1 CODE EXIT1. . . . . . . . . . . . . . L NEAR 00B4 CODE EXITP. . . . . . . . . . . . . . F PROC 00B1 CODE Length =0024 FORMAT . . . . . . . . . . . . . L NEAR 0457 CODE GET_BPB. . . . . . . . . . . . . L NEAR 00E8 CODE INIT . . . . . . . . . . . . . . L NEAR 03B5 CODE INIT64K. . . . . . . . . . . . . L NEAR 0460 CODE INITBYTE . . . . . . . . . . . . L NEAR 0464 CODE INIT_CHECK . . . . . . . . . . . L NEAR 0443 CODE INIT_STR . . . . . . . . . . . . L BYTE 03FE CODE LOCALSTK . . . . . . . . . . . . L WORD 01B5 CODE Length =0100 MEDIAC . . . . . . . . . . . . . L NEAR 00D5 CODE MOVCHAR. . . . . . . . . . . . . L NEAR 0480 CODE MOVEM. . . . . . . . . . . . . . L NEAR 01AF CODE NOT64K . . . . . . . . . . . . . L NEAR 01AD CODE NOTODD . . . . . . . . . . . . . L NEAR 01B4 CODE NUNITS . . . . . . . . . . . . . Number 0001 ONE_ENTRY. . . . . . . . . . . . L NEAR 04B1 CODE PTRSAV . . . . . . . . . . . . . L DWORD 0048 CODE RAMDISKDEV . . . . . . . . . . . L NEAR 0000 CODE RAMDISKENABLE_CNFG . . . . . . . Number 000C RAMDISKTABLE . . . . . . . . . . L NEAR 0012 CODE RAMDISK_BASE . . . . . . . . . . Number 4000 RAMDISK_INT. . . . . . . . . . . L NEAR 005B CODE RAMDPB . . . . . . . . . . . . . L 001A 002C CODE RAMDSK_PTR . . . . . . . . . . . L WORD 0046 CODE RAMVOL . . . . . . . . . . . . . L BYTE 0423 CODE READ . . . . . . . . . . . . . . L NEAR 00FF CODE RED_NOXFER . . . . . . . . . . . L NEAR 0127 CODE SETUNITS . . . . . . . . . . . . L NEAR 03E1 CODE STACKBASE. . . . . . . . . . . . L NEAR 03B5 CODE STRATEGY . . . . . . . . . . . . L NEAR 0050 CODE STRATP . . . . . . . . . . . . . F PROC 0050 CODE Length =000B TRANSFER . . . . . . . . . . . . L NEAR 0171 CODE WRITE. . . . . . . . . . . . . . L NEAR 0135 CODE WRITE_VER. . . . . . . . . . . . L NEAR 0135 CODE WRT_NOXFER . . . . . . . . . . . L NEAR 0163 CODE Warning Severe Errors Errors 0 0 ^<,TIMERON COM mr<TIMEROFFCOM vr<FORMAT COM w<_>AUXCG CHR   Configuration files in MSDOS 2.0 In many cases, there are installation-specific configurations of the DOS that need to be set up at boot time. The configuration file is simply an ASCII file that has certain commands for the boot task. The system will search for a file named CONFIG.SYS at boot time. If it exists, the system will read it and execute the commands it contains. If not, all system parameters will take on the default values. BUFFERS = This is the number of additional sector buffers to use in the system list. The default of 2 buffers is used if no BUFFERS= command is given. FILES = This is the number of open files that the XENIX system calls can access. The default of 8 files is used if the FILES= command is not used. DEVICE = This installs the device driver in into the system list. BREAK = If ON is specified( (the default is OFF), a check for ^C at the console input will be made every time the system is called. ON improves the ability to abort programs over previous versions of the DOS. AVAILDEV = The default is TRUE which means both /dev/ and will reference the device . If FALSE is selected, only /dev/ refers to device , by itself means a file in the current directory with the same name as one of the devices. SHELL = This begins execution of the shell (top-level command processor) from . A typical configuration file might look like this: BUFFERS = 10 FILES = 10 DEVICE = /bin/network.sys BREAK = ON SHELL = a:/bin/command.com a:/bin -p PROGRAM DRAW_CIRCLE(INPUT,OUTPUT); {************************************************} {* G S X - 8 6 DEMONSTRATION PROGRAM *} {* *} {* This program draws a circle on the screen. *} {* It has been provided to show one method of *} {* interfacing GSX-86 with a high level *} {* language; in this case, MS-PASCAL. *} {* *} {* TI / NECIS 1/30/84 *} {************************************************} TYPE PTRTYPE = ADS OF INTEGER; PBARRAY = ARRAY[1..5] OF PTRTYPE; { The array names used correspond to those } { used in the GSX-86 Programmer's Guide, } { Section 3, "GDOS". } VAR PBLOCK : PBARRAY; CONTRL : ARRAY[1..10] OF INTEGER; INTIN : ARRAY[1..10] OF INTEGER; PTSIN : ARRAY[1..50] OF INTEGER; INTOUT : ARRAY[1..50] OF INTEGER; PTSOUT : ARRAY[1..12] OF INTEGER; PROCEDURE INTFACE (VAR PB:PBARRAY); EXTERN; { This Assembly Language Interface, listed } { elsewhere, loads DS:DX with the pointer to } { PBLOCK, as described in the text. } BEGIN {** MAIN PROGRAM **} { The five elements of array PBLOCK are set } { as pointers to the five data carrying arrays } { required by GSX-86: } PBPTR := ADS(PBLOCK); PBLOCK[1] := ADS(CONTRL); PBLOCK[2] := ADS(INTIN); PBLOCK[3] := ADS(PTSIN); PBLOCK[4] := ADS(INTOUT); PBLOCK[5] := ADS(PTSOUT); { The Open Workstation Command: } { This section opens the APC as a graphic } { terminal. Refer to the GSX-86 Programmer's } { Guide for a full description of this call. } CONTRL[1] := 1; { OPEN WORKSTATION } CONTRL[2] := 0; CONTRL[4] := 10; { LENGTH OF INTIN = 10 } INTIN[1] := 1; { WORKSTATION #1 } INTIN[2] := 1; { LINETYPE = 1 } INTIN[3] := 2; { POLYLINE COLOR INDEX = 2 } INTIN[4] := 1; { MARKER TYPE = 1 } INTIN[5] := 2; { POLYMARKER COLOR INDEX = 2 } INTIN[6] := 1; { TEXT FONT = 1 } INTIN[7] := 2; { TEXT COLOR INDEX = 2 } INTIN[8] := 0; { FILL INTERIOR STYLE = 0 } INTIN[9] := 1; { FILL STYLE INDEX = 1 } INTIN[10] := 2; { FILL COLOR INDEX = 2 } { Once the parameters have been set, GDOS is } { called: } INTFACE (PBLOCK); { The Generalized Drawing Primitive Command: } { This is where the circle is drawn. For a full } { explanation of the parameters passed, refer } { to the text. } CONTRL[1] := 11; { GENERALIZED DRAWING PRIMITIVE } CONTRL[2] := 3; { NUMBER OF POINTS = 3 } CONTRL[6] := 4; { PRIMITIVE ID = 4: CIRCLE } PTSIN[1] := 16383; { X COORDINATE, CENTER } PTSIN[2] := 16383; { Y COORDINATE, CENTER } PTSIN[3] := 6383; { X COORDINATE, POINT ON EDGE } PTSIN[4] := 16383; { Y COORDINATE, POINT ON EDGE } PTSIN[5] := 10000; { RADIUS = 10000 } PTSIN[6] := 0; { Once again, GDOS is called: } INTFACE (PBLOCK); { The Close Workstation Command: } { Once done with the circle, prevent any more } { output to the device (APC screen). } CONTRL[1] := 2; { CLOSE WORKSTATION } CONTRL[2] := 0; INTFACE (PBLOCK); END. {** MAIN PROGRAM **} ;************************************************ ;* G S X - 8 6 INTERFACE PROGRAM * ;* This Assembler Routine shows one method of * ;* interfacing the above MS-PASCAL program * ;* with the GSX-86 Graphics Extension. This * ;* example was written for the MASM-86 Macro- * ;* Assembler. * ;* TI / NECIS 1/30/84 * ;************************************************ NAME INTERFCE DATA SEGMENT PUBLIC 'DATA' DATA ENDS DGROUP GROUP DATA ASSUME CS:CODE, DS:DGROUP, SS:DGROUP CGROUP GROUP CODE CODE SEGMENT 'CODE' PUBLIC INTFACE INTFACE PROC FAR ; ; SAVE BP, MOVE SP INTO BP; SP+6 POINTS TO INPUT PARAMETER ; PUSH BP MOV BP,SP ADD BP,6 ; ; LOAD DX WITH A INPUT PARAMETER; DS:DX IS POINTER TO PBLOCK ; MOV DX,[BP] ; ; LOAD CX WITH 0473H ; MOV CX,0473H ; ; CALL GDOS ; INT 224 ; ; RESTORE BP TO ORIGINAL VALUE ; POP BP ; ; EXIT BACK TO CALLING PROGRAM ; RET 2 INTFACE ENDP CODE ENDS END ))**++,,--..//00112233445566778899::;;<<==>>??@@AABBCCDDEEFFGGHHIIJJKKLL