software:diy:assembler:int14h
Interrupt 14H für das serielle Modul
— Rückübersetzung des internen Ablaufes (ROM-BIOS) für den DOS-Interrupt 14H zu Lehrzwecken —
;Anlage 25, INT 14h PF ;Interrupt 14H des Atari Portfolio ;Bearbeitungsstand 18.5.92
24DA: STI 24DB: PUSH BX 24DC: PUSH CX 24DD: PUSH DX 24DE: PUSH DS 24DF: PUSH SI 24E0: CMP DX,+03 24E3: JA 252F ;ErrorEnde 24E5: MOV BX,0040 24E8: MOV DS,BX 24EA: MOV SI,DX 24EC: MOV DX,[SI+0000] ;Portadresse 24F0: OR DX,DX 24F2: JZ 252F ;ErrorEnde 24F4: CMP DX,8070 ;PF-Modul-Adr.? 24F8: JNZ 2501 ;nein 24FA: CALL 2633 ;ser. Modul da? 24FD: JZ 2501 ;ja 24FF: JMP 252F ;nein, ErrorEnde 2501: OR AH,AH 2503: JNZ 250A 2505: CALL 2537 ;Initialisierung 2508: JMP 2531 ;Ende 250A: DEC AH 250C: JNZ 2513 250E: CALL 256D ;Senden 2511: JMP 2531 ;Ende 2513: DEC AH 2515: JNZ 251C 2517: CALL 257B ;Empfangen 251A: JMP 2531 ;Ende 251C: DEC AH 251E: JNZ 2525 2520: CALL 258C ;Status 2523: JMP 2531 ;Ende 2525: CMP AH,FC ;Fun. 0FFh 2528: JNZ 2531 ;Ende 252A: CALL 2599 ;? 252D: JMP 2531 ;Ende 252F: MOV AH,80 ;ErrorEnde 2531: POP SI ;Ende 2532: POP DS 2533: POP DX 2534: POP CX 2535: POP BX 2536: IRET ;Ende des Hauptprogrammes ;---------------------------------------------------------- ;Modultest 2633: PUSH AX 2634: CALL 1D65 ;Moduladr. u. IV-Reg. lesen 2637: OR AL,AL ;kein Modul AL = 0 2639: JNZ 263D 263B: MOV AH,FF 263D: CMP AH,00 2640: JZ 264B 2642: CMP AH,01 2645: JZ 264B 2647: CMP AH,[0197] 264B: POP AX 264C: RET ;Z ;Abfrage ob serielles Modul angeschlossen 1D65: PUSH DX 1D66: MOV DX,8051 1D69: IN AL,DX 1D6A: AND AL,20 ;bit 5 gesetzt mit Modul 1D6C: JZ 1D7C ;kein ser. Mod. 1D6E: MOV DX,807F 1D71: IN AL,DX ;IV lesen 1D72: MOV AH,AL 1D74: AND AL,80 1D76: JZ 1D7A 1D78: MOV AH,AL ;Time out setzen 1D7A: MOV AL,FF 1D7C: POP DX 1D7D: RET ;---------------------------------------------------------- ;Status abfragen 258C: MOV DX,[SI+0000] 2590: ADD DX,+05 ;Line-Status-Reg. 2593: IN AL,DX 2594: MOV AH,AL 2596: INC DX ;Modem-Status-Reg. 2597: IN AL,DX 2598: RET ;---------------------------------------------------------- ;Initialisierung der UART 2537: PUSH AX 2538: MOV CL,05 253A: SHR AL,CL ;Ergebnis 0000 0BBB 253C: JZ 2546 ;BBB = 0, 110 Baud 253E: MOV CL,AL ;Bitmuster Baudrate (1-7) ;0000 0BBB 2540: MOV CH,06 ;0000 0110 2542: SHR CX,CL ;0000 0011 0000 0000 bis ;0000 0000 0000 1100 moeglich! 2544: JMP 2549 2546: MOV CX,0417 ;Steuerwort f. 110 Baud 2549: MOV DX,[SI+0000] 254D: ADD DX,+03 ;Line-Control-Reg. 2550: MOV AL,80 2552: OUT DX,AL 2553: MOV DX,[SI+0000] ;Daten-Reg. 2557: MOV AL,CL 2559: OUT DX,AL ;Baudrate init. 255A: INC DX ;Int.-Enable-Reg. 255B: MOV AL,CH 255D: OUT DX,AL 255E: POP AX 255F: AND AL,1F ;Steuerbits fuer Paritaet u.s.w. 2561: MOV DX,[SI+0000] 2565: ADD DX,+03 ;Line-Control-Reg. 2568: OUT DX,AL 2569: CALL 258C ;Status 256C: RET ;Ende der Initialisierung ;---------------------------------------------------------- ;fr beide UP's BH = Line-Maske und BL = Modem-Maske ;UP senden eines Zeichens 256D: MOV CH,03 ;DTR + RTS on 256F: MOV BX,2030 ;Status-Maske: ;Sender-Pu. leer, DSR + CTS 2572: CALL 25E2 ;bei Zeitueberschreitung ;Return-Sprung zu ErrorEnde 2575: MOV DX,[SI+0000] 2579: OUT DX,AL 257A: RET ;---------------------------------------------------------- ;UP empfangen eines Zeichens 257B: MOV CH,01 ;DTR 257D: MOV BX,0120 ;Status-Maske 2580: CALL 25E2 ;bei Zeitueberschreitung ;Return-Sprung zu ErrorEnde 2583: MOV DX,[SI+0000] 2587: IN DX,AL 2588: AND AH,1E 258B: RET ;---------------------------------------------------------- ;UP zur Bedienung der seriellen Schnittstelle ;IN: CH = Modemsteuersignale ; BX = Maske fuer Modemstatus ;OUT: AH = Modem- und Linestatus ; bei Zeitueberschreitung Sprung zu ErrorEnde 25E2: MOV CL,AL :Zeichen merken 25E4: PUSH CX 25E5: MOV DX,[SI+0000] 25E9: ADD DX,+04 ;Modem-Ctrl-Reg. 25EC: MOV AL,CH 25EE: OUT DX,AL ;DTR on 25EF: INC DX 25F0: INC DX ;Modem-Status-Reg. 25F1: XOR CH,CH 25F3: MOV CL,[SI+007C] ;Zeitkonst. TimeOut ;warten auf DSR on 25F7: PUSH CX 25F8: XOR CX,CX 25FA: IN AL,DX ;Modem-Status holen 25FB: AND AL,BL 25FD: CMP AL,BL ;DSR? 25FF: JZ 2608 ;ja 2601: LOOP 25FA ;nein 2603: POP CX 2604: LOOP 25F7 2606: JMP 2621 ;Zeitueberschreitung ;DSR on 2608: ADD SP,+02 260B: DEC DX ;Line-Status-Reg. 260C: XOR CH,CH 260E: MOV CL,[SI+007C] ;= 1 2612: PUSH CX 2613: XOR CX,CX ;warten auf ein Zeichen 2615: IN AL,DX ;Line-Status holen 2616: AND AL,BH 2618: CMP AL,BH ;Zeichen da? 261A: JZ 262A ;ja 261C: LOOP 2615 ;nein, warten 261E: POP CX 261F: LOOP 2612 2621: POP CX 2622: MOV AL,CL 2624: ADD SP,+04 2627: JMP 252F ;ErrorEnde 262A: ADD SP,+02 ;Zeichen empf. 262D: POP CX 262E: MOV AH,AL 2630: MOV AL,CL 2632: RET ;Ende Bedienung ser. Schnittst. ;---------------------------------------------------------- ;Funktion 0FFh 2599: MOV DX,[SI+0000] 259D: ADD DX,+03 ;LinConReg 25A0: IN AL,DX ;lesen 25A1: MOV AH,AL 25A3: OR AL,80 ;Steuerwort 25A5: OUT DX,AL 25A6: SUB DX,+03 ;DataReg 25A9: IN AL,DX ;InitByte lesen 25AA: MOV CL,AL ;InitByte merken 25AC: INC DX ;IntEnReg 25AD: IN AL,DX ;Int.-Freigabe lesen 25AE: MOV CH,AL 25B0: MOV DX,[SI+0000] 25B4: ADD DX,+03 ;LinConReg 25B7: MOV AL,AH ;Line-Status von oben 25B9: OUT DX,AL 25BA: XOR AL,AL 25BC: CMP CX,0417 ;110 Baud 25C0: JZ 25D8 25C2: JB 25CA 25C4: ADD SP,+02 25C7: JMP 252F ;ErrorEnde 25CA: INC AL 25CC: SHL CX,1 25CE: TEST CX,0400 25D2: JZ 25CA 25D4: MOV CL,05 25D6: SHL AL,CL ;110 Baud 25D8: MOV CL,AL 25DA: IN AL,DX ;LinConReg 25DB: AND AL,1F 25DD: OR AL,CL 25DF: XOR AH,AH 25E1: RET ;---------------------------------------------------------- end 24DA
software/diy/assembler/int14h.txt · Zuletzt geändert: 03/04/2006 00:04 (Externe Bearbeitung)