;------------------ ;Rombo Productions VIDI digitizer ;disassembled May 2010 by nocash ;------------------ ;Port F8B0h CRTC Index ;Port F8B1h CRTC Data ;Port F9B0h Config (W) and Capture Data (R) ;NMI - triggered on SYNC (on VSYNC, and maybe also on HSYNC?) ;--- ;Config bits ; 0 Reset Brightness/Contrast to zero (0=No, 1=Reset) ; 1 Increment Contrast (0=No, 1=Add +1) ; 2 Increment Brightness (0=No, 1=Add +1) ; 3 Enable NMI on Sync (0=No, 1=Yes) ; 4-6 Transfer mode ; 0=Stop Transfer ; 1=Transfer SRAM to CPC ; 3=Capture 320x200x4 to SRAM ; 7=Capture 640x200x1 to SRAM ; 7 Not used by VIDI software (set to 0) ;note: additionally to above I/O controlled brightness/contrast, ;the hardware additionally has (externally accessible) ;brightness/contrast potentiometers for coarse adjustments, ;also the pots are REQUIRED for mode0 scans (where the ;brightness I/O ports are increasing from 0=min to 15=max ;during the 16-pass scan) ;--- ;CRTC registers: 9CC9 75 ;crtc[00h] 75h or 50h ;horizontal total (-1) 9CC8 50 ;crtc[01h] 50h ;horizontal displayed 9CC7 5B ;crtc[02h] 5Bh or .. ;horizontal sync pos 9CC6 11 ;crtc[03h] 11h ;horizontal sync width 9CC5 26 ;crtc[04h] 26h ;vertical total (-1) 9CC4 00 ;crtc[05h] 0 ;vertical total adjust 9CC3 19 ;crtc[06h] 19h ;vertical displayed 9CC2 00 ;crtc[07h] 0 ;vertical sync pos 9CC1 00 ;crtc[08h] 0 ;interlace mode 9CC0 07 ;crtc[09h] 07h ;max scanline (-1) 9CBF 00 ;crtc[0Ah] 0 ;cursor start 9CBE 00 ;crtc[0Bh] 0 ;cursor end 9CBD 00 ;crtc[0Ch] 0 ;start addr high 9CBC 00 ;crtc[0Dh] 0 ;start addr low 9CBB 00 ;crtc[0Eh] 0 ;cursor high 9CBA 00 ;crtc[0Fh] 0 ;cursor low ;crtc[10h] N/A ;lightpen high ;crtc[11h] N/A ;lightpen low ;------------------ ; iy = A048h = var pool ;--- A048 db 07h ;[iy+00h] brightness (0..15) (default=7) A049 db 07h ;[iy+01h] contrast (0..15) (default=7) A04A db h ;[iy+02h] video mode (0,1,2) (default=1) A04B db h ;[iy+03h] picture xpos (0..31) (default=16) A04C db h ;[iy+04h] picture ypos (0..127) (default=48) A04D db h ;[iy+05h] picture yextra (0) A04E db h ;[iy+06h] xlat'ed video mode (30h or 70h) A04F db h ;[iy+07h] vram addr msb (C0h for addr C000h) A050 db h ;[iy+08h] xlat'ed video mode with nmi on (38h or 78h) A051 db h ;[iy+09h] xlat'ed video mode with nmi off (30h or 70h) A05 db h ;[iy+0 h] A05 db h ;[iy+0 h] ;------------------ 8000 0E 07 ld c,07 8002 11 40 00 ld de,0040 8005 21 FF B0 ld hl,B0FF 8008 CD CE BC call BCCE ;kl_init_back 800B 06 08 ld b,08 800D 21 78 A0 ld hl,A078 8010 11 00 38 ld de,3800 8013 CD 77 BC call BC77 ;cas_in_open 8016 D2 00 00 jp nc,0000 ;reset 8019 EB ex de,hl 801A CD 83 BC call BC83 ;cas_in_direct 801D D2 00 00 jp nc,0000 ;reset 8020 CD 7A BC call BC7A ;cas_in_close 8023 D2 00 00 jp nc,0000 ;reset 8026 FD 21 48 A0 ld iy,A048 802A CD 7C 99 call init_vidi_crtc 802D CD 91 99 call set_brightness_contrast 8030 CD 09 B9 call B909 ;kl_l_rom_disable 8033 F5 push af 8034 FD 36 05 00 ld [iy+05],00h ;picture yextra 8038 3E C0 ld a,0C000h/100h ;vram addr msb 803A FD 77 07 ld [iy+07],a ;vram addr msb 803D CD 08 BC call BC08 ;scr_set_base 8040 21 00 C0 ld hl,C000 8043 4D ld c,l 8044 11 C8 50 ld de,50C8 8047 CD 47 BC call BC47 ;scr_flood_box 804A 21 00 00 ld hl,0000 804D CD 05 BC call BC05 ;scr_set_offset 8050 FD CB 0E 86 res 0,[iy+0E] 8054 FD 36 27 00 ld [iy+27],00 8058 FD E5 push iy 805A E1 pop hl 805B 11 7A 00 ld de,007A 805E 19 add hl,de 805F CD D4 BC call BCD4 ;kl_find_command 8062 30 15 jr nc,8079 8064 FD CB 0E C6 set 0,[iy+0E] 8068 3E FF ld a,FF 806A CD 1B 00 call 001B ;kl_far_pchl 806D F5 push af 806E 3A 8C BC ld a,[BC8C] 8071 FE CF cmp a,CF 8073 28 04 jr z,8079 8075 FD 36 27 01 ld [iy+27],01 8079 3A D3 BD ld a,[BDD3] 807C FD 77 21 ld [iy+21],a 807F 3E C9 ld a,C9 8081 32 D3 BD ld [BDD3],a 8084 CD 42 BB call BB42 ;km_get_delay 8087 E5 push hl 8088 21 01 16 ld hl,1601 808B CD 3F BB call BB3F ;km_set_delay 808E 3E 4C ld a,4C 8090 CD 2A BB call BB2A ;km_get_translate 8093 47 ld b,a 8094 3E 4D ld a,4D 8096 CD 2A BB call BB2A ;km_get_translate 8099 4F ld c,a 809A C5 push bc 809B 3E 4C ld a,4C 809D 06 0D ld b,0D 809F CD 27 BB call BB27 ;km_set_translate 80A2 3E 4D ld a,4D 80A4 06 0D ld b,0D 80A6 CD 27 BB call BB27 ;km_set_translate 80A9 3E 10 ld a,10 80AB 3D dec a 80AC F5 push af 80AD CD 35 BC call BC35 ;scr_get_ink 80B0 F1 pop af 80B1 C5 push bc 80B2 A7 and a,a 80B3 20 F6 jr nz,80AB 80B5 CD 3B BC call BC3B ;scr_get_border 80B8 C5 push bc 80B9 CD 11 BC call BC11 ;scr_get_mode 80BC F5 push af 80BD CD 0B BC call BC0B ;scr_get_location 80C0 F5 push af 80C1 FD 77 07 ld [iy+07],a ;=C0h for vram at C000h ;vram addr msb 80C4 CD 95 82 call 8295 80C7 CD 23 99 call 9923 80CA CD 65 97 call 9765 80CD CD 5F 97 call 975F 80D0 CD C0 9B call set_nmi_vector 80D3 F3 di 80D4 CD B2 99 call start_stop_scanning 80D7 FB ei 80D8 FD CB 0E 4E bit 1,[iy+0E] 80DC 20 2F jr nz,810D 80DE FD 7E 07 ld a,[iy+07] ;vram addr msb 80E1 EE 80 xor a,80 80E3 FD 77 07 ld [iy+07],a ;vram addr msb 80E6 CD F0 99 call scan_192_line_frame 80E9 CD 53 9B call 9B53 80EC FD 7E 07 ld a,[iy+07] ;vram addr msb 80EF CD 08 BC call BC08 ;scr_set_base 80F2 CD 19 BD call BD19 ;mc_wait_flyback 80F5 FD 7E 07 ld a,[iy+07] ;vram addr msb 80F8 EE 80 xor a,80 80FA FD 77 07 ld [iy+07],a ;vram addr msb 80FD CD 30 9B call 9B30 8100 FD 7E 07 ld a,[iy+07] ;vram addr msb 8103 EE 80 xor a,80 8105 FD 77 07 ld [iy+07],a ;vram addr msb 8108 CD 19 9A call scan_last_8_lines 810B 18 06 jr 8113 810D CD F0 99 call scan_192_line_frame 8110 CD 19 9A call scan_last_8_lines 8113 FB ei 8114 CD 13 98 call 9813 8117 79 ld a,c 8118 A7 and a,a 8119 CA B7 81 jp z,81B7 811C CB 51 bit 2,c 811E C2 4B 82 jp nz,824B 8121 CB 59 bit 3,c 8123 C2 51 82 jp nz,8251 8126 CB 71 bit 6,c 8128 C2 57 82 jp nz,8257 812B CB 79 bit 7,c 812D C2 3F 82 jp nz,823F 8130 4F ld c,a 8131 FD 7E 24 ld a,[iy+24] 8134 FE 02 cmp a,02 8136 DA 3A 82 jp c,823A 8139 CA E1 82 jp z,82E1 813C FE 04 cmp a,04 813E DA BE 81 jp c,81BE 8141 CA 80 81 jp z,8180 8144 FE 06 cmp a,06 8146 CA 03 82 jp z,8203 8149 79 ld a,c 814A E6 23 and a,23 814C CA D3 80 jp z,80D3 814F CB 69 bit 5,c 8151 20 29 jr nz,817C 8153 E6 01 and a,01 8155 FD 7E 00 ld a,[iy+00] ;brightness 8158 28 03 jr z,815D 815A 3C inc a 815B 18 01 jr 815E 815D 3D dec a 815E CB 67 bit 4,a 8160 C2 D3 80 jp nz,80D3 8163 FD 77 00 ld [iy+00],a ;brightness 8166 11 B8 07 ld de,07B8 8169 CD 19 BD call BD19 ;mc_wait_flyback 816C CD 11 99 call x9911 ;display_decimal_a 816F 2E 38 ld l,38 8171 06 04 ld b,04 8173 CD 30 99 call 9930 8176 CD 91 99 call set_brightness_contrast 8179 C3 D3 80 jp 80D3 817C 3E 07 ld a,07 817E 18 E3 jr 8163 8180 79 ld a,c 8181 E6 23 and a,23 8183 CA D3 80 jp z,80D3 8186 CB 69 bit 5,c 8188 20 29 jr nz,81B3 818A E6 01 and a,01 818C FD 7E 03 ld a,[iy+03] ;picture xpos 818F 28 03 jr z,8194 8191 3C inc a 8192 18 01 jr 8195 @@ 8194 3D dec a 8195 CB 6F bit 5,a @@ 8197 C2 D3 80 jp nz,80D3 819A CD FF 95 call set_picture_xpos_a ;in: A 819D FD 7E 03 ld a,[iy+03] ;picture xpos 81A0 11 A6 07 ld de,07A6 81A3 CD 19 BD call BD19 ;mc_wait_flyback 81A6 CD 11 99 call x9911 ;display_decimal_a 81A9 2E 26 ld l,26 81AB 06 04 ld b,04 81AD CD 30 99 call 9930 81B0 C3 D3 80 jp 80D3 81B3 3E 10 ld a,10 81B5 18 E3 jr 819A 81B7 FD 36 22 08 ld [iy+22],08 81BB C3 D3 80 jp 80D3 81BE 79 ld a,c 81BF E6 23 and a,23 81C1 CA D3 80 jp z,80D3 81C4 CB 69 bit 5,c 81C6 28 04 jr z,81CC 81C8 3E 30 ld a,30 81CA 18 21 jr 81ED 81CC FD 7E 04 ld a,[iy+04] ;picture ypos 81CF FD 35 22 dec [iy+22] 81D2 28 09 jr z,81DD 81D4 3C inc a 81D5 CB 41 bit 0,c 81D7 20 0F jr nz,81E8 81D9 3D dec a 81DA 3D dec a 81DB 18 0B jr 81E8 81DD FD 34 22 inc [iy+22] 81E0 C6 04 add a,04 81E2 CB 41 bit 0,c 81E4 20 02 jr nz,81E8 81E6 D6 08 sub a,08 81E8 CB 7F bit 7,a 81EA C2 B7 81 jp nz,81B7 81ED FD 77 04 ld [iy+04],a ;picture ypos 81F0 11 98 07 ld de,0798 81F3 CD 19 BD call BD19 ;mc_wait_flyback 81F6 CD FB 98 call 98FB 81F9 2E 18 ld l,18 81FB 06 06 ld b,06 81FD CD 30 99 call 9930 8200 C3 D3 80 jp 80D3 8203 79 ld a,c 8204 E6 23 and a,23 8206 CA D3 80 jp z,80D3 8209 CB 69 bit 5,c 820B 20 29 jr nz,8236 820D E6 01 and a,01 820F FD 7E 01 ld a,[iy+01] 8212 28 03 jr z,8217 8214 3C inc a 8215 18 01 jr 8218 8217 3D dec a 8218 CB 67 bit 4,a 821A C2 D3 80 jp nz,80D3 821D FD 77 01 ld [iy+01],a 8220 11 CA 07 ld de,07CA 8223 CD 19 BD call BD19 ;mc_wait_flyback 8226 CD 11 99 call x9911 ;display_decimal_a 8229 2E 4A ld l,4A 822B 06 04 ld b,04 822D CD 30 99 call 9930 8230 CD 91 99 call set_brightness_contrast 8233 C3 D3 80 jp 80D3 8236 3E 07 ld a,07 8238 18 E3 jr 821D 823A CB 61 bit 4,c 823C CA D3 80 jp z,80D3 823F 21 88 9D ld hl,9D88 8242 CD 74 98 call 9874 8245 DA 00 00 jp c,0000 ;reset 8248 C3 C4 80 jp 80C4 824B CD B2 97 call 97B2 824E C3 D3 80 jp 80D3 8251 CD DF 97 call 97DF 8254 C3 D3 80 jp 80D3 8257 CD 30 9B call 9B30 825A F3 di 825B CD B2 99 call start_stop_scanning 825E FB ei 825F FD CB 0E 4E bit 1,[iy+0E] 8263 20 1C jr nz,8281 8265 FD 7E 07 ld a,[iy+07] ;vram addr msb 8268 EE 80 xor a,80 826A FD 77 07 ld [iy+07],a ;vram addr msb 826D CD F0 99 call scan_192_line_frame 8270 CD 19 9A call scan_last_8_lines 8273 CD 30 9B call 9B30 8276 FD 7E 07 ld a,[iy+07] ;vram addr msb 8279 CD 08 BC call BC08 ;scr_set_base 827C CD 19 BD call BD19 ;mc_wait_flyback 827F 18 09 jr 828A 8281 CD F0 99 call scan_192_line_frame 8284 CD 19 9A call scan_last_8_lines 8287 CD 30 9B call 9B30 828A CD 13 98 call 9813 828D 79 ld a,c 828E E6 90 and a,90 8290 28 C8 jr z,825A 8292 C3 C4 80 jp 80C4 8295 FD 7E 02 ld a,[iy+02] ;video mode 8298 F5 push af 8299 A7 and a,a 829A 20 01 jr nz,829D 829C 3C inc a 829D CD DB 95 call 95DB 82A0 FD 7E 02 ld a,[iy+02] ;video mode 82A3 CD 1C BD call BD1C ;mc_set_mode 82A6 CD 5A 9C call 9C5A ;set_inks_and_border 82A9 F1 pop af 82AA FD 77 02 ld [iy+02],a ;video mode 82AD 21 6F 9F ld hl,9F6F 82B0 CD C2 98 call 98C2 82B3 FD 36 24 02 ld [iy+24],02 82B7 FD 36 25 03 ld [iy+25],03 82BB DD 23 inc ix 82BD FD 7E 04 ld a,[iy+04] ;picture ypos 82C0 11 98 07 ld de,0798 82C3 CD FB 98 call 98FB 82C6 FD 7E 03 ld a,[iy+03] ;picture xpos 82C9 11 A6 07 ld de,07A6 82CC CD 11 99 call x9911 ;display_decimal_a 82CF FD 7E 00 ld a,[iy+00] ;brightness 82D2 11 B8 07 ld de,07B8 82D5 CD 11 99 call x9911 ;display_decimal_a 82D8 FD 7E 01 ld a,[iy+01] 82DB 11 CA 07 ld de,07CA 82DE C3 11 99 jp x9911 ;display_decimal_a 82E1 CB 61 bit 4,c 82E3 CA D3 80 jp z,80D3 82E6 CD E0 9B call restore_nmi_vector 82E9 21 05 16 ld hl,1605 82EC CD 3F BB call BB3F ;km_set_delay 82EF FD 7E 02 ld a,[iy+02] ;video mode 82F2 A7 and a,a 82F3 20 23 jr nz,8318 82F5 CD DB 95 call 95DB 82F8 AF xor a,a 82F9 CD 1C BD call BD1C ;mc_set_mode 82FC CD 5A 9C call 9C5A ;set_inks_and_border 82FF CD 19 BD call BD19 ;mc_wait_flyback 8302 CD 19 BD call BD19 ;mc_wait_flyback 8305 CD 09 B9 call B909 ;kl_l_rom_disable 8308 F5 push af 8309 F3 di 830A CD C0 9B call set_nmi_vector 830D 21 15 83 ld hl,8315 ;\ 8310 E3 ex [sp],hl ; some complex retadr modification... 8311 E5 push hl ;/ 8312 C3 D7 94 jp mode_0_multipass_scan 8315 CD 21 96 call 9621 @@ 8318 21 9A 9F ld hl,9F9A 831B CD C2 98 call 98C2 831E FD 36 24 02 ld [iy+24],02 8322 FD 36 25 03 ld [iy+25],03 8326 DD 23 inc ix 8328 CD 23 99 call 9923 832B CD 65 97 call 9765 832E CD 5F 97 call 975F 8331 CD 82 97 call 9782 8334 CB 61 bit 4,c 8336 28 F9 jr z,8331 8338 FE 02 cmp a,02 833A DA 5C 83 jp c,835C 833D CA 32 8B jp z,8B32 8340 FE 04 cmp a,04 8342 DA 84 8C jp c,8C84 8345 CA 65 83 jp z,8365 8348 FE 06 cmp a,06 834A DA B4 87 jp c,87B4 834D CA A5 88 jp z,88A5 8350 FD CB 0E 4E bit 1,[iy+0E] 8354 20 DB jr nz,8331 8356 CD 74 9B call 9B74 8359 C3 31 83 jp 8331 835C 21 01 16 ld hl,1601 835F CD 3F BB call BB3F ;km_set_delay 8362 C3 C4 80 jp 80C4 8365 21 C6 9F ld hl,9FC6 8368 CD C2 98 call 98C2 836B CD 23 99 call 9923 836E CD 7B 87 call 877B 8371 CD 92 87 call 8792 8374 CD 65 97 call 9765 8377 CD 5F 97 call 975F 837A CD 82 97 call 9782 837D FE 06 cmp a,06 837F CA A0 83 jp z,83A0 8382 D2 C4 83 jp nc,83C4 8385 CB 61 bit 4,c 8387 28 F1 jr z,837A 8389 FE 02 cmp a,02 838B DA 18 83 jp c,8318 838E CA 32 8B jp z,8B32 8391 FE 04 cmp a,04 8393 DA 13 84 jp c,8413 8396 CA A9 85 jp z,85A9 8399 FE 05 cmp a,05 839B CA 30 86 jp z,8630 839E 18 DA jr 837A 83A0 79 ld a,c 83A1 E6 23 and a,23 83A3 28 D5 jr z,837A 83A5 CB 69 bit 5,c 83A7 28 14 jr z,83BD 83A9 AF xor a,a 83AA FD 77 26 ld [iy+26],a 83AD CD 19 BD call BD19 ;mc_wait_flyback 83B0 CD 7B 87 call 877B 83B3 2E 3A ld l,3A 83B5 06 06 ld b,06 83B7 CD 30 99 call 9930 83BA C3 7A 83 jp 837A 83BD FD 7E 26 ld a,[iy+26] 83C0 EE 01 xor a,01 83C2 18 E6 jr 83AA 83C4 79 ld a,c 83C5 E6 23 and a,23 83C7 CA 7A 83 jp z,837A 83CA FD CB 0E 46 bit 0,[iy+0E] 83CE CA 7A 83 jp z,837A 83D1 CB 69 bit 5,c 83D3 28 07 jr z,83DC 83D5 FD 7E 0E ld a,[iy+0E] 83D8 E6 01 and a,01 83DA 18 0C jr 83E8 83DC FD 7E 27 ld a,[iy+27] 83DF CB 41 bit 0,c 83E1 28 26 jr z,8409 83E3 3C inc a 83E4 FE 03 cmp a,03 83E6 28 1E jr z,8406 83E8 FD 77 27 ld [iy+27],a 83EB CD 19 BD call BD19 ;mc_wait_flyback 83EE CD 92 87 call 8792 83F1 2E 44 ld l,44 83F3 06 0A ld b,0A 83F5 FD 7E 27 ld a,[iy+27] 83F8 A7 and a,a 83F9 28 06 jr z,8401 83FB CD 30 99 call 9930 83FE C3 7A 83 jp 837A ;------------------ .... ;------------------ mode_0_multipass_scan: 94D7 FD E5 push iy ;\ hl=iy ;\ 94D9 E1 pop hl ;/ ; 94DA 11 A8 00 ld de,00A8 ; relocate 956F to iy+A8h 94DD 19 add hl,de ; 94DE EB ex de,hl ; 94DF 21 6F 95 ld hl,956F ; 94E2 01 6C 00 ld bc,006C ; 94E5 ED B0 ldir ;/ 94E7 FD 66 07 ld h,[iy+07] ;vram addr msb 94EA 2E 00 ld l,00 94EC 54 ld d,h 94ED 1E 01 ld e,01 94EF 01 FF 3F ld bc,3FFF 94F2 71 ld [hl],c ;=FFh 94F3 ED B0 ldir 94F5 FD 7E 00 ld a,[iy+00] ;brightness 94F8 F5 push af 94F9 06 10 ld b,10h ;\ 94FB F3 di ; loop 16 passes... @@sixteen_pass_lop: ;/ 94FC 05 dec b ;-decrease pass number (15..0) 94FD 3E 0F ld a,0F ;\ 94FF 90 sub a,b ; 9500 5F ld e,a ; 9501 7B ld a,e ; 9502 0F rora ; 9503 E6 80 and a,80 ; 9505 4F ld c,a ; translate pass number 9506 7B ld a,e ; to CPC VRAM Mode 0 color value 9507 07 rola ; 9508 07 rola ; 9509 E6 08 and a,08 ; 950B B1 or a,c ; 950C 4F ld c,a ; 950D 7B ld a,e ; 950E 07 rola ; 950F 07 rola ; 9510 07 rola ; 9511 E6 20 and a,20 ; 9513 B1 or a,c ; 9514 4F ld c,a ; 9515 7B ld a,e ; 9516 0F rora ; 9517 0F rora ; 9518 E6 02 and a,02 ; 951A B1 or a,c ; 951B 4F ld c,a ;/ 951C 78 ld a,b ;\brightness = pass (15..0) 951D FD 77 00 ld [iy+00],a ;brightness ;/ 9520 C5 push bc 9521 CD 91 99 call set_brightness_contrast 9524 CD B2 99 call start_stop_scanning ;---> scan one "mode 2" frame 9527 11 50 00 ld de,0050h ;\ 952A 01 B0 F8 ld bc,F8B0 ; 952D ED 51 out [bc],d ;[F8B0h]=00h ; 952F 01 B1 F8 ld bc,F8B1 ; 9532 ED 59 out [bc],e ;[F8B1h]=50h ;/ 9534 01 B0 F9 ld bc,F9B0 ;\ 9537 3E 10 ld a,10h ; 9539 ED 79 out [bc],a ;[F9B0h]=10h ;/ 953B C1 pop bc 953C CD 67 95 call 9567 ;---> merge to "mode 0" frame 953F C5 push bc 9540 01 B0 F9 ld bc,F9B0 ;\ 9543 3E 00 ld a,00h ; 9545 ED 79 out [bc],a ;[F9B0h]=00h ;/ 9547 11 75 00 ld de,0075h ;\ 954A 01 B0 F8 ld bc,F8B0 ; 954D ED 51 out [bc],d ;[F8B0h]=00h ; 954F 01 B1 F8 ld bc,F8B1 ; 9552 ED 59 out [bc],e ;[F8B1h]=75h ;/ 9554 C1 pop bc ;\ 9555 04 inc b ; loop next pass (16 passes) 9556 10 A4 djnz @@sixteen_pass_lop ;/ 9558 CD E0 9B call restore_nmi_vector 955B FB ei 955C F1 pop af 955D FD 77 00 ld [iy+00],a ;brightness 9560 CD 91 99 call set_brightness_contrast 9563 F1 pop af 9564 C3 0C B9 jp B90C ;kl_rom_restore ;--- 9567 FD E5 push iy ;\ 9569 E1 pop hl ; relocated 956F at iy+A8h 956A 11 A8 00 ld de,00A8 ; 956D 19 add hl,de ; 956E E9 jp hl ;/ ;--- ;below is relocated to iy+A8h... ;technically same as "scan_192_line_frame", ;but merges 16 multipass mode 2 scans to a mode 0 images ;(replaces color 15 by capture data) ;--- 956F CD 03 B9 call B903 ;kl_u_rom_disable ;above disables upper ROM, allowing to read VRAM at C000h, ;intended for the ROM-version of the VIDI software, ;for the (disassembled) DSK-version it isn't required 9572 F3 di 9573 F5 push af 9574 C5 push bc 9575 FD 56 07 ld d,[iy+07] ;vram addr msb 9578 1E 00 ld e,00 ;vram addr lsb 957A D5 push de ;\set IX=DE (vram dest addr) 957B DD E1 pop ix ;/ 957D C5 push bc ;\set L=C (mode 0 vram color value of current pass) 957E E1 pop hl ;/ 957F 01 B0 F9 ld bc,F9B0 9582 11 C8 50 ld de,50C8 @@ylop: 9585 D5 push de 9586 DD E5 push ix @@xlop: 9588 ED 60 in h,[bc] ;h=[F9B0h] ;-capture byte 958A DD 7E 00 ld a,[ix+00] ;\ 958D F6 55 or a,55h ;one mode0 pix ; 958F 3C inc a ; 9590 20 0F jr nz,@@keep1 ; if mode0 pixel has color 15, 9592 7C ld a,h ; and at least one of the 9593 F6 0F or a,0Fh ;four mode2 pix ; new four mode2 pixels is 9595 3C inc a ; black, then change set 9596 28 09 jr z,@@keep1 ; mode0 pixel to current 9598 7D ld a,l ; brightness 9599 F6 55 or a,55h ; 959B DD A6 00 and a,[ix+00] ; 959E DD 77 00 ld [ix+00],a ; @@keep1: ;/ 95A1 DD 7E 00 ld a,[ix+00] ;\ 95A4 F6 AA or a,AAh ;one mode0 pix ; 95A6 3C inc a ; 95A7 20 10 jr nz,@@keep2 ; same as above for the 95A9 7C ld a,h ; other half of the VRAM byte 95AA F6 F0 or a,F0h ;four mode2 pix ; 95AC 3C inc a ; 95AD 28 0A jr z,@@keep2 ; 95AF 7D ld a,l ; 95B0 0F rora ; 95B1 F6 AA or a,AAh ; 95B3 DD A6 00 and a,[ix+00] ; 95B6 DD 77 00 ld [ix+00],a ; @@keep2: ;/ 95B9 DD 23 inc ix 95BB 15 dec d 95BC 20 CA jr nz,@@xlop 95BE ED 78 in a,[bc] ;a=[F9B0h] ;-final dummy read ("hblank") 95C0 E3 ex [sp],hl 95C1 11 00 08 ld de,0800 ;\ 95C4 19 add hl,de ; 95C5 CB 74 bit 6,h ; same as "next_scanline" 95C7 20 04 jr nz,@@line_inrange ; 95C9 11 50 C0 ld de,C050 ; 95CC 19 add hl,de ; @@line_inrange: ;/ 95CD E3 ex [sp],hl 95CE DD E1 pop ix 95D0 D1 pop de 95D1 1D dec e 95D2 20 B1 jr nz,@@ylop 95D4 C1 pop bc 95D5 F1 pop af 95D6 CD 0C B9 call B90C ;kl_rom_restore 95D9 F3 di 95DA C9 ret ;------------------ 95DB FD 77 02 ld [iy+02],a ;video mode 95DE A7 and a,a 95DF 20 07 jr nz,@@not_mode0 95E1 3E 70 ld a,70h ;\mode 0 95E3 01 60 2F ld bc,2F60h ;/ 95E6 18 0D jr @@this @@not_mode0: 95E8 3D dec a 95E9 3E 30 ld a,30h ;\mode 1 95EB 01 40 32 ld bc,3240h ;/ 95EE 28 05 jr z,@@this 95F0 3E 70 ld a,70h ;\mode 2 95F2 01 20 35 ld bc,3520h ;/ @@this: 95F5 FD 77 06 ld [iy+06],a ;xlat'ed video mode 95F8 FD 71 1F ld [iy+1F],c ;lsb 95FB FD 70 20 ld [iy+20],b ;msb 95FE C9 ret ;------------------ set_picture_xpos_a: ;in: A 95FF FD 77 03 ld [iy+03],a ;picture xpos 9602 C6 4B add a,4Bh ;\ 9604 16 02 ld d,02h ;\ ; 9606 01 B0 F8 ld bc,F8B0 ; ; 9609 ED 51 out [bc],d ;[F8B0h]=02h ;/ ; 960B 01 B1 F8 ld bc,F8B1 ; 960E ED 79 out [bc],a ;[F8B1h]=picture xpos+4Bh ;/ 9610 C9 ret ;------------------ next_scanline: 9611 11 00 08 ld de,0800h 9614 19 add hl,de 9615 CB 74 bit 6,h 9617 C0 ret nz 9618 11 50 C0 ld de,C050h 961B 19 add hl,de 961C C9 ret ;------------------ 961D ... ;------------------ init_vidi_crtc: ;called initially after RUN"VIDI 997C 21 BA 9C ld hl,initial_crtc_values 997F 3E 10 ld a,10h @@crtc_lop: 9981 3D dec a ;index ;--> zf 9982 01 B0 F8 ld bc,F8B0 ;\ 9985 ED 79 out [bc],a ;[F8B0h]=index ; 9987 01 B1 F8 ld bc,F8B1 ; 998A 5E ld e,[hl] ; 998B ED 59 out [bc],e ;[F8B1h]=data ;/ 998D 23 inc hl 998E 20 F1 jr nz,@@crtc_lop ;<-- zf 9990 C9 ret ;------------------ set_brightness_contrast: 9991 01 B0 F9 ld bc,0F9B0h 9994 3E 01 ld a,01h ;\ 9996 ED 79 out [bc],a ;[F9B0h]=01h ; reset brightness/contrast 9998 3D dec a ; 9999 ED 79 out [bc],a ;[F9B0h]=00h ;/ 999B 11 02 00 ld de,0002h ;\ 999E FD 7E 01 ld a,[iy+01h] ;contrast ; contrast 99A1 CD A9 99 call @@set_this ;/ 99A4 1E 04 ld e,04h ;\ 99A6 FD 7E 00 ld a,[iy+00h] ;brightness ; brightness ;- - - - - ;/ @@set_this: ;in: A=data/range, E=type, D=00h 99A9 3C inc a @@set_lop: 99AA 3D dec a 99AB C8 ret z 99AC ED 59 out [bc],e ;[F9B0h]=either 02h=contrast, or 04h=brightness 99AE ED 51 out [bc],d ;[F9B0h]=00h 99B0 18 F8 jr @@set_lop ;------------------ start_stop_scanning: 99B2 AF xor a,a 99B3 FD 77 0A ld [iy+0A],a ;=0 99B6 CD F0 9B call do_sync_stuff 99B9 3E 01 ld a,01h 99BB FD 77 0A ld [iy+0A],a ;=1 99BE C8 ret z ;<---- zf 99BF CD 43 9C call wait_for_pic_ypos 99C2 01 B0 F9 ld bc,F9B0 ;\ 99C5 3E 00 ld a,00h ; start scanning 99C7 ED 79 out [bc],a ;[F9B0h]=00h ; 99C9 FD 7E 06 ld a,[iy+06] ;xlat'ed video mode 99CC FD 77 09 ld [iy+09],a 99CF 5F ld e,a ;xlat'ed video mode 99D0 F6 08 or a,08h ;nmi_enable ? 99D2 FD 77 08 ld [iy+08],a ; 99D5 ED 59 out [bc],e ;[F9B0h]=[iy+09h] ;/ 99D7 CD F0 9B call do_sync_stuff ;-wait for picture end 99DA CD F0 9B call do_sync_stuff ;\wait dunno why/whatfor (?) 99DD CD 43 9C call wait_for_pic_ypos ;/ 99E0 01 B0 F9 ld bc,F9B0 ;\ 99E3 3E 00 ld a,00h ; 99E5 FD 77 09 ld [iy+09],a ; stop scanning 99E8 ED 79 out [bc],a ;[F9B0h]=00h ; 99EA F6 08 or a,08h ; 99EC FD 77 08 ld [iy+08],a ;/ 99EF C9 ret ;------------------ scan_192_line_frame: 99F0 11 50 00 ld de,0050 ;\ 99F3 01 B0 F8 ld bc,F8B0 ; 99F6 ED 51 out [bc],d ;[F8B0h]=00h ; 99F8 01 B1 F8 ld bc,F8B1 ; 99FB ED 59 out [bc],e ;[F8B1h]=50h ;/ 99FD 01 B0 F9 ld bc,F9B0 ;\ 9A00 3E 10 ld a,10h ; 9A02 ED 79 out [bc],a ;[F9B0h]=10h ;/ 9A04 FD 66 07 ld h,[iy+07] ;vram addr msb 9A07 2E 00 ld l,00 9A09 1E C0 ld e,0C0h ;=192 decimal (not 200 decimal!) @@ylop: 9A0B D5 push de 9A0C E5 push hl 9A0D CD 3D 9A call read_scanline 9A10 E1 pop hl 9A11 CD 11 96 call next_scanline 9A14 D1 pop de 9A15 1D dec e 9A16 20 F3 jr nz,@@ylop 9A18 C9 ret ;------------------ scan_last_8_lines: ;read 8 scanlines (LAST 8 lines after above 192 lines) 9A19 FD E5 push iy 9A1B E1 pop hl 9A1C 11 A8 00 ld de,00A8h 9A1F 19 add hl,de 9A20 01 B0 F9 ld bc,0F9B0h 9A23 16 08 ld d,08h @@ylop: 9A25 CD 3D 9A call read_scanline 9A28 15 dec d 9A29 20 FA jr nz,@@ylop 9A2B 3E 00 ld a,00h ;\ 9A2D ED 79 out [bc],a ;[F9B0h]=00h ;/ 9A2F 11 75 00 ld de,0075h ;\ 9A32 01 B0 F8 ld bc,0F8B0 ; 9A35 ED 51 out [bc],d ;[F8B0h]=00h ; 9A37 01 B1 F8 ld bc,0F8B1h ; 9A3A ED 59 out [bc],e ;[F8B1h]=75h ;/ 9A3C C9 ret ;------------------ read_scanline: ;in: BC=F9B0h, HL=dest .rept 50h ;\ 9A3D ED A2 ini ;[hl]=[F9B0h] ; read one scanline 9A3F 04 inc b ;undo "dec b" (occured in ini) ; (50h bytes) .endm ;/ 9B2D ED 78 in a,[bc] ;dummy=[F9B0h] ;-final dummy read 9B2F C9 ret ; (one "hblank" cycle) ;------------------ 9B30 FD E5 push iy 9B32 E1 pop hl 9B33 11 A8 00 ld de,00A8 9B36 19 add hl,de 9B37 3E 07 ld a,07 9B39 FD B6 07 or a,[iy+07] ;vram addr msb 9B3C 57 ld d,a 9B3D 1E 80 ld e,80 9B3F 01 50 08 ld bc,0850 @@ 9B42 C5 push bc 9B43 D5 push de 9B44 06 00 ld b,00 9B46 ED B0 ldir 9B48 D1 pop de 9B49 EB ex de,hl 9B4A 01 00 08 ld bc,0800 9B4D 09 add hl,bc 9B4E EB ex de,hl 9B4F C1 pop bc 9B50 10 F0 djnz 9B42 9B52 C9 ret ;------------------ 9B53 3E 07 ld a,07 9B55 FD B6 07 or a,[iy+07] ;vram addr msb 9B58 57 ld d,a 9B59 1E 80 ld e,80 9B5B AB xor a,e 9B5C 67 ld h,a 9B5D 6B ld l,e 9B5E 01 50 08 ld bc,0850 9B61 C5 push bc 9B62 E5 push hl 9B63 D5 push de 9B64 06 00 ld b,00 9B66 ED B0 ldir 9B68 E1 pop hl 9B69 01 00 08 ld bc,0800 9B6C 09 add hl,bc 9B6D EB ex de,hl 9B6E E1 pop hl 9B6F 09 add hl,bc 9B70 C1 pop bc 9B71 10 EE djnz 9B61 9B73 C9 ret ;------------------ 9B74 DD E5 push ix 9B76 FD 7E 07 ld a,[iy+07] ;vram addr msb 9B79 EE 80 xor a,80 9B7B FD 77 07 ld [iy+07],a ;vram addr msb 9B7E CD 08 BC call BC08 ;scr_set_base 9B81 FD E5 push iy 9B83 DD E1 pop ix 9B85 11 A8 00 ld de,00A8 9B88 DD 19 add ix,de 9B8A 3E 07 ld a,07 9B8C FD 86 07 add a,[iy+07] ;vram addr msb 9B8F 67 ld h,a 9B90 2E 80 ld l,80 9B92 AD xor a,l 9B93 57 ld d,a 9B94 5D ld e,l 9B95 06 08 ld b,08 9B97 C5 push bc 9B98 E5 push hl 9B99 D5 push de 9B9A 06 50 ld b,50 9B9C C5 push bc 9B9D 7E ld a,[hl] 9B9E 47 ld b,a 9B9F EB ex de,hl 9BA0 7E ld a,[hl] 9BA1 EB ex de,hl 9BA2 DD 4E 00 ld c,[ix+00] 9BA5 DD 70 00 ld [ix+00],b 9BA8 77 ld [hl],a 9BA9 79 ld a,c 9BAA 12 ld [de],a 9BAB 23 inc hl 9BAC 13 inc de 9BAD DD 23 inc ix 9BAF C1 pop bc 9BB0 10 EA djnz 9B9C 9BB2 E1 pop hl 9BB3 01 00 08 ld bc,0800 9BB6 09 add hl,bc 9BB7 EB ex de,hl 9BB8 E1 pop hl 9BB9 09 add hl,bc 9BBA C1 pop bc 9BBB 10 DA djnz 9B97 9BBD DD E1 pop ix 9BBF C9 ret ;------------------ set_nmi_vector: 9BC0 FD E5 push iy ;\ 9BC2 E1 pop hl ; 9BC3 11 28 03 ld de,0328 ; 9BC6 19 add hl,de ; 9BC7 EB ex de,hl ; save old NMI vector 9BC8 21 66 00 ld hl,0066 ; 9BCB 01 05 00 ld bc,0005 ; 9BCE C5 push bc ; 9BCF ED B0 ldir ; 9BD1 C1 pop bc ;/ 9BD2 21 DB 9B ld hl,nmi_handler ;\ 9BD5 11 66 00 ld de,0066h ; set new Z80 NMI vector 9BD8 ED B0 ldir ;/ 9BDA C9 ret ;--- nmi_handler: ;in: bc=F9B0, h=[iy+09h] (see "halt" opcode) 9BDB ED 61 out [bc],h ;[F9B0h]=[iy+09h] ;ack and/or disable nmi 9BDD 7A ld a,d ;apply a=time value (a=0 would mean no nmi, ie. timeout) 9BDE ED 45 retn ;------------------ restore_nmi_vector: 9BE0 FD E5 push iy ;\ 9BE2 E1 pop hl ; 9BE3 11 28 03 ld de,0328 ; 9BE6 19 add hl,de ; restore old NMI vector 9BE7 11 66 00 ld de,0066 ; 9BEA 01 05 00 ld bc,0005 ; 9BED ED B0 ldir ;/ 9BEF C9 ret ;------------------ do_sync_stuff: 9BF0 01 B0 F9 ld bc,F9B0 9BF3 FD 7E 08 ld a,[iy+08] 9BF6 6F ld l,a 9BF7 FD 7E 09 ld a,[iy+09] 9BFA 67 ld h,a 9BFB 11 E8 03 ld de,03E8h ;retry count ;\ 9BFE D5 push de ; @@redo_too_short: ; 9BFF D1 pop de ; 9C00 1B dec de ;retry count ; 9C01 7A ld a,d ; 9C02 B3 or a,e ; 9C03 C8 ret z ;retry giving up ; 9C04 D5 push de ;\ ; 9C05 CD 23 9C call @@do_dirty_sync ;in: bc=F9B0 ; ; 9C08 D1 pop de ;out: A=0=timeout ; ; 9C09 B7 or a,a ; A>0=time ; ; 9C0A C8 ret z ;---> timeout (no sync) ;/ ; 9C0B FE 10 cmp a,10h ;short = hsync ? ; 9C0D D5 push de ; 9C0E 38 EF jr c,@@redo_too_short ; 9C10 D1 pop de ;/ 9C11 CD 32 9C call @@do_exact_sync ;in: bc=F9B0 ;- 9C14 CB 0B ror e 9C16 D8 ret c 9C17 FD 7E 0A ld a,[iy+0A] 9C1A B7 or a,a 9C1B C0 ret nz 9C1C 3C inc a 9C1D FD 77 0A ld [iy+0A],a 9C20 C3 FB 9B jp 9BFB ;--- @@do_dirty_sync: ;in: bc=F9B0, out: A=0=timeout 9C23 16 01 ld d,01 9C25 AF xor a,a 9C26 ED 69 out [bc],l ;[F9B0h]=[iy+08] @@dirty_lop: 9C28 14 inc d 9C29 28 03 jr z,@@dirty_timeout ;---> nmi_handler ;in: bc=F9B0, h=[iy+09h] ;---> out: a=d (ie. a=01h=exit loop) 9C2B B7 or a,a 9C2C 28 FA jr z,@@dirty_lop @@dirty_timeout: 9C2E ED 61 out [bc],h ;[F9B0h]=[iy+09h] 9C30 B7 or a,a 9C31 C9 ret ;--- @@do_exact_sync: ;in: bc=F9B0 9C32 1E FF ld e,FF @@halt_lop: 9C34 AF xor a,a 9C35 ED 4F ld r,a 9C37 ED 69 out [bc],l ;[F9B0h]=[iy+08h] 9C39 76 halt ;maybe this waits for NMI ? ;---> nmi_handler ;in: bc=F9B0, h=[iy+09h] 9C3A ED 5F ld a,r 9C3C 1C inc e 9C3D FE 20 cmp a,20h ;too short 9C3F 38 F3 jr c,@@halt_lop 9C41 B7 or a,a 9C42 C9 ret ;------------------ wait_for_pic_ypos: 9C43 FD 4E 04 ld c,[iy+04] ;picture ypos ;\ 9C46 0C inc c ; wait max 256 times (vhold) 9C47 CD 50 9C call 9C50 ;/ 9C4A FD 7E 05 ld a,[iy+05] ;picture yextra ;\eventually wait another 9C4D A7 and a,a ; some times (=max 512 total) 9C4E C8 ret z ; (this extra wait seems to 9C4F 4F ld c,a ; be unused; always zero) ;- - - - ;/ @@ @@wait_lop: 9C50 06 0E ld b,0Eh 9C52 10 FE djnz $ 9C54 00 nop 9C55 00 nop 9C56 0D dec c 9C57 20 F7 jr nz,@@wait_lop 9C59 C9 ret ;------------------ set_inks_and_border: 9C5A CD 77 9C call @@get_inks_per_vmode 9C5D 48 ld c,b 9C5E 06 00 ld b,00h @@inks_lop: 9C60 C5 push bc 9C61 78 ld a,b 9C62 46 ld b,[hl] 9C63 48 ld c,b 9C64 23 inc hl 9C65 E5 push hl 9C66 CD 32 BC call BC32 ;scr_set_ink 9C69 E1 pop hl 9C6A C1 pop bc 9C6B 78 ld a,b 9C6C B9 cmp a,c 9C6D 28 03 jr z,@@inks_done 9C6F 04 inc b 9C70 18 EE jr @@inks_lop @@inks_done: 9C72 46 ld b,[hl] 9C73 48 ld c,b 9C74 C3 38 BC jp BC38 ;scr_set_border ;--- @@get_inks_per_vmode: 9C77 FD E5 push iy ;\ 9C79 E1 pop hl ; hl=iy+7Fh 9C7A 01 7F 00 ld bc,007Fh ; 9C7D 09 add hl,bc ;/ 9C7E FD 7E 02 ld a,[iy+02] ;video mode ;\ 9C81 FE 01 cmp a,01 ; choose mode 9C83 28 08 jr z,@@mode1 ; 9C85 30 10 jr nc,@@mode2 ;/ 9C87 11 A1 9C ld de,inks_mode0 ;\mode 0 9C8A 06 0F ld b,0Fh ;/ 9C8C C9 ret @@mode1: 9C8D 11 11 00 ld de,0011h 9C90 19 add hl,de 9C91 11 B2 9C ld de,inks_mode1 9C94 06 03 ld b,03h 9C96 C9 ret @@mode2: 9C97 11 16 00 ld de,0016h 9C9A 19 add hl,de 9C9B 11 B7 9C ld de,inks_mode2 9C9E 06 01 ld b,01h 9CA0 C9 ret ;--- inks_mode0: ;ink 0..15, border ;the color ramp here ;looks perfect on GT65 green monitor, ;but looks like crap on CTM644 color screens 9CA1 00 02 04 .. db 00h,02h,04h,05h,06h,08h,0Ah,0Ch 9CA9 0E 0F 11 .. db 0Eh,0Fh,11h,12h,15h,17h,19h,1Ah, 00h ;--- inks_mode1: ;ink 0..3, border 9CB2 00 0A 1A .. db 00h,0Ah,1Ah,14h, 00h ;<--these are NOT linear arranged!! ;--- inks_mode2: ;ink 0..1, border 9CB7 00 1A 00 db 00h,1Ah, 00h ;------------------ initial_crtc_values: ;N/A ;crtc[11h] N/A ;lightpen low ;N/A ;crtc[10h] N/A ;lightpen high 9CBA 00 db 0 ;crtc[0Fh] 0 ;cursor low 9CBB 00 db 0 ;crtc[0Eh] 0 ;cursor high 9CBC 00 db 0 ;crtc[0Dh] 0 ;start addr low 9CBD 00 db 0 ;crtc[0Ch] 0 ;start addr high 9CBE 00 db 0 ;crtc[0Bh] 0 ;cursor end 9CBF 00 db 0 ;crtc[0Ah] 0 ;cursor start 9CC0 07 db 07h ;crtc[09h] 07h ;max scanline (-1) 9CC1 00 db 0 ;crtc[08h] 0 ;interlace mode 9CC2 00 db 0 ;crtc[07h] 0 ;vertical sync pos 9CC3 19 db 19h ;crtc[06h] 19h ;vertical displayed 9CC4 00 db 0 ;crtc[05h] 0 ;vertical total adjust 9CC5 26 db 26h ;crtc[04h] 26h ;vertical total (-1) 9CC6 11 db 11h ;crtc[03h] 11h ;horizontal sync width 9CC7 5B db 5Bh ;crtc[02h] 5Bh or .. ;horizontal sync pos 9CC8 50 db 50h ;crtc[01h] 50h ;horizontal displayed 9CC9 75 db 75h ;crtc[00h] 75h or 50h ;horizontal total (-1) ;------------------ 9CCA ... ...