title 'Zeichensatz definieren' page 64 ; Program : CHARSET.ASM ; ; RSX Modul fuer die Definition einer einzelnen Zeichenmatrix ; ; Programm von Werner Cirsovius ; Hohe Weide 44 ; D-2000 Hamburg 20 ; Tel.:040/4223247 ; Vielen Dank an Cliff Lawson, Amstrad Consumer Electronics plc., ; der mir mit seiner Veroeffentlichung der Definition des ; JOYCE Zeichensatzes eine grosse Hilfe war ; Die neuen BDOS Funktionen sind 38 zum Laden einer alten Matrix ; und 39 zum Speichern einer neuen Matrix. ; Der Aufruf dieser Funktionen setzt voraus, dass das Register HL ; auf einen Puffer zeigt, dessen erstes Byte der Wert des zu ; bearbeitenden Zeichens darstellt. ; Bei der Beendigung der BDOS Funktion 38 ist dieser Puffer ; mit acht Bytes der gewaehlten Zeichenmatrix gefuellt. ; Zur Erzeugung des RSX Moduls und zum Anbinden an eine Anwendung ; muss folgendes eingegeben werden: ; RMAC CHARSET $PZ SZ RM ; LINK M:CHARSET [OP] ; RENAME CHARSET.RSX=CHARSET.PRL ; GENCOM anwendung CHARSET jump equ 0c3h ; Jump-Opcode stormx equ 39 ; Neue BDOS Funktionen loadmx equ 38 userf equ 30 ; BIOS Funktion warm equ 0000h ; Warmstart-Adresse matx equ 8 ; Laenge einer Matrix scrrun equ 00e9h ; XBIOS-Adresse charmx equ 0b800h ; Basis-Adresse der Zeichenmatrix ldir macro db 0edh,0b0h; Z80 ldir Instruktion endm ; ===== RSX startet hier ===== ; ===== RSX Kopf beginnt ===== db 0,0,0,0,0,0 ; Sechs Bytes Serien-Nummer jmp start ; Sprung zum RSX-Programm next: db jump ; Sprung zur naechsten RSX dw 0 dw 0 ; Adresse der vorigen RSX db 0ffh ; Remove-Anzeige (0 RSX bleibt) db 0 ; Anzeige Bank db 'CHARSET ' ; Beliebiger Name (8 Zeichen) db 0 ; Loader-Anzeige dw 0 ; Frei (reserviert) ; ===== RSX Kopf endet ===== start: mov a,c cpi loadmx ; Test ob neue BDOS-Funktion jz get cpi stormx jnz next ; Ignorieren wenn nicht lxi b,1+matx lxi d,buffer ldir ; Matrix vom Aufrufer laden call bios ; BIOS-Adresse berechnen lxi b,codes call switch ; Neue Matrix setzen ret get: mov a,m ; Wert des Zeichens laden sta buffer ; Als erster Eintrag inx h push h call bios ; BIOS-Adresse berechnen lxi b,codeg call switch ; Alte Matrix laden pop d ; Puffer holen lxi h,buffer+1 lxi b,matx ldir ; Alten Wert laden ret ; ------------------------------------------------- bios: ; BIOS-Adresse berechnen lhld warm+1 lxi d,(userf-1)*3 dad d shld entfw+1 ; Adresse speichern ret entfw: db jump dw 0 switch: ; Aufruf der Spezial-Routine "scr_run_routine" lxi h,buffer; Puffer setzen call entfw dw scrrun ret codeg: ; Gemeinsame Lade-/Speicherroutine mvi e,1 jmp comcod codes: mvi e,0 comcod: mov a,m ; Wert des Zeichens holen inx h push h mov l,a mvi h,0 dad h ; 3 Bits nach links schieben dad h dad h mov a,e lxi d,charmx dad d ; Auf Matrix zeigen ora a jz doset pop d ; Ziel laden jmp move doset: xchg ; Ziel setzen pop h ; .. und Quelle move: lxi b,matx ldir ; In den Puffer speichern ret buffer ds 1+matx ; Matrix-Puffer end