Autore Topic: Rilocare Schermo/caratteri  (Letto 1090 volte)

iAN CooG

  • Utente
  • **
  • Post: 1774
    • http://iancoog.altervista.org
  • Gioco Preferito: Turbo Assembler, ActionReplay Monitor, DiskDemon
Rilocare Schermo/caratteri
« il: 06 Giugno 2004, 01:22:21 »
 Premessa: Continuo a postare un altro sorgente, sperando che altri facciano lo stesso.

Come collaboratore esterno di Papposoft :P ho scritto questa routine per poter rilocare lo schermo a $c000 anziche' $0400 (1024), convertendo in asm alcuni esempi in Basic sul Programmer's Reference Guide.
Poco fa ho riscritto la parte che ricopia il charset per risparmiare un po' di bytes.
Codice: [Seleziona]
;**********************************************************
; Set charset at $C000, screen at $C800; C64ASM version
; -=[iAN CooG/HokutoForce]=- for Piti/Papposoft
;**********************************************************

BANK    =   3
CHARROM =   $D000
BANKBASE=   (BANK*$4000)
CHAROFF =   $0000
CHARSET =   BANKBASE+CHAROFF
SCREENOFF=  $0800
SCREEN  =   BANKBASE+SCREENOFF

TEST = 1  ; 1 to create a test prg,
          ; 0 for callable routines @ $8000/$8003

;**********************************************************
.IF TEST = 0 .GOTO not1
*=$801
    .word eob
    .word $1bbe
    .byte $9e
    .text "2061"
eob
*=$80d
.GOTO not2

.LABEL not1

*=$8000

.LABEL not2

        JMP change
        JMP normal

;**********************************************************

change
        SEI

      ;LDA $DC0E; are these needed in BASIC?
      ;AND #$FE; I think here only a SEI is enough
      ;STA $DC0E

        LDA $DD02
        ORA #$03
        STA $DD02

        LDA $DD00
        AND #$FC
        ORA #(3-BANK); switch bank: 3 = bank0 so 0 = bank3
        STA $DD00

        LDA #>SCREEN
        STA $0288

        LDA #$33
        STA $01

        ; copy the 2048 bytes of Upper/graphics charset
        ; 34 bytes version  ; 53 bytes version
        ;                  ;        LDY #0
        LDA #<CHARROM      ;loop1
        STA $5F            ;        LDA CHARROM,y
        LDA #>CHARROM      ;        STA CHARSET,y
        STA $60            ;        LDA CHARROM+$100,y
        LDA #<CHARSET      ;        STA CHARSET+$100,y
        STA $58            ;        LDA CHARROM+$200,y
        LDA #>CHARSET      ;        STA CHARSET+$200,y
        STA $59            ;        LDA CHARROM+$300,y
        LDX #8; 8*256=2048  ;        STA CHARSET+$300,y
        LDY #0              ;        LDA CHARROM+$400,y
loop1                      ;        STA CHARSET+$400,y
        LDA ($5f),y        ;        LDA CHARROM+$500,y
        STA ($58),y        ;        STA CHARSET+$500,y
        DEY                ;        LDA CHARROM+$600,y
        BNE loop1          ;        STA CHARSET+$600,y
        INC $60            ;        LDA CHARROM+$700,y
        INC $59            ;        STA CHARSET+$700,y
        DEX                ;        DEY
        BNE loop1          ;        BNE loop1

        LDA #$37
        STA $01

      ; Highnibble:screen pos , lownibble:charset,
      ; see P.R.G. chapt 3
        LDA #((SCREENOFF/$40)+(CHAROFF/$400))
        STA $D018

      ;LDA $DC0E
      ;ORA #$01
      ;STA $DC0E

        CLI
;**********************************************************
.IF TEST = 0 .GOTO not3
      ;just for test
        LDY #(endtext-press-1)
p1
        LDA press,y
        STA SCREEN,y
        DEY
        BPL p1
k
        JSR $ffe4
        BEQ k
        JSR $e544
        LDY #(endtext-text-1)
p2
        LDA text,y
        STA SCREEN,y
        DEY
        BPL p2
      ; Patch to write real screen address
        LDA #>SCREEN
        JSR dexit
        STX SCREEN+(patchit-text)
        STA SCREEN+(patchit-text)+1
k2      
        JSR $ffe4
        BEQ k2

.LABEL not3

        RTS

;**********************************************************
normal
        SEI
        LDA $DD02
        ORA #$03
        STA $DD02

        LDA $DD00
        AND #$FC
        ORA #3
        STA $DD00
        LDA #04
        STA $0288

        LDA #(($0400/$40)+($1000/$400))
        STA $D018
        CLI
        RTS
;**********************************************************
.IF TEST = 0 .GOTO not4
text
        .SCRU "SCREEN NOW:$"
patchit
        .SCRU "0000"
        .SCRU "! SYS 2064 back to $0400"
press
        .SCRU "Press a key"
endtext
;**********************************************************
dexit
        PHA
        LSR
        LSR
        LSR
        LSR
        JSR check
        TAX
next
        PLA
        AND #$0f
        JSR check
        RTS

check
        CMP #$0a
        BCS hex
        CLC
        ADC #$30
        RTS
hex
        SEC
        SBC #$09; screencodes: A=$01
        RTS
.LABEL not4

Compilare con C64ASM di Balint Toth.
http://tothb.ehc.hu/software/c64asm1a.zip

lo so, dovrei usare dasm/acme/64tass/ca65 ma ormai sono abituato con quello :)
-=[]=--- iAN CooG/HVSC^C64Intros ---=[]=-
- http://hvsc.c64.org - http://intros.c64.org -

Alberto

  • Utente
  • **
  • Post: 589
  • Gioco Preferito: Grand Prix Circuit
Rilocare Schermo/caratteri
« Risposta #1 il: 06 Giugno 2004, 11:04:43 »
 Ottimo esempio di conversione Basic-LM :)
Citazione
Continuo a postare un altro sorgente, sperando che altri facciano lo stesso.
Perchè non dedicare una sezione alle routine di utilità scritte in linguaggio macchina? :)
Secondo me sarebbe molto più facile andarle a prendere cercandole in una sezione apposita,che avendole sparpagliate qua e là nei thread di questa sezione.  

iAN CooG

  • Utente
  • **
  • Post: 1774
    • http://iancoog.altervista.org
  • Gioco Preferito: Turbo Assembler, ActionReplay Monitor, DiskDemon
Rilocare Schermo/caratteri
« Risposta #2 il: 06 Giugno 2004, 16:41:38 »
Citazione da: "Alberto"
Perchè non dedicare una sezione alle routine di utilità scritte in linguaggio macchina? :)
 
Bisogna vedere se il numero di post a riguardo ne giustifichi la creazione ;)
-=[]=--- iAN CooG/HVSC^C64Intros ---=[]=-
- http://hvsc.c64.org - http://intros.c64.org -

Roberto

  • Administrator
  • Utente
  • *****
  • Post: 2379
    • http://ready64.org
  • Gioco Preferito: Impossible Mission
Rilocare Schermo/caratteri
« Risposta #3 il: 09 Giugno 2004, 18:37:22 »
 
Citazione da: "iAN CooG/HF"
Citazione da: "Alberto"
Perchè non dedicare una sezione alle routine di utilità scritte in linguaggio macchina? :)
 
Bisogna vedere se il numero di post a riguardo ne giustifichi la creazione ;)
Ian, ti invito a non demordere. ;)
In questo forum ci sono già molte persone con cui poter dialogare di programmazione: Alberto, Marcello, Med, Stefano Tognon (eccezionale il suo diario online di great sara sister) e magari altri si uniranno in seguito... dopotutto la sezione è ancora giovane e quindi poco conosciuta per il momento.
Magari un giorno torneranno anche Mr. Fox e Luigi Di Fraia ed allora potrebbero nascere veramente degli spunti interessanti e soprattutto utili anche in futuro a tutti quelli che vorranno cimentarsi.

Per quanto mi rigurda, mie conoscenze mi elevano faticosamente al rango di schiappa, ma nonostante ciò voglio comunque dare il mio apporto alla causa; vi comunico che a breve pubblicherò le prime scansioni di Commodore Computer Club, rivista che ha presentato, nel corso della sua vita editoriale, tantissimi articoli sulla programmazione, con listati, spiegazioni, tutorial eccetera.
Spero che questa sezione dia a tutti voi un nuovo impulso per continuare nella vostra opera, quella di programmare una macchina di 20 anni fa :)
Per collaborare, segnalare un errore (o qualsiasi altra comunicazione importante) utilizzare la pagina dei contatti:
http://ready64.org/informazioni/contatti.php