PofoWiki

Die ultimative Informationsquelle zum ATARI Portfolio

Benutzer-Werkzeuge

Webseiten-Werkzeuge


software:diy:assembler:int14h

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen RevisionVorhergehende Überarbeitung
software:diy:assembler:int14h [03/04/2006 16:04] – erweitert ROM-BIOS michasoftware:diy:assembler:int14h [Unbekanntes Datum] (aktuell) – Externe Bearbeitung (Unbekanntes Datum) 127.0.0.1
Zeile 1: Zeile 1:
 +====== 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
 +<code asm>
 +   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
 +   ;----------------------------------------------------------
 +   ;fr 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
 +</code>