;**************************************************************************** ;** BIOS.ASM ** ;** -------- ** ;** ** ;** (C) 1987, 1988 P.D. Smart ** ;** ** ;** This file is part of the TURBOROM.ASM source code. It contains code ** ;** to perform:- ** ;** ** ;** All PC compatible ROM bios functions, making the 286 + 1Mbyte RAM ** ;** appear as a fast PC compatible. ** ;** Reset boot jump. ** ;** ** ;** These routines reside at ROM location FC00:2000 - FC00:3FFF ** ;** ** ;**************************************************************************** ORG 02000H ;Beginning of BIOS code. ;*************************************** ; NMI interrupt. * ; * ; FUNCTION: NMI service routine to * ; process requests from the * ; PC. * ; TYPE: 286 service required. * ;*************************************** NMI: PUSH AX ;Save used registers. PUSH DX STI ;Interrupts back on. MOV DX,0C02H NMI1: IN AL,DX ;Wait for descriptor byte. TEST AL,8 JNZ NMI1 DEC DX DEC DX ;Get descriptor byte. IN AL,DX ;What action does the PC request? CMP AL,09H ;Keyboard? JNZ NMI2 INC DX INC DX NMIK: IN AL,DX ;If keyboard, get scan code from PC. TEST AL,8 JNZ NMIK DEC DX DEC DX IN AL,DX INT 09H ;And perform a keyboard interrupt. JMP NMIEXIT NMI2: CMP AL,01CH ;Timer tick? JNZ NMI3 INT 01CH ;If timer tick, perform a timer JMP NMIEXIT ;tick interrupt. NMI3: NMIEXIT:POP DX ;Restore used registers. POP AX STI IRET ;******************************* ; End of NMI servicing. * ;******************************* ;*************************************** ; Interrupt number 5. PRINT_SCREEN. * ; * ; FUNCTION: Initiates a dump of the * ; screen to printer. * ; TYPE: PC service required. * ;*************************************** INTR5: CLI ;Disable further interrupts. PUSH AX PUSH BX PUSH DX PUSH DS MOV AL,05H CALL TXCOM ;Send command. CALL RXBYTE SUB BX,BX MOV DS,BX MOV BX,500 ;Address of Print screen variable. MOV [BX],AL ;Store. POP DS POP DX POP BX POP AX STI ;Re-enable interrupts. IRET ;******************************* ; End of Interrupt 5. * ;******************************* ;*************************************** ; Interrupt number 10H. VIDEO_IO * ; * ; FUNCTION: Processes video input & * ; output. * ; TYPE: PC service required. * ;*************************************** INTR10: CLI ;Disable further interrupts. PUSH AX PUSH AX MOV AL,10H CALL TXCOM POP AX CALL TXWORD ;Send AX. MOV AX,BX CALL TXWORD ;Send BX. MOV AX,CX CALL TXWORD ;Send CX. MOV AX,DX CALL TXWORD ;Send DX. POP AX CMP AH,13H ;Write string?. JNE I10_2 ;No, go on. PUSH BP ;If write string, transfer all I10_1: MOV AL,ES:[BP] ;bytes found at ES:BP. INC BP CALL TXBYTE ;Send byte. LOOP I10_1 POP BP I10_2: CALL RXWORD ;Receive AX. PUSH AX CALL RXWORD MOV BX,AX ;Receive BX. CALL RXWORD MOV CX,AX ;Receive CX. CALL RXWORD MOV DX,AX ;Receive DX. POP AX STI ;Re-enable interrupts. IRET ;******************************* ; End of VIDEO I/O. * ;******************************* ;*************************************** ; Interrupt number 11. EQUIPMENT CHECK * ; * ; FUNCTION: Checks to see what equip- * ; ment is present. * ; TYPE: PC service required. * ;*************************************** INTR11: CLI ;Disable further interrupts. MOV AL,11H CALL TXCOM CALL RXWORD ;Receive AX. STI ;Re-enable interrupts. IRET ;******************************* ; End of Equipment check. * ;******************************* ;*************************************** ; Interrupt number 12H.MEMORY CHECK * ; * ; FUNCTION: Indicates how much memory * ; is present. * ; TYPE: Fixed value returned. * ;*************************************** INTR12: CLI ;Disable further interrupts. MOV AX,0280H ;Full complement of memory. STI ;Re-enable interrupts. IRET ;******************************* ; End of Memory check. * ;******************************* ;*************************************** ; Interrupt number 13.DISK DRIVE I/O. * ; * ; FUNCTION: Disk drive input & output * ; processing. * ; TYPE: PC service required. * ;*************************************** INTR13: STI ;Enable interrupts. PUSH BP PUSH AX PUSH BX PUSH CX PUSH DX PUSH DS MOV BP,SP ;BP to point to parameter base. ; CMP AH,31 JB I131 ;> Max parameter, point to bad. MOV AH,14H I131: MOV CL,AH XOR CH,CH ;Index into function table for SHL CX,1 ;subroutine address. MOV BX,OFFSET DSK_TAB ADD BX,CX CALL CS:[BX] ;Call subroutine. POP DS POP DX POP CX POP BX POP AX POP BP STI ;Re-enable interrupts. RETF 0002H ;Throw old flags away. ;*************************************** ; Table of subroutine addresses. * ;*************************************** DSK_TAB:DW D_RESET DW D_STATUS DW D_READ DW D_WRITE DW D_VERF DW D_ERR ;Any format operation is error. DW D_ERR DW D_ERR DW D_PARMS DW D_ERR DW D_ERR DW D_ERR DW D_ERR DW D_ERR DW D_ERR DW D_ERR DW D_ERR DW D_ERR DW D_ERR DW D_ERR DW D_ERR DW D_TYPE DW D_CHANGE DW D_ERR ;Any format operation is error. DW D_ERR DW D_ERR DW D_ERR DW D_ERR DW D_ERR DW D_ERR DW D_ERR DW D_ERR DSK_TAE: ;*************************************** ; Disk reset. * ;*************************************** D_RESET:MOV AL,30H CALL TXCOM ;Pass command to PC server. MOV AX,0000H ;Send across table. MOV DS,AX MOV BX,DS:[0078H] MOV AX,DS:[007AH] MOV DS,AX ;DS:BX point to disk table. MOV CX,0BH ;Eleven bytes to transfer. D_RES1: MOV AL,DS:[BX] CALL TXBYTE INC BX LOOP D_RES1 ;Transer table. JMP D_V1 ;*************************************** ; Disk status. * ;*************************************** D_STATUS: MOV AL,31H ;Pass command to PC server. CALL TXCOM JMP D_V1 ;Use dupilicate code. ;*************************************** ; Disk read. * ;*************************************** D_READ: MOV AL,32H ;Pass command to PC server. CALL TXCOM MOV AX,[BP+8] CALL TXBYTE ;Transmit AL. MOV AX,[BP+4] CALL TXWORD ;Transmit CX. MOV AX,[BP+2] CALL TXWORD ;Transmit DX. MOV AX,[BP+8] MOV CX,0200H ;Calculate transfer size. XOR AH,AH MUL CX MOV CX,AX MOV BX,[BP+6] ;Address for load. D_READ1:CALL RXBYTE ;Read in bytes, into memory. MOV ES:[BX],AL INC BX LOOP D_READ1 JMP D_V1 ;*************************************** ; Disk write. * ;*************************************** D_WRITE:MOV AL,33H ;Pass command to PC server. CALL TXCOM MOV AX,[BP+8] CALL TXBYTE ;Transmit AL. MOV AX,[BP+4] CALL TXWORD ;Transmit CX. MOV AX,[BP+2] CALL TXWORD ;Transmit DX. MOV AX,[BP+8] MOV CX,0200H ;Calculate transfer size. XOR AH,AH MUL CX MOV CX,AX ;Number of bytes to transfer. MOV BX,[BP+6] ;Address for write. D_WRIT1:MOV AL,ES:[BX] ;Get byte. CALL TXBYTE INC BX LOOP D_WRIT1 ;Loop until all transfered. JMP D_V1 ;*************************************** ; Disk verify. * ;*************************************** D_VERF: MOV AL,34H ;Pass command to PC server. CALL TXCOM MOV AX,[BP+8] CALL TXWORD ;Transmit AX. MOV AX,[BP+4] CALL TXWORD ;Transmit CX. MOV AX,[BP+2] CALL TXWORD ;Transmit DX. D_V1: CALL RXWORD ;Get AX. MOV [BP+8],AX D_V2: CALL RXBYTE ;Get flags. MOV AH,AL SAHF ;Store flags. RET ;*************************************** ; Disk parameters read. * ;*************************************** D_PARMS:MOV AL,35H ;Pass command to PC server. CALL TXCOM MOV AX,[BP+8] ;Transmit AX. CALL TXWORD MOV AX,[BP+2] CALL TXWORD ;Transmit DX. CALL RXWORD MOV [BP+8],AX ;Read in AX. CALL RXWORD MOV [BP+4],AX ;Read in CX. CALL RXWORD MOV [BP+2],AX ;Read in DX. JMP D_V2 ;*************************************** ; Disk type read. * ;*************************************** D_TYPE: MOV AL,36H ;Pass command to PC server. D_T1: CALL TXCOM MOV AX,[BP+8] CALL TXWORD ;Transmit AX. CALL RXWORD MOV [BP+8],AX ;New AX. CALL RXWORD MOV [BP+2],AX ;New DX. JMP D_V2 ;*************************************** ; Disk change. * ;*************************************** D_CHANGE: ;Pass command to PC server. MOV AL,37H JMP D_T1 ;*************************************** ; Error due to bad parameters. * ;*************************************** D_ERR: MOV AX,[BP+8] ;Return error code in AH & CARRY. MOV AH,1 MOV [BP+8],AX STC RET ;******************************* ; End of DISK I/O. * ;******************************* ;*************************************** ; Interrupt number 14H.RS232 I/O. * ; * ; FUNCTION: RS-232 input & output * ; processing. * ; TYPE: PC service required. * ;*************************************** INTR14: CLI ;Disable further interrupts. PUSH AX MOV AL,14H ;Pass command to PC server. CALL TXCOM POP AX CALL TXWORD ;Transmit AX. MOV AX,DX CALL TXWORD ;Transmit DX. CALL RXWORD ;Receive AX. STI ;Re-enable interrupts. IRET ;******************************* ; End of RS-232 I/O. * ;******************************* ;*************************************** ; Interrupt number 15H.CASSETTE I/O. * ; * ; FUNCTION: Cassette input & output * ; processing. * ; TYPE: Unimplemented. * ;*************************************** INTR15: STI ;Re-enable interrupts. IRET ;******************************* ; End of CASSETTE I/O. * ;******************************* ;*************************************** ; Interrupt number 16H.KEYBOARD I/O. * ; * ; NB. The following code is a diss- * ; assembly of a standard keyboard * ; handler present under DOS. It has * ; been suitably modified to work on the* ; accelerator board. * ; * ; FUNCTION: Keyboard input & output * ; processing. * ; TYPE: Internal servicing. * ;*************************************** INTR16: STI PUSH DS ;Save registers. PUSH BX PUSH AX MOV AX,0040H ;Test for accelerator termination MOV DS,AX ;code. POP AX CMP WORD PTR RESET_FLAG,1234H JNE INT16_1 MOV AL,03FH ;Terminate accelerator. CALL TXCOM INT16_1:OR AH,AH JZ K1 ;Read next character? DEC AH JZ K2 ;Status? DEC AH JZ K3 ;Shift status? INTEND: POP BX POP DS IRET K1: MOV BX,WORD PTR BUFFER_HEAD CMP BX,WORD PTR BUFFER_TAIL JZ K1 MOV AX,[BX] CALL K4 MOV WORD PTR BUFFER_HEAD,BX JMP SHORT INTEND K2: CLI MOV BX,WORD PTR BUFFER_HEAD CMP BX,WORD PTR BUFFER_TAIL MOV AX,[BX] STI POP BX POP DS RETF 0002H K3: MOV AL,BYTE PTR KB_FLAG JMP SHORT INTEND K4: INC BX INC BX CMP BX,WORD PTR BUFFER_END JNE K5 MOV BX,WORD PTR BUFFER_START K5: RET ; K6: DB INS_KEY DB CAPS_KEY,NUM_KEY,SCROLL_KEY,ALT_KEY,CTL_KEY DB LEFT_KEY,RIGHT_KEY K6B: K6L EQU K6B-K6 ; K7: DB INS_SHIFT DB CAPS_SHIFT,NUM_SHIFT,SCROLL_SHIFT,ALT_SHIFT,CTL_SHIFT DB LEFT_SHIFT,RIGHT_SHIFT ; K8: DB 27,-1,0,-1,-1,-1,30,-1 DB -1,-1,-1,31,-1,127,-1,17 DB 23,5,18,20,25,21,9,15 DB 16,27,29,10,-1,1,19 DB 4,6,7,8,10,11,12,-1,-1 DB -1,-1,28,26,24,3,22,2 DB 14,13,-1,-1,-1,-1,-1,-1 DB ' ',-1 K9: DB 94,95,96,97,98,99,100,101 DB 102,103,-1,-1,119,-1,132,-1 DB 115,-1,116,-1,117,-1,118,-1 DB -1 K10: DB 01BH,'1234567890-=',08H,09H DB 'qwertyuiop[]',0DH,-1,'asdfghjkl;',027H DB '#',-1,5CH,'zxcvbnm,./',-1,'*',-1,' ' DB -1 K11: DB 27,'!"œ$',37,05EH,'&*()_+',08H,0 DB 'QWERTYUIOP{}',0DH,-1,'ASDFGHJKL:@' DB 07EH,-1,'|ZXCVBNM<>?',-1,0,-1,' ',-1 K12: DB 84,85,86,87,88,89,90 DB 91,92,93 K13: DB 104,105,106,107,108 DB 109,110,111,112,113 K14: DB '789-456+1230.' K15: DB 71,72,73,-1,75,-1,77 DB -1,79,80,81,82,83 ; KB_INT: STI PUSH AX PUSH BX PUSH CX PUSH DX PUSH SI PUSH DI PUSH DS PUSH ES CLD PUSH AX MOV AX,0040H MOV DS,AX POP AX MOV AH,AL CMP AL,0FFH JNZ K16 JMP K62 K16: AND AL,07FH PUSH CS POP ES MOV DI,OFFSET K6 MOV CX,K6L REPNE SCASB MOV AL,AH JE K17 JMP K25 K17: SUB DI,OFFSET K6+1 MOV AH,CS:K7[DI] TEST AL,80H JNZ K23 CMP AH,SCROLL_SHIFT JAE K18 OR BYTE PTR KB_FLAG,AH JMP K26 K18: TEST BYTE PTR KB_FLAG,CTL_SHIFT JNZ K25 CMP AL,INS_KEY JNZ K22 TEST BYTE PTR KB_FLAG,ALT_SHIFT JNZ K25 K19: TEST BYTE PTR KB_FLAG,NUM_STATE JNZ K21 TEST BYTE PTR KB_FLAG,LEFT_SHIFT+RIGHT_SHIFT JZ K22 K20: MOV AX,5230H JMP K57 K21: TEST BYTE PTR KB_FLAG,LEFT_SHIFT+RIGHT_SHIFT JZ K20 K22: TEST AH,BYTE PTR KB_FLAG_1 JNZ K26 OR BYTE PTR KB_FLAG_1,AH XOR BYTE PTR KB_FLAG,AH CMP AL,INS_KEY JNE K26 MOV AX,INS_KEY*256 JMP K57 K23: CMP AH,SCROLL_SHIFT JAE K24 NOT AH AND BYTE PTR KB_FLAG,AH CMP AL,ALT_KEY+80H JNE K26 MOV AL,BYTE PTR ALT_INPUT MOV AH,0 MOV BYTE PTR ALT_INPUT,AH CMP AL,0 JE K26 JMP K58 K24: NOT AH AND BYTE PTR KB_FLAG_1,AH JMP SHORT K26 K25: CMP AL,80H JAE K26 TEST BYTE PTR KB_FLAG_1,HOLD_STATE JZ K28 CMP AL,NUM_KEY JE K26 AND BYTE PTR KB_FLAG_1,NOT HOLD_STATE K26: CLI K27: POP ES POP DS POP DI POP SI POP DX POP CX POP BX POP AX IRET K28: TEST BYTE PTR KB_FLAG,ALT_SHIFT JNZ K29 JMP K38 K29: TEST BYTE PTR KB_FLAG,CTL_SHIFT JZ K31 CMP AL,DEL_KEY JNE K31 MOV WORD PTR RESET_FLAG,1234H JMP K26 K30: DB 82,79,80,81,75,76,77 DB 71,72,73 DB 16,17,18,19,20,21,22,23 DB 24,25,30,31,32,33,34,35 DB 36,37,38,44,45,46,47,48 DB 49,50 K31: CMP AL,57 JNE K32 MOV AL,' ' JMP K57 K32: MOV DI,OFFSET K30 MOV CX,10 REPNE SCASB JNE K33 SUB DI,OFFSET K30+1 MOV AL,BYTE PTR ALT_INPUT MOV AH,10 MUL AH ADD AX,DI MOV BYTE PTR ALT_INPUT,AL JMP K26 K33: MOV BYTE PTR ALT_INPUT,0 MOV CX,26 REPNE SCASB JNE K34 MOV AL,0 JMP K57 K34: CMP AL,2 JB K35 CMP AL,14 JAE K35 ADD AH,118 MOV AL,0 JMP K57 K35: CMP AL,59 JAE K37 K36: JMP K26 K37: CMP AL,71 JAE K36 MOV BX,OFFSET K13 JMP K63 K38: TEST BYTE PTR KB_FLAG,CTL_SHIFT JZ K44 CMP AL,SCROLL_KEY JNE K39 MOV BX,WORD PTR BUFFER_START MOV WORD PTR BUFFER_HEAD,BX MOV WORD PTR BUFFER_TAIL,BX MOV BYTE PTR BIOS_BREAK,80H INT 1BH SUB AX,AX JMP K57 K39: CMP AL,NUM_KEY JNE K41 OR BYTE PTR KB_FLAG_1,HOLD_STATE K40: TEST BYTE PTR KB_FLAG_1,HOLD_STATE JNZ K40 JMP K27 K41: CMP AL,55 JNE K42 MOV AX,114*256 JMP K57 K42: MOV BX,OFFSET K8 CMP AL,59 JB K56 K43: MOV BX,OFFSET K9 JMP K63 K44: CMP AL,71 JAE K48 TEST BYTE PTR KB_FLAG,LEFT_SHIFT+RIGHT_SHIFT JZ K54 CMP AL,15 JNE K45 MOV AX,15*256 JMP SHORT K57 K45: CMP AL,55 JNE K46 INT 05H JMP K27 K46: CMP AL,59 JB K47 MOV BX,OFFSET K12 JMP K63 K47: MOV BX,OFFSET K11 JMP SHORT K56 K48: TEST BYTE PTR KB_FLAG,NUM_STATE JNZ K52 TEST BYTE PTR KB_FLAG,LEFT_SHIFT+RIGHT_SHIFT JNZ K53 K49: CMP AL,74 JE K50 CMP AL,78 JE K51 SUB AL,71 MOV BX,OFFSET K15 JMP SHORT K64 K50: MOV AX,74*256+'-' JMP SHORT K57 K51: MOV AX,78*256+'+' JMP SHORT K57 K52: TEST BYTE PTR KB_FLAG,LEFT_SHIFT+RIGHT_SHIFT JNZ K49 K53: SUB AL,70 MOV BX,OFFSET K14 JMP SHORT K56 K54: CMP AL,59 JB K55 MOV AL,0 JMP SHORT K57 K55: MOV BX,OFFSET K10 K56: DEC AL XLAT CS:K11 K57: CMP AL,-1 JE K59 CMP AH,-1 JE K59 K58: TEST BYTE PTR KB_FLAG,CAPS_STATE JZ K61 TEST BYTE PTR KB_FLAG,LEFT_SHIFT+RIGHT_SHIFT JZ K60 CMP AL,'A' JB K61 CMP AL,'Z' JA K61 ADD AL,'a'-'A' JMP SHORT K61 K59: JMP K26 K60: CMP AL,'a' JB K61 CMP AL,'z' JA K61 ADD AL,'a'-'A' K61: MOV BX,WORD PTR BUFFER_TAIL MOV SI,BX CALL K4 CMP BX,WORD PTR BUFFER_HEAD JE K62 MOV [SI],AX MOV WORD PTR BUFFER_TAIL,BX JMP K26 K63: SUB AL,59 K64: XLAT CS:K9 MOV AH,AL MOV AL,0 JMP K57 K62: JMP K27 ;Bell sounded here. ;******************************* ; End of KEYBOARD I/O. * ;******************************* ;*************************************** ; Interrupt number 17.PRINTER I/O. * ; * ; FUNCTION: Printer input & output * ; processing. * ; TYPE: PC service required. * ;*************************************** INTR17: CLI ;Disable further interrupts. PUSH AX MOV AL,17H CALL TXCOM POP AX CALL TXWORD ;Transmit AX. MOV AX,DX CALL TXWORD ;Transmit DX. CALL RXWORD ;Receive AX. STI ;Re-enable interrupts. IRET ;******************************* ; End of PRINTER I/O. * ;******************************* ;*************************************** ; Interrupt number 1AH.CLOCK I/O. * ; * ; FUNCTION: Clock input & output * ; processing. * ; TYPE: PC service required. * ;*************************************** INTR1A: CLI ;Disable further interrupts. PUSH AX MOV AL,1AH CALL TXCOM POP AX CALL TXWORD ;Send AX. MOV AX,CX CALL TXWORD ;Send CX. MOV AX,DX CALL TXWORD ;Send DX. CALL RXWORD ;Get AX. PUSH AX CALL RXWORD ;Get CX. MOV CX,AX CALL RXWORD ;Get DX. MOV DX,AX CALL RXBYTE MOV AH,AL SAHF POP AX STI ;Re-enable interrupts. RETF 0002H ;Throw away old flags. ;******************************* ; End of CLOCK I/O. * ;******************************* ;*************************************** ; Bootstrap loader. * ;*************************************** BOOTSTRAP: STI ;Interrupts back on. MOV AX,0040H MOV DS,AX MOV BYTE PTR INTR_FLAG,00H MOV WORD PTR RS232_BASE,03F8H MOV WORD PTR RS232_BASE+2,0000H MOV WORD PTR PRINTER_BASE,03BCH MOV WORD PTR EQUIP_FLAG,4260H MOV BYTE PTR MFG_TST,00H MOV WORD PTR MEMORY_SIZE,0280H MOV WORD PTR MFG_ERR_FLAG,0000H MOV BYTE PTR KB_FLAG,00H MOV WORD PTR PRINT_TIM_OUT,01E1EH MOV WORD PTR PRINT_TIM_OUT+2,01E1EH MOV WORD PTR RS232_TIM_OUT,0101H MOV WORD PTR RS232_TIM_OUT+2,0101H MOV WORD PTR BUFFER_START,001EH MOV WORD PTR BUFFER_END,003EH MOV WORD PTR BUFFER_HEAD,001EH MOV WORD PTR BUFFER_TAIL,001EH MOV WORD PTR RESET_FLAG,00000H H0: SUB AX,AX MOV DS,AX MOV WORD PTR 0078H,DISK_BASE MOV WORD PTR 007AH,CS MOV DX,0000H MOV CX,3 H1: PUSH CX MOV AH,0 INT 13H JC H2 MOV AX,0000H MOV ES,AX MOV AX,201H MOV BX,07C00H MOV CX,1 INT 13H H2: POP CX JNC H4 LOOP H1 MOV DX,0080H MOV CX,4 JMP H1 H3: PUSH DS MOV AX,0FC00H MOV DS,AX MOV SI,BADMES CALL PRNTS MOV AH,0 INT 16H ;Wait until a key is struck. POP DS JMP H0 H4: PUSH DS MOV AX,0003H INT 10H MOV AX,0FC00H MOV DS,AX MOV SI,ACCEL ;Tell user accelerating. CALL PRNTS POP DS JMP 0000:7C00 ;******************************* ; End of BOOTSTRAP. * ;******************************* ;*************************************** ; Read a byte from link. * ;*************************************** RXBYTE: PUSH DX MOV DX,0C02H RXB1: IN AL,DX TEST AL,8 JNZ RXB1 DEC DX DEC DX IN AL,DX XOR AH,AH POP DX RET ;******************************* ; End of READ BYTE. * ;******************************* ;*************************************** ; Read a word from link. * ;*************************************** RXWORD: PUSH DX MOV DX,0C02H RXW1: IN AL,DX TEST AL,8 JNZ RXW1 DEC DX DEC DX IN AL,DX ;Read in LOW byte. MOV AH,AL INC DX INC DX RXW2: IN AL,DX TEST AL,8 JNZ RXW2 DEC DX DEC DX IN AL,DX ;Read in HIGH byte. XCHG AL,AH ;Right order. POP DX RET ;******************************* ; End of READ WORD. * ;******************************* ;*************************************** ; Write a command to link. * ;*************************************** TXCOM: PUSH DX MOV AH,AL MOV DX,0C02H MOV AL,1 OUT DX,AL ;Enable PC interrupts for command. TXC1: IN AL,DX TEST AL,1 ;Check link status. JZ TXC1 DEC DX DEC DX MOV AL,AH ;Command to send. OUT DX,AL ;Send. NOP NOP NOP NOP MOV DX,0C02H MOV AL,0 OUT DX,AL ;Disable PC interrupts. POP DX RET ;******************************* ; End of WRITE command. * ;******************************* ;*************************************** ; Write a byte to link. * ;*************************************** TXBYTE: PUSH AX PUSH DX MOV AH,AL MOV DX,0C02H TXB1: IN AL,DX TEST AL,1 ;Check link status. JZ TXB1 DEC DX DEC DX MOV AL,AH OUT DX,AL ;Transfer. POP DX POP AX RET ;******************************* ; End of WRITE BYTE. * ;******************************* ;*************************************** ; Write a word to link. * ;*************************************** TXWORD: PUSH AX PUSH DX PUSH AX MOV DX,0C02H TXW1: IN AL,DX TEST AL,1 JZ TXW1 DEC DX DEC DX POP AX OUT DX,AL ;Transfer LOW byte. INC DX INC DX TXW2: IN AL,DX TEST AL,1 JZ TXW2 DEC DX DEC DX MOV AL,AH OUT DX,AL ;Transfer HIGH byte. POP DX POP AX RET ;******************************* ; End of WRITE WORD. * ;******************************* ;*************************************** ; Illegal or unimplemented interrupts * ; are serviced by the following group * ; of subroutines. Basically, unimplem- * ; ented interrupts return immediately, * ; Illegal interrupts pass a code back * ; to the PC server. * ;*************************************** INTRAP0:PUSH AX MOV AL,00h INTRG: CALL TXCOM POP AX INTRAP: STI IRET INTRAP1:PUSH AX MOV AL,01h JMP SHORT INTRG INTRAP3:PUSH AX MOV AL,03h JMP SHORT INTRG INTRAP4:PUSH AX MOV AL,04h JMP SHORT INTRG INTRAP5:PUSH AX MOV AL,05h JMP SHORT INTRG INTRAP6:PUSH AX MOV AL,06h JMP SHORT INTRG INTRAP7:PUSH AX MOV AL,07h JMP SHORT INTRG INTRAP8:PUSH AX MOV AL,08h JMP SHORT INTRG INTRAPA:PUSH AX MOV AL,0Ah JMP SHORT INTRG INTRAPB:PUSH AX MOV AL,0Bh JMP SHORT INTRG INTRAPC:PUSH AX MOV AL,0Ch JMP SHORT INTRG INTRAPD:PUSH AX MOV AL,0Dh JMP SHORT INTRG INTRAPE:PUSH AX MOV AL,0Eh JMP SHORT INTRG INTRAPF:PUSH AX MOV AL,0Fh JMP SHORT INTRG INTRAP18:PUSH AX MOV AL,18h JMP SHORT INTRG INTRAP1D:PUSH AX MOV AL,1Dh JMP SHORT INTRG INTRAP1E:PUSH AX MOV AL,1Eh JMP SHORT INTRG INTRAP1F:PUSH AX MOV AL,1Fh JMP SHORT INTRG ;******************************* ; End of ILLEGAL & UNIMPLEMEN- * ; TED interrupts. * ;******************************* ;*************************************** ; BIOS data storage. * ;*************************************** ORG 03F00H ;*************************************** ; Storage for DISKETTE parameters. * ;*************************************** DISK_BASE: ;Initial disk drive parameters. DB 0DFH DB 2 DB 25H DB 02H DB 9 DB 02AH DB 0FFH DB 050H DB 0F6H DB 00fH DB 02H ;******************************* ; End of DISKETTE parameters. * ;******************************* ;*************************************** ; Storage for HARD DISK parameters. * ;*************************************** HARD_BASE: DB 032H,001H,002H,032H,001H,000H,000H,00BH DB 000H,00CH,0B4H,028H,000H,000H,000H,000H DB 032H,001H,004H,032H,001H,000H,000H,00BH DB 005H,00CH,0B4H,028H,000H,000H,000H,000H DB 032H,001H,006H,080H,000H,000H,001H,00BH DB 005H,00CH,0B4H,028H,000H,000H,000H,000H DB 064H,002H,002H,000H,000H,080H,000H,00BH DB 005H,018H,0F0H,040H,000H,000H,000H,000H ;******************************* ; End of HARD DISK parameters. * ;******************************* ;*************************************** ; Storage for BIOS messages. * ;*************************************** FORMES: DB 'Format operations cannot be executed whilst in ACCELERATOR ' DB 'mode.',0DH,0AH DB 'Rebooting of PC necessary.',0DH,0AH,0FFH ;******************************* ; End of BIOS messages. * ;******************************* ;*************************************** ; RESET vector upon power up or reset. * ;*************************************** ORG 03FF0H ;Reset boot up start. JMP 0FC00:0000 ;Go to startup code. ;*************************************** ; Release date information. * ;*************************************** DB '04/04/88' DB 0AAH,00FEH,05DH ORG 03FFFH ;Required to get object file to ;**************************************************************************** ;** End of the TurboRacer 286 coding. An object file of 16384 bytes should ** ;** be generated. ** ;****************************************************************************