Важная информация
RSS лента

Шынни

знакомство с zx80

Оценить эту запись
Нашлось время для изучения ветхой машинки

инфы нашлось не так уж и много, для начала попался этот тред

Взял для удобства TASM 3.1 и тут первая засада: ворох ошибок при компиляции.
Текст фиксится:

Код:
; Zac test ASM program #1
; (c) 2012 Zac
;

;#define         .BYTE .BYTE
;#define         .WORD .WORD
;#define         DEFM .TEXT
;#define         ORG  .ORG
;#define         EQU  .EQU

; ===========================================================
; Start of the Program
; ===========================================================

; Origin of a ZX81 file is always 16393

                .ORG 16393
                
; System variables.

VERSN:          .BYTE 0
E_PPC:          .WORD 2
D_FILE:         .WORD Display
DF_CC:          .WORD Display+1                  ; First character of display
VARS:           .WORD Variables
DEST:           .WORD 0
E_LINE:         .WORD BasicEnd 
CH_ADD:         .WORD BasicEnd+4                 ; Simulate SAVE "X"
X_PTR:          .WORD 0
STKBOT:         .WORD BasicEnd+5
STKEND:         .WORD BasicEnd+5                 ; Empty stack
BREG:           .BYTE 0
MEM:            .WORD MEMBOT
UNUSED1:        .BYTE 0
DF_SZ:          .BYTE 2
S_TOP:          .WORD $0002                      ; Top program line number
LAST_K:         .WORD $FDBF
DEBOUN:         .BYTE 15
MARGIN:         .BYTE 55
NXTLIN:         .WORD Line2                      ; Next line address
OLDPPC:         .WORD 0
FLAGX:          .BYTE 0
STRLEN:         .WORD 0
T_ADDR:         .WORD $0C8D
SEED:           .WORD 0
FRAMES:         .WORD $F5A3
COORDS:         .WORD 0
PR_CC:          .BYTE $BC
S_POSN:         .WORD $1821
CDFLAG:         .BYTE $40
PRBUFF:         ;.BYTE 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,$76 ; 32 Spaces + Newline
				.WORd 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
				.BYTE $76
MEMBOT:         .BYTE 0,0,0,0,0,0,0,0,0,0,$84,$20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; 30 zeros
UNUNSED2:       .WORD 0

; End of system variables

Program:        
Line1:          .BYTE $00,$01                    ; Line 1
                .WORD Line1End-Line1Text         ; Line 1 length
Line1Text:      .BYTE $EA                        ; REM             
   
; ===========================================================
; Insert your program here....
; ===========================================================

			LD 		A,1 				; start with 1
loop:										; label used for jump
			RST		10H		 			; PRINT 
			INC		A 					; increment A
			CP 		36 					; stop at 36
			JP 		NZ,loop			; if not 36, then goto/jump to LOOP
			RET 							; Return to BASIC

; Programme ├йquivalent en Basic
; 10 LET A = 1
; 20 PRINT CHR$(A)
; 30 LET A = A + 1
; 40 IF A <> 36 THEN GOTO 20
; 50 STOP

; ===========================================================
; That's it.  End of user program
; ===========================================================

                .BYTE $76                        ; Newline
Line1End:       
Line2:          .BYTE $00,$02                    ; Line 2
                .WORD Line2End-Line2Text
Line2Text:      .BYTE $F9,$D4                    ; RAND USR
                .BYTE $1D,$22,$21,$1D,$20        ; 16514
                .BYTE $7E                        ; Number
                .BYTE $8F,$01,$04,$00,$00        ; Numeric encoding
                .BYTE $76                        ; Newline
Line2End: 

Display:        .BYTE $76                        ; Newline
                .BYTE $76 ; Line 0
                .BYTE $76 ; Line 1
                .BYTE $76 ; Line 2
                .BYTE $76 ; Line 3
                .BYTE $76 ; Line 4
                .BYTE $76 ; Line 5
                .BYTE $76 ; Line 6
                .BYTE $76 ; Line 7
                .BYTE $76 ; Line 8
                .BYTE $76 ; Line 9 
                .BYTE $76 ; Line 10
                .BYTE $76 ; Line 11
                .BYTE $76 ; Line 12
                .BYTE $76 ; Line 13
                .BYTE $76 ; Line 14
                .BYTE $76 ; Line 15
                .BYTE $76 ; Line 16
                .BYTE $76 ; Line 17
                .BYTE $76 ; Line 18
                .BYTE $76 ; Line 19
                .BYTE $76 ; Line 20
                .BYTE $76 ; Line 21
                .BYTE $76 ; Line 22
                .BYTE $76 ; Line 23

; Variables area (empty)
Variables:      
VariablesEnd:   .BYTE $80
BasicEnd:                              
                      
#END
и получается готовый test.p
Сборка делается так:
tasm -80 -b -s main.asm TEST.P

Еще один облом - эмулятор EightyOne выдает не пойми что. Взял vb81, установил дополнительные библиотеки, программа запустилась.
Пока мало что понятно с исходным текстом, зачем используется NewLine($76)?
Попробую разобраться, вывод символов через rst 16 никак не решение.
Метки: coding, retro, zx80 Добавить / редактировать метки
Категории
Без категории

Комментарии

  1. Аватар для NEO SPECTRUMAN
    Цитата Сообщение от Шынни
    зачем используется NewLine($76)?
    дык это halt
    он же "конец строки" для экономии памяти
    ты же смотрел как(каким кодом) происходит рисование(низкоуровневое) экрана? (в eihtyone это прекрасно видно)

    загрузка с ленты дубовая
    всегда с одного адреса
    в начале ее куча системных переменных (я те кидал ссылки где они расжованы)
    Код:
    ---Begin of Save Area---
      4009   VERSN   Should be 00h to identify ZX81 cassette files (FFh=Lambda)
      400A   E_PPC   Line Number of currently selected line [>] Cursor
      400C   D_File  Pointer to Video Memory (BG Map) / End of Basic Program
      400E   DF_CC   Pointer to VRAM Address for PRINT
      4010   VARS    Pointer to BASIC Variables Area
      4012   DEST    Pointer to Variable when assigning a value to it
      4014   E_LINE  Pointer to Input Buffer/Workspace, and to --End of Save Area--
      4016   CH_ADD  Pointer to next interpreted character
      4018   X_PTR   Pointer to character prior to [S] Symbol (=Syntax Error) (or
                       ptr to aborted/breaked line)
      401A   STKBOT  Pointer to BASIC Calculator Stack / End of
                       Input Buffer/Workspace
      401C   STKEND  Pointer to bottom of Machine Stack / End of Calculator Stack
      401E   BERG    Calculator B-Register
      401F   MEM     Pointer to Calculator Memory (usually same as MEMBOT)
      4021   -       Not used
      4022   DF_SZ   Number of lines in lower display section (including 1 blank
                       line)
      4023   S_TOP   Line Number of first line for automatic LISTing
      4025   LAST_K  Keyboard - Recently pressed key (4025=row, 4026=shift/column)
      4027   DEBOUN  Keyboard - Debounce State (key release delay)
      4028   MARGIN  Vertical Border Height (55 lines at top/bottom for 50Hz,
                       31 for 60Hz)
      4029   NXTLIN  Address of next BASIC line which is to be executed,
                       pointing to a byte >=40h when stopped, indicates
                       autostart address in cassette files.
      402B   OLDPPC  Line Number for CONT
      402D   FLAGX   Various Flags
                       Bit0   used (purpose unknown)
                       Bit1   used (purpose unknown)
                       Bit2-4 not used
                       Bit5   used (purpose unknown)
                       Bit6   used (purpose unknown)
                       Bit7   not used
      402E   STRLEN  Length of string during assignment
      4030   T_ADDR  Pointer to next item in Syntax Table (or INPUT's old S_POSN)
      4032   SEED    Random Number Seed
      4034   FRAMES  Decrementing Video Frame Counter (Bit15: 0=PAUSE, ie.
                       display ON, program PAUSEd)
      4036   COORDS  X-Coordinate of last PLOT, Y-Coordinate of last PLOT
      4038   PR_CC   Least significant byte of PRBUFF printer buffer pointer
      4039   S_POSN  X-Coordinate for PRINT, Y-Coordinate for PRINT
      403B   CDFLAG  Various Flags
                      Bit7: Current Speed (1=SLOW (Display Enable), 0=FAST)
                      Bit6: Requested Speed (or old speed during
                        pause/cassette io, etc)
                      Bit5-1: Not used
                      Bit0: Keystroke (0=None, 1=Yes)
      403C   PRBUFF  Printer Buffer 32 characters + NEWLINE (76h)
      405D   MEMBOT  Default workspace for BASIC Calculator
      407B   -       Not used (2 bytes)
    там же задается адрес видео памяти
    по этому добавляется вот это
    Код:
    Display:        .BYTE $76                        ; Newline
                    .BYTE $76 ; Line 0
                    .BYTE $76 ; Line 1
                    .BYTE $76 ; Line 2
                    .BYTE $76 ; Line 3
                    .BYTE Line 4
    видео память которая появится на экране сразу после загрузки программы

    а eightyone отличный эмуль
    но отладчик в нем дубовый неимоверно
    и во время дебаганья не происходит нормальная отрисовка происходящего
    только рисуемая в этот момент строка обновляется и расположенная она всегда в самом верху


    ЗЫ у zx80 все совсем по другому
    zx80 и zx81 не совместимы в плане загрузки своего кода в память
    хотя без лишних обращений к пзу совместимую для обоих машин прогу написать можно

    да и pseudo hires для каждой машины нужно делать по своему...
    да и стандартные шрифты по моему не очень совместимы между собой...
    Обновлено 13.07.2017 в 15:22 NEO SPECTRUMAN
  2. Аватар для Шынни
    NEO SPECTRUMAN,спасибо, нашел эту инфу. EightyOne никак не ест эти .p (

    Кстати, а реально сделать двойной буффер, записывая значения в D_File?
  3. Аватар для NEO SPECTRUMAN
    Цитата Сообщение от Шынни
    Кстати, а реально сделать двойной буффер, записывая значения в D_File?
    Попробуй (я не делал)
    Лучше вообще отказаться от ПЗУ (практически)
    и рисовать что хош своей процедурой
    хоть двойной буффер
    хоть тройной
    хоть восьмерной...
    хоть аппаратный скролл по 2-м осям(по крайней мере по одной полноценный)

    правда памяти маловато у стоковой машины для этого...
    Обновлено 13.07.2017 в 16:27 NEO SPECTRUMAN
  4. Аватар для NEO SPECTRUMAN
    Кстате там у буржуев есть всякие доработки для zx81
    для сокращения времени простоя проца при выполнении прерывания (что то такое)

    так что
    совмещать в одном кадре строки нарисованный без прерываний (просто с точной растактовкой на 207 тактов)
    и строки с синхронизацией по инту

    думаю, в расчете на работоспособность на таких машинах, не сильно безопасно...
    яхз когда появилась эта доработка и на каком количестве машин она применена


    а может это было для новодельных zx80 расширенных до zx81
    не могу найти статью щас...
    Обновлено 13.07.2017 в 16:45 NEO SPECTRUMAN
  5. Аватар для Шынни
    ок попробую, как время будед
  6. Аватар для NEO SPECTRUMAN
    У меня твой сорец запустился из коробки в eightyone
    при том я скомпилировал sjasm-ом

    короче на вид мож менять когда захочеш
    пзу те даже vsync сделает

    Код:
        device zxspectrum48
        org $4009
    
    VERSN:          defb 0
    E_PPC:          defw 2
    D_FILE:         defw Display
    DF_CC:          defw Display+1                  ; First character of display
    VARS:           defw Variables
    DEST:           defw 0
    E_LINE:         defw BasicEnd 
    CH_ADD:         defw BasicEnd+4                 ; Simulate SAVE "X"
    X_PTR:          defw 0
    STKBOT:         defw BasicEnd+5
    STKEND:         defw BasicEnd+5                 ; Empty stack
    BREG:           defb 0
    MEM:            defw MEMBOT
    UNUSED1:        defb 0
    DF_SZ:          defb 2
    S_TOP:          defw $0002                      ; Top program line number
    LAST_K:         defw $FDBF
    DEBOUN:         defb 15
    MARGIN:         defb 55
    NXTLIN:         defw Line2                      ; Next line address
    OLDPPC:         defw 0
    FLAGX:          defb 0
    STRLEN:         defw 0
    T_ADDR:         defw $0C8D
    SEED:           defw 0
    FRAMES:         defw $F5A3
    COORDS:         defw 0
    PR_CC:          defb $BC
    S_POSN:         defw $1821
    CDFLAG:         defb $40
    PRBUFF:         ;defb 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,$76 ; 32 Spaces + Newline
                    defw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
                    defb $76
    MEMBOT:         defb 0,0,0,0,0,0,0,0,0,0,$84,$20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; 30 zeros
    UNUNSED2:       defw 0
    
    ; End of system variables
    
    Program:        
    Line1:          defb $00,$01                    ; Line 1
                    defw Line1End-Line1Text         ; Line 1 length
    Line1Text:      defb $EA                        ; REM             
       
    ; ===========================================================
    ; Insert your program here....
    
    
    lppp    ld hl,Display
        ld (D_FILE),hl
        ld hl,Display2
        ld (D_FILE),hl
        jp lppp
    
    ; ===========================================================
    
                LD         A,1                 ; start with 1
    loop:                                        ; label used for jump
                RST        $10                     ; PRINT 
                INC        A                     ; increment A
                CP         36                     ; stop at 36
                JP         NZ,loop            ; if not 36, then goto/jump to LOOP
                RET                             ; Return to BASIC
    
    ; Programme +йquivalent en Basic
    ; 10 LET A = 1
    ; 20 PRINT CHR$(A)
    ; 30 LET A = A + 1
    ; 40 IF A <> 36 THEN GOTO 20
    ; 50 STOP
    
    ; ===========================================================
    ; That's it.  End of user program
    ; ===========================================================
    
                    defb $76                        ; Newline
    Line1End:       
    Line2:          defb $00,$02                    ; Line 2
                    defw Line2End-Line2Text
    Line2Text:      defb $F9,$D4                    ; RAND USR
                    defb $1D,$22,$21,$1D,$20        ; 16514
                    defb $7E                        ; Number
                    defb $8F,$01,$04,$00,$00        ; Numeric encoding
                    defb $76                        ; Newline
    Line2End: 
    
    Display:        defb $76                        ; Newline
                    defb $76 ; Line 0
                    defb $76 ; Line 1
                    defb $76 ; Line 2
                    defb $76 ; Line 3
                    defb $76 ; Line 4
                    defb $76 ; Line 5
                    defb $76 ; Line 6
                    defb $76 ; Line 7
                    defb $76 ; Line 8
                    defb $76 ; Line 9 
                    defb $76 ; Line 10
                    defb $20,$21,$22,$23,$24,$25,$76 ; Line 11
                    defb $76 ; Line 12
                    defb $76 ; Line 13
                    defb $76 ; Line 14
                    defb $76 ; Line 15
                    defb $76 ; Line 16
                    defb $76 ; Line 17
                    defb $76 ; Line 18
                    defb $76 ; Line 19
                    defb $76 ; Line 20
                    defb $76 ; Line 21
                    defb $76 ; Line 22
                    defb $76 ; Line 23
    
    Display2:        defb $76                        ; Newline
                    defb $76 ; Line 0
                    defb $76 ; Line 1
                    defb $76 ; Line 2
                    defb $76 ; Line 3
                    defb $76 ; Line 4
                    defb $76 ; Line 5
                    defb $20,$21,$22,$23,$24,$25,$76 ; Line 11
                    defb $76 ; Line 7
                    defb $76 ; Line 8
                    defb $76 ; Line 9 
                    defb $76 ; Line 10
                    defb $20,$21,$22,$23,$24,$25,$76 ; Line 11
                    defb $76 ; Line 12
                    defb $76 ; Line 13
                    defb $76 ; Line 14
                    defb $76 ; Line 15
                    defb $76 ; Line 16
                    defb $76 ; Line 17
                    defb $20,$21,$22,$23,$24,$25,$76 ; Line 11
                    defb $76 ; Line 19
                    defb $76 ; Line 20
                    defb $76 ; Line 21
                    defb $76 ; Line 22
                    defb $76 ; Line 23
    
    ; Variables area (empty)
    Variables:      
    VariablesEnd:   defb $80
    BasicEnd:                              
                          
    endfile
    
    
        savebin "1.p", $4009, endfile
  7. Аватар для NEO SPECTRUMAN

    последний eightyone
    брать тут
    https://sourceforge.net/projects/eig...lair-emulator/
  8. Аватар для Шынни
    не качается Eighty One ( К чему такой замысловатый формат .p?
  9. Аватар для NEO SPECTRUMAN
    Цитата Сообщение от Шынни
    не качается
    ага что то да...
    ...
    щас скачал от туда же с зеркала free France.

    ...
    только там не оказалось нужных пзу-шек
    закинул со старой версии

    ...а дебагер как был никаким
    так и остался...
    Обновлено 13.07.2017 в 18:05 NEO SPECTRUMAN
  10. Аватар для NEO SPECTRUMAN
    Цитата Сообщение от Шынни
    ( К чему такой замысловатый формат .p?
    по моему это тоже самое что сказать
    К чему такой замысловатый формат gb?
    или например rk
    ...тысячи их

Трекбэков