эмуляция Jupiter Ace

 


Давно собирался с незавершенным вопросом. Проблема была в том, что не удавалось собрать файл в .tap, который умеет компилировать zasm. Раньше ассемблер раздавался только под линупс, и скомпилировать в Win32 мне не удалось. Автор на заданный вопрос ответил, что не умеет. Теперь появилась версия 4.4 и 64бит. Забавно, что собраны не пойми как, запускаются с cygwin.dll.

Нашлись готовые примеры. Документация и другая инфа лежит на сайте. Эмуляторов нашлось немало: SpudAce с убогим дизайном и кривым отладчиком. EightyOne с неудобным отладчиком. Есть и новый - InkSpector 64bit, он как-то вяло читал .tap.

Первая программа(изменил код):

семиграфика(которая блочная) просто ахтунг
; ================================================================
;   Source for target 'tap'
;   ZASM Tape file for Jupiter ACE - BINARY files
;
;   Basen on TAP file template for ZX Spectrum by kio@little-bat.de
;
;   Copyright (c) McKlaud 2020
;
;   Change log:
;
;   v.0.3 - 7/10/2020 - naming, comments (kio)
;   v.0.2 - 7/10/2020 - spelling corrections and housekeeping
;   v.0.1 - 1/10/2020 - first release
;
; ================================================================
;
; fill byte is 0x00
; #code has an additional argument: the block type (flag byte) for the block.
; Since ZASM 4.2.0 the flag byte in #CODE must be set to NONE for ACE TAPs.
; The assembler calculates and appends checksum byte to each segment.
; Note: If a segment is appended without an explicite address, then the sync
; byte and the checksum byte of the preceding segment are not counted when
; calculating the start address of this segment.
;
; Compile with ZASM v 4.2.x or above
; zasm --z80 --dotnames -uwy source.asm target.tap
;
; --z80       - traget Zilog Z80 (default)
; --dotnames  - allow label names starting with a dot '.' - if needed
; -b          - write output in binary file (default)
; -u          - include object code in list file
; -w          - append label listing to list file
; -y          - include cpu clock cycles in list file
;
; zasm -uwy source.asm target.tap
;
; Load with:
;   0 0 bload binary
;
; Run the code with:
;   16000 call
;
; ================================================================

startadr        equ     $3E80           ; Start address for BIN files; e.g. 16000

;------------------
; BIN file definition
;------------------
headerlength    equ     25              ; neither block type (flag byte) nor CRC byte included
filetype        equ     $20             ; 0x20 = BINARY file type

;------------------
; Default values of system variables
;------------------
v_c_link        equ     $2020
v_current       equ     $2020
v_context       equ     $2020
v_voclink       equ     $2020
v_stkbot        equ     $2020

;------------------
; ROM routines
;------------------
CLS             equ     $0A24           ; Clear Screen

#target TAP

#code TAP_HEADER, 0, headerlength, flag=NONE
; Jupiter ACE TAP header structure:

;               defw    headerlength    ; 2 bytes: always 25 bytes (0x1A) for JACE - added by ZASM
                defb    filetype        ; 1 byte:  File Type
                defb    "binary    "    ; 10 bytes: the file name
;                       |----------|     <<< Keep it exactly 10 chars long!
                defw    CODE_DATA_size  ; 2 bytes: File Length
                defw    startadr        ; 2 bytes: Start Address
                defw    v_c_link        ; 2 bytes: current word link (NOT USED)
                defw    v_current       ; 2 bytes: CURRENT (NOT USED)
                defw    v_context       ; 2 bytes: CONTEXT (NOT USED)
                defw    v_voclink       ; 2 bytes: VOCLINK (NOT USED)
                defw    v_stkbot        ; 2 bytes: STKBOT (NOT USED)
;               defb    checksum        ; 1 byte: Header Block CheckSum - added by ZASM


#code CODE_DATA, startadr, *, flag=NONE
;               defw    CODE_DATA_size  ; 2 bytes: TAP 2nd chunck size - added by ZASM

; BIN block starts here

;------------------------------
; --  Z80 assembler code and data starting at 'startadr'

         call    CLS            ; call 'CLS' in ROM

ld hl,$2400
mm ld (hl),l
inc l
jr nz,mm
                jp      (iy)           ; return to forth

; --- END ---
endadr          equ     $

;               defb    checksum       ; 1 byte: CODE_DATA Block CheckSum - added by ZASM
#end                                   ; code blocks END

компиляция:

zasm --z80 --dotnames -uwy BIN_template.asm target.tap

Как загрузить и запустить написано в комментариях. Заодно обнаружил у двух эмуляторов опцию чтения бинаря и пересел на ужасм. Разобраться с контрольной суммой мне не удалось.

Почитал доки - экран расположен по адресу $2400, 32x24 символа. Данные символов хранятся по адресу $2C00, причем работает только запись, а не чтение - над этим я тупил весь вечер, разбираясь с кодом и не понимая, почему не работает очистка с помощью LDIR. Вернее заполняет байтом $FF.

Генерируются узоры так:
 ld hl,$2c00
 ld de,$2c78
 ld c,l ;ld c,0 ; value
m1 push bc
m2 ld (hl),c
 ld a,c
 ld (de),a
 inc de
 sla c
 inc l
 ld a,l
 and 7
 jr nz,m2
 ex de,hl
 ld bc,16
 or a
 sbc hl,bc
 ex de,hl
 pop bc
 scf
 rr c
 bit 6,l
 jr z,m1

На основе набора символов написал простенький эффект, но публиковать не буду.
Стал читать дизассемблер ROM, получилось так, что вызывать процедуру построения точки сложно. Поэтому переписал код
 device zxspectrum128
 org 16000
begin
; call $0A24 ; CLS routine
; x,y,n plot
;n=0-unplot,1-plot,2-move,3-change(?)
ld de,$0101
tp:
push de
;--------------------------------
ld c,1
srl e ;Y
rl c
ld a,$16
sub e
srl d ;X
rl c
;CALL    L0B28
L0B28:  ADD     A,$20
        LD      L,A
        LD      H,$01
        ADD     HL,HL
        ADD     HL,HL
        ADD     HL,HL
        ADD     HL,HL
        ADD     HL,HL
        LD      D,$00
        LD      A,E
        AND     $1F
        LD      E,A
        ADD     HL,DE
;;;;
        LD      A,(HL)
        AND     $78                     ; 01111000
        CP      $10
        LD      A,(HL)
        JR      Z,L0B6F                 ;

        LD      A,$10

L0B6F:  LD      E,A
        LD      D,$87
        LD      A,C
        AND     $03
        LD      B,A
        JR      Z,L0B7F                 ;

        CPL

        ADD     A,$02
        ADC     A,$03
        LD      D,A
        LD      B,E
L0B7F:  LD      A,C
        RRCA
        RRCA
        RRCA
        SBC     A,A
        BIT     3,C
        JR      NZ,L0B8C                ;
        XOR     E
        RLCA
        SBC     A,A
        XOR     B

L0B8C:  AND     D
        XOR     E
        LD      (HL),A
;--------------------------------
pop de
inc e
inc d
bit 5,e
jp z,tp
 jr $
end
 savebin "tt.bin",begin,end-begin
 

Остались еще другие, неясные нюансы. Надеюсь, что разберусь с вопросами, изучая примеры.
Надо написать какую-нить простую игрушку.




Комментарии