You are on page 1of 103

Disassembly comentado da interface de drive CAS 1986

Autor: Flvio Massao Matsumoto, baseado no trabalho de Jorge Braga da Silva.


Verso: 2012.07.18 - WIP
Imagem da ROM decodificada e fornecida por Eduardo Luccas.
Este trabalho pode ser utilizado e distribudo de forma livre, porm no h garantias de
nenhuma espcie. Use exclusivamente por sua conta e risco.
Cabealho do disassembler.
; z80dasm 1.1.0
; command line: z80dasm -z -l -t -a -g 0 CAS-1986-16K.BIN
;
;
org 00000h
;

Primeira pgina (0-8191/#0000-#1FFF) da ROM


A rea de ROM do TK tem tamanho de 16kb, mas a ROM da interface CAS s tem 8kb. Os 16kb
so paginados em duas pginas de 8kb, que so repeties da ROM da interface contendo o
DOS.
A primeira pgina usada para as rotinas de inicializao do TK, algumas sub-rotinas de
acesso curto atravs de instrues RST, e de tratamento de NMI. O restante da pgina cpia
das rotinas usadas na segunda pgina.
A primeira pgina tratada como pontos de entrada das rotinas mencionadas, mas logo
efetuado salto para as rotinas da segunda pgina.

RESET RST 0 / RST #00


Rotina de inicializao do computador e da interface, quando ligada a fonte de alimentao
ou dado reset no Z80. As interrupes esto inibidas, e a ROM Beta est ativada.
0 53
ld d,e
; No tem funo.
1 11 ff ff
ld de,65535
; DE=ltimo endereo fsico da RAM.
4 3e 07
ld a,7
; A=cor da borda da tela branca.
6 18 01
jr RESET1
; Salta para segunda pgina da ROM.
RST 8 / RST #08. No utilizado.
8 00
nop
RESET1
Continuao do RESET.
9 d3 fe
out (254),a
11 3e 3f
ld a,63
13 18 04
jr RESET2
15 00
nop

;
;
;
;

Exibe borda branca na tela.


A=valor a ser atribudo no reg. I.
Salta para segunda pgina da ROM.
Byte no usado.

PRNCHR RST 16 / RST #10


Imprime caractere no acumulador.
16 c3 21 3d
jp PRNCHR1
RESET2
Continuao do RESET1.
19 ed 47
ld i,a
21 c3 1b 20
jp RESET3

; Salta para segunda pgina da ROM.

; Atribui valor 63 para registrador I.


; Salta para segunda pgina da ROM.

PRNSTR RST 24 / RST #18


Imprime string a partir do endereo apontado por HL. Encerra quando encontra um byte 0 ou
com bit 7 levantado. No segundo caso, abaixa o bit 7 e imprime antes de retornar.
24 c3 7b 37
jp PRNSTR1
;Salta para segunda pgina da ROM.
Cpia dos endereos 8219-8223 da segunda pgina.
27
defs 5

HLSAVER RST 32 / RST #20


Salva temporariamente o HL na varivel de sistema , durante chamada a uma rotina da ROM
BASIC.
32 22 02 5d
ld (HLTEMP),hl
; Guarda HL na varivel de sistema DOS.
35 c9
ret
; Fim.
Cpia dos endereos 8228 a 8231 da segunda pgina.
36
defs 4

RST 40 / RST #28


40 c3 b7 33
jp l33b7h
; Salta para segunda pgina da ROM.
Cpia dos endereos 8235 a 8292 da segunda pgina.
Sobrepe-se a RST 48/#30 e RST 56/#38, que no so usados.
43
defs 58
Byte no usado.
101 ff
defb #ff

NMI (102/#66)
Rotina de interrupo no mascarvel (NMI). Quando o boto mgico da interface acionada, o
Z80 recebe um sinal 0 no pino /NMI. Como resultado, as interrupes mascarveis so
desativadas, e feito uma chamada CALL para o endereo 102.
102 c3 da 39
jp NMI1
; Salta para segunda pgina da ROM.
Cpia dos endereos 8297 a 16383 da segunda pgina.
105
defs 8087

Segunda pgina (8192-16383/#2000-#3FFF) da ROM


A maior parte das rotinas do DOS situa-se na segunda pgina da ROM.
A rea de 15360-15615/#3C00-#3CFF interceptada pela interface CAS e fica acessvel
mesmo quando a ROM BASIC est habilitada.
Cpia dos endereos 0 a 26 da primeira pgina da ROM.
8192
defs 24
RESET3
Continuao do RESET2.
8219 00
nop
8220 00
nop
8221 00
nop
8222 18 04
jr RESET4
;Salta adiante.
Cpia dos endereos 32 a 35 da primeira pgina da ROM.
8224
defs 5
RESET4
Continuao do RESET3.
8228 62
ld h,d
8229 6b
ld l,e
8230 18 03
jr RESET5
8232 c3 b7 33
jp l33b7h
RESET5
8235 36 02
ld (hl),2
8237 2b
dec hl
8238 bc
cp h
8239 20 fa
jr nz,RESET5
RESET6
8241 b7
or a
8242 ed 52
sbc hl,de
8244 19
add hl,de
8245 23
inc hl
8246 30 06
jr nc,RESET7
8248 35
dec (hl)
8249 28 03
jr z,RESET7
8251 35
dec (hl)
8252 28 f3
jr z,RESET6

; HL=65535, ltimo byte da RAM possvel.


;
;

. . 3

; Coloca valor 2 em cada byte do RAM.


; Diminui HL.
; Se H<>63 (isto , HL=16383)
; repete para prximo byte da RAM.
; Flag CARRY=0.
; HL=HL#FFFF, seguido de
; HL=HL+#FFFF (se HL=#FFFF, CARRY=0).
; Aumenta endereo.
; Se HL era #FFFF/65535, sai do lao.
; Diminui (HL), deve resultar 1,
;mas se foi 0, sai do lao.
; Diminui (HL), deve resultar 0,
;se for continua o lao para prximo

;byte.
RESET7
8254 2b

dec hl

; Volta HL uma posio atrs, para o


;ltimo byte da RAM.
8255 22 b4 5c
ld (P_RAMT),hl
;e define valor de P_RAMT.
8258 11 af 3e
ld de,16047
; Aponta para a tabela de caracteres da
;ROM, no ltimo byte de U.
8261 01 a8 00
ld bc,168
; Nmero de bytes em 21 caracteres.
8264 7b
ld a,e
; A=175.
8265 eb
ex de,hl
; DE=destino, HL=origem.
8266 31 00 60
ld sp,24576
; Valor temporrio de SP.
8269 cd c8 3c
call LDD_ROM_B
; Copia bitmap de 21 caracteres na rea
;de grficos definidos pelo utilizador.
8272 eb
ex de,hl
; HL= endereo um byte acima do UDG.
8273 23
inc hl
; HL= endereo do incio do UDG.
8274 22 7b 5c
ld (UDG),hl
; Atribui valor varivel de sistema.
8277 2b
dec hl
; RAMTOP ser um byte acima de UDG.
8278 01 40 1e
ld bc,#1e40
; Atribui RASP = #40 (64) e
8281 ed 43 38 5c ld (RASP),bc
;PIP = #1E (30).
8285 22 b2 5c
ld (RAMTOP),hl
; Atribui RAMTOP.
8288 21 00 3c
ld hl,15360
; Valor para CHARS.
8291 18 04
jr RESET8
; Salta adiante.
Cpia dos endereos 101 a 104 da primeira pgina da ROM.
8293
defs 4
RESET8
Continuao do RESET4.
8297 22 36 5c
ld (CHARS),hl
8300 2a b2 5c
ld hl,(RAMTOP)
8303 36 3e
ld (hl),#3E
8305 2b
dec hl
8306 f9
ld sp,hl
8307 2b
dec hl
8308 2b
dec hl
8309 22 3d 5c
ld (ERR_SP),hl
8312 11 03 13
ld de,4867
8315 d5
push de
8316 ed 56
im 1
8318 fd 21 3a 5c ld iy,ERR_NR
8322 21 b6 5c
ld hl,23734
8325 22 4f 5c
ld (CHANS),hl
8328 11 af 15
ld de,#15af
8331 01 15 00
ld bc,21
8334 eb
ex de,hl
8335 cd cf 3c
call LDI_ROM_B
8338 eb
ex de,hl
8339 2b
dec hl
8340 22 57 5c
ld (DATADD),hl
8343 23
inc hl
8344 22 53 5c
ld (PROG),hl
8347 22 4b 5c
ld (VARS),hl
8350 36 80
ld (hl),128
8352 23
inc hl
8353 22 59 5c
ld (E_LINE),hl
8356 36 0d
ld (hl),13
8358 23
inc hl
8359 36 80
ld (hl),128
8361 23
inc hl
8362 22 61 5c
ld (WORKSP),hl
8365 22 63 5c
ld (STKBOT),hl
8368 22 65 5c
ld (STKEND),hl
8371 3e 38
ld a,56
8373 32 8d 5c
ld (ATTR_P),a

; Atribui varivel de sistema.


; HL aponta para topo da RAM e
;coloca o valor #3E.
; A posio seguinte deixada em 0, por;tanto o ltimo valor da pilha #3E00.
; Calcula valor de ERR_SP e
;a atribui.
; Coloca na pilha endereo de MAIN-4/#1303
;da ROM BASIC, que imprime mensagem.
; Aciona modo de interrupo 1.
; No BASIC, IY sempre deve apontar 23610.
; Endereo base da rea de informaes
;de canais.
; Aponta para ROM BASIC contendo 21 bytes
;de dados da rea de informao de canais,
;que copiado para rea apontada por
;CHANS.
; DATADD aponta para o ltimo byte dos
;dados de canais.
; O endereo seguinte apontado pelas
;variveis de sistema PROG e
;VARS.
; #80 o separador da rea de variveis.
; Prxima posio E_LINE.
; A linha de edio conter somente um
;caractere ENTER.
; Prxima posio conter o separador #80
;final.
; Prximo endereo ser apontador por
;WORKSP, STKBOT e STKEND, portanto o espa;o de trabalho temporrio e a pilha de
;calculadora estaro vazios.
; A=FLASH 0, BRIGHT 0, PAPER 7 e INK 0.
; Coloca os atributos de tela em A nas

8376
8379
8382
8385
8388
8391
8394
8397
8400
8403
8406
8410
8413

32
32
21
22
fd
fd
21
11
01
cd
fd
21
cd

8416
8419
8421
8424

21 6b 5c
36 02
21 8b 12
e5

8425 3e
8427 32
8430 c3
RUNLOAD

8f
48
23
09
35
35
c6
10
0e
cf
cb
df
36

5c
5c
05
5c
c6
ca
15
5c
00
3c
01 ce
0e
2e

ld (ATTR_T),a
ld (BORDCR),a
ld hl,#0523
ld (REPDEL),hl
dec (iy-58)
dec (iy-54)
ld hl,5574
ld de,STRMS
ld bc,14
call LDI_ROM_B
set 1,(iy+1)
ld hl,3807
call CALLBAS
ld hl,DF_SZ
ld (hl),2
ld hl,l128bh
push hl

aa
ld a,#aa
00 5b
ld (BUFFER),a
41 3c
jp RESET9
(8433/#20F1)

Invocado por RUN e LOAD.


8433 cd 8c 31
call SV_IF1_VAR
8436 cd d5 21
call REC_ERRSP
8439 cd 33 2e
call BAS_CLS
8442 2a 59 5c
ld hl,(E_LINE)
8445 23
inc hl
8446 5e
ld e,(hl)
8447 23
inc hl
8448 56
ld d,(hl)
8449 7a
ld a,d
8450 b3
or e
8451 eb
ex de,hl
8452 28 04
jr z,RUNLOAD1
8454 af
xor a
8455 32 10 5d
ld (EXECLOAD),a
RUNLOAD1
8458 22 42 5c
ld (NEWPPC),hl
8461 af
xor a
8462 32 44 5c
ld (NSPPC),a
8465 21 b0 16
ld hl,5808
8468 cd 36 2e
call CALLBAS
8471 2a 53 5c
ld hl,(PROG)
8474 2b
dec hl
8475 22 57 5c
ld (DATADD),hl
8478 21 21 3c
ld hl,RUNLOAD3
8481 cd 36 2e
call CALLBAS
DOSINTRP2
Continuao de DOSINTRP1.
8484 cd 8c 31
call SV_IF1_VAR
8487 3e ff
ld a,#ff
8489 32 15 5d
ld (DOSMODE),a
8492 af
xor a
8493 32 f7 5c
ld (ZERO1),a
8496 3e aa
ld a,#AA
8498 32 17 5d
ld (SAVEBUF),a
8501 21 a4 21
ld hl,INTERP-RET
8504 22 1a 5d
ld (DOSCMDRET),hl
8507 21 00 00
ld hl,0

;variveis de sistema.
; Atribui #23 (35) para REPDEL e
;#05 (5) para REPPER.
; Atribui valores 255 para KSTATE e
;KSTATE+4.
; Copia 14 bytes a partir do endereo
;5574 da ROM para rea de streams, com
;dados iniciais dos canais #FD a #03.
; Levanta bit 1 de flags sinalizando im;pressora em uso, e limpa buffer de im;pressora com a rotina CLEAR-PRB da ROM
;BASIC.
; Define o nmero de linhas da parte
;inferior da tela como 2.
; Coloca na pilha endereo da rotina de
;inicializao da ROM BASIC, antes de
;imprimir 1982 Sinclair Research Ltd
; Sinaliza DOSIMM2 para executar comando
;RUN boot.
; Prossegue adiante.

; Recupera variveis da Interface 1.


; Recupera valor de ERR_SP.
; Apaga a tela.
; HL aponta para linha de edio.
; Apontar para prxima posio.
; Pegar o byte menos significativo
;e mais significativo da linha de
;auto execuo do BASIC,
;testar se 0
;e armazenar no par HL.
;
; Zera varivel, sinaliza execuo de
;LOAD.
; Atribui nmero de linha a executar.
; Atribui valor 0 para o nmero da
;instruo a executar.
; Rotina SET-MIN da ROM BASIC, limpa a
;rea da linha de edio em diante.
; Inicializa o endereo de leitura do
;comando READ para antes da rea do
;programa BASIC.
; Salta adiante, selecionando a ROM BASIC.

; Preserva variveis do BASIC estendido.


; Define modo interpretado de DOS.
; Zera varivel de sistema DOS.
; Marca varivel como #AA.
; Endereo para retornar do comando DOS
;guardado na varivel de sistema.

8510 39
add hl,sp
; HL=SP.
8511 22 1c 5d
ld (OLDSP),hl
; Guarda valor de SP e o altera
8514 2b
dec hl
;em dois bytes para baixo.
8515 2b
dec hl
8516 f9
ld sp,hl
8517 cd c0 21
call DEF_ERRSP
; Atribui valor para ERR_SP.
8520 2a 5d 5c
ld hl,(CH_ADD)
; HL aponta para comando a interpretar.
DOSINTRP3
No modo interpretado, um comando DOS deve-se seguir a REM : , o que checado a seguir.
Se no conferir, a interpretao encerrada sem executar nenhum comando do DOS.
8523 cd 64 21
call STOP_INT
; Checa se final da linha de comando,
DOSINTRP4
8526 ca 70 21
jp z, CMD-RET
;caso sim, retorna do comando DOS. .
8529 fe ea
cp 234
; Verifica se palavra-chave REM.
8531 23
inc hl
; Aponta prximo caractere a interpretar.
8532 20 f5
jr nz,DOSINTRP3
; Se no era REM, repete.
8534 cd 64 21
call STOP_INT
; Checa se final da linha de comando,
8537 28 f3
jr z,DOSINTRP4
;caso sim, retorna do comando DOS.
8539 fe 3a
cp 58
; Verifica se :
8541 c2 70 21
jp nz,CMD-RET
;se no for, retorna do comando DOS.
8544 23
inc hl
; Aponta prximo caractere a interpretar.
8545 c3 96 22
jp DOSMAIN
; Salta para rotina principal de interpre;tao do DOS.

STOP_INT (8548/#2164)
Verifica se a interpretao do comando DOS, presente no endereo apontado por HL,
encerrada. Flag ZERO levantado se a checagem deve ser encerrada.
8548 7e
ld a,(hl)
; Pega o byte a ser interpretado.
8549 fe 0d
cp 13
; Se for ENTER,
8551 c8
ret z
;retorna com flag ZERO levantado.
8552 fe 80
cp 128
; Se for separador final (#80)
8554 c8
ret z
;retorna com flag ZERO levantado.
8555 b7
or a
; Seno, abaixa a flag 0 se A<>0 e
8556 c9
ret
;retorna.
DIR-RET2 salva setor de configurao do buffer e retorna do comando DOS.
8557 cd f0 2e
call BUFFER2DSK
; Salva buffer no disco.

CMD-RET (8560/#2170)
Endereo de retorno de um comando do DOS.
8560 3e ff
ld a,255
;
> .
8562 32 0c 5d
ld (23820),a
;
2 . ]
8565 cd fb 2d
call BAS_SETW
; Limpa RAM a partir do espao de trabalho
8568 cd 8c 31
call SV_IF1_VAR
;
8571 21 17 5d
ld hl,SAVEBUF
; HL aponta para o flag SAVEBUF.
8574 7e
ld a,(hl)
; Compara flag com 0.
8575 b7
or a
8576 36 aa
ld (hl),#aa
; Atribui #AA para SAVEBUF.
8578 20 03
jr nz,CMD-RET1
; Se flag no era 0, salta adiante.
8580 cd 96 3f
call LD_BUFFER1
; Carrega buffer de impressora.
CMD-RET1
8583 21 1f 5d
ld hl,FLG_RFPC
; HL aponta para flag.
8586 7e
ld a,(hl)
; Compara flag com 0.
8587 b7
or a
8588 36 00
ld (hl),0
; Zera o flag.
8590 20 06
jr nz,CMD-RET2
; Se flag no era 0, salta adiante.
8592 cd b9 2e
call BAS_RMFP
; Elimina cdigo de 6 bytes de nmeros em
;ponto flutuante da linha.
8595 cd b5 21
call FETCH_ENT
; Busca final da linha.
CMD-RET2
8598 ed 7b 1c 5d ld sp,(OLDSP)
; Retoma valor antigo de SP.
8602 2a 1a 5d
ld hl,(DOSCMDRET) ; HL=endereo de retorno do comando DOS.
8605 ed 4b 0f 5d ld bc,(CL_ELINE)
; C=flag limpar linha de edio.
8609 06 00
ld b,0
; B=0

8611 e9

jp (hl)

; Salta para endereo em DOSCMDRET.

INTERP-RET (8612/#21A4)
Ponto de retorno aps execuo de comando DOS em modo interpretado.
Se no houve erro, simplesmente retorna. Em caso de erro, salta para rotina de tratamento de
erro do BASIC.
8612 cd d5 21
call REC_ERRSP
; Recupera ERR_SP salvo.
8615 fd cb 00 7e bit 7,(iy+0)
; Se cdigo de erro #FF, no h erro e
8619 c0
ret nz
;retorna.
8620 11 7c 3c
ld de,ROM_BASIC
; Endereo a ser empilhado.
8623 ed 7b 3d 5c ld sp,(ERR_SP)
; Pilha contm endereo de retorno em caso
;de erro.
8627 d5
push de
; Empilha endereo da rotina que habilita
8628 c9
ret
;ROM BASIC, para depois executar a rotina
;de tratamento de erro de ERR_SP.

FETCH_ENT
8629
8632
8634
8635
8638

cd
fe
c8
cd
18

26 2e
0d
cb 2e
f5

call BAS_G_CHR
cp 13
ret z
call BAS_NXTCHR
jr FETCH_ENT

; Busca caractere interpretvel.


; Se for ENTER,
;retorna.
; Busca prximo caractere da linha.
; Repete a busca e comparao.

DEF_ERRSP (8640/#21C0)
Define valor de ERR_SP.
8640 2a 3d 5c
ld hl,(ERR_SP)
8643 22 13 5d
ld (ERRSP_T),hl
8646 2a 1c 5d
ld hl,(OLDSP)
8649 2b
dec hl
l21cah:
8650 2b
dec hl
8651 22 3d 5c
ld (ERR_SP),hl
8654 11 15 3c
ld de,l3c15h
8657 73
ld (hl),e
8658 23
inc hl
8659 72
ld (hl),d
8660 c9
ret

; Preserva ERR_SP atual em


;ERRSP_T.
; O novo valor de ERR_SP
;2 bytes abaixo do antigo valor de SP
;do Z80.
; Coloca endereo XXX
;como novo endereo de retorno de erro.
; Fim.

REC_ERRSP (8661/#21D5)
Recupera ERR_SP salvo em ERRSP_T.
8661 2a 13 5d
ld hl,(ERRSP_T)
8664 22 3d 5c
ld (ERR_SP),hl
8667 c9
ret

DOSIMM2
Continuao do DOSIMM1.
8668 21 00 00
ld hl,0
8671 22 f7 5c
ld (ZERO1),hl
8674 39
add hl,sp
8675 22 1c 5d
ld (OLDSP),hl
8678 2b
dec hl
8679 2b
dec hl
8680 f9
ld sp,hl
8681 cd c0 21
call DEF_ERRSP
8684 21 17 5d
ld hl,SAVEBUF
8687 7e
ld a,(hl)
8688 fe aa
cp #aa
8690 3e 00
ld a,0
8692 32 0f 5d
ld (CL_ELINE),a
8695 ca 5d 22
jp z, DOSIMM3
8698 36 aa
ld (hl),#aa
8700 cd 33 2e
call BAS_CLS
8703 cd 22 2e
call OPEN_S
8706 21 ea 22
ld hl,LOGO

; Zera variveis de sistema ZERO1 e


;CUR_DRVT.
; HL=SP.
; Preserva valor antigo do SP.
; Valor novo de SP fica 2 bytes abaixo.
; Define novo valor para ERR_SP.
; Se a varivel de sistema for #AA, foi
;atribudo por RESET,
;
;
;
;
;
;

Sinaliza para limpar a linha de edio.


. ] "
Sinaliza no limpar linha de edio.
Limpa a tela.
Abre canal S.
Imprime logotipo.

8709
8710
8713
8715

df
3a 00 5b
fe aa
20 50

rst 24
ld a,(BUFFER)
cp #aa
jr nz, DOSIMM3

; Verifica se BUFFER contm flag #AA,


;se no, salta adiante para entrar no modo
;de editor de linha. O flag posto a #AA
;pelo RESET8, sinalizando para o interpre;dor executar comando RUN boot.

RUN_BOOT
8717 2a 59 5c
ld hl,(E_LINE)
; HL aponta para rea do editor de linha.
8720 3e fe
ld a,#fe
; Sinaliza para no limpar espao de tra8722 32 0e 5d
ld (CLR_WSP),a
;balho e no imprimir em modo imediato.
Coloca na linha de edio comando DOS RUN boot.
8725 36 f7
ld (hl),247
; Palavra-chave RUN do BASIC.
8727 23
inc hl
8728 36 22
ld (hl),34
; "
8730 23
inc hl
8731 36 62
ld (hl),98
; b
8733 23
inc hl
8734 36 6f
ld (hl),111
; o
8736 23
inc hl
8737 36 6f
ld (hl),111
; o
8739 23
inc hl
8740 36 74
ld (hl),116
; t
8742 23
inc hl
8743 36 22
ld (hl),34
; "
8745 23
inc hl
8746 22 5b 5c
ld (K_CUR),hl
; Atribui endereo do cursor e
8749 36 0d
ld (hl),13
;coloca nele ENTER.
8751 23
inc hl
8752 36 80
ld (hl),128
; Coloca a seguir separador final.
8754 23
inc hl
8755 22 61 5c
ld (WORKSP),hl
; O endereo seguinte atribudo para
8758 22 63 5c
ld (STKBOT),hl
;rea de trabalho e pilha de calculadora
8761 22 65 5c
ld (STKEND),hl
;que esto vazios, e incio da RAM livre.
8764 fd cb 01 de set 3,(iy+1)
;
. . . .
8768 18 3c
jr DOSIMM4
; Prossegue para rodar o RUN boot.

MINILDIR
Como na instruo LDIR do Z80, mas copia apenas 3 bytes. Copia contedo do endereo
apontado por HL para posio apontada por DE.
8770 06 03
ld b,3
; Contador de bytes a copiar.
MINILDIR1
8772 7e
ld a,(hl)
; Copiar contedo apontado por HL para
8773 12
ld (de),a
;endereo apontado por DE.
8774 23
inc hl
; Aumenta HL e
8775 13
inc de
;DE.
8776 10 fa
djnz MINILDIR1
; Repete at contador=0.
8778 c9
ret
; Fim.
Cicla 32 vezes sinal HLT do FDC com bit sendo alternado.
Funo desconhecida.
sub_224bh:
8779 06 20
ld b,32
; Contador de repeties.
l224dh:
8781 c5
push bc
; Preserva par BC.
8782 ee 08
xor %00001000
; Inverte bit 3 (HLT)
8784 d3 ff
out (255),a
;e envia para porta 255.
8786 f5
push af
; Preserva acumulador e flag.
8787 3e 05
ld a,5
; Pausa de 20485T (5,7 ms).
8789 cd a8 3d
call DELAY1
8792 f1
pop af
; Recupera acumulador e flag.
8793 c1
pop bc
; Recupera par BC.
8794 10 f1
djnz l224dh
; Repete at contador=0.

8796 c9
ret
DOSIMM3 (8797/#225D)

; Fim.

Continuao do DOSIMM2.
Aps retornar de um comando DOS, volta para esta rotina.
8797 2a 1c 5d
ld hl,(OLDSP)
; Recupera valor anterior de SP,
8800 2b
dec hl
;recua em 2 bytes e
8801 2b
dec hl
8802 f9
ld sp,hl
;assume como novo valor de SP.
8803 cd 8c 31
call SV_IF1_VAR
; Preserva variveis da Interface 1.
8806 cd 1c 2e
call OPEN_K
; Abre canal K.
8809 3a 16 5d
ld a,(STAT255)
; Pega ltimo byte enviado porta 255 e
8812 f6 03
or %00000011
;levanta bits 0 e 1 (seleciona drive D).
8814 cd 4b 22
call sub_224bh
;
8817 3a 16 5d
ld a,(STAT255)
; Pega ltimo byte enviado porta 255.
8820 cd 4b 22
call sub_224bh
;
8823 af
xor a
; Define modo do DOS como imediato.
8824 32 15 5d
ld (DOSMODE),a
8827 cd c6 31
call EDITLINE
; Aguarda entrada de comando atravs do
;editor de linha.
DOSIMM4
8830
8833
8836
8839
8840
8843
8846
8847
8850
8853

cd
21
22
af
32
2a
e5
11
cd
e1

40 2e
5d 22
1a 5d
0f 5d
59 5c
20 5d
42 22

call BAS_CLS_L
ld hl,DOSIMM3
ld (DOSCMDRET),hl
xor a
ld (CL_ELINE),a
ld hl,(E_LINE)
push hl
ld de,ELINE_T
call MINILDIR
pop hl

; Limpa linhas inferiores da tela.


; Define DOSIMM3 como endereo de retorno
;aps comando do DOS.
; Define flag para limpar a linha de
;edio.
; Aponta para a linha de edio.
; Preserva par HL.
; Guarda temporariamente 3 bytes da linha
;de edio.
; Recupera par HL.

DOSMAIN (8854/#2296)
Continuao do DOSINTRP2 e do DOSIMME4.
A partir deste ponto, a rotina comum aos modos interpretado e imediato do DOS.
Interpreta a linha de comando do DOS, que pode ter sido digitado no editor de linha (neste
caso HL aponta para rea de editor de linha), ou ter sido armazenado num programa BASIC. O
primeiro byte da linha deve conter um dos comandos do DOS (isto checado atravs de
pesquisa na tabela CMD_CODE); encontrado o comando, procura na tabela CMD_ADDR o
respectivo endereo para qual se deve saltar.
Salta para o endereo do respectivo comando DOS duas vezes, sendo na primeira feita apenas
verificao da sintaxe, e na segunda, a execuo propriamente dita.
8854 22 11 5d
ld (CMDADDR),hl
; Salva endereo onde est o comando DOS.
8857 7e
ld a,(hl)
; Verifica se o primeiro byte do comando
8858 47
ld b,a
;tem bit 7 levantado.
8859 e6 80
and %10000000
8861 78
ld a,b
8862 28 09
jr z,DOSMAIN1
; Salta adiante, se no estava levantado.
8864 fe fe
cp 254
; Verifica se palavra-chave RETURN',
8866 28 05
jr z,DOSMAIN1
;se for salta adiante.
8868 f5
push af
; Preserva acumulador e flags.
8869 cd 71 3d
call CHANGE_DRV
; Muda drive para o default.
8872 f1
pop af
; Recupera acumulador e flags.
DOSMAIN1
8873 21 c5 3f
ld hl,CMD_CODE
; Aponta para tabela com cdigo dos coman8876 2b
dec hl
;dos DOS e recua um byte.
8877 0e 00
ld c,0
; C um a menos que o primeiro comando.
DOSMAIN2
8879 0c
inc c
; Incrementa nmero do comando.
8880 57
ld d,a
; Salva cdigo do comando a interpretar.
8881 3e 13
ld a,19
; A=nmero de comandos DOS existentes.
8883 b9
cp c
; Se C for maior que A,

8884
8887
8888
8889
8890

da 70 21
7a
23
be
20 f3

jp c,CMD-RET
ld a,d
inc hl
cp (hl)
jr nz,DOSMAIN2

8892
8894
8897
8898
8901
8904
8907
8910

3e
32
af
32
32
32
21
cb

ld a,9
ld (CMP_SIZE),a
xor a
ld (CL_ELINE),a
ld (23766),a
ld (EXECLOAD),a
ld hl,FLAGS
res 7,(hl)

09
06 5d
0f
d6
10
3b
be

5d
5c
5d
5c

8912 06 00
8914 21 d8 3f

ld b,0
ld hl,CMD_ADDR

8917
8918
8920
8921
8922
8923
8924
8925
8926
8929
8930

dec c
sla c
add hl,bc
ld e,(hl)
inc hl
ld d,(hl)
ex de,hl
push hl
ld de,SYNCHK_RET
push de
jp (hl)

0d
cb 21
09
5e
23
56
eb
e5
11 e3 22
d5
e9

;encerra interpretao.
; Recupera comando.
; Incrementa apontador da tabela CMD_CODE.
; Se o comando a interpretar no coincide
;com o da tabela, faz nova tentativa,
;seno C contm nmero do comando (1-19).
; Define como padro uso de 9 caracteres
;para comparar arquivos.
; Zera A.
; Sinaliza para limpar rea de edio.
;
2 . \
; Sinaliza execuo do LOAD.
; HL aponta para FLAGS, cujo bit 7 ser
;abaixado, sinalizando passagem pelo
;comando para checar sintaxe.
; Zera B.
; Aponta para tabela com endereos dos
;comandos do DOS.
; Para calcular o endereo a pegar da
;tabela, a frmula :
;HL = HL + 2*(C-1).
; DE = endereo do comando.
; HL = endereo do comando, que colocado
;na pilha.
; Na posio seguinte coloca-se endereo
;de retorno aps checagem de sintaxe e
;salta para o comando DOS.

SYNCHK_RET (8931/#22E3)
Ponto de retorno aps checagem de sintaxe, quando o comando DOS invocado por DOSMAIN
pela primeira vez. Sinaliza no FLAGS que finalizao da checagem de sintaxe, e salta pela
segunda vez para o comando DOS para que neste passo ele seja executado.
8931 21 3b 5c
ld hl,FLAGS
; Levanta bit 7 de FLAGS, sinalizando que
8934 cb fe
set 7,(hl)
;terminou a checagem de sintaxe.
8936 e1
pop hl
; Salta para endereo na pilha (equivale
8937 e9
jp (hl)
;a RET).

Mensagem de logotipo
8938
8941
8945
8949
8950
8952
8960
8961
8962

16
2a
20
44
4f
20
0d
0d
20

01
20
20
4F

05
20 20
20 20
53

8968
8972
8976
8978
8979
8983

20
20
2e
7f
20
b6

63 61 73
6c 74 64
20

8984
8988
8993
8996

20
20
16
20

20
20
05
20

20 20 20
20 20 20

31 39 28
20 20
20 20
0b
20 20

defb 22,1,5
defm *

defm
defb
defb
defm

13
13

DOS

; AT 1,5;

*
; ENTER.
; ENTER.
cas ltd.

defb 127
defm 198
defb #b6
defm
defb 22,5,11
defm

; COPYRIGHT.
;6 com bit 7 levantado.

; 7 SPACEs.
; AT 5,11;
; 6 SPACES.

9000 20 20
9002 00
FET_FLDIR1

defb 0

Continuao do FET_FLDIR.
l232bh:
9003 cd 7f 23
call RD_DSKCFG
9006 cd 1f 3d
call PRN_ENTER
9009 cd 1f 3d
call PRN_ENTER
9012 ed 4b e5 5b ld bc,(BUFFER+229)
9016 cd 45 2e
call BAS_PR_BC
9019 21 77 39
ld hl,M_FREE
9022 df
rst 24
JP_CMDRET
9023 c3 70 21
jp CMD-RET

; Marcador de final de mensagem.

; Carrega configurao do disco no buffer.


; Imprime ENTER duas vezes.
; BC=CS_NFREE
; Imprime nmero de setores livres.
; Imprime Free.
; Retorna do comando.

PR_IMMED (9026/#2342)
Se flag CLR_WSP for #fe, retorna sem fazer nada.
Atribui valor flag para limpar a linha de edio CL_ELINE como A e, se estiver no modo imediato
do DOS, imprime mensagem apontada pelo par HL.
9026 f5
push af
; Preserva acumulador e flag.
9027 3a 0e 5d
ld a,(CLR_WSP)
; Se o flag CLR_WSP
9030 fe fe
cp #fe
;for #fe, retorna sem imprimir,
9032 20 02
jr nz,PR_IMMED1
;seno prossegue adiante.
9034 f1
pop af
; Recupera acumulador e flag.
9035 c9
ret
; Fim.
PR_IMMED1
9036 f1
pop af
; Recupera acumulador e flag.
9037 32 0f 5d
ld (CL_ELINE),a
; Atribui varivel de sistema do DOS.
9040 3a 15 5d
ld a,(DOSMODE)
; Verifica se modo de DOS imediato,
9043 b7
or a
9044 cc 7b 37
call z,PRNSTR1
;se for imprime string apontado por HL.
9047 c9
ret
; Fim.
ERRNOFILE
Rotina de erro quando arquivo no encontrado. Sai do comando, mas no limpa a linha de
edio.
9048 21 cd 39
ld hl,M_NOFILE
; HL aponta para mensagem de erro.
9051 3e 01
ld a,1
; Flag para no limpar linha de edio.
9053 c3 e5 2c
jp CMD_ERR_RET
; Retorna do comando.

RD_T0_S0 (9056/#2360)
L setor 0 de trilha 0 e guarda no buffer de impressora.
Usada por: CAT e SEEKFILE.
9056 af
xor a
; Atribui valor de setor 0.
9057 32 cc 5c
ld (23756),a

RD_T0 (9060/#2364)
L um setor especificado por TR0SECT na trilha 0 do disco, e guarda no buffer de impressora.
O buffer de impressora ser preservado no disco, dependendo do flag SAVEBUF.
Usada por: NXT_DIR_S e CP_DIR_ENT.
9060 ed 5b cc 5c ld de,(TR0SECT)
; E=setor
9064 16 00
ld d,0
; D=trilha 0
RD_DSKCF1 continuao do RD_DSKCFG.
9066 21 17 5d
ld hl,SAVEBUF
; Verifica se o flag para salvar o buffer
9069 af
xor a
; igual a 0.
9070 be
cp (hl)
9071 77
ld (hl),a
; Zera o flag.
9072 28 05
jr z,RD_T0_1
; Salta se no para salvar o buffer.
9074 d5
push de
; Preserva par DE.
9075 cd 9e 3f
call SV_BUFFER
; Salva buffer de impressora.
9078 d1
pop de
; Recupera par DE.
RD_T0_1
9079 21 00 5b
ld hl,BUFFER
; Endereo inicial do buffer.

9082 06 01
9084 c3 ea 2e

ld b,1
jp R_B_SECTS

; Nmero de setor a ler = 1.


; Salta para rotina de leitura de setores.

RD_DSKCFG (9087/#237F)
Faz leitura do setor de configurao do disco (trilha 0, setor 8) e armazena no buffer de
impressora (BUFFER).
9087 11 08 00
ld de,8
; D=trilha 0, E=setor 8.
9090 18 e6
jr RD_DSKCF1
; Salta para fazer a leitura do disco.

ID_TYPE (9092/#2384)
Faz leitura do setor de configurao do disco e armazena no buffer.
Verifica se o byte de identificao do padro Beta (CS_IDENT) igual a 16.
Obtm tipo de formatao do disco (CS_FORMAT: #16=80 trilhas face dupla, #17=40 trilhas
face duplas, #18=80 trilhas face simples, #19=40 trilhas face dupla) e ajusta DSKTYPE
apropriadamente.
9092 cd 7f 23
call RD_DSKCFG
; Carrega setor de configurao no buffer.
9095 3a e7 5b
ld a,(BUFFER+231) ; Verifica se igual a 16,
9098 fe 10
cp 16
9100 28 06
jr z,ID_TYPE1
;se for, prossegue saltando adiante,
9102 21 87 39
ld hl, M_DISC_ERR ;seno imprime mensagem de erro
9105 df
rst 24
9106 18 ab
jr JP_CMDRET
;e sai do comando.
ID_TYPE1
9108 cd ba 3d
call GET_DTYPE
; HL aponta para varivel de sistema.
9111 cb 86
res 0,(hl)
; Abaixa bit 0 (40 trilhas) e
9113 cb 8e
res 1,(hl)
;bit 1 (face simples).
9115 3a e3 5b
ld a,(BUFFER+227) ; Obtm tipo de formatao.
9118 cb 47
bit 0,a
; Se bit 0 for 1,
9120 20 02
jr nz,ID_TYPE2
;salta adiante,
9122 cb c6
set 0,(hl)
;seno levanta bit 0 de DSKTYPE.
ID_TYPE2
9124 cb 5f
bit 3,a
; Se bit 3 for 1,
9126 c0
ret nz
;retorna,
9127 cb ce
set 1,(hl)
;seno levanta bit 3 de DSKTYPE.
9129 c9
ret
; Fim.

NOARG (9130/#23AA)
Retorna flag ZERO=1
9130 2a 11 5d
9133 23
9134 7e
9135 fe 0d
9137 c9

se no foi colocado argumento para o comando na linha.


ld hl,(CMDADDR)
; Aponta para o comando.
inc hl
; Avana 1 byte.
ld a,(hl)
; Verifica se um ENTER, se for, retorna
cp 13
;com flag ZERO levantado.
ret
; Fim.

Comando CAT
Comando
Sintaxe:
9138 cd
9141 01
9144 ed
9148 28
9150 fe
9152 20
9154 22
9157 cd
9160 cd
9163 fe
9165 28
9167 fe
9169 c2
9172 cd
9175 cd

do DOS "CAT".
CAT [#c][,d$]
(c=canal, d$=drive)
aa 23
call NOARG
; Verifica se no h argumentos.
02 00
ld bc,2
; Atribui 2 como canal default de sada
43 db 5c ld (NUMVAL),bc
;para o CAT.
2b
jr z,CAT3
; Salta adiante se no houver argumentos.
23
cp 35
; Se argumento no for #, no h especi1a
jr nz,CAT1
;ficao do canal, saltar adiante.
5d 5c
ld (CH_ADD),hl
; HL contm endereo a ser analisado.
a8 2e
call STOARG_N
; Obtm nmero do canal
26 2e
call BAS_G_CHR
; Obtm caractere da linha de comando e
0d
cp 13
;verifica se ENTER (fim de linha),
1a
jr z, CAT3
;se for salta adianta.
2c
cp 44
; Verifica se vrgula, se no for,
b3 2d
jp nz, SYN_ERROR
;acusar erro de sintaxe.
cb 2e
call BAS_NXTCHR
; Busca prximo caractere interpretvel e
58 2e
call BAS_EEXP
;busca argumento tipo string.

9178
CAT1
9180
CAT2
9183
9186

18 03

jr CAT2

; Salta adiante.

cd 7c 2e

call GETARG_S

; Obtm string (especificao de drive).

cd 0e 2e
cd 4e 2e

call SYN_CHK
call BAS_STK_F

; Retorna se est checando sintaxe.


; BC=comprimento e DE=endereo de string
;especificado na pilha da calculadora.
; HL=endereo.
; Trata drive se estiver especificado no
;incio do string.

9189 eb
9190 cd 1a 2d
CAT3
9193
9196
9197
9200
9203
CAT4
9206
9208
9209
9212
9213
9215
9218
9221
9224
9225
9228
9229
9232
9235
9238
9239
9240
9243
9246
9247
9248
9249
9252
9255
9256
9259
CAT5
9262
9265
9268
9271
9273
9274

cd
af
32
cd
3a

0e 2e

fe
f5
cc
f1
fe
d2
cd
21
df
21
df
cd
3a
21
96
e5
cd
21
df
e1
4e
cd
21
df
cd
21

02

call SYN_CHK
xor a
ld (23820),a
call ID_TYPE
ld a,(NUMVAL)

; Retorna se est checando sintaxe.


;
.
;
2 . ]
; L dados de configurao do disco.
; Verifica se o canal especificado no

cp 2
push af
call z,BAS_CLS
pop af
cp 17
jp nc,SYN_ERROR
call BAS_OPEN
ld hl,M_TITLE
rst 24
ld hl,BUFFER+245
rst 24
call PRN_ENTER
ld a,(BUFFER+228)
ld hl,BUFFER+244
sub (hl)
push hl
call PRINT_A
ld hl,M_FILE
rst 24
pop hl
ld c,(hl)
call PRINT_C
ld hl,M_DEL_F
rst 24
call RD_T0_S0
ld hl,BUFFER

;comando 2,

cd 86 3f

call FET_FLDIR

cd
3a
c6
d7
06

call PRN_ENTER
ld a,(CUR_DRV)
add a,65
rst 16
ld b,2

; Se no houver mais arquivo nenhum, im;prime nmero de setores livre e sai do


comando.
; Imprime ENTER.
; A = A + nmero do drive corrente.

0c 5d
84 23
db 5c

33 2e
11
b3 2d
1d 2e
9c 39
f5 5b
1f 3d
e4 5b
f4 5b
0c 39
d0 39

0d 39
c2 39
60 23
00 5b

1f 3d
f6 5c
41
02

CAT6
9276 cd 86 3f
9279
9280
9282
9283
9284

ex de,hl
call PARSEDRV

c5
3e 3a
d7
e5
cd fa 38

call FET_FLDIR
push bc
ld a,58
rst 16
push hl
call P_FILENAME

;se for limpa a tela.


; Se canal for maior que o mximo (16),
;salta para tratar erro de sintaxe,
;seno abre o canal.
; Imprime Title:
; Imprime o rtulo do disco.
; Imprime ENTER.
; A=nmero total de arquivos.
;
;
;
;

A=A nmero de arquivos deletados.


Salva par HL.
Imprime valor numrico de A.
Imprime File(s)

; Recupera par HL.


; Imprime nmero de arquivos deletados.
; Imprime Del. File
; L incio do diretrio do disco no
;buffer. HL aponta para o primeiro byte.

; Imprime letra do drive corrente.


; Contador, imprimir 2 entradas do dire;trio por linha.
; Busca arquivo no diretrio que no tenha
;sido apagado. Se atingir fim do diret;rio, sai do comando.
; Preserva par BC.
; Imprime dois pontos (:).
; Preserva par HL.
; Imprime nome e tipo do arquivo.

9287 01 0d 00
9290
9291
9292
9293
9294
9295
9296
9298
9300
9302
CAT7
9303
9305
CAT8
9307
9309
9310
CAT9
9312
9313
9316
9317
9318
9321
9322
9324

ld bc,13

e1
e5
09
4e
c5
79
06 02
fe 0a
38 01
05

pop hl
push hl
add hl,bc
ld c,(hl)
push bc
ld a,c
ld b,2
cp 10
jr c,CAT7
dec b

; Nmero de setores ocupados pelo arquivo


;est no byte 13 da entrada no diretrio.
; Recupera par HL.
; Preserva par HL.
; HL aponta para nmero de setores ocupa;dos, que passado para C.
; Preserva par BC.
; A=nmero de setores.
; B=2, imprimir 2 espaos.
; Se A<10
;saltar adiante.
; B=1, imprimir 1 espao.

fe 64
30 05

cp 100
jr nc,CAT9

; Se A>=100, salta adiante e no imprime


;nenhum espao,

3e 20
d7
10 fb

ld a,32
rst 16
djnz CAT8

;seno imprime B espaos.

c1
cd 45 2e

pop bc
call BAS_PR_BC

e1
c1
11 10 00
19
10 d0
18 c0

pop hl
pop bc
ld de,16
add hl,de
djnz CAT6
jr CAT5

; Recupera par BC.


; Imprime valor de BC (nmero de setores
;ocupados pelo arquivo).
; Recupera par HL.
; Recupera par BC.
; HL=HL+16, calcula endereo da prxima
;entrada no diretrio.
; Repete at imprimir 2 entradas.
; Saltar para trs, para nova linha.

ADDHL16 (9326/#246E)
HL=HL+16, usado por FET_FLDIR para pular entradas do diretrio (cada entrada tem 16 bytes).
9326 11 10 00
ld de,16
9329 19
add hl,de
9330 c9
ret

NXT_DIR_S (9331/#2473)
HL aponta para um item do diretrio, que deve se situar na rea do buffer de impressora.
Se HL estiver acima da rea do buffer (isto , acima de 23296+255), l o prximo setor de
diretrio do disco no buffer.
O HL aponta para o incio do buffer de impressora.
sub_2473h:
9331 e5
push hl
; Preserva registradores HL e BC.
9332 c5
push bc
9333 01 00 a4
ld bc,41984
; BC=65536-(23296+256)
9336 09
add hl,bc
; HL=HL-BC
9337 38 03
jr c,NXT_DIRS1
; Salta adiante se HL>(23296+255).
9339 c1
pop bc
; Recupera registradores BC e HL.
9340 e1
pop hl
9341 c9
ret
; Fim.
NXT_DIRS1
9342 21 cc 5c
ld hl,TR0SECT
; Aumenta o nmero do setor.
9345 34
inc (hl)
9346 cd 64 23
call RD_T0
; L o novo setor.
9349 c1
pop bc
; Recupera registradores BC e HL.
9350 e1
pop hl
9351 21 00 5b
ld hl,BUFFER
;HL aponta para incio do buffer.
9354 c9
ret

DRV_NUM (9355/#248B)
O acumulador contm um caractere que deve representar um dos drives (A, B, C e D), que
transformado em nmero de drive (0, 1, 2 e 3). Se caractere estiver fora de faixa, salta para
rotina de erro de sintaxe.

9355 e6 df

and %11011111

9357
9359
9362
9364
9367

sbc a,65
jp c,SYN_ERROR
cp 4
jp nc,SYN_ERROR
ret

de
da
fe
d2
c9

41
b3 2d
04
b3 2d

; Transforma letra em maiscula e zera o


;flag CARRY.
; A=A-A, A=nmero do drive.
;se resultado < 0, acusa erro.
; Se A for >=4,
;acusa erro.
;Fim

STK_STR (9368/#2498)
Pega o ltimo valor da pilha da calculadora que, se for um string, ter seu endereo inicial no
par DE e seu comprimento em BC (A no tem significado).
Testa se o string nulo, se for acusa erro de sintaxe (o algoritmo de teste rejeita tambm
todos os casos em que B=C, mas isto no um problema, pois alm de 0, somente strings
muito grandes, incomum para um argumento de comando, ocasionariam tal problema).
9368 cd 4e 2e
call BAS_STK_F
; Pega dados do string da pilha de calcu9371 79
ld a,c
;ladora.
9372 b8
cp b
; Se o comprimento do string 0, saltar
9373 ca b3 2d
jp z,SYN_ERROR
;para tratar erro de sintaxe.
9376 c9
ret
; Fim.

Comando DOS * (9377/#24A1)


Comando
Sintaxe:
9377 cd
9380 cd
9383 cd
9386 1a
9387 cd
9390 32
9393 cd
9396 c3

do DOS "*" (muda drive corrente).


* <d$>
(d$=string especificando o drive)
7c 2e
call GETARG_S
; Obtm string como argumento do comando.
0e 2e
call SYN_CHK
; Retorna se est checando sintaxe.
98 24
call STK_STR
; DE aponta para o incio do string.
ld a,(de)
; A pega primeiro caractere do string.
8b 24
call DRV_NUM
; Converte o caractere em nmero de drive
19 5d
ld (DFLT_DRV),a
;e guarda na varivel de sistema DOS.
74 3d
call CHANGEDRV1
; Muda o drive corrente.
70 21
jp CMD-RET
; Retorna do comando DOS *.

NEW (9399/24B7)
Comando do DOS "NEW".
Sintaxe:
NEW <n$>, <a$> [TIPO]
n$=nome novo do arquivo
a$=nome antigo do arquivo
TIPO= CODE para bytes,
DATA para varivel,
# para arquivos tipo stream
ou nenhum para BASIC.
9399 cd 6a 2e
call GETARG_2S
9402 cd 0e 2e
call SYN_CHK
9405 cd f1 24
call FET_TYPE
9408 cd 49 2d
call SEEKFILE
9411 3a f6 5c
ld a,(CUR_DRV)
9414 32 f8 5c
ld (CUR_DRVT),a
9417 c2 58 23
jp nz,ERRNOFILE
9420 c5
9421 cd ae 27
9424 cd 49 2d

push bc
call GET_ENTRY
call SEEKFILE

9427
9428
9431
9434
9435

push af
ld a,(CUR_DRVT)
ld hl,CUR_DRV
cp (hl)
jp nz,SYN_ERROR

f5
3a f8 5c
21 f6 5c
be
c2 b3 2d

9438 cd 84 23

call ID_TYPE

; Obtm 2 strings como argumento.


; Retorna se est checando sintaxe.
; Busca tipo do arquivo.
; Busca o arquivo no diretrio.
; Preserva valor do drive corrente na
;varivel de sistema do DOS.
; Se arquivo no existe, acusa erro de
;arquivo inexistente.
; Preserva para BC.
; Busca entrada do arquivo no diretrio.
; Busca arquivo com o nome do primeiro
;argumento.
; Preserva acumulador e flags.
; Recupera drive corrente salvo em A
;e compara com o drive corrente atual.
; Se forem diferente, acusa erro de sinta;xe, pois deveriam estar no mesmo drive.
; Faz leitura da configurao do disco.

9441 f1
9442 ca eb 2c
9445 c1
DIR-RET1
Parte comum a NEW,
diretrio do disco
9446 cd bc 27
9449 c3 6d 21

pop af
jp z,F_EXISTS
pop bc

; Recupera acumulador e flags.


; Se arquivo do primeiro argumento existe,
;acusa erro e salta.
; Recupera par BC.

MOVE e SAVE. Prepara o setor com as informaes do arquivo e salva no


call PUT_ENTRY
jp DIR-RET2

; Grava entrada do diretrio renomeado.


; Salta.

CHKEXCLD (9452/#24EC)
Verifica se varivel EXECLOAD=0, se for , flag ZERO levantado.
9452 3a 10 5d
ld a,(EXECLOAD)
9455 b7
or a
9456 c9
ret
; Fim.

FET_TYPE (9457/#24F1)
Pega um caractere da linha de comando e atribui o tipo do arquivo referido (B, C, D ou #) para
varivel DOS FILETYPE.
O registrador B fica com o valor do tipo de arquivo.
9457 06 43
ld b,67
;Assume B=C.
9459 3a d6 5c
ld a,(23766)
;
: . \
9462 b7
or a
;
.
9463 20 17
jr nz,FET_TYPE1
;
.
9465 cd 26 2e
call BAS_G_CHR
; Busca caractere interpretvel.
9468 fe af
cp 175
; Se caractere for CODE,
9470 06 43
ld b,67
;B=C,
9472 28 0e
jr z,FET_TYPE1
;e salta adiante.
9474 fe e4
cp 228
; Se caractere for DATA,
9476 06 44
ld b,68
;B=D,
9478 28 08
jr z,FET_TYPE1
;e salta adiante.
9480 fe 23
cp 35
; Se caractere for #,
9482 06 23
ld b,35
;B=#,
9484 28 02
jr z, FET_TYPE1
;e salta adiante.
9486 06 42
ld b,66
;B=B,
FET_TYPE1
9488 21 e5 5c
ld hl,FILETYPE
; Atribui um dos cdigos C, D, # ou
9491 70
ld (hl),b
;B para a varivel de sistema.
9492 c9
ret
;Fim.

RDKEY (9493/#2515)
Aguarda uma tecla ser pressionada e retorna o cdigo no acumulador. Por depender da rotina
BASIC de interrupo (RST 56/#38), deve ser chamada por CALLBAS.
9493 e5
push hl
; Preserva pares HL, BC e DE.
9494 c5
push bc
9495 d5
push de
9496 21 a5 3c
ld hl,WAITKEY
; Rotina para aguardar tecla ser pressio9499 cd 36 2e
call CALLBAS
;nada, deve ser chamada por CALLBAS por
;depender de interrupes.
9502 3a 08 5c
ld a,(LASTK)
; A=cdigo da ltima tecla pressionada.
9505 d1
pop de
; Recupera pares DE, BC e HL.
9506 c1
pop bc
9507 e1
pop hl
9508 e6 df
and %11011111
; Abaixa bit 5, converte letras em
;maisculas.
9510 c9
ret
; Fim.
ERASE_NF
Se arquivo no foi encontrado no comando ERASE, salta para esta rotina.
9511 3a 07 5d
ld a,(NOFILE)
;Se o flag NOFILE for 0,
9514 b7
or a
9515 ca 58 23
jp z,ERRNOFILE
;acusa erro de arquivo inexistente,
9518 c3 70 21
jp CMD-RET
;seno retorna silenciosamente do comando.

OVERWRITE (9521/#2531)
Pergunta ao usurio se deseja sobrepor um
apaga o arquivo e retorna com A=0.
Usada por: COPYALL, COPY.
9521 c5
push bc
9522 3e ff
ld a,255
9524 32 0c 5d
ld (23820),a
9527 cd 33 2e
call BAS_CLS
9530 3a f6 5c
ld a,(CUR_DRV)
9533 c6 41
add a,65
9535 cd 21 3d
call PRNCHR1
9538 3e 3a
ld a,58
9540 cd 21 3d
call PRNCHR1
9543 21 dd 5c
ld hl,FILENAME
9546 cd fa 38
call P_FILENAME
9549 21 f3 37
ld hl,M_F_EXISTS
9552 cd 7b 37
call PRNSTR1
9555 cd 15 25
call RDKEY
9558 fe 59
cp 89
9560 f5
push af
9561 cd 33 2e
call BAS_CLS
9564 f1
pop af
9565 c1
pop bc
9566 c0
ret nz
9567 c5
push bc
9568 cd 33 2e
call BAS_CLS
9571 c1
pop bc
9572 cd 25 27
call ERASENOFL
9575 af
xor a
9576 c9
ret

arquivo j existente. Se a resposta for afirmativa,


; Preserva para BC.
;
> .
;
2 . ]
; Apaga a tela.
; A = A+A
; Imprime letra do drive.
; Imprime >
; Imprime nome e tipo do arquivo.
; Imprime File exists e Over write?
;(Y/N).
; Aguarda entrada no teclado.
; Verifica se foi pressionada tecla Y.
; Preserva para AF.
; Limpa a tela.
; Recupera par AF.
; Recupera pares AF e BC.
; Se no foi pressionada Y, retorna.
; Preserva par BC.
; Limpa a tela.
; Recupera para BC.
; Apaga o arquivo.
; Zera A.
; Fim.

SEEK_STRF (9577/#2569)
Busca por um arquivo tipo stream, considerando o nmero do segmento de 4096 bytes (vide
STREAMDIR). Sada: A=0 se arquivo no #, A=9 se for, flag ZERO=1 se arquivo for
encontrado ou no for #.
Usada por: COPYALL e COPY.
9577 3a e5 5c
ld a,(FILETYPE)
; Verifica se o tipo de arquivo #.
9580 fe 23
cp 35
9582 28 02
jr z,SEEK_STRF1
; Se for, salta adiante,
9584 af
xor a
;seno zera A e
9585 c9
ret
;retorna.
SEEK_STRF1
l2572h:
9586 3e 0a
ld a,10
; Busca por arquivo considerando tambm
9588 32 06 5d
ld (CMP_SIZE),a
;o segmento do arquivo tipo #.
9591 cd 4c 2d
call SEEKFILE1
;
9594 3e 09
ld a,9
; Restaura valor da varivel TRDOS.
9596 32 06 5d
ld (CMP_SIZE),a
9599 c9
ret
; Fim.

COPYALL (9600/#2580)
Copia todos os arquivos para sintaxe de tipo: COPY X:*,Y:* TIPO.
9600
9603
9605
9608
9611
9612
9615
9616
9618

3a
fe
c2
cd
eb
cd
7e
fe
c2

dd 5c
2a
58 23
4e 2e
1a 2d
2a
b3 2d

ld a,(FILENAME)
cp 42
jp nz,ERRNOFILE
call BAS_STK_F
ex de,hl
call PARSEDRV
ld a,(hl)
cp 42
jp nz, SYN_ERROR

; A=primeiro caractere do nome do arquivo.


; Se no for *
;acusa erro de arquivo inexistente.
; Obtm string na pilha de calculadora e
;se tiver especificao de drive, trata
;de forma apropriada.
; A=primeiro caractere do nome do arquivo.
; Se no for *
;acusa erro de sintaxe.

9621 3a f6
9624 32 f9
9627 3a f9
9630 cd 74
9633 cd 84
9636 3e ff
9638 32 0d
COPYALL1
9641 3a f8
9644 cd 74
9647 cd 84
9650 3a 0d
9653 3c
9654 32 0d
9657 4f
9658 cd ae
9661 3a dd
9664 fe 00
9666 ca 70
9669 fe 01
9671 28 e0
9673 21 e6
9676 11 ed
9679 01 07
9682 ed b0
9684 3a f9
9687 cd 74
9690 cd 4c
9693 20 0a
9695 cd 69
9698 20 05
9700 cd 31
9703 20 c0
COPYALL2
9705 cd f1
9708 cd f0
9711 18 b8

5c
5c
5c
3d
23
5d
5c
3d
23
5d
5d
27
5c
21
5c
5c
00
5c
3d
2d
25
25
25
2e

ld a,(CUR_DRV)
ld (DESTDRV),a
ld a,(DESTDRV)
call CHANGEDRV1
call ID_TYPE
ld a,255
ld (CPALLDIR),a

; Atribui drive destino como sendo o


;drive corrente atual.

ld a,(CUR_DRVT)
call CHANGEDRV1
call ID_TYPE
ld a,(CPALLDIR)
inc a
ld (CPALLDIR),a
ld c,a
call GET_ENTRY
ld a,(FILENAME)
cp 0
jp z,CMD-RET
cp 1
jr z,COPYALL1
ld hl,FILEDATA1
ld de,FILETEMP
ld bc,7
ldir
ld a,(DESTDRV)
call CHANGEDRV1
call SEEKFILE1
jr nz,COPYALL2
call SEEK_STRF
jr nz,COPYALL2
call OVERWRITE
jr nz,COPYALL1

; Seleciona drive de origem e verifica


;tipo de disco.

call COPYFILE
call BUFFER2DSK
jr COPYALL1

; Copia arquivo.
; Salva buffer de impressora no disco.
; Repete para prxima entrada do
;diretrio.

; Seleciona drive destino.


; Verifica tipo do disco no drive.
; Inicializa contador de entradas de
;diretrio com 1.

; Aumenta o contador de entrada de


;diretrio.
; Procura pelo item de nmero C no
;diretrio.
; Obtm o primeiro caractere do nome.
; Sai do comando COPY se for ltima
;entrada do diretrio.
; Ignora se for um arquivo apagado do
;disco.
; Salva dados do arquivo temporariamente
;em FILETEMP.
; Seleciona drive de destino.
; Busca arquivo, se no for encontrado,
;salta adiante.
; Busca arquivo tipo stream, salta adiante
;se no for encontrado.
; Pergunta se quer sobrepor arquivo, se a
;resposta for no, ignora arquivo.

COPYFILE (9713/#25F1)
Faz cpia de um arquivo.
Usada por: COPYALL, COPY.
9713 cd 7f 23
call RD_DSKCFG
9716 3a e4 5b
ld a,(BUFFER+228)
9719 fe 80
cp 128
9721 ca e0 2c
jp z,NOSPACE
9724 21 ed 5c
ld hl,FILETEMP
9727 11 e6 5c
ld de,FILEDATA1
9730 01 07 00
ld bc,7
9733 ed b0
ldir
9735 ed 5b ea 5c ld de,(FILESIZE)
9739 16 00
ld d,0
9741 b7
or a
9742 2a e5 5b
ld hl,(BUFFER+229)
9745 ed 52
sbc hl,de
9747 da e0 2c
jp c,NOSPACE
9750 22 e5 5b
ld (BUFFER+229),hl
9753
9756
9759
9760

2a e1 5b
22 eb 5c
e5
cd d3 26

; L setor de configurao do disco.


; Se o nmero de arquivos existente 128,
;acusa erro de falta de espao.
; Recupera dados da entrada do diretrio
;do arquivo guardados temporariamente.
; Pegar tamanho do arquivo, mas o byte
;mais significativo deve ser 0.
; Zera flag CARRY para a subtrao.
; Faz n. setores livres tamanho arquivo.

; Salta se resultado for menor que 0.


; Guarda resultado como novo nmero de
;setores livre.
ld hl,(BUFFER+225) ; Pega os valores de trilha/setor corrente
ld (FILESECT),hl
;e assume como inicial do arquivo.
push hl
; Preserva trilha/setor inicial.
call COPYCHUNK
; Faz a cpia do arquivo.

9763
9764
9767
9770
9773
9776
9777
9778
9779
9781
9782
9785
9789
9792
9793

e1
22
2a
22
21
34
4e
0d
06
c5
11
ed
cd
c1
cd

9796 c9

eb
f4
e1
e4

5c
5c
5b
5b

00
09 00
53 f4 5c
f0 2e
bc 27

pop hl
ld (FILESECT),hl
ld hl,(START_S)
ld (BUFFER+225),hl
ld hl,BUFFER+228
inc (hl)
ld c,(hl)
dec c
ld b,0
push bc
ld de,9
ld (START_S),de
call BUFFER2DSK
pop bc
call PUT_ENTRY
ret

; Recupera trilha/setor inicial.


; Atribui trilha/setor inicial do arquivo.
; Atribui trilha/setor do espao livre do
;disco aps ltimo setor gravado.
; Aumenta valor do nmero de arquivos do
;disco.
; Guarda nmero de arquivos gravados menos
;1 em C.
; Zera B.
; Preserva BC.
; Seleciona trilha 0 e setor 9 como local
;para salvar contedo do buffer de
;impressora.
; Recupera BC.
; Atualiza diretrio com dados do arquivo
;copiado.
; Fim.

COPY (9797/#2645)
Sintaxe:
COPY d$, o$ [TIPO]
(d$=arquivo destino, o$=arquivo origem e TIPO= CODE, DATA, # ou inexistente para BASIC)
9797 cd 6a 2e
call GETARG_2S
; Obtm 2 strings da linha de comando.
9800 cd 0e 2e
call SYN_CHK
; Retorna se est checando sintaxe.
9803 cd c0 27
call WSALLOC
; Reserva espao de trabalho.
9806 cd f1 24
call FET_TYPE
; Obtm tipo do arquivo.
9809 cd 49 2d
call SEEKFILE
; Busca arquivo origem no diretrio.
9812 3a f6 5c
ld a,(CUR_DRV)
; Guarda valor de drive corrente (drive
9815 32 f8 5c
ld (CUR_DRVT),a
;de origem do arquivo).
9818 c2 80 25
jp nz,COPYALL
; Se arquivo no foi encontrado, salta
;para verificar se sintaxe com asterico.
9821 cd ae 27
call GET_ENTRY
; Obtm dados da entrada no diretrio do
9824 21 e6 5c
ld hl,FILEDATA1
;arquivo,
9827 11 ed 5c
ld de,FILETEMP
; Guarda os dados do arquivo origem.
9830 01 07 00
ld bc,7
9833 ed b0
ldir
9835 cd 49 2d
call SEEKFILE
; Busca o arquivo destino no diretrio.
9838 f5
push af
; Preserva pares AF e BC.
9839 c5
push bc
9840 3a f6 5c
ld a,(CUR_DRV)
; O drive corrente do arquivo destino,
9843 32 f9 5c
ld (DESTDRV),a
;cujo valor guardado.
9846 3a f8 5c
ld a,(CUR_DRVT)
; Muda drive corrente para o drive
9849 cd 74 3d
call CHANGEDRV1
;armazenado temporariamente.
9852 cd 84 23
call ID_TYPE
; Obtm configurao do drive.
9855 3a f9 5c
ld a,(DESTDRV)
; Muda drive para o de origem e
9858 cd 74 3d
call CHANGEDRV1
9861 cd 84 23
call ID_TYPE
;obtm sua configurao.
9864 c1
pop bc
; Recupera pares BC e AF.
9865 f1
pop af
; Flag ZERO=1 se arquivo destino existe.
9866 20 0b
jr nz, COPY2
; Se arquivo destino no foi encontrado,
;(vide SEEKFILE), salta adiante.
9868 cd 69 25
call SEEK_STRF
; Se arquivo tipo # de mesmo nome e seg9871 20 06
jr nz, COPY2
;mento no existe, salta adiante.
9873 cd 31 25
call OVERWRITE
; Pergunta se deseja sobrepor arquivo,
9876 c2 70 21
jp nz,CMD-RET
;seno retorna do comando.
COPY2
9879 cd f1 25
call COPYFILE
; Copia o arquivo do disco origem para
;disco destino.
9882 cd f0 2e
call BUFFER2DSK
; Salva contedo do buffer para disco.
9885 3a e5 5c
ld a,(FILETYPE)
; Se arquivo no for tipo # (stream)
9888 fe 23
cp 35
;encerra a cpia, retornando do comando.
9890 c2 70 21
jp nz, CMD-RET

O trecho a seguir faz cpia de todos os segmentos de 4096 bytes de arquivos tipo # (vide
STREAMDIR).
9893 3e 0a
ld a,10
; Durante a busca de arquivo, considerar
9895 32 06 5d
ld (CMP_SIZE),a
;o nmero do segmento.
9898 21 e6 5c
ld hl,FILEDATA1
; Aumentar o nmero do segmento de 4 kb.
9901 34
inc (hl)
9902 3a f8 5c
ld a,(CUR_DRVT)
; Selecionar drive origem.
9905 cd 74 3d
call CHANGEDRV1
9908 cd 69 25
call SEEK_STRF
; Busca arquivo tipo # com nmero de
;segmento especificado.
9911 c2 70 21
jp nz,CMD-RET
; Encerrar cpia, se no encontrar.
9914 cd ae 27
call GET_ENTRY
; Obter dados do arquivo no diretrio.
9917 21 e6 5c
ld hl,FILEDATA1
; Guardar temporariamente em FILETEMP.
9920 11 ed 5c
ld de,FILETEMP
9923 01 07 00
ld bc,7
9926 ed b0
ldir
9928 3a f9 5c
ld a,(DESTDRV)
; Selecionar drive destino.
9931 cd 74 3d
call CHANGEDRV1
9934 cd 84 23
call ID_TYPE
; Obter dados do disco inserido.
9937 18 c4
jr COPY2
; Fazer a cpia do arquivo.

COPYCHUNK (9939/#26D3)
Copia arquivos em pedaos de 4 KB ou menores, dependendo da RAM disponvel.
Usada por COPYFILE.
9939 3a f1 5c
ld a,(FILETEMP+4) ; Pega tamanho do arquivo ou nmero de
9942 b7
or a
;setores que faltam para copiar.
9943 c8
ret z
; Retorna se for 0.
9944 e5
push hl
;
9945 21 23 5d
ld hl,FREERAM_S
; Verifica se todos os setores a copiar
9948 96
sub (hl)
;cabem na rea de trabalho.
9949 e1
pop hl
;
9950 30 39
jr nc,COPYCHUNK2
; Salta adiante, se no couber.
9952 3a f1 5c
ld a,(FILETEMP+4) ; Coloca em B o nmero de setores a
9955 47
ld b,a
;copiar.
9956 af
xor a
; Zera o nmero de setores que restam
9957 32 f1 5c
ld (FILETEMP+4),a ;para copiar.
COPYCHUNK1
9960 c5
push bc
; Preserva nmero de setores a copiar.
9961 3a f8 5c
ld a,(CUR_DRVT)
; Muda para o drive origem do arquivo.
9964 cd 74 3d
call CHANGEDRV1
9967 c1
pop bc
; Recupera nmero de setores.
9968 c5
push bc
; Preserva nmero de setores a copiar.
9969 2a cf 5c
ld hl,(WRKSPADDR) ; Setores sero armazenados
;temporariamente no espao de trabalho.
9972 e5
push hl
; Preserva endereo do espao de trabalho.
9973 ed 5b f2 5c ld de,(FILETEMP+5) ; Pega valores de trilha/setor a ler.
9977 cd ea 2e
call R_B_SECTS
; L B setores do disco origem e salva no
;espao de trabalho.
9980 2a f4 5c
ld hl,(START_S)
; Atualiza valores de trilha/setor com o
9983 22 f2 5c
ld (FILETEMP+5),hl ;valor seguinte ao do ltimo setor que foi
;lido.
9986 3a f9 5c
ld a,(DESTDRV)
; Muda para o drive destino.
9989 cd 74 3d
call CHANGEDRV1
9992 e1
pop hl
; Recupera endereo do espao de trabalho
9993 c1
pop bc
;e nmero de setore.
9994 ed 5b eb 5c ld de,(FILESECT)
; Pega valor de trilha/setor a gravar.
9998 cd fa 2e
call W_B_SECTS1
; Grava B setores do espao de trabalho no
;disco destino.
10001 2a f4 5c
ld hl,(START_S)
; Pega valor do setor seguinte ao ltimo
10004 22 eb 5c
ld (FILESECT),hl
;lido e guarda como prxima posio a
;gravar.
10007 18 ba
jr COPYCHUNK
; Repete at gravar todos os setores.

COPYCHUNK2
10009 32 f1 5c

ld (FILETEMP+4),a

10012
10013
10016
10017
10018
10019

push hl
ld hl,FREERAM_S
ld b,(hl)
pop hl
xor a
jr COPYCHUNK1

e5
21 23 5d
46
e1
af
18 c3

; Guarda nmero de setores que faltam para


;copiar.
;
; Pega nmero de setores a copiar e
;coloca em B.
;
;
; Salta para copiar os setores.

ERASENOFL (10021/#2725)
Apaga
10021
10022
10025

arquivo, mas antes sinaliza que este no existe.


af
xor a
; A=0, sinaliza que o arquivo no existe,
32 07 5d
ld (NOFILE),a
;pois ser apagado, e flag ZERO=1.
18 19
jr ERASEFILE
; Apaga o arquivo.

ERASE (10027/#272B)
Comando do DOS "ERASE".
Sintaxe:
ERASE <n$> [tipo]
(n$=string com nome do arquivo a apagar; tipo=palavra-chave que especifica o tipo do
arquivo: CODE, DATA, # ou inexistente, se for programa BASIC.
10027 cd 7c 2e
call GETARG_S
; Pega um string da linha de comando.
10030 cd 0e 2e
call SYN_CHK
; Retorna se est checando sintaxe.
10033 cd f1 24
call FET_TYPE
; Determina o tipo do arquivo.
10036 af
xor a
; Inicializa flag de arquivo inexistente
10037 32 07 5d
ld (NOFILE),a
;em 0.
10040 cd f1 38
call FINDFILE
; Busca arquivo no diretrio, se no en;contrar, flag ZERO=0.
10043 cd 44 27
call ERASEFILE
; Entra na rotina de apagar arquivo.
10046 c2 27 25
jp nz,ERASE_NF
; Acusa erro de arquivo inexistente.
10049 c3 70 21
jp CMD-RET
; Retorna do comando.

ERASEFILE (10052/#2744)
Se entrar com flag ZERO abaixado, s atribui primeiro caractere de FILENAME para varivel
FNAME1 e retorna.
Apaga o arquivo especifidado, marcando o primeiro byte do nome com valor 1. Caso o arquivo
a ser apagado seja o ltimo do disco, marca o primeiro byte do nome com 0 (marcador de fim
do diretrio).
10052 3a dd 5c
ld a,(FILENAME)
; Preserva o primeiro byte do nome do
10055 32 08 5d
ld (FNAME1),a
;arquivo.
10058 c0
ret nz
; Retorna se flag ZERO=0.
10059 21 07 5d
ld hl,NOFILE
; Aumenta o flag NOFILE, sinalizando que
10062 34
inc (hl)
;o arquivo existe.
10063 c5
push bc
; Preserva par BC.
10064 cd 7f 23
call RD_DSKCFG
; L o setor de configurao no disco.
10067 3a e4 5b
ld a,(BUFFER+228) ; A=nmero total de arquivos.
10070 c1
pop bc
; Recupera par BC.
10071 0c
inc c
; Verifica se o arquivo a ser apagado o
10072 b9
cp c
;ltimo do disco,
10073 20 05
jr nz,ERASEFILE1
;se no for, salta adiante.
10075 3d
dec a
; Diminui nmero total de arquivos no
10076 32 e4 5b
ld (BUFFER+228),a ;setor de configurao.
10079 af
xor a
; Zera A e levanta flag ZERO.
ERASEFILE1
10080 f5
push af
; Preserva acumulador e flags.
10081 28 04
jr z,ERASEFILE2
; Se era ltimo arquivo, salta adiante,
10083 21 f4 5b
ld hl,BUFFER+244
;seno aumenta nmero de arquivos apagados
10086 34
inc (hl)
;no setor de configurao.
ERASEFILE2
10087 c5
push bc
; Preserva par BC.
10088 cd f0 2e
call BUFFER2DSK
; Salva setor de configurao.
10091 c1
pop bc
; Recupera par BC.

10092
10093
10096
10097

0d
cd ae 27
f1
ca 76 27

dec c
call GET_ENTRY
pop af
jp z,ERASEFILE3

10100 3e 01
ERASEFILE3
10102 32 dd 5c

ld a,1

10105
10106
10109
10112
10115
10116
10118
10121

push af
call SV_ENTRY
ld a,(FNAME1)
ld (FILENAME),a
pop af
jr z,ERASEFILE4
call SEEKFILE1
jr ERASEFILE

f5
cd
3a
32
f1
28
cd
18

ed 2e
08 5d
dd 5c
05
4c 2d
b9

ERASEFILE4
10123 cd 7f
10126 2a eb
10129 22 e1
10132 ed 5b
10136 2a e5
10139 16 00
10141 19
10142 22 e5
10145 c3 f0

23
5c
5b
ea 5c
5b
5b
2e

ld (FILENAME),a

call RD_DSKCFG
ld hl,(FILESECT)
ld (BUFFER+225),hl
ld de,(FILESIZE)
ld hl,(BUFFER+229)
ld d,0
add hl,de
ld (BUFFER+229),hl
jp BUFFER2DSK

; C=nmero do arquivo a apagar.


; Busca arquivo no diretrio.
; Recupera acumulador e flags.
; Se era ltimo arquivo do disco, salta
;adiante, e A=0,
;seno A=1.
; Marca arquivo como apagado (1) ou fim de
;diretrio (0)
; Preserva acumulador e flags.
; Salva entrada do diretrio no disco.
; Recupera o primeiro caractere do nome
;de arquivo.
; Recupera flag ZERO, se estiver levantado
;(ltimo arquivo apagado), salta adiante.
; Busca o arquivo e entra novamente na
;rotina (a princpio, neste ponto j no
;deveria haver arquivo com o mesmo nome).
; L setor de configurao do disco.
; Torna o setor inicial do arquivo como
;setor inicial do espao livre do disco.
; Soma o nmero de setores ocupados pelo
;arquivo com o nmero de setores livres
;(a princpio E=CS_NFREE e D=CS_IDENT, mas
;D zerado), para definir novo tamanho
;de espao livre do disco.
; Salta para gravar setor de configurao
;no disco.

CHK_DELET (10148/#27A4)
Verifica se o arquivo
arquivo foi apagado.
10148 cd ae 27
10151 3a dd 5c
10154 fe 01
10156 c9
10157 4f

na posio C do diretrio foi apagado. Retorna flag ZERO levantado se o


call GET_ENTRY
ld a,(FILENAME)
cp 1
ret

; Obtm entrada do arquivo no disco.


; Verifica se o primeiro byte do nome
; 1 (arquivo apagado).
;Fim.

ld c,a

GET_ENTRY (10158/#27AE)
Faz leitura do disco, pega os 16 bytes de dados da entrada do arquivo no diretrio, cujo
nmero especificado pelo registrador C (arquivo 0 a 127), e transfere do buffer de impressora
para a rea de variveis de sistema a partir de FILENAME.
Esta rotina preserva o par BC.
Usada por: NEW, COPY, ERASEFILE, CHK_DELET, MOVE, GET_ARGS, STREAMDIR, sub_3472h,
GOTO.
10158 af
xor a
; Zera A, flag usado por CP_DIR_ENT.
PUT_ENTRY1
10159 c5
push bc
; Preserva par BC.
10160 cd 25 29
call CP_DIR_ENT
; Transfere entrada do diretrio.
10163 c1
pop bc
; Recupera par BC.
10164 c9
ret
; Fim
10165 4f
10166 cd bc 27
10169 c3 f0 2e

ld c,a
call PUT_ENTRY
jp BUFFER2DSK

;
;
;

O
. . '
. . .

PUT_ENTRY (10172/#27BC)
Pega os 16 bytes de dados da rea de variveis de sistema a partir de FILENAME para a
respectiva entrada do arquivo no diretrio, cujo nmero especificado pelo registrador C
(arquivo 0 a 127).
Esta rotina preserva o par BC.

10172 3e ff
10174 18 ef

ld a,#ff
jr PUT_ENTRY1

; A=#ff, flag usado por CP_DIR_ENT.


; Prossegue saltando para trs.

WSALLOC (10176/#27C0)
Reserva 4096 bytes
temporrio.
10176 3e ff
10178 32 0e 5d
10181 cd d1 27
10184 2a 61 5c
10187 22 cf 5c
10190 c3 c2 2e

ou menos, se no houver RAM suficiente, no espao de trabalho


ld a,#ff
ld (CLR_WSP),a
call CHECKRAM
ld hl,(WORKSP)
ld (WRKSPADDR),hl
jp BAS_BCSP

; Sinaliza para limpar a rea de trabalho


;e pilha da calculadora.
; BC=4096 ou menor, se tiver pouca RAM.
; Guarda endereo do espao de trabalho
;na varivel DOS.
; Abre BC bytes no espao de trabalho.

CHECKRAM (10193/#27D1)
Verifica se a RAM disponvel maior que 4351 (#10ff) bytes. Se for, BC retorna valor 4096.
Caso contrrio, pega o valor mltiplo de 256 mais prximo da quantidade de RAM livre, subtrai
1 e retorna em BC. Guarda ainda em FREERAM_S o nmero de setores que cabem na RAM
disponvel.
Uma trilha de disco contm 4096 bytes.
10193 21 1a 1f
ld hl,#1f1a
; Chama rotina FREE-MEM da ROM BASIC,
10196 cd 36 2e
call CALLBAS
;BC retorna um valor que deve ser
10199 21 ff ff
ld hl,65535
;subtrado de 65536.
10202 ed 42
sbc hl,bc
; HL=quantidade de RAM livre.
10204 7c
ld a,h
; Verifica se RAM livre maior que 4351
10205 fe 10
cp 16
;bytes (HL>#10ff),
10207 30 02
jr nc,CHECKRAM1
; Se no for, salta adiante.
10209 3e 11
ld a,17
; Especifica espao de trabalho de 4 kb.
CHECKRAM1
10211 3d
dec a
; Diminui RAM a ser usada em 256 bytes.
10212 32 23 5d
ld (FREERAM_S),a
; Guarda na varivel de sistema.
10215 47
ld b,a
; BC=256*A
10216 0e 00
ld c,0
10218 c9
ret
; Fim.
GENERAL passa a apontar para o setor aps o arquivo.
sub_27ebh:
10219 22 d7 5c
ld (NUM_TRK),hl
; Guarda valor anterior de HL nas duas
10222 22 db 5c
ld (NUMVAL),hl
;variveis.
10225 ed 5b ea 5c ld de,(FILESIZE)
; E=tamanho do arquivo (D zerado).
10229 2a d9 5c
ld hl,(GENERAL)
10232 16 00
ld d,0
; D=0.
10234 19
add hl,de
; Adiciona varivel GENERAL o nmero de
10235 22 d9 5c
ld (GENERAL),hl
;setores ocupados pelo arquivo.
10238 c9
ret
; Fim.

MOVE (10239/#27FF)
Sintaxe:
MOVE
10239 cd 0e 2e
call SYN_CHK
10242 cd c0 27
call WSALLOC
10245 cd 84 23
call ID_TYPE
10248 3a f4 5b
ld a,(BUFFER+244)
10251 b7
or a
10252 ca 70 21
jp z,CMD-RET
10255 21 00 00
ld hl,0
10258 22 d9 5c
ld (GENERAL),hl
10261 0e ff
ld c,255
MOVE1 busca o arquivo apagado.
10263 0c
inc c
10264 cd a4 27
call CHK_DELET
10267 20 fa
jr nz,MOVE1
10269 79
ld a,c

; Retorna se est checando sintaxe.


; Reserva espao de trabalho.
; L configurao de setor do disco.
; Se o nmero de arquivos apagados
;(CS_DELET) for 0, simplesmente
;retorna do comando.
; GENERAL aponta para o primeiro setor
;do disco.
; Inicializa C em -1.
;
;
;
;

Aumenta C (posio do arquivo).


Verifica se o arquivo C foi apagado.
Se no, repete para prximo C.
Guarda a posio do arquivo apagado.

10270 32 d4 5c
ld (ERASED),a
10273 2a eb 5c
ld hl,(FILESECT)
; L=setor inicial e H trilha inicial do
10276 22 d5 5c
ld (23765),hl
;arquivo, que guardado.
10279 cd eb 27
call sub_27ebh
; GENERAL aponta para setor aps arquivo.
MOVE2 busca prximo arquivo que no tenha sido apagado.
10282 0c
inc c
; Verifica se o prximo arquivo foi
10283 cd a4 27
call CHK_DELET
;apagado,
10286 28 fa
jr z,MOVE2
;se sim, busca prximo arquivo.
10288 fe 00
cp 0
; Se o primeiro byte do nome do arquivo=0
10290 20 18
jr nz,MOVE4
;(fim do diretrio), salta adiante.
10292 3a d4 5c
ld a,(ERASED)
; Recupera posio do arquivo apagado e
10295 4f
ld c,a
;atribui a C.
MOVE3
10296 0c
inc c
; Verifica se a prxima entrada
10297 cd a4 27
call CHK_DELET
; o fim do diretrio (A contm primeiro
10300 fe 00
cp 0
;caractere do nome do arquivo).
10302 28 68
jr z,MOVE5
; Se for, salta adiante,
10304 af
xor a
;seno zera o primeiro byte do nome do
10305 32 dd 5c
ld (FILENAME),a
;arquivo e
10308 cd ed 2e
call SV_ENTRY
;salva entrada no disco.
10311 cd eb 27
call sub_27ebh
; GENERAL aponta para setor aps arquivo.
10314 18 ec
jr MOVE3
; Repete o ciclo.
MOVE4
10316 3a ea 5c
ld a,(FILESIZE)
;
: . \
10319 32 d3 5c
ld (23763),a
;
2 . \
10322 32 d1 5c
ld (ERR_NODSK),a
;
2 . \
10325 2a eb 5c
ld hl,(FILESECT)
;
* . \
10328 22 d5 5c
ld (23765),hl
;
" . \
10331 c5
push bc
;
.
10332 cd e1 28
call sub_28e1h
;
. . (
10335 c1
pop bc
;
.
10336 2a f4 5c
ld hl,(START_S)
;
* . \
10339 22 d5 5c
ld (23765),hl
;
" . \
10342 22 eb 5c
ld (FILESECT),hl
;
" . \
10345 af
xor a
;
.
10346 32 ea 5c
ld (FILESIZE),a
;
2 . \
10349 3a dd 5c
ld a,(FILENAME)
;
: . \
10352 f5
push af
;
.
10353 3e 01
ld a,1
;
> .
10355 32 dd 5c
ld (FILENAME),a
;
2 . \
10358 cd ed 2e
call SV_ENTRY
;
. . .
10361 f1
pop af
;
.
10362 32 dd 5c
ld (FILENAME),a
;
2 . \
10365 3a d4 5c
ld a,(ERASED)
;
: . \
10368 4f
ld c,a
;
O
10369 2a db 5c
ld hl,(NUMVAL)
;
* . \
10372 22 eb 5c
ld (FILESECT),hl
;
" . \
10375 3a d1 5c
ld a,(ERR_NODSK)
;
: . \
10378 32 ea 5c
ld (FILESIZE),a
;
2 . \
10381 cd ed 2e
call SV_ENTRY
;
. . .
10384 3a d4 5c
ld a,(ERASED)
;
: . \
10387 3c
inc a
;
<
10388 4f
ld c,a
;
O
10389 cd ae 27
call GET_ENTRY
;
. . '
10392 2a d5 5c
ld hl,(23765)
;
* . \
10395 22 eb 5c
ld (FILESECT),hl
;
" . \
10398 cd ed 2e
call SV_ENTRY
;
. . .
10401 3a d4 5c
ld a,(ERASED)
;
: . \
10404 4f
ld c,a
;
O
10405 c3 17 28
jp MOVE1
;
. . (
MOVE5
10408 2a cf 5c
ld hl,(WRKSPADDR) ; Limpa a rea de 4096 bytes reservados

10411
10414
10417
10420
10423
10427
10428
10431
10434
10437
10438
10441
10443
10446
10449
10450
10453
10454
10455
10458
10459
10462

01
cd
cd
2a
ed
19
22
3a
21
96
32
36
2a
22
f5
cd
f1
4f
cd
af
32
c3

00
d7
7f
e5
5b

10
2e
23
5b
d9 5c

e5 5b
e4 5b
f4 5b
e4 5b
00
d5 5c
e1 5b
f0 2e
ae 27
dd 5c
e6 24

sub_28e1h:
10465 3a d3
10468 b7
10469 c8
10470 e5
10471 21 23
10474 96
10475 e1
10476 30 2b
10478 3a d3
10481 47
10482 af
10483 32 d3
l28f6h:
10486 c5
10487 2a cf
10490 e5
10491 ed 5b
10495 cd ea
10498 2a f4
10501 22 d5
10504 e1
10505 c1
10506 ed 5b
10510 cd fa
10513 2a f4
10516 22 d7
10519 18 c8
l2919h:
10521 32 d3
10524 e5
10525 21 23
10528 46
10529 e1
10530 af
10531 18 d1

5c

5d

5c
5c
5c
d5 5c
2e
5c
5c
d7 5c
2e
5c
5c
5c
5d

ld bc,4096
call BAS_RECL2
call RD_DSKCFG
ld hl,(BUFFER+229)
ld de,(GENERAL)
add hl,de
ld (BUFFER+229),hl
ld a,(BUFFER+228)
ld hl,BUFFER+244
sub (hl)
ld (BUFFER+228),a
ld (hl),0
ld hl,(23765)
ld (BUFFER+225),hl
push af
call BUFFER2DSK
pop af
ld c,a
call GET_ENTRY
xor a
ld (FILENAME),a
jp DIR-RET1

;do espao de trabalho,

ld a,(23763)
or a
ret z
push hl
ld hl, FREERAM_S
sub (hl)
pop hl
jr nc,l2919h
ld a,(23763)
ld b,a
xor a
ld (23763),a

;
;
;
;
;
;
;
;
;
;
;
;

:
.
.
.
!
.
.
0
:
G
.
2

push bc
ld hl,(WRKSPADDR)
push hl
ld de,(23765)
call R_B_SECTS
ld hl,(START_S)
ld (23765),hl
pop hl
pop bc
ld de,(NUM_TRK)
call W_B_SECTS1
ld hl,(START_S)
ld (NUM_TRK),hl
jr sub_28e1h

;
;
;
;
;
;
;
;
;
;
;
;
;
;

.
*
.
.
.
*
"
.
.
.
.
*
"
.

ld (23763),a
push hl
ld hl,FREERAM_S
ld b,(hl)
pop hl
xor a
jr l28f6h

;
;
;
;
;
;
;

2 . \
.
! # ]
F
.
.
. .

; L setor de configurao do disco.


;
* . [
;
. [ . \
;
.
;
" . [
; Subtrai do nmero de arquivos do disco
;o nmero de arquivos apagados:
;CS_NFREE CS_DELET e guarda em
;CS_NFREE.
; Zera nmero de arquivos apagados.
; Guarda setor e trilha inicial do disco
;em CS_FREES/CS_FREET.
;
.
; Salva setor de configurao no disco.
;
.
;
O
;
; Marca primeiro byte como 0 (fim do
;diretrio).
;
. \

# ]
+
. \
. \
. \
[
.
.
.

. \
.
\
\

[
.
.
.
.

. \
.
\
\

CP_DIR_ENT (10533/#2925)
Encontra os 16 bytes de dados de diretrio do arquivo, cujo nmero especificado pelo

registrador C (arquivo 0 a 127).


Registrador A define sentido da transferncia dos dados:
A=0, cpia do buffer de impressora para a rea de variveis de sistema a partir de FILENAME.
A<>0, faz cpia no sentido inverso.
Usada por: GET_ENTRY, PUT_ENTRY.
10533 f5
push af
; Preserva acumulador e flags.
10534 21 cc 5c
ld hl,TR0SECT
; Assinalar para ler setor 0 da trilha 0.
10537 36 00
ld (hl),0
10539 79
ld a,c
CP_DIR_EN1
10540 d6 10
sub 16
; Se contador C<16 (cada setor tem 16 en10542 38 03
jr c,CP_DIR_EN2
;tradas de diretrio), salta adiante,
10544 34
inc (hl)
;seno avana para o prximo setor e
10545 18 f9
jr CP_DIR_EN1
;repete o ciclo.
CP_DIR_EN2
10547 c6 10
add a,16
; Recupera a posio da entrada do arquivo
10549 4f
ld c,a
;no diretrio e recupera em C.
10550 c5
push bc
; Preserva par BC.
10551 cd 64 23
call RD_T0
; L o setor no buffer de impressora.
10554 c1
pop bc
; Recupera par BC.
10555 f1
pop af
; Recupera acumulador e flags.
10556 cd 3d 2d
call ENTRYPOS
; HL=endereo da entrada no buffer.
10559 11 dd 5c
ld de FILENAME
; DE=variveis de sistema do DOS.
10562 01 10 00
ld bc,16
; 16 bytes a serem copiados.
10565 b7
or a
; Se A=0, salta adiante para copiar do
10566 28 01
jr z,CP_DIR_EN3
;buffer para as variveis,
10568 eb
ex de,hl
;seno faz a cpia no sentido inverso.
CP_DIR_EN3
10569 ed b0
ldir
10571 c9
ret
; Fim.

LOAD (10572/#294C)
Sintaxe:

LOAD a$
LOAD a$ CODE [e]
LOAD a$ DATA < v()|v$() > [, w()|w$() ]
(a$=nome do arquivo;
e=endereo inicial;
v(), v$(), w(), w$(), = matrizes numricas ou alfanumricas)
10572 cd 81 29
call RES_EXECLD
; Sinaliza LOAD.
PEEK2
10575
10578
10581
10583
10586
10589
10591
10594

cd
cd
3e
32
3a
fe
ca
c3

65
0e
ff
10
e5
42
f1
70

sub_2965h:
10597 cd a9
10600 cd 0e
10603 cd dd
10606 c3 4d

29
2e

20
21

call sub_2965h
call SYN_CHK
ld a,#ff
ld (EXECLOAD),a
ld a,(FILETYPE)
cp 66
jp z,RUNLOAD
jp CMD-RET

;
. e )
; Retorna se est checando sintaxe.
;
> .
;
2 . ]
; Se o tipo de arquivo B
;(BASIC),
;
;seno retorna do comando.

29
2e
29
2a

call GET_ARGS
call SYN_CHK
call sub_29ddh
jp l2a4dh

; Obtm argumentos da linha de comando.


; Retorna se est checando sintaxe.
;
. . )
;
. M *

5d
5c

LDCD_ARG
Usado por LOAD CODE. Se no foi fornecido argumento aps CODE, retorna, seno busca dois
argumentos numricos.
Saida:
GENERAL = endereo inicial (se fornecido)
NUMVAL = comprimento do bloco (se fornecido), ou endereo inicial
10609 2a 5d 5c
ld hl,(CH_ADD)
; Verifica se a posio seguinte da linha

10612 23
inc hl
10613 7e
ld a,(hl)
10614 fe 0d
cp 13
10616 c8
ret z
10617 3e 01
ld a,1
10619 32 d6 5c
ld (23766),a
10622 cd 88 2e
call PARSECODE1
RES_EXECLD (10625/#2981)

;de comando contm ENTER.


; Se sim, retorna.
; Sinaliza 1 na varivel.
; Pega um ou dois argumentos numricos.

Zera a varivel EXECLOAD, indicando que o comando LOAD/SAVE e no PEEK/POKE.


10625 af
xor a
; A=0.
10626 32 10 5d
ld (EXECLOAD),a
; Guarda na varivel.
10629 c9
ret
; Fim.

PK_PARSE (10630/#2986)
Pega argumentos de um comando PEEK ou POKE.
Sada: NUM_TRK = endereo
GENERAL = nmero do setor
10630 cd f1 24
call FET_TYPE
; Obtm tipo do arquivo.
10633 3e 42
ld a,66
; Se no for B (BASIC)
10635 b8
cp b
10636 20 07
jr nz,PK_PARSE1
;salta adiante, caso contrrio
10638 2a 5d 5c
ld hl,(CH_ADD)
;recua uma posio do apontador
10641 2b
dec hl
;do interpretador da linha de comando.
10642 22 5d 5c
ld (CH_ADD),hl
PK_PARSE1
10645 cd 88 2e
call PARSECODE1
; Pega um ou dois argumentos numricos.
10648 2a d9 5c
ld hl,(GENERAL)
; Guarda primeiro argumento em NUM_TRK.
10651 22 d7 5c
ld (NUM_TRK),hl
10654 2a db 5c
ld hl,(NUMVAL)
; Guarda segundo argumento em GENERAL.
10657 22 d9 5c
ld (GENERAL),hl
10660 af
xor a
;
.
10661 32 d6 5c
ld (23766),a
;
2 . \
10664 c9
ret
;
.

GET_ARGS (10665/#29A9)
Pega argumentos da linha de comando para
10665 cd aa 23
call NOARG
10668 ca 0d 22
jp z,RUN_BOOT
10671 cd 7c 2e
call GETARG_S
10674 cd ec 24
call CHKEXCLD
10677 c4 86 29
call nz,PK_PARSE
10680 cd 26 2e
call BAS_G_CHR
10683 fe af
cp 175
10685 cc 71 29
call z,LDCD_ARG
10688 fe e4
cp 228
10690 f5
push af
10691 cd ec 24
call CHKEXCLD
10694 cc f1 24
call z,FET_TYPE
10697 f1
pop af
10698 cc ab 2c
call z,CHK_VAR
10701 cd 0e 2e
call SYN_CHK
10704 cd f1 38
call FINDFILE
sub_29d3h:
10707 c2 58 23
jp nz,ERRNOFILE
10710 cd ae 27
call GET_ENTRY
10713 cd 96 3f
call LD_BUFFER1
10716 c9
ret
sub_29ddh:
10717 3a d6 5c
10720 b7
10721 2a e6 5c

ld a,(23766)
or a
ld hl,(FILEDATA1)

comandos LOAD, PEEK, POKE e MERGE.


; Se no existe argumento na linha de co;mando, executa comando RUN boot
; Obtm nome do arquivo.
; Se for PEEK ou POKE, pega argumentos na
;linha de comando.
; Se prximo caractere for palavra-chave
;CODE, pega argumento(s) da linha de
;comando.
; Verifica palavra-chave DATA.
; Preserva acumulador e flags.
; Se est executando comando LOAD, pega
;o tipo do arquivo.
; Recupera acumulador e flags.
; Se for DATA, checa se varivel existe.
; Retorna se est checando sintaxe.
; Busca o arquivo no diretrio.
;
;
;
;

Se no for encontrado, acusa erro.


Obtm entrada do arquivo no diretrio.
Recupera buffer de impressora do disco.
Fim.

;
: . \
;
.
; Obtm tamanho do arquivo.

10724 28
10726 2a
l29e9h:
10729 ed
10733 fe
10735 3a
10738 d5
10739 ed
10743 20
10745 ed
l29fdh:
10749 47
10750 ed
10754 3a
10757 fe
10759 78
10760 20
10762 78
10763 ba
10764 28
10766 3d
10767 ba
10768 78
10769 28
10771 3a
10774 fe
10776 78
10777 28
10779 af
10780 32
10783 50
10784 1e
10786 ed
10790 18
l2a28h:
10792 3e
10794 32
l2a2dh:
10797 78
10798 cd
l2a31h:
10801 f5
10802 7c
10803 fe
10805 20
10807 af
10808 32
l2a3bh:
10811 3a
10814 fe
10816 f5
10817 cc
10820 f1
10821 fe
10823 cc
10826 f1
10827 d1
10828 c9

03
d9 5c

jr z,l29e9h
ld hl,(GENERAL)

;
;

5b eb 5c
03
ea 5c

ld de,(FILESECT)
cp 3
ld a,(FILESIZE)
push de
ld de,(FILEDATA2)
jr nz,l29fdh
ld de,(NUMVAL)

; D=trilha/E=setor de incio do arquivo.


;
. .
;
: . \
;
.
;
. [ . \
;
.
;
. [ . \

00
53 db 5c
05

ld b,a
ld (NUMVAL),de
ld a,(FILETYPE)
cp 67
ld a,b
jr nz,l2a31h
ld a,b
cp d
jr z,l2a28h
dec a
cp d
ld a,b
jr z,l2a28h
ld a,(23766)
cp 3
ld a,b
jr z,l2a28h
xor a
ld (23766),a
ld d,b
ld e,0
ld (NUMVAL),de
jr l2a2dh

; Preserva em B tamanho do arquivo.


;
; Verifica se o tipo do arquivo C
;(CODE).
; Recupera tamanho do arquivo.
; Se for, salta adiante.
;
x
;
.
;
( .
;
=
;
.
;
x
;
( .
;
: . \
;
. .
;
x
;
( .
;
.
;
2 . \
;
P
;
. .
;
. S . \
;
. .

03
d6 5c

ld a,3
ld (23766),a

;
;

> .
2 . \

59 2f

ld a,b
call sub_2f59h

;
;

x
. Y /

push af
ld a,h
cp 91
jr nz,l2a3bh
xor a
ld (23766),a

;
;
;
;
;
;

.
|
. [
.
.
2 . \

ld a,(FILETYPE)
cp 66
push af
call z,sub_2ad3h
pop af
cp 68
call z,sub_2b03h
pop af
pop de
ret

; Verifica se o tipo de arquivo B


;(BASIC).
;
;
. . *
;
.
; Se arquivo for tipo D (DATA),
;
;
.
;
.
;
.

ld b,a
call CHKEXCLD

;
;

5b e8 5c
04
5b db 5c
53 db 5c
e5 5c
43
27
1a

15
d6 5c
03
0d
d6 5c

5b
04
d6 5c
e5 5c
42
d3 2a
44
03 2b

l2a4dh:
10829 47
10830 cd ec 24

( .
* . \

G
. . $

10833 28
10835 f5
10836 cd
10839 f1
10840 fe
l2a5ah:
10842 f5
10843 cc
10846 f1
10847 28
10849 c3
l2a64h:
10852 3a
10855 fe
10857 cc
10860 2a
10863 2b
10864 36
10866 c9

07
3e 2b
ff
ea 2e
03
fa 2e
d6 5c
03
ae 3f
59 5c
80

jr z,l2a5ah
push af
call sub_2b3eh
pop af
cp 255

;
;
;
;
;

( .
.
. > +
.
. .

push af
call z,R_B_SECTS
pop af
jr z,l2a64h
jp W_B_SECTS1

;
;
;
;
;

.
. . .
.
( .
. . .

ld a,(23766)
cp 3
call z,sub_3faeh
ld hl,(E_LINE)
dec hl
ld (hl),128
ret

;
;
;
;
;
;
;

:
.
.
*
+
6
.

. \
.
. ?
Y \
.

PEEK (10867/#2A73)
Sintaxe:

PEEK <a$> <e>,<s>


PEEK <a$> CODE <e>,<s>
PEEK <a$> DATA <e>,<s>
PEEK <a$> # <e>,<s>
a$ = nome do arquivo
e = endereo da RAM a carregar o setor
s = nmero do setor dentro do arquivo
Faz a leitura de um setor do arquivo, e salva na RAM.
10867 3e ff
ld a,#ff
; Marcador #ff para EXECLOAD.
10869 18 02
jr PEEK1
; Prossegue adiante.

POKE (10871/#2A77)
Sintaxe:

POKE <a$> <e>,<s>


POKE <a$> CODE <e>,<s>
POKE<a$> DATA <e>,<s>
POKE <a$> # <e>,<s>
a$ = nome do arquivo
e = endereo da RAM a carregar o setor
s = nmero do setor dentro do arquivo
Faz a leitura de um setor do arquivo, e salva na RAM.
10871 3e ee
ld a,#ee
; Marcador #ee para EXECLOAD.
PEEK1
10873 32 10 5d
10876 c3 4f 29

ld (EXECLOAD),a
jp PEEK2

; Salva na varivel de sistema.


;

MERGE (10879/#2A7F)
Sintaxe:
10879 3e
10881 32
10884 cd
10887 cd
10890 3a
10893 fe
10895 c2
10898 ed
10902 c5
10903 03
10904 21

MERGE a$
(a$=nome do arquivo)
ld a,255
;
> .
5d
ld (FLG_RFPC),a
;
2 . ]
29
call GET_ARGS
;
. . )
2e
call SYN_CHK
; Retorna se est checando sintaxe.
5c
ld a,(FILETYPE)
; Se o tipo de arquivo no for B,
cp 66
;(BASIC),
2d
jp nz,SYN_ERROR
;acusa erro de sintaxe.
e6 5c ld bc,(FILEDATA1) ; BC=tamanho do programa BASIC.
push bc
; Preserva tamanho do BASIC.
inc bc
; Um espao a mais para o separador.
30 00
ld hl,48
; Rotina BC-SPACES da ROM BASIC, abre luff
1f
a9
0e
e5
42
b3
4b

10907 cd 36
10910 36 80
10912 eb
10913 d1
10914 e5
10915 ed 5b
10919 3a ea
10922 47
10923 cd 81
10926 78
10927 cd 4d
10930 e1
10931 e7
10932 ed 5b
10936 21 d2
10939 cd cf
10942 c3 70
sub_2ac1h:
10945 eb
10946 37
10947 ed 52
10949 d8
10950 11 0a
10953 19
10954 44
10955 4d
10956 21 05
10959 cd 36
10962 c9
sub_2ad3h:
10963 ed 5b
10967 2a 59
10970 2b
10971 e5
10972 d5
10973 ed 52
10975 ed 5b
10979 d5
10980 cd c1
10983 c1
10984 d1
10985 e1
10986 c5
10987 e7
10988 21 e5
10991 cd cf
10994 c1
10995 cd dd
10998 23
10999 ed 4b
11003 09
11004 22 4b
11007 2a 53
11010 c9

2e

eb 5c
5c
29
2a
53 5c
08
2e
21

00

1f
2e
53 5c
5c

e6 5c
2a

19
2e
2e
e8 5c
5c
5c

sub_2b03h:
11011 ed 5b e8 5c
11015 2a d9 5c
11018 e5
11019 cd c1 2a
11022 e1
11023 7c

call CALLBAS
ld (hl),#80
ex de,hl
pop de
push hl
ld de,(FILESECT)
ld a,(FILESIZE)
ld b,a
call RES_EXECLD
ld a,b
call l2a4dh
pop hl
rst 32
ld de,(PROG)
ld hl,l08d2h
call CALLBAS_HL
jp CMD-RET

;gar no espao de trabalho.


; Coloca um separador no final do espao.
; HL aponta para incio do espao criado.
; Recupera tamanho do BASIC.
; Guarda apontador.
;
;
: . \
;
G
; Sinaliza LOAD.
;
x
;
. M *
;
.
; HLSAVER, salva temporariamente HL.
;
. [ S \
;
! . .
;
. . .
;
. p !

ex de,hl
scf
sbc hl,de
ret c
ld de,l0009h+1
add hl,de
ld b,h
ld c,l
ld hl,l1f05h
call CALLBAS
ret

;
;
;
;
;
;
;
;
;
;
;

ld de,(PROG)
ld hl,(E_LINE)
dec hl
push hl
push de
sbc hl,de
ld de,(FILEDATA1)
push de
call sub_2ac1h
pop bc
pop de
pop hl
push bc
rst 32
ld hl,l19e5h
call CALLBAS_HL
pop bc
call sub_2eddh
inc hl
ld bc,(FILEDATA2)
add hl,bc
ld (VARS),hl
ld hl,(PROG)
ret

;
. [ S \
;
* Y \
;
+
;
.
;
.
;
. R
;
. [ . \
;
.
;
. . *
;
.
;
.
;
.
;
.
; HLSAVER, salva temporariamente HL.
;
! . .
;
. . .
;
.
;
. . .
;
#
;
. K . \
;
.
;
" K \
;
* S \
;
.

ld de,(FILEDATA2)
ld hl,(GENERAL)
push hl
call sub_2ac1h
pop hl
ld a,h

;
;
;
;
;
;

.
7
.
.
.
.
D
M
!
.
.

R
. .

. .
6 .

. [ . \
* . \
.
. . *
.
|

11024 b5
11025 28 10
11027 2a d7
11030 2b
11031 2b
11032 2b
11033 ed 4b
11037 03
11038 03
11039 03
11040 cd d7
l2b23h:
11043 2a 59
11046 2b
11047 ed 4b
11051 c5
11052 03
11053 03
11054 03
11055 cd dd
11058 23
11059 3a d2
11062 77
11063 23
11064 d1
11065 73
11066 23
11067 72
11068 23
11069 c9
sub_2b3eh:
11070 3a d9
11073 48
11074 47
11075 79
11076 b8
11077 38 19
11079 78
11080 b7
11081 ca b3
11084 05
11085 28 0b
11087 3e 10
l2b51h:
11089 1c
11090 bb
11091 20 03
11093 1e 00
11095 14
l2b58h:
11096 10 f7
l2b5ah:
11098 06 01
11100 2a d7
11103 c9
l2b60h:
11104 21 92
11107 3e 05
11109 c3 e5

5c

d9 5c

2e
5c
e8 5c

2e
5c

5c

2d

5c
39
2c

or l
jr z,l2b23h
ld hl,(NUM_TRK)
dec hl
dec hl
dec hl
ld bc,(GENERAL)
inc bc
inc bc
inc bc
call BAS_RECL2

;
;
;
;
;
;
;
;
;
;
;

.
(
*
+
+
+
.
.
.
.
.

ld hl,(E_LINE)
dec hl
ld bc,(FILEDATA2)
push bc
inc bc
inc bc
inc bc
call sub_2eddh
inc hl
ld a,(VARNAME)
ld (hl),a
inc hl
pop de
ld (hl),e
inc hl
ld (hl),d
inc hl
ret

;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;

*
+
.
.
.
.
.
.
#
:
w
#
.
s
#
r
#
.

Y \

ld a,(GENERAL)
ld c,b
ld b,a
ld a,c
cp b
jr c,l2b60h
ld a,b
or a
jp z, SYN_ERROR
dec b
jr z,l2b5ah
ld a,16

;
;
;
;
;
;
;
;
;
;
;
;

:
H
G
y
.
8
x
.
.
.
(
>

. \

inc e
cp e
jr nz,l2b58h
ld e,0
inc d

;
;
;
;
;

.
.

djnz l2b51h

. .

ld b,1
ld hl,(NUM_TRK)
ret

;
;
;

. .
* . \
.

ld hl,M_REC_OF
ld a,5
jp CMD_ERR_RET

; Msg: Rec. O/F"


; Flag para no limpar linha de edio.
;
. . ,

.
. \

K . \

. .

K . \

. .
. \

.
. .
.

.
. .
.

FILEEXISTS
Checa se o arquivo especificado existe no disco, e se o diretrio est lotado. Faz tratamento

de erro, quando aplicvel.


11112 cd f1 38
call FINDFILE
11115 ca eb 2c
jp z,F_EXISTS
DIRFULL (11118/#2B6E)

; Busca o arquivo no diretrio, se existe,


;acusa erro de arquivo existente.

Neste ponto de entrada s checa se o diretrio do disco j est lotado, isto , com 128 arquivos
(incluindo os que foram apagados).
11118 cd 7f 23
call RD_DSKCFG
; L configurao do disco.
11121 3a e4 5b
ld a,(BUFFER+228) ; Se CS_NFILE for 128,
11124 fe 80
cp 128
11126 ca 97 37
jp z,DIR_FULL
;acusa erro de diretrio cheio.
11129 c9
ret
; Fim.

SAVE (11130/#2B7A)
Sintaxe:

SAVE a$ [LINE lin]


SAVE a$ CODE <end>,<compr>
SAVE a$ DATA <v() | v$()>
(a$=nome do arquivo; lin=linha de auto-execuo de programa BASIC; end=endereo inicia;,
compr=comprimento em bytes; v() = matriz numrica e v$() = matriz alfanumrica)
11130 cd 81 29
call RES_EXECLD
; Sinaliza SAVE.
11133 21 00 00
ld hl,0
; Zera a linha de auto-execuo de um
11136 22 d1 5c
ld (ERR_NODSK),hl ;comando SAVE a$ LINE lin.
11139 cd 7c 2e
call GETARG_S
; Obtm um string da linha de comando.
11142 cd 26 2e
call BAS_G_CHR
; Obtm um caractere.
11145 fe af
cp 175
; Se caractere for palavra-chave CODE,
11147 28 56
jr z,SAVE6
;salta adiante.
11149 fe ca
cp 202
; Se no for palavra-chave LINE,
11151 20 11
jr nz,SAVE1
;salta adiante.
11153 cd a8 2e
call STOARG_N
; Obtm argumento numrico.
11156 cd 0e 2e
call SYN_CHK
; Retorna se est checando sintaxe.
11159 2a db 5c
ld hl,(NUMVAL)
; Guarda linha de auto-execuo na vari11162 22 d1 5c
ld (ERR_NODSK),hl ;vel de sistema.
11165 21 e5 5c
ld hl,FILETYPE
; HL aponta para varivel de sistema DOS.
11168 18 27
jr SAVE3
; Salta adiante, para salvar programa.
SAVE1
11170 fe aa
cp 170
; Se no for palavra-chave SCREEN$,
11172 20 11
jr nz,SAVE2
;salta adiante.
11174 21 00 40
ld hl,VRAM
; Atribui incio da RAM de vdeo como
11177 22 d7 5c
ld (NUM_TRK),hl
;endereo inicial
11180 21 00 1b
ld hl,6912
; Atribui valor 6912 como comprimento
11183 22 d9 5c
ld (GENERAL),hl
;do bloco de bytes,e a armazena nas
11186 22 db 5c
ld (NUMVAL),hl
;variveis de sistema do DOS.
11189 18 3b
jr SAVE7
; Salta para salvar arquivo CODE.
SAVE2
11191 cd 0e 2e
call SYN_CHK
; Retorna se est checando sintaxe.
11194 cd 26 2e
call BAS_G_CHR
; Obtm caractere da linha de comando.
11197 21 e5 5c
ld hl,FILETYPE
;
11200 fe e4
cp 228
; Se for palavra-chave DATA, salta
11202 28 12
jr z,SAVE5
;adiante.
11204 fe 0d
cp 13
; Se caractere for ENTER, acusa erro de
11206 c2 b3 2d
jp nz,SYN_ERROR
;sintaxe.
SAVE3 salva programa BASIC.
11209 36 42
ld (hl),66
; Atribui tipo de arquivo B.
11211 cd 68 2b
call FILEEXISTS
; Verifica se o arquivo j existe.
11214 cd b9 2e
call BAS_RMFP
; Remove cdigo de nmeros de 5 bytes da
;linha do comando.
SAVE4
11217 cd 8d 2c
call BASDIR
; Pega os parmetros para salvar arquivo
11220 18 27
jr SAVE8
;BASIC, e salta adiante.
SAVE5 salva arquivo tipo DATA.
11222 36 44
ld (hl),68
; Atribui tipo de arquivo D.
11224 cd 68 2b
call FILEEXISTS
; Verifica se o arquivo j existe.

11227 cd b6 2c
call VARDIR
; Procura a matriz da linha de comando.
11230 30 1d
jr nc,SAVE8
; Se for encontrado, salta adiante,
11232 da b3 2d
jp c,SYN_ERROR
;seno acusa erro de sintaxe.
SAVE6 pega parmetros de arquivo tipo CODE.
11235 cd 82 2e
call PARSECODE
; Pega argumentos da linha de comando.
11238 2a d9 5c
ld hl,(GENERAL)
; Copia endereo inicial para
11241 22 d7 5c
ld (NUM_TRK),hl
;NUM_TRK.
11244 2a db 5c
ld hl,(NUMVAL)
; Copia comprimento para GENERAL.
11247 22 d9 5c
ld (GENERAL),hl
SAVE7 salva arquivo tipo CODE.
11250 cd 0e 2e
call SYN_CHK
; Retorna se est checando sintaxe.
11253 3e 43
ld a,67
; Atribui tipo de arquivo C.
11255 32 e5 5c
ld (FILETYPE),a
11258 cd 68 2b
call FILEEXISTS
; Verifica se o arquivo j existe.
SAVE8 salva o arquivo de qualquer um dos 3 tipos.
11261 cd 03 2c
call SAVEFILE
; Salva arquivo no disco.
11264 c3 e6 24
jp DIR-RET1
; Salta para salvar setor de configurao
;e encerrar.

SAVEFILE (11267/#2C03)
Salva arquivo em disco.
Entradas:
GENERAL = comprimento do arquivo a salvar
NUM_TRK = campo FILEDATA1 do diretrio (endereo inicial)
NUMVAL = campo FILEDATA2 do diretrio
11267 2a d7 5c
ld hl,(NUM_TRK)
; Define campo FILEDATA1, que depende do
11270 22 e6 5c
ld (FILEDATA1),hl ;tipo de arquivo a salvar.
11273 eb
ex de,hl
;
11274 2a d9 5c
ld hl,(GENERAL)
; Pega comprimento do arquivo a salvar.
11277 7d
ld a,l
11278 b4
or h
11279 ca b3 2d
jp z, SYN_ERROR
; Se for nulo, acusa erro de sintaxe.
11282 7d
ld a,l
; Verifica se o byte menos significativo
11283 b7
or a
;do comprimento 0, se no for, aumenta
11284 28 01
jr z,SAVEFILE1
;o byte mais significativo que representa
11286 24
inc h
;o nmero de setores a serem salvos.
SAVEFILE1
11287 7c
ld a,h
; Guarda o tamanho do arquivo na vari11288 32 ea 5c
ld (FILESIZE),a
;vel do DOS apropriada.
11291 5f
ld e,a
; Neste ponto, flag CARRY=0 devido
11292 16 00
ld d,0
;instruo OR A anterior.
11294 2a e5 5b
ld hl,(BUFFER+229) ; Subtrai do nmero de setores livres
11297 ed 52
sbc hl,de
;(CS_NFREE), o tamanho do arquivo.
11299 da e0 2c
jp c,NOSPACE
; Se resultado for negativo, acusa erro
;de falta de espao em disco.
11302 e5
push hl
; Preserva novo valor de espao do disco.
11303 2a 59 5c
ld hl,(E_LINE)
; Aponta para linha de edio.
11306 36 aa
ld (hl),#AA
; Coloca separador #AA.
11308 23
inc hl
11309 ed 5b d1 5c ld de,(ERR_NODSK) ; Na sequncia, coloca o nmero de linha
11313 73
ld (hl),e
;de auto-execuo do programa BASIC.
11314 23
inc hl
11315 72
ld (hl),d
11316 2a db 5c
ld hl,(NUMVAL)
; Define campo FILEDATA2, que depende do
11319 22 e8 5c
ld (FILEDATA2),hl ;tipo de arquivo a salvar.
11322 2a e1 5b
ld hl,(BUFFER+225) ; Atribui como setor e trilha inicial do
11325 22 eb 5c
ld (FILESECT),hl
;arquivo, o setor e a trilha inicial da
11328 e5
push hl
;rea livre do disco, e preserva o valor.
11329 cd 9b 3f
call LD_BUFFER
; Carrega buffer salvo no disco.
11332 e1
pop hl
; Recupera valor de setor/trilha e
11333 eb
ex de,hl
;passa para DE
11334 2a e6 5c
ld hl,(FILEDATA1) ; HL aponta para endereo da memria a
11337 3a ea 5c
ld a,(FILESIZE)
;salvar, e B especifica o nmero de

11340
11341
11344
11347
11348
11351
11352
11355
11356
11359
11362
11363
11366
11367
11368
11371
11372
11373
11374
11377
11379
11382

47
cd
2a
e5
cd
e1
22
e1
22
21
7e
32
34
e5
cd
e1
4e
0d
3a
fe
cc
c9

fa 2e
f4 5c
7f 23
e1 5b
e5 5b
e4 5b
1e 5d
f0 2e

e5 5c
42
77 2c

ld b,a
call W_B_SECTS1
ld hl,(START_S)
push hl
call RD_DSKCFG
pop hl
ld (BUFFER+225),hl
pop hl
ld (BUFFER+229),hl
ld hl,BUFFER+228
ld a,(hl)
ld (FILEPOS),a
inc (hl)
push hl
call BUFFER2DSK
pop hl
ld c,(hl)
dec c
ld a,(FILETYPE)
cp 66
call z,BASSIZE
ret

;setores a serem salvos.


; Salva os dados do arquivo no disco.
; HL=trilha/setor seguinte ao ltimo que
;foi gravado no disco. Preserva na pilha.
; L configurao do disco no buffer.
; Recupera trilha/setor da pilha.
; Guarda em CS_FREES/CS_FREET.
; Recupera nmero de setores livres do
;disco e guarda em CS_NFREE.
; Pega o nmero de arquivos no disco
;(CS_NFILE) e assume como a posio do
;arquivo salvo.
; Aumenta o nmero de arquivos no disco.
; Preserva apontador para CS_NFILE.
; Salva o buffer no disco.
; Recupera CS_NFILE.
; C fica com valor de nmero de arquivos
;do disco 1.
; Se arquivo for tipo BASIC (B), deter;mina
;sub-rotina
; Fim.

BASSIZE (11383/#2C77)
Calcula o tamanho total do arquivo BASIC
Guarda nas variveis do DOS.
11383 2a 59 5c
ld hl,(E_LINE)
11386 ed 5b 53 5c ld de,(PROG)
11390 37
scf
11391 ed 52
sbc hl,de
11393 22 e6 5c
ld (FILEDATA1),hl
11396 2a 4b 5c
ld hl,(VARS)
11399 ed 52
sbc hl,de
11401 22 e8 5c
ld (FILEDATA2),hl
11404 c9
ret

(programa + variveis) e somente do programa.


; HL = endereo da linha de edio
;endereo do incio do programa BASIC 1,
;isto , tamanho total do bloco BASIC.
; Guarda o valor em FILEDATA1.
; HL = endereo do incio da rea dos
;variveis endereo do programa BASIC,
;tamanho somente do programa BASIC.
; Fim.

BASDIR (11405/#2C8D)
Calcula os dados do diretrio para arquivo BASIC a ser salvo.
Sada:
NUMVAL = tamanho do programa BASIC, sem as variveis
NUM_TRK = endereo do incio do programa BASIC
GENERAL = tamanho total a salvar, BASIC com as variveis, mais
separadores e linha de auto-execuo
11405 2a 4b 5c
ld hl,(VARS)
; HL=incio da rea de variveis do BASIC.
11408 ed 5b 53 5c ld de,(PROG)
; DE=incio do programa BASIC.
11412 ed 52
sbc hl,de
; HL=tamanho somente do programa BASIC,
11414 22 db 5c
ld (NUMVAL),hl
;sem as variveis, que guardado.
11417 2a 53 5c
ld hl,(PROG)
; HL=incio do programa BASIC, que
11420 22 d7 5c
ld (NUM_TRK),hl
;guardado.
11423 2a 59 5c
ld hl,(E_LINE)
; HL=incio da linha de edio, ou fim
11426 23
inc hl
;da rea das variveis+1.
11427 23
inc hl
; No final, HL fica 4 bytes aps fim da
11428 23
inc hl
;rea das variveis. Os 4 bytes extras
;acomodam separadores #80 e #AA, e a linha
;de auto-execuo do programa BASIC.
11429 ed 52
sbc hl,de
; HL=tamanho total do bloco a ser salvo,
11431 22 d9 5c
ld (GENERAL),hl
;que guardado.
11434 c9
ret
; Fim.

CHK_VAR (11435/#2CAB)
Verifica se o nome da varivel na linha de comando existe, se sim, retorna com CARRY=0. Se
no, zera a varivel de sistema do DOS GENERAL.
11435 cd b6 2c
call VARDIR
; Verifica se varivel BASIC existe,
11438 d0
ret nc
;sim, retorna,

11439 21 00 00
11442 22 d9 5c
11445 c9

ld hl,0
ld (GENERAL),hl
ret

;no, zera a varivel de sistema DOS.


; Fim.

VARDIR (11446/#2CB6)
Calcula os dados do diretrio para arquivo DATA a ser salvo.
Sada:
NUMVAL = tamanho da matriz
NUM_TRK = endereo do incio de dados da matriz
GENERAL = tamanho da matriz
VARNAME = nome da matriz
Flag CARRY = 1, se varivel no foi encontrada
11446 cd cb 2e
call BAS_NXTCHR
; Busca prximo caractere interpretvel,
11449 cd 3b 2e
call BAS_LKVAR
; Busca varivel apontada por CH_ADD.
11452 cb f9
set 7,c
; Bit 7=1 (verificando sintaxe).
11454 79
ld a,c
; C deve conter nome da matriz
11455 32 d2 5c
ld (VARNAME),a
11458 30 02
jr nc,VARDIR2
; Se a varivel foi encontrada, salta
;adiante.
VARDIR1
11460 37
scf
; Sinaliza varivel no encontrada.
11461 c9
ret
; Fim.
VARDIR2
11462 20 fc
jr nz,VARDIR1
; Se varivel no era matriz, salta para
;trs.
11464 23
inc hl
; HL aponta para o nome da matriz.
11465 5e
ld e,(hl)
; Busca seu comprimento e armazena em DE.
11466 23
inc hl
11467 56
ld d,(hl)
11468 23
inc hl
; HL aponta para o incio dos dados, que
11469 22 d7 5c
ld (NUM_TRK),hl
; guardado em NUM_TRK.
11472 ed 53 db 5c ld (NUMVAL),de
; Guarda comprimento em NUMVAL e
11476 ed 53 d9 5c ld (GENERAL),de
;GENERAL .
11480 cd cb 2e
call BAS_NXTCHR
; Busca prximo caractere.
11483 fe 29
cp 41
; Se no for ) (fechando o parntesis),
11485 20 e7
jr nz,VARDIR2
;salta para trs.
11487 c9
ret
; Fim.
NOSPACE
11488 21 60 39
ld hl,M_NOSPACE
; Mensagem: No Space
11491 3e 03
ld a,3
; Flag para no limpar linha de edio.
CMD_ERR_RET retorno do comando aps erro.
11493 cd 42 23
call PR_IMMED
; Imprime mensagem de erro se estiver em
;modo imediato.
11496 c3 70 21
jp CMD-RET
; Retorna do comando.
F_EXISTS
11499 21 6a 39
ld hl,M_F_EXIST
; Mensagem: File exists.
11502 3e 02
ld a,2
; Flag para no limpar linha de edio.
11504 18 f3
jr CMD_ERR_RET
; Retorna do comando.

STR_FNAME (11506/#2CF2)
Pega string da pilha da calculadora e o armazena como nome de um arquivo em FILENAME. Se
contiver especificao do drive (X:), muda o drive corrente.
Usada por: SEEKFILE, FORMAT, FINDFILE.
11506 21 dd 5c
ld hl,FILENAME
; HL aponta para nome do arquivo.
11509 06 08
ld b,8
; Contador de 8 caracteres.
STR_FNAME1
11511 36 20
ld (hl),32
; Coloca (SPACE) na posio apontada
11513 23
inc hl
;para apagar o nome do arquivo.
11514 10 fb
djnz STR_FNAME1
; Repete at o oitavo caractere.
11516 cd 98 24
call STK_STR
; Pega da pilha da calculadora O apontador
11519 eb
ex de,hl
;para o string da linha de comando.
11520 cd 1a 2d
call PARSEDRV
; Verifica se h especificao de drive no
11523 79
ld a,c
;string, e muda o drive corrente. Aps,
11524 b7
or a
;se o comprimento do string ficou nulo,

11525 ca b3 2d
11528 fe 09
11530 38 02
11532 0e 08
STR_FNAME2
11534 7e
11535 fe 20
11537 da b3 2d
11540 11 dd 5c
11543 ed b0
11545 c9

jp
cp
jr
ld

z,SYN_ERROR
9
c,STR_FNAME2
c,8

ld a,(hl)
cp 32
jp c,SYN_ERROR
ld de,FILENAME
ldir
ret

;acusa
; Se o
;salta
;seno

erro de sintaxe.
string tem comprimento menor que 9
adiante,
assume comprimento 8.

; Se o primeiro caractere do nome do


;arquivo for menor que (SPACE),
;acusa erro de sintaxe.
; Copia os C bytes do string para a vari;vel de sistema.
; Fim.

PARSEDRV (11546/#2D1A)
Verifica se h especificao de drive num string de argumento de um comando DOS, cujo
endereo apontado por HL.
Analisa a existncia da especificao de drive em um string no formato "X:" (primeiro byte
qualquer caractere, segundo o caractere dois-pontos).
Caso encontre, pega o primeiro byte para especificar o drive, seno assume o drive default.
Faz a mudana do drive.
11546 23
inc hl
; Verifica o segundo byte.
11547 7e
ld a,(hl)
11548 fe 3a
cp 58
;se no for dois pontos (:),
11550 20 11
jr nz,PARSEDRV1
;salta adiante.
11552 2b
dec hl
; Volta ao primeiro byte,
11553 7e
ld a,(hl)
;recolhe o valor em A e converte
11554 cd 8b 24
call DRV_NUM
;em nmero do drive.
11557 c5
push bc
; Preserva pares BC e HL.
11558 e5
push hl
11559 cd 74 3d
call CHANGEDRV1
; Muda o drive corrente.
11562 e1
pop hl
; Recupera pares BC e HL.
11563 c1
pop bc
11564 0b
dec bc
; Diminui comprimento do string em 2 bytes
11565 0b
dec bc
11566 23
inc hl
; Avana endereo inicial do string em 2
11567 23
inc hl
;bytes, para remover o X: inicial.
11568 c9
ret
; Fim.
PARSEDRV1
11569 2b
dec hl
; Volta ao primeiro byte.
11570 3a 19 5d
ld a,(DFLT_DRV)
; Assume drive default como corrente.
11573 c5
push bc
; Preserva pares BC e HL.
11574 e5
push hl
11575 cd 74 3d
call CHANGEDRV1
; Muda o drive corrente.
11578 e1
pop hl
; Recupera pares HL e BC.
11579 c1
pop bc
11580 c9
ret
; Fim.

ENTRYPOS (11581/#2D3D)
Calcula o endereo do item de diretrio de nmero C (0 a 127). O endereo pode estar acima
da rea do buffer de impressora, e neste caso deve ser tratado pela rotina NXT_DIR_S, que ler
o prximo setor do diretrio.
11581 69
ld l,c
; HL = 16*C, posio do incio da entrada
11582 26 00
ld h,0
;nmero C (0-127) em relao ao incio do
11584 29
add hl,hl
;diretrio. Cada entrada de diretrio
11585 29
add hl,hl
;ocupa 16 bytes, por isso multiplica-se
11586 29
add hl,hl
;por esse valor.
11587 29
add hl,hl
11588 01 00 5b
ld bc,BUFFER
; Soma ao endereo do buffer.
11591 09
add hl,bc
11592 c9
ret
; Fim.

SEEKFILE (11593/#2D49)
Busca no diretrio arquivo com mesmo nome (8 caracteres) e tipo (1 caractere) ao do
argumento fornecido ao comando DOS. No caso de arquivo tipo stream (#), dependendo da

varivel CMP_SIZE, pode ou no considerar comparar o nmero de segmento do stream. O


diretrio contm 128 itens de 16 bytes, descrevendo dados dos arquivos.
Se o arquivo for encontrado, retorna flag ZERO=1 e registrador C e varivel DOS FILEPOS com
posio do arquivo no diretrio.
Usada por: NEW, l2572h, COPY, ERASE, STREAMDIR, sub345dh, l3618h, l38b1h, FINDFILE.
11593 cd f2 2c
call STR_FNAME
; Obtm nome do arquivo.
SEEKFILE1
11596 cd 60 23
call RD_T0_S0
; L incio do diretrio.
11599 06 80
ld b,128
; Contador de 128 entradas.
11601 0e 00
ld c,0
; C=contador de entradas do diretrio.
SEEKFILE2
11603 c5
push bc
; Preserva par BC.
11604 cd 3d 2d
call ENTRYPOS
; Calcula o endereo da entrada do diret11607 cd 73 24
call NXT_DIR_S
;rio, se ultrapassou o limite do setor,
;l o prximo setor.
11610 c1
pop bc
; Recupera par BC.
11611 c5
push bc
; Preserva par BC.
11612 79
ld a,c
; Verifica se o contador entrada no
11613 fe 10
cp 16
;16,
11615 20 05
jr nz,SEEKFILE3
;caso sim, salta adiante,
11617 c1
pop bc
;seno recupera BC,
11618 0e 00
ld c,0
;zera contador de entradas do diretrio
11620 18 ed
jr SEEKFILE2
;e repete o ciclo.
SEEKFILE3
11622 11 dd 5c
ld de,FILENAME
; DE aponta para nome do arquivo.
11625 3a 06 5d
ld a,(CMP_SIZE)
; B=nmero de bytes que devem ser compara11628 47
ld b,a
;dos por CP_STRINGS.
11629 af
xor a
; Verifica se o primeiro byte da entrada
11630 be
cp (hl)
;do diretrio 0,
11631 20 03
jr nz,SEEKFILE4
;se for salta adiante
11633 c1
pop bc
; Recupera par BC.
11634 18 09
jr SEEKFILE5
; Salta adiante.
SEEKFILE4
11636 cd 87 37
call CP_STRINGS
; Compara nome do arquivo
11639 c1
pop bc
; Recupera par BC.
11640 28 06
jr z,SEEKFILE6
; Se forem iguais, salta.
11642 0c
inc c
; Seno aumenta o contador C e examina
11643 10 d6
djnz SEEKFILE2
;prxima entrada do diretrio, at passar
;a ltima entrada.
SEEKFILE5
11645 f6 ff
or #ff
; Atribuir #ff a A com flag ZERO abaixado.
11647 c9
ret
; Fim.
SEEKFILE6
11648 3e 80
ld a,128
; A=128-B, retorna posio da entrada no
11650 90
sub b
;diretrio.
11651 4f
ld c,a
; Guarda em C e na
11652 32 1e 5d
ld (FILEPOS),a
;varivel de sistema.
11655 af
xor a
; A=0.
11656 c8
ret z
; Sempre vai retornar, por causa de XOR A.
11657
11660
11663
11664
11665
11667

cd 4c 2d
21 0f 5d
71
c8
36 ff
c9

call SEEKFILE1
ld hl,CL_ELINE
ld (hl),c
ret z
ld (hl),255
ret

;
;
;
;
;
;

RETURN (11668/#2D94)
Sintaxe:
RETURN
11668 cd 0e 2e
call SYN_CHK
11671 cd 8c 31
call SV_IF1_VAR

; Retorna se est checando sintaxe.


;

11674 fd
11678 cd
11681 ed
11685 2a
11688 2b
11689 3e
11691 be
11692 20
11694 2b
11695 22
l2db2h:
11698 c9

cb
d5
7b
3d

01 9e
21
1c 5d
5c

12
04
3d 5c

res 3,(iy+1)
call REC_ERRSP
ld sp,(OLDSP)
ld hl,(ERR_SP)
dec hl
ld a,18
cp (hl)
jr nz,l2db2h
dec hl
ld (ERR_SP),hl

;
;
;
;
;
;
;
;
;
;

.
.
.
*
+
>
.

ret

.
.
{
=

. .
!
. ]
\

.
+
" = \

SYN_ERROR (11699/#2DB3)
Tratamento de erro de sintaxe da linha de comando DOS sendo analisada.
Se ERR_NR no estiver sinalizando erro (isto , se contiver #ff), atribui erro 11, "C Non sense
in BASIC".
11699 fd cb 00 7e bit 7,(iy+0)
; Se ERR_NR contm #ff (cdigo de erro
11703 28 05
jr z,SYN_ERR1
;0 Ok), salta adiante.
11705 3e 0b
ld a,11
; Define cdigo de erro 11 (C Non Sense
11707 32 3a 5c
ld (ERR_NR),a
;in BASIC).
SYN_ERR1
11710 3c
inc a
; A=12, no limpar linha de edio.
11711 21 57 39
ld hl,M_ERROR
; Msg: *ERROR*
ERROR_RET
Imprime mensagem de erro e retorna do comando DOS.
l2dc2h:
11714 cd 42 23
call PR_IMMED
; Imprime mensagem se estiver em modo
;imediato.
11717 c3 70 21
jp CMD-RET
; Retorna do comando.
l2dc8h:
11720 3a
11723 21
11726 fe
11728 28
11730 fe
11732 28
11734 21
11737 fe
11739 28
11741 18

3a 5c
ad 37
14
f0
0c
ec
b5 37
03
e5
d4

ld
ld
cp
jr
cp
jr
ld
cp
jr
jr

a,(ERR_NR)
hl,M_BREAK
20
z,ERROR_RET
12
z, ERROR_RET
hl,M_OUT_RAM
3
z, ERROR_RET
SYN_ERROR

;
: : \
; Msg: *BREAK*
;
. .
;
( .
;
. .
;
( .
; Msg: Out of RAM
;
. .
;
( .
;
. .

RUN (11743/2DDF)
Sintaxe:
l2ddfh:
11743 cd
11746 cd
11749 cd
11752 2a
11755 3a
11758 fe
11760 ca
11763 e5
11764 21
11767 e5
11768 c3

RUN a$ [CODE]
81
65
0e
e6
e5
42
f1

29
29
2e
5c
5c
20

70 21
50 3c

(a$=nome do arquivo)

call RES_EXECLD
call sub_2965h
call SYN_CHK
ld hl,(FILEDATA1)
ld a,(FILETYPE)
cp 66
jp z,RUNLOAD
push hl
ld hl,CMD-RET
push hl
jp CALLBAS1

; Sinaliza LOAD.
;
. e )
; Retorna se est checando sintaxe.
;
* . \
; Verifica tipo do arquivo.
; Se for B (BASIC),
;salta para trs.
; Caso contrrio, limpa pilha
;
;
.
;
. P <

BAS_SETW (11771/#3DFB)
Limpa o espao de trabalho temporrio e a pilha da calculadora.
11771 21 0e 5d
ld hl,CLR_WSP
; Pega valor da varivel de sistema.
11774 7e
ld a,(hl)

11775
11777
11779
11780
11783

fe
36
c0
21
18

ff
00
bf 16
2d

cp #ff
ld (hl),0
ret nz
ld hl,l16bfh
jr CALLBAS

; Verifica flag.
; Zera o flag.
; Retorna se flag<>#ff, seno chama a
;rotina SET-WORK da ROM BASIC.

FLAGS_B7 (11785/#2E09)
Flag ZERO do Z80 assume valor 1 se bit 7 de FLAGS for 0.
11785 fd cb 01 7e bit 7,(iy+1)
; Testa bit 7 de FLAGS.
11789 c9
ret
; Fim.

SYN_CHK (11790/#2E0E)
Se o bit 7 de FLAGS estiver abaixado, sinalizando checagem da sintaxe de comando, retorna
para o endereo contido uma posio abaixo da corrente na pilha do Z80.
Se o bit 7 de FLAGS estiver levantado, sinalizando execuo de comando, simplesmente
retorna sem fazer nada.
A interpretao de uma linha de comandos ocorre em 2 passos. No primeiro passo o comando
e os argumentos so verificados, porm pula-se sua execuo. No segundo passo o comando e
os argumentos so tomados novamente, e desta vez este executado.
11790 cd 09 2e
call FLAGS_B7
; Verifica bit 7 de FLAGS,
11793 c0
ret nz
;retorna se for 1,
11794 e1
pop hl
;seno remove ender. do retorno da pilha.
11795 c9
ret
; Fim.

GETARG_N (11796/#2E14)
Busca na linha de comandos um argumento numrico; se bem sucedido, este ficar disponvel
na pilha da calculadora.
Tambm verifica o bit 7 de FLAGS, o resultado fica no flag ZERO.
11796 cd cb 2e
call BAS_NXTCHR
; Busca prximo caractere interpretvel.
11799 cd 5d 2e
call BAS_E1NUM
; Busca argumento numrico.
11802 18 ed
jr FLAGS_B7
; Verifica bit 7 de FLAGS.

OPEN_K (11804/#2E1C)
Abre o canal "K" (0). As sadas de impresso sero direcionadas para as linhas inferiores da
tela, onde normalmente se edita uma linha.
11804 af
xor a
; A=0, cdigo do canal K.

BAS_OPEN (11805/#2E1D)
Abre canal especificado no acumulador.
11805 21 01 16
ld hl,5633
11808 18 14
jr CALLBAS

; Endereo de CHAN-OPEN da ROM BASIC.


; Chama rotina da ROM BASIC.

OPEN_S (11810/#2E22)
Abre o canal "S" (2). As sadas de impresso sero direcionadas para as linhas superiores da
tela.
11810 3e 02
ld a,2
; A=2, cdigo do canal S.
11812 18 f7
jr BAS_OPEN
; Abre o canal.

BAS_G_CHR (11814/#2E26)
Chama rotina GET-CHAR (RST #18) da ROM BASIC. Busca um caractere imprimvel a partir da
posio apontada por CH-ADD. O registrador A conter o caractere, e CH-ADD ser atualizado
se for necessrio.
11814 21 18 00
ld hl,24
; Endereo da rotina GET-CHAR.
11817 18 0b
jr CALLBAS
; Chama rotina da ROM BASIC.

BAS_EDITOR (11819/#2E2B)
Chama rotina EDITOR da ROM BASIC. Edita uma linha na parte inferior da tela.
11819 cd 1c 2e
call OPEN_K
;
. . .
11822 21 2c 0f
ld hl,3884
;
! , .
11825 18 03
jr CALLBAS
; Chama rotina da ROM BASIC.

BAS_CLS (11827/#2E33)
Chama rotina CLS da ROM BASIC. Limpa a tela.
11827 21 6b 0d
ld hl,3435
; Endereo de CLS da ROM BASIC.

CALLBAS (11830/#2E36)
Permite executar uma rotina da ROM BASIC armazenada em HL, chamada pela ROM do Beta.
Seleciona temporariamente a ROM BASIC, para depois retornar pela sub-rotina ROM_BETA.
11830 e5
push hl
; Coloca na pilha endereo da rotina para
11831 cd 50 3c
call CALLBAS1
;ser executado pelo CALLBAS1.
11834 c9
ret
; Fim.

BAS_LKVAR
Chama rotina LOOK-VARS da ROM BASIC. Esta rotina busca uma varivel BASIC cujo nome
apontado pela varivel de sistema CH_ADD.
Quando varivel for encontrada flag CARRY=1, e se a varivel for string ou matriz, flag
ZERO=1.
11835 21 b2 28
ld hl,10418
; Rotina LOOK-VARS.
11838 18 f6
jr CALLBAS
; Chama rotina da ROM BASIC.

BAS_CLS_L
Chama rotina CLS-LOWER da ROM BASIC. Esta rotina apaga a parte inferior da tela (editor de
linha).
11840 21 6e 0d
ld hl,l0d6eh
;Endero de CLS-LOWER da ROM BASIC.
11843 18 f1
jr CALLBAS
; Chama rotina da ROM BASIC.

BAS_PR_BC
Imprime nmero que est no par BC, at o limite de 9999.
11845 cd 18 39
call sub_3918h
;
. . 9
11848 21 1b 1a
ld hl,l1a1bh
;
! . .
11851 c3 12 39
jp l3912h
;
. . 9

BAS_STK_F
Chama rotina STK-FETCH da ROM BASIC. Recolhe os 5 bytes do valor numrico presente na
pilha da calculadora.
Do primeiro ao quinto bytes sero transferidos, na ordem, para os registradores A, E, D, C, B.
11854 21 f1 2b
ld hl,11249
; Endereo de STK-FETCH da ROM BASIC.
11857 18 e3
jr CALLBAS
; Chama rotina da ROM BASIC.

BAS_INT2
Chama rotina FIND-INT2 da ROM BASIC. Recolha o ltimo item da pilha da calculadora e passa
como inteiro no par BC.
11859 21 99 1e
ld hl,7833
; Endereo de FIND-INT2 da ROM BASIC.
11862 18 de
jr CALLBAS
; Chama rotina da ROM BASIC.

BAS_EEXP (11864/#2E58)
Chama rotina EXPT-EXP da ROM BASIC. Avalia expresso de um string na linha de edio. Se
for encontrado um string corretamente, os respectivos dados sero colocados na pilha da
calculadora codificado em 5 bytes: byte 1 no usado, bytes 2 e 3 contm endereo do string e
bytes 4 e 5 contm o comprimento do string.
11864 21 8c 1c
ld hl,7308
; Endereo de EXPT-EXP da ROM BASIC.
11867 18 d9
jr CALLBAS
; Chama rotina da ROM BASIC.

BAS_E1NUM (11869/#2E5D)
Chama rotina EXPT-1NUM da ROM BASIC. Busca uma expresso numrica na linha de comando
que, ao ser avaliada, colocada na pilha da calculadora.
utilizado para obter argumento numrico de um comando.
11869 21 82 1c
ld hl,7298
; Endereo da rotina EXPT-1NUM.
11872 18 d4
jr CALLBAS
; Chama rotina da ROM BASIC.

DEFCHADD (11874/#2E62)
Define a varivel de sistema do BASIC CH_ADD como sendo o byte seguinte ao apontado pela
varivel de sistema do DOS CMDADDR.
11874 2a 11 5d
ld hl,(CMDADDR)
; HL apontador de interpretador DOS.
11877 23
inc hl
; Avana 1 byte e atribui para o apontador
11878 22 5d 5c
ld (CH_ADD),hl
;do interpretador BASIC.
11881 c9
ret
; Fim.

GETARG_2S (11882/#2E6A)
Obtm 2 argumentos tipo string da linha de comando, separados por vrgula. Empregado pelos
comandos NEW, COPY.
11882 cd 7c 2e
call GETARG_S
; Pega o primeiro string.
GETARG_SC
Obtm na
11885 cd
11888 fe
11890 c2
11893 cd
11896 cd
11899 c9

linha de comando um string aps


26 2e
call BAS_G_CHR
2c
cp 44
b3 2d
jp nz,SYN_ERROR
cb 2e
call BAS_NXTCHR
58 2e
call BAS_EEXP
ret

uma vrgula. Usado pelo comando OPEN.


; Obtm o prximo caractere.
; Se no for vrgula, acusa erro de sinta;xe e salta.
; Procura prximo caractere interpretvel.
; Pega o segundo string.
; Fim.

GETARG_S (11900/#2E7C)
Obtm um string da linha de comando.
11900 cd 62 2e
call DEFCHADD
11903 c3 58 2e
jp BAS_EEXP

; Define apontador do interpretador BASIC


;e busca um string.

PARSECODE (11906/#2E82)
Se a linha de comando contiver CODE, busca o argumento do endereo inicial e, se tiver
vrgula, o argumento de comprimento de bloco.
Saida:
GENERAL = endereo inicial
NUMVAL = comprimento do bloco, ou endereo inicial.
11906 cd 26 2e
call BAS_G_CHR
; Obtm caractere da linha de comando,
11909 fe af
cp 175
;se no for CODE,
11911 c0
ret nz
;retorna.
PARSECODE1
11912 cd 14 2e
call GETARG_N
; Busca argumento numrico.
11915 28 0b
jr z,PARSECODE2
; Se est checando sintaxe, salta adiante.
11917 cd 53 2e
call BAS_INT2
; Pega valor do argumento em BC e guarda
11920 ed 43 d9 5c ld (GENERAL),bc
;nas variveis de sistema do DOS.
11924 ed 43 db 5c ld (NUMVAL),bc
PARSECODE2
11928 cd 26 2e
call BAS_G_CHR
; Busca prximo caractere interpretvel.
11931 fe 2c
cp 44
; Se for vrgula, salta para pegar outro
11933 28 09
jr z,STOARG_N
;argumento numrico e guardar em NUMVAL.
11935 fe 0d
cp 13
; Se no for ENTER,
11937 c2 b3 2d
jp nz,SYN_ERROR
;acusa erro de sintaxe.
11940 cd 0e 2e
call SYN_CHK
; Retorna se est checando sintaxe.
11943 c9
ret
; Fim.

STOARG_N (11944/#2EA8)
Se estiver em modo de checagem de sintaxe, simplesmente busca argumento numrico .
Se estiver em modo de execuo, pega argumento numrico e guarda em NUMVAL.
11944 cd 14 2e
call GETARG_N
; Obtm um argumento numrico.
11947 c8
ret z
; Finaliza se est checando sintaxe (bit 7
;de FLAGS for 0).
11948 cd 53 2e
call BAS_INT2
; Recolhe resultado em BC e coloca na
11951 ed 43 db 5c ld (NUMVAL),bc
;varivel de sistema.
11955 3e 03
ld a,3
;
> .
11957 32 d6 5c
ld (23766),a
;
2 . \
11960 c9
ret
; Fim.

BAS_RMFP (11961/#2EB9)
Chama rotina REMOVE-FP da ROM BASIC. Serve para remover os bytes que representam
nmero de ponto flutuante numa linha BASIC (5 bytes que se seguem ao cdigo #0e). Analisa
uma linha a partir do endereo apontado por HL, at encontrar #0d (ENTER).
11961 2a 11 5d
ld hl,(CMDADDR)
; HL aponta incio da linha de comandos.
11964 e7
rst 32
; HLSAVER, salva temporariamente HL.
11965 21 a7 11
ld hl,4519
; Rotina REMOVE-FP.
11968 18 0d
jr CALLBAS_HL
; Chama rotina da ROM BASIC.

BAS_BCSP (11970/#2EC2)
Chama rotina BC-SPACES (RST 48) da ROM BASIC. Serve para abrir BC bytes no espao de
trabalho.
11970 2a 61 5c
ld hl,(WORKSP)
; HL aponta para espao de trabalho.
11973 e7
rst 32
; HLSAVER, salva temporariamente HL.
11974 21 30 00
ld hl,48
; Rotina BC-SPACES.
11977 18 04
jr CALLBAS_HL
; Chama rotina da ROM BASIC.

BAS_NXTCHR (11979/#2ECB)
Chama rotina NEXT-CHAR (RST 32) da ROM BASIC. Serve para recuperar caractere seguinte
durante interpretao de uma linha BASIC, atualiza CH_ADD.
11979 e7
rst 32
11980 21 20 00
ld hl,32
;Rotina NEXT-CHAR.

CALLBAS_HL (11983/#2ECF)
Executa rotina da ROM BASIC apontada por HL, mas antes recupera o valor de HL salvo por
HLSAVER . No tem a limitao de CALLBAS, que usa o par HL.
11983 e5
push hl
; Empilha endereo da rotina da ROM BASIC.
11984 2a 02 5d
ld hl,(HLTEMP)
; Recupera HL salvo.
11987 cd 50 3c
call CALLBAS1
; Chama rotina da ROM BASIC.
11990 c9
ret
; Fim.

BAS_RECL2 (11991/#2ED7)
Chama rotina RECLAIM-2 da ROM BASIC. Serve para reclamar (remover) BC bytes a partir do
endereo apontado por HL.
11991 e7
rst 32
; HLSAVER, salva temporariamente HL.
11992 21 e8 19
ld hl,6632
; Endereo da rotina RECLAIM-2 da ROM BA11995 18 f2
jr CALLBAS_HL
;SIC executada.

BAS_MKROOM (11997/#2EDD)
Chama rotina MAKE-ROOM da ROM BASIC. Serve para criar um espao de BC bytes a partir do
endereo apontado por HL.
sub_2eddh:
11997 e7
rst 32
; HLSAVER, salva temporariamente HL.
11998 21 55 16
ld hl,5717
; Rotina MAKE-ROOM.
12001 18 ec
jr CALLBAS_HL
;
. .

TRKFETCH (12003/#2EE3)
Atualiza o registrador de trilha do FDC com o valor lido no disco na posio corrente do
cabeote.
Usada por: RW_B_SECT e CHANGE_DRV.
12003 cd 4f 3e
call RD_TRACK
; L no disco
12006 7c
ld a,h
; A=nmero da trilha lida no disco.
12007 d3 3f
out (63),a
; Coloca A no registr. de trilha do FDC.
12009 c9
ret
; Fim.

R_B_SECTS (12010/#2EEA)
Faz leitura de B setores do disco.
Entradas:
HL = endereo da RAM onde os dados sero armazenados
D = trilha, E = setor (trilha e setor inicial)
B = nmero de setores
Usada por: RD_T0,
12010 af
xor a
; A=0, sinaliza leitura de setores.
12011 18 24
jr RW_B_SECT
; Salta adiante.

SV_ENTRY (12013/#2EED)
Salva uma entrada do diretrio armazenada nas variveis de sistema a partir de FILENAME
para o disco.
12013 cd bc 27
call PUT_ENTRY
; Copia entrada de arquivo no buffer.

BUFFER2DSK (12016/#2EF0)
Grava o setor de buffer de impressora para o disco, na trilha e setor especificado na varivel

de sistema DOS START_S.


Usada por: DIR-RET2, COPYALL, COPYFILE,
sub_332eh, sub_3755h.
12016 ed 5b f4 5c ld de,(START_S)
12020 1b
dec de
12021 06 01
ld b,1
12023 21 00 5b
ld hl,BUFFER
W_B_SECTS1
Entrada alternativa para W_B_SECTS, Antes
escrita.
12026 e5
push hl
12027 d5
push de
12028 cd ba 3d
call GET_DTYPE
12031 cb 7e
bit 7,(hl)
12033 28 0a
jr z,W_B_SECTS2
12035 cb 46
bit 0,(hl)
12037 20 06
jr nz,W_B_SECTS2
12039 21 7d 39
ld hl,M_RDONLY
12042 c3 c2 2d
jp ERROR_RET
W_B_SECTS2
12045 d1
12046 e1

pop de
pop hl

COPY, ERASEFILE, GET_ENTRY, MOVE, SAVEFILE,


;
;
;
;

D=trilha inicial, E=setor inicial.


Diminui valor do setor.
B=gravar 1 setor.
Aponta para o buffer de impressora.

de gravar, verifica se o disco est protegido contra


; Preserva pares HL e DE.
; Obtm tipo de formatao do disco.
; Se disco foi inicializado, bit 7 deve
;ser 0, portanto salta adiante.
; Se disco no foi inicializado, bit 0 de;ve ser 1, portanto salta adiante.
; Mensagem Read Only.
; Salta para tratar erro de disco
;protegido contra escrita.
; Recupera pares DE e HL e prossegue,
;para escrever setor no disco.

W_B_SECTS (12047/#2F0F)
Faz gravaes de B setores do disco.
Entradas:
HL = endereo inicial dos dados a serem gravados
D = trilha, E = setor (trilha e setor inicial)
B = nmero de setores
Sadas:
HL = endereo aps ltimo byte salvo (end. inicial +256 n de setores salvos)
START_S = setor seguinte ao ltimo que foi salvo
START_T = trilha que contm o setor START_S
Usada por: FORMAT,
12047 3e ff
ld a,#ff
; Flag que sinaliza gravao de setores.
RW_B_SECT
Rotina em comum para R_B_SECTS e W_B_SECTS.
12049 32 ce 5c
ld (FLAGRW),a
; Guarda flag.
RW_B_SECT1
12052 ed 53 f4 5c ld (START_S),de
; D=trilha, E=setor.
12056 c5
push bc
; Preserva pares BC e HL.
12057 e5
push hl
12058 cd e3 2e
call TRKFETCH
; Atualiza registrador de trilha do FDC.
12061 e1
pop hl
; Recupera pares HL e BC.
12062 c1
pop bc
12063 af
xor a
; Verifica se contador de setores atingiu
12064 b0
or b
12065 c8
ret z
;0, caso positivo, finaliza.
RW_B_SECT2
12066 c5
push bc
; Seno continua. Preserva pares BC e HL.
12067 e5
push hl
12068 cd 9f 3e
call SV_RW_ADD
; Salva endereo apontado por HL.
12071 3a f4 5c
ld a,(START_S)
; A=setor inicial.
12074 cd 9b 3e
call SV_START_S
; Guarda setor inicial.
12077 3a f5 5c
ld a,(START_T)
; A=trilha inicial.
12080 cd 0c 3e
call TRACK_A
; Move cabeote para a trilha em A.
12083 3a ce 5c
ld a,(FLAGRW)
; Verifica flag de leitura/escrita.
12086 b7
or a
12087 f5
push af
; Preserva AF.
12088 cc a7 3e
call z,R_SECTOR
; Se flag=0, faz leitura de setor.
12091 f1
pop af
; Recupera AF.
12092 c4 a3 3e
call nz,W_SECTOR
; Se flag<>0 faz gravao de setor.

12095 e1
12096 11 00 01
12099 19
12100 e5
12101 3e 10
12103 21 f4 5c
12106 34
12107 be
12108 20 06
12110 36 00
12112 21 f5 5c
12115 34
RW_B_SECT3
12116 e1
12117 c1
12118 10 ca
12120 c9
sub_2f59h:
12121 e5
12122 67
12123 2e 00
12125 e5
12126 ed 52
12128 dc 69 2f
12131 e1
12132 7c
12133 e1
12134 d8
12135 7a
12136 c9
sub_2f69h:
12137 af
12138 32 d6 5c
12141 37
12142 c9

pop hl
ld de,256
add hl,de
push hl
ld a,16
ld hl,START_S
inc (hl)
cp (hl)
jr nz,RW_B_SECT3
ld (hl),0
ld hl,START_T
inc (hl)

; Recupera apontador da RAM.


; Avana apontador da RAM em 1 setor (256
;bytes).
; Preserva apontador da RAM.
; Nmero mximo de setor + 1.

pop hl
pop bc
djnz RW_B_SECT2
ret

; Recupera pares HL e BC.

push hl
ld h,a
ld l,0
push hl
sbc hl,de
call c,sub_2f69h
pop hl
ld a,h
pop hl
ret c
ld a,d
ret

;
;
;
;
;
;
;
;
;
;
;
;

.
g
. .
.
. R
. i /
.
|
.
.
z
.

xor a
ld (23766),a
scf
ret

;
;
;
;

.
2 . \
7
.

; Incrementa nmero do setor.


; Verifica se atingiu 16,
;se no, salta adiante,
;se sim, zera nmero do setor e
;aumenta o nmero da trilha.

; Continua at contador B=0.


; Fim.

FORMAT (12143/#2F6F)
Sintaxe:
FORMAT <r$>
(r$=rtulo do disco, se o rtulo comear
simples)
12143 21 ff ff
ld hl,#ffff
12146 22 d7 5c
ld (NUM_TRK),hl
12149 22 d9 5c
ld (GENERAL),hl

com caractere $, fora a formatao em lado


; Valor para inicializar variveis DOS.
; Inicializa NUM_TRK e VERIFY.
; (GENERAL+1)=#ff (face simples), #80
;(face dupla).
;
; Se no existe argumento na linha de co;mando, acusa erro de sintaxe.
; Obtm o argumento do comando.
; Retorna se est checando sintaxe.
; Obtm rtulo do disco.
; Obtm varivel do tipo de formatao.
; Se bit 7 estiver levantado,
;A=40 trilhas,
;se bit 7 estiver abaixado,
;A=80 trilhas.

12152 22 d1 5c
ld (ERR_NODSK),hl
12155 cd aa 23
call NOARG
12158 ca b3 2d
jp z,SYN_ERROR
12161 cd 7c 2e
call GETARG_S
12164 cd 0e 2e
call SYN_CHK
12167 cd f2 2c
call STR_FNAME
12170 cd ba 3d
call GET_DTYPE
12173 e6 80
and %10000000
12175 3e 28
ld a,40
12177 28 02
jr z,FORMAT1
12179 3e 50
ld a,80
FORMAT1
Tenta formatar a primeira trilha do lado 1 com a ID de trilha 1, depois formata primeira trilha
do lado 0 com o ID de trilha 0. Ao ler a ID da primeira trilha do lado 1, se aparecer como trilha
0, assume que disco de face simples.
12181 32 d7 5c
ld (NUM_TRK),a
; Guarda nmero de trilhas.

12184 cd
12187 cd
12190 cd
12193 1e
12195 cd
12198 cd
12201 1e
12203 cd
12206 3a
12209 fe
12211 28
12213 cd
12216 cd
12219 cd
12222 7c
12223 fe
12225 20
12227 3e
12229 32
FORMAT2
12232 cd
12235 21
12238 36
12240 11
12243 01
12246 ed
12248 01
12251 11
12254 0a
12255 fe
12257 28
12259 1a
12260 fe
12262 28
12264 3e
12266 21
12269 18
FORMAT3
12271 3e
FORMAT4
12273 21
12276 18
FORMAT5
12278 1a
12279 fe
12281 3e
12283 20
12285 3e
12287 21
FORMAT6
12290 32
12293 22
12296 3e
12298 32
12301 3e
12303 32
12306 21
12309 11
12312 01
12315 36
12317 ed
12319 21

3d
a3
3d
01
aa
98
00
aa
dd
24
13
a3
3d
52

3d
30
3e

call RESTORE
call SIDE1_SEL
call LONGDELAY
ld e,1
call PHYSFMT
call SIDE0_SEL
ld e,0
call PHYSFMT
ld a,(FILENAME)
cp 36
jr z,FORMAT2
call SIDE1_SEL
call LONGDELAY
call RD_TRACK1
ld a,h
cp 1
jr nz,FORMAT2
ld a,%10000000
ld (GENERAL+1),a

;
;
;
;

; Formata fisicamente o disco.


; Zera buffer da impressora.

80
07
19
70 02
13

call FORM_DSK
ld hl,BUFFER
ld (hl),0
ld de,BUFFER+1
ld bc,255
ldir
ld bc,NUM_TRK
ld de,GENERAL+1
ld a,(bc)
cp 80
jr z,FORMAT5
ld a,(de)
cp #80
jr z,FORMAT3
ld a,#19
ld hl,624
jr FORMAT6

17

ld a,#17

; Disco 40 trilhas, face dupla.

f0 04
0c

ld hl,1264
jr FORMAT6

; HL=1264 setores livres.


; Salta adiante.

80
18
f4
16
f0 09

ld
cp
ld
jr
ld
ld

; Verifica se disco tem 2 faces.

e3
e5
01
e2
10
e7
ea
eb
08
20
b0
dd

ld (BUFFER+227),a
ld (BUFFER+229),hl
ld a,1
ld (BUFFER+226),a
ld a,16
ld (BUFFER+231),a
ld hl,BUFFER+234
ld de,BUFFER+235
ld bc,8
ld (hl),32
ldir
ld hl,FILENAME

30
30
30
5c
30
3e
3e

01
05
80
da 5c
64
00
00
01
ff
b0
d7
da

31
5b
5b
00
5c
5c

50
13

5b
5b
5b
5b
5b
5b
00
5c

a,(de)
#80
a,#18
nz,FORMAT4
a,#16
hl,2544

Move cabeote para primeira trilha.


Seleciona lado 1 do disco.
Aguarda 0,8 s.
Formata fisicamente a trilha como 1.

; Seleciona lado 0 do disco.


; Formata fisicamente a trilha como 0.
; Se o nome do arquivo comea por $,
;salta adiante,
;seno seleciona lado 1 do disco.
; Aguarda 0,8 s.
; L ID da primeira trilha do disco e
;verifica se trilha 1; se no for,
;salta adiante; se for, guarda na varivel
;DOS sinal de disco de face dupla
;detectado.

; BC aponta para nmero de trilhas.


; DE aponta para nmero de faces.
; Se disco tiver 80 trilhas,
;salta adiante.
; Se nmero de faces for igual a 2,
;
;
;
;

;
;
;
;

Salta adiante.
Disco 40 trilhas, face simples.
HL=624 setores livres.
Salta adiante.

Disco 80 trilhas, face simples.


Se tem 2 faces, salta adiante.
Disco 80 trilhas, face dupla.
HL=2544 setores livres.

; Define CS_FORMT.
; Define CS_NFREE.
; Trilha inicial da rea livre do disco=1.
; Define CS_FREET.
; identificao de disco Beta.
; Define CS_IDENT.
; rea entre BUFFER+234 a BUFFER+242
; preenchida com espaos (32).

; Copia 8 bytes do rtulo do disco em

12322 11 f5 5b
ld de,BUFFER+245
12325 01 08 00
ld bc,8
12328 ed b0
ldir
12330 cd 98 30
call SIDE0_SEL
12333 06 01
ld b,1
12335 11 08 00
ld de,8
12338 21 00 5b
ld hl,BUFFER
12341 cd 0f 2f
call W_B_SECTS
12344 3a d6 5c
ld a,(23766)
12347 f5
push af
12348 af
xor a
12349 32 e5 5c
ld (FILETYPE),a
12352 2a e5 5b
ld hl,(BUFFER+229)
12355 22 d7 5c
ld (NUM_TRK),hl
12358 21 dd 5c
ld hl,FILENAME
12361 df
rst 24
12362 3e 0d
ld a,13
12364 d7
rst 16
12365 2a d7 5c
ld hl,(NUM_TRK)
12368 f1
pop af
12369 e5
push hl
12370 16 00
ld d,0
12372 5f
ld e,a
12373 ed 52
sbc hl,de
12375 44
ld b,h
12376 4d
ld c,l
12377 cd 45 2e
call BAS_PR_BC
12380 3e 2f
ld a,47
12382 d7
rst 16
12383 c1
pop bc
12384 cd 45 2e
call BAS_PR_BC
12387 c3 70 21
jp CMD-RET
INTERLEAVE (12390/#3066)

;CS_LABEL.
; Seleciona lado 0 do disco.
; Gravar 1 setor.
; Trilha=0, setor=8.
; HL aponta para o buffer de impressora.
; Gravar o setor de configurao.
; Pega contador de erros na verificao
;da formatao e guarda na pilha.
; Zera FILETYPE.
; Guarda nmero de setores livres do disco
;em NUM_TRK.
; Aponta para o rtulo, que impressa na
;tela.
; Imprime ENTER.
; HL=nmero de setores livres.
; Pega nmero de erros.
; Guarda nmero de setores livres.
; DE=nmero de erros durante verificao
;da formatao (mx. 255).
; HL=nmero de setores livres nmero de
;erros de verificao, que transferido
;para BC.
; Imprime valor numrico de BC.
; Imprime /.
; Recupera nmero de setores livres em BC.
; Imprime valor numrico de BC.
; Retorna do comando.

Tabela contendo a sequncia de setores gravados numa trilha. Os setores no so dispostos de


forma sequencial, porm de forma entrelaada. Esta tcnica de entrelaamento (interleaving
em ingls) permite que o computador tenha um certo tempo aps ter lido um setor, para que
possa ler o setor seguinte. Sem esse tempo, o prximo setor pode ter passado do cabeote do
drive, e torna-se necessrio esperar a prxima volta do disco.
12390 01 09 02 0a defb 1, 9, 2, 10
12394 03 0b 04 0c defb 3, 11, 4, 12
12398 05 0d 06 0e defb 5, 13, 6, 14
12402 07 0f 08 10 defb 7, 15, 8, 16
12406 01
defb 1

GET_NUMTRK (12407/#3077)
Obtm nmero de trilhas (40 ou 80) do disco e armazena na varivel de sistema.
12407 cd b1 3d
call GET_SRATE
; A=stepping rate do motor do cabeote
12410 f6 11
or %00010001
; Levanta bits 0 (aumenta SR) e 4 (SEEK).
12412 47
ld b,a
; B=comando FDC SEEK.
12413 3e 32
ld a,50
; A=trilha 50.
12415 cd ed 3d
call FDC_CMD_DT
; Executa comando SEEK 50 do FDC.
12418 3e 02
ld a,2
; A=trilha 2.
12420 cd ed 3d
call FDC_CMD_DT
; Executa comando SEEK 2 do FDC.
12423 cd a6 3d
call DELAY
; Pausa de 0,147 s.
12426 db 1f
in a,(31)
; Verifica bit 2 do registrador de status
12428 e6 04
and %00000100
;do FDC (TRACK0).
12430 3e 50
ld a,80
; A=disco de 80 trilhas.
12432 28 02
jr z,GET_NUMTR1
; Se TRACK0=0, salta adiante.
12434 3e 28
ld a,40
; A=disco de 40 trilhas.
GET_NUMTR1
12436 32 d7 5c
ld (NUM_TRK),a
; Guarda nmero de trilhas do disco.
12439 c9
ret
; Fim

SIDE0_SEL (12440/#3098)
Seleciona lado 0 do disco.
Usada por: FORMAT, FORM_DSK, TRACK_A, RD_TRACK.
12440 3a 16 5d
ld a,(STAT255)
; Pega ltimo OUT dado na porta 255 e
12443 f6 3c
or %00111100
;levanta o bit 4 (seleciona lado 0).
SDSEL_OUT
12445 32 16 5d
ld (STAT255),a
; Preserva A e efetua
12448 d3 ff
out (255),a
;operao de sada para porta 255.
12450 c9
ret
; Fim.

SIDE1_SEL (12451/#30A3)
Seleciona lado 1 do disco.
Usada por: FORMAT, FORM_DSK, PHYSTRK.
12451 3a 16 5d
ld a,(STAT255)
12454 e6 6f
and %01101111
12456 18 f3
jr SDSEL_OUT

; Pega ltimo OUT dado na porta 255 e


;abaixa o bit 4 (seleciona lado 1).
; Salta para trs.

PHYSFMT (12458/#30AA)
Formata fisicamente a trilha corrente do disco. O comando Write Track enviado ao FDC e, na
sequncia, vrios bytes com os dados requeridos para esta operao. Ao final, dependendo da
varivel de sistema DOS VERIFY, a trilha verificada.
12458 3e f4
ld a,#f4
; Envia comando WRITE TRACK ao registrador
12460 d3 1f
out (31),a
;de comando.
12462 21 66 30
ld hl,INTERLEAVE
; Aponta para a tabela de interleave.
12465 0e 7f
ld c,127
; Endereo da porta 127.
PHYSFMT1
12467 06 0a
ld b,10
; 10 bytes #4E.
12469 16 4e
ld d,#4e
12471 cd 58 31
call PUTDATA_B
12474 06 0c
ld b,12
; 12 bytes #00.
12476 16 00
ld d,#00
12478 cd 58 31
call PUTDATA_B
12481 06 03
ld b,3
; 3 bytes #F5.
12483 16 f5
ld d,#f5
12485 cd 58 31
call PUTDATA_B
12488 16 fe
ld d,#fe
; Byte #FE.
12490 cd 56 31
call PUTDATA
12493 53
ld d,e
; Envia byte em E (nmero da trilha).
12494 cd 56 31
call PUTDATA
12497 16 00
ld d,0
; Byte #00.
12499 cd 56 31
call PUTDATA
12502 56
ld d,(hl)
; Byte da tabela INTERLEAVE.
12503 cd 56 31
call PUTDATA
12506 16 01
ld d,1
; Byte #01.
12508 cd 56 31
call PUTDATA
12511 16 f7
ld d,#f7
; Byte #F7.
12513 cd 56 31
call PUTDATA
12516 06 16
ld b,22
; 22 bytes #4E.
12518 16 4e
ld d,#4e
12520 cd 58 31
call PUTDATA_B
12523 06 0c
ld b,12
; 12 bytes #00.
12525 16 00
ld d,0
12527 cd 58 31
call PUTDATA_B
12530 06 03
ld b,3
; 3 bytes #F5.
12532 16 f5
ld d,#f5
12534 cd 58 31
call PUTDATA_B
12537 16 fb
ld d,#fb
; Byte #FB.
12539 cd 56 31
call PUTDATA
12542 06 00
ld b,0
; 256 bytes #00.
12544 16 00
ld d,0
12546 cd 58 31
call PUTDATA_B
12549 16 f7
ld d,#f7
; Byte #F7.

12551 cd 56
12554 06 32
12556 16 4e
12558 cd 58
12561 7e
12562 23
12563 fe 10
12565 20 9c
12567 06 00
12569 cd 58
12572 fa 22
12575 cd 58
PHYSFMT2
12578 db 1f
12580 e6 40
12582 c2 d0
12585 3a d8
12588 b7
12589 c0
12590 7b
12591 d3 3f
12593 21 67
PHYSFMT3
12596 06 03
12598 7e
12599 d3 5f
12601 e5
PHYSFMT4
12602 3e 80
12604 d3 1f
12606 c5
12607 cd 7b
12610 db 1f
12612 b7
12613 c1
12614 28 06
12616 10 f0
12618 21 d6
12621 34
PHYSFMT5
12622 e1
12623 7e
12624 23
12625 fe 10
12627 20 df
12629 c9

31
31

31
31
31

3e
5c

30

3f

5c

call PUTDATA
ld b,50
ld d,#4E
call PUTDATA_B
ld a,(hl)
inc hl
cp 16
jr nz,PHYSFMT1
ld b,0
call PUTDATA_B
jp m,PHYSFMT2
call PUTDATA_B

; 50 bytes #4E.
; Pega dado da tabela tabela INTERLEAVE.
; Aponta para a prxima posio da tabela.
; Se o dado no for 16, salta para repetir
;todo o ciclo.
; 256 bytes #4E.
; Se INTRQ do FDC=1 (comando terminado),
;salta adiante, seno envia 256 bytes #4E.

in a,(31)
and %01000000
jp nz,RW_SECTOR3
ld a,(VERIFY)
or a
ret nz
ld a,e
out (63),a
ld hl,INTERLEAVE+1

; Se bit 6 do reg. de status do FDC (pro;tected) estiver levantado, salta para


;tratamento de erro de disco protegido.
; Verifica se flag verificar disco
; 0,
;se for, retorna, seno prossegue.
; Envia contedo de E (face do disco)
;para registrador de trilha.
; Aponta para segundo valor da tabela (9).

ld b,3
ld a,(hl)
out (95),a
push hl

; Repete o ciclo 3 vezes.


; Coloca valor da tabela no registrador de
;setor do FDC.
; Preserva apontador.

ld a,#80
out (31),a
push bc
call R_DATAFDC2
in a,(31)
or a
pop bc
jr z,PHYSFMT5
djnz PHYSFMT4
ld hl,23766
inc (hl)

; Envia comando Read Sector ao FDC.

pop hl
ld a,(hl)
inc hl
cp 16
jr nz,PHYSFMT3
ret

; Recupera apontador HL.


; Pega valor da tabela de INTERLEAVE,
;avana o apontador para prxima posio e
;verifica se 16.
; Se no for, repete o ciclo,
;se for, termina.

; Preserva contador.
; Recebe dados do FDC na ROM.
; Verifica se registrador de status do FDC
; igual a 0.
; Recupera contador.
; Se status=0 (sem erros), salta adiante.
; Seno repete at zerar contador.
; Incrementa contador de erros.

PUTDATA (12630/#3156)
Envia dado contido no registrador D tantas vezes quanto definido no contador em B para o
registrador de dados do FDC.
O registrador C deve conter 127, correspondente ao endereo do registrador de dados (porta
127).
Neste ponto de entrada, envia dado somente 1 vez.
12630 06 01
ld b,1
; Envia byte somente 1 vez.
PUTDATA_B
Neste ponto de entrada, B especifica nmero de vezes a enviar o dado.
12632 db ff
in a,(255)
; Aguarda bits 6 (DREQ) ou 7 (INTRQ)
12634 e6 c0
and %11000000
;ficar levantado.
12636 28 fa
jr z,PUTDATA_B
12638 f8
ret m
; Retorna se bit 7 estiver levantado,
12639 ed 51
out (c),d
;seno envia dado em D para a porta C.
12641 10 f5
djnz PUTDATA_B
; Repete B vezes.

12643 c9

ret

; Fim.

FORM_DSK (12644/#3164)
Faz a formatao fsica do disco.
12644 21 d7 5c
ld hl,NUM_TRK
12647 46
ld b,(hl)
12648 af
xor a
12649 23
inc hl
12650 77
ld (hl),a
12651 1e ff
ld e,255
FORM_DSK1
12653 c5
push bc
12654 1c
inc e
12655 7b
ld a,e
12656 06 1b
ld b,#1b
12658 cd ed 3d
call FDC_CMD_DT
12661 cd 98 30
call SIDE0_SEL
12664 cd aa 30
call PHYSFMT
12667 3a da 5c
ld a,(GENERAL+1)
12670 fe 80
cp #80
12672 20 06
jr nz,FORM_DSK2
12674 cd a3 30
call SIDE1_SEL
12677 cd aa 30
call PHYSFMT
FORM_DSK2
12680 c1
pop bc
12681 10 e2
djnz FORM_DSK1
12683 c9
ret

; HL aponta para nmero de trilhas no


;disco, cujo valor passado para B.
; Zera VERIFY e sinaliza para verificar
;trilha aps formatada.
; Inicializa E = 1.
; Preserva contador de trilhas.
; Incrementa valor da trilha.
; Envia comando SEEK para FDC, move
;cabeote para a trilha em E.
; Seleciona lado 0 do disco.
; Formata fisicamente a trilha.
; Se no for formatao face dupla,
;salta adiante,
;seno seleciona lado 1 do disco.
; Formata fisicamente a trilha.
; Recupera contador de trilhas.
; Repete at a ltima trilha a ser
;formatada e encerra.

SV_IF1_VAR (12684/#318c)
Quando a Interface 1 est ligada, os 58 bytes entre 23734/#5cb6 a 23791/#5cef estaro
ocupadas pelas variveis de sistema do BASIC estendido. A rotina de inicializao do DOS faz
com que as variveis a partir de 23734 sejam deslocadas em 112 bytes, para acomodar as
suas prprias variveis.
Para testar se a Interface 1 est conectada deve-se verificar a posio 23734. Se for #4f,
somente a interface Beta est presente.
Esta rotina faz a troca entre as variveis de sistema do DOS e do BASIC estendido da Interface
1 na RAM entre 23747 a 23791. Numa chamada a rea a partir de 23747 conter variveis do
DOS, na prxima conter do BASIC estendido.
A rotina preserva o par AF.
12684 f5
push af
; Preserva acumulador e flags.
12685 3a b6 5c
ld a,(23734)
; Verifica se a primeira varivel do DOS
12688 fe f4
cp #f4
;contm #f4.
12690 28 19
jr z,SVIF1VAR2
; Se sim, salta adiante.
12692 21 18 5d
ld hl,IF1
; Verifica na varivel de sistema DOS se
12695 b6
or (hl)
;est marcado Interface 1 presente.
12696 36 ff
ld (hl),#ff
; Atribui #ff varivel de sistema.
12698 28 11
jr z,SVIF1VAR2
; Se Interface 1 ausente, salta adiante.
12700 21 c3 5c
ld hl,23747
; Endereos em que os bytes devem ser
12703 11 33 5d
ld de,23859
;trocados.
12706 06 2d
ld b,45
; 45 bytes sero trocados.
SVIF1VAR1
12708 4e
ld c,(hl)
;
Efetua troca de bytes.
12709 1a
ld a,(de)
12710 77
ld (hl),a
12711 79
ld a,c
12712 12
ld (de),a
12713 23
inc hl
; Prximos endereos a serem trocados.
12714 13
inc de
12715 10 f7
djnz SVIF1VAR1
; Repete at B=0.
SVIF1VAR2
12717 f1
pop af
; Recupera acumulador e flags.
.
12718 c9
ret
; Fim.

CLR_ELINE (12719/#31AF)
Limpa
12719
12722
12724
12727
12728
12730

a rea de edio de linha.


2a 59 5c
ld hl,(E_LINE)
36 0d
ld (hl),13
22 5b 5c
ld (K_CUR),hl
23
inc hl
36 80
ld (hl),128
c9
ret

; Aponta para linha de edio.


; Coloca ENTER como primeiro caractere e
;define como endereo do cursor.
; Coloca separador de fim de linha de
;edio.
; Fim.

REC_ELINE (12731/#31BB)
Recupera
12731 ed
12735 21
12738 cd
12741 c9

3 bytes salvos da linha de edio.


5b 59 5c ld de,(E_LINE)
20 5d
ld hl,ELINE_T
42 22
call MINILDIR
ret

;
;
;
;

DE aponta para a linha de edio.


HL para local armazenado.
Copia 3 bytes.
Fim.

EDITLINE (12742/#31C6)
Rotina para edio de linha de comando DOS na parte inferior da tela, aps prompt X>, onde
X=A, B, C ou D
12742 3a 0f 5d
ld a,(CL_ELINE)
; Verifica se o flag de limpeza da linha
12745 b7
or a
;de edio 0.
12746 f5
push af
; Preserva acumulador e flags.
12747 c4 bb 31
call nz,REC_ELINE ; Se flag no era 0, recupera 3 primeiros
;bytes da linha de edio.
12750 f1
pop af
; Recupera acumulador e flags.
12751 cc af 31
call z,CLR_ELINE
; Se flag era 0, limpa linha de edio.
12754 2a 59 5c
ld hl,(E_LINE)
; Hl aponta para linha de edio.
12757 cd 1f 3d
call PRN_ENTER
; Imprime ENTER.
12760 3a 19 5d
ld a,(DFLT_DRV)
; Pega valor do drive default (0-3) e
12763 c6 41
add a,65
;adiciona A para formar letra A-D e
12765 d7
rst 16
;imprime, seguido de > para formar
12766 3e 3e
ld a,62
;o prompt do editor.
12768 d7
rst 16
12769 21 3a 5c
ld hl, ERR_NR
; Define erro como 0 ok.
12772 36 ff
ld (hl),255
12774 c3 2b 2e
jp BAS_EDITOR
; Permite editar a linha.

RND_ARG (12777/#31E9)
Rotina relacionado a arquivos aleatrios. Busca na linha de comando argumento numrico que
especifica o tamanho do registro.
Sada: NUMVAL = tamanho do registro
GENERAL = tamanho do registro
NUM_TRK = tamanho do registro + 1
12777 cd cb 2e
call BAS_NXTCHR
; Busca prximo caractere interpretvel.
12780 cd 26 2e
call BAS_G_CHR
; Pega o caractere.
12783 fe 2c
cp 44
; Se no for , (vrgula),
12785 c2 b3 2d
jp nz,SYN_ERROR
;acusa erro de sintaxe.
12788 2a db 5c
ld hl,(NUMVAL)
; Guarda temporariamente NUMVAL.
12791 22 d9 5c
ld (GENERAL),hl
;
12794 cd a8 2e
call STOARG_N
; Busca argumento numrico (tamanho do
;registro).
12797 cd 0e 2e
call SYN_CHK
; Retorna se est checando sintaxe.
12800 2a db 5c
ld hl,(NUMVAL)
; Verifica se o tamanho do registro
12803 7c
ld a,h
;maior que 255.
12804 b7
or a
12805 c2 b3 2d
jp nz,SYN_ERROR
; Se for, acusa erro de sintaxe.
12808 23
inc hl
; Guarda na varivel de sistema o tamanho
12809 22 d7 5c
ld (NUM_TRK),hl
;do registro + 1.
12812 2a d9 5c
ld hl,(GENERAL)
; Recupera NUMVAL.
12815 22 db 5c
ld (NUMVAL),hl
12818 c9
ret
; Fim.

OPEN (12819/#3213)
Sintaxe:

OPEN #<s>, <n$>, < W|R >


OPEN #<s>, <n$> < RND >, tam
(s=nmero do stream; n$=nome do arquivo; tam=tamanho do registro)
12819 2a 11 5d
ld hl,(CMDADDR)
; CH_ADD deve apontar para o incio da
12822 22 5d 5c
ld (CH_ADD),hl
;linha de comando a ser interpretada.
12825 cd a8 2e
call STOARG_N
; Busca argumento numrico (stream)
12828 cd 6d 2e
call GETARG_SC
; Busca string aps uma vrgula (nome do
;arquivo).
OPEN1
12831 cd 26 2e
call BAS_G_CHR
; Busca prximo argumento.
12834 fe 41
cp 65
; Se for maior ou igual a A,
12836 30 05
jr nc,OPEN2
;prossegue adiante,
12838 cd cb 2e
call BAS_NXTCHR
;seno avana para o prximo caractere
12841 18 f4
jr OPEN1
;e repete a busca.
OPEN2
12843 fe a5
cp 165
; Verifica se palavra-chave RND.
12845 f5
push af
; Preserva acumulador e flags.
12846 cc e9 31
call z,RND_ARG
; Obtm tamanho do registro.
12849 f1
pop af
; Recupera acumulador e flags.
12850 28 0b
jr z,OPEN3
;
12852 e6 df
and %11011111
; Transforma letra em maisculas.
12854 fe 52
cp 82
; Se for R, prossegue adiante.
12856 28 05
jr z, OPEN3
12858 fe 57
cp 87
; S no for W,
12860 c2 b3 2d
jp nz,SYN_ERROR
;acusa erro de sintaxe.
OPEN3
12863 32 09 5d
ld (OP_F_MODE),a
; Guarda o modo do arquivo (R, W ou RND).
12866 cd 0e 2e
call SYN_CHK
; Retorna se est checando sintaxe.
12869 3e 23
ld a,35
; Atribui ao tipo de arquivo #.
12871 32 e5 5c
ld (FILETYPE),a
12874 3e 00
ld a,0
; Zera o primeiro byte de FILEDATA1.
12876 32 e6 5c
ld (FILEDATA1),a
12879 cd 6c 32
call STREAMDIR
; Busca arquivo no diretrio.
12882 f5
push af
; Preservar acumulador e flags.
12883 cd a0 32
call VERF_STRM
; Verifica se stream est aberto.
12886 f1
pop af
; Recuperar acumulador e flags.
12887 f5
push af
; Preservar acumulador e flags.
12888 c4 1c 33
call nz,sub_331ch ;
. . 3
12891 f1
pop af
; Recuperar acumulador e flags.
12892 cd d6 32
call sub_32d6h
;
. . 2
12895 2a 11 5d
ld hl,(CMDADDR)
;
* . ]
12898 01 24 01
ld bc,292
;
. $ .
12901 09
add hl,bc
;
.
12902 22 11 5d
ld (CMDADDR),hl
;
" . ]
12905 c3 70 21
jp CMD-RET
;
. p !

STREAMDIR
Busca arquivo tipo # no diretrio. Na comparao, alm do nome (8 bytes) e tipo (1 byte),
considera o primeiro byte de FILEDATA1, que contm o nmero do arquivo do mesmo nome e
do mesmo tipo. Isto ocorre porque um arquivo # inicialmente criado com 4 KB, mas se
houver necessidade de mais espao, mais arquivos de mesmo nome so criados. Portanto
dados escritos num stream so divididos em segmentos de 4096 bytes cada.
12908 3e 0a
ld a,10
; Na busca por arquivos, considerar 10
12910 32 06 5d
ld (CMP_SIZE),a
;bytes.
12913 cd 49 2d
call SEEKFILE
; Buscar o arquivo.
12916 f5
push af
; Preservar acumulador e flags.
12917 cd 84 23
call ID_TYPE
; L configurao do disco.
12920 f1
pop af
; Recuperar acumulador e flags.
12921 20 1c
jr nz,STREAMDIR3
; Salta adiante se o arquivo no existe.

12923 3a 09 5d
ld a,(OP_F_MODE)
; Se o modo do arquivo for R,
12926 fe 52
cp 82
12928 28 10
jr z,STREAMDIR2
;salta adiante.
STREAMDIR1
12930 21 e6 5c
ld hl,FILEDATA1
; Aumentar primeiro byte do FILEDATA1.
12933 34
inc (hl)
12934 cd 4c 2d
call SEEKFILE1
; Buscar arquivo.
12937 28 f7
jr z,STREAMDIR1
; Se encontrar o arquivo, repete.
12939 21 e6 5c
ld hl,FILEDATA1
; Diminuir primeiro byte do FILEDATA1,
12942 35
dec (hl)
;que contm o nmero do ltimo arquivo.
12943 cd 4c 2d
call SEEKFILE1
; Buscar o arquivo.
STREAMDIR2
12946 cd ae 27
call GET_ENTRY
; Obter entrada do diretrio.
12949 af
xor a
; Zera A.
12950 c9
ret
; Fim.
STREAMDIR3
Se o arquivo tipo # no existe no disco, deveria ser modo RND ou W; se for R, deve
acusar erro pois no existe nada para ser lido.
12951 3a 09 5d
ld a,(OP_F_MODE)
; Se o modo do arquivo no for R, isto
12954 fe 52
cp 82
; for W ou RND,
12956 c0
ret nz
;retorna,
12957 c3 58 23
jp ERRNOFILE
;seno acusa erro de arquivo inexistente.
VERF_STRM (12960, #32A0)
Verifica se um stream especificado em NUMVAL est aberto. Caso positivo, produz mensagem
de erro.
12960 3a db 5c
ld a,(NUMVAL)
; A=stream.
12963 21 27 17
ld hl,5927
; Chama rotina STR-DATA1 da ROM BASIC,
12966 cd 36 2e
call CALLBAS
;que retorna em BC dado do stream.
12969 78
ld a,b
; Se BC no for 0, salta adiante.
12970 b1
or c
12971 c2 af 32
jp nz,VERF_STRM1
12974 c9
ret
; Fim.
VERF_STRM1
12975 3e 19
ld a,25
; Armazena cdigo de erro R Tape loading
12977 32 3a 5c
ld (ERR_NR),a
;error.
12980 21 d7 37
ld hl,M_STR_OPEN
; Msg: Stream Opened
12983 3e 0a
ld a,10
; Flag para no limpar linha de edio.
l32b9h:
12985 c3 e5 2c
jp CMD_ERR_RET
; Retorna do comando.
l32bch:
12988 3e 0b
12990 21 e5 37
12993 18 f6

ld a,11
ld hl,M_N_DSK_FL
jr l32b9h

;
> .
; Msg: Not disk file
;
. .

sub_32c3h:
12995 e5
12996 0e 20
12998 ef
12999 3a d7 5c
13002 77
13003 23
13004 af
13005 77
13006 23
13007 77
13008 23
13009 77
13010 3e 7f
13012 e1
13013 c9

push hl
ld c,32
rst 28h
ld a,(NUM_TRK)
ld (hl),a
inc hl
xor a
ld (hl),a
inc hl
ld (hl),a
inc hl
ld (hl),a
ld a,127
pop hl
ret

;
;
;
;
;
;
;
;
;
;
;
;
;
;

.
.
.
: . \
w
#
.
w
#
w
#
w
> 
.

sub_32d6h:
13014 f5
13015 cd a0
13018 eb
13019 2a 53
13022 ed 4b
13026 ed 42
13028 eb
13029 73
13030 23
13031 72
13032 cd 46
13035 3a 09
13038 fe a5
13040 cc c3
13043 28 0a
13045 3a 09
13048 fe 52
13050 3e ff
13052 20 01
13054 af
l32ffh:
13055 77
13056 f1
13057 c3 04
l3304h:
13060 f5
13061 01 14
13064 09
13065 e5
13066 cd b4
13069 e1
13070 23
13071 06 01
13073 f1
13074 b7
13075 f5
13076 c4 fa
13079 f1
13080 cc ea
13083 c9
sub_331ch:
13084 2a d7
13087 e5
13088 21 00
13091 22 d7
13094 cd 2e
13097 e1
13098 22 d7
13101 c9
sub_332eh:
13102 21 00
13105 22 d9
13108 cd 6e
13111 cd 03
13114 21 00
13117 22 e8
13120 cd bc
13123 c3 f0

32
5c
4f 5c

33
5d
32
5d

33
00
34

2e
2e

5c
20
5c
33
5c

10
5c
2b
2c
00
5c
27
2e

push af
call VERF_STRM
ex de,hl
ld hl,(PROG)
ld bc,(CHANS)
sbc hl,bc
ex de,hl
ld (hl),e
inc hl
ld (hl),d
call sub_3346h
ld a,(OP_F_MODE)
cp 165
call z,sub_32c3h
jr z,l32ffh
ld a,(OP_F_MODE)
cp 82
ld a,255
jr nz,l32ffh
xor a

;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;

ld (hl),a
pop af
jp l3304h

;
;
;

w
.
. . 3

push af
ld bc,20
add hl,bc
push hl
call sub_34b4h
pop hl
inc hl
ld b,1
pop af
or a
push af
call nz,W_B_SECTS1
pop af
call z,R_B_SECTS
ret

;
;
;
;
;
;
;
;
;
;
;
;
;
;
;

.
.
.
.
.
.
#
.
.
.
.
.
.
.

ld hl,(NUM_TRK)
push hl
ld hl,8192
ld (NUM_TRK),hl
call sub_332eh
pop hl
ld (NUM_TRK),hl
ret

; Preserva varivel de sistema.

ld hl,4096
ld (GENERAL),hl
call DIRFULL
call SAVEFILE
ld hl,0
ld (FILEDATA2),hl
call PUT_ENTRY
jp BUFFER2DSK

; Salvar 4096 bytes.

:
.
.
(
:
.
>
.

. ]
.
. 2
.
. ]
R
.
.

. .
. 4
.

. .
. .

;
;
;
; Recupera varivel de sistema.
; Fim.

; Verifica se diretrio est cheio


;
;
;
;
;

sub_3346h:
13126 2a 53
13129 2b
13130 22 51
13133 e5
13134 01 24
13137 cd dd
13140 3e 00
13142 06 00
l3358h:
13144 12
13145 1b
13146 10 fc
13148 e1
13149 e5
13150 11 0f
13153 73
13154 23
13155 72
13156 23
13157 11 09
13160 73
13161 23
13162 72
13163 23
13164 36 44
13166 23
13167 23
13168 23
13169 23
13170 23
13171 36 24
13173 23
13174 36 01
13176 23
13177 3a f6
13180 77
13181 23
13182 3a 1e
13185 77
13186 23
13187 3a 09
13190 fe 52
13192 36 00
13194 28 04
13196 3a e8
13199 77
l3390h:
13200 23
13201 70
13202 28 04
13204 3a e9
13207 77
l3398h:
13208 23
13209 eb
13210 e1
13211 d5
13212 11 10
13215 19
13216 eb
13217 21 dd

5c
5c
01
2e

3c

3c

5c
5d
5d

5c

5c

00
5c

ld hl,(PROG)
dec hl
ld (CURCHL),hl
push hl
ld bc,l0124h
call sub_2eddh
ld a,0
ld b,0

;
;
;
;
;
;
;
;

*
+
"
.
.
.
>
.

S \

ld (de),a
dec de
djnz l3358h
pop hl
push hl
ld de,l3c0fh
ld (hl),e
inc hl
ld (hl),d
inc hl
ld de,l3c09h
ld (hl),e
inc hl
ld (hl),d
inc hl
ld (hl),68
inc hl
inc hl
inc hl
inc hl
inc hl
ld (hl),36
inc hl
ld (hl),1
inc hl
ld a,(CUR_DRV)
ld (hl),a
inc hl
ld a,(FILEPOS)
ld (hl),a
inc hl
ld a,(OP_F_MODE)
cp 82
ld (hl),0
jr z,l3390h
ld a,(FILEDATA2)
ld (hl),a

;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;

.
.
.
.
.
.
s
#
r
#
.
s
#
r
#
6
#
#
#
#
#
6
#
6
#
:
w
#
:
w
#
:
.
6
(
:
w

inc hl
ld (hl),b
jr z,l3398h
ld a,(23785)
ld (hl),a

;
;
;
;
;

#
p
( .
: . \
w

inc hl
ex de,hl
pop hl
push de
ld de,l0010h
add hl,de
ex de,hl
ld hl, FILENAME

;
;
;
;
;
;
;
;

#
.
.
.
. . .
.
.
! . \

Q \
$ .
. .
.
.

.
. <

. <

$
.
. \
. ]
. ]
R
.
.
. \

13220 01 10
13223 ed b0
13225 e1
13226 c9
sub_33abh:
13227 0e 0d
13229 ef
13230 4e
13231 ef
13232 01 24
13235 09
13236 c9
sub_33b5h:
13237 0e 24
l33b7h:
13239 06 00
13241 2a 51
13244 09
13245 c9
l33beh:
13246 0e 0d
13248 ef
13249 34
13250 c0
13251 e5
13252 cd d4
13255 cd 8d
13258 e1
13259 23
13260 34
13261 e5
13262 cd a9
13265 e1
13266 3e 10
13268 be
13269 c0
13270 e5
13271 0e 0f
13273 ef
13274 7e
13275 fe 7f
13277 28 0d
13279 2a 51
13282 cd 55
13285 cd 96
13288 e1
13289 c3 0d
l33ech:
13292 e1
13293 e5
13294 cd 5d
13297 f5
13298 cc a9
13301 f1
13302 e1
13303 c4 04
13306 c9
sub_33fbh:
13307 36 00
13309 0e 19
13311 ef
13312 16 20

00

00

5c

34
34

34

5c
37
3f
34

34
34
34

ld bc,l0010h
ldir
pop hl
ret

;
;
;
;

. . .
. .
.
.

ld c,13
rst 28h
ld c,(hl)
rst 28h
ld bc,l0024h
add hl,bc
ret

;
;
;
;
;
;
;

. .
.
N
.
. $ .
.
.

ld c,36

. $

ld b,0
ld hl,(CURCHL)
add hl,bc
ret

;
;
;
;

. .
* Q \
.
.

ld c,13
rst 28h
inc (hl)
ret nz
push hl
call sub_34d4h
call sub_348dh
pop hl
inc hl
inc (hl)
push hl
call sub_34a9h
pop hl
ld a,16
cp (hl)
ret nz
push hl
ld c,15
rst 28h
ld a,(hl)
cp 127
jr z,l33ech
ld hl,(CURCHL)
call sub_3755h
call LD_BUFFER1
pop hl
jp l340dh

;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;

.
.
4
.
.
.
.
.
#
4
.
.
.
>
.
.
.
.
.
~
.
(
*
.
.
.
.

pop hl
push hl
call sub_345dh
push af
call z,sub_34a9h
pop af
pop hl
call nz,sub_3404h
ret

;
;
;
;
;
;
;
;
;

.
.
. ] 4
.
. . 4
.
.
. . 4
.

ld (hl),0
ld c,25
rst 28h
ld d,32

;
;
;
;

6 .
. .
.
.

. 4
. 4

. 4
.

.

.
Q \
U 7
. ?
. 4

13314 5e
13315 c9
sub_3404h:
13316 cd fb
13319 ed 53
13323 18 08
l340dh:
13325 cd fb
13328 1c
13329 ed 53
sub_3415h:
13333 cd 2e
13336 0e 10
13338 ef
13339 eb
13340 21 dd
13343 01 10
13346 ed b0
13348 0e 0c
13350 ef
13351 3a 1e
13354 77
13355 c3 96
sub_342eh:
13358 0e 0d
13360 ef
13361 34
13362 c0
13363 23
13364 34
13365 e5
13366 cd d4
13369 0e 23
13371 ef
13372 7e
13373 b7
13374 28 09
13376 e1
13377 e5
13378 35
13379 cd 8d
13382 e1
13383 e5
13384 34
l3449h:
13385 cd a9
13388 e1
13389 3e 10
13391 be
13392 cc 54
13395 c9
sub_3454h:
13396 cd 5d
13399 c2 20
13402 c3 a9
sub_345dh:
13405 36 00
13407 0e 19
13409 ef
13410 34
13411 0e 10
13413 ef

ld e,(hl)
ret

;
;

^
.

33
d7 5c

call sub_33fbh
ld (NUM_TRK),de
jr sub_3415h

;
;
;

. . 3
. S . \
. .

33

call sub_33fbh
inc e
ld (NUM_TRK),de

;
;
;

. . 3
.
. S . \

call sub_332eh
ld c,16
rst 28h
ex de,hl
ld hl, FILENAME
ld bc,l0010h
ldir
ld c,12
rst 28h
ld a,(FILEPOS)
ld (hl),a
jp LD_BUFFER1

;
;
;
;
;
;
;
;
;
;
;
;

.
.
.
.
!
.
.
.
.
:
w
.

. 3
.

ld c,13
rst 28h
inc (hl)
ret nz
inc hl
inc (hl)
push hl
call sub_34d4h
ld c,35
rst 28h
ld a,(hl)
or a
jr z,l3449h
pop hl
push hl
dec (hl)
call sub_348dh
pop hl
push hl
inc (hl)

;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;

.
.
4
.
#
4
.
.
.
.
~
.
(
.
.
5
.
.
.
4

call sub_34a9h
pop hl
ld a,16
cp (hl)
call z,sub_3454h
ret

;
;
;
;
;
;

. . 4
.
> .
.
. T 4
.

call sub_345dh
jp nz,l3520h
jp sub_34a9h

;
;
;

. ] 4
.
5
. . 4

ld (hl),0
ld c,25
rst 28h
inc (hl)
ld c,16
rst 28h

;
;
;
;
;
;

6 .
. .
.
4
. .
.

d7 5c
33

5c
00

5d
3f

34

34

34

34
34
35
34

. \
. .
.
.
. ]
. ?

. 4
#

. 4

13414 11 dd
13417 01 10
13420 ed b0
13422 cd 4c
13425 c0
sub_3472h:
13426 cd ae
13429 cd 96
13432 0e 10
13434 ef
13435 eb
13436 21 dd
13439 01 10
13442 ed b0
13444 0e 0c
13446 ef
13447 3a 1e
13450 77
13451 af
13452 c9
sub_348dh:
13453 cd b4
13456 cd b5
13459 06 01
13461 cd fa
13464 0e 0f
13466 ef
13467 7e
13468 fe 7f
13470 c8
13471 cd b5
13474 af
13475 47
l34a4h:
13476 77
13477 23
13478 10 fc
13480 c9
sub_34a9h:
13481 cd b4
13484 cd b5
13487 06 01
13489 c3 ea
sub_34b4h:
13492 2a 51
13495 01 1e
13498 09
13499 5e
13500 23
13501 56
13502 0e 0e
13504 ef
13505 46
13506 05
13507 04
13508 f5
13509 3e 10
13511 28 09
l34c9h:
13513 1c
13514 bb
13515 20 03

5c
00
2d
27
3f

5c
00

5d

34
33
2e

33

34
33
2e
5c
00

ld de, FILENAME
ld bc,l0010h
ldir
call SEEKFILE1
ret nz

;
;
;
;
;

.
.
.
.
.

. \
. .
.
L -

call GET_ENTRY
call LD_BUFFER1
ld c,16
rst 28h
ex de,hl
ld hl, FILENAME
ld bc,l0010h
ldir
ld c,12
rst 28h
ld a,(FILEPOS)
ld (hl),a
xor a
ret

;
;
;
;
;
;
;
;
;
;
;
;
;
;

.
.
.
.
.
!
.
.
.
.
:
w
.
.

. '
. ?
.

call sub_34b4h
call sub_33b5h
ld b,1
call W_B_SECTS1
ld c,15
rst 28h
ld a,(hl)
cp 127
ret z
call sub_33b5h
xor a
ld b,a

;
;
;
;
;
;
;
;
;
;
;
;

.
.
.
.
.
.
~
.
.
.
.
G

. 4
. 3
.
. .
.

ld (hl),a
inc hl
djnz l34a4h
ret

;
;
;
;

w
#
. .
.

call sub_34b4h
call sub_33b5h
ld b,1
jp R_B_SECTS

;
;
;
;

.
.
.
.

. 4
. 3
.
. .

ld hl,(CURCHL)
ld bc,l001eh
add hl,bc
ld e,(hl)
inc hl
ld d,(hl)
ld c,14
rst 28h
ld b,(hl)
dec b
inc b
push af
ld a,16
jr z,l34d2h

;
;
;
;
;
;
;
;
;
;
;
;
;
;

*
.
.
^
#
V
.
.
F
.
.
.
>
(

Q \
. .

inc e
cp e
jr nz,l34d0h

;
;
;

.
.

. \
. .
.
.
. ]

. 3

.
.

13517 1e 00
13519 14
l34d0h:
13520 10 f7
l34d2h:
13522 f1
13523 c9
sub_34d4h:
13524 0e 0b
13526 ef
13527 7e
13528 c3 74
l34dbh:
13531 e5
13532 21 8c
13535 e5
13536 f5
13537 cd 8c
13540 3e 0a
13542 32 06
13545 f1
13546 cd 32
13549 f5
13550 cd c1
13553 ca 2e
13556 f1
13557 cd ab
13560 77
13561 c3 be
sub_34fch:
13564 0e 0d
13566 ef
13567 7e
13568 01 0e
13571 09
13572 be
13573 c0
13574 0e 0e
13576 ef
13577 7e
13578 01 0e
13581 09
13582 be
13583 c0
13584 21 b6
13587 7e
13588 fe f4
13590 28 08
13592 cb 66
13594 28 04
13596 f6 01
13598 e1
13599 c9
l3520h:
13600 3e 07
l3522h:
13602 32 3a
13605 cd 8c
13608 21 58
13611 c3 36
l352eh:
13614 3e 17

3d
31
31
5d
35
36
35
33
33

00

00

5c

5c
31
00
2e

ld e,0
inc d

;
;

. .
.

djnz l34c9h

. .

pop af
ret

;
;

.
.

ld c,11
rst 28h
ld a,(hl)
jp CHANGEDRV1

;
;
;
;

. .
.
~
. t =

push hl
ld hl,SV_IF1_VAR
push hl
push af
call SV_IF1_VAR
ld a,10
ld (CMP_SIZE),a
pop af
call sub_3532h
push af
call sub_36c1h
jp z,l352eh
pop af
call sub_33abh
ld (hl),a
jp l33beh

;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;

.
!
.
.
.
>
2
.
.
.
.
.
.
.
w
.

ld c,13
rst 28h
ld a,(hl)
ld bc,14
add hl,bc
cp (hl)
ret nz
ld c,14
rst 28h
ld a,(hl)
ld bc,14
add hl,bc
cp (hl)
ret nz
ld hl,23734
ld a,(hl)
cp 244
jr z,l3520h
bit 4,(hl)
jr z,l3520h
or 1
pop hl
ret

;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;

.
.
~
.
.
.
.
.
.
~
.
.
.
.
!
~
.
(
.
(
.
.
.

ld a,7

> .

ld (ERR_NR),a
call SV_IF1_VAR
ld hl,88
jp CALLBAS

;
;
;
;

2
.
!
.

ld a,23

> .

. 1
. 1
.
. ]
2 5
. 6
. 5
. 3
. 3
.
. .

.
. .

. \
.
.
f
.
.

:
.
X
6

\
1
.
.

13616 18 f0
sub_3532h:
13618 57
13619 0e 0f
13621 ef
13622 7e
13623 fe 7f
13625 7a
13626 c0
13627 01 13
13630 09
13631 7e
13632 b7
13633 7a
13634 20 21
13636 2b
13637 7e
13638 b7
13639 20 09
13641 c5
13642 e5
13643 d5
13644 cd 88
13647 d1
13648 e1
13649 c1
l3552h:
13650 4e
13651 7a
13652 eb
13653 2a cf
13656 09
13657 fe 06
13659 77
13660 d5
13661 cc 94
13664 d1
13665 eb
13666 34
13667 e1
13668 c9
l3565h:
13669 2b
13670 7e
13671 2b
13672 3c
13673 be
13674 23
13675 34
13676 e5
13677 f5
13678 0e 23
13680 ef
13681 36 ff
13683 f1
13684 e1
13685 38 07
13687 7a
13688 fe 0d
13690 28 06
13692 c1
13693 c9

00

35

5c

35

jr l3522h

. .

ld d,a
ld c,15
rst 28h
ld a,(hl)
cp 127
ld a,d
ret nz
ld bc,19
add hl,bc
ld a,(hl)
or a
ld a,d
jr nz,l3565h
dec hl
ld a,(hl)
or a
jr nz,l3552h
push bc
push hl
push de
call sub_3588h
pop de
pop hl
pop bc

;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;

W
. .
.
~
. 
z
.
. . .
.
~
.
z
!
+
~
.
.
.
.
.
. . 5
.
.
.

ld c,(hl)
ld a,d
ex de,hl
ld hl,(WRKSPADDR)
add hl,bc
cp 6
ld (hl),a
push de
call z,sub_3594h
pop de
ex de,hl
inc (hl)
pop hl
ret

;
;
;
;
;
;
;
;
;
;
;
;
;
;

N
z
.
* . \
.
. .
w
.
. . 5
.
.
4
.
.

dec hl
ld a,(hl)
dec hl
inc a
cp (hl)
inc hl
inc (hl)
push hl
push af
ld c,35
rst 28h
ld (hl),255
pop af
pop hl
jr c,l357eh
ld a,d
cp 13
jr z,l3582h
pop bc
ret

;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;

+
~
+
<
.
#
4
.
.
.
.
6
.
.
8
z
.
(
.
.

#
.
.
.
.

l357eh:
13694 7a
13695 fe 0d
13697 c0
l3582h:
13698 af
13699 77
13700 23
13701 77
13702 7a
13703 c9
sub_3588h:
13704 2a 61
13707 22 cf
13710 01 10
13713 c3 c2
sub_3594h:
13716 36 0d
13718 2a 5d
13721 22 d7
13724 2a cf
13727 22 5d
13730 21 3b
13733 cb be
13735 cd 5d
13738 21 3b
13741 cb fe
13743 2a cf
13746 22 5d
13749 cd 5d
13752 cd 53
13755 c5
13756 d1
13757 0e 20
13759 ef
13760 46
13761 af
13762 21 00
13765 22 db
l35c8h:
13768 19
13769 30 09
13771 e5
13772 2a db
13775 23
13776 22 db
13779 e1
l35d4h:
13780 10 f2
13782 22 d9
13785 3a db
13788 21 da
13791 ed 67
13793 e6 0f
13795 32 db
13798 2a d7
13801 22 5d
13804 cd f8
13807 0e 21
13809 ef
13810 3e ff
13812 77

5c
5c
00
2e
5c
5c
5c
5c
5c
2e
5c
5c
5c
2e
2e

00
5c

5c
5c

5c
5c
5c
5c
5c
5c
35

ld a,d
cp 13
ret nz

;
;
;

z
. .
.

xor a
ld (hl),a
inc hl
ld (hl),a
ld a,d
ret

;
;
;
;
;
;

.
w
#
w
z
.

ld
ld
ld
jp

hl,(WORKSP)
(WRKSPADDR),hl
bc,l0010h
BAS_BCSP

;
;
;
;

*
"
.
.

a
.
.
.

ld (hl),13
ld hl,(CH_ADD)
ld (NUM_TRK),hl
ld hl,(WRKSPADDR)
ld (CH_ADD),hl
ld hl, FLAGS
res 7,(hl)
call BAS_E1NUM
ld hl, FLAGS
set 7,(hl)
ld hl,(WRKSPADDR)
ld (CH_ADD),hl
call BAS_E1NUM
call BAS_INT2
push bc
pop de
ld c,32
rst 28h
ld b,(hl)
xor a
ld hl,l0000h
ld (NUMVAL),hl

;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;

6
*
"
*
"
!
.
.
!
.
*
"
.
.
.
.
.
.
F
.
!
"

.
]
.
.
]
;
.
]
;
.
.
]
]
S

add hl,de
jr nc,l35d4h
push hl
ld hl,(NUMVAL)
inc hl
ld (NUMVAL),hl
pop hl

;
;
;
;
;
;
;

.
0 .
.
* . \
#
" . \
.

djnz l35c8h
ld (GENERAL),hl
ld a,(NUMVAL)
ld hl, GENERAL+1
rrd
and 15
ld (NUMVAL),a
ld hl,(NUM_TRK)
ld (CH_ADD),hl
call sub_35f8h
ld c,33
rst 28h
ld a,255
ld (hl),a

;
;
;
;
;
;
;
;
;
;
;
;
;
;

.
"
:
!
.
.
2
*
"
.
.
.
>
w

\
\
.
.
\
\
\
\
\
.
\
\
\
.
.

. .
. \

.
.
.
.
g
.
.
.
]
.
!
.

\
\
\
\
\
\
5

13813 23
13814 77
13815 c9
sub_35f8h:
13816 2a 51
13819 e5
13820 01 19
13823 09
13824 3a da
13827 be
13828 c2 1b
13831 e1
13832 01 0e
13835 09
13836 3a db
13839 be
13840 c2 43
l3613h:
13843 0e 0d
13845 ef
13846 3a d9
13849 77
13850 c9
l361bh:
13851 cd 66
13854 c4 5f
13857 3a da
13860 e1
13861 e5
13862 01 19
13865 09
13866 77
13867 e1
13868 01 10
13871 09
13872 11 dd
13875 01 10
13878 ed b0
13880 cd 4c
13883 c2 6e
13886 cd 72
13889 18 06
l3643h:
13891 cd 66
13894 c4 5f
l3649h:
13897 3a db
13900 0e 0e
13902 ef
13903 77
13904 e5
13905 cd d4
13908 cd a9
13911 e1
13912 2b
13913 3a d9
13916 77
13917 18 b4
sub_365fh:
13919 cd d4
13922 cd 8d
13925 c9

inc hl
ld (hl),a
ret

;
;
;

#
w
.

ld hl,(CURCHL)
push hl
ld bc,#19
add hl,bc
ld a,(GENERAL+1)
cp (hl)
jp nz,l361bh
pop hl
ld bc,14
add hl,bc
ld a,(NUMVAL)
cp (hl)
jp nz,l3643h

;
;
;
;
;
;
;
;
;
;
;
;
;

*
.
.
.
:
.
.
.
.
.
:
.
.

ld c,13
rst 28h
ld a,(GENERAL)
ld (hl),a
ret

;
;
;
;
;

. .
.
: . \
w
.

call sub_3666h
call nz,sub_365fh
ld a,(GENERAL+1)
pop hl
push hl
ld bc,#19
add hl,bc
ld (hl),a
pop hl
ld bc,l0010h
add hl,bc
ld de, FILENAME
ld bc,l0010h
ldir
call SEEKFILE1
jp nz,l366eh
call sub_3472h
jr l3649h

;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;

.
.
:
.
.
.
.
w
.
.
.
.
.
.
.
.
.
.

36
36

call sub_3666h
call nz,sub_365fh

;
;

. f 6
. _ 6

5c

ld a,(NUMVAL)
ld c,14
rst 28h
ld (hl),a
push hl
call sub_34d4h
call sub_34a9h
pop hl
dec hl
ld a,(GENERAL)
ld (hl),a
jr l3613h

;
;
;
;
;
;
;
;
;
;
;
;

:
.
.
w
.
.
.
.
+
:
w
.

call sub_34d4h
call sub_348dh
ret

;
;
;

. . 4
. . 4
.

5c
00
5c
36
00
5c
36

5c

36
36
5c
00

00
5c
00
2d
36
34

34
34
5c

34
34

Q \
. .
. \
. 6
. .
. \
C 6

f 6
_ 6
. \
. .

. .
.
.
.
L
n
r
.

\
.
6
4

. \
.

. 4
. 4
. \
.

sub_3666h:
13926 0e 23
13928 ef
13929 7e
13930 b7
13931 36 00
13933 c9
l366eh:
13934 2a da
13937 26 20
13939 22 d7
13942 2a d9
13945 e5
13946 2a db
13949 e5
13950 cd 15
13953 e1
13954 22 db
13957 e1
13958 22 d9
13961 18 be
l368bh:
13963 e5
13964 21 8c
13967 e5
13968 cd 8c
13971 21 3c
13974 cb 9e
13976 af
13977 32 39
13980 3e 0a
13982 32 06
13985 cd c1
13988 28 0d
13990 fe 7f
13992 c2 2e
13995 01 13
13998 09
13999 36 00
14001 18 03
l36b3h:
14003 cd fc
l36b6h:
14006 cd ab
14009 7e
14010 f5
14011 cd 2e
14014 f1
14015 37
14016 c9
sub_36c1h:
14017 0e 0f
14019 ef
14020 7e
14021 b7
14022 c9

ld c,35
rst 28h
ld a,(hl)
or a
ld (hl),0
ret

;
;
;
;
;
;

. #
.
~
.
6 .
.

ld hl,(GENERAL+1)
ld h,32
ld (NUM_TRK),hl
ld hl,(GENERAL)
push hl
ld hl,(NUMVAL)
push hl
call sub_3415h
pop hl
ld (NUMVAL),hl
pop hl
ld (GENERAL),hl
jr l3649h

;
;
;
;
;
;
;
;
;
;
;
;
;

*
&
"
*
.
*
.
.
.
"
.
"
.

push hl
ld hl, SV_IF1_VAR
push hl
call SV_IF1_VAR
ld hl,23612
res 3,(hl)
xor a
ld (PIP),a
ld a,10
ld (CMP_SIZE),a
call sub_36c1h
jr z,l36b3h
cp 127
jp nz,l352eh
ld bc,19
add hl,bc
ld (hl),0
jr l36b6h

;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;

.
!
.
.
!
.
.
2
>
2
.
(
.
.
.
.
6
.

34

call sub_34fch

. . 4

33

call sub_33abh
ld a,(hl)
push af
call sub_342eh
pop af
scf
ret

;
;
;
;
;
;
;

. . 3
~
.
. . 4
.
7
.

ld c,15
rst 28h
ld a,(hl)
or a
ret

;
;
;
;
;

. .
.
~
.
.

5c
5c
5c
5c
34
5c
5c

31
31
5c
5c
5d
36
35
00

34

CLOSE (14023/#36C7)
Sintaxe:
CLOSE #s
(s=stream)
l36c7h:
14023 2a 11 5d
ld hl,(CMDADDR)

. \
. \
. \
. \
. 4
. \
. \
.
. 1
. 1
< \
.
9
.
.
.
.

.
.

\
]
6
5
.

.
.

14026 22
14029 cd
14032 cd
14035 3a
14038 21
14041 cd
14044 78
14045 b1
14046 ca
14049 e5
14050 2a
14053 09
14054 7e
14055 21
14058 bc
14059 e1
14060 c2
14063 36
14065 23
14066 36
14068 ed
14072 2a
14075 09
14076 2b
14077 22
14080 cd
14083 2a
14086 01
14089 cd
14092 21
14095 06
l3711h:
14097 c5
14098 ed
14102 5e
14103 23
14104 56
14105 eb
14106 ed
14108 eb
14109 38
14111 56
14112 2b
14113 5e
14114 23
14115 e5
14116 eb
14117 01
14120 ed
14122 eb
14123 e1
14124 72
14125 2b
14126 73
14127 23
l3730h:
14128 23
14129 c1
14130 10
14132 2a
14135 01
14138 ed

5d
a8
0e
db
27
36

5c
2e
2e
5c
17
2e

70 21
4f 5c
0f 3c
bc 32
00
00
43 d9 5c
4f 5c
d7
42
d7
24
d7
10
10

5c
37
5c
01
2e
5c

4b d9 5c

42
11

24 01
42

dd
11 5d
24 01
42

ld (CH_ADD),hl
call STOARG_N
call SYN_CHK
ld a,(NUMVAL)
ld hl,5927
call CALLBAS
ld a,b
or c
jp z,CMD-RET
push hl
ld hl,(CHANS)
add hl,bc
ld a,(hl)
ld hl,l3c0fh
cp h
pop hl
jp nz,l32bch
ld (hl),0
inc hl
ld (hl),0
ld (GENERAL),bc
ld hl,(CHANS)
add hl,bc
dec hl
ld (NUM_TRK),hl
call sub_3742h
ld hl,(NUM_TRK)
ld bc,l0124h
call BAS_RECL2
ld hl, STRMS
ld b,16

;
;
. . .
; Retorna se est checando sintaxe.
;
: . \
;
! ' .
;
. 6 .
;
x
;
.
;
. p !
;
.
;
* O \
;
.
;
~
;
! . <
;
.
;
.
;
. . 2
;
6 .
;
#
;
6 .
;
. C . \
;
* O \
;
.
;
+
;
" . \
;
. B 7
;
* . \
;
. $ .
;
. . .
;
! . \
;
. .

push bc
ld bc,(GENERAL)
ld e,(hl)
inc hl
ld d,(hl)
ex de,hl
sbc hl,bc
ex de,hl
jr c,l3730h
ld d,(hl)
dec hl
ld e,(hl)
inc hl
push hl
ex de,hl
ld bc,l0124h
sbc hl,bc
ex de,hl
pop hl
ld (hl),d
dec hl
ld (hl),e
inc hl

;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;

.
.
^
#
V
.
.
.
8
V
+
^
#
.
.
.
.
.
.
r
+
s
#

inc hl
pop bc
djnz l3711h
ld hl,(CMDADDR)
ld bc,l0124h
sbc hl,bc

;
;
;
;
;
;

#
.
.
*
.
.

K . \

B
.

$ .
B

.
. ]
$ .
B

14140 22 11
14143 c3 70
sub_3742h:
14146 01 0f
14149 09
14150 7e
14151 b7
14152 c8
14153 2a d7
14156 22 51
14159 cd 55
14162 c3 8d
sub_3755h:
14165 01 0d
14168 09
14169 5e
14170 23
14171 56
14172 01 0d
14175 09
14176 73
14177 23
14178 72
14179 0e 10
14181 ef
14182 11 dd
14185 01 10
14188 ed b0
14190 cd d4
14193 0e 0c
14195 ef
14196 4e
14197 cd bc
14200 c3 f0

5d
21

ld (CMDADDR),hl
jp CMD-RET

;
;

" . ]
. p !

00

ld bc,l000fh
add hl,bc
ld a,(hl)
or a
ret z
ld hl,(NUM_TRK)
ld (CURCHL),hl
call sub_3755h
jp sub_348dh

;
;
;
;
;
;
;
;
;

.
.
~
.
.
*
"
.
.

. .

ld bc,13
add hl,bc
ld e,(hl)
inc hl
ld d,(hl)
ld bc,13
add hl,bc
ld (hl),e
inc hl
ld (hl),d
ld c,16
rst 28h
ld de, FILENAME
ld bc,l0010h
ldir
call sub_34d4h
ld c,12
rst 28h
ld c,(hl)
call PUT_ENTRY
jp BUFFER2DSK

;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;

.
.
^
#
V
.
.
s
#
r
.
.
.
.
.
.
.
.
N
.
.

. .

5c
5c
37
34
00

00

5c
00
34

27
2e

.
Q
U
.

\
\
7
4

. .

.
. \
. .
.
. 4
.
. '
. .

PRNSTR1 (14203/#377B)
Continuao do PRNSTR. Imprime string apontado por HL.
14203 7e
ld a,(hl)
; Pega caractere apontado por HL.
14204 b7
or a
14205 c8
ret z
; Se for 0, retorna.
14206 e6 7f
and %01111111
; Abaixa bit 7.
14208 d7
rst 16
; Imprime caractere.
14209 cb 7e
bit 7,(hl)
14211 c0
ret nz
; Retorna se bit 7 1.
14212 23
inc hl
; Repete para o prximo endereo.
14213 18 f4
jr PRNSTR1

CP_STRINGS (14215/#3787)
Compara 2 strings de B bytes de comprimento. Se os strings forem iguais, retorna com o flag
ZERO levantado.
14215 1a
ld a,(de)
; Compara byte em DE com em HL,
14216 be
cp (hl)
;se forem diferentes, retorna com
14217 c0
ret nz
;flag ZERO=0.
14218 13
inc de
; Aumenta os apontadores DE e HL.
14219 23
inc hl
14220 10 f9
djnz CP_STRINGS
; Repetir at final da contagem.
14222 c9
ret
; Retorna com flag ZERO=1.
NO_DISK1
Continuao do NO_DISK.
14223 21 cf 37
ld hl,M_NODISK
14226 3e 06
ld a,6
14228 c3 e5 2c
jp CMD_ERR_RET

; Msg: No disk
; Sinaliza: no limpar linha de edio.
; Retorna do comando.

DIR_FULL
14231 21 c0 37
14234 3e 04
14236 c3 e5 2c

ld hl,M_DIRFULL
ld a,4
jp CMD_ERR_RET

; Msg: Directory full


; Flag para no limpar linha de edio.
; Retorna do comando.

ERROR_R
Define erro "R Tape loading error" em ERR_NR.
14239 3e 1a
ld a,26
; A=Erro R.
14241 18 02
jr DEF_ERRNR
; Salta adiante.

ERROR_J
Define erro "J Invalid I/O device" em ERR_NR.
14243 3e 12
ld a,18
; A=Erro J.
DEF_ERRNR
Coloca o cdigo de erro do acumulador em ERR_NR.
14245 32 3a 5c
ld (ERR_NR),a
14248 c9
ret
ERROR_4
Define erro "4 Out of memory" em ERR_NR.
14249 3e 03
ld a,3
; A=erro 4.
14251 18 f8
jr DEF_ERRNR
; Salta para trs.

Mensagens de erro.
As mensagens de erro tem o ltimo byte com o bit 7 levantando, sinalizando o final.
M_BREAK
14253 2a 42 52 45
14257 41 4b 2a
14260 8d
M_OUT_RAM

defm *BREAK*

14261 4f 75 74 20
14265 6f 66 20 52
14269 41 4d
14271 8d
M_DIRFULL

defm Out of RAM

14272 44 69 72 65
14276 63 74 6f 72
14280 79 20 66 75
14284 6c 6c
14286 8d
M_NODISK

defm Directory full

14287 4e 6f 20 64
14291 69 73 6b
14294 8d
M_STR_OPEN

defm No disk

14295 53 74 72 65
14299 61 6d 20 6f
14303 70 65 6e 65
14307 64
14308 8d
M_N_DSK_FL

defm Stream opened

14309 4e 6f 74 20
14313 64 69 73 6b
14317 20 66 69 6c
14321 65
14322 8d
M_F_EXISTS

defm Not disk file

14323 46 69 6c 65

defm File exists

defb #8d

defb #8d

defb #8d

defb #8d

defb #8d

defb #8d

; ENTER com bit 7 levantado.

; ENTER com bit 7 levantado.

; ENTER com bit 7 levantado.

; ENTER com bit 7 levantado.

; ENTER com bit 7 levantado.

; ENTER com bit 7 levantado.

14327
14331
14334
14335
14339
14343
14347
14350

20
73
0d
4f
20
74
59
a9

l380fh:
14351 f5
14352 c5
14353 ed
14357 22
14360 cd
14363 3e
14365 32
14368 c1
14369 f1
14370 21
14373 22
14376 21
14379 39
14380 22
14383 2b
14384 2b
l3831h:
14385 f9
14386 f5
14387 cd
14390 21
l3839h:
14393 7e
14394 b9
14395 20
14397 f1
14398 23
14399 5e
14400 23
14401 56
14402 21
14405 e5
14406 d5
14407 2a
14410 ed
l384eh:
14414 c9
l384fh:
14415 fe
14417 20
14419 f1
14420 c9
l3855h:
14421 23
14422 23
14423 23
14424 18
l385ah:
14426 00
14427 3d
14428 3d
14429 01

65 78 69
74 73
76
77
65
2f

65 72
72 69
3f 28
4e

defb 0d
; ENTER.
defm Over write? (Y/N

xor c

; ) com bit 7 levantado.

push af
push bc
ld (DETEMP),de
ld (HLTEMP),hl
call SV_IF1_VAR
ld a,255
ld (FLG_RFPC),a
pop bc
pop af
ld hl,INTERP-RET
ld (DOSCMDRET),hl
ld hl,l0000h
add hl,sp
ld (OLDSP),hl
dec hl
dec hl

;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;

.
.
.
"
.
>
2
.
.
!
"
!
9
"
+
+

ld sp,hl
push af
call DEF_ERRSP
ld hl,l385ah

;
;
;
;

.
.
. . !
! Z 8

ld a,(hl)
cp c
jr nz,l384fh
pop af
inc hl
ld e,(hl)
inc hl
ld d,(hl)
ld hl, CMD-RET
push hl
push de
ld hl,(HLTEMP)
ld de,(DETEMP)

;
;
;
;
;
;
;
;
;
;
;
;
;

~
.

ret

cp 255
jr nz,l3855h
pop af
ret

;
;
;
;

. .
.
.
.

df

inc hl
inc hl
inc hl
jr l3839h

;
;
;
;

#
#
#
. .

74 3d

nop
dec a
dec a
ld bc, CHANGEDRV1

;
;
;
;

.
=
=
. t =

53
02
8c
ff
1f

04 5d
5d
31
5d

a4 21
1a 5d
00 00
1c 5d

c0 21
5a 38

12

70 21
02 5d
5b 04 5d

ff
02

S
.
.
.
.

. ]
]
1
]

. !
. ]
. .
. ]

.
.
#
^
#
V
! p !
.
.
* . ]
. [ . ]

14432 02
14433 0c
14434 3e
14436 9b
l3865h:
14437 3e
14439 9f
14440 3e
14442 ea
14445 fa
14448 9a
14449 38
14451 ad
14452 27
14453 09
14454 b5
14455 27
14456 0a
14457 89
14458 2d
l387bh:
14459 0b
l387ch:
14460 bd
14461 38
14463 b4
14464 38
14466 70
14467 21
14470 38
14472 70
14473 21
14476 21
l388fh:
14479 21
14482 38
14484 a2
14485 38
l3897h:
14487 a5
14488 38
14490 f5
14491 cd
14494 f1
14495 c3
14498 af
14499 18
14501 3e
l38a7h:
14503 11
14506 01
14509 b7
14510 28
14512 eb
l38b1h:
14513 ed
14515 c9
14516 cd
14519 cd
14522 c3
14525 22
14528 ed

03
04
05
2e 06
2e 07
08

0c
0d
0e d1
0f
10 70
11 70
12 e8
13
14
ff
84 23
f6 23
02
ff
dd 5c
10 00
01
b0
84
6e
d1
d7
53

23
2b
2b
5c
d9 5c

ld (bc),a
inc c
ld a,3
sbc a,e

;
;
;
;

.
.
> .
.

ld a,4
sbc a,a
ld a,5
jp pe,1582
jp m,l072eh
sbc a,d
jr c,l387bh
xor l
daa
add hl,bc
or l
daa
ld a,(bc)
adc a,c
dec l

;
;
;
;
;
;
;
;
;
;
;
;
;
;
;

>
.
>
.
.
.
8
.
'
.
.
'
.
.
-

dec bc

cp
jr
or
jr
ld
ld
jr
ld
ld
ld

l
c,14
h
c,l388fh
(hl),b
hl,53518
c,l3897h
(hl),b
hl,28688
hl,28689

;
;
;
;
;
;
;
;
;
;

.
8
.
8
p
!
8
p
!
!

ld hl,59410
jr c,l38a7h
and d
jr c,22

;
;
;
;

! . .
8 .
.
8 .

and l
jr c,1
push af
call ID_TYPE
pop af
jp CAT4
xor a
jr l38a7h
ld a,255

;
;
;
;
;
;
;
;
;

.
8
.
.
.
.
.
.
>

ld
ld
or
jr
ex

;
;
;
;
;

. . \
. . .
.
( .
.

de, FILENAME
bc,l0010h
a
z,l38b1h
de,hl

ldir
ret
call ID_TYPE
call DIRFULL
jp SAVE4
ld (NUM_TRK),hl
ld (GENERAL),de

.
.
. .
. .
.

.
.
. .
.
. p
. p

.
. #
. #
.
.

;
. .
;
.
;
. . #
; Verifica se diretrio est cheio
;
. . +
;
" . \
;
. S . \

14532
14536
14539
14542
14545
14546
14549
14552
14556
14559
14562
14565
14568
14571
14574

ed
cd
cd
c3
b7
32
22
ed
cd
cd
cd
c3
cd
cd
c3

53
84
6e
fd

db 5c
23
2b
2b

d6
d9
53
4c
d3
dd
4d
84
4c
44

5c
5c
db 5c
2d
29
29
2a
23
2d
27

ld (NUMVAL),de
call ID_TYPE
call DIRFULL
jp SAVE8
or a
ld (23766),a
ld (GENERAL),hl
ld (NUMVAL),de
call SEEKFILE1
call sub_29d3h
call sub_29ddh
jp l2a4dh
call ID_TYPE
call SEEKFILE1
jp ERASEFILE

;
. S . \
;
. . #
; Verifica se diretrio est cheio
;
. . +
;
.
;
2 . \
;
" . \
;
. S . \
;
. L ;
. . )
;
. . )
;
. M *
;
. . #
;
. L ; Apaga o arquivo.

FINDFILE (14577/#38F1)
Obtm nome do arquivo da pilha da calculadora e busca no diretrio do disco, para verificar se
j existe um de nome igual.
Se o arquivo for encontrado, retorna flag ZERO=1 e registrador C e varivel DOS FILEPOS com
posio do arquivo no diretrio.
14577 cd f2 2c
call STR_FNAME
; Obtm nome do arquivo.
14580 cd 84 23
call ID_TYPE
; Faz leitura da configurao do disco.
14583 c3 4c 2d
jp SEEKFILE1
; Procura arquivo no diretrio.

P_FILENAME (14586/#38FA)
Imprime nome e tipo do arquivo. HL deve apontar a entrada de diretrio com os dados a serem
impresso.
Esta rotina preserva o par BC.
14586 c5
push bc
; Preserva par BC.
14587 06 08
ld b,8
; Contador de 8 caracteres a imprimir.
l38fdh:
14589 7e
ld a,(hl)
; Imprime caractere apontado por HL.
14590 d7
rst 16
14591 23
inc hl
; Aumenta apontador.
14592 10 fb
djnz l38fdh
; Repete at o oitavo caractere.
14594 3e 3c
ld a,60
; Imprime <.
14596 d7
rst 16
14597 7e
ld a,(hl)
; Imprime tipo do arquivo (B, C, D
14598 d7
rst 16
;ou #).
14599 3e 3e
ld a,62
; Imprime >.
14601 d7
rst 16
14602 c1
pop bc
; Recupera par BC.
14603 c9
ret
; Fim.

PRINT_A (14604/#390C)
Imprime valor numrico de A.
14604 4f
ld c,a

; C=A.

PRINT_C (14605/#390D)
14605 06 00
14607 c3 45 2e

ld b,0
jp BAS_PR_BC

; B=0, C=valor a imprimir.


; Salta para imprimir valor de BC.

l3912h:
14610 cd 36 2e
14613 c3 2b 39

call CALLBAS
jp l392bh

;
;

sub_3918h:
14616 c5
14617 f5
14618 21 e0 5b
14621 01 20 00
14624 11 d1 5c

push bc
push af
ld hl,23520
ld bc,32
ld de,ERR_NODSK

; Preserva pares BC e AF.

. 6 .
. + 9

;
! . [
; 32 bytes a copiar.
;
. . \

14627
14629
14632
14633
14634

ed b0
cd 8c 31
f1
c1
c9

l392bh:
14635 f5
14636 cd
14639 21
14642 11
14645 01
14648 f1
14649 ed
14651 c9

8c
d1
e0
20

31
5c
5b
00

b0

ldir
call SV_IF1_VAR
pop af
pop bc
ret

;
. .
; Salva variveis do BASIC estendido.
; Recupera pares AF e BC.

push af
call SV_IF1_VAR
ld hl,ERR_NODSK
ld de,23520
ld bc,32
pop af
ldir
ret

; Preserva acumulador e flags.


;
;
;
;
; Recupera acumulador e flags.
;
. .
; Fim.

xor a

; Valor #00 para flag (40 trilhas).

ld (NUM_TRK),a
call SYN_CHK
call NOARG
jp z,SYN_ERROR
call GET_DTYPE
ld a,(NUM_TRK)
ld (hl),a
jp CMD-RET

; Guarda flag.
; Retorna se est checando sintaxe.
; Se no tiver argumento nenhum,
;acusa erro de sintaxe.
; HL aponta para varivel DOS do drive
;corrente, que assumir o valor guardado
;em NUM_TRK.
; Retorna do comando.

ld a,#80
jr 80_CONT

; Valor #80 para flag (80 trilhas).


; Salta para trs.

; Fim.

40 (14652/#393C)
Sintaxe:
14652 af
80_CONT
14653 32
14656 cd
14659 cd
14662 ca
14665 cd
14668 3a
14671 77
14672 c3

40
d7
0e
aa
b3
ba
d7

5c
2e
23
2d
3d
5c

70 21

80 (14675/#3953)
Sintaxe:
80
14675 3e 80
14677 18 e6

Mensagens de erro
Estes strings tm como marcador o ltimo byte com bit 7 levantado que, na impresso, ser
baixado.
M_ERROR
14679 0d
14680 2a 45 52 52
14684 4f 52 2a
14687 8d
M_NOSPACE

defb #0d
defm *ERROR*

; ENTER.

defb #8d

; ENTER com bit 7 levantado.

14688 0d
14689 4e 6f 20 73
14693 70 61 63 65
14697 8d
M_F_EXIST

defb #0d
defm No space

; ENTER.

defb #8d

; ENTER com bit 7 levantado.

14698 0d
14699 46 69 6c 65
14703 20 65 78 69
14707 73 74 73
14710 8d
M_FREE

defb #0d
; ENTER.
defm File exists

14711 20 46 72 65
14715 65
14716 8d

defb #8d

; ENTER com bit 7 levantado.

Free
defb #8d

; ENTER com bit 7 levantado.

M_RDONLY
14717 0d
14718 52 65 61 64
14722 20 4f 6e 6c
14726 f9
M_DISC_ERR

defb #0d
defm Read Onl

; ENTER.

defb #f9

; y com bit 7 levantado.

14727 0d
14728 44 69 73 63
14732 20 45 72 72
14736 6f
14737 f2
M_REC_OF

defb #0d
defm Disc Erro

; ENTER.

defb #f2

; r com bit 7 levantado.

14738 0d
14739 52 65 63 2e
14743 20 20 4f 2f
14747 c6
M_TITLE

defb #0d
defm Rec.

14748 54 69 74 6c
14752 65 3a
14754 a0
M_RETRY

defm Title:

14755 0d
14756 52
14760 79
14764 6f
14768 49
14772 72
14775 00
M_TRK

defb #0d
; ENTER.
defm Retry,Abort,Ignore?

65
2c
72
67
65

74
41
74
6e
3f

72
62
2c
6f

; ENTER.
O/

defb c6

; F com bit 6 levantado.

defb #a0

; SPACE com bit 7 levantado.

defb 0

; Separador de fim da mensagen.

14776 0d
14777 54 72 6b
14780 a0
M_SEC

defb #0d
defm Trk
defb #a0

; ENTER.

14781 20 73 65 63
14785 a0
M_DEL_F

defm sec
and b

14786 20 44 65 6c
14790 2e 20 46 69
14794 6c 65
14796 8d
M_NOFILE

defm

defb #8d

; ENTER com bit 7 levantado.

14797 0d
14798 4e 6f
M_FILE

defb #0d
defm No

; ENTER.

14800
14804
14808
14809

defm

20 46 69 6c
65 28 73 29
8d
00

; SPACE com bit 7 levantado.

; SPACE com bit 7 levantado.

Del. File

File(s)

defb #8d
nop

; ENTER com bit 7 levantado.


; Marcador de fim das mensagens.

NMI1 (14810/#39DA)
Continuao de NMI.
14810 f5
push af
14811 c5
push bc
14812 d5
push de
14813 e5
push hl
14814 dd e5
push ix
14816 fd e5
push iy

; Os registradores do Z80 so salvos na


;pilha: AF, BC, DE, HL, IX, IY,

14818
14819
14820
14821
14822
14823
14824
14826
14827
14829
14830
14833
14834
14835
14837
14839
14842
14845
14848
14851
14852
14855
14856
14857
14860
14863
14866
14867
14869
14870
14871
14872
14875
14876
14877
14878
14880
14881
14882
14883
14884
14885
14888
14889
14892
14895
14898
NMI2
14901
14902
14905

d9
c5
d5
e5
08
f5
ed
f5
ed
f5
21
39
e5
3e
d3
cd
cd
11
21
e5
cd
e1
e5
11
cd
21
7e
c6
77
23
7e
32
23
7e
b7
20
34
23
5e
23
56
21
19
22
21
11
cd

e1
11 0a 00
cd a7 3b

pop hl
ld de,10
call NMI_RDSEC

14908
14911
14913
14915
14918
14921
14924
14927
14929
14930

cd
3e
d3
cd
21
11
cd
36
23
06

call RAMDUMP
ld a,%00111100
out (255),a
call NMI_REST
ld hl,VRAM
ld de,0
call NMI_RDSEC
ld (hl),64
inc hl
ld b,7

57
5f
00 00
3c
ff
ed
3d
0a
00

3b
3e
00
40

b2 3a
08 00
a7 3b
e2 40
0c

00 5c

15

40 ff
e5
00
08
b2

87
3c
ff
ed
00
00
a7
40
07

40
40
00
3a

3a
3b
40
00
3b

exx
push bc
push de
push hl
ex af,af'
push af
ld a,i
push af
ld a,r
push af
ld hl,0
add hl,sp
push hl
ld a,%00111100
out (255),a
call NMI_REST
call LONGDELAY
ld de,10
ld hl,VRAM
push hl
call NMI_WRSEC
pop hl
push hl
ld de,8
call NMI_RDSEC
ld hl,VRAM+226
ld a,(hl)
add a,12
ld (hl),a
inc hl
ld a,(hl)
ld (23552),a
inc hl
ld a,(hl)
or a
jr nz,NMI2
inc (hl)
inc hl
ld e,(hl)
inc hl
ld d,(hl)
ld hl,-192
add hl,de
ld (VRAM+229),hl
ld hl,VRAM
ld de,8
call NMI_WRSEC

;BC', DE', HL', AF'.

;I e IFF2,
;R e IFF2,
;SP.
; Inicializa porta 255: drive A, lado 0,
;densidade simples, ROM Beta.
; Move cabeote para trilha 0.
; Pausa de 0,8 s.
; D=trilha 0, E=setor 10.
; Endereo a salvar.
; Preserva par HL.
; Preserva 256 bytes a partir de 16384.
; Recupera par HL.
; Preserva par HL.
; D=trilha 0, E=setor 8.
; L setor de configurao do disco.
; Pega o valor do incio da trilha livre,
;soma valor 12 (a imagem da RAM ocupa es;se valor) e guarda novamente.
;
; HL passa a apontar para CS_FORMT.
; Guarda o valor do tipo de formatao
;no endereo.
; HL passa a apontar para CS_NFILE.
; Se o nmero de arquivos salvos for
;diferente de 0, salta adiante.
; Aumenta o nmero de arquivos salvos.
; HL passa a apontar para CS_NFREE.
; DE=nmero de setores livre.

;
;
;
;
;

HL=nmero de setores livres restantes.


Guarda novo valor de CS_NFREE.
HL=endereo inicial a salvar.
D=trilha 0, E=setor 8.
Grava novo setor de configurao.

; Recupera par HL.


; D=trilha 0, E=setor 8.
; Recupera 256 bytes salvos no disco a
;partir de 16384.
; Salva toda a RAM no disco.
; Seleciona lado 0 do disco.
; Move cabeote para a trilha 0.
;
; D=trilha 0, E=setor 0, primeiro setor do
;diretrio, que lido.
; Primeiro caractere do nome @.
; Avana para o segundo caractere.
; Os 7 bytes restantes ficam em branco.

NMI3
14932
14934
14935
14937
14939
14940
14943
14946
14949
14951
14954
14957
14960
14963
14966
14969
14971
14974

36
23
10
36
e1
22
21
22
3e
32
21
11
cd
21
11
0e
cd
cd

20
fb
43
09
00
0e
c0
0d
00
00
b2
00
00
01
c5
a7

40
01
40
40
40
00
3a
40
01
3b
3b

14977 3e 3c
14979 f5
14980 c3 64 3b

ld (hl),32
inc hl
djnz NMI3
ld (hl),67
pop hl
ld (VRAM+9),hl
ld hl,256
ld (VRAM+14),hl
ld a,192
ld (VRAM+13),a
ld hl,VRAM
ld de,0
call NMI_WRSEC
ld hl,VRAM
ld de,256
ld c,1
call NMI_SEEKL
call NMI_RDSEC
ld a,%00111100
push af
jp NMI_RET

; Atribui (espao).
; Avana apontador.
; Repete para os 7 bytes.
; Guarda C (tipo CODE) em FILETYPE.
; HL=SP.
; Guarda valor do SP em FILEDATA1.
; H=trilha 1, L=setor 0
; Armazena em FILESECT/FILETRCK.
; Guarda comprimento de 192 setores em
;FILESIZE.
; Endereo do diretrio a salvar.
; D=trilha 0, E=setor 0.
; Salvar o diretrio no disco.
; Endereo do incio da RAM.
; D=trilha 1, E=setor 0.
; Posiciona o cabeote na trilha 1.
; Faz leitura do setor, para restaurar a
;RAM ao estado inicial.
; Guarda na pilha o estado da porta 255
;(STAT255).
; Salta para retornar.

RAMDUMP (14983/#3A87)
Armazena toda a RAM do TK no disco (49152 bytes ou 192 setores).
14983 cd ed 3b
call NMI_REST
; Move cabeote para a trilha 0.
14986 0e 01
ld c,1
; C=trilha lgica 1.
14988 cd c5 3b
call NMI_SEEKL
; Desloca o cabeote para a trilha.
14991 21 00 40
ld hl,VRAM
; HL=incio da RAM do TK.
14994 11 00 01
ld de,256
; D=trilha 1, E=setor 0.
14997 06 c0
ld b,192
; Contador de 192 setores, a serem salvos.
RAMDUMP1
14999 c5
push bc
; Preserva pares BC e DE.
15000 d5
push de
15001 cd b2 3a
call NMI_WRSEC
; Salva 1 setor no disco.
15004 11 00 01
ld de,256
; HL aponta para 256 bytes adiante,
15007 19
add hl,de
15008 d1
pop de
; Recupera par DE.
15009 1c
inc e
; Aumenta nmero da trilha.
15010 7b
ld a,e
; Se no for igual a 16,
15011 fe 10
cp 16
15013 20 07
jr nz,RAMDUMP2
;salta adiante,
15015 1e 00
ld e,0
;seno zera o setor
15017 14
inc d
;e incrementa o valor de trilha.
15018 4a
ld c,d
; C assume valor da trilha lgica.
15019 cd c5 3b
call NMI_SEEKL
; Move o cabeote para a trilha fsica.
RAMDUMP2
15022 c1
pop bc
; Recupera par BC.
15023 10 e6
djnz RAMDUMP1
; Repete at salvar os 192 setores.
15025 c9
ret
; Fim.

NMI_WRSEC (15026/#3AB2)
Rotina que grava 256 bytes da RAM a partir do endereo apontado por HL, para o setor
especificado por E. empregada pela rotina NMI.
15026 7b
ld a,e
; A=nmero do setor (0-15).
15027 3c
inc a
; Aumenta A (no disco, setor=1-16).
15028 d3 5f
out (95),a
; Envia para registrador de setor.
15030 e5
push hl
; Preserva par HL.
15031 16 0a
ld d,10
; Contador, 10 tentativas.
15033 d5
push de
; Preserva par DE.
NMI_WRSEC1
15034 0e 7f
ld c,127
; Endereo da porta 127.

15036
15038
15040
15043
15044
15045
15047
15049
15050
15051
15052
15053
15055

3e
d3
cd
d1
e1
db
e6
c8
15
e5
d5
20
76

a0
1f
60 3f
1f
7f

eb

ld a,#a0
out (31),a
call W_DATAFDC2
pop de
pop hl
in a,(31)
and %01111111
ret z
dec d
push hl
push de
jr nz,NMI_WRSEC1
halt

; Envia comando Write Sector ao FDC,


;inicia escrita do setor no disco.
; Grava 1 setor no disco.
; Recupera pares DE e HL.
; L registrador de status e verifica se
;algum bit 0-6 est levantado (erro),
;seno, retorna.
; Diminui contador de tentativas.
; Preserva registradores HL e DE.
; Tenta novamente, se D<>0.
;seno trava computador (HALT com inter;rupes desativadas).

GOTO (15056/#3AD0)
Sintaxe:
15056 cd
15059 cd
15062 cd
15065 cd
15068 c2
15071 cd
15074 3a
15077 fe
15079 20
15081 ed
GOTO1
15083 31
15086 cd
15089 32
15092 3a
15095 32
15098 2a
15101 e5
15102 ed
15106 d5
15107 1c
15108 7b
15109 fe
15111 20
15113 1e
15115 14
GOTO2
15116 4a
15117 cd
15120 3a
15123 e6
15125 c4
15128 79
15129 cd
15132 21
15135 06
GOTO3
15137 c5
15138 d5
15139 cd
15142 11
15145 19
15146 d1
15147 1c

7c
0e
f1
f1
58
ae
dd
24
02
5e

GOTO a$ CODE
a$=nome do arquivo
2e
call GETARG_S
; Obtm string da linha de comando.
2e
call SYN_CHK
; Retorna, se est checando sintaxe.
24
call FET_TYPE
; Obtm tipo do arquivo.
38
call FINDFILE
; Busca o arquivo com nome do string.
23
jp nz,ERRNOFILE
; Se no for encontrado, acusa erro.
27
call GET_ENTRY
; Obtm entrada do diretrio do arquivo.
5c
ld a,(FILENAME)
; Se o primeiro caractere do nome no for
cp 36
;$, salta adiante,
jr nz,GOTO1
im 2
;seno assume modo de interrupo 2.

f0
ba
10
16
11
e6

40
3d
40
5d
40
5c

5b eb 5c

10
03
00

93 3b
10 40
02
9b 3b
db 3b
00 41
bf

a7 3b
00 01

ld sp,16624
call GET_DTYPE
ld (VRAM+16),a
ld a,(STAT255)
ld (VRAM+17),a
ld hl,(FILEDATA1)
push hl
ld de,(FILESECT)
push de
inc e
ld a,e
cp 16
jr nz,GOTO2
ld e,0
inc d

; Atribui valor temporrio de SP.


; Obtm tipo do disco (1/2 faces) e
;armazena temporariamente na VRAM.
; Guarda o ltimo valor de OUT para porta
;255 na VRAM.
; A varivel DOS armazena o SP salvo pelo
;boto mgico, que colocada na pilha.
; D=trilha inicial, E=setor inicial.
; Preserva par DE.
; Aumenta setor inicial.
;
; SE no for 16, salta adiante,

ld c,d
call GOTO_SIDE0
ld a,(VRAM+16)
and %00000010
call nz,GOTO_SIDE1
ld a,c
call NMI_SEEKA
ld hl,VRAM+256
ld b,191

; C=trilha.
; Seleciona lado 0.
; Se disco for face dupla (bit 1=1),

push bc
push de
call NMI_RDSEC
ld de,256
add hl,de
pop de
inc e

; Preserva pares BC e DE.

;seno zera setor inicial e aumenta trilha


;inicial.

;calcula trilha fsica e seleciona lado.


; A=trilha fsica.
; Move o cabeote para trilha A.
; Carrega do disco 191 setores da RAM sal;vos no disco.

; Faz leitura do setor.


; HL=HL+256, avana apontador da RAM em
;256 bytes (1 setor).
; Recupera par DE.
; Incrementa setor.

15148 7b
ld a,e
; Se setor for menor que 16,
15149 fe 10
cp 16
15151 20 13
jr nz,GOTO4
;salta adiante,
15153 1e 00
ld e,0
;seno zera setor,
15155 14
inc d
;aumenta trilha
15156 4a
ld c,d
15157 cd 93 3b
call GOTO_SIDE0
;e move o cabeote de acordo.
15160 3a 10 40
ld a,(VRAM+16)
; Se disco for face dupla (bit 1=1),
15163 e6 02
and %00000010
15165 c4 9b 3b
call nz,GOTO_SIDE1 ;calcula trilha fsica e seleciona lado.
15168 79
ld a,c
; A=trilha fsica.
15169 cd db 3b
call NMI_SEEKA
; Move o cabeote para trilha A.
GOTO4
15172 c1
pop bc
; Recupera par BC.
15173 10 da
djnz GOTO3
; Repete at carregar 191 setores.
15175 d1
pop de
; Recupera par DE.
15176 e1
pop hl
; Pega valor de SP da pilha.
15177 f9
ld sp,hl
15178 3a 11 40
ld a,(VRAM+17)
; Preserva STAT255 na pilha.
15181 f5
push af
15182 4a
ld c,d
; C=trilha.
15183 cd 93 3b
call GOTO_SIDE0
; Seleciona lado 0.
15186 3a 10 40
ld a,(VRAM+16)
; Se disco for face dupla (bit 1=1),
15189 e6 02
and %00000010
15191 c4 9b 3b
call nz,GOTO_SIDE1 ;calcula trilha fsica e seleciona lado.
15194 79
ld a,c
; A=trilha.
15195 cd db 3b
call NMI_SEEKA
; Move o cabeote para trilha A.
15198 21 00 40
ld hl,VRAM
; Carrega por ltimo o primeiro setor da
15201 cd a7 3b
call NMI_RDSEC
;imagem da RAM do disco.
NMI_RET recupera os registradores e o IFF1/IFF2 aps NMI/GOTO.
15204 f1
pop af
; Guarda STAT255 temporariamente em
15205 08
ex af,af'
;A'.
15206 f1
pop af
15207 ed 4f
ld r,a
; Recupera R.
15209 f1
pop af
15210 ed 47
ld i,a
; Recupera I e IFF2,
15212 e2 81 3b
jp po,NMI_RET1
; Saltar adiante, se IFF2=1.
15215 f1
pop af
; Recupera pares alternativos
15216 e1
pop hl
;AF', HL', DE', BC'.
15217 d1
pop de
15218 c1
pop bc
15219 d9
exx
15220 08
ex af,af'
15221 fd e1
pop iy
; Recupera pares IY, IX, HL, DE e BC.
15223 dd e1
pop ix
15225 e1
pop hl
15226 d1
pop de
15227 c1
pop bc
15228 f6 80
or %10000000
; Levanta bit 7 do STAT255, para acionar
15230 c3 88 3c
jp NMI_RETE
;ROM BASIC e salta para faixa de endereo
;interceptado pela interface Beta.
NMI_RET1
15233 f1
pop af
;
Recupera pares alternativos
15234 e1
pop hl
;AF', HL', DE', BC'.
15235 d1
pop de
15236 c1
pop bc
15237 d9
exx
15238 08
ex af,af'
15239 fd e1
pop iy
; Recupera pares IY, IX, HL, DE e BC.
15241 dd e1
pop ix
15243 e1
pop hl
15244 d1
pop de

15245 c1
15246 f6 80
15248 c3 90 3c

pop bc
or %10000000
jp NMI_RETD

; Levanta bit 7 do STAT255, para acionar


;ROM BASIC e salta para faixa de endereo
;interceptado pela interface Beta.

GOTO_SIDE0 (15251/#3B93)
Usada pelo comando
15251 3a 11 40
15254 f6 3c
GOTO_255
15256 d3 ff
15258 c9

GOTO para selecionar lado 0 do disco.


ld a,(VRAM+17)
; Pega valor salvo de STAT255,
or %00111100
;levanta bit 4 para selecionar lado 0
out (255),a
ret

;e envia para a porta 255.


;Fim.

GOTO_SIDE1 (15259/#3B9B)
Usada
15259
15260
15261
15262
15263
15264
15267
15269

pelo comando
79
b7
1f
4f
d0
3a 11 40
e6 6f
18 f1

GOTO para selecionar


ld a,c
or a
rra
ld c,a
ret nc
ld a,(VRAM+17)
and %01101111
jr GOTO_255

lado 1 do disco, se trilha C for mpar.


; A=nmero da trilha fsica.
; Abaixa flag CARRY.
; Calcula trilha lgica=A/2.
; C=trilha lgica.
; Retorna se trilha era par,
;seno pega valor salvo de STAT255,
;abaixa bit 4 para selecionar lado 1
;e salta para enviar porta 255.

NMI_RDSEC (15271/#3BA7)
L 256 bytes do setor especificado por E, e copia para a RAM a partir do endereo apontado
por HL.
Entrada: E=nmero do setor (0-15); HL=endereo da memria a salvar setor lido.
Sada: A=cdigo de erro (0 se no houve erro), flag ZERO=1 se no houve erro, BC destrudo,
D destruido, E=nmero do setor, HL inalterado.
Usada por GOTO e NMI.
15271 7b
ld a,e
; A=nmero do setor (0-15).
15272 3c
inc a
; Aumenta A e envia para o registrador
15273 d3 5f
out (95),a
;de setor do FDC (1-16).
15275 e5
push hl
; Preserva HL.
15276 16 0a
ld d,10
; Contador, 10 tentativas.
15278 d5
push de
; Preserva par DE.
NMI_RDSEC1
15279 0e 7f
ld c,127
; Endereo da porta 127.
15281 3e 80
ld a,#80
; Comando Read Sector do FDC.
15283 d3 1f
out (31),a
; Envia para o registrador de comando.
15285 cd 7b 3f
call R_DATAFDC2
; Recebe 256 bytes lidos do disco.
15288 d1
pop de
; Recupera pares DE e HL.
15289 e1
pop hl
15290 db 1f
in a,(31)
; Verifica se no registrador de status
15292 e6 7f
and %01111111
;algum bit 0-6 est levantado (erro),
15294 c8
ret z
;seno retorna.
15295 15
dec d
; Diminui contador de tentativas.
15296 e5
push hl
; Preserva pares HL e DE.
15297 d5
push de
15298 20 eb
jr nz,NMI_RDSEC1
; Se D<>0, faz nova tentativa,
15300 76
halt
;seno trava computador (HALT com inter;rupes desativadas).

NMI_SEEKL (15301/#5BC5)
Usada pela rotina NMI.
Quando o disco face simples, os dados so gravados em trilhas contguas, na sequncia
crescente. Se for face dupla, vai sendo gravado ora no lado 0 (se trilha for par), ora no lado 1
(se trilha for mpar).
Esta rotina busca a trilha especificada no registrador C, seguindo a lgica descrita acima.
15301 3e 3c
ld a,%00111100
; Seleciona lado 0 do disco.
15303 d3 ff
out (255),a
15305 3a 00 5c
ld a,(23552)
; Recupera tipo de disco.

15308 e6 08
15310 20 0a
15312 79
15313 b7
15314 1f
15315 4f
15316 30 04
15318 3e 2c
15320 d3 ff
NMISEEKL1
15322 79

and %00001000
jr nz,NMISEEKL1
ld a,c
or a
rra
ld c,a
jr nc,NMISEEKL1
ld a,%00101100
out (255),a

; Se for face simples (#18 e #19),


;salta adiante.
; A=trilha lgica.
; Zera flag CARRY.
; A=A/2, resto da diviso no CARRY.
; C=trilha fsica.
; Se trilha lgica mpar, salta,
;seno seleciona lado 1 do disco.

ld a,c

; A=trilha a posicionar o cabeote.

NMI_SEEKA (15323/#3BDB)
Posiciona o cabeote na trilha especificada pelo acumulador.
Entrada: A=nmero de trilha. Sada: A=128.
Usada pelas rotinas NMI e GOTO.
15323 d3 7f
out (127),a
; Envia A para registrador de dados.
15325 3e 1b
ld a,#1b
; Comando Seek do FDC, move cabeote at
;trilha em A.
NMI_REST1 continuao do NMI_REST.
15327 d3 1f
out (31),a
; Envia comando para FDC.
WAITINTRQ
15329 db ff
in a,(255)
; Espera at que o bit 7 (INTRQ) do FDC
15331 e6 80
and %10000000
;seja 1, isto , que o comando esteja
15333 28 fa
jr z,WAITINTRQ
;terminado.
15335 c5
push bc
; Preserva par BC.
15336 cd a6 3d
call DELAY
; Pausa de 0,147 s.
15339 c1
pop bc
; Recupera par BC.
15340 c9
ret
; Fim.

NMI_REST (15341/#3BED)
Forma simplificada da rotina RESTORE empregada pela rotina de NMI. Posiciona o cabeote na
trilha 0.
15341 3e 0b
ld a,#0b
; Comando Restore do FDC.
15343 18 ee
jr NMI_REST1
; Salta para trs.
15345
15346
15347
15348
15349
15350
15351
15352
15353
15354
15357

ff
ff
ff
ff
ff
ff
ff
ff
ff
c3 8c 31
c3 0f 38

rst 38h
rst 38h
rst 38h
rst 38h
rst 38h
rst 38h
rst 38h
rst 38h
rst 38h
jp SV_IF1_VAR
jp l380fh

;
;
;
;
;
;
;
;
;
;
;

.
.
.
.
.
.
.
.
.
. . 1
. .

Rotinas interceptadas pela interface Beta (15360-15615/#3C00-#3CFF)


Destaques em fundo verde.

DOSIMMED (15360/#3C00)
Entra no DOS em modo imediato, invocado normalmente por USR 15360. O DOS aguarda
entrada de um comando do teclado.
15360 c3 49 3c
jp DOSIMM1
; Salta adiante.

DOSINTERP (15363/#3C03)
Entra no DOS em modo interpretado, invocado normalmente por USR 15363. O DOS faz a
interpretao da linha de comando armazenada na RAM.
15363 c3 30 3c
jp DOSINTRP1
; Salta adiante.
15366 c3 68 3c

jp ROM_BETA1

. h <

l3c09h:
15369 cd 68
15372 c3 8b
l3c0fh:
15375 cd 68
15378 c3 db
l3c15h:
15381 2a 1c
15384 2b
15385 2b
15386 f9
15387 cd 68
15390 c3 c8
RUNLOAD3

3c
36

call ROM_BETA1
jp l368bh

;
;

. h <
. . 6

3c
34

call ROM_BETA1
jp l34dbh

;
;

. h <
. . 4

5d

ld hl,(OLDSP)
dec hl
dec hl
ld sp,hl
call ROM_BETA1
jp l2dc8h

;
;
;
;
;
;

* . ]
+
+
.
. h <
. . -

3c
2d

Continuao de RUNLOAD.
15393 ed 7b 3d 5c ld sp,(ERR_SP)
15397 3a 10 5d
ld a,(EXECLOAD)
15400 b7
or a
15401 ca 76 1b
jp z,7030
15404 e1
15405 c3 cf 12

pop hl
jp 4815

; SP assume valor guardado na varivel.


; Verifica valor de flag,
;se for 0 executa a rotina STMT-RET da
;ROM BASIC, que continua execuo na
;prxima linha do BASIC. Assim roda
;o programa carregado.
; Caso contrrio, executa a rotina MAIN-3
;da ROM BASIC que entra no modo de edio
;de linha BASIC.

DOSINTRP1
Continuao do DOSINTERP.
15408 cd 37 3c
call INITDOS
15411 e5
push hl
15412 c3 24 21
jp DOSINTRP2

; Inicializa variveis de sistema do DOS.


; Coloca na pilha endereo de ROM_BASIC.
; Salta atrs.

INITDOS (15415/#3c37)
Inicializa se necessrio as variveis de sistema DOS, e habilita ROM do Beta. O par HL fica com
o endereo de retorno para rotina ROM_BASIC.
15415 3a 17 5d
ld a,(SAVEBUF)
; Verifica se SAVEBUF contm #AA,
15418 fe aa
cp #aa
;se contm, inicializa variveis de
15420 c4 d6 3c
call nz,INI_VARS
;sistema do DOS.
15423 18 27
jr ROM_BETA1
; Salta para habilitar ROM Beta.
RESET9
Continuao do RESET8.
15425 3e ff
ld a,255
15427 32 16 5d
ld (STAT255),a
15430 cd 7c 3c
call ROM_BASIC
DOSIMM1

; Inicializa valor de STAT255


; Seleciona ROM BASIC.

Continuao de DOSIMMED. A rotina de inicializao do TK (RESET) termina aqui.


15433 cd 37 3c
call INITDOS
; Inicializa variveis de sistema DOS e
;habilita ROM Beta.
15436 e5
push hl
; Pilha fica com endereo de retorno para
;rotina ROM_BASIC.
15437 c3 dc 21
jp DOSIMM2
; Salta para trs.

CALLBAS1 (15440/#3C50)
Chamada pela rotina CALLBAS. A pilha deve conter o endereo seguinte invocao do
CALLBAS1 (colocado por uma instruo CALL CALLBAS1), seguido do endereo da rotina da
ROM BASIC que se deseja executar.
Prepara a pilha para que, nos retornos das subrotinas, execute-se na ordem: a rotina da ROM
BASIC (selecionada por ROM_BASIC), a rotina ROM_BETA e ao endereo de retorno aps
invocao de CALLBAS1.
Observao: como a rotina executada com a ROM BASIC parcialmente habilitada, se for
invocada uma rotina situada entre #3c00-#3cff, executa-se a da ROM do Beta.
15440 e7
rst 32
; HLSAVER, salva temporariamente HL.
15441 ed 53 04 5d ld (DETEMP),de
; Salva temporariamente DE.

15445
15446
15447
15448
15451
15454
15455
15456
15460
15463

d1
e1
d5
cd
11
d5
e5
ed
2a
c9

7c 3c
6b 3c
5b 04 5d
02 5d

pop de
pop hl
push de
call ROM_BASIC
ld de,ROM_BETA
push de
push hl
ld de,(DETEMP)
ld hl,(HLTEMP)
ret

; Pega endereo de retorno do CALLBAS1.


; Pega endereo da rotina da ROM BASIC.
; Guarda endereo de retorno do CALLBAS1.
; Habilita ROM BASIC.
; Coloca como endereo de retorno rotina
;para selecionar ROM Beta.
; Por fim, coloca rotina a ser chamada.
; Recupera DE.
; Recupera HL.
; Fim.

ROM_BETA1
Ponto de entrada para ROM_BETA que coloca o endereo da rotina ROM_BASIC no par HL, que
pode ser usado como endereo de retorno.
15464 21 7c 3c
ld hl,ROM_BASIC

ROM_BETA ou JETSKI (15467/#3C6B)


Habilita por completo a ROM do Beta e desabilita a ROM do BASIC.
Escreve na port 255 com o bit 7 zerado. Todo acesso do Z80 pgina 0 (endereos 0 a 16383)
ser na ROM BETA.
Esta rotina preserva todos os registradores, mas desabilita as interrupes.
15467 f3
di
; Desabilita interrupes.
15468 f5
push af
; Preserva AF.
15469 cd 97 3c
call IO_OFF
; Habilita IO da interface Beta.
15472 3a 16 5d
ld a,(STAT255)
; Pega ltimo valor enviado porta 255.
15475 e6 7f
and %01111111
; Zera o bit 7.
15477 32 16 5d
ld (STAT255),a
; Guarda o valor na varivel DOS.
15480 d3 ff
out (255),a
; Envia para a porta 255.
15482 f1
pop af
; Recupera AF.
15483 c9
ret
; Fim.

ROM_BASIC ou PONTE (15484/#3C7C)


Desabilita a ROM da Beta e habilita a ROM do BASIC (denominado modo PONTE por Jorge
Braga).
Escreve na port 255 com o bit 7 levantado. Neste modo, o acesso do Z80 pgina 0
(endereos 0 a 16383) ser na ROM BASIC, a no ser que a ponte esteja desbloqueada e o
acesso seja nos endereos entre 15360 a 15615.
Esta rotina preserva todos os registradores e habilita as interrupes.
15484 f5
push af
; Preserva AF.
15485 cd 97 3c
call IO_OFF
; Habilita IO da interface Beta.
15488 3a 16 5d
ld a,(STAT255)
; Pega ltimo valor enviado porta 255.
15491 f6 80
or %10000000
; Levanta o bit 7.
15493 32 16 5d
ld (STAT255),a
; Guarda o valor na varivel DOS.
NMI_RETE Retorno das rotinas NMI/GOTO aps recuperar registradores exceto AF. Neste
ponto de sada, como IFF2=1, volta com interrupes habilitadas.
15496 d3 ff
out (255),a
; Envia a para porta 255 com bit 7
;levantado para habilitar ROM BASIC.
15498 cd 9d 3c
call IO_ON
; Desabilita IO da interface Beta.
15501 f1
pop af
; Recupera par AF.
15502 fb
ei
; Habilita interrupes.
15503 c9
ret
; Fim.
NMI_RETD Retorno das rotinas NMI/GOTO aps recuperar registradores exceto AF. Neste
ponto de sada, como IFF2=0, volta com interrupes desabilitadas.
15504 d3 ff
out (255),a
; Envia a para porta 255 com bit 7
;levantado para habilitar ROM BASIC.
15506 cd 9d 3c
call IO_ON
; Desabilita IO da interface Beta.
15509 f1
pop af
; Recupera par AF.
15510 c9
ret
; Sai sem habilitar as interrupes.

IO_OFF (15511/#3C97)
Desabilita I/O com dispositivos plugados no conector de expanso da IDS, portanto habilita I/O
com a interface Beta. Este modo denominado desbloqueio do seletor, e conseguido com
OUT na porta 252 com bit 7 abaixado.

Habilita o acesso faixa de endereo 15360-15615 na ROM do Beta (para acessar, entre outras
coisas, USR 15360/15363). Este modo denominado desbloqueio da ponte, e conseguido
com OUT na porta 252 com bit 6 abaixado. Normalmente esta rea est desbloqueada, a no
ser que o usurio ou algum programa promova o seu bloqueio.
15511 cd af 3c
call BDPAPER
; A=%00000PPP.
15514 d3 fc
out (252),a
; Envia porta 252.
15516 c9
ret
; Fim.

IO_ON (15517/#3C9D)
Habilita I/O com dispositivos plugados no conector de expanso da IDS, portanto desabilita I/O
com a interface Beta. Este modo denominado bloqueio do seletor, e conseguido com
OUT na porta 252 com bit 7 levantado.
Habilita o acesso faixa de endereo #3c00-#3cff na ROM do Beta (para acessar, entre outras
coisas, USR 15360/15363). Este modo denominado desbloqueio da ponte, e conseguido
com OUT na porta 252 com bit 6 abaixado. Normalmente esta rea est desbloqueada, a no
ser que o usurio ou algum programa promova o seu bloqueio.
15517 cd af 3c
call BDPAPER
; A=%00000PPP.
15520 f6 80
or %10000000
; Levanta bit 7, A=%10000PPP.
15522 d3 fc
out (252),a
; Envia porta 252.
15524 c9
ret
; Fim.

WAITKEY (15525/#3CA5)
Aguarda uma tecla ser pressionada. As interrupes devem estar habilitadas, pois depende da
respectiva rotina; seno o computador trava.
15525 21 3b 5c
ld hl,FLAGS
; HL aponta para FLAGS.
WAITKEY1
15528 cb 6e
bit 5,(hl)
; Enquanto bit 5 de FLAGS no for 1 (no
15530 28 fc
jr z,WAITKEY1
;foi pressionada tecla), aguarda.
15532 cb ae
res 5,(hl)
; Abaixa flag para sinalizar pronto para
15534 c9
ret
;nova leitura do teclado e finaliza.

BDPAPER (15535/#3CAF)
A = cor do PAPER dos atributos das linhas
mudar a cor da borda.
Usada por IO_OFF e IO_ON.
15535 3a 48 5c
ld a,(BORDCR)
15538 e6 38
and %00111000
15540 0f
rrca
15541 0f
rrca
15542 0f
rrca
15543 c9
ret

inferiores, usado para OUT em porta par para no


;
;
;
;
;
;

A=%FBPPPIII.
A=%00PPP000.
A=%000PPP00.
A=%0000PPP0.
A=%00000PPP.
Fim.

ROMBETA_ALT (15544/#3CB8)
Habilita por completo a ROM do Beta e desabilita a ROM do BASIC.
Escreve na port 255 o bit 7 zerado. No modo JET SKI todo acesso do Z80 pgina 0 (endereos
0 a 16383) ser na ROM BETA.
Esta rotina uma forma alternativa da ROM_BETA1, sem salvar na varivel de sistema
STAT255.
Esta rotina preserva todos os registradores exceto AF, mas desabilita as interrupes.
15544 f3
di
; Desabilita interrupes.
15545 cd 97 3c
call IO_OFF
; Ativa IO da interface Beta.
15548 3e 7f
ld a,127
; Bit 7 = 0, seleciona ROM Beta.
15550 18 05
jr ROMBETALT1
; Salta adiante, para OUT na porta 255.

ROMBAS_ALT (15552/#3CC0)
Desabilita a ROM do Beta e habilita a ROM do BASIC.
Escreve na port 255 com o bit 7 levantado. O acesso do Z80 pgina 0 (endereos 0 a 16383)
ser na ROM BASIC, a no ser que a ponte esteja desbloqueada e o acesso seja nos endereos
entre 15360 a 15615.
Esta rotina uma forma alternativa ROM_BASIC, que no salva na varivel de sistema
STAT255.
Esta rotina preserva todos os registradores exceto AF.
15552 cd 97 3c
call IO_OFF
; Ativa IO da interface Beta.
15555 3e ff
ld a,255
; Bit 7 = 1, seleciona ROM BASIC.

ROMBETALT1
15557 d3 ff
15559 c9

out (255),a
ret

; Escreve na porta 255.


; Fim.

LDD_ROM_B
Copia bytes da ROM BASIC na RAM. Usado por RESET para copiar 168 bytes de caracteres para
a rea UDG.
15560 cd c0 3c
call ROMBAS_ALT
; Habilita ROM BASIC.
15563 ed b8
lddr
; Efetua a cpia.
15565 18 9c
jr ROM_BETA
; Encerra desabilitando a ROM BASIC.

LDI_ROM_B
Copia bytes da ROM
dos canais
15567 cd c0 3c
15570 ed b0
15572 18 95

BASIC na RAM. Usado por RESET para copiar os dados das informaes
call ROMBAS_ALT
ldir
jr ROM_BETA

; Habilita ROM BASIC.


; Efetua a cpia.
; Encerra desabilitando a ROM BASIC.

INI_VARS (15574/#3CD6)
Inicializa variveis de sistema do DOS.
Se Interface 1 estiver conectado, envia comando #31 (NEWVARS) que cria novas variveis do
BASIC estendido, se necessrio (referncia: http://www.wearmouth.demon.co.uk/hook.htm).
Abre espao de 112 bytes para acomodar as variveis do DOS (todos os dados a partir de
#5cb5/23734 so deslocados, incluindo eventuais variveis do BASIC estendido).
15574 3e 00
ld a,0
; IN ser com A7-A15 em 0.
15576 00
nop
; Pausa de 8T = 2,23 s.
15577 00
nop
15578 db f7
in a,(247)
; Interface 1 est presente?
15580 fe 1e
cp 30
;
15582 20 07
jr nz,INI_VARS1
; Se no est presente salta adiante.
15584 cf
rst 8
; Se est presente, executa comando
15585 31
defb #31
;NEWVARS e
15586 3e 01
ld a,1
;atribui 1 varivel de sistema do BASIC
15588 32 ef 5c
ld (23791),a
;estendido COPIES.
INI_VARS1
15591 21 b5 5c
ld hl,23733
; Abre espao de 112 bytes a partir de
15594 01 70 00
ld bc,112
;23733, atravs da rotina da ROM BASIC
15597 cd 55 16
call 5717
;MAKE-ROOM.
15600 cd b8 3c
call ROMBETA_ALT
; Habilita ROM Beta.
15603 21 ff ff
ld hl,65535
; Inicializa variveis de sistema DOS.
15606 22 fa 5c
ld (STP_RATE),hl
; Todos os stepping rate ficam #ff.
15609 22 fc 5c
ld (STP_RATE+2),hl
15612 22 c8 5c
ld (DSKTYPE),hl
; Tipo dos discos tambm ficam #ff.
15615 22 ca 5c
ld (DSKTYPE+2),hl
15618 af
xor a
; A=0.
15619 32 19 5d
ld (DFLT_DRV),a
; Drive default = 0.
15622 32 18 5d
ld (IF1),a
; Interface I ausente.
15625 32 0f 5d
ld (CL_ELINE),a
;
2 . ]
15628 32 1f 5d
ld (FLG_RFPC),a
;
2 . ]
15631 3e ff
ld a,255
15633 32 3a 5c
ld (ERR_NR),a
; Erro 0 (0 - Ok)
15636 32 16 5d
ld (STAT255),a
; Inicializa OUT dado para porta 255.
15639 32 0c 5d
ld (23820),a
;
2 . ]
15642 3e d0
ld a,#d0
; Comando FORCE INTERRUPT, interrompe
15644 d3 1f
out (31),a
;qualquer comando em andamento no FDC.
15646 c9
ret
; Fim.

PRN_ENTER (15647/#3D1F)
Imprime ENTER (CHR$ 13).
15647 3e 0d
ld a,13

PRNCHR1 (15649/#3D21)
Continuao do RST 16/RST #10.

Imprime caractere contido no registrador A


Preserva registradores BC e HL.
15649 e5
push hl
15650 c5
push bc
15651 47
ld b,a
15652 3a 0c 5d
ld a,(23820)
15655 b7
or a
15656 f5
push af
15657 78
ld a,b
15658 cc 18 39
call z,sub_3918h
15661 cd 37 3d
call BAS_RST16
15664 f1
pop af
15665 cc 2b 39
call z,l392bh
15668 c1
pop bc
15669 e1
pop hl
15670 c9
ret

no canal corrente.
; Preserva pares HL e BC.
;
;
;
;
;
;
;
;
;
;

Guarda A temporariamente.
: . ]
.
Guarda flags.
Recupera A.
. . 9
Chama RST 16 da ROM BASIC.
Recupera flags.
. + 9
Recupera pares BC e HL.

; Fim.

BAS_RST16
Chama rotina RST 16/#10 da ROM BASIC, PRINT-A-1 que imprime caractere em A.
15671 21 10 00
ld hl,16
; HL endereo da rotina da ROM BASIC.
15674 c3 36 2e
jp CALLBAS
; Salta para executar.

RESTORE (15677/#3D3D)
Envia comando RESTORE para o FDC, que posiciona cabeote na trilha 0 (seek track 0).
Usada por: FORMAT, RW_SECTOR.
15677 3e 0b
ld a,%0b
; A=comando RESTORE.

FDC_CMD_BR (15679/#3D3F)
Envia um comando de 1 byte contido em A para o FDC, e aguarda at ele ser completado. Se a
tecla BREAK for acionada, retorna ao BASIC com erro "L - BREAK into program".
Preserva os registradores exceto AF.
Usada por: NODISK, SCAN_SRATE, FDC_CMD_DT, FDC_CMD_V.
15679 d3 1f
out (31),a
; Envia comando em A para o FDC.
FDC_CMD_B1
15681 e5
push hl
; Preserva par HL.
15682 21 54 1f
ld hl,#1f54
; Chama BREAK-KEY da ROM BASIC, verifica
15685 cd 36 2e
call CALLBAS
;se tecla BREAK foi pressionada.
15688 21 7b 1b
ld hl,#1b7b
; Se foi, salta para REPORT-L da ROM BASIC
15691 d2 36 2e
jp nc,CALLBAS
;que imprime mensagem de erro.
15694 e1
pop hl
; Recupera par HL.
15695 db ff
in a,(255)
; Faz leitura do bit 7 (INTRQ) do FDC,
15697 e6 80
and %10000000
;se for 0 o comando ainda est em execuo
15699 28 ec
jr z,FDC_CMD_B1
;e salta para aguardar.
15701 c9
ret
; Se no for 0, comando foi finalizado e
;por isso retorna.

NODISK (15702/#3D56)
Testa se existe disco no drive, seno acusa erro.
O algoritmo consiste em enviar comando RESTORE para acionar o drive, e fazer a leitura do
sinal INDEX do drive. A cada vez que o cabeote posiciona-se no INDEX do disco, o respectivo
sinal levantado; caso contrrio, o sinal deve ser 0. Portanto quando h um disco girando no
drive, deve haver mudanas no estado do sinal INDEX, presente no bit 1 do registrador de
status do FDC.
15702 3e 0b
ld a,%0b
; Executa comando RESTORE do FDC que leva
15704 cd 3f 3d
call FDC_CMD_BR
;cabeote trilha 0.
15707 11 00 00
ld de,0000
; DE contador de 65536 tentativas.
15710 db 1f
in a,(31)
; L registrador de status do FDC.
15712 e6 02
and %00000010
; Bit 1 INDEX do FDC.
15714 47
ld b,a
; Guarda resultado em B.
NODISK1
15715 db 1f
in a,(31)
; L de novo registrador de status do FDC.
15717 e6 02
and %00000010
15719 b8
cp b
; Compara a nova leitura com a primeira.

15720
15721
15722
15723
15724
15726

c0
13
7b
b2
20 f5
c3 82 3e

ret nz
inc de
ld a,e
or d
jr nz,NODISK1
jp NO_DISK

; Retorna, se for diferente.


; Se for igual, aumenta contador
;e repente enquanto no for 0.
; Esgotadas as tentativas, salta para
;tratar o erro.

CHANGE_DRV (15729/#3D71)
Muda drive corrente para o default (guardado na varivel de sistema DOS DFLT_DRV). Tenta ler
o disco e determinar stepping rate e o nmero de trilhas (40/80).
15729 3a 19 5d
ld a,(DFLT_DRV)
; A=nmero do drive default (0-3).
CHANGEDRV1 (15732/#3d74)
Neste ponto de entrada muda drive para o nmero especificado em A.
15732 32 f6 5c
ld (CUR_DRV),a
; Guarda nmero de drive corrente.
15735 21 16 5d
ld hl,STAT255
; HL aponta para varivel do sistema.
15738 4f
ld c,a
; C=drive.
15739 3e 3c
ld a,%00111100
; Levanta os bits 2 a 5 (MASTER RESET,
15741 b1
or c
;HLT e SIDE SELECT) e
15742 d3 ff
out (255),a
;envia para o reg. de config. secundrio.
15744 77
ld (hl),a
; Atualiza STAT255.
15745 cd b1 3d
call GET_SRATE
; Obtm valor de stepping rate do motor,
15748 e6 80
and %10000000
;se j foi inicializado (bit 7 = 0)
15750 28 1b
jr z,CHANGEDRV3
;salta adiante,
15752 cd 56 3d
call NODISK
;seno verifica se h disco no drive e
15755 cd bf 3d
call SCAN_SRATE
;mede o stepping rate.
15758 cd ba 3d
call GET_DTYPE
; HL aponta para varivel de tipo de
15761 fe ff
cp #ff
;disco, se j foi inicializado (A<>#ff)
15763 20 0e
jr nz, CHANGEDRV3 ;salta adiante.
15765 e5
push hl
; Preserva par HL.
15766 cd 77 30
call GET_NUMTRK
; Determina o nmero de trilhas do disco.
15769 e1
pop hl
; Restaura par HL.
15770 fe 50
cp 80
; Verifica se 80 trilhas,
15772 3e 00
ld a,0
;se no for A=0,
15774 20 02
jr nz,CHANGEDRV2
;e salta adiante,
15776 3e 80
ld a,#80
;se for, A=#80.
CHANGEDRV2
15778 77
ld (hl),a
; Atualiza DSKTYPE.
CHANGEDRV3
15779 cd e3 2e
call TRKFETCH
; Atualiza registrador de trilha do FDC.

DELAY (15782/#3DA6)
Pausa de 524546T, aproximadamente 0,147 s.
Usada por: GET_NUMTRK, NMI_SEEKA, FDC_CMD_V,
15782 3e 80
ld a,128
; (7T) Repetio de 128 vezes.
DELAY1
Equao para o tempo: (4098A-5)T, onde T o inverso da frequncia do clock do Z80. Caso
A=0, usar valor 256 na equao.
Entrada: A=nmero de ciclos. Sada: A=0; C=0.
Usada: sub_224bh, LONGDELAY,
15784 0e ff
ld c,255
; (7T) Repetio de 255 vezes.
DELAY2
15786 0d
dec c
; (4T) Diminui contador C, se no for 0,
15787 20 fd
jr nz,DELAY2
; (7T/12T)salta para repetir.
15789 3d
dec a
; (4T) Diminui contador A, se no for 0,
15790 20 f8
jr nz,DELAY1
; (7T/12T) salta para repetir.
15792 c9
ret
; (10T) fim.

GET_SRATE (15793/#3DB1)
Retorna no acumulador o valor do stepping rate de motor do drive corrente.
HL aponta para a varivel do DOS do drive corrente.
Usada por: GET_NUMTRK, CHANGE_DRV, SCAN_SRATE, TRACK_A, RW_SECTOR.

15793 11 fa 5c
GET_VAR
15796 2a f6 5c
15799 19
15800 7e
15801 c9

ld de,STP_RATE

; DE aponta para incio dos valores de SR.

ld hl,(CUR_DRV)
add hl,de
ld a,(hl)
ret

;
;
;
;

HL = nmero do drive corrente.


HL aponta para a varivel desejada.
Coloca em A o valor da varivel.
Fim.

GET_DTYPE (15802/#3DBA)
Retorna no acumulador o valor do tipo de disco do drive corrente.
HL aponta para a varivel do DOS do drive corrente.
Usada por: ID_TYPE, W_B_SECTS1, FORMAT, 40, GOTO, CHANGE_DRV e TRACK_A.
15802 11 c8 5c
ld de,DSKTYPE
; DE aponta para incio dos tipos de disco
15805 18 f5
jr GET_VAR
; Salta para obter a varivel requisitada.

SCAN_SRATE (15807/#3DBF)
Mede o step rate do motor de passo do cabeote de drive. O teste feito levando o cabeote
para trilha 0, depois para trilha 32 e a seguir para trilha 1. Verifica se o registrador de status do
FDC indica trilha 0; caso positivo, o cabeote nem saiu do lugar e o teste falhou. A seguir move
cabeote para trilha 0 e faz-se novo teste. Desta vez, status deve sinalizar trilha 0. Se o teste
falhar, aumenta o valor de step rate at o valor mximo de 3 (11 em binrio).
15807 cd b1 3d
call GET_SRATE
; HL=varivel de SRATE do drive corrente.
15810 06 08
ld b,8
; Inicia com stepping rate %00001000 (bit
;4 levantado para Head Load).
15812 0e 04
ld c,4
; Contador de 4 possveis valores de
;stepping rate.
SCAN_SR1
15814 70
ld (hl),b
; Guarda o stepping rate.
15815 3e 0b
ld a,#0b
; Comando RESTORE executado, levando
15817 cd 3f 3d
call FDC_CMD_BR
;o cabeote sobre a trilha 0.
15820 3e 20
ld a,32
; A=trilha 32.
15822 06 0b
ld b,#0b
; Comando RESTORE, que se torna SEEK na
15824 cd ed 3d
call FDC_CMD_DT
;execuo da sub-rotina. Move cabeote
;para trilha 32 (SEEK 32).
15827 46
ld b,(hl)
; B=stepping rate.
15828 3e 01
ld a,1
; A=trilha 1.
15830 cd ed 3d
call FDC_CMD_DT
; Move cabeote para trilha 1.
15833 db 1f
in a,(31)
; Verifica bit 2 do registrador de status
15835 e6 04
and %00000100
;do FDC (Track 00),
15837 20 09
jr nz,SCAN_SR2
;se estiver levantado, salta adiante.
15839 af
xor a
; A=trilha 0.
15840 cd ed 3d
call FDC_CMD_DT
; Executa SEEK 0.
15843 db 1f
in a,(31)
; Verifica bit 2 do registrador de status
15845 e6 04
and %00000100
;do FDC (Track 00),
15847 c0
ret nz
;encerra, se estiver levantado.
SCAN_SR2
15848 04
inc b
; Aumenta stepping rate.
15849 0d
dec c
; Diminui contador de tentativas,
15850 c8
ret z
;encerra se estiver zerado.
15851 18 d9
jr SCAN_SR1
; Repete o ciclo.

FDC_CMD_DT (15853/#3DED)
Envia dado contido em A para o registrador de dados e depois o comando contido em B para o
FDC.
Os bits 3 e 4 do byte de comando sero levantados antes de ser enviado ao FDC, portanto:
- se B<32, executa comando SEEK (busca de trilha especificado pelo registrador de dados do
FDC);
- se B<64, executa comando STEP (move uma trilha em direo corrente);
- se B<96, executa comando STEP-IN (move uma trilha para dentro, i.e. aumenta nmero da
trilha).
Usada por: GET_NUMTRK, FORM_DSK, SCAN_SRATE, RD_TRACK,
15853 d3 7f
out (127),a
; Envia A ao registrador de dados do FDC.
15855 78
ld a,b
; Antes de enviar o comando em B, levanta
15856 f6 18
or %00011000
;os bits 3 e 4.

15858 c3 3f 3d

jp FDC_CMD_BR

Envia comando para o FDC.

FDC_CMD_V (15861/#3DF5)
Envia dado contido em A para o registrador de dados e depois o comando contido em B para o
FDC.
Os bits 3 e 4 do byte de comando sero levantados antes de ser enviado ao FDC, portanto:
- se B<32, executa comando SEEK (busca de trilha especificado pelo registrador de dados do
FDC);
- se B<64, executa comando STEP (move uma trilha em direo corrente);
- se B<96, executa comando STEP-IN (move uma trilha para dentro, i.e. aumenta nmero da
trilha).
Por fim verifica se o registrador de trilha igual ao byte enviado ao registrador de dados. Caso
haja alguma diferena, provoca uma pausa de 0,1s.
Usada por TRACK_A.
15861 d3 7f
out (127),a
; Envia nmero da trilha ao FDC.
15863 c5
push bc
; Preserva par BC.
15864 47
ld b,a
; Armazena temporariamente A em B.
15865 db 3f
in a,(63)
; L registrador de trilha do FDC.
15867 b8
cp b
; Compara com valor armazenado.
15868 c1
pop bc
; Recupera par BC.
15869 f5
push af
; Preserva acumulador e flags.
15870 78
ld a,b
; A=comando FDC.
15871 f6 18
or %00011000
; Levanta bits 3 e 4.
15873 cd 3f 3d
call FDC_CMD_BR
; Executa comando (SEEK).
15876 f1
pop af
; Recupera acumulador e flags.
15877 c8
ret z
; Retorna se o valor armazenado da trilha
;era igual ao lido no registrador do FDC.
15878 c5
push bc
; Preserva par BC.
15879 cd a6 3d
call DELAY
; Pausa de 0,147 s.
15882 c1
pop bc
; Recupera par BC.
15883 c9
ret
; Fim.

TRACK_A (15884/#3E0C)
Move cabeote at trilha especificada em A. Para disco face dupla, a partir da trilha lgica
fornecida, deve-se calcular a trilha fsica. Para mais detalhes, vide PHYSTRK.
Se o disco for face dupla, move cabeote para a trilha que metade de C, desprezada a frao.
Se C for par seleciona lado 0, se for mpar, lado 1.
Usada por: RW_B_SECT, RW_SECTOR.
15884 4f
ld c,a
; C=trilha lgica.
15885 cd 98 30
call SIDE0_SEL
; Seleciona lado 0 do disco.
15888 cd ba 3d
call GET_DTYPE
; Verifica se disco de face dupla, se
15891 e6 02
and %00000010
;for, converte trilha lgica em fsica e
15893 c4 47 3e
call nz,PHYSTRK
;seleciona lado do disco apropriado.
15896 c5
push bc
;Preserva par BC.
15897 cb 7e
bit 7,(hl)
; Se disco foi inicializado, bit 7 deve
15899 28 0f
jr z,TRACK_A2
;ser 0 e salta adiante.
15901 cb 46
bit 0,(hl)
; Se disco foi inicializado, bit 7 deve
15903 20 0b
jr nz,TRACK_A2
;ser 1 e salta adiante.
15905 db 3f
in a,(63)
; L registrador de trilha do FDC.
15907 b9
cp c
; Compara com C.
15908 28 05
jr z,TRACK_A1
; Se forem iguais, salta adiante,
15910 07
rlca
;seno transforma trilha lgica em fsica
15911 d3 3f
out (63),a
;e envia para registrador de trilha.
15913 79
ld a,c
; Transforma trilha lgica de C em trilha
15914 07
rlca
;fsica.
TRACK_A1
15915 4f
ld c,a
; C=trilha fsica.
TRACK_A2
15916 cd b1 3d
call GET_SRATE
; A=stepping rate do motor.
15919 47
ld b,a
; B=comando do FDC (SEEK).
15920 79
ld a,c
; A=trilha.
15921 cd f5 3d
call FDC_CMD_V
; Executa comando do FDC.
15924 c1
pop bc
; Recupera par BC.

15925
15926
15928
15931
15932

79
d3 3f
3a cd 5c
b7
c8

ld a,c
out (63),a
ld a,(NOTREADY)
or a
ret z

; A=trilha fsica.
; Envia ao registrador de trilha.
; Verifica flag de disco no pronto (NOT
;READY),
;retorna se for 0, seno faz pausa.

LONGDELAY (15933/#3E3D)
Pausa de 3135225T, cerca de 0,877s.
Usada por: FORMAT, NMI1, RW_SECTOR.
15933 06 03
ld b,3
LONGDELAY1
15935 3e ff
ld a,255
15937 cd a8 3d
call DELAY1
15940 10 f9
djnz LONGDELAY1
15942 c9
ret

; (7T) Repetir 3 vezes.


;
;
;
;

(7T) Inicializa contador.


(17T) Pausa de 1045002T.
(13T/8T) Repetir.
(4T) Fim.

PHYSTRK (15943/#3E47)
Converte o valor da trilha lgica contida no registrador C para trilha fsica. Seleciona lado 1 do
disco se a trilha lgica mpar.
O disco dividido em trilhas lgicas numeradas sequencialmente a partir da trilha 0. Se o disco
tiver somente um lado, a trilha fsica coincide com a trilha lgica. Entretanto, se o disco tiver
dois lados, as trilhas lgicas so armazenadas sequencialmente de forma alternada entre o
lado 0 e o lado 1; isto feito para economizar movimento de cabeote quando se l trilhas de
forma sequencial.
O algoritmo para converter trilha lgica em trilha fsica consiste em:
- rodar os bits para direita (equivale a dividir por 2) do byte que representa o nmero da trilha;
- verifica o bit 0 que passou para o flag CARRY (equivale ao resto da diviso); se for 1,
seleciona o lado 1, seno permanece o lado 0.
Usada por TRACK_A.
15943 79
ld a,c
; A=nmero da trilha.
15944 b7
or a
; Zera flag CARRY, que ocupar o bit 7.
15945 1f
rra
; Roda valor da trilha.
15946 4f
ld c,a
; C recebe valor da trilha fsica.
15947 d0
ret nc
; Finaliza se CARRY=0,
15948 c3 a3 30
jp SIDE1_SEL
;seno salta para selecionar lado 1.

RD_TRACK (15951/#3E4F)
Rotina que faz a leitura do registrador de trilhas do FDC, move cabeote para a referida trilha e
faz leitura no disco, para localiz-la.
Executa comando FDC que est no registrador B com bits 3 e 4 levantados (SEEK).
Antes de executar o comando, carrega o registrador de dados do FDC com o valor do
registrador de trilha.
A seguir faz leitura do ID do disco com comando READ ADDRESS. Se for bem sucedido, retorna
com registrador H contendo o valor da trilha lida.
Usada por: TRKFETCH, FORMAT.
15951 cd 98 30
call SIDE0_SEL
; Seleciona lado 0 do disco.
RD_TRACK1
15954 db 1f
in a,(31)
; L registrador de status do FDC, mantm
15956 e6 80
and %10000000
;s o bit 7 (NOT READY) e zera os outros
15958 32 cd 5c
ld (NOTREADY),a
;e guarda na varivel de sistema.
15961 db 3f
in a,(63)
; L registrador de trilha do FDC e
15963 67
ld h,a
;armazena em H.
15964 cd ed 3d
call FDC_CMD_DT
; Comando SEEK A, move para trilha A.
15967 0e 7f
ld c,127
; C=porta 127.
15969 16 01
ld d,1
; Inicializa somente o byte alto do conta;dor de tentativas DE.
15971 3e c0
ld a,#c0
; Envia comando READ ADDRESS para o reg.
15973 d3 1f
out (31),a
;de comandos do FDC.
15975 c5
push bc
; Preserva par BC.
15976 06 03
ld b,3
; Inicializa B. B e DE formam um contador
;de 3 bytes de tentativas de leituras do
;status do FDC.
RD_TRACK2

15978 db
15980 e6
15982 20
15984 13
15985 7b
15986 b2
15987 20
15989 10
15991 c1
15992 3e
15994 d3
15996 3a
15999 fe
16001 c8
NO_DISK

ff
c0
1d

f5
f3
d0
1f
d1 5c
ff

in a,(255)
and %11000000
jr nz,RD_TRACK3
inc de
ld a,e
or d
jr nz,RD_TRACK2
djnz RD_TRACK2
pop bc
ld a,#d0
out (31),a
ld a,(ERR_NODSK)
cp #ff
ret z

; L registrador de status do FDC e


;verifica se bits 6 ou 7 esto levantados.
; Se sim, salta adiante.
; Se no, aumenta contador de tentativas
;e repete at DE=0.
;
; Recupera par BC.
; Envia comando FORCE INTERRUPT ao FDC.
; Se flag for #ff
;retorna sem sinalizar erro.

Tratamento de erro de disco ausente do drive.


16002 cd 9f 37
call ERROR_R
; Emite erro R.
16005 3e ff
ld a,#ff
; Ativa flag para preservar contedo do
16007 32 17 5d
ld (SAVEBUF),a
;buffer de impressora no disco.
16010 c3 8f 37
jp NO_DISK1
; Salta para tratar erro.
RD_TRACK3
Recebe em H a trilha contida na ID da trilha lida no disco.
16013 c1
pop bc
; Recupera par BC.
16014 ed 60
in h,(c)
; Recebe dado do FDC.
RD_TRACK4
L os outros dados da ID no disco (para maiores detalhes, ver datasheet do TMS2793), porm
so desprezados. .
16016 db ff
in a,(255)
; L registrador de status do FDC e
16018 e6 c0
and %11000000
;verifica se bits 6 ou 7 esto levantados,
16020 28 fa
jr z,RD_TRACK4
;se no
16022 f8
ret m
; Se bit 7=1, isto ,
16023 db 7f
in a,(127)
;
. 
16025 18 f5
jr RD_TRACK4
;
. .

SV_START_S (16027/#3E9B)

Salva temporariamente setor do disco em A para operao de leitura/escrita.


Usada por: RW_B_SECT.
16027 32 ff 5c
ld (START_S_T),a
16030 c9
ret

SV_RW_ADD (16031/#3E9F)
Salva temporariamente endereo da RAM apontado por HL para operao de leitura/escrita.
Usada por: RW_B_SECT.
16031 22 00 5d
ld (RW_ADD_T),hl
16034 c9
ret

W_SECTOR (16035/#3EA3)
Grava setor indicado pela varivel de sistema do DOS START_S_T no disco.
Usada por RW_B_SECT.
16035 3e a0
ld a,#a0
; Comando WRITE SECTOR do FDC.
16037 18 02
jr RW_SECTOR
; Salta adiante.

R_SECTOR (16039/#3EA7)
Faz leitura do setor indicado pela varivel de sistema do DOS START_S_T no disco.
Usada por RW_B_SECT.
16039 3e 80
ld a,#80
; Comando READ SECTOR do FDC.
RW_SECTOR
parte comum para R_SECTOR e W_SECTOR.
16041 32 fe 5c
ld (FDC_RW_CMD),a ; Armazena comando na varivel do DOS.
RW_SECTOR1
16044 16 0a
ld d,10
; Nmero de tentativas em caso de erro.
RW_SECTOR2

16046 d5
16047 3a ff 5c
16050 3c
16051
16053
16056
16058
16061
16063
16065
16066
16069
16070
16073
16074
16076
16077
16079

d3
2a
0e
3a
d3
fe
f5
cc
f1
c4
d1
db
47
e6
c8

5f
00 5d
7f
fe 5c
1f
a0
50 3f
6b 3f
1f
7f

push de
ld a,(START_S_T)
inc a

; Preserva par DE.


; A=nmero do setor.
; Incrementa nmero do setor (no disco,
;os setores so numerados de 1 a 16).
out (95),a
; Envia para registrador de setor do FDC.
ld hl,(RW_ADD_T)
; HL=endereo p/ leitura ou escrita.
ld c,127
; C=porta 127.
ld a,(FDC_RW_CMD) ; Pega o comando armazenado e envia ao
out (31),a
;registrador de comando do FDC.
cp #a0
; Verifica se comando WRITE SECTOR.
push af
; Preserva acumulador e flags.
call z,W_DATA_FDC ; Se WRITE, escreve dados no FDC.
pop af
; Recupera acumulador e flags.
call nz,R_DATA_FDC ; Se READ, recebe dados do FDC.
pop de
; Recupera par DE.
in a,(31)
; Faz leitura do STATUS do FDC que
ld b,a
; armazenado em B.
and %01111111
; Se todos os bits entre 0-6 estiverem
ret z
;abaixados, no h erros e finaliza,
;seno prossegue.

RW_SECTOR3
16080 21 7d 39
ld hl,M_RDONLY
; Mensagem: Read Only.
16083 e6 40
and %01000000
; Verifica bit 6 (PROTECTED) do STATUS,
16085 20 0b
jr nz,RW_SECTOR5
;se for 1, salta adiante.
16087 78
ld a,b
16088 e6 04
and %00000100
; Verifica bit 2 (LOST DATA) do STATUS,
16090 28 5a
jr z,RW_SECTOR9
;se for 0,salta adiante.
16092 15
dec d
; Diminui contador, se no der 0
16093 20 cf
jr nz,RW_SECTOR2
; faz nova tentativa.
RW_SECTOR4 acusa erro.
16095 21 87 39
ld hl,M_DISC_ERR
; Mensagem: Disc Error
RW_SECTOR5
16098 3e d0
ld a,#d0
; Envia ao FDC o comando FORCE INTERRUPT
16100 d3 1f
out (31),a
;para interromper comando em andamento.
16102 78
ld a,b
16103 e6 01
and %00000001
; Verifica bit 0 (BUSY) do STATUS,
16105 c2 82 3e
jp nz,NO_DISK
;se for 1 acusa erro de drive sem disco.
O trecho a seguir verifica se se trata da trilha 0/setor 9 (10 no disco). Esta a parte da trilha 0
que armazena temporariamente o buffer da impressora quando o disco no est protegido.
Qualquer erro nesta rea silenciosamente ignorado.
16108 db 3f
in a,(63)
; L registrador de trilhas do FDC,
16110 b7
or a
;se no for 0,
16111 20 05
jr nz,RW_SECTOR6
;salta adiante.
16113 db 5f
in a,(95)
; L registrador de setor do FDC,
16115 fe 0a
cp 10
;se for 10,
16117 c8
ret z
;retorna.
RW_SECTOR6
16118 e5
push hl
; Preserva par HL.
16119 cd 33 2e
call BAS_CLS
; Apaga tela.
16122 e1
pop hl
; Recupera par HL.
16123 df
rst 24
; Imprime mensagem de erro.
16124 21 b8 39
ld hl,M_TRK
; Imprime Trk
16127 df
rst 24
16128 db 3f
in a,(63)
; L registrador de trilhas do FDC,
16130 cd 0c 39
call PRINT_A
;e imprime seu valor.
16133 21 bd 39
ld hl,M_SEC
; Imprime sec
16136 df
rst 24
16137 db 5f
in a,(95)
; L registrador de setor do FDC,
16139 cd 0c 39
call PRINT_A
;e imprime seu valor.
16142 21 a3 39
ld hl,M_RETRY
; Imprime Retry,Abort,Ignore?
16145 df
rst 24
RW_SECTOR7

16146 cd 15 25
call RDKEY
16149 fe 49
cp 73
16151 c8
ret z
16152 fe 52
cp 82
16154 28 0f
jr z,RW_SECTOR8
16156 fe 41
cp 65
16158 20 f2
jr nz,RW_SECTOR7
16160 cd 9f 37
call ERROR_R
16163 3e 07
ld a,7
16165 32 0f 5d
ld (CL_ELINE),a
16168 c3 70 21
jp CMD-RET
RW_SECTOR8 repete a operao.
16171 db 3f
in a,(63)
16173 cd 0c 3e
call TRACK_A
16176 cd 3d 3e
call LONGDELAY
16179 c3 ac 3e
jp RW_SECTOR1
RW_SECTOR9
16182 15
dec d
16183 ca df 3e
jp z,RW_SECTOR4
16186 d5
push de
16187 cd b1 3d
call GET_SRATE
16190 e6 02
and %00000010
16192 20 01
jr nz,RW_SECTOR_10
16194 34
inc (hl)
RW_SECTOR_10
16195 cd 3d 3d
call RESTORE
16198 3a f5 5c
ld a,(START_T)
16201 cd 0c 3e
call TRACK_A
16204 d1
pop de
16205 c3 ae 3e
jp RW_SECTOR2

; Aguarda tecla ser pressionada.


; Se for I,
;finaliza.
; Se for R,
;salta adiante.
; Se no for A,
;salta para trs para repetir o lao.
; Define erro R.
; Flag para no limpar linha de edio.
; Sai do comando DOS.
;
;
;
;

L registrador de trilha do FDC.


Move para a trilha lida.
Aguarda 0,8s.
Repete desde o incio.

; Diminui contador, se resultar 0,


;salta para acusar erro de disco.
; Preserva par DE.
; Verifica stepping rate do motor, se
;for <= 2,
;salta adiante para nova tentativa.
; Aumenta stepping rate.
; Move cabeote para trilha 0.
; Move cabeote para trilha inicial.
; Recupera par DE.
; Faz nova tentativa.

W_DATA_FDC (16208/#3F50)
Envia dados requisitados pelo FDC na execuo de um comando. Os dados devem estar no
endereo apontado pelo par HL, e C deve conter endereo da porta 127 (registrador de dados).
Usada por RW_SECTOR.
16208 06 04
ld b,4
; Contador de tentativas.
W_DATAFDC1
16210 db ff
in a,(255)
; L registrador secundrio do Beta e
16212 e6 c0
and %11000000
;verifica se bit 6 ou 7 est levantado,
16214 20 0f
jr nz,W_DATAFDC3
;se sim, salta adiante.
16216 13
inc de
; Aumenta contador DE.
16217 7b
ld a,e
16218 b2
or d
; Se DE no for 0,
16219 20 f5
jr nz,W_DATAFDC1
;repete leitura da porta 255.
16221 10 f3
djnz W_DATAFDC1
; Seno, repete at B=0.
16223 c9
ret
; Retorna.
W_DATAFDC2
16224 db ff
in a,(255)
; L registrador secundrio do Beta e
16226 e6 c0
and %11000000
;verifica se bit 6 ou 7 est levantado.
16228 28 fa
jr z,W_DATAFDC2
; Se no, repete a leitura.
16230 f8
ret m
; Se sim, retorna se bit 7 est levantado,
;porque INTRQ do FDC sinaliza comando
;terminado.
W_DATAFDC3
16231 ed a3
outi
; Se no, envia dado em (HL) para porta
;127, pois bit 6 (DRQ) sinaliza que FDC
;aguarda dados.
16233 18 f5
jr W_DATAFDC2
; Repete o ciclo.

R_DATA_FDC (16235/#3F6B)
Recebe dados requisitados pelo FDC durante execuo de um comando. Os dados sero
gravados no endereo apontado pelo par HL, e C deve conter endereo da porta 127
(registrador de dados).

Usada por RW_SECTOR.


16235 06 04
ld b,4
R_DATAFDC1
16237 db ff
in a,(255)
16239 e6 c0
and % 11000000
16241 20 0f
jr nz,R_DATAFDC3
16243 13
inc de
16244 7b
ld a,e
16245 b2
or d
16246 20 f5
jr nz,R_DATAFDC1
16248 10 f3
djnz R_DATAFDC1
16250 c9
ret
R_DATAFDC2 (16251/3F7B)
Usada
16251
16253
16255
16257

por: PHYSFMT
db ff
e6 c0
28 fa
f8

e NMI_RDSEC.
in a,(255)
and %11000000
jr z,R_DATAFDC2
ret m

R_DATAFDC3
16258 ed a2

ini

16260 18 f5

jr R_DATAFDC2

; Contador de tentativas.
; L registrador secundrio do Beta e
;verifica se bit 6 ou 7 est levantado,
;se sim, salta adiante.
; Aumenta contador DE.
; Se DE no for 0,
;repete leitura da porta 255.
; Seno, repete at B=0.
; Retorna.

; L registrador secundrio do Beta e


;verifica se bit 6 ou 7 est levantado.
; Se no, repete a leitura.
; Se sim, retorna se bit 7 est levantado,
;porque INTRQ do FDC sinaliza comando
;terminado.
; Se no, recebe dado de porta 127 em
;(HL), pois bit 6 (DRQ) sinaliza ele est
;disponvel para leitura no FDC.
; Repete o ciclo.

FET_FLDIR (16262/#3F86)
Procura entrada de um arquivo no diretrio que no tenha sido apagado. HL deve conter
apontador para o item do diretrio.
Se HL estiver alm do buffer de impressora, carrega prximo setor da rea de diretrio do
disco.
Se o primeiro byte do nome do arquivo for 0, sai e imprime nmero de setores livres e sai do
comando.
Se o primeiro byte for 1, busca prximo arquivo que no tenha sido deletado, at atingir o final
do diretrio.
16262 cd 73 24
call NXT_DIR_S
; Se necessrio, carrega prximo setor da
;rea de diretrio do disco.
16265 7e
ld a,(hl)
; Se o primeiro byte da entrada for 0 (fim
16266 b7
or a
;do diretrio),
16267 ca 2b 23
jp z,FET_FLDIR1
;salta.
16270 fe 01
cp 1
; Se for 1 (arquivo apagado por ERASE),
16272 cc 6e 24
call z,ADDHL16
;busca prxima entrada no diretrio.
16275 c0
ret nz
; Retorna se A no for 1,
16276 18 f0
jr FET_FLDIR
;seno, tenta prxima entrada.
LD_BUFFER1
Semelhante a LD_BUFFER, mas atribui antes #AA para o flag SAVEBUF.
16278 3e aa
ld a,#aa
16280 32 17 5d
ld (SAVEBUF),a

LD_BUFFER (16283/#3F9B)
Recupera o contedo do buffer de impressora (23296-23551) gravado no setor 9 da trilha 0 do
disco.
16283 af
xor a
; Flag 0 sinaliza leitura de setor.
16284 18 02
jr LS_BUFFER
; Salta adiante.

SV_BUFFER (16286/#3F9E)
Salva o contedo do buffer de impressora (23296-23551) no setor 9 da trilha 0 do disco.
16286 3e ff
ld a,#ff
; Flag #ff sinaliza gravao de setor.
LS_BUFFER rotina em comum entre LD_BUFFER e SV_BUFFER.
16288 32 ce 5c
ld (FLAGRW),a
; Guarda flag de leitura/gravao.
16291 11 09 00
ld de,#0009
; D=trilha 0, E=setor 9.

sub_3fa6h:
16294 06 01
16296 21 00 5b
16299 c3 14 2f

ld b,1
ld hl, BUFFER
jp RW_B_SECT1

; Ler/salvar 1 setor.
; Endereo inicial.
; Salta para ler/salvar setor.

sub_3faeh:
16302 e5
16303 ed 5b
16307 cd a6
16310 3a db
16313 d1
16314 b7
16315 28 d9
16317 4f
16318 21 00
16321 ed b0
16323 18 d1

push hl
ld de,(START_S)
call sub_3fa6h
ld a,(NUMVAL)
pop de
or a
jr z,LD_BUFFER1
ld c,a
ld hl, BUFFER
ldir
jr LD_BUFFER1

;
; D=trilha inicial, E=setor inicial.
;
;
: . \
;
.
;
.
;
( .
;
O
;
! . [
;
. .
;
. .

f4 5c
3f
5c

5b

CMD_CODE (16325/#3FC5)
Tabela com cdigo de 1 byte (palavras-chaves
16325 cf
defb #cf
;
16326 2a
defb #2a
;
16327 d0
defb #d0
;
16328 d1
defb #d1
;
16329 e6
defb #e6
;
16330 d2
defb #d2
;
16331 ef
defb #ef
;
16332 f8
defb #f8
;
16333 fe
defb #fe
;
13334 be
defb #be
;
16335 f4
defb #f4
;
16336 d5
defb #d5
;
16337 f7
defb #f7
;
16338 d3
defb #d3
;
16339 d4
defb #d4
;
16340 ff
defb #ff
;
16341 34
defb #34
;
16342 ec
defb #ec
;
16343 38
defb #38
;

BASIC) dos comandos do DOS.


CAT
*
FORMAT
MOVE
NEW
ERASE
LOAD
SAVE
RETURN
PEEK
POKE
MERGE
RUN
OPEN
CLOSE
COPY
4
GOTO
8

CMD_ADDR (16344/#3FD8)
Tabela com os endereos dos comandos DOS.
16344 b2 23
defw 9138
; CAT
16346 a1 24
defw 9377
; *
16348 6f 2f
defw 12143
; FORMAT
16350 ff 27
defw 10239
; MOVE
16352 b7 24
defw 9399
; NEW
16354 2b 27
defw 10027
; ERASE
16356 4c 29
defw 10572
; LOAD
16358 7a 2b
defw 11130
; SAVE
16360 94 2d
defw 11668
; RETURN
16362 73 2a
defw 10867
; PEEK
16364 77 2a
defw 10871
; POKE
16366 7f 2a
defw 10879
; MERGE
17389 df 2d
defw 11743
; RUN
16370 13 32
defw 12819
; OPEN
16372 c7 36
defw 14023
; CLOSE
16374 45 26
defw 9797
; COPY
16376 3c 39
defw 14642
; 4
16378 d0 3a
defw 15056
; GOTO
16380 53 39
defw 14675
; 8
16382 ff ff
defb 255,255
; No usados.
;

end

RAM de vdeo (16384-23295/#4000-#5AFF)


Bitmap de vdeo (16384-22527/#4000-#57FF)
16384

defs 6144

Atributos (22528-23295/#5800-#5A99)
22528

defs 768

Buffer da impressora (23296-23551/#5B00-#5BFF)


Esta rea usada para vrias finalidades.
23296
defs 256
O buffer usado temporariamente para armazenar o setor de configurao do disco (setor 8
da trilha 0). Segue-se a estrutura do setor de configurao.
Desloc.

Nome

Tam.

225

+225

CS_FREES

Setor do incio da rea livre do disco.

+226

CS_FREET

Trilha do incio da rea livre do disco.

+227

CS_FORMT

Tipo de formatao do disco:


#16 = 80 trilhas face dupla;
#17 = 40 trilhas face dupla;
#18 = 80 trilhas face simples;
#19 = 40 trilhas face simples.

+228

CS_NFILE

Nmero total de arquivos no disco, inclusive os apagados.

+229

CS_NFREE

Nmero de setores livres do disco.

+231

CS_IDENT

Byte #10 identifica disco padro BETA.

+232

No usados, contm 0.

+234

No usados, contm espaos.

+243

No usado.

+244

CS_DELET

Nm. de arq. apagados no disco.

+245

CS_LABEL

Rtulo do disco.

+252

No usados, contm 0.

+0

Descrio
No usados, contm 0.

Variveis de sistema do BASIC


LASTK
Cdigo de caractere da ltima tecla pressionada.
23560
defs 1
;#5c08
REPDEL
Nmero de interrupes (em 1/50 ou 1/60 segundo) antes da repetio de uma tecla
pressionada.
23561
defs 1
;#5c09
REPPER
Nmero de interrupes (1/50 ou 1/60 segundo) entre uma repetio a outra de uma tecla
pressionada.
23562
defs 1
;#5c0a
TVDATA
Bytes com argumentos de cores ou dos controles AT e TAB a ser enviado TV.

23566
STRMS

defs 2

Endereos dos canais ligados a streams.


23568
defs 38
CHARS

;#5c0e

;#5c10

Endereo 256 bytes menor que a tabela com bitmaps de caracteres (normalmente na ROM
BASIC, em 15616).
23606
defs 2
;#5c36
RASP
Durao do BEEP de aviso.
23608
defs 1
PIP

;#5c38

Durao do clique de teclado.


23609
defs 1
ERR_NR

;#5c39

Cdigo de erro corrente menos 1. O registrador IY contm este valor.


23610
defs 1
;#5c3a
FLAGS
Fica em (iy+1). Vrios flags que controlam o sistema BASIC:
bit 7, durante passagem pela linha de comando, 1=execuo, 0=verificao da sintaxe;
bit 6, resultado da interpretao de uma expresso, 1=numrico, 0=string.
bit 5, 1 quando uma nova tecla foi pressionada e armazenada em LASTK;
bit 3,
bit 1, 1 se PRINT envia dados para impressora, ou 0 se envia para tela de TV;
bit 0, 1 se no se deve imprimir espao aps uma palavra chave.
23611
defs 1
;#5c3b
5c3c
ERR_SP
Endereo do item da pilha do Z80 usado para retorno de erro.
23613
defs 2
;#5c3d
LISTSP
Endereo de retorno da listagem automtica.
Usada pelo DOS para outra finalidade.
23615
defs 2
;#5c3f
NEWPPC
Nmero da linha de comando BASIC a ser executado a seguir.
23618
defs 2
;#5c42
NSPPC
Nmero da instruo dentro da linha a ser executado a seguir.
23620
defs 1
;#5C44
BORDCR
Cor da borda da tela nos bits 3 a 5, mais os atributos das linhas inferiores da tela.
23624
defs 1
VARS
Endereo de incio da rea de variveis do BASIC.
23627
defs 2

5c4d

DEST

defs 2

CHANS
Endereo de incio da rea da informao dos canais.
23631
defs 2
;#5c4f
CURCHL
Endereo da informao relativa ao canal corrente de entrada/sada.
23633
defs 2
;#5c51
PROG
Endereo do inicio da rea do programa BASIC.
23635
defs 2
;#5c53
DATADD
Endereo da rea de BASIC do caractere seguinte ao lido pelo comando READ.
23639
defs 2
;#5c57
E_LINE
Endereo de incio da linha de edio.
23641
defs 2
K_CUR

;#5c59

Endereo do cursor.
23643
CH_ADD

;#5c5b

defs 2

Endereo do prximo caractere a interpretar.


23645
defs 2
;#5c5d
WORKSP
Endereo do incio do espao de trabalho temporrio.
23649
defs 2
;#5c61
STKBOT
Endereo do incio da pilha do calculador.
23651
defs 2
STKEND

;#5c63

Endereo do incio da RAM livre.


23653
defs 2
BREG

;#5c65

Registrador B da calculadora.
23655
defs 1

;#5c67

FLAGS2
Vrios flags.
Bit 1: 0=buffer de impressora limpa.
23658
defs 1
;#5c6a
DF_SZ
Nmero de linhas na parte inferior da tela.
23659
defs 1

;#5c6b

T_ADDR
Endereo do item seguinte na tabela de sintaxe.
23668
defs 2
;#5c74
UDG
Endereo da tabela dos bitmaps dos caracteres definidos pelo usurio (UDG).
23675
defs 2
;#5c7b

P_POSN
Posio X da impresso por LPRINT.
23679
defs 1
PR_CC

;#5c7f

LSB do endereo da posio de impresso para LPRINT (MSB deve ser #5b).
23680
defs 1
;#5c80
SPARE1
No usado pelo BASIC.
23681
defs 1

;#5c81

S_POSN
Coordenada da posio de impresso da parte superior da tela. Coordenadas -y (24-linha) e x
(33-coluna).
23688
defs 2
;#5c88
SCR_CT
Nmero de scrolls a realizar menos 1.
23692
defs 1
ATTR_P

;#5c8c

Atributos permanentes correntes.


23693
defs 1
ATTR_T
Atributos temporrios correntes.
23695
defs 1
RAMTOP
Endereo do ltimo byte disponvel da RAM para o sistema BASIC.
23730
defs 2
P_RAMT
Endereo do ltimo byte disponvel da RAM (32767 para 16k, 65535 para 48k).
23732
defs 2

Variveis de sistema do DOS


As variveis de sistema do DOS ocupam 112 bytes em 23734-23845 (#5cb6 -#5d25).
CHANSDATA
Contm dados dos canais "K", "S", "R" e "P" do BASIC.
23734
defs 21
;#5cb6
DSKTYPE
Tipo de disco para os drives 0 a 3 (A a D).
bit 0 = 0 para 40 trilhas, 1 para 80 trilhas
bit 1 = 0 para disco face simples, 1 para face dupla.
bit 7 = 0 para 40 trilhas, 1 para 80 trilhas
Se tiver valor #ff, significa que esta varivel foi inicializada e deve ser atualizada (nmero de
trilhas).
23752
defs 1
;#5cc8, drive 0 (A).
23753
defs 1
;#5cc9, drive 1 (B).
23754
defs 1
;#5cca, drive 2 (C).
23755
defs 1
;#5ccb, drive 3 (D).
TR0SECT
Setor da trilha 0 para ser lido do disco.
23756
defs 1
NOTREADY

;#5ccc

Flag, armazena bit 7 do registrador de status do controlador (porta #1f), 0 se o FDC estiver

pronto (ready), 1 se no estiver pronto.


23757
defs 1
FLAGRW

;#5ccd

Flag, #00 para leitura e #ff para escrita de disco.


23758
defs 1
;#5cce
WRKSPADDR
Endereo de rea reservada no espao de trabalho temporrio do BASIC.
23759
defs 2
;#5ccf
ERR_NODSK
Flag de tratamento de erro de ausncia de disco no drive: #ff=ignorar erro, #00=fazer
tratamento de erro.
Tambm usado para armazenar a linha de autoexecuo de um comando SAVE n$ LINE
linha. Nesse caso, ocupa 2 bytes, e junta-se com VARNAME.
23761
defs 1
;#5cd1
VARNAME
Armazena nome de varivel BASIC. Note-se que no o cdigo ASCII do nome da varivel, pois
o sistema BASIC usa os bits 5 a 7 para outros propsitos.
23762
defs 1
;#5cd2
ERASED
Armazena nmero da entrada (0-127) de um arquivo apagado.
23764
defs 1
;#5cd4
Usado por FORMAT para contar nmero de trilhas com erro durante a verificao.
23766
;#5cd6
NUM_TRK
Nmero de trilhas do disco: #00=40 trilhas, #80=80 trilhas.
Usado tambm pelo SAVE para armazenar endereo do incio da rea de programa BASIC
(neste caso ocupa 2 bytes).
FORMAT usa para armazenar temporariamente nmero de setores livres.
OPEN usa para armazenar tamanho do registro +1.
23767
defs 1
;#5cd7
VERIFY
Flag, 0=no verificar trilha depois de format-la (vide PHYSFMT).
Usado tambm como byte mais significativo em certas operaes, junto com NUM_TRK.
23768
defs 1
;#5cd8
GENERAL
Espao de uso geral.
23769
defs 2
NUMVAL

;#5cd9

Armazena nmero inteiro de 2 bytes guardado na pilha de calculadora.


23771
defs 2
;#5cdb
A rea seguinte contm dados de uma entrada do diretrio de disco que pode ser gravado ou
lido. Uma entrada do diretrio tem 16 bytes de comprimento.
FILENAME
Deslocamento +0.
Espao de 8 bytes de armazenamento de string correspondente a nome do arquivo. Usado
ainda pelo comando FORMAT para armazenar o rtulo (ttulo) do disco.
23773
defs 8
;#5cdd
FILETYPE
Deslocamento +8.
Tipo de arquivo, "B"=BASIC, "C"=CODE, "D=DATA e "#"=arquivo aberto com OPEN#.
23781
defs 1
;#5ce5
FILEDATA1
Deslocamento +9.

Tamanho do arquivo tipo BASIC, endereo inicial do arquivo tipo CODE, endereo do incio de
dados da matriz de arquivo tipo DATA, ou valor do registrador SP para arquivo tipo CODE salvo
com boto mgico.
23782
defs 2
;#5ce6
FILEDATA2
Deslocamento +11.
Tamanho do programa BASIC (sem as variveis), comprimento do bloco tipo CODE ou tamanho
de dados da matriz para arquivos DATA.
23784
defs 2
;#5ce8
FILESIZE
Deslocamento +13.
Nmero de setores ocupado pelo arquivo.
23786
defs 1
FILESECT
Deslocamento +14
Setor inicial do arquivo.
23787
defs 1
FILETRCK
Deslocamento +15
Trilha inicial do arquivo.
23788
defs 1
FILETEMP

;#5cea

;#5ceb

;#5cec

Guarda temporariamente os contedos das variveis de sistema do DOS FILEDATA1 a


FILETRCK.
23789
defs 7
;#5ced
START_S
Setor inicial para leitura / escrita.
23796
defs 1
START_T

;5cf4

Trilha inicial para leitura / escrita.


23797
defs 1
CUR_DRV

;5cf5

Nmero do drive selecionado corrente (0 a 3).


23798
defs 1
;#5cf6
ZERO1
Byte no usado, deve ser sempre zero.
23799
defb 0
CUR_DRVT

;#5cf7

Armazena temporariamente o contedo de CUR_DRV.


23800
defs 1
;#5cf8
DESTDRV
Drive de destino em uma instruo COPY.
23801
defs 1
STP_RATE

;#5cf9

Stepping rate para cada um dos drives 0 a 3 (A a D).


Se ele no foi inicializado, contm #ff.
23802
defs 1
;#5cfa, disco 0 (A).
23803
defs 1
;#5cfb, disco 1 (B).
23804
defs 1
;#5cfc, disco 2 (C).
23805
defs 1
;#5cfd, disco 3 (D).
FDC_RW_CMD
Contm comando a ser enviado para o FDC, #88=READ SECTOR, #A8=WRITE SECTOR .
23806
defs 1
;#5cfe
START_S_T
Armazena temporariamente o setor inicial para operao de leitura ou escrita. Vide

SV_START_S.
23807
RW_ADD_T

defs 1

;#5cff

Armazena temporariamente o endereo de RAM para qual feita a leitura, ou a partir a qual
feita a escrita. Vide SV_RW_ADD.
23808
defs 2
;#5d00
HLTEMP
Armazena temporariamente o valor do registrador HL, enquanto feita uma chamada a uma
rotina da ROM BASIC.
23810
defs 2
;#5d02
DETEMP
Armazena temporariamente o valor do registrador DE, enquanto feita uma chamada a uma
rotina da ROM BASIC.
23812
defs 2
;#5d04
CMP_SIZE
Nmero de bytes que devem ser comparados entre o nome do arquivo na linha de comando, e
o nome na entrada do diretrio. Se for 9, compara o nome e o tipo (B, C, D ou #) do arquivo.
Se for 10, compara tambm primeiro byte do FILEDATA1 (usado para arquivo #). Vide
SEEKFILE.
23814
defs 1
;#5d06
NOFILE
Flag, 0=arquivo no existe.
23815
defs 1
FNAME1

;#5d07

Utilizado pelo comando ERASEFILE para armazenar temporariamente a primeira letra do nome
do arquivo.
23816
defs 1
;#5d08
OP_F_MODE
Modo do arquivo aberto pelo comando OPEN #. Pode assumir valores R (modo leitura), W
(modo escrita), RND (acesso aleatrio).
23817
defs 1
;#5d09
23818
CPALLDIR
Contador usado por COPYALL para varrer itens do diretrio.
23821
defs 1
;5d0d
CLR_WSP
Se #ff, sinaliza para limpar a rea de trabalho e a pilha da calculadora.
Se #fe, sinaliza PR_IMMED para no imprimir mensagem em modo imediato.
23822
defs 1
;5d0e
CL_ELINE
Se for 0 faz com que a linha de edio (apontada por E-LINE) seja limpa.
23823
defs 1
;#5d0f
EXECLOAD
Se for 0, assume que est se executando comando LOAD.
Se for #ff, executado PEEK, e se for #ee, executado POKE.
23824
defs 1
;#5d10
CMDADDR
Endereo de incio do comando a ser interpretado pelo DOS.
23825
defs 2
;5d11
ERRSP_T
Armazena temporariamente a varivel ERR_SP, cujo valor alterado pelo DOS.
23827
defs 2
;#5d13
DOSMODE
Modo imediato (#00), os comandos so executados ao serem digitados no prompt do DOS

(tipicamente quando
Modo interpretado
(tipicamente quando
23829
STAT255

se entra no DOS por USR 15360).


(#ff), os comandos so executados pelo interpretador do BASIC
se entra no DOS por USR 15363).
defs 1
;#5d15

O que escrito na porta de status secundria (255) no pode ser lido. Por isso, cada vez que
se faz um OUT nesta porta, o valor armazenado nesta varivel do DOS.
23830
defs 1
;#5d16
SAVEBUF
Flag que indica se o contedo do buffer de impressora deve ser salvo no disco. Adicionalmente,
sinaliza para inicializar as variveis do DOS Beta.
#00 = buffer de impressora no deve ser salvo no disco,
#ff = buffer de impressora deve ser salvo no disco e recuperado aps comando,
#aa = inicializar as variveis do DOS.
23831
defs 1
;#5d17
IF1
Sinaliza se a Interface 1 est presente, #00=Interface I ausente, #ff=interface 1 presente e as
variveis do BASIC estendido devem ser salvas.
23832
defs 1
;#5d18
DFLT_DRV
Nmero de drive (0 a 3) default. Este valor assumido quando no for especificado no
comando DOS.
23833
defs 1
;#5d19
DOSCMDRET
Endereo de retorno quando termina execuo do comando DOS.
23834
defs 2
;#5d1a
OLDSP
Antigo valor do registrador SP do Z80, alterado em duas posies pelo DOS.
23836
defs 2
;#5d1c
FILEPOS
Posio do arquivo no diretrio.
23838
defs 1
FLG_RFPC

;#5d1e

Indica que os 6 bytes de ponto flutuante criada durante e anlise de sintaxe dos comandos
deve ser eliminada antes da representao do comando.
23839
defs 1
;#5d1f
ELINE_T
Guarda temporariamente 3 bytes da linha de edio.
23840
defs 3
;#5d20
FREERAM_S
Nmero de setores que cabem dentro da RAM livre. O valor mximo 16, pois as operaes do
DOS ocupam no mximo 4096 bytes (16 setores de 256 bytes).
23843
defs 1
;#5d23
23844

Portas de entrada e sada da interface Beta


Porta

Como entrada

Como sada

31/#1f

Registrador STATUS do FDC

Registrador de COMANDO do FDC

63/#3f

Registrador de TRILHA do FDC

Registrador de TRILHA do FDC

95/#5f

Registrador de SETOR do FDC

Registrador de SETOR do FDC

127/#7f Registrador de DADOS do FDC

Registrador de DADOS do FDC

252/#fc - No disponvel -

Porta de configurao da interface. Por ser porta par, aciona a


ULA do TK tambm.
-Bit 0 a 2: cor da borda da tela.
-Bit 3: sada de som.
-Bit 4: sada do MIC.
-Bit 5: no usado.
-Bit 6: 0 habilita acesso da ROM Beta na rea 15360-15615
(ponte debloqueada); 1 desabilita esse acesso (ponte
bloquada).
-Bit 7: 0 habilita IO com interface Beta e desabilita com
expanso externa (SELETOR desbloquado); 1 faz o inverso
(SELETOR bloqueado).

255/#ff

Porta de status secundria.


-Bits 0 e 1: seleo de drive (00=A, 01=B, 10=C e 11=D).
-Bit 2: /MASTER RESET do FDC, deve ser mantido em 1.
-Bit 3: /HLT do FDC, se 1 informa FDC que o cabeote est
pronto para atuar, deve ser mantido em 1.
-Bit 4: SIDE SELECT do drive, 1 seleciona lado 0 do disco, 0
seleciona lado 1.
-Bit 5: STROBE da impressora, transio 0-1-0 envia dado
para impressora.
-Bit 6: DDEN do FDC. 1=densidade simples (FM),
0=densidade dupla(MFM).
-Bit 7: seleciona pgina 0 do TK, 0=ROM Beta (JETSKI),
1=ROM BASIC (PONTE).

Porta de status secundria.


-Bits 0 a 3: no usados.
-Bit 4: padro da impressora (0=
MSX1.1;
1=ABICOMP).
No
usado na interface CAS.
-Bit 5: sinal BUSY da impressora
(0=impressora livre).
-Bit 6: sinal DRQ do FDC (1=FDC
requisitando dados; 0=FDC no
tem dado disponvel).
-Bit 7: sinal INTRQ do FDC
(1=comando
terminado;
0=comando em andamento)

Tabelas do datasheet do FDC 1793 ou 2793


Sumrio dos comandos do FDC.
Tipo

Comando

Cdigo
Hexad.

Cdigo Binrio
7

Legenda

Restore

0X

r1

r0 h=1 engaja cabeote do drive no incio (head

Seek

1X

r1

Step

2X/3X

r1

r0 V=1 verifica nmero da trilha.


r0 r1,r0=stepping rate do motor (00 a 11).

Step-in

4X/5X

r1

r0 flag).

Step-out

6X/7X

r1

r0

II

Read Sector

8X/9X

0 m S

E C

II

Write Sector

AX/BX

1 m S

III

Read
Address

CX

E C a0 compara lado 0.
E 0 0 E=1, atraso de 30ms.

III

Read Track

EX

C=side compare flag, 1 habilita comparao de


lado, 0 desabilita comparao de lado.
0 a0=data address mark (0 p/ #FB, 1 p/ #F8).

III

Write Track

FX

IV

Force
Interrupt

DX

I3

I2

I1

I0 Ix=flags de condio de INTRQ.

load flag).

T=1 atualiza registrador de trilha (track update

0 m=1 faz leitura/escrita de mltiplos setores.

S=side compare flag, 1 compara lado 1, 0

Bits do registrador de status do FDC.


Nome

Status para comando tipo I

Nome

Status para comando tipo II e III

Not ready

1=drive no est pronto,


comando II ou III executado.

S7

Not ready 1=drive no est pronto.

S6

Protected 1=disco est protegido contra Protect


escrita.

Nos comandos Read no usado, nos


Write indica disco protegido.

S5

Head
loaded

1=cabeote est carregado e Record


engajado.
type/Write
fault

Em Read Record: 1=Deleted Data Mark,


0=Data Mark. Em qualquer Write,
1=falha na escrita.

S4

Seek
error

1=a trilha desejada no foi Record


verificada.
found

S3

CRC
error

CRC encontrado no campo de CRC error


ID.

1=um erro foi encontrado em campos de


ID ou em campo de dados.

S2

Track 00

1=Cabeote sobre a trilha 0.

1=computador no respondeu ao DRQ


durante 1 byte.

S1

Index

1=index do disco detectado no Data request


drive.

Read: 1=com dados a serem lidos;


Write: 1= requer dados a serem escritos.

S0

Busy

1=comando em andamento.

1=comando em andamento.

not 1=trilha, setor ou lado desejado no foi


encontrado.

Lost data

Busy

nenhum

Sumrio
Disassembly comentado da interface de drive CAS 1986............................................................1
Primeira pgina (0-8191/#0000-#1FFF) da ROM.........................................................................1
RESET RST 0 / RST #00........................................................................................................ 1
PRNCHR RST 16 / RST #10 ................................................................................................ 1
PRNSTR RST 24 / RST #18.................................................................................................... 1
HLSAVER RST 32 / RST #20.................................................................................................. 2
RST 40 / RST #28.................................................................................................................... 2
NMI (102/#66)......................................................................................................................... 2
Segunda pgina (8192-16383/#2000-#3FFF) da ROM................................................................2
STOP_INT (8548/#2164).......................................................................................................... 5
CMD-RET (8560/#2170) ......................................................................................................... 5
INTERP-RET (8612/#21A4)...................................................................................................... 6
FETCH_ENT.............................................................................................................................. 6
DEF_ERRSP (8640/#21C0)....................................................................................................... 6
REC_ERRSP (8661/#21D5)...................................................................................................... 6
DOSIMM2................................................................................................................................. 6
MINILDIR.................................................................................................................................. 7
DOSMAIN (8854/#2296).......................................................................................................... 8
SYNCHK_RET (8931/#22E3).................................................................................................... 9
Mensagem de logotipo................................................................................................................ 9
PR_IMMED (9026/#2342)...................................................................................................... 10
RD_T0_S0 (9056/#2360)....................................................................................................... 10
RD_T0 (9060/#2364)............................................................................................................. 10
RD_DSKCFG (9087/#237F).................................................................................................... 11
ID_TYPE (9092/#2384).......................................................................................................... 11
NOARG (9130/#23AA)........................................................................................................... 11
Comando CAT............................................................................................................................ 11
ADDHL16 (9326/#246E)........................................................................................................ 13
NXT_DIR_S (9331/#2473)...................................................................................................... 13
DRV_NUM (9355/#248B)....................................................................................................... 13
STK_STR (9368/#2498)......................................................................................................... 14
Comando DOS * (9377/#24A1).................................................................................................. 14
NEW (9399/24B7)...................................................................................................................... 14
CHKEXCLD (9452/#24EC)...................................................................................................... 15
FET_TYPE (9457/#24F1)........................................................................................................ 15
RDKEY (9493/#2515)............................................................................................................ 15
OVERWRITE (9521/#2531).................................................................................................... 15
SEEK_STRF (9577/#2569)..................................................................................................... 16
COPYALL (9600/#2580)......................................................................................................... 16
COPYFILE (9713/#25F1)........................................................................................................ 17
COPY (9797/#2645)................................................................................................................... 18
COPYCHUNK (9939/#26D3)................................................................................................... 19
ERASENOFL (10021/#2725)..................................................................................................20
ERASE (10027/#272B)............................................................................................................... 20
ERASEFILE (10052/#2744).................................................................................................... 20
CHK_DELET (10148/#27A4)..................................................................................................21
GET_ENTRY (10158/#27AE).................................................................................................. 21
PUT_ENTRY (10172/#27BC)..................................................................................................21
WSALLOC (10176/#27C0)..................................................................................................... 22
CHECKRAM (10193/#27D1)................................................................................................... 22
MOVE (10239/#27FF)................................................................................................................ 22
CP_DIR_ENT (10533/#2925).................................................................................................. 24
LOAD (10572/#294C)................................................................................................................ 25
LDCD_ARG............................................................................................................................. 25
PK_PARSE (10630/#2986)..................................................................................................... 26
GET_ARGS (10665/#29A9).................................................................................................... 26
PEEK (10867/#2A73)................................................................................................................. 28
POKE (10871/#2A77)................................................................................................................. 28
MERGE (10879/#2A7F).............................................................................................................. 28

FILEEXISTS............................................................................................................................ 30
SAVE (11130/#2B7A)................................................................................................................. 31
SAVEFILE (11267/#2C03)...................................................................................................... 32
BASSIZE (11383/#2C77)....................................................................................................... 33
BASDIR (11405/#2C8D) ....................................................................................................... 33
CHK_VAR (11435/#2CAB)...................................................................................................... 33
VARDIR (11446/#2CB6)........................................................................................................ 34
STR_FNAME (11506/#2CF2)..................................................................................................34
PARSEDRV (11546/#2D1A)................................................................................................... 35
ENTRYPOS (11581/#2D3D)................................................................................................... 35
SEEKFILE (11593/#2D49)...................................................................................................... 35
RETURN (11668/#2D94)............................................................................................................ 36
SYN_ERROR (11699/#2DB3)................................................................................................. 37
RUN (11743/2DDF).................................................................................................................... 37
BAS_SETW (11771/#3DFB) ................................................................................................... 37
FLAGS_B7 (11785/#2E09)..................................................................................................... 38
SYN_CHK (11790/#2E0E)...................................................................................................... 38
GETARG_N (11796/#2E14).................................................................................................... 38
OPEN_K (11804/#2E1C)........................................................................................................ 38
BAS_OPEN (11805/#2E1D).................................................................................................... 38
OPEN_S (11810/#2E22)......................................................................................................... 38
BAS_G_CHR (11814/#2E26).................................................................................................. 38
BAS_EDITOR (11819/#2E2B)................................................................................................. 38
BAS_CLS (11827/#2E33)....................................................................................................... 38
CALLBAS (11830/#2E36)....................................................................................................... 38
BAS_LKVAR............................................................................................................................ 39
BAS_CLS_L............................................................................................................................. 39
BAS_PR_BC............................................................................................................................ 39
BAS_STK_F............................................................................................................................. 39
BAS_INT2............................................................................................................................... 39
BAS_EEXP (11864/#2E58)..................................................................................................... 39
BAS_E1NUM (11869/#2E5D).................................................................................................39
DEFCHADD (11874/#2E62)................................................................................................... 39
GETARG_2S (11882/#2E6A) .................................................................................................39
GETARG_S (11900/#2E7C).................................................................................................... 40
PARSECODE (11906/#2E82).................................................................................................. 40
STOARG_N (11944/#2EA8) ................................................................................................... 40
BAS_RMFP (11961/#2EB9).................................................................................................... 40
BAS_BCSP (11970/#2EC2)..................................................................................................... 40
BAS_NXTCHR (11979/#2ECB)...............................................................................................41
CALLBAS_HL (11983/#2ECF)................................................................................................. 41
BAS_RECL2 (11991/#2ED7)..................................................................................................41
BAS_MKROOM (11997/#2EDD).............................................................................................. 41
TRKFETCH (12003/#2EE3).................................................................................................... 41
R_B_SECTS (12010/#2EEA)................................................................................................... 41
SV_ENTRY (12013/#2EED).................................................................................................... 41
BUFFER2DSK (12016/#2EF0)................................................................................................41
W_B_SECTS (12047/#2F0F)................................................................................................... 42
FORMAT (12143/#2F6F)............................................................................................................ 43
GET_NUMTRK (12407/#3077)............................................................................................... 45
SIDE0_SEL (12440/#3098).................................................................................................... 45
SIDE1_SEL (12451/#30A3).................................................................................................... 46
PHYSFMT (12458/#30AA)...................................................................................................... 46
PUTDATA (12630/#3156)...................................................................................................... 47
FORM_DSK (12644/#3164).................................................................................................... 47
SV_IF1_VAR (12684/#318c)................................................................................................... 48
CLR_ELINE (12719/#31AF).................................................................................................... 48
REC_ELINE (12731/#31BB).................................................................................................... 49
EDITLINE (12742/#31C6)...................................................................................................... 49
RND_ARG (12777/#31E9)...................................................................................................... 49
OPEN (12819/#3213)................................................................................................................ 49
STREAMDIR........................................................................................................................... 50

CLOSE (14023/#36C7)............................................................................................................... 61
PRNSTR1 (14203/#377B)...................................................................................................... 63
CP_STRINGS (14215/#3787).................................................................................................63
ERROR_R............................................................................................................................... 63
ERROR_J................................................................................................................................ 64
Mensagens de erro.................................................................................................................... 64
FINDFILE (14577/#38F1)....................................................................................................... 67
P_FILENAME (14586/#38FA).................................................................................................. 67
PRINT_A (14604/#390C)........................................................................................................ 67
PRINT_C (14605/#390D)....................................................................................................... 67
40 (14652/#393C)..................................................................................................................... 68
80 (14675/#3953)..................................................................................................................... 68
Mensagens de erro.................................................................................................................... 68
NMI1 (14810/#39DA)............................................................................................................ 69
RAMDUMP (14983/#3A87).................................................................................................... 71
NMI_WRSEC (15026/#3AB2).................................................................................................71
GOTO (15056/#3AD0)............................................................................................................... 72
GOTO_SIDE0 (15251/#3B93)................................................................................................ 74
GOTO_SIDE1 (15259/#3B9B)................................................................................................ 74
NMI_RDSEC (15271/#3BA7)..................................................................................................74
NMI_SEEKL (15301/#5BC5)................................................................................................... 74
NMI_SEEKA (15323/#3BDB).................................................................................................. 75
NMI_REST (15341/#3BED)..................................................................................................... 75
Rotinas interceptadas pela interface Beta (15360-15615/#3C00-#3CFF).................................75
DOSIMMED (15360/#3C00)................................................................................................... 75
DOSINTERP (15363/#3C03).................................................................................................. 75
INITDOS (15415/#3c37)........................................................................................................ 76
CALLBAS1 (15440/#3C50).................................................................................................... 76
ROM_BETA1 .......................................................................................................................... 77
ROM_BETA ou JETSKI (15467/#3C6B)....................................................................................77
ROM_BASIC ou PONTE (15484/#3C7C)..................................................................................77
IO_OFF (15511/#3C97).......................................................................................................... 77
IO_ON (15517/#3C9D).......................................................................................................... 77
WAITKEY (15525/#3CA5)...................................................................................................... 78
BDPAPER (15535/#3CAF)...................................................................................................... 78
ROMBETA_ALT (15544/#3CB8).............................................................................................. 78
ROMBAS_ALT (15552/#3CC0)...............................................................................................78
LDD_ROM_B........................................................................................................................... 78
LDI_ROM_B............................................................................................................................ 79
INI_VARS (15574/#3CD6)...................................................................................................... 79
PRN_ENTER (15647/#3D1F)..................................................................................................79
PRNCHR1 (15649/#3D21)..................................................................................................... 79
BAS_RST16............................................................................................................................ 80
RESTORE (15677/#3D3D)..................................................................................................... 80
FDC_CMD_BR (15679/#3D3F)............................................................................................... 80
NODISK (15702/#3D56)........................................................................................................ 80
CHANGE_DRV (15729/#3D71)............................................................................................... 80
DELAY (15782/#3DA6).......................................................................................................... 81
GET_SRATE (15793/#3DB1).................................................................................................. 81
GET_DTYPE (15802/#3DBA)..................................................................................................81
SCAN_SRATE (15807/#3DBF)................................................................................................81
FDC_CMD_DT (15853/#3DED)............................................................................................... 82
FDC_CMD_V (15861/#3DF5).................................................................................................. 82
TRACK_A (15884/#3E0C)...................................................................................................... 83
DELAY604 (15933/#3E3D).................................................................................................... 83
PHYSTRK (15943/#3E47)...................................................................................................... 83
RD_TRACK (15951/#3E4F).................................................................................................... 84
SV_START_S (16027/#3E9B).................................................................................................85
SV_RW_ADD (16031/#3E9F)................................................................................................. 85
W_SECTOR (16035/#3EA3)................................................................................................... 85
R_SECTOR (16039/#3EA7).................................................................................................... 85
W_DATA_FDC (16208/#3F50)................................................................................................ 87

R_DATA_FDC (16235/#3F6B)................................................................................................87
FET_FLDIR (16262/#3F86)..................................................................................................... 88
LD_BUFFER (16283/#3F9B)................................................................................................... 88
SV_BUFFER (16286/#3F9E)................................................................................................... 88
CMD_CODE (16325/#3FC5)................................................................................................... 88
CMD_ADDR (16344/#3FD8)................................................................................................... 89
RAM de vdeo (16384-23295/#4000-#5AFF).............................................................................89
Bitmap de vdeo (16384-22527/#4000-#57FF).....................................................................89
Atributos (22528-23295/#5800-#5A99)................................................................................89
Buffer da impressora (23296-23551/#5B00-#5BFF)..................................................................89
Variveis de sistema do BASIC.................................................................................................. 90
Variveis de sistema do DOS..................................................................................................... 93
Portas de entrada e sada da interface Beta..............................................................................98
Tabelas do datasheet do FDC 1793 ou 2793.............................................................................99
Sumrio dos comandos do FDC. ...........................................................................................99
Bits do registrador de status do FDC. ...................................................................................99

You might also like