Obrigado a Julio Marchi pelo espaço cedido na MSX All
 

SLOT View


SLOT View 1.0
Código fonte


1. Descrição do programa
Como funciona o Slot View

  A visualização de memória pode parecer uma tarefa simples a primeira vista, mas esbarra em alguns problemas. Esses problemas estão relacionados às seguintes características do funcionamento do programa:
  • O programa está rodando da página 2 da RAM;
  • São feitas chamadas às rotinas da BIOS que está localizada na página 0 da ROM do MSX;
  • O sistema utiliza a página 3 da RAM;
  • Entretanto, a página 1 está totalmente livre para o uso.
  Os slots (ou subslots) citados acima estão em uso e não poderão ser trocados sem que alguns cuidados sejam tomados. Esses slots serão referenciados como "subslots problema".
  Uma das estratégias adotadas para resolver o problema é copiar os conteúdo de memória localizados nas páginas 0, 2 e 3 para a página 1 da RAM, conforme pode ser visto na figura 1.


Figura 1 - Cópia

  Quando a RAM é expandida, deve-se adotar uma nova estratégia para o slot que contiver a RAM. Os sublots das páginas 0, 2 e 3 da RAM devem ser copiados para a página 1 da RAM, devido à questão de se trocar os "subslots problema".
  Observe na figura 2 os "subslots problema" assinalados em vermelho. A ROM do MSX sempre está no subslot 0-0. Já a RAM depende da versão do MSX. Vamos assumir que se localize no subslot 2-0. Observando a figura 2, fica visível o problema de se acessar os subslots das páginas 2 e 3 da RAM.


Figura 2 - Esquema de subslots

  Quando o programa tiver que visualizar outro subslot da página 2, há o problema de se perder o contato com o programa em execução. Dessa forma, há também uma rotina de cópia de memória na página 3 da RAM. Assim, quando é necessário visualizar a página 2, o programa é desviado para essa rotina na página 3, na qual é responsável por:
  • Trocar o subslot da página 2;
  • Fazer a cópia da página 2 para a página 1 da RAM;
  • Voltar a configuração original da página 2; e
  • Devolver o controle ao programa principal na página 2.

Esquema

Endereço Inicial Endereço Final Tamanho Nome Função Status
8D57 8D81 002A recctx Recupera contexto de slots quando sai. Ok
8D82 8DD0 004E salctx Salva contexto de slots. OK
8DD1 8E44 0074 copyslot Cópia de slot para pagina da RAM (pagina 2). OK
8E45 8FFF 01BA tela Tela principal compactada em Run-Length. Ok
9000 9017 0017 view-t Descompacta e exibe a tela principal. Ok
9018 909A 0082 dump2 Exibe informações da memória. Ok
909B 9144 00A9 bloco Exibe informações adicionais. Ok
9145 922F 00EB mudaslt Altera o slot e subslot. OK
      savepg Salva página em disco. Falta
9230 93C6 0196 main Programa principal. Beta

Main:
* Carrega a tela principal
* Setar o seguinte formato para A8: RAM RAM RAM ROM
* Pagina = 0
* Slot = 0
* Subslot = 0
* Endereço = 0
* Bloco = 0
* Atualiza informação
* Dump

Variaveis:
B000 - Configuração original dos Slots
B001 - Página atual
B002 - Slot Atual
B003 - Subslot Atual
B004 - endereço+offset
B005 - endereço+offset
B006 - bloco
B007 - Slot da RAM (valor de 0 a 3)
B008 - Subslots 0
B009 - Subslots 1
B00A - Subslots 2
B00B - Subslots 3
B00C - Subslots RAM

C000 - Cópia da rotina copyslot na página 3


Testes realizados

Acesso a slots (MSX Turbo R):

  Página 0 Página 1 Página 2 Página 3
Slot 0-0 Ok Ok Ok Ok
Slot 0-1 Ok Ok Ok Ok
Slot 0-2 Ok Ok Ok Ok
Slot 0-3 Ok Ok Ok Ok
Slot 1-0 Ok Ok Ok Ok
Slot 1-1 Ok Ok Ok Ok
Slot 1-2 Ok Ok Ok Ok
Slot 1-3 Ok Ok Ok Ok
Slot 2-0 Ok Ok Ok Ok
Slot 2-1 Ok Ok Ok Ok
Slot 2-2 Ok Ok Ok Ok
Slot 2-3 Ok Ok Ok Ok
Slot 3-0 Ok Ok Ok Ok
Slot 3-1 Ok Ok Ok Ok
Slot 3-2 Ok Ok Ok Ok
Slot 3-3 Ok Ok Ok Ok

  A RAM do MSX Turbo-R testada estava no Slot 3-0.


2. Código fonte
  Nota: o código assinalado em azul corresponde às mudanças efetuadas em relação à versão anterior.

recctx
   10 		ORG  &H8D57
   20 		IN   A,(&HA8)
   30 		LD   HL,&HB00B
   40 		LD   D,A
   50 		LD   A,&B00111111
   60 		AND  D
   70 		LD   C,A
   80 		LD   B,4
   90 		DI 
  100 LOOP:	LD   A,B
  110 		DEC  A
  120 		SLA  A
  130 		SLA  A
  140 		SLA  A
  150 		SLA  A
  160 		SLA  A
  170 		SLA  A
  180 		ADD  A,C
  190 		OUT  (&HA8),A
  200 		LD   A,(HL)
  210 		DEC  HL
  220 		CPL 
  230 		LD   (&HFFFF),A
  240 		DJNZ LOOP
  250 		LD   A,D
  260 		OUT  (&HA8),A
  270 		EI 
  280 		RET

salctx
   10 		ORG  &H8D82
   20 		IN   A,(&HA8)
   30 		LD   HL,&HB00C
   40 		LD   D,A
   50 		LD   A,&B00111111
   60 		AND  D
   70 		LD   C,A
   80 		LD   B,4
   90 		DI 
  100 LOOP:	LD   A,B		; Carrega informacoes de slots
  110 		DEC  A			; para variaveis
  120 		SLA  A
  130 		SLA  A
  140 		SLA  A
  150 		SLA  A
  160 		SLA  A
  170 		SLA  A
  180 		ADD  A,C
  190 		OUT  (&HA8),A
  200 		LD   A,(&HFFFF)
  210 		DEC  HL
  220 		LD   (HL),A
  230 		DJNZ LOOP
  240 		LD   A,D
  250 		OUT  (&HA8),A
  260 		LD   B,&B00110000
  270 		AND  B
  280 		SRL  A
  290 		SRL  A
  300 		SRL  A
  310 		SRL  A
  320 		LD   (&HB007),A		; Indica qual o slot da RAM 
  330 		LD   A,(&HFFFF)
  340 		LD   C,&B11110000
  350 		AND  C
  360 		LD   C,A
  370 		SRL  A
  380 		SRL  A
  390 		SRL  A
  400 		SRL  A
  410 		ADD  A,C
  420 		CPL 
  430 		LD   (&HFFFF),A		; Ajusta slot da RAM para RAM RAM RAM RAM
  435		LD   (&HB00C),A		; Salva variavel
  440 		EI 
  450 		RET 

copyslot
   10 		ORG  &H8DD1
   50 		LD   DE,(&HB004)	; Endereço para cópia
   60 		LD   HL,&HB002		; Configura SLOT
   70 		LD   C,(HL)
   80 		LD   HL,&HB001
   90 		LD   B,(HL)		; Carrega pagina atual
  100 		XOR  A
  110 		CP   B
  120 		LD   A,&B00000011	; Caso pagina 0
  130 		JR   Z,SLT0
  140 		SLA  C
  150 		SLA  C
  160 		SLA  C
  170 		SLA  C
  171 		LD   A,(&HB007)
  172 		LD   B,A
  173 		LD   A,(&HB002)
  174 		CP   B
  175 		JR   NZ,PGII		; Se Slot nao for RAM, segue em PGII
  176 SLRAM:	LD   A,(&HB00C)
  177 		LD   (&HC200),A
  178 		LD   C,A
  179 		LD   A,&B11001111
  180 		AND  C
  181 		LD   B,A
  182 		LD   A,(&HB003)
  183 		SLA  A
  184 		SLA  A
  185 		SLA  A
  186 		SLA  A
  187 		ADD  A,B
  188 		LD   (&HFFFF),A
  189 		LD   C,1
  190 		LD   HL,&H4000
  191		LD   DE,&H8000
  192 		JR   LOOP		; USO do JR obrigatorio - mudanca para C000 
  198 PGII:	LD   A,&B00110000	; Caso pagina 2
  199 SLT0:	LD   HL,&HB000
  200 		LD   B,(HL)
  210 		CPL 
  220 		AND  B
  230 		ADD  A,C
  240 		OUT  (&HA8),A
  245 		LD   C,0		; Indica que nao e' RAM+PG2
  250 		LD   HL,&H4000
  260 LOOP:	LD   A,(DE)
  270 		LD   (HL),A
  280 		INC  HL
  290 		INC  DE
  300 		XOR  A
  310 		CP   L
  320 		JR   NZ,LOOP
  330 		LD   A,&H80
  340 		CP   H
  350 		JR   NZ,LOOP
  351 		XOR  A
  352 		CP   C
  353 		JR   Z,FIM
  354 		LD   A,(&HC200)
  355 		LD   (&HFFFF),A
  356 		RET 
  370 FIM:	LD   A,B
  380 		OUT  (&HA8),A
  390 		RET 

view-t
   10 		ORG  &H9000
   20 		LD   DE,&H8E45		; Endereço original da tela compactada 
   25 		LD   HL,0
   30 INICIO:	LD   A,(DE)
   40 		OR   0
   50 		JR   Z,FIM
   60 		LD   B,A
   70 		INC  DE
   80 		LD   A,(DE)
   90 LOOP:     CALL &H004D
  100 		INC  HL
  120 		DJNZ LOOP
  130 		INC  DE
  140 		JR   INICIO
  150 FIM:	RET 

dump2
   10 		ORG  &H9018
   11 		LD   DE,(&HB004)	; Posição de Memoria
   12 		CALL TESTE		; Teste para ajustar para &H4000
   30 		LD   HL,268		; Posicao inicial ASCII
   40 		EXX 			; Troca modo interno
   50 		LD   B,16		; 16 linhas de texto
   60 		LD   HL,242		; Posicao inicial HEXA
   70 LE:	EXX 			; Troca modo externo
   80 		LD   B,8
   90 LI:	LD   A,(DE)
  100 		LD   C,A
  110 		CP   33			; Inicio Impressao ASCII
  120 		JP   C,DOT
  130 		CP   127
  140 		JR   C,NDOT
  150 DOT:	LD   A,46
  160 NDOT:	CALL &H004D
  170 		INC  DE
  180 		INC  HL			; Fim impressao ASCII
  190 		LD   A,C
  200 		EXX 			; Troca modo interno
  210 		LD   C,A
  220 		AND  &B11110000		; Inicio impressao Hexa
  230 		SRL  A
  240 		SRL  A
  250 		SRL  A
  260 		SRL  A
  270 		CP   10
  280 		JR   C,NUM1
  290 		ADD  A,7
  300 NUM1:	ADD  A,48
  310 		CALL &H004D
  320 		LD   A,C
  330 		AND  &B00001111
  340 		CP   10
  350 		JR   C,NUM2
  360 		ADD  A,7
  370 NUM2:	ADD  A,48
  380 		INC  HL
  390 		CALL &H004D
  400 		INC  HL
  410 		INC  HL			; Fim impressao Hexa
  420 		EXX 			; Troca modo externo
  430 		DJNZ LI
  440 		EXX 			; Troca modo interno
  450 		LD   DE,16		; Proxima linha Hexa
  460 		ADD  HL,DE
  470 		EXX 			; Troca modo externo
  480 		PUSH DE
  490 		LD   DE,32
  500 		ADD  HL,DE
  510 		POP  DE
  520 		EXX 			; Troca modo interno
  530 		DJNZ LE
  540 		EXX 			; Troca modo externo
  550 		RET 
  560 TESTE:	LD   HL,&HB001
  570 		LD   A,(HL)
  571 		LD   B,1		; Verifica se pagina e' 1
  572 		CP B
  573 		RET Z			; Retorna se verdade
  580 		LD   B,0
  590 		CP   B
  591 		JR   NZ,AK2
  592 		LD   HL,&H4000		; Se pagina for 0, some 4000 ao endereco
  593 AK1:	ADD  HL,DE		; Corrige endereco para pagina 1
  594 		LD   D,H
  595 		LD   E,L
  596 		RET 
  600 AK2:	LD   HL,&HC000		; Se pagina for 2, some C000 ao endereco
  610 		LD   B,2
  620 		CP   B
  630 		JR   Z,AK1
  640 		LD HL,&H8000		; Se pagina for 3, some 8000 ao endereco
  650		JR AK1

bloco
   10 		ORG  &H909B
   20 		LD   HL,&HB006		; Impressao do bloco
   30 		LD   A,(HL)
   40 		LD   D,0
   50 		LD   E,A
   60 		LD   HL,168
   70 		CALL END
   80 		JR   E2
   90 END:	LD   A,E
  100 		SRL  A
  110 		SRL  A
  120 		SRL  A
  130 		SRL  A
  140 		CALL ASCII
  150 		CALL &H004D
  160 END2:	LD   A,E
  170 		AND  &B00001111
  180 		CALL ASCII
  190 		INC  HL
  200 		CALL &H004D
  210 		RET 
  220 ASCII:	CP   10
  230 		JR   C,NUM1
  240 		ADD  A,7
  250 NUM1:	ADD  A,48
  260 		RET 
  270 E2:	LD   DE,(&HB004)	; Impressao do endereco atual
  330 		LD   HL,127
  340 		ADD  HL,DE
  350 		LD   B,H
  360 		LD   C,L
  370 		LD   HL,178
  380 		CALL END
  390 		LD   HL,176
  400 		LD   E,D
  410 		CALL END
  420 		LD   D,B
  430 		LD   E,C
  440 		LD   HL,183
  450 		CALL END
  460 		LD   HL,181
  470 		LD   E,D
  480 		CALL END
  490 		LD   HL,&HB002		; Impressao do slot atual
  500 		LD   A,(HL)
  510 		LD   E,A
  520 		LD   HL,86
  530 		CALL END2
  540 		LD   HL,&HB003		; Impressao do subslot atual
  550 		LD   A,(HL)
  560 		LD   E,A
  570 		LD   HL,88
  580 		CALL END2
  590 		LD   HL,&HB001		; Impressao da pagina atual
  600 		LD   A,(HL)		; e os limites fisicos (?000-?FFF)
  610 		LD   B,A
  620 		XOR  A
  630 		CP   B
  640 		JR   NZ,P1
  650 		LD   DE,&H0003
  660 		JR   PP
  670 P1:	LD   A,1
  680 		CP   B
  690 		JR   NZ,P2
  700 		LD   DE,&H0407
  710 		JR   PP
  720 P2:	LD   A,2
  730 		CP   B
  740 		JR   NZ,P3
  750 		LD   DE,&H080B
  760 		JR   PP
  770 P3:	LD   A,3
  780 		LD   DE,&H0C0F
  790 PP:	LD   HL,106
  800 		CALL END2
  810 		LD   E,D
  820 		LD   HL,101
  830 		CALL END2
  840 		LD   HL,98
  850 		LD   E,B
  860 		CALL END2
  870 		RET 

mudaslt
   10 		ORG  &H9145
   11 		LD   A,(&HB00C)		; * Ajusta para RAM RAM RAM RAM
   12 		LD   (&HFFFF),A		; *
   13 		DI			; Desbilita as interrupções 
   12 		LD   A,(&HB007)		; *
   14 		LD   B,A		; *
   15 		LD   A,(&HB002)		; *  Verifca se o slot e' o da RAM
   16 		CP   B			; *
   17 		JP   NZ,NORM		; *  e se a pagina e' 2.
   18 		LD   B,2		; *
   19 		LD   A,(&HB001)		; *  Se sim, direto para C000.
   20 		CP   B			; *
   21 		JP   NZ,NORM		; *
   22 		CALL &HC000		; *
   23		EI
   24 		RET 
   30 NORM:	LD   HL,&HB000
   40 		LD   A,(HL)
   50 		JP   ENASS		; Chama rotina de troca de subslots
   60 INI:	LD   HL,&HB001		; Verifica pagina atual
   70 		LD   B,(HL)
   80 		LD   D,B
   90 		LD   A,2
  100 		CP   B
  110 		JR   NZ,N1		; Se pagina nao for 2, entao N1
  120 D1:	CALL &HC000		; Se for pagina 2, rode rotina da pg 3 da RAM
  130 		JR   FIM
  140 N1:	XOR  A			; 
  150 		CP   B			; Se pagina for 0, entao rode
  160 		JR   NZ,N2		; da pg 3 da RAM (C000)
  170 		JR   D1			;
  180 N2:	LD   HL,&HB002
  190 		LD   C,(HL)
  200 		LD   A,3
  210 LI1:	SLA  C
  220 		SLA  C
  230 		SLA  A
  240 		SLA  A
  250 		DJNZ LI1
  260 LF1:	CPL 
  270 		LD   B,A
  280 		IN   A,(&HA8)
  290 		AND  B
  300 		OR   C
  310 		OUT  (&HA8),A		; Ativa slot na  pagina 0 ou 3
  320 		LD   A,3
  330 		CP   D
  340 		JR   Z,COPY		; Se pagina for 3, copia
  350 		JR   FIM		; Senao, fim
  360 COPY:	LD   DE,&HC000
  370 		LD   HL,&H4000
  380 L3:	LD   A,(DE)
  390 		LD   (HL),A
  400 		INC  DE
  410 		INC  HL
  420 		XOR  A
  430 		CP   E
  440 		JR   NZ,L3
  450 		CP   D
  460 		JR   NZ,L3
  470 		LD   HL,&HB000
  480 		LD   A,(HL)
  490 		OUT  (&HA8),A
  500 FIM:	CALL RCRAM
  510 		EI 
  520 		RET 
  530 ENASS:	LD   HL,&HB002		; Troca para subslot requerido
  540 		LD   C,(HL)		; (B002 e B003)
  550 		LD   B,3
  560 ENL1:	SLA  C
  570 		SLA  C
  580 		DJNZ ENL1
  590 		LD   B,&B00111111
  600 		AND  B
  610 		ADD  A,C
  620 		OUT  (&HA8),A		; Faz SLxxxxxx
  630 		LD   HL,&HB001
  640 		LD   B,(HL)
  650 		LD   HL,&HB003
  660 		LD   D,(HL)
  670 		XOR  A
  680 		CP   B
  690 		LD   A,3
  700 		JR   Z,ENN1
  710 ENL2:	SLA  D
  720 		SLA  D
  730 		SLA  A
  740 		SLA  A
  750 		DJNZ ENL2
  760 ENN1:	CPL 
  770 		LD   C,A
  780 		LD   HL,&HFFFF
  790 		LD   A,(HL)
  800 		CPL 
  810 		AND  C
  820 		ADD  A,D
  830 		LD   (HL),A
  840 		LD   HL,&HB000
  850 		LD   A,(HL)
  860 		OUT  (&HA8),A
  870 		JP   INI		; Proibido usar pilha (RET) aqui (slot RAM.x) 
  890 RETSS:	IN   A,(&HA8)		; Recupera slot
  900 		LD   D,A
  910 		LD   HL,&HB002
  920 		LD   C,(HL)
  930 		LD   B,3
  940 REL1:	SLA  C
  950 		SLA  C
  960 		DJNZ REL1
  970 		LD   B,&B00111111
  980 		AND  B
  990 		ADD  A,C
 1000 		OUT  (&HA8),A
 1010 		XOR  A
 1020 		LD   HL,&HFFFF
 1030 		LD   (HL),A
 1040 		LD   A,D
 1050 		OUT  (&HA8),A
 1060 		RET 
 1200 RCRAM:	LD   A,(&HB001)
 1201 		LD   B,1
 1202 		CP   B
 1203 		RET  Z			; Se pagina for 1, volte
 1210 		LD   A,(&HB002)
 1215 		LD   B,A
 1220 		LD   A,(&HB007)
 1230 		CP   B			; O slot atual e' RAM?
 1240 		JP   NZ,RETSS		; Caso negativo, RETSS
 1280 RCR:	LD   A,(&HB00C)		; Se sim, recupera subslots da RAM
 1370 		LD   (&HFFFF),A
 1380 		RET 

main

   10 		ORG  &H9230
   20 		CALL &H6C		; INITTXT (Screen 0)
   30 		LD   HL,&HFCA9		; *
   40 		LD   A,1		; * Desaparece Cursor 
   50 		LD   (HL),A		; *
   60 		LD   DE,&H8E0C		; % 
   70 		LD   HL,&HC000		; %
   80 		LD   B,&H39		; % Copia "copyslot"
   90 SLFC:	LD   A,(DE)		; % para pagina 3
  100 		LD   (HL),A		; % 
  110 		INC  DE			; %
  120 		INC  HL			; %
  130 		DJNZ SLFC		; %
  140 		CALL &H9000		; Descompacta e exibe a tela
  145		CALL &H8DBD		; Chama o "salcxt"
  150 		IN   A,(&HA8)		; *
  160 		LD   B,A		; *
  170 		LD   A,&B00110000	; * Obtem configuracao de Slots
  180 		AND  B			; * E altera para o formato
  190 		SRL  A			; * RAM RAM RAM ROM 
  200 		SRL  A			; *  3   2   1   0   
  210 		OR   B			; *
  220 		OUT  (&HA8),A		; *
  230 		LD   HL,&HB000		; % Passa configuracao de slots 
  240 		LD   (HL),A		; % para B000
  250 		XOR  A			; Zera acumulador
  260 		LD   B,6		; *
  270 LP1:	INC  HL			; * Zera todas as variáveis
  280 		LD   (HL),A		; * de B001 a B006
  290 		DJNZ LP1		; *
  300 		CALL &H9145		; Rotina "Muda Slot"
  310 TECL:	CALL &H9018		; Rotina "Dump de Memoria"
  320 		CALL &H909B		; Rotina "Informacoes"
  330 		CALL &H9F		; CHGET - Espera tecla
  340 		LD   B,A		; % 
  350 		LD   B,&H1B		; % 
  360 		CP   B			; % 
  370 		JR   Z,ESC		; % 
  380 		LD   B,&H1D		; % 
  390 		CP   B			; % 
  400 		JR   Z,ESQ		; % 
  410 		LD   B,&H1C		; % 
  420 		CP   B			; % 
  430 		JR   Z,DIR		; % 
  440 		LD   B,&H1E		; % 
  450 		CP   B			; % 
  460 		JP   Z,CIMA		; % 
  470 		LD   B,&H1F		; % 
  480 		CP   B			; % 
  490 		JP   Z,BAIXO		; % 
  500 		LD   B,&H53		; % Switch (tecla)
  510 		CP   B			; % {
  520 		JP   Z,S		; %   case ...
  530 		LD   B,&H73		; % }
  540 		CP   B			; % 
  550 		JP   Z,S		; % 
  560 		LD   B,&H50		; % 
  570 		CP   B			; % 
  580 		JP   Z,P		; % 
  590 		LD   B,&H70		; % 
  600 		CP   B			; % 
  610 		JP   Z,P		; % 
  620 		LD   B,&H55		; % 
  630 		CP   B			; % 
  640 		JP   Z,U		; % 
  650 		LD   B,&H75		; % 
  660 		CP   B			; % 
  670 		JP   Z,U		; % 
  680 		JP   TECL		; % 
  690 ESC:	LD   HL,&HB000		; *
  700 		LD   A,(HL)		; *
  710 		LD   B,A		; *
  720 		LD   A,&B11110000	; * Case Esc:
  730 		AND  B			; * Retorne a configuracao de slots,
  740 		OUT  (&HA8),A		; * limpe a tela e saia
  745		CALL ZEROSS		; * 
  750 		XOR  A			; *
  760 		CALL &HC3		; *
  761		CALL &H8D92		; * Recupera contexto (recctx)
  762		XOR  A			; *
  763		LD   (&HFCA9),A		; * Recupera variavel do sistema
  770 		RET 			; *
  780 ESQ:	LD   HL,&HB006		; % 
  790 		LD   B,(HL)		; % 
  800 		LD   A,&HFB		; % 
  810 		ADD  A,B		; % 
  820 		LD   B,&HFB		; % 
  830 		CP   B			; % 
  840 		JP   Z,TECL		; % 
  850 		JP   C,ESQ1		; % Case Esq:
  860 		LD   A,0		; % Volte 5 paginas de memoria
  870 ESQ1:	LD   (HL),A		; % 
  880 		LD   DE,(&HB004)	; % 
  890 		JR   C,ESQ2		; % 
  900 		LD   L,0		; % 
  910 		LD   A,&HF0		; % 
  920 		AND  D			; % 
  930 		LD   H,A		; % 
  940 		JR   ESQ3		; % 
  950 ESQ2:	LD   HL,&HFD80		; % 
  960 		ADD  HL,DE		; % 
  970 ESQ3:	LD   (&HB004),HL	; % 
  980 		CALL &H9018		; % 
  990 		JP   TECL		; % 
 1000 DIR:	LD   HL,&HB006		; * 
 1010 		LD   B,(HL)		; * 
 1020 		LD   A,5		; * 
 1030 		ADD  A,B		; * 
 1040 		LD   B,&H84		; * 
 1050 		CP   B			; * 
 1060 		JP   Z,TECL		; * 
 1070 		LD   B,&H7F		; * 
 1080 		CP   B			; * 
 1090 		JP   C,D1		; * 
 1100 		LD   A,&H7F		; * Case Dir:
 1110 D1:	LD   (HL),A		; * Avance 5 paginas de memoria
 1120 		LD   DE,(&HB004)	; * 
 1130 		JR   C,D2		; * 
 1140 		LD   L,&H80		; * 
 1150 		LD   A,&HF0		; * 
 1160 		AND  D			; * 
 1170 		LD   D,&HF		; * 
 1180 		ADD  A,D		; * 
 1190 		LD   H,A		; * 
 1200 		JR   D3			; * 
 1210 D2:	LD   HL,&H0280		; * 
 1220 		ADD  HL,DE		; * 
 1230 D3:	LD   (&HB004),HL	; * 
 1240 		CALL &H9018		; * 
 1250 		JP   TECL		; * 
 1260 CIMA:	LD   HL,&HB006		; % 
 1270 		LD   B,(HL)		; % 
 1280 		XOR  A			; % 
 1290 		CP   B			; % 
 1300 		JP   Z,TECL		; % 
 1310 		DEC  B			; % Case Cima:
 1320 		LD   (HL),B		; % Volte 1 pagina 
 1330 		LD   DE,(&HB004)	; % 
 1340 		LD   HL,&HFF80		; % 
 1350 		ADD  HL,DE		; % 
 1360 		LD   (&HB004),HL	; % 
 1370 		CALL &H9018		; % 
 1380 		JP   TECL		; % 
 1390 BAIXO:	LD   HL,&HB006		; * 
 1400 		LD   B,(HL)		; * 
 1410 		LD   A,&H7F		; * 
 1420 		CP   B			; * 
 1430 		JP   Z,TECL		; * 
 1440 		INC  B			; * Case Baixo:
 1450 		LD   (HL),B		; * Avance 1 pagina
 1460 		LD   DE,(&HB004)	; * 
 1470 		LD   HL,&H0080		; * 
 1480 		ADD  HL,DE		; * 
 1490 		LD   (&HB004),HL	; * 
 1500 		CALL &H9018		; * 
 1510 		JP   TECL		; * 
 1520 S:	LD   HL,&HB002		; % 
 1530 		LD   A,(HL)		; % 
 1540 PUS:	INC  A			; %   
 1550 		LD   B,4		; % 
 1560 		CP   B			; % Case S:
 1570 		JR   NZ,S1		; % Avance um Slot
 1580 		XOR  A			; % 
 1590 S1:	LD   (HL),A		; % 
 1600 		CALL INISLT		; % 
 1610 		CALL &H9145		; % 
 1620 		JP   TECL		; % 
 1630 U:	LD   HL,&HB003		; * Case U:
 1640 		LD   A,(HL)		; * Avance um subslot
 1650 		JR   PUS		; * 
 1660 P:	LD   HL,&HB001		; % Case P:
 1670 		LD   A,(HL)		; % Avance uma pagina
 1680 		JR   PUS		; % 
 1690 INISLT:	LD   HL,&HB001		; * 
 1700 		LD   B,(HL)		; * 
 1710 		LD   HL,&HB005		; * 
 1720 		XOR  A			; * 
 1730 		CP   B			; * 
 1740 		JR   NZ,INI2		; * 
 1750 		LD   (HL),A		; * 
 1760 		JR   BACK		; * 
 1770 INI2:	LD   A,1		; * 
 1780 		CP   B			; * Rotinas de Ajustes
 1790 		JR   NZ,INI3		; * 
 1800 		LD   A,&H40		; * 
 1810 		LD   (HL),A		; * 
 1820 		JR   BACK		; * 
 1830 INI3:	LD   A,2		; * 
 1840 		CP   B			; * 
 1850 		JR   NZ,INI4		; * 
 1860 		LD   A,&H80		; * 
 1870 		LD   (HL),A		; * 
 1880 		JR   BACK		; * 
 1890 INI4:	LD   A,&HC0		; * 
 1900 		LD   (HL),A		; * 
 1910 BACK:	DEC  HL			; * 
 1920 		XOR  A			; * 
 1930 		LD   (HL),A		; * 
 1940 		LD   HL,&HB006		; * 
 1950 		LD   (HL),A		; * 
 1960 		RET 			; *
 1970 ZEROSS:	LD   B,A		; % 
 1980 		LD   C,&B00111111	; % 
 1990 		AND  C			; % 
 2000 		LD   HL,&HFFFF		; % Rotina de retorno de
 2010 		DI			; % configuracao inicial
 2020 		OUT  (&HA8),A		; % de slots
 2030 		XOR  A			; %  
 2040 		LD   (HL),A		; % 
 2050 		LD   A,B		; % 
 2060 		OUT  (&HA8),A		; % 
 2070 		EI
 2080 		RET


Marcelo Silveira
Engenheiro de Sistemas e Computação
Especialista em Processamento de Imagens e Inteligência Artificial
© MarMSX 1999-2024