; ***************************************************** ; * P C - C O M V1.1 4Mhz * ; * Unterstuezt INSTAT, OUTSTAT, COM$ und simuliert * ; * einen CE-125 Drucker (LPRINT und LLIST moeglich) * ; * P26/Dout, P27/STR, P25/Din, P24/ACK * ; ***************************************************** ; Hauptroutine, erkennt die einzelnen Befehle und ; ruft die entsprechenden Unterprogramme auf. jmp Start ;Programstart nach Reset nop ;Platzhalter jmp Break ;Interupt erkannt Start anl p2,#11001110b ;Din, Ack und TxD auf Lowpegel eni ;Interupt erlauben Back call Liespc ;Befehlsbyte einlesen mov r2,a ;und merken add a,#89H ;INSTAT? jz Instat ;Wenn ja dann springen mov a,r2 ;Befehlsbyte zurueckholen add a,#8FH ;OUTSTAT? jz Outstat ;Wenn ja dann springen mov a,r2 ;Befehlsbyte zurueckholen add a,#D5H ;COM$? jz com ;Wenn ja dann springen mov a,r2 ;Byte zurueckholen add a,#FDH ;ist es ETX? jz back ;wenn ja dann unterdruecken mov a,r2 ;Byte zurueckholen call Crlf ;Fuegt vor jedem CR ein LF ein ; call RS232W ;Kein Befehl call Centr jmp Back ;Auf zum naechsten Byte ; Startet den MCS48 bei einem All-Clear neu Break clr a mov PSW,a Brlop jni Brlop ;Warten bis der PC All-Clear loescht call Enint ;Interupts freigeben jmp Start ;Neustart Enint retr ; Liest ein Byte vom PC und schreibt es auf Port1 des 8039 Outstat call Liespc ;Datenbyte von Outstat einlesen outl p1,a ;und auf Port1 ausgeben call Liespc ;Endekennung einlesen add a,#F3H ;War es 0DH? jnz Error ;Wenn nein dann Fehler jmp Back ;Naechsten Befehl ; Liest Port1 vom 8039 und sendet das Byte zum PC Instat call Wait ;auf den PC1245/51 warten in a,p1 ;Port1 einlesen call Writepc ;und zum Sharp senden call Wait ;Der Sharp ist langsam! mov a,#0DH ;Endekennung laden call Writepc ;und absenden jmp Back ;Naechsten Befehl ; Warteschleife, wird immer aufgerufen bevor ein Byte ; zum PC1245/51 gesendet wird Wait mov r1,#FFH ;Kurze Warteroutine damit Ulop djnz r1,Ulop ;der PC mitkommt ret ; Senderoutine P26/Dout, P27/STR, P25/Din, P24/ACK ; Benutzt R0,R2,R3,Akku Writepc anl p2,#11011111b ;Datenbit loeschen mov r3,#08H ;Bytezaehler setzen mov r2,a ;Datenbyte merken Wnext mov a,r2 ;Datenbyte aus R2 holen rrc a ;Datenbit in Carry, Bit 0 zuerst mov r2,a ;Die restlichen Datenbits merken jnc Nullb ;Wenn Carry=0 naechsten Befehl ueberspringen orl p2,#00100000b ;Sonst Din setzen Nullb orl p2,#00010000b ;ACK auf Highpegel mov r0,#80H ;maximale Wartezeit Wwait in a,p2 ;Port2 fuer STR einlesen rlc a ;STR in Carry schieben jc Strokay ;Wenn STR=1 dann weiter djnz r0,Wwait ;auf STR warten jmp Brk ;Kein STR Sharp unterbrach uebertragung Strokay anl p2,#11101111b ;ACK loeschen Pwait in a,p2 ;Wurde STR rlc a ;geloescht? jc Pwait ;Wenn nein dann warten anl p2,#11011111b ;Datenbit loeschen djnz r3,Wnext ;Fuer alle acht Bits wiederholen ret ;Fertig ; Bringt das PSW in den Anfangszustand Brk mov a,#00000000b ;Stack zuruecksetzen mov PSW,a jmp 0 ;Neustart ; Dem PC1245/51 wird mitgeteilt das ein Fehler ; erkannt wurde. Dann wird neu gestartet. Error orl p2,#00100000b ;Din wird zur Fehlermeldung gesetzt mov r2,#80H ;warten Err1 mov r3,#FFH Err2 djnz r3,Err2 djnz r2,Err1 jmp Brk ;Stack zuruecksetzen und neu starten ; Liest ein Byte vom PC1245/51 ; P26/Dout, P27/STR, P25/Din, P24/ACK ; Benutzt R0,R2,R3,Akku Liespc mov r3,#08H ;Bytezaehler setzen Again in a,p2 ;Dout und STR einlesen rlc a ;STR in Carry schieben jnc Again ;Warten bis STR=1 orl p2,#00010000b ;Ack setzen rlc a ;Datenbit in Carry mov a,r2 ;Zwischenpeicher in Akku holen rrc a ;Bit in Akku schieben (LSB zuerst) mov r2,a ;Die gelesenen Bits merken mov r0,#50H ;600 Mikrosek. warten Wlop djnz r0,Wlop anl p2,#11101111b ;ACK zuruecksetzen djnz r3,Again ;Acht mal wiederholen mov a,r2 ;Datenbyte in Akku ret ;Fertig ; Unterprogramm fuer COM$ Befehl gibt die Versionsnummer ; auf dem PC aus (Text im Sharpcode ab String) Com call wait ;Auf PC warten mov a,#String ;Akku auf Stringanfang mov r5,a ;und in R5 sichern nexcom movp a,@a ;Byte einlesen jz endcom ;Wenn null dann ende call Writepc ;sonst ausgeben inc r5 ;Adresse auf naechstes Byte mov a,r5 ;Adresse in Akku jmp nexcom ;Solange bis Stringende endcom call wait ;Auf PC warten mov a,#0DH ;Endekennung laden call Writepc ;und ausgeben jmp back ;Naechster Befehl ; Centronics-Schnittstelle ; Erwartet Datenbyte im Akku ; Benutzt Port1 fuer Daten, P20 als Strobe und T0 fuer Busy Centr outl p1,a anl p2,#11111110b ;Strobe setzen orl p2,#00000001b ;Strobe zurueck setzen Cenlop jt0 Cenlop ret ; RS232-Sender fuer 4 Mhz ; Erwartet das Datenbyte im Akku ; Register R5, R6, Akku ; Voreinstellung fuer 1200Baud ; Logisch 1 = 5 Volt ; Benutzt P20 als Ausgang ; RS232W call warten ;nur solange kein Handshake ; mov r5,#08H ;acht Datenbits ; orl p2,#00000001b ;Startbit setzen ; mov r6,#6CH ;6CH/1200b 34H/2400B 18H/4800B 0AH/9600b 03H/19200B ; Rw1 djnz r6,Rw1 ;Warteschleife fuer Startbit ; Rsp1 clr c ;Zeitausgleich 1 Zyklus ; rrc a ;Datenbit in Carry ; jnc Rsp2 ;Datenbit=1? ; anl p2,#11111110b ;Ja ; jmp Rsp3 ; Rsp2 orl p2,#00000001b ;Nein ; Rsp3 clr c ; clr c ; mov r6,#6AH ;6AH/1200B 32H/2400B 16H/4800B 08H/9600b 01H/19200B ; Rw2 djnz r6,Rw2 ;Warteschleife fuer Datenbit ; djnz r5,Rsp1 ;acht mal wiederholen ; mov a,#00H ; mov a,#00H ; orl p2,#00000001b ; 1 Stopbit ; mov r6,#6CH ;6CH/1200B 34H/2400B 18H/4800B 0AH/9600B 03H/19200B ; Rw3 djnz r6,Rw3 ;Warteschleife fuer Stopbit ; rend anl p2,#11111110b ;Stopbit zuruecksetzen ; ret ; Nur voraebergehend wartet bis der Empfaenger fertig ist warten mov r5,#0AH war1 mov r6,#FFH war2 djnz r6,war2 djnz r5,war1 ret ; Das Unterprogramm ersetzt das vom Sharp gelieferte Byte 0DH ; durch die Bytes 0AH und 0DH (Carriage Return und Line Feed) Crlf mov r2,a ;Byte merken add a,#F3H ;Ist es eine Carriage Return? jnz trl ;Sprung wenn nicht mov a,#0AH ;Wenn Ja, ein Line Feed ausgeben ; call RS232W call centr trl mov a,r2 ;altes Byte zurueckholen ret ;Ruecksprung String .Byte 60H ;PC-COM V1.0 .Byte 53H ;Text im Sharpformat kein ASCII! .Byte 36H .Byte 53H .Byte 5FH .Byte 5DH .Byte 11H .Byte 66H .Byte 41H .Byte 4AH .Byte 40H .Byte 00H ;Endekennung