; ; Expanded version of REDEFINE.RSX supporting PCW, CPC and Spectrum +3 CP/M. ; .z80 cseg ; ;Redefine characters on the fly ; DEFS 6 ;Version no. ENTRY: JP INIT ;Entry point FDOS: JP 0 ;Next RSX DEFW 0 ;Previous RSX DEFB 0FFh ;Short-term RSX DEFB 0 ;Banked sys RNAME: DEFB 'REDEFINE' ;Title DEFB 0,0,0 ;System use INIT: LD HL,ICEPT ;Bypass initialisation code on future calls LD (ENTRY+1),HL PUSH DE PUSH BC CALL USERF ;Get current environment DEFW 00E3h LD (MACHINE),A ;What computer is in use? 0 => CPC 1 => PCW CP 4 ;3 => Spectrum +3 JP NC,BADMCH CP 2 JP Z,BADMCH POP BC POP DE ICEPT: LD A,C CP 49h ;Redefine character? JR Z,REDEFCH CP 58h ;Get bitmap JR Z,GETCH CP 59h ;Output custom character (DE->character) JR NZ,FDOS LD HL,CHBUF1 ;Move character to CHBUF EX DE,HL LD BC,8 LDIR LD A,'A' LD (CHNO),A CALL CHADDR ;Find the address of 'A' PUSH HL LD DE,CHBUF2 ;Back up the 'A' bitmap CALL SCRMOV POP DE LD HL,CHBUF1 ;Define 'A' as the custom character CALL SCRMOV LD DE,SCB1 ;Get the address of the CONOUT bitmap CALL SCBDOS LD (OCNO),HL LD HL,8000h ;Set CONOUT to CRT CALL SCBDO1 LD HL,(1) ;Output 'A' using the BIOS. LD BC,9 ADD HL,BC LD C,'A' CALL PCHL LD HL,(OCNO) ;Restore the CONOUT device mapping. CALL SCBDO1 CALL CHADDR ;Restore the 'A' bitmap LD DE,CHBUF2 JR ADONE ; SCBDO1: LD (CNOVEC),HL ;Set the CONOUT device bitmap to HL. LD DE,SCB2 SCBDOS: LD C,31h ;Read or write the System Control Block JP FDOS ; PCHL: JP (HL) ; REDEFCH: LD HL,CHNO ;Move character to CHBUF (DE->character) EX DE,HL LD BC,9 LDIR CALL CHADDR ;HL = address of bitmap to redefine LD DE,CHBUF1 ADONE: EX DE,HL ;Copy new bitmap in CALL SCRMOV OUTRSX: XOR A LD H,A ;Return HL = BC = 0 LD L,A LD B,A RET ; GETCH: LD A,(DE) ;To retrieve the bitmap of a character... LD (CHNO),A ;DE -> character number INC DE PUSH DE CALL CHADDR ;Get character address LD DE,CHBUF1 CALL SCRMOV ;Retrieve from the font LD BC,8 LD HL,CHBUF1 ;Copy to DE+1 POP DE LDIR JR OUTRSX ; CHADDR: PUSH DE ;Find the address of character CHNO and return in HL LD A,(CHNO) LD L,A LD H,0 ADD HL,HL ADD HL,HL ADD HL,HL CALL VEROFF ;DE:=font base ADD HL,DE ;HL:=character address POP DE RET ; VEROFF: LD DE,08000h ;Locate the font depending on what system LD A,(MACHINE) ;this is. OR A RET Z ;CPC font is at 8000h. LD D,0B8h DEC A ;PCW font is at 0B800h. RET Z LD D,038h ;8x5 Spectrum font is at 03800h. RET ; SCRMOV: LD (CSRC),HL ;Copy 8 bytes data to/from the font. LD (CDST),DE ;HL = source DE = destination LD A,(MACHINE) OR A ;Is this a CPC? JR Z,CSCMOV LD BC,MSCMOV ;No, Spectrum or PCW. Use SCR RUN ROUTINE CALL USERF ;to call MSCMOV in screen context. DEFW 00E9h RET CSCMOV: CALL USERF ;CPC doesn't have SCR RUN ROUTINE, just call DEFW MSCMOV ;MSCMOV in bank 0 context. RET ; MSCMOV: LD HL,(CSRC) ;Copy 8 bytes from CSRC to CDST LD DE,(CDST) LD BC,8 LDIR RET ; USERF: PUSH HL PUSH BC LD HL,(1) LD BC,57h ADD HL,BC POP BC EX (SP),HL RET ; BADMCH: LD DE,MACHINE LD C,9 CALL FDOS RST 0 ; DSEG MACHINE: DEFB 'R' CHNO: DEFB 'E' ;Must be contiguous with CHBUF1 CHBUF1: DEFB 'DEFINE: ' CHBUF2: DEFB 'Bad mach' CSRC: DEFB 'in' CDST: DEFB 'e.' OCNO: DEFB 13,10 SCB1: DEFW 24h ;This gives the "$" for the string, and ;the SCB offset for CONOUT: SCB2: DEFW 0FE24h CNOVEC: DEFW 0 CSEG END