1 2 SECTION code_clib 3 4 PUBLIC vpeek_MODE2 5 EXTERN vpeek_screendollar 6 EXTERN __mc1000_modeval 7 8 defc DISPLAY = 0x8000 9 10;Entry: c = x, 11; b = y 12; e = rawmode 13;Exit: nc = success 14; a = character, 15; c = failure 16vpeek_MODE2: 17 ld hl,-8 18 add hl,sp 19 ld sp,hl 20 push hl ;Save buffer 21 ex de,hl ;get it into de 22 ld h,b ; y * 256 23 ld l,c 24 ld b,+(DISPLAY/256) 25 add hl,bc ;hl = screen 26 ex de,hl ;de = screen, hl = buffer 27 28 ; b7 b6 b5 b4 b3 b2 b1 b0 29 ; p0-0 p0-1 p1-0 p1-1 p2-0 p2-1 p3-0 p3-1 30 ld b,8 31 ld a,(__mc1000_modeval) 32 ex af,af 33handle_MODE2_per_line: 34 push bc 35 push hl ;save buffer 36 ld h,@10000000 37 ld c,0 ;resulting byte 38 ld a,2 ;we need to do this loop twice 39handle_mode1_nibble: 40 push af 41 ld l,@11000000 42 ld b,4 ;4 pixels in a byte 43handle_MODE2_0: 44 ex af,af 45 res 0,a 46 out ($80),a ;VRAM in 47 ex af,af 48 ld a,(de) 49 ex af,af 50 set 0,a 51 out ($80),a ;VRAM out 52 ex af,af 53 and l 54 jr z,not_set 55 ld a,c 56 or h 57 ld c,a 58not_set: 59 srl h 60 srl l 61 srl l 62 djnz handle_MODE2_0 63 inc de 64 pop af 65 dec a 66 jr nz,handle_mode1_nibble 67 pop hl ;buffer 68 ld (hl),c 69 inc hl 70 ld a,e 71 add 30 72 ld e,a 73 jr nc,no_overflow_MODE2 74 inc d 75no_overflow_MODE2: 76 pop bc 77 djnz handle_MODE2_per_line 78 jp vpeek_screendollar 79 80