;------------------------------------------------- ;ROTATE.MAC - erzeugt eine Laufschrift, die Pixel- ; weise nach rechts }ber den Bild- ; schirm geschoben wird. ;Rechner : PCW 8256/8512 (JOYCE) ;Assembler : M80 (Microsoft Inc.) ;CP/M-Version: CP/M 3 (PLUS) V. 1.4 ;(c) 1991 Norbert Finke & CPC International ;------------------------------------------------- ;EQUates: m_buffer equ 0c000h ;Matrix-Puffer (mu~ in ;Common Memory liegen) text_len equ 019h ;Text-L{nge msg_len equ 01fh ;L{nge Ende-Meldung text_koord equ 01021h ;Ausgabe-Koordinaten Z/S bios_userf equ 0fc5ah ;BIOS-Einsprung #30 (USERF) screen_0 equ 0 ;Screen-Koordinaten ob.-li. screen_1 equ 01f59h ;Screen-Koordinaten u.-re. ; ;verwendete System-Routinen: ; km_read_char equ 0114eh ;Rout. des Keyb.- ; Managers scr_clr_box equ 01549h xfer_matrix equ 015e5h ;]bertragungs- ;Routine scr_write equ 015aah scr_char_invert equ 0160ah scr_char_position equ 0169ch scr_call_bc equ 01740h scr_read equ 0174fh ; cseg ; ;zun{chst Bildschirm }ber SCR CLR BOX l|schen ; start: ld de,screen_0 ;Start-Koordinaten (0,0) ld hl,screen_1 ;End-Koordinaten (31,89) call bios_userf ;Systemroutine aufrufen defw scr_clr_box ; ;dann den Text ausgeben ; ld de,0 ;Koordinaten f}r Ende-Meldg. ld hl,end_msg ;HL -> Ende-Meldg. ld b,msg_len ;L{nge -> B call direct_out ;Ende-Meldung ausgeben ld de,text_koord ;Koordinaten f}r Text ld hl,text ;HL -> Ausgabe-Text ld b,text_len ;B = L{nge call direct_out ;und ausgeben ld hl,text_koord+5 ;Koordinaten festlegen ld (xypos),hl ;und speichern ld b,5 ;5 Zeichen invertieren push bc ;sichern call invert_str ;dann Zeichen invertieren pop bc ;Anzahl zur}ck ld hl,text_koord+15 ;neue Koordinaten ld (xypos),hl ;abspeichern call invert_str ;ebenfalls invertieren ; ;Zeichen aus Bildschirmspeicher holen und rotieren ; s_loop1: ld hl,text_koord ;Start-Koordinaten ld (xypos),hl ;setzen ld b,text_len ;Text-L{nge -> B s_loop2: push bc ;und sichern call read_screen ;Matrix lesen call rotate_matrix ;Matrix schieben call xfer_back ;Matrix zur}ck pop bc ;Text-L{nge zur}ck djnz s_loop2 ;und evtl. n. Zeichen call bios_userf ;Taste holen defw km_read_char jr nc,s_loop1 ;wdhl., wenn keine ;Taste jp 0 ;- sonst ende - ; ;read_screen - liest }ber die System-Routine SCR ;READ eine Matrix aus dem Bildschirmspeicher ; read_screen: ld hl,m_buffer ;Puffer-Adresse -> HL ld de,(xypos) ;Koordinaten (Z/S) -> DE push de ;und sichern call bios_userf ;Systemroutine aufrufen defw scr_read pop de ;Koordinaten zur}ck inc e ;Spalte +1 ld (xypos),de ;abspeichern ret ;und fertig ; ;invert_str - invertiert }ber die Systemroutine ;SCR CHAR INVERT einen Zeichen String im ;Bildschirmspeicher (B = L{nge) ; invert_str: push bc ;Zeichen-Anzahl sichern ld de,(xypos) ;Koordinaten holen push de ;sichern call bios_userf ;Systemroutine aufrufen defw scr_char_invert pop de ;Koordinaten zur}ck inc e ;Spalte +1 ld (xypos),de ;und wieder sichern pop bc ;L{nge holen djnz invert_str ;wdhl. f}r alle Zeichen ret ;- fertig - ; ; ;direct_out - gibt }ber die System-Routine SCR ;WRITE Zeichen aus. DE = Z/S-Koordinaten, HL -> ;Text, B = L{nge ; direct_out: push bc ;Register sichern push de push hl ld c,(hl) ;Zeichen -> C call bios_userf ;Systemroutine aufrufen defw scr_write pop hl ;anschl. Register zur}ck pop de pop bc inc hl ;Adresse auf n. Zeichen inc e ;Spalte +1 djnz direct_out ;und n. Zeichen ausgeben ret ;- fertig - ; ;rotate_matrix schiebt die Matrix eines Zeichens ;um eine Pixelspalte nach rechts ; rotate_matrix: ld hl,m_buffer ;Puffer-Adr. -> HL ld b,8 ;Anz. Matrix-Bytes ld a,(rbyte) ;letzte Pixel-Spalte r_loop: rla ;CY setzen rr (hl) ;CY -> Matrix inc hl ;HL -> n. Matrixbyte djnz r_loop ;f}r jedes Byte ;wiederh. rla ;CY -> A ld (rbyte),a ;letzte Spalte sichern ret ;- fertig - ; ;xfer_back - }bertr{gt die modifizierte Zeichen- ;matrix zur}ck in den Bildschirmspeicher ; xfer_back: ld de,(xypos) ;Koordinaten holen dec e ;Spalte -1 ld bc,scr_char_position ;}ber BC call bios_userf ;dir System-Routine ;aufrufen defw scr_call_bc ld hl,m_buffer ;HL -> Matrix-Puffer ld bc,xfer_matrix ;}ber BC und System- ;Routine call bios_userf ;Matrix in Bild- ;schirmspeicher defw scr_call_bc ;}bertragen ret ;- und fertig - ; dseg end_msg: defb 'Ende -> bitte Taste dr}cken ...' text: defb 'Test Test Test Test Test ' rbyte: defb 0 ;letzte Pixelspalte xypos: defw 0 ;Koordinaten f}r ;Ausgabe cseg end