Crazy-Blaster/Crazy Updater/UPDATER.ASM
2024-07-31 03:29:05 +10:00

2360 lines
47 KiB
NASM
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

; ÛÛÛÛÛÛÛ»ÛÛ» ÛÛÛÛÛ» ÛÛÛÛÛÛÛ»ÛÛ» ÛÛ»ÛÛÛÛÛÛÛ»ÛÛÛÛÛÛ»
; ÛÛÉÍÍÍͼÛÛº ÛÛÉÍÍÛÛ»ÛÛÉÍÍÍͼÛÛº ÛÛºÛÛÉÍÍÍͼÛÛÉÍÍÛÛ»
; ÛÛÛÛÛ» ÛÛº ÛÛÛÛÛÛÛºÛÛÛÛÛÛÛ»ÛÛÛÛÛÛÛºÛÛÛÛÛ» ÛÛÛÛÛÛɼ
; ÛÛÉÍͼ ÛÛº ÛÛÉÍÍÛÛºÈÍÍÍÍÛÛºÛÛÉÍÍÛÛºÛÛÉÍͼ ÛÛÉÍÍÛÛ»
; ÛÛº ÛÛÛÛÛÛÛ»ÛÛº ÛÛºÛÛÛÛÛÛÛºÛÛº ÛÛºÛÛÛÛÛÛÛ»ÛÛº ÛÛº
; Èͼ ÈÍÍÍÍÍͼÈͼ ÈͼÈÍÍÍÍÍͼÈͼ ÈͼÈÍÍÍÍÍͼÈͼ Èͼ
; [x] - ¢ë室 ¢ DSS, ¥á«¨ 稯 ­¥ ¯®¤¤¥à¦¨¢ ¥âáï
; [x] - ã­¨¢¥àá «ì­ë© EXE ¤«ï K30 ¨ K50
; [x] - ¯à®¢¥àª  ª®­â஫쭮© áã¬¬ë ¤«ï BIOS ¨ ¡¨âáâਬ®¢ ®â¤¥«ì­®
; [x] - ¯à®¢¥àª  ­  ­¥á®¢¬¥á⨬®áâì áâ à®£® ¡¨âáâਬ  á ­®¢ë¬ BIOS ¯à¨ ¯à®è¨¢ª¥ ¯® ®¯æ¨¨ "R"
; [x] - ¯à ¢¨«ì­®¥ á®åà ­¥­¨¥ ¯®«­®£® ID ¬ â¥à¨­áª®© ¯« âë
; [x] - ¯à ¢¨«ì­ ï ¢¥àá¨ï ¡¨âáâਬ  ¢ á«ãç ¥ ®¡­®¢«¥­¨ï ⮫쪮 BIOS
;
;---------[Compiling parameters]--------;
DEFINE _dIs_Updater 1 ; ᮡ¨à âì ®â¤¥«ì­ë© ¯à®è¨¢ «ì騪 ¨«¨  ¯¤¥©â¥à ¢¬¥áâ¥ á ®¡à §®¬ <20>‡“
DEFINE _dLogingMode 0 ;
DEFINE _dDEBUG 0 ; ª®¬¯¨«ïæ¨ï ¤«ï ¤¥¡ £ 
DEFINE NeedSafePort_Y 0 ;
DEFINE _dEMULATOR 1 ; 0 - hardware, 1 - "MAME", 2 - "ZXMAK"
;---------------------------------------;
; For _dLogingMode 1
MACRO SHOW_STEP colors
IF _dLogingMode
PUSH HL
PUSH AF
LD HL,colors
CALL BORDER_FLASH
POP AF
POP HL
ENDIF
ENDM
; For _dLogingMode 1
; Debug_Steps:
; ._1 EQU COLORS.CGA.BORDER.BLACK*256 + COLORS.CGA.BORDER.BLUE
; ._2 EQU COLORS.CGA.BORDER.BLACK*256 + COLORS.CGA.BORDER.GREEN
; ._3 EQU COLORS.CGA.BORDER.BLACK*256 + COLORS.CGA.BORDER.CYAN
; ._4 EQU COLORS.CGA.BORDER.BLUE*256 + COLORS.CGA.BORDER.GREEN
; ._5 EQU COLORS.CGA.BORDER.BLUE*256 + COLORS.CGA.BORDER.CYAN
; ._6 EQU COLORS.CGA.BORDER.GREEN*256 + COLORS.CGA.BORDER.CYAN
;=======================================
; IF _dDEBUG
; DEVICE SPRINTER
; ENDIF
;=======================================
;------------[LUA functions]------------;
INCLUDELUA 'Shared_Includes/LUA/Functions.LUA'
;---------------------------------------;
;---------[BIOS and BITSTREAMS]---------;
DEFINE BIOS_K30_FILE '../SP_Core/Build/_SPRIN.BIN'
DEFINE BIOS_K30_FILE.BIOSlength 196608 ; !TODO ¬®¦­® 楯«ïâì ¤«¨­ã ¨§ ¡¨®á®¢áª®£® BUILD.ASM
DEFINE BIOS_K30_FILE.K30_OFFSET 196609 ;
DEFINE K50_FILE '../SP_Core/Build/Bin/LOADER_K50.BIN'
DEFINE K50_FILE.Length 0 ; ¥á«¨ á⮨⠭®«ì, â® ¯®¤áâ ¢«ï¥âáï à §¬¥à ä ©« . ®¡ëç­® 65536 ¡ ©â
DEFINE LOADER.Length 256 ; !TODO ¯à¨¢ï§ âìáï ¯®â®¬ ª ¤«¨­¥ «® ¤¥à  ¢ ¨á室­¨ª å ¡¨®á 
LUA PASS1
-- ëç¨á«ï¥¬ ª®­â஫ì­ë¥ á㬬ë ä ©«®¢
checksum_k30 = Get_checksum(sj.get_define("BIOS_K30_FILE"), sj.get_define("BIOS_K30_FILE.K30_OFFSET"), 0)
checksum_bios = Get_checksum(sj.get_define("BIOS_K30_FILE"), 0, sj.get_define("BIOS_K30_FILE.BIOSlength"))
checksum_k50 = Get_checksum(sj.get_define("K50_FILE"), 0, sj.get_define("K50_FILE.Length"))
checksum_loader = Get_checksum(sj.get_define("K50_FILE"), 0, sj.get_define("LOADER.Length"))
ENDLUA
LUA ALLPASS
sj.insert_define("LUA_CHECKSUM_K30", checksum_k30)
sj.insert_define("LUA_CHECKSUM_BIOS", checksum_bios)
sj.insert_define("LUA_CHECKSUM_K50", checksum_k50)
sj.insert_define("LUA_CHECKSUM_LOADER", checksum_loader)
ENDLUA
;---------------------------------------;
;------------[Picture setup]------------;
; INCLUDE 'Pictures/Flash.inc' ; <---- ’ã⠢롨ࠥâáï ä ©« ª à⨭ª¨ ¨ ¥ñ ®¯¨á â¥«¨
INCLUDE 'Pictures/NEW_3_06.inc' ; <---- ’ã⠢롨ࠥâáï ä ©« ª à⨭ª¨ ¨ ¥ñ ®¯¨á â¥«¨
; INCLUDE 'Pictures/good.inc' ; <---- ’ã⠢롨ࠥâáï ä ©« ª à⨭ª¨ ¨ ¥ñ ®¯¨á â¥«¨
/*
LUA PASS1
-- <EFBFBD>஢¥à塞 BMP ¨ ¤®áâ ñ¬ ¨§ ­¥£® ¯ à ¬¥âàë
bmp_width, bmp_height, bmp_image_size, bmp_image_offset, bmp_colors = Get_bmp8bit_values (sj.get_define("PICTURE_FILE"))
ENDLUA
LUA ALLPASS
sj.insert_define("LUA_BMP_WIDTH", bmp_width)
sj.insert_define("LUA_BMP_HEIGHT", bmp_height)
sj.insert_define("LUA_BMP_IMAGE_SIZE", bmp_image_size)
sj.insert_define("LUA_BMP_IMAGE_OFFSET", bmp_image_offset)
ENDLUA
*/
Screen_Offset EQU #0000 ; ᬥ饭¨¥ ¢ ¢¨¤¥®¯ ¬ï⨠¤«ï ¤ ­­ëå (0/1 íªà ­, ­ ¯à¨¬¥à)
INCLUDE 'Shared_Includes/structures/bmp.inc'
;---------------------------------------;
INCLUDE 'Shared_includes/constants/SP2000.inc'
INCLUDE 'Shared_includes/constants/dss_equ.inc'
org_addr EQU SLOT2.MEM_ADDR+CLP_Buffer
stack_size EQU #80
code_addr EQU Flasher_Start
program_start EQU Flasher_Start
MODULE expBIOS_Vars
INCLUDE '../Flasher/constants/BIOS_EXP.INC'
ENDMODULE
INCLUDE 'Versions.inc'
INCLUDE 'constants/ROM_CHIPS.inc'
INCLUDE 'Shared_includes/constants/standart_colors.inc'
INCLUDE 'Shared_includes/constants/BIOS_equ.inc'
INCLUDE 'Shared_includes/macroses/macros.z80'
INCLUDE 'Shared_includes/macroses/accelerator.z80'
BoardNumOffsets: ; ‘¬¥é¥­¨ï ¢ EXP.asm ¯® ª®â®àë¬ åà ­ïâáï ¤ ­­ë¥ Board Number
.Number EQU expBIOS_Vars.BOARD_INFO.number
.Type EQU expBIOS_Vars.BOARD_INFO.type
.Start EQU expBIOS_Vars.BoardID.start
.End EQU expBIOS_Vars.BoardID.end
; !FIXIT ; !HARDCODE
ROM_BITSTREAM:
.ROM EQU #1 ; ¯®«®¢¨­ª  <20>‡“ ¤«ï sys_port_on £¤¥ ᨤ¨â ¡¨âáâਬ
.PAGE EQU #0C ; áâà ­¨æ  ¢ ¯®«®¢¨­ª¥ <20>‡“ ¤«ï sys_port_on £¤¥ ­ ç¨­ ¥âáï ¡¨âáâਬ
.OFFSET EQU #100 ; ᬥ饭¨¥ ¢ áâà ­¨æ¥ ¯® ª®â®à®¬ã ­ ç¨­ ¥âáï ¡¨âáâਬ
.CHIP EQU #4 ; ᬥ饭¨¥ ¢ ¡¨âáâਬ¥ ¯® ª®â®à®¬ã ¡ ©â 稯  «¥¦¨â
.K30 EQU #39 ; <20> ©â ª30
.K50 EQU #3C ; <20> ©â ª50
;
;[] ============================================== []
INCLUDE 'Shared_includes/constants/EXE_Header.z80'
;[] ============================================== []
ORG org_addr
;
; IF _dDEBUG
; OUTPUT "Build/Debug.bin"
; ENDIF
Flasher_Start:
; IF _dIs_Updater
IN A,(SLOT0)
LD (SET_ROM_MODE.Normal.slot0),A
LD A,(IX-3)
LD (FILE_HANDLE),A
LD A,I
LD (SET_ROM_MODE.Normal.int_vector),A
LD C,Dss.Cursor
RST ToDSS
LD (cursor_restore),DE
; TEST CHIP
CALL SET_ROM_MODE.Flash
LD (SAVE_DCP_PORT),HL
;
CALL TEST_ROM_CHIP
LD (TST_R.jp),BC
PUSH AF
CALL SET_ROM_MODE.Normal
POP AF
JP C,ITs_Unknown_Chip
LD C,Dss.GetVMod
RST ToDSS
JR C,1F ; ¥á«¨ ®è¨¡ª , â® ®áâ ¢«ï¥¬ ¤¥ä®«â­ë¥ §­ ç¥­¨ï ०¨¬  ¨ ­®¬¥à  íªà ­ 
LD (vid_mod_save),A
LD A,B
LD (scr_num_save),A
1: LD IX,VideoModes.graf_mode320x256
LD E,%00010001
LD C,BIOS.WIN_OPEN
RST ToBIOS
JP C,Program_exit.video_mode
LD IX,VideoModes.text_mode80x32
LD E,%00000001
LD C,BIOS.WIN_OPEN
RST ToBIOS
JP C,Program_exit.video_mode
LD DE,0
LD HL,#2050
LD B,7
LD A,32
LD C,Dss.Clear
RST ToDSS
LD HL,START_MSG
LD C,Dss.PChars
RST ToDSS
CALL START_PIC
; ¤®áâ ñ¬ ­®¬¥à ¢¥àᨨ ¡¨®á  ¯®«ì§®¢ â¥«ï ¨ ¯à®¢¥à塞 ¬®¦­® «¨ ¥£®
; ®¡­®¢«ïâì ®â¤¥«ì­® ®â ¡¨âáâਬ 
LD HL,0 ; ¡ãä¥à ¤«ï áâப¨ ID ¡¨®á  ¯¨å ¥¬ ¢ <20>‡“, ¯®â®¬ã çâ® ­¥ ­ã¦­ 
LD C,BIOS.FN_VERSION
RST ToBIOS
JR C,.too_old_bios
;
LD HL,-#0305 ; ¯à®¢¥àª  ­  ¡¨®á ¢ëè¥ 3.04
ADD HL,DE
JR NC,.not_305
; ¥á«¨ ¢¥àá¨ï ¡¨®á  > 3.04, â® ­®¬¥à ¡¨âáâਬ  ¯®«ãç ¥¬ ¨­ ç¥
PUSH DE ; ­  á«ãç © ®è¨¡ª¨
LD HL,0 ; ¡ãä¥à ¤«ï áâப¨ ¢ <20>‡“ - ­¥ ­ã¦¥­
LD BC,BIOS.FN_CRIPT.AcexAndBitstream
RST ToBIOS
JR NC,.is_new_bios
POP DE
JR .not_305
.is_old_bios: ;
.is_new_bios: LD HL,-5 ; â ª®© १ã«ìâ â (4) ¡ã¤¥â ­  áâ à®© â¥á⮢®© 3.05 ¢ ä㭪樨 FN_CRIPT ¤® ¤®¡ ¢«¥­¨ï ¢ ­¥ñ ¢¥àᨨ bitstream
ADD HL,DE
POP HL
JR C,.is_super_new_bios
EX DE,HL
.is_super_new_bios:;
.not_305: LD (SAVE_BITSTREAM.romCNFversion),DE
LD HL,MinBiosVerForUserBitstream
XOR A
SBC HL,DE
LD HL,START_MSG.afterPICyes_R
JR C,.print_next_msg
.too_old_bios: LD HL,0
LD (.skip_r_key),HL ; mem patch - NOP : NOP ¢¬¥áâ® CP 'r'
LD HL,START_MSG.afterPICno_R
.print_next_msg:
LD C,Dss.PChars
RST ToDSS
LD C,Dss.Cursor
RST ToDSS
PUSH DE
LD (cursor_restore),DE
.loop: LD C,Dss.WaitKey
RST ToDSS
OR #20
CP 'y'
JR Z,.next
.skip_r_key: CP 'r'
JR Z,.flash_only_bios
CP 'p'
JP NZ,Program_exit.no_errors
LD A,(REWRITE.pause)
XOR 1
LD (REWRITE.pause),A
LD HL,START_MSG.PauseTXT
LD C,Dss.PChars
RST ToDSS
LD A,(REWRITE.pause)
OR A
LD HL,START_MSG.PauseON
JR NZ,.showPauseMSG
LD HL,START_MSG.PauseOFF
.showPauseMSG: LD C,Dss.PChars
RST ToDSS
LD DE,(cursor_restore)
LD C,Dss.Locate
RST ToDSS
JR .loop
;.exit: call Program_exit.no_errors
.flash_only_bios:
LD A,#FF
LD (ONLY_BIOS),A
; ELSE
; LD HL,BEGIN_MSG
; LD C,Dss.PChars
; RST ToDSS
; ENDIF
.next: XOR A
OUT (RGMOD),A
DI
;+++++++++++++++++++++++++++++++++++++++
; IFN dIs_Updater
; CALL READ_FROM_FILE
; ELSE
CALL BUILD_FIRMWARE
LD A,(FILE_HANDLE)
LD C,Dss.Close
RST ToDSS
;DI
; JP C,Program_exit.file
; ENDIF
;+++++++++++++++++++++++++++++++++++++++
DI
CALL NUMBER_COPY
CALL DrawProgress.done
REWRITE:
IN A,(SLOT1)
LD (SV_PG1),A
; !TODO ‘¤¥« âì á®®¡é¥­¨¥ ®¡ ®è¨¡ª¥ ¨ ¯ëâ âìáï ¤ «ìè¥ ¯¥à¥§ ¯¨á뢠âì
;LD A,(COUNT_ALL)
;INC A
;LD (COUNT_ALL),A
;CP 6 ; 5 ¯®¯ë⮪
;JR NZ,CONTINUE
;
;-----------[PAUSE for reROM]-----------;
.pause+1: LD A,0
AND A
JR Z,CONTINUE
LD A,COLORS.CGA.BORDER.GREEN
OUT (BorderColor),A
.loop:
IN A,(ZXKeys)
AND %00011111
XOR %00011111
JR Z,.loop
LD A,COLORS.CGA.BORDER.BLACK
OUT (BorderColor),A
;---------------------------------------;
JR CONTINUE
; !TODO ‘¤¥« âì á®®¡é¥­¨¥ ®¡ ®è¨¡ª¥ ¨ ¯ëâ âìáï ¤ «ìè¥ ¯¥à¥§ ¯¨á뢠âì
; DI
; HALT
;***********************************************************************
NUMBER_COPY: IN A,(SLOT3)
EX AF,AF'
LD A,#18 ;!HARDCODE
OUT (SLOT3),A
LD A,SYS_PORT.CNF_0
OUT (SYS_PORT.ROM),A ; ­  ¢á直© á«ãç ©
LD BC,256+BIOS.FN_CRIPT
RST ToBIOS_18
JP C,Program_exit.no_BoardID
LD (#C000+BoardNumOffsets.Start),BC
LD (#C000+BoardNumOffsets.Number),HL
LD (#C000+BoardNumOffsets.End),DE
LD (#C000+BoardNumOffsets.Type),A
LD A,#10 ;!HARDCODE
OUT (SLOT3),A
LD A,(altera_chip)
LD (#C000+expBIOS_Vars.msgStrings.str_ACEX_MODEL),A
LD (#C000+expBIOS_Vars.msgRusStrings.str_ACEX_MODEL),A
EX AF,AF'
OUT (SLOT3),A
RET
CONTINUE:
CALL SET_ROM_MODE.Flash
; di
; ld bc,#FFEE
; ld a,3 ; Z84.REG.Misc_Ctrl 3-rd register - boundaries
; out (c),a ; Z84.SYS.Control
; inc c
; ld a,1 ; cs0 enable, cs1 disable, 32-Bit CRC disable, reset output enable, Clock Divide-by-two
; out (c),a ; Z84.SYS.Data
; dec c
; ld a,2 ; Z84.REG.CS_Boundary
; out (c),a ; Z84.SYS.Control
; inc c
; ld a,#F3 ; boundaries rom = 0000.3fff
; out (c),a ; Z84.SYS.Data
; ;-------------------------------
; LD BC,#1FFD
; XOR A
; OUT (C),A
; ld a,#FF
; out (SLOT0),a
; ld a,#FE
; ld i,a ; ã¡à âì «¨è­¨¥ ®¡à é¥­¨ï...
; ;-------------------------------
; ;!FIXIT remove
; LD BC,ACEX.ROM_RG*256 + ACEX.ROM_RG
; CALL SET_DCP_PORT
; LD (SAVE_DCP_PORT),HL
// in a,(SLOT1)
// push af
// ld a,DCP_PAGE
// out (SLOT1),a ; set dcp page
// LD A,(#4400)
// LD (SAVE_DCP_PORT.write),A
// LD A,(#4600)
// LD (SAVE_DCP_PORT.read),A
// ld a,ACEX.ROM_RG
// ld (#4400),a ; open for wr
// ld (#4600),a ; open for rd
// pop af
// out (SLOT1),a ; close SLOT1
LD A,COLORS.CGA.BORDER.BLACK
OUT (BorderColor),A
;LD A,SYS_PORT.CNF_0
;OUT (SYS_PORT.ON),A ; CNF0
; CALL SAVE_ROM_DATA
;LD B,10
TST_R: ;PUSH BC
; CALL READ_ID_ROM
; EX DE,HL
.jp+1: LD HL,0
JP (HL)
; LD HL,ROM_CHIP.SST39SF020A
; AND A
; SBC HL,DE
; JP Z,SST39SF020
; LD HL,#76BF ; !HARDCODE
; AND A
; SBC HL,DE
; JP Z,SST39SF020
; LD HL,#10BF ; !HARDCODE
; AND A
; SBC HL,DE
; JP Z,SST29EE020
; LD HL,#24BF ; !HARDCODE
; AND A
; SBC HL,DE
; JP Z,SST29EE020
; LD HL,#45DA ; !HARDCODE
; AND A
; SBC HL,DE
; JP Z,W29C020
;POP BC
;DJNZ TST_R
ITs_Unknown_Chip:
CALL SET_ROM_MODE.Normal
JP Program_exit.unsupported_chip
;----------------------------------------------------------------------;
/*
LD (.SP),SP
IN A,(SLOT3)
EX AF,AF'
LD A,Spec_Page
OUT (SLOT3),A
.slot0+1: LD A,0
LD (Spec_Page.page_0),A
IN A,(SLOT1)
LD (Spec_Page.page_1),A
IN A,(SLOT2)
LD (Spec_Page.page_2),A
EX AF,AF'
LD (Spec_Page.page_3),A
LD HL,.restart
LD (Spec_Page.RET_addr),HL
; Set Spec_Page
LD A,DCP_PAGE
OUT (SLOT3),A
LD A,ACEX.RET_PORT
LD (#C400),A
LD BC,0
LD A,Spec_Page
OUT (C),A
; reset
LD A,16
LD BC,#1FFD
OUT (C),A
LD A,RESET_PAGE
OUT (SLOT3),A
.loop: LD (#C000),A ; ¢ íâ®â ¬®¬¥­â ¯®¤ ¥âáï RESET
JR .loop
;
.restart:
LD A,SYS_PORT.CNF_0
OUT (SYS_PORT.OFF),A
.SP+1: LD SP,0
JP Program_exit.unsupported_chip
*/
;----------------------------------------------------------------------;
; ERROR_ROM: ; !TODO ᤥ« âì ­®à¬ «ì­ë© ¢ë室 ¢ ¤®á ¥á«¨ 稯 ­¥ ¤¥â¥ªâ¨âáï.
; LD A,COLORS.CGA.BORDER.BLACK
; OUT (BorderColor),A
; LD A,COLORS.CGA.BORDER.CYAN
; OUT (BorderColor),A
; JR ERROR_ROM
;=======================================
; IF _dIs_Updater
;---------------------------------------
BUILD_FIRMWARE: LD A,DrawProgress.Verify
CALL DrawProgress.start
; á­ ç «  § £à㦠¥¬ ¨ 祪 ¥¬ ⮫쪮 ¡¨®á
LD IX,(OFFSETS.BIOS) ; ¬« ¤è¥¥ á«®¢® ᬥ饭¨ï ¢ ä ©«¥
LD HL,(OFFSETS.BIOS+2) ; áâ à襥 á«®¢® ᬥ饭¨ï ¢ ä ©«¥
LD DE,CHECKSUMS.BIOS
LD BC,#101C ; !HARDCODE RAM for Bios file: #10 - first page, #1C - last page+1
CALL Read_And_Check
; ¢ë¡¨à ¥¬ ª ª®© ¡¨âáâਬ £­ âì ¢ ¯ ¬ïâì
DI
LD A,ROM_BITSTREAM.ROM
OUT (SYS_PORT.ON),A
LD A,ROM_BITSTREAM.PAGE
OUT (ROM.SLOT0),A
LD HL,ROM_BITSTREAM.OFFSET+ROM_BITSTREAM.CHIP
LD A,(HL)
LD B,A
XOR A
OUT (ROM.SLOT0),A
OUT (SYS_PORT.OFF),A
;
LD A,B
CP ROM_BITSTREAM.K50
JR NZ,.chek_k30
;
LD A,"5"
JR .save_chip
;
.chek_k30: CP ROM_BITSTREAM.K30
JP NZ,Program_exit.conf
LD A,"3"
.save_chip: LD (altera_chip),A ; á®å࠭塞 ­®¬¥à 稯  3 ¨«¨ 5 (1K30 ¨«¨ 1K50)
;
.check_mode: LD A,(ONLY_BIOS)
INC A
JR Z,SAVE_BITSTREAM ; ®áâ ¢«ï¥¬ ¡¨âáâਬ ¯®«ì§®¢ â¥«ï
LD A,B
;--------------[Check bitstreams]
LOAD_BITSTREAM:
;---[K30]
CP ROM_BITSTREAM.K30
JR NZ,.next
LD IX,(OFFSETS.K30) ; ¬« ¤è¥¥ á«®¢® ᬥ饭¨ï ¢ ä ©«¥
LD HL,(OFFSETS.K30+2) ; áâ à襥 á«®¢® ᬥ饭¨ï ¢ ä ©«¥
LD DE,CHECKSUMS.K30
LD BC,#1C20 ; !HARDCODE high ­ ç «ì­ ï_áâà ­¨æ  low ª®­¥ç­ ï_áâà ­¨æ +1
JP Read_And_Check
;------[]
.next: CP ROM_BITSTREAM.K50
JR NZ,.error
LD IX,(OFFSETS.K50) ; ¬« ¤è¥¥ á«®¢® ᬥ饭¨ï ¢ ä ©«¥
LD HL,(OFFSETS.K50+2) ; áâ à襥 á«®¢® ᬥ饭¨ï ¢ ä ©«¥
LD DE,CHECKSUMS.K50
LD BC,#1C20 ; !HARDCODE high ­ ç «ì­ ï_áâà ­¨æ  low ª®­¥ç­ ï_áâà ­¨æ +1
JP Read_And_Check
;---[check another]
; ­  ¡ã¤ã饥
;1:
; CP ROM_BITSTREAM.XXX
; jr nz,1F
; ld ix,(OFFSETS.XXX) ; ¬« ¤è¥¥ á«®¢® ᬥ饭¨ï ¢ ä ©«¥
; ld hl,(OFFSETS.XXX+2) ; áâ à襥 á«®¢® ᬥ饭¨ï ¢ ä ©«¥
; ld de,CHECKSUMS.XXX
; ld bc,#1C20 ??? ; !HARDCODE high ­ ç «ì­ ï_áâà ­¨æ  low ª®­¥ç­ ï_áâà ­¨æ +1
; jp Read_And_Check
;----------------[]
.error: JP Program_exit.conf ; ¥á«¨ ¡¨âáâਬ ­¥¨§¢¥áâ­ë© - ¢ë室 á ®è¨¡ª®©
;------------------------------[]
;---------------------------------------
;---------------------------------------
;-[‘®å࠭塞 ¡¨âáâਬ ¯®«ì§®¢ â¥«ï]-[v]
SAVE_BITSTREAM:
IN A,(SLOT3)
PUSH AF
LD A,#1C ; !HARDCODE
OUT (SLOT3),A
LD A,(FILE_HANDLE)
LD HL,#C000 ; !HARDCODE
LD DE,ROM_BITSTREAM.OFFSET
LD C,Dss.Read ; § £à㦠¥¬ loader ¤«ï ª®­äë
RST ToDSS
DI
JP C,Program_exit.file
AND A
JP NZ,Program_exit.file
;---[Loader checksum check]
LD BC,0
LD DE,0
LD HL,#C000
.checksumLoop:
LD A,C
ADD A,(HL)
LD C,A
JR NC,.NO_SM1
LD A,B
ADD A,(HL)
LD B,A
JR NC,.NO_SM1
LD A,E
ADD A,(HL)
LD E,A
JR NC,.NO_SM1
LD A,D
ADD A,(HL)
LD D,A
; JR NC,NO_SM1
.NO_SM1:
INC L ; ¯à®¢¥àª  ª®­â஫쭮© á㬬ë 256 (0-255) ¡ ©â®¢ «® ¤¥à 
JR NZ,.checksumLoop
XOR A
LD HL,(CHECKSUMS.LOADER)
SBC HL,BC
JP NZ,Program_exit.checksum
XOR A
LD HL,(CHECKSUMS.LOADER+2)
SBC HL,DE
JP NZ,Program_exit.checksum
;---[x]
LD A,ROM_BITSTREAM.ROM
OUT (SYS_PORT.ON),A
LD A,ROM_BITSTREAM.PAGE
OUT (ROM.SLOT0),A
LD HL,ROM_BITSTREAM.OFFSET
LD DE,#C000+ROM_BITSTREAM.OFFSET
LD BC,#4000-ROM_BITSTREAM.OFFSET
LDIR ; á®å࠭塞 ¡¨âáâਬ 1/4
EX AF,AF'
LD A,3
EX AF,AF'
EXX
LD BC,SLOT3
IN B,(C)
.loop:
INC B
OUT (C),B
EXX
INC A
OUT (ROM.SLOT0),A
EX DE,HL
LD B,D
LD C,E ; ld hl,0 bc,#4000
LD DE,#C000
LDIR ; á®å࠭塞 ¡¨âáâਬ 2/4 - 4/4
EX AF,AF'
DEC A
JR Z,.change_number
EX AF,AF'
EXX
CALL DrawProgress.next
JP .loop
;-[‘®å࠭塞 ¡¨âáâਬ ¯®«ì§®¢ â¥«ï]-[^]
;
.change_number:
XOR A
OUT (ROM.SLOT0),A
OUT (SYS_PORT.OFF),A
; ¬¥­ï¥¬ âãâ ID ª®­äë ¢ ¡¨®á¥
LD A,#18 ; !HARDCODE áâà ­¨æ  á EXP
OUT (SLOT3),A
.romCNFversion+1:
LD DE,0
LD (#C000+expBIOS_Vars.FN_CRIPT.cnf),DE
LD HL,#C000+expBIOS_Vars.ID_SPRINTER.bitstream_ver
LD C,D
M_hex2dec2ascii_8bit 1
INC HL
LD (HL),'.'
INC HL
LD C,E
M_hex2dec2ascii_8bit 2
POP AF
OUT (SLOT3),A
RET
;---------------------------------------
;---------------------------------------
;
; ­  ¢å®¤¥ IX:IY - ᬥ饭¨¥
SET_OFFSET:
LD A,(FILE_HANDLE)
LD B,0
LD C,Dss.Move_FP
RST ToDSS
DI
JP C,Program_exit.file
RET
;
; ‚室:
; ix - ¬« ¤è¥¥ á«®¢® ᬥ饭¨ï ¢ ä ©«¥
; hl - áâ à襥 á«®¢® ᬥ饭¨ï ¢ ä ©«¥
; DE -  ¤à¥á ¢ ¯ ¬ïâ¨ á ª®­â஫쭮© á㬬®©
; B - ­ ç «ì­ ï áâà ­¨æ  ¤«ï ä ©« 
; C - ª®­¥ç­ ï áâà ­¨æ  ¤«ï ä ©« 
Read_And_Check: LD A,B
LD (.first_page),A
LD (Checksum_Check.first_page),A
LD A,C
LD (.last_page),A
LD (Checksum_Check.last_page),A
LD (Checksum_Check.compare),DE
LD A,(FILE_HANDLE)
LD BC,0*256+Dss.Move_FP
RST ToDSS
DI
JP C,Program_exit.file
IN A,(SLOT3)
PUSH AF
.first_page+1: LD A,#10
OUT (SLOT3),A
.loop: LD A,(FILE_HANDLE)
LD HL,#C000
LD DE,#4000
LD C,Dss.Read
RST ToDSS
DI
JP C,Program_exit.file
AND A
LD HL,#4000
SBC HL,DE
JP NZ,Program_exit.file
IN A,(SLOT3)
INC A
OUT (SLOT3),A
; CP #1C
; CALL Z,LOAD_BITSTREAM
.last_page+1: CP #20
JR NZ,.loop
Checksum_Check:
; LD A,#10
; OUT (SLOT3),A
/*
LD A,PROGRESS_BAR.VERIFY
CALL DrawProgress.start
*/
; LD IX,.ch_b
EXX
LD BC,0
LD DE,0
EXX
.first_page+1: LD A,#10
.main_loop:
OUT (SLOT3),A
PUSH AF
EXX
LD HL,#C000
.loop:
LD A,C
ADD A,(HL)
LD C,A
JR NC,.NO_SM1
LD A,B
ADD A,(HL)
LD B,A
JR NC,.NO_SM1
LD A,E
ADD A,(HL)
LD E,A
JR NC,.NO_SM1
LD A,D
ADD A,(HL)
LD D,A
; JR NC,NO_SM1
.NO_SM1:
INC HL
LD A,H
OR L
JR NZ,.loop
EXX
LD B,PROGRESS_BAR.PIXELS / 16
.progress: CALL DrawProgress.next
DJNZ .progress
POP AF
INC A
.last_page+1: CP #20
JR NZ,.main_loop
EXX
LD (.ch_b),BC
LD (.ch_b+2),DE
EXX
;---[compare]
.compare+1: LD HL,0
LD DE,.ch_b
LD B,4
.ch_loop2:
LD A,(DE)
CP (HL)
JP NZ,Program_exit.checksum
INC HL
INC DE
DJNZ .ch_loop2
;----------[]
/*
CALL DrawProgress.done
*/
POP AF
OUT (SLOT3),A
RET
.ch_b: DB 0,0,0,0
;---------------------------------------
; ENDIF
;
;=======================================
W29C020:
SST29EE020: CALL ROM_PIC._29EE020
CALL ERASE._29EE020
CALL WRITE_29EE020
CALL Pause._200msek
;
LD A,DrawProgress.Verify
CALL DrawProgress.start
CALL VERIFY
;
JP RESET
SST39SF020: CALL ROM_PIC._39SF020
LD HL,1000
LD (Pause.Erase),HL ; mem patch
; XOR A ;LD A,DrawProgress.Erase
; CALL DrawProgress.start
CALL ERASE._39SF020
; LD A,4+D_TBOFF ; ®âª«îç¨âì âãà¡® ¯à¨ § ¯¨á¨ 39SF020
; LD A,4+D_TBON
; OUT (SYS_PORT.OFF),A ; CNF0
; LD A,DrawProgress.Write
; CALL DrawProgress.start
CALL WRITE_39SF020
; LD A,4+D_TBOFF
; LD A,4+D_TBON
; OUT (SYS_PORT.OFF),A ; CNF0
LD A,DrawProgress.Verify
CALL DrawProgress.start
CALL VERIFY
; LD A,4+D_TBON
; OUT (SYS_PORT.OFF),A ; CNF0
JP RESET
COUNT_ALL: DB 0
;*********************************
RESET:
DI
// IN A,(SLOT1)
// PUSH AF
// LD A,DCP_PAGE
// OUT (SLOT1),A ; set DCP page
// LD A,ACEX.RESET
// LD (#4400),A ; open for WR
// LD (#4600),A ; open for RD
LD BC,ACEX.RESET*256+ACEX.RESET
CALL SET_DCP_PORT
;nop
;!TEST Full init ¯®á«¥ ¯¥à¥¯à®è¨¢ª¨ ¨ à¥á¥â , ­  ¢á直© á«ãç ©
LD A,SYS_PAGE
OUT (SLOT1),A
XOR A
LD (SYS_PAGE.ID_FLAG-#8000),A
;
POP AF
OUT (SLOT1),A ; Close SLOT1
LD A,COLORS.CGA.BORDER.BLACK
OUT (BorderColor),A
LD A,CNF_PORT.CNF_0+CNF_PORT.TURBO.OFF
OUT (SYS_PORT.ON),A ; CNF0
CALL Pause._200msek
LD A,CNF_PORT.CNF_0+CNF_PORT.TURBO.ON
OUT (SYS_PORT.ON),A ; CNF0
RESET_LOOP:
;!TEST
;LD BC,#0100
;OUT (C),C
;LD BC,0
;OUT (C),C
LD A,Port_HardReset.Step1
OUT (Port_HardReset),A
DEC A
OUT (Port_HardReset),A
;
JR RESET_LOOP
DI
HALT
;*********************************
VERIFY: IN A,(SLOT1)
PUSH AF
CALL Pause._200msek
LD A,#1F
LD (vf_num),A
vf_loop:
LD E,CHIP_CMD.SST.ID_Exit
CALL L29EE.CMD
CALL Pause._50msek
CALL WAIT_TOGGLE
CALL Pause._50msek
; LD A,DrawProgress.Verify
; CALL DrawProgress.start
; ¥á«¨ ¡ã¤¥â ®è¨¡ª  ¢ á ¬®¬ ­ ç «¥ ®¡à §  ¯à¨ ¢¥à¨ä¨ª æ¨¨ § ¯¨á¨, â® å®âì ­¥¬­®£® ¯®¤ñ࣠¥âáï ¯à®£à¥áá¡ à
;CALL DrawProgress.next
;CALL DrawProgress.next
LD A,#10
TST_X:
EX AF,AF' ;!!!!!
LD HL,#4000
LD DE,0
LOOP_VF1X:
LD BC,0
EX AF,AF'
OUT (SLOT1),A
OUT (C),A
EX AF,AF'
LOOP_VF1:
;!TEST
; LD A,(DE)
; CP (HL)
; JR nz,error_xx
; INC L
; INC E
; JR NZ,LOOP_VF1
; IVAN
LD A,(DE)
XOR (HL)
OR B
LD B,A
INC L
INC E
LD A,(DE)
XOR (HL)
OR B
LD B,A
INC L
INC E
JR NZ,LOOP_VF1
AND A
JR NZ,error_xx
;
OUT (C),C ; ¢®§¢à é ¥¬ ®¡à â­® 0 áâà ­¨æã ROM
LD A,(vf_num)
AND 3
LD (vf_num),A
LD A,H
;AND 7 ;!HARDCODE DrawProgress
;CP 7
AND 15 ;!HARDCODE DrawProgress
CP 15
CALL Z,DrawProgress.next
INC H
INC D
BIT 7,H
JR Z,LOOP_VF1X ; !!!!! â®ç­® LOOP_VF1X,   ­¥ LOOP_VF1 ?
EX AF,AF'
INC A
CP #20
JR NZ,TST_X
CALL DrawProgress.done
POP AF
OUT (SLOT1),A
RET
error_xx: LD A,COLORS.CGA.BORDER.CYAN
OUT (BorderColor),A
LD A,(vf_num)
DEC A
LD (vf_num),A
JR NZ,vf_loop
JR ERROR_X
vf_num: DB 3
;**********************************
ERROR_X:
HALTS: LD BC,0
OUT (C),C
SV_PG1+1: LD A,0
OUT (SLOT1),A
JP REWRITE
; JP VERIFY
;SV_PG1: DB 0
;************************************
; IFN _dIs_Updater
; ;---------------------------------------
; READ_FROM_FILE:
; LD A,1
; LD HL,ROM_FILE
; LD C,Dss.Open
; RST ToDSS
; ; !FIXIT error handler FLASHER
; DI
; JR C,Program_exit.file
; LD (FILE_HANDLE),A
; IN A,(SLOT3)
; PUSH AF
; LD A,10h
; OUT (SLOT3),A
; LOOP_READ:
; LD A,(FILE_HANDLE)
; LD HL,#C000
; LD DE,#4000
; LD C,Dss.Read
; RST ToDSS
; DI
; JR C,Program_exit.file
; AND A
; LD HL,#4000
; SBC HL,DE
; JR NZ,Program_exit.file
; IN A,(SLOT3)
; INC A
; OUT (SLOT3),A
; CP #20
; JR NZ,LOOP_READ
; LD A,(FILE_HANDLE)
; LD C,Dss.Close
; RST ToDSS
; DI
; JR C,Program_exit.file
; Checksum_Check:
; LD A,#10
; OUT (SLOT3),A
; LD HL,#C004 ; !TODO ‘®¡¨à âì ¡¨®á áà §ã á 祪á㬬®©? € âãâ ⮣¤  ¢áâ ¢«ïâì #FF.
; LD DE,.ch_a
; LD BC,4
; LDIR
; LD HL,#FFFF
; LD (#C004),HL ; !TODO ¥á«¨ ¤¥« âì ª ª ­ ¯¨á ­® ¢ëè¥, â® ¤«ï €¯¤¥©â¥à  íâã ç áâì ã¡à âì ãá«®¢¨¥¬ ª®¬¯¨«ï樨
; LD (#C006),HL ; !TODO
; LD A,PROGRESS_BAR.VERIFY
; CALL DrawProgress.start
; ; LD IX,.ch_b
; EXX
; LD BC,0
; LD DE,0
; EXX
; LD A,#10
; .main_loop:
; OUT (SLOT3),A
; PUSH AF
; EXX
; LD HL,#C000
; .loop:
; LD A,C
; ADD A,(HL)
; LD C,A
; JR NC,.NO_SM1
; LD A,B
; ADD A,(HL)
; LD B,A
; JR NC,.NO_SM1
; LD A,E
; ADD A,(HL)
; LD E,A
; JR NC,.NO_SM1
; LD A,D
; ADD A,(HL)
; LD D,A
; ; JR NC,NO_SM1
; .NO_SM1:
; INC HL
; LD A,H
; OR L
; JR NZ,.loop
; EXX
; LD B,8
; .progress:
; CALL DrawProgress.next
; DJNZ .progress
; POP AF
; INC A
; CP #20
; JR NZ,.main_loop
; EXX
; LD (.ch_b),BC
; LD (.ch_b+2),DE
; EXX
; LD HL,(.ch_a)
; LD DE,(.ch_b)
; XOR A
; SBC HL,DE
; JR NZ,Program_exit.checksum
; LD HL,(.ch_a+2)
; LD DE,(.ch_b+2)
; XOR A
; SBC HL,DE
; JR NZ,Program_exit.checksum
; CALL DrawProgress.done
; POP AF
; OUT (SLOT3),A
; RET
; .ch_a: DB 0,0,0,0
; .ch_b: DB 0,0,0,0
; ENDIF
SET_DCP_PORT:
IN A,(SLOT1)
PUSH AF
LD A,DCP_PAGE
OUT (SLOT1),A ; set dcp page
LD A,(#4400)
LD L,A
LD A,(#4600)
LD H,A
LD A,C
LD (#4400),A ; open for wr
LD A,B
LD (#4600),A ; open for rd
POP AF
OUT (SLOT1),A
RET
;----------------[EXITS]-------------[v]
Program_exit:
.unsupported_chip:
LD HL,PROGRAM_MESSAGES.UNKNOWN_CHIP
LD BC,DSS_Error.sys.COMMON_ERROR*256+Dss.Exit
JR .exit
.no_BoardID:
LD HL,PROGRAM_MESSAGES.NO_BOARDID
LD BC,DSS_Error.sys.COMMON_ERROR*256+Dss.Exit
JR .exit
.checksum:
LD HL,PROGRAM_MESSAGES.CHECKSUM
LD BC,DSS_Error.sys.CRC_ERROR*256+Dss.Exit
JR .exit
.conf:
LD HL,PROGRAM_MESSAGES.CONF
LD BC,DSS_Error.sys.COMMON_ERROR*256+Dss.Exit
JR .exit
.free_mem:
LD HL,PROGRAM_MESSAGES.MEM
LD BC,DSS_Error.sys.NOT_ENOUGH_MEMORY*256+Dss.Exit
JR .exit
.video_mode:
LD HL,PROGRAM_MESSAGES.VIDEOMODE
LD BC,DSS_Error.sys.INVALID_VIDEO_MODE*256+Dss.Exit
JR .exit
.file:
LD HL,PROGRAM_MESSAGES.FILE
LD BC,DSS_Error.sys.READ_ERROR*256+Dss.Exit
JR .exit
.no_errors:
LD HL,PROGRAM_MESSAGES.GOODLUCK
LD BC,DSS_Error.sys.NO_ERROR*256+Dss.Exit
; JR .exit
.exit: PUSH BC
PUSH HL
vid_mod_save+1: LD A,3
scr_num_save+1: LD B,1
LD C,Dss.SetVMod
RST ToDSS
cursor_restore+1:
LD DE,0000
LD C,Dss.Locate
RST ToDSS
POP HL
LD C,Dss.PChars
RST ToDSS
.loop: POP BC
PUSH BC
RST ToDSS
; ¯ëâ ¥¬áï ¢ë©â¨ «î¡®© 業®©)))
JR .loop
;
;/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\
PROGRAM_MESSAGES:
; IF _dIs_Updater
.FILE: DZ 13,10,'Updater:\> Error: Read failure. ROM updater may be corrupted',13,10,10
.MEM: DZ 13,10,'Updater:\> Error: Not enough free memory!',13,10,10
; ELSE
; .FILE: DZ 13,10,13,10,'Updater:\> Error: ROM file is corrupt',13,10
; ENDIF
.VIDEOMODE: DZ 13,10,'Updater:\> Error: Failed to initialize video mode!',13,10,10
.CHECKSUM: DZ 13,10,'Updater:\> Error: Checksum is not correct!',13,10,10
.CONF: DZ 13,10,'Updater:\> Error: Unsupported Altera installed!',13,10,10
.NO_BOARDID: DZ 13,10,'Updater:\> Error: Unable to get board id from BIOS!',13,10,10
.UNKNOWN_CHIP DZ 13,10,'Updater:\> Error: Unsupported ROM Chip installed!',13,10,10
.GOODLUCK: DZ 13,10,'Updater:\> Good luck)))',13,10,10
; IFN _dIs_Updater
; BEGIN_MSG: DZ 13,10,"FLASH-ROM rewriter for Sprinter. Programmed by Ivan Mak."
; ROM_FILE: DB '_sprin.bin',0,0,0,0,0,0,0,0,0,0,0
; ENDIF
; IF _dIs_Updater
END_MSG: DZ 'Your ROM now rewrited! Press RESET please.'
START_MSG: DB 13,10,10
DB 'ROM updater to ',HARDWARE_VERSION,' hardware and ',BIOS_VERSION,' BIOS',BIOS_BETA_VERSION,'versions.',13,10
DB '2002 (',#91,') Peters Plus Ltd,',13,10
DB SP_TEAM_YEAR,' (',#91,') Sprinter Team.',13,10,10,10,10,10
DB 'Your ROM will be reflashed',13,10
DB 'This operation can destroy your BIOS information if a power failure occurs!',13,10,10
DB 'Do not press any keys while reflashing!',13,10
DB 'After reflashing, your computer will restart.',13,10
DZ 'Contact Sprinter Team if you need help.',13,10,10
.afterPICyes_R: DB 'Press "Y" to start full reflashing or "R" for reflashing only BIOS and ZX-ROMs.',13,10
DB 'If you need a pause to change the ROM before flashing, press "P".',13,10
DZ 'Press any other key to cancel.',13,10
.afterPICno_R: DZ 'Press "Y" to start full reflashing or any other key to cancel.',13,10 ; !FIXIT pause
.PauseTXT: DZ 'Pause: '
.PauseON: DZ 'ON. Green border means waiting for any key to be pressed to continue.' ; /¤®«¦­  ¡ëâì ®¤¨­ ª®¢ ï ¤«¨­ \
.PauseOFF: DZ 'OFF. ' ; \¤®«¦­  ¡ëâì ®¤¨­ ª®¢ ï ¤«¨­ /
; ENDIF
;/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\
;------------------------------------[^]
;
;------------------------------------[v]
; IF _dIs_Updater
READ_ID_ROM: AND A
.no_draw: PUSH AF
LD E,CHIP_CMD.ANY.ID
CALL L29EE.CMD
CALL Pause._50msek
LD BC,0
LD A,#10
OUT (C),A
LD HL,(0) ; rdlow-ok
OUT (C),C
POP AF
PUSH HL
PUSH AF
LD E,CHIP_CMD.SST.ID_Exit
CALL L29EE.CMD
POP AF
JR C,.exit
;
CALL Pause._50msek
.exit: POP HL
RET
ERASE:
._39SF020:
._29EE020: CALL READ_ID_ROM
CALL Pause._200msek
LD E,CHIP_CMD.SST.Erase
CALL L29EE.CMD
LD E,#20 ; data protect disable
CALL L29EE.CMD
CALL Pause._200msek
LD E,CHIP_CMD.SST.Erase
CALL L29EE.CMD
LD E,#10 ; Full chip erase
CALL L29EE.CMD
LD A,DrawProgress.Erase
CALL DrawProgress.start
LD B,128 ; ­¥®¡å®¤¨¬ ï § ¤¥à¦ª 
LD A,128 / PROGRESS_BAR.PIXELS
OR A
JR NZ,.no_chg_A
LD A,1
;
.no_chg_A: PUSH AF
.LOOP_ERAS: CALL Pause._10msek
DEC A
JR NZ,.DJNZ
;
CALL DrawProgress.next
POP AF
PUSH AF
.DJNZ: DJNZ .LOOP_ERAS
POP AF
CALL WAIT_TOGGLE
CALL DrawProgress.done
RET
;*********************************************
WRITE_39SF020: LD A,DrawProgress.Write
CALL DrawProgress.start
; IN A,(SLOT1)
; LD (SV_PG1),A
LD A,#10
LD HL,#4000
LD DE,0
LOOP_WS2: OUT (SLOT1),A
EX AF,AF'
LOOP_WB2: LD A,(HL)
CP #FF
JR Z,NO_WRITE
PUSH DE
LD E,#A0
CALL L29EE.CMD
POP DE
LD BC,0
EX AF,AF'
OUT (C),A
EX AF,AF'
LD A,(HL)
LD (DE),A
NOP
OUT (C),C
CALL WAIT_TOGGLE
NO_WRITE: INC L
INC E
JR NZ,LOOP_WB2
INC H
INC D
LD A,D
;AND 7
;CP 7
AND 31 ;!HARDCODE DrawProgress
CP 31
CALL Z,DrawProgress.next
LD A,D
CP #40
JR NZ,LOOP_WB2
LD HL,#4000
LD DE,0
CALL DrawProgress.next
CALL DrawProgress.next
EX AF,AF'
INC A
CP #20
JR NZ,LOOP_WS2
CALL DrawProgress.done
LD A,(SV_PG1)
OUT (SLOT1),A
RET
/*
ERROR_Y:
DI
HALT
*/
WRITE_29EE020:
; CALL READ_ID_ROM
CALL L29EE.OFF
CALL Pause._200msek
CALL WAIT_TOGGLE
LD A,DrawProgress.Write
CALL DrawProgress.start
; ¥á«¨ ¡ã¤¥â ®è¨¡ª  § ¯¨á¨ ¢ á ¬®¬ ­ ç «¥, â® å®âì ­¥¬­®£® ¯®¤ñ࣠¥âáï ¯à®£à¥áá¡ à
CALL DrawProgress.next
CALL DrawProgress.next
; IN A,(SLOT1)
; LD (SV_PG1),A
LD A,#10
PUSH AF
LD HL,#4000
LD DE,0
LOOP_WS: POP AF
PUSH AF
EX AF,AF'
POP AF
PUSH AF
EX AF,AF'
PUSH HL
PUSH DE
CALL WRITE_SECTOR
JP C,HALTS ; error
POP DE
POP HL
; = #4000 / (64 / 16)
; 524288/64
LD A,D
;AND 15
;CP 15
AND 31 ;!HARDCODE DrawProgress
CP 31
CALL Z,DrawProgress.next
LD BC,#80
ADD HL,BC
EX DE,HL
ADD HL,BC
EX DE,HL
LD A,D
CP #40
JR NZ,LOOP_WS
LD HL,#4000
LD DE,#0000
POP AF
INC A
CP #20
PUSH AF
JR NZ,LOOP_WS
POP AF
CALL DrawProgress.done
LD A,(SV_PG1)
OUT (SLOT1),A
RET
; A,HL - BUFER, A',DE - ROM_PLACE
WRITE_SECTOR: OUT (SLOT1),A
EXX
LD B,20
SECTOR_WRI1: EXX
PUSH DE
CALL L29EE.WR
POP DE
PUSH HL
PUSH DE
LD BC,0
EX AF,AF'
OUT (C),A
EX AF,AF'
LD BC,128 ; LEN BLK
LDIR ; WRITE !!!
OUT (C),C
CALL Pause._10msek
CALL WAIT_TOGGLE
POP DE
POP HL
PUSH HL
PUSH DE
EX AF,AF'
OUT (C),A
EX AF,AF'
LD B,128
LOOP_T: LD A,(DE)
CP (HL)
JR NZ,ERROR_SECTOR
INC HL
INC DE
DJNZ LOOP_T
OUT (C),C
POP BC ; delete stack elements
POP BC
AND A ; ok write_sector
RET
ERROR_SECTOR: LD B,C
OUT (C),C
POP DE ; restore adresses
POP HL
EXX
DJNZ SECTOR_WRI1
EXX
SCF ; error return
RET
WAIT_TOGGLE: PUSH AF
PUSH DE
PUSH HL
LD HL,0
LD A,(0) ; rdlow-ok
LD D,A
TOGGLE_LOOP: INC HL
LD A,H
OR L
JR Z,TOGGLE_X
; LD A,0
; BIT 6,D
; JR Z,ZZZZ1
; LD A,7
;ZZZZ1: OUT (0FEh),A
LD E,D
LD A,(0) ; rdlow-ok
LD D,A
; ;!TEST
; OUT (#FE),A
XOR E
AND #40
JR NZ,TOGGLE_LOOP
POP HL
POP DE
POP AF
AND A
RET
TOGGLE_X: POP HL
POP DE
POP AF
SCF
RET
; !TODO á®åà ­ïâì ®¡à § ¨«¨ ­¥â?
SAVE_ROM_DATA: IN A,(SLOT1)
PUSH AF
LD A,#10
LOOP_SAVE: LD BC,0
OUT (C),A
OUT (SLOT1),A
LD HL,0
LD DE,#4000
LD BC,#4000
LDIR
INC A
CP #20
JR NZ,LOOP_SAVE
POP AF
OUT (SLOT1),A
RET
;---------------------------------------
L29EE:
.OFF: LD E,#80
CALL .CMD
LD E,#20
JR .CMD
;
.WR: LD E,#A0
;JR .CMD
; CMD in E register
.CMD: LD BC,0
; wr_rom #5555,#AA
LD A,#11
OUT (C),A ;
LD A,#AA
LD (#1555),A
; wr_rom #2AAA,#55
LD A,#10
OUT (C),A ;
LD A,#55
LD (#2AAA),A
; wr_rom #5555,#80
LD A,#11
OUT (C),A ;
LD A,E
LD (#1555),A
OUT (C),C
RET
;---------------------------------------
Pause:
._50msek:
PUSH HL
PUSH AF
LD HL,10000
JR ._200
;
._10msek: PUSH HL
PUSH AF
.Erase+1: LD HL,200
JR ._200
;
._200msek: PUSH HL
PUSH AF
LD HL,20000
._200: INC HL
DEC HL
INC HL
DEC HL
DEC HL
LD A,H
OR L
JR NZ,._200
POP AF
POP HL
RET
;*******************************8
START_PIC: IN A,(SLOT1)
PUSH AF
LD BC,#FF*256+BIOS.PIC_SET_PAL
LD HL,PICTURE.bdPallete
LD DE,0
LD A,1
RST ToBIOS
LD A,#50
OUT (SLOT1),A
ACC_SetBlockSize
LD A,0
ACC_Off
;xor a
OUT (PORT_Y),A
LD HL,#4000+Screen_Offset
LD DE,#4000+Screen_Offset+1
LD BC,319
ACC_FillScreenOneByte
LD (HL),A
LDIR
ACC_Off
POP AF
OUT (SLOT1),A
PUSH AF
;
LD IX,(OFFSETS.PICTURE_2) ; ¬« ¤è¥¥ á«®¢® ᬥ饭¨ï ¢ ä ©«¥
LD HL,(OFFSETS.PICTURE_2+2) ; áâ à襥 á«®¢® ᬥ饭¨ï ¢ ä ©«¥
LD A,(FILE_HANDLE)
LD B,0
LD C,Dss.Move_FP
RST ToDSS
JP C,Program_exit.file
;
DI
;
IF MAIN_PICTURE.PIC_WIDTH < 256
ACC_SetBlockSize
LD A,low MAIN_PICTURE.PIC_WIDTH
ACC_Off
ENDIF
;
LD A,#FF - MAIN_PICTURE.PIC_Y
.loop_pic: PUSH AF
LD A,(FILE_HANDLE)
LD HL,.pic_buffer
LD DE,MAIN_PICTURE.PIC_WIDTH
LD C,Dss.Read
RST ToDSS
DI
JP C,Program_exit.file
AND A
JP NZ,Program_exit.file
LD A,#50
OUT (SLOT1),A
POP AF
OUT (PORT_Y),A
LD HL,.pic_buffer
LD DE,#4000+Screen_Offset+MAIN_PICTURE.PIC_X
;
IF MAIN_PICTURE.PIC_WIDTH < 256
ACC_CopyBlock
LD C,(HL)
LD (DE),A
ACC_Off
ELSE
LD BC,MAIN_PICTURE.PIC_WIDTH
LDIR
ENDIF
;
LD H,A
POP AF
OUT (SLOT1),A
PUSH AF
LD A,H
DEC A
CP MAIN_PICTURE.PIC_Y-1
JR NZ,.loop_pic
POP AF
OUT (SLOT1),A
IM 1
EI
RET
.pic_buffer: BLOCK MAIN_PICTURE.PIC_WIDTH,0
ROM_PIC:
._39SF020:
LD HL,PICTURE.bdRaster+MAIN_PICTURE.CHIP_FIRST_X ;!!!!! MAIN_PICTURE.CHIP_PIC_WIDTH - MAIN_PICTURE.CHIP_WIDTH
JR .show
._29EE020:
LD HL,PICTURE.bdRaster+MAIN_PICTURE.CHIP_SECOND_X ;!!!!!
.show:
IN A,(SLOT1)
PUSH AF
LD A,#50
OUT (SLOT1),A
LD A,MAIN_PICTURE.CHIP_PIC_Y ; !!!!! ®â­®á¨âáï ª ª à⨭ª¥
.loop: OUT (PORT_Y),A
LD DE,#4000+Screen_Offset+MAIN_PICTURE.CHIP_PIC_X ; !HARDCODE
LD BC,MAIN_PICTURE.CHIP_WIDTH ; !HARDCODE
LDIR
LD BC,MAIN_PICTURE.CHIP_X ;160-76 ;!!!!!
ADD HL,BC
DEC A
CP MAIN_PICTURE.CHIP_PIC_Y-MAIN_PICTURE.CHIP_HEIGHT+1 ;PLACE_ID-16 ;!!!!!
JR NZ,.loop
SAFE_PORTY
POP AF
OUT (SLOT1),A
RET
;-----------------------------------------------------------------------
DrawProgress:
.Erase EQU 0
.Write EQU 1
.Verify EQU 2
;
.start: PUSH HL
PUSH DE
PUSH BC
LD (.CURRENT_BAR),A
;
LD D,PROGRESS_BAR.ERASE
LD HL,#4000+Screen_Offset+PROGRESS_BAR.ERASE_START_X
OR A ;CP .Erase
JR Z,.set
;
LD D,PROGRESS_BAR.WRITE
LD HL,#4000+Screen_Offset+PROGRESS_BAR.WRITE_START_X
CP .Write
JR Z,.set
;
LD HL,#4000+Screen_Offset+PROGRESS_BAR.VERIFY_START_X
LD D,PROGRESS_BAR.VERIFY
;
.set: LD A,D
LD (.LINE_PROG),A
LD (.PROGRESS_ST),HL
;
IN A,(SLOT1)
PUSH AF
LD A,#50
OUT (SLOT1),A
LD A,(.LINE_PROG)
OUT (PORT_Y),A
;
;LD DE,#4000+Screen_Offset+PROGRESS_BAR.START_X+1
PUSH HL
POP DE
INC DE
LD BC,PROGRESS_BAR.PIXELS-1
LD (HL),PROGRESS_BAR.EMPTY_COLOR
LDIR
;
SAFE_PORTY
POP AF
OUT (SLOT1),A
POP BC
POP DE
POP HL
RET
.next: PUSH HL
PUSH AF
IN A,(SLOT1)
PUSH AF
;
LD A,#50
OUT (SLOT1),A
LD A,(.LINE_PROG)
OUT (PORT_Y),A
;
LD HL,(.PROGRESS_ST)
LD (HL),PROGRESS_BAR.COLOR
INC HL ; !TODO ᤥ« âì âã⠯஢¥àªã ­  ¢ë室 §  £à ­¨æë
LD (.PROGRESS_ST),HL
SAFE_PORTY
;
POP AF
OUT (SLOT1),A
POP AF
POP HL
RET
.done: PUSH BC
PUSH HL
PUSH AF
IN A,(SLOT1)
PUSH AF
;
LD A,#50
OUT (SLOT1),A
LD A,(.LINE_PROG)
OUT (PORT_Y),A
LD A,(.CURRENT_BAR)
;
LD BC,#4000+Screen_Offset+PROGRESS_BAR.ERASE_START_X
OR A ;CP .Erase
JR Z,.sub
LD BC,#4000+Screen_Offset+PROGRESS_BAR.WRITE_START_X
CP .Write
JR Z,.sub
LD BC,#4000+Screen_Offset+PROGRESS_BAR.VERIFY_START_X
;
.sub: LD HL,(.PROGRESS_ST)
XOR A
SBC HL,BC
LD A,PROGRESS_BAR.PIXELS
SUB L
JR Z,.exit
JR C,.exit
LD B,A
LD HL,(.PROGRESS_ST)
;
.loop: LD (HL),PROGRESS_BAR.COLOR
INC HL
DJNZ .loop
;
.exit: SAFE_PORTY
POP AF
OUT (SLOT1),A
POP AF
POP HL
POP BC
RET
;
.LINE_PROG: BYTE 45
.PROGRESS_ST: WORD 0
.CURRENT_BAR: BYTE 0
;-----------------------------------------------------------------------
;
;
;=======================================
FILE_HANDLE: DB 0
;=======================================
;
;
VideoModes:
.text_mode80x32:
DB 40
DB 32
DB 0
DB 0
DB %00011011
DB 0
DB 0
DB 0
.graf_mode320x256:
DB 80
DB 32
DB 0
DB 0
DB %01100000
DB 0
DB 0
DB 0
;
SAVE_DCP_PORT:
.write: BYTE 0
.read: BYTE 0
;.temp: WORD 0
;
; IF _dIs_Updater
altera_chip: BYTE 0
CHECKSUMS:
;.BIOS_K30: DWORD LUA_CHECKSUM_K30_BIOS
.BIOS: DWORD LUA_CHECKSUM_BIOS
.K30: DWORD LUA_CHECKSUM_K30
.K50: DWORD LUA_CHECKSUM_K50
.LOADER: DWORD LUA_CHECKSUM_LOADER
ONLY_BIOS: BYTE 0
OFFSETS:
.LOADER: DWORD IMAGES.K30 - exe_header
.K30: DWORD IMAGES.K30 - exe_header
.K50: DWORD IMAGES.K50 - exe_header
.BIOS: DWORD IMAGES.BIOS - exe_header
.PICTURE_2 DWORD PICTURE_2 - exe_header
TEST_ROM_CHIP:
LD B,10
.loop: PUSH BC
SCF ;no draw progress
CALL READ_ID_ROM.no_draw
EX DE,HL
;
LD HL,ROM_CHIP.SST39SF020A
AND A
SBC HL,DE
LD BC,SST39SF020
JR Z,.detected
;
LD HL,#76BF ; !HARDCODE
AND A
SBC HL,DE
;LD BC,SST39SF020
JR Z,.detected
;
LD HL,#10BF ; !HARDCODE
AND A
SBC HL,DE
;LD BC,SST39SF020
JR Z,.detected
;
LD HL,#24BF ; !HARDCODE
AND A
SBC HL,DE
;LD BC,SST39SF020
JR Z,.detected
;
LD HL,#45DA ; !HARDCODE
AND A
SBC HL,DE
LD BC,W29C020
JR Z,.detected
;
POP BC
DJNZ .loop
LD BC,ITs_Unknown_Chip ; ¢¤à㣠¡ã¤ã 祣® ¯¥à¥¤¥«ë¢ âì ¨ § ¡ã¤ã
SCF
RET
.detected:
POP HL ; á­¨¬ ¥¬ «¨è­¥¥
RET
MODULE SET_ROM_MODE
; ¢ë室: HL - ¯à¥¤ë¤ã騩 ­®¬¥à ¢­ãâ७­¥£® ¯®àâ  ¤«ï ­ã«¥¢®£® ¢­¥è­¥£® ¨§ DCP
Flash: DI
; Setup Z84
;!TODO ¤®¡ ¢¨âì ¢í©âë ¤«ï <20>‡“?
;
;
; Enable ROM boundaries
LD BC,#FF*256+Z84.SYS.Control
LD A,Z84.REG.Misc_Ctrl ; 3-rd register for setup boundaries
OUT (C),A ; Z84.SYS.Control
INC C
LD A,1 ; cs0 enable, cs1 disable, 32-Bit CRC disable, reset output enable, Clock Divide-by-two
OUT (C),A ; Z84.SYS.Data
DEC C
LD A,Z84.REG.CS_Boundary
OUT (C),A ; Z84.SYS.Control
INC C
LD A,#F3 ; boundaries rom = 0000.3fff
OUT (C),A ; Z84.SYS.Data
; ; ¡®à¤îà ¯®àâ¨âáï ¯à¨ § ¯¨á¨ ¢ ¯®àâ ¯à®æ  #EE ¨§-§  ¤¥è¨äà æ¨¨ ª àâë ¯®à⮢
XOR A
OUT (BorderColor),A
; SET ROM_RG Port
LD BC,ACEX.ROM_RG*256+ACEX.ROM_RG
CALL SET_DCP_PORT
PUSH HL
; SET ROM PAGE 8
LD A,SYS_PORT.CNF_0
OUT (SYS_PORT.ON),A
;
LD BC,#1FFD
XOR A
OUT (C),A
;!TODO ¢®§¬®¦­®, çâ® íâ® ¤«ï Sp97
LD A,#FF
OUT (SLOT0),A
LD A,#FE
LD I,A ; ã¡à âì «¨è­¨¥ ®¡à é¥­¨ï...
;
POP HL
RET
Normal: DI
; Setup Z84
; Set ROM BIOS
XOR A
LD BC,0
OUT (C),A
; ¨­¨æ¨ «¨§ æ¨ï á¨á⥬­ëå ¯®à⮢ Z84C15
LD BC,#FF*256+Z84.SYS.Control
XOR A ; Z84.REG.WaitState_Ctrl
OUT (C),A ; Z84.SYS.Control
INC C ; Z84.REG.WaitState_MemBound
OUT (C),A ; Z84.SYS.Data ; set 0 Waits
DEC C
LD A,Z84.REG.Misc_Ctrl
OUT (C),A ; Z84.SYS.Control
INC C
XOR A ; disable CS0, disable CS1
OUT (C),A ; Z84.SYS.Data
; ; ¡®à¤îà ¯®àâ¨âáï ¯à¨ § ¯¨á¨ ¢ ¯®àâ ¯à®æ  #EE ¨§-§  ¤¥è¨äà æ¨¨ ª àâë ¯®à⮢
XOR A
OUT (BorderColor),A
; SET ROM PAGE 8
LD A,SYS_PORT.CNF_0
OUT (SYS_PORT.RAM),A
;
LD BC,#1FFD
LD A,1
OUT (C),A
;!TODO ¢®§¬®¦­®, çâ® íâ® ¤«ï Sp97
.slot0+1: LD A,0
OUT (SLOT0),A
.int_vector+1: LD A,0
LD I,A
; RESET ROM_RG Port
LD BC,(SAVE_DCP_PORT)
CALL SET_DCP_PORT
RET
ENDMODULE
IF _dLogingMode
;‚•Ž„: H - ¯¥à¢ë© 梥⠡®à¤îà 
; L - ¢â®à®© 梥⠡®à¤îà 
; Œ¨£ ¥â ¤¢ã¬ï 梥⠬¨ ­  ¡®à¤îॠ¤® ­ ¦ â¨ï ­  ª« ¢¨èã
BORDER_FLASH: LD A,H
OUT (BorderColor),A
CALL Pause._200msek
CALL .key
;
LD A,L
OUT (BorderColor),A
CALL Pause._200msek
CALL .key
JR BORDER_FLASH
;
.key: XOR A
IN A,(ZXKeys)
AND %0001'1111
XOR %0001'1111
RET Z
;
LD A,COLORS.CGA.BORDER.BLACK
OUT (BorderColor),A
POP HL
RET
ENDIF
; ENDIF
/*
DB "End of program."
;
BLOCK #8E00-$,0
cmos_data:
BLOCK data_start-$-#66,0
stack_prog:
*/
; BLOCK data_start-$,0
BLOCK stack_size,0
stack_point EQU $-2
PICTURE TBitMapFileHeader = $
DISPLAY "incbin length: ",/D,MAIN_PICTURE.PIC_OFFSET+MAIN_PICTURE.CHIP_NAME_OFFSET
INCBIN PICTURE_FILE,0,MAIN_PICTURE.PIC_OFFSET+MAIN_PICTURE.CHIP_NAME_OFFSET
ASSERT $ < #10000," Error: EXE-loader too big! "
; IF _dIs_Updater
Loader_length EQU $-Flasher_Start
DISPLAY "Loader_length: ",/A,Loader_length
;=======================================
; IF _dDEBUG
; OUTEND
; DEVICE NONE
; ENDIF
;=======================================
DISPLAY PICTURE_FILE,' ',/A,MAIN_PICTURE.PIC_OFFSET+MAIN_PICTURE.CHIP_NAME_OFFSET
OUTPUT '../SP_Core/Build/updater_picture.bin'
PICTURE_2: INCBIN PICTURE_FILE,MAIN_PICTURE.PIC_OFFSET + MAIN_PICTURE.CHIP_NAME_OFFSET;+MAIN_PICTURE.PIC_WIDTH ; ;!!!!!
.length EQU $ - PICTURE_2
OUTEND
IMAGES:
.BIOS: INCBIN BIOS_K30_FILE,0,#4000 * #0C ; ®¡à § BIOS
.K30: INCBIN BIOS_K30_FILE,#4000 * #0C,#10000 ; ¡¨âáâਬ ¤«ï K30 á § £àã§ç¨ª®¬
.K50: INCBIN K50_FILE,0,#10000 ; ¡¨âáâਬ ¤«ï K50 á § £àã§ç¨ª®¬
.end EQU $
; ELSE
; Loader_length EQU 0
; ENDIF
; IF _dIs_Updater
DISPLAY "Image reolution: ",/D,MAIN_PICTURE.PIC_WIDTH,"x",/D,MAIN_PICTURE.PIC_HEIGHT," pixels. Size: ",/D,MAIN_PICTURE.PIC_SIZE," bytes."
DISPLAY "Code ends: ",/A,PICTURE
DISPLAY "Code Length: ",/A,PICTURE-Flasher_Start
DISPLAY "Loader ends: ",/A,Loader_length+Flasher_Start
DISPLAY "Loader Length: ",/A,Loader_length
DISPLAY "IMAGES.K30 Starts: ",/A,IMAGES.BIOS
DISPLAY "IMAGES.K30 Ends: ",/A,IMAGES.K50
DISPLAY "IMAGES.K30 Length: ",/A,IMAGES.K50-IMAGES.BIOS
DISPLAY "IMAGES.K50 Starts: ",/A,IMAGES.K50
DISPLAY "IMAGES.K50 Ends: ",/A,IMAGES.end
DISPLAY "IMAGES.K50 Length: ",/A,IMAGES.end-IMAGES
DISPLAY "PIC_Y: ",/H,MAIN_PICTURE.PIC_Y
DISPLAY "PIC_HEIGHT: ",/H,MAIN_PICTURE.PIC_HEIGHT
DISPLAY "CHIP_HEIGHT: ",/H,MAIN_PICTURE.CHIP_HEIGHT
IF _dDEBUG|_dLogingMode
DISPLAY "\nWARNING! Debug version!!! WARNING! Debug version!!! WARNING! Debug version!!!\n"
ENDIF
EXPORT BoardNumOffsets.Start
EXPORT BoardNumOffsets.Number
EXPORT BoardNumOffsets.End
EXPORT BoardNumOffsets.Type
EXPORT expBIOS_Vars.msgStrings.str_ACEX_MODEL
EXPORT expBIOS_Vars.msgRusStrings.str_ACEX_MODEL
EXPORT PICTURE.bdPallete
EXPORT TEST_ROM_CHIP
EXPORT TST_R.jp
EXPORT MAIN_PICTURE.PIC_X
EXPORT MAIN_PICTURE.PIC_Y
EXPORT MAIN_PICTURE.PIC_WIDTH
EXPORT Screen_Offset
; ENDIF
; END
;******************************************************
/*
;
LD BC,#FFEE
XOR A
OUT (C),A ; 0 register - waits
INC C
OUT (C),A ; set 0 Waits
DEC C
LD A,3 ; 3-rd - Misc.Control Register
OUT (C),A
INC C
XOR A
LD A,1
OUT (C),A ; disable CS0,CS1
; no boundary set!
LD BC,#7FFD
LD A,#10
OUT (C),A ; BASIC_48 mode
LD B,#1F
LD A,01
OUT (C),A ; RAM-0 mode !!!
; out (slot3),saved_page
*/
/*
PRINT_LINE: ; from HL, zero - end
IN A,(SLOT1)
EX AF,AF'
LD A,50h
OUT (SLOT1),A
LD A,01h ; first place
OUT (PORT_Y),A
LD A,(VARX)
AND A
JR NZ,NO_VARS
LD A,(4300h)
LD A,C
LD (VARX),A
NO_VARS:
LD C,A
LD DE,04301h ; symbol place
PRINT_LOOP:
LD A,(HL)
AND A
JR Z,PRINT_END
LD (DE),A ; symbol
DEC E
LD A,C
LD (DE),A ; MODE
INC E
INC E
LD A,07h ; color
LD (DE),A
DEC E
INC HL
IN A,(PORT_Y)
INC A
OUT (PORT_Y),A
JR PRINT_LOOP
LD BC,(4300h)
PRINT_END:
LD A,#C0 ; close
OUT (PORT_Y),A
EX AF,AF'
OUT (SLOT1),A
RET
VARX: DB 0
*/
;