title 8-Bit am Drucker unter CP/M 2.2 f}r die CPC-Serie ; Copyright 30.11.1986 by Andreas Ki~linger ; Version vom 10.04.1987 ; Zum Anwenden mu~ diese Datei assembliert und in eine ; COM-Datei umgewandelt werden. Beim Aufruf wird die Drucker- ; Indirection IND WAIT PRINTER und die Drucker-Ausgabe MC ; SEND PRINTER so gepatcht, da~ sowohl mit der Vortex- ; Speichererweiterung unter 62K-CP/M, als auch unter AMSDOS ; eine 8 Bit breite Centronics-Schnittstelle aktiviert wird. ; Der Patch erfolgt nur, wenn bei MC SEND PRINTER noch kein ; entsprechender Eintrag vorhanden ist. base equ 0000h wboot equ base bdos equ base+5 tpa equ base+100h strout equ 9 cpmver equ 12 cr equ 0dh lf equ 0ah strende equ '$' mcsendprinter equ 0bd31h ; Adresse von MC SEND PRINTER indwaitprinter equ 0bdf1h ; Adresse von IND WAIT PRINTER no44kbios equ 0e000h ; 44K-BIOS liegt unterhalb 56K patchadr equ 0be00h ; Adresse zur Ablage der Routine pioctrlport equ 0f7h ; Steuerport der PIO cpm44k_bc2 equ 7f86h ; Speicherkonfiguration f}r 44K CP/M cpm62k_bc2 equ 7feeh ; Speicherkonfiguration f}r 62K CP/M offs1 equ do_bit8-bit8_patch ; Abstand der gemeinsamen Routine offs2 equ prtindpatch-bit8_patch ; Abstand des zweiten Einsprungs org tpa ; Das Programm f{ngt bei 100h an start: ld c,cpmver ; zum Holen der CP/M Version call bdos ; CP/M Version erfragen ld a,l ; CP/M Version in Akku laden cp 22h ; ist es CP/M 2.2? jr z,cpm22ok ; wenn CP/M 2.2, dann weiter ld de,nocpm30 ; sonst String 'Nicht 3.0 CP/M' ld c,strout ; zur Stringsausgabe vorbereiten call bdos ; Meldung ausgeben ret ; R}ckkehr zum CCP cpm22ok: ; CP/M Version war 2.2 => Treiber einbinden ld de,mesg1 ; Normale Meldung adressieren ld c,strout ; zum Meldungen ausgeben call bdos ; und ausgeben di ; wegen Bankumschaltung Interrupts sperren exx ; zweiten Registersatz w{hlen ld de,(wboot+1) ; Warmbootadresse in DE holen ld b,2 ; maximal zweimal weitergeleitet checklp: ; Schleife zur Pr}fung ob 62K CP/M ld hl,no44kbios-1 ; innerhalb des 44K-BIOS or a ; Carry l|schen sbc hl,de ; ist die Zieladresse gr|~er als 56K? jr c,is62kcpm ; dann BC' f}r Bank-BIOS ex de,hl ; sonst wieder Adresse in HL inc hl ; Adresse eines Sprungs adressieren ld e,(hl) ; Lowbyte holen inc hl ; Highbyte adressieren ld d,(hl) ; Highbyte holen djnz checklp ; n{chste Sprungadresse ld bc,cpm44k_bc2 ; 44K gefunden => BC' f}r 44K CP/M jr dopatch ; zur Patchroutine is62kcpm: ; 62K gefunden => BC' f}r 62K CP/M ld bc,cpm62k_bc2 ; BC' besetzen dopatch: ; mit korrektem BC' weitermachen ld e,c ; ROM-Konfiguration in E' speichern res 5,c ; wenn n|tig RAM-Erweiterung out (c),c ; mittels Portausgabe abschalten exx ; normalen Registersatz benutzen ld hl,(mcsendprinter+1) ; Adresse in Ausgaberoutine ld de,-patchadr ; negative Patchadresse add hl,de ; HL = -DE ==> HL = 0 ld a,h ; HL=0 ==> Patch ist or l ; bereits installiert, jr z,ende ; dann nicht mehr patchen! ld hl,(mcsendprinter+1) ; MC SEND PRINTER ld (mcprtende+1),hl ; Adresse speichern ld a,(mcsendprinter) ; ebenso den ld (mcprtende),a ; Opcode davor ld hl,(indwaitprinter+1) ; IND WAIT PRINTER ld (prtindende+1),hl ; Adresse speichern ld a,(indwaitprinter) ; ebenso den ld (prtindende),a ; Opcode davor ld hl,bit8_patch ; Patchroutine adressieren ld de,patchadr ; Zieladresse festlegen ld bc,patchende-bit8_patch ; und Patchl{nge holen ldir ; Routine installieren ld a,0c3h ; JP in Akku laden ld (mcsendprinter),a ; MC SEND PRINTER und ld (indwaitprinter),a ; IND WAIT PRINTER patchen ld hl,patchadr ; Adresse des neuen ld (mcsendprinter+1),hl ; MC SEND PRINTER ld hl,patchadr+offs2 ; Adresse der neuen ld (indwaitprinter+1),hl ; Indirection ende: exx ; zweiten Registersatz w{hlen ld c,e ; ROM-Konfiguration wieder in out (c),c ; C holen und Konfiguration exx ; selektieren, normalen Register- ret ; satz w{hlen und R}ckkehr ins CP/M bit8_patch: ; Beginn der Treiberroutine sendprtpatch: ; Patch f}r MC SEND PRINTER call patchadr+offs1 ; verschobene do_bit8 aufrufen mcprtende: defs 3 ; Platz f}r Opcode + Adresse prtindpatch: ; Patch f}r IND WAIT PRINTER call patchadr+offs1 ; verschobene do_bit8 aufrufen prtindende: defs 3 ; Platz f}r Opcode + Adresse do_bit8: ; setzt Bit 7 vom Druckerport auf Bit 7 von Akku push af ; Zeichen retten push bc ; BC-Register nicht ver{ndern! ld b,pioctrlport ; Steuerport der PIO in B laden rlca ; Bit 7 v. Zeichen ins Carry ld a,5 ; Bit 5 vom Port C ansprechen rla ; Carry in Bit 0 vom Akku out (c),a ; Port-Bit entsprechend beeinflussen pop bc ; BC-Register restaurieren pop af ; Zeichen wieder holen ret ; zur}ck zum Aufrufer patchende: ; Ende der Treiberroutine nocpm30: db 'Dieser Druckertreiber kann nur im CP/M 2.2 ' db 'installiert werden!',cr,lf,strende mesg1: db 'Der Treiber fuer das achte Druckerbit ' db 'wird nun installiert!',cr,lf,strende end start ; Ende des Assemblerfiles