Сброс портов и данных ТС

CALL'ы и RET'ы

Postby VBI » Wed, 02.07.2014 01:43:34

В общем, не буду описывать технические сложности, которые привели к текущей ситуации.
Ясно, что технически это решаться не будет по причине наличия отсутствия места под иниты.
Будем их решать :boxing:

Итак.
Что делаем, если ваша ТС-программа после сброса начинает показывать что-то не то?
Первое - необходимо установить порты отображения Х и У разных плоскостей в начальное положение:
Code: Select all
      ld e,8
      ld b,#40
      call clr_port
      ld b,#02
      ld e,4
       call clr_port

clr_port   out (c),a
      inc b
      dec e
      jr nz,$-4
      ret


вторая замеченная фигня - данные о спрайтах остаются в SFILE. Мне очень понравился подход к программированию портов от DDp, и я его немного усовершенствовал по своему разумению.
Итак, боремся тем, что засылаем 3 leap в начале демы:
Code: Select all
      ld hl,spr_init
      call set_ports

set_ports   ld c,#af
      ld a,(hl)
      cp #ff
      jr z,dma_stats
      ld b,a
      inc hl
      ld a,(hl)
      inc hl
      out (c),a
      jr set_ports+2

dma_stats   ld bc,DMASTATUS
      in a,(c)
      AND #80
      jr nz,$-4
      ret

spr_init
      defb    #1a,low spr_ex
           defb    #1b,high spr_ex
      defb    #1c,2
           defb    #1d,0
           defb    #1e,2
           defb    #1f,0
           defb    #26,3*6
           defb    #28,0
      db    #27,#85
      db #ff

spr_ex   DB 0
      DB %01000000   ; leap
      DB 0
      DB %00010000
      DB 0
      DB %11100000

      DB 0
      DB %01000000   ; leap
      DB 0
      DB %00010000
      DB 0
      DB %11100000

      DB 0      ;exit
      DB %01000000   ; leap
      DB 0
      DB %00010000
      DB 0
      DB %11100000
Last edited by VBI on Wed, 02.07.2014 13:15:12, edited 1 time in total.
User avatar
VBI
 
Posts: 1965
Joined: Mon, 03.06.2013 09:20:29

Postby TS-Labs » Wed, 02.07.2014 02:32:06

Лучше всего просто нулить массивы и реги.
И дело не в отсутствии места под иниты, их можно сделать программно и в биосе. Дело в том, что программер никогда не должен рассчитывать, что его софт будет запущен из биоса - он может быть запущен из-под чего угодно.
Пример: плагин скринсейвера из ВЦ юзает спрайты. Юзер из того же ВЦ запускает дему, которая не инитит железо. Фейл.
Из ситуации 2 выхода: либо делать принудительный инит во всех на свете запускаторах, но тогда программеры совсем обленятся, а кто-нить забудет написать инит в запускателе и фейл. Либо пользовать инит (написать стандартный и юзать его всю жизнь) в каждом софте/части, чтоб быть уверенным в успехе.
User avatar
TS-Labs
 
Posts: 5398
Joined: Thu, 26.07.2012 01:29:56

Postby VBI » Wed, 02.07.2014 11:33:36

в моём примере всё что нужно инитится, или есть ещё подводные камни?
инитим от #40 до #47 (позиции тайловых плоскостей) и от #02 по #06 (позиции графики), плюс очищаем спрайты (можно проще? я не намудрил с leap ? )
User avatar
VBI
 
Posts: 1965
Joined: Mon, 03.06.2013 09:20:29

Postby Sergey78 » Wed, 02.07.2014 11:46:55

VBI wrote: ld e,7

Надо 8.
Sergey78
 
Posts: 422
Joined: Wed, 05.09.2012 20:04:40

Postby VBI » Wed, 02.07.2014 13:14:57

Sergey78, спасибо
поправил везде
User avatar
VBI
 
Posts: 1965
Joined: Mon, 03.06.2013 09:20:29

Postby TS-Labs » Thu, 17.07.2014 02:58:48

Код для инициализации портов скролок и нуления спрайтовых дескрипторов:
Code: Select all
    device zxspectrum48
   include "tsconfig.asm"

   org $8000

    ld bc, FMADDR
    ld a, FM_EN
    out (c), a      ; open FPGA arrays at #0000
   
    ; clean SFILE
    ld hl, FM_SFILE
    xor a
l1  ld (hl), a
    inc l
    jr nz, l1
    inc h
l2  ld (hl), a
    inc l
    jr nz, l2
   
    out (c), a      ; close FPGA arrays at #0000
   
   ; zeroing scrollers to avoid surprises from previous usage
   ld b, high GXOFFSL : out (c), a
   ld b, high GXOFFSH : out (c), a
   ld b, high GYOFFSL : out (c), a
   ld b, high GYOFFSH : out (c), a
   ld b, high T0XOFFSL : out (c), a
   ld b, high T0XOFFSH : out (c), a
   ld b, high T0YOFFSL : out (c), a
   ld b, high T0YOFFSH : out (c), a
   ld b, high T1XOFFSL : out (c), a
   ld b, high T1XOFFSH : out (c), a
   ld b, high T1YOFFSL : out (c), a
   ld b, high T1YOFFSH : out (c), a
   
   output "example03.bin"

Инклуд:
Code: Select all
; ------- definitions

; -- TS-config port regs

VCONFIG         equ $00AF
STATUS          equ $00AF
VPAGE           equ $01AF
GXOFFSL         equ $02AF
GXOFFSH         equ $03AF
GYOFFSL         equ $04AF
GYOFFSH         equ $05AF
TSCONFIG        equ $06AF
PALSEL          equ $07AF
BORDER          equ $0FAF
PAGE0           equ $10AF
PAGE1           equ $11AF
PAGE2           equ $12AF
PAGE3           equ $13AF
FMADDR          equ $15AF
TMPAGE          equ $16AF
T0GPAGE         equ $17AF
T1GPAGE         equ $18AF
SGPAGE          equ $19AF
DMASADDRL       equ $1AAF
DMASADDRH       equ $1BAF
DMASADDRX       equ $1CAF
DMADADDRL       equ $1DAF
DMADADDRH       equ $1EAF
DMADADDRX       equ $1FAF
SYSCONFIG       equ $20AF
MEMCONFIG       equ $21AF
HSINT           equ $22AF
VSINTL          equ $23AF
VSINTH          equ $24AF
DMALEN          equ $26AF
DMACTR          equ $27AF
DMASTATUS       equ $27AF
DMANUM          equ $28AF
FDDVIRT         equ $29AF
INTMASK         equ $2AAF
T0XOFFSL        equ $40AF
T0XOFFSH        equ $41AF
T0YOFFSL        equ $42AF
T0YOFFSH        equ $43AF
T1XOFFSL        equ $44AF
T1XOFFSH        equ $45AF
T1YOFFSL        equ $46AF
T1YOFFSH        equ $47AF

; TS parameters
FM_EN           equ $10

; FPGA arrays
FM_CRAM         equ $0000
FM_SFILE        equ #0200

; VIDEO
VID_256X192     equ $00
VID_320X200     equ $40
VID_320X240     equ $80
VID_360X288     equ $C0
VID_RASTER_BS   equ 6

VID_ZX          equ $00
VID_16C         equ $01
VID_256C        equ $02
VID_TEXT        equ $03
VID_NOGFX       equ $20
VID_MODE_BS      equ 0

; PALSEL
PAL_GPAL_MASK   equ $0F
PAL_GPAL_BS      equ 0
PAL_T0PAL_MASK   equ $30
PAL_T0PAL_BS   equ 4
PAL_T1PAL_MASK   equ $C0
PAL_T1PAL_BS   equ 6

; TSU
TSU_T0ZEN      equ $04
TSU_T1ZEN      equ $08
TSU_T0EN      equ $20
TSU_T1EN      equ $40
TSU_SEN         equ $80

; SYSTEM
SYS_ZCLK3_5      equ $00
SYS_ZCLK7      equ $01
SYS_ZCLK14      equ $02
SYS_ZCLK_BS      equ 0

SYS_CACHEEN      equ $04

; MEMORY
MEM_ROM128      equ $01
MEM_W0WE      equ $02
MEM_W0MAP_N      equ $04
MEM_W0RAM      equ $08

MEM_LCK512      equ $00
MEM_LCK128      equ $40
MEM_LCKAUTO      equ $80
MEM_LCK1024      equ $C0
MEM_LCK_BS      equ 6

; INT
INT_VEC_FRAME   equ $FF
INT_VEC_LINE   equ $FD
INT_VEC_DMA      equ $FB

INT_MSK_FRAME   equ $01
INT_MSK_LINE   equ $02
INT_MSK_DMA      equ $04

; DMA
DMA_WNR         equ $80
DMA_SALGN       equ $20
DMA_DALGN       equ $10
DMA_ASZ         equ $08

DMA_RAM         equ $01
DMA_BLT         equ $81
DMA_FILL       equ $04
DMA_SPI_RAM     equ $02
DMA_RAM_SPI     equ $82
DMA_IDE_RAM     equ $03
DMA_RAM_IDE     equ $83
DMA_RAM_CRAM    equ $84
DMA_RAM_SFILE   equ $85

; SPRITES
SP_XF         equ $80
SP_YF         equ $80
SP_LEAP         equ $40
SP_ACT         equ $20

SP_SIZE8      equ $00
SP_SIZE16      equ $02
SP_SIZE24      equ $04
SP_SIZE32      equ $06
SP_SIZE40      equ $08
SP_SIZE48      equ $0A
SP_SIZE56      equ $0C
SP_SIZE64      equ $0E
SP_SIZE_BS      equ 1

SP_PAL_MASK      equ $F0

SP_XF_W         equ $8000
SP_YF_W         equ $8000
SP_LEAP_W      equ $4000
SP_ACT_W      equ $2000

SP_SIZE8_W      equ $0000
SP_SIZE16_W      equ $0200
SP_SIZE24_W      equ $0400
SP_SIZE32_W      equ $0600
SP_SIZE40_W      equ $0800
SP_SIZE48_W      equ $0A00
SP_SIZE56_W      equ $0C00
SP_SIZE64_W      equ $0E00
SP_SIZE_BS_W   equ 9

SP_X_MASK_W      equ $01FF
SP_Y_MASK_W      equ $01FF
SP_TNUM_MASK_W   equ $0FFF
SP_PAL_MASK_W   equ $F000

; TILES
TL_XF         equ $40
TL_YF         equ $80
TL_PAL_MASK      equ $30
TL_PAL_BS      equ 4

TL_XF_W         equ $4000
TL_YF_W         equ $8000

TL_TNUM_MASK_W   equ $0FFF
TL_PAL_MASK_W   equ $3000
TL_PAL_BS_W      equ 12
User avatar
TS-Labs
 
Posts: 5398
Joined: Thu, 26.07.2012 01:29:56

Postby amixgris » Mon, 09.02.2015 08:34:28

Массив нулей и OUTI/OUTD вам в помощь.
User avatar
amixgris
 
Posts: 161
Joined: Mon, 30.07.2012 03:22:48
LOCATION: Самара


Return to Coding

Who is online

Users browsing this forum: No registered users and 1 guest

cron

x